From 434ee70b449588605344b1ff166149ce6732395c Mon Sep 17 00:00:00 2001 From: ralf Date: Wed, 14 Aug 2024 15:25:02 +0200 Subject: [PATCH] new web-component et2-groupbox based on et2-details also modernized et2-details code a bit using decorators --- api/etemplate.php | 13 + .../etemplate/Layout/Et2Details/Et2Details.ts | 111 +-- .../Layout/Et2Groupbox/Et2Groupbox.ts | 60 ++ api/js/etemplate/et2_widget_groupbox.ts | 71 -- api/js/etemplate/etemplate2.ts | 2 +- doc/etemplate2-rng.php | 3 + doc/etemplate2/etemplate2.0.dtd | 230 +++-- doc/etemplate2/etemplate2.0.rng | 870 +++++++++++++----- 8 files changed, 889 insertions(+), 471 deletions(-) create mode 100644 api/js/etemplate/Layout/Et2Groupbox/Et2Groupbox.ts delete mode 100644 api/js/etemplate/et2_widget_groupbox.ts diff --git a/api/etemplate.php b/api/etemplate.php index f664214625..95fa8150e1 100644 --- a/api/etemplate.php +++ b/api/etemplate.php @@ -198,6 +198,19 @@ function send_template() return "' . $matches[2] . ""; }, $str); + // Change groupbox --> summary attribute + $str = preg_replace_callback('#]*?)>(.*?)#su', static function ($matches) + { + $attrs = parseAttrs($matches[1]); + + if (preg_match('#^\n?\s*]*?)/?>(.*?)()?#su', $matches[2], $caption)) + { + $attrs['summary'] = parseAttrs($caption[1])['label']; + $matches[2] = str_replace($caption[0], '', $matches[2]); + } + return "' . $matches[2] . ""; + }, $str); + // Change splitter dockside -> primary + vertical $str = preg_replace_callback('#]*?)>(.*?)#su', static function ($matches) { diff --git a/api/js/etemplate/Layout/Et2Details/Et2Details.ts b/api/js/etemplate/Layout/Et2Details/Et2Details.ts index c49c0926d7..abe48bfe38 100644 --- a/api/js/etemplate/Layout/Et2Details/Et2Details.ts +++ b/api/js/etemplate/Layout/Et2Details/Et2Details.ts @@ -11,7 +11,10 @@ import {Et2Widget} from "../../Et2Widget/Et2Widget"; import {css} from "lit"; import {SlDetails} from "@shoelace-style/shoelace"; import shoelace from "../../Styles/shoelace"; +import {property} from "lit/decorators/property.js"; +import {customElement} from "lit/decorators/custom-element.js"; +@customElement("et2-details") export class Et2Details extends Et2Widget(SlDetails) { static get styles() @@ -38,7 +41,7 @@ export class Et2Details extends Et2Widget(SlDetails) /* Stop images from growing. In general we want them to stay */ flex-grow: 0; } - ::slotted([align="left"]) { + ::slotted([align="left"]) { margin-right: auto; order: -1; } @@ -47,68 +50,57 @@ export class Et2Details extends Et2Widget(SlDetails) order: 1; } - .details.hoist { - position: relative; - } - - .details.hoist .details__body { - position: absolute; - z-index: var(--sl-z-index-drawer); - background: var(--sl-color-neutral-0); - box-shadow: var(--sl-shadow-large); - width: 100%; - min-width: fit-content; - border-radius: var(--sl-border-radius-small); - border: 1px solid var(--sl-color-neutral-200); - max-height: 15em; - overflow-y: auto; - } - .details.hoist .details__body.overlaySummaryLeftAligned { + .details.hoist { + position: relative; + } + + .details.hoist .details__body { + position: absolute; + z-index: var(--sl-z-index-drawer); + background: var(--sl-color-neutral-0); + box-shadow: var(--sl-shadow-large); + width: 100%; + min-width: fit-content; + border-radius: var(--sl-border-radius-small); + border: 1px solid var(--sl-color-neutral-200); + max-height: 15em; + overflow-y: auto; + } + .details.hoist .details__body.overlaySummaryLeftAligned { top: 0; left: 2em; width: calc(100% - 2em); - } - .details.hoist .details__body.overlaySummaryRightAligned { - top: 0; - } + } + .details.hoist .details__body.overlaySummaryRightAligned { + top: 0; + } `, ]; } - static get properties() - { - return { - ...super.properties, + /** + * Toggle when hover over + */ + @property({type: Boolean}) + toggleOnHover = false; - /** - * Toggle when hover over - */ - toggleOnHover: { - type: Boolean - }, + /** + * Makes details content fixed position to break out of the container + */ + @property({type: Boolean}) + hoist = false; - /** - * Makes details content fixed position to break out of the container - */ - hoist: { - type: Boolean - }, + /** + * set toggle alignment either to left or right. Default is right alignment. + */ + @property({type: String}) + toggleAlign : "right" | "left" = "right"; - /** - * set toggle alignment either to left or right. Default is right alignment. - */ - toggleAlign: { - type: String - }, - - /** - * Overlay summary container with the details container when in open state - */ - overlaySummaryOnOpen: { - type: Boolean - } - } - } + /** + * Overlay summary container with the details container when in open state + */ + @property({type: Boolean}) + overlaySummaryOnOpen = false; /** * List of properties that get translated @@ -123,16 +115,6 @@ export class Et2Details extends Et2Widget(SlDetails) } } - - constructor(...args : any[]) - { - super(); - this.toggleOnHover = false; - this.toggleAlign = 'right'; - this.hoist = false; - this.overlaySummaryOnOpen = false; - } - connectedCallback() { super.connectedCallback(); @@ -172,5 +154,4 @@ export class Et2Details extends Et2Widget(SlDetails) { if (!this.getDOMNode().contains(event.relatedTarget)) this.hide(); } -} -customElements.define("et2-details", Et2Details); \ No newline at end of file +} \ No newline at end of file diff --git a/api/js/etemplate/Layout/Et2Groupbox/Et2Groupbox.ts b/api/js/etemplate/Layout/Et2Groupbox/Et2Groupbox.ts new file mode 100644 index 0000000000..0ceefb291f --- /dev/null +++ b/api/js/etemplate/Layout/Et2Groupbox/Et2Groupbox.ts @@ -0,0 +1,60 @@ +/** + * EGroupware eTemplate2 - Details WebComponent + * + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @package api + * @link https://www.egroupware.org + * @author Hadi Nategh + */ + +import {Et2Details} from "../Et2Details/Et2Details"; +import {css} from "lit"; +import shoelace from "../../Styles/shoelace"; +import {property} from "lit/decorators/property.js"; +import {customElement} from "lit/decorators/custom-element.js"; + +/** + * Groupbox shows content in a box with a summary + */ +@customElement("et2-groupbox") +export class Et2Groupbox extends Et2Details +{ + static get styles() + { + return [ + ...super.styles, + shoelace, + css` + slot[name="collapse-icon"], slot[name="expand-icon"] { + display: none; + } + details { + position: relative; + padding-top: .5rem; + margin: 2px; + margin-top: .5rem; + } + summary { + position: absolute; + pointer-events: none; + width: fit-content; + line-height: 0; + top: -.5rem; + left: .5rem; + background: var(--sl-color-neutral-0); + } + .details { + border-color: var(--sl-color-neutral-500); + border-width: 2px; + } + `, + ]; + } + + constructor() + { + super(); + // groupbox is always open + this.open = true; + } +} \ No newline at end of file diff --git a/api/js/etemplate/et2_widget_groupbox.ts b/api/js/etemplate/et2_widget_groupbox.ts deleted file mode 100644 index 1dd2e00d1d..0000000000 --- a/api/js/etemplate/et2_widget_groupbox.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * EGroupware eTemplate2 - JS Groupbox object - * - * @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 - * @copyright Nathan Gray 2012 - */ - -/*egw:uses - et2_core_baseWidget; -*/ - -import {et2_register_widget, WidgetConfig} from "./et2_core_widget"; -import {et2_baseWidget} from "./et2_core_baseWidget"; -import {ClassWithAttributes} from "./et2_core_inheritance"; - -/** - * Class which implements the groupbox tag - * - * @augments et2_baseWidget - */ -export class et2_groupbox extends et2_baseWidget -{ - /** - * Constructor - * - * @memberOf et2_groupbox - */ - constructor(_parent, _attrs? : WidgetConfig, _child? : object) - { - // Call the inherited constructor - super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_groupbox._attributes, _child || {})); - - this.setDOMNode(document.createElement("fieldset")); - } -} -et2_register_widget(et2_groupbox, ["groupbox"]); - -/** - * @augments et2_baseWidget - */ -export class et2_groupbox_legend extends et2_baseWidget -{ - static readonly _attributes : any = { - "label": { - "name": "Label", - "type": "string", - "default": "", - "description": "Label for group box", - "translate" : true - } - }; - - /** - * Constructor - * - * @memberOf et2_groupbox_legend - */ - constructor(_parent, _attrs? : WidgetConfig, _child? : object) - { - // Call the inherited constructor - super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_groupbox_legend._attributes, _child || {})); - let legend = jQuery(document.createElement("legend")).text(this.options.label); - this.setDOMNode(legend[0]); - } -} -et2_register_widget(et2_groupbox_legend, ["caption"]); - diff --git a/api/js/etemplate/etemplate2.ts b/api/js/etemplate/etemplate2.ts index 359133b278..cc52fa3f9c 100644 --- a/api/js/etemplate/etemplate2.ts +++ b/api/js/etemplate/etemplate2.ts @@ -24,6 +24,7 @@ import '../jsapi/egw_json.js'; import {egwIsMobile} from "../egw_action/egw_action_common"; import './Layout/Et2Box/Et2Box'; import './Layout/Et2Details/Et2Details'; +import './Layout/Et2Groupbox/Et2Groupbox'; import './Layout/Et2Tabs/Et2Tab'; import './Layout/Et2Tabs/Et2Tabs'; import './Layout/Et2Tabs/Et2TabPanel'; @@ -120,7 +121,6 @@ import './et2_widget_template'; import './et2_widget_grid'; import './et2_widget_box'; import './et2_widget_hbox'; -import './et2_widget_groupbox'; import './et2_widget_button'; import './et2_widget_entry'; import './et2_widget_textbox'; diff --git a/doc/etemplate2-rng.php b/doc/etemplate2-rng.php index 776536564f..a2b8c961be 100755 --- a/doc/etemplate2-rng.php +++ b/doc/etemplate2-rng.php @@ -94,6 +94,9 @@ $overwrites = [ 'et2-details' => [ '.children' => 'Widgets', ], + 'et2-groupbox' => [ + '.children' => 'Widgets', + ], 'et2-split' => [ '.children' => 'Widgets', ], diff --git a/doc/etemplate2/etemplate2.0.dtd b/doc/etemplate2/etemplate2.0.dtd index b10172a8b4..d6f724663a 100644 --- a/doc/etemplate2/etemplate2.0.dtd +++ b/doc/etemplate2/etemplate2.0.dtd @@ -21,27 +21,27 @@ ========================================================== --> - + |et2-favorites-menu|et2-nextmatch-header-filter|et2-groupbox|et2-hbox|et2-iframe|et2-image + |et2-image-expose|et2-lavatar|et2-label|et2-link|et2-link-add|et2-link-apps|et2-link-entry + |et2-link-list|et2-link-paste-dialog|et2-link-search|et2-link-string|et2-link-to|et2-listbox + |et2-merge-dialog|et2-number|et2-password|et2-portlet|et2-searchbox|et2-select|et2-select-access + |et2-select-account|et2-select-app|et2-select-bitwise|et2-select-bool|et2-select-cat + |et2-select-country|et2-select-day|et2-select-dow|et2-select-hour|et2-select-lang|et2-select-month + |et2-select-number|et2-select-percent|et2-select-priority|et2-select-state|et2-select-tab + |et2-select-thumbnail|et2-select-timezone|et2-select-year|et2-spinner|et2-split|et2-switch + |et2-tabbox|et2-tag|et2-textarea|et2-textbox|et2-thumbnail-tag|et2-tree|et2-tree-dropdown + |et2-tree-cat|et2-url|et2-url-email|et2-url-fax|et2-url-phone|et2-vbox|et2-vfs-gid|et2-vfs-mime + |et2-vfs-name|et2-vfs-path|et2-vfs-select|et2-vfs-select-dialog|et2-vfs-select-row|et2-vfs-uid"> @@ -128,31 +128,6 @@ readonly CDATA #IMPLIED attributes CDATA #IMPLIED> - - - - - - - - + + + + @@ -1855,7 +1819,6 @@ slot CDATA #IMPLIED span (all|2|3|4) #IMPLIED statustext CDATA #IMPLIED - step CDATA #IMPLIED style CDATA #IMPLIED tabindex CDATA #IMPLIED width CDATA #IMPLIED> @@ -2362,6 +2325,33 @@ value CDATA #IMPLIED width CDATA #IMPLIED> + + + + + + + + - @@ -48,7 +47,6 @@ - @@ -69,6 +67,7 @@ + @@ -95,6 +94,7 @@ + @@ -155,6 +155,7 @@ + @@ -445,97 +446,6 @@ - - - - - - - - - - - - - - - - false - true - 1 - - - - - - - - - - - - - false - true - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - true - 1 - - - - - - - - - - - - - - - - @@ -3259,158 +3169,6 @@ - - - - - - - - - - - false - true - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - true - 1 - - - - - - - - - - - - - - - - - - - false - true - 1 - - - - - - - - - - - - - - - - false - true - 1 - - - - - - - - - - - - - false - true - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - true - 1 - - - - - - - - - - - - - @@ -5545,6 +5303,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + false + true + 1 + + + + + + + + + + + + + + + + + + + false + true + 1 + + + + + + + false + true + 1 + + + + + + + + + + + + + false + true + 1 + + + + + + + + + + + + + + + + all + 2 + 3 + 4 + + + + + + + + + + + + + + + + top + right + bottom + left + + + + + + + + + + @@ -6321,7 +6200,13 @@ - + + + false + true + 1 + + @@ -6358,7 +6243,13 @@ - + + + false + true + 1 + + @@ -7171,9 +7062,6 @@ - - - @@ -9378,6 +9266,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + false + true + 1 + + + + + + + + + + false + true + 1 + + + + + + + false + true + 1 + + + + + + + + + + + + + false + true + 1 + + + + + + + + + + false + true + 1 + + + + + + + false + true + 1 + + + + + + + + + + + + + all + 2 + 3 + 4 + + + + + + + + + + + + + + + + + + + false + true + 1 + + + + + + + @@ -11660,6 +11676,9 @@ + + + @@ -11732,6 +11751,9 @@ + + + @@ -11813,6 +11835,9 @@ + + + @@ -11871,9 +11896,15 @@ + + + + + + @@ -12028,6 +12059,9 @@ + + + @@ -12441,6 +12475,9 @@ + + + @@ -13194,6 +13231,17 @@ + + + + user + enabled + installed + all + all+setup + + + @@ -15832,6 +15880,17 @@ + + + + user + enabled + installed + all + all+setup + + + @@ -17649,6 +17708,9 @@ + + + @@ -18593,6 +18655,9 @@ + + + @@ -18898,6 +18963,9 @@ + + + @@ -19191,6 +19259,9 @@ + + + @@ -19484,6 +19555,9 @@ + + + @@ -19875,6 +19949,302 @@ + + + + + + + + + + + + + + + + + + + + + + + off + none + on + sentences + words + characters + + + + + + + + + + off + on + + + + + + + false + true + 1 + + + + + + + + + + false + true + 1 + + + + + + + + + + false + true + 1 + + + + + + + enter + done + go + next + previous + search + send + + + + + + + false + true + 1 + + + + + + + + + + + + + + + + + + + false + true + 1 + + + + + + + + + + none + text + decimal + numeric + tel + search + email + url + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + true + 1 + + + + + + + false + true + 1 + + + + + + + + + + + + + + + + + + + false + true + 1 + + + + + + + false + true + 1 + + + + + + + + + + false + true + 1 + + + + + + + + + + false + true + 1 + + + + + + + false + true + 1 + + + + + + + small + medium + large + + + + + + + + + + all + 2 + 3 + 4 + + + + + + + false + true + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +