Merge from 1.11.x

pull/3063/head
jmontoyaa 8 years ago
parent 5df6b770b8
commit ae5c871ecf
  1. 3
      main/admin/access_url_edit_course_category_to_url.php
  2. 11
      main/admin/access_url_edit_courses_to_url.php
  3. 26
      main/admin/career_dashboard.php
  4. 43
      main/admin/career_diagram.php
  5. 162
      main/admin/careers.php
  6. 11
      main/admin/configure_plugin.php
  7. 36
      main/admin/skill_badge_create.php
  8. 12
      main/admin/skill_badge_list.php
  9. 55
      main/admin/skill_create.php
  10. 60
      main/admin/skill_edit.php
  11. 1
      main/admin/skill_level.php
  12. 6
      main/admin/skill_list.php
  13. 17
      main/admin/skill_profile.php
  14. 12
      main/admin/skill_translate.php
  15. 1
      main/admin/skills.php
  16. 59
      main/admin/skills_import.php
  17. 1
      main/admin/skills_profile.php
  18. 1
      main/admin/special_exports.php
  19. 1
      main/badge/assign.php
  20. 1
      main/badge/issued.php
  21. 198
      main/inc/lib/skill.lib.php
  22. 31
      main/template/rainbow/skill/badge.tpl
  23. 1394
      main/template/rainbow/skill/badge_create.tpl
  24. 25
      main/template/rainbow/skill/badge_list.tpl
  25. 65
      main/template/rainbow/skill/issued.tpl
  26. 92
      main/template/rainbow/skill/list.tpl
  27. 50
      main/template/rainbow/skill/profile.tpl
  28. 23
      main/template/rainbow/skill/skill_info.tpl
  29. 353
      main/template/rainbow/skill/skill_tree.tpl
  30. 202
      main/template/rainbow/skill/skill_tree_student.tpl
  31. 12
      main/template/rainbow/skill/skill_wheel_student.tpl
  32. 12
      main/template/rainbow/skill/student_boss_report.tpl
  33. 12
      main/template/rainbow/skill/student_report.tpl

@ -1,5 +1,6 @@
<?php
/* For licensing terms, see /license.txt */
/**
* @package chamilo.admin
* @author Julio Montoya <gugli100@gmail.com>
@ -46,10 +47,8 @@ $htmlHeadXtra[] = '
function add_user_to_url(code, content) {
document.getElementById("course_to_add").value = "";
document.getElementById("ajax_list_courses").innerHTML = "";
destination = document.getElementById("destination_users");
destination.options[destination.length] = new Option(content,code);
destination.selectedIndex = -1;
sortOptions(destination.options);
}

@ -1,5 +1,6 @@
<?php
/* For licensing terms, see /license.txt */
/**
* @package chamilo.admin
* @author Julio Montoya <gugli100@gmail.com>
@ -142,11 +143,13 @@ if ($ajax_search) {
}
if ($add_type == 'multiple') {
$link_add_type_unique = '<a href="'.api_get_self().'?add_type=unique&access_url_id='.$access_url_id.'">'.get_lang('SessionAddTypeUnique').'</a>';
$link_add_type_unique = '<a href="'.api_get_self().'?add_type=unique&access_url_id='.$access_url_id.'">'.
get_lang('SessionAddTypeUnique').'</a>';
$link_add_type_multiple = get_lang('SessionAddTypeMultiple');
} else {
$link_add_type_unique = get_lang('SessionAddTypeUnique');
$link_add_type_multiple = '<a href="'.api_get_self().'?add_type=multiple&access_url_id='.$access_url_id.'">'.get_lang('SessionAddTypeMultiple').'</a>';
$link_add_type_multiple = '<a href="'.api_get_self().'?add_type=multiple&access_url_id='.$access_url_id.'">'.
get_lang('SessionAddTypeMultiple').'</a>';
}
$url_list = UrlManager::get_url_data();
?>
@ -291,10 +294,10 @@ $url_list = UrlManager::get_url_data();
}
function mysort(a, b) {
if(a.text.toLowerCase() > b.text.toLowerCase()){
if (a.text.toLowerCase() > b.text.toLowerCase()){
return 1;
}
if(a.text.toLowerCase() < b.text.toLowerCase()){
if (a.text.toLowerCase() < b.text.toLowerCase()){
return -1;
}
return 0;

@ -8,7 +8,10 @@
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
api_protect_admin_script();
$allowCareer = api_get_configuration_value('allow_session_admin_read_careers');
api_protect_admin_script($allowCareer);
$this_section = SECTION_PLATFORM_ADMIN;
@ -74,15 +77,18 @@ $actionLeft .= Display::url(
),
'careers.php'
);
$actionLeft .= Display::url(
Display::return_icon(
'promotion.png',
get_lang('Promotions'),
null,
ICON_SIZE_MEDIUM
),
'promotions.php'
);
if (api_is_platform_admin()) {
$actionLeft .= Display::url(
Display::return_icon(
'promotion.png',
get_lang('Promotions'),
null,
ICON_SIZE_MEDIUM
),
'promotions.php'
);
}
$actions = Display::toolbarAction('toolbar-career', array($actionLeft));
$html .= $form->returnForm();

@ -25,7 +25,8 @@ if (api_get_configuration_value('allow_career_diagram') == false) {
$this_section = SECTION_PLATFORM_ADMIN;
api_protect_admin_script();
$allowCareer = api_get_configuration_value('allow_session_admin_read_careers');
api_protect_admin_script($allowCareer);
$htmlHeadXtra[] = api_get_js('jsplumb2.js');
@ -55,7 +56,7 @@ $interbreadcrumb[] = array(
'name' => get_lang('Careers'),
);
$action = isset($_GET['action']) ? $_GET['action'] : null;
$action = isset($_GET['action']) ? $_GET['action'] : '';
$check = Security::check_token('request');
$token = Security::get_token();
@ -79,11 +80,41 @@ $item = $extraFieldValue->get_values_by_handler_and_field_variable(
false
);
// Check urls
$itemUrls = $extraFieldValue->get_values_by_handler_and_field_variable(
$careerId,
'career_urls',
false,
false,
false
);
$urlToString = '';
if (!empty($itemUrls) && !empty($itemUrls['value'])) {
$urls = explode(',', $itemUrls['value']);
$urlToString = '&nbsp;&nbsp;';
if (!empty($urls)) {
foreach ($urls as $urlData) {
$urlData = explode('@', $urlData);
if (isset($urlData[1])) {
$urlToString .= Display::url($urlData[0], $urlData[1]).'&nbsp;';
} else {
$urlToString .= $urlData[0].'&nbsp;';
}
}
}
}
$tpl = new Template(get_lang('Diagram'));
$html = Display::page_subheader2($careerInfo['name'].$urlToString);
if (!empty($item) && isset($item['value']) && !empty($item['value'])) {
$graph = unserialize($item['value']);
$tpl = new Template(get_lang('Diagram'));
$html = Display::page_subheader2($careerInfo['name']);
$html .= Career::renderDiagram($careerInfo, $graph);
$tpl->assign('content', $html);
$tpl->display_one_col_template();
} else {
Display::addFlash(
Display::return_message(
sprintf(get_lang('CareerXDoesntHaveADiagram'), $careerInfo['name']),
'warning'
));
}

@ -12,9 +12,10 @@ require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_PLATFORM_ADMIN;
api_protect_admin_script();
$allowCareer = api_get_configuration_value('allow_session_admin_read_careers');
api_protect_admin_script($allowCareer);
//Add the JS needed to use the jqgrid
// Add the JS needed to use the jqgrid
$htmlHeadXtra[] = api_get_jqgrid_js();
// setting breadcrumbs
@ -43,9 +44,6 @@ if ($action == 'add') {
$tool_name = get_lang('Careers');
}
// The header.
Display::display_header($tool_name);
//jqgrid will use this URL to do the selects
$url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_careers';
@ -87,38 +85,32 @@ if ($allow) {
$diagramLink = '<a href="'.api_get_path(WEB_CODE_PATH).'admin/career_diagram.php?id=\'+options.rowId+\'">'.get_lang('Diagram').'</a>';
}
//With this function we can add actions to the jgrid (edit, delete, etc)
$action_links = 'function action_formatter(cellvalue, options, rowObject) {
return \'<a href="?action=edit&id=\'+options.rowId+\'">'.Display::return_icon('edit.png', get_lang('Edit'), '', ICON_SIZE_SMALL).'</a>'.
$diagramLink.
'&nbsp;<a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;" href="?sec_token='.$token.'&action=copy&id=\'+options.rowId+\'">'.Display::return_icon('copy.png', get_lang('Copy'), '', ICON_SIZE_SMALL).'</a>'.
'&nbsp;<a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;" href="?sec_token='.$token.'&action=delete&id=\'+options.rowId+\'">'.Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL).'</a>'.
'\';
}';
?>
<script>
$(function() {
<?php
// grid definition see the $career->display() function
echo Display::grid_js(
'careers',
$url,
$columns,
$column_model,
$extra_params,
array(),
$action_links,
true
);
?>
});
</script>
<?php
// With this function we can add actions to the jgrid (edit, delete, etc)
if (api_is_platform_admin()) {
$actionLinks = 'function action_formatter(cellvalue, options, rowObject) {
return \'<a href="?action=edit&id=\'+options.rowId+\'">'.Display::return_icon('edit.png', get_lang('Edit'), '', ICON_SIZE_SMALL).'</a>'.
$diagramLink.
'&nbsp;<a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;" href="?sec_token='.$token.'&action=copy&id=\'+options.rowId+\'">'.Display::return_icon('copy.png', get_lang('Copy'), '', ICON_SIZE_SMALL).'</a>'.
'&nbsp;<a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;" href="?sec_token='.$token.'&action=delete&id=\'+options.rowId+\'">'.Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL).'</a>'.
'\';
}';
} else {
$actionLinks = "function action_formatter(cellvalue, options, rowObject) {
return '".$diagramLink."';
}";
}
$career = new Career();
$content = '';
$listUrl = api_get_self();
// Action handling: Add
switch ($action) {
case 'add':
api_protect_admin_script();
if (api_get_session_id() != 0 &&
!api_is_allowed_to_session_edit(false, true)
) {
@ -126,32 +118,36 @@ switch ($action) {
}
Session::write('notebook_view', 'creation_date');
$url = api_get_self().'?action='.Security::remove_XSS($_GET['action']);
$url = api_get_self().'?action='.Security::remove_XSS($_GET['action']);
$form = $career->return_form($url, 'add');
// The validation or display
if ($form->validate()) {
if ($check) {
$values = $form->exportValues();
$res = $career->save($values);
$res = $career->save($values);
if ($res) {
echo Display::return_message(get_lang('ItemAdded'), 'confirmation');
Display::addFlash(
Display::return_message(get_lang('ItemAdded'), 'confirmation')
);
}
}
$career->display();
header('Location: '.$listUrl);
exit;
} else {
echo '<div class="actions">';
echo '<a href="'.api_get_self().'">'.
$content .= '<div class="actions">';
$content .= '<a href="'.api_get_self().'">'.
Display::return_icon('back.png', get_lang('Back'), '', ICON_SIZE_MEDIUM).'</a>';
echo '</div>';
$content .= '</div>';
$form->addElement('hidden', 'sec_token');
$form->setConstants(array('sec_token' => $token));
$form->display();
$content .= $form->returnForm();
}
break;
case 'edit':
api_protect_admin_script();
// Action handling: Editing
$url = api_get_self().'?action='.Security::remove_XSS($_GET['action']).'&id='.intval($_GET['id']);
$url = api_get_self().'?action='.Security::remove_XSS($_GET['action']).'&id='.intval($_GET['id']);
$form = $career->return_form($url, 'edit');
// The validation or display
@ -162,56 +158,98 @@ switch ($action) {
$old_status = $career->get_status($values['id']);
$res = $career->update($values);
if ($res) {
echo Display::return_message(get_lang('CareerUpdated'), 'confirmation');
Display::addFlash(
Display::return_message(get_lang('CareerUpdated'), 'confirmation')
);
if ($values['status'] && !$old_status) {
echo Display::return_message(
sprintf(get_lang('CareerXUnarchived'), $values['name']),
'confirmation',
false
Display::addFlash(
Display::return_message(
sprintf(get_lang('CareerXUnarchived'), $values['name']),
'confirmation',
false
)
);
} elseif (!$values['status'] && $old_status) {
echo Display::return_message(
sprintf(get_lang('CareerXArchived'), $values['name']),
'confirmation',
false
Display::addFlash(
Display::return_message(
sprintf(get_lang('CareerXArchived'), $values['name']),
'confirmation',
false
)
);
}
}
}
$career->display();
header('Location: '.$listUrl);
exit;
} else {
echo '<div class="actions">';
echo '<a href="'.api_get_self().'">'.Display::return_icon('back.png', get_lang('Back'), '', ICON_SIZE_MEDIUM).'</a>';
echo '</div>';
$content .= '<div class="actions">';
$content .= '<a href="'.api_get_self().'">'.Display::return_icon('back.png', get_lang('Back'), '', ICON_SIZE_MEDIUM).'</a>';
$content .= '</div>';
$form->addElement('hidden', 'sec_token');
$form->setConstants(array('sec_token' => $token));
$form->display();
$content .= $form->returnForm();
}
break;
case 'delete':
api_protect_admin_script();
// Action handling: delete
if ($check) {
$res = $career->delete($_GET['id']);
if ($res) {
echo Display::return_message(get_lang('ItemDeleted'), 'confirmation');
Display::addFlash(
Display::return_message(get_lang('ItemDeleted'), 'confirmation')
);
}
}
$career->display();
header('Location: '.$listUrl);
exit;
break;
case 'copy':
api_protect_admin_script();
if (api_get_session_id() != 0 && !api_is_allowed_to_session_edit(false, true)) {
api_not_allowed();
api_not_allowed(true);
}
if ($check) {
$res = $career->copy($_GET['id'], true); //copy career and promotions inside
if ($res) {
echo Display::return_message(get_lang('ItemCopied'), 'confirmation');
Display::addFlash(
Display::return_message(get_lang('ItemCopied'), 'confirmation')
);
}
}
$career->display();
header('Location: '.$listUrl);
exit;
break;
default:
$career->display();
$content = $career->display();
break;
}
Display :: display_footer();
// The header.
Display::display_header($tool_name);
?>
<script>
$(function() {
<?php
// grid definition see the $career->display() function
echo Display::grid_js(
'careers',
$url,
$columns,
$column_model,
$extra_params,
array(),
$actionLinks,
true
);
?>
});
</script>
<?php
echo $content;
Display::display_footer();

@ -1,5 +1,6 @@
<?php
/* For licensing terms, see /license.txt */
/**
* @author Julio Montoya <gugli100@gmail.com> BeezNest 2012
* @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com>
@ -13,7 +14,6 @@ require_once __DIR__.'/../inc/global.inc.php';
api_protect_admin_script();
$pluginName = $_GET['name'];
$appPlugin = new AppPlugin();
$installedPlugins = $appPlugin->get_installed_plugins();
$pluginInfo = $appPlugin->getPluginInfo($pluginName, true);
@ -48,12 +48,14 @@ if (isset($form)) {
if ($form->validate()) {
$values = $form->getSubmitValues();
if (!isset($values['global_conference_allow_roles'])) {
$values['global_conference_allow_roles'] = [];
// Fix only for bbb
if ($pluginName == 'bbb') {
if (!isset($values['global_conference_allow_roles'])) {
$values['global_conference_allow_roles'] = [];
}
}
$accessUrlId = api_get_current_access_url_id();
api_delete_settings_params(
array(
'category = ? AND access_url = ? AND subkey = ? AND type = ? and variable <> ?' => array(
@ -92,7 +94,6 @@ if (isset($form)) {
}
Display::addFlash(Display::return_message(get_lang('Updated'), 'success'));
header("Location: $currentUrl");
exit;
} else {

@ -33,12 +33,8 @@ $badgeStudio = [
'script_js' => '<script src="'.api_get_path(WEB_LIBRARY_JS_PATH).'badge-studio/media/js/studio.js?"></script>'
];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$params = array(
'name' => $_POST['name'],
'description' => $_POST['description'],
'criteria' => $_POST['criteria'],
'id' => $skillId
);
@ -46,7 +42,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
!empty($_POST['badge_studio_image'])
) {
$dirPermissions = api_get_permissions_for_new_directories();
$fileName = sha1($_POST['name']);
$fileName = sha1($skill['name']);
$badgePath = api_get_path(SYS_UPLOAD_PATH).'badges/';
$existsBadgesDirectory = is_dir($badgePath);
@ -65,7 +61,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$skillImagePath = sprintf("%s%s.png", $badgePath, $fileName);
if (!empty($_POST['badge_studio_image'])) {
$badgeImage = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $_POST['badge_studio_image']));
$badgeImage = base64_decode(
preg_replace('#^data:image/\w+;base64,#i', '', $_POST['badge_studio_image'])
);
file_put_contents($skillImagePath, $badgeImage);
$skillImage = new Image($skillImagePath);
} else {
@ -82,13 +80,13 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$params['icon'] = sprintf("%s.png", $fileName);
} else {
Session::write('errorMessage', get_lang('UplUnableToSaveFile'));
Display::addFlash(Display::return_message(get_lang('UplUnableToSaveFile')), 'warning');
}
}
Display::addFlash(Display::return_message(get_lang('Updated')));
$objSkill->update($params);
header('Location: '.api_get_path(WEB_CODE_PATH).'admin/skill_badge_list.php');
header('Location: '.api_get_path(WEB_CODE_PATH).'admin/skill_list.php');
exit;
}
@ -96,29 +94,17 @@ $interbreadcrumb = array(
array(
'url' => api_get_path(WEB_CODE_PATH).'admin/index.php',
'name' => get_lang('Administration')
),
array(
'url' => api_get_path(WEB_CODE_PATH).'admin/skill_badge.php',
'name' => get_lang('Badges')
)
);
$interbreadcrumb[] = array('url' => 'skill_list.php', 'name' => get_lang('ManageSkills'));
$toolbar = $objSkill->getToolBar();
$toolbar = Display::toolbarButton(
get_lang('ManageSkills'),
api_get_path(WEB_CODE_PATH).'admin/skill_list.php',
'list',
'primary',
['title' => get_lang('ManageSkills')]
);
$tpl = new Template(get_lang('CreateBadge'));
$tpl->assign('platformAdminEmail', api_get_setting('emailAdministrator'));
$tpl->assign('skill', $skill);
$tpl->assign('badge_studio', $badgeStudio);
$templateName = $tpl->get_template('skill/badge_create.tpl');
$contentTemplate = $tpl->fetch($templateName);
$tpl->assign(
'actions',
Display::toolbarAction('toolbar', [$toolbar])
);
$tpl->assign('content', $contentTemplate);
$tpl->assign('content', $toolbar.$contentTemplate);
$tpl->display_one_col_template();

@ -1,12 +1,11 @@
<?php
/* For licensing terms, see /license.txt */
use ChamiloSession as Session;
/**
* Show information about Mozilla OpenBadges
* @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com>
* @package chamilo.admin.openbadges
* @deprecated use skill_list.php
*/
$cidReset = true;
@ -18,12 +17,6 @@ Skill::isAllowed();
$this_section = SECTION_PLATFORM_ADMIN;
$errorMessage = null;
if (Session::has('errorMessage')) {
$errorMessage = Session::read('errorMessage');
}
$objSkill = new Skill();
$skills = $objSkill->get_all();
@ -50,7 +43,6 @@ $toolbar = Display::url(
);
$tpl = new Template(get_lang('Skills'));
$tpl->assign('errorMessage', $errorMessage);
$tpl->assign('skills', $skills);
$templateName = $tpl->get_template('skill/badge_list.tpl');
$contentTemplate = $tpl->fetch($templateName);
@ -61,5 +53,3 @@ $tpl->assign(
);
$tpl->assign('content', $contentTemplate);
$tpl->display_one_col_template();
Session::erase('errorMessage');

@ -1,8 +1,6 @@
<?php
/* For licensing terms, see /license.txt */
use ChamiloSession as Session;
/**
* Create skill form
* @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com>
@ -23,12 +21,9 @@ $interbreadcrumb[] = array('url' => 'skill_list.php', 'name' => get_lang('Manage
/* Process data */
$skillParentId = isset($_GET['parent']) ? intval($_GET['parent']) : 0;
$formDefaultValues = [];
$objSkill = new Skill();
$objGradebook = new Gradebook();
if ($skillParentId > 0) {
$skillParentInfo = $objSkill->getSkillInfo($skillParentId);
@ -42,46 +37,10 @@ if ($skillParentId > 0) {
}
}
$allSkills = $objSkill->get_all();
$allGradebooks = $objGradebook->find('all');
// This procedure is for check if there is already a Skill with no Parent (Root by default)
$isAlreadyRootSkill = false;
foreach ($allSkills as $checkedSkill) {
if (intval($checkedSkill['parent_id']) > 0) {
$isAlreadyRootSkill = true;
break;
}
}
$skillList = $isAlreadyRootSkill ? [] : [0 => get_lang('None')];
$gradebookList = [];
foreach ($allSkills as $skill) {
$skillList[$skill['id']] = $skill['name'];
}
foreach ($allGradebooks as $gradebook) {
$gradebookList[$gradebook['id']] = $gradebook['name'];
}
/* Form */
$createForm = new FormValidator('skill_create');
$createForm->addHeader(get_lang('CreateSkill'));
$createForm->addText('name', get_lang('Name'), true, ['id' => 'name']);
$createForm->addText('short_code', get_lang('ShortCode'), false, ['id' => 'short_code']);
$createForm->addSelect('parent_id', get_lang('Parent'), $skillList, ['id' => 'parent_id']);
$createForm->addSelect(
'gradebook_id',
[get_lang('Gradebook'), get_lang('WithCertificate')],
$gradebookList,
['id' => 'gradebook_id', 'multiple' => 'multiple', 'size' => 10]
);
$createForm->addTextarea('description', get_lang('Description'), ['id' => 'description', 'rows' => 7]);
// EXTRA FIELDS
$extraField = new ExtraField('skill');
$returnParams = $extraField->addElements($createForm);
$returnParams = $objSkill->setForm($createForm, []);
$jquery_ready_content = $returnParams['jquery_ready_content'];
// the $jquery_ready_content variable collects all functions that will be load in the $(document).ready javascript function
@ -93,9 +52,6 @@ if (!empty($jquery_ready_content)) {
</script>';
}
$createForm->addButtonSave(get_lang('Save'));
$createForm->addHidden('id', null);
$createForm->setDefaults($formDefaultValues);
if ($createForm->validate()) {
@ -105,10 +61,11 @@ if ($createForm->validate()) {
$skillValues['item_id'] = $created;
$extraFieldValue = new ExtraFieldValue('skill');
$extraFieldValue->saveFieldValues($skillValues);
if ($created) {
$url = api_get_path(WEB_CODE_PATH).'admin/skill_edit.php?id='.$created;
$link = Display::url($skillValues['name'], $url);
Display::addFlash(
Display::return_message(get_lang('TheSkillHasBeenCreated'), 'success')
Display::return_message(get_lang('TheSkillHasBeenCreated').': '.$link, 'success', false)
);
} else {
Display::addFlash(
@ -120,6 +77,8 @@ if ($createForm->validate()) {
exit;
}
$toolbar = $objSkill->getToolbar();
$tpl = new Template(get_lang('CreateSkill'));
$tpl->assign('content', $createForm->returnForm());
$tpl->assign('content', $toolbar.$createForm->returnForm());
$tpl->display_one_col_template();

@ -1,8 +1,6 @@
<?php
/* For licensing terms, see /license.txt */
use ChamiloSession as Session;
/**
* Skill edit form
* @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com>
@ -27,7 +25,7 @@ $skillId = isset($_REQUEST['id']) ? intval($_REQUEST['id']) : 0;
$objSkill = new Skill();
$objGradebook = new Gradebook();
$skillInfo = $objSkill->getSkillInfo($skillId);
$allSkills = $objSkill->get_all();
$allGradebooks = $objGradebook->find('all');
$skillDefaultInfo = [
@ -36,6 +34,7 @@ $skillDefaultInfo = [
'short_code' => $skillInfo['short_code'],
'description' => $skillInfo['description'],
'parent_id' => $skillInfo['extra']['parent_id'],
'criteria' => $skillInfo['criteria'],
'gradebook_id' => []
];
@ -43,17 +42,7 @@ foreach ($skillInfo['gradebooks'] as $gradebook) {
$skillDefaultInfo['gradebook_id'][] = $gradebook['id'];
}
$skillList = [0 => get_lang('None')];
$gradebookList = [];
foreach ($allSkills as $skill) {
if ($skill['id'] == $skillInfo['id']) {
continue;
}
$skillList[$skill['id']] = $skill['name'];
}
foreach ($allGradebooks as $gradebook) {
$gradebookList[$gradebook['id']] = $gradebook['name'];
}
@ -61,27 +50,8 @@ foreach ($allGradebooks as $gradebook) {
/* Form */
$editForm = new FormValidator('skill_edit');
$editForm->addHeader(get_lang('SkillEdit'));
$returnParams = $objSkill->setForm($editForm, $skillInfo);
$translateNameUrl = api_get_path(WEB_CODE_PATH).'admin/skill_translate.php?'
.http_build_query(['skill' => $skillId, 'action' => 'name']);
$translateCodeUrl = api_get_path(WEB_CODE_PATH).'admin/skill_translate.php?'
.http_build_query(['skill' => $skillId, 'action' => 'code']);
$translateNameButton = Display::toolbarButton(get_lang('TranslateThisTerm'), $translateNameUrl, 'language', 'link');
$translateCodeButton = Display::toolbarButton(get_lang('TranslateThisTerm'), $translateCodeUrl, 'language', 'link');
$editForm->addText('name', [get_lang('Name'), $translateNameButton], true, ['id' => 'name']);
$editForm->addText('short_code', [get_lang('ShortCode'), $translateCodeButton], false, ['id' => 'short_code']);
$editForm->addSelect('parent_id', get_lang('Parent'), $skillList, ['id' => 'parent_id']);
$editForm->addSelect(
'gradebook_id',
[get_lang('Gradebook'), get_lang('WithCertificate')],
$gradebookList,
['id' => 'gradebook_id', 'multiple' => 'multiple', 'size' => 10]
);
$editForm->addTextarea('description', get_lang('Description'), ['id' => 'description', 'rows' => 7]);
// EXTRA FIELDS
$extraField = new ExtraField('skill');
$returnParams = $extraField->addElements($editForm, $skillId);
$jquery_ready_content = $returnParams['jquery_ready_content'];
// the $jquery_ready_content variable collects all functions that will be load
@ -94,11 +64,7 @@ if (!empty($jquery_ready_content)) {
</script>';
}
$editForm->addButtonSave(get_lang('Save'));
$editForm->addHidden('id', null);
$editForm->setDefaults($skillDefaultInfo);
if ($editForm->validate()) {
$skillValues = $editForm->getSubmitValues();
$updated = $objSkill->edit($skillValues);
@ -107,14 +73,18 @@ if ($editForm->validate()) {
$extraFieldValue->saveFieldValues($skillValues);
if ($updated) {
Session::write(
'message',
Display::return_message(get_lang('TheSkillHasBeenUpdated'), 'success')
Display::addFlash(
Display::return_message(
get_lang('TheSkillHasBeenUpdated'),
'success'
)
);
} else {
Session::write(
'message',
Display::return_message(get_lang('CannotUpdateSkill'), 'error')
Display::addFlash(
Display::return_message(
get_lang('CannotUpdateSkill'),
'error'
)
);
}
@ -122,7 +92,9 @@ if ($editForm->validate()) {
exit;
}
$toolbar = $objSkill->getToolBar();
/* view */
$tpl = new Template(get_lang('SkillEdit'));
$tpl->assign('content', $editForm->returnForm());
$tpl->assign('content', $toolbar.$editForm->returnForm());
$tpl->display_one_col_template();

@ -1,5 +1,4 @@
<?php
/* For licensing terms, see /license.txt */
/**

@ -14,6 +14,7 @@ require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_PLATFORM_ADMIN;
api_protect_admin_script();
Skill::isAllowed();
$action = isset($_GET['action']) ? $_GET['action'] : 'list';
@ -135,7 +136,7 @@ switch ($action) {
['title' => get_lang('SkillsWheel')]
);
$toolbar .= Display::url(
/*$toolbar .= Display::url(
Display::return_icon(
'edit-skill.png',
get_lang('BadgesManagement'),
@ -144,7 +145,7 @@ switch ($action) {
),
api_get_path(WEB_CODE_PATH).'admin/skill_badge_list.php',
['title' => get_lang('BadgesManagement')]
);
);*/
$toolbar .= Display::url(
Display::return_icon(
@ -197,6 +198,5 @@ switch ($action) {
);
$tpl->assign('content', $content);
$tpl->display_one_col_template();
break;
}

@ -1,5 +1,4 @@
<?php
/* For licensing terms, see /license.txt */
/**
@ -95,10 +94,10 @@ switch ($action) {
get_lang('List'),
null,
ICON_SIZE_MEDIUM
),
),
$listAction,
['title' => get_lang('List')]
);
);
break;
case 'edit':
$tpl->assign('form', $formToDisplay);
@ -108,10 +107,10 @@ switch ($action) {
get_lang('List'),
null,
ICON_SIZE_MEDIUM
),
),
$listAction,
['title' => get_lang('List')]
);
);
if ($form->validate()) {
$values = $form->exportValues();
@ -130,10 +129,10 @@ switch ($action) {
get_lang('List'),
null,
ICON_SIZE_MEDIUM
),
),
$listAction,
['title' => get_lang('List')]
);
);
$em->remove($item);
$em->flush();
header('Location: '.$listAction);
@ -147,10 +146,10 @@ switch ($action) {
get_lang('Add'),
null,
ICON_SIZE_MEDIUM
),
),
api_get_self().'?action=add',
['title' => get_lang('Add')]
);
);
}
$tpl->assign('list', $list);

@ -70,12 +70,18 @@ $form = new FormValidator('new_lang_variable', 'POST', $translateUrl);
$form->addHeader(get_lang('AddWordForTheSubLanguage'));
$form->addText('variable_language', get_lang('LanguageVariable'), false);
$form->addText('original_name', get_lang('OriginalName'), false);
$form->addSelect('sub_language', [get_lang('SubLanguage'), get_lang('OnlyActiveSubLanguagesAreListed')], $languagesOptions);
$form->addSelect(
'sub_language',
[get_lang('SubLanguage'), get_lang('OnlyActiveSubLanguagesAreListed')],
$languagesOptions
);
if ($languageId) {
$languageInfo = api_get_language_info($languageId);
$form->addText('new_language', [get_lang('Translation'), get_lang('IfThisTranslationExistsThisWillReplaceTheTerm')]);
$form->addText(
'new_language',
[get_lang('Translation'), get_lang('IfThisTranslationExistsThisWillReplaceTheTerm')]
);
$form->addHidden('file_id', 0);
$form->addHidden('id', $languageInfo['parent_id']);
$form->addHidden('sub', $languageInfo['id']);

@ -27,7 +27,6 @@ $html = $skill_visualizer->return_html();
$url = api_get_path(WEB_AJAX_PATH).'skill.ajax.php?1=1';
$tpl = new Template(null, false, false);
$tpl->assign('url', $url);
$tpl->assign('html', $html);
$tpl->assign('skill_visualizer', $skill_visualizer);

@ -70,7 +70,7 @@ function save_data($skills)
$oskill = new Skill();
$skill_id = $oskill->add($skill);
$parents[$saved_id] = $skill_id;
}
}
}
}
@ -81,12 +81,12 @@ function save_data($skills)
*/
function parse_csv_data($file)
{
$skills = Import :: csvToArray($file);
foreach ($skills as $index => $skill) {
$skills[$index] = $skill;
}
$skills = Import::csvToArray($file);
foreach ($skills as $index => $skill) {
$skills[$index] = $skill;
}
return $skills;
return $skills;
}
/**
@ -94,7 +94,7 @@ function parse_csv_data($file)
*/
function element_start($parser, $data)
{
$data = api_utf8_decode($data);
$data = api_utf8_decode($data);
global $skill;
global $current_tag;
switch ($data) {
@ -111,7 +111,7 @@ function element_start($parser, $data)
*/
function element_end($parser, $data)
{
$data = api_utf8_decode($data);
$data = api_utf8_decode($data);
global $skill;
global $skills;
global $current_value;
@ -130,9 +130,9 @@ function element_end($parser, $data)
*/
function character_data($parser, $data)
{
$data = trim(api_utf8_decode($data));
global $current_value;
$current_value = $data;
$data = trim(api_utf8_decode($data));
global $current_value;
$current_value = $data;
}
/**
@ -154,7 +154,7 @@ function parse_xml_data($file)
xml_parse($parser, api_utf8_encode_xml(file_get_contents($file)));
xml_parser_free($parser);
return $skills;
return $skills;
}
$this_section = SECTION_PLATFORM_ADMIN;
@ -180,7 +180,7 @@ if (!empty($_POST['formSent']) && $_FILES['import_file']['size'] !== 0) {
if (in_array($ext_import_file, $allowed_file_mimetype)) {
if (strcmp($file_type, 'csv') === 0 && $ext_import_file == $allowed_file_mimetype[0]) {
$skills = parse_csv_data($_FILES['import_file']['tmp_name']);
$skills = parse_csv_data($_FILES['import_file']['tmp_name']);
$errors = validate_data($skills);
$error_kind_file = false;
} elseif (strcmp($file_type, 'xml') === 0 && $ext_import_file == $allowed_file_mimetype[1]) {
@ -249,37 +249,8 @@ if (!empty($see_message_import)) {
echo Display::return_message($see_message_import, 'normal');
}
$toolbar = Display::url(
Display::return_icon(
'list_badges.png',
get_lang('ManageSkills'),
null,
ICON_SIZE_MEDIUM),
api_get_path(WEB_CODE_PATH).'admin/skill_list.php'
);
$toolbar .= Display::url(
Display::return_icon(
'wheel_skill.png',
get_lang('SkillsWheel'),
null,
ICON_SIZE_MEDIUM),
api_get_path(WEB_CODE_PATH).'admin/skills_wheel.php'
);
$toolbar .= Display::url(
Display::return_icon(
'edit-skill.png',
get_lang('BadgesManagement'),
null,
ICON_SIZE_MEDIUM),
api_get_path(WEB_CODE_PATH).'admin/skill_badge_list.php'
);
$actions = '<div class="actions">'.$toolbar.'</div>';
echo $actions;
$objSkill = new Skill();
echo $objSkill->getToolBar();
$form = new FormValidator('user_import', 'post', 'skills_import.php');
$form->addElement('header', '', $tool_name);

@ -89,7 +89,6 @@ if (!empty($users)) {
}
}
//$tpl->assign('user_list', $user_list);
$tpl->assign('order_user_list', $ordered_user_list);
$tpl->assign('total_search_skills', $count_skills);

@ -218,7 +218,6 @@ function rename_zip($FileZip)
} else {
return false;
}
}
function fullexportspecial()

@ -280,7 +280,6 @@ if ($form->validate()) {
$entityManager->persist($skillUser);
$entityManager->flush();
// ofaj
// Send email depending of children_auto_threshold
$skillRelSkill = new SkillRelSkill();
$skillModel = new \Skill();

@ -218,6 +218,7 @@ if ($form->validate() && $allowComment) {
$entityManager->persist($skillUserComment);
$entityManager->flush();
Display::addFlash(Display::return_message(get_lang('Added')));
header("Location: ".$skillIssue->getIssueUrl());
exit;

@ -197,17 +197,17 @@ class SkillRelSkill extends Model
}
/**
* @param int $skill_id
* @param int $skillId
* @param bool $add_child_info
* @return array
*/
public function getSkillParents($skill_id, $add_child_info = true)
public function getSkillParents($skillId, $add_child_info = true)
{
$skill_id = intval($skill_id);
$skillId = intval($skillId);
$sql = 'SELECT child.* FROM '.$this->table.' child
LEFT JOIN '.$this->table.' parent
ON child.parent_id = parent.skill_id
WHERE child.skill_id = '.$skill_id.' ';
WHERE child.skill_id = '.$skillId.' ';
$result = Database::query($sql);
$skill = Database::store_result($result, 'ASSOC');
$skill = isset($skill[0]) ? $skill[0] : null;
@ -233,7 +233,7 @@ class SkillRelSkill extends Model
$skillId = (int) $skillId;
$sql = 'SELECT parent_id as skill_id
FROM '.$this->table.'
WHERE skill_id = '.$skillId.' ';
WHERE skill_id = '.$skillId;
$result = Database::query($sql);
$skill = Database::store_result($result, 'ASSOC');
$skill = isset($skill[0]) ? $skill[0] : null;
@ -657,9 +657,10 @@ class Skill extends Model
$iconBig = Display::returnIconPath('badges-default.png', ICON_SIZE_HUGE);
}
$result['icon_big'] = $iconSmall;
$result['icon_small'] = $iconBig;
$result['icon_mini'] = $iconMini;
$result['icon_small'] = $iconSmall;
$result['icon_big'] = $iconBig;
$result['img_mini'] = Display::img($iconBig, $result['name'], ['width' => ICON_SIZE_MEDIUM]);
$result['img_big'] = Display::img($iconBig, $result['name']);
$result['img_small'] = Display::img($iconSmall, $result['name']);
@ -741,6 +742,7 @@ class Skill extends Model
$skill = $skill['data'];
}
$item = $skill[$imageSize];
$name = $skill['name'];
if (!empty($skill['short_code'])) {
$name = $skill['short_code'];
@ -849,6 +851,12 @@ class Skill extends Model
$webPath = api_get_path(WEB_UPLOAD_PATH);
if (Database::num_rows($result)) {
while ($row = Database::fetch_array($result, 'ASSOC')) {
$skillInfo = self::get($row['id']);
$row['img_mini'] = $skillInfo['img_mini'];
$row['img_big'] = $skillInfo['img_big'];
$row['img_small'] = $skillInfo['img_small'];
$row['name'] = self::translateName($row['name']);
$row['short_code'] = self::translateCode($row['short_code']);
$skillRelSkill = new SkillRelSkill();
@ -1088,23 +1096,26 @@ class Skill extends Model
$skillRelSkill = new SkillRelSkill();
$skillRelGradebook = new SkillRelGradebook();
//Saving name, description
// Saving name, description
$this->update($params);
$skillId = $params['id'];
$skill_id = $params['id'];
if ($skill_id) {
//Saving skill_rel_skill (parent_id, relation_type)
if ($skillId) {
// Saving skill_rel_skill (parent_id, relation_type)
if (!is_array($params['parent_id'])) {
$params['parent_id'] = array($params['parent_id']);
}
// Cannot change parent of root
if ($skillId == 1) {
$params['parent_id'] = 0;
}
foreach ($params['parent_id'] as $parent_id) {
$relation_exists = $skillRelSkill->relationExists($skill_id, $parent_id);
$relation_exists = $skillRelSkill->relationExists($skillId, $parent_id);
if (!$relation_exists) {
$attributes = array(
'skill_id' => $skill_id,
'skill_id' => $skillId,
'parent_id' => $parent_id,
'relation_type' => $params['relation_type'],
//'level' => $params['level'],
@ -1114,10 +1125,10 @@ class Skill extends Model
}
$skillRelGradebook->updateGradeBookListBySkill(
$skill_id,
$skillId,
$params['gradebook_id']
);
return $skill_id;
return $skillId;
}
return null;
}
@ -1190,7 +1201,6 @@ class Skill extends Model
$subTable .= '<ul>';
foreach ($vertex->getVerticesEdgeTo() as $subVertex) {
$data = $subVertex->getAttribute('graphviz.data');
$passed = in_array($data['id'], array_keys($skills));
$transparency = '';
if ($passed === false) {
@ -1221,10 +1231,10 @@ class Skill extends Model
* @param int $userId
* @param int $courseId
* @param int $sessionId
*
* @param bool $addTitle
* @return array
*/
public function getUserSkillsTable($userId, $courseId = 0, $sessionId = 0)
public function getUserSkillsTable($userId, $courseId = 0, $sessionId = 0, $addTitle = true)
{
$skills = $this->getUserSkills($userId, true, $courseId, $sessionId);
@ -1235,6 +1245,9 @@ class Skill extends Model
$parents = $this->get_parents($resultData['id']);
foreach ($parents as $parentData) {
$parentData['passed'] = in_array($parentData['id'], array_keys($skills));
if ($parentData['passed'] && isset($skills[$parentData['id']]['url'])) {
$parentData['data']['url'] = $skills[$parentData['id']]['url'];
}
$skillParents[$resultData['id']][$parentData['id']] = $parentData;
}
}
@ -1253,6 +1266,7 @@ class Skill extends Model
$tableRow = array(
'skill_badge' => $resultData['img_mini'],
'skill_name' => self::translateName($resultData['name']),
'short_code' => $resultData['short_code'],
'achieved_at' => api_get_local_time($resultData['acquired_skill_at']),
'course_image' => '',
'course_name' => '',
@ -1266,15 +1280,18 @@ class Skill extends Model
}
$allowLevels = api_get_configuration_value('skill_levels_names');
$tableResult = '<div class="table-responsive" >
<table class="table" >
<thead>
<tr>
<th>'.get_lang('AchievedSkills').'</th>
</tr>
</thead>
<tbody>
<tr><td>';
$tableResult = '<div class="table-responsive">';
if ($addTitle) {
$tableResult .= '
<table class="table" >
<thead>
<tr>
<th>'.get_lang('AchievedSkills').'</th>
</tr>
</thead>
<tbody>
<tr><td>';
}
if (!empty($skillParents)) {
if (empty($allowLevels)) {
@ -1340,11 +1357,14 @@ class Skill extends Model
$tableResult .= get_lang('WithoutAchievedSkills');
}
$tableResult .= '</td>
</tr>
</tbody>
</table>
</div>';
if ($addTitle) {
$tableResult .= '</td>
</tr>
</tbody>
</table>
';
}
$tableResult .= '</div>';
return [
@ -2085,7 +2105,6 @@ class Skill extends Model
return $skills;
}
/**
* @param string $name
* @return string
@ -2111,4 +2130,113 @@ class Skill extends Model
return isset($GLOBALS[$variable]) ? $GLOBALS[$variable] : $code;
}
/**
* @param FormValidator $form
* @param array $skillInfo
*
* @return array
*/
public function setForm(FormValidator &$form, $skillInfo = [])
{
$allSkills = $this->get_all();
$objGradebook = new Gradebook();
$isAlreadyRootSkill = false;
foreach ($allSkills as $checkedSkill) {
if (intval($checkedSkill['parent_id']) > 0) {
$isAlreadyRootSkill = true;
break;
}
}
$skillList = $isAlreadyRootSkill ? [] : [0 => get_lang('None')];
foreach ($allSkills as $skill) {
if (isset($skillInfo['id']) && $skill['id'] == $skillInfo['id']) {
continue;
}
$skillList[$skill['id']] = $skill['name'];
}
$allGradeBooks = $objGradebook->find('all');
// This procedure is for check if there is already a Skill with no Parent (Root by default)
$gradeBookList = [];
foreach ($allGradeBooks as $gradebook) {
$gradeBookList[$gradebook['id']] = $gradebook['name'];
}
$translateUrl = api_get_path(WEB_CODE_PATH).'admin/skill_translate.php?';
$translateNameButton = '';
$translateCodeButton = '';
$skillId = null;
if (!empty($skillInfo)) {
$skillId = $skillInfo['id'];
$translateNameUrl = $translateUrl.http_build_query(['skill' => $skillId, 'action' => 'name']);
$translateCodeUrl = $translateUrl.http_build_query(['skill' => $skillId, 'action' => 'code']);
$translateNameButton = Display::toolbarButton(
get_lang('TranslateThisTerm'),
$translateNameUrl,
'language',
'link'
);
$translateCodeButton = Display::toolbarButton(
get_lang('TranslateThisTerm'),
$translateCodeUrl,
'language',
'link'
);
}
$form->addText('name', [get_lang('Name'), $translateNameButton], true, ['id' => 'name']);
$form->addText('short_code', [get_lang('ShortCode'), $translateCodeButton], false, ['id' => 'short_code']);
// Cannot change parent of root
if ($skillId != 1) {
$form->addSelect('parent_id', get_lang('Parent'), $skillList, ['id' => 'parent_id']);
}
$form->addSelect(
'gradebook_id',
[get_lang('Gradebook'), get_lang('WithCertificate')],
$gradeBookList,
['id' => 'gradebook_id', 'multiple' => 'multiple', 'size' => 10]
);
$form->addTextarea('description', get_lang('Description'), ['id' => 'description', 'rows' => 7]);
$form->addTextarea('criteria', get_lang('CriteriaToEarnTheBadge'), ['id' => 'criteria', 'rows' => 7]);
// EXTRA FIELDS
$extraField = new ExtraField('skill');
$returnParams = $extraField->addElements($form, $skillId);
if (empty($skillInfo)) {
$form->addButtonCreate(get_lang('Add'));
} else {
$form->addButtonUpdate(get_lang('Update'));
}
$form->addHidden('id', null);
return $returnParams;
}
/**
* @return string
*/
public function getToolBar()
{
$toolbar = Display::url(
Display::return_icon(
'back.png',
get_lang('ManageSkills'),
null,
ICON_SIZE_MEDIUM
),
api_get_path(WEB_CODE_PATH).'admin/skill_list.php'
);
$actions = '<div class="actions">'.$toolbar.'</div>';
return $actions;
}
}

@ -1,18 +1,19 @@
<div class="col-md-12">
<div class="openbadges-tabs">
<ul class="nav nav-tabs">
<li class="active">
<a href="{{ _p.web_main }}admin/skill_badge.php">{{ 'Home' | get_lang }}</a>
</li>
<li>
<a href="{{ _p.web_main }}admin/skill_badge_list.php">{{ "CurrentBadges" | get_lang }}</a>
</li>
</ul>
</div>
<ul class="nav nav-tabs">
<li class="active">
<a href="{{ _p.web_main }}admin/skill_badge.php">{{ 'Home' | get_lang }}</a>
</li>
<li>
<a href="{{ _p.web_main }}admin/skill_badge_list.php">{{ "CurrentBadges" | get_lang }}</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane active">
<div class="openbadges-introduction">
<h1 class="title"><img src="{{ 'badges.png' | icon(64) }}" width="64" height="64">{{ 'OpenBadgesTitle' | get_lang }}</h1>
<h1 class="title">
<img src="{{ 'badges.png' | icon(64) }}" width="64" height="64">{{ 'OpenBadgesTitle' | get_lang }}
</h1>
<div class="row">
<div class="col-xs-12 col-md-6">
<p class="lead">
@ -30,14 +31,10 @@
<h3 class="sub-title">{{ 'OpenBadgesActionCall' | get_lang }}</h3>
<div class="block-content">
<div class="block-title">{{ 'IssuerDetails' | get_lang }}</div>
<p>{{ 'Name' | get_lang }} : {{ _s.institution }}</p>
<p>{{ 'URL' | get_lang }} : {{ _p.web }}</p>
<p>URL: {{ _p.web }}</p>
<div class="block-title">{{ 'BackpackDetails' | get_lang }}</div>
<p>{{ 'URL' | get_lang }} : {{ backpack }}</p>
<p>URL: {{ backpack }}</p>
<p>{{ 'TheBadgesWillBeSentToThatBackpack' | get_lang }}</p>
</div>

File diff suppressed because it is too large Load Diff

@ -1,5 +1,5 @@
<div class="col-md-12">
<div class="openbadges-tabs">
<ul class="nav nav-tabs">
<li>
<a href="{{ _p.web_main }}admin/skill_badge.php">{{ 'Home' | get_lang }}</a>
@ -8,19 +8,14 @@
<a href="{{ _p.web_main }}admin/skill_badge_list.php">{{ "CurrentBadges" | get_lang }}</a>
</li>
</ul>
</div>
<div class="tab-content">
<div class="tab-pane active">
<div class="openbadges-introduction">
{% if not errorMessage is empty %}
<div class="alert alert-error">
{{ errorMessage }}
</div>
{% endif %}
<div class="openbadges-tablet">
<table class="table">
<thead>
<tr>
<th>{{ 'Badges' | get_lang }}</th>
<th>{{ 'Name' | get_lang }}</th>
<th>{{ 'Description' | get_lang }}</th>
<th>{{ 'Actions' | get_lang }}</th>
@ -30,25 +25,21 @@
{% for skill in skills %}
<tr>
<td>
{% if skill.icon is empty %}
<img src="{{ 'badges-default.png' | icon(128) }}" width="50" height="50" alt="{{ skill.name }}">
{% else %}
<img src="{{ skill.web_icon_path }}" width="50" height="50" alt="{{ skill.name }}">
{% endif %}
{{ skill.img_small }}
</td>
<td>
{{ skill.name }}
</td>
<td>{{ skill.description }}</td>
<td>
<a href="{{ _p.web_main }}admin/skill_badge_create.php?id={{ skill.id }}" title="{{ 'Edit' | get_lang }}">
<img src="{{ 'edit.png' | icon(22) }}" width="22" height="22" alt="{{ 'Edit' | get_lang }}">
<a href="{{ _p.web_main }}admin/skill_badge_create.php?id={{ skill.id }}" class="btn btn-primary btn-sm" title="{{ "CreateBadge" | get_lang }}">
<em class="fa fa-shield fa-fw"></em>
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>

@ -15,7 +15,7 @@
<p>{{ issue_info.skill_description }}</p>
{% endif %}
{% if issue_info.skill_criteria %}
<h3>{{ 'CriteriaToEarnTheBadge'|get_lang }}</h3>
<h4>{{ 'CriteriaToEarnTheBadge'|get_lang }}</h4>
<p>{{ issue_info.skill_criteria }}</p>
{% endif %}
</div>
@ -55,13 +55,19 @@
<ul class="fa-ul">
<li>
{% if issue_info.source_name %}
<em class="fa-li fa fa-clock-o fa-fw"></em> {{ 'TimeXThroughCourseY'|get_lang|format(issue_info.datetime, issue_info.source_name) }}
<em class="fa-li fa fa-clock-o fa-fw"></em>
{{ 'TimeXThroughCourseY'|get_lang|format(issue_info.datetime, issue_info.source_name) }}
{% else %}
<em class="fa-li fa fa-clock-o fa-fw"></em> {{ issue_info.datetime }}
<em class="fa-li fa fa-clock-o fa-fw"></em>
{{ issue_info.datetime }}
{% endif %}
{% if issue_info.argumentation %}
{% if issue_info.argumentation %}
<b><p style="font-style: italic;">{{ 'UserXIndicated'|get_lang|format(issue_info.argumentation_author_name) }} </p></b>
<b>
<p style="font-style: italic;">
{{ 'UserXIndicated'|get_lang|format(issue_info.argumentation_author_name) }}
</p>
</b>
{% endif %}
<p>{{ issue_info.argumentation }}</p>
{% endif %}
@ -93,40 +99,44 @@
<hr>
<div class="panel panel-info">
<div class="panel-heading">
<em class="fa fa-comment-o fa-fw" aria-hidden="true"></em> {{ 'XComments'|get_lang|format(issue_info.comments|length) }}
<em class="fa fa-comment-o fa-fw" aria-hidden="true"></em>
{{ 'XComments'|get_lang|format(issue_info.comments|length) }}
/
<em class="fa fa-thumbs-o-up fa-fw" aria-hidden="true"></em> {{ 'AverageRatingX'|get_lang|format(issue_info.feedback_average) }}
<em class="fa fa-thumbs-o-up fa-fw" aria-hidden="true"></em>
{{ 'AverageRatingX'|get_lang|format(issue_info.feedback_average) }}
</div>
<div class="panel-body">
{{ comment_form }}
<hr>
{% for comment in issue_info.comments %}
<article class="media">
<div class="media-body">
<h4 class="media-heading">{{ comment.giver_complete_name }}</h4>
<p><small>{{ comment.datetime }}</small></p>
<p>{{ comment.text }}</p>
</div>
<div class="media-right text-right">
<div style="width: 80px;">
{% if comment.value %}
<em class="fa fa-certificate fa-fw" aria-label="{{ 'AverageRating' }}"></em>
<span class="sr-only">{{ 'AverageRating' }}</span> {{ comment.value }}
{% endif %}
{% if issue_info.comments %}
<hr>
{% for comment in issue_info.comments %}
<article class="media">
<div class="media-body">
<h4 class="media-heading">{{ comment.giver_complete_name }}</h4>
<p><small>{{ comment.datetime }}</small></p>
<p>{{ comment.text }}</p>
</div>
</div>
</article>
{% else %}
<p>{{ 'WithoutComment'|get_lang }}</p>
{% endfor %}
<div class="media-right text-right">
<div style="width: 80px;">
{% if comment.value %}
<em class="fa fa-certificate fa-fw" aria-label="{{ 'AverageRating' }}"></em>
<span class="sr-only">{{ 'AverageRating' }}</span> {{ comment.value }}
{% endif %}
</div>
</div>
</article>
{% endfor %}
{% endif %}
</div>
</div>
{% else %}
<hr>
<p class="lead">
<em class="fa fa-comment-o fa-fw" aria-hidden="true"></em> {{ 'XComments'|get_lang|format(issue_info.comments|length) }}
<em class="fa fa-comment-o fa-fw" aria-hidden="true"></em>
{{ 'XComments'|get_lang|format(issue_info.comments|length) }}
/
<em class="fa fa-thumbs-o-up fa-fw" aria-hidden="true"></em> {{ 'AverageRatingX'|get_lang|format(issue_info.feedback_average) }}
<em class="fa fa-thumbs-o-up fa-fw" aria-hidden="true"></em>
{{ 'AverageRatingX'|get_lang|format(issue_info.feedback_average) }}
</p>
{% endif %}
</div>
@ -136,7 +146,6 @@
$(document).on('ready', function () {
$('#badge-export-button').on('click', function (e) {
e.preventDefault();
OpenBadges.issue({{ issue_info.badge_assertion|json_encode() }});
});
});

@ -1,7 +1,19 @@
<legend>
<h1>{{ "ManageSkills" | get_lang }}</h1>
</legend>
{% if tags %}
<div class="row">
<div class="col-md-3" >
<select id="tag-filter" class="chzn-select form-control">
<option value="0">{{ 'PleaseSelectAChoice' | get_lang }}</option>
{% for tag in tags %}
<option value="{{ tag.id }}">{{ tag.tag }}</option>
{% endfor %}
</select>
</div>
<div class="col-md-3">
<a id="filter-button" class="btn btn-default">{{ 'FilterByTags' | get_lang }}</a>
</div>
</div>
<br />
{% endif %}
<div class="table table-responsive">
<table class="table table-hover table-striped">
<thead>
@ -23,42 +35,46 @@
</tr>
</tfoot>
<tbody>
{% for skill in skills %}
<tr>
<td width="50">
{% if skill.icon is empty %}
<img src="{{ 'badges-default.png' | icon(32) }}" width="32" height="32" alt="{{ skill.name }}">
{% else %}
<img src="{{ skill.web_icon_path }}" width="32" height="32" alt="{{ skill.name }}">
{% endif %}
</td>
<td width="200">{{ skill.name }}</td>
<td class="text-center">{{ skill.short_code }}</td>
<td width="500">{{ skill.description }}</td>
<td class="text-right">
<a href="{{ _p.web_main }}admin/skill_edit.php?id={{ skill.id }}" class="btn btn-primary btn-sm" title="{{ "Edit" | get_lang }}">
<em class="fa fa-edit fa-fw"></em>
</a>
<a href="{{ _p.web_main }}admin/skill_create.php?parent={{ skill.id }}" class="btn btn-primary btn-sm" title="{{ "CreateChildSkill" | get_lang }}">
<em class="fa fa-plus fa-fw"></em>
{% for skill in skills %}
<tr>
<td width="50">
{{ skill.img_small }}
</td>
<td width="200">{{ skill.name }}</td>
<td class="text-center">{{ skill.short_code }}</td>
<td width="500">{{ skill.description }}</td>
<td class="text-right">
<a href="{{ _p.web_main }}admin/skill_edit.php?id={{ skill.id }}" class="btn btn-default btn-sm" title="{{ "Edit" | get_lang }}">
<em class="fa fa-pencil fa-fw"></em>
</a>
<a href="{{ _p.web_main }}admin/skill_create.php?parent={{ skill.id }}" class="btn btn-primary btn-sm" title="{{ "CreateChildSkill" | get_lang }}">
<em class="fa fa-plus fa-fw"></em>
</a>
<a href="{{ _p.web_main }}admin/skill_badge_create.php?id={{ skill.id }}" class="btn btn-primary btn-sm" title="{{ "CreateBadge" | get_lang }}">
<em class="fa fa-shield fa-fw"></em>
</a>
{% if skill.status == 0 %}
<a href="{{ _p.web_self ~ '?' ~ {"action": "enable", "id": skill.id}|url_encode() }}" class="btn btn-success btn-sm" title="{{ 'Enable' }}">
<em class="fa fa-check-circle-o fa-fw"></em>
</a>
<a href="{{ _p.web_main }}admin/skill_badge_create.php?id={{ skill.id }}" class="btn btn-primary btn-sm" title="{{ "CreateBadge" | get_lang }}">
<em class="fa fa-shield fa-fw"></em>
{% else %}
<a href="{{ _p.web_self ~ '?' ~ {"action": "disable", "id": skill.id}|url_encode() }}" class="btn btn-danger btn-sm" title="{{ 'Disable' }}">
<em class="fa fa-ban fa-fw"></em>
</a>
{% if skill.status == 0 %}
<a href="{{ _p.web_self ~ '?' ~ {"action": "enable", "id": skill.id}|url_encode() }}" class="btn btn-success btn-sm" title="{{ 'Enable' }}">
<em class="fa fa-check-circle-o fa-fw"></em>
</a>
{% else %}
<a href="{{ _p.web_self ~ '?' ~ {"action": "disable", "id": skill.id}|url_encode() }}" class="btn btn-danger btn-sm" title="{{ 'Disable' }}">
<em class="fa fa-ban fa-fw"></em>
</a>
{% endif %}
</td>
</tr>
{% endfor %}
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<script>
$(document).ready(function() {
$("#tag-filter").val("{{ current_tag_id }}");
$("#filter-button").click(function() {
var tagId = $( "#tag-filter option:selected" ).val();
$(location).attr('href', '{{ _p.web_main }}admin/skill_list.php?tag_id='+tagId);
});
});
</script>

@ -1,28 +1,30 @@
{% if search_skill_list is not null %}
<div class="skills-skills">
<h3>{{"Skills"|get_lang}}</h3>
<ul class="holder">
{% for search_skill_id in search_skill_list %}
<ul class="holder">
{% for search_skill_id in search_skill_list %}
<li class="bit-box">
{{ skill_list[search_skill_id].name}}
<a class="closebutton" href="?a=remove_skill&id={{search_skill_id}}"></a>
</li>
</li>
{% endfor %}
</ul>
<a id="add_profile" class="btn btn-default" href="#"><em class="fa fa-floppy-o"></em> {{"SaveThisSearch"|get_lang}}</a>
<a id="add_profile" class="btn btn-default" href="#">
<em class="fa fa-floppy-o"></em> {{"SaveThisSearch"|get_lang}}
</a>
</div>
{% endif %}
{% if profiles is not null %}
{% if profiles is not null %}
<div class="skills-profiles">
<h3>{{"SkillProfiles"|get_lang}}</h3>
<ul class="holder">
{%for profile in profiles %}
{%for profile in profiles %}
<li class="bit-box">
<a href="?a=load_profile&id={{profile.id}}">{{profile.name}}</a>
</li>
</li>
{% endfor %}
</ul>
</ul>
</div>
{% endif %}
@ -37,7 +39,7 @@
{% if (total_search_skills - count) == 1 %}
{{ "MissingOneStepToMatch"|get_lang }}
{% else %}
{{ "MissingXStepsToMatch"|get_lang | format(total_search_skills - count)}}
{{ "MissingXStepsToMatch"|get_lang | format(total_search_skills - count)}}
{% endif %}
{% endif %}
</h4>
@ -51,14 +53,16 @@
<div class="panel panel-default">
<div class="panel-body">
<div class="avatar-user">
<img class="img-circle" width="100" src="{{ user.user.avatar }}" class="center-block">
<img class="img-circle" width="100" src="{{ user.user.avatar }}" class="center-block">
</div>
<p class="text-center"><em class="fa fa-user"></em>
<p class="text-center"><em class="fa fa-user"></em>
<a href="{{ _p.web_main }}social/profile.php?u={{ user['user'].user_id }}" target="_blank">
{{ user['user'].complete_name_with_username }}
</a>
</p>
<p class="text-center"><em class="fa fa-graduation-cap"></em> {{ "AchievedSkills"|get_lang }} {{ user.total_found_skills }} / {{ total_search_skills }}</p>
<p class="text-center">
<em class="fa fa-graduation-cap"></em> {{ "AchievedSkills"|get_lang }} {{ user.total_found_skills }} / {{ total_search_skills }}
</p>
</div>
<ul class="list-group">
{% for skill_data in user.skills %}
@ -78,7 +82,7 @@
{% endfor %}
</ul>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
@ -89,21 +93,21 @@
{% endif %}
{% endif %}
</div>
<div id="dialog-form" style="display:none;">
<form id="save_profile_form" class="form-horizontal" name="form">
<div id="dialog-form" style="display:none;">
<form id="save_profile_form" class="form-horizontal" name="form">
<fieldset>
<div class="control-group">
<label class="control-label" for="name">{{"Name"|get_lang}}</label>
<div class="control-group">
<label class="control-label" for="name">{{"Name"|get_lang}}</label>
<div class="controls">
<input type="text" name="name" id="name" size="40" />
<input type="text" name="name" id="name" size="40" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="name">{{"Description"|get_lang}}</label>
</div>
<div class="control-group">
<label class="control-label" for="name">{{"Description"|get_lang}}</label>
<div class="controls">
<textarea name="description" id="description" class="span2" rows="7"></textarea>
</div>
</div>
</div>
</fieldset>
</form>
</form>
</div>

@ -1,15 +1,16 @@
<p>{{ "ToGetToLearnXYouWillNeedToTakeOneOfTheFollowingCourses" | get_lang | format( "<em>" ~ skill.name ~ "</em>") }}</p>
<ul>
{% for course in courses %}
<li>
<a href="#" class="course_description_popup" rel="{{ course.code }}">{{ "SkillXWithCourseX" | get_lang | format(skill.name, course.title) }}</a>
</li>
{% endfor %}
{% for course in courses %}
<li>
<a href="#" class="course_description_popup" rel="{{ course.code }}">
{{ "SkillXWithCourseX" | get_lang | format(skill.name, course.title) }}
</a>
</li>
{% endfor %}
{% for session in sessions %}
<li>
{{ "SkillXWithCourseX" | get_lang | format(skill.name, session.name) }}
</li>
{% endfor %}
{% for session in sessions %}
<li>
{{ "SkillXWithCourseX" | get_lang | format(skill.name, session.name) }}
</li>
{% endfor %}
</ul>

@ -1,59 +1,58 @@
<style>
/* just because */
body {
/* fallback */
background-color: #eee;
background-image: url(images/radial_bg.png);
background-position: center center;
background-repeat: no-repeat;
/* Safari 4-5, Chrome 1-9 */ /* Can't specify a percentage size? Laaaaaame. */
background: -webkit-gradient(radial, center center, 0, center center, 460, from(#eee), to(#666));
/* Safari 5.1+, Chrome 10+ */
background: -webkit-radial-gradient(circle, #eee, #666);
/* Firefox 3.6+ */
background: -moz-radial-gradient(circle, #eee, #666);
/* IE 10 */
body {
/* fallback */
background-color: #eee;
background-image: url(images/radial_bg.png);
background-position: center center;
background-repeat: no-repeat;
/* Safari 4-5, Chrome 1-9 */ /* Can't specify a percentage size? Laaaaaame. */
background: -webkit-gradient(radial, center center, 0, center center, 460, from(#eee), to(#666));
/* Safari 5.1+, Chrome 10+ */
background: -webkit-radial-gradient(circle, #eee, #666);
/* Firefox 3.6+ */
background: -moz-radial-gradient(circle, #eee, #666);
/* IE 10 */
background: -ms-radial-gradient(circle, #eee, #666);
}
</style>
<script type="text/javascript">
<script>
//js settings (see the skills.js for more)
var url = '{{url}}';
var url = '{{ url }}';
//Block settings see the SkillVisualizer Class
var offset_x = {{skill_visualizer.offset_x}};
var offset_y = {{skill_visualizer.offset_y}};
var space_between_blocks_x = {{skill_visualizer.space_between_blocks_x}};
var space_between_blocks_y = {{skill_visualizer.space_between_blocks_y}};
var center_x = {{skill_visualizer.center_x}};
var block_size = {{skill_visualizer.block_size}};
$(window).resize(function() {
jsPlumb.repaintEverything();
/*jsPlumb.repaint(".skill_root");
var offset_x = {{ skill_visualizer.offset_x }};
var offset_y = {{ skill_visualizer.offset_y }};
var space_between_blocks_x = {{ skill_visualizer.space_between_blocks_x }};
var space_between_blocks_y = {{ skill_visualizer.space_between_blocks_y }};
var center_x = {{ skill_visualizer.center_x }};
var block_size = {{ skill_visualizer.block_size }};
$(window).resize(function() {
jsPlumb.repaintEverything();
/*jsPlumb.repaint(".skill_root");
// When resize repaint everything + fix the root position
normal_weight = $('.skill_child :first-child').width();
normal_weight = $('.skill_child :first-child').width();
sum = $('body').width() / 2 - normal_weight/2;
$('.skill_root').animate({ left: sum, top:0 }, { duration: 100 });*/
});
jsPlumb.ready(function() {
//Setting the loading dialog
var loading = $( "#dialog-loading" );
var loading = $( "#dialog-loading" );
loading.dialog( "destroy" );
loading.dialog({
autoOpen:false,
height: 120,
modal: true,
zIndex: 10000,
resizable :false,
resizable :false,
closeOnEscape : false,
disabled: true,
disabled: true,
open: function(event, ui) { $(this).parent().children().children('.ui-dialog-titlebar-close').hide(); }
});
});
jQuery.ajaxSetup({
beforeSend: function() {
loading.dialog( "open" );
@ -61,31 +60,31 @@ jsPlumb.ready(function() {
console.log('before------------------->>');
},
complete: function(){
loading.dialog( "close" );
loading.dialog( "close" );
//$('#skill_tree').show();
console.log('complete------------------->>');
},
success: function() {}
});
//Return to root button
$('#return_to_root').click(function(){
clean_values();
console.log('Clean values');
console.log('Clean values');
console.log('Reopen the root ');
});
//Open dialog
$("#dialog-form").dialog({
autoOpen: false,
modal : true,
width : 550,
modal : true,
width : 550,
height : 480
});
//Filling skills select
/*
$.getJSON("{{url}}&a=get_skills&parent_id="+parents[0], {},
$.getJSON("{{url}}&a=get_skills&parent_id="+parents[0], {},
function(data) {
$.each(data, function(n, parent) {
// add a new option with the JSON-specified value and text
@ -93,9 +92,9 @@ jsPlumb.ready(function() {
});
}
);*/
//Filling gradebook select
$.getJSON("{{url}}&a=get_gradebooks", {},
$.getJSON("{{url}}&a=get_gradebooks", {},
function(data) {
$.each(data, function(n, gradebook) {
// add a new option with the JSON-specified value and text
@ -103,26 +102,26 @@ jsPlumb.ready(function() {
});
}
);
//Add button on click
$("#add_item_link").click(function() {
//Add button on click
$("#add_item_link").click(function() {
$("#name").attr('value', '');
$("#description").attr('value', '');
$("#description").attr('value', '');
$("#parent_id option:selected").removeAttr('selected');
$("#gradebook_id option:selected").removeAttr('selected');
$("#gradebook_id option:selected").removeAttr('selected');
$("#dialog-form").dialog("open");
//Filling skills select
var my_id = 1;
if (parents.length > 1) {
my_id = parents[1].split('_')[1];
my_id = parents[1].split('_')[1];
}
//Remove all options
$("#parent_id").find('option').remove();
$.getJSON("{{url}}&a=get_skills&id="+my_id, {
},
},
function(data) {
$.each(data, function(n, parent) {
// add a new option with the JSON-specified value and text
@ -131,219 +130,219 @@ jsPlumb.ready(function() {
}
);
});
//Add button process
var name = $( "#name" ),
description = $( "#description" ),
allFields = $( [] ).add( name ).add( description ), tips = $(".validateTips");
description = $( "#description" ),
allFields = $( [] ).add( name ).add( description ), tips = $(".validateTips");
$("#dialog-form").css('z-index', '9001');
$("#dialog-form").dialog({
$("#dialog-form").dialog({
buttons: {
"{{"Add"|get_lang}}" : function() {
"{{"Add"|get_lang}}" : function() {
var bValid = true;
bValid = bValid && checkLength( name, "name", 1, 255 );
if (bValid) {
var params = $("#add_item").serialize();
$.ajax({
async: false,
url: url+'&a=add&'+params,
success:function(my_id) {
success:function(my_id) {
//Setting the selected id from the form
parent_id = $("#parent_id option:selected").attr('value');
parent_id = $("#parent_id option:selected").attr('value');
//Reseting jsplumb
jsPlumb.reset();
jsPlumb.reset();
//Deletes all windows
$('.skill_root').remove();
$('.skill_child').remove();
//cleaning skills
skills = [];
//Setting the first parent
first_parent = parents[0];
//Deleting the first parent
console.log('parents before '+parents);
parents.splice(0,1);
console.log('parents now '+parents);
//Remove parent block
parents.splice(0,1);
console.log('parents now '+parents);
//Remove parent block
$('#block_'+parent_id).remove();
//Open the block
open_block('block_'+parent_id, 0, 1);
//Open the block
open_block('block_'+parent_id, 0, 1);
//Close dialog
$("#dialog-form").dialog("close");
}
$("#dialog-form").dialog("close");
}
});
}
}
},
close: function() {
},
close: function() {
$("#name").attr('value', '');
$("#description").attr('value', '');
$("#description").attr('value', '');
}
});
//Clicking in a box skill (we use live instead of bind because we're creating divs on the fly )
$(".open_block").click(function() {
var id = $(this).attr('id');
console.log('click.open_block id: ' + id);
console.log('parents: ' + parents);
//if is root
if (parents[0] == id) {
parents = [id];
}
}
if (parents[1] != id) {
console.log('parents.length ' +parents.length);
//If there are 2 parents in the skill_tree
if (parents.length == 2 ) {
first_parent = parents[0];
first_parent = parents[0];
$('#'+parents[1]).css('top', '0px');
//console.log('deleting: '+parents[0]);
//console.log('deleting: '+parents[0]);
//removing father
console.log("first_parent " + first_parent);
for (var i = 0; i < skills.length; i++) {
for (var i = 0; i < skills.length; i++) {
//console.log('looping '+skills[i].element + ' ');
if (skills[i].element == parents[0] ) {
console.log('deleting parent:'+ skills[i].element + ' here ');
console.log('deleting parent:'+ skills[i].element + ' here ');
jsPlumb.deleteEndpoint(skills[i].element);
jsPlumb.detachAllConnections(skills[i].element);
jsPlumb.removeAllEndpoints(skills[i].element);
jsPlumb.removeAllEndpoints(skills[i].element);
$("#"+skills[i].element).remove();
}
}
parents.splice(0,1);
}
parents.splice(0,1);
parents.push(id);
console.log('parents after slice/push: ' + parents);
}
if ($(this).hasClass('first_window')) {
}
if ($(this).hasClass('first_window')) {
console.log('im in a first_window (root)');
$('#'+first_parent).css('top', '0px');
//show the first_parent
//if (first_parent != '') {
parents = [first_parent, id];
parents = [first_parent, id];
open_parent(first_parent, id);
//}
}
if (jQuery.inArray(id, parents) == -1) {
if (jQuery.inArray(id, parents) == -1) {
parents.push(id);
console.log('parents push: ' + parents);
}
open_block(id, 0, 0);
open_block(id, 0, 0);
}
//Setting class
cleanclass($(this));
//Setting class
cleanclass($(this));
$(this).addClass('second_window');
parent_div = $("#"+parents[0]);
cleanclass(parent_div);
parent_div.addClass('first_window');
parent_div.addClass('skill_root');
parent_div = $("#"+parents[1]);
parent_div = $("#"+parents[1]);
cleanclass(parent_div);
parent_div.addClass('second_window');
//console.log(parents);
// console.log(skills);
console.log('first_parent : ' + first_parent);
// console.log(skills);
console.log('first_parent : ' + first_parent);
//redraw
jsPlumb.repaintEverything();
jsPlumb.repaint(id);
});
//Skill title click
//Skill title click
$(".edit_block").click(function() {
var my_id = $(this).attr('id');
my_id = my_id.split('_')[2];
//Cleaning selected
$("#parent_id option:selected").removeAttr('selected');
$("#gradebook_id option:selected").removeAttr('selected');
$.ajax({
url: url+'&a=get_skill_info&id='+my_id,
url: url+'&a=get_skill_info&id='+my_id,
success: function(json) {
var skill = jQuery.parseJSON(json);
$("#name").attr('value', skill.name);
$("#id").attr('value', skill.id);
$("#description").attr('value', skill.description);
$("#id").attr('value', skill.id);
$("#description").attr('value', skill.description);
//filling parent_id
$("#parent_id option[value='"+skill.extra.parent_id+"']").attr('selected', 'selected');
//filling the gradebook_id
jQuery.each(skill.gradebooks, function(index, data) {
$("#gradebook_id option[value='"+data.id+"']").attr('selected', 'selected');
//filling the gradebook_id
jQuery.each(skill.gradebooks, function(index, data) {
$("#gradebook_id option[value='"+data.id+"']").attr('selected', 'selected');
});
}
});
});
$("#gradebook_id").trigger("liszt:updated");
$("#parent_id").trigger("liszt:updated");
$("#dialog-form").dialog("open");
return false;
});
//Clicking in a box
$(".window").bind('click', function() {
var id = $(this).attr('id');
id = id.split('_')[1];
});
});
// chrome fix.
document.onselectstart = function () { return false; };
document.onselectstart = function () { return false; };
// render mode
var resetRenderMode = function(desiredMode) {
var newMode = jsPlumb.setRenderMode(desiredMode);
var newMode = jsPlumb.setRenderMode(desiredMode);
jsPlumbDemo.init();
};
resetRenderMode(jsPlumb.CANVAS);
resetRenderMode(jsPlumb.CANVAS);
});
;(function() {
;(function() {
prepare = function(div, endpointOptions) {
console.log('preparing = '+div);
console.log('endpointOptions = '+endpointOptions);
//jsPlumbDemo.initHover(elId);
var endPoint = jsPlumb.addEndpoint(div, endpointOptions);
var endPoint = jsPlumb.addEndpoint(div, endpointOptions);
skills.push({
element: div, endp:endPoint
});
return endPoint;
},
window.jsPlumbDemo = {
return endPoint;
},
window.jsPlumbDemo = {
init : function() {
console.log('Import defaults');
jsPlumb.Defaults.Anchors = [ "BottomCenter", "TopCenter" ];
console.log('Import defaults');
jsPlumb.Defaults.Anchors = [ "BottomCenter", "TopCenter" ];
jsPlumb.Defaults.Container = "skill_tree";
open_block('block_1', 0, 1);
// listen for clicks on connections, and offer to delete connections on click.
// listen for clicks on connections, and offer to delete connections on click.
jsPlumb.bind("click", function(conn, originalEvent) {
/*if (confirm("Delete connection from " + conn.sourceId + " to " + conn.targetId + "?"))
jsPlumb.detach(conn); */
});
});
}
};
})();
@ -351,33 +350,33 @@ jsPlumb.ready(function() {
$(document).ready(function() {
/*
//When creating a connection see
//http://jsplumb.org/apidocs/files/jsPlumb-1-3-2-all-js.html#bind
//http://jsplumb.org/apidocs/files/jsPlumb-1-3-2-all-js.html#bind
jsPlumb.bind("jsPlumbConnection", function(conn) {
//alert("Connection created " + conn.sourceId + " to " + conn.targetId + " ");
//jsPlumb.detach(conn);
//jsPlumb.detach(conn);
});
//When double clicking a connection
jsPlumb.bind("click", function(conn) {
jsPlumb.bind("click", function(conn) {
if (confirm("Delete connection from " + conn.sourceId + " to " + conn.targetId + "?"))
jsPlumb.detach(conn);
jsPlumb.detach(conn);
});
//When double clicking a connection
jsPlumb.bind("click", function(endpoint) {
if (confirm("Delete connection from " + conn.sourceId + " to " + conn.targetId + "?"))
jsPlumb.detach(conn);
jsPlumb.detach(conn);
});*/
$(".chzn-select").chosen();
$("#menu").draggable();
});
;(function() {
jsPlumbDemo.getSelector = function(spec) {
return $(spec);
};
jsPlumbDemo.attachBehaviour = function() {
$(".hide").click(function() {
jsPlumb.toggle($(this).attr("rel"));
@ -394,8 +393,8 @@ $(document).ready(function() {
jsPlumb.detachAll($(this).attr("rel"));
});
$("#clear").click(function() {
jsPlumb.detachEverything(); showConnections();
$("#clear").click(function() {
jsPlumb.detachEverything(); showConnections();
});
};
})();
@ -408,7 +407,7 @@ $(document).ready(function() {
{{ "Loading"|get_lang }}
<img src="{{ _p.web_img}}loadingAnimation.gif"/>
</p>
</div>
</div>
</div>
<div id="menu" class="well" style="top:20px; left:20px; width:380px; z-index: 9000; opacity: 0.9;">
@ -417,46 +416,46 @@ $(document).ready(function() {
<a style="z-index: 1000" class="btn" id="add_item_link" href="#">{{'AddSkill'|get_lang}}</a>
<a style="z-index: 1000" class="btn btn-default" id="return_to_root" href="#">{{'Root'|get_lang}}</a>
<a style="z-index: 1000" class="btn btn-default" id="return_to_admin" href="{{_p.web_main}}admin">{{'BackToAdmin'|get_lang}}</a>
</div>
</div>
<div id="skill_tree"></div>
<div id="dialog-form" style="display:none; z-index:9001;">
<div id="dialog-form" style="display:none; z-index:9001;">
<p class="validateTips"></p>
<form class="form-horizontal" id="add_item" name="form">
<fieldset>
<input type="hidden" name="id" id="id"/>
<div class="control-group">
<label class="control-label" for="name">{{'Name'|get_lang}}</label>
<div class="control-group">
<label class="control-label" for="name">{{'Name'|get_lang}}</label>
<div class="controls">
<input type="text" name="name" id="name" size="40" />
<input type="text" name="name" id="name" size="40" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="name">{{'Parent'|get_lang}}</label>
</div>
<div class="control-group">
<label class="control-label" for="name">{{'Parent'|get_lang}}</label>
<div class="controls">
<select id="parent_id" name="parent_id" />
</select>
</select>
</div>
</div>
<div class="control-group">
<label class="control-label" for="name">{{'Gradebook'|get_lang}}</label>
</div>
<div class="control-group">
<label class="control-label" for="name">{{'Gradebook'|get_lang}}</label>
<div class="controls">
<select id="gradebook_id" name="gradebook_id[]" multiple="multiple"/>
</select>
</select>
<span class="help-block">
{{'WithCertificate'|get_lang}}
</span>
</span>
</div>
</div>
<div class="control-group">
<label class="control-label" for="name">{{'Description'|get_lang}}</label>
<div class="control-group">
<label class="control-label" for="name">{{'Description'|get_lang}}</label>
<div class="controls">
<textarea name="description" id="description" rows="7"></textarea>
</div>
</div>
</div>
</fieldset>
</form>
</div>
</form>
</div>

@ -1,216 +1,216 @@
<style>
/* just because */
body {
/* fallback */
background-color: #eee;
background-image: url(images/radial_bg.png);
background-position: center center;
background-repeat: no-repeat;
/* Safari 4-5, Chrome 1-9 */ /* Can't specify a percentage size? Laaaaaame. */
background: -webkit-gradient(radial, center center, 0, center center, 460, from(#eee), to(#666));
/* Safari 5.1+, Chrome 10+ */
background: -webkit-radial-gradient(circle, #eee, #666);
/* Firefox 3.6+ */
background: -moz-radial-gradient(circle, #eee, #666);
/* IE 10 */
body {
/* fallback */
background-color: #eee;
background-image: url(images/radial_bg.png);
background-position: center center;
background-repeat: no-repeat;
/* Safari 4-5, Chrome 1-9 */ /* Can't specify a percentage size? Laaaaaame. */
background: -webkit-gradient(radial, center center, 0, center center, 460, from(#eee), to(#666));
/* Safari 5.1+, Chrome 10+ */
background: -webkit-radial-gradient(circle, #eee, #666);
/* Firefox 3.6+ */
background: -moz-radial-gradient(circle, #eee, #666);
/* IE 10 */
background: -ms-radial-gradient(circle, #eee, #666);
}
</style>
<script type="text/javascript">
<script>
//js settings
var url = '{{url}}';
var url = '{{ url }}';
//Block settings see the SkillVisualizer Class
var offset_x = {{skill_visualizer.offset_x}};
var offset_y = {{skill_visualizer.offset_y}};
var space_between_blocks_x = {{skill_visualizer.space_between_blocks_x}};
var space_between_blocks_y = {{skill_visualizer.space_between_blocks_y}};
var center_x = {{skill_visualizer.center_x}};
var block_size = {{skill_visualizer.block_size}};
var offset_x = {{ skill_visualizer.offset_x }};
var offset_y = {{ skill_visualizer.offset_y }};
var space_between_blocks_x = {{ skill_visualizer.space_between_blocks_x }};
var space_between_blocks_y = {{ skill_visualizer.space_between_blocks_y }};
var center_x = {{ skill_visualizer.center_x }};
var block_size = {{ skill_visualizer.block_size }};
jsPlumb.bind("ready", function() {
//Open dialog
$("#dialog-form").dialog({
autoOpen: false,
modal : true,
width : 550,
modal : true,
width : 550,
height : 350,
});
//Clicking in a box skill (we use live instead of bind because we're creating divs on the fly )
$(".open_block").click(function() {
var id = $(this).attr('id');
console.log('click.open_block id: ' + id);
console.log('parents: ' + parents);
//if is root
if (parents[0] == id) {
parents = [id];
}
}
if (parents[1] != id) {
console.log('parents.length ' +parents.length);
//If there are 2 parents in the skill_tree
if (parents.length == 2 ) {
first_parent = parents[0];
first_parent = parents[0];
$('#'+parents[1]).css('top', '0px');
//console.log('deleting: '+parents[0]);
//console.log('deleting: '+parents[0]);
//removing father
console.log("first_parent " + first_parent);
for (var i = 0; i < skills.length; i++) {
for (var i = 0; i < skills.length; i++) {
//console.log('looping '+skills[i].element + ' ');
if (skills[i].element == parents[0] ) {
console.log('deleting parent:'+ skills[i].element + ' here ');
console.log('deleting parent:'+ skills[i].element + ' here ');
jsPlumb.deleteEndpoint(skills[i].element);
jsPlumb.detachAllConnections(skills[i].element);
jsPlumb.removeAllEndpoints(skills[i].element);
jsPlumb.removeAllEndpoints(skills[i].element);
$("#"+skills[i].element).remove();
}
}
parents.splice(0,1);
}
parents.splice(0,1);
parents.push(id);
console.log('parents after slice/push: ' + parents);
}
if ($(this).hasClass('first_window')) {
}
if ($(this).hasClass('first_window')) {
console.log('im in a first_window (root)');
$('#'+first_parent).css('top', '0px');
//show the first_parent
//if (first_parent != '') {
parents = [first_parent, id];
parents = [first_parent, id];
open_parent(first_parent, id);
//}
}
if (jQuery.inArray(id, parents) == -1) {
if (jQuery.inArray(id, parents) == -1) {
parents.push(id);
console.log('parents push: ' + parents);
}
open_block(id, 0, 0);
open_block(id, 0, 0);
}
//Setting class
cleanclass($(this));
//Setting class
cleanclass($(this));
$(this).addClass('second_window');
parent_div = $("#"+parents[0]);
cleanclass(parent_div);
parent_div.addClass('first_window');
parent_div.addClass('skill_root');
parent_div = $("#"+parents[1]);
parent_div = $("#"+parents[1]);
cleanclass(parent_div);
parent_div.addClass('second_window');
//console.log(parents);
// console.log(skills);
console.log('first_parent : ' + first_parent);
// console.log(skills);
console.log('first_parent : ' + first_parent);
//redraw
jsPlumb.repaintEverything();
jsPlumb.repaint(id);
});
$(".edit_block").click(function() {
var my_id = $(this).attr('id');
my_id = my_id.split('_')[2];
$.ajax({
url: url+'&a=get_skill_info&id='+my_id,
url: url+'&a=get_skill_info&id='+my_id,
success: function(json) {
var skill = jQuery.parseJSON(json);
$("#name").html(skill.name);
$("#id").attr('value', skill.id);
$("#description").html(skill.description);
$("#id").attr('value', skill.id);
$("#description").html(skill.description);
//filling parent_id
$("#parent_id option[value='"+skill.extra.parent_id+"']").attr('selected', 'selected');
//filling the gradebook_id
//filling the gradebook_id
$("#gradebook_id").html('');
jQuery.each(skill.gradebooks, function(index, data) {
jQuery.each(skill.gradebooks, function(index, data) {
$("#gradebook_id").append('<span class="label_tag gradebook">'+data.name+'</div>');
});
},
});
$("#dialog-form").dialog("open");
return false;
});
$("#dialog-form").dialog({
close: function() {
close: function() {
$("#name").html('');
$("#description").html('');
$("#description").html('');
}
});
});
// chrome fix.
document.onselectstart = function () { return false; };
document.onselectstart = function () { return false; };
// render mode
var resetRenderMode = function(desiredMode) {
var newMode = jsPlumb.setRenderMode(desiredMode);
var newMode = jsPlumb.setRenderMode(desiredMode);
jsPlumbDemo.init();
};
resetRenderMode(jsPlumb.CANVAS);
};
resetRenderMode(jsPlumb.CANVAS);
});
;(function() {
window.jsPlumbDemo = {
;(function() {
window.jsPlumbDemo = {
init : function() {
console.log('Import defaults');
jsPlumb.Defaults.Anchors = [ "BottomCenter", "TopCenter" ];
console.log('Import defaults');
jsPlumb.Defaults.Anchors = [ "BottomCenter", "TopCenter" ];
jsPlumb.Defaults.Container = "skill_tree";
open_block('block_1', 1, 1);
open_block('block_1', 1, 1);
}
};
})();
$(document).ready( function() {
$(document).ready( function() {
//When creating a connection see
//http://jsplumb.org/apidocs/files/jsPlumb-1-3-2-all-js.html#bind
//http://jsplumb.org/apidocs/files/jsPlumb-1-3-2-all-js.html#bind
jsPlumb.bind("jsPlumbConnection", function(conn) {
//alert("Connection created " + conn.sourceId + " to " + conn.targetId + " ");
//jsPlumb.detach(conn);
//jsPlumb.detach(conn);
});
});
</script>
<div id="skill_tree"></div>
<div id="dialog-form" style="display:none;">
<div id="dialog-form" style="display:none;">
<form id="add_item" class="form-horizontal" name="form">
<fieldset>
<input type="hidden" name="id" id="id"/>
<div class="control-group">
<label class="control-label" for="name">Name</label>
<div class="controls">
<span id="name"></span>
<div class="control-group">
<label class="control-label" for="name">Name</label>
<div class="controls">
<span id="name"></span>
</div>
</div>
<div class="control-group">
<label class="control-label" for="name">Description</label>
<div class="control-group">
<label class="control-label" for="name">Description</label>
<div class="controls">
<span id="description"></span>
<span id="description"></span>
</div>
</div>
<div class="control-group">
<label class="control-label" for="name">Gradebook</label>
</div>
<div class="control-group">
<label class="control-label" for="name">Gradebook</label>
<div class="controls">
<div id="gradebook_id"></div>
<div id="gradebook_id"></div>
</div>
</div>
</div>
</fieldset>
</form>
</div>
</form>
</div>

@ -170,21 +170,19 @@
<figcaption class="avatar-author">{{ user_info.complete_name }}</figcaption>
</figure>
<p class="text-center">
<a href="{{ _p.web_main }}social/skills_ranking.php" class="btn btn-default" target="_blank">{{ 'YourSkillRankingX'|get_lang|format(ranking) }}</a>
<a href="{{ _p.web_main }}social/skills_ranking.php" class="btn btn-default" target="_blank">
{{ 'YourSkillRankingX'|get_lang|format(ranking) }}
</a>
</p>
<div class="text-center">
{% if skills is not empty %}
{% for skill in skills %}
{% if skill.icon is empty %}
<img src="{{ 'badges.png'|icon(32) }}" width="32" height="32" alt="{{ skill.name }}" title="{{ skill.name }}">
{% else %}
<img src="{{ skill.web_icon_thumb_path }}" width="32" height="32" alt="{{ skill.name }}" title="{{ skill.name }}">
{% endif %}
{{ skill.img_small }}
{% endfor %}
{% endif %}
{% for i in 1..(5 - ranking) %}
<img src="{{ 'badges-default.png'|icon(32) }}" width="32" height="32">
<img src="{{ 'badges-default.png'|icon(64) }}" width="64" height="64">
{% endfor %}
</div>
</div>

@ -24,12 +24,12 @@
{% if rows %}
<table class="table">
<thead>
<tr>
<th>{{ 'Student' | get_lang }}</th>
<th>{{ 'SkillsAcquired' | get_lang }}</th>
<th>{{ 'Date' | get_lang }}</th>
<th>{{ 'Course' | get_lang }}</th>
</tr>
<tr>
<th>{{ 'Student' | get_lang }}</th>
<th>{{ 'SkillsAcquired' | get_lang }}</th>
<th>{{ 'Date' | get_lang }}</th>
<th>{{ 'Course' | get_lang }}</th>
</tr>
</thead>
<tbody>
{% for row in rows %}

@ -115,12 +115,12 @@
<h1 class="page-header">{{ 'SkillsAcquired' | get_lang }}</h1>
<table class="table">
<thead>
<tr>
<th>{{ 'Badge' | get_lang }}</th>
<th>{{ 'Skill' | get_lang }}</th>
<th>{{ 'Date' | get_lang }}</th>
<th>{{ 'Course' | get_lang }}</th>
</tr>
<tr>
<th>{{ 'Badge' | get_lang }}</th>
<th>{{ 'Skill' | get_lang }}</th>
<th>{{ 'Date' | get_lang }}</th>
<th>{{ 'Course' | get_lang }}</th>
</tr>
</thead>
<tbody>
{% for row in rows %}

Loading…
Cancel
Save