Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
converse.js
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
converse.js
Commits
37f43989
Commit
37f43989
authored
Oct 26, 2018
by
JC Brand
Committed by
GitHub
Oct 26, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1269 from conversejs/async-await
Async await
parents
c583678c
ad27edb2
Changes
24
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
1183 additions
and
1202 deletions
+1183
-1202
css/converse.css
css/converse.css
+6
-3
dist/converse.js
dist/converse.js
+305
-288
sass/_chatbox.scss
sass/_chatbox.scss
+11
-1
spec/bookmarks.js
spec/bookmarks.js
+214
-209
spec/chatbox.js
spec/chatbox.js
+80
-106
spec/chatroom.js
spec/chatroom.js
+25
-26
spec/http-file-upload.js
spec/http-file-upload.js
+259
-263
spec/notification.js
spec/notification.js
+42
-39
spec/roster.js
spec/roster.js
+18
-31
spec/spoilers.js
spec/spoilers.js
+3
-0
src/converse-bookmarks.js
src/converse-bookmarks.js
+19
-27
src/converse-chatview.js
src/converse-chatview.js
+33
-24
src/converse-minimize.js
src/converse-minimize.js
+26
-27
src/converse-muc-views.js
src/converse-muc-views.js
+2
-2
src/converse-oauth.js
src/converse-oauth.js
+9
-12
src/converse-profile.js
src/converse-profile.js
+0
-1
src/converse-rosterview.js
src/converse-rosterview.js
+4
-5
src/headless/converse-chatboxes.js
src/headless/converse-chatboxes.js
+18
-16
src/headless/converse-disco.js
src/headless/converse-disco.js
+53
-60
src/headless/converse-muc.js
src/headless/converse-muc.js
+46
-52
src/headless/utils/core.js
src/headless/utils/core.js
+0
-8
src/templates/alert.html
src/templates/alert.html
+1
-1
src/utils/html.js
src/utils/html.js
+9
-0
tests/runner.js
tests/runner.js
+0
-1
No files found.
css/converse.css
View file @
37f43989
...
@@ -9569,12 +9569,15 @@ body.reset {
...
@@ -9569,12 +9569,15 @@ body.reset {
max-height
:
200px
;
}
max-height
:
200px
;
}
#conversejs
.converse-overlayed
.emoji-picker
{
#conversejs
.converse-overlayed
.emoji-picker
{
height
:
100px
;
}
height
:
100px
;
}
#conversejs
.converse-overlayed
.chatbox
form
.sendXMPPMessage
.chat-toolbar
li
.toolbar-menu
{
#conversejs
.converse-overlayed
.chatbox
.sendXMPPMessage
.chat-toolbar
li
.toolbar-menu
{
min-width
:
235px
;
}
min-width
:
235px
;
}
#conversejs
.converse-overlayed
.chatbox
form
.sendXMPPMessage
.chat-toolbar
li
.toolbar-menu
ul
.emoji-toolbar
{
#conversejs
.converse-overlayed
.chatbox
.sendXMPPMessage
.chat-toolbar
li
.toolbar-menu
ul
.emoji-toolbar
{
width
:
100%
;
}
width
:
100%
;
}
#conversejs
.converse-overlayed
.chatbox
form
.sendXMPPMessage
.chat-toolbar
li
.toolbar-menu
ul
.emoji-toolbar
.emoji-category
{
#conversejs
.converse-overlayed
.chatbox
.sendXMPPMessage
.chat-toolbar
li
.toolbar-menu
ul
.emoji-toolbar
.emoji-category
{
float
:
left
;
}
float
:
left
;
}
#conversejs
.converse-overlayed
.chatbox
.sendXMPPMessage
.chat-toolbar
li
.toggle-smiley
.emoji-toolbar
.emoji-category-picker
ul
{
flex-wrap
:
wrap
;
justify-content
:
flex-start
;
}
@media
(
max-width
:
767.98px
)
{
@media
(
max-width
:
767.98px
)
{
#conversejs
.converse-overlayed
>
.row
{
#conversejs
.converse-overlayed
>
.row
{
...
...
dist/converse.js
View file @
37f43989
This diff is collapsed.
Click to expand it.
sass/_chatbox.scss
View file @
37f43989
...
@@ -527,7 +527,7 @@
...
@@ -527,7 +527,7 @@
height
:
$overlayed-emoji-picker-height
;
height
:
$overlayed-emoji-picker-height
;
}
}
.chatbox
{
.chatbox
{
form
.sendXMPPMessage
{
.sendXMPPMessage
{
.chat-toolbar
{
.chat-toolbar
{
li
{
li
{
.toolbar-menu
{
.toolbar-menu
{
...
@@ -541,6 +541,16 @@
...
@@ -541,6 +541,16 @@
}
}
}
}
}
}
&
.toggle-smiley
{
.emoji-toolbar
{
.emoji-category-picker
{
ul
{
flex-wrap
:
wrap
;
justify-content
:
flex-start
;
}
}
}
}
}
}
}
}
}
}
...
...
spec/bookmarks.js
View file @
37f43989
This diff is collapsed.
Click to expand it.
spec/chatbox.js
View file @
37f43989
...
@@ -150,7 +150,8 @@
...
@@ -150,7 +150,8 @@
}));
}));
it
(
"
can be trimmed to conserve space
"
,
it
(
"
can be trimmed to conserve space
"
,
mock
.
initConverseWithPromises
(
null
,
[
'
rosterGroupsFetched
'
],
{},
function
(
done
,
_converse
)
{
mock
.
initConverseWithPromises
(
null
,
[
'
rosterGroupsFetched
'
],
{},
async
function
(
done
,
_converse
)
{
spyOn
(
_converse
.
chatboxviews
,
'
trimChats
'
);
spyOn
(
_converse
.
chatboxviews
,
'
trimChats
'
);
...
@@ -163,25 +164,23 @@
...
@@ -163,25 +164,23 @@
test_utils
.
openControlBox
();
test_utils
.
openControlBox
();
let
online_contacts
;
let
jid
,
chatboxview
;
var
i
,
jid
,
chatbox
,
chatboxview
,
trimmedview
;
// openControlBox was called earlier, so the controlbox is
// openControlBox was called earlier, so the controlbox is
// visible, but no other chat boxes have been created.
// visible, but no other chat boxes have been created.
expect
(
_converse
.
chatboxes
.
length
).
toEqual
(
1
);
expect
(
_converse
.
chatboxes
.
length
).
toEqual
(
1
);
expect
(
document
.
querySelectorAll
(
"
#conversejs .chatbox
"
).
length
).
toBe
(
1
);
// Controlbox is open
expect
(
document
.
querySelectorAll
(
"
#conversejs .chatbox
"
).
length
).
toBe
(
1
);
// Controlbox is open
_converse
.
rosterview
.
update
();
// XXX: Hack to make sure $roster element is attached.
_converse
.
rosterview
.
update
();
// XXX: Hack to make sure $roster element is attached.
test_utils
.
waitUntil
(()
=>
_converse
.
rosterview
.
el
.
querySelectorAll
(
'
.roster-group li
'
).
length
)
await
test_utils
.
waitUntil
(()
=>
_converse
.
rosterview
.
el
.
querySelectorAll
(
'
.roster-group li
'
).
length
);
.
then
(()
=>
{
// Test that they can be maximized again
// Test that they can be maximized again
online_contacts
=
_converse
.
rosterview
.
el
.
querySelectorAll
(
'
.roster-group .current-xmpp-contact a.open-chat
'
);
const
online_contacts
=
_converse
.
rosterview
.
el
.
querySelectorAll
(
'
.roster-group .current-xmpp-contact a.open-chat
'
);
expect
(
online_contacts
.
length
).
toBe
(
15
);
expect
(
online_contacts
.
length
).
toBe
(
15
);
let
i
;
for
(
i
=
0
;
i
<
online_contacts
.
length
;
i
++
)
{
for
(
i
=
0
;
i
<
online_contacts
.
length
;
i
++
)
{
const
el
=
online_contacts
[
i
];
const
el
=
online_contacts
[
i
];
el
.
click
();
el
.
click
();
}
}
return
test_utils
.
waitUntil
(()
=>
_converse
.
chatboxes
.
length
==
16
)
await
test_utils
.
waitUntil
(()
=>
_converse
.
chatboxes
.
length
==
16
);
}).
then
(()
=>
{
expect
(
_converse
.
chatboxviews
.
trimChats
.
calls
.
count
()).
toBe
(
16
);
expect
(
_converse
.
chatboxviews
.
trimChats
.
calls
.
count
()).
toBe
(
16
);
for
(
i
=
0
;
i
<
online_contacts
.
length
;
i
++
)
{
for
(
i
=
0
;
i
<
online_contacts
.
length
;
i
++
)
{
...
@@ -193,11 +192,10 @@
...
@@ -193,11 +192,10 @@
expect
(
trimmed_chatboxes
.
addChat
).
toHaveBeenCalled
();
expect
(
trimmed_chatboxes
.
addChat
).
toHaveBeenCalled
();
expect
(
chatboxview
.
minimize
).
toHaveBeenCalled
();
expect
(
chatboxview
.
minimize
).
toHaveBeenCalled
();
}
}
return
test_utils
.
waitUntil
(()
=>
_converse
.
chatboxviews
.
keys
().
length
);
await
test_utils
.
waitUntil
(()
=>
_converse
.
chatboxviews
.
keys
().
length
);
}).
then
(
function
()
{
var
key
=
_converse
.
chatboxviews
.
keys
()[
1
];
var
key
=
_converse
.
chatboxviews
.
keys
()[
1
];
trimmedview
=
trimmed_chatboxes
.
get
(
key
);
const
trimmedview
=
trimmed_chatboxes
.
get
(
key
);
chatbox
=
trimmedview
.
model
;
const
chatbox
=
trimmedview
.
model
;
spyOn
(
chatbox
,
'
maximize
'
).
and
.
callThrough
();
spyOn
(
chatbox
,
'
maximize
'
).
and
.
callThrough
();
spyOn
(
trimmedview
,
'
restore
'
).
and
.
callThrough
();
spyOn
(
trimmedview
,
'
restore
'
).
and
.
callThrough
();
trimmedview
.
delegateEvents
();
trimmedview
.
delegateEvents
();
...
@@ -207,7 +205,6 @@
...
@@ -207,7 +205,6 @@
expect
(
chatbox
.
maximize
).
toHaveBeenCalled
();
expect
(
chatbox
.
maximize
).
toHaveBeenCalled
();
expect
(
_converse
.
chatboxviews
.
trimChats
.
calls
.
count
()).
toBe
(
17
);
expect
(
_converse
.
chatboxviews
.
trimChats
.
calls
.
count
()).
toBe
(
17
);
done
();
done
();
});
}));
}));
it
(
"
can be opened in minimized mode initially
"
,
it
(
"
can be opened in minimized mode initially
"
,
...
@@ -453,18 +450,16 @@
...
@@ -453,18 +450,16 @@
it
(
"
contains a button for inserting emojis
"
,
it
(
"
contains a button for inserting emojis
"
,
mock
.
initConverseWithPromises
(
mock
.
initConverseWithPromises
(
null
,
[
'
rosterGroupsFetched
'
,
'
chatBoxesFetched
'
],
{},
null
,
[
'
rosterGroupsFetched
'
,
'
chatBoxesFetched
'
],
{},
function
(
done
,
_converse
)
{
async
function
(
done
,
_converse
)
{
test_utils
.
createContacts
(
_converse
,
'
current
'
);
test_utils
.
createContacts
(
_converse
,
'
current
'
);
_converse
.
emit
(
'
rosterContactsFetched
'
);
_converse
.
emit
(
'
rosterContactsFetched
'
);
test_utils
.
openControlBox
();
test_utils
.
openControlBox
();
let
timeout
=
false
,
view
,
toolbar
;
const
contact_jid
=
mock
.
cur_names
[
2
].
replace
(
/ /g
,
'
.
'
).
toLowerCase
()
+
'
@localhost
'
;
const
contact_jid
=
mock
.
cur_names
[
2
].
replace
(
/ /g
,
'
.
'
).
toLowerCase
()
+
'
@localhost
'
;
test_utils
.
openChatBoxFor
(
_converse
,
contact_jid
)
await
test_utils
.
openChatBoxFor
(
_converse
,
contact_jid
);
.
then
(()
=>
{
const
view
=
_converse
.
chatboxviews
.
get
(
contact_jid
);
view
=
_converse
.
chatboxviews
.
get
(
contact_jid
);
const
toolbar
=
view
.
el
.
querySelector
(
'
ul.chat-toolbar
'
);
toolbar
=
view
.
el
.
querySelector
(
'
ul.chat-toolbar
'
);
expect
(
toolbar
.
querySelectorAll
(
'
li.toggle-smiley
'
).
length
).
toBe
(
1
);
expect
(
toolbar
.
querySelectorAll
(
'
li.toggle-smiley
'
).
length
).
toBe
(
1
);
// Register spies
// Register spies
spyOn
(
view
,
'
toggleEmojiMenu
'
).
and
.
callThrough
();
spyOn
(
view
,
'
toggleEmojiMenu
'
).
and
.
callThrough
();
...
@@ -473,52 +468,33 @@
...
@@ -473,52 +468,33 @@
view
.
delegateEvents
();
// We need to rebind all events otherwise our spy won't be called
view
.
delegateEvents
();
// We need to rebind all events otherwise our spy won't be called
toolbar
.
querySelector
(
'
li.toggle-smiley
'
).
click
();
toolbar
.
querySelector
(
'
li.toggle-smiley
'
).
click
();
return
test_utils
.
waitUntil
(()
=>
u
.
isVisible
(
view
.
el
.
querySelector
(
'
.toggle-smiley .emoji-picker-container
'
),
500
));
await
test_utils
.
waitUntil
(()
=>
u
.
isVisible
(
view
.
el
.
querySelector
(
'
.toggle-smiley .emoji-picker-container
'
)));
}).
then
(()
=>
{
var
picker
=
view
.
el
.
querySelector
(
'
.toggle-smiley .emoji-picker-container
'
);
var
picker
=
view
.
el
.
querySelector
(
'
.toggle-smiley .emoji-picker-container
'
);
var
items
=
picker
.
querySelectorAll
(
'
.emoji-picker li
'
);
var
items
=
picker
.
querySelectorAll
(
'
.emoji-picker li
'
);
items
[
0
].
click
()
items
[
0
].
click
()
expect
(
view
.
insertEmoji
).
toHaveBeenCalled
();
expect
(
view
.
insertEmoji
).
toHaveBeenCalled
();
setTimeout
(
function
()
{
timeout
=
true
;
},
100
);
return
test_utils
.
waitUntil
(()
=>
timeout
,
500
);
}).
then
(()
=>
{
timeout
=
false
;
toolbar
.
querySelector
(
'
li.toggle-smiley
'
).
click
();
// Close the panel again
return
test_utils
.
waitUntil
(()
=>
!
view
.
el
.
querySelector
(
'
.toggle-smiley .toolbar-menu
'
).
offsetHeight
,
500
);
}).
then
(()
=>
{
setTimeout
(
function
()
{
timeout
=
true
;
},
100
);
return
test_utils
.
waitUntil
(()
=>
timeout
,
500
);
}).
then
(()
=>
{
toolbar
.
querySelector
(
'
li.toggle-smiley
'
).
click
();
expect
(
view
.
toggleEmojiMenu
).
toHaveBeenCalled
();
return
test_utils
.
waitUntil
(()
=>
u
.
isVisible
(
view
.
el
.
querySelector
(
'
.toggle-smiley .emoji-picker-container
'
)),
500
);
}).
then
(()
=>
{
var
nodes
=
view
.
el
.
querySelectorAll
(
'
.toggle-smiley ul li
'
);
nodes
[
nodes
.
length
-
1
].
click
();
expect
(
view
.
el
.
querySelector
(
'
textarea.chat-textarea
'
).
value
).
toBe
(
'
:grinning:
'
);
expect
(
view
.
el
.
querySelector
(
'
textarea.chat-textarea
'
).
value
).
toBe
(
'
:grinning:
'
);
expect
(
view
.
insertEmoji
).
toHaveBeenCalled
();
toolbar
.
querySelector
(
'
li.toggle-smiley
'
).
click
();
// Close the panel again
done
();
done
();
}).
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
}));
}));
it
(
"
can contain a button for starting a call
"
,
it
(
"
can contain a button for starting a call
"
,
mock
.
initConverseWithPromises
(
mock
.
initConverseWithPromises
(
null
,
[
'
rosterGroupsFetched
'
,
'
chatBoxesFetched
'
],
{},
null
,
[
'
rosterGroupsFetched
'
,
'
chatBoxesFetched
'
],
{},
function
(
done
,
_converse
)
{
async
function
(
done
,
_converse
)
{
test_utils
.
createContacts
(
_converse
,
'
current
'
);
test_utils
.
createContacts
(
_converse
,
'
current
'
);
_converse
.
emit
(
'
rosterContactsFetched
'
);
_converse
.
emit
(
'
rosterContactsFetched
'
);
test_utils
.
openControlBox
();
test_utils
.
openControlBox
();
let
view
,
toolbar
,
call_button
;
let
toolbar
,
call_button
;
const
contact_jid
=
mock
.
cur_names
[
2
].
replace
(
/ /g
,
'
.
'
).
toLowerCase
()
+
'
@localhost
'
;
const
contact_jid
=
mock
.
cur_names
[
2
].
replace
(
/ /g
,
'
.
'
).
toLowerCase
()
+
'
@localhost
'
;
spyOn
(
_converse
,
'
emit
'
);
spyOn
(
_converse
,
'
emit
'
);
// First check that the button doesn't show if it's not enabled
// First check that the button doesn't show if it's not enabled
// via "visible_toolbar_buttons"
// via "visible_toolbar_buttons"
_converse
.
visible_toolbar_buttons
.
call
=
false
;
_converse
.
visible_toolbar_buttons
.
call
=
false
;
test_utils
.
openChatBoxFor
(
_converse
,
contact_jid
)
await
test_utils
.
openChatBoxFor
(
_converse
,
contact_jid
);
.
then
(()
=>
{
let
view
=
_converse
.
chatboxviews
.
get
(
contact_jid
);
view
=
_converse
.
chatboxviews
.
get
(
contact_jid
);
toolbar
=
view
.
el
.
querySelector
(
'
ul.chat-toolbar
'
);
toolbar
=
view
.
el
.
querySelector
(
'
ul.chat-toolbar
'
);
call_button
=
toolbar
.
querySelector
(
'
.toggle-call
'
);
call_button
=
toolbar
.
querySelector
(
'
.toggle-call
'
);
expect
(
_
.
isNull
(
call_button
)).
toBeTruthy
();
expect
(
_
.
isNull
(
call_button
)).
toBeTruthy
();
...
@@ -526,15 +502,13 @@
...
@@ -526,15 +502,13 @@
// Now check that it's shown if enabled and that it emits
// Now check that it's shown if enabled and that it emits
// callButtonClicked
// callButtonClicked
_converse
.
visible_toolbar_buttons
.
call
=
true
;
// enable the button
_converse
.
visible_toolbar_buttons
.
call
=
true
;
// enable the button
return
test_utils
.
openChatBoxFor
(
_converse
,
contact_jid
);
await
test_utils
.
openChatBoxFor
(
_converse
,
contact_jid
);
}).
then
(()
=>
{
view
=
_converse
.
chatboxviews
.
get
(
contact_jid
);
view
=
_converse
.
chatboxviews
.
get
(
contact_jid
);
toolbar
=
view
.
el
.
querySelector
(
'
ul.chat-toolbar
'
);
toolbar
=
view
.
el
.
querySelector
(
'
ul.chat-toolbar
'
);
call_button
=
toolbar
.
querySelector
(
'
.toggle-call
'
);
call_button
=
toolbar
.
querySelector
(
'
.toggle-call
'
);
call_button
.
click
();
call_button
.
click
();
expect
(
_converse
.
emit
).
toHaveBeenCalledWith
(
'
callButtonClicked
'
,
jasmine
.
any
(
Object
));
expect
(
_converse
.
emit
).
toHaveBeenCalledWith
(
'
callButtonClicked
'
,
jasmine
.
any
(
Object
));
done
();
done
();
});
}));
}));
});
});
...
@@ -549,9 +523,9 @@
...
@@ -549,9 +523,9 @@
test_utils
.
openControlBox
();
test_utils
.
openControlBox
();
spyOn
(
_converse
,
'
emit
'
);
spyOn
(
_converse
,
'
emit
'
);
var
sender_jid
=
mock
.
cur_names
[
1
].
replace
(
/ /g
,
'
.
'
).
toLowerCase
()
+
'
@localhost
'
;
const
sender_jid
=
mock
.
cur_names
[
1
].
replace
(
/ /g
,
'
.
'
).
toLowerCase
()
+
'
@localhost
'
;
// <composing> state
// <composing> state
var
msg
=
$msg
({
const
msg
=
$msg
({
'
from
'
:
sender_jid
,
'
from
'
:
sender_jid
,
'
to
'
:
_converse
.
connection
.
jid
,
'
to
'
:
_converse
.
connection
.
jid
,
'
type
'
:
'
chat
'
,
'
type
'
:
'
chat
'
,
...
...
spec/chatroom.js
View file @
37f43989
...
@@ -2331,10 +2331,9 @@
...
@@ -2331,10 +2331,9 @@
it
(
"
can be minimized by clicking a DOM element with class 'toggle-chatbox-button'
"
,
it
(
"
can be minimized by clicking a DOM element with class 'toggle-chatbox-button'
"
,
mock
.
initConverseWithPromises
(
mock
.
initConverseWithPromises
(
null
,
[
'
rosterGroupsFetched
'
,
'
chatBoxesFetched
'
],
{},
null
,
[
'
rosterGroupsFetched
'
,
'
chatBoxesFetched
'
],
{},
function
(
done
,
_converse
)
{
async
function
(
done
,
_converse
)
{
test_utils
.
openChatRoom
(
_converse
,
'
lounge
'
,
'
localhost
'
,
'
dummy
'
)
await
test_utils
.
openChatRoom
(
_converse
,
'
lounge
'
,
'
localhost
'
,
'
dummy
'
);
.
then
(()
=>
{
const
view
=
_converse
.
chatboxviews
.
get
(
'
lounge@localhost
'
),
const
view
=
_converse
.
chatboxviews
.
get
(
'
lounge@localhost
'
),
trimmed_chatboxes
=
_converse
.
minimized_chats
;
trimmed_chatboxes
=
_converse
.
minimized_chats
;
...
@@ -2349,7 +2348,8 @@
...
@@ -2349,7 +2348,8 @@
expect
(
u
.
isVisible
(
view
.
el
)).
toBeFalsy
();
expect
(
u
.
isVisible
(
view
.
el
)).
toBeFalsy
();
expect
(
view
.
model
.
get
(
'
minimized
'
)).
toBeTruthy
();
expect
(
view
.
model
.
get
(
'
minimized
'
)).
toBeTruthy
();
expect
(
view
.
minimize
).
toHaveBeenCalled
();
expect
(
view
.
minimize
).
toHaveBeenCalled
();
var
trimmedview
=
trimmed_chatboxes
.
get
(
view
.
model
.
get
(
'
id
'
));
await
test_utils
.
waitUntil
(()
=>
trimmed_chatboxes
.
get
(
view
.
model
.
get
(
'
id
'
)));
const
trimmedview
=
trimmed_chatboxes
.
get
(
view
.
model
.
get
(
'
id
'
));
trimmedview
.
el
.
querySelector
(
"
a.restore-chat
"
).
click
();
trimmedview
.
el
.
querySelector
(
"
a.restore-chat
"
).
click
();
expect
(
view
.
maximize
).
toHaveBeenCalled
();
expect
(
view
.
maximize
).
toHaveBeenCalled
();
expect
(
_converse
.
emit
).
toHaveBeenCalledWith
(
'
chatBoxMaximized
'
,
jasmine
.
any
(
Object
));
expect
(
_converse
.
emit
).
toHaveBeenCalledWith
(
'
chatBoxMaximized
'
,
jasmine
.
any
(
Object
));
...
@@ -2357,7 +2357,6 @@
...
@@ -2357,7 +2357,6 @@
expect
(
_converse
.
emit
.
calls
.
count
(),
3
);
expect
(
_converse
.
emit
.
calls
.
count
(),
3
);
done
();
done
();
});
}));
}));
it
(
"
can be closed again by clicking a DOM element with class 'close-chatbox-button'
"
,
it
(
"
can be closed again by clicking a DOM element with class 'close-chatbox-button'
"
,
...
...
spec/http-file-upload.js
View file @
37f43989
This diff is collapsed.
Click to expand it.
spec/notification.js
View file @
37f43989
...
@@ -159,22 +159,26 @@
...
@@ -159,22 +159,26 @@
it
(
"
is played when the current user is mentioned in a chat room
"
,
it
(
"
is played when the current user is mentioned in a chat room
"
,
mock
.
initConverseWithPromises
(
mock
.
initConverseWithPromises
(
null
,
[
'
rosterGroupsFetched
'
],
{},
null
,
[
'
rosterGroupsFetched
'
],
{},
function
(
done
,
_converse
)
{
async
function
(
done
,
_converse
)
{
test_utils
.
createContacts
(
_converse
,
'
current
'
);
test_utils
.
createContacts
(
_converse
,
'
current
'
);
test_utils
.
openAndEnterChatRoom
(
_converse
,
'
lounge
'
,
'
localhost
'
,
'
dummy
'
).
then
(
function
()
{
await
test_utils
.
openAndEnterChatRoom
(
_converse
,
'
lounge
'
,
'
localhost
'
,
'
dummy
'
);
_converse
.
play_sounds
=
true
;
_converse
.
play_sounds
=
true
;
spyOn
(
_converse
,
'
playSoundNotification
'
);
spyOn
(
_converse
,
'
playSoundNotification
'
);
var
view
=
_converse
.
chatboxviews
.
get
(
'
lounge@localhost
'
);
const
view
=
_converse
.
chatboxviews
.
get
(
'
lounge@localhost
'
);
if
(
!
$
(
view
.
el
).
find
(
'
.chat-area
'
).
length
)
{
view
.
renderChatArea
();
}
if
(
!
view
.
el
.
querySelectorAll
(
'
.chat-area
'
).
length
)
{
var
text
=
'
This message will play a sound because it mentions dummy
'
;
view
.
renderChatArea
();
var
message
=
$msg
({
}
let
text
=
'
This message will play a sound because it mentions dummy
'
;
let
message
=
$msg
({
from
:
'
lounge@localhost/otheruser
'
,
from
:
'
lounge@localhost/otheruser
'
,
id
:
'
1
'
,
id
:
'
1
'
,
to
:
'
dummy@localhost
'
,
to
:
'
dummy@localhost
'
,
type
:
'
groupchat
'
type
:
'
groupchat
'
}).
c
(
'
body
'
).
t
(
text
);
}).
c
(
'
body
'
).
t
(
text
);
view
.
model
.
onMessage
(
message
.
nodeTree
);
view
.
model
.
onMessage
(
message
.
nodeTree
);
await
test_utils
.
waitUntil
(()
=>
_converse
.
playSoundNotification
.
calls
.
count
());
expect
(
_converse
.
playSoundNotification
).
toHaveBeenCalled
();
expect
(
_converse
.
playSoundNotification
).
toHaveBeenCalled
();
text
=
"
This message won't play a sound
"
;
text
=
"
This message won't play a sound
"
;
...
@@ -199,7 +203,6 @@
...
@@ -199,7 +203,6 @@
expect
(
_converse
.
playSoundNotification
,
1
);
expect
(
_converse
.
playSoundNotification
,
1
);
_converse
.
play_sounds
=
false
;
_converse
.
play_sounds
=
false
;
done
();
done
();
});
}));
}));
});
});
});
});
...
...
spec/roster.js
View file @
37f43989
...
@@ -10,28 +10,21 @@
...
@@ -10,28 +10,21 @@
const
u
=
converse
.
env
.
utils
;
const
u
=
converse
.
env
.
utils
;
const
checkHeaderToggling
=
function
(
group
)
{
const
checkHeaderToggling
=
async
function
(
group
)
{
var
$group
=
$
(
group
);
var
toggle
=
group
.
querySelector
(
'
a.group-toggle
'
);
var
toggle
=
group
.
querySelector
(
'
a.group-toggle
'
);
expect
(
u
.
isVisible
(
$group
[
0
]
)).
toBeTruthy
();
expect
(
u
.
isVisible
(
group
)).
toBeTruthy
();
expect
(
$group
.
find
(
'
ul.collapsed
'
).
length
).
toBe
(
0
);
expect
(
group
.
querySelectorAll
(
'
ul.collapsed
'
).
length
).
toBe
(
0
);
expect
(
u
.
hasClass
(
'
fa-caret-right
'
,
toggle
.
firstElementChild
)).
toBeFalsy
();
expect
(
u
.
hasClass
(
'
fa-caret-right
'
,
toggle
.
firstElementChild
)).
toBeFalsy
();
expect
(
u
.
hasClass
(
'
fa-caret-down
'
,
toggle
.
firstElementChild
)).
toBeTruthy
();
expect
(
u
.
hasClass
(
'
fa-caret-down
'
,
toggle
.
firstElementChild
)).
toBeTruthy
();
toggle
.
click
();
toggle
.
click
();
return
test_utils
.
waitUntil
(
function
()
{
await
test_utils
.
waitUntil
(()
=>
group
.
querySelectorAll
(
'
ul.collapsed
'
).
length
===
1
);
return
$group
.
find
(
'
ul.collapsed
'
).
length
===
1
;
},
500
).
then
(
function
()
{
expect
(
u
.
hasClass
(
'
fa-caret-right
'
,
toggle
.
firstElementChild
)).
toBeTruthy
();
expect
(
u
.
hasClass
(
'
fa-caret-right
'
,
toggle
.
firstElementChild
)).
toBeTruthy
();
expect
(
u
.
hasClass
(
'
fa-caret-down
'
,
toggle
.
firstElementChild
)).
toBeFalsy
();
expect
(
u
.
hasClass
(
'
fa-caret-down
'
,
toggle
.
firstElementChild
)).
toBeFalsy
();
toggle
.
click
();
toggle
.
click
();
return
test_utils
.
waitUntil
(
function
()
{
await
test_utils
.
waitUntil
(()
=>
group
.
querySelectorAll
(
'
li
'
).
length
===
$
(
group
).
find
(
'
li:visible
'
).
length
);
return
$group
.
find
(
'
li
'
).
length
===
$group
.
find
(
'
li:visible
'
).
length
},
500
);
}).
then
(
function
()
{
expect
(
u
.
hasClass
(
'
fa-caret-right
'
,
toggle
.
firstElementChild
)).
toBeFalsy
();
expect
(
u
.
hasClass
(
'
fa-caret-right
'
,
toggle
.
firstElementChild
)).
toBeFalsy
();
expect
(
u
.
hasClass
(
'
fa-caret-down
'
,
toggle
.
firstElementChild
)).
toBeTruthy
();
expect
(
u
.
hasClass
(
'
fa-caret-down
'
,
toggle
.
firstElementChild
)).
toBeTruthy
();
});
};
};
...
@@ -501,7 +494,7 @@
...
@@ -501,7 +494,7 @@
it
(
"
remembers whether it is closed or opened
"
,
it
(
"
remembers whether it is closed or opened
"
,
mock
.
initConverseWithPromises
(
mock
.
initConverseWithPromises
(
null
,
[
'
rosterGroupsFetched
'
],
{},
null
,
[
'
rosterGroupsFetched
'
],
{},
function
(
done
,
_converse
)
{
async
function
(
done
,
_converse
)
{
_converse
.
roster_groups
=
true
;
_converse
.
roster_groups
=
true
;
test_utils
.
openControlBox
();
test_utils
.
openControlBox
();
...
@@ -524,20 +517,14 @@
...
@@ -524,20 +517,14 @@
});
});
}
}
});
});
var
view
=
_converse
.
rosterview
.
get
(
'
colleagues
'
);
const
view
=
_converse
.
rosterview
.
get
(
'
colleagues
'
);
var
$toggle
=
$
(
view
.
el
).
find
(
'
a.group-toggle
'
);
const
toggle
=
view
.
el
.
querySelector
(
'
a.group-toggle
'
);
expect
(
view
.
model
.
get
(
'
state
'
)).
toBe
(
'
opened
'
);
expect
(
view
.
model
.
get
(
'
state
'
)).
toBe
(
'
opened
'
);
$toggle
[
0
].
click
();
toggle
.
click
();
return
test_utils
.
waitUntil
(
function
()
{
await
test_utils
.
waitUntil
(()
=>
view
.
model
.
get
(
'
state
'
)
===
'
closed
'
);
return
view
.
model
.
get
(
'
state
'
)
===
'
closed
'
;
toggle
.
click
();
},
500
).
then
(
function
()
{
await
test_utils
.
waitUntil
(()
=>
view
.
model
.
get
(
'
state
'
)
===
'
opened
'
);
$toggle
[
0
].
click
();
return
test_utils
.
waitUntil
(
function
()
{
return
view
.
model
.
get
(
'
state
'
)
===
'
opened
'
;
},
500
)
}).
then
(
function
()
{
done
();
done
();
});
}));
}));
});
});
...
...
spec/spoilers.js
View file @
37f43989
...
@@ -105,6 +105,7 @@
...
@@ -105,6 +105,7 @@
spyOn
(
view
,
'
onMessageSubmitted
'
).
and
.
callThrough
();
spyOn
(
view
,
'
onMessageSubmitted
'
).
and
.
callThrough
();
spyOn
(
_converse
.
connection
,
'
send
'
);
spyOn
(
_converse
.
connection
,
'
send
'
);
await
test_utils
.
waitUntil
(()
=>
view
.
el
.
querySelector
(
'
.toggle-compose-spoiler
'
));
let
spoiler_toggle
=
view
.
el
.
querySelector
(
'
.toggle-compose-spoiler
'
);
let
spoiler_toggle
=
view
.
el
.
querySelector
(
'
.toggle-compose-spoiler
'
);
spoiler_toggle
.
click
();
spoiler_toggle
.
click
();
...
@@ -178,6 +179,8 @@
...
@@ -178,6 +179,8 @@
await
test_utils
.
openChatBoxFor
(
_converse
,
contact_jid
);
await
test_utils
.
openChatBoxFor
(
_converse
,
contact_jid
);
await
test_utils
.
waitUntilDiscoConfirmed
(
_converse
,
contact_jid
+
'
/phone
'
,
[],
[
Strophe
.
NS
.
SPOILER
]);
await
test_utils
.
waitUntilDiscoConfirmed
(
_converse
,
contact_jid
+
'
/phone
'
,
[],
[
Strophe
.
NS
.
SPOILER
]);
const
view
=
_converse
.
chatboxviews
.
get
(
contact_jid
);
const
view
=
_converse
.
chatboxviews
.
get
(
contact_jid
);
await
test_utils
.
waitUntil
(()
=>
view
.
el
.
querySelector
(
'
.toggle-compose-spoiler
'
));
let
spoiler_toggle
=
view
.
el
.
querySelector
(
'
.toggle-compose-spoiler
'
);
let
spoiler_toggle
=
view
.
el
.
querySelector
(
'
.toggle-compose-spoiler
'
);
spoiler_toggle
.
click
();
spoiler_toggle
.
click
();
...
...
src/converse-bookmarks.js
View file @
37f43989
...
@@ -69,15 +69,14 @@ converse.plugins.add('converse-bookmarks', {
...
@@ -69,15 +69,14 @@ converse.plugins.add('converse-bookmarks', {
close_button
.
insertAdjacentHTML
(
'
afterend
'
,
bookmark_button
);
close_button
.
insertAdjacentHTML
(
'
afterend
'
,
bookmark_button
);
},
},
renderHeading
()
{
async
renderHeading
()
{
this
.
__super__
.
renderHeading
.
apply
(
this
,
arguments
);
this
.
__super__
.
renderHeading
.
apply
(
this
,
arguments
);
const
{
_converse
}
=
this
.
__super__
;
const
{
_converse
}
=
this
.
__super__
;
if
(
_converse
.
allow_bookmarks
)
{
if
(
_converse
.
allow_bookmarks
)
{
_converse
.
checkBookmarksSupport
().
then
((
supported
)
=>
{
const
supported
=
await
_converse
.
checkBookmarksSupport
();
if
(
supported
)
{
if
(
supported
)
{
this
.
renderBookmarkToggle
();
this
.
renderBookmarkToggle
();
}
}
}).
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
}
}
},
},
...
@@ -518,32 +517,25 @@ converse.plugins.add('converse-bookmarks', {
...
@@ -518,32 +517,25 @@ converse.plugins.add('converse-bookmarks', {
}
}
});
});
_converse
.
checkBookmarksSupport
=
function
()
{
_converse
.
checkBookmarksSupport
=
async
function
()
{
return
new
Promise
((
resolve
,
reject
)
=>
{
const
args
=
await
Promise
.
all
([
Promise
.
all
([
_converse
.
api
.
disco
.
getIdentity
(
'
pubsub
'
,
'
pep
'
,
_converse
.
bare_jid
),
_converse
.
api
.
disco
.
getIdentity
(
'
pubsub
'
,
'
pep
'
,
_converse
.
bare_jid
),
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
PUBSUB
+
'
#publish-options
'
,
_converse
.
bare_jid
)
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
PUBSUB
+
'
#publish-options
'
,
_converse
.
bare_jid
)
]).
then
((
args
)
=>
{
]);
resolve
(
args
[
0
]
&&
(
args
[
1
].
length
||
_converse
.
allow_public_bookmarks
));
return
args
[
0
]
&&
(
args
[
1
].
length
||
_converse
.
allow_public_bookmarks
);
}).
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
}).
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
}
}
const
initBookmarks
=
function
()
{
const
initBookmarks
=
async
function
()
{
if
(
!
_converse
.
allow_bookmarks
)
{
if
(
!
_converse
.
allow_bookmarks
)
{
return
;
return
;
}
}
_converse
.
checkBookmarksSupport
().
then
((
supported
)
=>
{
const
supported
=
await
_converse
.
checkBookmarksSupport
();
if
(
supported
)
{
if
(
supported
)
{
_converse
.
bookmarks
=
new
_converse
.
Bookmarks
();
_converse
.
bookmarks
=
new
_converse
.
Bookmarks
();
_converse
.
bookmarksview
=
new
_converse
.
BookmarksView
({
'
model
'
:
_converse
.
bookmarks
});
_converse
.
bookmarksview
=
new
_converse
.
BookmarksView
({
'
model
'
:
_converse
.
bookmarks
});
_converse
.
bookmarks
.
fetchBookmarks
()
await
_converse
.
bookmarks
.
fetchBookmarks
();
.
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
))
.
then
(()
=>
_converse
.
emit
(
'
bookmarksInitialized
'
));
}
else
{
_converse
.
emit
(
'
bookmarksInitialized
'
);
}
}
}
);
_converse
.
emit
(
'
bookmarksInitialized
'
);
}
}
u
.
onMultipleEvents
([
u
.
onMultipleEvents
([
...
...
src/converse-chatview.js
View file @
37f43989
...
@@ -10,6 +10,7 @@ import "converse-modal";
...
@@ -10,6 +10,7 @@ import "converse-modal";
import
*
as
twemoji
from
"
twemoji
"
;
import
*
as
twemoji
from
"
twemoji
"
;
import
bootstrap
from
"
bootstrap
"
;
import
bootstrap
from
"
bootstrap
"
;
import
converse
from
"
@converse/headless/converse-core
"
;
import
converse
from
"
@converse/headless/converse-core
"
;
import
tpl_alert
from
"
templates/alert.html
"
;
import
tpl_chatbox
from
"
templates/chatbox.html
"
;
import
tpl_chatbox
from
"
templates/chatbox.html
"
;
import
tpl_chatbox_head
from
"
templates/chatbox_head.html
"
;
import
tpl_chatbox_head
from
"
templates/chatbox_head.html
"
;
import
tpl_chatbox_message_form
from
"
templates/chatbox_message_form.html
"
;
import
tpl_chatbox_message_form
from
"
templates/chatbox_message_form.html
"
;
...
@@ -229,13 +230,23 @@ converse.plugins.add('converse-chatview', {
...
@@ -229,13 +230,23 @@ converse.plugins.add('converse-chatview', {
}
}
},
},
refreshContact
(
ev
)
{
async
refreshContact
(
ev
)
{
if
(
ev
&&
ev
.
preventDefault
)
{
ev
.
preventDefault
();
}
if
(
ev
&&
ev
.
preventDefault
)
{
ev
.
preventDefault
();
}
const
refresh_icon
=
this
.
el
.
querySelector
(
'
.fa-refresh
'
);
const
refresh_icon
=
this
.
el
.
querySelector
(
'
.fa-refresh
'
);
u
.
addClass
(
'
fa-spin
'
,
refresh_icon
);
u
.
addClass
(
'
fa-spin
'
,
refresh_icon
);
_converse
.
api
.
vcard
.
update
(
this
.
model
.
contact
.
vcard
,
true
)
try
{
.
then
(()
=>
u
.
removeClass
(
'
fa-spin
'
,
refresh_icon
))
await
_converse
.
api
.
vcard
.
update
(
this
.
model
.
contact
.
vcard
,
true
);
.
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
}
catch
(
e
)
{
_converse
.
log
(
e
,
Strophe
.
LogLevel
.
FATAL
);
this
.
el
.
querySelector
(
'
.modal-body
'
).
insertAdjacentHTML
(
'
afterBegin
'
,
tpl_alert
({
'
type
'
:
'
alert-danger
'
,
'
message
'
:
__
(
'
Sorry, something went wrong while trying to refresh
'
)
})
);
}
u
.
removeClass
(
'
fa-spin
'
,
refresh_icon
);
},
},
removeContact
(
ev
)
{
removeContact
(
ev
)
{
...
@@ -387,17 +398,16 @@ converse.plugins.add('converse-chatview', {
...
@@ -387,17 +398,16 @@ converse.plugins.add('converse-chatview', {
this
.
model
.
sendFiles
(
evt
.
target
.
files
);
this
.
model
.
sendFiles
(
evt
.
target
.
files
);
},
},
addFileUploadButton
(
options
)
{
a
sync
a
ddFileUploadButton
(
options
)
{
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
HTTPUPLOAD
,
_converse
.
domain
).
then
((
result
)
=>
{
const
result
=
await
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
HTTPUPLOAD
,
_converse
.
domain
);
if
(
result
.
length
)
{
if
(
result
.
length
)
{
this
.
el
.
querySelector
(
'
.chat-toolbar
'
).
insertAdjacentHTML
(
this
.
el
.
querySelector
(
'
.chat-toolbar
'
).
insertAdjacentHTML
(
'
beforeend
'
,
'
beforeend
'
,
tpl_toolbar_fileupload
({
'
tooltip_upload_file
'
:
__
(
'
Choose a file to send
'
)}));
tpl_toolbar_fileupload
({
'
tooltip_upload_file
'
:
__
(
'
Choose a file to send
'
)}));
}
}
}).
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
},
},
addSpoilerButton
(
options
)
{
a
sync
a
ddSpoilerButton
(
options
)
{
/* Asynchronously adds a button for writing spoiler
/* Asynchronously adds a button for writing spoiler
* messages, based on whether the contact's client supports
* messages, based on whether the contact's client supports
* it.
* it.
...
@@ -410,9 +420,9 @@ converse.plugins.add('converse-chatview', {
...
@@ -410,9 +420,9 @@ converse.plugins.add('converse-chatview', {
if
(
_
.
isEmpty
(
resources
))
{
if
(
_
.
isEmpty
(
resources
))
{
return
;
return
;
}
}
Promise
.
all
(
_
.
map
(
_
.
keys
(
resources
),
(
resource
)
=>
const
results
=
await
Promise
.
all
(
_
.
map
(
_
.
keys
(
resources
),
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
SPOILER
,
`
${
contact_jid
}
/
${
resource
}
`
)
resource
=>
_converse
.
api
.
disco
.
supports
(
Strophe
.
NS
.
SPOILER
,
`
${
contact_jid
}
/
${
resource
}
`
)
))
.
then
((
results
)
=>
{
))
;
if
(
_
.
filter
(
results
,
'
length
'
).
length
)
{
if
(
_
.
filter
(
results
,
'
length
'
).
length
)
{
const
html
=
tpl_spoiler_button
(
this
.
model
.
toJSON
());
const
html
=
tpl_spoiler_button
(
this
.
model
.
toJSON
());
if
(
_converse
.
visible_toolbar_buttons
.
emoji
)
{
if
(
_converse
.
visible_toolbar_buttons
.
emoji
)
{
...
@@ -421,7 +431,6 @@ converse.plugins.add('converse-chatview', {
...
@@ -421,7 +431,6 @@ converse.plugins.add('converse-chatview', {
this
.
el
.
querySelector
(
'
.chat-toolbar
'
).
insertAdjacentHTML
(
'
afterBegin
'
,
html
);
this
.
el
.
querySelector
(
'
.chat-toolbar
'
).
insertAdjacentHTML
(
'
afterBegin
'
,
html
);
}
}
}
}
}).
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
},
},
insertHeading
()
{
insertHeading
()
{
...
...
src/converse-minimize.js
View file @
37f43989
...
@@ -229,7 +229,7 @@ converse.plugins.add('converse-minimize', {
...
@@ -229,7 +229,7 @@ converse.plugins.add('converse-minimize', {
);
);
},
},
trimChats
(
newchat
)
{
async
trimChats
(
newchat
)
{
/* This method is called when a newly created chat box will
/* This method is called when a newly created chat box will
* be shown.
* be shown.
*
*
...
@@ -250,7 +250,7 @@ converse.plugins.add('converse-minimize', {
...
@@ -250,7 +250,7 @@ converse.plugins.add('converse-minimize', {
// fullscreen. In this case we don't trim.
// fullscreen. In this case we don't trim.
return
;
return
;
}
}
_converse
.
api
.
waitUntil
(
'
minimizedChatsInitialized
'
).
then
(()
=>
{
await
_converse
.
api
.
waitUntil
(
'
minimizedChatsInitialized
'
);
const
minimized_el
=
_
.
get
(
_converse
.
minimized_chats
,
'
el
'
),
const
minimized_el
=
_
.
get
(
_converse
.
minimized_chats
,
'
el
'
),
new_id
=
newchat
?
newchat
.
model
.
get
(
'
id
'
)
:
null
;
new_id
=
newchat
?
newchat
.
model
.
get
(
'
id
'
)
:
null
;
...
@@ -278,7 +278,6 @@ converse.plugins.add('converse-minimize', {
...
@@ -278,7 +278,6 @@ converse.plugins.add('converse-minimize', {
}
}
}
}
}
}
}).
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
},
},
getOldestMaximizedChat
(
exclude_ids
)
{
getOldestMaximizedChat
(
exclude_ids
)
{
...
...
src/converse-muc-views.js
View file @
37f43989
...
@@ -258,7 +258,7 @@ converse.plugins.add('converse-muc-views', {
...
@@ -258,7 +258,7 @@ converse.plugins.add('converse-muc-views', {
}
else
{
}
else
{
parent_el
.
insertAdjacentHTML
(
'
beforeend
'
,
tpl_spinner
());
parent_el
.
insertAdjacentHTML
(
'
beforeend
'
,
tpl_spinner
());
_converse
.
api
.
disco
.
info
(
ev
.
target
.
getAttribute
(
'
data-room-jid
'
),
null
)
_converse
.
api
.
disco
.
info
(
ev
.
target
.
getAttribute
(
'
data-room-jid
'
),
null
)
.
then
(
(
stanza
)
=>
insertRoomInfo
(
parent_el
,
stanza
))
.
then
(
stanza
=>
insertRoomInfo
(
parent_el
,
stanza
))
.
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
ERROR
));
.
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
ERROR
));
}
}
}
}
...
@@ -1159,7 +1159,7 @@ converse.plugins.add('converse-muc-views', {
...
@@ -1159,7 +1159,7 @@ converse.plugins.add('converse-muc-views', {
*/
*/
this
.
showSpinner
();
this
.
showSpinner
();
this
.
model
.
fetchRoomConfiguration
()
this
.
model
.
fetchRoomConfiguration
()
.
then
(
this
.
renderConfigurationForm
.
bind
(
this
))
.
then
(
iq
=>
this
.
renderConfigurationForm
(
iq
))
.
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
ERROR
));
.
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
ERROR
));
},
},
...
...
src/converse-oauth.js
View file @
37f43989
...
@@ -106,17 +106,16 @@ converse.plugins.add("converse-oauth", {
...
@@ -106,17 +106,16 @@ converse.plugins.add("converse-oauth", {
}));
}));
},
},
fetchOAuthProfileDataAndLogin
()
{
async
fetchOAuthProfileDataAndLogin
()
{
this
.
oauth_service
.
api
(
'
me
'
).
then
((
profile
)
=>
{
const
profile
=
await
this
.
oauth_service
.
api
(
'
me
'
);
const
response
=
this
.
oauth_service
.
getAuthResponse
();
const
response
=
this
.
oauth_service
.
getAuthResponse
();
_converse
.
api
.
user
.
login
({
_converse
.
api
.
user
.
login
({
'
jid
'
:
`
${
profile
.
name
}
@
${
this
.
provider
.
get
(
'
host
'
)}
`
,
'
jid
'
:
`
${
profile
.
name
}
@
${
this
.
provider
.
get
(
'
host
'
)}
`
,
'
password
'
:
response
.
access_token
'
password
'
:
response
.
access_token
});
});
});
},
},
oauthLogin
(
ev
)
{
async
oauthLogin
(
ev
)
{
ev
.
preventDefault
();
ev
.
preventDefault
();
const
id
=
ev
.
target
.
getAttribute
(
'
data-id
'
);
const
id
=
ev
.
target
.
getAttribute
(
'
data-id
'
);
this
.
provider
=
_converse
.
oauth_providers
.
get
(
id
);
this
.
provider
=
_converse
.
oauth_providers
.
get
(
id
);
...
@@ -128,10 +127,8 @@ converse.plugins.add("converse-oauth", {
...
@@ -128,10 +127,8 @@ converse.plugins.add("converse-oauth", {
'
redirect_uri
'
:
'
/redirect.html
'
'
redirect_uri
'
:
'
/redirect.html
'
});
});
this
.
oauth_service
.
login
().
then
(
await
this
.
oauth_service
.
login
();
()
=>
this
.
fetchOAuthProfileDataAndLogin
(),
this
.
fetchOAuthProfileDataAndLogin
();
(
error
)
=>
_converse
.
log
(
error
.
error_message
,
Strophe
.
LogLevel
.
ERROR
)
);
}
}
});
});
}
}
...
...
src/converse-profile.js
View file @
37f43989
...
@@ -11,7 +11,6 @@ import "converse-modal";
...
@@ -11,7 +11,6 @@ import "converse-modal";
import
_FormData
from
"
formdata-polyfill
"
;
import
_FormData
from
"
formdata-polyfill
"
;
import
bootstrap
from
"
bootstrap
"
;
import
bootstrap
from
"
bootstrap
"
;
import
converse
from
"
@converse/headless/converse-core
"
;
import
converse
from
"
@converse/headless/converse-core
"
;
import
tpl_alert
from
"
templates/alert.html
"
;
import
tpl_chat_status_modal
from
"
templates/chat_status_modal.html
"
;
import
tpl_chat_status_modal
from
"
templates/chat_status_modal.html
"
;
import
tpl_profile_modal
from
"
templates/profile_modal.html
"
;
import
tpl_profile_modal
from
"
templates/profile_modal.html
"
;
import
tpl_profile_view
from
"
templates/profile_view.html
"
;
import
tpl_profile_view
from
"
templates/profile_view.html
"
;
...
...
src/converse-rosterview.js
View file @
37f43989
...
@@ -680,15 +680,14 @@ converse.plugins.add('converse-rosterview', {
...
@@ -680,15 +680,14 @@ converse.plugins.add('converse-rosterview', {
this
.
filterOutContacts
(
this
.
getFilterMatches
(
q
,
type
));
this
.
filterOutContacts
(
this
.
getFilterMatches
(
q
,
type
));
},
},
toggle
(
ev
)
{
async
toggle
(
ev
)
{
if
(
ev
&&
ev
.
preventDefault
)
{
ev
.
preventDefault
();
}
if
(
ev
&&
ev
.
preventDefault
)
{
ev
.
preventDefault
();
}
const
icon_el
=
ev
.
target
.
querySelector
(
'
.fa
'
);
const
icon_el
=
ev
.
target
.
querySelector
(
'
.fa
'
);
if
(
_
.
includes
(
icon_el
.
classList
,
"
fa-caret-down
"
))
{
if
(
_
.
includes
(
icon_el
.
classList
,
"
fa-caret-down
"
))
{
this
.
model
.
save
({
state
:
_converse
.
CLOSED
});
this
.
model
.
save
({
state
:
_converse
.
CLOSED
});
this
.
collapse
().
then
(()
=>
{
await
this
.
collapse
();
icon_el
.
classList
.
remove
(
"
fa-caret-down
"
);
icon_el
.
classList
.
remove
(
"
fa-caret-down
"
);
icon_el
.
classList
.
add
(
"
fa-caret-right
"
);
icon_el
.
classList
.
add
(
"
fa-caret-right
"
);
});
}
else
{
}
else
{
icon_el
.
classList
.
remove
(
"
fa-caret-right
"
);
icon_el
.
classList
.
remove
(
"
fa-caret-right
"
);
icon_el
.
classList
.
add
(
"
fa-caret-down
"
);
icon_el
.
classList
.
add
(
"
fa-caret-down
"
);
...
...
src/headless/converse-chatboxes.js
View file @
37f43989
...
@@ -144,8 +144,17 @@ converse.plugins.add('converse-chatboxes', {
...
@@ -144,8 +144,17 @@ converse.plugins.add('converse-chatboxes', {
return
_converse
.
api
.
sendIQ
(
iq
);
return
_converse
.
api
.
sendIQ
(
iq
);
},
},
getRequestSlotURL
()
{
async
getRequestSlotURL
()
{
this
.
sendSlotRequestStanza
().
then
((
stanza
)
=>
{
let
stanza
;
try
{
stanza
=
await
this
.
sendSlotRequestStanza
();
}
catch
(
e
)
{
_converse
.
log
(
e
,
Strophe
.
LogLevel
.
ERROR
);
return
this
.
save
({
'
type
'
:
'
error
'
,
'
message
'
:
__
(
"
Sorry, could not determine upload URL.
"
)
});
}
const
slot
=
stanza
.
querySelector
(
'
slot
'
);
const
slot
=
stanza
.
querySelector
(
'
slot
'
);
if
(
slot
)
{
if
(
slot
)
{
this
.
save
({
this
.
save
({
...
@@ -158,13 +167,6 @@ converse.plugins.add('converse-chatboxes', {
...
@@ -158,13 +167,6 @@ converse.plugins.add('converse-chatboxes', {
'
message
'
:
__
(
"
Sorry, could not determine file upload URL.
"
)
'
message
'
:
__
(
"
Sorry, could not determine file upload URL.
"
)
});
});
}
}
}).
catch
((
e
)
=>
{
_converse
.
log
(
e
,
Strophe
.
LogLevel
.
ERROR
);
return
this
.
save
({
'
type
'
:
'
error
'
,
'
message
'
:
__
(
"
Sorry, could not determine upload URL.
"
)
});
});
},
},
uploadFile
()
{
uploadFile
()
{
...
...
src/headless/converse-disco.js
View file @
37f43989
...
@@ -162,13 +162,14 @@ converse.plugins.add('converse-disco', {
...
@@ -162,13 +162,14 @@ converse.plugins.add('converse-disco', {
});
});
},
},
queryForItems
()
{
async
queryForItems
()
{
if
(
_
.
isEmpty
(
this
.
identities
.
where
({
'
category
'
:
'
server
'
})))
{
if
(
_
.
isEmpty
(
this
.
identities
.
where
({
'
category
'
:
'
server
'
})))
{
// Don't fetch features and items if this is not a
// Don't fetch features and items if this is not a
// server or a conference component.
// server or a conference component.
return
;
return
;
}
}
_converse
.
api
.
disco
.
items
(
this
.
get
(
'
jid
'
)).
then
(
stanza
=>
this
.
onDiscoItems
(
stanza
));
const
stanza
=
await
_converse
.
api
.
disco
.
items
(
this
.
get
(
'
jid
'
));
this
.
onDiscoItems
(
stanza
);
},
},
onInfo
(
stanza
)
{
onInfo
(
stanza
)
{
...
@@ -268,7 +269,7 @@ converse.plugins.add('converse-disco', {
...
@@ -268,7 +269,7 @@ converse.plugins.add('converse-disco', {
_converse
.
emit
(
'
streamFeaturesAdded
'
);
_converse
.
emit
(
'
streamFeaturesAdded
'
);
}
}
function
initializeDisco
()
{
async
function
initializeDisco
()
{
addClientFeatures
();
addClientFeatures
();
_converse
.
connection
.
addHandler
(
onDiscoInfoRequest
,
Strophe
.
NS
.
DISCO_INFO
,
'
iq
'
,
'
get
'
,
null
,
null
);
_converse
.
connection
.
addHandler
(
onDiscoInfoRequest
,
Strophe
.
NS
.
DISCO_INFO
,
'
iq
'
,
'
get
'
,
null
,
null
);
...
@@ -277,14 +278,13 @@ converse.plugins.add('converse-disco', {
...
@@ -277,14 +278,13 @@ converse.plugins.add('converse-disco', {
b64_sha1
(
`converse.disco-entities-
${
_converse
.
bare_jid
}
`
)
b64_sha1
(
`converse.disco-entities-
${
_converse
.
bare_jid
}
`
)
);
);
_converse
.
disco_entities
.
fetchEntities
().
then
((
collection
)
=>
{
const
collection
=
await
_converse
.
disco_entities
.
fetchEntities
();
if
(
collection
.
length
===
0
||
!
collection
.
get
(
_converse
.
domain
))
{
if
(
collection
.
length
===
0
||
!
collection
.
get
(
_converse
.
domain
))
{
// If we don't have an entity for our own XMPP server,
// If we don't have an entity for our own XMPP server,
// create one.
// create one.
_converse
.
disco_entities
.
create
({
'
jid
'
:
_converse
.
domain
});
_converse
.
disco_entities
.
create
({
'
jid
'
:
_converse
.
domain
});
}
}
_converse
.
emit
(
'
discoInitialized
'
);
_converse
.
emit
(
'
discoInitialized
'
);
}).
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
}
}
_converse
.
api
.
listen
.
on
(
'
sessionInitialized
'
,
initStreamFeatures
);
_converse
.
api
.
listen
.
on
(
'
sessionInitialized
'
,
initStreamFeatures
);
...
@@ -513,9 +513,8 @@ converse.plugins.add('converse-disco', {
...
@@ -513,9 +513,8 @@ converse.plugins.add('converse-disco', {
* @param {boolean} [create] Whether the entity should be created if it doesn't exist.
* @param {boolean} [create] Whether the entity should be created if it doesn't exist.
* @example _converse.api.disco.entities.get(jid);
* @example _converse.api.disco.entities.get(jid);
*/
*/
'
get
'
(
jid
,
create
=
false
)
{
async
'
get
'
(
jid
,
create
=
false
)
{
return
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
)
await
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
);
.
then
(()
=>
{
if
(
_
.
isNil
(
jid
))
{
if
(
_
.
isNil
(
jid
))
{
return
_converse
.
disco_entities
;
return
_converse
.
disco_entities
;
}
}
...
@@ -524,7 +523,6 @@ converse.plugins.add('converse-disco', {
...
@@ -524,7 +523,6 @@ converse.plugins.add('converse-disco', {
return
entity
;
return
entity
;
}
}
return
_converse
.
disco_entities
.
create
({
'
jid
'
:
jid
});
return
_converse
.
disco_entities
.
create
({
'
jid
'
:
jid
});
});
}
}
},
},
...
@@ -559,20 +557,19 @@ converse.plugins.add('converse-disco', {
...
@@ -559,20 +557,19 @@ converse.plugins.add('converse-disco', {
* );
* );
* });
* });
*/
*/
'
supports
'
(
feature
,
jid
)
{
async
'
supports
'
(
feature
,
jid
)
{
if
(
_
.
isNil
(
jid
))
{
if
(
_
.
isNil
(
jid
))
{
throw
new
TypeError
(
'
api.disco.supports: You need to provide an entity JID
'
);
throw
new
TypeError
(
'
api.disco.supports: You need to provide an entity JID
'
);
}
}
return
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
)
await
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
);
.
then
(()
=>
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
))
let
entity
=
await
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
);
.
then
(
entity
=>
entity
.
waitUntilFeaturesDiscovered
)
entity
=
await
entity
.
waitUntilFeaturesDiscovered
;
.
then
(
entity
=>
{
const
promises
=
_
.
concat
(
const
promises
=
_
.
concat
(
entity
.
items
.
map
(
item
=>
item
.
hasFeature
(
feature
)),
entity
.
items
.
map
(
item
=>
item
.
hasFeature
(
feature
)),
entity
.
hasFeature
(
feature
)
entity
.
hasFeature
(
feature
)
);
);
return
Promise
.
all
(
promises
);
const
result
=
await
Promise
.
all
(
promises
);
}).
then
(
result
=>
f
.
filter
(
f
.
isObject
,
result
)
);
return
f
.
filter
(
f
.
isObject
,
result
);
},
},
/**
/**
...
@@ -585,21 +582,18 @@ converse.plugins.add('converse-disco', {
...
@@ -585,21 +582,18 @@ converse.plugins.add('converse-disco', {
* @example
* @example
* await _converse.api.disco.refreshFeatures('room@conference.example.org');
* await _converse.api.disco.refreshFeatures('room@conference.example.org');
*/
*/
'
refreshFeatures
'
(
jid
)
{
async
'
refreshFeatures
'
(
jid
)
{
if
(
_
.
isNil
(
jid
))
{
if
(
_
.
isNil
(
jid
))
{
throw
new
TypeError
(
'
api.disco.refreshFeatures: You need to provide an entity JID
'
);
throw
new
TypeError
(
'
api.disco.refreshFeatures: You need to provide an entity JID
'
);
}
}
return
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
)
await
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
);
.
then
(()
=>
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
))
const
entity
=
await
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
);
.
then
(
entity
=>
{
entity
.
features
.
reset
();
entity
.
features
.
reset
();
entity
.
fields
.
reset
();
entity
.
fields
.
reset
();
entity
.
identities
.
reset
();
entity
.
identities
.
reset
();
entity
.
waitUntilFeaturesDiscovered
=
utils
.
getResolveablePromise
()
entity
.
waitUntilFeaturesDiscovered
=
utils
.
getResolveablePromise
()
entity
.
queryInfo
();
entity
.
queryInfo
();
return
entity
.
waitUntilFeaturesDiscovered
;
return
entity
.
waitUntilFeaturesDiscovered
;
})
.
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
},
},
/**
/**
...
@@ -611,15 +605,14 @@ converse.plugins.add('converse-disco', {
...
@@ -611,15 +605,14 @@ converse.plugins.add('converse-disco', {
* @example
* @example
* const features = await _converse.api.disco.getFeatures('room@conference.example.org');
* const features = await _converse.api.disco.getFeatures('room@conference.example.org');
*/
*/
'
getFeatures
'
(
jid
)
{
async
'
getFeatures
'
(
jid
)
{
if
(
_
.
isNil
(
jid
))
{
if
(
_
.
isNil
(
jid
))
{
throw
new
TypeError
(
'
api.disco.getFeatures: You need to provide an entity JID
'
);
throw
new
TypeError
(
'
api.disco.getFeatures: You need to provide an entity JID
'
);
}
}
return
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
)
await
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
);
.
then
(()
=>
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
))
let
entity
=
await
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
);
.
then
(
entity
=>
entity
.
waitUntilFeaturesDiscovered
)
entity
=
await
entity
.
waitUntilFeaturesDiscovered
;
.
then
(
entity
=>
entity
.
features
)
return
entity
.
features
;
.
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
},
},
/**
/**
...
@@ -633,15 +626,14 @@ converse.plugins.add('converse-disco', {
...
@@ -633,15 +626,14 @@ converse.plugins.add('converse-disco', {
* @example
* @example
* const fields = await _converse.api.disco.getFields('room@conference.example.org');
* const fields = await _converse.api.disco.getFields('room@conference.example.org');
*/
*/
'
getFields
'
(
jid
)
{
async
'
getFields
'
(
jid
)
{
if
(
_
.
isNil
(
jid
))
{
if
(
_
.
isNil
(
jid
))
{
throw
new
TypeError
(
'
api.disco.getFields: You need to provide an entity JID
'
);
throw
new
TypeError
(
'
api.disco.getFields: You need to provide an entity JID
'
);
}
}
return
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
)
await
_converse
.
api
.
waitUntil
(
'
discoInitialized
'
);
.
then
(()
=>
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
))
let
entity
=
await
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
);
.
then
(
entity
=>
entity
.
waitUntilFeaturesDiscovered
)
entity
=
await
entity
.
waitUntilFeaturesDiscovered
;
.
then
(
entity
=>
entity
.
fields
)
return
entity
.
fields
;
.
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
},
},
/**
/**
...
@@ -675,8 +667,9 @@ converse.plugins.add('converse-disco', {
...
@@ -675,8 +667,9 @@ converse.plugins.add('converse-disco', {
* }
* }
* ).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
* ).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
*/
*/
'
getIdentity
'
(
category
,
type
,
jid
)
{
async
'
getIdentity
'
(
category
,
type
,
jid
)
{
return
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
).
then
(
e
=>
e
.
getIdentity
(
category
,
type
));
const
e
=
await
_converse
.
api
.
disco
.
entities
.
get
(
jid
,
true
);
return
e
.
getIdentity
(
category
,
type
);
}
}
}
}
});
});
...
...
src/headless/converse-muc.js
View file @
37f43989
...
@@ -109,20 +109,18 @@ converse.plugins.add('converse-muc', {
...
@@ -109,20 +109,18 @@ converse.plugins.add('converse-muc', {
_converse
.
api
.
promises
.
add
([
'
roomsAutoJoined
'
]);
_converse
.
api
.
promises
.
add
([
'
roomsAutoJoined
'
]);
function
openRoom
(
jid
)
{
async
function
openRoom
(
jid
)
{
if
(
!
u
.
isValidMUCJID
(
jid
))
{
if
(
!
u
.
isValidMUCJID
(
jid
))
{
return
_converse
.
log
(
return
_converse
.
log
(
`Invalid JID "
${
jid
}
" provided in URL fragment`
,
`Invalid JID "
${
jid
}
" provided in URL fragment`
,
Strophe
.
LogLevel
.
WARN
Strophe
.
LogLevel
.
WARN
);
);
}
}
const
promises
=
[
_converse
.
api
.
waitUntil
(
'
roomsAutoJoined
'
)]
await
_converse
.
api
.
waitUntil
(
'
roomsAutoJoined
'
);
if
(
_converse
.
allow_bookmarks
)
{
if
(
_converse
.
allow_bookmarks
)
{
promises
.
push
(
_converse
.
api
.
waitUntil
(
'
bookmarksInitialized
'
)
);
await
_converse
.
api
.
waitUntil
(
'
bookmarksInitialized
'
);
}
}
Promise
.
all
(
promises
).
then
(()
=>
{
_converse
.
api
.
rooms
.
open
(
jid
);
_converse
.
api
.
rooms
.
open
(
jid
);
});
}
}
_converse
.
router
.
route
(
'
converse/room?jid=:jid
'
,
openRoom
);
_converse
.
router
.
route
(
'
converse/room?jid=:jid
'
,
openRoom
);
...
@@ -762,7 +760,7 @@ converse.plugins.add('converse-muc', {
...
@@ -762,7 +760,7 @@ converse.plugins.add('converse-muc', {
}
}
},
},
checkForReservedNick
()
{
async
checkForReservedNick
()
{
/* Use service-discovery to ask the XMPP server whether
/* Use service-discovery to ask the XMPP server whether
* this user has a reserved nickname for this groupchat.
* this user has a reserved nickname for this groupchat.
* If so, we'll use that, otherwise we render the nickname form.
* If so, we'll use that, otherwise we render the nickname form.
...
@@ -771,7 +769,7 @@ converse.plugins.add('converse-muc', {
...
@@ -771,7 +769,7 @@ converse.plugins.add('converse-muc', {
* (Function) callback: Callback upon succesful IQ response
* (Function) callback: Callback upon succesful IQ response
* (Function) errback: Callback upon error IQ response
* (Function) errback: Callback upon error IQ response
*/
*/
return
_converse
.
api
.
sendIQ
(
const
iq
=
await
_converse
.
api
.
sendIQ
(
$iq
({
$iq
({
'
to
'
:
this
.
get
(
'
jid
'
),
'
to
'
:
this
.
get
(
'
jid
'
),
'
from
'
:
_converse
.
connection
.
jid
,
'
from
'
:
_converse
.
connection
.
jid
,
...
@@ -780,7 +778,7 @@ converse.plugins.add('converse-muc', {
...
@@ -780,7 +778,7 @@ converse.plugins.add('converse-muc', {
'
xmlns
'
:
Strophe
.
NS
.
DISCO_INFO
,
'
xmlns
'
:
Strophe
.
NS
.
DISCO_INFO
,
'
node
'
:
'
x-roomuser-item
'
'
node
'
:
'
x-roomuser-item
'
})
})
)
.
then
(
iq
=>
{
)
;
const
identity_el
=
iq
.
querySelector
(
'
query[node="x-roomuser-item"] identity
'
),
const
identity_el
=
iq
.
querySelector
(
'
query[node="x-roomuser-item"] identity
'
),
nick
=
identity_el
?
identity_el
.
getAttribute
(
'
name
'
)
:
null
;
nick
=
identity_el
?
identity_el
.
getAttribute
(
'
name
'
)
:
null
;
this
.
save
({
this
.
save
({
...
@@ -788,7 +786,6 @@ converse.plugins.add('converse-muc', {
...
@@ -788,7 +786,6 @@ converse.plugins.add('converse-muc', {
'
nick
'
:
nick
'
nick
'
:
nick
},
{
'
silent
'
:
true
});
},
{
'
silent
'
:
true
});
return
iq
;
return
iq
;
});
},
},
async
registerNickname
()
{
async
registerNickname
()
{
...
@@ -939,7 +936,7 @@ converse.plugins.add('converse-muc', {
...
@@ -939,7 +936,7 @@ converse.plugins.add('converse-muc', {
}
}
},
},
onMessage
(
stanza
)
{
async
onMessage
(
stanza
)
{
/* Handler for all MUC messages sent to this groupchat.
/* Handler for all MUC messages sent to this groupchat.
*
*
* Parameters:
* Parameters:
...
@@ -968,9 +965,8 @@ converse.plugins.add('converse-muc', {
...
@@ -968,9 +965,8 @@ converse.plugins.add('converse-muc', {
const
subject
=
_
.
propertyOf
(
subject_el
)(
'
textContent
'
)
||
''
;
const
subject
=
_
.
propertyOf
(
subject_el
)(
'
textContent
'
)
||
''
;
u
.
safeSave
(
this
,
{
'
subject
'
:
{
'
author
'
:
sender
,
'
text
'
:
subject
}});
u
.
safeSave
(
this
,
{
'
subject
'
:
{
'
author
'
:
sender
,
'
text
'
:
subject
}});
}
}
this
.
createMessage
(
stanza
,
original_stanza
)
const
msg
=
await
this
.
createMessage
(
stanza
,
original_stanza
);
.
then
(
msg
=>
this
.
incrementUnreadMsgCounter
(
msg
))
this
.
incrementUnreadMsgCounter
(
msg
);
.
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
FATAL
));
}
}
if
(
sender
!==
this
.
get
(
'
nick
'
))
{
if
(
sender
!==
this
.
get
(
'
nick
'
))
{
// We only emit an event if it's not our own message
// We only emit an event if it's not our own message
...
@@ -1141,9 +1137,8 @@ converse.plugins.add('converse-muc', {
...
@@ -1141,9 +1137,8 @@ converse.plugins.add('converse-muc', {
}
}
},
},
fetchMembers
()
{
async
fetchMembers
()
{
this
.
chatroom
.
getJidsWithAffiliations
([
'
member
'
,
'
owner
'
,
'
admin
'
])
const
new_members
=
await
this
.
chatroom
.
getJidsWithAffiliations
([
'
member
'
,
'
owner
'
,
'
admin
'
]);
.
then
(
new_members
=>
{
const
new_jids
=
new_members
.
map
(
m
=>
m
.
jid
).
filter
(
m
=>
!
_
.
isUndefined
(
m
)),
const
new_jids
=
new_members
.
map
(
m
=>
m
.
jid
).
filter
(
m
=>
!
_
.
isUndefined
(
m
)),
new_nicks
=
new_members
.
map
(
m
=>
!
m
.
jid
&&
m
.
nick
||
undefined
).
filter
(
m
=>
!
_
.
isUndefined
(
m
)),
new_nicks
=
new_members
.
map
(
m
=>
!
m
.
jid
&&
m
.
nick
||
undefined
).
filter
(
m
=>
!
_
.
isUndefined
(
m
)),
removed_members
=
this
.
filter
(
m
=>
{
removed_members
=
this
.
filter
(
m
=>
{
...
@@ -1171,7 +1166,6 @@ converse.plugins.add('converse-muc', {
...
@@ -1171,7 +1166,6 @@ converse.plugins.add('converse-muc', {
this
.
create
(
attrs
);
this
.
create
(
attrs
);
}
}
});
});
}).
catch
(
_
.
partial
(
_converse
.
log
,
_
,
Strophe
.
LogLevel
.
ERROR
));
},
},
findOccupant
(
data
)
{
findOccupant
(
data
)
{
...
...
src/headless/utils/core.js
View file @
37f43989
...
@@ -333,14 +333,6 @@ u.replaceCurrentWord = function (input, new_value) {
...
@@ -333,14 +333,6 @@ u.replaceCurrentWord = function (input, new_value) {
input
.
selectionEnd
=
cursor
-
current_word
.
length
+
new_value
.
length
+
1
;
input
.
selectionEnd
=
cursor
-
current_word
.
length
+
new_value
.
length
+
1
;
};
};
u
.
isVisible
=
function
(
el
)
{
if
(
u
.
hasClass
(
'
hidden
'
,
el
))
{
return
false
;
}
// XXX: Taken from jQuery's "visible" implementation
return
el
.
offsetWidth
>
0
||
el
.
offsetHeight
>
0
||
el
.
getClientRects
().
length
>
0
;
};
u
.
triggerEvent
=
function
(
el
,
name
,
type
=
"
Event
"
,
bubbles
=
true
,
cancelable
=
true
)
{
u
.
triggerEvent
=
function
(
el
,
name
,
type
=
"
Event
"
,
bubbles
=
true
,
cancelable
=
true
)
{
const
evt
=
document
.
createEvent
(
type
);
const
evt
=
document
.
createEvent
(
type
);
evt
.
initEvent
(
name
,
bubbles
,
cancelable
);
evt
.
initEvent
(
name
,
bubbles
,
cancelable
);
...
...
src/templates/alert.html
View file @
37f43989
<div
class=
"alert {{{o.type}}}"
role=
"alert"
>
{{{o.message}}}
</div>
<div
class=
"alert {{{o.type}}}"
role=
"alert"
>
<p>
{{{o.message}}}
</p>
</div>
src/utils/html.js
View file @
37f43989
...
@@ -500,6 +500,15 @@ function afterAnimationEnds (el, callback) {
...
@@ -500,6 +500,15 @@ function afterAnimationEnds (el, callback) {
}
}
}
}
u
.
isVisible
=
function
(
el
)
{
if
(
u
.
hasClass
(
'
hidden
'
,
el
))
{
return
false
;
}
// XXX: Taken from jQuery's "visible" implementation
return
el
.
offsetWidth
>
0
||
el
.
offsetHeight
>
0
||
el
.
getClientRects
().
length
>
0
;
};
u
.
fadeIn
=
function
(
el
,
callback
)
{
u
.
fadeIn
=
function
(
el
,
callback
)
{
if
(
_
.
isNil
(
el
))
{
if
(
_
.
isNil
(
el
))
{
logger
.
warn
(
"
Undefined or null element passed into fadeIn
"
);
logger
.
warn
(
"
Undefined or null element passed into fadeIn
"
);
...
...
tests/runner.js
View file @
37f43989
...
@@ -179,7 +179,6 @@ require.config(config);
...
@@ -179,7 +179,6 @@ require.config(config);
var
specs
=
[
var
specs
=
[
"
jasmine
"
,
"
jasmine
"
,
//"spec/transcripts",
//"spec/transcripts",
//"spec/otr",
"
spec/spoilers
"
,
"
spec/spoilers
"
,
"
spec/profiling
"
,
"
spec/profiling
"
,
"
spec/utils
"
,
"
spec/utils
"
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment