From: <de...@de...> - 2008-11-03 20:16:10
|
Author: AndrewRJones Date: 2008-11-03 10:45:48 -0600 (Mon, 03 Nov 2008) New Revision: 17722 Trac url: http://develop.twiki.org/trac/changeset/17722 Added: twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/Category.pm twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/Skill.pm twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/SkillsStore.pm twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/UserSkill.pm twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/UserSkills.pm twiki/trunk/SkillsPlugin/pub/TWiki/SkillsPlugin/main.js twiki/trunk/SkillsPlugin/templates/skills.tmpl twiki/trunk/SkillsPlugin/templates/skillsbrowseview.tmpl twiki/trunk/SkillsPlugin/templates/skillsbrowseviewrepeated.tmpl twiki/trunk/SkillsPlugin/templates/skillsedit.tmpl twiki/trunk/SkillsPlugin/templates/skillsuserview.tmpl twiki/trunk/SkillsPlugin/templates/skillsuserviewrepeated.tmpl Modified: twiki/trunk/SkillsPlugin/data/TWiki/SkillsCreateNewCategory.txt twiki/trunk/SkillsPlugin/data/TWiki/SkillsCreateNewSkill.txt twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin.pm twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/MANIFEST twiki/trunk/SkillsPlugin/pub/TWiki/SkillsPlugin/style.css Log: Item4421: In the middle of re-write. Committed so I can work from a different location Modified: twiki/trunk/SkillsPlugin/data/TWiki/SkillsCreateNewCategory.txt =================================================================== --- twiki/trunk/SkillsPlugin/data/TWiki/SkillsCreateNewCategory.txt 2008-11-03 13:31:15 UTC (rev 17721) +++ twiki/trunk/SkillsPlugin/data/TWiki/SkillsCreateNewCategory.txt 2008-11-03 16:45:48 UTC (rev 17722) @@ -28,17 +28,18 @@ </table> %STARTSECTION{"createcategory"}% -%IF{ "{Plugins}{SkillsPlugin}{Enabled}" then="%ADDSKILLSMESSAGE%" else="<table border='0' cellpadding='3' cellspacing='0' width='100%'><tr><td bgcolor='yellow'><font color='red'><strong>The Skills Plugin is not enabled on this site. The forms below are disabled.</strong></font></td></tr></table>" }% +%IF{ "{Plugins}{SkillsPlugin}{Enabled}" then="%URLPARAM{"skillsmessage"}%" else="<table border='0' cellpadding='3' cellspacing='0' width='100%'><tr><td bgcolor='yellow'><font color='red'><strong>The Skills Plugin is not enabled on this site. The forms below are disabled.</strong></font></td></tr></table>" }% Create a new category. -<form name="createcategory" action="%SCRIPTURL{view}%/%BASEWEB%/%BASETOPIC%" method="post"> +<form name="createcategory" action="%SCRIPTURL{rest}%/SkillsPlugin/addNewCategory" method="post"> <div class="twikiFormSteps"> <div class="twikiFormStep"> -Name of new category: %BR% <input name="category" type="text" class="twikiInputField" size="20" value="%URLPARAM{"createcategory"}%" /> (use only alphanumeric characters and underscore) +Name of new category: %BR% <input name="newcategory" type="text" class="twikiInputField" size="20" value="%URLPARAM{"createcategory"}%" /> </div> <div class="twikiFormStep twikiLast"> <input name="createcategory" type="submit" class="twikiSubmit" value="%MAKETEXT{"Create"}%" /> +<input type="hidden" name="topic" value="%WEB%.%TOPIC%" /> </div> </div> </form> Modified: twiki/trunk/SkillsPlugin/data/TWiki/SkillsCreateNewSkill.txt =================================================================== --- twiki/trunk/SkillsPlugin/data/TWiki/SkillsCreateNewSkill.txt 2008-11-03 13:31:15 UTC (rev 17721) +++ twiki/trunk/SkillsPlugin/data/TWiki/SkillsCreateNewSkill.txt 2008-11-03 16:45:48 UTC (rev 17722) @@ -26,15 +26,16 @@ </table> %STARTSECTION{"createskill"}% -%IF{ "{Plugins}{SkillsPlugin}{Enabled}" then="%ADDSKILLSMESSAGE%" else="<table border='0' cellpadding='3' cellspacing='0' width='100%'><tr><td bgcolor='yellow'><font color='red'><strong>The Skills Plugin is not enabled on this site. The forms below are disabled.</strong></font></td></tr></table>" }% +%IF{ "{Plugins}{SkillsPlugin}{Enabled}" then="%URLPARAM{"skillsmessage"}%" else="<table border='0' cellpadding='3' cellspacing='0' width='100%'><tr><td bgcolor='yellow'><font color='red'><strong>The Skills Plugin is not enabled on this site. The forms below are disabled.</strong></font></td></tr></table>" }% Create a new skill. -<form name="createskill" action="%SCRIPTURL{view}%/%BASEWEB%/%BASETOPIC%" method="post"> +<form name="createskill" action="%SCRIPTURL{rest}%/SkillsPlugin/addNewSkill" method="post"> <div class="twikiFormSteps"> <div class="twikiFormStep"> Name of new skill: %BR% -<input name="newskill" type="text" class="twikiInputField" size="20" value="%URLPARAM{"createskill"}%" /> (use only alphanumeric characters and underscore) +<input name="newskill" type="text" class="twikiInputField" size="20" value="%URLPARAM{"createskill"}%" /> +<input type="hidden" name="topic" value="%WEB%.%TOPIC%" /> </div> <div class="twikiFormStep"> In category: %BR% Added: twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/Category.pm =================================================================== --- twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/Category.pm (rev 0) +++ twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/Category.pm 2008-11-03 16:45:48 UTC (rev 17722) @@ -0,0 +1,108 @@ +# Plugin for TWiki Enterprise Collaboration Platform, http://TWiki.org/ +# +# Copyright (C) 2008 Andrew Jones, and...@go... +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. For +# more details read LICENSE in the root of this distribution. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# For licensing info read LICENSE file in the TWiki root. + +package TWiki::Plugins::SkillsPlugin::Category; + +use strict; + +require TWiki::Plugins::SkillsPlugin::Skill; + +my $totalCategories; + +sub new { + my ($class, $name, $skills) = @_; + + my $self = {}; + + #$self->{NAME} = undef; + #$self->{SKILLS} = []; + $self->{"_TOTAL"} = \$totalCategories; + + bless ( $self, $class); + + $self->name( $name ); + $self->populateSkills( $skills ); + + ++ ${ $self->{"_TOTAL"} }; + + return $self; +} + +# name of category +sub name { + my $self = shift; + if (@_) { $self->{NAME} = shift } + return $self->{NAME}; +} + +# return SKILLS array, sorted +sub getSkills { + my $self = shift; + my @skillNames; + foreach my $obj_skill ( @{ $self->{SKILLS} } ){ + push @skillNames, $obj_skill->name; + } + @skillNames = sort @skillNames; + return \@skillNames; +} + +# populate SKILLS array +sub populateSkills { + my ( $self, $skills) = @_; + + if ($skills) { + foreach my $skill ( @$skills ){ + my $obj_skill = TWiki::Plugins::SkillsPlugin::Skill->new($skill); + #$obj_skill->name( $skill ); + push @{ $self->{SKILLS} }, $obj_skill; + } + } +} + +# append skill to SKILLS array +sub addSkill { + my ( $self, $skill) = @_; + my $obj_skill = TWiki::Plugins::SkillsPlugin::Skill->new($skill); + push @{ $self->{SKILLS} }, $obj_skill; +} + +sub skillExists { + my ( $self, $skill) = @_; + + if( getSkillByName( $self, $skill ) ){ + return 1; + } else { + return undef; + } +} + +sub getSkillByName { + my ( $self, $skill) = @_; + + foreach my $obj_skill( @{ $self->{SKILLS} } ){ + if( lc$obj_skill->name eq lc$skill ){ + return $obj_skill; + } + } + return undef; +} + +sub getSkillsCount { + my $self = shift; + return @{ $self->{SKILLS} }; +} + +1; Property changes on: twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/Category.pm ___________________________________________________________________ Name: svn:executable + * Modified: twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/MANIFEST =================================================================== --- twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/MANIFEST 2008-11-03 13:31:15 UTC (rev 17721) +++ twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/MANIFEST 2008-11-03 16:45:48 UTC (rev 17722) @@ -1,4 +1,3 @@ - # Release manifest for SkillsPlugin data/TWiki/SkillsAdminIntroduction.txt 0664 UI Topic data/TWiki/SkillsPlugin.txt 0664 Plugin Topic @@ -15,12 +14,18 @@ data/TWiki/SkillsRenameSkill.txt 0664 UI Topic data/TWiki/SkillsSearch.txt 0664 UI Topic lib/TWiki/Plugins/SkillsPlugin.pm 0644 Plugin Module -lib/TWiki/Plugins/SkillsPlugin/Func.pm 0644 Plugin Module -lib/TWiki/Plugins/SkillsPlugin/Query.pm 0644 Plugin Module -lib/TWiki/Plugins/SkillsPlugin/Tag.pm 0644 Plugin Module +lib/TWiki/Plugins/SkillsPlugin/Category.pm 0644 Plugin Module +lib/TWiki/Plugins/SkillsPlugin/Skill.pm 0644 Plugin Module +lib/TWiki/Plugins/SkillsPlugin/UserSkill.pm 0644 Plugin Module pub/TWiki/SkillsPlugin/skills_screenshot_full.png 0644 Screenshot pub/TWiki/SkillsPlugin/skills_screenshot_search.png 0644 Screenshot pub/TWiki/SkillsPlugin/skills_screenshot_thumb.png 0644 Screenshot pub/TWiki/SkillsPlugin/style.css 0644 Default Style Sheet -templates/oopsgeneric.skills.tmpl 0644 Comment Popup Template +pub/TWiki/SkillsPlugin/main.js 0644 JS File +templates/skillsedit.tmpl 0644 Add/Edit form template +templates/skills.tmpl 0644 Base template +templates/skillsuserview.tmpl 0644 User Skills template +templates/skillsuserviewrepeated.tmpl 0644 User Skills Repeated template +templates/skillsbrowseview.tmpl 0644 Browse Skills template +templates/skillsbrowseviewrepeated.tmpl 0644 Browse Skills Repeated template Added: twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/Skill.pm =================================================================== --- twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/Skill.pm (rev 0) +++ twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/Skill.pm 2008-11-03 16:45:48 UTC (rev 17722) @@ -0,0 +1,38 @@ +# Plugin for TWiki Enterprise Collaboration Platform, http://TWiki.org/ +# +# Copyright (C) 2008 Andrew Jones, and...@go... +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. For +# more details read LICENSE in the root of this distribution. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# For licensing info read LICENSE file in the TWiki root. + +package TWiki::Plugins::SkillsPlugin::Skill; + +use strict; + +sub new { + my ($class, $name) = @_; + + my $self = bless ( {}, $class); + + $self->name($name); + + return $self; +} + + +sub name { + my $self = shift; + if (@_) { $self->{NAME} = shift } + return $self->{NAME}; +} + +1; Property changes on: twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/Skill.pm ___________________________________________________________________ Name: svn:executable + * Added: twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/SkillsStore.pm =================================================================== --- twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/SkillsStore.pm (rev 0) +++ twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/SkillsStore.pm 2008-11-03 16:45:48 UTC (rev 17722) @@ -0,0 +1,74 @@ +# Plugin for TWiki Enterprise Collaboration Platform, http://TWiki.org/ +# +# Copyright (C) 2008 Andrew Jones, and...@go... +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. For +# more details read LICENSE in the root of this distribution. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# For licensing info read LICENSE file in the TWiki root. + +package TWiki::Plugins::SkillsPlugin::SkillsStore; + + +# Object that handles interaction with the user data (currently stored in the meta or the users topic) +sub new { + + #my ($class, $name, $cat, $rating, $comment) = @_; + + my $self = bless ( {}, $class ); + + return $self; +} + +# gets all the categories and skills +sub getAll { + my $self = shift; +} + +# saves the skills to file - need? +sub save { + my $self = shift; +} + +# adds new skill to category +sub addNewSkill { + my $self = shift; +} + +sub renameSkill { + my $self = shift; +} + +sub moveSkill { + my $self = shift; +} + +sub deleteSkill { + my $self = shift; +} + +sub addNewCategory { + my $self = shift; +} + +sub renameSkill { + my $self = shift; +} + +sub deleteSkill { + my $self = shift; +} + +# returns the category obj - do we need? +sub getCategoryByName { + my $self = shift; +} + +1; \ No newline at end of file Added: twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/UserSkill.pm =================================================================== --- twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/UserSkill.pm (rev 0) +++ twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/UserSkill.pm 2008-11-03 16:45:48 UTC (rev 17722) @@ -0,0 +1,61 @@ +# Plugin for TWiki Enterprise Collaboration Platform, http://TWiki.org/ +# +# Copyright (C) 2008 Andrew Jones, and...@go... +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. For +# more details read LICENSE in the root of this distribution. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# For licensing info read LICENSE file in the TWiki root. + +package TWiki::Plugins::SkillsPlugin::UserSkill; +#use TWiki::Plugins::SkillsPlugin::Skill; +#@ISA = ("TWiki::Plugins::SkillsPlugin::Skill"); + + +# Object to represent the skill as stored in users meta data +sub new { + + my ($class, $name, $cat, $rating, $comment) = @_; + + my $self = bless ( {}, $class); + + $self->name($name); + $self->category($cat); + $self->rating($rating); + $self->comment($comment); + + return $self; +} + +sub name { + my $self = shift; + if (@_) { $self->{NAME} = shift } + return $self->{NAME}; +} + +sub category { + my $self = shift; + if (@_) { $self->{CATEGORY} = shift } + return $self->{CATEGORY}; +} + +sub rating { + my $self = shift; + if (@_) { $self->{RATING} = shift } + return $self->{RATING}; +} + +sub comment { + my $self = shift; + if (@_) { $self->{COMMENT} = shift } + return $self->{COMMENT}; +} + +1; \ No newline at end of file Added: twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin/UserSkills.pm =================================================================== Modified: twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin.pm =================================================================== --- twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin.pm 2008-11-03 13:31:15 UTC (rev 17721) +++ twiki/trunk/SkillsPlugin/lib/TWiki/Plugins/SkillsPlugin.pm 2008-11-03 16:45:48 UTC (rev 17722) @@ -15,30 +15,21 @@ # For licensing info read LICENSE file in the TWiki root. package TWiki::Plugins::SkillsPlugin; + +# TODO: Conditional require +require TWiki::Plugins::SkillsPlugin::Category; +require TWiki::Plugins::SkillsPlugin::Skill; +require TWiki::Plugins::SkillsPlugin::UserSkill; + use strict; use vars qw( $VERSION $RELEASE $NO_PREFS_IN_TOPIC $SHORTDESCRIPTION $pluginName - - $doneHeader - - $globTopic - $globWeb - - $allowedit - - $message - $addeditMessage - $searchResults + $doneYui ); -# MESSAGES: Have to be global, or get lost in commonTagsHandler -# $message - added to the admin topic to confirm changes to categories/skills -# $addeditMessage - added to the bottom of EDITSKILLS form to confirm changes -# searchResults - message added to show how many matches in a search - # Plugin Variables $VERSION = '$Rev: 9813$'; $RELEASE = 'Dakar'; @@ -46,427 +37,933 @@ $SHORTDESCRIPTION = 'Allows users to list their skills, which can then be searched'; $pluginName = 'SkillsPlugin'; -# ========================= +# ========================= INIT sub initPlugin { - ( $globTopic, $globWeb ) = @_; - + # check for Plugins.pm versions if( $TWiki::Plugins::VERSION < 1.1 ) { _Warn( "Version mismatch between $pluginName and Plugins.pm" ); return 0; } - $message = ''; - $searchResults = ''; - $addeditMessage = ''; - $doneHeader = 0; - # Register tag %SKILLS% TWiki::Func::registerTagHandler( 'SKILLS', \&_handleTag ); + + # Register REST handlers + ##my $v = 0; could register only on certain topics (as defined in configure/preferences ## + #if( $v != 0 { + TWiki::Func::registerRESTHandler('addNewCategory', \&_restAddNewCategory ); + TWiki::Func::registerRESTHandler('renameCategory', \&_restRenameCategory ); + TWiki::Func::registerRESTHandler('deleteCategory', \&_restDeleteCategory ); + TWiki::Func::registerRESTHandler('addNewSkill', \&_restAddNewSkill ); + + TWiki::Func::registerRESTHandler('getCategories', \&_restGetCategories ); + TWiki::Func::registerRESTHandler('getSkills', \&_restGetSkills ); + #} + TWiki::Func::registerRESTHandler('getSkillDetails', \&_restGetSkillDetails ); + TWiki::Func::registerRESTHandler('addEditSkill', \&_restAddEditSkill ); + + $doneYui = 0; - _Debug("initPlugin( $globWeb.$globTopic ) is OK"); + _Debug("initPlugin is OK"); return 1; } +# ========================= TAGS sub _handleTag { - require TWiki::Plugins::SkillsPlugin::Tag; my $out = ''; - my $action = $_[1]->{action} || $_[1]->{_DEFAULT} || return; + my $action = $_[1]->{action} || $_[1]->{_DEFAULT} || return 'No action specified'; my $start = "<noautolink>\n"; my $end = "\n</noautolink>"; for ($action){ - /user/ and $out = $start . TWiki::Plugins::SkillsPlugin::Tag::_userSkills($_[1]) . $end, last; - /browse/ and $out = $start . TWiki::Plugins::SkillsPlugin::Tag::_browseSkills($_[1]) . $end, last; - /edit/ and $out = $start . TWiki::Plugins::SkillsPlugin::Tag::_editSkills($_[1]) . $end, last; - /showskill/ and $out = $start . TWiki::Plugins::SkillsPlugin::Tag::_showSkills($_[1]) . $end, last; - /showcat/ and $out = $start . TWiki::Plugins::SkillsPlugin::Tag::_showCategories($_[1]) . $end, last; - /search/ and $out = $start . TWiki::Plugins::SkillsPlugin::Tag::_searchForm($_[1]) . $end, last; + /user/ and $out = $start . TWiki::Plugins::SkillsPlugin::_tagUserSkills($_[1]) . $end, last; + # /group/ and $out = $start . TWiki::Plugins::SkillsPlugin::Tag::_tagGroupSkills($_[1]) . $end, last; # shows skills for a particular group + /browse/ and $out = $start . TWiki::Plugins::SkillsPlugin::_tagBrowseSkills($_[1]) . $end, last; + /edit/ and $out = $start . TWiki::Plugins::SkillsPlugin::_tagEditSkills($_[1]) . $end, last; + /showskill/ and $out = $start . TWiki::Plugins::SkillsPlugin::_tagShowSkills($_[1]) . $end, last; + /showcat/ and $out = $start . TWiki::Plugins::SkillsPlugin::_tagShowCategories($_[1]) . $end, last; # show all categories in a format + # /search/ and $out = $start . TWiki::Plugins::SkillsPlugin::Tag::_searchForm($_[1]) . $end, last; } - _addCssStyle(); + #_addCssStyle(); - $allowedit = 0; + #$allowedit = 0; return $out; +} +# allows the user to print all categories in format of their choice +sub _tagShowCategories { + + my $params = shift; + + return _showCategories( + $params->{format}, + $params->{separator} + ); } -# ========================= -sub commonTagsHandler { - - my $query = TWiki::Func::getCgiQuery(); - return unless ($query); - -# user add/edit a skill - if(defined $query->{'editskills'}){ - # so we only execute once (performance) - $query->{'editskills'} = undef; - - require TWiki::Plugins::SkillsPlugin::Query; - - $addeditMessage = TWiki::Plugins::SkillsPlugin::Query::_addEditSkill( - $query->{'category'}[0], - $query->{'skill'}[0], - $query->{'rating'}[0], - $query->{'comment'}[0] +sub _tagShowSkills { + my $params = shift; + + return _showSkills( + $params->{category}, + $params->{format}, + $params->{separator}, + $params->{prefix}, + $params->{suffix} ); - } +} - # add/edit message - $_[0] =~ s/%ADDEDITMESSAGE%/$addeditMessage/; +# creates a form allowing users to edit their skills +sub _tagEditSkills { + + # SMELL: + # CSS (where is best? needs to be defineable and overrideable) -# search skills - if(defined $query->{'searchskills'}){ - $query->{'searchskills'} = undef; + my $user = TWiki::Func::getWikiName(); + + my $out = TWiki::Func::readTemplate( 'skillsedit' ); + + # expand our variables in template + my $formDef = 'name="addedit-skill-form" id="addedit-skill-form"'; + $out =~ s/%FORMDEFINITION%/$formDef/g; + + my $messageContainerDef = 'id="addedit-skills-message-container" style="display:none;"'; + $out =~ s/%SKILLMESSAGECONTAINERDEF%/$messageContainerDef/g; + my $messagePic = _getImages('info'); + my $message = "$messagePic <span id='addedit-skills-message'></span>"; + $out =~ s/%SKILLMESSAGE%/$message/g; + + # get categories + my $catSelect = '<select name="category" id="addedit-category-select"></select>'; + $out =~ s/%CATEGORYSELECT%/$catSelect/g; + + my $skillSelect = '<select name="skill" id="addedit-skill-select"></select>'; + $out =~ s/%SKILLSELECT%/$skillSelect/g; + + $out =~ s!%RATINGSELECT\{1\}%!<input type="radio" name="addedit-skill-rating" value="1" />!g; + $out =~ s!%RATINGSELECT\{2\}%!<input type="radio" name="addedit-skill-rating" value="2" />!g; + $out =~ s!%RATINGSELECT\{3\}%!<input type="radio" name="addedit-skill-rating" value="3" />!g; + $out =~ s!%RATINGSELECT\{4\}%!<input type="radio" name="addedit-skill-rating" value="4" />!g; + $out =~ s!%RATINGSELECT\{0\}%!<input type="radio" name="addedit-skill-rating" value="0" />!g; + + my $comment = 'id="addedit-skill-comment" type="text" name="comment"'; + $out =~ s/%SKILLCOMMENTDEF%/$comment/g; + + # to clear textbox + my $clearPic = _getImages('clear'); + my $clear = "<span id='addedit-skill-comment-clear' style='display:none;'>$clearPic</span>"; + $out =~ s/%SKILLCOMMENTCLEAR%/$clear/g; + + my $submit = '<input name="skill-submit" id="addedit-skill-submit" type="button" value="Add/Edit" class="twikiSubmit">'; + $out =~ s/%SKILLSUBMIT%/$submit/g; + + # add CSS to head + _addYUI(); + TWiki::Func::addToHEAD('SKILLSPLUGIN_EDITSKILLS_CSS','<style type="text/css" media="all">@import url("/twiki/pub/TWiki/SkillsPlugin/style.css");</style>'); + TWiki::Func::addToHEAD('SKILLSPLUGIN_EDITSKILLS_JS','<script src="/twiki/pub/TWiki/SkillsPlugin/main.js" language="javascript" type="text/javascript"></script>'); + + return $out; +} - require TWiki::Plugins::SkillsPlugin::Query; - $searchResults = TWiki::Plugins::SkillsPlugin::Query::_searchSkills( - $query->{'category'}[0], - $query->{'skill'}[0], - $query->{'ratingFrom'}[0], - $query->{'ratingTo'}[0], - $query->{'topicsearch'}[0] - ); +sub _tagUserSkills { + + my $params = shift; + + my $user = $params->{user} || TWiki::Func::getWikiName(); + my $twisty = $params->{twisty} || 'closed'; + + my $out = TWiki::Func::readTemplate( 'skillsuserview' ); + my $tmplRepeat = TWiki::Func::readTemplate( 'skillsuserviewrepeated' ); + + my( undef, $tmplCat, $tmplSkillContStart, $tmplSkillStart, $tmplSkill, $tmplRating, $tmplComment, $tmplSkillEnd, $tmplSkillContEnd ) = split( /%SPLIT%/, $tmplRepeat ); + + my $userSkills = _getUserSkills( $user ); + my $allSkills = _getAllSkills(); + + # get image paths + my $ratingPic = _getImages( 'star' ); + my $skillPic = _getImages( 'open' ); + my $commentPic = _getImages( 'comment' ); + my $twistyCloseImg = _getImages( 'twistyclose' ); + + my $jsVars = "if( !SkillsPlugin ) var SkillsPlugin = {}; SkillsPlugin.vars = {}; "; # create namespace in JS + + my $repeatedLine; + foreach my $cat ( @{ $allSkills } ){ + my $catDone = 0; + my $skillOut = 0; + + foreach my $skill ( @{ $cat->getSkills(); } ){ + if( my $obj_userSkill = _getUserSkill( $user, $skill, $cat->name, $userSkills ) ){ + # produce output line + # add to array/string which will be output in %REPEAT% + my $lineOut; + + $skillOut = 1; + + # category + unless( $catDone == 1 ){ + $lineOut .= $tmplCat; + $lineOut .= $tmplSkillContStart + } + $catDone = 1; + + $lineOut .= $tmplSkillStart; + + # skill + $lineOut .= $tmplSkill; + + # rating + my $i = 1; + while( $i < $obj_userSkill->rating ){ + my $ratingOut = $tmplRating; + $ratingOut =~ s/%RATING%/ /g; + $ratingOut =~ s/%RATINGDEF%//g; + $lineOut .= $ratingOut; + $i ++; + } + my $ratingOut = $tmplRating; + $ratingOut =~ s/%RATING%/$ratingPic/g; + $ratingOut =~ s/%RATINGDEF%/class='skillsRating'/g; + $lineOut .= $ratingOut; + $i ++; + while( $i <= 4 ){ + my $ratingOut = $tmplRating; + $ratingOut =~ s/%RATING%/ /g; + $ratingOut =~ s/%RATINGDEF%//g; + $lineOut .= $ratingOut; + $i ++; + } + + # comment + $lineOut .= $tmplComment; + + $lineOut .= $tmplSkillEnd; + + # subsitutions + #$lineOut =~ s!%SKILLTWISTY%!<span id="%CATEGORY%_twisty"></span>!g; + #$lineOut =~ s/%CATEGORY%/$cat->name/ge; + $lineOut =~ s/%SKILL%/$skill/g; + $lineOut =~ s/%SKILLICON%/$skillPic/g; + if( $obj_userSkill->comment ){ + my $commentLink = "<span id='comment|" . $cat->name . "|$skill' title='" . $obj_userSkill->comment . "' class='SkillsPluginComments' >$commentPic</span>"; + $lineOut =~ s/%COMMENTLINK%/$commentLink/g; + $lineOut =~ s/%COMMENTOUT%/$obj_userSkill->comment/ge; + } else { + $lineOut =~ s/%COMMENTLINK%//g; + $lineOut =~ s/%COMMENTOUT%//g; + } + + $repeatedLine .= $lineOut; + } + } + + # subsitutions + my $catTwist = '<span id="' . $cat->name . '_twistyImage" class="SkillsPlugin-twisty-link"> ' . $twistyCloseImg . '</span>'; + $repeatedLine =~ s!%SKILLTWISTY%!$catTwist!g; + my $catLink = '<span id="' . $cat->name . '_twistyLink" class="SkillsPlugin-twisty-link">' . $cat->name . '</span>'; + $repeatedLine =~ s/%CATEGORY%/$catLink/g; + my $skillContDef = 'id="' . $cat->name . '_twist"'; + $repeatedLine =~ s/%SKILLCONTDEF%/$skillContDef/g; + + $repeatedLine .= $tmplSkillContEnd unless( $skillOut == 0 ); + } + + $out =~ s/%REPEAT%/$repeatedLine/g; + $out =~ s/%SKILLUSER%/$user/g; + + $jsVars .= "SkillsPlugin.vars.twistyState = '$twisty';"; + my $twistyOpenImgSrc = _getImagesSrc( 'twistyopen' ); + $jsVars .= "SkillsPlugin.vars.twistyOpenImgSrc = \"$twistyOpenImgSrc\";"; + my $twistyCloseImgSrc = _getImagesSrc( 'twistyclose' ); + $jsVars .= "SkillsPlugin.vars.twistyCloseImgSrc = \"$twistyCloseImgSrc\";"; + + _addYUI(); + TWiki::Func::addToHEAD('SKILLSPLUGIN_CSS','<style type="text/css" media="all">@import url("/twiki/pub/TWiki/SkillsPlugin/style.css");</style>'); + TWiki::Func::addToHEAD('SKILLSPLUGIN_JS','<script src="/twiki/pub/TWiki/SkillsPlugin/main.js" language="javascript" type="text/javascript"></script>'); + + TWiki::Func::addToHEAD('SKILLSPLUGIN_JSVARS',"<script language='javascript' type='text/javascript'>$jsVars</script>"); + + return $out; +} +sub _tagBrowseSkills { + # parameteres: + #category="Cat1, Cat2" + #skill="Skill1, Skill2" + #twisty="open" + + my $params = shift; + my @pCat = split( ',' , $params->{category}); + my @pSkill = split( ',' , $params->{skill}); + my $twisty = $params->{twisty} || 'closed'; + + my $allSkills = _getAllSkills(); + + my $out = TWiki::Func::readTemplate( 'skillsbrowseview' ); + my $tmplRepeat = TWiki::Func::readTemplate( 'skillsbrowseviewrepeated' ); + + my( undef, $tmplCat, $tmplSkillContStart, $tmplSkillStart, $tmplSkill, $tmplRating, $tmplComment, $tmplSkillEnd, $tmplSkillContEnd ) = split( /%SPLIT%/, $tmplRepeat ); + my $foo; + + # get image paths + my $ratingPic = _getImages( 'star' ); + my $skillPic = _getImages( 'open' ); + my $commentPic = _getImages( 'comment' ); + my $twistyCloseImg = _getImages( 'twistyclose' ); + + my $jsVars = "if( !SkillsPlugin ) var SkillsPlugin = {}; SkillsPlugin.vars = {}; "; # create namespace in JS + + my $repeatedLine; + for my $cat ( @{ $allSkills } ){ + my $catDone = 0; + my $skillOut = 0; + + # check if cat is wanted or if all are + if( @pCat ){ + next unless _isInArray( $cat->name, \@pCat ); + } + + # print cat line + $foo .= $cat->name; + + for my $skill ( @{ $cat->getSkills(); } ){ + # check if cat and skill is wanted or all are + if( @pCat && @pSkill ){ + next unless _isInArray( $skill, \@pSkill ); + } + + # need to get all users that have this skill + + # produce output line + # add to array/string which will be output in %REPEAT% + my $lineOut; + + $skillOut = 1; + + # category + unless( $catDone == 1 ){ + $lineOut .= $tmplCat; + $lineOut .= $tmplSkillContStart + } + + $lineOut .= $tmplSkillStart; + + # skill + $lineOut .= $tmplSkill; + + # rating + my $i = 1; + while( $i < $obj_userSkill->rating ){ + my $ratingOut = $tmplRating; + $ratingOut =~ s/%RATING%/ /g; + $ratingOut =~ s/%RATINGDEF%//g; + $lineOut .= $ratingOut; + $i ++; + } + my $ratingOut = $tmplRating; + $ratingOut =~ s/%RATING%/$ratingPic/g; + $ratingOut =~ s/%RATINGDEF%/class='skillsRating'/g; + $lineOut .= $ratingOut; + $i ++; + while( $i <= 4 ){ + my $ratingOut = $tmplRating; + $ratingOut =~ s/%RATING%/ /g; + $ratingOut =~ s/%RATINGDEF%//g; + $lineOut .= $ratingOut; + $i ++; + } + + # comment + $lineOut .= $tmplComment; + + $lineOut .= $tmplSkillEnd; + + # subsitutions + #$lineOut =~ s!%SKILLTWISTY%!<span id="%CATEGORY%_twisty"></span>!g; + #$lineOut =~ s/%CATEGORY%/$cat->name/ge; + $lineOut =~ s/%SKILL%/$skill/g; + $lineOut =~ s/%SKILLICON%/$skillPic/g; + if( $obj_userSkill->comment ){ + my $commentLink = "<span id='comment|" . $cat->name . "|$skill' title='" . $obj_userSkill->comment . "' class='SkillsPluginComments' >$commentPic</span>"; + $lineOut =~ s/%COMMENTLINK%/$commentLink/g; + $lineOut =~ s/%COMMENTOUT%/$obj_userSkill->comment/ge; + } else { + $lineOut =~ s/%COMMENTLINK%//g; + $lineOut =~ s/%COMMENTOUT%//g; + } + + $repeatedLine .= $lineOut; + + # print skill line + $foo .= $skill; + } + # subsitutions + my $catTwist = '<span id="' . $cat->name . '_twistyImage" class="SkillsPlugin-twisty-link"> ' . $twistyCloseImg . '</span>'; + $repeatedLine =~ s!%SKILLTWISTY%!$catTwist!g; + my $catLink = '<span id="' . $cat->name . '_twistyLink" class="SkillsPlugin-twisty-link">' . $cat->name . '</span>'; + $repeatedLine =~ s/%CATEGORY%/$catLink/g; + my $skillContDef = 'id="' . $cat->name . '_twist"'; + $repeatedLine =~ s/%SKILLCONTDEF%/$skillContDef/g; + + $repeatedLine .= $tmplSkillContEnd unless( $skillOut == 0 ); } + + _addYUI(); + TWiki::Func::addToHEAD('SKILLSPLUGIN_CSS','<style type="text/css" media="all">@import url("/twiki/pub/TWiki/SkillsPlugin/style.css");</style>'); + TWiki::Func::addToHEAD('SKILLSPLUGIN_JS','<script src="/twiki/pub/TWiki/SkillsPlugin/main.js" language="javascript" type="text/javascript"></script>'); + + return $out; +} - # search results - if ($_[0] =~ m/%SKILLSSEARCHRESULTS%/){ +# ========================= REST +sub _restAddNewCategory { + + my ($session, $plugin, $verb, $response) = @_; + + _Debug( 'REST handler: addNewCategory' ); + + my $newCat = TWiki::Func::getCgiQuery()->param('newcategory'); + + my $error = _addNewCategory( $newCat ); + + my $message; + if( $error ){ + $message = "Error adding category '$newCat' - $error"; + } else { + $message = "New category '$newCat' added."; + } + + $message = _urlEncode( $message ); + + my ($web, $topic) = TWiki::Func::normalizeWebTopicName( undef, TWiki::Func::getCgiQuery()->param('topic') ); + my $url = TWiki::Func::getScriptUrl($web, $topic, 'view') + . '?skillsmessage=' . $message; + TWiki::Func::redirectCgiQuery( undef, $url ); +} - TWiki::Func::addToHEAD('SKILLSPLUGIN_SEARCHSKILLS_JSCRIPT',_skillJScript('searchskills')); +sub _restRenameCategory { + +} - $_[0] =~ s/%SKILLSSEARCHRESULTS%/$searchResults/; +sub _restDeleteCategory { + +} + +sub _restAddNewSkill { + + my ($session, $plugin, $verb, $response) = @_; + + _Debug( 'REST handler: addNewCategory' ); + + my $newSkill = TWiki::Func::getCgiQuery()->param('newskill'); + my $cat = TWiki::Func::getCgiQuery()->param('incategory'); + + #_Debug("$cat: $newSkill"); + + my $error = _addNewSkill( $newSkill, $cat ); + + my $message; + if( $error ){ + $message = "Error adding skill '$newSkill' to category '$cat' - $error"; + } else { + $message = "New category '$newSkill' added."; } + + $message = _urlEncode( $message ); + + my ($web, $topic) = TWiki::Func::normalizeWebTopicName( undef, TWiki::Func::getCgiQuery()->param('topic') ); + my $url = TWiki::Func::getScriptUrl($web, $topic, 'view') + . '?skillsmessage=' . $message; + TWiki::Func::redirectCgiQuery( undef, $url ); +} -# manage categories/skills -# If there is a preference in Main.TWikiPreferences, only people listed and admins can add categories/skills - unless ( isAllowed() ) { - $_[0] =~ s!%ADDSKILLSMESSAGE%!<div class="skillNotification"> - %ICON{"warning"}% You do not have permission to add skills/categories. - Contact %WIKIWEBMASTER% for more information. - </div>!; +sub _restRenameSkill { + # rename the skill + # need to change the skill file, + # and the users +} - $allowedit = 1; - } +sub _restMoveSkill { + +} -# add new category - if(defined $query->{'createcategory'}){ - $query->{'createcategory'} = undef; - return if $allowedit; +sub _restDeleteSkill { + +} - require TWiki::Plugins::SkillsPlugin::Query; - $message = TWiki::Plugins::SkillsPlugin::Query::_createCategory($query->{'category'}[0]); +sub _restGetCategories { + my ($session, $plugin, $verb, $response) = @_; + + _Debug( 'REST handler: getCategories' ); + + my $out = _tagShowCategories( { format => '$category', separator => '|' } ); + return $out; +} -# add new skill - } elsif(defined $query->{'createskill'}){ - $query->{'createskill'} = undef; - return if $allowedit; +sub _restGetSkills { + my ($session, $plugin, $verb, $response) = @_; + + _Debug( 'REST handler: getSkills' ); + + my $cat = TWiki::Func::getCgiQuery()->param('category'); + my $out = _tagShowSkills( { category => $cat, format => '$skill', separator => '|' } ); + return $out; +} - require TWiki::Plugins::SkillsPlugin::Query; - $message = TWiki::Plugins::SkillsPlugin::Query::_createSkill( - $query->{'newskill'}[0], - $query->{'incategory'}[0] - ); - } +sub _restGetSkillDetails { + my ($session, $plugin, $verb, $response) = @_; + + _Debug( 'REST handler: getSkillDetails' ); + + my $cat = TWiki::Func::getCgiQuery()->param('category'); + my $skill = TWiki::Func::getCgiQuery()->param('skill'); + + my $user = TWiki::Func::getWikiName(); + + _Debug( $user . $cat . $skill ); + + my $obj_user = _getUserSkill($user, $skill, $cat); + + unless( $obj_user ){ + return ''; + } + + my $out = '{'; + $out .= _createJSON( { + skill => $obj_user->name, + category => $obj_user->category, + rating => $obj_user->rating, + comment => $obj_user->comment + } ); + $out .= '}'; + return $out; +} - if($message){ - $_[0] =~ s!%ADDSKILLSMESSAGE%!<div class="skillNotification"> - $message - </div>!; +sub _restAddEditSkill { + my ($session, $plugin, $verb, $response) = @_; + + _Debug( 'REST handler: getSkillDetails' ); + + my $cat = TWiki::Func::getCgiQuery()->param('category'); + my $skill = TWiki::Func::getCgiQuery()->param('skill'); + my $rating = TWiki::Func::getCgiQuery()->param('addedit-skill-rating'); + my $comment = TWiki::Func::getCgiQuery()->param('comment'); + + my $user = TWiki::Func::getWikiName(); + + my $error = _addEditUserSkill( $user, $cat, $skill, $rating, $comment ); + + my $message; + if( $error ){ + $message = "Error adding/editing skill '$skill' - $error"; } else { - $_[0] =~ s/%ADDSKILLSMESSAGE%//; + $message = "Skill '$skill' added/edited."; } - -# Only admins can rename and delete categories/skills -# this is because we need to edit user topics, to get the meta data - #unless($user->isAdmin()){ - unless( isAdmin() ){ - $_[0] =~ s!%MANAGESKILLSMESSAGE%!<div class="skillNotification"> - %ICON{"warning"}% You need to be an administrator to manage to skills. - Contact %WIKIWEBMASTER% for more information. - </div>!; - return; - } - -# rename category - if(defined $query->{'renamecategory'}){ - $query->{'renamecategory'} = undef; + + return $message; +} - require TWiki::Plugins::SkillsPlugin::Query; - $message = TWiki::Plugins::SkillsPlugin::Query::_renameCategory( - $query->{'oldcategory'}[0], - $query->{'newcategory'}[0] - ); +# ========================= FUNCTIONS +# adds a new category +sub _addNewCategory { + # TODO: Permissions + my( $newCat ) = @_; + + return 'Category not specified' unless( $newCat ); + + my $allSkills = _getAllSkills(); + return 'Category already exists' if( _categoryExists( $newCat, $allSkills ) ); + + my $new_obj_cat = TWiki::Plugins::SkillsPlugin::Category->new( $newCat ); + push @{ $allSkills }, $new_obj_cat; + + _saveSkills($allSkills); + + return undef; # no error +} -# delete category - } elsif(defined $query->{'deletecategory'}){ - $query->{'deletecategory'} = undef; +sub _addNewSkill { + # TODO: Permissions + my( $newSkill, $cat ) = @_; + + my $allSkills = _getAllSkills(); + my $obj_cat = _getCategoryByName( $cat, $allSkills ); + + return 'Could not find category/category does not exist.' unless $obj_cat; + + my $skills = $obj_cat->getSkills; + + return 'Skill already exists.' if( $obj_cat->skillExists( $newSkill ) ); + + $obj_cat->addSkill( $newSkill ); + + my $obj_cat2 = _getCategoryByName( $cat, $allSkills ); + + # Save to file + _saveSkills($allSkills); + + return undef; +} - require TWiki::Plugins::SkillsPlugin::Query; - $message = TWiki::Plugins::SkillsPlugin::Query::_deleteCategory($query->{'oldcategory'}[0]); - -# rename skill - } elsif(defined $query->{'renameskill'}){ - $query->{'renameskill'} = undef; +sub _showCategories { + my ( $format, $separator ) = @_; + + my $hasSeparator = $separator ne ''; + my $hasFormat = $format ne ''; - my ($cat, $oldskill) = split('\|', $query->{'oldskill'}[0]); + $separator = ', ' unless ( $hasSeparator || $hasFormat ); + $separator =~ s/\$n/\n/go; - require TWiki::Plugins::SkillsPlugin::Query; - $message = TWiki::Plugins::SkillsPlugin::Query::_renameSkill( - $cat, - $oldskill, - $query->{'newskill'}[0] - ); + $format = '$category' unless $hasFormat; + $format .= "\n" unless $separator; + $format =~ s/\$n/\n/go; -# move skill - } elsif(defined $query->{'moveskill'}){ - $query->{'moveskill'} = undef; + my $text = ''; + my $line = ''; + + my $allSkills = _getAllSkills(); + + my @cats; + foreach my $cat ( @{ $allSkills } ){ + push @cats, $cat->name; + } + + $text = join( + $separator, + map { + $line = $format; + $line =~ s/\$category/$_/go; + $line; + } @cats + ); - my ($oldcat, $skill) = split('\|', $query->{'movefrom'}[0]); - my $newcat = $query->{'moveto'}[0]; + return $text; +} - require TWiki::Plugins::SkillsPlugin::Query; - $message = TWiki::Plugins::SkillsPlugin::Query::_moveSkill( - $skill, - $oldcat, - $newcat - ); +# allows the user to print all skills in format of their choice +# this can be from a specific category, or all categories +# TODO: specify multiple categories? needed? +sub _showSkills { + #my $qCatSeparator = $params->{categoryseparator}; + my( $cat, $format, $separator, $prefix, $suffix, $catSeparator ) = @_; -# delete skill - } elsif(defined $query->{'deleteskill'}){ - $query->{'deleteskill'} = undef; + my $hasSeparator = $separator ne ''; + my $hasFormat = $format ne ''; - my ($cat, $skill) = split('\|', $query->{'oldskill'}[0]); + $separator = ', ' unless ( $hasSeparator || $hasFormat ); + $separator =~ s/\$n/\n/go; - require TWiki::Plugins::SkillsPlugin::Query; - $message = TWiki::Plugins::SkillsPlugin::Query::_deleteSkill( - $cat, - $skill + $format = '$skill' unless $hasFormat; + $format .= "\n" unless $separator; + $format =~ s/\$n/\n/go; + + $prefix =~ s/\$n/\n/go; + $suffix =~ s/\$n/\n/go; + + + my $text = ''; + my $line = ''; + + # get all skills + # if category is specified, only show skills in that category + # else, show them all + + my $allSkills = _getAllSkills(); + + if ($cat){ + + my $skills; + + foreach my $obj_cat ( @{ $allSkills } ){ + if( $cat eq $obj_cat->name ){ + $skills = $obj_cat->getSkills; + last; + } + } + + $text = join( + $separator, + map { + $line = $format; + $line =~ s/\$skill/$_/go; + $line; + } @$skills ); + + return $text; + } + # all skills and categories + else { + $catSeparator = "\n" unless ( $catSeparator ne '' ); - # category/skill message - if($message){ - $_[0] =~ s!%MANAGESKILLSMESSAGE%!<div class="skillNotification">$message</div>!; - } else { - $_[0] =~ s/%MANAGESKILLSMESSAGE%//; + foreach my $obj_cat ( @{ $allSkills } ){ + my $prefixLine = $prefix; + $prefixLine =~ s/\$category/$obj_cat->name/goe; + $prefixLine =~ s/\$n/\n/go; + $text .= $prefixLine; + + $text .= join( + $separator, + map { + $line = $format; + $line =~ s/\$category/$obj_cat->name/goe; + $line =~ s/\$skill/$_/go; + $line; + } @{ $obj_cat->getSkills } + ); + + my $suffixLine = $suffix; + $suffixLine =~ s/\$category/$obj_cat->name/goe; + $suffixLine =~ s/\$n/\n/go; + $text .= $suffixLine; + + # seperate each category + $text .= $catSeparator; + } + + return $text; } - } # ========================= -# Adds the css styles to the header -sub _addCssStyle { - - return if $doneHeader; - $doneHeader = 1; - - my $defaultStyle = TWiki::Func::getPubUrlPath() . '/' . # /pub/ - TWiki::Func::getTwikiWebname() . '/' . # TWiki/ - $pluginName . '/' . # SkillsPlugin/ - 'style.css'; +# gets all skills from file +# returns array of category objects +sub _getAllSkills { + # TODO: could store in session to prevent multiple file reads? + # TODO: could store using Storable? Or maybe in tmp? + _Debug( 'reading skills.txt' ); + my $workArea = TWiki::Func::getWorkArea( $pluginName ); + my $file; + unless ( $file = TWiki::Func::readFile( $workArea . '/skills.txt' ) ){ + # no existing skills + _Debug('skills.txt not found. No skills loaded.'); + return; + } + + my @allSkills; + + my @text = grep { !/^\#.*/ } split('\n', $file); + foreach my $line (@text){ + $line =~ s/(.*)://g; + my $cat = $1; + my @skills = split(',', $line); + my $obj_cat = TWiki::Plugins::SkillsPlugin::Category->new($cat, \@skills); + #push @{ $allSkills{$cat} }, @skills; + push @allSkills, $obj_cat; + } + + #@allSkills = sort @allSkills; + # TODO: need to sort by cat->name... + + return \@allSkills; + +} - my $styleUrl = TWiki::Func::getPreferencesValue("SKILLS_STYLEURL") || $defaultStyle; - my $header = "<style type='text/css' media='all'>\@import url('$styleUrl');</style>"; +sub _categoryExists { - TWiki::Func::addToHEAD('SKILLSPLUGIN_CSS',$header); + if( _getCategoryByName( @_ ) ){ + return 1; + } else { + return undef; + } } -# javascript used in edit skills form and search skills form -sub _skillJScript { - require TWiki::Plugins::SkillsPlugin::Func; - - # which form - my $form = shift; - - my $JScriptOptions = 'options[0] = new Option("Choose a skill...", "0", true);'; - my $JScriptRatings = ''; - my $JScriptComments = ''; - - my $allSkills = (); - $allSkills = TWiki::Plugins::SkillsPlugin::Func::_getAllSkills(); - - # creates a javascript if statement, which will define which skills - # to display depending on the category selected - foreach my $cat (sort keys %$allSkills){ - $JScriptOptions .= "\t\tif (SelValue == '$cat'){\n"; - @{ $allSkills->{$cat} } = sort @{ $allSkills->{$cat} }; - for my $skill ( 0 .. $#{ $allSkills->{$cat} } ) { - $JScriptOptions .= "\t\t\toptions[$skill+1] = new Option('$allSkills->{$cat}->[$skill]', '$allSkills->{$cat}->[$skill]');\n"; +sub _getCategoryByName { + my( $cat, $allSkills ) = @_; + + foreach my $obj_cat( @{ $allSkills } ){ + if( lc$obj_cat->name eq lc$cat ){ + return $obj_cat; } - $JScriptOptions .= "\t\t}\n"; } + return undef; +} - my $user = TWiki::Func::getWikiName(); - my $skills = TWiki::Plugins::SkillsPlugin::Func::_getUserSkills($user); - foreach my $key (@$skills) { - # ratings - $JScriptRatings .= "\t\trating['$key->{'name'}'] = $key->{'rating'};\n"; - # comments - $JScriptComments .= "\t\tcomment['$key->{'name'}'] = '$key->{'comment'}';\n" - if $key->{'comment'}; +# Saves all the available categories and skills +sub _saveSkills { + my $allSkills = shift; + my $out = "# This file is generated. Do NOT edit!\n"; + + foreach my $obj_cat ( @{ $allSkills } ){ + $out .= $obj_cat->name . ':' . join(',', @{ $obj_cat->getSkills } ) . "\n"; } - my $outJScript = <<"EOT"; -<script type="text/javascript"> -// Populates the skills drop down menu -function setSkills(dropdown) -{ - var myindex = dropdown.selectedIndex - var SelValue = dropdown.options[myindex].value + my $workArea = TWiki::Func::getWorkArea( $pluginName ); - with (document.$form.skill){ - document.$form.skill.options.length = 0; - if(document.$form.rating){ - document.$form.rating[4].checked = true; - document.$form.comment.value = ""; - hideCancelComment(); - } -$JScriptOptions - } - + TWiki::Func::saveFile( $workArea . '/skills.txt', $out ); } -// Selects the rating radio button if the user is editing -// an existing skill -function setRating(dropdown) -{ - var myindex = dropdown.selectedIndex - var SelValue = dropdown.options[myindex].value - var rating = new Object; - var comment = new Object; - -$JScriptRatings -$JScriptComments - - if (rating[SelValue]){ - document.$form.rating[rating[SelValue]-1].checked = true; - } else { - document.$form.rating[4].checked = true; +sub _getUserSkill { + my( $user, $skill, $cat, $userSkills ) = @_; + + unless( $userSkills ){ + $userSkills = _getUserSkills( $user ); + } + + foreach my $obj_userSkill ( @{ $userSkills } ){ + if( $cat eq $obj_userSkill->category && $skill eq $obj_userSkill->name ){ + return $obj_userSkill; } - - if (comment[SelValue]){ - document.$form.comment.value = comment[SelValue]; - showCancelComment(); - } else { - document.$form.comment.value = ""; - hideCancelComment(); - } + } + return undef; } -function hideCancelComment() { - var el = document.getElementById('clearComment'); - el.style.display='none'; -} +sub _getUserSkills { + my $userTopic = shift; -function showCancelComment() { - var el = document.getElementById('clearComment'); - el.style.display=''; -} + my $mainWeb = TWiki::Func::getMainWebname(); -function clearText(el) { - el.value = ""; - hideCancelComment(); + my( $meta, undef ) = TWiki::Func::readTopic( $mainWeb, $userTopic ); + my @skillsMeta = $meta->find('SKILLS'); + + my @userSkills; + foreach my $skillMeta ( @skillsMeta ){ + my $obj_userSkill = TWiki::Plugins::SkillsPlugin::UserSkill->new( + $skillMeta->{name}, + $skillMeta->{category}, + $skillMeta->{rating}, + $skillMeta->{comment} + ); + push @userSkills, $obj_userSkill; + } + + return (\@userSkills); } -</script> -EOT - return $outJScript; - +sub _getAllUserSkills { + } -# Javascript for twisty effect (using tbody) -sub _addJScriptTbody { - - my $docpath = _getDocPath(); +sub _addEditUserSkill { + my ($user, $cat, $skill, $rating, $comment ) = @_; - my $jScript = <<"EOT"; -<script type="text/javascript"> -function hideShow(id){ - var body = document.getElementById(id); - if (body) { - if (body.style.display == 'none') { - try { - body.style.display=''; - } catch(e) { - body.style.display = 'block'; - } - document[id + '|pic'].src = '$docpath/toggleclose.gif'; - } - else { - body.style.display = 'none'; - document[id + '|pic'].src = '$docpath/toggleopen.gif'; - } + my $userSkills = _getUserSkills( $user ); + + my $edited; + foreach my $obj_userSkill ( @{ $userSkills } ){ + if( $cat eq $obj_userSkill->category && $skill eq $obj_userSkill->name ){ + $obj_userSkill->rating( $rating ); + $obj_userSkill->comment( $comment ); + $edited = 1; + last; } + } + + unless( $edited ){ + my $obj_newUserSkill = TWiki::Plugins::SkillsPlugin::UserSkill->new( + $skill, + $cat, + $rating, + $comment + ); + push @{ $userSkills }, $obj_newUserSkill; + } + # save skills + my $error = _saveUserSkills( $user, $userSkills ); + + return $error; } -</script> -EOT - # add javascript to header - TWiki::Func::addToHEAD('SKILLSPLUGIN_JSCRIPT(TBODY)',$jScript); +sub _saveUserSkills { + my( $user, $userSkills ) = @_; + my $mainWeb = TWiki::Func::getMainWebname(); + + my( $meta, $text ) = TWiki::Func::readTopic( $mainWeb, $user ); + + $meta->remove('SKILLS'); + foreach my $obj_userSkill ( @{ $userSkills } ){ + $meta->putKeyed('SKILLS', { + name => $obj_userSkill->name, + category => $obj_userSkill->category, + rating => $obj_userSkill->rating, + comment => $obj_userSkill->comment + }); + } + my $error = TWiki::Func::saveTopic( $mainWeb, $user, $meta, $text, { dontlog => 1, comment=> 'SkillsPlugin', minor => 1 }); + if ($error){ + TWiki::Plugins::SkillsPlugin::_Warn("saveUserSkills error - $error"); + } + return $error; } -# gets the url for the comment popup -sub _getCommentUrl { +# adds the YUI Javascript files from header +# these are from the YahooUserInterfaceContrib, if installed +# or directly from the internet (See http://developer.yahoo.com/yui/articles/hosting/) +sub _addYUI { - my ($comment, $skill, $user) = @_; + return if ( $doneYui == 1 ); + $doneYui = 1; - my ($web, $topic) = _getCurrentTopic(); + my $yui; + #TODO + eval 'use TWiki::Contrib::YahooUserInterfaceContrib'; + if (! $@ ) { + _Debug( 'YahooUserInterfaceContrib is installed, using local files' ); + $yui = '<script type="text/javascript" src="%PUBURL%/%TWIKIWEB%/YahooUserInterfaceContrib/build/yahoo-dom-event/yahoo-dom-event.js"></script>' + . '<script type="text/javascript" src="%PUBURL%/%TWIKIWEB%/YahooUserInterfaceContrib/build/connection/connection-min.js"></script>' + . '<script type="text/javascript" src="%PUBURL%/%TWIKIWEB%/YahooUserInterfaceContrib/build/element/element-beta-min.js"></script>' + . '<script type="text/javascript" src="%PUBURL%/%TWIKIWEB%/YahooUserInterfaceContrib/build/json/json-min.js"></script>' + . '<script type="text/javascript" src="%PUBURL%/%TWIKIWEB%/YahooUserInterfaceContrib/build/animation/animation-min.js"></script>' + . '<script type="text/javascript" src="%PUBURL%/%TWIKIWEB%/YahooUserInterfaceContrib/build/container/container-min.js"></script>' + # style + . '<link rel="stylesheet" type="text/css" href="%PUBURL%/%TWIKIWEB%/YahooUserInterfaceContrib/build/container/assets/skins/sam/container.css" />'; + } else { + _Debug( 'YahooUserInterfaceContrib is not installed, using Yahoo servers' ); + $yui = '<script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/yahoo-dom-event/yahoo-dom-event.js"></script>' + . '<script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/connection/connection-min.js"></script>' + . '<script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/element/element-beta-min.js"></script>' + . '<script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/json/json-min.js"></script>' + . '<script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/animation/animation-min.js"></script>' + . '<script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/container/container-min.js"></script>' + # style + . '<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.2/build/container/assets/skins/sam/container.css" />'; + } - my $url = TWiki::Func::getScriptUrl($web, $topic, 'oops', - template => 'oopsgeneric', - param1 => 'Skills Plugin Comment <noautolink>', - param2 => "---++++ Comment for skill `$skill` by $user", - param3 => "$user has logged the following comment next to skill `$skill`.", - param4 => "<blockquote>$comment</blockquote> </noautolink>" - ); + TWiki::Func::addToHEAD($pluginName . '_yui', $yui); +} - # use template/oppsgeneric.skills.tmpl - return $url . '&cover=skills'; +# ========================= UTILITIES +# Taken from TagMePlugin (http://twiki.org/cgi-bin/view/Plugins/TagMePlugin) +sub _urlEncode { + my $text = shift; + $text =~ s/([^0-9a-zA-Z-_.:~!*'()\/%])/'%'.sprintf('%02x',ord($1))/ge; + return $text; } -# ========================= -# is user admin? -sub isAdmin { - if ( $TWiki::Plugins::VERSION > 1.11 ) { - # 1.12 and over - return TWiki::Func::isAnAdmin(); - } else { - my $user = $TWiki::Plugins::SESSION->{user}; - return $user->isAdmin(); +# because skills might be 'C++', a grep does not seem to be the best way to check a value is in an array +# therefore we loop array and use eq +# better way to this? please let me know! (and...@gm...) +sub _isInArray { + my( $match, $array ) = @_; + + for( @{ $array } ){ + return 1 if( lc( $_ ) eq lc( $match ) ); } + return 0; } -# checks if user is in ALLOWADDSKILLS -sub isAllowed { - return 0 if TWiki::Fu... [truncated message content] |