1. Cfg)Rtl 추가 - 아랍어 등 오른쪽에서 왼쪽으로 읽는 언어 대응
- 시트 본체, 헤더(리사이즈, 컬럼 이동, 정렬 표식), 스크롤바 위치, 트리 들여쓰기, 메뉴, 다이얼로그, 인쇄물, 엑셀 다운로드 등 좌우 반전 적용
- 아랍어 로케일 ar.js 신규 추가
- 아랍 숫자 대응을 위해 ar.js locale 파일에는 Digits 속성 추가
- 아랍-인도 숫자(٠~٩) 등 표시용 숫자 문자를 지정 가능
- 시트 내부 값과 서버 전송 값은 항상 아라비아 숫자 0~9 유지
- exportData, down2Excel, directDown2Excel, down2Pdf, doPrint RTL 대응
⚠ 함께 적용 필요
정상적인 사용을 위해 css, locale, servermodule, dialog, excel 적용이 필요합니다.
[사용 예시]
// 시트 전체를 RTL 모드로 표시
options.Cfg = {
Rtl: 1,
MsgLocale: "Ar" // 아랍어 언어팩과 함께 사용
};
options.Cols = [
// Align 지정은 그대로 두어도 됩니다. RTL 모드가 시각적으로 반전합니다.
{Type: "Text", Name: "Name", Header: "이름", Align: "Left"},
{Type: "Int", Name: "Qty", Header: "수량", Align: "Right"},
{Type: "Date", Name: "Regdt", Header: "등록일"}
];1. SearchMode:0 + Def.Header.Wrap 시트에서 헤더 높이 변화 시 보이는 행이 잘리거나 빈 공간이 생기던 현상 수정
2.Cfg.SelFocusColor:1 설정된 시트에서 그룹핑 상태로 blur() 호출 시 스크립트 오류 발생하던 현상 수정
ibsheet-excel.js · 1.1.40-20260903-13
1. RTL(우→좌) 모드 지원
RTL 모드에서 엑셀 다운로드 시 Align이 반전되어 다운로드 됩니다.
2. directLoadExcel 정상 완료 후 업로드 대기 이미지가 사라지지 않는 현상 수정
3. 비어있는 catch문 제거
ibsheet-dialog.js · 1.0.53-20260903-13
1. RTL(우→좌) 모드 지원
다이얼로그 레이아웃 및 드래그 요소 위치가 RTL 환경에 맞게 표시됩니다.
2. 보안 취약점으로 지적된 console.log 호출 제거
서버모듈 · 2.1.7
1.RTL 모드 엑셀 다운로드 지원
core 파일 업데이트 후 Cfg.Rtl:1 설정된 시트에서만 자동 지원 됩니다.
코어에 포함 (별도 버전 없음)
1. CSS 변경사항 - 각 테마별 main.css
(1) 기존 규칙 변경 (padding-right -> padding-inline-end)
.IBNoRight.IBType,.IBNoRight .IBType { padding-inline-end:2px; }
.IBLow .IBNoRight,.IBLow .IBNoRight .IBType { padding-inline-end:0px; }(2) RTL 전용 규칙 추가
/* 헤더 리사이즈 */
.IBRtl .IBHeaderResize { border-right:1px solid #6F7F94; border-left:2px solid white; }
.IBRtl .IBHeaderResize.IBNoRight { border-left:0px none; }
.IBRtl .IBHeaderResize.IBNoLeft { border-left:2px solid white!important; }
.IBRtl .IBHeaderResize.IBNoLeft.IBNoRight { border-left:0px none!important; }
/* 셀 경계, 문자 방향 */
.IBRtl .IBNoLeft,.IBRtl .IBNoSpaceLeft { border-right:0px none!important; }
.IBRtl .IBNoRight,.IBRtl .IBNoSpaceRight { border-right:1px solid #cfd1d6!important; }
.IBRtl .IBCellBase,.IBRtl .IBCellBase div { unicode-bidi:plaintext; }
.IBRtl .IBInt,.IBRtl .IBInt div,.IBRtl .IBFloat,.IBRtl .IBFloat div { unicode-bidi:normal; }
.IBRtl .IBCellBase a { unicode-bidi:normal; display:inline; }
.IBRtl .IBCellBase a.IBIconLink { display:inline-block; }
.IBRtl .IBCellBase span:not([class*='Radio']),.IBRtl .IBCellBase strong,.IBRtl .IBCellBase em,.IBRtl .IBCellBase b,.IBRtl .IBCellBase i,.IBRtl .IBCellBase label { unicode-bidi:plaintext; }
.IBRtl .IBCellBase.IBLink { text-overflow:clip; }
.IBRtl div.IBTree,.IBRtl td.IBTree { unicode-bidi:normal; }
/* 트리 라인 배경 위치 */
.IBRtl .IBWidth1 { background-position-x:26.6%; }
.IBRtl .IBWidth2 { background-position-x:13.3%,63.3%; }
.IBRtl .IBWidth3 { background-position-x:8.9%,42.2%,75.5%; }
.IBRtl .IBWidth1T { background-position-x:left 47.6%,calc(50.0% - 50.0px),right 52.2%; }
.IBRtl .IBWidth2T { background-position-x:left 18.9%,calc(29.2% - 70.8px),27.9%,69.5%; }
.IBRtl .IBWidth3T { background-position-x:100%,calc(20.6% - 79.4px),19.7%,49.1%,78.5%; }
.IBRtl .IBWidth4T { background-position-x:100%,calc(15.9% - 84.1px),15.2%,38%,60.6%,83.6%; }
/* 페이저, InfoRow, 헤더 그룹 */
.IBRtl .IBPagerEdit { direction:ltr; }
.IBRtl .IBInfoRow,.IBRtl .IBInfoRow div { unicode-bidi:plaintext; }
.IBRtl .IBHeaderGroupCustom,.IBRtl .IBHeaderGroupCustom div { unicode-bidi:plaintext; }
.IBRtl .IBCellHeader.IBNoRight { border-right:1px solid #6F7F94!important; }
/* 트리 라인 텍스트 정렬 */
.IBRtl .IBNoTreeLines1,.IBRtl .IBNoTreeLines2,.IBRtl .IBNoTreeLines3 { text-align:left; }
/* Side 아이콘 위치 */
.IBMain.IBRtl .IBSideLeft { padding-left:0px;padding-right:25px;background-position:right 5px center; }
.IBWide.IBRtl .IBSideLeft { padding-right:30px; }
.IBBig.IBRtl .IBSideLeft { padding-right:45px;background-position:right 10px center; }
.IBLow.IBRtl .IBSideLeft { padding-right:20px;background-position:right 4px center; }
.IBMain.IBRtl .IBSideRight { padding-right:0px;padding-left:25px;background-position:4px center; }
.IBWide.IBRtl .IBSideRight { padding-left:30px; }
.IBBig.IBRtl .IBSideRight { padding-left:45px;background-position:10px center; }
.IBLow.IBRtl .IBSideRight { padding-left:20px;background-position:4px center; }
/* 페이저 아이콘 좌우 반전 */
.IBRtl .IBToolPagerFirst,.IBRtl .IBToolPagerFirst1 { background-image:url(./icons/PagerLast.svg?v120); }
.IBRtl .IBToolPagerPrev,.IBRtl .IBToolPagerPrev1 { background-image:url(./icons/PagerNext.svg?v120); }
.IBRtl .IBToolPagerNext,.IBRtl .IBToolPagerNext1 { background-image:url(./icons/PagerPrev.svg?v120); }
.IBRtl .IBToolPagerLast,.IBRtl .IBToolPagerLast1 { background-image:url(./icons/PagerFirst.svg?v120); }
.IBRtl .pageNaviFirstElement { background-image:url(./icons/PagerLast.svg?v120); }
.IBRtl .pageNaviPrevElement { background-image:url(./icons/PagerNext.svg?v120); }
.IBRtl .pageNaviNextElement { background-image:url(./icons/PagerPrev.svg?v120); }
.IBRtl .pageNaviLastElement { background-image:url(./icons/PagerFirst.svg?v120); }(3) [dir='rtl'] 규칙 추가 (필터 다이얼로그, 메뉴, Find 다이얼로그 등)
/* 필터 다이얼로그 리사이즈 아이콘 */
[dir='rtl'] .IBFilterDialogResizingIcon { right:auto;left:5px;cursor:nesw-resize;transform:scaleX(-1); }
/* 메뉴 접힘/펼침 아이콘 */
[dir='rtl'] .IBMenuExpandedIcon,[dir='rtl'] .IBMenuCollapsedIcon { padding-right:0px!important; background-position:right center; }
[dir='rtl'] .IBMenuCollapsedIcon { background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%237A8899' stroke-width='2.5' fill='none' d='M11,3l-5,5l5,5'/%3E%3C/svg%3E"); }
[dir='rtl'] .IBMenuExpandedIcon > div,[dir='rtl'] .IBMenuCollapsedIcon > div { padding-left:0px; padding-right:20px; text-align:right!important; }
.IBWide [dir='rtl'] .IBMenuExpandedIcon > div,.IBWide [dir='rtl'] .IBMenuCollapsedIcon > div,[dir='rtl'] .IBWide .IBMenuExpandedIcon > div,[dir='rtl'] .IBWide .IBMenuCollapsedIcon > div { padding-left:0px; padding-right:26px; }
.IBHigh [dir='rtl'] .IBMenuExpandedIcon > div,.IBHigh [dir='rtl'] .IBMenuCollapsedIcon > div,[dir='rtl'] .IBHigh .IBMenuExpandedIcon > div,[dir='rtl'] .IBHigh .IBMenuCollapsedIcon > div { padding-left:0px; padding-right:32px; }
/* 메뉴 닫기 버튼, 메뉴 헤더 */
[dir='rtl'] .IBMenuClose { float:left; background-position:right top; }
.IBMenuHead[dir='rtl'] { padding-left:0; padding-right:23px; }
.IBWide .IBMenuHead[dir='rtl'] { padding-left:0; padding-right:30px; }
/* Find 다이얼로그 */
[dir='rtl'] .IBFindDlgTop div { float:right; }
[dir='rtl'] .IBFindDlgTop button { margin-left:0; margin-right:5px; }
[dir='rtl'] .IBFindDlgTop input { padding-left:0; padding-right:5px; }
[dir='rtl'] .IBFindDlgBottom button { margin-left:0; margin-right:5px; }다른 테마(default_img, grace, gray, krds, material, mint, simple)도 위 규칙과 동일하게 적용되었습니다.