mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-22 14:41:29 +01:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
4727b40329
@ -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
|
||||||
|
@ -477,7 +477,7 @@ export class Et2Dialog extends Et2Widget(SlotMixin(SlDialog))
|
|||||||
*/
|
*/
|
||||||
close()
|
close()
|
||||||
{
|
{
|
||||||
this.hide();
|
return this.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
addOpenListeners()
|
addOpenListeners()
|
||||||
|
@ -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");
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
5
api/js/jsapi/egw_global.d.ts
vendored
5
api/js/jsapi/egw_global.d.ts
vendored
@ -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
|
||||||
|
@ -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;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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 |
@ -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 |
@ -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 |
@ -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
|
||||||
*
|
*
|
||||||
|
@ -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);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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>
|
@ -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:
|
||||||
|
@ -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:
|
||||||
|
@ -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) :
|
||||||
|
@ -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:
|
||||||
|
@ -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)៖
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user