0

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

  • When I type for instance 333 in autocomplete field and only one option is there I want to populate that inside my inputfield. I don't want the user to manually select that option, just type if that matched to a single name, then on pressing enter populate that inside the input field.

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.

halfer
  • 19,824
  • 17
  • 99
  • 186
manish thakur
  • 760
  • 9
  • 35
  • 76
  • Check out https://api.jqueryui.com/autocomplete/#option-autoFocus – mkane Jul 01 '19 at 09:47
  • @mkane yes I just found that – manish thakur Jul 01 '19 at 09:49
  • Note that we prefer a technical style of writing here. We gently discourage greetings, hope-you-can-helps, thanks, advance thanks, notes of appreciation, regards, kind regards, signatures, please-can-you-helps, chatty material and abbreviated txtspk, pleading, how long you've been stuck, voting advice, meta commentary, etc. Just explain your problem, and show what you've tried, what you expected, and what actually happened. – halfer Jul 05 '19 at 22:22

2 Answers2

1

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>
Shridhar Sharma
  • 2,337
  • 1
  • 9
  • 13
0

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

manish thakur
  • 760
  • 9
  • 35
  • 76