Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update chat messages component to use stimulus 2 syntax #681

Merged
merged 6 commits into from Feb 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 6 additions & 2 deletions app/components/chat_message/chat_message.html.erb
@@ -1,8 +1,12 @@
<div
class="<%= class_attr %>"
data-controller="chat-message"
data-chat-message-id="<%= message.id %>"
data-chat-message-sender-name="<%= message.sender&.name %>"
data-chat-message-id-value="<%= message.id %>"
data-chat-message-sender-name-value="<%= message.sender&.name %>"
data-chat-message-truncated-class="ChatMessage--truncated"
data-chat-message-expanded-class="ChatMessage--expanded"
data-chat-message-copied-class="ChatMessage--copied"
data-chat-message-highlighted-class="ChatMessage--highlighted"
id="<%= id %>"
>
<div class="ChatMessage-text" data-chat-message-target="text">
Expand Down
28 changes: 16 additions & 12 deletions app/components/chat_message/chat_message.js
Expand Up @@ -5,10 +5,14 @@ const SUCCESS_NOTIFICATION_DURATION = 2000;

export default class extends Controller {
static targets = ['text', 'toggleExpanded'];

static classes = ['truncated', 'expanded', 'copied', 'highlighted'];
static values = {
senderName: String,
id: String,
};
connect() {
if (this.isTruncated()) {
this.element.classList.add('ChatMessage--truncated');
this.element.classList.add(this.truncatedClass);
this.collapse();
}
}
Expand All @@ -18,7 +22,7 @@ export default class extends Controller {
}

isExpanded() {
return this.element.classList.contains('ChatMessage--expanded');
return this.element.classList.contains(this.expandedClass);
}

toggleExpanded() {
Expand All @@ -30,18 +34,18 @@ export default class extends Controller {
}

expand() {
this.element.classList.add('ChatMessage--expanded');
this.element.classList.add(this.expandedClass);
this.toggleExpandedTarget.setAttribute('aria-expanded', 'true');
}

collapse() {
this.element.classList.remove('ChatMessage--expanded');
this.element.classList.remove(this.expandedClass);
this.toggleExpandedTarget.setAttribute('aria-expanded', 'false');
}

copy() {
const text = this.textTarget.innerText;
const sender = this.data.get('sender-name');
const sender = this.senderNameValue;
let clipboardText = `${sender}: ${text}`;

if (!sender) {
Expand All @@ -52,20 +56,20 @@ export default class extends Controller {
}

onCopy() {
this.element.classList.add('ChatMessage--copied');
this.element.classList.add(this.copiedClass);

setTimeout(() => {
this.element.classList.remove('ChatMessage--copied');
this.element.classList.remove(this.copiedClass);
}, SUCCESS_NOTIFICATION_DURATION);
}

isHighlighted() {
return this.element.classList.contains('ChatMessage--highlighted');
return this.element.classList.contains(this.highlightedClass);
}

toggleHighlighted() {
Rails.ajax({
url: `/messages/${this.data.get('id')}/highlight`,
url: `/messages/${this.idValue}/highlight`,
type: 'POST',
data: `highlighted=${!this.isHighlighted()}`,
});
Expand All @@ -78,10 +82,10 @@ export default class extends Controller {
}

highlight() {
this.element.classList.add('ChatMessage--highlighted');
this.element.classList.add(this.highlightedClass);
}

unhighlight() {
this.element.classList.remove('ChatMessage--highlighted');
this.element.classList.remove(this.highlightedClass);
}
}
2 changes: 1 addition & 1 deletion app/components/request_form/request_form.html.erb
Expand Up @@ -5,7 +5,7 @@
class: 'RequestForm',
data: {
controller: 'request-form',
request_form_members_count_message: I18n.t('request.form.members_count_message').to_json
request_form_members_count_message_value: I18n.t('request.form.members_count_message').to_json
}
) do %>
<div class="RequestForm-column" data-action="input->request-form#updatePreview">
Expand Down
5 changes: 4 additions & 1 deletion app/components/request_form/request_form.js
Expand Up @@ -9,6 +9,9 @@ const template = ({ message, notes }) => {

export default class extends Controller {
static targets = ['preview', 'message', 'membersCount'];
static values = {
membersCountMessage: String,
};

connect() {
this.updatePreview();
Expand All @@ -29,7 +32,7 @@ export default class extends Controller {
return;
}

const messageTemplates = JSON.parse(this.data.get('members-count-message'));
const messageTemplates = JSON.parse(this.membersCountMessageValue);
const tags = event.detail.tags;

Rails.ajax({
Expand Down
@@ -1,9 +1,9 @@
<div
class="RequestNotification"
data-controller="request-notification"
data-request-notification-id="<%= request.id %>"
data-request-notification-last-updated-at="<%= last_updated_at %>"
data-request-notification-message-template="<%= t('components.request_notification.message_template').to_json %>"
data-request-notification-id-value="<%= request.id %>"
data-request-notification-last-updated-at-value="<%= last_updated_at %>"
data-request-notification-message-template-value="<%= t('components.request_notification.message_template').to_json %>"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

eww, JSON inside HTML attributes. Well it was there before.

hidden
>
<%= c 'notification', show_close: false do %>
Expand Down
12 changes: 8 additions & 4 deletions app/components/request_notification/request_notification.js
Expand Up @@ -5,20 +5,24 @@ const POLLING_INTERVAL = 1000 * 30;

export default class extends Controller {
static targets = ['text'];
static values = {
id: String,
lastUpdatedAt: String,
messageTemplate: String,
};

connect() {
this.lastUpdatedAt = this.data.get('last-updated-at');
this.messageTemplate = JSON.parse(this.data.get('message-template'));
this.messageTemplate = JSON.parse(this.messageTemplateValue);
this.fetchMessages();
setInterval(() => this.fetchMessages(), POLLING_INTERVAL);
}

fetchMessages() {
Rails.ajax({
url: `/requests/${this.data.get('id')}/notifications`,
url: `/requests/${this.idValue}/notifications`,
type: 'GET',
data: new URLSearchParams({
last_updated_at: this.lastUpdatedAt,
last_updated_at: this.lastUpdatedAtValue,
}).toString(),
success: ({ message_count }) => {
if (message_count == 0) {
Expand Down
6 changes: 3 additions & 3 deletions app/components/tags_input/tags_input.html.erb
@@ -1,9 +1,9 @@
<div
class="TagsInput"
data-controller="tags-input"
data-tags-input-available-tags="<%= available_tags %>"
data-tags-input-allow-new="<%= allow_new %>"
data-tags-input-members-label="<%= I18n.t('contributor.contributor').to_json %>"
data-tags-input-available-tags-value="<%= available_tags %>"
data-tags-input-allow-new-value="<%= allow_new %>"
data-tags-input-members-label-value="<%= I18n.t('contributor.contributor').to_json %>"
>
<%= c 'input', value: value, stimulus_controller: 'tags-input', stimulus_target: 'input', **props %>
</div>
12 changes: 8 additions & 4 deletions app/components/tags_input/tags_input.js
Expand Up @@ -37,15 +37,20 @@ function transformTag(tagData) {

export default class extends Controller {
static targets = ['input'];
static values = {
availableTags: String,
allowNew: Boolean,
membersLabel: String,
};

connect() {
this.tagify = new Tagify(this.inputTarget, {
originalInputValueFormat: tags => {
return tags.map(tag => tag.value).join(',');
},

whitelist: JSON.parse(this.data.get('available-tags')),
enforceWhitelist: !JSON.parse(this.data.get('allow-new')),
whitelist: JSON.parse(this.availableTagsValue),
enforceWhitelist: !this.allowNewValue,

dropdown: {
classname: 'TagsInput-dropdown',
Expand All @@ -58,9 +63,8 @@ export default class extends Controller {
},

transformTag,

labels: {
members: JSON.parse(this.data.get('members-label')),
members: JSON.parse(this.membersLabelValue),
},
});

Expand Down