Commit f0b358f4 authored by Roque's avatar Roque

erp5_web_project_ui: new front page gadget (WIP)

parent 84bd681e
......@@ -111,12 +111,14 @@ CACHE:\n
\n
gadget_erp5_page_project_controller.html\n
gadget_erp5_page_project_controller.js\n
gadget_project_info.html\n
gadget_project_info.js\n
gadget_erp5_page_project_redirector.html\n
gadget_erp5_page_project_redirector.js\n
gadget_erp5_project_panel.html\n
gadget_erp5_project_panel.js\n
gadget_front_page_info.html\n
gadget_front_page_info.js\n
gadget_project_info.html\n
gadget_project_info.js\n
\n
favicon.ico\n
font-awesome/font-awesome-webfont.eot\n
......@@ -405,7 +407,7 @@ NETWORK:\n
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>979.50747.65222.58094</string> </value>
<value> <string>981.52234.40735.41557</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -423,7 +425,7 @@ NETWORK:\n
</tuple>
<state>
<tuple>
<float>1577216049.89</float>
<float>1581523847.97</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -62,6 +62,7 @@
<key> <string>bottom</string> </key>
<value>
<list>
<string>my_front_page_gadget_field</string>
<string>listbox</string>
</list>
</value>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="GadgetField" module="Products.ERP5Form.GadgetField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>my_front_page_gadget_field</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
<item>
<key> <string>no_validator</string> </key>
<value> <string>Does not support this operation.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>data_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>gadget_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>js_sandbox</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>renderjs_extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>validator_field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>validator_form_id</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>data_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>gadget_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>js_sandbox</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>renderjs_extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>validator_field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>validator_form_id</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>data_url</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>gadget_url</string> </key>
<value> <string>gadget_front_page_info.html</string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>js_sandbox</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>renderjs_extra</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>my_info_gadget_field</string> </value>
</item>
<item>
<key> <string>validator_field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>validator_form_id</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Project front page gadget</title>
<script src="rsvp.js"></script>
<script src="renderjs.js"></script>
<script src="gadget_front_page_info.js"></script>
<link rel="stylesheet" type="text/css" href="gadget_project_info.css">
</head>
<body>
<div>
<p>
</p>
</div>
</body>
</html>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>gadget_front_page_info.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/*jslint nomen: true, indent: 2 */
/*global window, rJS, RSVP, document, ensureArray, DOMParser, XMLSerializer, SimpleQuery, ComplexQuery, Query*/
(function (window, rJS, RSVP, document, ensureArray, DOMParser, XMLSerializer, SimpleQuery, ComplexQuery, Query) {
"use strict";
function getProjectDict(gadget) {
var query, i,
milestone_query,
non_milestone_query,
aux_complex_query,
aux_query_list = [],
query_list = [],
portal_type_list = ["Task", "Bug", "Task Report", "Benchmark Result"],
valid_state_list = ["planned", "ordered", "confirmed", "started", "stopped", "delivered", "ready", "failed", "public_stopped"];
//validated project milestones
aux_query_list.push(new SimpleQuery({
key: "parent__validation_state",
operator: "=",
type: "simple",
value: "validated"
}));
aux_query_list.push(new SimpleQuery({
key: "portal_type",
operator: "=",
type: "simple",
value: "Project Milestone"
}));
milestone_query = new ComplexQuery({
operator: "AND",
query_list: aux_query_list,
type: "complex"
});
//validated project tasks, bugs, etc
aux_query_list = [];
query_list.push(new SimpleQuery({
key: "source_project__validation_state",
operator: "=",
type: "simple",
value: "validated"
}));
//portal types
for (i = 0; i < portal_type_list.length; i += 1) {
aux_query_list.push(new SimpleQuery({
key: "portal_type",
operator: "=",
type: "simple",
value: portal_type_list[i]
}));
}
aux_complex_query = new ComplexQuery({
operator: "OR",
query_list: aux_query_list,
type: "complex"
});
query_list.push(aux_complex_query);
//states
aux_query_list = [];
//for tasks, bugs, reports, tests
for (i = 0; i < valid_state_list.length; i += 1) {
aux_query_list.push(new SimpleQuery({
key: "simulation_state",
operator: "=",
type: "simple",
value: valid_state_list[i]
}));
}
aux_complex_query = new ComplexQuery({
operator: "OR",
query_list: aux_query_list,
type: "complex"
});
query_list.push(aux_complex_query);
non_milestone_query = new ComplexQuery({
operator: "AND",
query_list: query_list,
type: "complex"
});
return new RSVP.Queue()
.push(function () {
var promise_list = [],
limit = [0, 1000],
select_list = ['source_project', 'source_project_title','portal_type', 'stop_date', 'modification_date', 'simulation_state'];//, 'validation_state'];
promise_list.push(gadget.jio_allDocs({
query: Query.objectToSearchText(milestone_query),
limit: limit,
select_list: select_list,
sort_on: [["modification_date", "descending"]]
}));
promise_list.push(gadget.jio_allDocs({
query: Query.objectToSearchText(non_milestone_query),
limit: limit,
select_list: select_list,
sort_on: [["modification_date", "descending"]]
}));
return RSVP.all(promise_list);
})
.push(function (result_list) {
var element_list = result_list[0].data.rows.concat(result_list[1].data.rows);
var project_list_dict = {};
function getProjectId(id) {
var segments = id.split("/");
if (segments.length === 2) {
return id;
} else {
return segments.slice(0, -1).join("/");
}
}
function setStatus(item) {
//TODO check modification date and return item with status 0, 1 or 2 (green, orange, red)
//we need 2 limit dates that should be based on portal type (e.g. Milestones segmented by months, maybe Taks by weeks)
//where to set this limits dates? a manifest? site configuration?
//for test results, check validation state (0 = pass, 2 = fail)
item.status = 0;
if (item.id === "project_module/1/7") {
item.status = 2;
}
if (item.id === "project_module/1/6") {
item.status = 1;
}
return item;
}
for (i = 0; i < element_list.length; i += 1) {
var item = setStatus(element_list[i]),
status_ok = ((item.status > 0) ? 0 : 1),
project_id = ((item.value.source_project) ?
getProjectId(item.value.source_project) : getProjectId(item.id));
if (project_id in project_list_dict) {
if (item.value.portal_type in project_list_dict[project_id]) {
var project_row = project_list_dict[project_id][item.value.portal_type];
if (status_ok) {
project_row.ok_count++;
} else {
project_row.out_count++;
if (project_row.status < item.status) {
project_row.status = item.status;
}
}
project_row.list.push(item);
} else {
project_list_dict[project_id][item.value.portal_type] = { "status": item.status, "ok_count" : 0 + status_ok, "out_count" : 0 + !status_ok, "list" : [item] };
}
} else {
project_list_dict[project_id] = {};
project_list_dict[project_id][item.value.portal_type] = { "status": item.status, "ok_count" : 0 + status_ok, "out_count" : 0 + !status_ok, "list" : [item] };
}
}
return project_list_dict;
});
}
rJS(window)
.declareAcquiredMethod("getUrlForList", "getUrlForList")
.declareAcquiredMethod("getUrlFor", "getUrlFor")
.declareAcquiredMethod("jio_allDocs", "jio_allDocs")
.declareAcquiredMethod("jio_getAttachment", "jio_getAttachment")
.declareAcquiredMethod("getSetting", "getSetting")
.declareMethod('render', function (options) {
return this.changeState(options);
})
.onStateChange(function (modification_dict) {
var gadget = this;
return getProjectDict(gadget)
.push(function (project_dict) {
console.log(project_dict);
});
})
.declareMethod('getContent', function () {
return {};
})
.declareMethod('checkValidity', function () {
return true;
});
}(window, rJS, RSVP, document, ensureArray, DOMParser, XMLSerializer, SimpleQuery, ComplexQuery, Query));
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>gadget_front_page_info.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment