323 lines
9.7 KiB
JavaScript
323 lines
9.7 KiB
JavaScript
/*
|
|
* Helma License Notice
|
|
*
|
|
* The contents of this file are subject to the Helma License
|
|
* Version 2.0 (the "License"). You may not use this file except in
|
|
* compliance with the License. A copy of the License is available at
|
|
* http://adele.helma.org/download/helma/license.txt
|
|
*
|
|
* Copyright 1998-2005 Helma Software. All Rights Reserved.
|
|
*
|
|
* $RCSfile: helma.Inspector.js,v $
|
|
* $Author: czv $
|
|
* $Revision: 1.5 $
|
|
* $Date: 2006/04/24 11:12:40 $
|
|
*/
|
|
|
|
// take care of any dependencies
|
|
app.addRepository('modules/core/String.js');
|
|
app.addRepository('modules/core/Number.js');
|
|
app.addRepository('modules/helma/Html.js');
|
|
|
|
if (!global.helma) {
|
|
global.helma = {};
|
|
}
|
|
|
|
helma.Inspector = function(hopObj) {
|
|
if (!hopObj)
|
|
hopObj == root;
|
|
|
|
var version = "4.0";
|
|
var children = [];
|
|
var properties = [];
|
|
var collections = [];
|
|
|
|
var html = new helma.Html();
|
|
var keySorter = new String.Sorter("key");
|
|
var idSorter = new Number.Sorter("id");
|
|
|
|
var skins = {
|
|
child: createSkin(helma.Inspector.child_skin),
|
|
collection: createSkin(helma.Inspector.collection_skin),
|
|
date: createSkin(helma.Inspector.date_skin),
|
|
editor: createSkin(helma.Inspector.editor_skin),
|
|
property: createSkin(helma.Inspector.property_skin)
|
|
};
|
|
|
|
var genOptions = function(start, end, selected) {
|
|
res.push();
|
|
for (var i=start; i<=end; i+=1) {
|
|
res.write("<option");
|
|
if (i == selected)
|
|
res.write(' selected="selected"');
|
|
res.write(">");
|
|
if (i < 10)
|
|
res.write("0");
|
|
res.write(i);
|
|
res.write("</option>\n");
|
|
}
|
|
return res.pop();
|
|
};
|
|
|
|
this.render = function() {
|
|
for (var i in hopObj) {
|
|
var obj = {
|
|
key: i,
|
|
value: hopObj[i]
|
|
};
|
|
if (hopObj[i]) {
|
|
if (obj.value._prototype &&
|
|
obj.value._prototype == "HopObject")
|
|
collections.push(obj);
|
|
else
|
|
properties.push(obj);
|
|
}
|
|
}
|
|
properties.sort(keySorter);
|
|
collections.sort(keySorter);
|
|
|
|
var n = hopObj.size();
|
|
for (var i=0; i<n; i++) {
|
|
var h = hopObj.get(i);
|
|
var obj = {
|
|
key: i,
|
|
value: h,
|
|
id: h._id
|
|
};
|
|
children.push(obj);
|
|
}
|
|
children.sort(idSorter);
|
|
|
|
res.handlers.inspector = this;
|
|
renderSkin("helma.Inspector.main");
|
|
return;
|
|
};
|
|
|
|
this.action = function() {
|
|
if (req.data.done) {
|
|
helma.invalidate('inspector');
|
|
res.redirect(path.href());
|
|
}
|
|
if (!helma.auth('inspector'))
|
|
res.abort();
|
|
if (req.data.cancel)
|
|
res.redirect(req.action);
|
|
else if (req.data.save) {
|
|
if (req.data.type == "date") {
|
|
hopObj[req.data.key] = new Date(
|
|
req.data.y, req.data.M-1, req.data.d,
|
|
req.data.H, req.data.m, req.data.s
|
|
);
|
|
} else
|
|
hopObj[req.data.key] = req.data[req.data.key];
|
|
res.redirect(req.action);
|
|
};
|
|
this.render();
|
|
};
|
|
|
|
|
|
/***** M A C R O S *****/
|
|
|
|
this.version_macro = function() {
|
|
return version;
|
|
};
|
|
|
|
this.title_macro = function() {
|
|
var str = String(hopObj);
|
|
res.write(hopObj);
|
|
return;
|
|
};
|
|
|
|
this.prototype_macro = function() {
|
|
if (hopObj != root)
|
|
res.write(hopObj._prototype);
|
|
return;
|
|
};
|
|
|
|
this.this_macro = function() {
|
|
res.write(hopObj);
|
|
return;
|
|
};
|
|
|
|
this.parent_macro = function() {
|
|
res.write(hopObj._parent);
|
|
return;
|
|
};
|
|
|
|
this.href_macro = function() {
|
|
res.write(hopObj.href(req.action));
|
|
return;
|
|
};
|
|
|
|
this.path_macro = function() {
|
|
for (var i=0; i<path.length-1; i++) {
|
|
var obj = path[i];
|
|
html.link({href: obj.href(req.action)},
|
|
(obj == root ? obj._prototype : obj));
|
|
res.write(" / ");
|
|
}
|
|
return;
|
|
};
|
|
|
|
this.collections_macro = function() {
|
|
for (var i in collections) {
|
|
var obj = collections[i];
|
|
var param = {
|
|
href: obj.value.href(req.action),
|
|
key: obj.key,
|
|
size: obj.value.size()
|
|
};
|
|
renderSkin(skins.collection, param);
|
|
}
|
|
return;
|
|
};
|
|
|
|
this.childProto_macro = function() {
|
|
var first = hopObj.get(0);
|
|
if (first)
|
|
res.write(first._prototype);
|
|
return;
|
|
};
|
|
|
|
this.properties_macro = function() {
|
|
if (hopObj._id) {
|
|
renderSkin(skins.property, {
|
|
title: "_id", value: hopObj._id
|
|
});
|
|
renderSkin(skins.property, {
|
|
title: "_prototype", value: hopObj._prototype
|
|
});
|
|
}
|
|
|
|
if (hopObj._parent) {
|
|
renderSkin(skins.property, {
|
|
title: html.linkAsString({
|
|
href: hopObj._parent.href(req.action)
|
|
}, "_parent"),
|
|
value: hopObj._parent
|
|
});
|
|
}
|
|
|
|
for (var i in properties) {
|
|
var obj = properties[i];
|
|
if (obj.value instanceof Date) {
|
|
var param = {value: obj.value.toString()};
|
|
param.title = html.linkAsString({
|
|
href: "javascript:void(null)",
|
|
onclick: "toggleEditor(this)"
|
|
}, obj.key);
|
|
param.key = obj.key;
|
|
param.years = genOptions(1970, 2070, obj.value.getFullYear());
|
|
param.months = genOptions(1, 12, obj.value.getMonth()+1);
|
|
param.days = genOptions(1, 31, obj.value.getDate());
|
|
param.hours = genOptions(0, 23, obj.value.getHours());
|
|
param.minutes = genOptions(0, 59, obj.value.getMinutes());
|
|
param.seconds = genOptions(0, 59, obj.value.getSeconds());
|
|
renderSkin(skins.date, param);
|
|
} else {
|
|
var param = {value: obj.value};
|
|
if (obj.value.href) {
|
|
param.title = html.linkAsString({href: obj.value.href(req.action)}, obj.key);
|
|
renderSkin(skins.property, param);
|
|
} else {
|
|
param.title = html.linkAsString({
|
|
href: "javascript:void(null)",
|
|
onclick: "toggleEditor(this)"
|
|
}, obj.key);
|
|
param.key = obj.key;
|
|
renderSkin(skins.editor, param);
|
|
}
|
|
}
|
|
}
|
|
|
|
return;
|
|
};
|
|
|
|
this.children_macro = function() {
|
|
for (var i in children) {
|
|
var obj = children[i];
|
|
renderSkin(skins.child, {
|
|
href: obj.value.href(req.action),
|
|
//prototype: obj.value._prototype,
|
|
title: obj.value
|
|
});
|
|
}
|
|
return;
|
|
};
|
|
|
|
for (var i in this)
|
|
this.dontEnum(i);
|
|
|
|
return this;
|
|
};
|
|
|
|
|
|
/***** S K I N S *****/
|
|
|
|
helma.Inspector.child_skin = '<tr>\
|
|
<td><a href="<% param.href %>"><% param.prototype suffix=" " %><% param.title %></a></td>\
|
|
</tr>';
|
|
|
|
helma.Inspector.collection_skin = '<tr>\
|
|
<td><a href="<% param.href %>"><% param.key %></a></td>\
|
|
<td align="right"><% param.size %></td>\
|
|
</tr>';
|
|
|
|
helma.Inspector.property_skin = '<tr>\
|
|
<td><% param.title %></td>\
|
|
<td><% param.value encoding="all" %></td>\
|
|
</tr>';
|
|
|
|
helma.Inspector.date_skin = '<tr>\
|
|
<td><% param.title %></td>\
|
|
<td>\
|
|
<div class="display" id="<% param.key %>_display"><% param.value encoding="form" %></div>\
|
|
<div class="editor" id="<% param.key %>_editor">\
|
|
<form action="<% inspector.href %>" method="post">\
|
|
<input type="hidden" name="key" value="<% param.key %>" />\
|
|
<input type="hidden" name="type" value="date" />\
|
|
<select name="y"><% param.years %></select>.<select name="M"><% param.months %></select>.\
|
|
<select name="d"><% param.days %></select>, <select name="H"><% param.hours %></select>:<select name="m"><% param.minutes %></select>:<select name="s"><% param.seconds %></select><br />\
|
|
<input type="submit" name="save" value="Save" />\
|
|
<input type="reset" name="reset" value="Reset" />\
|
|
<input type="submit" name="cancel" value="Cancel" />\
|
|
</form></div>\
|
|
</td>\
|
|
</tr>';
|
|
|
|
helma.Inspector.editor_skin = '<tr>\
|
|
<td><% param.title %></td>\
|
|
<td>\
|
|
<div class="display" id="<% param.key %>_display"><% param.value encoding="form" %></div>\
|
|
<div class="editor" id="<% param.key %>_editor">\
|
|
<form action="<% inspector.href %>" method="post">\
|
|
<textarea name="<% param.key %>" <% param.key prefix=\'id="content_\' suffix=\'"\' %> cols="40" rows="1"><% param.value encoding="form" %></textarea><br />\
|
|
<input type="hidden" name="key" value="<% param.key %>" />\
|
|
<input type="submit" name="save" value="Save" />\
|
|
<input type="reset" name="reset" value="Reset" />\
|
|
<input type="submit" name="cancel" value="Cancel" />\
|
|
</form>\
|
|
</div>\
|
|
</td>\
|
|
</tr>';
|
|
|
|
HopObject.prototype[ (app.properties['inspectorAction'] || 'inspector') +'_action' ] = function() {
|
|
if (!helma.auth('inspector'))
|
|
res.abort();
|
|
if (typeof helma == "undefined" || !helma.Inspector) {
|
|
res.write("Could not create instance of helma.Inspector ");
|
|
res.write("(probably due to missing helmaLib v4.0+)");
|
|
return;
|
|
}
|
|
var inspector = new helma.Inspector(this);
|
|
inspector.action();
|
|
return;
|
|
};
|
|
|
|
helma.lib = "Inspector";
|
|
helma.dontEnum(helma.lib);
|
|
for (var i in helma[helma.lib])
|
|
helma[helma.lib].dontEnum(i);
|
|
for (var i in helma[helma.lib].prototype)
|
|
helma[helma.lib].prototype.dontEnum(i);
|
|
delete helma.lib;
|