Merge branch 'main' into combobox-a11y

* main: (26 commits)
  Center figure attachments and use normal size for Save Changes button
  Re-record message response VCR cassette
  Improve link rendering
  Give Fizzy Ask context about who it's talking to
  Show only published cards to Fizzy Ask
  Remove unique index
  Update to latest lexxy (merged renamed branch)
  Fix lexxy events prefix
  Rename Action Text Lexical => Lexxy
  Ensure empty/new transcript isn't narrow
  Source order
  We need this for the events index
  Safari apparently doesn't apply `position` in its internal stylesheet
  Don't allow the pattern to show through buttons
  Button is now in the column, merge fix
  Style tweaks to bar placeholder
  Any press of `esc` should close the dialog
  Copy
  Fix type mismatch
  Make the quota error message friendlier
  ...
This commit is contained in:
Andy Smith
2025-08-26 16:11:33 -05:00
54 changed files with 893 additions and 181 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ import "@hotwired/turbo-rails"
import "initializers"
import "controllers"
import "actiontext-lexical"
import "lexxy"
import "@rails/actiontext"
window.fetch = Turbo.fetch // TODO: We need to make @rails/request.js use Turbo's fetch when it's present.
@@ -27,7 +27,10 @@ export default class extends Controller {
if (event.detail.success) {
this.#reset()
} else {
this.conversationMessagesOutlet.failPendingMessage(this.clientMessageIdInputTarget.value)
this.#failPendingMessage(
this.clientMessageIdInputTarget.value,
event.detail.fetchResponse
)
}
}
@@ -60,4 +63,18 @@ export default class extends Controller {
this.textInputTarget.value = ""
this.clientMessageIdInputTarget.value = ""
}
async #failPendingMessage(clientMessageId, response) {
let errorMessage = null
if (response?.contentType?.includes('application/json')) {
const error = JSON.parse(await response.responseText)
errorMessage = error.error
}
this.conversationMessagesOutlet.failPendingMessage(
this.clientMessageIdInputTarget.value,
errorMessage
)
}
}
@@ -12,11 +12,15 @@ export default class extends Controller {
this.scrollToBottom()
}
failPendingMessage(clientMessageId) {
failPendingMessage(clientMessageId, errorMessage) {
const message = this.element.querySelector(`#message_${clientMessageId}`)
if (message) {
message.classList.add(this.failedMessageClass)
if (errorMessage) {
message.dataset.error = errorMessage
}
}
}
@@ -9,7 +9,7 @@ export default class extends Controller {
}
#shouldIgnore(event) {
return event.defaultPrevented || event.target.closest("input, textarea, lexical-editor")
return event.defaultPrevented || event.target.closest("input, textarea, lexxy-editor")
}
get #isClickable() {
@@ -46,8 +46,8 @@ export default class extends Controller {
}
#triggerChangeEvent(newValue) {
if (this.inputTarget.tagName === "LEXICAL-EDITOR") {
this.inputTarget.dispatchEvent(new CustomEvent('actiontext:change', {
if (this.inputTarget.tagName === "LEXXY-EDITOR") {
this.inputTarget.dispatchEvent(new CustomEvent('lexxy:change', {
bubbles: true,
detail: {
previousContent: '',
@@ -1,5 +1,5 @@
import { Controller } from "@hotwired/stimulus"
import { highlightAll } from "actiontext-lexical"
import { highlightAll } from "lexxy"
export default class extends Controller {
connect() {