mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-29 10:09:24 +01:00
26de0ab801
In instances with > 100 users, it's possible the current user was not on the client side. Now checking user() first, it should always be there.
211 lines
4.8 KiB
TypeScript
211 lines
4.8 KiB
TypeScript
/**
|
|
* EGroupware eTemplate2 - JS Timestamp button 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 2017
|
|
*/
|
|
|
|
import {et2_IInput} from "../et2_core_interfaces";
|
|
import {date} from "../lib/date.js";
|
|
import {Et2Button} from "./Et2Button";
|
|
import {Et2Tabs} from "../Layout/Et2Tabs/Et2Tabs";
|
|
import {SelectOption} from "../Et2Select/FindSelectOptions";
|
|
|
|
/**
|
|
* Class which implements the "et2-button-timestamp" tag
|
|
*
|
|
* Clicking the button puts the current time and current user at the end of
|
|
* the provided field.
|
|
*/
|
|
export class Et2ButtonTimestamper extends Et2Button
|
|
{
|
|
static get properties()
|
|
{
|
|
return {
|
|
...super.properties,
|
|
/**
|
|
* Which field to place the timestamp in
|
|
*/
|
|
target: {
|
|
type: String
|
|
},
|
|
/**
|
|
* Format for the timestamp. User is always after.
|
|
*/
|
|
format: {
|
|
type: String
|
|
},
|
|
/**
|
|
* Timezone. Default is user time.
|
|
*/
|
|
timezone: {
|
|
type: String
|
|
},
|
|
/**
|
|
* Icon to use, default "timestamp"
|
|
*/
|
|
image: {
|
|
type: String
|
|
}
|
|
}
|
|
}
|
|
|
|
constructor(...args : any[])
|
|
{
|
|
super(...args);
|
|
|
|
// Property default values
|
|
this.image = 'timestamp';
|
|
this.noSubmit = true;
|
|
|
|
this.onclick = this.stamp.bind(this);
|
|
}
|
|
|
|
/**
|
|
* Stamp the date / user into the target widget
|
|
*
|
|
* @param _ev
|
|
*/
|
|
stamp(event : MouseEvent)
|
|
{
|
|
const now = new Date(new Date().toLocaleString('en-US', {
|
|
timeZone: this.timezone || this.egw().preference('tz')
|
|
}));
|
|
const format = this.format || this.egw().preference('dateformat') + ' ' + (this.egw().preference("timeformat") === "12" ? "h:ia" : "H:i") + ' ';
|
|
|
|
let text = date(format, now);
|
|
|
|
// Get properly formatted user name
|
|
|
|
// Try from account first, it's faster
|
|
const fromAccount = this.egw().user("account_fullname") || "";
|
|
|
|
if(fromAccount != "")
|
|
{
|
|
this.setText(text + fromAccount + ': ');
|
|
}
|
|
else
|
|
{
|
|
const user = '' + parseInt(this.egw().user('account_id'));
|
|
this.egw().accounts('accounts').then((accounts) =>
|
|
{
|
|
const account = accounts.filter((option : SelectOption) => option.value == user)[0];
|
|
this.setText(text + account.label + ': ');
|
|
});
|
|
}
|
|
}
|
|
|
|
protected setText(text)
|
|
{
|
|
const widget = this._get_input(this.target);
|
|
let input = widget.input ? widget.input : widget.getDOMNode();
|
|
if(input.context)
|
|
{
|
|
input = input.get(0);
|
|
}
|
|
|
|
let scrollPos = input.scrollTop;
|
|
let browser = ((input.selectionStart || input.selectionStart == "0") ?
|
|
"standards" : (document["selection"] ? "ie" : false));
|
|
|
|
let pos = 0;
|
|
let tinymce = tinyMCE && tinyMCE.EditorManager.get(input.id) || false;
|
|
|
|
// Find cursor or selection
|
|
if(browser == "ie")
|
|
{
|
|
input.focus();
|
|
let range = document["selection"].createRange();
|
|
range.moveStart("character", -input.value.length);
|
|
pos = range.text.length;
|
|
}
|
|
else if(browser == "standards")
|
|
{
|
|
pos = input.selectionStart;
|
|
}
|
|
|
|
// If on a tab, switch to that tab so user can see it
|
|
let tabbox = widget;
|
|
while(tabbox._parent && tabbox.nodeName !== 'ET2-TABBOX')
|
|
{
|
|
tabbox = tabbox._parent;
|
|
}
|
|
if(tabbox.nodeName === 'ET2-TABBOX')
|
|
{
|
|
(<Et2Tabs>tabbox).activateTab(widget);
|
|
}
|
|
|
|
// If tinymce, update it
|
|
if(tinymce)
|
|
{
|
|
tinymce.insertContent(text);
|
|
}
|
|
else
|
|
{
|
|
// Insert the text
|
|
let front = (input.value).substring(0, pos);
|
|
let back = (input.value).substring(pos, input.value.length);
|
|
// for webComponent, we need to set the component value too, otherwise the change is lost!
|
|
if(typeof widget.tagName !== 'undefined')
|
|
{
|
|
widget.value = front + text + back;
|
|
}
|
|
input.value = front + text + back;
|
|
|
|
// Clean up a little
|
|
pos = pos + text.length;
|
|
if(browser == "ie")
|
|
{
|
|
input.focus();
|
|
let range = document["selection"].createRange();
|
|
range.moveStart("character", -input.value.length);
|
|
range.moveStart("character", pos);
|
|
range.moveEnd("character", 0);
|
|
range.select();
|
|
}
|
|
else if(browser == "standards")
|
|
{
|
|
input.selectionStart = pos;
|
|
input.selectionEnd = pos;
|
|
input.focus();
|
|
}
|
|
input.scrollTop = scrollPos;
|
|
input.focus();
|
|
}
|
|
}
|
|
|
|
private _get_input(target)
|
|
{
|
|
let input = null;
|
|
let widget = null;
|
|
|
|
if (typeof target == 'string')
|
|
{
|
|
widget = this.getRoot().getWidgetById(target);
|
|
}
|
|
else if (target.instanceOf && target.instanceOf(et2_IInput))
|
|
{
|
|
widget = target;
|
|
}
|
|
else if(typeof target == 'string' && target.indexOf('#') < 0 && jQuery('#'+this.target).is('input'))
|
|
{
|
|
input = this.target;
|
|
}
|
|
if(widget)
|
|
{
|
|
return widget;
|
|
}
|
|
if(input?.context)
|
|
{
|
|
input = input.get(0);
|
|
}
|
|
return input;
|
|
}
|
|
}
|
|
|
|
// @ts-ignore TypeScript is not recognizing that Et2Button is a LitElement
|
|
customElements.define("et2-button-timestamp", Et2ButtonTimestamper); |