Clear default option when clicked in dropdown so user can type in custom text

Explorer ,
Aug 11, 2022 Aug 11, 2022

Copy link to clipboard

Copied

Is this possible? Rather than having to backspace/delete all the text of the default (such as select an item), when the default is clicked the field is blank for the custom text to be entered.

TOPICS
How to , JavaScript , PDF forms

Views

269

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 12, 2022 Aug 12, 2022

Copy link to clipboard

Copied

++MODIFIED REPLY :  fixed some discrepancies in the script

 

Yes it may be possible with a JavaScript custom format script or a combination of such script and the field object built-in features.

 

This has been answered before.

 

The dropdown menu can display a default visible string of text, but as soon as the user types in something in it, it  blanks itself to accept the  new value; then commit that value after hitting enter.

 

See slides below for my way of doing it (this could be achieved in many other creative ways):

 

In the first slide I am using Acrobat's built-in feature in the dropdown properties. I eliminated from the choices "Select an Item" and entered a single blank space as my default selection.

 

DROP1.png

 

 

 

In the second slide, while using the "Prepare Form" tool, I opened the "Dropdown Properties" and selected the "Format" tab first. Then select "Custom" from the dropdown options, and then click on "Edit..." to open the JavaScript editor and use the actual script.

 

See example script next.

 

DROP2.png

 

The example script below is a slightly modified version of the original that has been circulating around for years in various discussions that are found in these forums and the old ones from  Acrobatusers.com.

 

 

All credit to George Johnson and Gilad D (try67).

  

 

 

 

 


(event.value !== " " || event.value =="") ? 

([

event.value = event.target.value,

event.target.display = display.visible

]) : ([

event.value = "Select an Item", 

event.target.display = display.noPrint,
  
  ]);

 

 

 

 

 

Give it a try (or improve it) and let us know if this works for you.

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 12, 2022 Aug 12, 2022

Copy link to clipboard

Copied

I think I got that part working. I have a couple of other questions though.

 

1. I got the following code on another thread in a validation script:

if (event.value) {
var f = event.target;
var found = false;
for (var i=0; i<f.numItems; i++) {
if (f.getItemAt(i, false)==event.value) {found = true; break;}
}
if (!found) {
f.insertItemAt({nIdx: -1, cName: event.value});
f.defaultValue = f.getItemAt(0, false);
}
}

I believe this was to save a custom entered option for future selection. However, this only works in a single dropdown on a single row. I have 18 rows, thus 18 location drpdowns Location1, Location2, etc. Is there a way to add the custom entry to a master options list that can be called from any of the dropdowns?

 

2. If the form is closed without saving, the entered value is not saved for future use. The desired workflow is to have the user save the completed form under a new filename for manually posting online. Then when the form is opened the following month, it needs to have all of the fields blank, but have the custom option available in the dropdowns still.

 

Here is my onload document level script:

var fieldsNotToReset = ["ChaplainName", "CompanyName",];

var fieldsToReset = []; for (var i=0; i<this.numFields; i++) { var fname = this.getNthFieldName(i); var f = this.getField(fname); if (f==null) continue; if (fieldsNotToReset.indexOf(fname)!=-1) continue; fieldsToReset.push(fname); } this.resetForm(fieldsToReset);
for (var i=0; i<this.numFields; i++) {
var f = this.getField(this.getNthFieldName(i));
if (f==null) continue;
f.readonly = false;
}

this.getField("CommunityServiceTotal").readonly = true;
this.getField("CounselingTotal").readonly = true;
this.getField("CrisisResponseTotal").readonly = true;
this.getField("FirstResponderTotal").readonly = true;
this.getField("MeetingsTotal").readonly = true;
this.getField("MissionsTotal").readonly = true;
this.getField("RapidResponseTotal").readonly = true;
this.getField("TrainingTotal").readonly = true;
this.getField("VeteransTotal").readonly = true;
this.getField("TotalHoursServed").readonly = true;
this.getField("TotalTravelHours").readonly = true;

for (var i=0; i<this.numFields; i++) {

var f = this.getField(this.getNthFieldName(i));

if (f==null) continue;

if (f.type=="button") f.display = display.visible;

}

this.getField("MonthYear").setFocus();

 

Do I need to somehow auto save the form before it is closed when the Save As is completed? How to do that best?

As always, thanks to everyone who is helping me.

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 13, 2022 Aug 13, 2022

Copy link to clipboard

Copied

For question 1:

 

since that script executes the validation from the target field, you can save it as a document-level script and call that function as a custom validation script fro. each of the desired dropdown fields.

 

Declare a variable for the master option list in that document-level script and establish a condition to define when to add the custom entry using the setItems() method.

 

Some examples for that method are illustrated in the Adobe Acrobat SDK, JavaScript for Acrobat® API Reference "Doc properties", page 431.

 

You may also want to check out some of ACP Thom Parker articles and tutorials that cover how to create and store master lists and how to program comboxes with Acrobat JavaScript

 

 

 

For question 2:

 

Adobe Acrobat SDK, JavaScript™ for Acrobat® API Reference "Doc properties", page 212 and page 213.

 

See about resetting the dirty flag, and also take a look at the example scripts that illustrate how to employ the "requiresFullSave" property respectively.

 

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 13, 2022 Aug 13, 2022

Copy link to clipboard

Copied

There are no page numbers in the current SDK (it is html). I am also unable to find these sections by searching. Can you help me locate them some other way? like a link maybe?  Thanks.

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 22, 2022 Aug 22, 2022

Copy link to clipboard

Copied

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 13, 2022 Aug 13, 2022

Copy link to clipboard

Copied

As the tutorial does not really suit my question (I am not trying to populate a dropdown from a selection in a different dropdown, and the sample file does not allow custom text entry, which is what I am trying to do), I'm going to ask it this way (also posted to a previous thread I started):

 

1. This only works in the first row dropdown. Since I have 18 rows in this column, I need any custom text entered in any row (box) to be available from the list in any other row.  Currently, I have the first box coded with default instructional text, but I only want that to show in the first row and not the rest (Not a deal breaker, but would be really nice for aesthetic reasons). The first time the user opens the form, they have "Virtual" as an item, the blank space and the default text, regardless of row. So that needs to be in a "Master" Table/List. I do not know how to call that master list into the dropdown (Step 2) after creating said master list (Step 1). Step 3 will be:as the user fills in the custom list items in any row, they are added to the master list to be available in any row at any time for future months.

Example:

Joe Smith opens the form and completes all of the columns on Row 1. In the "Location1" dropdown (Row 1), he sees the istructional text and the "Virtual" Item. He then adds "Mall" as in the original post example.  He fills out several other rows and then he needs to use "Mall" again in say, Row 5. He should now see "Mall" as an option in the Row 5 Location dropdown (Location5), or any other row for that matter.  How do I do this?

 

2. The other issue is I noticed the custom options are not saved in the "Master form" if it is closed or the file is saved as a new form under a different filename, as is the desired workflow, because we want the fields to be blank every month when the master form is opened again. I do have it coded so two of the fields do not get cleared with the clear form button or clear form action. So I'm not sure how to fix this bit either.

 

I hope what I am asking is clear about the workflow. I'm guessing the master list may need to be a document level script, but I'm not sure how to code it. I have not been able to get a suitabe answer in another thread I posted this to. I can't seem to search for the setItem method in the API, it comes back with no results. So I don't have the full syntax to even start with there.

 

For reference, here is teh current code:

Custom Format script:

(event.value !== " " || event.value =="") ?

([

event.value = event.target.value,

event.target.display = display.visible

]) : ([

event.value = "Please Select or Enter a Location.",

event.target.display = display.noPrint,

]);

 

Custom Validation script:

if (event.value) {
var f = event.target;
var found = false;
for (var i=0; i<f.numItems; i++) {
if (f.getItemAt(i, false)==event.value) {found = true; break;}
}
if (!found) {
f.insertItemAt({nIdx: -1, cName: event.value});
f.defaultValue = f.getItemAt(0, false);
}
}

 

I hope this clears it up a little bit.

Thank you for your help again.

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 15, 2022 Aug 15, 2022

Copy link to clipboard

Copied

As for Question 1:

I was able to set the item list into a new dropdown to use as a master list, but hidden. I can't figure out how to call that master list into the individual boxes and that tutorial didn't work. I don't have an add button, but tried that part as an action on the non master box. What am I missing? My row 1 box that I am testing is just blank with no options other than entering custom text, which I could do with a simple text box. Please help.

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 15, 2022 Aug 15, 2022

Copy link to clipboard

Copied

I have something for you that I'm working on.

 

I've been following the other conversation , but my approach is much more simpler than the other scripts.

 

I am still learning JavaScript, but in my humble opinion, I don't think a validation script is necessary. It seems like it counteracts with some other things that you have going on in that PDF.

 

Give me about an hour and I will be posting back to you with what I've got.

 

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 15, 2022 Aug 15, 2022

Copy link to clipboard

Copied

Thanks. I look forward to trying it out.

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 22, 2022 Aug 22, 2022

Copy link to clipboard

Copied

First and foremost apologies for taking this long to reply.

 

Here is the same script I posted earlier but modified to satisfy your requirement.

 

Be advised that this script  is employing a  ternary (conditional) operation. As such, you will notice that I placed my for loop operation at the very top of the script before  the rest of the declared variables that will interact in the ternary operation. 

 

 

/*
CUSTOM FORMAT SCRIPT -- RUN FROM EACH COMBOBOX 
OR INVOKE AS A FUNCTION FROM EACH COMBOBOX 
*/

/////////////////////// DECLARE YOUR VARIABLES ////////////////////////

var f = event.target; f.defaultValue = "Select an Item or Enter a Location";

      {
        for (i=0; i < this.getField("hiddenBox").numItems; i++); 

        var itemsList = this.getField("hiddenBox").getItemAt(i, false);

        var values = this.getField("hiddenBox").insertItemAt(event.value, "", -1);

        var comboValues = event.target.insertItemAt(itemsList, "", -1);

      }
            
var comboStatus = (event.value !=="" 
                   && event.value !==" " 
                   && event.value !=="Virtual" 
                   && event.value !=="Select an Item or Enter a Location") ? ([

                   
///////////// GET INDEXED FACE VALUES FROM HIDDEN FIELD ////////////////

                   this.getField("hiddenBox").insertItemAt(event.value, "", -1),
                   event.target.insertItemAt(itemsList, "", -1)

                   ]) : ([

                   f, 

                   event.target.display = display.noPrint
                   
                   ]);


////////////////// EXECUTE IF / ELSE CONDITION ////////////////////////

(event.value =="") ? ([ event.value = "Select an Item or Enter a Location",
                        event.target.display = display.noPrint,
                        this.getField("hiddenBox").value = "Select an Item or Enter a Location",

                        this.getField("hiddenBox").setItems([ 

                                      ["Select an Item or Enter a Location"], 

                                      [" "],
 
                                      ["Virtual"]

                                      ]) 

                                   ]) : comboStatus

 

 

I tested this script with 20 different dropdown menus and it doesn't require a "parent.child" naming convention for each of them.

 

This custom format script  also employs the use of a dropdown menu as the hidden field instead of a textfield ; it works with a hidden listbox as well, and you may also use it as custom calculation script.

 

The reason why I preferred this approach, simply because you can hold an entire list of indexed values in a combobox, while in the case of  updating values back and forth with a textfield  to many comboboxes requires a much more different approach (specially if using export values in those comboboxes)..

 

NOTE: It may also work as custom keystroke or mouse event action with a few modifications. .

 

Nevertheless, since you're not using Thom Parker methods for a MasterList that stays scured as a document-level script, I still employed some of his advised techniques that are found in the link I posted for you in my first reply.

 

All of the answers you need are there: Part 1 and Part2 of that article should you decide to use/modify  this script as a dynamic  MasterList..

 

This script update each of the comboboxes dynamically and without the need of of document-level functions nor validating other scripts in conjunction with custom keystroke scripts.

 

NOTE: You may need to work around on how to effectively reset the fields using clearItems() and the setItems() methods.

 

Let us know if this help. 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 23, 2022 Aug 23, 2022

Copy link to clipboard

Copied

I was getting some errors in the console. I removed my doc level script. It appears to work, but I have one issue.

It will not let me delete any of the new values so that the final form I send out for people to use don't have a bunch of unnecessary options like "Test, Test2, etc.". Is there a way to fix this issue? I will post the console error if it comes back.

Thanks.

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 23, 2022 Aug 23, 2022

Copy link to clipboard

Copied

Even if I delete all items from hiddenBox, they rae still displayed in Location1, Location2 and I cannot delete them from Location1, only from hiddenBox. I set hiddenbox properties to Allow custom text and commit immediately. Do I need to also set the validation script in it? Do I need to apply this same script to it for custom format of hiddenBox?

Validation script used on Location comboboxes (so we can blank the default text when entering custom text. It seems to not work quite right now either):

if (event.value) {
var f = event.target;
var found = false;
for (var i=0; i<f.numItems; i++) {
if (f.getItemAt(i, false)==event.value) {found = true; break;}
}
if (!found) {
f.insertItemAt({nIdx: -1, cName: event.value});
f.defaultValue = f.getItemAt(0, false);
}
}

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 23, 2022 Aug 23, 2022

Copy link to clipboard

Copied

Try it like this:

 

 

 

///// Declare a variable outside a function(optional) //////
////       to use with the ternary conditional        /////


function fieldValues() {

  var insertValues;

    insertValues = this.getField("hiddenBox").getItemAt(2, false);

        event.target.insertItemAt(insertValues, "", 2);
      
   }

  
           /////////// DECLARE YOUR VARIABLES /////////////

  var getvalues = fieldValues();

  var f = event.target;   f.defaultValue = "Please Select Item or Enter Location";

      var comboStatus = ( event.value !== "" 

                          && ( event.value !== " " 

                          && event.value !== "Please Select Item or Enter Location") ) ? ([


                          event.value = event.target.value,
 
                          this.getField("hiddenBox").insertItemAt(event.value, " ", 2),

                          getvalues,

                          event.target.display = display.visible



                          ]) : ([



                          event.target.defaultValue = "Please Select Item or Enter Location", 

                          event.target.display = display.noPrint
  


                          ]);



         ///////// EXECUTE IF / ELSE CONDITION ////////////


                        ( event.value =="" ) ? ([ 


                          event.value = f.defaultValue, 

                          event.target.display = display.noPrint



                          ]) : ([


                          comboStatus 


                        ])

 

 

 

Keept in mind that this is a format script based on your requirement of using a hidden field. The best way to do this is as a document-level function.

 

However, for the purpose of this example, I added a  function with a local variable outside of that function that will be declares before we use it in the ternary conditional evaluation for each combo box.

 

With a little more work, this script may be modified to be run solely from the hidden box. Meanwhile this is working.

 

Here's a modified copy of your original file with this script running on each of the 18 comboboxes:

 

 

NOTES:

 

  1. There is no need for a Validation script, nor a document-level script. The form also works A LOT more faster with this method.
  2. Check out the reset button that I added just to reset the hidden field and all the comboboxes for the Locations column (this action clears and resets entirely the hiddenbox field while resetting the Location boxes but holding their values; for instance,  if the user makes mistakes and wish to start over or simply while just continue to work with the PDF before saving and exit.

 

  • Reset button script (MouseUp event combined with the built-in feature Reset Form Fields):

 

 

 

///// CLEAR AND SET ITEMS IN HIDDENBOX ////

  var f = this.getField("hiddenBox");

    f.clearItems();
      
       f.setItems([["Please Select Item or Enter Location"], [" "], ["Virtual"]]);

 

 

 

 

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 24, 2022 Aug 24, 2022

Copy link to clipboard

Copied

This is still not working properly.

I had to copy the hiddenBox reset script on the reset location button in order to get all the comboboxes to clear. So basically it is clearing 19 boxes and it takes a minute or two.

 

Now, the boxes don't allow custom text to be entered when selecting the " " option. It just puts a blank space there. What I had originally with the validate script was to clear the default text and allow the custom text entry without having to do all the clicking and backspacing to start with a blank field. That is no longer happening even with the validation script.

I have attached the new test file.

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 25, 2022 Aug 25, 2022

Copy link to clipboard

Copied

So both scripts work correctly, the way they are supposed to.

 

As I mentioned earlier, the script that I provided doesn't need a validation script and It can even  run as a custom keystroke script to speed up the PDF form.

 

The form that you shared has both my script and the  validation script running side-by-side on each combobox. 

 

Both scripts basically do the same thing with some minor differences and they will conflict if you use them them together.

 

So you need to stick to one of the scripts already provided to you and modify  or add to them what is needed.

 

Overall,your entire form has over 30 validation scripts, which is not the correct way to employ validating scripts.

 

That is completely unnecessary in order to accomplish three or four simple tasks.

 

Also, you declared the same variable "f" to every field in your reset button, which is incorrect.

 

Every variable must be declared with its own unique names or it will throw errors.

 

From my own personal experience in these forums, copying and pasting scripts is not the way to go about.

 

To really benefit from the work of others who have willingly shared with you viable solutions free of charge to you and your organization, I'd recommend to put some serious effort into learning more about Acrobat JavaScript.

 

And if you are really committed to learning how to employ Acrobat JavaScript in your PDF,  use the documentation that I posted for you from ACP Thom Parker and consult with the Acrobat API Reference to develop your own scripts.

 

That said, I didn't write a script to reset all those comboxes.

 

As I mentioned in my earliest  reply,  I created a small script just intended  to clear items and reset the hiddenBox to a specific order of  indexed values. Running the reset button that you modified messes up everything.

 

I am willing to help you all the way until you get the PDF to work the way you need it, but in return I need you to read Thom Parker's documentation , and the JavaScript API reference.

 

I strongly suggest that you  also share your  own scripts  to get you better assisted.

 

 

 

 

 

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 26, 2022 Aug 26, 2022

Copy link to clipboard

Copied

Thanks for the feedback. The API Reference does not even come close to answering all of my questions and the samples are sometimes painfully lacking. I did read the Thom Parker tutorial, but I can't seem to get it to work or I don't really understand it. Every example I've found typically uses three list boxes with no entry of new options by the user. I have not found one that does what I want to do. I'm wanting to populate and save new options to comboboxes, not list boxes, and they are not dependent boxes either, as in the examples I have found. I have not found a way to do everything in one script.

I have to have the 18 rows, thus the need for multiple, but independent boxes in the 18 rows of each column. I do not want the user to have to use a button to do everything, nor do I have the room on the form to do so. These are mostly older people who struggle to use computers in the first place in some cases. The fact remains I need to test the form and then remove any custom text entries before distributing the final, empty, first-time use form. I'm about at the point of scrapping everything except the time calculations totals, which obviously require some validation and calculation.

 

The validation script for thhe location is not in every location field at this point. When I test it, your script still has the default text in the field that has to be deleted before the custom text is entered.  I don;t want that. When the user clicks it, I want it to blank out, not insert at the cursor location and end up saving a string of jibberish as a dropdown selection that can't be removed. I'm trying to save the user from extra work, frustration and lessen the likelihood of error.

 

Which reset button are you referring to? You may need to be more specific about the variable names or the fields in question. As I ststed earlier, you script did not actually clear the custom entries in the comboboxes, just the hidden box, so I did the only thing I knew to do to work around that. Clearing the hidden box entries did not clear the individual boxes. I cannot clear them through the options tab on the field and sometimes I end up with duplicates of the default text in the individual boxes.

I really do appreciate your time and help. If everything was going to be the same every month, this would be much simpler and I wouldn't need so much code, but that is not the case and we have over 100  users all over the USA Some do not even have the full version of Acrobat. I am volunteering my own time trying to make this work, while learning at the same time. I have gotten some cool stuff from the forums so far.

One more question are my document level scripts messing with the code you provided?

 

I honestly wish I only needed one combo box and still have 18 possible entries (rows). But I don't see how that is possible, as each box has to have a unique name. Am I making any sense at all?

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 26, 2022 Aug 26, 2022

Copy link to clipboard

Copied

I got you.

 

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 22, 2022 Aug 22, 2022

Copy link to clipboard

Copied

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Sep 05, 2022 Sep 05, 2022

Copy link to clipboard

Copied

LATEST

Hi,

 

Hope that you found a solution yet, if not maybe this will help. Here is your updated file:

 

 

  1. I did not employed a hidden field as suggested in these forums  nor used a document-level array to write all comboboxes values to a global variable.
  2. I slightly modified the original code that I posted to you and moved it as a keystroke event script
  3. Added a simple Mouse Down event ; is not elegant but do it does its job and  complement the keystroke event with acquiring all the values from comboboxes and list them dynamically  when the user clicks on the desired field.
  4.  Fixed a few things in your document-level script
  5.  Eliminated all custom validating scripts for the comboboxes  that were interfering with other scripts and making the form extremely slow; that method was not necessary. The validation can be handled with the keystroke script using event.rc (which I did to handle the null or empty "" strings condition that usually throw errors when the user deletes a value and leaves the combobox empty).
  6.  Incorporated to your current reset button script  the setItems() method to clear all comboboxes.
  7.  Added the app.thermometer object to the reset script to give notice to the user that the form is resetting. Takes about 8-10 seconds to complete. (This may be improved if, for example,  the over 10  custom calculating scripts and over 10 validating scripts were not running continuously in the  background during the fields reset operation). 

 

NOTE:

The only downside to updating comboboxes dynamically is that when the users click on an empty combobox, and as the values get populated,  the event trigger will select automatically the last value that was added to the list.

 

If you or your users are not bothered by this, then the form rather works pretty darn well (IMHO).

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines