some eT2 fixes for developerTools:

- support emptyLabel for r/o selectboxes
- allow to overwrite category-label in NM
- implement apps attribute for et2-select-application incl. r/o
This commit is contained in:
ralf 2024-08-01 13:45:34 +02:00
parent c702674401
commit 3c0ea24aa7
5 changed files with 47 additions and 17 deletions

View File

@ -1,13 +1,20 @@
import {Et2Select} from "../Et2Select";
import {Et2StaticSelectMixin, StaticOptions as so} from "../StaticOptions";
import {cleanSelectOptions} from "../FindSelectOptions";
import {property} from "lit/decorators/property.js";
export class Et2SelectApp extends Et2StaticSelectMixin(Et2Select)
{
/**
* Which apps to show: 'user'=apps of current user, 'enabled', 'installed' (default), 'all' = not installed ones too, 'all+setup'
*/
@property({type: String})
apps : 'user' | 'enabled' | 'installed' | 'all' | 'all+setup' = 'installed';
public connectedCallback()
{
super.connectedCallback()
this.fetchComplete = so.app(this, {}).then((options) =>
this.fetchComplete = so.app(this, {apps: this.apps}).then((options) =>
{
this.set_static_options(cleanSelectOptions(options));
})

View File

@ -15,6 +15,7 @@ import {Et2Widget} from "../../Et2Widget/Et2Widget";
import {Et2StaticSelectMixin, StaticOptions, StaticOptions as so} from "../StaticOptions";
import {cleanSelectOptions, find_select_options, SelectOption} from "../FindSelectOptions";
import {SelectAccountMixin} from "../SelectAccountMixin";
import {property} from "lit/decorators/property.js";
/**
* This is a stripped-down read-only widget used in nextmatch
@ -22,6 +23,17 @@ import {SelectAccountMixin} from "../SelectAccountMixin";
*/
export class Et2SelectReadonly extends Et2Widget(LitElement) implements et2_IDetachedDOM
{
@property({type: String})
set emptyLabel(_label: string)
{
this.__emptyLabel = _label;
this.select_options = this.__select_options;
}
get emptyLabel()
{
return this.__emptyLabel;
}
static get styles()
{
return [
@ -192,6 +204,11 @@ li {
return;
}
this.__select_options = new_options;
if (this.emptyLabel)
{
this.__select_options.unshift({value: '', label: this.emptyLabel});
}
}
/**
@ -241,7 +258,7 @@ li {
getDetachedAttributes(attrs)
{
attrs.push("id", "value", "class", "statustext");
attrs.push("id", "value", "class", "statustext", "emptyLabel");
}
getDetachedNodes() : HTMLElement[]
@ -277,6 +294,12 @@ customElements.define("et2-select-account_ro", Et2SelectAccountReadonly);
export class Et2SelectAppReadonly extends Et2StaticSelectMixin(Et2SelectReadonly)
{
/**
* Which apps to show: 'user'=apps of current user, 'enabled', 'installed' (default), 'all' = not installed ones too, 'all+setup'
*/
@property({type: String})
apps : 'user' | 'enabled' | 'installed' | 'all' | 'all+setup' = 'installed';
protected find_select_options(_attrs)
{
this.fetchComplete = so.app(this, _attrs).then((options) =>

View File

@ -375,7 +375,8 @@ export const StaticOptions = new class StaticOptionsType
app(widget : Et2SelectWidgets | Et2Select, attrs) : Promise<SelectOption[]>
{
var options = ',' + (attrs.other || []).join(',');
const options = widget.apps ? ',,'+widget.apps : widget.options || '';
return this.cached_server_side(widget, 'select-app', options, true);
}

View File

@ -3746,13 +3746,6 @@ export class et2_nextmatch_header_bar extends et2_DOMWidget implements et2_INext
this.egw().debug('warn', 'Nextmatch filter options in a weird place - "%s". Should be in sel_options[%s].', row_id, name);
}
}
// Legacy: Add in 'All' option for cat_id, if not provided.
if(name == 'cat_id' && (options == null || options != null && (typeof options[''] == 'undefined' && typeof options[0] != 'undefined' && options[0].value != ''))
// Not mail, since it needs to be different
&& !['mail'].includes(this.getInstanceManager().app))
{
widget_options.emptyLabel = this.egw().lang('All categories');
}
// Create widget
const select = <Et2Select>loadWebComponent(type, widget_options, this);
@ -3807,6 +3800,12 @@ export class et2_nextmatch_header_bar extends et2_DOMWidget implements et2_INext
select.updateComplete.then(async() =>
{
await select.updateComplete;
// Legacy: Add in 'All' option for cat_id, if not provided.
if (name == 'cat_id' && !['mail'].includes(this.getInstanceManager().app) &&
!select.select_options.filter(options => option.value === '').length)
{
select.emptyLabel = this.egw().lang('All categories');
}
select.requestUpdate("value");
})
return select;

View File

@ -984,8 +984,8 @@ class Select extends Etemplate\Widget
* Get available apps as options
*
* @param string $type2 ='installed[:home;groupdav; ...]' 'user'=apps of current user,
* 'enabled', 'installed' (default), 'all' = not installed ones too. In order to
* exclude apps explicitly we can list them (app name separator is ';') in front of the type.
* 'enabled', 'installed' (default), 'all' = not installed ones too, 'all+setup'.
* In order to exclude apps explicitly we can list them (app name separator is ';') in front of the type.
*
* @return array app => label pairs sorted by label
*/
@ -1007,15 +1007,15 @@ class Select extends Etemplate\Widget
$apps[$app] = lang($app);
}
}
if ($type2 == 'all')
if ($type2 == 'all' || $type2 === 'all+setup')
{
$dir = opendir(EGW_SERVER_ROOT);
while ($file = readdir($dir))
while ($app = readdir($dir))
{
if (@is_dir(EGW_SERVER_ROOT."/$file/setup") && $file[0] != '.' &&
!isset($apps[$app = basename($file)]))
if (is_dir(EGW_SERVER_ROOT."/$app/setup") && $app[0] != '.' && !isset($apps[$app]) ||
$app === 'setup' && $type2 === 'all+setup')
{
$apps[$app] = $app . ' (*)';
$apps[$app] = lang($app);
}
}
closedir($dir);