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λ΄μ©μ λ°κΏλ νλΈ κ°μκ° κ°μΌλ©΄ νΌλ²μ λ°μλμ§ μλ λ¬Έμ κ° μμ λμμ΅λλ€.