')
233 | $.each(nodes, function(i, node){
234 | tr.append($('').append(node))
235 | })
236 | return $('').append(tr)
237 |
238 | }
239 | options = options || {}
240 | options.idAttr = (options.idAttr || 'id')
241 | options.childrenAttr = (options.childrenAttr || 'children')
242 | var controls = (options.controls || [])
243 |
244 | if (!options.mountPoint)
245 | options.mountPoint = $('body')
246 |
247 | if (options.depthFirst)
248 | depthFirst(tree, options.depthFirst, options.childrenAttr)
249 | var rendered = renderTree(tree, options.childrenAttr, options.idAttr,
250 | options.renderedAttr, options.renderer, options.tableAttributes)
251 |
252 | treeTable(rendered)
253 | if (options.replaceContent) {
254 | options.mountPoint.html('')
255 | }
256 | var initialExpandLevel = options.initialExpandLevel ? parseInt(options.initialExpandLevel) : -1
257 | initialExpandLevel = Math.min(initialExpandLevel, tree[0].maxLevel)
258 | rendered.expandLevel(initialExpandLevel)
259 | if(options.slider){
260 | var slider = $('')
261 | slider.width('200px')
262 | slider.slider({
263 | min : 1,
264 | max : tree[0].maxLevel,
265 | range : "min",
266 | value : initialExpandLevel,
267 | slide : function(event, ui) {
268 | rendered.expandLevel(ui.value)
269 | }
270 | })
271 | controls = [slider].concat(options.controls)
272 | }
273 |
274 | if(controls.length >0){
275 | options.mountPoint.append(inALine(controls))
276 | }
277 | options.mountPoint.append(rendered)
278 | return rendered
279 | }
280 |
281 | return {
282 | depthFirst : depthFirst,
283 | makeTree : makeTree,
284 | renderTree : renderTree,
285 | attr2attr : attr2attr,
286 | treeTable : treeTable,
287 | appendTreetable : appendTreetable,
288 | jsTreeTable : '1.0',
289 | register : function(target){
290 | $.each(this, function(key, value){ if(key != 'register') target[key] = value})
291 | }
292 | }
293 | })();
--------------------------------------------------------------------------------
/style/simple.css:
--------------------------------------------------------------------------------
1 |
2 | table.jsTT {
3 | margin-top: 10px;
4 | border-collapse: collapse;
5 | table-layout: fixed;
6 | border: 1px solid #686a66;
7 | }
8 |
9 | table.jsTT th {
10 | background-color: #9a9c97;
11 | color: white;
12 | border: 1px solid #686a66;
13 | padding-left: 8px;
14 | padding-right: 8px;
15 | text-align: left;
16 | }
17 |
18 | table.jsTT td {
19 | position: static;
20 | border-left: 1px solid #999;
21 | border-right: 1px solid #999;
22 | padding-left: 8px;
23 | padding-right: 8px;
24 | }
25 |
26 | table.jsTT tr[data-tt-level="1"] td:first-child {
27 | background-color: #c6c9c3;
28 | }
29 |
30 | table.jsTT tr[data-tt-level="2"] td:first-child {
31 | background-color: #dbdfd8;
32 | }
33 |
34 | table.jsTT tr[data-tt-level="3"] td:first-child {
35 | background-color: #f1f2f0;
36 | }
37 |
38 | table.jsTT tr:hover td {
39 | font-style: italic;
40 | border-bottom: 1px solid #999;
41 | }
42 |
43 | table.jsTT tr:hover td:first-child {
44 | font-style: inherit;
45 | border-bottom: inherit;
46 | }
47 |
--------------------------------------------------------------------------------
/treeTable.js:
--------------------------------------------------------------------------------
1 | var com_github_culmat_jsTreeTable = (function(){
2 |
3 | function depthFirst(tree, func, childrenAttr) {
4 | childrenAttr = childrenAttr || 'children'
5 | function i_depthFirst(node) {
6 | if (node[childrenAttr]) {
7 | $.each(node[childrenAttr], function(i, child) {
8 | i_depthFirst(child)
9 | })
10 | }
11 | func(node)
12 | }
13 | $.each(tree, function(i, root) {
14 | i_depthFirst(root)
15 | })
16 | return tree
17 | }
18 |
19 | /*
20 | * make a deep copy of the object
21 | */
22 | function copy(data){
23 | return JSON.parse(JSON.stringify(data))
24 | }
25 |
26 | function makeTree (data, idAttr, refAttr, childrenAttr) {
27 | var data_tmp = data
28 | idAttr = idAttr || 'id'
29 | refAttr = refAttr || 'parent'
30 | childrenAttr = childrenAttr || 'children'
31 |
32 | var byName = []
33 | $.each(data_tmp, function(i, entry) {
34 | byName[entry[idAttr]] = entry
35 | })
36 | var tree = []
37 | $.each(data_tmp, function(i, entry) {
38 | var parents = entry[refAttr]
39 | if(!$.isArray(parents)){
40 | parents = [parents]
41 | }
42 | if(parents.length == 0){
43 | tree.push(entry)
44 | } else {
45 | var inTree = false;
46 | $.each(parents, function(i,parentID){
47 | var parent = byName[parentID]
48 | if (parent) {
49 | if (!parent[childrenAttr]) {
50 | parent[childrenAttr] = []
51 | }
52 | if($.inArray(entry, parent[childrenAttr])< 0)
53 | parent[childrenAttr].push(entry)
54 | inTree = true
55 | }
56 | })
57 | if(!inTree){
58 | tree.push(entry)
59 | }
60 | }
61 | })
62 | return tree
63 | }
64 |
65 | function renderTree(tree, childrenAttr, idAttr, attrs, renderer, tableAttributes) {
66 | childrenAttr = childrenAttr || 'children'
67 | idAttr = idAttr || 'id'
68 | tableAttributes = tableAttributes || {}
69 | var maxLevel = 0;
70 | var ret = []
71 |
72 | var table = $(" ")
73 | $.each(tableAttributes, function(key, value){
74 | if(key == 'class' && value != 'jsTT') {
75 | table.addClass(value)
76 | } else {
77 | table.attr(key, value)
78 | }
79 | })
80 | var thead = $("")
81 | var tr = $("")
82 | var tbody = $(" ")
83 |
84 | table.append(thead)
85 | thead.append(tr)
86 | table.append(tbody)
87 | if (attrs) {
88 | $.each(attrs, function(attr, desc) {
89 | $(tr).append($('' + desc + ' | '))
90 | })
91 | } else {
92 | $(tr).append($('' + idAttr + ' | '))
93 | $.each(tree[0], function(key, value) {
94 | if (key != childrenAttr && key != idAttr)
95 | $(tr).append($('' + key + ' | '))
96 | })
97 | }
98 |
99 | function render(node, parent) {
100 | var tr = $("")
101 | $(tr).attr('data-tt-id', node[idAttr])
102 | $(tr).attr('data-tt-level', node['data-tt-level'])
103 | if(!node[childrenAttr] || node[childrenAttr].length == 0)
104 | $(tr).attr('data-tt-isleaf', true)
105 | else
106 | $(tr).attr('data-tt-isnode', true)
107 | if (parent) {
108 | $(tr).attr('data-tt-parent-id', parent[idAttr])
109 | }
110 | if (renderer) {
111 | renderer($(tr), node)
112 | } else if (attrs) {
113 | $.each(attrs, function(attr, desc) {
114 | $(tr).append($('' + node[attr] + ' | '))
115 | })
116 | } else {
117 | $(tr).append($('' + node[idAttr] + ' | '))
118 | $.each(node, function(key, value) {
119 | if (key != childrenAttr && key != idAttr && key != 'data-tt-level')
120 | $(tr).append($('' + value + ' | '))
121 | })
122 | }
123 | tbody.append(tr)
124 | }
125 |
126 | function i_renderTree(subTree, childrenAttr, level, parent) {
127 | maxLevel = Math.max(maxLevel, level)
128 | $.each(subTree, function(i, node) {
129 | node['data-tt-level'] = level
130 | render(node, parent)
131 | if (node[childrenAttr]) {
132 | $.each(node[childrenAttr], function(i, child) {
133 | i_renderTree([ child ], childrenAttr, level + 1, node)
134 | })
135 | }
136 | })
137 | }
138 | i_renderTree(tree, childrenAttr, 1)
139 | if (tree[0])
140 | tree[0].maxLevel = maxLevel
141 | return table
142 | }
143 |
144 | function attr2attr(nodes, attrs){
145 | $.each(nodes, function(i, node) {
146 | $.each(attrs, function(j, at) {
147 | node[at] = $(node).attr(at)
148 | })
149 | })
150 | return nodes
151 | }
152 |
153 | function treeTable(table){
154 | table.addClass('jsTT')
155 | table.expandLevel = function (n) {
156 | $("tr[data-tt-level]", table).each(function(index) {
157 | var level = parseInt($(this).attr('data-tt-level'))
158 | if (level > n-1) {
159 | this.trCollapse(true)
160 | } else if (level == n-1){
161 | this.trExpand(true)
162 | }
163 | })
164 | }
165 | function getLevel(node){
166 | var level = node.attr('data-tt-level')
167 | if(level != undefined ) return parseInt(level)
168 | var parentID = node.attr('data-tt-parent-id')
169 | if( parentID == undefined){
170 | return 0
171 | } else {
172 | return getLevel($('tr[data-tt-id="'+parentID+'"]', table).first()) + 1
173 | }
174 | }
175 | $("tr[data-tt-id]", table).each(function(i,node){
176 | node = $(node)
177 | node.attr('data-tt-level', getLevel(node))
178 | })
179 | var dat = $("tr[data-tt-level]", table).get()
180 | $.each(dat, function(j, d) {
181 | d.trChildrenVisible = true
182 | d.trChildren = []
183 | })
184 | dat = attr2attr(dat, ['data-tt-id', 'data-tt-parent-id'])
185 | dat = makeTree(dat, 'data-tt-id', 'data-tt-parent-id', 'trChildren')
186 |
187 | var imgExpand = "data:image/png;base64,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"
188 | var imgCollapse = "data:image/png;base64,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"
189 | $("tr[data-tt-level]", table).each(function(index, tr) {
190 | var level = $(tr).attr('data-tt-level')
191 | var td = $("td",tr).first()
192 | if(tr.trChildren.length>0){
193 | td.prepend($(' '))
194 | } else {
195 | td.prepend($(''))
196 | }
197 | td.prepend($(''))
198 | td.css('white-space','nowrap')
199 | tr.trExpand = function(changeState){
200 | if(this.trChildren.length < 1) return
201 | if(changeState) {
202 | this.trChildrenVisible = true
203 | $('#state', this).get(0).src= imgCollapse
204 | }
205 | var doit = changeState || this.trChildrenVisible
206 | $.each(this.trChildren, function(i, ctr) {
207 | if(doit) $(ctr).css('display', 'table-row')
208 | ctr.trExpand()
209 | })
210 | }
211 | tr.trCollapse = function(changeState){
212 | if(this.trChildren.length < 1) return
213 | if(changeState) {
214 | this.trChildrenVisible = false
215 | $('#state', this).get(0).src= imgExpand
216 | }
217 | $.each(this.trChildren, function(i, ctr) {
218 | $(ctr).css('display', 'none')
219 | ctr.trCollapse()
220 | })
221 | }
222 | $(tr).click(function() {
223 | this.trChildrenVisible ? this.trCollapse(true) : this.trExpand(true)
224 | })
225 | })
226 | return table
227 | }
228 |
229 |
230 | function appendTreetable(tree, options) {
231 | function inALine(nodes) {
232 | var tr = $(' ')
233 | $.each(nodes, function(i, node){
234 | tr.append($('').append(node))
235 | })
236 | return $('').append(tr)
237 |
238 | }
239 | options = options || {}
240 | options.idAttr = (options.idAttr || 'id')
241 | options.childrenAttr = (options.childrenAttr || 'children')
242 | var controls = (options.controls || [])
243 |
244 | if (!options.mountPoint)
245 | options.mountPoint = $('body')
246 |
247 | if (options.depthFirst)
248 | depthFirst(tree, options.depthFirst, options.childrenAttr)
249 | var rendered = renderTree(tree, options.childrenAttr, options.idAttr,
250 | options.renderedAttr, options.renderer, options.tableAttributes)
251 |
252 | treeTable(rendered)
253 | if (options.replaceContent) {
254 | options.mountPoint.html('')
255 | }
256 | var initialExpandLevel = options.initialExpandLevel ? parseInt(options.initialExpandLevel) : -1
257 | initialExpandLevel = Math.min(initialExpandLevel, tree[0].maxLevel)
258 | rendered.expandLevel(initialExpandLevel)
259 | if(options.slider){
260 | var slider = $(' ')
261 | slider.width('200px')
262 | slider.slider({
263 | min : 1,
264 | max : tree[0].maxLevel,
265 | range : "min",
266 | value : initialExpandLevel,
267 | slide : function(event, ui) {
268 | rendered.expandLevel(ui.value)
269 | }
270 | })
271 | controls = [slider].concat(options.controls)
272 | }
273 |
274 | if(controls.length >0){
275 | options.mountPoint.append(inALine(controls))
276 | }
277 | options.mountPoint.append(rendered)
278 | return rendered
279 | }
280 |
281 | return {
282 | depthFirst : depthFirst,
283 | makeTree : makeTree,
284 | renderTree : renderTree,
285 | attr2attr : attr2attr,
286 | treeTable : treeTable,
287 | appendTreetable : appendTreetable,
288 | jsTreeTable : 'HEAD',
289 | register : function(target){
290 | $.each(this, function(key, value){ if(key != 'register') target[key] = value})
291 | }
292 | }
293 | })();
--------------------------------------------------------------------------------
| |