2020-02-11 23:37:33 +01:00
"use strict" ;
2012-05-24 17:45:29 +02:00
/ * *
2013-04-13 21:00:13 +02:00
* EGroupware eTemplate2 - JS History log
2012-05-24 17:45:29 +02:00
*
* @ license http : //opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @ package etemplate
* @ subpackage api
* @ link http : //www.egroupware.org
* @ author Nathan Gray
* @ copyright 2012 Nathan Gray
* /
2020-02-11 23:37:33 +01:00
var _ _extends = ( this && this . _ _extends ) || ( function ( ) {
var extendStatics = function ( d , b ) {
extendStatics = Object . setPrototypeOf ||
( { _ _proto _ _ : [ ] } instanceof Array && function ( d , b ) { d . _ _proto _ _ = b ; } ) ||
function ( d , b ) { for ( var p in b ) if ( b . hasOwnProperty ( p ) ) d [ p ] = b [ p ] ; } ;
return extendStatics ( d , b ) ;
} ;
return function ( d , b ) {
extendStatics ( d , b ) ;
function _ _ ( ) { this . constructor = d ; }
d . prototype = b === null ? Object . create ( b ) : ( _ _ . prototype = b . prototype , new _ _ ( ) ) ;
} ;
} ) ( ) ;
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
var et2 _core _widget _1 = require ( "./et2_core_widget" ) ;
var et2 _core _inheritance _1 = require ( "./et2_core_inheritance" ) ;
var et2 _core _valueWidget _1 = require ( "./et2_core_valueWidget" ) ;
var et2 _dataview _1 = require ( "./et2_dataview" ) ;
var et2 _dataview _model _columns _1 = require ( "./et2_dataview_model_columns" ) ;
var et2 _dataview _controller _1 = require ( "./et2_dataview_controller" ) ;
2020-02-12 22:49:22 +01:00
var et2 _widget _diff _1 = require ( "./et2_widget_diff" ) ;
2012-05-24 17:45:29 +02:00
/ * *
* eTemplate history log widget displays a list of changes to the current record .
2014-01-21 15:39:51 +01:00
* The widget is encapsulated , and only needs the record ' s ID , and a map of
2012-05-24 19:53:23 +02:00
* fields : widgets for display .
*
* It defers its initialization until the tab that it ' s on is selected , to avoid
* wasting time if the user never looks at it .
2014-01-21 15:39:51 +01:00
*
2013-04-13 21:00:13 +02:00
* @ augments et2 _valueWidget
2012-05-24 17:45:29 +02:00
* /
2020-02-11 23:37:33 +01:00
var et2 _historylog = /** @class */ ( function ( _super ) {
_ _extends ( et2 _historylog , _super ) ;
/ * *
* Constructor
*
* @ memberOf et2 _historylog
* /
function et2 _historylog ( _parent , _attrs , _child ) {
var _this = _super . call ( this , _parent , _attrs , et2 _core _inheritance _1 . ClassWithAttributes . extendAttributes ( et2 _historylog . _attributes , _child || { } ) ) || this ;
_this . div = jQuery ( document . createElement ( "div" ) )
. addClass ( "et2_historylog" ) ;
_this . innerDiv = jQuery ( document . createElement ( "div" ) )
. appendTo ( _this . div ) ;
return _this ;
}
et2 _historylog . prototype . set _status _id = function ( _new _id ) {
this . options . status _id = _new _id ;
} ;
et2 _historylog . prototype . doLoadingFinished = function ( ) {
_super . prototype . doLoadingFinished . call ( this ) ;
// Find the tab
var tab = this . get _tab _info ( ) ;
if ( tab ) {
// Bind the action to when the tab is selected
var handler = function ( e ) {
e . data . div . unbind ( "click.history" ) ;
// Bind on click tap, because we need to update history size
// after a rezise happend and history log was not the active tab
e . data . div . bind ( "click.history" , { "history" : e . data . history , div : tab . flagDiv } , function ( e ) {
if ( e . data . history && e . data . history . dynheight ) {
e . data . history . dynheight . update ( function ( _w , _h ) {
e . data . history . dataview . resize ( _w , _h ) ;
} ) ;
}
} ) ;
if ( typeof e . data . history . dataview == "undefined" ) {
e . data . history . finishInit ( ) ;
if ( e . data . history . dynheight ) {
e . data . history . dynheight . update ( function ( _w , _h ) {
e . data . history . dataview . resize ( _w , _h ) ;
} ) ;
}
}
} ;
tab . flagDiv . bind ( "click.history" , { "history" : this , div : tab . flagDiv } , handler ) ;
// Display if history tab is selected
if ( tab . contentDiv . is ( ':visible' ) && typeof this . dataview == 'undefined' ) {
tab . flagDiv . trigger ( "click.history" ) ;
}
}
else {
this . finishInit ( ) ;
}
return true ;
} ;
et2 _historylog . prototype . _createNamespace = function ( ) {
return true ;
} ;
/ * *
* Finish initialization which was skipped until tab was selected
* /
et2 _historylog . prototype . finishInit = function ( ) {
// No point with no ID
if ( ! this . options . value || ! this . options . value . id ) {
return ;
}
this . _filters = {
record _id : this . options . value . id ,
appname : this . options . value . app ,
get _rows : this . options . get _rows
} ;
// Warn if status_id is the same as history id, that causes overlap and missing labels
if ( this . options . status _id === this . id ) {
this . egw ( ) . debug ( "warn" , "status_id attribute should not be the same as historylog ID" ) ;
}
// Create the dynheight component which dynamically scales the inner
// container.
this . div . parentsUntil ( '.et2_tabs' ) . height ( '100%' ) ;
var parent = this . get _tab _info ( ) ;
this . dynheight = new et2 _dynheight ( parent ? parent . contentDiv : this . div . parent ( ) , this . innerDiv , 250 ) ;
// Create the outer grid container
this . dataview = new et2 _dataview _1 . et2 _dataview ( this . innerDiv , this . egw ( ) ) ;
var dataview _columns = [ ] ;
var _columns = typeof this . options . columns === "string" ?
this . options . columns . split ( ',' ) : this . options . columns ;
for ( var i = 0 ; i < et2 _historylog . columns . length ; i ++ ) {
dataview _columns [ i ] = {
"id" : et2 _historylog . columns [ i ] . id ,
"caption" : et2 _historylog . columns [ i ] . caption ,
"width" : et2 _historylog . columns [ i ] . width ,
"visibility" : _columns . indexOf ( et2 _historylog . columns [ i ] . id ) < 0 ?
et2 _dataview _model _columns _1 . et2 _dataview _column . ET2 _COL _VISIBILITY _INVISIBLE : et2 _dataview _model _columns _1 . et2 _dataview _column . ET2 _COL _VISIBILITY _VISIBLE
} ;
}
this . dataview . setColumns ( dataview _columns ) ;
// Create widgets for columns that stay the same, and set up varying widgets
this . createWidgets ( ) ;
// Create the gridview controller
2020-02-12 23:18:10 +01:00
var linkCallback = function ( ) {
} ;
2020-02-11 23:37:33 +01:00
this . controller = new et2 _dataview _controller _1 . et2 _dataview _controller ( null , this . dataview . grid ) ;
this . controller . setContext ( this ) ;
this . controller . setDataProvider ( this ) ;
this . controller . setLinkCallback ( linkCallback ) ;
this . controller . setRowCallback ( this . rowCallback ) ;
this . controller . setActionObjectManager ( null ) ;
var total = typeof this . options . value . total !== "undefined" ?
this . options . value . total : 0 ;
// This triggers an invalidate, which updates the grid
this . dataview . grid . setTotalCount ( total ) ;
// Insert any data sent from server, so invalidate finds data already
if ( this . options . value . rows && this . options . value . num _rows ) {
this . controller . loadInitialData ( this . options . value . dataStorePrefix , this . options . value . row _id , this . options . value . rows ) ;
// Remove, to prevent duplication
delete this . options . value . rows ;
// This triggers an invalidate, which updates the grid
this . dataview . grid . setTotalCount ( total ) ;
}
else {
// Trigger the initial update
this . controller . update ( ) ;
}
// Write something inside the column headers
for ( var i = 0 ; i < et2 _historylog . columns . length ; i ++ ) {
jQuery ( this . dataview . getHeaderContainerNode ( i ) ) . text ( et2 _historylog . columns [ i ] . caption ) ;
}
// Register a resize callback
jQuery ( window ) . on ( 'resize.' + this . options . value . app + this . options . value . id , function ( ) {
2020-09-11 21:11:52 +02:00
if ( this && typeof this . dynheight != 'undefined' )
this . dynheight . update ( function ( _w , _h ) {
this . dataview . resize ( _w , _h ) ;
} . bind ( this ) ) ;
} . bind ( this ) ) ;
2020-02-11 23:37:33 +01:00
} ;
/ * *
* Destroys all
* /
et2 _historylog . prototype . destroy = function ( ) {
// Unbind, if bound
if ( this . options . value && ! this . options . value . id ) {
jQuery ( window ) . off ( '.' + this . options . value . app + this . options . value . id ) ;
}
// Free the widgets
for ( var i = 0 ; i < et2 _historylog . columns . length ; i ++ ) {
if ( et2 _historylog . columns [ i ] . widget )
et2 _historylog . columns [ i ] . widget . destroy ( ) ;
}
for ( var key in this . fields ) {
this . fields [ key ] . widget . destroy ( ) ;
}
// Free the grid components
if ( this . dataview )
this . dataview . destroy ( ) ;
if ( this . controller )
this . controller . destroy ( ) ;
if ( this . dynheight )
2020-02-12 22:49:22 +01:00
this . dynheight . destroy ( ) ;
2020-02-11 23:37:33 +01:00
_super . prototype . destroy . call ( this ) ;
} ;
/ * *
* Create all needed widgets for new / o l d v a l u e s
* /
et2 _historylog . prototype . createWidgets = function ( ) {
// Constant widgets - first 3 columns
for ( var i _1 = 0 ; i _1 < et2 _historylog . columns . length ; i _1 ++ ) {
if ( et2 _historylog . columns [ i _1 ] . widget _type ) {
// Status ID is allowed to be remapped to something else. Only affects the widget ID though
var attrs = { 'readonly' : true , 'id' : ( i _1 == et2 _historylog . FIELD ? this . options . status _id : et2 _historylog . columns [ i _1 ] . id ) } ;
et2 _historylog . columns [ i _1 ] . widget = et2 _createWidget ( et2 _historylog . columns [ i _1 ] . widget _type , attrs , this ) ;
et2 _historylog . columns [ i _1 ] . widget . transformAttributes ( attrs ) ;
et2 _historylog . columns [ i _1 ] . nodes = jQuery ( et2 _historylog . columns [ i _1 ] . widget . getDetachedNodes ( ) ) ;
}
}
// Add in handling for links
if ( typeof this . options . value [ 'status-widgets' ] [ '~link~' ] == 'undefined' ) {
et2 _historylog . columns [ et2 _historylog . FIELD ] . widget . optionValues [ '~link~' ] = this . egw ( ) . lang ( 'link' ) ;
this . options . value [ 'status-widgets' ] [ '~link~' ] = 'link' ;
}
// Add in handling for files
if ( typeof this . options . value [ 'status-widgets' ] [ '~file~' ] == 'undefined' ) {
et2 _historylog . columns [ et2 _historylog . FIELD ] . widget . optionValues [ '~file~' ] = this . egw ( ) . lang ( 'File' ) ;
this . options . value [ 'status-widgets' ] [ '~file~' ] = 'vfs' ;
}
// Add in handling for user-agent & action
if ( typeof this . options . value [ 'status-widgets' ] [ 'user_agent_action' ] == 'undefined' ) {
et2 _historylog . columns [ et2 _historylog . FIELD ] . widget . optionValues [ 'user_agent_action' ] = this . egw ( ) . lang ( 'User-agent & action' ) ;
}
// Per-field widgets - new value & old value
this . fields = { } ;
var labels = et2 _historylog . columns [ et2 _historylog . FIELD ] . widget . optionValues ;
// Custom fields - Need to create one that's all read-only for proper display
var cf _widget = et2 _createWidget ( 'customfields' , { 'readonly' : true } , this ) ;
cf _widget . loadFields ( ) ;
// Override this or it may damage the real values
cf _widget . getValue = function ( ) { return null ; } ;
for ( var key _1 in cf _widget . widgets ) {
// Add label
labels [ cf _widget . prefix + key _1 ] = cf _widget . options . customfields [ key _1 ] . label ;
// If it doesn't support detached nodes, just treat it as text
if ( cf _widget . widgets [ key _1 ] . getDetachedNodes ) {
var nodes = cf _widget . widgets [ key _1 ] . getDetachedNodes ( ) ;
for ( var i = 0 ; i < nodes . length ; i ++ ) {
if ( nodes [ i ] == null )
nodes . splice ( i , 1 ) ;
}
// Save to use for each row
this . fields [ cf _widget . prefix + key _1 ] = {
attrs : cf _widget . widgets [ key _1 ] . options ,
widget : cf _widget . widgets [ key _1 ] ,
nodes : jQuery ( nodes )
} ;
}
}
// Add all cf labels
et2 _historylog . columns [ et2 _historylog . FIELD ] . widget . set _select _options ( labels ) ;
// From app
for ( var key in this . options . value [ 'status-widgets' ] ) {
var attrs _1 = jQuery . extend ( { 'readonly' : true , 'id' : key } , this . getArrayMgr ( 'modifications' ) . getEntry ( key ) ) ;
var field = attrs _1 . type || this . options . value [ 'status-widgets' ] [ key ] ;
var options = null ;
var widget = this . _create _widget ( key , field , attrs _1 , options ) ;
if ( widget === null ) {
continue ;
}
if ( widget . instanceOf ( et2 _selectbox ) )
widget . options . multiple = true ;
widget . transformAttributes ( attrs _1 ) ;
// Save to use for each row
var nodes _1 = widget . _children . length ? [ ] : jQuery ( widget . getDetachedNodes ( ) ) ;
for ( var i _2 = 0 ; i _2 < widget . _children . length ; i _2 ++ ) {
2020-02-12 23:18:10 +01:00
// @ts-ignore
2020-02-11 23:37:33 +01:00
nodes _1 . push ( jQuery ( widget . _children [ i _2 ] . getDetachedNodes ( ) ) ) ;
}
this . fields [ key ] = {
attrs : attrs _1 ,
widget : widget ,
nodes : nodes _1
} ;
}
// Widget for text diffs
var diff = et2 _createWidget ( 'diff' , { } , this ) ;
this . diff = {
2020-02-12 22:49:22 +01:00
// @ts-ignore
2020-02-11 23:37:33 +01:00
widget : diff ,
nodes : jQuery ( diff . getDetachedNodes ( ) )
} ;
} ;
et2 _historylog . prototype . _create _widget = function ( key , field , attrs , options ) {
var widget = null ;
// If field has multiple parts (is object) and isn't an obvious select box
if ( typeof field === 'object' ) {
// Check for multi-part statuses needing multiple widgets
var need _box = false ; //!this.getArrayMgr('sel_options').getEntry(key);
for ( var j in field ) {
// Require widget to be a widget, to avoid invalid widgets
// (and template, which is a widget and an infolog todo status)
if ( et2 _registry [ field [ j ] ] && [ 'template' ] . indexOf ( field [ j ] ) < 0 ) // && (et2_registry[field[j]].prototype.instanceOf(et2_valueWidget))
{
need _box = true ;
break ;
}
}
if ( need _box ) {
// Multi-part value needs multiple widgets
widget = et2 _createWidget ( 'vbox' , attrs , this ) ;
for ( var i in field ) {
var type = field [ i ] ;
var child _attrs = jQuery . extend ( { } , attrs ) ;
if ( typeof type === 'object' ) {
child _attrs [ 'select_options' ] = field [ i ] ;
type = 'select' ;
}
else {
delete child _attrs [ 'select_options' ] ;
}
child _attrs . id = i ;
var child = this . _create _widget ( i , type , child _attrs , options ) ;
widget . addChild ( child ) ;
child . transformAttributes ( child _attrs ) ;
}
}
else {
attrs [ 'select_options' ] = field ;
}
}
// Check for options after the type, ex: link-entry:infolog
else if ( field . indexOf ( ':' ) > 0 ) {
var options = field . split ( ':' ) ;
field = options . shift ( ) ;
}
if ( widget === null ) {
widget = et2 _createWidget ( typeof field === 'string' ? field : 'select' , attrs , this ) ;
}
if ( ! widget . instanceOf ( et2 _IDetachedDOM ) ) {
this . egw ( ) . debug ( "warn" , this , "Invalid widget " + field + " for " + key + ". Status widgets must implement et2_IDetachedDOM." ) ;
return null ;
}
// Parse / set legacy options
if ( options ) {
var mgr = this . getArrayMgr ( "content" ) ;
2020-06-09 23:21:34 +02:00
var legacy = widget . constructor . legacyOptions || [ ] ;
for ( var i _3 = 0 ; i _3 < options . length && i _3 < legacy . length ; i _3 ++ ) {
2020-02-11 23:37:33 +01:00
// Not set
if ( options [ i _3 ] === "" )
continue ;
2020-06-09 23:21:34 +02:00
var attr = widget . attributes [ legacy [ i _3 ] ] ;
2020-02-11 23:37:33 +01:00
var attrValue = options [ i _3 ] ;
// If the attribute is marked as boolean, parse the
// expression as bool expression.
if ( attr . type === "boolean" ) {
attrValue = mgr . parseBoolExpression ( attrValue ) ;
}
else {
attrValue = mgr . expandName ( attrValue ) ;
}
2020-06-09 23:21:34 +02:00
attrs [ legacy [ i _3 ] ] = attrValue ;
if ( typeof widget [ 'set_' + legacy [ i _3 ] ] === 'function' ) {
widget [ 'set_' + legacy [ i _3 ] ] . call ( widget , attrValue ) ;
2020-02-11 23:37:33 +01:00
}
else {
2020-06-09 23:21:34 +02:00
widget . options [ legacy [ i _3 ] ] = attrValue ;
2020-02-11 23:37:33 +01:00
}
}
}
return widget ;
} ;
et2 _historylog . prototype . getDOMNode = function ( _sender ) {
if ( _sender == this ) {
return this . div [ 0 ] ;
}
for ( var i = 0 ; i < et2 _historylog . columns . length ; i ++ ) {
if ( _sender == et2 _historylog . columns [ i ] . widget ) {
return this . dataview . getHeaderContainerNode ( i ) ;
}
}
return null ;
} ;
et2 _historylog . prototype . dataFetch = function ( _queriedRange , _callback , _context ) {
// Skip getting data if there's no ID
if ( ! this . value . id )
return ;
// Set num_rows to fetch via nextmatch
if ( this . options . value [ 'num_rows' ] )
_queriedRange [ 'num_rows' ] = this . options . value [ 'num_rows' ] ;
var historylog = this ;
// Pass the fetch call to the API
this . egw ( ) . dataFetch ( this . getInstanceManager ( ) . etemplate _exec _id , _queriedRange , this . _filters , this . id , function ( _response ) {
_callback . call ( this , _response ) ;
} , _context , [ ] ) ;
} ;
// Needed by interface
et2 _historylog . prototype . dataRegisterUID = function ( _uid , _callback , _context ) {
this . egw ( ) . dataRegisterUID ( _uid , _callback , _context , this . getInstanceManager ( ) . etemplate _exec _id , this . id ) ;
} ;
et2 _historylog . prototype . dataUnregisterUID = function ( _uid , _callback , _context ) {
// Needed by interface
} ;
/ * *
* The row callback gets called by the gridview controller whenever
* the actual DOM - Nodes for a node with the given data have to be
* created .
*
* @ param { type } _data
* @ param { type } _row
* @ param { type } _idx
* @ param { type } _entry
* /
et2 _historylog . prototype . rowCallback = function ( _data , _row , _idx , _entry ) {
var tr = _row . getDOMNode ( ) ;
jQuery ( tr ) . attr ( "valign" , "top" ) ;
var row = this . dataview . rowProvider . getPrototype ( "default" ) ;
var self = this ;
jQuery ( "div" , row ) . each ( function ( i ) {
var nodes = [ ] ;
var widget = et2 _historylog . columns [ i ] . widget ;
var value = _data [ et2 _historylog . columns [ i ] . id ] ;
if ( et2 _historylog . OWNER === i && _data [ 'share_email' ] ) {
// Show share email instead of owner
widget = undefined ;
value = _data [ 'share_email' ] ;
}
// Get widget from list, unless it needs a diff widget
2020-06-16 18:58:03 +02:00
if ( ( typeof widget == 'undefined' || widget == null ) && typeof self . fields [ _data . status ] != 'undefined' && ( i < et2 _historylog . NEW _VALUE ||
2020-02-11 23:37:33 +01:00
i >= et2 _historylog . NEW _VALUE && ( self . fields [ _data . status ] . nodes || ! self . _needsDiffWidget ( _data [ 'status' ] , _data [ et2 _historylog . columns [ et2 _historylog . OLD _VALUE ] . id ] ) ) ) ) {
widget = self . fields [ _data . status ] . widget ;
if ( ! widget . _children . length ) {
nodes = self . fields [ _data . status ] . nodes . clone ( ) ;
}
for ( var j = 0 ; j < widget . _children . length ; j ++ ) {
2020-02-12 23:18:10 +01:00
// @ts-ignore
2020-02-11 23:37:33 +01:00
nodes . push ( self . fields [ _data . status ] . nodes [ j ] . clone ( ) ) ;
2020-02-12 22:49:22 +01:00
if ( widget . _children [ j ] . instanceOf ( et2 _widget _diff _1 . et2 _diff ) ) {
2020-02-11 23:37:33 +01:00
self . _spanValueColumns ( jQuery ( this ) ) ;
}
}
}
else if ( widget ) {
nodes = et2 _historylog . columns [ i ] . nodes . clone ( ) ;
}
else if ( (
// Already parsed & cached
typeof _data [ et2 _historylog . columns [ et2 _historylog . NEW _VALUE ] . id ] == "object" &&
typeof _data [ et2 _historylog . columns [ et2 _historylog . NEW _VALUE ] . id ] != "undefined" &&
_data [ et2 _historylog . columns [ et2 _historylog . NEW _VALUE ] . id ] !== null ) || // typeof null === 'object'
// Large old value
self . _needsDiffWidget ( _data [ 'status' ] , _data [ et2 _historylog . columns [ et2 _historylog . OLD _VALUE ] . id ] ) ||
// Large new value
self . _needsDiffWidget ( _data [ 'status' ] , _data [ et2 _historylog . columns [ et2 _historylog . NEW _VALUE ] . id ] ) ) {
// Large text value - span both columns, and show a nice diff
var jthis = jQuery ( this ) ;
if ( i === et2 _historylog . NEW _VALUE ) {
// Diff widget
widget = self . diff . widget ;
nodes = self . diff . nodes . clone ( ) ;
if ( widget )
widget . setDetachedAttributes ( nodes , {
value : value ,
label : jthis . parents ( "td" ) . prev ( ) . text ( )
} ) ;
self . _spanValueColumns ( jthis ) ;
}
}
else {
// No widget fallback - display actual value
nodes = jQuery ( '<span>' ) . text ( value === null ? '' : value ) ;
}
if ( widget ) {
if ( widget . _children . length ) {
// Multi-part values
var box = jQuery ( widget . getDOMNode ( ) ) . clone ( ) ;
for ( var j = 0 ; j < widget . _children . length ; j ++ ) {
var id = widget . _children [ j ] . id ;
var widget _value = value ? value [ id ] || "" : "" ;
widget . _children [ j ] . setDetachedAttributes ( nodes [ j ] , { value : widget _value } ) ;
box . append ( nodes [ j ] ) ;
}
nodes = box ;
}
else {
widget . setDetachedAttributes ( nodes , { value : value } ) ;
}
}
jQuery ( this ) . append ( nodes ) ;
} ) ;
jQuery ( tr ) . append ( row . children ( ) ) ;
return tr ;
} ;
/ * *
* How to tell if the row needs a diff widget or not
*
* @ param { string } columnName
* @ param { string } value
* @ returns { Boolean }
* /
et2 _historylog . prototype . _needsDiffWidget = function ( columnName , value ) {
if ( typeof value !== "string" && value ) {
this . egw ( ) . debug ( "warn" , "Crazy diff value" , value ) ;
return false ;
}
return value === '***diff***' ;
} ;
/ * *
* Make a single row ' s new value cell span across both new value and old value
* columns . Used for diff widget .
*
* @ param { jQuery } row jQuery wrapped row node
* /
et2 _historylog . prototype . _spanValueColumns = function ( row ) {
// Stretch column 4
row . parents ( "td" ) . attr ( "colspan" , 2 )
. css ( "border-right" , "none" ) ;
row . css ( "width" , ( this . dataview . getColumnMgr ( ) . getColumnWidth ( et2 _historylog . NEW _VALUE ) +
this . dataview . getColumnMgr ( ) . getColumnWidth ( et2 _historylog . OLD _VALUE ) - 10 ) + 'px' ) ;
// Skip column 5
row . parents ( "td" ) . next ( ) . remove ( ) ;
} ;
et2 _historylog . prototype . resize = function ( _height ) {
if ( typeof this . options != 'undefined' && _height
&& typeof this . options . resize _ratio != 'undefined' ) {
// apply the ratio
_height = ( this . options . resize _ratio != '' ) ? _height * this . options . resize _ratio : _height ;
if ( _height != 0 ) {
// 250px is the default value for history widget
// if it's not loaded yet and window is resized
// then add the default height with excess_height
if ( this . div . height ( ) == 0 )
_height += 250 ;
this . div . height ( this . div . height ( ) + _height ) ;
// trigger the history registered resize
// in order to update the height with new value
this . div . trigger ( 'resize.' + this . options . value . app + this . options . value . id ) ;
}
}
if ( this . dynheight ) {
this . dynheight . update ( ) ;
}
// Resize diff widgets to match new space
if ( this . dataview ) {
2020-02-12 22:49:22 +01:00
var columns = this . dataview . getColumnMgr ( ) ;
jQuery ( '.et2_diff' , this . div ) . closest ( '.innerContainer' )
. width ( columns . getColumnWidth ( et2 _historylog . NEW _VALUE ) + columns . getColumnWidth ( et2 _historylog . OLD _VALUE ) ) ;
2020-02-11 23:37:33 +01:00
}
} ;
et2 _historylog . _attributes = {
"value" : {
"name" : "Value" ,
"type" : "any" ,
"description" : "Object {app: ..., id: ..., status-widgets: {}} where status-widgets is a map of fields to widgets used to display those fields"
} ,
"status_id" : {
"name" : "status_id" ,
"type" : "string" ,
"default" : "status" ,
"description" : "The history widget is traditionally named 'status'. If you name another widget in the same template 'status', you can use this attribute to re-name the history widget. "
} ,
"columns" : {
"name" : "columns" ,
"type" : "string" ,
"default" : "user_ts,owner,status,new_value,old_value" ,
"description" : "Columns to display. Default is user_ts,owner,status,new_value,old_value"
} ,
"get_rows" : {
"name" : "get_rows" ,
"type" : "string" ,
"default" : "EGroupware\\Api\\Storage\\History::get_rows" ,
"description" : "Method to get rows"
}
} ;
2020-03-30 18:28:48 +02:00
et2 _historylog . legacyOptions = [ "status_id" ] ;
2020-02-11 23:37:33 +01:00
et2 _historylog . columns = [
{ 'id' : 'user_ts' , caption : 'Date' , 'width' : '120px' , widget _type : 'date-time' , widget : null , nodes : null } ,
{ 'id' : 'owner' , caption : 'User' , 'width' : '150px' , widget _type : 'select-account' , widget : null , nodes : null } ,
{ 'id' : 'status' , caption : 'Changed' , 'width' : '120px' , widget _type : 'select' , widget : null , nodes : null } ,
{ 'id' : 'new_value' , caption : 'New Value' , 'width' : '50%' , widget : null , nodes : null } ,
{ 'id' : 'old_value' , caption : 'Old Value' , 'width' : '50%' , widget : null , nodes : null }
] ;
et2 _historylog . TIMESTAMP = 0 ;
et2 _historylog . OWNER = 1 ;
et2 _historylog . FIELD = 2 ;
et2 _historylog . NEW _VALUE = 3 ;
et2 _historylog . OLD _VALUE = 4 ;
return et2 _historylog ;
} ( et2 _core _valueWidget _1 . et2 _valueWidget ) ) ;
exports . et2 _historylog = et2 _historylog ;
et2 _core _widget _1 . et2 _register _widget ( et2 _historylog , [ 'historylog' ] ) ;
//# sourceMappingURL=et2_widget_historylog.js.map