amarandon

amarandon OP

Dear Elixir forum,

We have a web page in which we stream output from processing jobs. We’ve set up LiveView so that the content of our box reflects the current job output. It works great but we’d like to keep the job output in a fixed height box and always show the latest lines (unless the user scrolls up), similar to GitLab CI job output. We’ve got a pure CSS solution but unfortunately because of an old Firefox bug it works only on Chrome.

So we’re wondering if it’s possible to plug a small piece of JS code that would be called when LiveView triggers an update. We could use this code to scroll down the bottom of our output box whenever new content gets appended to it.

Another use case I’m thinking of for being able to call some custom JS code upon LiveView update is when adding items to a list, we could use a piece of JS to highlight the new item in order to make it more noticeable by the user.

First 4 of 4 Posts Switch mode

peerreynders

peerreynders

JS interop is an on-going effort.

So in case there isn’t a suggestion from anyone more familiar with LiveView forthcoming, it may be worthwhile to check out MutationObserver (as already suggested here) in order to run some client code in response to any changes in the DOM.

idi527

idi527

It’s also possible to listen for "phx:update" events which are (at least to my knowledge) emitted when the DOM is done being patched.

https://github.com/phoenixframework/phoenix_live_view/issues/81#issuecomment-473750152

I used it in some of my “experiments” with client side js libs (similarly to LiveView: How to trigger JS function? (Update chart.js on data change)) to create/destroy/recreate their objects when the DOM elements they were “bound” to got “morphdomed”.

peerreynders

peerreynders

Works with thermostat_live.ex:

import css from "../css/app.css";
import "phoenix_html"
import {LiveSocket, debug} from "phoenix_live_view"

let liveSocket = new LiveSocket("/live")
liveSocket.connect()

// grab time and weather temperature from thermostat
// --- assets/app.js --- vvv New vvv

document.addEventListener('phx:update', phxUpdateListener);

function phxUpdateListener(_event) {
  const time = extractTime()
  if (!time) {
    return
  }

  const temperature = extractTemperature()
  if (!temperature) {
    return
  }

  const message =  `${time}: ${temperature}`
  console.log(message)
}

function extractTime() {
  const timeSpan = document.querySelector('div.bar > span')
  return timeSpan && timeSpan.textContent
}

function extractTemperature() {
  const weatherForm = document.querySelector('span.weather form')
  if (!weatherForm) {
     return null
  }

  const result = /[+-]?\d+°[CF]/i.exec(weatherForm.lastChild.textContent)

  return result && result[0]
}

Certainly simpler than using a MutationObserver.

10
Post #3
amarandon

amarandon OP

Thank you both. The phx:update event did the trick for us. Many thanks.

— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
jonnycharles
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
spammy
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
silverdr
Using Phoenix.LiveView.TagEngine as an EEx.Engine is deprecated! To compile HEEx, use Phoenix.LiveView.TagEngine.compile/2 instead. Sta...
New
dli
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app? Looking for hints regarding: Addi...
New
bottlenecked
Hi all, I wanted to ask how the community is dealing with post-release steps. Today we have Ecto migrations, which make sure that the db...
New
roeland
Kia ora, We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
type1fool
I just stumbled on a newly redesigned elixir-lang.org. :tada: It looks like @Software_Mansion did the work, and I think it is generally a...
New

We're in Beta

About us Mission Statement