2018-02-21 23:23:32 +00:00
/ *
*
2019-01-17 13:05:03 +00:00
* ( c ) Copyright Ascensio System SIA 2010 - 2019
2018-02-21 23:23:32 +00:00
*
* This program is a free software product . You can redistribute it and / or
* modify it under the terms of the GNU Affero General Public License ( AGPL )
* version 3 as published by the Free Software Foundation . In accordance with
* Section 7 ( a ) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non - infringement
* of any third - party rights .
*
* This program is distributed WITHOUT ANY WARRANTY ; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . For
* details , see the GNU AGPL at : http : //www.gnu.org/licenses/agpl-3.0.html
*
2019-01-17 13:00:34 +00:00
* You can contact Ascensio System SIA at 20 A - 12 Ernesta Birznieka - Upisha
* street , Riga , Latvia , EU , LV - 1050.
2018-02-21 23:23:32 +00:00
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices , as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7 ( b ) of the License you must retain the original Product
* logo when distributing the program . Pursuant to Section 7 ( e ) we decline to
* grant you any rights under trademark law for use of our trademarks .
*
* All the Product ' s GUI elements , including illustrations and icon sets , as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution - ShareAlike 4.0 International . See the License
* terms at http : //creativecommons.org/licenses/by-sa/4.0/legalcode
*
* /
/ * *
* Controller wraps up interaction with desktop app
*
* Created by Maxim . Kadushkin on 2 / 16 / 2018.
* /
define ( [
'core'
] , function ( ) {
'use strict' ;
2021-02-25 20:56:18 +00:00
var features = {
2020-03-05 10:09:53 +00:00
version : '{{PRODUCT_VERSION}}' ,
eventloading : true ,
2021-02-25 20:56:18 +00:00
titlebuttons : true ,
2022-11-21 21:28:55 +00:00
uithemes : true ,
quickprint : true ,
2021-02-25 20:56:18 +00:00
} ;
2021-05-14 12:32:03 +00:00
var native = window . desktop || window . AscDesktopEditor ;
2021-02-25 20:56:18 +00:00
! ! native && native . execCommand ( 'webapps:features' , JSON . stringify ( features ) ) ;
2020-03-05 10:09:53 +00:00
2018-02-21 23:23:32 +00:00
var Desktop = function ( ) {
2019-10-07 12:47:56 +00:00
var config = { version : '{{PRODUCT_VERSION}}' } ;
2020-03-05 10:09:53 +00:00
var webapp = window . DE || window . PE || window . SSE ;
2019-10-07 12:47:56 +00:00
var titlebuttons ;
2019-11-05 12:28:33 +00:00
var btnsave _icons = {
'btn-save' : 'save' ,
'btn-save-coauth' : 'coauth' ,
'btn-synch' : 'synch' } ;
2022-06-09 07:36:56 +00:00
var nativevars ;
2018-02-21 23:23:32 +00:00
2020-03-05 10:09:53 +00:00
if ( ! ! native ) {
2021-12-14 14:06:36 +00:00
native . features = native . features || { } ;
2022-06-09 07:36:56 +00:00
nativevars = window . RendererProcessVariable ;
2019-05-13 11:45:17 +00:00
window . on _native _message = function ( cmd , param ) {
if ( /^style:change/ . test ( cmd ) ) {
var obj = JSON . parse ( param ) ;
if ( obj . element == 'toolbar' ) {
if ( obj . action == 'off' && obj . style == 'native-color' ) {
$ ( '.toolbar' ) . removeClass ( 'editor-native-color' ) ;
}
} else
if ( obj . element == 'body' ) {
if ( obj . action == 'merge' ) {
var style = document . createElement ( 'style' ) ;
style . innerHTML = obj . style ;
document . body . appendChild ( style ) ;
}
}
} else
if ( /window:features/ . test ( cmd ) ) {
var obj = JSON . parse ( param ) ;
2020-03-15 15:13:29 +00:00
if ( _ . isNumber ( obj . skiptoparea ) ) {
2020-04-03 13:26:40 +00:00
if ( $ ( '.asc-window.modal' ) . length && $ ( '.asc-window.modal' ) . position ( ) . top < obj . skiptoparea )
2020-04-02 14:17:35 +00:00
$ ( '.asc-window.modal' ) . css ( 'top' , obj . skiptoparea ) ;
2020-03-15 15:13:29 +00:00
Common . Utils . InternalSettings . set ( 'window-inactive-area-top' , obj . skiptoparea ) ;
2021-05-14 21:06:59 +00:00
} else
if ( obj . lockthemes != undefined ) {
2021-12-06 16:09:36 +00:00
// TODO: remove after 7.0.2. depricated. used is_win_xp variable instead
// Common.UI.Themes.setAvailable(!obj.lockthemes);
2021-12-18 21:41:06 +00:00
}
2021-12-03 21:45:03 +00:00
if ( obj . singlewindow !== undefined ) {
$ ( '#box-document-title .hedset' ) [ obj . singlewindow ? 'hide' : 'show' ] ( ) ;
native . features . singlewindow = obj . singlewindow ;
2020-03-15 15:13:29 +00:00
}
2019-05-13 11:45:17 +00:00
} else
if ( /editor:config/ . test ( cmd ) ) {
2019-10-07 12:47:56 +00:00
if ( param == 'request' ) {
2019-11-06 13:55:02 +00:00
if ( ! ! titlebuttons ) {
var opts = {
user : config . user ,
title : { buttons : [ ] }
} ;
var header = webapp . getController ( 'Viewport' ) . getView ( 'Common.Views.Header' ) ;
if ( header ) {
for ( var i in titlebuttons ) {
opts . title . buttons . push ( _serializeHeaderButton ( i , titlebuttons [ i ] ) ) ;
}
}
2019-10-07 12:47:56 +00:00
2020-03-05 10:09:53 +00:00
native . execCommand ( 'editor:config' , JSON . stringify ( opts ) ) ;
2019-11-06 13:55:02 +00:00
} else
if ( ! config . callback _editorconfig ) {
config . callback _editorconfig = function ( ) {
setTimeout ( function ( ) { window . on _native _message ( cmd , param ) ; } , 0 ) ;
2019-10-07 12:47:56 +00:00
}
}
}
} else
if ( /button:click/ . test ( cmd ) ) {
var obj = JSON . parse ( param ) ;
2020-10-28 19:59:24 +00:00
if ( ! ! obj . action && ! ! titlebuttons [ obj . action ] ) {
2019-11-05 12:17:48 +00:00
titlebuttons [ obj . action ] . btn . click ( ) ;
2019-10-07 12:47:56 +00:00
}
2020-02-07 13:15:41 +00:00
} else
2021-02-24 20:34:05 +00:00
if ( /theme:changed/ . test ( cmd ) ) {
Common . UI . Themes . setTheme ( param ) ;
} else
2020-02-07 13:15:41 +00:00
if ( /element:show/ . test ( cmd ) ) {
var _mr = /title:(?:(true|show)|(false|hide))/ . exec ( param ) ;
if ( _mr ) {
if ( ! ! _mr [ 1 ] ) $ ( '#app-title' ) . show ( ) ;
else if ( ! ! _mr [ 2 ] ) $ ( '#app-title' ) . hide ( ) ;
}
2022-05-23 21:13:42 +00:00
} else
if ( /althints:show/ . test ( cmd ) ) {
2022-06-03 17:23:13 +00:00
if ( /false|hide/ . test ( param ) )
2022-05-23 21:13:42 +00:00
Common . NotificationCenter . trigger ( 'hints:clear' ) ;
2019-05-13 11:45:17 +00:00
}
} ;
2020-04-08 11:11:30 +00:00
window . on _native _message ( 'editor:config' , 'request' ) ;
2019-11-06 13:55:02 +00:00
if ( ! ! window . native _message _cmd ) {
for ( var c in window . native _message _cmd ) {
window . on _native _message ( c , window . native _message _cmd [ c ] ) ;
}
}
2021-02-25 20:56:18 +00:00
native . execCommand ( 'webapps:features' , JSON . stringify ( features ) ) ;
2020-03-17 15:06:09 +00:00
// hide mask for modal window
var style = document . createElement ( 'style' ) ;
2020-04-08 16:56:03 +00:00
style . appendChild ( document . createTextNode ( '.modals-mask{opacity:0 !important;}' ) ) ;
2020-03-17 15:06:09 +00:00
document . getElementsByTagName ( 'head' ) [ 0 ] . appendChild ( style ) ;
2019-05-13 11:45:17 +00:00
}
2019-10-07 12:47:56 +00:00
var _serializeHeaderButton = function ( action , config ) {
return {
action : action ,
2019-11-05 12:28:33 +00:00
icon : config . icon || undefined ,
2019-10-07 12:47:56 +00:00
hint : config . btn . options . hint ,
2022-11-21 21:28:55 +00:00
disabled : config . btn . isDisabled ( ) ,
visible : config . visible ,
2019-10-07 12:47:56 +00:00
} ;
} ;
2019-11-05 12:17:48 +00:00
var _onTitleButtonDisabled = function ( action , e , status ) {
2019-10-30 13:30:43 +00:00
var _buttons = { } ;
_buttons [ action ] = status ;
2020-03-05 10:09:53 +00:00
native . execCommand ( 'title:button' , JSON . stringify ( { disabled : _buttons } ) ) ;
2019-10-30 13:30:43 +00:00
} ;
2019-11-05 12:28:33 +00:00
var _onSaveIconChanged = function ( e , opts ) {
2020-03-05 10:09:53 +00:00
native . execCommand ( 'title:button' , JSON . stringify ( { 'icon:changed' : { 'save' : btnsave _icons [ opts . next ] } } ) ) ;
2019-11-05 12:28:33 +00:00
} ;
2019-10-30 13:30:43 +00:00
var _onModalDialog = function ( status ) {
if ( status == 'open' ) {
2020-03-05 10:09:53 +00:00
native . execCommand ( 'title:button' , JSON . stringify ( { disabled : { 'all' : true } } ) ) ;
2019-10-30 13:30:43 +00:00
} else {
var _buttons = { } ;
for ( var i in titlebuttons ) {
2020-03-13 14:46:10 +00:00
_buttons [ i ] = titlebuttons [ i ] . btn . isDisabled ( ) ;
2019-10-30 13:30:43 +00:00
}
2020-03-05 10:09:53 +00:00
native . execCommand ( 'title:button' , JSON . stringify ( { 'disabled' : _buttons } ) ) ;
2019-10-30 13:30:43 +00:00
}
2019-10-07 12:47:56 +00:00
} ;
2022-05-23 21:13:42 +00:00
var _onHintsShow = function ( visible , level ) {
2022-06-22 09:20:17 +00:00
let info = {
visible : visible && ! ( level > 0 ) ,
} ;
if ( ! ! titlebuttons ) {
2022-09-05 10:34:40 +00:00
info . hints = { } ;
! ! titlebuttons [ 'print' ] && ( info . hints [ 'print' ] = titlebuttons [ 'print' ] . btn . btnEl . attr ( 'data-hint-title' ) ) ;
2022-11-22 16:28:54 +00:00
! ! titlebuttons [ 'quickprint' ] && ( info . hints [ 'quickprint' ] = titlebuttons [ 'quickprint' ] . btn . btnEl . attr ( 'data-hint-title' ) ) ;
2022-09-05 10:34:40 +00:00
! ! titlebuttons [ 'undo' ] && ( info . hints [ 'undo' ] = titlebuttons [ 'undo' ] . btn . btnEl . attr ( 'data-hint-title' ) ) ;
! ! titlebuttons [ 'redo' ] && ( info . hints [ 'redo' ] = titlebuttons [ 'redo' ] . btn . btnEl . attr ( 'data-hint-title' ) ) ;
! ! titlebuttons [ 'save' ] && ( info . hints [ 'save' ] = titlebuttons [ 'save' ] . btn . btnEl . attr ( 'data-hint-title' ) ) ;
2022-06-22 09:20:17 +00:00
}
native . execCommand ( 'althints:show' , JSON . stringify ( info ) ) ;
2022-05-23 21:13:42 +00:00
}
2022-05-24 17:52:27 +00:00
var _onKeyDown = function ( e ) {
if ( Common . UI . HintManager . isHintVisible ( ) ) {
native . execCommand ( 'althints:keydown' , JSON . stringify ( { code : e . keyCode } ) ) ;
console . log ( 'hint keydown' , e . keyCode ) ;
}
}
2022-11-21 21:28:55 +00:00
const _onApplySettings = function ( menu ) {
2022-11-22 16:28:54 +00:00
if ( ! ! titlebuttons . quickprint ) {
2022-11-30 18:18:32 +00:00
const var _name = window . SSE ? 'sse-settings-quick-print-button' :
2022-11-22 16:28:54 +00:00
window . PE ? 'pe-settings-quick-print-button' : 'de-settings-quick-print-button' ;
2022-11-30 18:18:32 +00:00
const is _btn _visible = Common . localStorage . getBool ( var _name , false ) ;
2022-11-22 16:28:54 +00:00
if ( titlebuttons . quickprint . visible != is _btn _visible ) {
titlebuttons . quickprint . visible = is _btn _visible ;
2022-11-21 21:28:55 +00:00
const obj = {
visible : {
2022-11-22 16:28:54 +00:00
quickprint : is _btn _visible ,
2022-11-21 21:28:55 +00:00
}
} ;
native . execCommand ( 'title:button' , JSON . stringify ( obj ) ) ;
}
}
}
2018-02-21 23:23:32 +00:00
return {
init : function ( opts ) {
_ . extend ( config , opts ) ;
if ( config . isDesktopApp ) {
2022-06-09 07:36:56 +00:00
let is _win _xp = nativevars && nativevars . os === 'winxp' ;
2021-12-06 16:09:36 +00:00
Common . UI . Themes . setAvailable ( ! is _win _xp ) ;
2018-04-27 13:32:39 +00:00
Common . NotificationCenter . on ( 'app:ready' , function ( opts ) {
_ . extend ( config , opts ) ;
2020-03-05 10:09:53 +00:00
! ! native && native . execCommand ( 'doc:onready' , '' ) ;
2019-02-07 12:04:13 +00:00
$ ( '.toolbar' ) . addClass ( 'editor-native-color' ) ;
2018-02-21 23:23:32 +00:00
} ) ;
2019-02-07 12:04:13 +00:00
2020-04-24 09:00:28 +00:00
Common . NotificationCenter . on ( 'document:ready' , function ( ) {
2020-04-29 17:54:48 +00:00
if ( config . isEdit ) {
2022-11-21 10:04:25 +00:00
function get _locked _message ( t ) {
switch ( t ) {
// case Asc.c_oAscLocalRestrictionType.Nosafe:
case Asc . c _oAscLocalRestrictionType . ReadOnly :
return Common . Locale . get ( "tipFileReadOnly" , { name : "Common.Translation" , default : "Document is read only. You can make changes and save its local copy later." } ) ;
default : return Common . Locale . get ( "tipFileLocked" , { name : "Common.Translation" , default : "Document is locked for editing. You can make changes and save its local copy later." } ) ;
}
}
2022-11-16 16:04:46 +00:00
2022-11-21 10:04:25 +00:00
const header = webapp . getController ( 'Viewport' ) . getView ( 'Common.Views.Header' ) ;
2022-11-16 16:04:46 +00:00
const api = webapp . getController ( 'Main' ) . api ;
2022-11-21 10:04:25 +00:00
const locktype = api . asc _getLocalRestrictions ? api . asc _getLocalRestrictions ( ) : Asc . c _oAscLocalRestrictionType . None ;
if ( Asc . c _oAscLocalRestrictionType . None !== locktype ) {
2022-11-16 16:04:46 +00:00
features . readonly = true ;
header . setDocumentReadOnly ( true ) ;
api . asc _setLocalRestrictions ( Asc . c _oAscLocalRestrictionType . None ) ;
( new Common . UI . SynchronizeTip ( {
extCls : 'no-arrow' ,
placement : 'bottom' ,
target : $ ( '.toolbar' ) ,
2022-11-21 10:04:25 +00:00
text : get _locked _message ( locktype ) ,
2022-11-16 16:04:46 +00:00
showLink : false ,
} ) ) . on ( 'closeclick' , function ( ) {
this . close ( ) ;
} ) . show ( ) ;
}
}
2022-11-21 10:04:25 +00:00
} ) ;
2022-11-16 16:04:46 +00:00
2022-11-21 10:04:25 +00:00
Common . NotificationCenter . on ( 'app:face' , function ( mode ) {
features . viewmode = ! mode . isEdit ;
features . crypted = mode . isCrypted ;
2021-02-25 20:56:18 +00:00
native . execCommand ( 'webapps:features' , JSON . stringify ( features ) ) ;
2020-06-08 21:22:12 +00:00
2020-02-25 15:23:38 +00:00
titlebuttons = { } ;
2020-06-08 21:22:12 +00:00
if ( mode . isEdit ) {
2022-11-21 10:04:25 +00:00
const header = webapp . getController ( 'Viewport' ) . getView ( 'Common.Views.Header' ) ;
2020-04-21 08:20:15 +00:00
if ( ! ! header . btnSave ) {
titlebuttons [ 'save' ] = { btn : header . btnSave } ;
2020-02-25 15:23:38 +00:00
2020-04-21 08:20:15 +00:00
var iconname = /\s?([^\s]+)$/ . exec ( titlebuttons . save . btn . $icon . attr ( 'class' ) ) ;
! ! iconname && iconname . length && ( titlebuttons . save . icon = btnsave _icons [ iconname ] ) ;
}
2020-02-25 15:23:38 +00:00
2020-04-21 08:20:15 +00:00
if ( ! ! header . btnPrint )
titlebuttons [ 'print' ] = { btn : header . btnPrint } ;
2020-02-25 15:23:38 +00:00
2022-11-21 21:28:55 +00:00
if ( ! ! header . btnPrintQuick ) {
2022-11-22 16:28:54 +00:00
titlebuttons [ 'quickprint' ] = {
2022-11-21 21:28:55 +00:00
btn : header . btnPrintQuick ,
visible : header . btnPrintQuick . isVisible ( ) ,
} ;
}
2022-11-15 18:45:25 +00:00
2020-04-21 08:20:15 +00:00
if ( ! ! header . btnUndo )
titlebuttons [ 'undo' ] = { btn : header . btnUndo } ;
2020-02-25 15:23:38 +00:00
2020-04-21 08:20:15 +00:00
if ( ! ! header . btnRedo )
titlebuttons [ 'redo' ] = { btn : header . btnRedo } ;
2019-10-07 12:47:56 +00:00
2020-04-21 08:20:15 +00:00
for ( var i in titlebuttons ) {
titlebuttons [ i ] . btn . options . signals = [ 'disabled' ] ;
titlebuttons [ i ] . btn . on ( 'disabled' , _onTitleButtonDisabled . bind ( this , i ) ) ;
}
2019-11-05 12:28:33 +00:00
2020-04-21 08:20:15 +00:00
if ( ! ! titlebuttons . save ) {
titlebuttons . save . btn . options . signals . push ( 'icon:changed' ) ;
titlebuttons . save . btn . on ( 'icon:changed' , _onSaveIconChanged . bind ( this ) ) ;
}
2020-02-26 13:14:04 +00:00
}
2019-11-06 13:55:02 +00:00
if ( ! ! config . callback _editorconfig ) {
config . callback _editorconfig ( ) ;
delete config . callback _editorconfig ;
}
2021-12-03 21:45:03 +00:00
if ( native . features . singlewindow !== undefined ) {
$ ( '#box-document-title .hedset' ) [ native . features . singlewindow ? 'hide' : 'show' ] ( ) ;
}
2019-05-13 11:45:17 +00:00
} ) ;
2019-10-30 13:30:43 +00:00
Common . NotificationCenter . on ( {
'modal:show' : _onModalDialog . bind ( this , 'open' ) ,
2022-05-23 21:13:42 +00:00
'modal:close' : _onModalDialog . bind ( this , 'close' ) ,
'uitheme:changed' : function ( name ) {
2022-08-09 15:26:01 +00:00
if ( Common . localStorage . getBool ( 'ui-theme-use-system' , false ) ) {
2022-08-09 21:55:36 +00:00
native . execCommand ( "uitheme:changed" , JSON . stringify ( { name : 'theme-system' } ) ) ;
2022-08-09 15:26:01 +00:00
} else {
var theme = Common . UI . Themes . get ( name ) ;
if ( theme )
native . execCommand ( "uitheme:changed" , JSON . stringify ( { name : name , type : theme . type } ) ) ;
}
2022-05-23 21:13:42 +00:00
} ,
'hints:show' : _onHintsShow . bind ( this ) ,
2019-10-30 13:30:43 +00:00
} ) ;
2021-11-16 19:26:34 +00:00
webapp . addListeners ( {
'FileMenu' : {
'item:click' : function ( menu , action , isopts ) {
2021-11-29 21:34:20 +00:00
if ( action == 'file:exit' ) {
2021-12-06 11:06:16 +00:00
native . execCommand ( 'editor:event' , JSON . stringify ( { action : 'file:close' } ) ) ;
2021-11-29 21:34:20 +00:00
menu . hide ( ) ;
} else
if ( action == 'file:open' ) {
native . execCommand ( 'editor:event' , JSON . stringify ( { action : 'file:open' } ) ) ;
2021-11-16 19:26:34 +00:00
menu . hide ( ) ;
}
} ,
2022-11-21 21:28:55 +00:00
'settings:apply' : _onApplySettings . bind ( this ) ,
2021-11-16 19:26:34 +00:00
} ,
} , { id : 'desktop' } ) ;
2022-05-24 17:52:27 +00:00
$ ( document ) . on ( 'keydown' , _onKeyDown . bind ( this ) ) ;
2018-02-21 23:23:32 +00:00
}
} ,
process : function ( opts ) {
2020-03-05 10:09:53 +00:00
if ( config . isDesktopApp && ! ! native ) {
2018-04-27 13:32:39 +00:00
if ( opts == 'goback' ) {
2020-03-05 10:09:53 +00:00
native . execCommand ( 'go:folder' ,
2018-02-21 23:23:32 +00:00
config . isOffline ? 'offline' : config . customization . goback . url ) ;
return true ;
2018-04-27 13:32:39 +00:00
} else
if ( opts == 'preloader:hide' ) {
2020-03-05 10:09:53 +00:00
native . execCommand ( 'editor:onready' , '' ) ;
2018-04-27 13:32:39 +00:00
return true ;
2019-07-16 13:30:37 +00:00
} else
if ( opts == 'create:new' ) {
if ( config . createUrl == 'desktop://create.new' ) {
2020-05-22 15:02:54 +00:00
native . execCommand ( "create:new" , ! ! window . SSE ? 'cell' : ! ! window . PE ? 'slide' : 'word' ) ;
2019-07-16 13:30:37 +00:00
return true ;
}
2018-02-21 23:23:32 +00:00
}
}
2018-04-27 13:32:39 +00:00
return false ;
2018-10-31 09:16:44 +00:00
} ,
requestClose : function ( ) {
2020-03-05 10:09:53 +00:00
if ( config . isDesktopApp && ! ! native ) {
2021-12-06 11:06:16 +00:00
native . execCommand ( 'editor:event' , JSON . stringify ( { action : 'file:close' , url : config . customization . goback . url } ) ) ;
2018-10-31 09:16:44 +00:00
}
2021-11-16 19:26:34 +00:00
} ,
isActive : function ( ) {
return ! ! native ;
} ,
isOffline : function ( ) {
// return webapp.getController('Main').api.asc_isOffline();
return webapp . getController ( 'Main' ) . appOptions . isOffline ;
} ,
2022-05-17 14:07:01 +00:00
isFeatureAvailable : function ( feature ) {
return ! ! native && ! ! native [ feature ] ;
} ,
call : function ( name ) {
if ( native [ name ] ) {
let args = [ ] . slice . call ( arguments , 1 ) ;
2022-05-25 09:32:18 +00:00
// return native[name](...args);
return native [ name ] . apply ( this , args ) ;
2022-05-17 14:07:01 +00:00
}
} ,
2022-06-02 10:57:20 +00:00
helpUrl : function ( ) {
2022-06-09 07:39:27 +00:00
if ( ! ! nativevars && nativevars . helpUrl ) {
var webapp = window . SSE ? 'spreadsheeteditor' :
window . PE ? 'presentationeditor' : 'documenteditor' ;
2022-07-06 21:12:45 +00:00
return nativevars . helpUrl + '/' + webapp + '/main/resources/help' ;
2022-06-09 07:39:27 +00:00
}
return undefined ;
2022-11-15 21:08:16 +00:00
} ,
getDefaultPrinterName : function ( ) {
return nativevars ? nativevars . defaultPrinterName : '' ;
} ,
2018-02-21 23:23:32 +00:00
} ;
} ;
Common . Controllers . Desktop = new Desktop ( ) ;
2020-02-07 13:15:41 +00:00
} ) ;