Merge remote-tracking branch 'origin/master'

This commit is contained in:
Milan 2023-07-14 15:50:17 +02:00
commit 4727b40329
18 changed files with 100 additions and 150 deletions

View File

@ -271,7 +271,7 @@ export class EgwAction {
this is an egw Object as defined in egw_core.js this is an egw Object as defined in egw_core.js
probably not because it changes on runtime probably not because it changes on runtime
*/ */
const localEgw: IegwAppLocal = window.egw(_app); const localEgw: IegwAppLocal = window.egw(_app, window);
//replaced jQuery calls //replaced jQuery calls
if (Array.isArray(_actions)) { if (Array.isArray(_actions)) {
//_actions is now an object for sure //_actions is now an object for sure

View File

@ -477,7 +477,7 @@ export class Et2Dialog extends Et2Widget(SlotMixin(SlDialog))
*/ */
close() close()
{ {
this.hide(); return this.hide();
} }
addOpenListeners() addOpenListeners()

View File

@ -146,6 +146,7 @@ import './et2_extension_nextmatch';
import './et2_extension_customfields'; import './et2_extension_customfields';
import './vfsSelectUI'; import './vfsSelectUI';
import {Et2Tabs} from "./Layout/Et2Tabs/Et2Tabs"; import {Et2Tabs} from "./Layout/Et2Tabs/Et2Tabs";
import {Et2Dialog} from "./Et2Dialog/Et2Dialog";
/** /**
@ -317,7 +318,7 @@ export class etemplate2
*/ */
public clear(_keep_app_object? : boolean, _keep_session? : boolean) public clear(_keep_app_object? : boolean, _keep_session? : boolean)
{ {
jQuery(this._DOMContainer).trigger('clear'); this.DOMContainer.dispatchEvent(new Event("clear", {bubbles: true}));
// Remove any handlers on window (resize) // Remove any handlers on window (resize)
if(this.uniqueId) if(this.uniqueId)
@ -1516,7 +1517,9 @@ export class etemplate2
// Check the parameters // Check the parameters
const data = _response.data; const data = _response.data;
// window-close does NOT send data.DOMNodeID! // window-close does NOT send data.DOMNodeID!
const dialog = <any>document.querySelector('et2-dialog > form'+(data.DOMNodeID?'#'+data.DOMNodeID:'.dialog_content'))?.parentNode; const dialog = <any>document.querySelector('et2-dialog > form' + (data.DOMNodeID ? '#' + data.DOMNodeID : '.dialog_content'))?.parentNode ??
// Reloaded into same container
(this?.DOMContainer?.parentNode instanceof Et2Dialog ? this.DOMContainer.parentNode : undefined);
if (dialog) if (dialog)
{ {
@ -1527,7 +1530,7 @@ export class etemplate2
// handle Api\Framework::refresh_opener() // handle Api\Framework::refresh_opener()
if(Array.isArray(data['refresh-opener'])) if(Array.isArray(data['refresh-opener']))
{ {
if(window.opener)// && typeof window.opener.egw_refresh == 'function') if(window.opener || dialog)// && typeof window.opener.egw_refresh == 'function')
{ {
const egw = window.egw(dialog ? window : opener); const egw = window.egw(dialog ? window : opener);
egw.refresh.apply(egw, data['refresh-opener']); egw.refresh.apply(egw, data['refresh-opener']);
@ -1564,9 +1567,7 @@ export class etemplate2
} }
if (dialog) if (dialog)
{ {
dialog.close(); return dialog.close();
dialog.parentNode.removeChild(dialog);
return Promise.resolve();
} }
egw.close(); egw.close();
return true; return true;
@ -1592,14 +1593,16 @@ export class etemplate2
// regular et2 re-load // regular et2 re-load
if(typeof data.url == "string" && typeof data.data === 'object') if(typeof data.url == "string" && typeof data.data === 'object')
{ {
let load : Promise<any>;
// @ts-ignore // @ts-ignore
if(this && typeof this.load == 'function') if(this && typeof this.load == 'function')
{ {
// Called from etemplate // Called from etemplate
// set id in case serverside returned a different template // set id in case serverside returned a different template
this._DOMContainer.id = this.uniqueId = data.DOMNodeID; this._DOMContainer.id = this.uniqueId = data.DOMNodeID;
// @ts-ignore // @ts-ignore
return this.load(data.name, data.url, data.data); load = this.load(data.name, data.url, data.data);
} }
else else
{ {
@ -1623,20 +1626,30 @@ export class etemplate2
uniqueId = data.DOMNodeID.replace('.', '-') + '-' + data['open_target']; uniqueId = data.DOMNodeID.replace('.', '-') + '-' + data['open_target'];
} }
const et2 = new etemplate2(node, data.data.menuaction, uniqueId); const et2 = new etemplate2(node, data.data.menuaction, uniqueId);
return et2.load(data.name, data.url, data.data, null, null, null, data['fw-target']) load = et2.load(data.name, data.url, data.data, null, null, null, data['fw-target']);
.then(() =>
{
if(dialog)
{
dialog._adoptTemplateButtons();
}
});
} }
else else
{ {
egw.debug("error", "Could not find target node %s", data.DOMNodeId); egw.debug("error", "Could not find target node %s", data.DOMNodeId);
} }
} }
// Extra handling for being loaded into a Et2Dialog
if(dialog)
{
load.then(() =>
{
// Move footer type buttons into dialog footer
const buttons = dialog._adoptTemplateButtons();
// Make sure adopted buttons are removed on clear
dialog.addEventListener("clear", () =>
{
buttons.forEach(n => n.remove());
});
});
}
return load;
} }
throw("Error while parsing et2_load response"); throw("Error while parsing et2_load response");

View File

@ -751,25 +751,43 @@ export abstract class EgwApp
/** /**
* Opens _menuaction in an Et2Dialog * Opens _menuaction in an Et2Dialog
* *
* Equivalent to egw.openDialog, thought this one works in popups too. * Equivalent to egw.openDialog, though this one works in popups too.
* *
* @param _menuaction * @param _menuaction
* @return Promise<any> * @return Promise<Et2Dialog>
*/ */
openDialog(_menuaction : string) openDialog(_menuaction : string) : Promise<Et2Dialog>
{ {
return this.egw.json(_menuaction.match(/^([^.:]+)/)[0] + '.jdots_framework.ajax_exec.template.' + _menuaction, let resolver;
let rejector;
const dialog_promise = new Promise((resolve, reject) =>
{
resolver = value => resolve(value);
rejector = reason => reject(reason);
});
let request = this.egw.json(_menuaction.match(/^([^.:]+)/)[0] + '.jdots_framework.ajax_exec.template.' + _menuaction,
['index.php?menuaction=' + _menuaction, true], _response => ['index.php?menuaction=' + _menuaction, true], _response =>
{ {
if (Array.isArray(_response) && typeof _response[0] === 'string') if(Array.isArray(_response) && typeof _response[0] === 'string')
{ {
jQuery(_response[0]).appendTo(document.body); let dialog = jQuery(_response[0]).appendTo(document.body);
if(dialog.length > 0 && dialog.get(0))
{
resolver(dialog.get(0));
} }
else else
{ {
console.log("Invalid response to dialogExec('"+_menuaction+"')", _response); console.log("Unable to add dialog with dialogExec('" + _menuaction + "')", _response);
rejector(new Error("Unable to add dialog"));
}
}
else
{
console.log("Invalid response to dialogExec('" + _menuaction + "')", _response);
rejector(new Error("Invalid response to dialogExec('" + _menuaction + "')"));
} }
}).sendRequest(); }).sendRequest();
return dialog_promise;
} }
/** /**

View File

@ -14,6 +14,7 @@
*/ */
import type {EgwApp} from "./egw_app"; import type {EgwApp} from "./egw_app";
import type {Et2Dialog} from "../etemplate/Et2Dialog/Et2Dialog";
/** /**
* Global egw object (for now created by the diverse JavaScript files) with a TypeScript interface * Global egw object (for now created by the diverse JavaScript files) with a TypeScript interface
@ -1130,9 +1131,9 @@ declare interface IegwWndLocal extends IegwGlobal
* For popups you have to use the app.ts method openDialog(), which creates the dialog in the correct window / popup. * For popups you have to use the app.ts method openDialog(), which creates the dialog in the correct window / popup.
* *
* @param string _menuaction * @param string _menuaction
* @return Promise<any> * @return Promise<Et2Dialog>
*/ */
openDialog(_menuaction : string) : Promise<any>; openDialog(_menuaction : string) : Promise<Et2Dialog>;
/** /**
* Open a (centered) popup window with given size and url * Open a (centered) popup window with given size and url

View File

@ -386,22 +386,40 @@ egw.extend('open', egw.MODULE_WND_LOCAL, function(_egw, _wnd)
* For popups you have to use the app.ts method openDialog(), which creates the dialog in the correct window / popup. * For popups you have to use the app.ts method openDialog(), which creates the dialog in the correct window / popup.
* *
* @param string _menuaction * @param string _menuaction
* @return Promise<any> * @return Promise<Et2Dialog>
*/ */
openDialog: function(_menuaction) openDialog: function(_menuaction)
{ {
return this.json(_menuaction.match(/^([^.:]+)/)[0] + '.jdots_framework.ajax_exec.template.' + _menuaction, let resolver;
let rejector;
const dialog_promise = new Promise((resolve, reject) =>
{
resolver = value => resolve(value);
rejector = reason => reject(reason);
});
let request = egw.json(_menuaction.match(/^([^.:]+)/)[0] + '.jdots_framework.ajax_exec.template.' + _menuaction,
['index.php?menuaction=' + _menuaction, true], _response => ['index.php?menuaction=' + _menuaction, true], _response =>
{ {
if (Array.isArray(_response) && typeof _response[0] === 'string') if (Array.isArray(_response) && typeof _response[0] === 'string')
{ {
jQuery(_response[0]).appendTo(_wnd.document.body); let dialog = jQuery(_response[0]).appendTo(_wnd.document.body);
if (dialog.length > 0 && dialog.get(0))
{
resolver(dialog.get(0));
} }
else else
{ {
console.log("Invalid response to dialogExec('"+_menuaction+"')", _response); console.log("Unable to add dialog with dialogExec('" + _menuaction + "')", _response);
rejector(new Error("Unable to add dialog"));
}
}
else
{
console.log("Invalid response to dialogExec('" + _menuaction + "')", _response);
rejector(new Error("Invalid response to dialogExec('" + _menuaction + "')"));
} }
}).sendRequest(); }).sendRequest();
return dialog_promise;
}, },
/** /**

View File

@ -1,23 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <path d="M7.6 0h.8c.886 0 1.6.714 1.6 1.6v4.3c0 .886-.714 1.6-1.6 1.6h-.8C6.714 7.5 6 6.786 6 5.9V1.6C6 .714 6.714 0 7.6 0Zm16 0h.8c.886 0 1.6.714 1.6 1.6v4.3c0 .886-.714 1.6-1.6 1.6h-.8c-.886 0-1.6-.714-1.6-1.6V1.6c0-.886.714-1.6 1.6-1.6ZM4 3c-1.108 0-2 .892-2 2v25c0 1.108.892 2 2 2h24c1.108 0 2-.892 2-2V5c0-1.108-.892-2-2-2h-1v3.5c0 1.108-.892 2-2 2h-2c-1.108 0-2-.892-2-2V3H11v3.5c0 1.108-.892 2-2 2H7c-1.108 0-2-.892-2-2V3Zm2 8h6v5H6Zm7 0h6v5h-6zm7 0h6v5h-6ZM6 17h6v5H6Zm7 0h6v5h-6zm7 0h6v5h-6ZM6 23h6v5H6Zm7 0h6v5h-6zm7 0h6v5h-6z" fill="#62686a"/>
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<g>
<g>
<path fill="#696969" d="M8.556,7.46c1.172,0,2.127-0.952,2.127-2.127v-3.19c0-1.174-0.955-2.127-2.127-2.127
c-1.174,0-2.128,0.953-2.128,2.127v3.19C6.428,6.508,7.382,7.46,8.556,7.46z"/>
<path fill="#696969" d="M23.445,7.46c1.174,0,2.128-0.952,2.128-2.127v-3.19c0-1.174-0.954-2.127-2.128-2.127
c-1.175,0-2.127,0.953-2.127,2.127v3.19C21.318,6.508,22.271,7.46,23.445,7.46z"/>
<path fill="#696969" d="M27.699,3.207h-1.063h-0.001v3.19c0,0.483-0.167,0.924-0.438,1.282c-0.389,0.511-0.998,0.846-1.688,0.846
h-2.127c-1.174,0-2.127-0.953-2.127-2.127v-3.19h-0.001h-8.507h-0.001v3.19c0,1.175-0.954,2.127-2.127,2.127H7.492
c-0.69,0-1.299-0.335-1.687-0.846C5.533,7.321,5.365,6.88,5.365,6.396v-3.19H5.364H4.301c-1.173,0-2.127,0.952-2.127,2.126v11.978
v12.484c0,1.173,0.954,2.127,2.127,2.127h5.615h12.168h5.615c1.174,0,2.127-0.954,2.127-2.127V17.311V5.333
C29.826,4.159,28.873,3.207,27.699,3.207z M11.745,28.73h-6.38v-5.316h6.38V28.73z M11.745,22.358h-6.38v-5.372h6.38V22.358z
M11.745,15.972h-6.38v-5.317h6.38V15.972z M12.81,10.655h6.38v5.317h-6.38V10.655z M12.81,16.986h6.38v5.372h-6.38V16.986z
M19.191,25.559c0-0.006-0.001-0.012-0.001-0.019v3.19h-6.38v-3.19c0,0.007-0.001,0.013-0.001,0.019v-0.034
c0,0.006,0.001,0.011,0.001,0.016v-2.126h6.38v2.126c0-0.005,0.001-0.01,0.001-0.015V25.559z M26.635,28.73h-6.38v-5.316h6.38
V28.73z M26.636,22.358h-6.38v-0.008h-0.001v-5.317h0.001v-0.047h6.38V22.358z M26.636,15.972h-6.38v-5.317h6.38V15.972z"/>
</g>
</g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 701 B

View File

@ -1,14 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <path d="M22 12v13c0 .554-.446 1-1 1s-1-.446-1-1V12c0-.554.446-1 1-1s1 .446 1 1zm-5 0v13c0 .554-.446 1-1 1s-1-.446-1-1V12c0-.554.446-1 1-1s1 .446 1 1zm-5 0v13c0 .554-.446 1-1 1s-1-.446-1-1V12c0-.554.446-1 1-1s1 .446 1 1zM9.5 0C8.669 0 8 .669 8 1.5V5H3c-.831 0-1.5.669-1.5 1.5S2.169 8 3 8h1v21a3 3 0 0 0 3 3h18a3 3 0 0 0 3-3V8h1c.831 0 1.5-.669 1.5-1.5S29.831 5 29 5h-5V1.5c0-.831-.669-1.5-1.5-1.5zM11 3h10v2H11zM7 8h18v20a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z" fill="#62686a"/>
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<path fill="#62686A" d="M29.739,5.116h-4.864C24.701,2.274,20.852,0,16.114,0c-4.735,0-8.585,2.274-8.759,5.116H2.124
C0.95,5.116,0,6.136,0,7.393C0,8.649,0.95,9.67,2.124,9.67h1.072V32h25.489V9.67h1.054c1.173,0,2.125-1.02,2.125-2.277
C31.864,6.135,30.912,5.116,29.739,5.116z M16.114,2.142c3.163,0,5.728,1.311,5.997,2.974H10.118
C10.388,3.453,12.95,2.142,16.114,2.142z M10.63,26.748c0,1.26-0.952,2.279-2.124,2.279c-1.174,0-2.125-1.02-2.125-2.279
l-0.01-13.662c0-1.257,0.952-2.278,2.125-2.278c1.172,0,2.124,1.021,2.124,2.278L10.63,26.748z M18.064,26.748
c0,1.26-0.951,2.279-2.125,2.279c-1.172,0-2.125-1.02-2.125-2.279l-0.01-13.662c0-1.257,0.952-2.278,2.125-2.278
c1.173,0,2.125,1.021,2.125,2.278L18.064,26.748z M25.499,26.748c0,1.26-0.95,2.279-2.124,2.279c-1.172,0-2.126-1.02-2.126-2.279
l-0.01-13.662c0-1.257,0.95-2.278,2.126-2.278c1.17,0,2.124,1.021,2.124,2.278L25.499,26.748z"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 616 B

View File

@ -1,14 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <path d="M22 12v13c0 .554-.446 1-1 1s-1-.446-1-1V12c0-.554.446-1 1-1s1 .446 1 1zm-5 0v13c0 .554-.446 1-1 1s-1-.446-1-1V12c0-.554.446-1 1-1s1 .446 1 1zm-5 0v13c0 .554-.446 1-1 1s-1-.446-1-1V12c0-.554.446-1 1-1s1 .446 1 1zM9.5 0C8.669 0 8 .669 8 1.5V5H3c-.831 0-1.5.669-1.5 1.5S2.169 8 3 8h1v21a3 3 0 0 0 3 3h18a3 3 0 0 0 3-3V8h1c.831 0 1.5-.669 1.5-1.5S29.831 5 29 5h-5V1.5c0-.831-.669-1.5-1.5-1.5zM11 3h10v2H11zM7 8h18v20a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z" fill="#62686a"/>
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<path fill="#62686A" d="M29.739,5.116h-4.864C24.701,2.274,20.852,0,16.114,0c-4.735,0-8.585,2.274-8.759,5.116H2.124
C0.95,5.116,0,6.136,0,7.393C0,8.649,0.95,9.67,2.124,9.67h1.072V32h25.489V9.67h1.054c1.173,0,2.125-1.02,2.125-2.277
C31.864,6.135,30.912,5.116,29.739,5.116z M16.114,2.142c3.163,0,5.728,1.311,5.997,2.974H10.118
C10.388,3.453,12.95,2.142,16.114,2.142z M10.63,26.748c0,1.26-0.952,2.279-2.124,2.279c-1.174,0-2.125-1.02-2.125-2.279
l-0.01-13.662c0-1.257,0.952-2.278,2.125-2.278c1.172,0,2.124,1.021,2.124,2.278L10.63,26.748z M18.064,26.748
c0,1.26-0.951,2.279-2.125,2.279c-1.172,0-2.125-1.02-2.125-2.279l-0.01-13.662c0-1.257,0.952-2.278,2.125-2.278
c1.173,0,2.125,1.021,2.125,2.278L18.064,26.748z M25.499,26.748c0,1.26-0.95,2.279-2.124,2.279c-1.172,0-2.126-1.02-2.126-2.279
l-0.01-13.662c0-1.257,0.95-2.278,2.126-2.278c1.17,0,2.124,1.021,2.124,2.278L25.499,26.748z"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 616 B

View File

@ -33,8 +33,6 @@ class calendar_uiforms extends calendar_ui
{ {
var $public_functions = array( var $public_functions = array(
'freetimesearch' => True, 'freetimesearch' => True,
'ajax_add' => true,
'ajax_conflicts' => true,
'edit' => true, 'edit' => true,
'process_edit' => true, 'process_edit' => true,
'export' => true, 'export' => true,
@ -1025,7 +1023,7 @@ class calendar_uiforms extends calendar_ui
} }
else else
{ {
$msg = lang('Error: saving the event !!!'); $msg = ($msg ? $msg.'<br />':'') . lang('Error: saving the event !!!');
} }
break; break;
@ -1477,45 +1475,6 @@ class calendar_uiforms extends calendar_ui
return strnatcasecmp($this->get_title($uid1), $this->get_title($uid2)); return strnatcasecmp($this->get_title($uid1), $this->get_title($uid2));
} }
public function ajax_add()
{
// This tells etemplate to send as JSON response, not full
// This avoids errors from trying to send header again
if(Api\Json\Request::isJSONRequest())
{
$GLOBALS['egw']->framework->response = Api\Json\Response::get();
}
$this->edit();
}
/**
* Get conflict dialog via ajax. Used by quick add.
*
*/
public function ajax_conflicts()
{
$content = $this->default_add_event();
// Process edit wants to see input values
$participants = array(1=> false);
$participants['cal_resources'] = '';
foreach($content['participants'] as $id => $status)
{
$quantity = $role = '';
calendar_so::split_status($status,$quantity,$role);
$participants[] = array(
'uid' => $id,
'status' => $status,
'quantity' => $quantity,
'role' => $role
);
}
$content['participants'] = $participants;
$content['button'] = array('save' => true);
return $this->process_edit($content);
}
/** /**
* Edit a calendar event * Edit a calendar event
* *

View File

@ -2062,30 +2062,16 @@ export class CalendarApp extends EgwApp
{ {
menuaction += '&'+name+'='+encodeURIComponent(options[name]); menuaction += '&'+name+'='+encodeURIComponent(options[name]);
} }
return this.egw.openDialog(menuaction).then(_dialog => return this.egw.openDialog(menuaction).then(dialog =>
{ {
// it would be much nicer if openDialog returns Promise<ET2Dialog>, so we can use it, without searching the dialog // When the dialog is closed, clean up the placeholder
// in a window.setTimeout in the DOM ... dialog.getComplete().then(() =>
window.setTimeout(() =>
{ {
const dialog = document.querySelector('et2-dialog > form.dialog_content')?.parentNode; if(event)
if (dialog)
{
dialog.callback = _button =>
{
if (event)
{ {
event.destroy(); event.destroy();
} }
// a little quicker than waiting for the server to close it });
if (_button === "calendar-add_button[cancel]")
{
dialog.hide();
}
return false;
}
}
}, 500);
}); });
} }

View File

@ -13,11 +13,11 @@
<rows> <rows>
<row class="dialogHeader" height="28"> <row class="dialogHeader" height="28">
<et2-appicon></et2-appicon> <et2-appicon></et2-appicon>
<et2-textbox id="title" maxlength="255" tabindex="1" class="et2_required" span="4" placeholder="Title"></et2-textbox> <et2-textbox id="title" maxlength="255" tabindex="1" required="true" span="4" placeholder="Title"></et2-textbox>
</row> </row>
<row class="dialogHeader2" height="28"> <row class="dialogHeader2" height="28">
<et2-description for="start" value="Start" width="88"></et2-description> <et2-description for="start" value="Start" width="88"></et2-description>
<et2-date-time id="start" class="required" onchange="app.calendar.edit_start_change" required="1"></et2-date-time> <et2-date-time id="start" onchange="app.calendar.edit_start_change" required="true"></et2-date-time>
<et2-description for="duration" value="Duration" id="calendar_edit_duration"></et2-description> <et2-description for="duration" value="Duration" id="calendar_edit_duration"></et2-description>
<et2-select statustext="Duration of the meeting" id="duration" onchange="app.calendar.set_enddate_visibility" noLang="1" emptyLabel="Use end date"></et2-select> <et2-select statustext="Duration of the meeting" id="duration" onchange="app.calendar.set_enddate_visibility" noLang="1" emptyLabel="Use end date"></et2-select>
<et2-date-time id="end" onchange="app.calendar.edit_update_participant" freeMinuteEntry="true"></et2-date-time> <et2-date-time id="end" onchange="app.calendar.edit_update_participant" freeMinuteEntry="true"></et2-date-time>
@ -25,8 +25,8 @@
</rows> </rows>
</grid> </grid>
<et2-button statustext="saves the changes made" label="Save" id="button[save]" slot="footer" default="true"></et2-button> <et2-button statustext="saves the changes made" label="Save" id="button[save]" slot="footer" default="true"></et2-button>
<et2-button statustext="Full edit dialog" label="Edit" id="button[edit]" slot="footer"></et2-button> <et2-button statustext="Full edit dialog" label="Edit" id="button[edit]" noValidation="true" slot="footer"></et2-button>
<et2-button statustext="Close the window" label="Cancel" id="button[cancel]" slot="footer"></et2-button> <et2-button statustext="Close the window" label="Cancel" id="button[cancel]" noValidation="true" slot="footer"></et2-button>
<et2-checkbox label="Always use full edit dialog" id="new_event_dialog" statustext="Always use the full edit dialog, not this little dialog" onchange="egw.set_preference('calendar',widget.id,widget.get_value() ? 'edit' : 'add');" slot="footer" align="right"></et2-checkbox> <et2-checkbox label="Always use full edit dialog" id="new_event_dialog" statustext="Always use the full edit dialog, not this little dialog" onchange="egw.set_preference('calendar',widget.id,widget.get_value() ? 'edit' : 'add');" slot="footer" align="right"></et2-checkbox>
</template> </template>
</overlay> </overlay>

View File

@ -144,7 +144,6 @@ re-enter your password preferences de Neues Passwort wiederholen
read prefs for the specified application. preferences de Liest Einstellungen von den ausgewählten Anwendungen. read prefs for the specified application. preferences de Liest Einstellungen von den ausgewählten Anwendungen.
reset qrcode preferences de QR-Code zurücksetzen reset qrcode preferences de QR-Code zurücksetzen
revoke preferences de Zurückziehen revoke preferences de Zurückziehen
revoke acccess tokens preferences de Tokens zurückziehen
revoke this token preferences de Diese(s) Token(s) zurückziehen revoke this token preferences de Diese(s) Token(s) zurückziehen
rich text editor theme preferences de Farbschema des Editors rich text editor theme preferences de Farbschema des Editors
scan qrcode with a time-based one-time password (totp) app: preferences de QR-Code mit einer App für zeitbasierende Einmalpasswörter (TOTP Time-based One-time Password) abscannen: scan qrcode with a time-based one-time password (totp) app: preferences de QR-Code mit einer App für zeitbasierende Einmalpasswörter (TOTP Time-based One-time Password) abscannen:

View File

@ -144,7 +144,6 @@ re-enter your password preferences en Re-enter your password
read prefs for the specified application. preferences en Read preferences for the specified application. read prefs for the specified application. preferences en Read preferences for the specified application.
reset qrcode preferences en Reset QRCode reset qrcode preferences en Reset QRCode
revoke preferences en Revoke revoke preferences en Revoke
revoke acccess tokens preferences en Revoke Acccess Tokens
revoke this token preferences en Revoke this token revoke this token preferences en Revoke this token
rich text editor theme preferences en Rich text editor theme rich text editor theme preferences en Rich text editor theme
scan qrcode with a time-based one-time password (totp) app: preferences en Scan QRCode with a Time-based One-time Password (TOTP) App: scan qrcode with a time-based one-time password (totp) app: preferences en Scan QRCode with a Time-based One-time Password (TOTP) App:

View File

@ -143,7 +143,6 @@ re-enter your password preferences fr Ré-entrez votre mot de passe
read prefs for the specified application. preferences fr Lire les préférences pour l'apllication spécifiée. read prefs for the specified application. preferences fr Lire les préférences pour l'apllication spécifiée.
reset qrcode preferences fr Réinitialiser le QRCode reset qrcode preferences fr Réinitialiser le QRCode
revoke preferences fr Révoquer revoke preferences fr Révoquer
revoke acccess tokens preferences fr Révoquer les jetons d'accès
revoke this token preferences fr Révoquer ce jeton revoke this token preferences fr Révoquer ce jeton
rich text editor theme preferences fr Thème de l'éditeur de texte rich text editor theme preferences fr Thème de l'éditeur de texte
scan qrcode with a time-based one-time password (totp) app: preferences fr Scanner le QRCode avec un mot de passe à durée limitée (TOTP) : scan qrcode with a time-based one-time password (totp) app: preferences fr Scanner le QRCode avec un mot de passe à durée limitée (TOTP) :

View File

@ -137,7 +137,6 @@ re-enter your password preferences it Reinserisci la password
read prefs for the specified application. preferences it Legge le preferenze per l'applicazione specificata. read prefs for the specified application. preferences it Legge le preferenze per l'applicazione specificata.
reset qrcode preferences it Reimposta codice QR reset qrcode preferences it Reimposta codice QR
revoke preferences it Revoca revoke preferences it Revoca
revoke acccess tokens preferences it Revoca i token di accesso
revoke this token preferences it Revoca questo token revoke this token preferences it Revoca questo token
rich text editor theme preferences it Tema editor avanzato rich text editor theme preferences it Tema editor avanzato
scan qrcode with a time-based one-time password (totp) app: preferences it Scansiona il codice QR con una apposita app: scan qrcode with a time-based one-time password (totp) app: preferences it Scansiona il codice QR con una apposita app:

View File

@ -142,7 +142,6 @@ re-enter your password preferences km បញ្ចូលពាក្យសម្
read prefs for the specified application. preferences km អានចំណូលចិត្តសម្រាប់កម្មវិធីដែលបានបញ្ជាក់។ read prefs for the specified application. preferences km អានចំណូលចិត្តសម្រាប់កម្មវិធីដែលបានបញ្ជាក់។
reset qrcode preferences km កំណត់ QRCode ឡើងវិញ reset qrcode preferences km កំណត់ QRCode ឡើងវិញ
revoke preferences km ដកហូត revoke preferences km ដកហូត
revoke acccess tokens preferences km ដកហូតសញ្ញាសម្ងាត់ចូលប្រើ
revoke this token preferences km ដកហូតសញ្ញាសម្ងាត់នេះ។ revoke this token preferences km ដកហូតសញ្ញាសម្ងាត់នេះ។
rich text editor theme preferences km ស្បែកកម្មវិធីនិពន្ធអត្ថបទសម្បូរបែប rich text editor theme preferences km ស្បែកកម្មវិធីនិពន្ធអត្ថបទសម្បូរបែប
scan qrcode with a time-based one-time password (totp) app: preferences km ស្កែន QRCode ដោយប្រើកម្មវិធី Time-based One-time Password (TOTP)៖ scan qrcode with a time-based one-time password (totp) app: preferences km ស្កែន QRCode ដោយប្រើកម្មវិធី Time-based One-time Password (TOTP)៖

View File

@ -139,7 +139,6 @@ re-enter your password preferences sk Zadajte heslo znovu
read prefs for the specified application. preferences sk Načítať predvoľby pre vybranú aplikáciu. read prefs for the specified application. preferences sk Načítať predvoľby pre vybranú aplikáciu.
reset qrcode preferences sk Reset QR kódu reset qrcode preferences sk Reset QR kódu
revoke preferences sk Odvolať revoke preferences sk Odvolať
revoke acccess tokens preferences sk Odvolať prístupový token
revoke this token preferences sk Odvolať tento token revoke this token preferences sk Odvolať tento token
rich text editor theme preferences sk Téma textového editora rich text editor theme preferences sk Téma textového editora
scan qrcode with a time-based one-time password (totp) app: preferences sk Naskenujte QR kód aplikáciou pre časové jednorázové heslo (TOTP): scan qrcode with a time-based one-time password (totp) app: preferences sk Naskenujte QR kód aplikáciou pre časové jednorázové heslo (TOTP):