Commit afe44b0a authored by Frank Bergmann's avatar Frank Bergmann

Initial Import

parents
Pipeline #624 failed with stages
<!-- ~/packages/sencha-member-portlet/lib/assign-users-to-projects.adp -->
<script type='text/javascript'>
/* *********************** APP CONFIG **********************************
Load Order:
1. Load Projects and fill tree (from POBASE.store.Projects)
2. Load Membership Rels (from POBASE.store.Projects)
3. Load Users (from POBASE.store.EmployeeMembershipRels )
4. Fill POBASE.controllers.get('Employees').fillEmployeeStoreFromUserStore (from POBASE.store.Users)
*/
Ext.Loader.setConfig({ enabled: true });
Ext.Loader.setPath('Ext.ux', '../../@package_key_sencha;noquote@/examples/ux/');
Ext.application({
name: 'POBASE',
models: [ 'User', 'Employee','EmployeeMembershipRel', 'Project' ],
stores: [ 'Users', 'Employees', 'EmployeeMembershipRels', 'Projects' ],
controllers: [ 'Employees', 'Projects', 'ProjectTreePanel', 'Membership_rel'],
launch: function() {
POBASE = this;
Ext.create('Ext.container.Container', {
renderTo: 'project_tree_panel',
items: [
{
xtype: 'projectTreePanel'
}
]
});
}
});
</script>
<div id="project_tree_panel"></div>
# /packages/sencha-member-portlet/lib/assign-users-to-projects.tcl
#
# Copyright (C) 2003 - now Project Open Business solutions S.L.
#
# All rights reserved. Please check
# http://www.project-open.com/license/ for details.
set current_user_id [ad_maybe_redirect_for_registration]
set page_title ""
set left_navbar_html ""
set sub_navbar ""
# Get SENCHA version
set package_key_sencha [lindex [im_sencha_extjs_version] 2]
# Load ExtJS Libs
im_sencha_extjs_load_libraries
# template::head::add_javascript -src "/sencha-v411/ext-all.js" -order 1
# template::head::add_css -href "/sencha-v411/resources/css/ext-all.css" -media "screen" -order 1000
template::head::add_css -href "/${package_key_sencha}/resources/css/ext-all-gray.css" -media "screen" -order 1010
# MODELS
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/model/User.js" -order 9000
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/model/Employee.js" -order 9005
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/model/EmployeeMembershipRel.js" -order 9010
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/model/Project.js" -order 9010
# STORES
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/store/Users.js" -order 9050
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/store/Employees.js" -order 9055
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/store/EmployeeMembershipRels.js" -order 9060
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/store/Projects.js" -order 9060
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/store/TreeStore.js" -order 9065
# CONTROLLER
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/controller/Projects.js" -order 9100
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/controller/ProjectTreePanel.js?user_id=$user_id" -order 9105
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/controller/Employees.js" -order 9110
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/controller/Membership_rel.js" -order 9115
# VIEW
template::head::add_javascript -src "/sencha-member-portlet/pobase/app/view/ProjectTreePanel.js" -order 99999
# UX
# template::head::add_javascript -src "/sencha-member-portlet/pobase/app/ux/statusbar/StatusBar.js" -order 99999
Copy project and sub-project assignments:<br><br>
<div id='copy_project_assignments_component_container'>
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td>of user: </td>
<td><input name="im_cust_champ_copy_project_assignments_from_user" id="im_cust_champ_copy_project_assignments_from_user" style="width: 227px;"></td>
</tr>
<tr>
<td>to user: </td>
<td><input name="im_cust_champ_copy_project_assignments_to_user" id="im_cust_champ_copy_project_assignments_to_user" style="width: 227px;"></td>
</tr>
<tr>
<td colspan="2" align="right"><input type="button" id="btnCopyProjectAssignments" name="btnCopyProjectAssignments" value="Assign" /></td>
</tr>
</table>
<span id="im_cust_champ_copy_project_assignments_msg"></span>
<br>
</div>
<!-- hidden vars required to get value from autocomplete -->
<input type="hidden" id="im_cust_champ_copy_project_assignments_from_user_id">
<input type="hidden" id="im_cust_champ_copy_project_assignments_to_user_id">
<script>
$("#btnCopyProjectAssignments").click(function(){
var _fromUser = $("#im_cust_champ_copy_project_assignments_from_user_id").val();
var _toUser = $("#im_cust_champ_copy_project_assignments_to_user_id").val();
var data = 'to_user=' + _toUser + '&from_user=' + _fromUser;
if ( (_fromUser && _toUser) && (_fromUser !== _toUser)) {
var LoadMsg = '';
$('<div id="im_cust_champ_copy_project_assignments_loading">'+LoadMsg+'</div>').appendTo('body').fadeIn('slow',function(){
$.ajax({
type: 'GET',
url: '/intranet-cust-champ/xhtml-copy-project-assignments',
data: data,
dataType: 'html',
timeout: 5000,
success: function(d,s){
$("#im_cust_champ_copy_project_assignments_msg").html('<br><span>Relationships have been copied</span>');
$("#im_cust_champ_copy_project_assignments_from_user").val("");
$("#im_cust_champ_copy_project_assignments_to_user").val("");
},
error: function(o,s,e){
$("#im_cust_champ_copy_project_assignments_msg").html('<br><span style="color:red">An error has been occurred making this request:<br>' + e + '</span>');
}
});
});
} else {
$("#im_cust_champ_copy_project_assignments_msg").html('Please set both values with two different users');
};
});
// Remove err message when first autoselect gains gets focus
$("#im_cust_champ_copy_project_assignments_from_user").focus(function () {
$("#im_cust_champ_copy_project_assignments_msg").html('&nbsp;');
});
$("#im_cust_champ_copy_project_assignments_from_user").autocomplete({
source: function (request, response) {
$.ajax({
url: "/intranet-reporting/view?report_code=xhtml_champ_find_employees&format=json",
dataType: "json",
data: {
featureClass: "P",
style: "full",
maxRows: 12,
search_str: request.term
},
success: function (data) {
response($.map(data.data, function (item) {
return {
label: item.employee_name,
value: item.employee_name,
id: item.employee_id
}
}));
}
});
},
minLength: 3,
select: function (event, ui) {
$("#im_cust_champ_copy_project_assignments_from_user_id").val(ui.item.id)
},
open: function () {
$(this).removeClass("ui-corner-all").addClass("ui-corner-top");
},
close: function () {
$(this).removeClass("ui-corner-top").addClass("ui-corner-all");
}
});
$("#im_cust_champ_copy_project_assignments_to_user").autocomplete({
source: function (request, response) {
$.ajax({
url: "/intranet-reporting/view?report_code=xhtml_champ_find_employees&format=json",
dataType: "json",
data: {
featureClass: "P",
style: "full",
maxRows: 12,
search_str: request.term
},
success: function (data) {
response($.map(data.data, function (item) {
return {
label: item.employee_name,
value: item.employee_name,
id: item.employee_id
}
}));
}
});
},
minLength: 3,
select: function (event, ui) {
$("#im_cust_champ_copy_project_assignments_to_user_id").val(ui.item.id)
},
open: function () {
$(this).removeClass("ui-corner-all").addClass("ui-corner-top");
},
close: function () {
$(this).removeClass("ui-corner-top").addClass("ui-corner-all");
}
});
</script>
# /packages/sencha-member-portlet/lib/type-and-find-search-projects
#
# Copyright (c) 2003-2014 Project Open Business Solutions S.L.
# All rights reserved.
#
# Author: klaus.hofeditz@project-open.com
template::head::add_css -href "/sencha-member-portlet/css/jquery-ui.css" -media "screen" -order 1
template::head::add_javascript -src "/sencha-member-portlet/js/jquery-ui-1.10.3.custom.min.js" -order 1000
# template::head::add_meta -http_equiv "X-UA-Compatible" -content "IE=8;FF=3;OtherUA=4"
<?xml version="1.0"?>
<!-- Generated by the OpenACS Package Manager -->
<package key="sencha-member-portlet" url="http://openacs.org/repository/apm/packages/sencha-member-portlet" type="apm_application">
<package-name>]project-open[ Sencha Member Portlet</package-name>
<pretty-plural>]project-open[ Sencha Member Portlet</pretty-plural>
<initial-install-p>f</initial-install-p>
<singleton-p>t</singleton-p>
<implements-subsite-p>f</implements-subsite-p>
<inherit-templates-p>t</inherit-templates-p>
<auto-mount>sencha-member-portlet</auto-mount>
<version name="0.2d" url="http://openacs.org/repository/download/apm/sencha-member-portlet-0.1d.apm">
<owner url="mailto:info@project-open.com">Project Open Business Solutions S.L.</owner>
<summary>Provides a portlet that allows bulk assignments of users to projects </summary>
<vendor url="www.project-open.com">Project Open Business Solutions S.L.</vendor>
<description format="text/html">Provides a portlet that allows bulk assignments of users to projects. Package contains a second portlet that allows transfer "project relations" from one user to another user. This second portlet requires some work to make it run. </description>
<maturity>0</maturity>
<provides url="sencha-member-portlet" version="0.1d"/>
<callbacks>
</callbacks>
<parameters>
<!-- No version parameters -->
</parameters>
</version>
</package>
-- /packages/sencha-member-portlet/sencha-member-portlet-create.sql
--
-- Copyright (c) 2014 Project Open Business Solutions S.L.
--
-- All rights reserved. Please check
-- http://www.project-open.com/license/ for details.
--
-- @author klaus.hofeditz@project-open.com
---------------------------------------------------------
-- Components
---------------------------------------------------------
-- Create component "Copy Project Assignments"
create or replace function inline_1 ()
returns integer as $BODY$
declare
v_plugin_id integer;
v_project_manager integer;
v_senior_manager integer;
begin
SELECT im_component_plugin__new (
null, -- plugin_id
'acs_object', -- object_type
now(), -- creation_date
null, -- creation_user
null, -- creation_ip
null, -- context_id
'Copy Project Assignments', -- plugin_name
'sencha-member-portlet', -- package_name
'right', -- location
'/intranet/users/view', -- page_url
null, -- view_name
5, -- sort_order
'im_project_copy_user_assignments $user_id $return_url' -- component_tcl
) into v_plugin_id;
select group_id into v_project_manager from groups where group_name = 'Project Managers';
PERFORM im_grant_permission(v_plugin_id, v_project_manager, 'read');
select group_id into v_senior_manager from groups where group_name = 'Senior Managers';
PERFORM im_grant_permission(v_plugin_id, v_senior_manager, 'read');
return 0;
end;$BODY$ language 'plpgsql';
select inline_1 ();
drop function inline_1();
-- Create component "Bulk Assignement"
create or replace function inline_1 ()
returns integer as $BODY$
declare
v_plugin_id integer;
v_project_manager integer;
v_senior_manager integer;
begin
SELECT im_component_plugin__new (
null, -- plugin_id
'acs_object', -- object_type
now(), -- creation_date
null, -- creation_user
null, -- creation_ip
null, -- context_id
'Bulk Assignments (Beta)', -- plugin_name
'sencha-member-portlet', -- package_name
'left', -- location
'/intranet/users/view', -- page_url
null, -- view_name
5, -- sort_order
'im_project_bulk_assignment_component $user_id' -- component_tcl
) into v_plugin_id;
select group_id into v_project_manager from groups where group_name = 'Project Managers';
PERFORM im_grant_permission(v_plugin_id, v_project_manager, 'read');
select group_id into v_senior_manager from groups where group_name = 'Senior Managers';
PERFORM im_grant_permission(v_plugin_id, v_senior_manager, 'read');
return 0;
end;$BODY$ language 'plpgsql';
select inline_1 ();
drop function inline_1();
-- Create report for xhtml request used in portlet
create or replace function inline_1 ()
returns integer as $BODY$
declare
v_report_id integer;
v_menu_id integer;
v_employees integer;
v_sql varchar;
begin
SELECT im_menu__new (
null, -- p_menu_id
'im_menu', -- object_type
now(), -- creation_date
null, -- creation_user
null, -- creation_ip
null, -- context_id
'sencha-member-portlet', -- package_name
'xhtml_sencha_member_portlet_find_employees', -- label
'Please do not change or remove', -- name
'/intranet/users/view', -- url
100000, -- sort_order
null, -- parent_menu_id
null -- p_visible_tcl
) into v_menu_id;
v_sql := 'select u.user_id as employee_id, im_name_from_user_id(u.user_id, 3) as employee_name from cc_users u LEFT JOIN im_employees e ON (u.user_id = e.employee_id), ';
v_sql := v_sql || '(select member_id from group_distinct_member_map m where group_id = ''463'') m ';
v_sql := v_sql || 'where u.user_id = m.member_id and u.member_state = ''approved'' and (lower(u.first_names) like lower(''%%%search_str%%%'') OR lower(u.last_name) like lower(''%%%search_str%%%''))';
SELECT im_report__new(
null,
'im_report',
now(),
624,
'0.0.0.0',
null,
'xhtml_sencha_member_portlet_find_employees',
'xhtml_sencha_member_portlet_find_employees',
15110,
15000,
v_menu_id,
v_sql
) into v_report_id;
-- Set permissions
select group_id into v_employees from groups where group_name = 'Employees';
PERFORM acs_permission__grant_permission(v_menu_id, v_employees, 'read');
return 0;
end;$BODY$ language 'plpgsql';
select inline_1 ();
drop function inline_1();
CREATE OR REPLACE FUNCTION im_rels_transfer_user_projects_and_tasks(INTEGER, INTEGER) RETURNS INTEGER AS $body$
-- transfers all project/sub-project relationships from one user to another
-- transfers object_role, excludes percentage
DECLARE
p_source_user_id alias for $1;
p_target_user_id alias for $2;
v_count INTEGER;
r record;
BEGIN
FOR r IN
select
rels.object_id_one,
biz.object_role_id
from
acs_rels rels,
im_biz_object_members biz,
acs_objects obj
where
rels.object_id_two = p_source_user_id and
obj.object_id = rels.object_id_one and
-- obj.object_type in ('im_project','im_timesheet_task') and
obj.object_type in ('im_project') and
rels.rel_type='im_biz_object_member' and
rels.rel_id = biz.rel_id
LOOP
perform im_biz_object_member__new(null,'im_biz_object_member',r.object_id_one,p_target_user_id,r.object_role_id,null,null,'');
END LOOP;
return 0;
END;
$body$ LANGUAGE 'plpgsql';
# /packages/sencha-member-portlet/tcl/intranet-sencha-member-portlet-procs.tcl
#
# Copyright (C) 2003 - 2014 Project Open Business Solutions S.L.
#
# All rights reserved. Please check
# http://www.project-open.com/license/ for details.
#
#
ad_library {
@author klaus.hofeditz@project-open.com
}
# ---------------------------------------------------------------------
# Components
# ---------------------------------------------------------------------
ad_proc -public im_project_copy_user_assignments {
user_id
{ return_url "" }
} {
Copies all project- and task-assignments from one user to another
Helpful when an new employee is taking over assignments from a leaving employees.
} {
set params [list [list user_id $user_id] [list return_url $return_url]]
set result [ad_parse_template -params $params "/packages/sencha-member-portlet/lib/copy-project-assignments"]
return [string trim $result]
}
ad_proc -public im_project_bulk_assignment_component {
{ user_id }
{ return_url "" }
{ subproject_status_id "none"}
} {
ExtJS based component showing a treepanel with all open projects.
Allows users to assign members to multiple projects and sub-projects
Does not (yet) allow task assignments
} {
if {"" == $return_url} { set return_url [im_url_with_query] }
set params [list [list return_url $return_url] [list user_id $user_id]]
set result [ad_parse_template -params $params "/packages/sencha-member-portlet/lib/assign-users-to-projects"]
return [string trim $result]
}
This diff is collapsed.
This diff is collapsed.
Ext.define('POBASE.controller.Employees', {
extend: 'Ext.app.Controller',
stores: ['Employees', 'Users'],
models: ['Employee', 'User'],
fillEmployeeStoreFromUserStore: function () {
// console.log('In "POBASE.controller.Employees.fillEmployeeStore()"');
userStore = Ext.getStore('Users');
employeeStore = Ext.getStore('Employees');
relStore = Ext.getStore('EmployeeMembershipRels');
// console.log('POBASE.controller.Employees: Found # users:' + userStore.getRange());
Ext.each(userStore.getRange(), function (record) {
var newRecordData = Ext.clone(record.copy().data);
var emp_rec = relStore.findRecord('object_id_two', newRecordData.user_id);
if (null != emp_rec) {
employeeStore.add({
'employee_id': newRecordData.user_id,
'employee_name': newRecordData.last_name + ', ' + newRecordData.first_names
});
}
});
// console.log('Employees.js : fillEmployeeStoreFromUserStore - DONE);
Ext.getCmp('project-tree-panel-status').clearStatus({useDefaults:true});
}
});
// sencha-member-portlet/www/pobase/app/controller/Membership_rel.js
Ext.define('POBASE.controller.Membership_rel', {
extend: 'Ext.app.Controller',
stores: ['Users', 'Employees'],
models: ['EmployeeMembershipRel'],
init: function () {},
addUserProjectRel: function (employee_id, project_id) {
// console.log('in addUserProjectRel, project_id:' + project_id + 'employee_id:' + employee_id);
Ext.Ajax.request({
url: '/sencha-member-portlet/xhr-biz-object-add-role.tcl',
method: 'POST',
params: {
'user_id':employee_id,
'object_id':project_id,
'role_id':1300
},
success: function (xhr) {
Ext.MessageBox.alert('Status', 'Employee has been assigned successfully.', '');
},
failure: function (response, options) {
Ext.MessageBox.alert('Error', 'Could not create Relationship Employee <-> Project. Please contact your System Administrator.');
}
});
}
}
);
Ext.define('POBASE.controller.ProjectTreePanel', {
extend: 'Ext.app.Controller',
refs: [{
// COMPONENT QUERY -> get reference to the project Tree
ref: 'myProjectTreePanel',
selector: 'projectTreePanel'
}],
init: function () {
this.control({
'viewport': {
render: this.onPanelRendered
},
//Tree events - click, checkbox change, node expand and right click
'projectTreePanel': {
itemclick: this.treeItemClick,
checkchange: this.treeCheckChange,
itemexpand: this.treeNodeExpand,
itemcontextmenu: this.treeRightClick
},
//get all checked noded button
'projectTreePanel button[action=saveRels]': {
click: this.saveRels
}
});
},
onPanelRendered: function () {
console.log('The panel was rendered');
},
saveRels: function (button) {
// console.log('Clicked Button (saveRels) ...');
selectedNodes = this.getMyProjectTreePanel().getChecked();
// console.log('List of Selected Nodes:\n');
// Ext.Array.each(selectedNodes, function (record) {
//console.log('Node:' + record.get('id') + ' Text:' + record.get('project_name') + '\n');
// });
// var combo = Ext.getCmp('selectEmployeesCombo');
Ext.Array.each(selectedNodes, function (record) {
// console.log('Node:' + record.get('id') + ' Text:' + record.get('project_name') + '\n');
/* To be used when a DropDown is used to select the employee (selectEmployeesCombo)
Ext.each(combo.getValue(), function (item) {
POBASE.controllers.get('Membership_rel').addUserProjectRel(item, record.get('id'));
});
*/
// To be used when user_id is provided as URL param
POBASE.controllers.get('Membership_rel').addUserProjectRel('@user_id;noquote@', record.get('id'));
});
Ext.getCmp('project-tree-panel-status').setStatus({
iconCls: 'x-status-saved',
text: 'Assignments saved'
});
},
//event triggered when a node is checked or unchecked
treeCheckChange: function (node, checked) {
console.log('Checkbox clicked: Is it checked? ' + checked);
console.log('Is the node loaded? ' + node.isLoaded());
//loops thru all child nodes and check or uncheck
//based on the parent node that was clicked
node.eachChild(function (childNode) {
childNode.set('checked', checked);
this.treeCheckChange(childNode, checked);
}, this);
},
//node expand event
treeNodeExpand: function (node) {
console.log('Expanded Node: How many children? ' + node.childNodes.length);
},
//get all nodes that are checked in the Tree panel
getAllCheckedNodes: function (button) {
selectedNodes = this.getMyProjectTreePanel().getChecked();
console.log('List of Selected Nodes:\n');
Ext.Array.each(selectedNodes, function (record) {
console.log('Node:' + record.get('id') + ' Text:' + record.get('project_name') + '\n');
});
},
treeItemClick: function (view, record) {
//some node in the tree was clicked, you have now access to the node record and the tree view
// console.log('Clicked on a Tree Node!\n' + 'Node id: '
// + record.get('id') + '\n' + 'Node Text: '
// + record.get('project_name') + '\n' + 'Parent Node id: '
// + record.get('parentId') + '\n' + 'Is it a leaf?: '
// + record.get('leaf') + '\n' + 'No of Children: '
// + record.childNodes.length);
//now you have all the information about the node: Node id, Node Text, Parent Node, Is node a leaf?, No of child nodes
}
});
# /packages/sencha-member-portlet/www/pobase/app/controller/ProjectTreePanel.js.tcl
#
# Copyright (C) 2003 - 2014 Project Open Business Solutions S.L.
#
# All rights reserved. Please check
# http://www.project-open.com/license/ for details.
ad_page_contract {
@author klaus.hofeditz@project-open.com
} {
user_id
}
set current_user_id [ad_maybe_redirect_for_registration]
Ext.define('POBASE.controller.Projects', {
extend: 'Ext.app.Controller',
init: function () {}
});
Ext.define('POBASE.model.Employee', {
extend: 'Ext.data.Model',
idProperty: 'employee_id',
fields: [
'employee_id',
'employee_name'
]
});
Ext.define('POBASE.model.EmployeeMembershipRel', {
extend: 'Ext.data.Model',
idProperty: 'id',
fields: [
'object_id_one', // Group ID
'object_id_two', // User ID
{
name: 'user_id',
convert: function (value, record) {
return record.get('object_id_two');
}
}
]
});
Ext.define('POBASE.model.Project', {
extend: 'Ext.data.Model',
dataIndex: 'data',
fields: [
{
name: 'id',
type: 'string'
},
{
name: 'project_name',
type: 'string'
},
{
name: 'code',
type: 'string'
},
{
name: 'leaf',
type: 'boolean',
defaultValue: false,
persist: false
},
{
name: 'checked',
type: 'boolean',
defaultValue: false,
persist: false
},
{
name: 'iconCls',
type: 'string',
defaultValue: 'add'
}
]
}
);
Ext.define('POBASE.model.User', {
extend: 'Ext.data.Model',
idProperty: 'user_id',
dataIndex: 'data',
fields: [
'user_id', // Primary key
'first_names', // First name(s)
'last_name', // Standard last name
'username', // Windows username
'last_name2', // Spanish 2nd last name
'telephone', // Telephone
'email',
'spri_email', // Just email txt
'gender', // male or female
'language' // expl.: de_DE
]
});
Ext.define('POBASE.store.EmployeeMembershipRels', {
extend: 'Ext.data.Store',
model: 'POBASE.model.EmployeeMembershipRel',
pageParam: undefined,
pageSize: 999999999,
autoLoad: false,
proxy: {
type: 'ajax',
url: '/intranet-rest/membership_rel',
extraParams: {
format: 'json',
columns: 'id,object_id_one,object_id_two'
},
reader: {
type: 'json',
root: 'data'
}
},
listeners: {
load: function (store, records, success) {
//console.log("Load success POBASE.store.EmployeeMembershipRel: " + success);
// If there's a Employees store, fill it
if (!success) {
Ext.MessageBox.alert('Error', "Error retrieving User data. Your session might be expired, please <a href='/register/?return_url=<%=[im_url_with_query]%>'>re-login</a>");
} else {
// console.log('POBASE.store.EmployeeMembershipRels: Loading Users ... ' + Date.now());
Ext.getStore('Users').load();
// console.log('POBASE.store.EmployeeMembershipRels: Users loaded... ' + Date.now());
};
// if (Ext.getStore('Employees')) {
// console.log('Found store Employees, filling now ...');
// Ext.getCmp('project-tree-panel-status').showBusy('Loading employees ...');
// POBASE.controllers.get('Employees').fillEmployeeStoreFromUserStore();
// };
}
}
});
Ext.define('POBASE.store.Employees', {
extend: 'Ext.data.Store',
model: 'POBASE.model.Employee',
pageParam: undefined,
pageSize: 999999999,
proxy: undefined,
listeners: {
load: function (store, records, success) {
// console.log("Result Load POBASE.store.Employees: " + success);
Ext.getCmp('project-tree-panel-status').clearStatus({useDefaults:true});
}
}
});
// ~/packages/sencha-member-portlet/www/pobase/app/store/Projects.js
Ext.define('POBASE.store.Projects', {
extend: 'Ext.data.TreeStore',
model: POBASE.model.Project,
autoScroll: true,
pageParam: undefined,
proxy: {
type: 'ajax',
url: '/intranet-rest/im_project',
reader: {
type: 'json',
root: 'data'
}
},
root: {
text: 'Tree display of Projects',
id: 'myTree',
expanded: true
},
// folderSort: true,
sorters: [{
property: 'project_name',
direction: 'ASC'
}],
listeners: {
load: function (tree, node, records) {
// console.log('Projects.js::listeners::load:: ENTER ' + Date.now());
if (node.get('checked')) {
node.eachChild(function (childNode) {
childNode.set('checked', true);
});
};
// console.log('Projects.js::listeners::load:: Loading MembershipRels ... ' + Date.now());
Ext.getStore('EmployeeMembershipRels').load();
// console.log('Projects.js::listeners::load:: EmployeeMembershipRels loaded... ' + Date.now());
},
beforeload: function (store, operation, options) {
// console.log('Projects.js::listeners::beforeLoad:: ENTER:' + Date.now());
// Adjust request URL to make it compatible with intranet-rest
// Example: intranet-rest/im_project?format=json&query=project_status_id=76 and parent_id =
// Get last index (example of an id (2nd level)): myTree/3456 -> last_id will be: 3456
var last_id = operation.node.get('id').substr(operation.node.get('id').lastIndexOf('/') + 1);
// console.log('last_id: ' + last_id);
if ('myTree' == last_id) {
store.getProxy().extraParams = {
query: 'project_status_id=76 and parent_id is null',
format: 'json',
columns: 'project_id_id,project_name'
};
}
else {
store.getProxy().extraParams = {
query: 'project_status_id=76 and parent_id=' + last_id,
format: 'json',
columns: 'project_id_id,project_name'
};
};
// console.log('Projects.js::listeners::beforeLoad:: LEAVING:' + Date.now());
}
}
}
);
/* Overrides for fixing clearOnLoad for TreeStore */
Ext.override(Ext.data.TreeStore, {
load: function (options) {
options = options || {};
options.params = options.params || {};
var me = this,
node = options.node || me.tree.getRootNode(),
root;
//If there is not a node it means the user hasn't defined a rootnode yet.
//In this case lets just create one for them.
if (!node) {
node = me.setRootNode({
expanded: true
});
}
if (me.clearOnLoad) {
node.removeAll(false);
}
Ext.applyIf(options, {
node: node
});
options.params[me.nodeParam] = node ? node.getId() : 'root';
if (node) {
node.set('loading', true);
}
return me.callParent([options]);
}
});
Ext.define('POBASE.store.Users', {
extend: 'Ext.data.Store',
model: 'POBASE.model.User',
pageParam: undefined,
pageSize: 999999999,
// autoLoad: true,
proxy: {
type: 'ajax',
url: '/intranet-rest/user',
pageParam: undefined,
extraParams: {
format: 'json',
columns: 'user_id,first_names,last_name,email'
},
reader: {
type: 'json',
root: 'data'
}
},
listeners: {
load: function (store, records, success) {
if (!success) {
Ext.MessageBox.alert('Error', "Error retrieving User data. Your session might be expired, please <a href='/register/?return_url=<%=[im_url_with_query]%>'>re-login</a>");
} else {
// console.log('POBASE.store.Users: Filling Employee Store ... ' + Date.now());
POBASE.controllers.get('Employees').fillEmployeeStoreFromUserStore();
// console.log('POBASE.store.Users Employee Store filled ... ' + Date.now());
};
// If there's a EmployeeMembershipRels store load it
// Ext.getCmp('project-tree-panel-status').showBusy('Loading membership relationships...');
// if (Ext.getStore('EmployeeMembershipRels')) {
// console.log('Found store EmployeeMembershipRels, loading now ...');
// Ext.getStore('EmployeeMembershipRels').load();
// };
}
},
sorters: [{
property: 'last_name',
direction: 'ASC'
}]
});
// sencha-member-portlet/www/pobase/app/view/ProjectTreePanel.js
Ext.onReady(function() {
Ext.define('POBASE.view.ProjectTreePanel', {
extend: 'Ext.tree.Panel',
alias: 'widget.projectTreePanel',
store: 'Projects',
// title: 'Assigning User to Projects',
height: 600,
width: 420,
padding: '5 5 5 5',
useArrows: true,
multiSelect: true,
singleExpand: true,
rootVisible: false,
bbar: Ext.create('Ext.ux.statusbar.StatusBar', {
id: 'project-tree-panel-status',
defaultText: 'Ready',
defaultIconCls: 'default-icon',
text: 'Loading Projects and building tree ... ',
iconCls: 'ready-icon'
}),
dockedItems: [
{
dock: 'bottom',
items: [{
xtype: 'button',
id: 'right-button',
text: 'Assign Employee to Projects',
action: 'saveRels',
margin: '10 10'
}]
}
/*
,{
dock: 'top',
items: [{
xtype: 'combo',
id: 'selectEmployeesCombo',
name: 'selectEmployeesCombo',
fieldLabel: 'Employee to be assigned',
store: 'Employees',
queryMode: 'local',
displayField: 'employee_name',
valueField: 'employee_id',
multiSelect: false,
forceSelection: true,
labelWidth: 200,
width: 400,
padding: '5 5 5 5'
}]
}*/
],
columns: [
{
xtype: 'treecolumn',
text: 'Projects/Subprojects',
flex: 2,
sortable: true,
dataIndex: 'project_name'
}]
});
});
\ No newline at end of file
# /packages/sencha-member-portlet/www/xhr-biz-object-add-role.tcl
# Copyright (c) 2014 Project Open Business Solutions S.L.
# All rights reserved. Please check
# http://www.project-open.com/license/ for details.
#
# @author klaus.hofeditz@project-open.com
ad_page_contract {
Copies project & sub-project relationships from one user to another
@param from_user
@param to_user
@author klaus.hofeditz@project-open.com
} {
{ user_id:integer }
{ object_id:integer }
{ role_id:integer }
}
set current_user_id [ad_maybe_redirect_for_registration]
# Check permissions
set object_type [db_string acs_object_type "select object_type from acs_objects where object_id=:object_id" -default ""]
if {"" == $object_type} { ad_return_complaint 1 "<b>Didn't find object with id #$object_id</b>:<br>Maybe the object has been deleted?" }
set perm_cmd "${object_type}_permissions \$current_user_id \$object_id view read write admin"
eval $perm_cmd
if {!$write} {
ns_return 500 text/html "Error setting membership; no WRITE permissions"
}
if { 0 != [im_biz_object_add_role $user_id $object_id $role_id] } {
ns_return 200 text/html 1
} else {
ns_return 500 text/html "Error setting membership, function: im_biz_object_add_role failed. Please contact your System Administrator"
}
# /packages/sencha-member-portlet/www/xhtml-copy-project-assignments.tcl
# Copyright (c) 2014 Project Open Business Solutions S.L.
# All rights reserved. Please check
# http://www.project-open.com/license/ for details.
#
# @author klaus.hofeditz@project-open.com
ad_page_contract {
Copies project & sub-project relationships from one user to another
@param from_user
@param to_user
@author klaus.hofeditz@project-open.com
} {
{ from_user:integer }
{ to_user:integer }
}
ad_maybe_redirect_for_registration
if {[catch {
set res [db_string copy_rels "select im_rels_transfer_user_projects_and_tasks(:from_user, :to_user)" -default -1]
ns_return 200 text/html $res
} err_msg]} {
ns_return 500 text/html $err_msg
}
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