κ°€μ΄λ“œ
릴리즈
v2.0.2

v2.0.2

μƒˆ κΈ°λŠ₯

Headless λͺ¨λ“œ

  • general.headlessλ₯Ό μ§€μ •ν•˜λ©΄ νˆ΄λ°”(뢁 헀더), ν—€λ“œλΌμΈ, 컬럼 λ°”, ν‘Έν„°, μΈμŠ€νŽ™ν„°, 탐색기, AI νŒ¨λ„ 없이 ν”Όλ²— ν…Œμ΄λΈ” 본체만 ν‘œμ‹œν•©λ‹ˆλ‹€. ν–‰ λ°” μ•„μ΄μ½˜, ν•„λ“œ 메뉴 λ²„νŠΌ, μ»¨ν…μŠ€νŠΈ 메뉴도 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 객체둜 μ§€μ •ν•˜λ©΄ ν•„μš”ν•œ νŒ¨λ„λ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 객체둜 μ§€μ •ν•  λ•ŒλŠ” visible: trueλ₯Ό ν•¨κ»˜ μ§€μ •ν•΄μ•Ό headless λͺ¨λ“œκ°€ μ μš©λ©λ‹ˆλ‹€.
    • field Β· filter: 였λ₯Έμͺ½μ— Fields Β· Filters 탭이 ν‘œμ‹œλ˜κ³ , 탭을 ν΄λ¦­ν•˜λ©΄ μΈμŠ€νŽ™ν„°κ°€ ν•΄λ‹Ή λͺ¨λ“œλ‘œ μ—΄λ¦½λ‹ˆλ‹€.
    • detail: κ°’ 셀을 λ”λΈ”ν΄λ¦­ν•˜λ©΄ 상세 데이터 νŒ¨λ„μ΄ μ—΄λ¦½λ‹ˆλ‹€.
  • νƒ­λ°”κ°€ μ—†μœΌλ―€λ‘œ νŽ˜μ΄μ§€λŠ” control.showPage()둜 μ „ν™˜ν•©λ‹ˆλ‹€.
const config = {
  general: {
    headless: { visible: true, field: true, filter: true, detail: true }, // 본체만 ν‘œμ‹œν•˜λ €λ©΄ headless: true
  },
};
 
control.showPage(1);       // 인덱슀둜 μ „ν™˜
control.showPage('page2'); // μ΄λ¦„μœΌλ‘œ μ „ν™˜

μ…€ 볡사

  • 셀을 ν΄λ¦­ν•˜κ±°λ‚˜ λ²”μœ„λ₯Ό μ„ νƒν•œ λ’€ Ctrl/Cmd+C둜 볡사할 수 μžˆμŠ΅λ‹ˆλ‹€. νƒ­μœΌλ‘œ κ΅¬λΆ„λœ ν…μŠ€νŠΈλ‘œ λ³΅μ‚¬λ˜μ–΄ μ—‘μ…€ 등에 κ·ΈλŒ€λ‘œ 뢙여넣을 수 있으며, ν—€λ”λŠ” ν¬ν•¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μ…€ μ»¨ν…μŠ€νŠΈ 메뉴에 'κ°’μœΌλ‘œ 볡사'(μ§‘κ³„λœ μ›λž˜ κ°’)와 'ν˜•μ‹λŒ€λ‘œ 볡사'(화면에 ν‘œμ‹œλ˜λŠ” κ°’) ν•­λͺ©μ΄ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • general.copyMode둜 ν‚€λ³΄λ“œ 볡사 μ‹œ 볡사할 κ°’μ˜ ν˜•νƒœλ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. νŽ˜μ΄μ§€μ˜ tables[].copyModeλ₯Ό μ§€μ •ν•˜λ©΄ κ·Έ 값이 μš°μ„ ν•©λ‹ˆλ‹€. μ„€μ • λŒ€ν™”μƒμžμ˜ 'ν‚€λ³΄λ“œ 볡사 (Ctrl/Cmd+C)' ν•­λͺ©μ—μ„œλ„ λ°”κΏ€ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 'value'(κΈ°λ³Έκ°’): μ§‘κ³„λœ μ›λž˜ κ°’. κ°’ ν‘œμ‹œ 방식(showAs), ν‘œμ‹œ ν˜•μ‹, formatterκ°€ μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    • 'display': 화면에 ν‘œμ‹œλ˜λŠ” ν…μŠ€νŠΈ. κ°’ ν‘œμ‹œ 방식, ν‘œμ‹œ ν˜•μ‹, formatter, 빈 μ…€ ν…μŠ€νŠΈκ°€ μ μš©λ©λ‹ˆλ‹€.
  • httpsκ°€ μ•„λ‹Œ http ν™˜κ²½μ—μ„œλ„ 볡사할 수 μžˆμŠ΅λ‹ˆλ‹€.
const config = {
  general: { copyMode: 'display' },
};

상세 데이터 νŒ¨λ„

  • detail.dataMode에 'agg'(집계 데이터)κ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν”Όλ²—μ˜ 집계 ν…Œμ΄λΈ” 전체 행을 ν‘œμ‹œν•˜λ©°, fieldsΒ·sourceFieldsλŠ” μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • νŒ¨λ„ λ©”λ‰΄μ—μ„œ '집계 데이터' Β· '큐브 데이터' Β· '원본 데이터' 쀑 ν•˜λ‚˜λ₯Ό 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • aggΒ·cube λͺ¨λ“œμ—μ„œλŠ” 차원 μ»¬λŸΌμ— 배경색이 ν‘œμ‹œλ©λ‹ˆλ‹€.
  • detail.columnMode μ˜΅μ…˜μ΄ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    • 'only'(κΈ°λ³Έκ°’): fieldsΒ·sourceFields에 μ§€μ •ν•œ ν•„λ“œλ§Œ, μ§€μ •ν•œ μˆœμ„œλŒ€λ‘œ ν‘œμ‹œν•©λ‹ˆλ‹€.
    • 'all': μ§€μ •ν•œ ν•„λ“œλ§Œ ν‘œμ‹œν•˜λ˜, λ°μ΄ν„°μ˜ μ›λž˜ ν•„λ“œ μˆœμ„œλŒ€λ‘œ ν‘œμ‹œν•©λ‹ˆλ‹€.
tables: [{
  detail: { dataMode: 'cube', fields: ['νŒλ§€μˆ˜λŸ‰', 'μ—°λ£Œ', 'κ΅­κ°€'] }, // νŒλ§€μˆ˜λŸ‰ β†’ μ—°λ£Œ β†’ κ΅­κ°€ μˆœμ„œλ‘œ ν‘œμ‹œ
}]

ν•„ν„° μ…€λ ‰ν„° μžλ™ 적용

  • general.autoFilterApplyλ₯Ό true둜 μ§€μ •ν•˜λ©΄ 헀더에 ν‘œμ‹œλ˜λŠ” λ“œλ‘­λ‹€μš΄Β·νŠΈλ¦¬ μ…€λ ‰ν„°μ—μ„œ 적용 λ²„νŠΌ 없이 ν•­λͺ©μ„ μ²΄ν¬ν•˜λŠ” μ¦‰μ‹œ ν•„ν„°κ°€ μ μš©λ©λ‹ˆλ‹€.
  • μ…€λ ‰ν„°λ§ˆλ‹€ autoApplyλ₯Ό μ§€μ •ν•˜λ©΄ κ·Έ 값이 μš°μ„ ν•©λ‹ˆλ‹€.
const config = {
  general: { autoFilterApply: true },
  filterSelectors: [
    { type: 'dropdown', cube: 'sales', slicer: 'μ°¨μ’…' },                   // μ¦‰μ‹œ 적용
    { type: 'dropdown', cube: 'sales', slicer: 'κ΅­κ°€', autoApply: false }, // 적용 λ²„νŠΌ μ‚¬μš©
  ],
};

트리 λ ˆμ΄μ•„μ›ƒ μ—°κ²°μ„ 

  • 트리 λ ˆμ΄μ•„μ›ƒ ν–‰ 바에 λΆ€λͺ¨ ν•„λ“œμ™€ μžμ‹ ν•„λ“œλ₯Ό μž‡λŠ” 연결선이 ν‘œμ‹œλ©λ‹ˆλ‹€. μ„  색은 CSS λ³€μˆ˜ --rpivot-tree-line-color둜 λ°”κΏ€ 수 μžˆμŠ΅λ‹ˆλ‹€.
:root {
  --rpivot-tree-line-color: #a8adb6;
}

AI

  • OpenAI 둜컬 λͺ¨λΈ μ˜΅μ…˜μ— apiTypeκ³Ό reasoningEffortκ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 두 μ˜΅μ…˜μ€ provider: 'openai'일 λ•Œλ§Œ μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • apiType: 'chat-completions'(κΈ°λ³Έκ°’) λ˜λŠ” 'responses'. μΆ”λ‘  λͺ¨λΈμ—μ„œ 도ꡬ ν˜ΈμΆœμ„ μ‚¬μš©ν•˜λ €λ©΄ 'responses'λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
    • reasoningEffort: μΆ”λ‘  μˆ˜μ€€('none' Β· 'minimal' Β· 'low' Β· 'medium' Β· 'high' Β· 'xhigh' Β· 'max'). μƒλž΅ν•˜λ©΄ λͺ¨λΈμ˜ 기본값을 μ‚¬μš©ν•˜λ©°, μ§€μ›ν•˜λŠ” 값은 λͺ¨λΈλ§ˆλ‹€ λ‹€λ¦…λ‹ˆλ‹€.
models: {
  type: 'local',
  name: 'gpt',
  provider: 'openai',
  modelName: '<MODEL_NAME>',
  apiKey: '<YOUR_OPENAI_API_KEY>',
  apiType: 'responses',
  reasoningEffort: 'low',
}

κ°œμ„ 

상세 데이터 νŒ¨λ„

  • λ‚ μ§œ ν•„λ“œκ°€ cubeΒ·source λͺ¨λ“œ λͺ¨λ‘ yyyy-MM-dd ν˜•μ‹μœΌλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€. μ΄μ „μ—λŠ” cube λͺ¨λ“œμ—μ„œ 숫자(νƒ€μž„μŠ€νƒ¬ν”„), source λͺ¨λ“œμ—μ„œ Date λ¬Έμžμ—΄λ‘œ ν‘œμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

버그 μˆ˜μ •

κ°’ ν‘œμ‹œ 방식

  • κ°’ ν•„λ“œκ°€ 2개 이상일 λ•Œ showAs의 parentColPercentΒ·parentRowPercent λΉ„μœ¨μ΄ λ‹€λ₯Έ κ°’ ν•„λ“œμ˜ μ†Œκ³„λ₯Ό κΈ°μ€€μœΌλ‘œ κ³„μ‚°λ˜μ–΄ 잘λͺ» ν‘œμ‹œλ˜λ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • κ°’ ν•„λ“œκ°€ 2개 이상이고 κΈ°μ€€ ν•„λ“œκ°€ κ°’ ν•„λ“œμ™€ 같은 좕에 μžˆμ„ λ•Œ, baseItem: '@next'κ°€ λ‹€μŒ ν•­λͺ©μ΄ μ•„λ‹ˆλΌ 자기 μžμ‹ κ³Ό λΉ„κ΅λ˜λ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ ν•­λͺ©μ΄ μ—†λŠ” λ§ˆμ§€λ§‰ ν•­λͺ©μ€ 빈 칸으둜 ν‘œμ‹œλ©λ‹ˆλ‹€.

μ…€ 선택

  • ν–‰Β·μ—΄ 총계λ₯Ό μ•žμͺ½μ— κ³ μ •(fixed: true)ν–ˆμ„ λ•Œ λ§ˆμ§€λ§‰ 데이터 ν–‰Β·μ—΄μ˜ μ…€μ—μ„œ λ“œλž˜κ·Έ 선택이 λ˜μ§€ μ•Šκ³  였λ₯˜κ°€ λ°œμƒν•˜λ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ°’ μ…€

  • μ—΄ 차원(λ˜λŠ” ν–‰ 차원)이 ν•˜λ‚˜λ„ μ—†λŠ” ν”Όλ²—μ—μ„œ λͺ¨λ“  κ°’ 셀이 총계 μ…€λ‘œ 처리되던 λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이제 λ°˜λŒ€ 좕을 κΈ°μ€€μœΌλ‘œ 일반 κ°’ μ…€ λ˜λŠ” μ†Œκ³„ μ…€λ‘œ 처리되며, μ…€ μŠ€νƒ€μΌκ³Ό μ…€ μ˜€λ²„λ ˆμ΄ 적용 λŒ€μƒ, μ…€ μ •λ³΄μ˜ vt 값도 이에 맞게 λ°”λ€λ‹ˆλ‹€.
  • κ°’ ν•„λ“œ className에 곡백으둜 μ—¬λŸ¬ 클래슀λ₯Ό μ§€μ •ν•˜κ±°λ‚˜ formatterκ°€ λ°˜ν™˜ν•œ classNameκ³Ό ν•¨κ»˜ μ§€μ •ν•˜λ©΄ λ Œλ”λ§ 쀑 였λ₯˜κ°€ λ°œμƒν•˜λ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • formatterκ°€ λ°˜ν™˜ν•˜λŠ” μ•„μ΄μ½˜μ΄ μ—†μ–΄μ‘Œλ‹€κ°€ λ‹€λ₯Έ μ•„μ΄μ½˜μœΌλ‘œ λ°”λ€Œλ©΄ 이전 μ•„μ΄μ½˜μ΄ ν‘œμ‹œλ˜λ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ…€ μ˜€λ²„λ ˆμ΄

  • κ°•μ‘°(highlight) κ·œμΉ™μ˜ updateOption()을 ν˜ΈμΆœν•˜λ©΄ "Not implemented" μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
const rule = control.table.fields.getValueField('νŒλ§€μˆ˜λŸ‰').highlight.rules[0];
 
rule.updateOption('value', 1);

μ‹œλ¦¬μ¦ˆ

  • 슀파크 λ Œλ”λŸ¬(sparkbar Β· sparkline Β· sparkwinloss) 속성을 λŸ°νƒ€μž„μ— λ³€κ²½ν•  λ•Œμ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    • type 없이 λ Œλ”λŸ¬ μ†μ„±λ§Œ μ§€μ •ν•˜λ©΄ λ Œλ”λŸ¬κ°€ text둜 λ°”λ€Œλ˜ 문제
    • λ Œλ”λŸ¬ 객체의 속성을 직접 λ³€κ²½ν•˜λ©΄ 화면에 λ°˜μ˜λ˜μ§€ μ•Šλ˜ 문제
    • sparkline의 lineColorΒ·areaColorλ₯Ό undefined둜 지정해도 이전 색이 λ‚¨λ˜ 문제. 이제 κΈ°λ³Έ μƒ‰μœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.
book.updateItem(series, { renderer: { barColor: '#ff0000' } }); // κΈ°μ‘΄ λ Œλ”λŸ¬ μœ μ§€
book.updateProp(series.renderer, 'barColor', '#ff0000');

상세 데이터 νŒ¨λ„

  • 상세 데이터 νŒ¨λ„μ΄ μ—΄λ¦° μƒνƒœμ—μ„œ ν”Όλ²— ν•„λ“œλ₯Ό λͺ¨λ‘ μ œκ±°ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•˜λ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

ν•„ν„°

  • μΈμŠ€νŽ™ν„° Filters νƒ­μ˜ νƒ€μž„λΌμΈ μ…€λ ‰ν„°μ—μ„œ Years Β· Quarters Β· Days λ²„νŠΌμ„ 클릭해도 λ‹¨μœ„κ°€ λ°”λ€Œμ§€ μ•Šλ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • μΈμŠ€νŽ™ν„° ν•„ν„° νŒ¨λ„μ—μ„œ ν•„ν„° μ…€λ ‰ν„° 제λͺ© μ•žμ˜ μ•„μ΄μ½˜μ΄ 보이지 μ•Šλ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

내보내기

  • μ—°λ„μ²˜λŸΌ 숫자 값을 κ°€μ§„ 차원이 ν–‰Β·μ—΄ 헀더에 μžˆμ„ λ•Œ CSVΒ·PDF λ‚΄λ³΄λ‚΄κΈ°μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•˜λ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 헀더 셀은 ν™”λ©΄κ³Ό 같은 λ ˆμ΄λΈ”λ‘œ λ‚΄λ³΄λƒ…λ‹ˆλ‹€.

React Β· Vue

  • RealPivotReact에 modulesΒ·cubesΒ·tableOptionsλ₯Ό 인라인 객체둜 λ„˜κΈ°λ©΄ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ λ‹€μ‹œ λ Œλ”λ§λ  λ•Œλ§ˆλ‹€ 피벗이 μƒˆλ‘œ λ§Œλ“€μ–΄μ Έ ν•„ν„°Β·ν•„λ“œ 배치 등이 μ΄ˆκΈ°ν™”λ˜λ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • RealPivotVueμ—μ„œ cubes λ‚΄μš©μ„ 바꿔도 큐브 κ°œμˆ˜κ°€ κ°™μœΌλ©΄ 피벗에 λ°˜μ˜λ˜μ§€ μ•Šλ˜ λ¬Έμ œκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.