Commit d926495e authored by Frank Bergmann's avatar Frank Bergmann

- First version where a budget tree appears

parent 2bd5567f
<div id="@budget_tree_id@" style="height: 600px; overflow: hidden; -webkit-user-select: none; -moz-user-select: none; -khtml-user-select: none; -ms-user-select: none;">
<!-- define the icons for the various sub-types of projects in the tree -->
<style type="text/css">
.icon-task { background-image: url("/intranet/images/navbar_default/cog_go.png") !important; }
.icon-project { background-image: url("/intranet/images/navbar_default/cog.png") !important; }
.icon-ticket { background-image: url("/intranet/images/navbar_default/tag_blue.png") !important; }
.icon-milestone { background-image: url("/intranet/images/navbar_default/milestone.png") !important; }
.icon-sla { background-image: url("/intranet/images/navbar_default/tag_blue_add.png") !important; }
.icon-program { background-image: url("/intranet/images/navbar_default/tag_blue_add.png") !important; }
.icon-release { background-image: url("/intranet/images/navbar_default/arrow_rotate_clockwise.png") !important; }
.icon-release-item { background-image: url("/intranet/images/navbar_default/arrow_right.png") !important; }
.icon-crm { background-image: url("/intranet/images/navbar_default/group.png") !important; }
</style>
<script type='text/javascript'>
// Disable the ?_dc=123456789 parameter from loader
Ext.Loader.setConfig({disableCaching: false});
Ext.Loader.setPath('Ext.ux', '/sencha-v411/examples/ux');
Ext.Loader.setPath('PO', '/sencha-core');
Ext.require([
'Ext.data.*',
'Ext.grid.*',
'Ext.tree.*',
'Ext.ux.CheckColumn',
'PO.controller.StoreLoadCoordinator',
'PO.model.finance.BudgetItem',
'PO.store.CategoryStore',
'PO.store.finance.BudgetItemStatusStore',
'PO.store.finance.BudgetItemTreeStore'
]);
/*
*/
// Launch the actual application
// This happens after all required stores have been loaded (see below)
function launchBudgetTreePanel() {
var budgetItemTreeStore = Ext.StoreManager.get('budgetItemTreeStore');
var budgetItemStatusStore = Ext.StoreManager.get('budgetItemStatusStore');
var rowEditing = Ext.create('Ext.grid.plugin.RowEditing', {
clicksToMoveEditor: 2,
autoCancel: false
});
var tree = Ext.create('Ext.tree.Panel', {
title: 'Budget Tree',
width: 800,
height: 500,
renderTo: '@budget_tree_id@',
collapsible: true,
useArrows: true,
rootVisible: false,
store: budgetItemTreeStore,
multiSelect: true,
singleExpand: false,
// Enable in-line row editing.
plugins: [rowEditing],
// Enabled drag-and-drop for the tree. Yes, that's all...
viewConfig: {
plugins: {
ptype: 'treeviewdragdrop',
containerScroll: true
}
},
// the 'columns' property is now 'headers'
columns: [
{
xtype: 'treecolumn', //this is so we know which column will show the tree
text: 'Budget',
flex: 2,
sortable: true,
dataIndex: 'budget_item_name',
editor: {
allowBlank: false
}
},{
text: 'Owner',
flex: 1,
dataIndex: 'budget_item_owner_id',
sortable: true,
editor: {
allowBlank: true
}
},{
text: 'Status',
flex: 1,
dataIndex: 'budget_item_status_id',
sortable: true,
renderer: function(value){
var model = budgetItemStatusStore.getById(value);
var result = model.get('category');
return result;
},
editor: {
xtype: 'combo',
store: budgetItemStatusStore,
displayField: 'category',
valueField: 'category_id',
}
}],
listeners: {
'selectionchange': function(view, records) {
if (1 == records.length) {
// Exactly one record enabled
var record = records[0];
tree.down('#removeBudget').setDisabled(!record.isLeaf());
} else {
// Zero or two or more records enabled
tree.down('#removeBudget').setDisabled(true);
}
}
},
// Toolbar for adding and deleting budgets
tbar: [{
text: 'Add Budget Item',
iconCls: 'budget-item-add',
handler : function() {
rowEditing.cancelEdit();
alert('budget-item-add');
// Create a model instance
var r = Ext.create('PO.model.timesheet.TimesheetBudget', {
project_name: "New Budget",
project_nr: "budget_0018",
parent_id: "709261",
company_id: "500633",
start_date: "2013-09-19 12:00:00+02",
end_date: "2013-09-20 12:00:00+02",
percent_completed: "0",
project_status_id: "76",
project_type_id: "100"
});
budgetTreeStore.sync();
var selectionModel = tree.getSelectionModel();
var lastSelected = selectionModel.getLastSelected();
// ToDo: Appending the new budget at the lastSelected does't work for some reasons.
// Also, the newly added budget should be a "budget" and not a folder.
var root = budgetTreeStore.getRootNode();
// root.appendChild(r);
lastSelected.appendChild(r);
}
}, {
itemId: 'removeBudgetItem',
text: 'Remove Budget Item',
iconCls: 'budget-item-remove',
handler: function() {
rowEditing.cancelEdit();
alert('budget-item-remove');
var selectionModel = tree.getSelectionModel();
var lastSelected = selectionModel.getLastSelected();
var parent = lastSelected.parentNode;
var lastSelectedIndex = parent.indexOf(lastSelected);
// Remove the selected element
lastSelected.remove();
var newNode = parent.getChildAt(lastSelectedIndex);
if (typeof(newNode) == "undefined") {
lastSelectedIndex = lastSelectedIndex -1;
if (lastSelectedIndex < 0) { lastSelectedIndex = 0; }
newNode = parent.getChildAt(lastSelectedIndex);
}
if (typeof(newNode) == "undefined") {
// lastSelected was the last child of it's parent, so select the parent.
selectionModel.select(parent);
} else {
newNode = parent.getChildAt(lastSelectedIndex);
selectionModel.select(newNode);
}
},
disabled: true
}]
});
};
// Load the required stores first and then start the application
// via launchBudgetTreePanel().
Ext.onReady(function() {
Ext.QuickTips.init();
var budgetItemStatusStore = Ext.create('PO.store.finance.BudgetItemStatusStore');
var budgetItemTreeStore = Ext.create('PO.store.finance.BudgetItemTreeStore');
// Use "store coodinator" to launchBudgetTreeTreePanel() after all stores are loaded:
var coordinatior = Ext.create('PO.controller.StoreLoadCoordinator', {
stores: [
'budgetItemStatusStore',
'budgetItemTreeStore'
],
listeners: {
load: function() {
// Launch the actual application.
launchBudgetTreePanel();
}
}
});
// Load stores that need parameters
budgetItemStatusStore.load();
budgetItemTreeStore.getProxy().extraParams = { project_id: @project_id@ };
budgetItemTreeStore.load();
});
</script>
</div>
<if "" ne @data_list@>
</if>
# /packages/intranet-budget/lib/budget-tree_component.tcl
#
# Copyright (C) 2012-2020 ]project-open[
#
# All rights reserved. Please check
# http://www.project-open.com/license/ for details.
# ----------------------------------------------------------------------
#
# ---------------------------------------------------------------------
# The following variables are expected in the environment
# defined by the calling /tcl/*.tcl libary:
# project_id
set data_list {}
# project_id may be overwritten by SQLs below
set main_project_id $project_id
# Create a random ID for the budget_tree
set budget_tree_rand [expr {round(rand() * 100000000.0)}]
set budget_tree_id "budget_tree_$budget_tree_rand"
......@@ -434,7 +434,7 @@ FOR EACH ROW EXECUTE PROCEDURE im_budget_items_tsearch();
-- --------------------------------------------------------
-- Budget Item - Relationship between projects and Budget Items
--
-- This relationship connects Projects with "Budget Item"s
-- This relationship connects Projects with Budget Items
create table im_budget_item_project_rels (
......@@ -447,21 +447,21 @@ create table im_budget_item_project_rels (
);
select acs_rel_type__create_type (
'im_budget_item_project_rel', -- relationship (object) name
'Budget Item Project Rel', -- pretty name
'Budget Item Project Rels', -- pretty plural
'relationship', -- supertype
'im_budget_item_project_rels', -- table_name
'rel_id', -- id_column
'intranet-budget-item-rel', -- package_name
'acs_object', -- object_type_one
'member', -- role_one
0, -- min_n_rels_one
null, -- max_n_rels_one
'im_budget_item', -- object_type_two
'member', -- role_two
0, -- min_n_rels_two
null -- max_n_rels_two
'im_budget_item_project_rel', -- relationship (object) name
'Budget Item Project Rel', -- pretty name
'Budget Item Project Rels', -- pretty plural
'relationship', -- supertype
'im_budget_item_project_rels', -- table_name
'rel_id', -- id_column
'intranet-budget-item-rel', -- package_name
'acs_object', -- object_type_one
'member', -- role_one
0, -- min_n_rels_one
null, -- max_n_rels_one
'im_budget_item', -- object_type_two
'member', -- role_two
0, -- min_n_rels_two
null -- max_n_rels_two
);
......@@ -472,7 +472,7 @@ DECLARE
p_rel_id alias for $1; -- null
p_rel_type alias for $2; -- im_budget_item_project_rel
p_project_id alias for $3;
p_budget_item_id alias for $4;
p_budget_item_id alias for $4;
p_context_id alias for $5;
p_creation_user alias for $6; -- null
p_creation_ip alias for $7; -- null
......@@ -744,6 +744,22 @@ SELECT im_component_plugin__new (
'im_budget_item_list_component -object_id $project_id' -- component_tcl
);
SELECT im_component_plugin__new (
null, 'im_component_plugin', now(), null, null, null,
'Project Budget Tree', -- plugin_name
'intranet-budget', -- package_name
'right', -- location
'/intranet/projects/view', -- page_url
null, -- view_name
300, -- sort_order
'im_budget_tree_component -project_id $project_id' -- component_tcl
);
SELECT im_component_plugin__new (
null, 'im_component_plugin', now(), null, null, null,
'Cost Center Budget Items', -- plugin_name
......@@ -1039,6 +1055,55 @@ where widget_name = 'budget_screen_project_phase';
SELECT im_dynfield_widget__new (
null, 'im_dynfield_widget', now(), 0, '0.0.0.0', null,
'budget_screen_budget_item_parents', 'Budget Screen Budget Item Parents', 'Budget Screen Budget Item Parents',
10007, 'integer', 'generic_sql', 'integer',
'{custom {sql {...}}}'
);
update im_dynfield_widgets set
deref_plpgsql_function = 'acs_object__name',
parameters = '{custom {sql {
select p.project_id, p.project_name
from im_projects p
where p.parent_id is null
}}
after_html {
<script type="text/javascript">
function budgetScreenProjectPhaseOnChange() {
xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
var phaseSelect = document.budget_item.match_task_id;
phaseSelect.innerHTML = this.responseText;
}
}
var project_id = document.budget_item.budget_item_object_id.value;
xmlHttp.open("GET","/intranet-budget/project-phases.html?project_id="+project_id, true);
xmlHttp.send(null);
};
var dropdown = document.budget_item.budget_item_object_id;
dropdown.onchange = budgetScreenProjectPhaseOnChange;
budgetScreenProjectPhaseOnChange();
window.onload = function() {
}
</script>
}}'
where widget_name = 'budget_screen_budget_item_parents';
SELECT im_menu__new (
null,'im_menu',now(),null,null,null,
'intranet-budget', -- package_name
......@@ -1071,7 +1136,7 @@ SELECT im_dynfield_attribute_new (
);
SELECT im_dynfield_attribute_new (
'im_budget_item', 'budget_item_parent_id', 'Parent',
'budget_items', 'integer', 'f', 30, 't', 'im_budget_items'
'budget_screen_budget_item_parents', 'integer', 'f', 30, 't', 'im_budget_items'
);
SELECT im_dynfield_attribute_new (
'im_budget_item', 'budget_item_type_id', 'Type',
......@@ -1097,8 +1162,7 @@ SELECT im_dynfield_attribute_new (
-- Other fields
--
SELECT im_dynfield_attribute_new ('im_budget_item', 'match_cost_type_id', 'Cost Type',
'category_cost_type', 'integer', 'f');
SELECT im_dynfield_attribute_new ('im_budget_item', 'match_cost_type_id', 'Cost Type', 'category_cost_type', 'integer', 'f');
insert into im_dynfield_type_attribute_map (
attribute_id, object_type_id, display_mode, section_heading
) values (
......@@ -1108,8 +1172,7 @@ insert into im_dynfield_type_attribute_map (
49100, 'edit', 'Classifiers'
);
SELECT im_dynfield_attribute_new ('im_budget_item', 'match_expense_type_id', 'Expense Type',
'category_expense_type', 'integer', 'f');
SELECT im_dynfield_attribute_new ('im_budget_item', 'match_expense_type_id', 'Expense Type', 'category_expense_type', 'integer', 'f');
insert into im_dynfield_type_attribute_map (
attribute_id, object_type_id, display_mode, section_heading
) values (
......@@ -1121,8 +1184,7 @@ insert into im_dynfield_type_attribute_map (
SELECT im_dynfield_attribute_new ('im_budget_item', 'match_task_id', 'Project Phase',
'budget_screen_project_phase', 'integer', 'f');
SELECT im_dynfield_attribute_new ('im_budget_item', 'match_task_id', 'Project Phase', 'budget_screen_project_phase', 'integer', 'f');
insert into im_dynfield_type_attribute_map (
attribute_id, object_type_id, display_mode, section_heading
) values (
......
......@@ -11,6 +11,7 @@
select im_component_plugin__del_module('intranet-budget');
select im_menu__del_module('intranet-budget');
delete from im_biz_object_urls where object_type = 'im_budget_item';
drop view if exists im_budget_version_status;
drop view if exists im_budget_version_type;
......@@ -30,6 +31,11 @@ delete from im_dynfield_type_attribute_map where object_type_id in (select categ
delete from im_categories where category_type = 'Intranet Budget Item Status';
delete from im_categories where category_type = 'Intranet Budget Item Type';
delete from im_biz_object_role_map where acs_object_type = 'im_budget_item';
delete from im_categories where category = 'Budget Item Manager' and category_type = 'Intranet Biz Object Role';
drop function if exists im_budget_item_insert_tr() CASCADE;
drop function if exists im_budget_items_update_tr () CASCADE;
drop function if exists im_budget_item__new (
......@@ -49,7 +55,7 @@ drop function if exists im_budget_item_nr_from_id (integer);
drop function if exists im_budget_item_nr_parent_list(integer, varchar, integer);
drop function if exists im_budget_item_nr_parent_list(integer);
drop function if exists im_budget_items_tsearch();
drop function if exists im_budget_items_tsearch() CASCADE;
drop function if exists im_budget_version__delete(integer);
drop function if exists im_budget_version__name(integer);
......@@ -60,6 +66,10 @@ drop function if exists im_budget_item_project_rel__delete(integer, integer);
drop function if exists im_budget_item_project_rel__new (integer, varchar, integer, integer, integer, integer, varchar, integer);
alter table im_costs drop column budget_item_id;
alter table im_invoice_items drop column budget_item_id;
drop table if exists im_budget_versions CASCADE;
drop table if exists im_budget_items CASCADE;
......
This diff is collapsed.
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