File : dialogs/apiKeysDialog/ApiKeysDialogToolbar.js

1
/*
2
Copyright - 2017 2023 - wwwouaiebe - Contact: https://www.ouaie.be/
3
4
This  program is free software;
5
you can redistribute it and/or modify it under the terms of the
6
GNU General Public License as published by the Free Software Foundation;
7
either version 3 of the License, or any later version.
8
9
This program is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
GNU General Public License for more details.
13
14
You should have received a copy of the GNU General Public License
15
along with this program; if not, write to the Free Software
16
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
*/
18
/*
19
Changes:
20
    - v4.0.0:
21
        - created from v3.6.0
22
Doc reviewed 202208
23
 */
24
25
import theTranslator from '../../core/uiLib/Translator.js';
26
import theConfig from '../../data/Config.js';
27
import theHTMLElementsFactory from '../../core/uiLib/HTMLElementsFactory.js';
28
import RestoreFromUnsecureFileButtonClickEL from './RestoreFromUnsecureFileButtonClickEL.js';
29
import ReloadFromServerButtonClickEL from './ReloadFromServerButtonClickEL.js';
30
import RestoreFromSecureFileButtonClickEL from './RestoreFromSecureFileButtonClickEL.js';
31
import SaveToSecureFileButtonClickEL from './SaveToSecureFileButtonClickEL.js';
32
import SaveToUnsecureFileButtonClickEL from './SaveToUnsecureFileButtonClickEL.js';
33
import NewApiKeyButtonClickEL from './NewApiKeyButtonClickEL.js';
34
35
/* ------------------------------------------------------------------------------------------------------------------------- */
36
/**
37
This is the toolbar for the ApiKeysDialog. Display 6 buttons on top of dialog.
38
*/
39
/* ------------------------------------------------------------------------------------------------------------------------- */
40
41
class ApiKeysDialogToolbar {
42
43
    /**
44
    A reference to the ApiKeysDialog Object
45
    @type {ApiKeysDialog}
46
    */
47
48
    #apiKeysDialog;
49
50
    /**
51
    A reference to the api keys control
52
    @type {ApiKeysControl}
53
    */
54
55
    #apiKeysControl;
56
57
    /**
58
    The root HTML element of the control
59
    @type {HTMLElement}
60
    */
61
62
    #toolbarHTMLElement;
63
64
    /**
65
    The reload key from server button
66
    @type {HTMLElement}
67
    */
68
69
    #reloadKeysFromServerButton;
70
71
    /**
72
    The save keys to secure file button
73
    @type {HTMLElement}
74
    */
75
76
    #saveKeysToSecureFileButton;
77
78
    /**
79
    The restore keys from secure file button
80
    @type {HTMLElement}
81
    */
82
83
    #restoreKeysFromSecureFileButton;
84
85
    /**
86
    The new ApiKey button
87
    @type {HTMLElement}
88
    */
89
90
    #newApiKeyButton;
91
92
    /**
93
    The save keys to unsecure file button
94
    @type {HTMLElement}
95
    */
96
97
    #saveKeysToUnsecureFileButton;
98
99
    /**
100
    The restore keys from unsecure file button
101
    @type {HTMLElement}
102
    */
103
104
    #restoreKeysFromUnsecureFileButton;
105
106
    /**
107
    Store the status of the ApiKeys file
108
    @type {Boolean}
109
    */
110
111
    #haveApiKeysFile;
112
113
    /**
114
    Event listener for the reload from server button
115
    @type {ReloadFromServerButtonClickEL}
116
    */
117
118
    #reloadFromServerButtonClickEL;
119
120
    /**
121
    Event listener for the save to secure file button
122
    @type {SaveToSecureFileButtonClickEL}
123
    */
124
125
    #saveToSecureFileButtonClickEL;
126
127
    /**
128
    Event listener for the restore from secure file button
129
    @type {RestoreFromSecureFileButtonClickEL}
130
    */
131
132
    #restoreFromSecureFileButtonClickEL;
133
134
    /**
135
    Event listener for the new api key button
136
    @type {NewApiKeyButtonClickEL}
137
    */
138
139
    #newApiKeyButtonClickEL;
140
141
    /**
142
    Event listener for the save to unsecure file button
143
    @type {SaveToUnsecureFileButtonClickEL}
144
    */
145
146
    #saveToUnsecureFileButtonClickEL;
147
148
    /**
149
    Event listener for the restore from unsecure file button
150
    @type {RestoreFromUnsecureFileButtonClickEL}
151
    */
152
153
    #restoreFromUnsecureFileButtonClickEL;
154
155
    /**
156
    Create the ReloadKeysFromServerFile Button
157
    */
158
159
    #createReloadKeysFromServerButton ( ) {
160
        this.#reloadKeysFromServerButton = theHTMLElementsFactory.create (
161
            'div',
162
            {
163
                className : 'TravelNotes-BaseDialog-Button',
164
                title : theTranslator.getText ( 'ApiKeysDialogToolbar - Reload from server' ),
165
                textContent : '🔄'
166
            },
167
            this.#toolbarHTMLElement
168
        );
169
        this.#reloadFromServerButtonClickEL =
170
            new ReloadFromServerButtonClickEL ( this.#apiKeysDialog );
171
        this.#reloadKeysFromServerButton.addEventListener (
172
            'click',
173
            this.#reloadFromServerButtonClickEL,
174
            false
175
        );
176
    }
177
178
    /**
179
    Create the SaveKeysToSecureFile Button
180
    */
181
182
    #createSaveKeysToSecureFileButton ( ) {
183
        this.#saveKeysToSecureFileButton = theHTMLElementsFactory.create (
184
            'div',
185
            {
186
                className : 'TravelNotes-BaseDialog-Button',
187
                title : theTranslator.getText ( 'ApiKeysDialogToolbar - Save to file' ),
188
                textContent : '💾'
189
            },
190
            this.#toolbarHTMLElement
191
        );
192
        this.#saveToSecureFileButtonClickEL =
193
            new SaveToSecureFileButtonClickEL ( this.#apiKeysDialog );
194
        this.#saveKeysToSecureFileButton.addEventListener (
195
            'click',
196
            this.#saveToSecureFileButtonClickEL,
197
            false
198
        );
199
    }
200
201
    /**
202
    Create the RestoreKeysFromSecureFile Button
203
    */
204
205
    #createRestoreKeysFromSecureFileButton ( ) {
206
        this.#restoreKeysFromSecureFileButton = theHTMLElementsFactory.create (
207
            'div',
208
            {
209
                className : 'TravelNotes-BaseDialog-Button',
210
                title : theTranslator.getText ( 'ApiKeysDialogToolbar - Open file' ),
211
                textContent : '📂'
212
            },
213
            this.#toolbarHTMLElement
214
        );
215
        this.#restoreFromSecureFileButtonClickEL =
216
            new RestoreFromSecureFileButtonClickEL ( this.#apiKeysDialog );
217
        this.#restoreKeysFromSecureFileButton.addEventListener (
218
            'click',
219
            this.#restoreFromSecureFileButtonClickEL,
220
            false
221
        );
222
    }
223
224
    /**
225
    Create the AddNewApiKey Button
226
    */
227
228
    #createNewApiKeyButton ( ) {
229
        this.#newApiKeyButton = theHTMLElementsFactory.create (
230
            'div',
231
            {
232
                className : 'TravelNotes-BaseDialog-Button',
233
                title : theTranslator.getText ( 'ApiKeysDialogToolbar - new api key' ),
234
                textContent : '+'
235
            },
236
            this.#toolbarHTMLElement
237
        );
238
        this.#newApiKeyButtonClickEL =
239
            new NewApiKeyButtonClickEL ( this.#apiKeysControl );
240
        this.#newApiKeyButton.addEventListener (
241
            'click',
242
            this.#newApiKeyButtonClickEL,
243
            false
244
        );
245
    }
246
247
    /**
248
    Create the SaveKeysToUnsecureFile Button
249
    */
250
251
    #createSaveKeysToUnsecureFileButton ( ) {
252
        this.#saveKeysToUnsecureFileButton = theHTMLElementsFactory.create (
253
            'div',
254
            {
255
                className : 'TravelNotes-BaseDialog-Button TravelNotes-ApiKeysDialog-AtRightButton',
256
                title : theTranslator.getText ( 'ApiKeysDialogToolbar - Save to json file' ),
257
                textContent : '💾'
258
            },
259
            this.#toolbarHTMLElement
260
        );
261
        this.#saveToUnsecureFileButtonClickEL =
262
            new SaveToUnsecureFileButtonClickEL ( this.#apiKeysDialog );
263
        this.#saveKeysToUnsecureFileButton.addEventListener (
264
            'click',
265
            this.#saveToUnsecureFileButtonClickEL,
266
            false
267
        );
268
    }
269
270
    /**
271
    Create the RestoreKeysFromUnsecureFile Button
272
    */
273
274
    #createRestoreKeysFromUnsecureFileButton ( ) {
275
        this.#restoreKeysFromUnsecureFileButton = theHTMLElementsFactory.create (
276
            'div',
277
            {
278
                className : 'TravelNotes-BaseDialog-Button',
279
                title : theTranslator.getText ( 'ApiKeysDialogToolbar - Open json file' ),
280
                textContent : '📂'
281
            },
282
            this.#toolbarHTMLElement
283
        );
284
        this.#restoreFromUnsecureFileButtonClickEL =
285
            new RestoreFromUnsecureFileButtonClickEL ( this.#apiKeysDialog );
286
        this.#restoreKeysFromUnsecureFileButton.addEventListener (
287
            'click',
288
            this.#restoreFromUnsecureFileButtonClickEL,
289
            false
290
        );
291
    }
292
293
    /**
294
    Add the buttons to the toolbar
295
    */
296
297
    #addToolbarButtons ( ) {
298
        if ( window?.crypto?.subtle?.importKey && window.isSecureContext ) {
299
            if ( this.#haveApiKeysFile ) {
300
                this.#createReloadKeysFromServerButton ( );
301
            }
302
            this.#createSaveKeysToSecureFileButton ( );
303
            this.#createRestoreKeysFromSecureFileButton ( );
304
        }
305
306
        this.#createNewApiKeyButton ( );
307
308
        if ( theConfig.ApiKeysDialog.haveUnsecureButtons ) {
309
            this.#createSaveKeysToUnsecureFileButton ( );
310
            this.#createRestoreKeysFromUnsecureFileButton ( );
311
        }
312
    }
313
314
    /**
315
    The constructor
316
    @param {ApiKeysDialog} apiKeysDialog A reference to the dialog
317
    @param {Map} apiKeysControl A reference to the apiKeysControl object
318
    @param {Boolean} haveApiKeysFile  A boolean indicating when the ApiKeys file was found on the server
319
    */
320
321
    constructor ( apiKeysDialog, apiKeysControl, haveApiKeysFile ) {
322
        this.#apiKeysDialog = apiKeysDialog;
323
        this.#apiKeysControl = apiKeysControl;
324
        this.#haveApiKeysFile = haveApiKeysFile;
325
        this.#toolbarHTMLElement = theHTMLElementsFactory.create (
326
            'div',
327
            {
328
                id : 'TravelNotes-ApiKeysDialog-ToolbarDiv'
329
            }
330
        );
331
332
        this.#addToolbarButtons ( );
333
        Object.freeze ( this );
334
    }
335
336
    /**
337
    Remove events listeners from the buttons
338
    */
339
340
    destructor ( ) {
341
        if ( this.#reloadKeysFromServerButton ) {
342
            this.#reloadKeysFromServerButton.removeEventListener (
343
                'click',
344
                this.#reloadFromServerButtonClickEL,
345
                false
346
            );
347
            this.#reloadFromServerButtonClickEL.destructor ( );
348
            this.#reloadFromServerButtonClickEL = null;
349
        }
350
351
        if ( this.#saveKeysToSecureFileButton ) {
352
            this.#saveKeysToSecureFileButton.removeEventListener (
353
                'click',
354
                this.#saveToSecureFileButtonClickEL,
355
                false
356
            );
357
            this.#saveToSecureFileButtonClickEL.destructor ( );
358
            this.#saveToSecureFileButtonClickEL = null;
359
        }
360
361
        if ( this.#restoreKeysFromSecureFileButton ) {
362
            this.#restoreKeysFromSecureFileButton.removeEventListener (
363
                'click',
364
                this.#restoreFromSecureFileButtonClickEL,
365
                false
366
            );
367
            this.#restoreFromSecureFileButtonClickEL.destructor ( );
368
            this.#restoreFromSecureFileButtonClickEL = null;
369
        }
370
371
        if ( this.#newApiKeyButton ) {
372
            this.#newApiKeyButton.removeEventListener (
373
                'click',
374
                this.#newApiKeyButtonClickEL,
375
                false
376
            );
377
            this.#newApiKeyButtonClickEL.destructor ( );
378
            this.#newApiKeyButtonClickEL = null;
379
        }
380
381
        if ( this.#saveKeysToUnsecureFileButton ) {
382
            this.#saveKeysToUnsecureFileButton.removeEventListener (
383
                'click',
384
                this.#saveToUnsecureFileButtonClickEL,
385
                false
386
            );
387
            this.#saveToUnsecureFileButtonClickEL.destructor ( );
388
            this.#saveToUnsecureFileButtonClickEL = null;
389
        }
390
391
        if ( this.#restoreKeysFromUnsecureFileButton ) {
392
            this.#restoreKeysFromUnsecureFileButton.removeEventListener (
393
                'click',
394
                this.#restoreFromUnsecureFileButtonClickEL,
395
                false
396
            );
397
            this.#restoreFromUnsecureFileButtonClickEL.destructor ( );
398
            this.#restoreFromUnsecureFileButtonClickEL = null;
399
        }
400
    }
401
402
    /**
403
    The rootHTMLElement of the toolbar
404
    @type {HTMLElement}
405
    */
406
407
    get toolbarHTMLElement ( ) {
408
        return this.#toolbarHTMLElement;
409
    }
410
411
}
412
413
export default ApiKeysDialogToolbar;
414
415
/* --- End of file --------------------------------------------------------------------------------------------------------- */
416