manish thakur
manish thakur

Reputation: 820

How to auto select the dropdown

I have an HTML table, inside which I have several input fields, so when I select any option from the dropdown I am populating one row of the table, inside that row itemname as input field which is autocomplete.

So what I am doing is I have a string like A BR SB EX~333 where 333 is the item code and other is a name, so when I type 333 that item gets populated. Then on pressing enter I am focusing out and doing some calculations.

What I am trying to do

My code

var tableData = {
  "ALMOND CHBAR~2402": {
    "itemName": "ALMOND CHBAR",
    "itemCode": "2402",
    "costPrice": 20.0,
    "gstPercentage": 14.5,
    "mrp": 30.0
  },
  "A BR SB EX~333": {
    "itemName": "A BR SB EX",
    "itemCode": "333",
    "costPrice": 1.0,
    "gstPercentage": 0.0,
    "mrp": 1.0
  }
}


var autoCompleteData = Object.keys(tableData);

function rowappend(tbody) {

  const markup =
    `<tr>
									  <td>
									    <input type="text" class="form-control commanChange" id="itemNametd" name="itemNametd">
									  </td>
									  <td><input type="text" name="itemCodetd" id="itemCodetd" class="form-control commantd" readonly="readonly"></td>
									  <td><input type="text" name="mrptd" id="mrptd" class="form-control commantd" readonly="readonly"></td>
									  <td><input type="text" name="purRatetd" id="purRatetd" class="form-control commantd"></td>
									  <td>
									    <input type="tel" id="unitQtytd"class="form-control commanChange" name="unitQtytd">
									  </td>
						               			 
									  <td>
									    <input type="tel" id="discPercentagetd"class="form-control commanChange" name="discPercentagetd" >
									  </td>
									  <td><input type="text" name="discAmttd" id="discAmttd" class="form-control commantd" readonly="readonly"></td> 
									  <td><input type="text" name="gstPercentagetd" id="gstPercentagetd" class="form-control commantd" readonly="readonly"></td>
									  <td><input type="text" name="gstAmttd" id="gstAmttd" class="form-control commantd" readonly="readonly"></td>
									  <td><input type="text" name="totalAmttd" id="totalAmttd" class="form-control commantd" readonly="readonly"></td>
									  <td style="background-color: white;border: 1px white"><i class="fas fa-times fa-2x remove-btn"></i></td>
									  
									</tr>`

  $(tbody).append(markup);
  setTimeout(() => $("[name=itemNametd]", tbody).last().focus(), 100);

  $("[name=itemNametd]", tbody).last().autocomplete({
    source: autoCompleteData

  });




}
rowappend($('tbody', '#tableInvoice'))

function getValues(row) {

  const search = ($('[name=itemNametd]', row).val()).toString()
  const value = tableData[search];
  CostPrice = value.costPrice;

  if (value) {
    $(row).find("[name=itemCodetd]").val(value.itemCode);
    $(row).find("[name=mrptd]").val(value.mrp);
    $(row).find("[name=purRatetd]").val(CostPrice);

    $(row).find("[name=gstPercentagetd]").val(value.gstPercentage);
  }

}
document.addEventListener("keydown", function(e) {
  const row = e.target.parentElement.parentElement
  if (event.target.matches('[name=itemNametd]')) {

    var keycode = e.keyCode || event.e;
    if (keycode == '13') {

      getValues(e.target.parentElement.parentElement)
      $("[name=purRatetd]").focus();

    }
  }

});
$(document).on('focusout', (e) => {

  const row = e.target.parentElement.parentElement
  if (e.target.matches("[name=itemNametd]")) {


    getValues(e.target.parentElement.parentElement)
    $("[name=purRatetd]").focus();

  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet" />

<div class="row tableInvoice" id="commonDvScroll">
  <table class="table table-bordered" id="tableInvoice">
    <thead>
      <tr>
        <th id="itemNameth" class="commanth">Item Name</th>
        <th id="itemCodeth" class="commanth">Item Code</th>
        <th id="unitQtyth" class="commanth">Unit Qty</th>
        <th id="purRateth" class="commanth">Pur.Rate</th>
        <th id="discPercentageth" class="commanth">Disc%</th>
        <th id="discAmtth" class="commanth">Disc Amt</th>
        <th id="gstPercentageth" class="commanth">Gst%</th>
        <th id="gstAmtth" class="commanth">Gst Amt</th>
        <th id="totalAmtth" class="commanth">Total Amount</th>
      </tr>
    </thead>
    <tbody>

    </tbody>

  </table>

</div>

please check out this image for better understanding

When I type and there is only one item left as option I want that to come inside the input field so that the user does not select it manually.

If there is any other way to do this autocomplete I am open to use that, I just want so that while I am typing I should get the input field filled as I don't want to select it manually.

Upvotes: 0

Views: 203

Answers (2)

Shridhar Sharma
Shridhar Sharma

Reputation: 2387

Here you go, you need to use response callback for that

var tableData = {
  "ALMOND CHBAR~2402": {
    "itemName": "ALMOND CHBAR",
    "itemCode": "2402",
    "costPrice": 20.0,
    "gstPercentage": 14.5,
    "mrp": 30.0
  },
  "A BR SB EX~333": {
    "itemName": "A BR SB EX",
    "itemCode": "333",
    "costPrice": 1.0,
    "gstPercentage": 0.0,
    "mrp": 1.0
  }
}


var autoCompleteData = Object.keys(tableData);

function rowappend(tbody) {

  const markup =
    `<tr>
									  <td>
									    <input type="text" class="form-control commanChange" id="itemNametd" name="itemNametd">
									  </td>
									  <td><input type="text" name="itemCodetd" id="itemCodetd" class="form-control commantd" readonly="readonly"></td>
									  <td><input type="text" name="mrptd" id="mrptd" class="form-control commantd" readonly="readonly"></td>
									  <td><input type="text" name="purRatetd" id="purRatetd" class="form-control commantd"></td>
									  <td>
									    <input type="tel" id="unitQtytd"class="form-control commanChange" name="unitQtytd">
									  </td>
						               			 
									  <td>
									    <input type="tel" id="discPercentagetd"class="form-control commanChange" name="discPercentagetd" >
									  </td>
									  <td><input type="text" name="discAmttd" id="discAmttd" class="form-control commantd" readonly="readonly"></td> 
									  <td><input type="text" name="gstPercentagetd" id="gstPercentagetd" class="form-control commantd" readonly="readonly"></td>
									  <td><input type="text" name="gstAmttd" id="gstAmttd" class="form-control commantd" readonly="readonly"></td>
									  <td><input type="text" name="totalAmttd" id="totalAmttd" class="form-control commantd" readonly="readonly"></td>
									  <td style="background-color: white;border: 1px white"><i class="fas fa-times fa-2x remove-btn"></i></td>
									  
									</tr>`

  $(tbody).append(markup);
  setTimeout(() => $("[name=itemNametd]", tbody).last().focus(), 100);

  $("[name=itemNametd]", tbody).last().autocomplete({
    source: autoCompleteData,
    response: (e, ui)=>{
      if(ui.content.length === 1){
        $(e.target).val(ui.content[0].label);
        $(e.target).autocomplete( "close" );
      }
    }
  });




}
rowappend($('tbody', '#tableInvoice'))

function getValues(row) {

  const search = ($('[name=itemNametd]', row).val()).toString()
  const value = tableData[search];
  CostPrice = value.costPrice;

  if (value) {
    $(row).find("[name=itemCodetd]").val(value.itemCode);
    $(row).find("[name=mrptd]").val(value.mrp);
    $(row).find("[name=purRatetd]").val(CostPrice);

    $(row).find("[name=gstPercentagetd]").val(value.gstPercentage);
  }

}
document.addEventListener("keydown", function(e) {
  const row = e.target.parentElement.parentElement
  if (event.target.matches('[name=itemNametd]')) {

    var keycode = e.keyCode || event.e;
    if (keycode == '13') {

      getValues(e.target.parentElement.parentElement)
      $("[name=purRatetd]").focus();

    }
  }

});
$(document).on('focusout', (e) => {

  const row = e.target.parentElement.parentElement
  if (e.target.matches("[name=itemNametd]")) {


    getValues(e.target.parentElement.parentElement)
    $("[name=purRatetd]").focus();

  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet" />

<div class="row tableInvoice" id="commonDvScroll">
  <table class="table table-bordered" id="tableInvoice">
    <thead>
      <tr>
        <th id="itemNameth" class="commanth">Item Name</th>
        <th id="itemCodeth" class="commanth">Item Code</th>
        <th id="unitQtyth" class="commanth">Unit Qty</th>
        <th id="purRateth" class="commanth">Pur.Rate</th>
        <th id="discPercentageth" class="commanth">Disc%</th>
        <th id="discAmtth" class="commanth">Disc Amt</th>
        <th id="gstPercentageth" class="commanth">Gst%</th>
        <th id="gstAmtth" class="commanth">Gst Amt</th>
        <th id="totalAmtth" class="commanth">Total Amount</th>
      </tr>
    </thead>
    <tbody>

    </tbody>

  </table>

</div>

Upvotes: 1

manish thakur
manish thakur

Reputation: 820

I have found Something in j query autocomplete plug i.e

autoSelectFirst: true,
 autoFocus: true

this is doing what I am trying to achieve

var tableData = {
  "ALMOND CHBAR~2402": {
    "itemName": "ALMOND CHBAR",
    "itemCode": "2402",
    "costPrice": 20.0,
    "gstPercentage": 14.5,
    "mrp": 30.0
  },
  "A BR SB EX~333": {
    "itemName": "A BR SB EX",
    "itemCode": "333",
    "costPrice": 1.0,
    "gstPercentage": 0.0,
    "mrp": 1.0
  }
}


var autoCompleteData = Object.keys(tableData);

function rowappend(tbody) {

  const markup =
    `<tr>
									  <td>
									    <input type="text" class="form-control commanChange" id="itemNametd" name="itemNametd">
									  </td>
									  <td><input type="text" name="itemCodetd" id="itemCodetd" class="form-control commantd" readonly="readonly"></td>
									  <td><input type="text" name="mrptd" id="mrptd" class="form-control commantd" readonly="readonly"></td>
									  <td><input type="text" name="purRatetd" id="purRatetd" class="form-control commantd"></td>
									  <td>
									    <input type="tel" id="unitQtytd"class="form-control commanChange" name="unitQtytd">
									  </td>
						               			 
									  <td>
									    <input type="tel" id="discPercentagetd"class="form-control commanChange" name="discPercentagetd" >
									  </td>
									  <td><input type="text" name="discAmttd" id="discAmttd" class="form-control commantd" readonly="readonly"></td> 
									  <td><input type="text" name="gstPercentagetd" id="gstPercentagetd" class="form-control commantd" readonly="readonly"></td>
									  <td><input type="text" name="gstAmttd" id="gstAmttd" class="form-control commantd" readonly="readonly"></td>
									  <td><input type="text" name="totalAmttd" id="totalAmttd" class="form-control commantd" readonly="readonly"></td>
									  <td style="background-color: white;border: 1px white"><i class="fas fa-times fa-2x remove-btn"></i></td>
									  
									</tr>`

  $(tbody).append(markup);
  setTimeout(() => $("[name=itemNametd]", tbody).last().focus(), 100);

  $("[name=itemNametd]", tbody).last().autocomplete({
    source: autoCompleteData,
    autoSelectFirst: true,
    autoFocus: true

  });




}
rowappend($('tbody', '#tableInvoice'))

function getValues(row) {

  const search = ($('[name=itemNametd]', row).val()).toString()
  const value = tableData[search];
  CostPrice = value.costPrice;

  if (value) {
    $(row).find("[name=itemCodetd]").val(value.itemCode);
    $(row).find("[name=mrptd]").val(value.mrp);
    $(row).find("[name=purRatetd]").val(CostPrice);

    $(row).find("[name=gstPercentagetd]").val(value.gstPercentage);
  }

}
document.addEventListener("keydown", function(e) {
  const row = e.target.parentElement.parentElement
  if (event.target.matches('[name=itemNametd]')) {

    var keycode = e.keyCode || event.e;
    if (keycode == '13') {

      getValues(e.target.parentElement.parentElement)
      $("[name=purRatetd]").focus();

    }
  }

});
$(document).on('focusout', (e) => {

  const row = e.target.parentElement.parentElement
  if (e.target.matches("[name=itemNametd]")) {


    getValues(e.target.parentElement.parentElement)
    $("[name=purRatetd]").focus();

  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet" />

<div class="row tableInvoice" id="commonDvScroll">
  <table class="table table-bordered" id="tableInvoice">
    <thead>
      <tr>
        <th id="itemNameth" class="commanth">Item Name</th>
        <th id="itemCodeth" class="commanth">Item Code</th>
        <th id="unitQtyth" class="commanth">Unit Qty</th>
        <th id="purRateth" class="commanth">Pur.Rate</th>
        <th id="discPercentageth" class="commanth">Disc%</th>
        <th id="discAmtth" class="commanth">Disc Amt</th>
        <th id="gstPercentageth" class="commanth">Gst%</th>
        <th id="gstAmtth" class="commanth">Gst Amt</th>
        <th id="totalAmtth" class="commanth">Total Amount</th>
      </tr>
    </thead>
    <tbody>

    </tbody>

  </table>

</div>

i am posting this answer, but I am ready to use other approaches also

Upvotes: 0

Related Questions