Continued work on new Appy GUI.
|
@ -4,23 +4,26 @@
|
|||
It can also have a parameter "action", that refers to a method that will be triggered on
|
||||
contextObj before returning the result of the macro to the browser.
|
||||
</tal:comment>
|
||||
<tal:ajax define="page request/page;
|
||||
macro request/macro;
|
||||
contextObj context/getParentNode;
|
||||
action request/action|nothing;
|
||||
response request/RESPONSE;
|
||||
member context/portal_membership/getAuthenticatedMember;
|
||||
portal context/portal_url/getPortalObject;
|
||||
portal_url python: context.portal_url();
|
||||
template python: contextObj.getPageTemplate(portal.skyn, page);
|
||||
dummy python: response.setHeader('Content-Type','text/html;;charset=utf-8');
|
||||
dummy2 python: response.setHeader('Expires', 'Mon, 11 Dec 1975 12:05:05 GMT');
|
||||
dummy3 python: response.setHeader('CacheControl', 'no-cache')">
|
||||
<tal:ajax define="contextObj context/getParentNode;
|
||||
tool contextObj/getTool;
|
||||
req python: request;
|
||||
resp req/RESPONSE;
|
||||
page req/page;
|
||||
macro req/macro;
|
||||
action req/action|nothing;
|
||||
user contextObj/portal_membership/getAuthenticatedMember;
|
||||
app tool/getApp;
|
||||
appUrl app/absolute_url;
|
||||
template python: contextObj.getPageTemplate(app.skyn, page);
|
||||
x python: resp.setHeader('Content-Type','text/html;;charset=utf-8');
|
||||
x python: resp.setHeader('Expires', 'Mon, 11 Dec 1975 12:05:05 GMT');
|
||||
x python: resp.setHeader('Content-Language', req.get('language', 'en'));
|
||||
x python: resp.setHeader('CacheControl', 'no-cache')">
|
||||
<tal:comment replace="nothing">Keys "Expires" and "CacheControl" are used for preventing IE to cache
|
||||
this page. Indeed, this page is retrieved through an asynchronous XMLHttpRequest by the browser, and
|
||||
IE caches this by default.</tal:comment>
|
||||
<tal:executeAction condition="action">
|
||||
<tal:do define="dummy python: contextObj.getMethod('on'+action)()" omit-tag=""/>
|
||||
<tal:do define="x python: contextObj.getMethod('on'+action)()" omit-tag=""/>
|
||||
</tal:executeAction>
|
||||
<metal:callMacro use-macro="python: template.macros.get(macro)"/>
|
||||
</tal:ajax>
|
||||
|
|
|
@ -1,37 +1,64 @@
|
|||
body {
|
||||
font: 75% Lucida,Helvetica,Arial,sans-serif;
|
||||
background-color: #EAEAEA;
|
||||
}
|
||||
|
||||
a {text-decoration: none; color: #747171;}
|
||||
a:visited {color: #840107;}
|
||||
body { font: 70% Lucida,Helvetica,Arial,sans-serif; background-color: #EAEAEA; }
|
||||
h1 { font-size: 11pt; margin:0;}
|
||||
h2 { font-size: 10pt; margin:0; font-style: italic; font-weight: normal;}
|
||||
h3 { font-size: 9pt; margin:0; font-weight: bold;}
|
||||
a { text-decoration: none; color: #503737;}
|
||||
a:visited { color: #503737;}
|
||||
table { font-size: 100%; border-spacing: 0px; border-collapse:collapse;}
|
||||
input {border: 1px solid #a79e9e;}
|
||||
form {margin: 0; padding: 0;}
|
||||
p {margin: 0;}
|
||||
|
||||
h1 {font-size: 11pt; margin:0;}
|
||||
h2 {font-size: 10pt; margin:0; font-style: italic; font-weight: normal;}
|
||||
h3 {font-size: 9pt; margin:0; font-weight: bold;}
|
||||
|
||||
.main {
|
||||
width: 900px;
|
||||
background-color: white;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-color: grey;
|
||||
box-shadow: 3px 3px 3px #A9A9A9;
|
||||
}
|
||||
form { margin: 0; padding: 0;}
|
||||
p { margin: 0;}
|
||||
acronym {cursor: help;}
|
||||
input { border: 1px solid #a79e9e;
|
||||
font-family: Lucida,Helvetica,Arial,sans-serif; }
|
||||
input[type=image] { border-width: 0px; background: none; }
|
||||
textarea { width: 99%; font: 100% Lucida,Helvetica,Arial,sans-serif;
|
||||
border: 1px solid #a79e9e;}
|
||||
label { font-weight: 600; font-style: italic; line-height: 1.4em;}
|
||||
|
||||
.main { width: 900px; background-color: white; box-shadow: 3px 3px 3px #A9A9A9;
|
||||
border-style: solid; border-width: 1px; border-color: grey; }
|
||||
.top { height: 75px; margin-left: 3em; vertical-align: top;}
|
||||
.lang { margin-right: 3px; }
|
||||
.userStrip {
|
||||
background-color: #a2a2a2;
|
||||
border-top: 3px solid #525252;
|
||||
border-bottom: 2px solid #9b0000;
|
||||
height: 30px;
|
||||
}
|
||||
.userStrip { background-color: #a2a2a2; height: 30px;
|
||||
border-top: 3px solid #525252; border-bottom: 2px solid #9b0000; }
|
||||
.login { margin-top: 2px; margin-bottom: 2px; color: white;}
|
||||
.buttons { margin-left: 4px; }
|
||||
.content {margin: 7px 0 9px 4px;}
|
||||
.message {color: #9b0000; font-style: italic; position: absolute; top: -50px; right: 5px}
|
||||
.message { color: #9b0000; font-style: italic;
|
||||
position: absolute; top: -15px; right: 5px}
|
||||
.discreet { font-size: 90%; }
|
||||
.portlet { width: 150px; padding: 3px 7px 0px 7px;
|
||||
border-right: 1px solid #9b0000;}
|
||||
.portletCurrent { font-weight: bold; }
|
||||
.portletSep { border-top: 1px solid grey; margin-top: 5px; padding-top: 5px}
|
||||
.portletPage { font-style: italic; }
|
||||
.phase { border-style: dashed; border-width: thin; padding: 0 0.6em 0 1em; }
|
||||
.content { padding: 3px 3px 7px 15px;}
|
||||
.grey { display: none; position: absolute; left: 0px; top: 0px;
|
||||
width:100%; height:100%; background:grey; opacity:0.5;
|
||||
-moz-opacity:0.5; -khtml-opacity:0.5; filter:alpha(Opacity=50);}
|
||||
.popup { display: none; position: absolute; top: 30%; left: 35%;
|
||||
width: 350px; z-index : 100; background: white; padding: 8px;
|
||||
border: 1px solid grey; }
|
||||
.list { border: 1px solid grey; margin-bottom: 3px;}
|
||||
.list td, .list th { border: 1px solid grey;
|
||||
padding-left: 3px; padding-right: 3px;}
|
||||
.list th { background-color: #cbcbcb; font-style: italic; font-weight: normal;}
|
||||
.noStyle { border: 0 !important; padding: 0 !important; margin: 0 !important; }
|
||||
.noStyle td { border:0 !important; padding:0 !important; margin:0 !important; }
|
||||
.translationLabel { background-color: #EAEAEA; border-bottom: 1px dashed grey;
|
||||
margin-top: 0.5em; margin-bottom: 0.5em; }
|
||||
.section1 { font-size: 120%; margin: 0.45em 0em 0.1em 0;
|
||||
padding: 0.3em 0em 0.2em 0.1em; background-color: #eef3f5;
|
||||
border-top: 1px solid #8CACBB;border-bottom: 1px solid #8CACBB; }
|
||||
.section2 { font-size: 110%; font-style: italic; margin: 0.45em 0em 0.1em 0;
|
||||
border-bottom: 2px solid grey; }
|
||||
.section3 { font-size: 100%; font-style: italic; margin: 0.45em 0em 0.1em 0;
|
||||
background-color: #efeae8; text-align: center; color: grey; }
|
||||
.odd { background-color: white; }
|
||||
.even { background-color: #ededed; }
|
||||
.summary {margin-bottom: 5px;}
|
||||
.objectTitle { font-size: 11pt; border-bottom: 3px solid grey;
|
||||
font-weight: bold;}
|
||||
.by { background-color: #ededed; font-style: italic; padding-top: 3px;}
|
||||
.workflow { background-color: #ededed; text-align: center;}
|
||||
.objectNavigate { margin-top: 3px;}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// Functions related to user authentication
|
||||
function cookiesAreEnabled() {
|
||||
// Test whether cookies are enabled by attempting to set a cookie and then
|
||||
// change its value
|
||||
|
@ -30,3 +31,376 @@ function setLoginVars() {
|
|||
if (password.value.length==0) emptyPassword.value = '1';
|
||||
else emptyPassword.value = '0';
|
||||
}
|
||||
|
||||
// AJAX machinery
|
||||
var isIe = (navigator.appName == "Microsoft Internet Explorer");
|
||||
// AJAX machinery
|
||||
var xhrObjects = new Array(); // An array of XMLHttpRequest objects
|
||||
function XhrObject() { // Wraps a XmlHttpRequest object
|
||||
this.freed = 1; // Is this xhr object already dealing with a request or not?
|
||||
this.xhr = false;
|
||||
if (window.XMLHttpRequest) this.xhr = new XMLHttpRequest();
|
||||
else this.xhr = new ActiveXObject("Microsoft.XMLHTTP");
|
||||
this.hook = ''; /* The ID of the HTML element in the page that will be
|
||||
replaced by result of executing the Ajax request. */
|
||||
this.onGet = ''; /* The name of a Javascript function to call once we
|
||||
receive the result. */
|
||||
this.info = {}; /* An associative array for putting anything else. */
|
||||
}
|
||||
|
||||
function getAjaxChunk(pos) {
|
||||
// This function is the callback called by the AJAX machinery (see function
|
||||
// askAjaxChunk below) when an Ajax response is available.
|
||||
// First, find back the correct XMLHttpRequest object
|
||||
if ( (typeof(xhrObjects[pos]) != 'undefined') &&
|
||||
(xhrObjects[pos].freed == 0)) {
|
||||
var hook = xhrObjects[pos].hook;
|
||||
if (xhrObjects[pos].xhr.readyState == 1) {
|
||||
// The request has been initialized: display the waiting radar
|
||||
var hookElem = document.getElementById(hook);
|
||||
if (hookElem) hookElem.innerHTML = "<div align=\"center\"><img src=\"skyn/waiting.gif\"/><\/div>";
|
||||
}
|
||||
if (xhrObjects[pos].xhr.readyState == 4) {
|
||||
// We have received the HTML chunk
|
||||
var hookElem = document.getElementById(hook);
|
||||
if (hookElem && (xhrObjects[pos].xhr.status == 200)) {
|
||||
hookElem.innerHTML = xhrObjects[pos].xhr.responseText;
|
||||
// Call a custom Javascript function if required
|
||||
if (xhrObjects[pos].onGet) {
|
||||
xhrObjects[pos].onGet(xhrObjects[pos], hookElem);
|
||||
}
|
||||
// Eval inner scripts if any.
|
||||
var innerScripts = document.getElementsByName("appyHook");
|
||||
for (var i=0; i<innerScripts.length; i++) {
|
||||
eval(innerScripts[i].innerHTML);
|
||||
}
|
||||
xhrObjects[pos].freed = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function askAjaxChunk(hook,mode,url,page,macro,params,beforeSend,onGet) {
|
||||
/* This function will ask to get a chunk of HTML on the server through a
|
||||
XMLHttpRequest. p_mode can be 'GET' or 'POST'. p_url is the URL of a
|
||||
given server object. On this URL we will call the page "ajax.pt" that
|
||||
will call a specific p_macro in a given p_page with some additional
|
||||
p_params (must be an associative array) if required.
|
||||
|
||||
p_hook is the ID of the HTML element that will be filled with the HTML
|
||||
result from the server.
|
||||
|
||||
p_beforeSend is a Javascript function to call before sending the request.
|
||||
This function will get 2 args: the XMLHttpRequest object and the
|
||||
p_params. This method can return, in a string, additional parameters to
|
||||
send, ie: "¶m1=blabla¶m2=blabla".
|
||||
|
||||
p_onGet is a Javascript function to call when we will receive the answer.
|
||||
This function will get 2 args, too: the XMLHttpRequest object and the
|
||||
HTML node element into which the result has been inserted.
|
||||
*/
|
||||
// First, get a non-busy XMLHttpRequest object.
|
||||
var pos = -1;
|
||||
for (var i=0; i < xhrObjects.length; i++) {
|
||||
if (xhrObjects[i].freed == 1) { pos = i; break; }
|
||||
}
|
||||
if (pos == -1) {
|
||||
pos = xhrObjects.length;
|
||||
xhrObjects[pos] = new XhrObject();
|
||||
}
|
||||
xhrObjects[pos].hook = hook;
|
||||
xhrObjects[pos].onGet = onGet;
|
||||
if (xhrObjects[pos].xhr) {
|
||||
var rq = xhrObjects[pos];
|
||||
rq.freed = 0;
|
||||
// Construct parameters
|
||||
var paramsFull = 'page=' + page + '¯o=' + macro;
|
||||
if (params) {
|
||||
for (var paramName in params)
|
||||
paramsFull = paramsFull + '&' + paramName + '=' + params[paramName];
|
||||
}
|
||||
// Call beforeSend if required
|
||||
if (beforeSend) {
|
||||
var res = beforeSend(rq, params);
|
||||
if (res) paramsFull = paramsFull + res;
|
||||
}
|
||||
// Construct the URL to call
|
||||
var urlFull = url + '/skyn/ajax';
|
||||
if (mode == 'GET') {
|
||||
urlFull = urlFull + '?' + paramsFull;
|
||||
}
|
||||
// Perform the asynchronous HTTP GET or POST
|
||||
rq.xhr.open(mode, urlFull, true);
|
||||
if (mode == 'POST') {
|
||||
// Set the correct HTTP headers
|
||||
rq.xhr.setRequestHeader(
|
||||
"Content-Type", "application/x-www-form-urlencoded");
|
||||
rq.xhr.setRequestHeader("Content-length", paramsFull.length);
|
||||
rq.xhr.setRequestHeader("Connection", "close");
|
||||
rq.xhr.onreadystatechange = function(){ getAjaxChunk(pos); }
|
||||
rq.xhr.send(paramsFull);
|
||||
}
|
||||
else if (mode == 'GET') {
|
||||
rq.xhr.onreadystatechange = function() { getAjaxChunk(pos); }
|
||||
if (window.XMLHttpRequest) { rq.xhr.send(null); }
|
||||
else if (window.ActiveXObject) { rq.xhr.send(); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* The functions below wrap askAjaxChunk for getting specific content through
|
||||
an Ajax request. */
|
||||
function askQueryResult(hookId, objectUrl, contentType, searchName,
|
||||
startNumber, sortKey, sortOrder, filterKey) {
|
||||
// Sends an Ajax request for getting the result of a query.
|
||||
var params = {'type_name': contentType, 'search': searchName,
|
||||
'startNumber': startNumber};
|
||||
if (sortKey) params['sortKey'] = sortKey;
|
||||
if (sortOrder) params['sortOrder'] = sortOrder;
|
||||
if (filterKey) {
|
||||
var filterWidget = document.getElementById(hookId + '_' + filterKey);
|
||||
if (filterWidget && filterWidget.value) {
|
||||
params['filterKey'] = filterKey;
|
||||
params['filterValue'] = filterWidget.value;
|
||||
}
|
||||
}
|
||||
askAjaxChunk(hookId,'GET',objectUrl, 'result', 'queryResult', params);
|
||||
}
|
||||
|
||||
function askObjectHistory(hookId, objectUrl, maxPerPage, startNumber) {
|
||||
// Sends an Ajax request for getting the history of an object
|
||||
var params = {'maxPerPage': maxPerPage, 'startNumber': startNumber};
|
||||
askAjaxChunk(hookId, 'GET', objectUrl, 'page', 'objectHistory', params);
|
||||
}
|
||||
|
||||
function askRefField(hookId, objectUrl, fieldName, innerRef, startNumber,
|
||||
action, actionParams){
|
||||
// Sends an Ajax request for getting the content of a reference field.
|
||||
var startKey = hookId + '_startNumber';
|
||||
var params = {'fieldName': fieldName, 'innerRef': innerRef, };
|
||||
params[startKey] = startNumber;
|
||||
if (action) params['action'] = action;
|
||||
if (actionParams) {
|
||||
for (key in actionParams) { params[key] = actionParams[key]; };
|
||||
}
|
||||
askAjaxChunk(hookId, 'GET', objectUrl, 'widgets/ref', 'viewContent',params);
|
||||
}
|
||||
|
||||
function askComputedField(hookId, objectUrl, fieldName) {
|
||||
// Sends an Ajax request for getting the content of a computed field
|
||||
var params = {'fieldName': fieldName};
|
||||
askAjaxChunk(hookId, 'GET', objectUrl, 'widgets/computed', 'viewContent', params);
|
||||
}
|
||||
|
||||
// Function used by checkbox widgets for having radio-button-like behaviour
|
||||
function toggleCheckbox(visibleCheckbox, hiddenBoolean) {
|
||||
vis = document.getElementById(visibleCheckbox);
|
||||
hidden = document.getElementById(hiddenBoolean);
|
||||
if (vis.checked) hidden.value = 'True';
|
||||
else hidden.value = 'False';
|
||||
}
|
||||
|
||||
// Functions used for master/slave relationships between widgets
|
||||
function getMasterValue(widget) {
|
||||
// Returns an array of selected options in a select widget
|
||||
res = new Array();
|
||||
if (widget.type == 'checkbox') {
|
||||
var mv = widget.checked + '';
|
||||
mv = mv.charAt(0).toUpperCase() + mv.substr(1);
|
||||
res.push(mv);
|
||||
}
|
||||
else { // SELECT widget
|
||||
for (var i=0; i < widget.options.length; i++) {
|
||||
if (widget.options[i].selected) res.push(widget.options[i].value);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
function updateSlaves(masterValues, appyTypeId) {
|
||||
// Given the value(s) selected in a master field, this function updates the
|
||||
// state of all corresponding slaves.
|
||||
var slaves = cssQuery('table.slave_' + appyTypeId);
|
||||
for (var i=0; i< slaves.length; i++){
|
||||
slaves[i].style.display = "none";
|
||||
}
|
||||
for (var i=0; i < masterValues.length; i++) {
|
||||
var activeSlaves = cssQuery('table.slaveValue_' + appyTypeId + '_' + masterValues[i]);
|
||||
for (var j=0; j < activeSlaves.length; j++){
|
||||
activeSlaves[j].style.display = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Function used for triggering a workflow transition
|
||||
function triggerTransition(transitionId, msg) {
|
||||
var theForm = document.getElementById('triggerTransitionForm');
|
||||
theForm.workflow_action.value = transitionId;
|
||||
if (!msg) {
|
||||
theForm.submit();
|
||||
}
|
||||
else { // Ask the user to confirm.
|
||||
askConfirm('form', 'triggerTransitionForm', msg);
|
||||
}
|
||||
}
|
||||
|
||||
function onDeleteObject(objectUid) {
|
||||
f = document.getElementById('deleteForm');
|
||||
f.objectUid.value = objectUid;
|
||||
askConfirm('form', 'deleteForm', delete_confirm);
|
||||
}
|
||||
|
||||
function toggleCookie(cookieId) {
|
||||
// What is the state of this boolean (expanded/collapsed) cookie?
|
||||
var state = readCookie(cookieId);
|
||||
if ((state != 'collapsed') && (state != 'expanded')) {
|
||||
// No cookie yet, create it.
|
||||
createCookie(cookieId, 'collapsed');
|
||||
state = 'collapsed';
|
||||
}
|
||||
var hook = document.getElementById(cookieId); // The hook is the part of
|
||||
// the HTML document that needs to be shown or hidden.
|
||||
var displayValue = 'none';
|
||||
var newState = 'collapsed';
|
||||
var imgSrc = 'skyn/expand.gif';
|
||||
if (state == 'collapsed') {
|
||||
// Show the HTML zone
|
||||
displayValue = 'block';
|
||||
imgSrc = 'skyn/collapse.gif';
|
||||
newState = 'expanded';
|
||||
}
|
||||
// Update the corresponding HTML element
|
||||
hook.style.display = displayValue;
|
||||
var img = document.getElementById(cookieId + '_img');
|
||||
img.src = imgSrc;
|
||||
// Inverse the cookie value
|
||||
createCookie(cookieId, newState);
|
||||
}
|
||||
|
||||
// Function that allows to generate a document from a pod template.
|
||||
function generatePodDocument(contextUid, fieldName, podFormat, queryData) {
|
||||
var theForm = document.getElementsByName("podTemplateForm")[0];
|
||||
theForm.objectUid.value = contextUid;
|
||||
theForm.fieldName.value = fieldName;
|
||||
theForm.podFormat.value = podFormat;
|
||||
theForm.askAction.value = "False";
|
||||
theForm.queryData.value = queryData;
|
||||
var askActionWidget = document.getElementById(contextUid + '_' + fieldName);
|
||||
if (askActionWidget && askActionWidget.checked) {
|
||||
theForm.askAction.value = "True";
|
||||
}
|
||||
theForm.submit();
|
||||
}
|
||||
// Functions for opening and closing a popup
|
||||
function openPopup(popupId, msg) {
|
||||
// Put the message into the popup
|
||||
var confirmElem = document.getElementById('appyConfirmText');
|
||||
confirmElem.innerHTML = msg;
|
||||
// Open the popup
|
||||
var popup = document.getElementById(popupId);
|
||||
// Put it at the right place on the screen
|
||||
var scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0;
|
||||
popup.style.top = (scrollTop + 150) + 'px';
|
||||
popup.style.display = "block";
|
||||
// Show the greyed zone
|
||||
var greyed = document.getElementById('grey');
|
||||
greyed.style.top = scrollTop + 'px';
|
||||
greyed.style.display = "block";
|
||||
}
|
||||
|
||||
function closePopup(popupId) {
|
||||
// Close the popup
|
||||
var popup = document.getElementById(popupId);
|
||||
popup.style.display = "none";
|
||||
// Hide the greyed zone
|
||||
var greyed = document.getElementById('grey');
|
||||
greyed.style.display = "none";
|
||||
}
|
||||
|
||||
// Function triggered when an action needs to be confirmed by the user
|
||||
function askConfirm(actionType, action, msg) {
|
||||
/* Store the actionType (send a form, call an URL or call a script) and the
|
||||
related action, and shows the confirm popup. If the user confirms, we
|
||||
will perform the action. */
|
||||
var confirmForm = document.getElementById('confirmActionForm');
|
||||
confirmForm.actionType.value = actionType;
|
||||
confirmForm.action.value = action;
|
||||
openPopup("confirmActionPopup", msg);
|
||||
}
|
||||
|
||||
// Function triggered when an action confirmed by the user must be performed
|
||||
function doConfirm() {
|
||||
// The user confirmed: perform the required action.
|
||||
closePopup('confirmActionPopup');
|
||||
var confirmForm = document.getElementById('confirmActionForm');
|
||||
var actionType = confirmForm.actionType.value;
|
||||
var action = confirmForm.action.value;
|
||||
if (actionType == 'form') {
|
||||
// We must submit the form whose id is in "action"
|
||||
document.getElementById(action).submit();
|
||||
}
|
||||
else if (actionType == 'url') {
|
||||
// We must go to the URL defined in "action"
|
||||
window.location = action;
|
||||
}
|
||||
else if (actionType == 'script') {
|
||||
// We must execute Javascript code in "action"
|
||||
eval(action);
|
||||
}
|
||||
}
|
||||
|
||||
// Function that finally posts the edit form after the user has confirmed that
|
||||
// she really wants to post it.
|
||||
function postConfirmedEditForm() {
|
||||
var theForm = document.getElementById('appyEditForm');
|
||||
theForm.confirmed.value = "True";
|
||||
theForm.submit();
|
||||
}
|
||||
|
||||
// Function that shows or hides a tab. p_action is 'show' or 'hide'.
|
||||
function manageTab(tabId, action) {
|
||||
// Manage the tab content (show it or hide it)
|
||||
var content = document.getElementById('tabcontent_' + tabId);
|
||||
if (action == 'show') { content.style.display = 'table-row'; }
|
||||
else { content.style.display = 'none'; }
|
||||
// Manage the tab itself (show as selected or unselected)
|
||||
var left = document.getElementById('tab_' + tabId + '_left');
|
||||
var tab = document.getElementById('tab_' + tabId);
|
||||
var right = document.getElementById('tab_' + tabId + '_right');
|
||||
if (action == 'show') {
|
||||
left.src = "skyn/tabLeft.png";
|
||||
tab.style.backgroundImage = "url(skyn/tabBg.png)";
|
||||
right.src = "skyn/tabRight.png";
|
||||
}
|
||||
if (action == 'hide') {
|
||||
left.src = "skyn/tabLeftu.png";
|
||||
tab.style.backgroundImage = "url(skyn/tabBgu.png)";
|
||||
right.src = "skyn/tabRightu.png";
|
||||
}
|
||||
}
|
||||
|
||||
// Function used for displaying/hiding content of a tab
|
||||
function showTab(tabId) {
|
||||
// 1st, show the tab to show
|
||||
manageTab(tabId, 'show');
|
||||
// Compute the number of tabs.
|
||||
var idParts = tabId.split('_');
|
||||
var prefix = idParts[0] + '_';
|
||||
// Store the currently selected tab in a cookie.
|
||||
createCookie('tab_' + idParts[0], tabId);
|
||||
var nbOfTabs = idParts[2]*1;
|
||||
// Then, hide the other tabs.
|
||||
for (var i=0; i<nbOfTabs; i++) {
|
||||
var idTab = prefix + (i+1) + '_' + nbOfTabs;
|
||||
if (idTab != tabId) {
|
||||
manageTab(idTab, 'hide');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Function that initializes the state of a tab
|
||||
function initTab(cookieId, defaultValue) {
|
||||
var toSelect = readCookie(cookieId);
|
||||
if (!toSelect) { showTab(defaultValue) }
|
||||
else { showTab(toSelect); }
|
||||
}
|
||||
|
|
252
gen/plone25/skin/calendar.css
Executable file
|
@ -0,0 +1,252 @@
|
|||
/* The main calendar widget. DIV containing a table. */
|
||||
|
||||
.calendar {
|
||||
position: relative;
|
||||
display: none;
|
||||
border: 1px solid;
|
||||
border-color: #fff #000 #000 #fff;
|
||||
font-size: 11px;
|
||||
cursor: default;
|
||||
background: Window;
|
||||
color: WindowText;
|
||||
font-family: tahoma,verdana,sans-serif;
|
||||
}
|
||||
|
||||
.calendar table {
|
||||
border: 1px solid;
|
||||
border-color: #fff #000 #000 #fff;
|
||||
font-size: 11px;
|
||||
cursor: default;
|
||||
background: Window;
|
||||
color: WindowText;
|
||||
font-family: tahoma,verdana,sans-serif;
|
||||
}
|
||||
|
||||
/* Header part -- contains navigation buttons and day names. */
|
||||
|
||||
.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
|
||||
text-align: center;
|
||||
padding: 1px;
|
||||
border: 1px solid;
|
||||
border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
|
||||
background: ButtonFace;
|
||||
}
|
||||
|
||||
.calendar .nav {
|
||||
background: ButtonFace url(menuarrow.gif) no-repeat 100% 100%;
|
||||
}
|
||||
|
||||
.calendar thead .title { /* This holds the current "month, year" */
|
||||
font-weight: bold;
|
||||
padding: 1px;
|
||||
border: 1px solid #000;
|
||||
background: ActiveCaption;
|
||||
color: CaptionText;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.calendar thead .headrow { /* Row <TR> containing navigation buttons */
|
||||
}
|
||||
|
||||
.calendar thead .daynames { /* Row <TR> containing the day names */
|
||||
}
|
||||
|
||||
.calendar thead .name { /* Cells <TD> containing the day names */
|
||||
border-bottom: 1px solid ButtonShadow;
|
||||
padding: 2px;
|
||||
text-align: center;
|
||||
background: ButtonFace;
|
||||
color: ButtonText;
|
||||
}
|
||||
|
||||
.calendar thead .weekend { /* How a weekend day name shows in header */
|
||||
color: #f00;
|
||||
}
|
||||
|
||||
.calendar thead .hilite { /* How do the buttons in header appear when hover */
|
||||
border: 2px solid;
|
||||
padding: 0px;
|
||||
border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
|
||||
}
|
||||
|
||||
.calendar thead .active { /* Active (pressed) buttons in header */
|
||||
border-width: 1px;
|
||||
padding: 2px 0px 0px 2px;
|
||||
border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
|
||||
}
|
||||
|
||||
/* The body part -- contains all the days in month. */
|
||||
|
||||
.calendar tbody .day { /* Cells <TD> containing month days dates */
|
||||
width: 2em;
|
||||
text-align: right;
|
||||
padding: 2px 4px 2px 2px;
|
||||
}
|
||||
.calendar tbody .day.othermonth {
|
||||
font-size: 80%;
|
||||
color: #aaa;
|
||||
}
|
||||
.calendar tbody .day.othermonth.oweekend {
|
||||
color: #faa;
|
||||
}
|
||||
|
||||
.calendar table .wn {
|
||||
padding: 2px 3px 2px 2px;
|
||||
border-right: 1px solid ButtonShadow;
|
||||
background: ButtonFace;
|
||||
color: ButtonText;
|
||||
}
|
||||
|
||||
.calendar tbody .rowhilite td {
|
||||
background: Highlight;
|
||||
color: HighlightText;
|
||||
}
|
||||
|
||||
.calendar tbody td.hilite { /* Hovered cells <TD> */
|
||||
padding: 1px 3px 1px 1px;
|
||||
border-top: 1px solid #fff;
|
||||
border-right: 1px solid #000;
|
||||
border-bottom: 1px solid #000;
|
||||
border-left: 1px solid #fff;
|
||||
}
|
||||
|
||||
.calendar tbody td.active { /* Active (pressed) cells <TD> */
|
||||
padding: 2px 2px 0px 2px;
|
||||
border: 1px solid;
|
||||
border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
|
||||
}
|
||||
|
||||
.calendar tbody td.selected { /* Cell showing selected date */
|
||||
font-weight: bold;
|
||||
border: 1px solid;
|
||||
border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
|
||||
padding: 2px 2px 0px 2px;
|
||||
background: ButtonFace;
|
||||
color: ButtonText;
|
||||
}
|
||||
|
||||
.calendar tbody td.weekend { /* Cells showing weekend days */
|
||||
color: #f00;
|
||||
}
|
||||
|
||||
.calendar tbody td.today { /* Cell showing today date */
|
||||
font-weight: bold;
|
||||
color: #00f;
|
||||
}
|
||||
|
||||
.calendar tbody td.disabled { color: GrayText; }
|
||||
|
||||
.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* The footer part -- status bar and "Close" button */
|
||||
|
||||
.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
|
||||
}
|
||||
|
||||
.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
|
||||
background: ButtonFace;
|
||||
padding: 1px;
|
||||
border: 1px solid;
|
||||
border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
|
||||
color: ButtonText;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.calendar tfoot .hilite { /* Hover style for buttons in footer */
|
||||
border-top: 1px solid #fff;
|
||||
border-right: 1px solid #000;
|
||||
border-bottom: 1px solid #000;
|
||||
border-left: 1px solid #fff;
|
||||
padding: 1px;
|
||||
background: #e4e0d8;
|
||||
}
|
||||
|
||||
.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
|
||||
padding: 2px 0px 0px 2px;
|
||||
border-top: 1px solid #000;
|
||||
border-right: 1px solid #fff;
|
||||
border-bottom: 1px solid #fff;
|
||||
border-left: 1px solid #000;
|
||||
}
|
||||
|
||||
/* Combo boxes (menus that display months/years for direct selection) */
|
||||
|
||||
.calendar .combo {
|
||||
position: absolute;
|
||||
display: none;
|
||||
width: 4em;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
cursor: default;
|
||||
border: 1px solid;
|
||||
border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
|
||||
background: Menu;
|
||||
color: MenuText;
|
||||
font-size: 90%;
|
||||
padding: 1px;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.calendar .combo .label,
|
||||
.calendar .combo .label-IEfix {
|
||||
text-align: center;
|
||||
display: block;
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
.calendar .combo .label-IEfix {
|
||||
width: 4em;
|
||||
}
|
||||
|
||||
.calendar .combo .active {
|
||||
padding: 0px;
|
||||
border: 1px solid #000;
|
||||
}
|
||||
|
||||
.calendar .combo .hilite {
|
||||
background: Highlight;
|
||||
color: HighlightText;
|
||||
}
|
||||
|
||||
.calendar td.time {
|
||||
border-top: 1px solid ButtonShadow;
|
||||
padding: 1px 0px;
|
||||
text-align: center;
|
||||
background-color: ButtonFace;
|
||||
}
|
||||
|
||||
.calendar td.time .hour,
|
||||
.calendar td.time .minute,
|
||||
.calendar td.time .ampm {
|
||||
padding: 0px 3px 0px 4px;
|
||||
border: 1px solid #889;
|
||||
font-weight: bold;
|
||||
background-color: Menu;
|
||||
}
|
||||
|
||||
.calendar td.time .ampm {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.calendar td.time .colon {
|
||||
padding: 0px 2px 0px 3px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.calendar td.time span.hilite {
|
||||
border-color: #000;
|
||||
background-color: Highlight;
|
||||
color: HighlightText;
|
||||
}
|
||||
|
||||
.calendar td.time span.active {
|
||||
border-color: #f00;
|
||||
background-color: #000;
|
||||
color: #0f0;
|
||||
}
|
BIN
gen/plone25/skin/calendar.gif
Executable file
After Width: | Height: | Size: 953 B |
140
gen/plone25/skin/calendar.js
Executable file
|
@ -4,11 +4,8 @@
|
|||
<tal:call tal:define="macroName options/macroName;
|
||||
page python: options['page'];
|
||||
contextObj python: options['contextObj'];
|
||||
tool python: contextObj.getTool();
|
||||
tool contextObj/getTool;
|
||||
layoutType python:'view';
|
||||
putils python: contextObj.plone_utils;
|
||||
portal python: contextObj.portal_url.getPortalObject();
|
||||
portal_url python: contextObj.portal_url();
|
||||
phaseInfo python: contextObj.getAppyPhases(currentOnly=True, layoutType='view');
|
||||
phase phaseInfo/name;">
|
||||
<metal:callMacro use-macro="python: page.macros[macroName]"/>
|
||||
|
|
Before Width: | Height: | Size: 476 B After Width: | Height: | Size: 475 B |
|
@ -1,65 +1,37 @@
|
|||
<tal:edit metal:define-macro="master"
|
||||
define="contextObj python:context.getParentNode();
|
||||
errors request/errors | python:{};
|
||||
layoutType python:'edit';
|
||||
layout python: contextObj.getPageLayout(layoutType);
|
||||
tool contextObj/getTool;
|
||||
appFolder tool/getAppFolder;
|
||||
appName appFolder/getId;
|
||||
phaseInfo python: contextObj.getAppyPhases(currentOnly=True, layoutType=layoutType);
|
||||
phase phaseInfo/name;
|
||||
page request/page|python:'main';
|
||||
cssJs python: contextObj.getCssAndJs(contextObj.getAppyTypes(layoutType, page), layoutType);
|
||||
confirmMsg request/confirmMsg | nothing;">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
|
||||
xmlns:tal="http://xml.zope.org/namespaces/tal"
|
||||
xmlns:metal="http://xml.zope.org/namespaces/metal"
|
||||
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
|
||||
metal:use-macro="here/main_template/macros/master">
|
||||
|
||||
<tal:comment replace="nothing">Disable the Standard Plone green tab</tal:comment>
|
||||
<div metal:fill-slot="top_slot">
|
||||
<metal:block metal:use-macro="here/global_defines/macros/defines" />
|
||||
<div tal:define="dummy python:request.set('disable_border', 1)" />
|
||||
</div>
|
||||
<tal:main define="tool context/getTool">
|
||||
<html metal:use-macro="context/skyn/template/macros/main">
|
||||
<metal:fill fill-slot="content"
|
||||
tal:define="contextObj python:context.getParentNode();
|
||||
errors request/errors | python:{};
|
||||
layoutType python:'edit';
|
||||
layout python: contextObj.getPageLayout(layoutType);
|
||||
phaseInfo python: contextObj.getAppyPhases(currentOnly=True, layoutType=layoutType);
|
||||
phase phaseInfo/name;
|
||||
page request/page|python:'main';
|
||||
cssJs python: contextObj.getCssAndJs(contextObj.getAppyTypes(layoutType, page), layoutType);
|
||||
confirmMsg request/confirmMsg | nothing;">
|
||||
|
||||
<tal:comment replace="nothing">Include type-specific CSS and JS.</tal:comment>
|
||||
<metal:js fill-slot="javascript_head_slot">
|
||||
<tal:js condition="cssJs/js" repeat="jsFile cssJs/js">
|
||||
<script type="text/javascript" charset="iso-8859-1"
|
||||
tal:condition="python:exists('portal/%s' % jsFile)"
|
||||
tal:attributes="src string:$portal_url/$jsFile">
|
||||
</script>
|
||||
</tal:js>
|
||||
</metal:js>
|
||||
<metal:css fill-slot="css_slot">
|
||||
<tal:css condition="cssJs/css" repeat="cssFile cssJs/css">
|
||||
<style type="text/css" media="all"
|
||||
tal:condition="python:exists('portal/%s' % cssFile)"
|
||||
tal:content="structure string:<!-- @import url($portal_url/$cssFile); -->">
|
||||
</style>
|
||||
</tal:css>
|
||||
</metal:css>
|
||||
<link tal:repeat="cssFile cssJs/css" rel="stylesheet" type="text/css"
|
||||
tal:attributes="href string:$appUrl/skyn/$cssFile"/>
|
||||
<script tal:repeat="jsFile cssJs/js" type="text/javascript"
|
||||
tal:attributes="src string:$appUrl/skyn/$jsFile"></script>
|
||||
|
||||
<body>
|
||||
<metal:fill fill-slot="main">
|
||||
<metal:prologue use-macro="here/skyn/page/macros/prologue"/>
|
||||
<form id="appyEditForm" name="appyEditForm" method="post" enctype="multipart/form-data"
|
||||
tal:attributes="action python: contextObj.absolute_url()+'/skyn/do';
|
||||
class python: test(confirmMsg, 'atBaseEditForm', 'enableUnloadProtection atBaseEditForm')">
|
||||
<input type="hidden" name="action" value="Update"/>
|
||||
<input type="hidden" name="page" tal:attributes="value page"/>
|
||||
<input type="hidden" name="nav" tal:attributes="value request/nav|nothing"/>
|
||||
<input type="hidden" name="is_new" tal:attributes="value contextObj/isTemporary"/>
|
||||
<input type="hidden" name="confirmed" value="False"/>
|
||||
<metal:show use-macro="here/skyn/page/macros/show"/>
|
||||
</form>
|
||||
<script tal:condition="confirmMsg"
|
||||
tal:content="python: 'askConfirm(\'script\', \'postConfirmedEditForm()\', \'%s\')' % confirmMsg">
|
||||
</script>
|
||||
<metal:footer use-macro="here/skyn/page/macros/footer"/>
|
||||
</metal:fill>
|
||||
</body>
|
||||
<metal:prologue use-macro="here/skyn/page/macros/prologue"/>
|
||||
<form id="appyEditForm" name="appyEditForm" method="post" enctype="multipart/form-data"
|
||||
tal:attributes="action python: contextObj.absolute_url()+'/skyn/do';
|
||||
class python: test(confirmMsg, 'atBaseEditForm', 'enableUnloadProtection atBaseEditForm')">
|
||||
<input type="hidden" name="action" value="Update"/>
|
||||
<input type="hidden" name="page" tal:attributes="value page"/>
|
||||
<input type="hidden" name="nav" tal:attributes="value request/nav|nothing"/>
|
||||
<input type="hidden" name="is_new" tal:attributes="value contextObj/isTemporary"/>
|
||||
<input type="hidden" name="confirmed" value="False"/>
|
||||
<metal:show use-macro="here/skyn/page/macros/show"/>
|
||||
</form>
|
||||
<script tal:condition="confirmMsg"
|
||||
tal:content="python: 'askConfirm(\'script\', \'postConfirmedEditForm()\', \'%s\')' % confirmMsg">
|
||||
</script>
|
||||
<metal:footer use-macro="here/skyn/page/macros/footer"/>
|
||||
</metal:fill>
|
||||
</html>
|
||||
</tal:edit>
|
||||
</tal:main>
|
||||
|
|
|
@ -83,14 +83,14 @@
|
|||
<tr>
|
||||
<th tal:repeat="columnHeader python: importElems[0]">
|
||||
<img tal:condition="python: repeat['columnHeader'].number() == 1"
|
||||
tal:attributes="src string:$portal_url/skyn/eye.png;
|
||||
tal:attributes="src string:$appUrl/skyn/eye.png;
|
||||
title python: tool.translate('import_show_hide')"
|
||||
style="cursor:pointer" onClick="toggleViewableElements()" align="left" />
|
||||
<span tal:replace="columnHeader"/>
|
||||
</th>
|
||||
<th tal:content="python: tool.translate('ref_actions')"></th>
|
||||
<th width="20px"><img
|
||||
tal:attributes="src string: $portal_url/skyn/select_elems.png;
|
||||
tal:attributes="src string: $appUrl/skyn/select_elems.png;
|
||||
title python: tool.translate('select_delesect')"
|
||||
onClick="toggleCheckboxes()" style="cursor:pointer"/>
|
||||
</tr>
|
||||
|
|
|
@ -2,46 +2,46 @@
|
|||
<tal:comment replace="nothing">
|
||||
Buttons for navigating among a list of elements (next, back, first, last, etc).
|
||||
</tal:comment>
|
||||
<table cellpadding="0" cellspacing="0" class="appyNav"
|
||||
<table class="listNavigate"
|
||||
tal:define="mustSortAndFilter python: ajaxHookId == 'queryResult';
|
||||
sortKey sortKey|python:'';
|
||||
sortOrder sortOrder|python:'';
|
||||
filterKey filterKey|python:'';
|
||||
sortAndFilter python: test(mustSortAndFilter, ',\'%s\',\'%s\',\'%s\'' % (sortKey, sortOrder, filterKey), '')">
|
||||
<tr>
|
||||
<tr valign="middle">
|
||||
<tal:comment replace="nothing">Go to the first page</tal:comment>
|
||||
<td><img style="cursor:pointer" tal:condition="python: (startNumber != 0) and (startNumber != batchSize)"
|
||||
tal:attributes="src string: $portal_url/skyn/arrowLeftDouble.png;
|
||||
<td tal:condition="python: (startNumber != 0) and (startNumber != batchSize)"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $appUrl/skyn/arrowLeftDouble.png;
|
||||
title python: tool.translate('goto_first');
|
||||
onClick python: navBaseCall.replace('**v**', '0'+sortAndFilter)"/></td>
|
||||
<tal:comment replace="nothing">Go to the previous page</tal:comment>
|
||||
<td><img style="cursor:pointer" tal:condition="python: startNumber != 0"
|
||||
tal:define="sNumber python: startNumber - batchSize"
|
||||
tal:attributes="src string: $portal_url/skyn/arrowLeftSimple.png;
|
||||
title python: tool.translate('goto_previous');
|
||||
onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
|
||||
<td tal:define="sNumber python: startNumber - batchSize"
|
||||
tal:condition="python: startNumber != 0"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $appUrl/skyn/arrowLeftSimple.png;
|
||||
title python: tool.translate('goto_previous');
|
||||
onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
|
||||
<tal:comment replace="nothing">Explain which elements are currently shown</tal:comment>
|
||||
<td class="discreet" valign="middle">
|
||||
<td class="discreet">
|
||||
<span tal:replace="python: startNumber+1"/>
|
||||
<img tal:attributes="src string: $portal_url/skyn/to.png"/>
|
||||
<img tal:attributes="src string: $appUrl/skyn/to.png"/>
|
||||
<span tal:replace="python: startNumber+len(objs)"/> <b>//</b>
|
||||
<span tal:replace="python: totalNumber"/>
|
||||
</td>
|
||||
<tal:comment replace="nothing">Go to the next page</tal:comment>
|
||||
<td><img style="cursor:pointer" tal:condition="python: sNumber < totalNumber"
|
||||
tal:define="sNumber python: startNumber + batchSize"
|
||||
tal:attributes="src string: $portal_url/skyn/arrowRightSimple.png;
|
||||
title python: tool.translate('goto_next');
|
||||
onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
|
||||
<td tal:define="sNumber python: startNumber + batchSize"
|
||||
tal:condition="python: sNumber < totalNumber"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $appUrl/skyn/arrowRightSimple.png;
|
||||
title python: tool.translate('goto_next');
|
||||
onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
|
||||
<tal:comment replace="nothing">Go to the last page</tal:comment>
|
||||
<td><img style="cursor:pointer" tal:condition="python: (startNumber != sNumber) and (startNumber != sNumber-batchSize)"
|
||||
tal:define="lastPageIsIncomplete python: totalNumber % batchSize;
|
||||
<td tal:define="lastPageIsIncomplete python: totalNumber % batchSize;
|
||||
nbOfCompletePages python: totalNumber/batchSize;
|
||||
nbOfCountedPages python: test(lastPageIsIncomplete, nbOfCompletePages, nbOfCompletePages-1);
|
||||
sNumber python: (nbOfCountedPages*batchSize)"
|
||||
tal:attributes="src string: $portal_url/skyn/arrowRightDouble.png;
|
||||
title python: tool.translate('goto_last');
|
||||
onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
|
||||
tal:condition="python: (startNumber != sNumber) and (startNumber != sNumber-batchSize)"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $appUrl/skyn/arrowRightDouble.png;
|
||||
title python: tool.translate('goto_last');
|
||||
onClick python: navBaseCall.replace('**v**', str(sNumber)+sortAndFilter)"/></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
@ -51,7 +51,7 @@
|
|||
Buttons for going to next/previous elements if this one is among bunch of referenced or searched objects.
|
||||
currentNumber starts with 1.
|
||||
</tal:comment>
|
||||
<table cellpadding="0" cellspacing="0"
|
||||
<table class="objectNavigate"
|
||||
tal:define="navInfo tool/getNavigationInfo;
|
||||
currentNumber navInfo/currentNumber;
|
||||
totalNumber navInfo/totalNumber;
|
||||
|
@ -61,32 +61,32 @@
|
|||
lastUrl navInfo/lastUrl;
|
||||
sourceUrl navInfo/sourceUrl;
|
||||
backText navInfo/backText">
|
||||
<tr>
|
||||
<tr valign="middle">
|
||||
<tal:comment replace="nothing">Go to the source URL (search or referred object)</tal:comment>
|
||||
<td><a tal:condition="sourceUrl" tal:attributes="href sourceUrl"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $portal_url/skyn/gotoSource.png;
|
||||
title python: backText + ' : ' + tool.translate('goto_source')"/></a></td>
|
||||
<td tal:condition="sourceUrl"><a tal:attributes="href sourceUrl"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $appUrl/skyn/gotoSource.png;
|
||||
title python: backText + ' : ' + tool.translate('goto_source')"/></a></td>
|
||||
<tal:comment replace="nothing">Go to the first page</tal:comment>
|
||||
<td><a tal:condition="firstUrl" tal:attributes="href firstUrl"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $portal_url/skyn/arrowLeftDouble.png;
|
||||
title python: tool.translate('goto_first')"/></a></td>
|
||||
<td tal:condition="firstUrl"><a tal:attributes="href firstUrl"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $appUrl/skyn/arrowLeftDouble.png;
|
||||
title python: tool.translate('goto_first')"/></a></td>
|
||||
<tal:comment replace="nothing">Go to the previous page</tal:comment>
|
||||
<td><a tal:condition="previousUrl" tal:attributes="href previousUrl"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $portal_url/skyn/arrowLeftSimple.png;
|
||||
title python: tool.translate('goto_previous')"/></a></td>
|
||||
<td tal:condition="previousUrl"><a tal:attributes="href previousUrl"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $appUrl/skyn/arrowLeftSimple.png;
|
||||
title python: tool.translate('goto_previous')"/></a></td>
|
||||
<tal:comment replace="nothing">Explain which element is currently shown</tal:comment>
|
||||
<td class="discreet" valign="middle">
|
||||
<td class="discreet">
|
||||
<span tal:replace="python: currentNumber"/> <b>//</b>
|
||||
<span tal:replace="python: totalNumber"/>
|
||||
</td>
|
||||
<tal:comment replace="nothing">Go to the next page</tal:comment>
|
||||
<td><a tal:condition="python: nextUrl" tal:attributes="href nextUrl"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $portal_url/skyn/arrowRightSimple.png;
|
||||
title python: tool.translate('goto_next')"/></a></td>
|
||||
<td tal:condition="python: nextUrl"><a tal:attributes="href nextUrl"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $appUrl/skyn/arrowRightSimple.png;
|
||||
title python: tool.translate('goto_next')"/></a></td>
|
||||
<tal:comment replace="nothing">Go to the last page</tal:comment>
|
||||
<td><a tal:condition="lastUrl" tal:attributes="href lastUrl"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $portal_url/skyn/arrowRightDouble.png;
|
||||
title python: tool.translate('goto_last')"/></a></td>
|
||||
<td tal:condition="lastUrl"><a tal:attributes="href lastUrl"><img style="cursor:pointer"
|
||||
tal:attributes="src string: $appUrl/skyn/arrowRightDouble.png;
|
||||
title python: tool.translate('goto_last')"/></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
@ -97,11 +97,11 @@
|
|||
</tal:comment>
|
||||
<metal:sortAndFilter define-macro="sortAndFilter" tal:define="fieldName widget/name">
|
||||
<tal:sort condition="sortable">
|
||||
<img tal:attributes="src string: $portal_url/skyn/sortDown.gif;
|
||||
<img tal:attributes="src string: $appUrl/skyn/sortDown.gif;
|
||||
onClick python: navBaseCall.replace('**v**', '0,\'%s\',\'asc\',\'%s\'' % (fieldName, filterKey))"
|
||||
tal:condition="python: (sortKey != fieldName) or (sortOrder == 'desc')"
|
||||
style="cursor:pointer"/>
|
||||
<img tal:attributes="src string: $portal_url/skyn/sortUp.gif;
|
||||
<img tal:attributes="src string: $appUrl/skyn/sortUp.gif;
|
||||
onClick python: navBaseCall.replace('**v**', '0,\'%s\',\'desc\',\'%s\'' % (fieldName, filterKey))"
|
||||
tal:condition="python: (sortKey != fieldName) or (sortOrder == 'asc')"
|
||||
style="cursor:pointer"/>
|
||||
|
@ -110,7 +110,7 @@
|
|||
<input type="text" size="7"
|
||||
tal:attributes="id python: '%s_%s' % (ajaxHookId, fieldName);
|
||||
value python: test(filterKey == fieldName, filterValue, '')"/>
|
||||
<img tal:attributes="src string: $portal_url/skyn/funnel.png;
|
||||
<img tal:attributes="src string: $appUrl/skyn/funnel.png;
|
||||
onClick python: navBaseCall.replace('**v**', '0,\'%s\',\'%s\',\'%s\'' % (sortKey, sortOrder, fieldName))"
|
||||
style="cursor:pointer"/>
|
||||
</tal:filter>
|
||||
|
|
|
@ -2,374 +2,9 @@
|
|||
This macro contains global page-related Javascripts.
|
||||
</tal:comment>
|
||||
<div metal:define-macro="prologue">
|
||||
<tal:comment replace="nothing">Global elements used in every page.</tal:comment>
|
||||
|
||||
<tal:comment replace="nothing">Javascript messages</tal:comment>
|
||||
<script language="javascript" tal:content="tool/getJavascriptMessages"></script>
|
||||
|
||||
<tal:comment replace="nothing">"Static" javascripts</tal:comment>
|
||||
<script language="javascript">
|
||||
<!--
|
||||
var isIe = (navigator.appName == "Microsoft Internet Explorer");
|
||||
// AJAX machinery
|
||||
var xhrObjects = new Array(); // An array of XMLHttpRequest objects
|
||||
function XhrObject() { // Wraps a XmlHttpRequest object
|
||||
this.freed = 1; // Is this xhr object already dealing with a request or not?
|
||||
this.xhr = false;
|
||||
if (window.XMLHttpRequest) this.xhr = new XMLHttpRequest();
|
||||
else this.xhr = new ActiveXObject("Microsoft.XMLHTTP");
|
||||
this.hook = ''; /* The ID of the HTML element in the page that will be
|
||||
replaced by result of executing the Ajax request. */
|
||||
this.onGet = ''; /* The name of a Javascript function to call once we
|
||||
receive the result. */
|
||||
this.info = {}; /* An associative array for putting anything else. */
|
||||
}
|
||||
|
||||
function getAjaxChunk(pos) {
|
||||
// This function is the callback called by the AJAX machinery (see function
|
||||
// askAjaxChunk below) when an Ajax response is available.
|
||||
// First, find back the correct XMLHttpRequest object
|
||||
if ( (typeof(xhrObjects[pos]) != 'undefined') &&
|
||||
(xhrObjects[pos].freed == 0)) {
|
||||
var hook = xhrObjects[pos].hook;
|
||||
if (xhrObjects[pos].xhr.readyState == 1) {
|
||||
// The request has been initialized: display the waiting radar
|
||||
var hookElem = document.getElementById(hook);
|
||||
if (hookElem) hookElem.innerHTML = "<div align=\"center\"><img src=\"skyn/waiting.gif\"/><\/div>";
|
||||
}
|
||||
if (xhrObjects[pos].xhr.readyState == 4) {
|
||||
// We have received the HTML chunk
|
||||
var hookElem = document.getElementById(hook);
|
||||
if (hookElem && (xhrObjects[pos].xhr.status == 200)) {
|
||||
hookElem.innerHTML = xhrObjects[pos].xhr.responseText;
|
||||
// Call a custom Javascript function if required
|
||||
if (xhrObjects[pos].onGet) {
|
||||
xhrObjects[pos].onGet(xhrObjects[pos], hookElem);
|
||||
}
|
||||
// Eval inner scripts if any.
|
||||
var innerScripts = document.getElementsByName("appyHook");
|
||||
for (var i=0; i<innerScripts.length; i++) {
|
||||
eval(innerScripts[i].innerHTML);
|
||||
}
|
||||
xhrObjects[pos].freed = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function askAjaxChunk(hook,mode,url,page,macro,params,beforeSend,onGet) {
|
||||
/* This function will ask to get a chunk of HTML on the server through a
|
||||
XMLHttpRequest. p_mode can be 'GET' or 'POST'. p_url is the URL of a
|
||||
given server object. On this URL we will call the page "ajax.pt" that
|
||||
will call a specific p_macro in a given p_page with some additional
|
||||
p_params (must be an associative array) if required.
|
||||
|
||||
p_hook is the ID of the HTML element that will be filled with the HTML
|
||||
result from the server.
|
||||
|
||||
p_beforeSend is a Javascript function to call before sending the request.
|
||||
This function will get 2 args: the XMLHttpRequest object and the
|
||||
p_params. This method can return, in a string, additional parameters to
|
||||
send, ie: "¶m1=blabla¶m2=blabla".
|
||||
|
||||
p_onGet is a Javascript function to call when we will receive the answer.
|
||||
This function will get 2 args, too: the XMLHttpRequest object and the
|
||||
HTML node element into which the result has been inserted.
|
||||
*/
|
||||
// First, get a non-busy XMLHttpRequest object.
|
||||
var pos = -1;
|
||||
for (var i=0; i < xhrObjects.length; i++) {
|
||||
if (xhrObjects[i].freed == 1) { pos = i; break; }
|
||||
}
|
||||
if (pos == -1) {
|
||||
pos = xhrObjects.length;
|
||||
xhrObjects[pos] = new XhrObject();
|
||||
}
|
||||
xhrObjects[pos].hook = hook;
|
||||
xhrObjects[pos].onGet = onGet;
|
||||
if (xhrObjects[pos].xhr) {
|
||||
var rq = xhrObjects[pos];
|
||||
rq.freed = 0;
|
||||
// Construct parameters
|
||||
var paramsFull = 'page=' + page + '¯o=' + macro;
|
||||
if (params) {
|
||||
for (var paramName in params)
|
||||
paramsFull = paramsFull + '&' + paramName + '=' + params[paramName];
|
||||
}
|
||||
// Call beforeSend if required
|
||||
if (beforeSend) {
|
||||
var res = beforeSend(rq, params);
|
||||
if (res) paramsFull = paramsFull + res;
|
||||
}
|
||||
// Construct the URL to call
|
||||
var urlFull = url + '/skyn/ajax';
|
||||
if (mode == 'GET') {
|
||||
urlFull = urlFull + '?' + paramsFull;
|
||||
}
|
||||
// Perform the asynchronous HTTP GET or POST
|
||||
rq.xhr.open(mode, urlFull, true);
|
||||
if (mode == 'POST') {
|
||||
// Set the correct HTTP headers
|
||||
rq.xhr.setRequestHeader(
|
||||
"Content-Type", "application/x-www-form-urlencoded");
|
||||
rq.xhr.setRequestHeader("Content-length", paramsFull.length);
|
||||
rq.xhr.setRequestHeader("Connection", "close");
|
||||
rq.xhr.onreadystatechange = function(){ getAjaxChunk(pos); }
|
||||
rq.xhr.send(paramsFull);
|
||||
}
|
||||
else if (mode == 'GET') {
|
||||
rq.xhr.onreadystatechange = function() { getAjaxChunk(pos); }
|
||||
if (window.XMLHttpRequest) { rq.xhr.send(null); }
|
||||
else if (window.ActiveXObject) { rq.xhr.send(); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* The functions below wrap askAjaxChunk for getting specific content through
|
||||
an Ajax request. */
|
||||
function askQueryResult(hookId, objectUrl, contentType, searchName,
|
||||
startNumber, sortKey, sortOrder, filterKey) {
|
||||
// Sends an Ajax request for getting the result of a query.
|
||||
var params = {'type_name': contentType, 'search': searchName,
|
||||
'startNumber': startNumber};
|
||||
if (sortKey) params['sortKey'] = sortKey;
|
||||
if (sortOrder) params['sortOrder'] = sortOrder;
|
||||
if (filterKey) {
|
||||
var filterWidget = document.getElementById(hookId + '_' + filterKey);
|
||||
if (filterWidget && filterWidget.value) {
|
||||
params['filterKey'] = filterKey;
|
||||
params['filterValue'] = filterWidget.value;
|
||||
}
|
||||
}
|
||||
askAjaxChunk(hookId,'GET',objectUrl, 'result', 'queryResult', params);
|
||||
}
|
||||
|
||||
function askObjectHistory(hookId, objectUrl, maxPerPage, startNumber) {
|
||||
// Sends an Ajax request for getting the history of an object
|
||||
var params = {'maxPerPage': maxPerPage, 'startNumber': startNumber};
|
||||
askAjaxChunk(hookId, 'GET', objectUrl, 'page', 'objectHistory', params);
|
||||
}
|
||||
|
||||
function askRefField(hookId, objectUrl, fieldName, innerRef, startNumber,
|
||||
action, actionParams){
|
||||
// Sends an Ajax request for getting the content of a reference field.
|
||||
var startKey = hookId + '_startNumber';
|
||||
var params = {'fieldName': fieldName, 'innerRef': innerRef, };
|
||||
params[startKey] = startNumber;
|
||||
if (action) params['action'] = action;
|
||||
if (actionParams) {
|
||||
for (key in actionParams) { params[key] = actionParams[key]; };
|
||||
}
|
||||
askAjaxChunk(hookId, 'GET', objectUrl, 'widgets/ref', 'viewContent',params);
|
||||
}
|
||||
function askComputedField(hookId, objectUrl, fieldName) {
|
||||
// Sends an Ajax request for getting the content of a computed field
|
||||
var params = {'fieldName': fieldName};
|
||||
askAjaxChunk(hookId, 'GET', objectUrl, 'widgets/computed', 'viewContent',
|
||||
params);
|
||||
}
|
||||
|
||||
// Function used by checkbox widgets for having radio-button-like behaviour
|
||||
function toggleCheckbox(visibleCheckbox, hiddenBoolean) {
|
||||
vis = document.getElementById(visibleCheckbox);
|
||||
hidden = document.getElementById(hiddenBoolean);
|
||||
if (vis.checked) hidden.value = 'True';
|
||||
else hidden.value = 'False';
|
||||
}
|
||||
// Functions used for master/slave relationships between widgets
|
||||
function getMasterValue(widget) {
|
||||
// Returns an array of selected options in a select widget
|
||||
res = new Array();
|
||||
if (widget.type == 'checkbox') {
|
||||
var mv = widget.checked + '';
|
||||
mv = mv.charAt(0).toUpperCase() + mv.substr(1);
|
||||
res.push(mv);
|
||||
}
|
||||
else { // SELECT widget
|
||||
for (var i=0; i < widget.options.length; i++) {
|
||||
if (widget.options[i].selected) res.push(widget.options[i].value);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
function updateSlaves(masterValues, appyTypeId) {
|
||||
// Given the value(s) selected in a master field, this function updates the
|
||||
// state of all corresponding slaves.
|
||||
var slaves = cssQuery('table.slave_' + appyTypeId);
|
||||
for (var i=0; i< slaves.length; i++){
|
||||
slaves[i].style.display = "none";
|
||||
}
|
||||
for (var i=0; i < masterValues.length; i++) {
|
||||
var activeSlaves = cssQuery('table.slaveValue_' + appyTypeId + '_' + masterValues[i]);
|
||||
for (var j=0; j < activeSlaves.length; j++){
|
||||
activeSlaves[j].style.display = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
// Function used for triggering a workflow transition
|
||||
function triggerTransition(transitionId, msg) {
|
||||
var theForm = document.getElementById('triggerTransitionForm');
|
||||
theForm.workflow_action.value = transitionId;
|
||||
if (!msg) {
|
||||
theForm.submit();
|
||||
}
|
||||
else { // Ask the user to confirm.
|
||||
askConfirm('form', 'triggerTransitionForm', msg);
|
||||
}
|
||||
}
|
||||
function onDeleteObject(objectUid) {
|
||||
f = document.getElementById('deleteForm');
|
||||
f.objectUid.value = objectUid;
|
||||
askConfirm('form', 'deleteForm', delete_confirm);
|
||||
}
|
||||
function toggleCookie(cookieId) {
|
||||
// What is the state of this boolean (expanded/collapsed) cookie?
|
||||
var state = readCookie(cookieId);
|
||||
if ((state != 'collapsed') && (state != 'expanded')) {
|
||||
// No cookie yet, create it.
|
||||
createCookie(cookieId, 'collapsed');
|
||||
state = 'collapsed';
|
||||
}
|
||||
var hook = document.getElementById(cookieId); // The hook is the part of
|
||||
// the HTML document that needs to be shown or hidden.
|
||||
var displayValue = 'none';
|
||||
var newState = 'collapsed';
|
||||
var imgSrc = 'skyn/expand.gif';
|
||||
if (state == 'collapsed') {
|
||||
// Show the HTML zone
|
||||
displayValue = 'block';
|
||||
imgSrc = 'skyn/collapse.gif';
|
||||
newState = 'expanded';
|
||||
}
|
||||
// Update the corresponding HTML element
|
||||
hook.style.display = displayValue;
|
||||
var img = document.getElementById(cookieId + '_img');
|
||||
img.src = imgSrc;
|
||||
// Inverse the cookie value
|
||||
createCookie(cookieId, newState);
|
||||
}
|
||||
// Function that allows to generate a document from a pod template.
|
||||
function generatePodDocument(contextUid, fieldName, podFormat, queryData) {
|
||||
var theForm = document.getElementsByName("podTemplateForm")[0];
|
||||
theForm.objectUid.value = contextUid;
|
||||
theForm.fieldName.value = fieldName;
|
||||
theForm.podFormat.value = podFormat;
|
||||
theForm.askAction.value = "False";
|
||||
theForm.queryData.value = queryData;
|
||||
var askActionWidget = document.getElementById(contextUid + '_' + fieldName);
|
||||
if (askActionWidget && askActionWidget.checked) {
|
||||
theForm.askAction.value = "True";
|
||||
}
|
||||
theForm.submit();
|
||||
}
|
||||
// Functions for opening and closing a popup
|
||||
function openPopup(popupId, msg) {
|
||||
// Put the message into the popup
|
||||
var confirmElem = document.getElementById('appyConfirmText');
|
||||
confirmElem.innerHTML = msg;
|
||||
// Open the popup
|
||||
var popup = document.getElementById(popupId);
|
||||
// Put it at the right place on the screen
|
||||
var scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0;
|
||||
popup.style.top = (scrollTop + 150) + 'px';
|
||||
popup.style.display = "block";
|
||||
// Show the greyed zone
|
||||
var greyed = document.getElementById('appyGrey');
|
||||
greyed.style.top = scrollTop + 'px';
|
||||
greyed.style.display = "block";
|
||||
}
|
||||
function closePopup(popupId) {
|
||||
// Close the popup
|
||||
var popup = document.getElementById(popupId);
|
||||
popup.style.display = "none";
|
||||
// Hide the greyed zone
|
||||
var greyed = document.getElementById('appyGrey');
|
||||
greyed.style.display = "none";
|
||||
}
|
||||
// Function triggered when an action needs to be confirmed by the user
|
||||
function askConfirm(actionType, action, msg) {
|
||||
/* Store the actionType (send a form, call an URL or call a script) and the
|
||||
related action, and shows the confirm popup. If the user confirms, we
|
||||
will perform the action. */
|
||||
var confirmForm = document.getElementById('confirmActionForm');
|
||||
confirmForm.actionType.value = actionType;
|
||||
confirmForm.action.value = action;
|
||||
openPopup("confirmActionPopup", msg);
|
||||
}
|
||||
// Function triggered when an action confirmed by the user must be performed
|
||||
function doConfirm() {
|
||||
// The user confirmed: perform the required action.
|
||||
closePopup('confirmActionPopup');
|
||||
var confirmForm = document.getElementById('confirmActionForm');
|
||||
var actionType = confirmForm.actionType.value;
|
||||
var action = confirmForm.action.value;
|
||||
if (actionType == 'form') {
|
||||
// We must submit the form whose id is in "action"
|
||||
document.getElementById(action).submit();
|
||||
}
|
||||
else if (actionType == 'url') {
|
||||
// We must go to the URL defined in "action"
|
||||
window.location = action;
|
||||
}
|
||||
else if (actionType == 'script') {
|
||||
// We must execute Javascript code in "action"
|
||||
eval(action);
|
||||
}
|
||||
}
|
||||
// Function that finally posts the edit form after the user has confirmed that
|
||||
// she really wants to post it.
|
||||
function postConfirmedEditForm() {
|
||||
var theForm = document.getElementById('appyEditForm');
|
||||
theForm.confirmed.value = "True";
|
||||
theForm.submit();
|
||||
}
|
||||
// Function that shows or hides a tab. p_action is 'show' or 'hide'.
|
||||
function manageTab(tabId, action) {
|
||||
// Manage the tab content (show it or hide it)
|
||||
var content = document.getElementById('tabcontent_' + tabId);
|
||||
if (action == 'show') { content.style.display = 'table-row'; }
|
||||
else { content.style.display = 'none'; }
|
||||
// Manage the tab itself (show as selected or unselected)
|
||||
var left = document.getElementById('tab_' + tabId + '_left');
|
||||
var tab = document.getElementById('tab_' + tabId);
|
||||
var right = document.getElementById('tab_' + tabId + '_right');
|
||||
if (action == 'show') {
|
||||
left.src = "skyn/tabLeft.png";
|
||||
tab.style.backgroundImage = "url(skyn/tabBg.png)";
|
||||
right.src = "skyn/tabRight.png";
|
||||
}
|
||||
if (action == 'hide') {
|
||||
left.src = "skyn/tabLeftu.png";
|
||||
tab.style.backgroundImage = "url(skyn/tabBgu.png)";
|
||||
right.src = "skyn/tabRightu.png";
|
||||
}
|
||||
}
|
||||
// Function used for displaying/hiding content of a tab
|
||||
function showTab(tabId) {
|
||||
// 1st, show the tab to show
|
||||
manageTab(tabId, 'show');
|
||||
// Compute the number of tabs.
|
||||
var idParts = tabId.split('_');
|
||||
var prefix = idParts[0] + '_';
|
||||
// Store the currently selected tab in a cookie.
|
||||
createCookie('tab_' + idParts[0], tabId);
|
||||
var nbOfTabs = idParts[2]*1;
|
||||
// Then, hide the other tabs.
|
||||
for (var i=0; i<nbOfTabs; i++) {
|
||||
var idTab = prefix + (i+1) + '_' + nbOfTabs;
|
||||
if (idTab != tabId) {
|
||||
manageTab(idTab, 'hide');
|
||||
}
|
||||
}
|
||||
}
|
||||
// Function that initializes the state of a tab
|
||||
function initTab(cookieId, defaultValue) {
|
||||
var toSelect = readCookie(cookieId);
|
||||
if (!toSelect) { showTab(defaultValue) }
|
||||
else { showTab(toSelect); }
|
||||
}
|
||||
-->
|
||||
</script>
|
||||
<tal:comment replace="nothing">Global form for deleting an object</tal:comment>
|
||||
<form id="deleteForm" method="post" action="skyn/do">
|
||||
<input type="hidden" name="action" value="Delete"/>
|
||||
|
@ -405,14 +40,14 @@
|
|||
layoutType We must know if we must render the widgets in a "view",
|
||||
"edit" or "cell" layout
|
||||
</tal:comment>
|
||||
<table metal:define-macro="widgets" cellpadding="0" cellspacing="0"
|
||||
<table metal:define-macro="widgets"
|
||||
tal:attributes="width layout/width">
|
||||
<tr tal:repeat="widget python: contextObj.getGroupedAppyTypes(layoutType, page)">
|
||||
<td tal:condition="python: widget['type'] == 'group'">
|
||||
<metal:call use-macro="portal/skyn/widgets/show/macros/group"/>
|
||||
<metal:call use-macro="app/skyn/widgets/show/macros/group"/>
|
||||
</td>
|
||||
<td tal:condition="python: widget['type'] != 'group'">
|
||||
<metal:call use-macro="portal/skyn/widgets/show/macros/field"/>
|
||||
<metal:call use-macro="app/skyn/widgets/show/macros/field"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
@ -501,7 +136,7 @@
|
|||
tal:content="python: tool.translate(contextObj.getWorkflowLabel(stateInfo['name']))">
|
||||
</td>
|
||||
<td tal:condition="python: stateInfo['name'] != states[-1]['name']">
|
||||
<img tal:attributes="src string: $portal_url/skyn/nextState.png"/>
|
||||
<img tal:attributes="src string: $appUrl/skyn/nextState.png"/>
|
||||
</td>
|
||||
</tal:state>
|
||||
</tr>
|
||||
|
@ -558,15 +193,13 @@
|
|||
tal:condition="not: contextObj/isTemporary">
|
||||
|
||||
<tal:comment replace="nothing">Information that is common to all tabs (object title, state, etc)</tal:comment>
|
||||
<table width="100%" tal:condition="showCommonInfo" class="appyCommonInfo">
|
||||
<tr valign="bottom" align="left">
|
||||
<tal:comment replace="nothing">Title and state</tal:comment>
|
||||
<td width="80%">
|
||||
<b class="appyTitle" tal:content="contextObj/title_or_id"></b>
|
||||
</td>
|
||||
<table width="100%" tal:condition="showCommonInfo" class="summary">
|
||||
<tr>
|
||||
<tal:comment replace="nothing">Title</tal:comment>
|
||||
<td colspan="2" class="objectTitle" tal:content="contextObj/title_or_id"></td>
|
||||
</tr>
|
||||
<tr align="left">
|
||||
<td class="documentByLine" colspan="2">
|
||||
<tr class="underTitle">
|
||||
<td class="by" colspan="2">
|
||||
<tal:comment replace="nothing">Creator and last modification date</tal:comment>
|
||||
<tal:comment replace="nothing">Plus/minus icon for accessing history</tal:comment>
|
||||
<tal:accessHistory condition="hasHistory">
|
||||
|
@ -579,34 +212,32 @@
|
|||
<tal:comment replace="nothing">Show document creator</tal:comment>
|
||||
<tal:creator condition="creator"
|
||||
define="author python:contextObj.portal_membership.getMemberInfo(creator)">
|
||||
<span class="documentAuthor" i18n:domain="plone" i18n:translate="label_by_author">
|
||||
by <a tal:attributes="href string:${portal_url}/author/${creator}"
|
||||
tal:content="python:author and author['fullname'] or creator"
|
||||
tal:omit-tag="not:author" i18n:name="author"/>
|
||||
<span i18n:domain="plone" i18n:translate="label_by_author">
|
||||
by <span tal:content="python:author and author['fullname'] or creator"
|
||||
tal:omit-tag="not:author" i18n:name="author"/>
|
||||
—
|
||||
</span>
|
||||
</tal:creator>
|
||||
<tal:comment replace="nothing">Show last modification date</tal:comment>
|
||||
<span i18n:translate="box_last_modified" i18n:domain="plone"></span>
|
||||
<span tal:replace="python:contextObj.restrictedTraverse('@@plone').toLocalizedTime(contextObj.ModificationDate(),long_format=1)"></span>
|
||||
</td>
|
||||
</tr>
|
||||
<tal:comment replace="nothing">Object history</tal:comment>
|
||||
<tr tal:condition="hasHistory" align="left">
|
||||
<tr tal:condition="hasHistory">
|
||||
<td colspan="2">
|
||||
<span id="appyHistory"
|
||||
tal:attributes="style python:test(historyExpanded, 'display:block', 'display:none')">
|
||||
<div tal:define="ajaxHookId python: contextObj.UID() + '_history';"
|
||||
tal:attributes="id ajaxHookId">
|
||||
<script language="javascript" tal:content="python: 'askObjectHistory(\'%s\',\'%s\',%d,0)' % (ajaxHookId, contextObj.absolute_url(),historyMaxPerPage)">
|
||||
<script tal:content="python: 'askObjectHistory(\'%s\',\'%s\',%d,0)' % (ajaxHookId, contextObj.absolute_url(),historyMaxPerPage)">
|
||||
</script>
|
||||
</div>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tal:comment replace="nothing">Workflow-related information and actions</tal:comment>
|
||||
<tr tal:condition="python: showWorkflow and contextObj.getWorkflowLabel()" align="left">
|
||||
<td colspan="2" class="appyWorkflow">
|
||||
<tr tal:condition="python: showWorkflow and contextObj.getWorkflowLabel()">
|
||||
<td colspan="2" class="workflow">
|
||||
<table width="100%">
|
||||
<tr>
|
||||
<td><metal:states use-macro="here/skyn/page/macros/states"/></td>
|
||||
|
@ -622,7 +253,7 @@
|
|||
The page footer.
|
||||
</tal:comment>
|
||||
<metal:footer define-macro="footer">
|
||||
<tal:dummy define="messages putils/showPortalMessages"/>
|
||||
<tal:dummy define="messages app/plone_utils/showPortalMessages"/>
|
||||
<script language="javascript">
|
||||
<!--
|
||||
// When the current page is loaded, we must set the correct state for all slave fields.
|
||||
|
@ -674,12 +305,12 @@
|
|||
<tal:button condition="isEdit">
|
||||
<input type="image" class="imageInput" style="cursor:pointer" name="buttonPrevious"
|
||||
title="label_previous" i18n:attributes="title" i18n:domain="plone"
|
||||
tal:attributes="src string:$portal_url/skyn/previous.png"/>
|
||||
tal:attributes="src string:$appUrl/skyn/previous.png"/>
|
||||
<input type="hidden" name="previousPage" tal:attributes="value previousPage"/>
|
||||
</tal:button>
|
||||
<tal:link condition="not: isEdit">
|
||||
<a tal:attributes="href python: contextObj.getUrl(page=previousPage)">
|
||||
<img tal:attributes="src string:$portal_url/skyn/previous.png"
|
||||
<img tal:attributes="src string:$appUrl/skyn/previous.png"
|
||||
title="label_previous" i18n:attributes="title" i18n:domain="plone"/>
|
||||
</a>
|
||||
</tal:link>
|
||||
|
@ -688,38 +319,38 @@
|
|||
<tal:save condition="python: isEdit and pageInfo['showSave']">
|
||||
<input type="image" class="imageInput" style="cursor:pointer" name="buttonOk"
|
||||
title="label_save" i18n:attributes="title" i18n:domain="plone"
|
||||
tal:attributes="src string:$portal_url/skyn/save.png"/>
|
||||
tal:attributes="src string:$appUrl/skyn/save.png"/>
|
||||
</tal:save>
|
||||
|
||||
<tal:cancel condition="python: isEdit and pageInfo['showCancel']">
|
||||
<input type="image" class="imageInput" style="cursor:pointer" name="buttonCancel"
|
||||
title="label_cancel" i18n:attributes="title" i18n:domain="plone"
|
||||
tal:attributes="src string:$portal_url/skyn/cancel.png"/>
|
||||
tal:attributes="src string:$appUrl/skyn/cancel.png"/>
|
||||
</tal:cancel>
|
||||
|
||||
<tal:edit condition="python: not isEdit and pageInfo['showOnEdit']">
|
||||
<img title="Edit" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
|
||||
tal:attributes="onClick python: 'href: window.location=\'%s\'' % contextObj.getUrl(mode='edit', page=page);
|
||||
src string: $portal_url/skyn/editBig.png"
|
||||
tal:condition="python: member.has_permission('Modify portal content', contextObj)"/>
|
||||
src string: $appUrl/skyn/editBig.png"
|
||||
tal:condition="python: contextObj.allows('Modify portal content')"/>
|
||||
</tal:edit>
|
||||
|
||||
<tal:refresh condition="contextObj/isDebug">
|
||||
<img title="Refresh" style="cursor:pointer"
|
||||
tal:attributes="onClick python: 'href: window.location=\'%s\'' % contextObj.getUrl(mode=layoutType, page=page, refresh='yes');
|
||||
src string: $portal_url/skyn/refresh.png"/>
|
||||
src string: $appUrl/skyn/refresh.png"/>
|
||||
</tal:refresh>
|
||||
|
||||
<tal:next condition="python: nextPage and pageInfo['showNext']">
|
||||
<tal:button condition="isEdit">
|
||||
<input type="image" class="imageInput" style="cursor:pointer" name="buttonNext"
|
||||
title="label_next" i18n:attributes="title" i18n:domain="plone"
|
||||
tal:attributes="src string:$portal_url/skyn/next.png"/>
|
||||
tal:attributes="src string:$appUrl/skyn/next.png"/>
|
||||
<input type="hidden" name="nextPage" tal:attributes="value nextPage"/>
|
||||
</tal:button>
|
||||
<tal:link condition="not: isEdit">
|
||||
<a tal:attributes="href python: contextObj.getUrl(page=nextPage)">
|
||||
<img tal:attributes="src string:$portal_url/skyn/next.png"
|
||||
<img tal:attributes="src string:$appUrl/skyn/next.png"
|
||||
title="label_next" i18n:attributes="title" i18n:domain="plone"/>
|
||||
</a>
|
||||
</tal:link>
|
||||
|
@ -731,17 +362,12 @@
|
|||
</tal:comment>
|
||||
<metal:message define-macro="message">
|
||||
<tal:comment replace="nothing">Single message from portal_status_message request key</tal:comment>
|
||||
<div tal:define="msg request/portal_status_message | nothing"
|
||||
tal:condition="msg" class="portalMessage" tal:content="structure msg"></div>
|
||||
<div tal:define="msg req/portal_status_message | nothing"
|
||||
tal:condition="msg" class="message" tal:content="structure msg"></div>
|
||||
|
||||
<tal:comment replace="nothing">Messages added via plone_utils</tal:comment>
|
||||
<tal:messages define="messages putils/showPortalMessages" condition="messages">
|
||||
<tal:msgs define="type_css_map python: {'info':'portalMessage', 'warn':'portalWarningMessage',
|
||||
'stop':'portalStopMessage'};"
|
||||
repeat="msg messages">
|
||||
<div tal:define="mtype msg/type | nothing;"
|
||||
tal:attributes="class python:mtype and type_css_map[mtype] or 'info';"
|
||||
tal:content="structure msg/message | nothing"></div>
|
||||
</tal:msgs>
|
||||
<tal:messages define="messages python: ''.join([m.message for m in app.plone_utils.showPortalMessages()])"
|
||||
condition="messages">
|
||||
<div class="message" tal:content="structure messages"></div>
|
||||
</tal:messages>
|
||||
</metal:message>
|
||||
|
|
Before Width: | Height: | Size: 225 B After Width: | Height: | Size: 246 B |
|
@ -1,76 +1,57 @@
|
|||
<tal:comment replace="nothing">
|
||||
This macro displays the content of the application portlet.
|
||||
</tal:comment>
|
||||
<metal:portletContent define-macro="portletContent"
|
||||
tal:define="queryUrl python: '%s/skyn/query' % appFolder.absolute_url();
|
||||
currentSearch request/search|nothing;
|
||||
currentType request/type_name|nothing;
|
||||
contextObj python: tool.getPublishedObject()">
|
||||
<tal:comment replace="nothing">Portlet title, with link to tool.</tal:comment>
|
||||
<dt class="portletHeader">
|
||||
<tal:comment replace="nothing">For the Manager, clicking on the portlet
|
||||
title allows to see all root objects in the database.</tal:comment>
|
||||
<table cellpadding="0" cellspacing="0" width="100%">
|
||||
<tr>
|
||||
<td tal:define="titleIsClickable python: member.has_role('Manager') and rootClasses">
|
||||
<a tal:condition="titleIsClickable"
|
||||
tal:attributes="href python:'%s?type_name=%s' % (queryUrl, ','.join(rootClasses))"
|
||||
tal:content="structure python: tool.translate(appName)"></a>
|
||||
<span tal:condition="not: titleIsClickable"
|
||||
tal:replace="structure python: tool.translate(appName)"/>
|
||||
</td>
|
||||
<td align="right">
|
||||
<img style="cursor:pointer"
|
||||
tal:condition="python: member.has_role('Manager')"
|
||||
tal:attributes="onClick python: 'href: window.location=\'%s\'' % tool.getUrl(page='main', nav='');
|
||||
title python: tool.translate('%sTool' % appName);
|
||||
src string:$portal_url/skyn/appyConfig.gif"/>
|
||||
</td>
|
||||
</dt>
|
||||
<metal:portlet define-macro="portlet"
|
||||
tal:define="queryUrl python: '%s/skyn/query' % tool.absolute_url();
|
||||
toolUrl tool/absolute_url;
|
||||
currentSearch req/search|nothing;
|
||||
currentType req/type_name|nothing;
|
||||
contextObj tool/getPublishedObject;
|
||||
rootClasses tool/getRootClasses">
|
||||
|
||||
<tal:publishedObject condition="python: contextObj and contextObj.mayNavigate()">
|
||||
<dt class="portletAppyItem portletCurrent"><b tal:content="contextObj/Title"></b></dt>
|
||||
<dt class="portletAppyItem"><metal:phases use-macro="here/skyn/portlet/macros/phases"/></dt>
|
||||
<b tal:content="contextObj/Title"></b>
|
||||
<span><metal:phases use-macro="here/skyn/portlet/macros/phases"/></span>
|
||||
</tal:publishedObject>
|
||||
|
||||
<tal:comment replace="nothing">Create a section for every root class.</tal:comment>
|
||||
|
||||
<tal:comment replace="nothing">One section for every searchable root class.</tal:comment>
|
||||
<tal:section repeat="rootClass python: [rc for rc in rootClasses if tool.userMaySearch(rc)]">
|
||||
<tal:comment replace="nothing">Section title, with action icons</tal:comment>
|
||||
<dt tal:attributes="class python:test((repeat['rootClass'].number()==1) and not contextObj, 'portletAppyItem', 'portletAppyItem portletSep')">
|
||||
<table width="100%" cellspacing="0" cellpadding="0" class="no-style-table">
|
||||
<tr>
|
||||
<td>
|
||||
<a tal:attributes="href python: '%s?type_name=%s' % (queryUrl, rootClass);
|
||||
class python:test(not currentSearch and (currentType==rootClass), 'portletCurrent', '')"
|
||||
tal:content="structure python: tool.translate(rootClass + '_plural')"></a>
|
||||
</td>
|
||||
<td align="right"
|
||||
tal:define="addPermission python: '%s: Add %s' % (appName, rootClass);
|
||||
userMayAdd python: member.has_permission(addPermission, appFolder);
|
||||
createMeans python: tool.getCreateMeans(rootClass)">
|
||||
<tal:comment replace="nothing">Create a new object from a web form</tal:comment>
|
||||
<img style="cursor:pointer"
|
||||
tal:condition="python: ('form' in createMeans) and userMayAdd"
|
||||
tal:attributes="onClick python: 'href: window.location=\'%s/skyn/do?action=Create&type_name=%s\'' % (appFolder.absolute_url(), rootClass);
|
||||
src string: $portal_url/skyn/plus.png;
|
||||
title python: tool.translate('query_create')"/>
|
||||
<tal:comment replace="nothing">Create (a) new object(s) by importing data</tal:comment>
|
||||
<img style="cursor:pointer"
|
||||
tal:condition="python: ('import' in createMeans) and userMayAdd"
|
||||
tal:attributes="onClick python: 'href: window.location=\'%s/skyn/import?type_name=%s\'' % (appFolder.absolute_url(), rootClass);
|
||||
src string: $portal_url/skyn/import.png;
|
||||
title python: tool.translate('query_import')"/>
|
||||
<tal:comment replace="nothing">Search objects of this type</tal:comment>
|
||||
<img style="cursor:pointer"
|
||||
tal:define="showSearch python: tool.getAttr('enableAdvancedSearchFor%s' % rootClass)"
|
||||
tal:condition="showSearch"
|
||||
tal:attributes="onClick python: 'href: window.location=\'%s/skyn/search?type_name=%s\'' % (appFolder.absolute_url(), rootClass);
|
||||
src string: $portal_url/skyn/search.gif;
|
||||
title python: tool.translate('search_objects')"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</dt>
|
||||
<table width="100%"
|
||||
tal:define="afUrl appFolder/absolute_url"
|
||||
tal:attributes="class python:test((repeat['rootClass'].number()==1) and not contextObj, '', 'portletSep')">
|
||||
<tr>
|
||||
<td>
|
||||
<a tal:attributes="href python: '%s?type_name=%s' % (queryUrl, rootClass);
|
||||
class python:test(not currentSearch and (currentType==rootClass), 'portletCurrent', '')"
|
||||
tal:content="structure python: _(rootClass + '_plural')"></a>
|
||||
</td>
|
||||
<td align="right"
|
||||
tal:define="addPermission python: '%s: Add %s' % (appName, rootClass);
|
||||
userMayAdd python: user.has_permission(addPermission, appFolder);
|
||||
createMeans python: tool.getCreateMeans(rootClass)">
|
||||
<tal:comment replace="nothing">Create a new object from a web form</tal:comment>
|
||||
<img style="cursor:pointer"
|
||||
tal:condition="python: ('form' in createMeans) and userMayAdd"
|
||||
tal:attributes="onClick python: 'href: window.location=\'%s/skyn/do?action=Create&type_name=%s\'' % (afUrl, rootClass);
|
||||
src string: $appUrl/skyn/plus.png;
|
||||
title python: _('query_create')"/>
|
||||
<tal:comment replace="nothing">Create (a) new object(s) by importing data</tal:comment>
|
||||
<img style="cursor:pointer"
|
||||
tal:condition="python: ('import' in createMeans) and userMayAdd"
|
||||
tal:attributes="onClick python: 'href: window.location=\'%s/skyn/import?type_name=%s\'' % (toolUrl, rootClass);
|
||||
src string: $appUrl/skyn/import.png;
|
||||
title python: _('query_import')"/>
|
||||
<tal:comment replace="nothing">Search objects of this type</tal:comment>
|
||||
<img style="cursor:pointer"
|
||||
tal:define="showSearch python: tool.getAttr('enableAdvancedSearchFor%s' % rootClass)"
|
||||
tal:condition="showSearch"
|
||||
tal:attributes="onClick python: 'href: window.location=\'%s/skyn/search?type_name=%s\'' % (toolUrl, rootClass);
|
||||
src string: $appUrl/skyn/search.gif;
|
||||
title python: _('search_objects')"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<tal:comment replace="nothing">Searches for this content type.</tal:comment>
|
||||
<tal:searchOrGroup repeat="searchOrGroup python: tool.getSearches(rootClass)">
|
||||
<tal:group condition="searchOrGroup/isGroup">
|
||||
|
@ -106,28 +87,7 @@
|
|||
</dt>
|
||||
</tal:searchOrGroup>
|
||||
</tal:section>
|
||||
|
||||
<tal:comment replace="nothing">
|
||||
Greyed transparent zone that is deployed on the
|
||||
whole screen when a popup is displayed.
|
||||
</tal:comment>
|
||||
<div id="appyGrey" class="appyGrey"></div>
|
||||
|
||||
<tal:comment replace="nothing">Popup for confirming an action</tal:comment>
|
||||
<div id="confirmActionPopup" class="appyPopup">
|
||||
<form id="confirmActionForm" method="post">
|
||||
<div align="center">
|
||||
<p id="appyConfirmText"></p>
|
||||
<input type="hidden" name="actionType"/>
|
||||
<input type="hidden" name="action"/>
|
||||
<input type="button" onClick="doConfirm()"
|
||||
tal:attributes="value python:tool.translate('yes')"/>
|
||||
<input type="button" value="No" onClick="closePopup('confirmActionPopup')"
|
||||
tal:attributes="value python:tool.translate('no')"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</metal:portletContent>
|
||||
</metal:portlet>
|
||||
|
||||
<tal:comment replace="nothing">
|
||||
This macro displays, within the portlet, the navigation tree for the
|
||||
|
@ -135,48 +95,48 @@
|
|||
</tal:comment>
|
||||
<metal:phases define-macro="phases">
|
||||
<table tal:define="phases contextObj/getAppyPhases|nothing;
|
||||
page python: request.get('page', 'main')"
|
||||
page python: req.get('page', 'main')"
|
||||
tal:condition="python: phases and not ((len(phases)==1) and len(phases[0]['pages'])==1)"
|
||||
cellspacing="1" cellpadding="2" width="100%">
|
||||
width="100%">
|
||||
<tal:phase repeat="phase phases">
|
||||
<tal:comment replace="nothing">The box containing phase-related information</tal:comment>
|
||||
<tr>
|
||||
<td tal:define="label python:'%s_phase_%s' % (contextObj.meta_type, phase['name']);
|
||||
displayLink python: (phase['phaseStatus'] != 'Future') and ('/portal_factory' not in contextObj.absolute_url()) and (len(phase['pages']) == 1)"
|
||||
tal:attributes="class python: (len(phases) > 1) and ('appyPhase step%s' % phase['phaseStatus']) or 'appyPhase'">
|
||||
tal:attributes="class python: (len(phases) > 1) and 'phase' or ''">
|
||||
<div class="portletGroup" tal:condition="python: len(phases) > 1">
|
||||
|
||||
<tal:comment replace="nothing">A single page in the phase</tal:comment>
|
||||
<table tal:condition="displayLink" cellpadding="0" cellspacing="0" width="100%">
|
||||
<table tal:condition="displayLink" width="100%">
|
||||
<tr tal:define="pageName python: phase['pages'][0]">
|
||||
<td><a tal:attributes="href python: contextObj.getUrl(page=pageName)"
|
||||
tal:content="structure python: tool.translate(label)"></a>
|
||||
tal:content="structure python: _(label)"></a>
|
||||
</td>
|
||||
<td align="right">
|
||||
<img title="Edit" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
|
||||
tal:attributes="onClick python: 'href: window.location=\'%s\'' % contextObj.getUrl(mode='edit', page=pageName);
|
||||
src string: $portal_url/skyn/edit.gif"
|
||||
tal:condition="python: member.has_permission('Modify portal content', contextObj) and phase['pagesInfo'][pageName]['showOnEdit']"/>
|
||||
src string: $appUrl/skyn/edit.gif"
|
||||
tal:condition="python: contextObj.allows('Modify portal content') and phase['pagesInfo'][pageName]['showOnEdit']"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<tal:comment replace="nothing">Several pages in the phase</tal:comment>
|
||||
<span tal:condition="not: displayLink" tal:replace="structure python: tool.translate(label)"/>
|
||||
<span tal:condition="not: displayLink" tal:replace="structure python: _(label)"/>
|
||||
</div>
|
||||
<div class="portletMenu">
|
||||
<table cellpadding="0" cellspacing="0" width="100%"
|
||||
tal:condition="python: len(phase['pages']) > 1">
|
||||
<tr tal:repeat="aPage phase/pages" valign="top">
|
||||
<td tal:attributes="class python: test(aPage == page, 'portletCurrent portletPageItem', 'portletPageItem')">
|
||||
<td tal:attributes="class python: test(aPage == page, 'portletCurrent portletPage', 'portletPage')">
|
||||
<a tal:attributes="href python: contextObj.getUrl(page=aPage)"
|
||||
tal:content="structure python: tool.translate('%s_page_%s' % (contextObj.meta_type, aPage))">
|
||||
tal:content="structure python: _('%s_page_%s' % (contextObj.meta_type, aPage))">
|
||||
</a>
|
||||
</td>
|
||||
<td align="right">
|
||||
<img title="Edit" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
|
||||
tal:attributes="onClick python: 'href: window.location=\'%s\'' % contextObj.getUrl(mode='edit', page=aPage);
|
||||
src string: $portal_url/skyn/edit.gif"
|
||||
tal:condition="python: member.has_permission('Modify portal content', contextObj) and phase['pagesInfo'][aPage]['showOnEdit']"/>
|
||||
src string: $appUrl/skyn/edit.gif"
|
||||
tal:condition="python: user.has_permission('Modify portal content', contextObj) and phase['pagesInfo'][aPage]['showOnEdit']"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
@ -185,7 +145,7 @@
|
|||
</tr>
|
||||
<tal:comment replace="nothing">The down arrow pointing to the next phase (if any)</tal:comment>
|
||||
<tr tal:condition="python: phase['name'] != phases[-1]['name']">
|
||||
<td> <img tal:attributes="src string: $portal_url/skyn/nextPhase.png"/></td>
|
||||
<td> <img tal:attributes="src string: $appUrl/skyn/nextPhase.png"/></td>
|
||||
</tr>
|
||||
</tal:phase>
|
||||
</table>
|
||||
|
|
|
@ -1,22 +1,8 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
|
||||
metal:use-macro="here/main_template/macros/master">
|
||||
|
||||
<tal:comment replace="nothing">This page presents results of queries</tal:comment>
|
||||
<body>
|
||||
|
||||
<tal:comment replace="nothing">Disable standard Plone green tabs</tal:comment>
|
||||
<div metal:fill-slot="top_slot">
|
||||
<metal:block metal:use-macro="here/global_defines/macros/defines" />
|
||||
<div tal:define="dummy python:request.set('disable_border', 1)" />
|
||||
</div>
|
||||
|
||||
<tal:comment replace="nothing">We suppose we are in the app folder here.</tal:comment>
|
||||
<div metal:fill-slot="main"
|
||||
tal:define="appFolder context/getParentNode;
|
||||
appName appFolder/id;
|
||||
tool python: portal.get('portal_%s' % appName.lower());
|
||||
contentType request/type_name;
|
||||
searchName request/search|python:''">
|
||||
<tal:main define="tool context/getParentNode">
|
||||
<html metal:use-macro="context/skyn/template/macros/main">
|
||||
<metal:fill fill-slot="content"
|
||||
tal:define="contentType request/type_name;
|
||||
searchName request/search|python:''">
|
||||
|
||||
<div metal:use-macro="here/skyn/page/macros/prologue"/>
|
||||
<tal:comment replace="nothing">Query result</tal:comment>
|
||||
|
@ -26,6 +12,6 @@
|
|||
tal:define="ajaxUrl python: tool.getQueryUrl(contentType, searchName)"
|
||||
tal:content="python: 'askQueryResult(\'queryResult\', \'%s\',\'%s\',\'%s\',0)' % (tool.absolute_url(), contentType, searchName)">
|
||||
</script>
|
||||
</div>
|
||||
</body>
|
||||
</metal:fill>
|
||||
</html>
|
||||
</tal:main>
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
<metal:queryResults define-macro="queryResult"
|
||||
tal:define="tool python: contextObj;
|
||||
contentType request/type_name;
|
||||
tal:define="contentType request/type_name;
|
||||
refInfo tool/getRefInfo;
|
||||
refField python: refInfo[1];
|
||||
refInfo python: refInfo[0];
|
||||
|
@ -21,7 +20,7 @@
|
|||
batchSize queryResult/batchSize;
|
||||
ajaxHookId python:'queryResult';
|
||||
navBaseCall python: 'askQueryResult(\'%s\',\'%s\',\'%s\',\'%s\',**v**)' % (ajaxHookId, tool.absolute_url(), contentType, searchName);
|
||||
newSearchUrl python: '%s/skyn/search?type_name=%s&ref=%s' % (tool.getAppFolder().absolute_url(), contentType, refInfo);">
|
||||
newSearchUrl python: '%s/skyn/search?type_name=%s&ref=%s' % (tool.absolute_url(), contentType, refInfo);">
|
||||
|
||||
<tal:result condition="objs">
|
||||
|
||||
|
@ -36,7 +35,7 @@
|
|||
</legend>
|
||||
|
||||
<tal:comment replace="nothing">Display here POD templates if required.</tal:comment>
|
||||
<table align="right" cellpadding="0" cellspacing="0"
|
||||
<table align="right"
|
||||
tal:define="widgets python: tool.getResultPodFields(contentType);
|
||||
layoutType python:'view'"
|
||||
tal:condition="python: objs and widgets">
|
||||
|
@ -46,7 +45,7 @@
|
|||
</td></tr>
|
||||
</table>
|
||||
|
||||
<table cellpadding="0" cellspacing="0" width="100%">
|
||||
<table width="100%">
|
||||
<tr>
|
||||
<tal:descr condition="searchName">
|
||||
<td tal:define="descr python: tool.translate('%s_descr' % labelId)"
|
||||
|
@ -63,7 +62,7 @@
|
|||
|
||||
<table tal:define="fieldNames python: tool.getResultColumnsNames(contentType, refField);
|
||||
widgets python: objs[0].getAppyTypesFromNames(fieldNames);"
|
||||
class="listing nosort" width="100%" cellpadding="0" cellspacing="0">
|
||||
class="list" width="100%">
|
||||
<tal:comment replace="nothing">Headers, with filters and sort arrows</tal:comment>
|
||||
<tr>
|
||||
<tal:header repeat="widget widgets">
|
||||
|
@ -118,21 +117,21 @@
|
|||
|
||||
<tal:comment replace="nothing">Column "Actions"</tal:comment>
|
||||
<td align="right">
|
||||
<table class="no-style-table" cellpadding="0" cellspacing="0">
|
||||
<table class="noStyle">
|
||||
<tr>
|
||||
<tal:comment replace="nothing">Edit the element</tal:comment>
|
||||
<td class="noPadding">
|
||||
<td>
|
||||
<a tal:define="navInfo python:'search.%s.%s.%d.%d' % (contentType, searchName, repeat['obj'].number()+startNumber, totalNumber);"
|
||||
tal:attributes="href python: obj.getUrl(mode='edit', page='main', nav=navInfo)"
|
||||
tal:condition="python: member.has_permission('Modify portal content', obj)">
|
||||
tal:condition="python: obj.allows('Modify portal content')">
|
||||
<img title="Edit" i18n:domain="plone" i18n:attributes="title"
|
||||
tal:attributes="src string: $portal_url/skyn/edit.gif"/>
|
||||
tal:attributes="src string: $appUrl/skyn/edit.gif"/>
|
||||
</a></td>
|
||||
<tal:comment replace="nothing">Delete the element</tal:comment>
|
||||
<td class="noPadding">
|
||||
<img tal:condition="python: member.has_permission('Delete objects', obj) and obj.mayDelete()"
|
||||
<td>
|
||||
<img tal:condition="python: obj.allows('Delete objects') and obj.mayDelete()"
|
||||
title="Delete" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
|
||||
tal:attributes="src string: $portal_url/skyn/delete.png;
|
||||
tal:attributes="src string: $appUrl/skyn/delete.png;
|
||||
onClick python:'onDeleteObject(\'%s\')' % obj.UID()"/>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
Before Width: | Height: | Size: 433 B After Width: | Height: | Size: 189 B |
|
@ -1,43 +1,16 @@
|
|||
<tal:search metal:define-macro="master"
|
||||
define="appFolder context/getParentNode;
|
||||
contentType request/type_name;
|
||||
refInfo request/ref|nothing;
|
||||
tool python: here.portal_url.getPortalObject().get('portal_%s' % appFolder.id.lower());
|
||||
searchInfo python: tool.getSearchInfo(contentType, refInfo);
|
||||
cssJs python: tool.getCssAndJs(searchInfo['fields'], 'edit')">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
|
||||
lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal"
|
||||
xmlns:metal="http://xml.zope.org/namespaces/metal"
|
||||
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
|
||||
metal:use-macro="here/main_template/macros/master">
|
||||
|
||||
<tal:comment replace="nothing">Disable standard Plone green tabs</tal:comment>
|
||||
<div metal:fill-slot="top_slot">
|
||||
<metal:block metal:use-macro="here/global_defines/macros/defines" />
|
||||
<div tal:define="dummy python:request.set('disable_border', 1)" />
|
||||
</div>
|
||||
<tal:main define="tool context/getParentNode">
|
||||
<html metal:use-macro="context/skyn/template/macros/main">
|
||||
<metal:fill fill-slot="content"
|
||||
tal:define="contentType request/type_name;
|
||||
refInfo request/ref|nothing;
|
||||
searchInfo python: tool.getSearchInfo(contentType, refInfo);
|
||||
cssJs python: tool.getCssAndJs(searchInfo['fields'], 'edit')">
|
||||
|
||||
<tal:comment replace="nothing">Include type-specific CSS and JS.</tal:comment>
|
||||
<metal:js fill-slot="javascript_head_slot">
|
||||
<tal:js condition="cssJs/js" repeat="jsFile cssJs/js">
|
||||
<script type="text/javascript" charset="iso-8859-1"
|
||||
tal:condition="python:exists('portal/%s' % jsFile)"
|
||||
tal:attributes="src string:$portal_url/$jsFile">
|
||||
</script>
|
||||
</tal:js>
|
||||
</metal:js>
|
||||
<metal:css fill-slot="css_slot">
|
||||
<tal:css condition="cssJs/css" repeat="cssFile cssJs/css">
|
||||
<style type="text/css" media="all"
|
||||
tal:condition="python:exists('portal/%s' % cssFile)"
|
||||
tal:content="structure string:<!-- @import url($portal_url/$cssFile); -->">
|
||||
</style>
|
||||
</tal:css>
|
||||
</metal:css>
|
||||
|
||||
<body>
|
||||
<metal:fill fill-slot="main">
|
||||
<link tal:repeat="cssFile cssJs/css" rel="stylesheet" type="text/css"
|
||||
tal:attributes="href string:$appUrl/skyn/$cssFile"/>
|
||||
<script tal:repeat="jsFile cssJs/js" type="text/javascript"
|
||||
tal:attributes="src string:$appUrl/skyn/$jsFile"></script>
|
||||
|
||||
<tal:comment replace="nothing">Search title</tal:comment>
|
||||
<h1><span tal:replace="python: tool.translate('%s_plural' % contentType)"/> —
|
||||
|
@ -49,7 +22,7 @@
|
|||
<input type="hidden" name="type_name" tal:attributes="value contentType"/>
|
||||
<input tal:condition="refInfo" type="hidden" name="ref" tal:attributes="value refInfo"/>
|
||||
|
||||
<table class="no-style-table" cellpadding="0" cellspacing="0" width="100%">
|
||||
<table width="100%">
|
||||
<tr tal:repeat="searchRow python: tool.tabularize(searchInfo['fieldDicts'], searchInfo['nbOfColumns'])"
|
||||
valign="top">
|
||||
<td tal:repeat="widget searchRow" tal:attributes="width python:'%d%%' % (100/searchInfo['nbOfColumns'])">
|
||||
|
@ -69,7 +42,6 @@
|
|||
<input type="submit" tal:attributes="value python:tool.translate('search_button')"/>
|
||||
</p>
|
||||
</form>
|
||||
</metal:fill>
|
||||
</body>
|
||||
</metal:fill>
|
||||
</html>
|
||||
</tal:search>
|
||||
</tal:main>
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
<html metal:define-macro="main"
|
||||
tal:define="user context/portal_membership/getAuthenticatedMember;
|
||||
isAnon python: user.getUserName() == 'Anonymous User';
|
||||
app python: tool.getParentNode();
|
||||
app tool/getApp;
|
||||
appUrl app/absolute_url;
|
||||
appFolder tool/getAppFolder;
|
||||
appName appFolder/getId;
|
||||
_ python: tool.translate;
|
||||
req python: request;
|
||||
resp req/RESPONSE;
|
||||
x python: resp.setHeader('Content-Type', 'text/html;;charset=utf-8');
|
||||
x python: resp.setHeader('Expires', 'Thu, 11 Dec 1975 12:05:00 GMT+2');
|
||||
x python: resp.setHeader('Content-Language', request.get('language', 'en'))">
|
||||
x python: resp.setHeader('Content-Language', req.get('language', 'en'))">
|
||||
|
||||
<head>
|
||||
<title tal:content="tool/getAppName"></title>
|
||||
|
@ -17,14 +19,14 @@
|
|||
</head>
|
||||
|
||||
<body>
|
||||
<table class="main" align="center">
|
||||
<table class="main" align="center" cellpadding="0">
|
||||
<tal:comment replace="nothing">Top banner</tal:comment>
|
||||
<tr class="top" metal:define-slot="top">
|
||||
<td>
|
||||
<table width="100%">
|
||||
<tr valign="top">
|
||||
<tal:comment replace="nothing">Logo</tal:comment>
|
||||
<td><a tal:attributes="href appUrl"><img src="skyn/logo.jpg"/></a></td>
|
||||
<td><a tal:attributes="href appUrl"><img tal:attributes="src string: $appUrl/skyn/logo.jpg"/></a></td>
|
||||
<tal:comment replace="nothing">Language selector (links or listbox)</tal:comment>
|
||||
<td align="right"
|
||||
tal:define="appLangs app/portal_languages/listSupportedLanguages;
|
||||
|
@ -55,6 +57,31 @@
|
|||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tal:comment replace="nothing">The message strip</tal:comment>
|
||||
<tr>
|
||||
<td>
|
||||
<div style="position: relative" align="right">
|
||||
<metal:msg use-macro="app/skyn/page/macros/message"/>
|
||||
</div>
|
||||
<tal:comment replace="nothing">Grey background shown when popups are shown</tal:comment>
|
||||
<div id="grey" class="grey"></div>
|
||||
|
||||
<tal:comment replace="nothing">Popup for confirming an action</tal:comment>
|
||||
<div id="confirmActionPopup" class="popup">
|
||||
<form id="confirmActionForm" method="post">
|
||||
<div align="center">
|
||||
<p id="appyConfirmText"></p>
|
||||
<input type="hidden" name="actionType"/>
|
||||
<input type="hidden" name="action"/>
|
||||
<input type="button" onClick="doConfirm()"
|
||||
tal:attributes="value python:_('yes')"/>
|
||||
<input type="button" value="No" onClick="closePopup('confirmActionPopup')"
|
||||
tal:attributes="value python:_('no')"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tal:comment replace="nothing">The user data strip</tal:comment>
|
||||
<tr>
|
||||
<td>
|
||||
|
@ -88,12 +115,17 @@
|
|||
<td>
|
||||
<!-- Go home -->
|
||||
<a tal:attributes="href appUrl; title python: _('home')">
|
||||
<img src="skyn/home.gif"/>
|
||||
<img tal:attributes="src string: $appUrl/skyn/home.gif"/>
|
||||
</a>
|
||||
<!-- Config -->
|
||||
<img style="cursor:pointer" tal:condition="python: user.has_role('Manager')"
|
||||
tal:attributes="onClick python: 'href: window.location=\'%s\'' % tool.getUrl(page='main', nav='');
|
||||
title python: _('%sTool' % appName);
|
||||
src string:$appUrl/skyn/appyConfig.gif"/>
|
||||
<!-- Logout -->
|
||||
<a tal:attributes="href python: tool.absolute_url() + '/performLogout';
|
||||
title python: _('logout')">
|
||||
<img src="skyn/logout.gif"/>
|
||||
<img tal:attributes="src string: $appUrl/skyn/logout.gif"/>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -103,20 +135,16 @@
|
|||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tal:comment replace="nothing">The message strip</tal:comment>
|
||||
<tr tal:define="msg request/portal_status_message | nothing">
|
||||
<td>
|
||||
<div style="position: relative" align="right">
|
||||
<div tal:condition="msg" class="message" tal:content="structure msg"></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="content" width="100%">
|
||||
<tr>
|
||||
<td><span metal:define-slot="content"></span>
|
||||
<table width="99%">
|
||||
<tr valign="top">
|
||||
<tal:comment replace="nothing">Portlet</tal:comment>
|
||||
<td tal:condition="python: tool.showPortlet(context)" class="portlet">
|
||||
<metal:portlet use-macro="app/skyn/portlet/macros/portlet"/>
|
||||
</td>
|
||||
<tal:comment replace="nothing">Page content</tal:comment>
|
||||
<td class="content"><span metal:define-slot="content"></span></td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
|
|
|
@ -1,34 +1,17 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
|
||||
lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal"
|
||||
xmlns:metal="http://xml.zope.org/namespaces/metal"
|
||||
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
|
||||
metal:use-macro="here/main_template/macros/master">
|
||||
|
||||
<head><title></title></head>
|
||||
|
||||
<tal:comment replace="nothing">Disable standard Plone green tabs</tal:comment>
|
||||
<div metal:fill-slot="top_slot">
|
||||
<metal:block metal:use-macro="here/global_defines/macros/defines" />
|
||||
<div tal:define="dummy python:request.set('disable_border', 1)" />
|
||||
</div>
|
||||
|
||||
<tal:comment replace="nothing">Fill main slot of Plone main_template</tal:comment>
|
||||
<body>
|
||||
<metal:fill fill-slot="main"
|
||||
tal:define="contextObj python:context.getParentNode();
|
||||
portal_type python:here.getPortalTypeName().lower().replace(' ', '_');
|
||||
errors python:request.get('errors', {});
|
||||
layoutType python:'view';
|
||||
layout python: contextObj.getPageLayout(layoutType);
|
||||
tool contextObj/getTool;
|
||||
appFolder tool/getAppFolder;
|
||||
appName appFolder/getId;
|
||||
phaseInfo python: contextObj.getAppyPhases(currentOnly=True, layoutType='view');
|
||||
page request/page|python:'main';
|
||||
phase phaseInfo/name;">
|
||||
<metal:prologue use-macro="here/skyn/page/macros/prologue"/>
|
||||
<metal:show use-macro="here/skyn/page/macros/show"/>
|
||||
<metal:footer use-macro="here/skyn/page/macros/footer"/>
|
||||
</metal:fill>
|
||||
</body>
|
||||
<tal:main define="tool context/getTool">
|
||||
<html metal:use-macro="context/skyn/template/macros/main">
|
||||
<metal:fill fill-slot="content"
|
||||
tal:define="contextObj python:context.getParentNode();
|
||||
portal_type python:here.getPortalTypeName().lower().replace(' ', '_');
|
||||
errors python:req.get('errors', {});
|
||||
layoutType python:'view';
|
||||
layout python: contextObj.getPageLayout(layoutType);
|
||||
phaseInfo python: contextObj.getAppyPhases(currentOnly=True, layoutType='view');
|
||||
page req/page|python:'main';
|
||||
phase phaseInfo/name;">
|
||||
<metal:prologue use-macro="here/skyn/page/macros/prologue"/>
|
||||
<metal:show use-macro="here/skyn/page/macros/show"/>
|
||||
<metal:footer use-macro="here/skyn/page/macros/footer"/>
|
||||
</metal:fill>
|
||||
</html>
|
||||
</tal:main>
|
||||
|
|
|
@ -20,17 +20,17 @@
|
|||
widget python: contextObj.getAppyType(name, asDict=True);
|
||||
value python: contextObj.getFieldValue(name);
|
||||
sync python:True">
|
||||
<metal:call use-macro="portal/skyn/widgets/computed/macros/view"/>
|
||||
<metal:call use-macro="app/skyn/widgets/computed/macros/view"/>
|
||||
</metal:view>
|
||||
|
||||
<tal:comment replace="nothing">Edit macro for a Computed.</tal:comment>
|
||||
<metal:edit define-macro="edit">
|
||||
<metal:call use-macro="portal/skyn/widgets/computed/macros/view"/>
|
||||
<metal:call use-macro="app/skyn/widgets/computed/macros/view"/>
|
||||
</metal:edit>
|
||||
|
||||
<tal:comment replace="nothing">Cell macro for a Computed.</tal:comment>
|
||||
<metal:cell define-macro="cell">
|
||||
<metal:call use-macro="portal/skyn/widgets/computed/macros/view"/>
|
||||
<metal:call use-macro="app/skyn/widgets/computed/macros/view"/>
|
||||
</metal:cell>
|
||||
|
||||
<tal:comment replace="nothing">Search macro for a Computed.</tal:comment>
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
</select>
|
||||
<tal:comment replace="nothing">The icon for displaying the calendar (=date chooser)</tal:comment>
|
||||
<a tal:condition="widget/calendar"
|
||||
tal:attributes="onclick python: 'return showJsCalendar(\'%s_month\', \'%s\', \'%s_year\', \'%s_month\', \'%s_day\', null, null, %d, %d)' % (name, dummyName, name, name, name, years[0], years[-1])"><img tal:attributes="src string: $portal_url/popup_calendar.gif"/></a>
|
||||
tal:attributes="onclick python: 'return showJsCalendar(\'%s_month\', \'%s\', \'%s_year\', \'%s_month\', \'%s_day\', null, null, %d, %d)' % (name, dummyName, name, name, name, years[0], years[-1])"><img tal:attributes="src string: $appUrl/calendar.gif"/></a>
|
||||
|
||||
<tal:hour condition="python: widget['format'] == 0">
|
||||
<select tal:define="hours python:range(0,24);"
|
||||
|
@ -111,7 +111,7 @@
|
|||
<tal:comment replace="nothing">The icon for displaying the calendar (=date chooser)</tal:comment>
|
||||
<a tal:condition="widget/calendar"
|
||||
tal:attributes="onclick python: 'return showJsCalendar(\'%s\', \'%s\', \'%s\', \'%s\', \'%s\', null, null, %d, %d)' % (monthFromName, dummyFromName, yearFromName, monthFromName, dayFromName, years[0], years[-1])">
|
||||
<img tal:attributes="src string: $portal_url/popup_calendar.gif"/></a>
|
||||
<img tal:attributes="src string: $appUrl/calendar.gif"/></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tal:comment replace="nothing">To</tal:comment>
|
||||
|
@ -142,7 +142,7 @@
|
|||
</select>
|
||||
<a tal:condition="widget/calendar"
|
||||
tal:attributes="onclick python: 'return showJsCalendar(\'%s\', \'%s\', \'%s\', \'%s\', \'%s\', null, null, %d, %d)' % (monthToName, dummyToName, yearToName, monthToName, dayToName, years[0], years[-1])">
|
||||
<img tal:attributes="src string: $portal_url/popup_calendar.gif"/></a>
|
||||
<img tal:attributes="src string: $appUrl/calendar.gif"/></a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
imageSrc string:${contextObj/absolute_url}/download?name=$name">
|
||||
<tal:file condition="python: not empty and not widget['isImage']">
|
||||
<img tal:define="icon value/getBestIcon"
|
||||
tal:condition="icon" tal:attributes="src string: $portal_url/$icon"/>
|
||||
tal:condition="icon" tal:attributes="src string: $appUrl/$icon"/>
|
||||
<a tal:attributes="href imageSrc"
|
||||
tal:content="value/filename">
|
||||
</a> -
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
tal:content="python: tool.translate(doLabel)"></label>
|
||||
</tal:askAction>
|
||||
<img tal:repeat="podFormat python: tool.getPodInfo(contextObj, name)[1]"
|
||||
tal:attributes="src string: $portal_url/skyn/${podFormat}.png;
|
||||
tal:attributes="src string: $appUrl/skyn/${podFormat}.png;
|
||||
onClick python: 'generatePodDocument(\'%s\',\'%s\',\'%s\',\'%s\')' % (contextObj.UID(), name, podFormat, tool.getQueryInfo());
|
||||
title podFormat/capitalize"
|
||||
style="cursor:pointer"/>
|
||||
|
|
|
@ -19,39 +19,39 @@
|
|||
<metal:objectActions define-macro="objectActions">
|
||||
<tal:comment replace="nothing">Displays icons for triggering actions on a given
|
||||
referenced object (edit, delete, etc).</tal:comment>
|
||||
<table class="no-style-table" cellpadding="0" cellspacing="0">
|
||||
<table class="noStyle">
|
||||
<tr>
|
||||
<tal:comment replace="nothing">Arrows for moving objects up or down</tal:comment>
|
||||
<td class="noPadding" tal:condition="python: not appyType['isBack'] and (len(objs)>1) and member.has_permission('Modify portal content', contextObj)">
|
||||
<td tal:condition="python: not appyType['isBack'] and (len(objs)>1) and context.allows('Modify portal content')">
|
||||
<tal:moveRef define="objectIndex python: contextObj.getAppyRefIndex(fieldName, obj);
|
||||
ajaxBaseCall python: navBaseCall.replace('**v**', '\'%s\',\'ChangeRefOrder\', {\'refObjectUid\':\'%s\', \'move\':\'**v**\'}' % (startNumber, obj.UID()))">
|
||||
<tal:comment replace="nothing">Move up</tal:comment>
|
||||
<img tal:condition="python: objectIndex > 0"
|
||||
tal:attributes="src string: $portal_url/skyn/arrowUp.png;
|
||||
tal:attributes="src string: $appUrl/skyn/arrowUp.png;
|
||||
title python: tool.translate('move_up');
|
||||
onClick python: ajaxBaseCall.replace('**v**', 'up')"
|
||||
style="cursor:pointer"/>
|
||||
<tal:comment replace="nothing">Move down</tal:comment>
|
||||
<img tal:condition="python: objectIndex < (totalNumber-1)"
|
||||
tal:attributes="src string: $portal_url/skyn/arrowDown.png;
|
||||
tal:attributes="src string: $appUrl/skyn/arrowDown.png;
|
||||
title python: tool.translate('move_down');
|
||||
onClick python: ajaxBaseCall.replace('**v**', 'down')"
|
||||
style="cursor:pointer"/>
|
||||
</tal:moveRef>
|
||||
</td>
|
||||
<tal:comment replace="nothing">Edit the element</tal:comment>
|
||||
<td class="noPadding" tal:condition="python: member.has_permission('Modify portal content', obj) and not appyType['noForm']">
|
||||
<td tal:condition="python: obj.allows('Modify portal content') and not appyType['noForm']">
|
||||
<a tal:define="navInfo python:'ref.%s.%s:%s.%d.%d' % (contextObj.UID(), fieldName, appyType['pageName'], repeat['obj'].number()+startNumber, totalNumber);"
|
||||
tal:attributes="href python: obj.getUrl(mode='edit', page='main', nav=navInfo)">
|
||||
<img title="label_edit" i18n:domain="plone" i18n:attributes="title"
|
||||
tal:attributes="src string: $portal_url/skyn/edit.gif"/>
|
||||
tal:attributes="src string: $appUrl/skyn/edit.gif"/>
|
||||
</a>
|
||||
</td>
|
||||
<tal:comment replace="nothing">Delete the element</tal:comment>
|
||||
<td class="noPadding">
|
||||
<img tal:condition="python: not appyType['isBack'] and member.has_permission('Delete objects', obj) and obj.mayDelete()"
|
||||
<td>
|
||||
<img tal:condition="python: not appyType['isBack'] and obj.allows('Delete objects') and obj.mayDelete()"
|
||||
title="Delete" i18n:domain="plone" i18n:attributes="title" style="cursor:pointer"
|
||||
tal:attributes="src string: $portal_url/skyn/delete.png;
|
||||
tal:attributes="src string: $appUrl/skyn/delete.png;
|
||||
onClick python:'onDeleteObject(\'%s\')' % obj.UID()"/>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -68,7 +68,7 @@
|
|||
formCall python: test(appyType['addConfirm'], 'askConfirm(\'script\', "%s", "%s")' % (formCall, addConfirmMsg), formCall);
|
||||
noFormCall python: navBaseCall.replace('**v**', '%d, \'CreateWithoutForm\'' % startNumber);
|
||||
noFormCall python: test(appyType['addConfirm'], 'askConfirm(\'script\', "%s", "%s")' % (noFormCall, addConfirmMsg), noFormCall)"
|
||||
tal:attributes="src string:$portal_url/skyn/plus.png;
|
||||
tal:attributes="src string:$appUrl/skyn/plus.png;
|
||||
title python: tool.translate('add_ref');
|
||||
onClick python: test(appyType['noForm'], noFormCall, formCall)"/>
|
||||
</metal:plusIcon>
|
||||
|
@ -81,10 +81,10 @@
|
|||
tal:define="ajaxBaseCall python: navBaseCall.replace('**v**', '\'%s\',\'SortReference\', {\'sortKey\':\'%s\', \'reverse\':\'**v**\'}' % (startNumber, widget['name']))"
|
||||
tal:condition="python: canWrite and tool.isSortable(widget['name'], objs[0].meta_type, 'ref')">
|
||||
<img style="cursor:pointer"
|
||||
tal:attributes="src string:$portal_url/skyn/sortAsc.png;
|
||||
tal:attributes="src string:$appUrl/skyn/sortAsc.png;
|
||||
onClick python: ajaxBaseCall.replace('**v**', 'False')"/>
|
||||
<img style="cursor:pointer"
|
||||
tal:attributes="src string:$portal_url/skyn/sortDesc.png;
|
||||
tal:attributes="src string:$appUrl/skyn/sortDesc.png;
|
||||
onClick python: ajaxBaseCall.replace('**v**', 'True')"/>
|
||||
</metal:sortIcons>
|
||||
|
||||
|
@ -115,16 +115,16 @@
|
|||
folder python: contextObj.isPrincipiaFolderish and contextObj or contextObj.getParentNode();
|
||||
linkedPortalType python: tool.getPortalType(appyType['klass']);
|
||||
addPermission python: '%s: Add %s' % (tool.getAppName(), linkedPortalType);
|
||||
canWrite python: not appyType['isBack'] and member.has_permission(appyType['writePermission'], contextObj);
|
||||
canWrite python: not appyType['isBack'] and contextObj.allows(appyType['writePermission']);
|
||||
multiplicity appyType/multiplicity;
|
||||
maxReached python:(multiplicity[1] != None) and (len(objs) >= multiplicity[1]);
|
||||
showPlusIcon python:not appyType['isBack'] and appyType['add'] and not maxReached and member.has_permission(addPermission, folder) and canWrite;
|
||||
showPlusIcon python:not appyType['isBack'] and appyType['add'] and not maxReached and user.has_permission(addPermission, folder) and canWrite;
|
||||
atMostOneRef python: (multiplicity[1] == 1) and (len(objs)<=1);
|
||||
label python: contextObj.translate('label', field=appyType);
|
||||
addConfirmMsg python: appyType['addConfirm'] and tool.translate('%s_addConfirm' % appyType['labelId']) or '';
|
||||
navBaseCall python: 'askRefField(\'%s\',\'%s\',\'%s\',\'%s\',**v**)' % (ajaxHookId, contextObj.absolute_url(), fieldName, innerRef)">
|
||||
|
||||
<tal:comment replace="nothing">This macro displays the Reference widget on a "consult" page.
|
||||
<tal:comment replace="nothing">This macro displays the Reference widget on a "view" page.
|
||||
|
||||
The definition of "atMostOneRef" above may sound strange: we shouldn't check the actual number
|
||||
of referenced objects. But for back references people often forget to specify multiplicities.
|
||||
|
@ -133,20 +133,20 @@
|
|||
<tal:atMostOneReference condition="atMostOneRef">
|
||||
<tal:comment replace="nothing">Display a simplified widget if maximum number of
|
||||
referenced objects is 1.</tal:comment>
|
||||
<table class="no-style-table" cellpadding="0" cellspacing="0"><tr valign="top">
|
||||
<table><tr valign="top">
|
||||
<td><span class="appyLabel" tal:condition="python: not innerRef and not appyType['link']"
|
||||
tal:content="structure label"></span></td>
|
||||
|
||||
<tal:comment replace="nothing">If there is no object...</tal:comment>
|
||||
<tal:noObject condition="not:objs">
|
||||
<td tal:content="python: tool.translate('no_ref')"></td>
|
||||
<td><metal:plusIcon use-macro="portal/skyn/widgets/ref/macros/plusIcon"/></td>
|
||||
<td><metal:plusIcon use-macro="app/skyn/widgets/ref/macros/plusIcon"/></td>
|
||||
</tal:noObject>
|
||||
|
||||
<tal:comment replace="nothing">If there is an object...</tal:comment>
|
||||
<tal:objectIsPresent condition="objs">
|
||||
<tal:obj repeat="obj objs">
|
||||
<td tal:define="includeShownInfo python:True"><metal:showObjectTitle use-macro="portal/skyn/widgets/ref/macros/objectTitle" /></td>
|
||||
<td tal:define="includeShownInfo python:True"><metal:showObjectTitle use-macro="app/skyn/widgets/ref/macros/objectTitle" /></td>
|
||||
</tal:obj>
|
||||
</tal:objectIsPresent>
|
||||
</tr></table>
|
||||
|
@ -158,7 +158,7 @@
|
|||
<legend tal:condition="python: not innerRef or showPlusIcon">
|
||||
<span tal:condition="not: innerRef" tal:content="label"/>
|
||||
(<span tal:replace="totalNumber"/>)
|
||||
<metal:plusIcon use-macro="portal/skyn/widgets/ref/macros/plusIcon"/>
|
||||
<metal:plusIcon use-macro="app/skyn/widgets/ref/macros/plusIcon"/>
|
||||
<tal:comment replace="nothing">The search icon if field is queryable</tal:comment>
|
||||
<a tal:condition="appyType/queryable"
|
||||
tal:attributes="href python: '%s/skyn/search?type_name=%s&ref=%s:%s' % (tool.getAppFolder().absolute_url(), linkedPortalType, contextObj.meta_type, appyType['name'])">
|
||||
|
@ -175,28 +175,27 @@
|
|||
<tal:comment replace="nothing">No object is present</tal:comment>
|
||||
<p tal:condition="not:objs" tal:content="python: tool.translate('no_ref')"></p>
|
||||
|
||||
<table width="100%" cellspacing="0" cellpadding="0" tal:condition="objs"
|
||||
<table width="100%" tal:condition="python: objs"
|
||||
tal:attributes="class python:test(innerRef, 'innerAppyTable', '')">
|
||||
<tr valign="bottom"><td>
|
||||
|
||||
<tal:comment replace="nothing">Show forward or backward reference(s)</tal:comment>
|
||||
<table tal:attributes="class python:test(innerRef, '', 'listing nosort');
|
||||
width python:test(innerRef, '100%', appyType['layouts']['view']['width']);"
|
||||
align="right" tal:condition="python: objs" cellpadding="0" cellspacing="0">
|
||||
<table tal:attributes="class python:test(innerRef, '', 'list');
|
||||
width python:test(innerRef, '100%', appyType['layouts']['view']['width']);">
|
||||
<tal:widgets define="widgets python: objs[0].getAppyTypesFromNames(appyType['shownInfo'])">
|
||||
<tr tal:condition="appyType/showHeaders">
|
||||
<th tal:repeat="widget widgets">
|
||||
<span tal:content="python: tool.translate(widget['labelId'])"></span>
|
||||
<metal:sortIcons use-macro="portal/skyn/widgets/ref/macros/sortIcons" />
|
||||
<metal:sortIcons use-macro="app/skyn/widgets/ref/macros/sortIcons" />
|
||||
</th>
|
||||
<th tal:content="python: tool.translate('ref_actions')"></th>
|
||||
</tr>
|
||||
<tal:row repeat="obj objs">
|
||||
<tr valign="top" tal:define="odd repeat/obj/odd"
|
||||
<tr valign="middle" tal:define="odd repeat/obj/odd"
|
||||
tal:attributes="class python:test(odd, 'even', 'odd')">
|
||||
<td tal:repeat="widget widgets">
|
||||
<tal:title condition="python: widget['name'] == 'title'">
|
||||
<metal:showObjectTitle use-macro="portal/skyn/widgets/ref/macros/objectTitle"/>
|
||||
<metal:showObjectTitle use-macro="app/skyn/widgets/ref/macros/objectTitle"/>
|
||||
</tal:title>
|
||||
<tal:state condition="python: widget['name'] == 'state'"
|
||||
content="python: tool.translate(obj.getWorkflowLabel())">
|
||||
|
@ -205,13 +204,13 @@
|
|||
<tal:field define="contextObj python:obj;
|
||||
layoutType python: 'cell';
|
||||
innerRef python:True">
|
||||
<metal:field use-macro="portal/skyn/widgets/show/macros/field" />
|
||||
<metal:field use-macro="app/skyn/widgets/show/macros/field" />
|
||||
</tal:field>
|
||||
</tal:other>
|
||||
</td>
|
||||
<tal:comment replace="nothing">Actions</tal:comment>
|
||||
<td align="right">
|
||||
<metal:showObjectActions use-macro="portal/skyn/widgets/ref/macros/objectActions" />
|
||||
<metal:showObjectActions use-macro="app/skyn/widgets/ref/macros/objectActions" />
|
||||
</td>
|
||||
</tr>
|
||||
</tal:row>
|
||||
|
@ -254,7 +253,7 @@
|
|||
|
||||
<tal:comment replace="nothing">Cell macro for a Ref.</tal:comment>
|
||||
<metal:cell define-macro="cell">
|
||||
<metal:call use-macro="portal/skyn/widgets/ref/macros/view"/>
|
||||
<metal:call use-macro="app/skyn/widgets/ref/macros/view"/>
|
||||
</metal:cell>
|
||||
|
||||
<tal:comment replace="nothing">Search macro for a Ref.</tal:comment>
|
||||
|
|
|
@ -8,10 +8,10 @@
|
|||
Options:
|
||||
contextMacro The base folder containing the macros to call for
|
||||
rendering the elements within the layout.
|
||||
Defaults to portal.skyn
|
||||
Defaults to app.skyn
|
||||
</tal:comment>
|
||||
<metal:show define-macro="layout"
|
||||
tal:define="contextMacro contextMacro| python: portal.skyn">
|
||||
tal:define="contextMacro contextMacro| python: app.skyn">
|
||||
<table tal:attributes="cellpadding layout/cellpadding;
|
||||
cellspacing layout/cellspacing;
|
||||
width layout/width;
|
||||
|
@ -28,7 +28,7 @@
|
|||
<tr tal:repeat="row layout/rows" tal:attributes="valign row/valign">
|
||||
<td tal:repeat="cell row/cells"
|
||||
tal:attributes="align cell/align; colspan cell/colspan;
|
||||
style python: test(repeat['cell'].end, '', 'padding-right: 0.4em')"><tal:content repeat="elem cell/content"><tal:field condition="python: elem == '?'"><metal:call use-macro="python: contextMacro.get(widget['type'].lower()).macros.get(layoutType)"/></tal:field><tal:other condition="python: elem != '?'"><metal:call use-macro="python: contextMacro.get(elem[0]).macros.get(elem[1])"/></tal:other><img tal:condition="not: repeat/elem/end" tal:attributes="src string: $portal_url/skyn/space.gif"/></tal:content>
|
||||
style python: test(repeat['cell'].end, '', 'padding-right: 0.4em')"><tal:content repeat="elem cell/content"><tal:field condition="python: elem == '?'"><metal:call use-macro="python: contextMacro.get(widget['type'].lower()).macros.get(layoutType)"/></tal:field><tal:other condition="python: elem != '?'"><metal:call use-macro="python: contextMacro.get(elem[0]).macros.get(elem[1])"/></tal:other><img tal:condition="not: repeat/elem/end" tal:attributes="src string: $appUrl/skyn/space.gif"/></tal:content>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
@ -42,7 +42,7 @@
|
|||
widget The widget to render
|
||||
</tal:comment>
|
||||
<metal:field define-macro="field"
|
||||
tal:define="contextMacro python: portal.skyn.widgets;
|
||||
tal:define="contextMacro python: app.skyn.widgets;
|
||||
layout python: widget['layouts'][layoutType];
|
||||
name widget/name;
|
||||
sync python: widget['sync'][layoutType];
|
||||
|
@ -70,15 +70,15 @@
|
|||
<legend tal:condition="widget/hasLabel">
|
||||
<i tal:content="structure python: contextObj.translate(widget['labelId'])"></i>
|
||||
<tal:help condition="widget/hasHelp">
|
||||
<metal:call use-macro="portal/skyn/widgets/show/macros/help"/>
|
||||
<metal:call use-macro="app/skyn/widgets/show/macros/help"/>
|
||||
</tal:help>
|
||||
</legend>
|
||||
<div tal:condition="widget/hasDescr" class="discreet"
|
||||
tal:content="structure python: contextObj.translate(widget['descrId'])"></div>
|
||||
<metal:content use-macro="portal/skyn/widgets/show/macros/groupContent"/>
|
||||
<metal:content use-macro="app/skyn/widgets/show/macros/groupContent"/>
|
||||
</fieldset>
|
||||
<tal:asSection condition="python: widget['style'] not in ('fieldset', 'tabs')">
|
||||
<metal:content use-macro="portal/skyn/widgets/show/macros/groupContent"/>
|
||||
<metal:content use-macro="app/skyn/widgets/show/macros/groupContent"/>
|
||||
</tal:asSection>
|
||||
<tal:asTabs condition="python: widget['style'] == 'tabs'">
|
||||
<table cellpadding="0" cellspacing="0"
|
||||
|
@ -90,15 +90,15 @@
|
|||
<tr valign="middle">
|
||||
<tal:tab repeat="widgetRow widget/widgets">
|
||||
<tal:id define="tabId python:'tab_%s_%d_%d' % (widget['name'], repeat['widgetRow'].number(), len(widget['widgets']))">
|
||||
<td><img tal:attributes="src string: $portal_url/skyn/tabLeft.png;
|
||||
<td><img tal:attributes="src string: $appUrl/skyn/tabLeft.png;
|
||||
id python: '%s_left' % tabId"/><td>
|
||||
<td tal:attributes="style python:'background-image: url(%s/skyn/tabBg.png)' % portal_url;
|
||||
<td tal:attributes="style python:'background-image: url(%s/skyn/tabBg.png)' % appUrl;
|
||||
id tabId">
|
||||
<a style="cursor:pointer"
|
||||
tal:content="python: tool.translate('%s_col%d' % (widget['labelId'], repeat['widgetRow'].number()))"
|
||||
tal:attributes="onClick python: 'showTab(\'%s_%d_%d\')' % (widget['name'], repeat['widgetRow'].number(), len(widget['widgets']))"></a>
|
||||
</td>
|
||||
<td><img tal:attributes="src string: $portal_url/skyn/tabRight.png;
|
||||
<td><img tal:attributes="src string: $appUrl/skyn/tabRight.png;
|
||||
id python: '%s_right' % tabId"/><td>
|
||||
</tal:id>
|
||||
</tal:tab>
|
||||
|
@ -111,10 +111,10 @@
|
|||
style python: test(repeat['widgetRow'].number()==1, 'display:table-row', 'display:none')">
|
||||
<td tal:define="widget python: widgetRow[0]">
|
||||
<tal:group condition="python: widget['type'] == 'group'">
|
||||
<metal:call use-macro="portal/skyn/widgets/show/macros/group"/>
|
||||
<metal:call use-macro="app/skyn/widgets/show/macros/group"/>
|
||||
</tal:group>
|
||||
<tal:field condition="python: widget['type'] != 'group'">
|
||||
<metal:call use-macro="portal/skyn/widgets/show/macros/field"/>
|
||||
<metal:call use-macro="app/skyn/widgets/show/macros/field"/>
|
||||
</tal:field>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -141,7 +141,7 @@
|
|||
class widget/style" align="left">
|
||||
<span tal:replace="structure python: contextObj.translate(widget['labelId'])"/>
|
||||
<tal:help condition="widget/hasHelp">
|
||||
<metal:call use-macro="portal/skyn/widgets/show/macros/help"/>
|
||||
<metal:call use-macro="app/skyn/widgets/show/macros/help"/>
|
||||
</tal:help>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -164,10 +164,10 @@
|
|||
style python: test(repeat['widget'].number() != len(widgetRow), 'padding-right: %s'%cellgap, '')">
|
||||
<tal:showWidget condition="widget">
|
||||
<tal:group condition="python: widget['type'] == 'group'">
|
||||
<metal:call use-macro="portal/skyn/widgets/show/macros/group"/>
|
||||
<metal:call use-macro="app/skyn/widgets/show/macros/group"/>
|
||||
</tal:group>
|
||||
<tal:field condition="python: widget['type'] != 'group'">
|
||||
<metal:call use-macro="portal/skyn/widgets/show/macros/field"/>
|
||||
<metal:call use-macro="app/skyn/widgets/show/macros/field"/>
|
||||
</tal:field>
|
||||
</tal:showWidget>
|
||||
</td>
|
||||
|
@ -182,10 +182,10 @@
|
|||
</tal:description>
|
||||
|
||||
<tal:comment replace="nothing">Displays a field help.</tal:comment>
|
||||
<tal:help metal:define-macro="help"><acronym tal:attributes="title python: contextObj.translate('help', field=widget)"><img tal:attributes="src string: $portal_url/skyn/help.png"/></acronym></tal:help>
|
||||
<tal:help metal:define-macro="help"><acronym tal:attributes="title python: contextObj.translate('help', field=widget)"><img tal:attributes="src string: $appUrl/skyn/help.png"/></acronym></tal:help>
|
||||
|
||||
<tal:comment replace="nothing">Displays validation-error-related info about a field.</tal:comment>
|
||||
<tal:validation metal:define-macro="validation"><acronym tal:condition="inError" tal:attributes="title python: errors[name]"><img tal:attributes="src string: $portal_url/skyn/warning.png"/></acronym><img tal:condition="not: inError" tal:attributes="src string: $portal_url/skyn/warning_no.gif"/></tal:validation>
|
||||
<tal:validation metal:define-macro="validation"><acronym tal:condition="inError" tal:attributes="title python: errors[name]"><img tal:attributes="src string: $appUrl/skyn/warning.png"/></acronym><img tal:condition="not: inError" tal:attributes="src string: $appUrl/skyn/warning_no.gif"/></tal:validation>
|
||||
|
||||
<tal:comment replace="nothing">Displays the fact that a field is required.</tal:comment>
|
||||
<tal:required metal:define-macro="required"><img tal:attributes="src string: $portal_url/skyn/required.gif"/></tal:required>
|
||||
<tal:required metal:define-macro="required"><img tal:attributes="src string: $appUrl/skyn/required.gif"/></tal:required>
|
||||
|
|
|
@ -74,7 +74,7 @@
|
|||
content="python: ', '.join(value)">
|
||||
</tal:multiple>
|
||||
<tal:notMultiple condition="not: multipleValues">
|
||||
<metal:call use-macro="portal/skyn/widgets/string/macros/view"/>
|
||||
<metal:call use-macro="app/skyn/widgets/string/macros/view"/>
|
||||
</tal:notMultiple>
|
||||
</metal:cell>
|
||||
|
||||
|
|