Archive for the 'eGroupWare' Category



03
Feb

working with grids

The last weeks while implementing the timetracker for Tine 2.0 we also developed new concepts for working with the grid view. Here is a little series of screenshots to demonstrate the cool workflow and userinterface we come up with.

filter01

Filter all timesheets from last month whoose timeaccount-numbers start with a certain string.

filter02

Select some Timesheets and mark them as billable too.

filter03

Add a filter to only find billable timesheets and select all 259 Timesheets which got found.

filter03

Now we export all selected timesheets as ODS to write our bill in Open Office

filter05

Finaly we again use mass update to mark all timesheets, found by our filter, as cleared and add in which bill we cleared them.

To avoid double billed timesheets, it would have been a good idea to filter for non cleared timesheets too ;-)

03
Nov

ExtJs Window Handling with Ext.ux.PopupWindow

In ExtJs application windows are created using the Ext.Window. These windows are some kind of a layer above the mainscreen having an nice looking chrome. The Ext.WindowManager keeps track about all windows and brings method to manage the windows. However, as these windows are no real browser windows (aka popups), they have some limitations.

  • Ext.Window’s have a different style than the native operating system windows. This may confuse users, especially those, not familiar with the technical background in web apps.
  • Ext.Window’s can’t be dragged out of the browsers viewport. Users with large or multiple screens will feel limited with those windows.
  • Users don’t want to have an extra window manager inside the normal operating systems window manager. Just look back to the ugly star-office approach, which we all hated.
As a consequence we decided to use native windows in Tine 2.0. However, dealing with native windows in a Javacript application turned out to be a non trivial thing. A new browser window brings a new javascipt context and we needed to find a way to bring our content into the new context. Also we needed to find a way how windows can communicate. The opener.location = opener.location from the good old Web 1.0 times obviously is not adequate any more ;-) . Thinking about offline functionality brought even more complexity to the system. When the Browser is offline, you need to create windows without any help of a server.
Solving this problem was one of the major goals in our current javascript re-factoring period. Finlay we came up with three user extensions to the ExtJS library.
  1. Ext.ux.PopupWindow which goes almost parallel to the Ext.Window
  2. Ext.ux.PopupWindowGroup which goes almost parallel to the Ext.WindowGroup
  3. Ext.ux.WindowFactory which is capable to factor Ext.Windows, Ext.ux.PopupWindows and Ext.air.NativeWindows
You can find the code in the Tine 2.0 svn repository. At the moment we have the following hard coded in our javascript bootstrap:
Tine.WindowFactory = new Ext.ux.WindowFactory({
    windowType: 'Browser'
});
If you change this to:
Tine.WindowFactory = new Ext.ux.WindowFactory({
windowType: 'Ext'
});

you’ll have a version of Tine with Ext.Windows.

     

The Air part is not tested yet, as I struggle with the hard coded ‘eval’ functions in the extjs code which break the security model of Adobe Air.

I’m not shure if we make use of Ext.Window in Tine. It may be a helpful config option for users with old browsers like IE6 which has an very slow javascript engine. When our re-factoring period has finished, we will even be able to create the windows offline.

08
Oct

Multi Time-Zone Fix for Ext.form.DateField

When testing the multi time-zone capabilities of Tine 2.0 I came across an interesting problem with the Ext.form.DateField.

The basic form handling in Extjs in like this.

  1. Render the from (e.g. the contact edit dialog).
  2. Get a Ext.data.Record (e.g. representing a contact).
  3. Update the form with the record data: All form properties having a corresponding property in the record will be set/updated.
  4. The user does his changes in the form (e.g. updating the name).
  5. Update the record from the form values: All record properties having a corresponding property in the form will be updated with the form data.

The last step always copies all the form values into the record, regardless of which properties actually got changes by the user. Normally this is no problem, as the value only changes if the user relay did changes. But the implementation of the DateField has a problem in a multi time-zone environment.

Imagine I myself update my birthday in my contact record. This is 1979/06/05. In fact this means by birthday was from 1979/06/05 00:00:00 to 1979/06/05 23:59:59 in the time-zone Europe/Berlin.

So what Tine 2.0 stores in its database is: 1979/06/04 22:00:00 UTC cause Europe/Berlin is UTC+2 when daylight saving time is active. This means in UTC my birthday was from 1979/06/04 22:00:00 to 1979/06/05 21:59:59.

Unfortunately the Ext.dateField has no clue about time-zones or time-shifts. It just deals with dates, e.g. (Y-m-d).

So when my contact record gets updated from someone living in UTC time-zone, the DateField gets filled with 1979/06/04 22:00:00 (step 3). When user changes something and saves changes (step 4) it just return 1979/06/04 (step 5) even though the user didn’t actually change my birthday.

As result, the Tine 2.0 server sees a change in the birthday property from

1979/06/04 22:00:00 UTC to 1979/06/05 00:00:00 UTC which is obviously wrong, as this is not my correct birthday!

As a quick fix for the Ext.form.DateField we now preserve the time when the user does not change the date field. This is the fix I added to our Ext fixes code. Note, you need to include this after the Extjs library, but before your application code.

  1. /**
  2.  * fix timezone handling for date picker
  3.  *
  4.  * The getValue function always returns 00:00:00 as time. So if a form
  5.  * got filled with a date like 2008-10-01T21:00:00 the form returns
  6.  * 2008-10-01T00:00:00 although the user did not change the fieled.
  7.  *
  8.  * In a multi timezone context this is fatal! When a user in a certain
  9.  * timezone set a date (just a date and no time information), this
  10.  * means in his timezone the time range from 2008-10-01T00:00:00
  11.  * to 2008-10-01T23:59:59. _BUT_ for an other user sitting in a
  12.  * different timezone it means e.g. the time range from
  13.  * 2008-10-01T02:00:00 to 2008-10-02T21:59:59.
  14.  *
  15.  * So on the one hand we need to make shure, that the date picker
  16.  * only returns changed datetime information when the user did a
  17.  * change.
  18.  */
  19.  
  20. /**
  21.  * @private
  22.  */
  23. Ext.form.DateField.prototype.setValue = function(date){
  24.     // preserv original datetime information
  25.     this.fullDateTime = date;
  26.     Ext.form.DateField.superclass.setValue.call(this,
  27.     this.formatDate(this.parseDate(date)));
  28. };
  29.  
  30. /**
  31.  * @private
  32.  */
  33.     Ext.form.DateField.prototype.getValue = function(){
  34.     //var value = this.parseDate(Ext.form.DateField.superclass.getValue.call(this));
  35.  
  36.     // return the value that was set (has time information when unchanged in client)
  37.     // and not just the date part!
  38.     value =  this.fullDateTime;
  39.     return value || "";
  40. };
29
Sep

Community and the User Centric Development Process

As announced earlier this year, we are in the process of getting the Tine 2.0s development process being certified according to ISO 13407.

For this, we need to specify and document the development process from the users point of view. This is a bit challenging, as we found no other open source project to learn from, already being certified.

In closed source software projects, there is no community and as such no community is being described in the development process. However, in a open source project, the community plays a crucial role, and this must be reflected in any process documentation!

But what is the part of the community when talking about usability and a user centric development process?

Normally community members have quite a deep understanding of the software and moreover are (highly) technically affine people. Considering this, they are not suited as test persons when it comes to learn-ability of the software.

But when it comes to productivity the community suites just perfect. This are the people using Tine 2.0 on a daily bases. Here we can get highly qualified feedback how Tine is enhancing and decreasing their productivity. This kind of feedback is extremely helpful for usability experts.

Also for the conceptual phase of new features, the technically educated community is a major advantage of open source projects. Collecting the brilliant ideas of the admins an superusers out there is a perfect source for architectureing new concepts.

An other great way the community can help are automated online tests.  Björn and his team is working on an icon matching tool and other simple tests for normal users (including our john smith persona). Automated tests need a large number of test persons to have expressing results. Again this fits the community approach.

So far our current ideas, how to include community in the user centric development process. If you have more ideas, please let us know!

28
Aug

Spacegallery Implementation in ExtJS

Yesterday I had a short discussion with a colleague of our front-end/website team. We had a look a gallery implementation made in JQuery.  He wanted to have a similar animation like the rezise/move/fadeout animation when an image gets clicked in this gallery.

The question was how hard it would be to implement such an animation. My short answer was: “I guess this is about 5 lines of code”. Well, I have never worked with JQuery and animation in general, and after looking into the code I realized, that JQuery seems to differ conceptually a lot from ExtJS.

However a few weeks ago I roughly scanned the docs of Ext.Fx. This is a small but very powerful Effect class in ExtJS. Many people think, ExtJS is ‘just’ suited for Web-Apps with a look similar to the Tine 2.0 look. But this is not the whole truth. ExtJS is also a general purpose JS Library with also comes with great animation and effects support.

As you can see bellow, I couldn’t resist to implement a spacegallery using ExtJS. The code for all animations, not only the animation of the top Image, is just 4 Lines of code:

onImageClick: function(e, dom) {
this.imageEls[0].shift(this.fadeOutPerspectiveData);
for(var n=1; n this.imageEls[n].shift(this.perspectiveData[n-1]);
}
this.cycleStack();
},

Ok, it's a matter of interpretation if you count the single "}" line :-) .

26
Aug

First Translations for Tine 2.0

After the german translations of Tine, which are provided by the core developers team, now the first contributed translations are integrated.

We are quite glad that we already have translators for russian, bulgarian, french, italian, polish and simplified chinese even before we started to ask actively for translations.

Specially I’d like to thank Ilya Yurkovetskiy, for the russian translation and the help to locate areas where the plural forms in the templates needed to be improved.

Unlike English and German, the Russian language has 3 plural forms. The first for e.g. 1, the second for e.g. 2 and the third for e.g. 5 items of a thing.

Also the cyrillic letters help to identify strings not in the translation system yet.

I set up a language statistics page here, to track the state of each translation. After Release of the next milestone we will start a call for translations.

22
Aug

Version 0.4 of jsdoc-tk-ext

Finally, after Tine 2.0′s Milestone 2 is released, I found some time to upgrade the jsdoc-tk-ext package which now comes in version 0.4.

Thanks to contributions from the ExtJS-Forums documentation of Ext.ux classes is greatly improved. Moreover I spend some time to ease invocation of the toolkit.

The Tine 2.0 JS API Documentation got generated with a simple:
~/jsdoc$ java -jar jsrun.jar app/main.js -H='Tine 2.0 JS API Documentation' -r  ../tine20

Changes in Detail:

  • make it running with windows (thanks Sierk)
  • include return comments (thanks Sierk)
  • allow to use shortcuts for @cfg in ExtJS doc style (thanks duralabh)
  • allow to specify config options for undefined properties (thanks duralabh)
  • allow to use new config format for properties and config (thanks duralabh)
  • use exjs logo (requested by jack slocum)
  • allow to document classes which are defined into global namespace (thanks SamuraiJack1)
  • set ext template as default 
  • include a copy of extjs
  • remove dumper dependencies
  • make headline configurable
  • some code cleanup
14
Aug

Will DateTime abstraction come to Zend_Db?

In my view, the lack of proper date-time abstraction in the Zend_Db component is the most missing core feature in Zend Framework as any Database Brand expects date-time informations in a different representation.

However in Zend Framework date-time data are greatly abstracted via the Zend_Date component with full Time-zone support!

But when it comes to Zend_Db, this abstraction is of no use, as the component expects data for date-time fields in the db’s native representation.

There is a open issue in the Zend Tracker about this topic. The scheduled fix war for 0.8.0 release :-) .

Well, never give up Hope is the credo. The issue got updated 3 days ago, setting the target version again to next minor release. 

Lets all keep finger crossed, as the inclusion of this feature would greatly help to finish the Oracle Back-end of Tine 2.0.

10
Jul

New Subversion Server for Tine 2.0

Yesterday we moved the Tine 2.0 subversion repository to a brand new Sun Xfire 2100 located in one of the Metaways data centers.

With a connection bandwidth of 1000 Mbit/s, NAS, Automatic Tape Backups and all the other blessings of professional data center, it’s quite a neat home for our soucecode ;-)

Commit times of the old sourceforge repository where about 15 seconds. On bad days we had to wait up to a minute for a single commit.

With the new Server it is now done in about a second!.

16
Jun

To MVC or not to MVC?

Anybody speaks about the MVC pattern these days. When designing the Tine 2.0 application and api structure we also thought about implementing it with the standard MVC pattern.

While the clean 3-tier layout of the MVC pattern is crucial for business applications the MVC pattern brings some limitations we solved with small extensions to the pattern.

Single Page Application
Tine 2.0 is a so called ”’Single Page Application (SPA)”’. This means anything is served from a single URL, the index.php. If a login screen is shown or if a application does a complex transactional operation, it’s always handled by the index.php.

This layout simplifies the application flow dramatically, as there is no need to figure out the required controllers/actions by the url and there is no need to define rewrite rules. As a consequence we don’t use a traditional front controller and only have a light-way dispatcher in the index.php.

Service Orientated Architecture
Tine 2.0 has a service orientated architecture. The normal ”views” in MVC apps are perfectly sweetet for ”HTML output”. However the Tine 2.0 server returns almost no HTML, but is capable to serve the needed data in various representations. Moreover it also receives its actions and data also via various representations.

As a consequence Tine 2.0 applications normally don’t have view’s, but they have server classes, e.g a JSON class. This server classes handle all the input and output conversions from and to the the requested format, e.g. JSON.

Multi Back-end Capable
The Tine 2.0 application pattern is designed to support multiple back-ends. This means that the applications records store could be of totally different types. A simple example is the Address-book. It’s contacts can come from a SQL back-end or from a LDAP back-end.

In the standard MVC pattern the models do the persistence operations on a single persistence instance, which normally means they do all the SQL database handling. This does not fit the Tine 2.0 multi back-end requirement.

As a consequence the Tine 2.0 models are just simple data containers and have nothing to do with persistence. Controller store and get those simple models via the back-end classes which hide the complexity of the different physical back-ends by implementing a simple public interface.

Find out more about the Tine 2.0 application layout in our wiki.