@@ -8,12 +8,11 @@ import Router from "sap/ui/core/routing/Router";
88import History from "sap/ui/core/routing/History" ;
99import UI5Element from "sap/ui/core/Element" ;
1010import Dialog from "sap/m/Dialog" ;
11+ import Fragment from "sap/ui/core/Fragment" ;
1112import Event from "sap/ui/base/Event" ;
1213import JSONModel from "sap/ui/model/json/JSONModel" ;
1314import SettingsStorageService , { AppSettings } from "../service/SettingsStorage.service" ;
1415import { TestFrameworks } from "../model/enum/TestFrameworks" ;
15- import { Themes } from "../model/enum/Themes" ;
16- import Theming from "sap/ui/core/Theming" ;
1716import { ConnectionStatus } from "../model/enum/ConnectionStatus" ;
1817import { IconColor , ValueState } from "sap/ui/core/library" ;
1918import { ButtonType , DialogType } from "sap/m/library" ;
@@ -22,6 +21,7 @@ import Text from "sap/m/Text";
2221import BusyIndicator from "sap/ui/core/BusyIndicator" ;
2322import { ChromeExtensionService } from "../service/ChromeExtension.service" ;
2423import MessageToast from "sap/m/MessageToast" ;
24+ import XMLView from "sap/ui/core/mvc/XMLView" ;
2525
2626/**
2727 * @namespace com.ui5.journeyrecorder.controller
@@ -30,6 +30,14 @@ export default abstract class BaseController extends Controller {
3030 protected settingsDialog : UI5Element ;
3131 protected _unsafeDialog : Dialog ;
3232
33+ private _dialogs : Record < string , {
34+ dialog : Dialog ,
35+ view : XMLView ,
36+ controller : Controller & { settings ?: { initialHeight ?: string , initialWidth ?: string } }
37+ } > ;
38+
39+ private _fragments : Record < string , Dialog > ;
40+
3341 /**
3442 * Convenience method for accessing the component of the controller's view.
3543 * @returns The component of the controller's view
@@ -101,79 +109,7 @@ export default abstract class BaseController extends Controller {
101109 }
102110
103111 async onOpenSettingsDialog ( ) {
104- if ( ! this . settingsDialog ) {
105- this . settingsDialog = await this . loadFragment ( {
106- name : "com.ui5.journeyrecorder.fragment.SettingsDialog"
107- } ) as UI5Element ;
108- this . getView ( ) . addDependent ( this . settingsDialog ) ;
109- }
110- ( this . settingsDialog as Dialog ) . open ( ) ;
111- }
112-
113- onCloseDialog ( oEvent : Event ) {
114- const closeReason = ( oEvent . getSource ( ) as unknown as { data : ( s : string ) => string } ) . data ( "settingsDialogClose" ) ;
115- if ( closeReason === 'save' ) {
116- ( this . getModel ( "settings" ) as JSONModel ) . getData ( ) ;
117- void SettingsStorageService . save ( ( this . getModel ( "settings" ) as JSONModel ) . getData ( ) as AppSettings ) ;
118- } else {
119- void SettingsStorageService . getSettings ( ) . then ( ( settings : AppSettings ) => {
120- ( this . getModel ( "settings" ) as JSONModel ) . setData ( settings ) ;
121- } )
122- }
123- ( this . settingsDialog as Dialog ) . close ( ) ;
124- }
125-
126- onDelaySelect ( oEvent : Event ) {
127- const index = oEvent . getParameter ( "selectedIndex" as never ) ;
128- switch ( index ) {
129- case 0 :
130- ( this . getModel ( "settings" ) as JSONModel ) . setProperty ( '/replayDelay' , 0.5 ) ;
131- break ;
132- case 1 :
133- ( this . getModel ( "settings" ) as JSONModel ) . setProperty ( '/replayDelay' , 1.0 ) ;
134- break ;
135- case 2 :
136- ( this . getModel ( "settings" ) as JSONModel ) . setProperty ( '/replayDelay' , 2.0 ) ;
137- break ;
138- default :
139- ( this . getModel ( "settings" ) as JSONModel ) . setProperty ( '/replayDelay' , 0.5 ) ;
140- }
141- }
142-
143- onFrameworkSelect ( oEvent : Event ) {
144- const index = oEvent . getParameter ( "selectedIndex" as never ) ;
145- switch ( index ) {
146- case 0 :
147- ( this . getModel ( "settings" ) as JSONModel ) . setProperty ( '/testFramework' , TestFrameworks . OPA5 ) ;
148- break ;
149- case 1 :
150- ( this . getModel ( "settings" ) as JSONModel ) . setProperty ( '/testFramework' , TestFrameworks . WDI5 ) ;
151- break ;
152- default :
153- ( this . getModel ( "settings" ) as JSONModel ) . setProperty ( '/testFramework' , TestFrameworks . OPA5 ) ;
154- }
155- }
156-
157- onThemeSelect ( oEvent : Event ) {
158- const index = oEvent . getParameter ( "selectedIndex" as never ) ;
159- switch ( index ) {
160- case 1 :
161- ( this . getModel ( "settings" ) as JSONModel ) . setProperty ( '/theme' , Themes . EVENING_HORIZON ) ;
162- break ;
163- case 2 :
164- ( this . getModel ( "settings" ) as JSONModel ) . setProperty ( '/theme' , Themes . QUARTZ_LIGHT ) ;
165- break ;
166- case 3 :
167- ( this . getModel ( "settings" ) as JSONModel ) . setProperty ( '/theme' , Themes . QUARTZ_DARK ) ;
168- break ;
169- default :
170- ( this . getModel ( "settings" ) as JSONModel ) . setProperty ( '/theme' , Themes . MORNING_HORIZON ) ;
171- }
172- Theming . setTheme ( ( this . getModel ( "settings" ) as JSONModel ) . getProperty ( '/theme' ) as string ) ;
173- }
174-
175- compareProps ( args : unknown [ ] ) {
176- return args [ 0 ] === args [ 1 ] ;
112+ await this . openDialog ( "Settings" ) ;
177113 }
178114
179115 setConnecting ( ) {
@@ -266,4 +202,85 @@ export default abstract class BaseController extends Controller {
266202 MessageToast . show ( 'Disconnected' , { duration : 500 } ) ;
267203 }
268204 }
205+
206+ protected openDialog ( sDialogName : string , oData ?: Record < string , unknown > ) : Promise < Record < string , unknown > | void > {
207+ if ( ! this . _dialogs ) {
208+ this . _dialogs = { } ;
209+ }
210+
211+ return new Promise ( async ( resolve , reject ) => {
212+ if ( ! this . _dialogs [ sDialogName ] ) {
213+ const oDialog = new Dialog ( {
214+ showHeader : false
215+ } ) ;
216+ this . getView ( ) . addDependent ( oDialog ) ;
217+ const oView = await this . getOwnerComponent ( ) . runAsOwner ( async ( ) => {
218+ return await XMLView . create ( {
219+ viewName : `com.ui5.journeyrecorder.view.dialogs.${ sDialogName } `
220+ } ) ;
221+ } ) ;
222+ const oController = oView . getController ( ) ;
223+ oDialog . addContent ( oView ) ;
224+
225+ this . _dialogs [ sDialogName ] = {
226+ dialog : oDialog ,
227+ view : oView ,
228+ controller : oController
229+ }
230+ }
231+ const oDialogCompound = this . _dialogs [ sDialogName ] ;
232+ if ( oData ) {
233+ oDialogCompound . view . setModel ( new JSONModel ( oData ) , "importData" ) ;
234+ }
235+
236+ if ( oDialogCompound . controller . settings . initialHeight ) {
237+ oDialogCompound . dialog . setContentHeight ( oDialogCompound . controller . settings . initialHeight ) ;
238+ }
239+
240+ if ( oDialogCompound . controller . settings . initialWidth ) {
241+ oDialogCompound . dialog . setContentWidth ( oDialogCompound . controller . settings . initialWidth ) ;
242+ }
243+
244+ const beforeClose = ( oEvent : Event ) => {
245+ oDialogCompound . dialog . detachBeforeClose ( beforeClose ) ;
246+ const pars = oEvent . getParameters ( ) as Record < string , unknown > ;
247+ oDialogCompound . dialog . close ( ) ;
248+
249+ if ( pars . status === "Success" ) {
250+ if ( pars . data ) {
251+ resolve ( pars . data as Record < string , unknown > ) ;
252+ } else {
253+ resolve ( ) ;
254+ }
255+ } else {
256+ reject ( ) ;
257+ }
258+ } ;
259+
260+ oDialogCompound . dialog . attachBeforeClose ( beforeClose ) ;
261+
262+ oDialogCompound . dialog . open ( ) ;
263+ } )
264+ }
265+
266+ protected async openFragment ( sFragmentName : string , sFragmentId ?: string ) : Promise < void > {
267+ if ( ! sFragmentName ) {
268+ throw new Error ( "At least the Fragment-Name is needed!" ) ;
269+ }
270+
271+ if ( ! this . _fragments ) {
272+ this . _fragments = { } ;
273+ }
274+
275+ if ( ! this . _fragments [ sFragmentName ] ) {
276+ const oFragmentDialog = await Fragment . load ( {
277+ id : sFragmentId || `${ sFragmentName } _id` ,
278+ name : `com.ui5.journeyrecorder.view.dialogs.${ sFragmentName } ` ,
279+ controller : this
280+ } )
281+ this . getView ( ) . addDependent ( oFragmentDialog as UI5Element ) ;
282+ }
283+
284+ this . _fragments [ sFragmentName ] . open ( ) ;
285+ }
269286}
0 commit comments