모달창에서 동적으로 생성되는 inputbox에 ajax로 db의 상품을 like 로 긁어와서 autocomplete 뿌려주려고 함.

모달창의 내역부분에 autocomplete를 붙여 놨더니, 보이지도 않는 dim 처리 되어있는 좌상단에 선택콤포넌트가 숨어있음

TASK

1) 숨어있는 autocomplete 의 머리 끄덩이를 잡고 팝업창 위로 끌어내자!

2) input box를 클릭하면 autocomplete 셀렉트박스가 나오도록

 

 

html -> section 부분은 모달입NI다.

<!-- [D]팝업 : w:1080 / pop_container 최대 높이값 865 : 865이상 컨텐츠가 들어가면 자동 세로 스크롤 생김 (최소해상도:1280:1024 기준)  -->
<section id="popEstimateWrite" class="pop_wrap pop_wrap_wid1">
	<tbody id="prodList" />
</selection>

 

js -> "모달창에 autocomplete 붙이는 법" 1번과 2번을 잘 보세요.

$(document).ready(function () {
    // 견적서등록 빨간라인 중 거래명세서내역 그리기
    const t1 = "<td><span class='input_box2'><input type='text' placeholder='' class='input_txt3 align_l' title=";
    const t2 = "<td><span class='input_box2'><input type='text' placeholder='' class='input_txt3 align_cn' title=";
    const t3 = "<td><span class='input_box2'><input type='text' placeholder='' class='input_txt3 align_r' title=";
    const t4 = "></span></td>";
    const h1 = "<tbody id='prodList'>";
    let h2 = (id) => {
        return "<tr>"
            + t2 + "'월'       id='month_"            + id + "' name='month'            numberOnly" + t4
            + t2 + "'일'       id='day_"              + id + "' name='day'              numberOnly" + t4
            + t1 + "'내역'     id='prodNm_"           + id + "' name='prodNm'                     " + t4
            + t2 + "'규격'     id='standard_"         + id + "' name='standard'                   " + t4
            + t3 + "'수량'     id='shippingQuantity_" + id + "' name='shippingQuantity' numberOnly" + t4
            + t3 + "'회수수량' id='returnQuantity_"   + id + "' name='returnQuantity'   numberOnly" + t4
            + t3 + "'재고수량' id='bucketQuantity_"   + id + "' name='bucketQuantity'   numberOnly" + t4
            + t3 + "'단가'     id='unitPrice_"        + id + "' name='unitPrice'        numberOnly" + t4
            + t3 + "'공급가액' id='supply_"           + id + "' name='supply'           numberOnly" + t4
            + t3 + "'세액'     id='tax_"              + id + "' name='tax'              numberOnly" + t4
            + t3 + "'총액'     id='totalPrice_"       + id + "' name='totalPrice'       numberOnly" + t4
            + "</tr>";
    }
    const h3 = "</tbody>";
    let tmp;
    for (let i=1; i<=8; i++) {
        tmp = tmp + h2(i);
    }
    $("#prodList").replaceWith(h1 + tmp + h3);

    // input tag에 숫자(+천단위 콤마)만 받겠음
    $("input:text[numberOnly]").on("keyup", function() {
        $(this).val(priceToString($(this).val().replace(/[^0-9]/g,"")));
    });

    //---------------------------------------------------------------------------------------------
    // 품목 autocomplete
    //---------------------------------------------------------------------------------------------
    $('input[name=prodNm]').focus(function() {
        var e = $.Event("keydown", { keyCode: 40 }); // 아래쪽화살표 keyCode
        $(this).trigger(e);
    });
    $('input[name=prodNm]').autocomplete({
        source : function( request, response ) { // 자동완성 대상이 되고자 하는 데이터를 입력하는 부분
            $.ajax({
                async: false,
                type: "get",
                url: "/api/goods/salesSlip?perPage=999",
                contentType: "application/json; charset=utf-8",
                data : {
                    prodNmLike: request.term
                },
                dataType: "json",
                success: function (result) {
                    const r = result.data.contents;
                    //서버에서 json 데이터 response 후 목록에 추가
                    response(
                        $.map(r, function(item) { // json[i] 번째 에 있는게 item 임.
                            return {
                                label: item.prodNm,         // 목록에 표시되는 값
                                value: item.prodNm          // 선택 시 input창에 표시되는 값
                            }
                        })
                    );
                },
                error : function() {                       // 실패
                    alert("오류가 발생했습니다.");
                }
            });
        },    // source 는 자동 완성 대상
        focus : function(event, ui) {   // autocomplete를 한글과 사용할때 커서를 사용해서 아이템을 선택하면 나머지가 사라져 버리는 버그
            return false;               // return false; 또는 event.preventDefault(); 를 사용해서 이벤트를 무시하게 하는 것
        },
        select: function (event, ui) {  // 아이템 선택시 실행됩니다. ui.item 이 선택된 항목을 나타내는 객체입니다.
            // $($(this).attr('id')).val(ui.item.label + " / " + ui.item.value);
            console.log("SELECTED : (" + $(this).attr('id')) + ") " + ui.item.label + " / " + ui.item.value);
        },
        minLength: 0,                   // 자동완성 기능이 발생하는 최소 글자 수, 0이면 화살표키보드 아래로 했을때 selectbox 나옴
        delay: 300,                     // input Field에 글자를 쓰고 autocomplete 창이 뜰 때까지 걸리는 시간 (ms)
        autoFocus: true,                // 첫 번째 항목 자동 포커스 발생 여부 설정 (default: false)
        classes : {                     // 위젯 요소에 추가 할 클래스를 지정
            'ui-autocomplete' : 'highlight'
        },
        // disabled: true,              // 자동완성 기능 끄기
        position: {
            my: "right top",
            at: "right bottom",
            //---------------------------------------------------------------------------------------------
            // [02. 모달창에 autocomplete 붙이는 법]
            of: $(this).attr('id') // 클릭한 id의 엘리먼트 밑에 선택창이 나오도록 지시
            //---------------------------------------------------------------------------------------------
        },
        close : function(event){         // 자동완성창 닫아질때 호출
            // console.log(event);
        }
    // UI를 마음대로 변경하는 부분 (기본 tag가 li로 되어 있음)
    }).autocomplete( "instance" )._renderItem = function( ul, item ) {
        return $( "<li>" )
            .append( "<div>" + item.label + "</div>" )
            .appendTo( ul );
    };

    //---------------------------------------------------------------------------------------------
    // [01. 모달창에 autocomplete 붙이는 법]
    // bootstrap modal, 레이어 팝업 위에 검색창을 띄우고 싶은데, 자동 완성 부분이 이상한 곳에 붙어있다면
    // appendTo 옵션에 모달창 id를 부여하여 modal 레이어 위에 autocomplete 가 보이도록 함 
    //---------------------------------------------------------------------------------------------
    $('input[name=prodNm]').autocomplete("option", "appendTo", $("#popEstimateWrite"));

});

 

jpa -> goods.prodNm.like 부분으로 검색

@Override
public List<Goods.Response> findListByRequest(Goods.Request request) {
  QGoods goods = QGoods.goods;
  QAgency qAgency = QAgency.agency;
  JPAQuery<Goods.Response> query = jpaQueryFactory.select(Projections.fields(Goods.Response.class,
          goods.id,
          goods.prodNm,
          goods.stockPrice,
          goods.salePrice,
          goods.agentId,
          goods.prodRtnYnMethod,
          goods.useYn,
          goods.prodUnitNmMethod,
          goods.createdAt,
          ExpressionUtils.as(
                  JPAExpressions
                          .select(qAgency.agencyName)
                          .from(qAgency)
                          .where(qAgency.id.eq(goods.agentId))
                  , "agentNm")
  ));
  query.from(goods);
  if (null != request.getAgentId() && 0 != request.getAgentId()) {
    query.where(goods.agentId.eq(request.getAgentId())
    );
  }
  if (!StringUtils.isNullOrEmpty(request.getProdNmLike())) {
    query.where(goods.prodNm.like("%" + request.getProdNmLike() + "%")
    );
  }

  List<Goods.Response> contents = query
          .orderBy(goods.prodNm.asc())
          .fetch();/*fetch 사용*/

  /*total Count 쿼리를 직접 날린다.*/
  long total = query.fetchCount();

  return contents;

}

 

두 부분만 주의하면 됨

of: $(this).attr('id') // 클릭한 id의 엘리먼트 밑에 선택창이 나오도록 지시
$('input[name=prodNm]').autocomplete("option", "appendTo", $("#popEstimateWrite"));

+ Recent posts