Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions app/javascript/controllers/form_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,21 @@ export default class extends Controller {
debounceTimeout: { type: Number, default: 300 }
}

#isComposing = false

initialize() {
this.debouncedSubmit = debounce(this.debouncedSubmit.bind(this), this.debounceTimeoutValue)
}

// IME Composition tracking
compositionStart() {
this.#isComposing = true
}

compositionEnd() {
this.#isComposing = false
}

submit() {
this.element.requestSubmit()
}
Expand All @@ -32,6 +43,12 @@ export default class extends Controller {
}
}

preventComposingSubmit(event) {
if (this.#isComposing) {
event.preventDefault()
}
}

debouncedSubmit(event) {
this.submit(event)
}
Expand Down
3 changes: 3 additions & 0 deletions app/javascript/controllers/navigable_list_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,9 @@ export default class extends Controller {
}
},
Enter(event) {
// Skip handling during IME composition (e.g., Japanese input)
if (event.isComposing) { return }

if (event.shiftKey) {
this.#toggleCurrentItem(event)
} else {
Expand Down
4 changes: 2 additions & 2 deletions app/views/cards/comments/reactions/new.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
<%= form_with model: [ @comment.card, @comment, Reaction.new ],
class: "reaction reaction__form expanded",
html: { aria: { label: "New reaction" } },
data: { controller: "form reaction-emoji", turbo_frame: dom_id(@comment, :reacting), action: "keydown.esc->form#cancel submit->form#preventEmptySubmit" } do |form| %>
data: { controller: "form reaction-emoji", turbo_frame: dom_id(@comment, :reacting), action: "keydown.esc->form#cancel submit->form#preventEmptySubmit submit->form#preventComposingSubmit" } do |form| %>
<label class="reaction__form-label flex gap" style="--column-gap: 0.4ch;">
<figure class="reaction__avatar margin-none flex-item-no-shrink">
<%= avatar_tag Current.user %>
</figure>

<%= form.text_field :content, autofocus: true, autocomplete: "off", autocorrect: "off", maxlength: 16,
pattern: /\S+.*/, class: "input reaction__input txt-small", data: { form_target: "input", reaction_emoji_target: "input" }, aria: { label: "Add a reaction" } %>
pattern: /\S+.*/, class: "input reaction__input txt-small", data: { form_target: "input", reaction_emoji_target: "input", action: "compositionstart->form#compositionStart compositionend->form#compositionEnd" }, aria: { label: "Add a reaction" } %>
</label>

<%= render "cards/comments/reactions/menu", comment: @comment %>
Expand Down
4 changes: 2 additions & 2 deletions app/views/cards/display/perma/_steps.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
<% unless card.closed? %>
<li id="<%= dom_id(card, :new_step) %>" class="step">
<input type="checkbox" class="step__checkbox" disabled>
<%= form_with model: [card, Step.new], url: card_steps_path(card), class: "min-width", data: { controller: "form", action: "submit->form#preventEmptySubmit turbo:submit-end->form#reset" } do |form| %>
<%= form.text_field :content, class: "input step__content hide-focus-ring", placeholder: "Add a step…", autocomplete: "off", data: { form_target: "input", "1p-ignore": "true" }, aria: { label: "Add a step" } %>
<%= form_with model: [card, Step.new], url: card_steps_path(card), class: "min-width", data: { controller: "form", action: "submit->form#preventEmptySubmit submit->form#preventComposingSubmit turbo:submit-end->form#reset" } do |form| %>
<%= form.text_field :content, class: "input step__content hide-focus-ring", placeholder: "Add a step…", autocomplete: "off", data: { form_target: "input", "1p-ignore": "true", action: "compositionstart->form#compositionStart compositionend->form#compositionEnd" }, aria: { label: "Add a step" } %>
<% end %>
</li>
<% end %>
Expand Down
4 changes: 2 additions & 2 deletions app/views/cards/taggings/new.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@

<%= form_with url: card_taggings_path(@card),
id: dom_id(@card, :tags_form),
data: { controller: "form", action: "submit->form#preventEmptySubmit" },
data: { controller: "form", action: "submit->form#preventEmptySubmit submit->form#preventComposingSubmit" },
class: "flex flex-column gap-half full-width margin-block-half" do |form| %>
<%= form.text_field :tag_title, placeholder: @tags.any? ? "Add a new tag or filter…" : "Name this tag…", class: "input txt-small full-width",
autocomplete: "off", autofocus: true, data: { filter_target: "input", form_target: "input", action: "input->filter#filter" } %>
autocomplete: "off", autofocus: true, data: { filter_target: "input", form_target: "input", action: "input->filter#filter compositionstart->form#compositionStart compositionend->form#compositionEnd" } %>
<% end %>

<ul class="popup__list" data-filter-target="list">
Expand Down