It took me awhile to realize this wasn’t something in my code. While all the other field types look great with the style you’re using (bold label above, followed by field) and I have read before that vertical stacking is good for usability, I just don’t think it works for the checkbox. Having the checkbox alone on a line with just a heading above it looks totally wrong, and I would be very empathetic to any user who got confused by it. Checkboxes need something next to them. In your example screenshot I think the problem is already visible, but subdued because there is only one checkbox. If you have 4 checkbox fields in a row the issue really starts to sparkle.
In theory having two labels for each checkbox could work, like if the bold heading was “sharing options” and next to the checkbox it said “show sharing tools”, but that is overkill and in this case I think we just need to have checkbox followed directly by the label text already deteremined by the API calls (I managed to mock it up and it looks good).
I looked at the code in
_display_metadata_field()and I can see why you chose to leave the checkbox on its own line. Having one layout to rule them all is very convenient and the way the code currently flows implies deeply that even though the checkbox looks crazy right now, it’s the way it is supposed to be. That said, I think you should reconsider and find a way to put the checkbox and it’s label on the same line for the sake of usability.
The essential change needed is to have the label come after the checkbox. If you do that, then you just have to make the label and divs inside the label
display:inline-blockto have it look and flow great. IMHO this UI would be fine alongside the other field types with their labels above them, having inline checkboxes is totally standard throughout the web.
I’m not sure what the best way to code this would be though. The easiest choice would be to add a check above the display of the
if ('checkbox' != $field->field_type)so that it doesn’t show for checkboxes, then add the label display after the checkbox in the
switchsection for ‘checkbox’ (i.e. duplicating the label display code). Personally that seems hacky but I’m not sure how attached you are to the current layout and it would definitely work and only involve changes to two lines of code.
A much more convoluted but also more elegant solution would be to add some kind of “label_position” property to the $field object and use it to trigger before/after placement in
_display_metadata_field(), thus having two instances of the label display, and only using one for each type of field. Really it would just be for checkboxes at this point (and probably ever, as there aren’t likely to be many more similar additions to web forms in the near future) so I can easily be convinced that it’s not worth it. It also feels like that metadata has nowhere to live, as it doesn’t really belong in the $field object because it’s not about that particuly field but rather a form of meta on the $field->field_type. Sigh.
Anyway, let me know if you want a patch for the first solution and I can work it out for you, though I feel like it might be easier for you to do it yourselves as it’s so simple.
Thanks for the great plugin as always! I’ll just use it as-is for now. It will be a fun test to see if any of my users complain, as I haven’t shown them the new version that has this issue yet 😉
Oh yeah here’s some visual reference.
Your screenshot that shows how checkboxes look among other fields:
A screenshot from my site showing four sad checkboxes in a row:
Thanks for the suggestion and very thorough analysis of the issue! I didn’t look at it in details (yet) but I am wondering if this couldn’t be achieved with css alone since there is a class around each field (including the label) that tells us which type of field we have, couldn’t we just target checkboxes and reposition them accordingly? It might be hacky css, but at least we can leave the (elegant) php alone.
Let me know if you’re able to submit a patch either for a css only solution or worst case for solution #1 that you suggested above. Otherwise either Mo’ or I could probably get this in, but I can’t guarantee it would be right away!
Man, trying to get the checkbox before the label with only CSS sounds like a nightmare. It would have to involve assumptions about the size of the text for use in relative positioning. IMHO it’s fundamentally absurd in terms of what CSS and HTML are for. I just tried it and it looked okay but had unpredictable effects, specifically the label stopped being clickable as a way of ticking the checkbox, breaking a standard utility of HTML.
Maybe there’s another way I’m not thinking of, but to me that seems like more hassle than adding a bit of complexity to the PHP.
Fair enough 🙂
If you get me a php patch, I’ll throw it in, otherwise I’ll write it myself likely over the weekend.
Any update on this from your side of things? I’m going to put a few hours into the plugin either today or tomorrow, and will address this. Let me know if you have anything for me!
Okay here’s a gist with the diff/patch of the changes that I think balance the needs of the situation:
Let me know if the Gist isn’t a suitable way of submitting a patch. I haven’t used it before but it seems cool and I saw you guys used it in the plugin’s notes.
custom_metadata.phpI added an array definition of
$label_after_field_typeswhich should contain all
field_type‘s that need the label after the input. Currently it’s just checkbox, but IMHO this adds a layer of conceptual clarity to the situation, as well as keeping it open for other formats where this makes sense to be quickly added. I then check if the current field_type is in the array before showing the label above the switch statement and skip it if it is, in which case a second in_array() check at the bottom of the switch will show the label instead. I also moved the label HTML into the
$label_strvariable which is echoed, to avoid duplicating the code.
display:inline-block;to divs and labels inside .checkbox. This is needed to avoid them still being on separate lines. I also changed the margins on the checkbox
inputitself because the default wp-admin css was making it not line up right with the label.
Overall I think it looks good and works well this way. If you have a weird mix of checkboxes and other field_type’s then it still looks bad and confusing, but I compared my version with the old version and they both look awful if the order is bad. Ideally all checkboxes should be at the start or end of the list of fields, if you do it that way they look good and make sense. (personally I’d recommend always putting them at the start, where they can’t be confused with being part of the previous field).
Let me know if there’s an issue with it or you need something else.
Patch looks good. Gist is fine. Next time, you can also fork the github repo (https://github.com/jkudish/custom-metadata) and then submit a pull request – makes it a tiny bit easier but the gist is just fine, so no worries.
I’ll review it and get in soon! I’ll try to brainstorm of a way we can avoid it looking awful as you explained…
In terms of making it not look bad I think the only solution would be to do automatic re-ordering of the fields before display, to put the checkboxes at the start. Personally I wouldn’t push that though, it would be confusing to people and annoying to have to explain to them how to turn it off. If anything there might be a place in the docs somewhere to mention order strategies but really people will probably just figure it out when they look at their forms, or else they won’t care in which case problem solved.
Yes, for sure, I wouldn’t want to enforce re-ordering of fields, that wouldn’t be a good idea.
What do you think of checkboxes having two labels? One above and one right next to the checkbox? Redundant / confusing or the solution to our problems?
In theory having two labels could solve some of the design problems, but fundamentally that’s not what labels are about. A heading above a checkbox should be a fieldset heading or something, the way checkboxes are supposed to use labels is as what happens when the box is ticked. Visually you’ve made the label tags into headings for each input, which looks good, but that should just be a style thing, input tags are display:inline; by default for a reason. When it comes to checkboxes then you have to make an exception to the vertical-stacking design.
Also it would change the API in a way that makes it less clear and simple. Right now the property is ‘label’ which both makes sense based on semantics and directly refers to the tag that will contain the content. I.e. the API is perfect as-is, changing it for this use-case would hurt it.
True. Fine, keeping it as is. I’ll get your patch in tomorrow or saturday at the latest along with a few other fixes for the next minor release.
PS: this is now logged as https://github.com/jkudish/custom-metadata/issues/4 – Feel free to log issues there in the future (if you find any)
- The topic ‘[Plugin: Custom Metadata Manager] Checkbox display is confusing, labels should be next to checkbox’ is closed to new replies.