! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

flexgrid에서 이미지 cell 의 이미지 크기를 조정하고 싶습니다. > Q&A | 토론

본문 바로가기

Wijmo

Q&A | 토론

VueJS flexgrid에서 이미지 cell 의 이미지 크기를 조정하고 싶습니다.

페이지 정보

작성자 죠이러버 작성일 2024-03-26 23:00 조회 43회 댓글 0건
제품 버전 : 5.20211.794
컨트롤 이름 : wj-flex-grid

본문

flexgrid 의 특정 cell 에 이미지를 보여주려고 하는데요.


이미지가 너무 작게 나옵니다.

원래 샘플은 마우스를 가져가면 크게 보여주는 방식인 것 같은데요.

이미지 비율을 유지해서 일정크기의 폭으로 맞춰서 보여주고 싶습니다. 

현재 아래와 같이 코드를 처리하고 있구요.


          // obj에 아래와 같이 정보기입

          if (obj.key == "F$Thumbnail") {

            obj.cssClass = "cell-img";

            obj.cellTemplate = CellMaker.makeImage({

              label: "image for ${item.F_x0024_Name}",

              width: "200px",

              height: "200px",

              click: (e, ctx) => alert("Clicked image for " + ctx.item.F_x0024_Name),

            });

          }

          if (obj.key.toLowerCase() !== "urid") {

            this.colInfo.push(obj); 

          }


colInfo 배열은 아래와 같이 wj-flex-grid-column 형태로 전달합니다.


      <wj-flex-grid

        :format-item="onFormatItem"

        class="grid-box"

        id="FlexGrid"

        :allowDragging="false"

        :autoSearch="true"

        :itemsSource="data"

        :isReadOnly="true"

        :alternatingRowStep="0"

        :initialized="flexInitialized"

        :selectionMode="'Row'"

        :loadedRows="onLoadedRows"

        :child-items-path="treeChildItemsPath"

        ref="normalGrid"

        :selectionChanged="selectionChanged"

        :style="sizeStyleHeightPxGrid"

      >

        <wj-flex-grid-column 

          v-for="item in colInfo"

          :key="item.key"

          :binding="item.binding"

          :header="item.header"

          :cssClass="item.cssClass"

          :cellTemplate="item.cellTemplate"

        ></wj-flex-grid-column>

        <wj-flex-grid-filter />

      </wj-flex-grid>


style은 아래와 같이 적용해보았습니다.


<style lang="scss">

@import "../../../node_modules/@grapecity/wijmo.styles/wijmo.css";


.wj-flexgrid {

  max-height: 300px;


  .wj-cell {

    padding: 6px 10px;


    &.cell-img {

      padding: 0;

      text-align: center;

      &:hover {

        z-index: 3 !important;

        overflow: visible;


        img {

          transform: scale(3) !important;

          transition: all 600ms !important;

        }

      }

    }

  }

}


.container-fluid {

  height: 100%;

}

.top-slot {

  display: flex;

  flex-direction: row-reverse;

  flex-wrap: nowrap;

  margin: 5px;

  /* font-size: 0.8em; */

  span {

    font-size: 12px;

    color: #6e768c;

  }

}

/* .top-slot.showbutton {

  min-height: 30px;

} */

.button-row {

  min-height: 20px;

  white-space: normal;

  overflow: hidden;

}

.btn-action {

  margin-right: 4px;

}

</style>


현재는 아래와 같이 보이고 있습니다. (Thumbnail 컬럼)



빨간색으로 표시한부분 이미지의 width를 해당 컬럼의 넓이 만큼 키우고 비율을 유지해서 표시하고 싶습니다.

어떻게 하면 되는지 방법을 알려주시면 감사하겠습니다.


답변 부탁드립니다.



  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

3 답변

VueJS Re: flexgrid에서 이미지 cell 의 이미지 크기를 조정하고 싶습니다.

추천0 이 글을 추천하셨습니다 비추천0

페이지 정보

작성자 MESCIUS루시 작성일 2024-03-28 10:03 댓글 0건

본문

안녕하세요 메시어스입니다.


셀의 너비에 따라 셀 내부의 이미지의 크기를 비율에 맞게 조정하고 싶은 경우, formatItem과 getCellBoundingRect를 이용하시면됩니다.


viewport에서 셀 요소의 경계를 가져오는 getCellBoundingRect를 통해 이미지가 담긴 셀의 너비를 가져온 뒤, 셀을 사용자 정의할 수 있는 formaItem에서 이미지의 너비와 높이를 설정해줍니다. 자세한 코드는 아래 샘플에서 확인할 수 있습니다.


더불어 너비에 따라 셀의 높이 또한 조절되어야 하는데 성능 향상을 위해 비동기적으로 행 크기를 조절방법을 적용하고 있습니다. 해당 방법에 대한 안내는 아래 데모를 참고하여주시기 바랍니다.


- 비동기적으로 행 크기 자동 조정 (Vue) 데모



 


다른 긍금한 점이 생기면 문의주시기 바랍니다.


감사합니다.

메시어스 드림

댓글목록

등록된 댓글이 없습니다.

VueJS Re: flexgrid에서 이미지 cell 의 이미지 크기를 조정하고 싶습니다.

추천0 이 글을 추천하셨습니다 비추천0

페이지 정보

작성자 죠이러버 작성일 2024-03-30 13:58 댓글 0건

본문

답변 감사드립니다.


그런데 알려주신 방식을 제 코드에 적용하기에 좀 문제점이 있습니다.

제가 아는 범위에서 어떻게든 적용해보려고 했는데 FlexGrid 가 자꾸 이상 동작을 하네요.

일단 해당 그리드를 다양한 페이지에서 공통적으로 사용하고 있는 부분이 있고, 데이터가 동적이라 이미지 셀도 몇 번째 컬럼에 올지 알 수 없습니다. 이미지 컬럼이 없을 수도 있구요.


wj-flex-grid 를 다음과 같이 사용중인데요.


      <wj-flex-grid
        :format-item="onFormatItem"
        class="grid-box"
        id="FlexGrid"
        :allowDragging="false"
        :autoSearch="true"
        :itemsSource="data"
        :isReadOnly="true"
        :alternatingRowStep="0"
        :initialized="flexInitialized"
        :selectionMode="'Row'"
        :loadedRows="onLoadedRows"
        :child-items-path="treeChildItemsPath"
        ref="normalGrid"
        :selectionChanged="selectionChanged"
        :style="sizeStyleHeightPxGrid"
      >
        <!--21-10-26-추가-->
        <wj-flex-grid-column
          v-for="item in colInfo"
          :key="item.key"
          :binding="item.binding"
          :header="item.header"
          :cssClass="item.cssClass"
          :cellTemplate="item.cellTemplate"
        ></wj-flex-grid-column>
        <wj-flex-grid-filter />
      </wj-flex-grid>


:format-item 핸들러인 onFormatItem 이 현재 다음과 같이 구성되어 있습니다.


    onFormatItem(s, e) {
      if (
        this.$route.params != null &&
        this.$route.params.id != null &&
        (this.$route.params.id == "receivedWork" || this.$route.params.id == "receivedDeploy")
      ) {
        for (let i = 0; i < this.data.length; i++) {
          if (this.data[i]["confirm_date"] != null && this.data[i]["confirm_date"] == "") {
            if (e.row == i) {
              e.cell.style.fontWeight = "bold";
            }
          }
        }
      } else {
        e.cell.style.fontWeight = "normal";
        // if (e.panel === s.cells && e.col === 1) {
        //   e.cell.childNodes[0].style.width = "200px";
        //   e.cell.childNodes[0].style.height = "auto";
        // }
      }
    },


 else 안의 주석부분에 주신걸 한번 적용해보려는 흔적이 있는데요. 이 부분에 해당 셀이 이미지 셀인 경우 해당 row의 높이를 강제로 조정하고 이미지 크기도 fix 하는 방식으로 다시 한번 알려주실 수 있을까요? 


현재 그리드에 데이터를 밀어 넣어주는 곳에서 다음과 같이 데이터를 만들어 넣어주고 있습니다.


        colInfo.forEach(item => {
          let obj = {
            key: item.name,
            binding: item.name,
            header: item.caption,
            cssClass: "",
            cellTemplate: "",
          };
          obj.binding = obj.binding.replace("$", "_x0024_");
          if (obj.key == "F$ThumbnailLink") {
            obj.cssClass = "cell-img";
            obj.cellTemplate = CellMaker.makeImage({
              label: "image for ${item.F_x0024_Name}",
              width: "200px",
              height: "200px",
              click: (e, ctx) => alert("Clicked image for " + ctx.item.F_x0024_Name),
            });
          }
          if (obj.key.toLowerCase() !== "urid") {
            this.bottomTreeColumn.push(obj);
          }
        });


F$ThumbnailLink를 key 로 가지는 경우 이미지 컬럼으로 간주하여 cssClass 및 cellTemplate 등을 넣고 있습니다.

이렇게 bottomTreeColumn 에 obj 를 넣어 위 grid의 :itemsSource="data" 의 data 에 전달되는 형태입니다.

그리고 추가로 말씀 드리자면 그리드에 들어오는 데이터가 가변적이라 아래와 같이 행 넓이를 조정하기 위해 onLoadedRows 에서 grid.autoSizeColumns(); 를 호출하고 있습니다.

아래는 현재 onLoadedRows 함수코드입니다.

    onLoadedRows: function(grid) {
      let column = grid.columns.getColumn("URID");
      if (column != null) column.visible = false;
      grid.autoSizeColumns();
      grid.select(-1, -1);
    },


이러한 조건에서 setTimeout 및 autoSize 를 사용하지 않고 이미지 width와 height를 100px로 고정해도 상관 없으니 :format-item 핸들러인 onFormatItem 함수 내에서 이미지 셀인 경우 이미지 셀 안의 이미지 크기를 설정하고 col 폭과 row 높이도 이미지 크기에 맞추어 설정하는 방식으로 구현하는 방안을 알려주시면 감사하겠습니다.


답변 부탁드립니다.

감사합니다.


댓글목록

등록된 댓글이 없습니다.

VueJS Re: flexgrid에서 이미지 cell 의 이미지 크기를 조정하고 싶습니다.

추천0 이 글을 추천하셨습니다 비추천0

페이지 정보

작성자 MESCIUS루시 작성일 2024-04-02 10:26 댓글 0건

본문

안녕하세요 메시어스입니다.


문의하신 내용이 동적인 데이터에서 이미지 셀의 열 위치가 유동적이며 값 자체가 없을 수 있어 해당 부분을 어떻게 처리해야 하는지에 대한 문의로 이해했습니다.


이를 해결하기 위해서는 formatItem에 조건문을 걸어 셀 내에 이미지가 있는지 확인 후, 이미지 크기 조절 및 행 높이를 조절할 수 있습니다.


아래 코드를 참고하시기 바랍니다. 아래 조건의 경우, 고객님의 요구사항에 맞게 사용자 정의 처리해서 사용하시기 바랍니다.


   grid.formatItem.addHandler(function (s, e) {
       // 셀 영역이고, cssClass가 cell-img이고 셀 영역내에 또 다른 요소가 있다면(ex. img 태그)
        if (
          e.panel === s.cells &&
          s.columns[e.col].cssClass === 'cell-img' &&
          e.cell.childNodes[0]
        ) {
          if (e.cell.childNodes[0].getAttribute('src')) { // 이미지가 있으면
           // 이미지 높이, 너비 설정
            e.cell.childNodes[0].style.width = '100px';
            e.cell.childNodes[0].style.height = '100px';
           // 이미지가 있는 행의 높이 조절
            grid.rows[e.row].height = 100;
          }         
	}
      });


더불어 공유하신 코드 가운데 몇 가지 확인 요청드립니다.


1. FlexGrid의 allowDragging 속성

=> 그리드의 allowDragging 속성의 값은 true/false 보다는 별도 열거값이 있습니다. 아래 API 문서를 확인해주시기 바랍니다.

- allowDragging API 문서



2. itemsSource 상의 data 값

=> cssClass와 cellTemplate과 같은 속성은 일반적으로 itemsSource에 추가되는 데이터 값보다는 Column 클래스에 대한 속성입니다. itemSource의 data 값에 해당 내용을 추가하고 계신다고 언급 하셨는데 해당 코드 아래 데모와 비교 및 재확인 요청드립니다.


- 셀 템플릿 데모


다른 궁금한 점이 생기면 문의주시기 바랍니다.


감사합니다.

메시어스 드림

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.