#summary Tracks progress for the GSoC 2011 project, GUI Overhaul (Fronted and Administration Interfaces)

<wiki:toc max_depth="3" />


= Introduction =

This page will track progress of the GSoC 2011 project, GUI Overhaul (Fronted and Administration Interfaces).
----

= Details =

The first tasks will be gathering some requirements from Melange administration. We have gathered following requirements from Carol:
 * Enhance administration dashboard
 * Withdraw/accept students from administration dashboard, even after the students with projects has been announced.
 * Make the regular dashboard more usable both in how the list requested and rendered

I also came up with following additional ideas to enhance Melange:
 * Adding breadcrumb. See Jacob Nielsen's article on how [http://www.useit.com/alertbox/breadcrumbs.html breadcrumb navigation increasingly useful].
 * Adding Cluster Map for program administrator. With this feature, program administrator can see all participants location in a single map or even get information/profile for a participant by clicking at the marker.
 * Upload handler for organization's logo. Currently, organizations need to provide a link to theirs logo's url.

----

= Iconic Dashboard Architecture =

Iconic dashboard basically is a chunk of template, or a Django view that will be rendered as a partial HTML. Specifically, the view will be rendered as a collection of links that either nested (link to another block/div in the same page) or linked to another page. Iconic dashboard consists of:
 * Django view (app/soc/views/dashboard.py). Classes in this view are not supposed to be instantiated directly, where each class acts as a base class. To implement iconic dashboard at least one derived class must be created.
 * Djano template (app/soc/templates/v2/soc/dashboard/*)

Lets say you want a GSoC view named dummy_dashboard (which is in app/soc/modules/gsoc/views/dummy_dashboard.py) implements iconic dashboard. First you need to import the base class of dashboard:

{{{
...
from soc.views.dashboard import Dashboard
from soc.views.dashboard import DashboardUserActions
...
}}}

If the dummy_dashboard needs to render list component (such as in the participant dashboard), then Component class must be imported too.

<code language="python">
...
from soc.views.dashboard import Dashboard
from soc.views.dashboard import DashboardUserActions
...
</code>

Given use cases of GSoC program below on how to alter the dashboard will give you an understanding how the dashboard works.

<code language="python">
...
from soc.views.dashboard import Component
from soc.views.dashboard import Dashboard
from soc.views.dashboard import DashboardUserActions
...
</code>


== Iconic Dashboard Use Case in Admin Dashboard (GSoC) ==


== Iconic Dashboard Use Case in Participant Dashboard (GSoC) ==

----

= Meetings and Agendas =

== May 10, 2011 ==

=== My result reported in this meeting: ===
Not yet

=== Meeting notes, copying from Leo's note: ===
 * Set up and run an online GAE instance before Thursday with your "View" from the first week.
 * Write a blog post about it (and other work you've done) before next Monday so it can be reviewed before our conference call.
 * Create a wiki page on Melange wiki for recording the progress of your project.
 * Plan a meeting with your mentor and add notes to your OWN project wiki page.

=== My plan for next week: ===

 * I've set a live instance at http://akeda-melange.appspot.com
 * Started writing wiki page to track my project's progress
 * I'm planning to refactor melange.map.js to be more generic. As Mario has said the current status of melange.map.js functionalities is not supposed to be. It only provides map to organization home page. Other pages, such as profile and read only profile, have their own js files which, basically, have common usage of Google Maps API. The refactored melange.map.js should handle all maps functionalities, including my proposed function for MarkerClusterer.
 * Upload and crop features for org logo.
----

== May 16, 2011 ==

=== My result reported in this meeting: ===
 * I am working to make melange.map.js more generic, so it can be used by profile page as well, or maybe other pages that need to render maps.
 * I am also working to add breadcrumb and highlighted mainmenu in currently visited page

=== Meeting notes: ===
Copying from Lennie's note:
Daniel and Akeda will meet with Carol on Wednesday using Skype to brainstorm about their project.

=== My plan for next week: ===
 * Submit my code for breadcrumb functionalities to get any feedback
 * Prepare talking with Carols about her needs
----

== May 18, 2011 (Requirement gathering) ==

=== My result reported in this meeting: ===
Not yet

=== Meeting notes: ===
 * If we're login as a host and view the dashboard (My Dashboard), we will see the page overloaded by Jqgrid list. Carol wants the list is grouped. Akeda has suggestion to group the list by tabs.
 * When students with project announced, there might be a student consider himself ineligible to participate. If Carol rejects that student, there will be available slot to accept another student that already rejected. Carol needs this feature to withdraw / accept student in her dashboard.
 * Carol needs the Admin dashboard to be enhanced.

=== My plan for next week: ===
 * Create mockups for the Dashbord page with tabs to group the list
 * Create mockups for the withdraw/accept students manually after students announced period
 * I'm planning to give the mockups by Saturday so everyone can give feedbacks
 * I will implement this feature after everyone agree with the mockups.
----

== May 26, 2011 (Requirement gathering) ==

=== My result reported in this meeting: ===
Not yet

=== Meeting notes: ===
 * Akeda is working on redesigning dashboard. Lennie reminded him that there are two dashboards that Carol is faced with. One allows administrative functionality like sending out reminder emails while the other represents not only Carol's role as a Organization Admin for GOSPO but also gives more information than the regular dashboards for other users. The focus should be on improving the usability and functionalities that are exposed to Carol in her daily job as Program Administrator.

=== My plan for next week: ===
 * Contact Carol and Daniel to discuss the requirements briefly
----

== May 30, 2011 (Requirement gathering) ==

=== My result reported in this meeting: ===
See the notes at Google Wave, https://wave.google.com/wave/waveref/googlewave.com/w+mdcpD6vmC

=== Meeting notes: ===
 * Meeting was canceled. Notes recorded in Google Wave at https://wave.google.com/wave/waveref/googlewave.com/w+mdcpD6vmC

=== My plan for next week: ===
 * Give updated mockup and if possible with the implementation.
----

== Jun 06, 2011 (Toggleable list) ==

=== My result reported in this meeting: ===
See the notes at Google Wave, 
https://wave.google.com/wave/waveref/googlewave.com/w+P8uYzs7_C

=== Meeting notes: ===
 * Akeda is working on admin dashboard and regular dashboard's improvement. He will implement toggleable list and ask Mario questions/advice about the JS portion for list. The toggleable list is provided in a mockup at http://demo.gedex.web.id/melange_mockup/my-dashboard-toggleable.html
 * Notes recorded in Google Wave at https://wave.google.com/wave/waveref/googlewave.com/w+mdcpD6vmC

=== My plan for next week: ===
 * Implement toggleable list and start working on admin dashboard.
----

== Jun 13, 2011 (Toggleable list) ==

=== My result reported in this meeting: ===
I've posted the toggleable list patch to melange-soc-dev. The toggleable list is works by set the context of toggleable and collapse on component based class in app/soc/modules/gsoc/views/dashboard.py. If we set both toggleable and collapse to True, then the list wouldn't requested by the JS, but it updates the list_configurations variable with idx as its key. We still can make the list requested on the first load by ignoring toggleable and collapse context. With this approach, other list such as accecpted_orgs wouldn't affected.

=== Meeting notes: ===
 * Not yet

=== My plan for next week: ===
 * Not yet
----