Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
I
intranet-budget
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
project-open
intranet-budget
Commits
d926495e
Commit
d926495e
authored
Mar 15, 2020
by
Frank Bergmann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- First version where a budget tree appears
parent
2bd5567f
Changes
5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
446 additions
and
87 deletions
+446
-87
budget-tree-component.adp
lib/budget-tree-component.adp
+226
-0
budget-tree-component.tcl
lib/budget-tree-component.tcl
+24
-0
intranet-budget-create.sql
sql/postgresql/intranet-budget-create.sql
+86
-24
intranet-budget-drop.sql
sql/postgresql/intranet-budget-drop.sql
+11
-1
intranet-budget-procs.tcl
tcl/intranet-budget-procs.tcl
+99
-62
No files found.
lib/budget-tree-component.adp
0 → 100644
View file @
d926495e
<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>
lib/budget-tree-component.tcl
0 → 100644
View file @
d926495e
# /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"
sql/postgresql/intranet-budget-create.sql
View file @
d926495e
...
...
@@ -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 Item
s
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_
item
s'
,
'integer'
,
'f'
,
30
,
't'
,
'im_budget_items'
'budget_
screen_budget_item_parent
s'
,
'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
(
...
...
sql/postgresql/intranet-budget-drop.sql
View file @
d926495e
...
...
@@ -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
;
...
...
tcl/intranet-budget-procs.tcl
View file @
d926495e
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment