im3000
Hello!
I am stuck figuring out how to set a custom CSS classes for text inputs in Surface. Basically, I would like to add a red border for the invalid text field. I can probably use class={invalid: @field_status}, but I am wondering if there is somehow a way to make this apply for all fields by creating some kind of helper or wrapper. For the reference, I am using Ecto and there are changesets involved for the forms in question.
Any help, pointers, links are much appreciated. Thank you!
Trending in Questions
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
Hello!
Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app.
I creat...
New
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
So my question is quite simple and i have found no conclusive answer on forum, google or AI.
Should we use :erlang.float for Integer to ...
New
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New
apply_graft/2 doesn’t rewrite an add_many sub-workflow’s deps on an add step. Grafted jobs cancel with “upstream job was deleted”
Version...
New
Other Trending Topics
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
Hi there! We created Gust: A task orchestrator inspired by Airflow.
For those who have never heard about Aiflow, it’s a Python-based wor...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
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
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixirconf-us
- #blog-post
- #ai
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 1 to 6- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
Malian
Hi @im3000 !
Thanks for using Surface!
If the ErrorTag does not fit your needs, you could indeed dynamically add a class to the
TextInputcomponent with theclassprop like you mentioned.There is no currently no way to dynamically add a class to a component across the application. A solution could be to create your own
TextInputcomponent that is a wrapper for the Surface one, or that delegates the rendering to Phoenix (it is basically what the Surface component does). In that component, you can retrieve the form context and do what you want with it.Take a look at
https://github.com/surface-ui/surface/blob/master/lib/surface/components/form/text_input.ex, I am sure you will find what you need there.That being said, I am curious how you imagine a “dynamically” class for one component could work? Could you explain us how you imagine the API? It will help us to evaluate the way of implementing this to Surface.
im3000
Thank you for the answer @Malian!
As you suggested, I could probably get away with a derived input component. What I had in mind was a tighter coupling to Ecto changesets, but that coupling might be too tight. On the other hand all the information is already probably there.
The idea sparked after reading Dynamic forms with Phoenix « Plataformatec Blog post and especially the “Customizing Inputs” section. I am thinking if Surface has an
Fieldtag that acts as a wrapper for inputs and error tags it might be quite easy to add an error CSS class to the inputs that the field is wrapping. With that said, I haven’t looked at the Surface’s code too close yet so take my thoughts with a pinch of salt.What do you think? Is it doable or is it not in line with Surface’s design philosophy?
harmon25
Very doable - but not a native surface concern.
Phoenix does a bit of magic to hide errors on fields the user has not yet interacted with.
This ‘magic’ is done with these classes when using
ErrorTag:Obviously
display:none;would not work on a border - and this will have to be modified achieve applying anerrorborder to a field.Think you would apply a default border if
.phx-no-feedbackis present, and when just.invalid-feedbackis present on the field, apply theerrorborder or similar…Could also use more intelligent CSS selectors like if
.invalid-feedbackis present on a parent node - to apply certain styles…Malian
@harmon25 correct me if I am wrong, but Phoenix add
phx-no-feedbackfrom theerror_tagfunction in yourErrorHelpersmodule. Does Phoenix addphx-no-feedbackoninputsas well?harmon25
No phoenix does not do that for you, the dom node needs an accurate
phx_feedback_forattribute - Form bindings — Phoenix LiveView v0.15.7 (hexdocs.pm) to apply thephx-no-feedbackclass.So a special styles like:
would be required to pull this off, as
display: none;is not really an option for the input itselfim3000
I am a bit confused. If Surface could add some kind of css class to the
<form>or<div>(Field) element in case of field error it would be no problem doing a little CSS-fu to style the inputs in question. Right now the generated DOM node forErrorTaghangs on its own and there is no easy way to find its input without doing some JS-fu.Right now I’ve solved it with a hack adopted from the article mentioned higher up, but I feel there must be a better way.
And I put this helper func in my LiveHelpers module that I then imported in my Surface component.
TBH I feel like that meme science dog atm .. hehe. Still learning! But something tells me that this could somehow be solved in the Surface lib itself. Either by Surface configuration or maybe in some kind of a separate helper module.