浏览代码

Ring overlay improvements and enable buttons fix

master
yanas 8 年前
父节点
当前提交
d250623fde

+ 1
- 1
Makefile 查看文件

14
 LIBJITSIMEET_DIR = node_modules/lib-jitsi-meet/
14
 LIBJITSIMEET_DIR = node_modules/lib-jitsi-meet/
15
 IFRAME_API_DIR = ./modules/API/external
15
 IFRAME_API_DIR = ./modules/API/external
16
 
16
 
17
-all: update-deps compile compile-iframe-api uglify uglify-iframe-api deploy clean
17
+all: compile compile-iframe-api uglify uglify-iframe-api deploy clean
18
 
18
 
19
 update-deps:
19
 update-deps:
20
 	$(NPM) update
20
 	$(NPM) update

+ 3
- 2
css/_toolbars.scss 查看文件

1
 .toolbar {
1
 .toolbar {
2
     background-color: rgba(0,0,0,0.5);
2
     background-color: rgba(0,0,0,0.5);
3
     position: relative;
3
     position: relative;
4
-    z-index: 900;
4
+    z-index: $toolbarZ;
5
     height: 100%;
5
     height: 100%;
6
     pointer-events: auto;
6
     pointer-events: auto;
7
 }
7
 }
13
     top:0;
13
     top:0;
14
     left:0;
14
     left:0;
15
     right:0;
15
     right:0;
16
-    z-index:10;
16
+    z-index: $toolbarZ;
17
     pointer-events: none;
17
     pointer-events: none;
18
     min-height: 100px;
18
     min-height: 100px;
19
     transform: translateY(-100%);
19
     transform: translateY(-100%);
76
 
76
 
77
 #toolbar_button_hangup {
77
 #toolbar_button_hangup {
78
     color: #BF2117;
78
     color: #BF2117;
79
+    font-size: $hangupFontSize !important;
79
 }
80
 }
80
 
81
 
81
 #toolbar_button_etherpad {
82
 #toolbar_button_etherpad {

+ 7
- 2
css/_variables.scss 查看文件

3
  */
3
  */
4
 $baseFontFamily: 'open_sanslight', 'Helvetica Neue', Helvetica, Arial, sans-serif;
4
 $baseFontFamily: 'open_sanslight', 'Helvetica Neue', Helvetica, Arial, sans-serif;
5
 $toolbarFontSize: 1.9em;
5
 $toolbarFontSize: 1.9em;
6
+$hangupFontSize: 2em;
6
 
7
 
7
 /**
8
 /**
8
  * Size variables.
9
  * Size variables.
16
 $defaultSemiDarkColor: #ACACAC;
17
 $defaultSemiDarkColor: #ACACAC;
17
 $defaultDarkColor: #4F4F4F;
18
 $defaultDarkColor: #4F4F4F;
18
 $defaultBackground: #474747;
19
 $defaultBackground: #474747;
19
-$toolbarSelectBackground: rgba(0, 0, 0, 0.6);
20
+$toolbarSelectBackground: rgba(0, 0, 0, .6);
20
 $inputBackground: rgba(132, 132, 132, .5);
21
 $inputBackground: rgba(132, 132, 132, .5);
21
 $inputSemiBackground: rgba(132, 132, 132, .8);
22
 $inputSemiBackground: rgba(132, 132, 132, .8);
22
 $inputLightBackground: #EBEBEB;
23
 $inputLightBackground: #EBEBEB;
28
  */
29
  */
29
 $borderRadius: 4px;
30
 $borderRadius: 4px;
30
 
31
 
31
-
32
+/**
33
+ * Z-indexes. TODO: Replace this by a function.
34
+ */
35
+$toolbarZ: 900;
36
+$overlayZ: 800;

+ 2
- 1
css/main.scss 查看文件

21
 
21
 
22
 @import 'toastr';
22
 @import 'toastr';
23
 @import 'base';
23
 @import 'base';
24
-@import 'overlay';
24
+@import 'overlay/overlay';
25
 @import 'videolayout_default';
25
 @import 'videolayout_default';
26
 @import 'jquery-impromptu';
26
 @import 'jquery-impromptu';
27
 @import 'modaldialog';
27
 @import 'modaldialog';
33
 @import 'jitsi_popover';
33
 @import 'jitsi_popover';
34
 @import 'contact_list';
34
 @import 'contact_list';
35
 @import 'chat';
35
 @import 'chat';
36
+@import 'ringing/ringing';
36
 @import 'welcome_page';
37
 @import 'welcome_page';
37
 @import 'toolbars';
38
 @import 'toolbars';
38
 @import 'side_toolbar_container';
39
 @import 'side_toolbar_container';

css/_overlay.scss → css/overlay/_overlay.scss 查看文件

1
-
2
 .overlay {
1
 .overlay {
3
     position: fixed;
2
     position: fixed;
4
     left: 0;
3
     left: 0;
5
     top: 0;
4
     top: 0;
6
     width: 100%;
5
     width: 100%;
7
     height: 100%;
6
     height: 100%;
8
-    z-index: 1013;
7
+    z-index: $overlayZ;
9
     background: #21B9FC; /* Old browsers */
8
     background: #21B9FC; /* Old browsers */
10
     opacity: 0.75;
9
     opacity: 0.75;
11
     display: block;
10
     display: block;
19
     width: 100%;
18
     width: 100%;
20
     height: 100%;
19
     height: 100%;
21
     position: fixed;
20
     position: fixed;
22
-    z-index: 1013;
21
+    z-index: $overlayZ;
23
 }
22
 }
24
 
23
 
25
 .overlay_content {
24
 .overlay_content {
36
     margin-left: -200px;
35
     margin-left: -200px;
37
 }
36
 }
38
 
37
 
39
-.overlay_avatar {
40
-    width: 200px;
41
-    height: 200px;
42
-    position: relative;
43
-    border-radius: 100px;
44
-    z-index: 1013;
45
-    float: left;
46
-    margin-left: 100px;
47
-}
48
-
49
-.overlay_text {
50
-    position: relative;
51
-    width: 400px;
52
-    z-index: 1013;
53
-    margin-top: 50px;
54
-    float: left;
55
-}
56
 
38
 
57
 .overlay_text_small {
39
 .overlay_text_small {
58
     font-size: 18px;
40
     font-size: 18px;

+ 1
- 1
index.html 查看文件

120
                     </li>
120
                     </li>
121
                 </ul>
121
                 </ul>
122
             </span>
122
             </span>
123
-            <a class="button icon-link" id="toolbar_button_link" data-container="body" data-toggle="popover" data-placement="right" data-i18n="[content]toolbar.invite" content="Invite others"></a>
124
             <a class="button icon-contactList" id="toolbar_contact_list" data-container="body" data-toggle="popover" data-placement="right" shortcut="contactlistpopover"  data-i18n="[content]bottomtoolbar.contactlist" content="Open / close contact list">
123
             <a class="button icon-contactList" id="toolbar_contact_list" data-container="body" data-toggle="popover" data-placement="right" shortcut="contactlistpopover"  data-i18n="[content]bottomtoolbar.contactlist" content="Open / close contact list">
125
                 <span id="numberOfParticipants"></span>
124
                 <span id="numberOfParticipants"></span>
126
             </a>
125
             </a>
138
             <a class="button icon-telephone" id="toolbar_button_sip" data-container="body" data-toggle="popover" data-placement="right" content="Call SIP number" data-i18n="[content]toolbar.sip" style="display: none"></a>
137
             <a class="button icon-telephone" id="toolbar_button_sip" data-container="body" data-toggle="popover" data-placement="right" content="Call SIP number" data-i18n="[content]toolbar.sip" style="display: none"></a>
139
             <a class="button icon-dialpad" id="toolbar_button_dialpad" data-container="body" data-toggle="popover" data-placement="right" content="Open dialpad" data-i18n="[content]toolbar.dialpad" style="display: none"></a>
138
             <a class="button icon-dialpad" id="toolbar_button_dialpad" data-container="body" data-toggle="popover" data-placement="right" content="Open dialpad" data-i18n="[content]toolbar.dialpad" style="display: none"></a>
140
             <a class="button icon-settings" id="toolbar_button_settings" data-container="body" data-toggle="popover" data-placement="right" content="Settings" data-i18n="[content]toolbar.Settings"></a>
139
             <a class="button icon-settings" id="toolbar_button_settings" data-container="body" data-toggle="popover" data-placement="right" content="Settings" data-i18n="[content]toolbar.Settings"></a>
140
+            <a class="button icon-full-screen" id="toolbar_button_fullScreen" data-container="body" data-toggle="popover" data-placement="right" shortcut="toggleFullscreenPopover" data-i18n="[content]toolbar.fullscreen" content="Enter / Exit Full Screen"></a>
141
             <a class="button icon-toggle-filmstrip" id="toolbar_film_strip" data-container="body" data-toggle="popover" shortcut="filmstripPopover" data-placement="right" data-i18n="[content]toolbar.filmstrip" content="Show / hide videos"></a>
141
             <a class="button icon-toggle-filmstrip" id="toolbar_film_strip" data-container="body" data-toggle="popover" shortcut="filmstripPopover" data-placement="right" data-i18n="[content]toolbar.filmstrip" content="Show / hide videos"></a>
142
             <a class="button icon-feedback" id="feedbackButton" data-container="body" data-toggle="popover" data-placement="right" data-i18n="[content]feedback"></a>
142
             <a class="button icon-feedback" id="feedbackButton" data-container="body" data-toggle="popover" data-placement="right" data-i18n="[content]feedback"></a>
143
             <div id="sideToolbarContainer">
143
             <div id="sideToolbarContainer">

+ 6
- 3
interface_config.js 查看文件

2
     CANVAS_EXTRA: 104,
2
     CANVAS_EXTRA: 104,
3
     CANVAS_RADIUS: 0,
3
     CANVAS_RADIUS: 0,
4
     SHADOW_COLOR: '#ffffff',
4
     SHADOW_COLOR: '#ffffff',
5
+    // TO FIX: this needs to be handled from SASS variables. There are some
6
+    // methods allowing to use variables both in css and js.
7
+    DEFAULT_BACKGROUND: '#474747',
5
     INITIAL_TOOLBAR_TIMEOUT: 20000,
8
     INITIAL_TOOLBAR_TIMEOUT: 20000,
6
     TOOLBAR_TIMEOUT: 4000,
9
     TOOLBAR_TIMEOUT: 4000,
7
     DEFAULT_REMOTE_DISPLAY_NAME: "Fellow Jitster",
10
     DEFAULT_REMOTE_DISPLAY_NAME: "Fellow Jitster",
16
     INVITATION_POWERED_BY: true,
19
     INVITATION_POWERED_BY: true,
17
     // the toolbar buttons line is intentionally left in one line, to be able
20
     // the toolbar buttons line is intentionally left in one line, to be able
18
     // to easily override values or remove them using regex
21
     // to easily override values or remove them using regex
19
-    MAIN_TOOLBAR_BUTTONS: ['microphone', 'camera', 'desktop', 'fullscreen', 'hangup'], // jshint ignore:line
20
-    TOOLBAR_BUTTONS: ['authentication', 'microphone', 'camera', 'desktop', 'recording', 'security', 'invite', 'chat', 'etherpad', 'sharedvideo', 'fullscreen', 'sip', 'dialpad', 'settings', 'hangup', 'filmstrip', 'contacts'], // jshint ignore:line
22
+    MAIN_TOOLBAR_BUTTONS: ['microphone', 'camera', 'desktop', 'invite', 'hangup'], // jshint ignore:line
23
+    TOOLBAR_BUTTONS: ['profile', 'authentication', 'microphone', 'camera', 'desktop', 'recording', 'security', 'invite', 'chat', 'etherpad', 'sharedvideo', 'fullscreen', 'sip', 'dialpad', 'settings', 'hangup', 'filmstrip', 'contacts'], // jshint ignore:line
21
     // Determines how the video would fit the screen. 'both' would fit the whole
24
     // Determines how the video would fit the screen. 'both' would fit the whole
22
     // screen, 'height' would fit the original video height to the height of the
25
     // screen, 'height' would fit the original video height to the height of the
23
     // screen, 'width' would fit the original video width to the width of the
26
     // screen, 'width' would fit the original video width to the width of the
30
     RANDOM_AVATAR_URL_PREFIX: false,
33
     RANDOM_AVATAR_URL_PREFIX: false,
31
     RANDOM_AVATAR_URL_SUFFIX: false,
34
     RANDOM_AVATAR_URL_SUFFIX: false,
32
     FILM_STRIP_MAX_HEIGHT: 120
35
     FILM_STRIP_MAX_HEIGHT: 120
33
-};
36
+};

+ 1
- 1
lang/main.json 查看文件

11
     "raisedHand": "Would like to speak",
11
     "raisedHand": "Would like to speak",
12
     "defaultNickname": "ex. Jane Pink",
12
     "defaultNickname": "ex. Jane Pink",
13
     "defaultLink": "e.g. __url__",
13
     "defaultLink": "e.g. __url__",
14
-    "calling": "Calling __name__ ...",
14
+    "callingName": "__name__",
15
     "userMedia": {
15
     "userMedia": {
16
       "react-nativeGrantPermissions": "Please grant permissions to use your camera and microphone by pressing <b><i>Allow</i></b> button",
16
       "react-nativeGrantPermissions": "Please grant permissions to use your camera and microphone by pressing <b><i>Allow</i></b> button",
17
       "chromeGrantPermissions": "Please grant permissions to use your camera and microphone by pressing <b><i>Allow</i></b> button",
17
       "chromeGrantPermissions": "Please grant permissions to use your camera and microphone by pressing <b><i>Allow</i></b> button",

+ 9
- 0
modules/UI/UI.js 查看文件

1499
     FilmStrip.toggleFilmStrip(true);
1499
     FilmStrip.toggleFilmStrip(true);
1500
 };
1500
 };
1501
 
1501
 
1502
+/**
1503
+ * Indicates if the ring overlay is currently visible.
1504
+ *
1505
+ * @returns {*|boolean} {true} if the ring overlay is visible, {false} otherwise
1506
+ */
1507
+UI.isRingOverlayVisible = function () {
1508
+    return RingOverlay.isVisible();
1509
+};
1510
+
1502
 /**
1511
 /**
1503
  * Shows browser-specific overlay with guidance how to proceed with gUM prompt.
1512
  * Shows browser-specific overlay with guidance how to proceed with gUM prompt.
1504
  * @param {string} browser - name of browser for which to show the guidance
1513
  * @param {string} browser - name of browser for which to show the guidance

+ 50
- 22
modules/UI/ring_overlay/RingOverlay.js 查看文件

1
 /* global $ */
1
 /* global $ */
2
+/* jshint -W101 */
2
 
3
 
3
 /**
4
 /**
4
  * Shows ring overlay
5
  * Shows ring overlay
8
      * @param callee instance of User class from TokenData.js
9
      * @param callee instance of User class from TokenData.js
9
      */
10
      */
10
     constructor(callee) {
11
     constructor(callee) {
12
+        this._containerId = 'ringOverlay';
13
+        this._audioContainerId = 'ringOverlayRinging';
14
+
11
         this.callee = callee;
15
         this.callee = callee;
12
-        this._buildHtml();
13
-        this.audio = $("#ring_overlay_ringing");
14
-        this.audio[0].play();
16
+        this.render();
17
+        this.audio = document.getElementById(this._audioContainerId);
18
+        this.audio.play();
15
         this._setAudioTimeout();
19
         this._setAudioTimeout();
16
     }
20
     }
17
 
21
 
18
     /**
22
     /**
19
      * Builds and appends the ring overlay to the html document
23
      * Builds and appends the ring overlay to the html document
20
      */
24
      */
21
-    _buildHtml() {
22
-        $("body").append("<div class='overlay_container' >" +
23
-        "<div class='overlay' /><div class='overlay_content'>" +
24
-        "<img class='overlay_avatar' src='" +
25
-        this.callee.getAvatarUrl() + "' />" +
26
-        "<span data-i18n='calling' data-i18n-options='" +
27
-        JSON.stringify({name: this.callee.getName()}) +
28
-        "' class='overlay_text'>Calling " +
29
-        this.callee.getName() + "...</span></div>" +
30
-        "<audio id='ring_overlay_ringing' src='/sounds/ring.ogg' /></div>");
25
+    _getHtmlStr(callee) {
26
+        return `
27
+            <div id="${this._containerId}" class='ringing' >
28
+                <div class='ringing__content'>
29
+                    <p>Calling...</p>
30
+                    <img class='ringing__avatar' src="${callee.getAvatarUrl()}" />
31
+                    <div class="ringing__caller-info">
32
+                        <p>${callee.getName()}</p>
33
+                    </div>
34
+                </div>
35
+                <audio id="${this._audioContainerId}" src="/sounds/ring.ogg" />
36
+            </div>`;
31
     }
37
     }
32
 
38
 
33
     /**
39
     /**
34
-     * Sets the interval that is going to play the ringing sound.
40
+     *
35
      */
41
      */
36
-    _setAudioTimeout() {
37
-        this.interval = setInterval( () => {
38
-            this.audio[0].play();
39
-        }, 5000);
42
+    render() {
43
+        this.htmlStr = this._getHtmlStr(this.callee);
44
+        this._attach();
40
     }
45
     }
41
 
46
 
42
     /**
47
     /**
44
      * related to the ring overlay.
49
      * related to the ring overlay.
45
      */
50
      */
46
     destroy() {
51
     destroy() {
47
-        if(this.interval)
52
+        if (this.interval) {
48
             clearInterval(this.interval);
53
             clearInterval(this.interval);
49
-        $(".overlay_container").remove();
54
+        }
55
+
56
+        this._detach();
57
+    }
58
+
59
+    _attach() {
60
+        $("body").append(this.htmlStr);
61
+    }
62
+
63
+    _detach() {
64
+        $(`#${this._containerId}`).remove();
65
+    }
66
+
67
+    /**
68
+     * Sets the interval that is going to play the ringing sound.
69
+     */
70
+    _setAudioTimeout() {
71
+        this.interval = setInterval( () => {
72
+            this.audio.play();
73
+        }, 5000);
50
     }
74
     }
51
 }
75
 }
52
 
76
 
66
         if(overlay) {
90
         if(overlay) {
67
             this.hide();
91
             this.hide();
68
         }
92
         }
93
+
69
         overlay = new RingOverlay(callee);
94
         overlay = new RingOverlay(callee);
70
     },
95
     },
96
+
71
     /**
97
     /**
72
      * Hides the ring overlay. Destroys all the elements related to the ring
98
      * Hides the ring overlay. Destroys all the elements related to the ring
73
      * overlay.
99
      * overlay.
74
      */
100
      */
75
     hide() {
101
     hide() {
76
-        if(!overlay)
102
+        if(!overlay) {
77
             return false;
103
             return false;
104
+        }
78
         overlay.destroy();
105
         overlay.destroy();
79
         overlay = null;
106
         overlay = null;
80
         return true;
107
         return true;
81
     },
108
     },
109
+
82
     /**
110
     /**
83
      * Checks whether or not the ring overlay is currently displayed.
111
      * Checks whether or not the ring overlay is currently displayed.
84
      *
112
      *
85
      * @returns {boolean} true if the ring overlay is currently displayed or
113
      * @returns {boolean} true if the ring overlay is currently displayed or
86
      * false otherwise.
114
      * false otherwise.
87
      */
115
      */
88
-    isDisplayed () {
116
+    isVisible () {
89
         return overlay !== null;
117
         return overlay !== null;
90
     }
118
     }
91
 };
119
 };

+ 21
- 9
modules/UI/toolbars/Toolbar.js 查看文件

214
     },
214
     },
215
     'desktop': {
215
     'desktop': {
216
         id: 'toolbar_button_desktopsharing',
216
         id: 'toolbar_button_desktopsharing',
217
-        className: "button icon-share-desktop",
217
+        className: 'button icon-share-desktop',
218
         shortcut: 'D',
218
         shortcut: 'D',
219
         shortcutAttr: 'toggleDesktopSharingPopover',
219
         shortcutAttr: 'toggleDesktopSharingPopover',
220
         shortcutFunc: function() {
220
         shortcutFunc: function() {
221
             JitsiMeetJS.analytics.sendEvent('shortcut.screen.toggled');
221
             JitsiMeetJS.analytics.sendEvent('shortcut.screen.toggled');
222
             APP.conference.toggleScreenSharing();
222
             APP.conference.toggleScreenSharing();
223
         },
223
         },
224
-        shortcutDescription: "keyboardShortcuts.toggleScreensharing",
225
-        content: "Share screen",
226
-        i18n: "[content]toolbar.sharescreen"
224
+        shortcutDescription: 'keyboardShortcuts.toggleScreensharing',
225
+        content: 'Share screen',
226
+        i18n: '[content]toolbar.sharescreen'
227
     },
227
     },
228
     'security': {
228
     'security': {
229
         id: 'toolbar_button_security'
229
         id: 'toolbar_button_security'
230
     },
230
     },
231
     'invite': {
231
     'invite': {
232
-        id: 'toolbar_button_link'
232
+        id: 'toolbar_button_link',
233
+        className: 'button icon-link',
234
+        content: 'Invite others',
235
+        i18n: '[content]toolbar.invite'
233
     },
236
     },
234
     'chat': {
237
     'chat': {
235
         id: 'toolbar_button_chat',
238
         id: 'toolbar_button_chat',
239
             JitsiMeetJS.analytics.sendEvent('shortcut.chat.toggled');
242
             JitsiMeetJS.analytics.sendEvent('shortcut.chat.toggled');
240
             APP.UI.toggleChat();
243
             APP.UI.toggleChat();
241
         },
244
         },
242
-        shortcutDescription: "keyboardShortcuts.toggleChat",
243
-        sideContainerId: "chat_container"
245
+        shortcutDescription: 'keyboardShortcuts.toggleChat',
246
+        sideContainerId: 'chat_container'
244
     },
247
     },
245
     'contacts': {
248
     'contacts': {
246
         id: 'toolbar_contact_list',
249
         id: 'toolbar_contact_list',
247
-        sideContainerId: "contacts_container"
250
+        sideContainerId: 'contacts_container'
248
     },
251
     },
249
     'profile': {
252
     'profile': {
250
         id: 'toolbar_button_profile',
253
         id: 'toolbar_button_profile',
251
-        sideContainerId: "profile_container"
254
+        sideContainerId: 'profile_container'
252
     },
255
     },
253
     'etherpad': {
256
     'etherpad': {
254
         id: 'toolbar_button_etherpad'
257
         id: 'toolbar_button_etherpad'
695
         });
698
         });
696
     },
699
     },
697
 
700
 
701
+    /**
702
+     * Adds the given button to the main (top) toolbar.
703
+     *
704
+     * @param {Object} the button to add.
705
+     * @param {boolean} isFirst indicates if this is the first button in the
706
+     * toolbar
707
+     * @param {boolean} isLast indicates if this is the last button in the
708
+     * toolbar
709
+     */
698
     _addMainToolbarButton(button, isFirst, isLast) {
710
     _addMainToolbarButton(button, isFirst, isLast) {
699
         let buttonElement = document.createElement("a");
711
         let buttonElement = document.createElement("a");
700
         if (button.className)
712
         if (button.className)

+ 1
- 1
modules/UI/toolbars/ToolbarToggler.js 查看文件

35
     clearTimeout(toolbarTimeoutObject);
35
     clearTimeout(toolbarTimeoutObject);
36
     toolbarTimeoutObject = null;
36
     toolbarTimeoutObject = null;
37
 
37
 
38
-    if (Toolbar.isHovered()) {
38
+    if (Toolbar.isHovered() || APP.UI.isRingOverlayVisible()) {
39
         toolbarTimeoutObject = setTimeout(hideToolbar, toolbarTimeout);
39
         toolbarTimeoutObject = setTimeout(hideToolbar, toolbarTimeout);
40
     } else if (!SideContainerToggler.isVisible() || force) {
40
     } else if (!SideContainerToggler.isVisible() || force) {
41
         Toolbar.hide();
41
         Toolbar.hide();

+ 2
- 1
modules/UI/util/MessageHandler.js 查看文件

258
     notify: function(displayName, displayNameKey, cls, messageKey,
258
     notify: function(displayName, displayNameKey, cls, messageKey,
259
                      messageArguments, options) {
259
                      messageArguments, options) {
260
 
260
 
261
-        if(!notificationsEnabled)
261
+        // If we're in ringing state we skip all toaster notifications.
262
+        if(!notificationsEnabled || APP.UI.isRingOverlayVisible())
262
             return;
263
             return;
263
 
264
 
264
         var displayNameSpan = '<span class="nickname" ';
265
         var displayNameSpan = '<span class="nickname" ';

+ 2
- 2
modules/UI/util/UIUtil.js 查看文件

112
         var selector = Object.keys(mappings)
112
         var selector = Object.keys(mappings)
113
           .map(function (buttonName) {
113
           .map(function (buttonName) {
114
                 return UIUtil.isButtonEnabled(buttonName)
114
                 return UIUtil.isButtonEnabled(buttonName)
115
-                    ? null : mappings[buttonName].id; })
115
+                    ? null : "#" + mappings[buttonName].id; })
116
           .filter(function (item) { return item; })
116
           .filter(function (item) { return item; })
117
           .join(',');
117
           .join(',');
118
         $(selector).hide();
118
         $(selector).hide();
120
 
120
 
121
     redirect (url) {
121
     redirect (url) {
122
          window.location.href = url;
122
          window.location.href = url;
123
-     },
123
+    },
124
 
124
 
125
      isFullScreen () {
125
      isFullScreen () {
126
          return document.fullScreen
126
          return document.fullScreen

正在加载...
取消
保存