Commit dfc48c49 authored by Project Open's avatar Project Open

- WIP, now with chained drop-downs for project and task, week display,

  but without specialized store for hours
parent afcfbb58
......@@ -48,15 +48,7 @@ function launchTimesheetWeeklyLogging(){
var taskTreeStore = Ext.StoreManager.get('taskTreeStore');
var projectStore = Ext.StoreManager.get('projectMainStore');
// -----------------------------------------------------------------------
// Renderer to display a project_id as project_name
var hourGridProjectRenderer = function(project_id, metaData, record, rowIndex, colIndex, store, view) {
var projectName = '#'+project_id;
var projectNode = taskTreeStore.getNodeById(project_id);
if (projectNode) { projectName = projectNode.get('project_name'); }
return projectName;
};
// Row-Editor for the hour grid
var rowEditing = Ext.create('Ext.grid.plugin.RowEditing', {
clicksToMoveEditor: 2,
listeners: {
......@@ -71,19 +63,45 @@ function launchTimesheetWeeklyLogging(){
store: hourStore,
layout: 'fit',
region: 'center',
columnLines: true,
enableLocking: true,
collapsible: false,
title: 'Expander Rows in a Collapsible Grid with lockable columns',
header: false,
emptyText: 'No data yet - please click on one of the tasks at the left',
iconCls: 'icon-grid',
margin: '0 0 20 0',
plugins: [rowEditing],
// reference to controller
hourController: null, // Reference to main controller
columns: [
{
{
text: 'Project',
flex: 1,
dataIndex: 'main_project_id',
renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
var main_project_id = record.get('main_project_id');
var main_project_id = record.get('main_project_id');
var projectModel = projectStore.getById(main_project_id);
if (!projectModel) return "";
return projectModel.get('project_name');
},
editor: { xtype: 'combo', queryMode: 'local', store: projectStore, displayField: 'project_name', valueField: 'project_id', matchFieldWidth: false }
editor: {
xtype: 'combo',
queryMode:
'local',
store: projectStore,
displayField: 'project_name',
valueField: 'project_id',
matchFieldWidth: false,
listeners: {
change: function(combo, value, oldValue, event) {
// ToDo: Replace this hard-wired reference with something more intelligent
var controller = hourGrid.hourController;
controller.onProjectChanged(value, combo, hourGrid);
}
}
}
}, {
text: 'Task',
flex: 1,
......@@ -93,31 +111,18 @@ function launchTimesheetWeeklyLogging(){
if (!taskModel) return "";
return taskModel.get('project_name');
},
editor: { xtype: 'pocombotree', store: taskTreeStore, queryMode: 'local', displayField: 'project_name', valueField: 'id'}
}, {
text: "Date",
xtype: 'datecolumn',
dataIndex: 'day',
renderer: Ext.util.Format.dateRenderer('Y-m-d'),
editor: {
xtype: 'datefield',
allowBlank: true,
startDay: @week_start_day@
}
}, {
text: "Hours", flex: 1, dataIndex: 'hours', editor: { xtype: 'numberfield', minValue: 0 }
}, {
text: "Note", flex: 1, dataIndex: 'note',
editor: { allowBlank: true }
}],
columnLines: true,
enableLocking: true,
collapsible: false,
title: 'Expander Rows in a Collapsible Grid with lockable columns',
header: false,
emptyText: 'No data yet - please click on one of the tasks at the left',
iconCls: 'icon-grid',
margin: '0 0 20 0'
editor: { xtype: 'pocombotree', store: taskTreeStore, queryMode: 'local', displayField: 'project_name', valueField: 'id'}
},
// { text: "Date", xtype: 'datecolumn', dataIndex: 'day', renderer: Ext.util.Format.dateRenderer('Y-m-d'), editor: {xtype: 'datefield',allowBlank: true}},
{ text: "Mon", width: 50, dataIndex: 'hours', editor: { xtype: 'numberfield', minValue: 0 }},
{ text: "Tue", width: 50, dataIndex: 'hours', editor: { xtype: 'numberfield', minValue: 0 }},
{ text: "Wed", width: 50, dataIndex: 'hours', editor: { xtype: 'numberfield', minValue: 0 }},
{ text: "Thu", width: 50, dataIndex: 'hours', editor: { xtype: 'numberfield', minValue: 0 }},
{ text: "Fri", width: 50, dataIndex: 'hours', editor: { xtype: 'numberfield', minValue: 0 }},
{ text: "Sat", width: 50, dataIndex: 'hours', editor: { xtype: 'numberfield', minValue: 0 }},
{ text: "Sun", width: 50, dataIndex: 'hours', editor: { xtype: 'numberfield', minValue: 0 }},
// { text: "Note", flex: 1, dataIndex: 'note', editor: { allowBlank: true }}
]
});
// -----------------------------------------------------------------------
......@@ -149,7 +154,17 @@ function launchTimesheetWeeklyLogging(){
tooltip: '<%= [lang::message::lookup "" intranet-timesheet2-weekly.Delete_logging "Delete entry"] %>',
id: 'buttonDeleteEntry',
disabled: false
}
}, {
xtype: 'tbseparator'
}, {
xtype: 'datefield',
// anchor: '100%',
// fieldLabel: 'From',
name: 'from_date',
value: new Date(),
maxValue: new Date(),
format: "Y-W"
}
]
});
......@@ -165,27 +180,19 @@ function launchTimesheetWeeklyLogging(){
});
// -----------------------------------------------------------------------
// Controller for interaction between Tree and Grid
// Controller
//
Ext.define('PO.controller.timesheet.HourWeeklyController', {
extend: 'Ext.app.Controller',
// Variables
debug: true,
'selectedTask': null, // Task selected by selection model
'loggingTask': null, // contains the task on which hours are logged or null otherwise
'loggingStartDate': null, // contains the time when "start" was pressed or null otherwise
'loggingInterval': null, // the hour object created when logging
id: 'hourWeeklyController',
// Parameters
'renderDiv': null,
'hourButtonPanel': null,
'hourController': null,
'hourGrid': null,
debug: true,
hourButtonPanel: null,
hourController: null,
hourGrid: null,
// Setup the various listeners so that everything gets concentrated here on
// this controller.
// Setup the various listeners to receive events here
init: function() {
var me = this;
if (me.debug) { console.log('PO.controller.timesheet.HourWeeklyController: init'); }
......@@ -200,6 +207,10 @@ function launchTimesheetWeeklyLogging(){
me.hourGrid.on('edit', this.onGridEdit, me);
me.hourGrid.on('beforeedit', this.onGridBeforeEdit, me);
// Trying to crate a "change" event from the Project combo,
// but this didn't work. Now just hard-wiring...
var rowEditing = me.hourGrid.editingPlugin;
// Catch a global key strokes. This is used to abort entry with Esc.
// For some reaons this doesn't work on the level of the HourButtonPanel, so we go for the global "window"
Ext.EventManager.on(window, 'keydown', this.onWindowKeyDown, me);
......@@ -207,6 +218,27 @@ function launchTimesheetWeeklyLogging(){
return this;
},
/**
* The value of the Project field has changed in the RowEditing.
*/
onProjectChanged: function(projectId, combo, hourGrid) {
// Load taskTreeStore with new parameter
taskTreeStore.getProxy().extraParams = { project_id: projectId };
taskTreeStore.reload({
callback: function(records, operation, success) {
var me = this;
if (hourGrid.debug) console.log('PO.store.timesheet.TaskTreeStore: loaded');
if (!success) {
PO.Utilities.reportStoreError("TaskTreeStore", operation);
return;
}
var mainProjectNode = records[0];
mainProjectNode.set('sort_order','0');
me.setRootNode(mainProjectNode);
}
});
},
/*
* The user has double-clicked on the row editor in order to
......@@ -217,16 +249,13 @@ function launchTimesheetWeeklyLogging(){
console.log('GanttButtonController.onGridBeforeEdit');
console.log(context.record);
var endTime = context.record.get('interval_end_time');
if (typeof endTime === 'undefined' || "" == endTime) {
endTime = /\d\d:\d\d/.exec(""+new Date())[0];
context.record.set('interval_end_time', endTime);
}
// Return true to indicate to the editor that it's OK to edit
return true;
},
//
/**
* Gets called after finishing an edit using the "Update" button
*/
onGridEdit: function(editor, context) {
console.log('GanttButtonController.onGridEdit');
var rec = context.record;
......@@ -280,8 +309,8 @@ function launchTimesheetWeeklyLogging(){
// cancel hour logging with Esc key
if (27 == keyCode) {
// Cancel Edit
}
// Cancel Edit
}
if (46 == keyCode) { this.onButtonDeleteEntry(); }
},
......@@ -320,7 +349,6 @@ function launchTimesheetWeeklyLogging(){
var day = PO.Utilities.dateToPg(new Date());
var hour = new Ext.create('PO.model.timesheet.Hour', {
user_id: @current_user_id@,
// project_id: @project_id@,
day: day
});
......@@ -329,7 +357,7 @@ function launchTimesheetWeeklyLogging(){
},
onButtonDeleteEntry: function() {
var me = this;
var me = this;
console.log('GanttButtonController.ButtonDeleteLogging');
var buttonAddEntry = Ext.getCmp('buttonAddEntry');
......@@ -338,7 +366,7 @@ function launchTimesheetWeeklyLogging(){
// buttonDeleteEntry.enable();
rowEditing.cancelEdit();
var records = hourGrid.getSelectionModel().getSelection();
var records = hourGrid.getSelectionModel().getSelection();
// Not logging already - enable the "start" button
if (1 == records.length) { // Exactly one record enabled
var record = records[0];
......@@ -358,24 +386,7 @@ function launchTimesheetWeeklyLogging(){
var buttonAddEntry = Ext.getCmp('buttonAddEntry');
// Not logging already - enable the "start" button
if (1 == records.length) { // Exactly one record enabled
selectedTask = records[0]; // Remember which task is selected
var isLeaf = selectedTask.isLeaf();
buttonStartLogging.setDisabled(!isLeaf);
buttonAddEntry.setDisabled(!isLeaf);
// load the list of hours into the hourGrid
var projectId = selectedTask.get('id');
hourStore.getProxy().extraParams = {
query: 'project_id in (select p.project_id from im_projects p, im_projects main_p where main_p.project_id = '+projectId+' and p.tree_sortkey between main_p.tree_sortkey and tree_right(main_p.tree_sortkey))',
user_id: @current_user_id@,
format: 'json'
};
hourStore.load({
callback: function() {
console.log('PO.store.timesheet.HourWeeklyStore: loaded');
}
});
} else { // Zero or two or more records enabled
buttonStartLogging.setDisabled(true);
buttonAddEntry.setDisabled(true);
......@@ -457,7 +468,8 @@ function launchTimesheetWeeklyLogging(){
'hourGrid': hourGrid
});
hourController.init(this).onLaunch(this);
hourGrid.hourController = hourController; // Add reference to hourGrid
// Testing events
hourButtonPanel.fireEvent('keypress');
......@@ -498,7 +510,7 @@ Ext.onReady(function() {
stores: [
'hourStore',
'taskTreeStore',
'projectMainStore'
'projectMainStore'
],
listeners: {
load: function() {
......@@ -526,7 +538,7 @@ Ext.onReady(function() {
});
// Load stores that need parameters
hourStore.getProxy().extraParams = { project_id: @project_id@, user_id: @current_user_id@, format: 'json' };
hourStore.getProxy().extraParams = { user_id: @current_user_id@, format: 'json' };
hourStore.load({
callback: function() {
console.log('PO.store.timesheet.HourStore: loaded');
......
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