blob: 7573306ea107be38028fd65c3a27df20b1f59699 [file] [log] [blame]
Felix Meschbergera3214dd2008-06-19 11:08:47 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18function renderDataTable( /* Array of Data Objects */ components )
19{
20 // number of actions plus 3 -- id, name and state
21 var columns = components.numActions + 3;
22
23 header( columns );
24
25 if (components.error)
26 {
27 error( columns, components.error );
28 }
29 else
30 {
31 data ( components.data );
32 }
33
34 footer( columns );
35}
36
37
38function header( /* int */ columns )
39{
40 document.write( "<table class='content' cellpadding='0' cellspacing='0' width='100%'>" );
41
42 document.write( "<tr class='content'>" );
43 document.write( "<td colspan='" + columns + "' class='content'>&nbsp;</th>" );
44 document.write( "</tr>" );
45
46 document.write( "<tr class='content'>" );
47 document.write( "<th class='content'>ID</th>" );
48 document.write( "<th class='content' width='100%'>Name</th>" );
49 document.write( "<th class='content'>Status</th>" );
50 document.write( "<th class='content' colspan='" + (columns - 3) + "'>Actions</th>" );
51 document.write( "</tr>" );
52
53}
54
55
56function error( /* int */ columns, /* String */ message )
57{
58 document.write( "<tr class='content'>" );
59 document.write( "<td class='content'>&nbsp;</td>" );
60 document.write( "<td class='content' colspan='" + (columns - 1) + "'>" + message + "</td>" );
61 document.write( "</tr>" );
62}
63
64
65function data( /* Array of Object */ dataArray )
66{
67 // render components
68 for ( var idx in dataArray )
69 {
70 entry( dataArray[idx] );
71 }
72}
73
74
75function footer( /* int */ columns )
76{
77 document.write( "<tr class='content'>" );
78 document.write( "<td colspan='" + columns + "' class='content'>&nbsp;</th>" );
79 document.write( "</tr>" );
80
81 document.write( "</table>" );
82}
83
84
85function entry( /* Object */ dataEntry )
86{
Felix Meschberger0704b052008-06-25 08:44:16 +000087 var trElement = tr( null, { id: "entry" + dataEntry.id } );
88 entryInternal( trElement, dataEntry );
89 document.write( serialize( trElement ) );
Felix Meschbergera3214dd2008-06-19 11:08:47 +000090
91 // dataEntry detailed properties
Felix Meschberger0704b052008-06-25 08:44:16 +000092 trElement = tr( null, { id: "entry" + dataEntry.id + "_details" } );
Felix Meschbergera3214dd2008-06-19 11:08:47 +000093 if (dataEntry.props)
94 {
Felix Meschberger0704b052008-06-25 08:44:16 +000095 getDataEntryDetails( trElement, dataEntry.props );
Felix Meschbergera3214dd2008-06-19 11:08:47 +000096 }
Felix Meschberger0704b052008-06-25 08:44:16 +000097 document.write( serialize( trElement ) );
Felix Meschbergera3214dd2008-06-19 11:08:47 +000098}
99
100
Felix Meschberger0704b052008-06-25 08:44:16 +0000101function entryInternal( /* Element */ parent, /* Object */ dataEntry )
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000102{
Felix Meschberger0704b052008-06-25 08:44:16 +0000103
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000104 var id = dataEntry.id;
105 var name = dataEntry.name;
106 var state = dataEntry.state;
107 var icon = (dataEntry.props) ? "down" : "right";
108
Felix Meschberger0704b052008-06-25 08:44:16 +0000109 parent.appendChild( addText( td( "content right" ), id ) );
110
111 var tdEl = td( "content" );
112 tdEl.appendChild( createElement( "img", null, {
113 src: appRoot + "/res/imgs/" + icon + ".gif",
114 onClick: "showDataEntryDetails(" + id + ")",
115 id: "entry" + id + "_inline"
116 } ) );
117 tdEl.appendChild( addText( createElement( "a", null, {
118 href: pluginRoot + "/" + id
119 } ), name ) );
120 parent.appendChild( tdEl );
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000121
Felix Meschberger0704b052008-06-25 08:44:16 +0000122 parent.appendChild( addText( td( "content center" ), state ) );
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000123
124 for ( var aidx in dataEntry.actions )
125 {
126 var action = dataEntry.actions[aidx];
Felix Meschberger0704b052008-06-25 08:44:16 +0000127 parent.appendChild( actionButton( action.enabled, id, action.link, action.name ) );
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000128 }
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000129}
130
131
Felix Meschberger0704b052008-06-25 08:44:16 +0000132/* Element */ function actionButton( /* boolean */ enabled, /* long */ id, /* String */ op, /* String */ opLabel )
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000133{
Felix Meschberger0704b052008-06-25 08:44:16 +0000134 var buttonTd = td( "content", { align: "right" } );
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000135 if ( op )
136 {
Felix Meschberger0704b052008-06-25 08:44:16 +0000137 var input = createElement( "input", "submit", {
138 type: 'button',
139 value: opLabel,
140 onClick: 'changeDataEntryState(' + id + ', "' + op + '");'
141 });
142 if (!enabled)
143 {
144 input.setAttribute( "disabled", true );
145 }
146 buttonTd.appendChild( input );
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000147 }
148 else
149 {
Felix Meschberger0704b052008-06-25 08:44:16 +0000150 addText( buttonTd, "\u00a0" );
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000151 }
Felix Meschberger0704b052008-06-25 08:44:16 +0000152
153 return buttonTd;
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000154}
155
156
Felix Meschberger0704b052008-06-25 08:44:16 +0000157function getDataEntryDetails( /* Element */ parent, /* Array of Object */ details )
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000158{
Felix Meschberger0704b052008-06-25 08:44:16 +0000159 parent.appendChild( addText( td( "content"), "\u00a0" ) );
160
161 var tdEl = td( "content", { colspan: 4 } );
162 parent.appendChild( tdEl );
163
164 var tableEl = createElement( "table", null, { border: 0 } );
165 tdEl.appendChild( tableEl );
166
167 var tbody = createElement( "tbody" );
168 tableEl.appendChild( tbody );
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000169 for (var idx in details)
170 {
171 var prop = details[idx];
Felix Meschberger0704b052008-06-25 08:44:16 +0000172
173
174 var trEl = tr();
175 trEl.appendChild( addText( td( "aligntop", { noWrap: true } ), prop.key ) );
176
177 var proptd = td( "aligntop" );
178 trEl.appendChild( proptd );
179
180 if (prop.value )
181 {
182 var values = new String( prop.value ).split( "<br />" );
183 for (var i=0; i < values.length; i++)
184 {
185 if (i > 0) { proptd.appendChild( createElement( "br" ) ); }
186 addText( proptd, values[i] );
187 }
188 }
189 else
190 {
191 addText( proptd, "\u00a0" );
192 }
193
194 tbody.appendChild( trEl );
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000195 }
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000196 }
197
198
199function showDetails(bundleId) {
200 var span = document.getElementById('bundle' + bundleId + '_details');
201}
202
203
204function showDataEntryDetails( id )
205{
206 var span = document.getElementById( 'entry' + id + '_details' );
207 if (span)
208 {
Felix Meschbergerf614b102008-06-25 09:19:37 +0000209 if (span.firstChild)
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000210 {
Felix Meschberger0704b052008-06-25 08:44:16 +0000211 clearChildren( span );
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000212 newLinkValue( id, appRoot + "/res/imgs/right.gif" );
213 }
214 else
215 {
216 sendRequest( 'POST', pluginRoot + '/' + id, displayDataEntryDetails );
217 newLinkValue( id, appRoot + "/res/imgs/down.gif" );
218 }
219 }
220}
221
222
223function newLinkValue( /* long */ id, /* String */ newLinkValue )
224{
225
226 var link = document.getElementById( "entry" + id + "_inline" );
227 if (link)
228 {
229 link.src = newLinkValue;
230 }
231}
232
233
234function displayDataEntryDetails( obj )
235{
236 var span = document.getElementById('entry' + obj.id + '_details');
Felix Meschberger0704b052008-06-25 08:44:16 +0000237 if (span)
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000238 {
Felix Meschberger0704b052008-06-25 08:44:16 +0000239 clearChildren( span );
240 getDataEntryDetails( span, obj.props );
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000241 }
242
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000243}
244
245
246function changeDataEntryState(/* long */ id, /* String */ action)
247{
248 var parm = pluginRoot + "/" + id + "?action=" + action;
249 sendRequest('POST', parm, dataEntryStateChanged);
250}
251
252
253function dataEntryStateChanged(obj)
254{
255 if (obj.reload)
256 {
257 document.location = document.location;
258 }
259 else
260 {
261 var id = obj.id;
262 if (obj.state)
263 {
264 // has status, so draw the line
265 if (obj.props)
266 {
267 var span = document.getElementById('entry' + id + '_details');
Felix Meschberger0704b052008-06-25 08:44:16 +0000268 if (span && span.firstChild)
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000269 {
Felix Meschberger0704b052008-06-25 08:44:16 +0000270 clearChildren( span );
271 getDataEntryDetails( span, obj.props );
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000272 }
273 else
274 {
275 obj.props = false;
276 }
277 }
278
279 var span = document.getElementById('entry' + id);
280 if (span)
281 {
Felix Meschberger0704b052008-06-25 08:44:16 +0000282 clearChildren( span );
283 entryInternal( span, obj );
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000284 }
Felix Meschbergera3214dd2008-06-19 11:08:47 +0000285 }
286 else
287 {
288 // no status, dataEntry has been removed/uninstalled
289 var span = document.getElementById('entry' + id);
290 if (span)
291 {
292 span.parentNode.removeChild(span);
293 }
294 var span = document.getElementById('entry' + id + '_details');
295 if (span)
296 {
297 span.parentNode.removeChild(span);
298 }
299 }
300 }
301}
302
303