Skip to content

Commit 4e0639f

Browse files
extend element tree example to Shiny
1 parent 54568e1 commit 4e0639f

File tree

1 file changed

+234
-0
lines changed

1 file changed

+234
-0
lines changed
+234
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
library(shiny)
2+
library(vueR)
3+
library(htmltools)
4+
library(d3r)
5+
library(treemap)
6+
7+
element <- htmlDependency(
8+
name = "element",
9+
version = "2.13.2",
10+
src = c(href="https://unpkg.com/element-ui@2.13.2/lib/"),
11+
script = "index.js",
12+
stylesheet = "theme-chalk/index.css"
13+
)
14+
15+
locale <- {tags$script(HTML(
16+
"
17+
ELEMENT.locale({
18+
el: {
19+
colorpicker: {
20+
confirm: 'OK',
21+
clear: 'Clear'
22+
},
23+
datepicker: {
24+
now: 'Now',
25+
today: 'Today',
26+
cancel: 'Cancel',
27+
clear: 'Clear',
28+
confirm: 'OK',
29+
selectDate: 'Select date',
30+
selectTime: 'Select time',
31+
startDate: 'Start Date',
32+
startTime: 'Start Time',
33+
endDate: 'End Date',
34+
endTime: 'End Time',
35+
prevYear: 'Previous Year',
36+
nextYear: 'Next Year',
37+
prevMonth: 'Previous Month',
38+
nextMonth: 'Next Month',
39+
year: '',
40+
month1: 'January',
41+
month2: 'February',
42+
month3: 'March',
43+
month4: 'April',
44+
month5: 'May',
45+
month6: 'June',
46+
month7: 'July',
47+
month8: 'August',
48+
month9: 'September',
49+
month10: 'October',
50+
month11: 'November',
51+
month12: 'December',
52+
week: 'week',
53+
weeks: {
54+
sun: 'Sun',
55+
mon: 'Mon',
56+
tue: 'Tue',
57+
wed: 'Wed',
58+
thu: 'Thu',
59+
fri: 'Fri',
60+
sat: 'Sat'
61+
},
62+
months: {
63+
jan: 'Jan',
64+
feb: 'Feb',
65+
mar: 'Mar',
66+
apr: 'Apr',
67+
may: 'May',
68+
jun: 'Jun',
69+
jul: 'Jul',
70+
aug: 'Aug',
71+
sep: 'Sep',
72+
oct: 'Oct',
73+
nov: 'Nov',
74+
dec: 'Dec'
75+
}
76+
},
77+
select: {
78+
loading: 'Loading',
79+
noMatch: 'No matching data',
80+
noData: 'No data',
81+
placeholder: 'Select'
82+
},
83+
cascader: {
84+
noMatch: 'No matching data',
85+
loading: 'Loading',
86+
placeholder: 'Select',
87+
noData: 'No data'
88+
},
89+
pagination: {
90+
goto: 'Go to',
91+
pagesize: '/page',
92+
total: 'Total {total}',
93+
pageClassifier: ''
94+
},
95+
messagebox: {
96+
title: 'Message',
97+
confirm: 'OK',
98+
cancel: 'Cancel',
99+
error: 'Illegal input'
100+
},
101+
upload: {
102+
deleteTip: 'press delete to remove',
103+
delete: 'Delete',
104+
preview: 'Preview',
105+
continue: 'Continue'
106+
},
107+
table: {
108+
emptyText: 'No Data',
109+
confirmFilter: 'Confirm',
110+
resetFilter: 'Reset',
111+
clearFilter: 'All',
112+
sumText: 'Sum'
113+
},
114+
tree: {
115+
emptyText: 'No Data'
116+
},
117+
transfer: {
118+
noMatch: 'No matching data',
119+
noData: 'No data',
120+
titles: ['List 1', 'List 2'], // to be translated
121+
filterPlaceholder: 'Enter keyword', // to be translated
122+
noCheckedFormat: '{total} items', // to be translated
123+
hasCheckedFormat: '{checked}/{total} checked' // to be translated
124+
},
125+
image: {
126+
error: 'FAILED'
127+
},
128+
pageHeader: {
129+
title: 'Back' // to be translated
130+
},
131+
popconfirm: {
132+
confirmButtonText: 'Yes',
133+
cancelButtonText: 'No'
134+
}
135+
}
136+
})
137+
"
138+
))}
139+
140+
# some random hierarchical data converted to proper format
141+
rhd <- d3r::d3_nest(
142+
treemap::random.hierarchical.data(),
143+
value_cols="x"
144+
)
145+
146+
ui <- tagList(
147+
html_dependency_vue(),
148+
element,
149+
actionButton("btnResetData", "Reset Data"),
150+
tags$head(locale),
151+
tags$script(HTML(
152+
"
153+
// add message handler to receive new data from R and update Vue data
154+
Shiny.addCustomMessageHandler('updateData', function(message) {
155+
var w = HTMLWidgets.find(message.selector);
156+
if(typeof(w) !== 'undefined' && w.hasOwnProperty('instance')) {
157+
w.instance.data = message.data;
158+
w.instance.checkedNodes = [];
159+
}
160+
});
161+
"
162+
)),
163+
tags$h3("Tree from element-ui"),
164+
tags$div(
165+
id = "app",
166+
tag(
167+
"el-tree",
168+
list(
169+
"ref" = "mytree",
170+
":data" = "data.children",
171+
":props" = "defaultProps",
172+
"show-checkbox" = NA,
173+
"@check-change" = "handleCheckChange"
174+
)
175+
),
176+
tags$pre("{{checkedNodes.map(function(d){return d.name})}}")
177+
),
178+
vue(
179+
elementId = "vuewidget",
180+
list(
181+
el="#app",
182+
data = list(
183+
data = rhd,
184+
defaultProps = list(
185+
'children' = 'children',
186+
'label' = 'name'
187+
),
188+
checkedNodes = list()
189+
),
190+
methods = list(
191+
handleCheckChange = htmlwidgets::JS(
192+
"
193+
function(data, checked, indeterminate){
194+
//debugger;
195+
//data.checked = checked && !indeterminate;
196+
console.log(data, checked, indeterminate);
197+
this.checkedNodes = this.$refs.mytree.getCheckedNodes();
198+
this.$emit('tree-checked');
199+
}
200+
"
201+
)
202+
),
203+
watch = list(
204+
checkedNodes = htmlwidgets::JS(
205+
"
206+
function(dat) {
207+
debugger
208+
Shiny.setInputValue(this.$el.id + '_checked', dat.map(d => d.name));
209+
}
210+
"
211+
)
212+
)
213+
),
214+
minified = FALSE
215+
)
216+
)
217+
218+
server <- function(input, output, session) {
219+
observeEvent(input$btnResetData, {
220+
session$sendCustomMessage(
221+
'updateData',
222+
list(
223+
selector = "#vuewidget",
224+
data = rhd
225+
)
226+
)
227+
})
228+
229+
observeEvent(input$app_checked, {
230+
str(input$app_checked)
231+
})
232+
}
233+
234+
shinyApp(ui, server)

0 commit comments

Comments
 (0)