Scott, I love you're style. Don't waste time discussing ideas floated on the list. Just implement them. Great stuff.
And using the template engine too - that makes me really happy. Sent from my mobile device, please forgive errors and brevity. On Jan 18, 2012 8:56 PM, <[email protected]> wrote: > Author: scottbw > Date: Wed Jan 18 20:55:36 2012 > New Revision: 1233062 > > URL: http://svn.apache.org/viewvc?rev=1233062&view=rev > Log: > Created a basic JIRA widget that gets version, release and issue counts > from the ASF JIRA server using its REST JSON API. This is another example > of using the Browse template (see WOOKIE-295) > > Added: > incubator/wookie/trunk/widgets/templates/widgets/jira/ > > incubator/wookie/trunk/widgets/templates/widgets/jira/content_footer.html > > incubator/wookie/trunk/widgets/templates/widgets/jira/content_header.html > > incubator/wookie/trunk/widgets/templates/widgets/jira/content_primary.html > > incubator/wookie/trunk/widgets/templates/widgets/jira/content_secondary.html > > > incubator/wookie/trunk/widgets/templates/widgets/jira/item_summary_template.html > incubator/wookie/trunk/widgets/templates/widgets/jira/item_template.html > incubator/wookie/trunk/widgets/templates/widgets/jira/scripts/ > > > incubator/wookie/trunk/widgets/templates/widgets/jira/scripts/jira_controller.js > incubator/wookie/trunk/widgets/templates/widgets/jira/widget.properties > > Added: > incubator/wookie/trunk/widgets/templates/widgets/jira/content_footer.html > URL: > http://svn.apache.org/viewvc/incubator/wookie/trunk/widgets/templates/widgets/jira/content_footer.html?rev=1233062&view=auto > > ============================================================================== > --- > incubator/wookie/trunk/widgets/templates/widgets/jira/content_footer.html > (added) > +++ > incubator/wookie/trunk/widgets/templates/widgets/jira/content_footer.html > Wed Jan 18 20:55:36 2012 > @@ -0,0 +1,2 @@ > +<div style="float:left;"><img src="images/icon.png" height="24" > style="vertical-align:text-bottom;"><strong>${widget.name}</strong></div> > +<a class="button" href="#help" data-role="button" data-rel="dialog" > data-transition="pop" data-icon="info" data-iconpos="notext">Help</a> > \ No newline at end of file > > Added: > incubator/wookie/trunk/widgets/templates/widgets/jira/content_header.html > URL: > http://svn.apache.org/viewvc/incubator/wookie/trunk/widgets/templates/widgets/jira/content_header.html?rev=1233062&view=auto > > ============================================================================== > --- > incubator/wookie/trunk/widgets/templates/widgets/jira/content_header.html > (added) > +++ > incubator/wookie/trunk/widgets/templates/widgets/jira/content_header.html > Wed Jan 18 20:55:36 2012 > @@ -0,0 +1 @@ > + > > Added: > incubator/wookie/trunk/widgets/templates/widgets/jira/content_primary.html > URL: > http://svn.apache.org/viewvc/incubator/wookie/trunk/widgets/templates/widgets/jira/content_primary.html?rev=1233062&view=auto > > ============================================================================== > --- > incubator/wookie/trunk/widgets/templates/widgets/jira/content_primary.html > (added) > +++ > incubator/wookie/trunk/widgets/templates/widgets/jira/content_primary.html > Wed Jan 18 20:55:36 2012 > @@ -0,0 +1,18 @@ > +<!-- > + Licensed to the Apache Software Foundation (ASF) under one or more > + contributor license agreements. See the NOTICE file distributed with > + this work for additional information regarding copyright ownership. > + The ASF licenses this file to You under the Apache License, Version 2.0 > + (the "License"); you may not use this file except in compliance with > + the License. You may obtain a copy of the License at > + > + http://www.apache.org/licenses/LICENSE-2.0 > + > + Unless required by applicable law or agreed to in writing, software > + distributed under the License is distributed on an "AS IS" BASIS, > + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > + See the License for the specific language governing permissions and > + limitations under the License. > +--> > +<div id="results" data-role="collapsible-set"> > +</div> > > Added: > incubator/wookie/trunk/widgets/templates/widgets/jira/content_secondary.html > URL: > http://svn.apache.org/viewvc/incubator/wookie/trunk/widgets/templates/widgets/jira/content_secondary.html?rev=1233062&view=auto > > ============================================================================== > --- > incubator/wookie/trunk/widgets/templates/widgets/jira/content_secondary.html > (added) > +++ > incubator/wookie/trunk/widgets/templates/widgets/jira/content_secondary.html > Wed Jan 18 20:55:36 2012 > @@ -0,0 +1,59 @@ > +<!-- > + Licensed to the Apache Software Foundation (ASF) under one or more > + contributor license agreements. See the NOTICE file distributed with > + this work for additional information regarding copyright ownership. > + The ASF licenses this file to You under the Apache License, Version 2.0 > + (the "License"); you may not use this file except in compliance with > + the License. You may obtain a copy of the License at > + > + http://www.apache.org/licenses/LICENSE-2.0 > + > + Unless required by applicable law or agreed to in writing, software > + distributed under the License is distributed on an "AS IS" BASIS, > + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > + See the License for the specific language governing permissions and > + limitations under the License. > +--> > + > +<!-- > + Login panel > +--> > +<div id="loginPanel" data-role="collapsible" data-theme="c" > + data-content-theme="c" data-collapsed="false"> > + <h2>Login</h2> > + <span id="loginMessage" style="color:red; font-weight: bold"></span> > + <form > + > action="javascript:${widget.shortname}_browse_controller.submitLoginForm()" > + method="get"> > + <div data-role="fieldcontain"> > + <label for="usernameString">Username:</label> <input > type="text" > + > name="usernameString" id="usernameString" value="" > + > placeholder="username" /> > + <label for="passwordString">Password:</label> <input > type="password" > + > name="passwordString" id="passwordString" value="" > + > placeholder="password" /> > + </div> > + > + <input type="submit" value="Login" /> > + </form> > + > +</div> > + > +<div id="searchPanel" data-role="collapsible" data-theme="c" > + data-content-theme="c" data-collapsed="true"> > + <h2>Select an Apache project</h2> > + <div data-role="content"> > + <form > + > action="javascript:${widget.shortname}_browse_controller.submitSearchForm()" > + method="get"> > + <div data-role="fieldcontain"> > + <label for="searchString">Search:</label> <input type="text" > + > name="searchString" id="searchString" value="" > + > placeholder="Project name..." /> > + </div> > + > + <input type="submit" value="Search" /> > + </form> > + </div> > + > +</div> > > Added: > incubator/wookie/trunk/widgets/templates/widgets/jira/item_summary_template.html > URL: > http://svn.apache.org/viewvc/incubator/wookie/trunk/widgets/templates/widgets/jira/item_summary_template.html?rev=1233062&view=auto > > ============================================================================== > --- > incubator/wookie/trunk/widgets/templates/widgets/jira/item_summary_template.html > (added) > +++ > incubator/wookie/trunk/widgets/templates/widgets/jira/item_summary_template.html > Wed Jan 18 20:55:36 2012 > @@ -0,0 +1,10 @@ > +<div class='result' data-role='collapsible' wid='${ID}'> > + <h3>${NAME} <span id='${ID}-released'></span> </h3> > + <p>${DESCRIPTION}</p> > + <div class='detail'> > + </div> > + <script> > + if (${RELEASED}) > + $('#${ID}-released').html('<em>Released: > ${USERRELEASEDATE}</em>'); > + </script> > +</div> > > Added: > incubator/wookie/trunk/widgets/templates/widgets/jira/item_template.html > URL: > http://svn.apache.org/viewvc/incubator/wookie/trunk/widgets/templates/widgets/jira/item_template.html?rev=1233062&view=auto > > ============================================================================== > --- > incubator/wookie/trunk/widgets/templates/widgets/jira/item_template.html > (added) > +++ > incubator/wookie/trunk/widgets/templates/widgets/jira/item_template.html > Wed Jan 18 20:55:36 2012 > @@ -0,0 +1,4 @@ > + > + <p>Issues to resolve: ${ISSUESUNRESOLVEDCOUNT}</p> > + > + > \ No newline at end of file > > Added: > incubator/wookie/trunk/widgets/templates/widgets/jira/scripts/jira_controller.js > URL: > http://svn.apache.org/viewvc/incubator/wookie/trunk/widgets/templates/widgets/jira/scripts/jira_controller.js?rev=1233062&view=auto > > ============================================================================== > --- > incubator/wookie/trunk/widgets/templates/widgets/jira/scripts/jira_controller.js > (added) > +++ > incubator/wookie/trunk/widgets/templates/widgets/jira/scripts/jira_controller.js > Wed Jan 18 20:55:36 2012 > @@ -0,0 +1,65 @@ > +/* > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You under the Apache License, Version 2.0 > + * (the "License"); you may not use this file except in compliance with > + * the License. You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + */ > +${widget.shortname}_browse_controller.requiresLogin=true; > + > +// > +// Hide the search panel until logged in > +// > +$('#home').live( 'pageinit',function(event){ > + $('#searchPanel').hide(); > +}); > + > +/** > + * Login action > + * > + * Sets the username and password to use during this browser session > + * and toggles the login panel and search panel > + */ > +${widget.shortname}_browse_controller.submitLoginForm = function(){ > + > + $.mobile.showPageLoadingMsg(); > + ${widget.shortname}_browse_controller.username = > $('#usernameString').val(); > + ${widget.shortname}_browse_controller.password = > $('#passwordString').val(); > + > + // > + // Check if the credentials can pull down session info; if so they are > + // correct and we can use them. Note we don't actually create a > session, we > + // use Basic Auth for each request, and this is just to check > credential > + // validity > + // > + // If the credentials are OK, we hide the login form and show the > search > + // form. > + // > + $.ajax({ > + url: window.widget.proxify(' > https://issues.apache.org/jira/rest/auth/1/session')+"&username="+ > ${widget.shortname}_browse_controller.username + > "&password="+${widget.shortname}_browse_controller.password, > + dataType: 'json', > + success: function(data){ > + $.mobile.hidePageLoadingMsg(); > + ${widget.shortname}_browse_controller.requiresLogin=false; > + $('#loginPanel').hide(); > + $('#searchPanel').trigger('expand'); > + $('#searchPanel').show(); > + }, > + > + error: function(){ > + $.mobile.hidePageLoadingMsg(); > + $('#loginMessage').text("login rejected, please try again"); > + } > + }); > + > + > +} > > Added: > incubator/wookie/trunk/widgets/templates/widgets/jira/widget.properties > URL: > http://svn.apache.org/viewvc/incubator/wookie/trunk/widgets/templates/widgets/jira/widget.properties?rev=1233062&view=auto > > ============================================================================== > --- > incubator/wookie/trunk/widgets/templates/widgets/jira/widget.properties > (added) > +++ > incubator/wookie/trunk/widgets/templates/widgets/jira/widget.properties Wed > Jan 18 20:55:36 2012 > @@ -0,0 +1,45 @@ > +template.name=browse > +widget.shortname=jira > +widget.name=Jira > +widget.description=Info about Wookie from Jira > + > +# > +# The name of the XML element that represents a single item. In a JIRA > API call, we ignore this as we're using JSON and > +# the object we're interested in is the top-level array of "version" > objects > +# type: string > +# > +browse.item.name="" > + > +# The URL from which to retrieve data for the browse index. > +# > +# type: string > +# variables: sort = the sort term for APIs that support it > +# order = the sort order for APIs that support it > +browse.index.url=" > https://issues.apache.org/jira/rest/api/latest/project/WOOKIE/versions&username= > "+${widget.shortname}_browse_controller.username+"&password="+${widget.shortname}_browse_controller.password > + > +# The URL from which to retrieve search data. > +# We override this here with the version API url, but use the query for > the project name > +# > +# type: string > +# variables: query = query string entered into the search form > +# sort = the sort term for APIs that support it > +# order = the sort order for APIs that support it > +browse.search.url=" > https://issues.apache.org/jira/rest/api/latest/project/"+query.toUpperCase() > +"/versions&username="+${widget.shortname}_browse_controller.username+"&password="+${widget.shortname}_browse_controller.password > + > + > +# The URL from which to retrieve detailed > +# information about an item > +# > +# type: string > +# variables: itemId is the ID of the item to display > +browse.get.detail.url=" > https://issues.apache.org/jira/rest/api/latest/version/" + itemId + > "/unresolvedIssueCount&username="+${widget.shortname}_browse_controller.username+"&password="+${widget.shortname}_browse_controller.password > + > +browse.format="json" > + > +# > +# The names of the elements to map into the template placeholders. E.g. > if it contains "title", then $TITLE in the template > +# would be replaced by the content of the <title> element in the XML data. > +# In our case these are the important elements returned by the Jira API > +# > +browse.item.elements = "" > +browse.item.attributes = > "id,description,name,userReleaseDate,released,issuesUnresolvedCount" > > >
