Skip to content

Commit ba7c6d7

Browse files
committed
Let HeadlinesHeading use CustomElement
1 parent 7e2dd55 commit ba7c6d7

File tree

7 files changed

+66
-32
lines changed

7 files changed

+66
-32
lines changed

src/plugins/chatview/heading.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,14 @@ import './styles/chat-head.scss';
99

1010
export default class ChatHeading extends CustomElement {
1111

12+
static get properties () {
13+
return {
14+
'jid': { type: String },
15+
}
16+
}
17+
1218
initialize () {
13-
this.model = _converse.chatboxes.get(this.getAttribute('jid'));
19+
this.model = _converse.chatboxes.get(this.jid);
1420
this.listenTo(this.model, 'change:status', this.requestUpdate);
1521
this.listenTo(this.model, 'vcard:add', this.requestUpdate);
1622
this.listenTo(this.model, 'vcard:change', this.requestUpdate);

src/plugins/headlines-view/heading.js

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,31 @@
11
import tpl_chat_head from './templates/chat-head.js';
2-
import { ElementView } from '@converse/skeletor/src/element.js';
2+
import { CustomElement } from 'shared/components/element.js';
33
import { __ } from 'i18n';
4-
import { _converse, api } from "@converse/headless/core";
5-
import { getHeadingDropdownItem, getHeadingStandaloneButton } from 'plugins/chatview/utils.js';
6-
import { render } from 'lit';
4+
import { _converse, api } from "@converse/headless/core.js";
75

86

9-
export default class HeadlinesHeading extends ElementView {
7+
export default class HeadlinesHeading extends CustomElement {
108

11-
async connectedCallback () {
12-
super.connectedCallback();
13-
this.model = _converse.chatboxes.get(this.getAttribute('jid'));
14-
await this.model.initialized;
15-
this.render();
9+
static get properties () {
10+
return {
11+
'jid': { type: String },
12+
}
1613
}
1714

18-
async render () {
19-
const tpl = await this.generateHeadingTemplate();
20-
render(tpl, this);
15+
async initialize () {
16+
this.model = _converse.chatboxes.get(this.jid);
17+
await this.model.initialized;
18+
this.requestUpdate();
2119
}
2220

23-
async generateHeadingTemplate () {
24-
const heading_btns = await this.getHeadingButtons();
25-
const standalone_btns = heading_btns.filter(b => b.standalone);
26-
const dropdown_btns = heading_btns.filter(b => !b.standalone);
27-
return tpl_chat_head(
28-
Object.assign(this.model.toJSON(), {
21+
render () {
22+
return tpl_chat_head({
23+
...this.model.toJSON(),
24+
...{
2925
'display_name': this.model.getDisplayName(),
30-
'dropdown_btns': dropdown_btns.map(b => getHeadingDropdownItem(b)),
31-
'standalone_btns': standalone_btns.map(b => getHeadingStandaloneButton(b))
32-
})
33-
);
26+
'heading_buttons_promise': this.getHeadingButtons()
27+
}
28+
});
3429
}
3530

3631
/**

src/plugins/headlines-view/templates/chat-head.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,35 @@
11
import { _converse } from '@converse/headless/core';
22
import { html } from "lit";
33
import { until } from 'lit/directives/until.js';
4+
import { getHeadingDropdownItem, getHeadingStandaloneButton } from 'plugins/chatview/utils.js';
45

56

67
export default (o) => {
7-
const tpl_standalone_btns = (o) => o.standalone_btns.reverse().map(b => until(b, ''));
8+
const standalone_btns_promise = o.heading_buttons_promise.then(
9+
btns => btns
10+
.filter(b => b.standalone)
11+
.map(b => getHeadingStandaloneButton(b))
12+
.reverse()
13+
.map(b => until(b, '')));
14+
15+
const dropdown_btns_promise = o.heading_buttons_promise.then(
16+
btns => {
17+
const dropdown_btns = btns
18+
.filter(b => !b.standalone)
19+
.map(b => getHeadingDropdownItem(b));
20+
return dropdown_btns.length ? html`<converse-dropdown class="dropleft" .items=${dropdown_btns}></converse-dropdown>` : '';
21+
}
22+
);
23+
824
return html`
925
<div class="chatbox-title ${ o.status ? '' : "chatbox-title--no-desc"}">
1026
<div class="chatbox-title--row">
1127
${ (!_converse.api.settings.get("singleton")) ? html`<converse-controlbox-navback jid="${o.jid}"></converse-controlbox-navback>` : '' }
1228
<div class="chatbox-title__text" title="${o.jid}">${ o.display_name }</div>
1329
</div>
1430
<div class="chatbox-title__buttons row no-gutters">
15-
${ o.dropdown_btns.length ? html`<converse-dropdown class="dropleft" .items=${o.dropdown_btns}></converse-dropdown>` : '' }
16-
${ o.standalone_btns.length ? tpl_standalone_btns(o) : '' }
31+
${ until(dropdown_btns_promise, '') }
32+
${ until(standalone_btns_promise, '') }
1733
</div>
1834
</div>
1935
${ o.status ? html`<p class="chat-head__desc">${ o.status }</p>` : '' }

src/plugins/headlines-view/tests/headline.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ describe("A headlines box", function () {
2626
.c('nick', {'xmlns': "http://jabber.org/protocol/nick"}).t("-wwdmz").up()
2727
.c('body').t('SORRY FOR THIS ADVERT');
2828
_converse.connection._dataRecv(mock.createRequest(stanza));
29-
expect(_converse.api.headlines.get().length === 0);
29+
await new Promise(resolve => setTimeout(resolve, 100));
30+
const headlines = await _converse.api.headlines.get();
31+
expect(headlines.length).toBe(0);
3032
}));
3133

3234
it("will open and display headline messages", mock.initConverse(
@@ -71,8 +73,8 @@ describe("A headlines box", function () {
7173
await mock.waitForRoster(_converse, 'current', 1);
7274
await mock.openControlBox(_converse);
7375

74-
const sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@montague.lit';
75-
await mock.openChatBoxFor(_converse, sender_jid);
76+
const sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@montague.lit';
77+
await mock.openChatBoxFor(_converse, sender_jid);
7678

7779
const { u, $msg} = converse.env;
7880
/* <message from='notify.example.com'

src/plugins/minimize/styles/minimize.scss

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@
7575
color: var(--chatroom-head-color);
7676
}
7777
}
78+
.chat-head-headline {
79+
background-color: var(--headline-head-bg-color);
80+
a.restore-chat {
81+
color: var(--headline-head-text-color);
82+
}
83+
}
84+
7885
&.minimized {
7986
height: auto;
8087
}

src/plugins/minimize/templates/trimmed_chat.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,15 @@ import { __ } from 'i18n';
44

55
export default (o) => {
66
const i18n_tooltip = __('Click to restore this chat');
7-
const close_color = o.type === 'chatroom' ? "var(--chatroom-head-color)" : "var(--chat-head-text-color)";
7+
let close_color;
8+
if (o.type === 'chatroom') {
9+
close_color = "var(--chatroom-head-color)";
10+
} else if (o.type === 'headline') {
11+
close_color = "var(--headline-head-text-color)";
12+
} else {
13+
close_color = "var(--chat-head-text-color)";
14+
}
15+
816
return html`
917
<div class="chat-head-${o.type} chat-head row no-gutters">
1018
<a class="restore-chat w-100 align-self-center" title="${i18n_tooltip}" @click=${o.restore}>

src/shared/components/dropdown.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'shared/components/icons.js';
22
import DOMNavigator from "shared/dom-navigator.js";
33
import DropdownBase from 'shared/components/dropdownbase.js';
44
import { KEYCODES } from '@converse/headless/shared/constants.js';
5-
import { api } from "@converse/headless/core";
5+
import { api } from "@converse/headless/core.js";
66
import { html } from 'lit';
77
import { until } from 'lit/directives/until.js';
88

0 commit comments

Comments
 (0)