pell icon indicating copy to clipboard operation
pell copied to clipboard

Is there a recommended way of restricting input length?

Open ethagnawl opened this issue 6 years ago • 5 comments

First off, thanks for creating such a simple, useful plugin!

I find myself needing to limit the length of text a user may enter into the pell editor. I'm tempted to tack on an event listener and call preventDefault on the event object if the length of the pell editor's value is longer than N. Though, that seems like a kludge and like I'm working against the editor.

So, is there a recommended way of limiting the amount of text a user may enter into the pell editor? I'm looking at the source now and don't see any obvious solutions. Perhaps the event object could be passed to settings.onChange from within content.oninput?

ethagnawl avatar Mar 21 '19 14:03 ethagnawl

I think you don't have to restrict input. What worked is just to show the remaining characters and when it's in a negative area you show a hint.

Something like this:

image

Look at this thread, it's quit interesting: https://ux.stackexchange.com/questions/13055/character-limits-on-fields-pros-and-cons-and-best-practices

UX Max Input length for pell

Append automatically the counter element after the pell container. I have a more complicated version implemented, but here is my approach.

Add a data-target and adata-max attribute to your pell container.

<div class="pell-init" data-target="#unique_target" data-max="500"></div>

in onChange of pell init

onChange: function(html) {
      
      var element = $(this.element);
      var target = element.data('target');
      var max = element.data('max');
      var counterEle = $('.text-counter[data-target="'+target+'"]');

      var lengthWithoutTags = $(html).text().length;
      var counter = parseInt(max) - lengthWithoutTags;
      
      // create counter element after pell container if not present
      if (!counterEle[0]){
        console.log("create new");
        counterEle = $('<div class="text-counter" data-target="'+target+'"></div>')
        element.after(counterEle);
      }
      
      if (parseInt(counter) < 0) {
        counterEle.html(`<span>Please use only ${max} characters.</span><span>${counter}</span>`);
        counterEle.addClass('text-counter--invalid');
      } else {
        counterEle.html(counter);
        counterEle.removeClass('text-counter--invalid');
      }
      return true; // dont know if needed
},

Give your text-counter-element a bit of styling

.text-counter
  font-size: 1rem
  width: 100%
  display: flex
  justify-content: flex-end

  & > *:last-child
    margin-left: auto

.text-counter--invalid
  color: red

Please notice: When counting characters you cant count the HTML tags inside. If you do this the user gets crazy numbers. For this I used this line $(html).text().length. It returns just the text and not the text including HTML tags. You also have to consider this in your backend validators.

simonfranzen avatar May 29 '19 20:05 simonfranzen

Thanks, for following up @simonfranzen. That thread is an interesting read. I also wound up doing something similar to your approach in the application I was working on.

ethagnawl avatar May 30 '19 19:05 ethagnawl

I am also looking for something like this to be implemented. I want to restrict the user from typing more than a number of characters. I have gone through the comments here and seems like I will also have to do make do with a hack. I request the author to implement this as a feature or provide more hooks, so a preventDefault() maybe called on the original event.

siva-bathula avatar Oct 21 '19 05:10 siva-bathula

@siva-bathula This type of feature will likely never be a part of pell's core code, which is designed to be as minimal as possible. This makes more sense as a plugin.

jaredreich avatar Oct 21 '19 14:10 jaredreich

I will make do with a hack. Thanks for responding.

siva-bathula avatar Oct 22 '19 04:10 siva-bathula