[DG: User Experience] Discussions Widget Patch

View: New views
2 Messages — Rating Filter:   Alert me  

[DG: User Experience] Discussions Widget Patch

by Adrian Fish :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi all,

For exploration's sake I've merged the minimal view code from yaft into
uxwidgets, and it works okay. I've attached the patch if anybody wants
to try it out. Just layer it into your ux directory and, if you're using
the file resource provider in Sling, you should just be able to refresh
and pick up the changes.

Cheers,

Adrian.

--
==================================
Adrian Fish
Software Engineer
Centre for e-Science
Bowland Tower South C Floor
Lancaster University
Lancaster
LA1 4YW
email: a.fish@...

http://confluence.sakaiproject.org/display/YAFT/Yaft
http://confluence.sakaiproject.org/display/BLOG/Home
http://confluence.sakaiproject.org/display/AGORA/Home


Index: uxwidgets/src/main/webapp/discussion/javascript/discussion.js
===================================================================
--- uxwidgets/src/main/webapp/discussion/javascript/discussion.js (revision 67246)
+++ uxwidgets/src/main/webapp/discussion/javascript/discussion.js (working copy)
@@ -131,6 +131,8 @@
     // Template
     var discussionContainerTemplate = "discussion_container_template";
     var discussionSettingsExistingContainerTemplate = "discussion_settings_existing_container_template";
+    var discussionCompactContainerTemplate = "discussion_compact_container_template";
+    var discussionPostTemplate = "discussion_post_template";
     
     // Toggle
     var discussionToggle = discussion + "_toggle";
@@ -386,6 +388,21 @@
     //////////////////////
     // DISPLAYING POSTS //
     //////////////////////
+
+ var bindShowCurrentPostHandlers = function(post,loggedIn) {
+
+ $('#post_' + post.post["sakai:id"]).bind('click', post,function(e, ui) {
+       e.data["loggedIn"] = loggedIn;
+       e.data["first"] = false;
+       $('#' + tuid + ' #discussion_current_post').html($.Template.render(discussionPostTemplate, e.data));
+ $('.messageCursor').hide();
+ $('#post_' + post.post["sakai:id"] + '_cursor').show();
+ });
+
+ for(var i=0;i<post.replies.length;i++) {
+ bindShowCurrentPostHandlers(post.replies[i],loggedIn);
+ }
+ }
     
     /**
      * Render the discussion posts
@@ -394,6 +411,26 @@
     var renderPosts = function(jsonPosts) {
         // Render the posts with the template engine
         $(discussionContainer, rootel).html($.Template.render(discussionContainerTemplate, jsonPosts));
+
+        // Add binding to the compact link
+        $('#discussion_compact_link').bind('click', function(e, ui) {
+       $(discussionContainer, rootel).html($.Template.render(discussionCompactContainerTemplate, jsonPosts));
+         // Add binding to the full link
+         $('#discussion_full_link').bind('click', function(e, ui) {
+ renderPosts(jsonPosts);
+ });
+
+ // Render the first post into the current post area
+       jsonPosts.posts[0]["loggedIn"] = jsonPosts.loggedIn;
+       jsonPosts.posts[0]["first"] = true;
+       $('#' + tuid + ' #discussion_current_post').html($.Template.render(discussionPostTemplate, jsonPosts.posts[0]));
+ $('.messageCursor').hide();
+ $('#post_' + jsonPosts.posts[0].post["sakai:id"] + '_cursor').show();
+
+ for(var i=0;i<jsonPosts.posts.length;i++) {
+ bindShowCurrentPostHandlers(jsonPosts.posts[i],jsonPosts.loggedIn);
+ }
+        });
     };
     
     /**
Index: uxwidgets/src/main/webapp/discussion/discussion.html
===================================================================
--- uxwidgets/src/main/webapp/discussion/discussion.html (revision 67246)
+++ uxwidgets/src/main/webapp/discussion/discussion.html (working copy)
@@ -4,12 +4,100 @@
 <!-- MAIN VIEW -->
 <div id="discussion_main_container" style="display:none">
  <h3>Discussion</h3>
+
+ <div id="discussion_post_template" style="display:none"><!--
+ <div class="discussion_post" id="discussion_post${post["sakai:postid"]}">
+ <div class="discussion_header">
+ <div class="discussion_left">
+ {if loggedIn}
+ {if post.profile.picture !== ""}
+ <img alt="avatar" class="discussion_avatar" src="${post.profile.picture}" />
+ {else}
+ <img alt="avatar" class="discussion_avatar" src="/dev/_images2/person_icon.jpg " />
+ {/if}
+ <p class="discussion_content_subject" id="discussion_content_subject_${post["sakai:id"]}" style="margin-bottom: 0px; font-size: 1.2em">${post["sakai:subject"]}</p>
+ <a href="/dev/profile.html?user=${post["sakai:from"]}"><span class="discussion_username">${post.profile.fullName}</span></a>
+ <span class="discussion_date">posted this on ${post.date}</span>
+ {else}
+ <span class="discussion_posted_container">
+ <span class="discussion_date">Posted on ${post.date}</span>
+ </span>
+ {/if}
+ {if post.editters !== undefined}
+ <br />
+    <a href="/dev/profile.html?user=${post.editedByUserid}"><span class="discussion_username_edited">${post.editedByName}</span></a>
+ <span class="discussion_date">edited this on ${post.editedByDate}</span>
+ {/if}
+ </div>
+ </div>
+ <div class="discussion_content">
+ <div id="discussion_content_container_${post["sakai:id"]}">
+ {if post["sakai:deleted"] && post["sakai:deleted"] === true}
+ <p class="discussion_content_infoDeleted">This post has been deleted. Only site collaborators can see this post.
+ {if post.canDelete && post.canDelete === true}
+ <br />You can return it by clicking the undelete link.
+ {/if}
+ </p>
+ {/if}
+ <div id="discussion_content_message_${post["sakai:id"]}">${post["sakai:body"]}</div>
+ </div>
+ {if loggedIn}
+ <div id="discussion_content_actions_${post["sakai:id"]}" class="discussion_content_actions link">
+ <ul>
+ <li class="discussion_content_no_border"><a id="discussion_content_reply_${post["sakai:id"]}" class="discussion_content_reply" href="javascript:;">Reply</a></li>
+ {if post.canEdit}
+ <li><a id="discussion_content_edit_${post["sakai:id"]}" class="discussion_content_edit" href="javascript:;">Edit</a></li>
+ {/if}
+ {if post.canDelete && first !== true && post["sakai:initialpost"] !== true}
+ {if post["sakai:deleted"]}
+ <li><a id="discussion_content_undelete_${post["sakai:id"]}" class="discussion_content_undelete" href="javascript:;">Undelete</a></li>
+ {else}
+ <li><a id="discussion_content_delete_${post["sakai:id"]}" class="discussion_content_delete" href="javascript:;">Delete</a></li>
+ {/if}
+ {/if}
+ </ul>
+ </div>
+ {/if}
+ </div>
+ </div>
+ --></div>
+
+ <div id="discussion_compact_container_template" style="display:none"><!--
+ <a id="discussion_full_link" href="#" title="Click to view the expanded version of this discussion">Full</a>
+ <br />
+ <br />
+ <div id="discussion_current_post"></div>
+
+ <br />
+
+ {macro displayPost(o,first)}
+ <div>
+ <a href="#" id="post_${o.post["sakai:id"]}"><span style="font-weight: bold">${o.post["sakai:subject"]}</span></a> - <span>by ${o.post.profile.fullName}</span> on <span>${o.post.date}</span>
+ <img style="display:none" class="messageCursor" id="post_${o.post["sakai:id"]}_cursor" src="/dev/_images/arrow_left_sm2_blue.gif" width="5" height="9"/>
+ </div>
+
+ <div class="discussion_posts">
+ {for reply in o.replies}
+ ${displayPost(reply,false)}
+ {/for}
+ </div>
+ {/macro}
 
+ {if posts.length == 0}
+ No posts yet.
+ {else}
+ ${displayPost(posts[0], true)}
+ {/if}
+ --></div>
+
  <!-- MAIN CONTAINER FOR DISCUSSIONS -->
  <div id="discussion_container">
 
  </div>
  <div id="discussion_container_template" style="display:none"><!--
+ <a id="discussion_compact_link" href="#" title="Click to view a compact version of this discussion">Compact</a>
+ <br />
+ <br />
  {macro displayPost(o, first)}
 
  <div class="discussion_post" id="discussion_post${o.post["sakai:postid"]}">
@@ -177,4 +265,4 @@
 </div>
 
 <!-- JAVASCRIPT -->
-<script type="text/javascript" language="JavaScript" src="/devwidgets/discussion/javascript/discussion.js"></script>
\ No newline at end of file
+<script type="text/javascript" language="JavaScript" src="/devwidgets/discussion/javascript/discussion.js"></script>

[a_fish.vcf]

begin:vcard
fn:Adrian Fish
n:Fish;Adrian
org:Lancaster University;Centre for e-Science
adr:Lancaster University;;Bowland Tower South C Floor;Lancaster;;LA1 4YT;United Kingdom
email;internet:a.fish@...
title:Software Engineer
url:http://agora.lancs.ac.uk
version:2.1
end:vcard



_______________________________________________
sakai-ux mailing list
sakai-ux@...
http://collab.sakaiproject.org/mailman/listinfo/sakai-ux

TO UNSUBSCRIBE: send email to sakai-ux-unsubscribe@... with a subject of "unsubscribe"

Re: [DG: User Experience] Discussions Widget Patch

by Adrian Fish :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi All,

Fixed a few bugs in the previous patch, so if you want to try out a
minimal discussion view, use the patch attached here.

Cheers,

Adrian.

Adrian Fish wrote:

> Hi all,
>
> For exploration's sake I've merged the minimal view code from yaft
> into uxwidgets, and it works okay. I've attached the patch if anybody
> wants to try it out. Just layer it into your ux directory and, if
> you're using the file resource provider in Sling, you should just be
> able to refresh and pick up the changes.
>
> Cheers,
>
> Adrian.
>
> _______________________________________________
> sakai-ux mailing list
> sakai-ux@...
> http://collab.sakaiproject.org/mailman/listinfo/sakai-ux
>
> TO UNSUBSCRIBE: send email to sakai-ux-unsubscribe@... with a subject of "unsubscribe"
--
==================================
Adrian Fish
Software Engineer
Centre for e-Science
Bowland Tower South C Floor
Lancaster University
Lancaster
LA1 4YW
email: a.fish@...

http://confluence.sakaiproject.org/display/YAFT/Yaft
http://confluence.sakaiproject.org/display/BLOG/Home
http://confluence.sakaiproject.org/display/AGORA/Home


Index: uxwidgets/src/main/webapp/discussion/javascript/discussion.js
===================================================================
--- uxwidgets/src/main/webapp/discussion/javascript/discussion.js (revision 67246)
+++ uxwidgets/src/main/webapp/discussion/javascript/discussion.js (working copy)
@@ -131,6 +131,8 @@
     // Template
     var discussionContainerTemplate = "discussion_container_template";
     var discussionSettingsExistingContainerTemplate = "discussion_settings_existing_container_template";
+    var discussionCompactContainerTemplate = "discussion_compact_container_template";
+    var discussionPostTemplate = "discussion_post_template";
     
     // Toggle
     var discussionToggle = discussion + "_toggle";
@@ -386,6 +388,21 @@
     //////////////////////
     // DISPLAYING POSTS //
     //////////////////////
+
+ var bindShowCurrentPostHandlers = function(post,loggedIn) {
+
+ $('#post_' + post.post["sakai:id"]).bind('click', post,function(e, ui) {
+       e.data["loggedIn"] = loggedIn;
+       e.data["first"] = false;
+       $('#' + tuid + ' #discussion_current_post').html($.Template.render(discussionPostTemplate, e.data));
+ $('#' + tuid + ' .messageCursor').hide();
+ $('#post_' + post.post["sakai:id"] + '_cursor').show();
+ });
+
+ for(var i=0;i<post.replies.length;i++) {
+ bindShowCurrentPostHandlers(post.replies[i],loggedIn);
+ }
+ }
     
     /**
      * Render the discussion posts
@@ -394,6 +411,26 @@
     var renderPosts = function(jsonPosts) {
         // Render the posts with the template engine
         $(discussionContainer, rootel).html($.Template.render(discussionContainerTemplate, jsonPosts));
+
+        // Add binding to the compact link
+        $('#' + tuid + ' #discussion_compact_link').bind('click', function(e, ui) {
+       $(discussionContainer, rootel).html($.Template.render(discussionCompactContainerTemplate, jsonPosts));
+         // Add binding to the full link
+         $('#' + tuid + ' #discussion_full_link').bind('click', function(e, ui) {
+ renderPosts(jsonPosts);
+ });
+
+ // Render the first post into the current post area
+       jsonPosts.posts[0]["loggedIn"] = jsonPosts.loggedIn;
+       jsonPosts.posts[0]["first"] = true;
+       $('#' + tuid + ' #discussion_current_post').html($.Template.render(discussionPostTemplate, jsonPosts.posts[0]));
+ $('#' + tuid + ' .messageCursor').hide();
+ $('#post_' + jsonPosts.posts[0].post["sakai:id"] + '_cursor').show();
+
+ for(var i=0;i<jsonPosts.posts.length;i++) {
+ bindShowCurrentPostHandlers(jsonPosts.posts[i],jsonPosts.loggedIn);
+ }
+        });
     };
     
     /**
Index: uxwidgets/src/main/webapp/discussion/discussion.html
===================================================================
--- uxwidgets/src/main/webapp/discussion/discussion.html (revision 67246)
+++ uxwidgets/src/main/webapp/discussion/discussion.html (working copy)
@@ -4,12 +4,100 @@
 <!-- MAIN VIEW -->
 <div id="discussion_main_container" style="display:none">
  <h3>Discussion</h3>
+
+ <div id="discussion_post_template" style="display:none"><!--
+ <div class="discussion_post" id="discussion_post${post["sakai:postid"]}">
+ <div class="discussion_header">
+ <div class="discussion_left">
+ {if loggedIn}
+ {if post.profile.picture !== ""}
+ <img alt="avatar" class="discussion_avatar" src="${post.profile.picture}" />
+ {else}
+ <img alt="avatar" class="discussion_avatar" src="/dev/_images2/person_icon.jpg " />
+ {/if}
+ <p class="discussion_content_subject" id="discussion_content_subject_${post["sakai:id"]}" style="margin-bottom: 0px; font-size: 1.2em">${post["sakai:subject"]}</p>
+ <a href="/dev/profile.html?user=${post["sakai:from"]}"><span class="discussion_username">${post.profile.fullName}</span></a>
+ <span class="discussion_date">posted this on ${post.date}</span>
+ {else}
+ <span class="discussion_posted_container">
+ <span class="discussion_date">Posted on ${post.date}</span>
+ </span>
+ {/if}
+ {if post.editters !== undefined}
+ <br />
+    <a href="/dev/profile.html?user=${post.editedByUserid}"><span class="discussion_username_edited">${post.editedByName}</span></a>
+ <span class="discussion_date">edited this on ${post.editedByDate}</span>
+ {/if}
+ </div>
+ </div>
+ <div class="discussion_content">
+ <div id="discussion_content_container_${post["sakai:id"]}">
+ {if post["sakai:deleted"] && post["sakai:deleted"] === true}
+ <p class="discussion_content_infoDeleted">This post has been deleted. Only site collaborators can see this post.
+ {if post.canDelete && post.canDelete === true}
+ <br />You can return it by clicking the undelete link.
+ {/if}
+ </p>
+ {/if}
+ <div id="discussion_content_message_${post["sakai:id"]}">${post["sakai:body"]}</div>
+ </div>
+ {if loggedIn}
+ <div id="discussion_content_actions_${post["sakai:id"]}" class="discussion_content_actions link">
+ <ul>
+ <li class="discussion_content_no_border"><a id="discussion_content_reply_${post["sakai:id"]}" class="discussion_content_reply" href="javascript:;">Reply</a></li>
+ {if post.canEdit}
+ <li><a id="discussion_content_edit_${post["sakai:id"]}" class="discussion_content_edit" href="javascript:;">Edit</a></li>
+ {/if}
+ {if post.canDelete && first !== true && post["sakai:initialpost"] !== true}
+ {if post["sakai:deleted"]}
+ <li><a id="discussion_content_undelete_${post["sakai:id"]}" class="discussion_content_undelete" href="javascript:;">Undelete</a></li>
+ {else}
+ <li><a id="discussion_content_delete_${post["sakai:id"]}" class="discussion_content_delete" href="javascript:;">Delete</a></li>
+ {/if}
+ {/if}
+ </ul>
+ </div>
+ {/if}
+ </div>
+ </div>
+ --></div>
+
+ <div id="discussion_compact_container_template" style="display:none"><!--
+ <a id="discussion_full_link" title="Click to view the expanded version of this discussion" href="javascript:;">Full</a>
+ <br />
+ <br />
+ <div id="discussion_current_post"></div>
+
+ <br />
+
+ {macro displayPost(o,first)}
+ <div>
+ <a href="#" id="post_${o.post["sakai:id"]}"><span style="font-weight: bold">${o.post["sakai:subject"]}</span></a> - <span>by ${o.post.profile.fullName}</span> on <span>${o.post.date}</span>
+ <img style="display:none" class="messageCursor" id="post_${o.post["sakai:id"]}_cursor" src="/dev/_images/arrow_left_sm2_blue.gif" width="5" height="9"/>
+ </div>
+
+ <div class="discussion_posts">
+ {for reply in o.replies}
+ ${displayPost(reply,false)}
+ {/for}
+ </div>
+ {/macro}
 
+ {if posts.length == 0}
+ No posts yet.
+ {else}
+ ${displayPost(posts[0], true)}
+ {/if}
+ --></div>
+
  <!-- MAIN CONTAINER FOR DISCUSSIONS -->
  <div id="discussion_container">
 
  </div>
  <div id="discussion_container_template" style="display:none"><!--
+ <a id="discussion_compact_link" title="Click to view a compact version of this discussion" href="javascript:;">Compact</a>
+ <br />
+ <br />
  {macro displayPost(o, first)}
 
  <div class="discussion_post" id="discussion_post${o.post["sakai:postid"]}">
@@ -177,4 +265,4 @@
 </div>
 
 <!-- JAVASCRIPT -->
-<script type="text/javascript" language="JavaScript" src="/devwidgets/discussion/javascript/discussion.js"></script>
\ No newline at end of file
+<script type="text/javascript" language="JavaScript" src="/devwidgets/discussion/javascript/discussion.js"></script>

[a_fish.vcf]

begin:vcard
fn:Adrian Fish
n:Fish;Adrian
org:Lancaster University;Centre for e-Science
adr:Lancaster University;;Bowland Tower South C Floor;Lancaster;;LA1 4YT;United Kingdom
email;internet:a.fish@...
title:Software Engineer
url:http://agora.lancs.ac.uk
version:2.1
end:vcard



_______________________________________________
sakai-ux mailing list
sakai-ux@...
http://collab.sakaiproject.org/mailman/listinfo/sakai-ux

TO UNSUBSCRIBE: send email to sakai-ux-unsubscribe@... with a subject of "unsubscribe"