From 4cc609e7269465c7803edf1a41c4828c12417ca6 Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Tue, 21 Aug 2012 12:22:39 +0200 Subject: [PATCH] Adding elements in the skill profile + fixing wheel when clicking in a skill name see #1791 --- main/admin/skills_wheel.php | 6 +- main/css/base.css | 11 +- main/inc/ajax/skill.ajax.php | 43 +++++++- main/inc/lib/skill.lib.php | 48 ++++++--- main/template/default/skill/skill_wheel.tpl | 111 ++++++++++++++++---- 5 files changed, 179 insertions(+), 40 deletions(-) diff --git a/main/admin/skills_wheel.php b/main/admin/skills_wheel.php index 60c117c85e..b4b3341974 100644 --- a/main/admin/skills_wheel.php +++ b/main/admin/skills_wheel.php @@ -39,12 +39,14 @@ if (isset($_GET['load_user'])) { $skill_condition = ''; if (isset($_GET['skill_id'])) { - $skill_condition = 'skill_id='.intval($_GET['skill_id']); + $skill_condition = '&skill_id='.intval($_GET['skill_id']); + $tpl->assign('skill_id_to_load', $_GET['skill_id']); } -$url = api_get_path(WEB_AJAX_PATH)."skill.ajax.php?a=get_skills_tree_json&load_user=$load_user&$skill_condition"; +$url = api_get_path(WEB_AJAX_PATH)."skill.ajax.php?a=get_skills_tree_json&load_user=$load_user"; $tpl->assign('wheel_url', $url); + $url = api_get_path(WEB_AJAX_PATH).'skill.ajax.php?1=1'; $tpl->assign('url', $url); diff --git a/main/css/base.css b/main/css/base.css index d7087862a9..608667b3d1 100644 --- a/main/css/base.css +++ b/main/css/base.css @@ -4635,7 +4635,12 @@ i.size-32.icon-new-work{ stroke-width: 1.5; } +#skill_holder li { + float:left; + width: 120px; +} + #filepaths input{ - margin-bottom:5px; - -} \ No newline at end of file + margin-bottom:5px; +} + diff --git a/main/inc/ajax/skill.ajax.php b/main/inc/ajax/skill.ajax.php index 2753b896c4..96870fd071 100644 --- a/main/inc/ajax/skill.ajax.php +++ b/main/inc/ajax/skill.ajax.php @@ -33,6 +33,43 @@ switch ($action) { $return_skills[] = $skill; } echo json_encode($return_skills); + break; + case 'profile_matches': + $skill_rel_user = new SkillRelUser(); + $skills = $_REQUEST['skills']; + $users = $skill_rel_user->get_user_by_skills($skills); + + $total_skills_to_search = array(); + + if (!empty($users)) { + foreach ($users as $user) { + $user_info = api_get_user_info($user['user_id']); + $user_list[$user['user_id']]['user'] = $user_info; + $my_user_skills = $skill_rel_user->get_user_skills($user['user_id']); + $user_skills = array(); + $found_counts = 0 ; + foreach($my_user_skills as $my_skill) { + + $found = false; + if (in_array($my_skill['skill_id'], $skills)) { + $found = true; + $found_counts++; + } + $user_skills[] = array('skill_id' => $my_skill['skill_id'], 'found' => $found); + $total_skills_to_search[$my_skill['skill_id']] = $my_skill['skill_id']; + } + $user_list[$user['user_id']]['skills'] = $user_skills; + $user_list[$user['user_id']]['total_found_skills'] = $found_counts; + } + $ordered_user_list = array(); + foreach($user_list as $user_id => $user_data) { + $ordered_user_list[$user_data['total_found_skills']][] = $user_data; + } + if (!empty($ordered_user_list)) { + asort($ordered_user_list); + } + } + break; case 'get_gradebooks': $gradebooks = $gradebook_list = $gradebook->get_all(); @@ -162,9 +199,9 @@ switch ($action) { } break; case 'get_skills_tree_json': - $user_id = isset($_REQUEST['load_user']) && $_REQUEST['load_user'] == 1 ? api_get_user_id() : 0; - $skill_id = isset($_REQUEST['skill_id']) ? $_REQUEST['skill_id'] : 0; - $depth = isset($_REQUEST['main_depth']) ? $_REQUEST['main_depth'] : 2; + $user_id = isset($_REQUEST['load_user']) && $_REQUEST['load_user'] == 1 ? api_get_user_id() : 0; + $skill_id = isset($_REQUEST['skill_id']) ? $_REQUEST['skill_id'] : 0; + $depth = isset($_REQUEST['main_depth']) ? $_REQUEST['main_depth'] : 2; $all = $skill->get_skills_tree_json($user_id, $skill_id, false, $depth); echo $all; break; diff --git a/main/inc/lib/skill.lib.php b/main/inc/lib/skill.lib.php index e9e44deaf8..86839b9122 100644 --- a/main/inc/lib/skill.lib.php +++ b/main/inc/lib/skill.lib.php @@ -343,7 +343,7 @@ class Skill extends Model { $sql = "SELECT s.id, s.name, s.description, ss.parent_id, ss.relation_type FROM {$this->table} s INNER JOIN {$this->table_skill_rel_skill} ss ON (s.id = ss.skill_id) $id_condition ORDER BY ss.id, ss.parent_id"; - + $result = Database::query($sql); $skills = array(); @@ -367,6 +367,17 @@ class Skill extends Model { } } } + + //Load all children of the parent_id + if (!empty($skills) && !empty($parent_id)) { + foreach ($skills as $skill) { + $children = self::get_all($load_user_data, $user_id, $id, $skill['id']); + if (!empty($children)) { + //$skills = array_merge($skills, $children); + $skills = $skills + $children; + } + } + } return $skills; } @@ -575,6 +586,10 @@ class Skill extends Model { $skills = $this->get_all(false, false, null, $skill_id); } + $original_skill = $skills; + + //var_dump($skills); + //Show 1 item if ($add_root) { if (!empty($skill_id)) { @@ -584,16 +599,15 @@ class Skill extends Model { $skills[$skill_id]['parent_id'] = $skill_info['extra']['parent_id']; } } - + $refs = array(); $skills_tree = null; // Create references for all nodes - $flat_array = array(); - - $css_attributes = array('fill' => 'red'); - + $flat_array = array(); + $css_attributes = array('fill' => 'red'); $family = array(); + if (!empty($skills)) { foreach ($skills as &$skill) { @@ -636,13 +650,19 @@ class Skill extends Model { } $new_family_array[$main_family_id] = $family_id; $family_id++; - } + } - // Moving node to the children index of their parents - foreach ($skills as $skillInd => &$skill) { - $skill['data']['family_id'] = $new_family_array[$skill['id']]; - $refs[$skill['parent_id']]['children'][] = &$skill; - $flat_array[$skillInd] = $skill; + if (empty($original_skill)) { + $refs['root']['children'][0] = $skills[1]; + $refs['root']['children'][0]['children'][0] = $skills[$skill_id]; + $flat_array[$skill_id] = $skills[$skill_id]; + } else { + // Moving node to the children index of their parents + foreach ($skills as $my_skill_id => &$skill) { + $skill['data']['family_id'] = $new_family_array[$skill['id']]; + $refs[$skill['parent_id']]['children'][] = &$skill; + $flat_array[$my_skill_id] = $skill; + } } $skills_tree = array( @@ -650,7 +670,7 @@ class Skill extends Model { 'id' => 'root', 'children' => $refs['root']['children'], 'data' => array() - ); + ); } if ($return_flat_array) { @@ -665,7 +685,7 @@ class Skill extends Model { * */ public function get_skills_tree_json($user_id = null, $skill_id = null, $return_flat_array = false, $main_depth = 2) { - $tree = $this->get_skills_tree($user_id, $skill_id, $return_flat_array, true); + $tree = $this->get_skills_tree($user_id, $skill_id, $return_flat_array, true); $simple_tree = array(); if (!empty($tree['children'])) { diff --git a/main/template/default/skill/skill_wheel.tpl b/main/template/default/skill/skill_wheel.tpl index 00d12cd8c7..e333f4ca8b 100644 --- a/main/template/default/skill/skill_wheel.tpl +++ b/main/template/default/skill/skill_wheel.tpl @@ -3,6 +3,8 @@ var url = '{{ url }}'; +var skill_to_load_from_get = '{{ skill_id_to_load }}'; + function get_skill_info(my_id) { var skill = false; $.ajax({ @@ -40,8 +42,9 @@ function add_skill(params) { }); } +/* Skill search input in the left menu */ function check_skills_sidebar() { - //selecting only selected users + //Selecting only selected skills $("#skill_id option:selected").each(function() { var skill_id = $(this).val(); if (skill_id != "" ) { @@ -71,8 +74,11 @@ function check_skills_sidebar() { } }); - skill_info = get_skill_info(skill_id); - $("#skill_holder").append('
  • '+skill_info.name+'
  • '); + if ($('#skill_to_select_id_'+skill_id).length == 0) { + skill_info = get_skill_info(skill_id); + li = fill_skill_search_li(skill_id, skill_info.name); + $("#skill_holder").append(li); + } } }, }); @@ -80,7 +86,11 @@ function check_skills_sidebar() { }); } - +function fill_skill_search_li(skill_id, skill_name) { + return '
  • '+skill_name+'
  • '; +} + + function check_skills_edit_form() { //selecting only selected users $("#parent_id option:selected").each(function() { @@ -172,7 +182,7 @@ function delete_gradebook_from_skill(skill_id, gradebook_id) { success: function(result) { //if (result == 1) { $('#gradebook_item_'+gradebook_id).remove(); - $("#gradebook_id option").each(function () { + $("#gradebook_id option").each(function() { if ($(this).attr("value") == gradebook_id) { $(this).remove(); } @@ -185,15 +195,64 @@ function delete_gradebook_from_skill(skill_id, gradebook_id) { $(document).ready(function() { + $("#search_profile_form").submit(function() { + $("#skill_wheel").remove(); + var skill_list=[]; + $("#profile_search li").each(function() { + id = $(this).attr("id"); + if (id) { + console.log(id); + skill_list.push(id); + } + }); + + skill_list = { 'skill_id': skill_list}; + + skill_params = $.param(skill_list); + console.log(skill_params); + + $.ajax({ + url: url+'&a=profile_matches&skills='+skill_params, + async: false, + success: function(json) { + skill = jQuery.parseJSON(json); + return skill; + } + }); + return skill; + + }); + + $("#skill_holder").on("click", "input.skill_to_select", function() { + skill_id = $(this).attr('rel'); + skill_name = $(this).attr('name'); + if ($('#profile_match_item_'+skill_id).length == 0 ) { + $('#profile_search').append('
  • '+skill_name+'
  • '); + } else { + + $('#profile_match_item_'+skill_id).remove(); + } + }); + + /* Close button in gradebook select */ $("#gradebook_holder").on("click", "a.closebutton", function() { gradebook_id = $(this).attr('rel'); skill_id = $('#id').attr('value'); delete_gradebook_from_skill(skill_id, gradebook_id); - }); + }); + + /* Close button in profile matcher */ + $("#profile_search").on("click", "a.closebutton", function() { + skill_id = $(this).attr('rel'); + $('input[id=skill_to_select_id_'+skill_id+']').attr('checked', false); + $('#profile_match_item_'+skill_id).remove(); + }); + /* URL link when searching skills in the sidebar*/ $("#skill_holder").on("click", "a.load_wheel", function() { skill_id = $(this).attr('rel'); + skill_to_load_from_get = 0; load_nodes(skill_id, main_depth); }); @@ -301,8 +360,7 @@ $(document).ready(function() { reduce_top = 1; /* Locate the #div id element */ - $("#skill_wheel").remove(); - + $("#skill_wheel").remove(); $("#wheel_container").append('
    '); var div = d3.select("#skill_wheel"); @@ -353,6 +411,13 @@ $(document).ready(function() { }); load_skill_condition = ''; + + //First the $_GET value + if (skill_to_load_from_get != 0) { + load_skill_condition = 'skill_id=' + skill_to_load_from_get; + } + + //The JS load if (load_skill_id != 0) { load_skill_condition = 'skill_id=' + load_skill_id; } @@ -759,39 +824,49 @@ $(document).ready(function() {
    -
    + +

    {{ 'Skills'|get_lang }}

    +

    {{ 'ProfileSearch'|get_lang }}

    - +
    {{ 'WhatSkillsAreYouLookinFor'|get_lang }} - {{ 'RightClickOnSkillsInTheWheelToAddThemToThisProfileSearchBox'|get_lang }} - + + + {{ 'RightClickOnSkillsInTheWheelToAddThemToThisProfileSearchBox'|get_lang }} -

    {{ 'MySkills'|get_lang }}

    +
    +

    {{ 'GetNewSkills'|get_lang }}

    -

    {{ 'SkillInfo'|get_lang }}

    +
    +

    {{ 'SkillInfo'|get_lang }}

    +
    -
    +
    -
    +