In a new project there is a table for storing tasks. Next to information like "Subject" or "Due date" we store date time values for...
- When did the creator assign the task to an employee
- When did the assignee start working on that task
- When did the assignee finish the task
Later on we can use those datetime values for calculating average runtimes. Im showing the steps I took to optimize the user interface by using AppGini Helper JavaScript library functions.
Table of Contents
Start: Default generated form
This is the default tasks detail view form. All fields have been aligned vertically.
Step 1: Adding tabs
In the first step I have added custom tabs to the details view form and moved the fields there:
var dv = AppGiniHelper.DV; var tabTask = dv.addTab("tabTask", "Task", "wrench"); // todo: i18n var tabRef = dv.addTab("tabRef", "Rerefence", "link"); // todo: i18n var tabProgress = dv.addTab("tabProgress", "Progress", "time"); // todo: i18n var tabMeta = dv.addTab("tabMeta", "Meta", "info"); // todo: i18n var metaFields = new AppGiniFields(["id", "created_by", "created_on", "modified_by", "modified_on"]); var taskFields = new AppGiniFields(["status_icon", "subject", "contents", "duedate", "is_active", "status_id", "assigned_to"]); var referenceFields = new AppGiniFields(["partner_id", "project_id", "contact_id"]); var progressFields = new AppGiniFields(["assigned_on", "assigned_by", "started_on", "started_by", "finished_on", "finished_by"]); tabMeta.add(metaFields); tabTask.add(taskFields); tabRef.add(referenceFields); tabProgress.add(progressFields);
Step 2: Readonly fields
Two fields will be calculated automatically by code as soon as the creator assigns the task to an employee (assignee). So I disable those fields by code like this:
new AppGiniFields(["assigned_on", "assigned_by"]) .readonly();
Step 3: Inlining fields
As you can see, those 6 fields are always paired. There is a datetime-field and as employee-field. Using the .inline function I can place each pair in a row.
new AppGiniFields(["assigned_on", "assigned_by"]).inline("Assignment") // todo: i18n new AppGiniFields(["started_on", "started_by"]).inline("Start"); // todo: i18n new AppGiniFields(["finished_on", "finished_by"]).inline("End"); // todo: i18n
Step 4: Optimize “broken” alignment
As you can see in the previous screenshot this works pretty well except the vertical alignment of the lookups:
This comes from a padding setting in the default stylesheet. Using a little css setting we can change the padding:
$j(".form-control-static").css("padding", 0);
That's it. I'm satisfied with the layout now. Here is the complete code and result:
new AppGiniField("id").hide(); var dv = AppGiniHelper.DV; var tabTask = dv.addTab("tabTask", "Task", "wrench"); // todo: i18n var tabRef = dv.addTab("tabRef", "Rerefence", "link"); // todo: i18n var tabProgress = dv.addTab("tabProgress", "Progress", "time"); // todo: i18n var tabMeta = dv.addTab("tabMeta", "Meta", "info"); // todo: i18n var metaFields = new AppGiniFields(["id", "created_by", "created_on", "modified_by", "modified_on"]); var taskFields = new AppGiniFields(["status_icon", "subject", "contents", "duedate", "is_active", "status_id", "assigned_to"]); var referenceFields = new AppGiniFields(["partner_id", "project_id", "contact_id"]); var progressFields = new AppGiniFields(["assigned_on", "assigned_by", "started_on", "started_by", "finished_on", "finished_by"]); tabMeta.add(metaFields); tabTask.add(taskFields); tabRef.add(referenceFields); tabProgress.add(progressFields); var calcFields = new AppGiniFields(["waitingtime", "processingtime", "runtime"]).inline(); tabMeta.add(calcFields); new AppGiniFields(["assigned_on", "assigned_by"]) .readonly(); new AppGiniFields(["assigned_on", "assigned_by"]).inline("Assignment") // todo: i18n new AppGiniFields(["started_on", "started_by"]).inline("Start"); // todo: i18n new AppGiniFields(["finished_on", "finished_by"]).inline("End"); // todo: i18n $j(".form-control-static").css("padding", 0);