goblin-desktop 4.2.0 → 4.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +9 -9
- package/.zou-flow +2 -2
- package/LICENSE +21 -21
- package/README.md +108 -108
- package/builders/builders.js +3 -3
- package/builders/wizard.js +462 -462
- package/contexts.js +13 -13
- package/desktop-manager.js +10 -10
- package/desktop-window.js +13 -13
- package/desktop.js +13 -13
- package/eslint.config.js +65 -65
- package/lib/service.js +137 -137
- package/package.json +48 -48
- package/password-wizard.js +24 -24
- package/quest-run-wizard.js +24 -24
- package/taskbar.js +13 -13
- package/widgets/audio/sfx.js +177 -177
- package/widgets/board/view.js +37 -37
- package/widgets/board/widget.js +65 -65
- package/widgets/contexts/logic-handlers.js +36 -36
- package/widgets/contexts/service.js +40 -40
- package/widgets/contexts/view.js +21 -21
- package/widgets/contexts/widget.js +147 -147
- package/widgets/datagrid/datagrid-entity.js +82 -82
- package/widgets/datagrid/datagrid-headers.js +274 -274
- package/widgets/datagrid/styles.js +13 -13
- package/widgets/datagrid/widget.js +192 -192
- package/widgets/datagrid-cell/styles.js +52 -52
- package/widgets/datagrid-cell/widget.js +41 -41
- package/widgets/datagrid-item/styles.js +15 -15
- package/widgets/datagrid-item/widget.js +74 -74
- package/widgets/default/view.js +160 -160
- package/widgets/desktop/compensator.js +9 -9
- package/widgets/desktop/logic-handlers.js +243 -243
- package/widgets/desktop/reducer.js +35 -35
- package/widgets/desktop/service.js +858 -858
- package/widgets/desktop/styles.js +28 -28
- package/widgets/desktop/widget.js +191 -191
- package/widgets/desktop-clock/styles.js +69 -69
- package/widgets/desktop-clock/widget.js +387 -387
- package/widgets/desktop-clock-clock/styles.js +56 -56
- package/widgets/desktop-clock-clock/widget.js +96 -96
- package/widgets/desktop-clock-menu/styles.js +129 -129
- package/widgets/desktop-clock-menu/widget.js +63 -63
- package/widgets/desktop-connection-status/reducer.js +15 -15
- package/widgets/desktop-connection-status/styles.js +44 -44
- package/widgets/desktop-connection-status/widget.js +134 -134
- package/widgets/desktop-content/widget.js +68 -68
- package/widgets/desktop-footer/reducer.js +31 -31
- package/widgets/desktop-footer/styles.js +36 -36
- package/widgets/desktop-footer/widget.js +52 -52
- package/widgets/desktop-monitors/styles.js +155 -155
- package/widgets/desktop-monitors/widget.js +272 -272
- package/widgets/desktop-notebook/styles.js +155 -155
- package/widgets/desktop-notebook/widget.js +252 -252
- package/widgets/desktop-notifications/styles.js +147 -147
- package/widgets/desktop-notifications/widget.js +231 -231
- package/widgets/desktop-scale/reducer.js +15 -15
- package/widgets/desktop-scale/styles.js +49 -49
- package/widgets/desktop-scale/widget.js +173 -172
- package/widgets/desktop-state-monitor/styles.js +72 -72
- package/widgets/desktop-state-monitor/widget.js +123 -123
- package/widgets/desktop-taskbar/widget.js +57 -57
- package/widgets/desktop-themes-menu/widget.js +121 -121
- package/widgets/desktop-topbar/widget.js +201 -201
- package/widgets/desktop-window/service.js +56 -56
- package/widgets/desktop-window/styles.js +22 -22
- package/widgets/desktop-window/widget.js +70 -70
- package/widgets/detail/compensator.js +17 -17
- package/widgets/detail/view.js +40 -40
- package/widgets/detail/widget.js +119 -119
- package/widgets/editor/widget.js +82 -82
- package/widgets/entity-alerts/styles.js +77 -77
- package/widgets/entity-alerts/widget.js +328 -328
- package/widgets/entity-list/styles.js +66 -66
- package/widgets/entity-list/view.js +36 -36
- package/widgets/entity-list/widget.js +209 -209
- package/widgets/entity-list-item/widget.js +68 -68
- package/widgets/entity-row/styles.js +105 -105
- package/widgets/entity-row/widget.js +524 -524
- package/widgets/entity-row-button/styles.js +46 -46
- package/widgets/entity-row-button/widget.js +57 -57
- package/widgets/entity-view/reducer.js +20 -20
- package/widgets/entity-view/styles.js +90 -90
- package/widgets/entity-view/widget.js +601 -601
- package/widgets/facet-checkbox/styles.js +17 -17
- package/widgets/facet-checkbox/widget.js +43 -43
- package/widgets/facet-filter/widget.js +94 -94
- package/widgets/facet-filter-add/styles.js +30 -30
- package/widgets/facet-filter-add/widget.js +105 -105
- package/widgets/facet-filter-button/styles.js +74 -74
- package/widgets/facet-filter-button/widget.js +214 -214
- package/widgets/facet-filter-list-dialog/styles.js +59 -59
- package/widgets/facet-filter-list-dialog/widget.js +273 -273
- package/widgets/facet-filter-list-dialog-footer/styles.js +22 -22
- package/widgets/facet-filter-list-dialog-footer/widget.js +105 -105
- package/widgets/facet-filter-range-dialog/styles.js +82 -82
- package/widgets/facet-filter-range-dialog/widget.js +399 -399
- package/widgets/facet-filter-range-dialog-footer/styles.js +22 -22
- package/widgets/facet-filter-range-dialog-footer/widget.js +182 -182
- package/widgets/gamepad/widget.js +75 -75
- package/widgets/helpers/facet-helpers.js +105 -105
- package/widgets/hinter/reducer.js +35 -35
- package/widgets/hinter/styles.js +79 -79
- package/widgets/hinter/view.js +32 -32
- package/widgets/hinter/widget.js +289 -291
- package/widgets/junction/styles.js +22 -22
- package/widgets/junction/widget.js +50 -50
- package/widgets/main-tab-menu/styles.js +17 -17
- package/widgets/main-tab-menu/widget.js +130 -130
- package/widgets/map/view.js +49 -49
- package/widgets/map/widget.js +64 -64
- package/widgets/monitor/reducer.js +15 -15
- package/widgets/monitor/widget.js +60 -60
- package/widgets/navigating-layer/widget.js +25 -25
- package/widgets/notifications-button/widget.js +44 -44
- package/widgets/password-wizard/service.js +53 -53
- package/widgets/password-wizard/ui.js +66 -66
- package/widgets/plugin/reducer.js +19 -19
- package/widgets/plugin/styles.js +294 -294
- package/widgets/plugin/widget.js +622 -622
- package/widgets/quest-run-wizard/service.js +49 -49
- package/widgets/quest-run-wizard/ui.js +25 -25
- package/widgets/search/styles.js +80 -80
- package/widgets/search/widget.js +283 -285
- package/widgets/simple/view.js +28 -28
- package/widgets/status-filters/widget.js +121 -121
- package/widgets/tab/styles.js +16 -16
- package/widgets/tab/widget.js +89 -89
- package/widgets/tab-content/widget.js +35 -35
- package/widgets/tabs/widget.js +48 -48
- package/widgets/taskbar/service.js +99 -99
- package/widgets/taskbar/view.js +27 -27
- package/widgets/taskbar/widget.js +167 -167
- package/widgets/widget-doc-caller/reducer.js +15 -15
- package/widgets/widget-doc-caller/styles.js +20 -20
- package/widgets/widget-doc-caller/widget.js +55 -55
- package/widgets/wizard/widget.js +298 -298
- package/widgets/wizard-buttons/widget.js +111 -111
- package/widgets/workitem/styles.js +286 -286
- package/widgets/workitem/view.js +62 -62
- package/widgets/workitem/widget.js +988 -988
- package/widgets/workitem-dialog/widget.js +86 -86
- package/widgets/workitem-fields/widget.js +64 -64
package/contexts.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Retrieve the list of available commands.
|
|
5
|
-
*
|
|
6
|
-
* @returns {Object} The list and definitions of commands.
|
|
7
|
-
*/
|
|
8
|
-
exports.xcraftCommands = function () {
|
|
9
|
-
return require(`./widgets/${require('path').basename(
|
|
10
|
-
__filename,
|
|
11
|
-
'.js'
|
|
12
|
-
)}/service.js`);
|
|
13
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Retrieve the list of available commands.
|
|
5
|
+
*
|
|
6
|
+
* @returns {Object} The list and definitions of commands.
|
|
7
|
+
*/
|
|
8
|
+
exports.xcraftCommands = function () {
|
|
9
|
+
return require(`./widgets/${require('path').basename(
|
|
10
|
+
__filename,
|
|
11
|
+
'.js'
|
|
12
|
+
)}/service.js`);
|
|
13
|
+
};
|
package/desktop-manager.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Retrieve the list of available commands.
|
|
5
|
-
*
|
|
6
|
-
* @returns {Object} The list and definitions of commands.
|
|
7
|
-
*/
|
|
8
|
-
exports.xcraftCommands = function () {
|
|
9
|
-
return require('./lib/service.js');
|
|
10
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Retrieve the list of available commands.
|
|
5
|
+
*
|
|
6
|
+
* @returns {Object} The list and definitions of commands.
|
|
7
|
+
*/
|
|
8
|
+
exports.xcraftCommands = function () {
|
|
9
|
+
return require('./lib/service.js');
|
|
10
|
+
};
|
package/desktop-window.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Retrieve the list of available commands.
|
|
5
|
-
*
|
|
6
|
-
* @returns {Object} The list and definitions of commands.
|
|
7
|
-
*/
|
|
8
|
-
exports.xcraftCommands = function () {
|
|
9
|
-
return require(`./widgets/${require('path').basename(
|
|
10
|
-
__filename,
|
|
11
|
-
'.js'
|
|
12
|
-
)}/service.js`);
|
|
13
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Retrieve the list of available commands.
|
|
5
|
+
*
|
|
6
|
+
* @returns {Object} The list and definitions of commands.
|
|
7
|
+
*/
|
|
8
|
+
exports.xcraftCommands = function () {
|
|
9
|
+
return require(`./widgets/${require('path').basename(
|
|
10
|
+
__filename,
|
|
11
|
+
'.js'
|
|
12
|
+
)}/service.js`);
|
|
13
|
+
};
|
package/desktop.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Retrieve the list of available commands.
|
|
5
|
-
*
|
|
6
|
-
* @returns {Object} The list and definitions of commands.
|
|
7
|
-
*/
|
|
8
|
-
exports.xcraftCommands = function () {
|
|
9
|
-
return require(`./widgets/${require('path').basename(
|
|
10
|
-
__filename,
|
|
11
|
-
'.js'
|
|
12
|
-
)}/service.js`);
|
|
13
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Retrieve the list of available commands.
|
|
5
|
+
*
|
|
6
|
+
* @returns {Object} The list and definitions of commands.
|
|
7
|
+
*/
|
|
8
|
+
exports.xcraftCommands = function () {
|
|
9
|
+
return require(`./widgets/${require('path').basename(
|
|
10
|
+
__filename,
|
|
11
|
+
'.js'
|
|
12
|
+
)}/service.js`);
|
|
13
|
+
};
|
package/eslint.config.js
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
const js = require('@eslint/js');
|
|
2
|
-
const globals = require('globals');
|
|
3
|
-
const react = require('eslint-plugin-react');
|
|
4
|
-
const jsdoc = require('eslint-plugin-jsdoc');
|
|
5
|
-
const babel = require('@babel/eslint-plugin');
|
|
6
|
-
const prettier = require('eslint-config-prettier');
|
|
7
|
-
const babelParser = require('@babel/eslint-parser');
|
|
8
|
-
|
|
9
|
-
module.exports = [
|
|
10
|
-
js.configs.recommended,
|
|
11
|
-
react.configs.flat.recommended,
|
|
12
|
-
jsdoc.configs['flat/recommended'],
|
|
13
|
-
prettier,
|
|
14
|
-
{
|
|
15
|
-
languageOptions: {
|
|
16
|
-
parser: babelParser,
|
|
17
|
-
parserOptions: {
|
|
18
|
-
requireConfigFile: false, // Évite de devoir spécifier un fichier de configuration Babel
|
|
19
|
-
babelOptions: {
|
|
20
|
-
presets: ['@babel/preset-react'],
|
|
21
|
-
},
|
|
22
|
-
ecmaFeatures: {
|
|
23
|
-
jsx: true,
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
globals: {
|
|
27
|
-
...globals.browser,
|
|
28
|
-
...globals.node,
|
|
29
|
-
...globals.es2022,
|
|
30
|
-
...globals.mocha,
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
plugins: {
|
|
34
|
-
'react': react,
|
|
35
|
-
'jsdoc': jsdoc,
|
|
36
|
-
'@babel': babel,
|
|
37
|
-
},
|
|
38
|
-
rules: {
|
|
39
|
-
'eqeqeq': 'error',
|
|
40
|
-
'no-console': 'off',
|
|
41
|
-
'react/display-name': 'off',
|
|
42
|
-
'@babel/no-unused-expressions': 'error', // Utilisation de règles spécifiques à Babel
|
|
43
|
-
'no-unused-vars': [
|
|
44
|
-
'error',
|
|
45
|
-
{
|
|
46
|
-
vars: 'all',
|
|
47
|
-
args: 'none',
|
|
48
|
-
ignoreRestSiblings: true,
|
|
49
|
-
destructuredArrayIgnorePattern: '^_',
|
|
50
|
-
},
|
|
51
|
-
],
|
|
52
|
-
'jsdoc/require-jsdoc': 'off',
|
|
53
|
-
'jsdoc/require-param-description': 'off',
|
|
54
|
-
'jsdoc/require-returns-description': 'off',
|
|
55
|
-
},
|
|
56
|
-
settings: {
|
|
57
|
-
react: {
|
|
58
|
-
version: 'detect',
|
|
59
|
-
},
|
|
60
|
-
jsdoc: {
|
|
61
|
-
mode: 'typescript',
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
];
|
|
1
|
+
const js = require('@eslint/js');
|
|
2
|
+
const globals = require('globals');
|
|
3
|
+
const react = require('eslint-plugin-react');
|
|
4
|
+
const jsdoc = require('eslint-plugin-jsdoc');
|
|
5
|
+
const babel = require('@babel/eslint-plugin');
|
|
6
|
+
const prettier = require('eslint-config-prettier');
|
|
7
|
+
const babelParser = require('@babel/eslint-parser');
|
|
8
|
+
|
|
9
|
+
module.exports = [
|
|
10
|
+
js.configs.recommended,
|
|
11
|
+
react.configs.flat.recommended,
|
|
12
|
+
jsdoc.configs['flat/recommended'],
|
|
13
|
+
prettier,
|
|
14
|
+
{
|
|
15
|
+
languageOptions: {
|
|
16
|
+
parser: babelParser,
|
|
17
|
+
parserOptions: {
|
|
18
|
+
requireConfigFile: false, // Évite de devoir spécifier un fichier de configuration Babel
|
|
19
|
+
babelOptions: {
|
|
20
|
+
presets: ['@babel/preset-react'],
|
|
21
|
+
},
|
|
22
|
+
ecmaFeatures: {
|
|
23
|
+
jsx: true,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
globals: {
|
|
27
|
+
...globals.browser,
|
|
28
|
+
...globals.node,
|
|
29
|
+
...globals.es2022,
|
|
30
|
+
...globals.mocha,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
plugins: {
|
|
34
|
+
'react': react,
|
|
35
|
+
'jsdoc': jsdoc,
|
|
36
|
+
'@babel': babel,
|
|
37
|
+
},
|
|
38
|
+
rules: {
|
|
39
|
+
'eqeqeq': 'error',
|
|
40
|
+
'no-console': 'off',
|
|
41
|
+
'react/display-name': 'off',
|
|
42
|
+
'@babel/no-unused-expressions': 'error', // Utilisation de règles spécifiques à Babel
|
|
43
|
+
'no-unused-vars': [
|
|
44
|
+
'error',
|
|
45
|
+
{
|
|
46
|
+
vars: 'all',
|
|
47
|
+
args: 'none',
|
|
48
|
+
ignoreRestSiblings: true,
|
|
49
|
+
destructuredArrayIgnorePattern: '^_',
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
'jsdoc/require-jsdoc': 'off',
|
|
53
|
+
'jsdoc/require-param-description': 'off',
|
|
54
|
+
'jsdoc/require-returns-description': 'off',
|
|
55
|
+
},
|
|
56
|
+
settings: {
|
|
57
|
+
react: {
|
|
58
|
+
version: 'detect',
|
|
59
|
+
},
|
|
60
|
+
jsdoc: {
|
|
61
|
+
mode: 'typescript',
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
];
|
package/lib/service.js
CHANGED
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const path = require('path');
|
|
4
|
-
const goblinName = path.basename(module.parent.filename, '.js');
|
|
5
|
-
|
|
6
|
-
const T = require('goblin-nabu/widgets/helpers/t.js');
|
|
7
|
-
const Goblin = require('xcraft-core-goblin');
|
|
8
|
-
|
|
9
|
-
// Define initial logic values
|
|
10
|
-
const logicState = {
|
|
11
|
-
id: goblinName,
|
|
12
|
-
serverTick: 0,
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
// Define logic handlers according rc.json
|
|
16
|
-
const logicHandlers = {
|
|
17
|
-
tick: (state) => {
|
|
18
|
-
return state.set('serverTick', Date.now());
|
|
19
|
-
},
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
Goblin.registerQuest(goblinName, 'tick', function (quest) {
|
|
23
|
-
quest.do();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
Goblin.registerQuest(goblinName, '_createDesktop', function* (
|
|
27
|
-
quest,
|
|
28
|
-
sessionDesktopId,
|
|
29
|
-
clientSessionId,
|
|
30
|
-
labId,
|
|
31
|
-
session,
|
|
32
|
-
username,
|
|
33
|
-
configuration,
|
|
34
|
-
mainGoblin
|
|
35
|
-
) {
|
|
36
|
-
const desk = yield quest.createFor(
|
|
37
|
-
'desktop',
|
|
38
|
-
sessionDesktopId,
|
|
39
|
-
sessionDesktopId,
|
|
40
|
-
{
|
|
41
|
-
id: sessionDesktopId,
|
|
42
|
-
desktopId: sessionDesktopId,
|
|
43
|
-
clientSessionId,
|
|
44
|
-
labId,
|
|
45
|
-
session,
|
|
46
|
-
username,
|
|
47
|
-
configuration,
|
|
48
|
-
mainGoblin,
|
|
49
|
-
}
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
const exSession = quest.goblin.getX(`${sessionDesktopId}.session`);
|
|
53
|
-
if (!exSession) {
|
|
54
|
-
const mainGoblinAPI = quest.getAPI(mainGoblin);
|
|
55
|
-
if (mainGoblinAPI.configureNewDesktopSession) {
|
|
56
|
-
yield mainGoblinAPI.configureNewDesktopSession({
|
|
57
|
-
desktopId: sessionDesktopId,
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
} else {
|
|
61
|
-
yield desk.setLabId({labId});
|
|
62
|
-
yield desk.addNotification({
|
|
63
|
-
notificationId: `userconnected`,
|
|
64
|
-
color: 'green',
|
|
65
|
-
glyph: 'solid/eye',
|
|
66
|
-
message: T('{user} entre dans la session', '', {user: username}),
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (configuration && configuration.defaultContextId) {
|
|
71
|
-
yield desk.setNavToDefault({
|
|
72
|
-
defaultContextId: configuration.defaultContextId,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
Goblin.registerQuest(goblinName, 'open', function* (
|
|
78
|
-
quest,
|
|
79
|
-
clientSessionId,
|
|
80
|
-
labId,
|
|
81
|
-
sessionDesktopId,
|
|
82
|
-
session,
|
|
83
|
-
username,
|
|
84
|
-
mainGoblin,
|
|
85
|
-
configuration,
|
|
86
|
-
next
|
|
87
|
-
) {
|
|
88
|
-
const busClient = require('xcraft-core-busclient').getGlobal();
|
|
89
|
-
|
|
90
|
-
let serverTick = quest.goblin.getState().get('serverTick');
|
|
91
|
-
if (serverTick === 0) {
|
|
92
|
-
quest.dispatch('tick');
|
|
93
|
-
const serverTickInterval = setInterval(() => {
|
|
94
|
-
const resp = busClient.newResponse('desktop-manager', 'token');
|
|
95
|
-
resp.command.nestedSend('desktop-manager.tick');
|
|
96
|
-
}, 60000);
|
|
97
|
-
quest.goblin.defer(() => clearInterval(serverTickInterval));
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
quest.log.dbg(`${username} opening desktop...`);
|
|
101
|
-
|
|
102
|
-
/* CREATE A DESKTOP
|
|
103
|
-
* It uses the global busClient with a dedicated orcName in order to
|
|
104
|
-
* keep ARP entries for multicasting when the portal is going out.
|
|
105
|
-
* If we use the orcName provided by portal, then the entries are
|
|
106
|
-
* removed (linesIds too) when the socket is closed. It's necessary in
|
|
107
|
-
* the case of the desktop because the desktop is the session and the
|
|
108
|
-
* session can lives without portal.
|
|
109
|
-
*/
|
|
110
|
-
const resp = busClient.newResponse('desktop-manager', 'token');
|
|
111
|
-
resp.msgContext = {_goblinUser: quest.user._goblinUser};
|
|
112
|
-
yield resp.command.send(
|
|
113
|
-
`desktop-manager._createDesktop`,
|
|
114
|
-
{
|
|
115
|
-
sessionDesktopId,
|
|
116
|
-
clientSessionId,
|
|
117
|
-
labId,
|
|
118
|
-
session,
|
|
119
|
-
username,
|
|
120
|
-
configuration,
|
|
121
|
-
mainGoblin,
|
|
122
|
-
},
|
|
123
|
-
next
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
quest.log.dbg(`${username} opening desktop...[DONE]`);
|
|
127
|
-
return {desktopId: sessionDesktopId};
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
Goblin.registerQuest(goblinName, 'close', function* (quest, sessionDesktopId) {
|
|
131
|
-
quest.evt(`${sessionDesktopId}.closed`); /* for laboratory cleaning */
|
|
132
|
-
yield quest.warehouse.unsubscribe({feed: sessionDesktopId});
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
module.exports = Goblin.configure(goblinName, logicState, logicHandlers);
|
|
136
|
-
|
|
137
|
-
Goblin.createSingle(goblinName);
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const path = require('path');
|
|
4
|
+
const goblinName = path.basename(module.parent.filename, '.js');
|
|
5
|
+
|
|
6
|
+
const T = require('goblin-nabu/widgets/helpers/t.js');
|
|
7
|
+
const Goblin = require('xcraft-core-goblin');
|
|
8
|
+
|
|
9
|
+
// Define initial logic values
|
|
10
|
+
const logicState = {
|
|
11
|
+
id: goblinName,
|
|
12
|
+
serverTick: 0,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// Define logic handlers according rc.json
|
|
16
|
+
const logicHandlers = {
|
|
17
|
+
tick: (state) => {
|
|
18
|
+
return state.set('serverTick', Date.now());
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
Goblin.registerQuest(goblinName, 'tick', function (quest) {
|
|
23
|
+
quest.do();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
Goblin.registerQuest(goblinName, '_createDesktop', function* (
|
|
27
|
+
quest,
|
|
28
|
+
sessionDesktopId,
|
|
29
|
+
clientSessionId,
|
|
30
|
+
labId,
|
|
31
|
+
session,
|
|
32
|
+
username,
|
|
33
|
+
configuration,
|
|
34
|
+
mainGoblin
|
|
35
|
+
) {
|
|
36
|
+
const desk = yield quest.createFor(
|
|
37
|
+
'desktop',
|
|
38
|
+
sessionDesktopId,
|
|
39
|
+
sessionDesktopId,
|
|
40
|
+
{
|
|
41
|
+
id: sessionDesktopId,
|
|
42
|
+
desktopId: sessionDesktopId,
|
|
43
|
+
clientSessionId,
|
|
44
|
+
labId,
|
|
45
|
+
session,
|
|
46
|
+
username,
|
|
47
|
+
configuration,
|
|
48
|
+
mainGoblin,
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
const exSession = quest.goblin.getX(`${sessionDesktopId}.session`);
|
|
53
|
+
if (!exSession) {
|
|
54
|
+
const mainGoblinAPI = quest.getAPI(mainGoblin);
|
|
55
|
+
if (mainGoblinAPI.configureNewDesktopSession) {
|
|
56
|
+
yield mainGoblinAPI.configureNewDesktopSession({
|
|
57
|
+
desktopId: sessionDesktopId,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
} else {
|
|
61
|
+
yield desk.setLabId({labId});
|
|
62
|
+
yield desk.addNotification({
|
|
63
|
+
notificationId: `userconnected`,
|
|
64
|
+
color: 'green',
|
|
65
|
+
glyph: 'solid/eye',
|
|
66
|
+
message: T('{user} entre dans la session', '', {user: username}),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (configuration && configuration.defaultContextId) {
|
|
71
|
+
yield desk.setNavToDefault({
|
|
72
|
+
defaultContextId: configuration.defaultContextId,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
Goblin.registerQuest(goblinName, 'open', function* (
|
|
78
|
+
quest,
|
|
79
|
+
clientSessionId,
|
|
80
|
+
labId,
|
|
81
|
+
sessionDesktopId,
|
|
82
|
+
session,
|
|
83
|
+
username,
|
|
84
|
+
mainGoblin,
|
|
85
|
+
configuration,
|
|
86
|
+
next
|
|
87
|
+
) {
|
|
88
|
+
const busClient = require('xcraft-core-busclient').getGlobal();
|
|
89
|
+
|
|
90
|
+
let serverTick = quest.goblin.getState().get('serverTick');
|
|
91
|
+
if (serverTick === 0) {
|
|
92
|
+
quest.dispatch('tick');
|
|
93
|
+
const serverTickInterval = setInterval(() => {
|
|
94
|
+
const resp = busClient.newResponse('desktop-manager', 'token');
|
|
95
|
+
resp.command.nestedSend('desktop-manager.tick');
|
|
96
|
+
}, 60000);
|
|
97
|
+
quest.goblin.defer(() => clearInterval(serverTickInterval));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
quest.log.dbg(`${username} opening desktop...`);
|
|
101
|
+
|
|
102
|
+
/* CREATE A DESKTOP
|
|
103
|
+
* It uses the global busClient with a dedicated orcName in order to
|
|
104
|
+
* keep ARP entries for multicasting when the portal is going out.
|
|
105
|
+
* If we use the orcName provided by portal, then the entries are
|
|
106
|
+
* removed (linesIds too) when the socket is closed. It's necessary in
|
|
107
|
+
* the case of the desktop because the desktop is the session and the
|
|
108
|
+
* session can lives without portal.
|
|
109
|
+
*/
|
|
110
|
+
const resp = busClient.newResponse('desktop-manager', 'token');
|
|
111
|
+
resp.msgContext = {_goblinUser: quest.user._goblinUser};
|
|
112
|
+
yield resp.command.send(
|
|
113
|
+
`desktop-manager._createDesktop`,
|
|
114
|
+
{
|
|
115
|
+
sessionDesktopId,
|
|
116
|
+
clientSessionId,
|
|
117
|
+
labId,
|
|
118
|
+
session,
|
|
119
|
+
username,
|
|
120
|
+
configuration,
|
|
121
|
+
mainGoblin,
|
|
122
|
+
},
|
|
123
|
+
next
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
quest.log.dbg(`${username} opening desktop...[DONE]`);
|
|
127
|
+
return {desktopId: sessionDesktopId};
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
Goblin.registerQuest(goblinName, 'close', function* (quest, sessionDesktopId) {
|
|
131
|
+
quest.evt(`${sessionDesktopId}.closed`); /* for laboratory cleaning */
|
|
132
|
+
yield quest.warehouse.unsubscribe({feed: sessionDesktopId});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
module.exports = Goblin.configure(goblinName, logicState, logicHandlers);
|
|
136
|
+
|
|
137
|
+
Goblin.createSingle(goblinName);
|
package/package.json
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "goblin-desktop",
|
|
3
|
-
"version": "4.2.
|
|
4
|
-
"description": "Goblin Desktop",
|
|
5
|
-
"main": "./builders/builders.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"test": "echo \"Error: no test specified\" && exit 1"
|
|
8
|
-
},
|
|
9
|
-
"author": "Epsitec SA",
|
|
10
|
-
"contributors": [
|
|
11
|
-
"Samuel Loup <loup@epsitec.ch>",
|
|
12
|
-
"Mathieu Schroeter <schroeter@epsitec.ch>",
|
|
13
|
-
"Yannick Vessaz <vessaz@epsitec.ch>",
|
|
14
|
-
"Gillian Fries <fries@epsitec.ch>",
|
|
15
|
-
"Jonny Quarta <quarta@epsitec.ch>",
|
|
16
|
-
"Catia Guidi <guidi@epsitec.ch>",
|
|
17
|
-
"Pierre Arnaud <arnaud@epsitec.ch>",
|
|
18
|
-
"Michael Walz <walz@epsitec.ch>"
|
|
19
|
-
],
|
|
20
|
-
"license": "MIT",
|
|
21
|
-
"config": {
|
|
22
|
-
"xcraft": {
|
|
23
|
-
"commands": true
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
"dependencies": {
|
|
27
|
-
"goblin-theme": "^2.0.0",
|
|
28
|
-
"immutable": "4.0.0-rc.14",
|
|
29
|
-
"uuid": "^8.3.2",
|
|
30
|
-
"xcraft-core-goblin": "^5.0.0",
|
|
31
|
-
"xcraft-core-log": "^2.2.0",
|
|
32
|
-
"xcraft-core-shredder": "^5.0.0",
|
|
33
|
-
"xcraft-core-utils": "^4.0.0"
|
|
34
|
-
},
|
|
35
|
-
"devDependencies": {
|
|
36
|
-
"goblin-laboratory": "^4.0.0",
|
|
37
|
-
"prettier": "2.0.4",
|
|
38
|
-
"prop-types": "^15.5.10",
|
|
39
|
-
"mousetrap": "^1.6.1",
|
|
40
|
-
"react": "^17.0.1",
|
|
41
|
-
"react-dom": "^17.0.1",
|
|
42
|
-
"@fortawesome/react-fontawesome": "^0.1.9",
|
|
43
|
-
"scroll-into-view-if-needed": "^1.4.0",
|
|
44
|
-
"xcraft-dev-prettier": "^2.0.0",
|
|
45
|
-
"xcraft-dev-rules": "^4.4.2"
|
|
46
|
-
},
|
|
47
|
-
"prettier": "xcraft-dev-prettier"
|
|
48
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "goblin-desktop",
|
|
3
|
+
"version": "4.2.2",
|
|
4
|
+
"description": "Goblin Desktop",
|
|
5
|
+
"main": "./builders/builders.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
8
|
+
},
|
|
9
|
+
"author": "Epsitec SA",
|
|
10
|
+
"contributors": [
|
|
11
|
+
"Samuel Loup <loup@epsitec.ch>",
|
|
12
|
+
"Mathieu Schroeter <schroeter@epsitec.ch>",
|
|
13
|
+
"Yannick Vessaz <vessaz@epsitec.ch>",
|
|
14
|
+
"Gillian Fries <fries@epsitec.ch>",
|
|
15
|
+
"Jonny Quarta <quarta@epsitec.ch>",
|
|
16
|
+
"Catia Guidi <guidi@epsitec.ch>",
|
|
17
|
+
"Pierre Arnaud <arnaud@epsitec.ch>",
|
|
18
|
+
"Michael Walz <walz@epsitec.ch>"
|
|
19
|
+
],
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"config": {
|
|
22
|
+
"xcraft": {
|
|
23
|
+
"commands": true
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"goblin-theme": "^2.0.0",
|
|
28
|
+
"immutable": "4.0.0-rc.14",
|
|
29
|
+
"uuid": "^8.3.2",
|
|
30
|
+
"xcraft-core-goblin": "^5.0.0",
|
|
31
|
+
"xcraft-core-log": "^2.2.0",
|
|
32
|
+
"xcraft-core-shredder": "^5.0.0",
|
|
33
|
+
"xcraft-core-utils": "^4.0.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"goblin-laboratory": "^4.0.0",
|
|
37
|
+
"prettier": "2.0.4",
|
|
38
|
+
"prop-types": "^15.5.10",
|
|
39
|
+
"mousetrap": "^1.6.1",
|
|
40
|
+
"react": "^17.0.1",
|
|
41
|
+
"react-dom": "^17.0.1",
|
|
42
|
+
"@fortawesome/react-fontawesome": "^0.1.9",
|
|
43
|
+
"scroll-into-view-if-needed": "^1.4.0",
|
|
44
|
+
"xcraft-dev-prettier": "^2.0.0",
|
|
45
|
+
"xcraft-dev-rules": "^4.4.2"
|
|
46
|
+
},
|
|
47
|
+
"prettier": "xcraft-dev-prettier"
|
|
48
|
+
}
|
package/password-wizard.js
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
try {
|
|
4
|
-
require('goblin-workshop');
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Retrieve the list of available commands.
|
|
8
|
-
*
|
|
9
|
-
* @returns {Object} The list and definitions of commands.
|
|
10
|
-
*/
|
|
11
|
-
exports.xcraftCommands = function () {
|
|
12
|
-
return require(`./widgets/${require('path').basename(
|
|
13
|
-
__filename,
|
|
14
|
-
'.js'
|
|
15
|
-
)}/service.js`);
|
|
16
|
-
};
|
|
17
|
-
} catch (ex) {
|
|
18
|
-
if (ex.code !== 'MODULE_NOT_FOUND') {
|
|
19
|
-
throw ex;
|
|
20
|
-
}
|
|
21
|
-
console.log(
|
|
22
|
-
`Skip ${__filename} initialization, goblin-workshop not available`
|
|
23
|
-
);
|
|
24
|
-
}
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
try {
|
|
4
|
+
require('goblin-workshop');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Retrieve the list of available commands.
|
|
8
|
+
*
|
|
9
|
+
* @returns {Object} The list and definitions of commands.
|
|
10
|
+
*/
|
|
11
|
+
exports.xcraftCommands = function () {
|
|
12
|
+
return require(`./widgets/${require('path').basename(
|
|
13
|
+
__filename,
|
|
14
|
+
'.js'
|
|
15
|
+
)}/service.js`);
|
|
16
|
+
};
|
|
17
|
+
} catch (ex) {
|
|
18
|
+
if (ex.code !== 'MODULE_NOT_FOUND') {
|
|
19
|
+
throw ex;
|
|
20
|
+
}
|
|
21
|
+
console.log(
|
|
22
|
+
`Skip ${__filename} initialization, goblin-workshop not available`
|
|
23
|
+
);
|
|
24
|
+
}
|