This project is not maintained anymore. Maybe a Vue 3 version will be in the works in the future. Maybe not.
A vue component for pivot table
Live demo (jsfiddle)
npm install --save @click2buy/vue-pivot-table
This project provides 2 components:
Pivot
: aggregation table with drag & drop user interface to configure rows/columns
PivotTable
: aggregation table only
While the Pivot
component provides the full experience, the PivotTable
can be used standalone if you need only a table.
import { Pivot } from '@click2buy/vue-pivot-table'
export default {
components : { Pivot } ,
// Basic data for component props
data : ( ) => {
return {
data : Object . freeze ( [ { x : 0 , y : 0 , z : 0 } , { x : 1 , y : 1 , z : 1 } ] ) ,
fields : [ {
key : 'x' ,
getter : item => item . x ,
label : 'X'
} , {
key : 'y' ,
getter : item => item . y ,
label : 'Y'
} , {
key : 'z' ,
getter : item => item . z ,
label : 'Z'
} ] ,
rowFieldKeys : [ 'y' , 'z' ] ,
colFieldKeys : [ 'x' ] ,
reducer : ( sum , item ) => sum + 1
}
}
. . .
}
< pivot :data ="data " :fields ="fields " :row-field-keys ="rowFieldKeys " :col-field-keys ="colFieldKeys " :reducer ="reducer ">
<!-- Optional slots can be used for formatting table headers and values, see documentation below -->
</ pivot >
import { PivotTable } from '@click2buy/vue-pivot-table'
export default {
components : { PivotTable } ,
// Basic data for component props
data : ( ) => {
return {
data : Object . freeze ( [ { x : 0 , y : 0 , z : 0 } , { x : 1 , y : 1 , z : 1 } ] ) ,
rowFields : [ {
getter : item => item . y ,
label : 'Y'
} , {
getter : item => item . z ,
label : 'Z'
} ] ,
colFields : [ {
getter : item => item . x ,
label : 'X'
} ] ,
reducer : ( sum , item ) => sum + 1
}
}
. . .
}
< pivot-table :data ="data " :row-fields ="rowFields " :col-fields ="colFields " :reducer ="reducer ">
<!-- Optional slots can be used for formatting table headers and values, see documentation below -->
</ pivot-table >
Property
Type
Default
Description
data
Object Array
[]
Dataset to use in the pivot
fields
Array
[]
Fields definition (see fields
element format )
available-field-keys
Array
[]
Keys of the fields to show as "available" by default
row-field-keys
Array
[]
Keys of the fields to use as rows by default
col-field-keys
Array
[]
Keys of the fields to use as columns by default
reducer
function
(sum, item) => sum + 1
Function applied to reduce data
in the pivot table
reducer-initial-value
any
0
Initial value used when applying reducer
no-data-warning-text
String
'No data to display.'
Text to display when data
is empty
is-data-loading
Boolean
false
Display a loading content instead of the table when the value is true
(see slots for customization)
default-show-settings
Boolean
true
Show settings at component creation
available-fields-label-text
String
'Available fields'
Text for available fields drag area
rows-label-text
String
'Rows'
Text for the rows drag area
cols-label-text
String
'Columns'
Text for the columns drag area
hide-settings-text
String
'Hide settings'
Text for the "hide settings" button
show-settings-text
String
'Show settings'
Text for the "show settings" button
select-all-text
String
'Select all'
Text for the "Select all" button in the dropdown value filter
unselect-all-text
String
'Unselect all'
Text for the "Unselect all" button in the dropdown value filter
Property
Type
Description
key
String
A unique string value to identify the field
label
String
Text to display in the draggable element
labelSlotName
String
Optional - Name of the slot to use to format the label content
getter
Function
Function to apply on an element of data
to get the field value
sort
Function
Optional - Function to order fields in the pivot table header ; if no value is provided, javascript-natural-sort will be applied
showHeader
Boolean
Optional (default: true
) - Whether the header should be displayed in the pivot table
showFooter
Boolean
Optional (default: false
) - Whether the footer should be displayed in the pivot table
headerSlotName
String
Optional - Name of the slot to use to format the header in the pivot table ; if no slot name is provided, the value will be displayed as found in data
headerSlotNames
String Array
Optional - Names of the slots to use to format the headers in the pivot table
headers
Array
Optional - Definition of the headers (see headers
element format )
footerSlotName
String
Optional - Same as above for the footer
footerSlotNames
String Array
Optional - Same as above for the footer
headerAttributeFilter
Boolean
Optional (default: false
) - Activate dropdown to filter field header attributes
valueFilter
Boolean
Optional (default: false
) - Activate dropdown to filter field values
valueFilterSlotName
String
Optional - Name of the slot to use to format the values in the field values selection dropdown
headers
element format
Property
Type
Description
slotName
String
Name of the slot to use to format the header in the pivot table
label
String
If headerAttributeFilter
is activated, in the field dropdown: label to display next to the checkbox
checked
Boolean
If headerAttributeFilter
is activated, in the field dropdown: default checkbox value
Slot Name
Description
Scope
<field label slot name>
Content displayed in the field draggable label
<field header slot name>
Table header content for a field, referenced from the field
headerSlotName
property
{ value }
<field value filter slot name>
If field valueFilter
prop is set to true
: content in the menu next to the checkbox
{ value }
value
Table cell content
{ value, row, col }
(see value
slot scope )
loading
Content displayed while data-is-loading
prop is set to true
computing
Content displayed while table values are being loaded
Property
Type
Description
value
Number
Value of the cell
labels
Array
An array of objects corresponding to row/col labels - Each object has 2 props field
/value
with label field/value
Property
Type
Default
Description
data
Object Array
[]
Dataset to use in the pivot
row-fields
Array
[]
Fields to use as rows by default (see row-fields
/col-fields
element format )
col-fields
Array
[]
Fields to use as columns by default (see row-fields
/col-fields
element format )
reducer
function
(sum, item) => sum + 1
Function applied to reduce data
in the pivot table
reducer-initial-value
any
0
Initial value used when applying reducer
no-data-warning-text
String
'No data to display.'
Text to display when data
is empty
is-data-loading
Boolean
false
Display a loading content instead of the table when the value is true
(see slots for customization)
row-fields
/col-fields
element format
Property
Type
Description
getter
Function
Function to apply on an element of data
to get the field value
sort
Function
Optional - Function to order fields in the pivot table header ; if no value is provided, javascript-natural-sort will be applied
valuesFiltered
Set
Optional - A set of values to filter displayed rows/columns
showHeader
Boolean
Optional (default: true
) - Whether the header should be displayed in the pivot table
showFooter
Boolean
Optional (default: false
) - Whether the footer should be displayed in the pivot table
headerSlotName
String
Optional - Name of the slot to use to format the header in the pivot table ; if no slot name is provided, the value will be displayed as found in data
headerSlotNames
String Array
Optional - Names of the slots to use to format the headers in the pivot table
footerSlotName
String
Optional - Same as above for the footer
footerSlotNames
String Array
Optional - Same as above for the footer
Slot Name
Description
Scope
<field header slot name>
Table header content for a field, referenced from row-field
/col-field
headerSlotName
property
{ value }
value
Table cell content
{ value, row, col }
(see value
slot scope )
loading
Content displayed while data-is-loading
prop is set to true
computing
Content displayed while table values are being loaded
Property
Type
Description
value
Number
Value of the cell
row
Array
Row values of the cell
col
Array
Column values of the cell
Note: if your final table is too large and you use a component in the value
slot, you might consider using a functional component to improve performance.
If this component is used with large datasets, consider applying Object.freeze
on your data
object to avoid useless change tracking on each data element.
See https://vuejs.org/v2/guide/instance.html#Data-and-Methods .
# Install dependencies
npm install
# Serve with hot reload at localhost:8080
npm run serve
# Build js libraries
npm run build-lib