skala
Laurent Opprecht 14 years ago
commit 0c1f2b55e8
  1. 324
      main/css/base.css
  2. 7
      main/inc/ajax/notebook.ajax.php
  3. 82
      main/inc/lib/autoload.class.php
  4. 100
      main/inc/lib/formvalidator/FormValidator.class.php
  5. 5
      main/inc/lib/import.lib.php
  6. 987
      main/install/update-db-1.8.5-1.8.6.inc.php
  7. 9
      main/link/index.php
  8. 84
      main/notebook/access.class.php
  9. 108
      main/notebook/ajax_controller.class.php
  10. 312
      main/notebook/controller.class.php
  11. 85
      main/notebook/course_import.class.php
  12. 100
      main/notebook/csv_reader.class.php
  13. 44
      main/notebook/csv_writer.class.php
  14. 319
      main/notebook/notebook.class.php
  15. 103
      main/notebook/notebook_form.class.php
  16. 387
      main/notebook/notebook_repository.class.php
  17. 167
      main/notebook/request.class.php
  18. 40
      main/notebook/resources/js/proxy.js
  19. 104
      main/notebook/resources/js/ui.js
  20. 88
      main/notebook/upload_file_form.class.php
  21. 25
      main/template/default/course_description/edit.tpl
  22. 34
      main/template/default/course_description/index.tpl
  23. 8
      main/template/default/course_description/upload.tpl
  24. 6
      main/template/default/glossary/edit.tpl
  25. 36
      main/template/default/glossary/index.tpl
  26. 8
      main/template/default/glossary/list.tpl
  27. 4
      main/template/default/glossary/table.tpl
  28. 7
      main/template/default/glossary/upload.tpl
  29. 8
      main/template/default/link/edit_category.tpl
  30. 8
      main/template/default/link/edit_link.tpl
  31. 66
      main/template/default/link/index.tpl
  32. 10
      main/template/default/notebook/edit.tpl
  33. 7
      main/template/default/notebook/header.tpl
  34. 41
      main/template/default/notebook/index.tpl
  35. 27
      main/template/default/notebook/javascript.tpl
  36. 32
      main/template/default/notebook/list.tpl
  37. 9
      main/template/default/notebook/upload.tpl

@ -3951,6 +3951,7 @@ footer {
padding-left: 25px;
box-shadow:none;
}
.btn.show{
border:none;
border-radius: 0;
@ -3981,36 +3982,6 @@ footer {
box-shadow:none;
}
.btn.edit{
border:none;
border-radius: 0;
background-color: transparent;
width:22px;
height:22px;
margin:0;
padding:0;
display:inline-block;
background-image: url('../img/icons/22/edit.png');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
}
.btn.delete{
border:none;
border-radius: 0;
background-color: transparent;
width:22px;
height:22px;
margin:0;
padding:0;
display:inline-block;
background-image: url('../img/icons/22/delete.png');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
}
.btn.loading{
border:none;
border-radius: 0;
@ -4026,186 +3997,105 @@ footer {
box-shadow:none;
}
.announce.btn.delete-all{
border:none;
border-radius: 0;
background-color: transparent;
i.size-32{
width:32px;
height:32px;
line-height: 32px;
margin:0;
padding:0;
display:inline-block;
background-image: url('../img/icons/32/delete_announce.png');
border:none;
border-radius: 0;
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
}
.btn.new_folder{
border:none;
border-radius: 0;
background-color: transparent;
width:32px;
height:32px;
margin:0;
padding:0;
display:inline-block;
}
i.size-32.icon-new-folder{
background-image: url('../img/icons/32/new_folder.png');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
}
.btn.new_link{
border:none;
border-radius: 0;
background-color: transparent;
width:32px;
height:32px;
margin:0;
padding:0;
display:inline-block;
i.size-32.icon-new-link{
background-image: url('../img/icons/32/new_link.png');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
}
.btn.export_csv{
border:none;
border-radius: 0;
background-color: transparent;
width:32px;
height:32px;
margin:0;
padding:0;
display:inline-block;
i.size-32.icon-export-csv{
background-image: url('../img/icons/32/export_csv.png');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
}
.btn.import_csv{
border:none;
border-radius: 0;
background-color: transparent;
width:32px;
height:32px;
margin:0;
padding:0;
display:inline-block;
i.size-32.icon-import-csv{
background-image: url('../img/icons/32/import_csv.png');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
}
.btn.delete_all{
border:none;
border-radius: 0;
background-color: transparent;
width:32px;
height:32px;
margin:0;
padding:0;
display:inline-block;
i.size-32.icon-delete-all{
background-image: url('../img/icons/32/delete.png');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
}
.btn.expand{
border:none;
border-radius: 0;
background-color: transparent;
width:32px;
height:32px;
margin:0;
padding:0;
display:inline-block;
background-image: url('../img/div_hide.gif');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
}
.btn.collapse{
border:none;
border-radius: 0;
background-color: transparent;
width:32px;
height:32px;
margin:0;
padding:0;
display:inline-block;
background-image: url('../img/div_show.gif');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
i.size-32.icon-back{
background-image: url('../img/icons/32/back.png');
}
.btn.back{
border:none;
border-radius: 0;
background-color: transparent;
width:32px;
height:32px;
margin:0;
padding:0;
display:inline-block;
background-image: url('../img/icons/32/back.png');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
i.size-32.icon-settings{
background-image: url('../img/icons/32/settings.png');
}
.btn.view.detailed{
border:none;
border-radius: 0;
background-color: transparent;
width:32px;
height:32px;
margin:0;
padding:0;
display:inline-block;
i.size-32.icon-view-detailed{
background-image: url('../img/icons/32/view_detailed.png');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
}
.btn.view.text{
border:none;
border-radius: 0;
background-color: transparent;
width:32px;
height:32px;
margin:0;
padding:0;
display:inline-block;
i.size-32.icon-view-text{
background-image: url('../img/icons/32/view_text.png');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
}
.announce.btn.new{
border:none;
border-radius: 0;
background-color: transparent;
width:32px;
height:32px;
i.size-32.icon-sort-by-created-date{
background-image: url('../img/icons/32/notes_order_by_date_new.png');
}
i.size-32.icon-sort-by-modified-date{
background-image: url('../img/icons/32/notes_order_by_date_mod.png');
}
i.size-32.icon-sort-by-title{
background-image: url('../img/icons/32/notes_order_by_title.png');
}
i.size-32.icon-new-announce{
background-image: url('../img/icons/32/new_announce.png');
}
i.size-22{
width:22px;
height:22px;
line-height: 22px;
margin:0;
padding:0;
display:inline-block;
background-image: url('../img/icons/32/new_announce.png');
border:none;
border-radius: 0;
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
background-color: transparent;
display:inline-block;
}
i.size-22.icon-edit{
background-image: url('../img/icons/22/edit.png');
}
i.size-22.icon-delete{
background-image: url('../img/icons/22/delete.png');
}
i.icon-collapse{
background-image: url('../img/div_show.gif');
}
i.icon-expand{
background-image: url('../img/div_hide.gif');
}
.announcement {
/* background: none repeat scroll 0 0 #F2F2F2;*/
border: 1px solid #D3D3D3;
@ -4379,21 +4269,51 @@ li.annoucement{
Glossary
*/
.glossary.btn.new.term{
border:none;
border-radius: 0;
background-color: transparent;
width:32px;
height:32px;
margin:0;
padding:0;
display:inline-block;
i.size-32.icon-new-glossary-term{
background-image: url('../img/icons/32/new_glossary_term.png');
background-repeat: no-repeat;
background-position:center center;
box-shadow:none;
}
/*
* Notebook
*/
i.size-32.icon-new-note{
background-image: url('../img/icons/32/new_note.png');
}
.notebook.entries li{
vertical-align: text-top;
}
.notebook.note{
display:inline-block;
width:49%;
margin-left:0;
margin-right:1;
padding:0;
}
.notebook.note{
background-color: #D2ECF5;
}
.notebook.note .title{
padding:1;
display:block;
margin-top:0;
margin-right:0;
margin-left:0;
padding-top:5px;
padding-bottom:12px;
vertical-align: baseline;
background-color: #028DC2 ;
color:#ffffff;
}
.notebook.note .footer{
text-align: right;
font-style:italic
}
#learning_path_main #control {
text-align: center;
@ -4493,28 +4413,36 @@ data table
/* Only for Firefox */
@-moz-document url-prefix() {
select#question_type_hidden option {
padding: 10px 0px 10px 40px;
background-repeat:no-repeat;
}
padding: 10px 0px 10px 40px;
background-repeat:no-repeat;
}
select#question_type_hidden option[value="1"] {background-image: url(../img/icons/32/mcua.gif);}
select#question_type_hidden option[value="2"] {background-image: url(../img/icons/32/mcma.gif);}
select#question_type_hidden option[value="3"] {background-image: url(../img/icons/32/fill_in_blanks.gif);}
select#question_type_hidden option[value="4"] {background-image: url(../img/icons/32/matching.gif);}
select#question_type_hidden option[value="5"] {background-image: url(../img/icons/32/open_answer.gif);}
select#question_type_hidden option[value="6"] {background-image: url(../img/icons/32/hotspot.gif);}
select#question_type_hidden option[value="1"] {background-image: url(../img/icons/32/mcua.gif);}
select#question_type_hidden option[value="2"] {background-image: url(../img/icons/32/mcma.gif);}
select#question_type_hidden option[value="3"] {background-image: url(../img/icons/32/fill_in_blanks.gif);}
select#question_type_hidden option[value="4"] {background-image: url(../img/icons/32/matching.gif);}
select#question_type_hidden option[value="5"] {background-image: url(../img/icons/32/open_answer.gif);}
select#question_type_hidden option[value="6"] {background-image: url(../img/icons/32/hotspot.gif);}
select#question_type_hidden option[value="7"] {background-image: url(../img/icons/32/mcma.gif);}
select#question_type_hidden option[value="8"] {background-image: url(../img/icons/32/mcma.gif);}
select#question_type_hidden option[value="7"] {background-image: url(../img/icons/32/mcma.gif);}
select#question_type_hidden option[value="8"] {background-image: url(../img/icons/32/mcma.gif);}
select#question_type_hidden option[value="9"] {background-image: url(../img/icons/32/mcmac.gif);}
select#question_type_hidden option[value="10"] {background-image: url(../img/icons/32/mcuao.gif);}
select#question_type_hidden option[value="11"] {background-image: url(../img/icons/32/mcmao.gif);}
select#question_type_hidden option[value="12"] {background-image: url(../img/icons/32/mcmaco.gif);}
select#question_type_hidden option[value="13"] {background-image: url(../img/icons/32/audio_question.png);}
select#question_type_hidden option[value="14"] {background-image: url(../img/icons/32/mcmagl.gif);}
select#question_type_hidden option[value="9"] {background-image: url(../img/icons/32/mcmac.gif);}
select#question_type_hidden option[value="10"] {background-image: url(../img/icons/32/mcuao.gif);}
select#question_type_hidden option[value="11"] {background-image: url(../img/icons/32/mcmao.gif);}
select#question_type_hidden option[value="12"] {background-image: url(../img/icons/32/mcmaco.gif);}
select#question_type_hidden option[value="13"] {background-image: url(../img/icons/32/audio_question.png);}
select#question_type_hidden option[value="14"] {background-image: url(../img/icons/32/mcmagl.gif);}
}
.btn-success.btn-install{
float: right;
}
/*
* work
*/
i.size-32.icon-new-work{
background-image: url('../img/icons/32/new_work.png');
}

@ -0,0 +1,7 @@
<?php
namespace Notebook;
require_once '../global.inc.php';
AjaxController::instance()->run();

@ -60,6 +60,9 @@ class Autoload
$result['db'] = '/main/inc/lib/db.class.php';
$result['AbstractLink'] = '/main/gradebook/lib/be/abstractlink.class.php';
$result['Access'] = '/main/inc/lib/access.class.php';
$result['AccessAll'] = '/main/inc/lib/access.class.php';
$result['AccessForbidden'] = '/main/inc/lib/access.class.php';
$result['AccessToken'] = '/main/inc/lib/access_token.class.php';
$result['Accessurleditcoursestourl'] = '/main/inc/lib/access_url_edit_courses_to_url_functions.lib.php';
$result['Accessurleditsessionstourl'] = '/main/inc/lib/access_url_edit_sessions_to_url_functions.lib.php';
@ -68,18 +71,9 @@ class Autoload
$result['AddManySessionToCategoryFunctions'] = '/main/inc/lib/add_many_session_to_category_functions.lib.php';
$result['AdminPage'] = '/main/admin/admin_page.class.php';
$result['Agenda'] = '/main/calendar/agenda.lib.php';
$result['AjaxController'] = '/main/inc/lib/ajax_controller.class.php';
$result['Announcement'] = '/main/coursecopy/classes/Announcement.class.php';
$result['AnnouncementEmail'] = '/main/announcements/announcement_email.class.php';
$result['Announcement\AjaxController'] = '/main/announcements/ajax_controller.class.php';
$result['Announcement\Announcement'] = '/main/announcements/announcement.class.php';
$result['Announcement\AnnouncementAttachementRepo'] = '/main/announcements/repo.class.php';
$result['Announcement\AnnouncementAttachment'] = '/main/announcements/announcement_attachment.class.php';
$result['Announcement\Controller'] = '/main/announcements/controller.class.php';
$result['Announcement\EditForm'] = '/main/announcements/edit_form.class.php';
$result['Announcement\Email'] = '/main/announcements/email.class.php';
$result['Announcement\MessageProcessor'] = '/main/announcements/message_processor.class.php';
$result['Announcement\Param'] = '/main/announcements/controller.class.php';
$result['Announcement\Repo'] = '/main/announcements/repo.class.php';
$result['Answer'] = '/main/exercice/answer.class.php';
$result['AppPlugin'] = '/main/inc/lib/plugin.lib.php';
$result['AssetAggregatedRenderer'] = '/main/inc/lib/system/media/renderer/asset_aggregated_renderer.class.php';
@ -110,6 +104,7 @@ class Autoload
$result['Category'] = '/main/gradebook/lib/be/category.class.php';
$result['Certificate'] = '/main/inc/lib/certificate.lib.php';
$result['Chamilo'] = '/main/inc/lib/chamilo.class.php';
$result['ChamiloIndexer'] = '/main/inc/lib/search/ChamiloIndexer.class.php';
$result['ChamiloSession'] = '/main/inc/lib/chamilo_session.class.php';
$result['Chat'] = '/main/inc/lib/chat.lib.php';
$result['ClassManager'] = '/main/inc/lib/classmanager.lib.php';
@ -121,6 +116,18 @@ class Autoload
$result['CourseArchiver'] = '/main/coursecopy/classes/CourseArchiver.class.php';
$result['CourseBuilder'] = '/main/coursecopy/classes/CourseBuilder.class.php';
$result['CourseCopyLearnpath'] = '/main/coursecopy/classes/CourseCopyLearnpath.class.php';
$result['CourseDescription\AjaxController'] = '/main/course_description/ajax_controller.class.php';
$result['CourseDescription\Controller'] = '/main/course_description/controller.class.php';
$result['CourseDescription\CourseDescription'] = '/main/course_description/course_description.class.php';
$result['CourseDescription\CourseDescriptionForm'] = '/main/course_description/course_description_form.class.php';
$result['CourseDescription\CourseDescriptionRepository'] = '/main/course_description/course_description_repository.class.php';
$result['CourseDescription\CourseDescriptionType'] = '/main/course_description/course_description_type.class.php';
$result['CourseDescription\CourseDescriptionTypeRepository'] = '/main/course_description/course_description_type_repository.class.php';
$result['CourseDescription\CourseImport'] = '/main/course_description/course_import.class.php';
$result['CourseDescription\CsvReader'] = '/main/course_description/csv_reader.class.php';
$result['CourseDescription\CsvWriter'] = '/main/course_description/csv_writer.class.php';
$result['CourseDescription\Request'] = '/main/course_description/request.class.php';
$result['CourseDescription\UploadFileForm'] = '/main/course_description/upload_file_form.class.php';
$result['CourseEntity'] = '/main/inc/lib/course_entity.class.php';
$result['CourseEntityRepository'] = '/main/inc/lib/course_entity_repository.class.php';
$result['CourseHome'] = '/main/inc/lib/course_home.lib.php';
@ -133,6 +140,7 @@ class Autoload
$result['CourseRestorer'] = '/main/coursecopy/classes/CourseRestorer.class.php';
$result['CourseSelectForm'] = '/main/coursecopy/classes/CourseSelectForm.class.php';
$result['CourseSession'] = '/main/coursecopy/classes/CourseSession.class.php';
$result['CsvObjectWriter'] = '/main/inc/lib/system/io/csv_object_writer.class.php';
$result['CsvReader'] = '/main/inc/lib/system/io/csv_reader.class.php';
$result['CsvWriter'] = '/main/inc/lib/system/io/csv_writer.class.php';
$result['Curl'] = '/main/inc/lib/system/net/curl.class.php';
@ -146,7 +154,6 @@ class Autoload
$result['Display'] = '/main/inc/lib/display.lib.php';
$result['Document'] = '/main/coursecopy/classes/Document.class.php';
$result['DocumentManager'] = '/main/inc/lib/document.lib.php';
$result['DokeosIndexer'] = '/main/inc/lib/search/DokeosIndexer.class.php';
$result['DropboxLink'] = '/main/gradebook/lib/be/dropboxlink.class.php';
$result['DummyCourseCreator'] = '/main/coursecopy/classes/DummyCourseCreator.class.php';
$result['Encoding'] = '/main/inc/lib/system/text/encoding.class.php';
@ -597,6 +604,17 @@ class Autoload
$result['GlobalMultipleAnswer'] = '/main/exercice/global_multiple_answer.class.php';
$result['Glossary'] = '/main/coursecopy/classes/Glossary.class.php';
$result['GlossaryManager'] = '/main/inc/lib/glossary.lib.php';
$result['Glossary\Access'] = '/main/glossary/access.class.php';
$result['Glossary\AjaxController'] = '/main/glossary/ajax_controller.class.php';
$result['Glossary\Controller'] = '/main/glossary/controller.class.php';
$result['Glossary\CourseImport'] = '/main/glossary/course_import.class.php';
$result['Glossary\CsvReader'] = '/main/glossary/csv_reader.class.php';
$result['Glossary\CsvWriter'] = '/main/glossary/csv_writer.class.php';
$result['Glossary\Glossary'] = '/main/glossary/glossary.class.php';
$result['Glossary\GlossaryForm'] = '/main/glossary/glossary_form.class.php';
$result['Glossary\GlossaryRepository'] = '/main/glossary/glossary_repository.class.php';
$result['Glossary\Request'] = '/main/glossary/request.class.php';
$result['Glossary\UploadFileForm'] = '/main/glossary/upload_file_form.class.php';
$result['GradeBookResult'] = '/main/gradebook/gradebook_result.class.php';
$result['GradeModel'] = '/main/inc/lib/grade_model.lib.php';
$result['GradeModelComponents'] = '/main/inc/lib/grade_model.lib.php';
@ -690,12 +708,14 @@ class Autoload
$result['Link\AjaxController'] = '/main/link/ajax_controller.class.php';
$result['Link\CategoryForm'] = '/main/link/category_form.class.php';
$result['Link\Controller'] = '/main/link/controller.class.php';
$result['Link\ImportCsv'] = '/main/link/import_csv.class.php';
$result['Link\Link'] = '/main/link/link.class.php';
$result['Link\LinkCategory'] = '/main/link/link_category.class.php';
$result['Link\LinkCategoryRepository'] = '/main/link/link_category_repository.class.php';
$result['Link\LinkForm'] = '/main/link/link_form.class.php';
$result['Link\LinkRepository'] = '/main/link/link_repository.class.php';
$result['Link\Request'] = '/main/link/request.class.php';
$result['Link\UploadFileForm'] = '/main/link/upload_file_form.class.php';
$result['Log'] = '/main/inc/lib/log.class.php';
$result['Login'] = '/main/inc/lib/login.lib.php';
$result['LoginRedirection'] = '/main/inc/lib/login_redirection.class.php';
@ -708,22 +728,6 @@ class Autoload
$result['Model\ItemPropertyRepository'] = '/main/inc/lib/item_property.class.php';
$result['Model\StudentPublication'] = '/main/inc/lib/student_publication.class.php';
$result['Model\StudentPublicationRepository'] = '/main/inc/lib/student_publication.class.php';
$result['Modelll\Forum'] = '/main/inc/lib/forum.class.php';
$result['Modelll\ForumAttachment'] = '/main/inc/lib/forum_attachment.class.php';
$result['Modelll\ForumAttachmentRepository'] = '/main/inc/lib/forum_attachment.class.php';
$result['Modelll\ForumCategory'] = '/main/inc/lib/forum_category.class.php';
$result['Modelll\ForumCategoryRepository'] = '/main/inc/lib/forum_category.class.php';
$result['Modelll\ForumMailcue'] = '/main/inc/lib/forum_mailcue.class.php';
$result['Modelll\ForumMailcueRepository'] = '/main/inc/lib/forum_mailcue.class.php';
$result['Modelll\ForumNotification'] = '/main/inc/lib/forum_notification.class.php';
$result['Modelll\ForumNotificationRepository'] = '/main/inc/lib/forum_notification.class.php';
$result['Modelll\ForumPost'] = '/main/inc/lib/forum_post.class.php';
$result['Modelll\ForumPostRepository'] = '/main/inc/lib/forum_post.class.php';
$result['Modelll\ForumRepository'] = '/main/inc/lib/forum.class.php';
$result['Modelll\ForumThread'] = '/main/inc/lib/forum_thread.class.php';
$result['Modelll\ForumThreadQualify'] = '/main/inc/lib/forum_thread_qualify.class.php';
$result['Modelll\ForumThreadQualifyLog'] = '/main/inc/lib/forum_thread_qualify_log.class.php';
$result['Modelll\ForumThreadRepository'] = '/main/inc/lib/forum_thread.class.php';
$result['MultipleAnswer'] = '/main/exercice/multiple_answer.class.php';
$result['MultipleAnswerCombination'] = '/main/exercice/multiple_answer_combination.class.php';
$result['MultipleAnswerCombinationTrueFalse'] = '/main/exercice/multiple_answer_combination_true_false.class.php';
@ -732,6 +736,17 @@ class Autoload
$result['MySpace'] = '/main/mySpace/myspace.lib.php';
$result['Nanogong'] = '/main/inc/lib/nanogong.lib.php';
$result['NotebookManager'] = '/main/inc/lib/notebook.lib.php';
$result['Notebook\Access'] = '/main/notebook/access.class.php';
$result['Notebook\AjaxController'] = '/main/notebook/ajax_controller.class.php';
$result['Notebook\Controller'] = '/main/notebook/controller.class.php';
$result['Notebook\CourseImport'] = '/main/notebook/course_import.class.php';
$result['Notebook\CsvReader'] = '/main/notebook/csv_reader.class.php';
$result['Notebook\CsvWriter'] = '/main/notebook/csv_writer.class.php';
$result['Notebook\Notebook'] = '/main/notebook/notebook.class.php';
$result['Notebook\NotebookForm'] = '/main/notebook/notebook_form.class.php';
$result['Notebook\NotebookRepository'] = '/main/notebook/notebook_repository.class.php';
$result['Notebook\Request'] = '/main/notebook/request.class.php';
$result['Notebook\UploadFileForm'] = '/main/notebook/upload_file_form.class.php';
$result['Notification'] = '/main/inc/lib/notification.lib.php';
$result['OLE'] = '/main/inc/lib/pear/OLE/OLE.php';
$result['OLE_ChainedBlockStream'] = '/main/inc/lib/pear/OLE/ChainedBlockStream.php';
@ -890,6 +905,17 @@ class Autoload
$result['Utf8Decoder'] = '/main/inc/lib/system/text/utf8_decoder.class.php';
$result['Utf8Encoder'] = '/main/inc/lib/system/text/utf8_encoder.class.php';
$result['Wiki'] = '/main/coursecopy/classes/wiki.class.php';
$result['Work\Access'] = '/main/work/access.class.php';
$result['Work\AjaxController'] = '/main/work/ajax_controller.class.php';
$result['Work\Controller'] = '/main/work/controller.class.php';
$result['Work\Request'] = '/main/work/request.class.php';
$result['Work\Settings'] = '/main/work/settings.class.php';
$result['Work\SettingsForm'] = '/main/work/settings_form.class.php';
$result['Work\SettingsRepository'] = '/main/work/settings_repository.class.php';
$result['Work\StudentPublicationAssignment'] = '/main/work/work_assignment.class.php';
$result['Work\Work'] = '/main/work/work.class.php';
$result['Work\WorkForm'] = '/main/work/work_form.class.php';
$result['Work\WorkRepository'] = '/main/work/work_repository.class.php';
$result['XapianIndexer'] = '/main/inc/lib/search/xapian/XapianIndexer.class.php';
$result['Zip'] = '/main/inc/lib/zip.class.php';
$result['ZombieManager'] = '/main/inc/lib/zombie/zombie_manager.class.php';
@ -925,7 +951,6 @@ class Autoload
$result['pChart'] = '/main/inc/lib/pchart/pChart.class.php';
$result['pData'] = '/main/inc/lib/pchart/pData.class.php';
$result['quiz_processor'] = '/main/inc/lib/search/tool_processors/quiz_processor.class.php';
$result['s) on one element\xmddoc'] = '/main/inc/lib/xmd.lib.php';
$result['scorm'] = '/main/newscorm/scorm.class.php';
$result['scormItem'] = '/main/newscorm/scormItem.class.php';
$result['scormMetadata'] = '/main/newscorm/scormMetadata.class.php';
@ -944,6 +969,7 @@ class Autoload
$result['vtodo'] = '/main/inc/lib/icalcreator/iCalcreator.class.php';
$result['xhtdoc'] = '/main/inc/lib/xht.lib.php';
return $result;
}

@ -19,6 +19,7 @@ define('TEACHER_HTML_FULLPAGE', 5);
*/
class FormValidator extends HTML_QuickForm
{
/**
* Create a form validator based on an array of form data:
*
@ -50,7 +51,8 @@ class FormValidator extends HTML_QuickForm
* @param array form_data
* @return FormValidator
*/
static function create($form_data) {
static function create($form_data)
{
if (empty($form_data)) {
return null;
}
@ -112,7 +114,8 @@ class FormValidator extends HTML_QuickForm
* @param bool $track_submit (optional) Whether to track if the form was
* submitted by adding a special hidden field (default = true)
*/
function __construct($form_name, $method = 'post', $action = '', $target = '', $attributes = null, $track_submit = true) {
function __construct($form_name, $method = 'post', $action = '', $target = '', $attributes = null, $track_submit = true)
{
//Default form class
if (is_array($attributes) && !isset($attributes['class']) || empty($attributes)) {
$attributes['class'] = 'form-horizontal';
@ -127,11 +130,11 @@ class FormValidator extends HTML_QuickForm
$this->registerElementType('datepickerdate', $dir . 'Element/datepickerdate.php', 'HTML_QuickForm_datepickerdate');
$this->registerElementType('receivers', $dir . 'Element/receivers.php', 'HTML_QuickForm_receivers');
$this->registerElementType('select_language', $dir . 'Element/select_language.php', 'HTML_QuickForm_Select_Language');
$this->registerElementType('select_theme', $dir . 'Element/select_theme.php', 'HTML_QuickForm_Select_Theme');
$this->registerElementType('select_theme', $dir . 'Element/select_theme.php', 'HTML_QuickForm_Select_Theme');
$this->registerElementType('style_submit_button', $dir . 'Element/style_submit_button.php', 'HTML_QuickForm_stylesubmitbutton');
$this->registerElementType('style_reset_button', $dir . 'Element/style_reset_button.php', 'HTML_QuickForm_styleresetbutton');
$this->registerElementType('style_reset_button', $dir . 'Element/style_reset_button.php', 'HTML_QuickForm_styleresetbutton');
$this->registerElementType('button', $dir . 'Element/style_submit_button.php', 'HTML_QuickForm_stylesubmitbutton');
$this->registerRule('date', null, 'HTML_QuickForm_Rule_Date', $dir . 'Rule/Date.php');
$this->registerRule('date_compare', null, 'HTML_QuickForm_Rule_DateCompare', $dir . 'Rule/DateCompare.php');
$this->registerRule('html', null, 'HTML_QuickForm_Rule_HTML', $dir . 'Rule/HTML.php');
@ -139,9 +142,9 @@ class FormValidator extends HTML_QuickForm
$this->registerRule('username', null, 'HTML_QuickForm_Rule_Username', $dir . 'Rule/Username.php');
$this->registerRule('filetype', null, 'HTML_QuickForm_Rule_Filetype', $dir . 'Rule/Filetype.php');
$this->registerRule('multiple_required', 'required', 'HTML_QuickForm_Rule_MultipleRequired', $dir . 'Rule/MultipleRequired.php');
$this->registerRule('url', null, 'HTML_QuickForm_Rule_Url', $dir . 'Rule/Url.php');
$this->registerRule('url', null, 'HTML_QuickForm_Rule_Url', $dir . 'Rule/Url.php');
$this->registerRule('compare_fields', null, 'HTML_QuickForm_Compare_Fields', $dir . 'Rule/CompareFields.php');
// Modify the default templates
$renderer = & $this->defaultRenderer();
@ -156,7 +159,7 @@ class FormValidator extends HTML_QuickForm
$renderer->setFormTemplate($form_template);
//Element template
if (isset($attributes['class']) && $attributes['class'] == 'well form-inline') {
if (isset($attributes['class']) && $attributes['class'] == 'well form-inline') {
$element_template = ' {label} {element} ';
$renderer->setElementTemplate($element_template);
} elseif (isset($attributes['class']) && $attributes['class'] == 'form-search') {
@ -186,40 +189,38 @@ class FormValidator extends HTML_QuickForm
</div>
</div>';
$renderer->setElementTemplate($element_template);
//Display a gray div in the buttons
$button_element_template_simple = '<div class="form-actions">{label} {element}</div>';
$renderer->setElementTemplate($button_element_template_simple, 'submit_in_actions');
$renderer->setElementTemplate($button_element_template_simple, 'submit_in_actions');
//Display a gray div in the buttons + makes the button available when scrolling
$button_element_template_in_bottom = '<div class="form-actions bottom_actions">{label} {element}</div>';
$renderer->setElementTemplate($button_element_template_in_bottom, 'submit_fixed_in_bottom');
$renderer->setElementTemplate($button_element_template_in_bottom, 'submit_fixed_in_bottom');
//When you want to group buttons use something like this
/* $group = array();
$group[] = $form->createElement('button', 'mark_all', get_lang('MarkAll'));
$group[] = $form->createElement('button', 'unmark_all', get_lang('UnmarkAll'));
$form->addGroup($group, 'buttons_in_action');
$group[] = $form->createElement('button', 'mark_all', get_lang('MarkAll'));
$group[] = $form->createElement('button', 'unmark_all', get_lang('UnmarkAll'));
$form->addGroup($group, 'buttons_in_action');
*/
$renderer->setElementTemplate($button_element_template_simple, 'buttons_in_action');
$button_element_template_simple_right = '<div class="form-actions"> <div class="pull-right">{label} {element}</div></div>';
$renderer->setElementTemplate($button_element_template_simple_right, 'buttons_in_action_right');
/*
$renderer->setElementTemplate($button_element_template, 'submit_button');
$renderer->setElementTemplate($button_element_template, 'submit');
$renderer->setElementTemplate($button_element_template, 'button');
$renderer->setElementTemplate($button_element_template, 'submit_button');
$renderer->setElementTemplate($button_element_template, 'submit');
$renderer->setElementTemplate($button_element_template, 'button');
*
*/
}
}
//Set Header template
$renderer->setHeaderTemplate('<legend>{header}</legend>');
@ -250,42 +251,61 @@ EOT;
$this->addRule($name, get_lang('ThisFieldIsRequired'), 'required');
}
}
function add_hidden($name, $value)
{
$this->addElement('hidden', $name, $value);
}
function add_textarea($name, $label, $attributes = array())
{
$this->addElement('textarea', $name, $label, $attributes);
}
function add_button($name, $label, $attributes = array())
{
$this->addElement('button', $name, $label, $attributes);
}
function add_checkbox($name, $label, $trailer = '', $attributes = array())
{
$this->addElement('checkbox', $name, $label, $trailer, $attributes);
}
function add_radio($name, $label, $options = '')
{
$group = array();
foreach ($options as $key => $value) {
$group[] = $this->createElement('radio', null, null, $value, $key);
}
$this->addGroup($group, $name, $label);
}
function add_select($name, $label, $options = '', $attributes = array())
{
$this->addElement('select', $name, $label, $options, $attributes);
}
function add_label($name, $text)
function add_label($label, $text)
{
$this->addElement('label', $name, $text);
$this->addElement('label', $label, $text);
}
function add_header($text)
{
$this->addElement('header', $text);
}
function add_file($name, $label, $attributes = array())
{
$this->addElement('file', $name, $label, $attributes);
}
function add_html($snippet)
{
$this->addElement('html', $snippet);
}
/**
* Adds a HTML-editor to the form to fill in a title.
* A trim-filter is attached to the field.
@ -377,7 +397,8 @@ EOT;
/**
* Adds a button to the form to add resources.
*/
function add_resource_button() {
function add_resource_button()
{
$group = array();
$group[] = $this->createElement('static', 'add_resource_img', null, '<img src="' . api_get_path(WEB_IMG_PATH) . 'attachment.gif" alt="' . get_lang('Attachment') . '"/>');
$group[] = $this->createElement('submit', 'add_resource', get_lang('Attachment'), 'class="link_alike"');
@ -395,7 +416,8 @@ EOT;
* @param string $label (optional) Custom label to be shown
* submits the form and the start of the progress bar.
*/
function add_progress_bar($delay = 2, $label = '') {
function add_progress_bar($delay = 2, $label = '')
{
if (empty($label)) {
$label = get_lang('PleaseStandBy');
}

@ -11,6 +11,11 @@
*/
class Import {
/**
*
* @param string $path
* @return \CsvReader
*/
static function csv_reader($path)
{
return new CsvReader($path);

File diff suppressed because it is too large Load Diff

@ -0,0 +1,9 @@
<?php
namespace Link;
$language_file = array('link', 'admin');
require_once '../inc/global.inc.php';
Controller::instance()->run();
return;

@ -0,0 +1,84 @@
<?php
namespace Notebook;
/**
* Authorize current users to perform various actions.
*
* @author Laurent Opprecht <laurent@opprecht.info> for the Univesity of Genevas
* @license /license.txt
*/
class Access extends \Access
{
/**
* Return the instance .
*
* @return \Access
*/
public static function instance()
{
static $result = null;
if (empty($result)) {
$result = new self();
}
return $result;
}
/**
* Returns true if the user has the right to edit.
*
* @return boolean
*/
public function can_edit()
{
if (Request::is_student_view()) {
return false;
}
$session_id = Request::get_session_id();
if ($session_id != 0 && api_is_allowed_to_session_edit(false, true) == false) {
return false;
}
if (!api_is_allowed_to_edit()) {
return false;
}
return true;
}
/**
* Returns true if the current user has the right to view
*
* @return boolean
*/
public function can_view()
{
$authorize = api_protect_course_script(true);
if (!$authorize) {
return false;
}
$c_id = Request::get_c_id();
if (empty($c_id)) {
return false;
}
return true;
}
public function authorize()
{
if (!$this->can_view()) {
return false;
}
$c_id = Request::get_c_id();
if (empty($c_id)) {
return false;
}
return true;
}
}

@ -0,0 +1,108 @@
<?php
namespace Notebook;
use \Display;
use \Template;
use \FormValidator;
use \Security;
use \Uri;
use Header;
/**
* Ajax controller. Dispatch request and perform required action.
*
* - delete one note
* - delete all notes in a course/session
* - returns a note from its id
*
* Usage:
*
* $controller = AjaxController::instance();
* $controller->run();
*
* @author Laurent Opprecht <laurent@opprecht.info> for the Univesity of Genevas
* @license /license.txt
*/
class AjaxController extends \AjaxController
{
const ACTION_REMOVE = 'remove';
const ACTION_REMOVE_BY_COURSE = 'remove_by_course';
const ACTION_FIND_BY_ID = 'find_by_id';
/**
* Return the instance of the controller.
*
* @return \Notebook\AjaxController
*/
public static function instance()
{
static $result = null;
if (empty($result)) {
$result = new self(Access::instance());
}
return $result;
}
/**
* Prepare the environment. Set up breadcrumps and raise tracking event.
*/
protected function prolog()
{
event_access_tool(TOOL_NOTEBOOK);
}
public function is_allowed_to_edit()
{
return $this->access()->can_edit();
}
/**
* Remove/delete a Notebook entry
*/
public function remove()
{
if (!$this->is_allowed_to_edit()) {
$this->forbidden();
return;
}
$item = Request::get_item_key();
$success = Notebook::repository()->remove($item);
$message = $success ? '' : get_lang('Error');
$this->response($success, $message);
}
/**
* Remove/delete all notebook entries belonging to a course.
*/
public function remove_by_course()
{
if (!$this->is_allowed_to_edit()) {
$this->forbidden();
return;
}
$course = Request::get_course_key();
$success = Notebook::repository()->remove_by_course($course);
$message = $success ? '' : get_lang('Error');
$this->response($success, $message);
}
public function find_by_id()
{
$c_id = Request::get_c_id();
$id = Request::get_id();
$item = Notebook::repository()->find_one_by_id($c_id, $id);
$data = (object) array();
if ($item) {
$data->title = $item->title;
$data->description = $item->description;
}
$this->response($success, '', $data);
}
}

@ -0,0 +1,312 @@
<?php
namespace Notebook;
use \ChamiloSession as Session;
use \Display;
use \Template;
use \FormValidator;
use \Security;
use Uri;
use Redirect;
use Chamilo;
use Javascript;
/**
* Controller for notebook. Dispatch request and peform required action.
*
* - list notes for course
* - add/edit notes entry
* - change view from table to details
*
* Usage:
*
* $controller = Controller::instance();
* $controller->run();
*
* @package chamilo.course_description
* @author Christian Fasanando <christian1827@gmail.com>
* @author Laurent Opprecht <laurent@opprecht.info> for the Univesity of Genevas
* @license see /license.txt
*/
class Controller extends \Controller
{
const ACTION_ADD = 'add';
const ACTION_EDIT = 'edit';
const ACTION_DELETE = 'delete';
const ACTION_INDEX = 'index';
const ACTION_DEFAULT = 'index';
const ACTION_EXPORT_CSV = 'export_csv';
const ACTION_IMPORT_CSV = 'import_csv';
/**
* Return the instance of the controller.
*
* @return \Noteboook\Controller
*/
public static function instance()
{
static $result = null;
if (empty($result)) {
$result = new self(Access::instance());
}
return $result;
}
/**
* Action to perform.
* Returns the request parameter.
*
* @return string
*/
public function get_action()
{
if (Request::is_student_view()) {
return self::ACTION_INDEX;
}
$result = parent::get_action();
$result = $result ? $result : self::ACTION_DEFAULT;
return $result;
}
public function is_allowed_to_edit()
{
return $this->access()->can_edit();
}
/**
* Prepare the environment. Set up breadcrumps and raise tracking event.
*/
protected function prolog()
{
global $interbreadcrumb;
$interbreadcrumb = array();
$interbreadcrumb[] = array('url' => 'index.php', 'name' => get_lang('Notebook'));
global $this_section;
$this_section = SECTION_COURSES;
global $current_course_tool;
$current_course_tool = TOOL_NOTEBOOK;
// Tracking
event_access_tool(TOOL_NOTEBOOK);
}
/**
* Returns a url for an action that the controller can process
*
* @param string $action
* @param array $params
* @return string
*/
public function url($action = '', $params = array())
{
$url_params = Uri::course_params();
if ($c_id = Request::get_c_id()) {
$url_params[Request::PARAM_C_ID] = $c_id;
}
if ($id = Request::get_id()) {
$url_params[Request::PARAM_ID] = $id;
}
if ($session_id = Request::get_session_id()) {
$url_params[Request::PARAM_SESSION_ID] = $session_id;
}
if ($action) {
$url_params[Request::PARAM_ACTION] = $action;
}
foreach ($params as $key => $value) {
$url_params[$key] = $value;
}
$result = Uri::url('/main/notebook/index.php', $url_params, false);
return $result;
}
/**
* List course descriptions.
*
* @param array messages
*/
public function index()
{
$course = Request::get_course_key();
$user_id = api_get_user_id();
$column = Request::get_sort_column();
$direction = Request::get_sort_direction();
$order_by = $column ? "$column $direction" : '';
$repo = Notebook::repository();
$items = $repo->find_by_course_and_user($course, $user_id, $order_by);
$data = (object) array();
$data->items = $items;
$data->sort = $sort;
$data->sort_direction = $direction;
$data->sort_column = $column;
$this->render('index', $data);
}
/**
* Performs the edit action.
*/
public function edit()
{
if (!$this->is_allowed_to_edit()) {
$this->forbidden();
return;
}
$id = Request::get_id();
$c_id = Request::get_c_id();
$repo = Notebook::repository();
$item = $repo->find_one_by_id($c_id, $id);
$action = $this->url(self::ACTION_EDIT);
$form = NotebookForm::create($action, $item);
if ($form->validate()) {
$success = $repo->save($item);
$message = $success ? get_lang('NotebookUpdated') : get_lang('Error');
$home = $this->url(self::ACTION_DEFAULT);
Redirect::go($home);
}
$data = (object) array();
$data->form = $form;
$this->render('edit', $data);
}
/**
* Perform the add action
*/
public function add()
{
if (!$this->is_allowed_to_edit()) {
$this->forbidden();
return;
}
$c_id = Request::get_c_id();
$session_id = Request::get_session_id();
$item = Notebook::create();
$item->c_id = $c_id;
$item->session_id = $session_id;
$action = $this->url(self::ACTION_ADD);
$form = NotebookForm::create($action, $item);
if ($form->validate()) {
$repo = Notebook::repository();
$success = $repo->save($item);
$message = $success ? get_lang('NotebookAdded') : get_lang('Error');
$home = $this->url();
Redirect::go($home);
}
$data = (object) array();
$data->type = $type;
$data->form = $form;
$this->render('edit', $data);
}
/**
* Performs the delete action.
*
* @see AjaxController
*/
public function delete()
{
if (!$this->is_allowed_to_edit()) {
$this->forbidden();
return;
}
$this->missing();
}
public function export_csv()
{
$course = Request::get_course_key();
$items = Notebook::repository()->find_by_course($course);
$writer = CsvWriter::create();
$writer->add($items);
$path = $writer->get_path();
\DocumentManager :: file_send_for_download($path, true, get_lang('Notebook') . '.csv');
}
public function import_csv()
{
if (!$this->is_allowed_to_edit()) {
$this->forbidden();
return;
}
$action = $this->url(self::ACTION_IMPORT_CSV);
$form = UploadFileForm::create($action);
$form->init();
if ($form->validate()) {
// $delete_all = $form->get_delete_all();
// if ($delete_all) {
// $course = Request::get_course_key();
// $repo = Notebook::repository();
// $repo->remove_by_course($course);
// }
$file = $form->get_file();
$path = $file->tmp_name;
$reader = new CsvReader($path);
$items = $reader->get_items();
$course = Request::get_course_key();
$import = new CourseImport($course);
$import->add($items);
$home = $this->url(self::ACTION_DEFAULT);
Redirect::go($home);
}
$data = (object) array();
$data->form = $form;
$this->render('upload', $data);
}
/**
* Render a template using data. Adds a few common parameters to the data array.
*
* @see /main/template/default/course_description/
* @param string $template
* @param array $data
*/
protected function render($template, $data)
{
$data = $data ? $data : (object) array();
$_user = api_get_user_info();
$session_id = Request::get_session_id();
$data->session_image = api_get_session_image($session_id, $_user);
$data->sec_token = $this->access()->get_token();
$data->root = $this->url('');
$data->session_id = $session_id;
$data->c_id = Request::get_c_id();
$data->is_allowed_to_edit = $this->is_allowed_to_edit();
parent::render("notebook/$template.tpl", $data);
}
}

@ -0,0 +1,85 @@
<?php
namespace Notebook;
/**
* Import notebook entries into a course/session.
*
* Usage
*
* //init
* $course = (object)array();
* $course->c_id = xxx;
* $course->session_id = xxx;
* $import = new CourseImport($course);
*
* //create notebook entry
* $item = (object)array();
* $item->title = 'xxx';
* $item->description = 'xxx';
*
* //import notebook entry
* $import->add($item);
*
* @license /licence.txt
* @author Laurent Opprecht <laurent@opprecht.info>
*/
class CourseImport
{
protected $course = false;
protected $update_existing_entries = false;
protected $objects_imported = 0;
protected $objects_skipped = 0;
public function __construct($course)
{
$this->course = $course;
}
public function get_course()
{
return $this->course;
}
public function get_objects_imported()
{
return $this->objects_imported;
}
public function get_objects_skipped()
{
return $this->objects_skipped;
}
/**
*
* @param array $items
*/
public function add($items)
{
$this->objects_imported = 0;
$this->objects_skipped = 0;
foreach ($items as $item) {
$title = $item->title;
$description = $item->description;
if (empty($title) || empty($description)) {
$this->objects_skipped++;
continue;
}
$item->c_id = $this->course->c_id;
$item->session_id = $this->course->session_id;
$repo = Notebook::repository();
$success = $repo->save($item);
if ($success) {
$this->objects_imported++;
} else {
$this->objects_skipped++;
}
}
}
}

@ -0,0 +1,100 @@
<?php
namespace Notebook;
/**
* Read a csv file and returns notebook entries contained in the file.
*
* @license /licence.txt
* @author Laurent Opprecht <laurent@opprecht.info>
*/
class CsvReader implements \Iterator
{
protected $path;
protected $items = null;
protected $index = 0;
public function __construct($path)
{
$this->path = $path;
}
public function get_path()
{
return $this->path;
}
public function get_items()
{
if (is_null($this->items)) {
$this->items = $this->read();
}
return $this->items;
}
/**
* Read file and returns an array filled up with its' content.
*
* @return array of objects
*/
protected function read()
{
$result = array();
$path = $this->path;
if (!is_readable($path)) {
return array();
}
$items = \Import::csv_reader($path);
foreach ($items as $item) {
$item = (object) $item;
$title = isset($item->title) ? trim($item->title) : '';
$description = isset($item->description) ? trim($item->description) : '';
$name = \Security::remove_XSS($name);
$description = \Security::remove_XSS($description);
$is_blank_line = empty($name) && empty($description);
if ($is_blank_line) {
continue;
}
$item = new Notebook();
$item->title = $title;
$item->description = $description;
$result[] = $item;
}
return $result;
}
public function current()
{
$items = $this->get_items();
return isset($items[$this->index]) ? $items[$this->index] : null;
}
public function key()
{
return $this->index;
}
public function next()
{
$this->index++;
}
public function rewind()
{
$this->index = 0;
}
public function valid()
{
$items = $this->get_items();
return count($items) > $this->index;
}
}

@ -0,0 +1,44 @@
<?php
namespace Notebook;
use Chamilo;
/**
* Write notebook entries to a file in CSV format.
*
* @license /licence.txt
* @author Laurent Opprecht <laurent@opprecht.info>
*/
class CsvWriter extends \CsvObjectWriter
{
/**
*
* @return \Notebook\CsvWriter
*/
public static function create($path = '', $delimiter = ';', $enclosure = '"')
{
return new self($path, $delimiter, $enclosure);
}
protected $path = '';
function __construct($path = '', $delimiter = ';', $enclosure = '"')
{
$path = $path ? $path : Chamilo::temp_file();
$this->path = $path;
$stream = new \FileWriter($path);
$map = array(
'title' => 'title',
'description' => 'description'
);
parent::__construct($stream, $map, $delimiter, $enclosure);
}
function get_path()
{
return $this->path;
}
}

@ -0,0 +1,319 @@
<?php
namespace Notebook;
/**
*
* @license see /license.txt
* @author autogenerated
*/
class Notebook extends \Entity
{
/**
* @return \Notebook\NotebookRepository
*/
public static function repository(){
return NotebookRepository::instance();
}
/**
* @return \Notebook\Notebook
*/
public static function create($data = null){
return new self($data);
}
/**
* @var integer $c_id
*/
protected $c_id;
/**
* @var integer $notebook_id
*/
protected $notebook_id;
/**
* @var integer $user_id
*/
protected $user_id;
/**
* @var string $course
*/
protected $course;
/**
* @var integer $session_id
*/
protected $session_id;
/**
* @var string $title
*/
protected $title;
/**
* @var text $description
*/
protected $description;
/**
* @var datetime $creation_date
*/
protected $creation_date;
/**
* @var datetime $update_date
*/
protected $update_date;
/**
* @var integer $status
*/
protected $status;
/**
* Set c_id
*
* @param integer $value
* @return Notebook
*/
public function set_c_id($value)
{
$this->c_id = $value;
return $this;
}
/**
* Get c_id
*
* @return integer
*/
public function get_c_id()
{
return $this->c_id;
}
/**
* Alias for notebook id. Better to use the same naming convention
* for all classes.
*
* @return integer
*/
public function get_id()
{
return $this->notebook_id;
}
/**
* Set notebook_id
*
* @param integer $value
* @return Notebook
*/
public function set_id($value)
{
$this->notebook_id = $value;
return $this;
}
/**
* Set notebook_id
*
* @param integer $value
* @return Notebook
*/
public function set_notebook_id($value)
{
$this->notebook_id = $value;
return $this;
}
/**
* Get notebook_id
*
* @return integer
*/
public function get_notebook_id()
{
return $this->notebook_id;
}
/**
* Set user_id
*
* @param integer $value
* @return Notebook
*/
public function set_user_id($value)
{
$this->user_id = $value;
return $this;
}
/**
* Get user_id
*
* @return integer
*/
public function get_user_id()
{
return $this->user_id;
}
/**
* Set course
*
* @param string $value
* @return Notebook
*/
public function set_course($value)
{
$this->course = $value;
return $this;
}
/**
* Get course
*
* @return string
*/
public function get_course()
{
return $this->course;
}
/**
* Set session_id
*
* @param integer $value
* @return Notebook
*/
public function set_session_id($value)
{
$this->session_id = $value;
return $this;
}
/**
* Get session_id
*
* @return integer
*/
public function get_session_id()
{
return $this->session_id;
}
/**
* Set title
*
* @param string $value
* @return Notebook
*/
public function set_title($value)
{
$this->title = $value;
return $this;
}
/**
* Get title
*
* @return string
*/
public function get_title()
{
return $this->title;
}
/**
* Set description
*
* @param text $value
* @return Notebook
*/
public function set_description($value)
{
$this->description = $value;
return $this;
}
/**
* Get description
*
* @return text
*/
public function get_description()
{
return $this->description;
}
/**
* Set creation_date
*
* @param datetime $value
* @return Notebook
*/
public function set_creation_date($value)
{
$this->creation_date = $value;
return $this;
}
/**
* Get creation_date
*
* @return datetime
*/
public function get_creation_date()
{
return $this->creation_date;
}
/**
* Set update_date
*
* @param datetime $value
* @return Notebook
*/
public function set_update_date($value)
{
$this->update_date = $value;
return $this;
}
/**
* Get update_date
*
* @return datetime
*/
public function get_update_date()
{
return $this->update_date;
}
/**
* Set status
*
* @param integer $value
* @return Notebook
*/
public function set_status($value)
{
$this->status = $value;
return $this;
}
/**
* Get status
*
* @return integer
*/
public function get_status()
{
return $this->status;
}
}

@ -0,0 +1,103 @@
<?php
namespace Notebook;
use Chamilo;
/**
* Form to edit/Create notebook entries.
*
* @license /licence.txt
* @author Laurent Opprecht <laurent@opprecht.info>
*/
class NotebookForm extends \FormValidator
{
/**
*
* @param string $action
* @param \Notebook\Notebook $item
* @return \Notebook\NotebookForm
*/
static function create($action, $item = null)
{
$result = new self('notebook', 'post', $action);
if ($item) {
$result->init($item);
}
return $result;
}
protected $notebook;
function __construct($form_name = 'notebook', $method = 'post', $action = '', $target = '', $attributes = null, $track_submit = true)
{
parent::__construct($form_name, $method, $action, $target, $attributes, $track_submit);
}
/**
*
* @return \Notebook\Notebook
*/
public function get_notebook()
{
return $this->notebook;
}
public function set_notebook($value)
{
$this->notebook = $value;
}
/**
*
* @param \Notebook\Notebook $notebook
*/
function init($notebook = null)
{
$this->set_notebook($notebook);
$defaults = array();
$defaults['title'] = $notebook->title;
$defaults['description'] = $notebook->description;
$this->add_hidden('c_id', $notebook->c_id);
$this->add_hidden('id', $notebook->id);
$this->add_hidden('session_id', $notebook->session_id);
$this->add_hidden(Request::PARAM_SEC_TOKEN, Access::instance()->get_token());
$form_name = $notebook->id ? get_lang('ModifyNote') : get_lang('NoteAddNew');
$this->add_header($form_name);
$this->add_textfield('title', get_lang('NoteTitle'), $required = true, array('class' => 'span3'));
if (api_is_allowed_to_edit()) {
$toolbar = array('ToolbarSet' => 'Notebook', 'Width' => '100%', 'Height' => '300');
} else {
$toolbar = array('ToolbarSet' => 'NotebookStudent', 'Width' => '100%', 'Height' => '300', 'UserStatus' => 'student');
}
$this->add_html_editor('description', get_lang('NoteComment'), true, api_is_allowed_to_edit(), $toolbar);
$this->add_button('save', get_lang('Save'), array('class' => 'btn save'));
$this->setDefaults($defaults);
}
function update_model()
{
$values = $this->exportValues();
$notebook = $this->get_notebook();
$notebook->title = $values['title'];
$notebook->description = $values['description'];
}
function validate()
{
$result = parent::validate();
if ($result) {
$this->update_model();
}
return $result;
}
}

@ -0,0 +1,387 @@
<?php
namespace Notebook;
use Database;
/**
* Notebook repository. Interface with the database.
*
* @author Laurent Opprecht <laurent@opprecht.info> for the University of Geneva
* @licence /license.txt
*/
class NotebookRepository
{
/**
* Return the instance of the repository.
*
* @return \Notebook\NotebookRepository
*/
public static function instance()
{
static $result = null;
if (empty($result)) {
$result = new self();
}
return $result;
}
/**
*
* @return string
*/
public function get_table()
{
return Database :: get_course_table(TABLE_NOTEBOOK);
}
/**
*
* @return string
*/
public function get_tool()
{
return TOOL_NOTEBOOK;
}
/**
*
*
* @param string $where Where filter to apply
* @return array
*/
public function find($where, $orderby = '', $limit = null)
{
$table_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
$table = $this->get_table();
$tool = $this->get_tool();
$sql = "SELECT n.*,
prop.id AS property_id,
prop.tool,
prop.insert_user_id,
prop.insert_date,
prop.lastedit_date,
prop.ref,
prop.lastedit_type,
prop.lastedit_user_id,
prop.to_group_id,
prop.to_user_id,
prop.visibility,
prop.start_visible,
prop.end_visible,
prop.id_session
FROM
$table AS n,
$table_item_property AS prop
WHERE
(n.notebook_id = prop.ref AND
n.c_id = prop.c_id AND
prop.tool = '$tool')";
$sql .= $where ? "AND ($where)" : '';
$sql .= ' ORDER BY ';
$sql .= $orderby ? $orderby : 'creation_date ASC';
if ($limit) {
$from = (int) $limit->from;
$count = (int) $limit->count;
$sql .= " LIMIT $from, $count";
}
$rs = Database :: query($sql);
while ($data = Database::fetch_object($rs)) {
$result[] = Notebook::create($data);
}
return $result;
}
public function count($where)
{
$table_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
$table = $this->get_table();
$tool = $this->get_tool();
$sql = "SELECT count(*) AS val
FROM
$table AS n,
$table_item_property AS prop
WHERE
(n.notebook_id = prop.ref AND
n.c_id = prop.c_id AND
prop.tool = '$tool')";
$sql .= $where ? "AND ($where)" : '';
$sql .= " ORDER BY name ASC";
$rs = Database :: query($sql);
while ($data = Database::fetch_object($rs)) {
return $data->val;
}
return 0;
}
/**
*
* @param string $where
* @return \Notebook\notebook_id
*/
public function find_one($where)
{
$items = $this->find($where);
foreach ($items as $item) {
return $item;
}
return null;
}
/**
* Retrieve one course description from its ids.
*
* @param int|Course $c_id
* @param int $id
* @return \notebook_id\notebook_id
*/
public function find_one_by_id($c_id, $id)
{
$c_id = is_object($c_id) ? $c_id->get_id() : (int) $c_id;
return $this->find_one("n.c_id = $c_id AND n.notebook_id = $id");
}
/**
* Retrieve one course description from its ids.
*
* @param int|Course $c_id
* @param string name
* @return \Notebook\Notebook
*/
public function find_one_by_course_and_title($c_id, $title)
{
$c_id = is_object($c_id) ? $c_id->get_id() : (int) $c_id;
$name = Database::escape_string($name);
return $this->find_one("n.c_id = $c_id AND n.title = '$title'");
}
/**
* Returns the list of notes belonging to a specific course and
* session.
*
* @param object $course
* @return Array
*/
public function find_by_course($course, $orderby = '', $limit = null)
{
$c_id = (int) $course->c_id;
$session_id = isset($course->session_id) ? (int) $course->session_id : 0;
if (empty($c_id)) {
return array();
}
$condition_session = api_get_session_condition($session_id);
$where = "n.c_id = $c_id $condition_session";
return $this->find($where, $orderby, $limit);
}
/**
* Returns the list of notes belonging to a specific course and
* session.
*
* @param object $course
* @return Array
*/
public function find_by_course_and_user($course, $user, $orderby = '', $limit = null)
{
$user_id = is_object($user) ? (int)$user->user_id : (int)$user;
$c_id = (int) $course->c_id;
$session_id = isset($course->session_id) ? (int) $course->session_id : 0;
if (empty($c_id)) {
return array();
}
$condition_session = api_get_session_condition($session_id);
$where = "user_id = $user_id AND n.c_id = $c_id $condition_session";
return $this->find($where, $orderby, $limit);
}
public function count_by_course($course)
{
$c_id = (int) $course->c_id;
$session_id = isset($course->session_id) ? (int) $course->session_id : 0;
if (empty($c_id)) {
return 0;
}
$condition_session = api_get_session_condition($session_id);
$where = "n.c_id = $c_id $condition_session";
return $this->count($where);
}
/**
*
* @param object \Notebook\Notebook
* @return bool
*/
public function save($item)
{
$id = $item->id;
if (empty($id)) {
return $this->insert($item);
} else {
return $this->update($item);
}
}
/**
*
* @param \Notebook\Notebook $item
* @return bool
*/
public function insert($item)
{
$c_id = (int) $item->c_id;
$user_id = (int)$item->user_id;
$user_id = $user_id ? $user_id : api_get_user_id();
$_course = api_get_course_info_by_id($c_id);
$course = $_course['code'];
$session_id = (int) $item->session_id;
$session_id = $session_id ? $session_id : api_get_session_id();
$title = trim($item->title);
$title = Database::escape_string($title);
$description = trim($item->description);
$description = Database::escape_string($description);
$now = time();
$creation_date = date('Y-m-d H:i:s', $now);
$update_date = $creation_date;
$status = (int)$item->status;
$status = $status ? $status : '0';
$table = $this->get_table();
$sql = "INSERT INTO $table
(c_id, user_id, course, session_id, title, description, creation_date, update_date, status)
VALUES
($c_id, $user_id, '$course', $session_id, '$title', '$description', '$creation_date', '$update_date', $status)";
$result = (bool) Database :: query($sql);
if ($result) {
$id = Database::insert_id();
$item->id = $id;
$item->creation_date = $creation_date;
$item->update_date = $update_date;
$item->status = (int)$status;
$item->course = $course;
$item->session_id = $session_id;
$item->user_id = $user_id;
//$_course = api_get_course_info_by_id($c_id);
$tool = $this->get_tool();
//$user_id = api_get_user_id();
api_item_property_update($_course, $tool, $id, 'NotebookAdded', $user_id);
}
return $result;
}
/**
*
* @param \Notebook\Notebook $item
* @return bool
*/
function update($item)
{
$c_id = (int) $item->c_id;
$id = (int) $item->id;
$user_id = (int)$item->user_id;
$user_id = $user_id ? $user_id : api_get_user_id();
$title = trim($item->title);
$title = Database::escape_string($title);
$description = trim($item->description);
$description = Database::escape_string($description);
$session_id = (int) $item->session_id;
$session_id = $session_id ? $session_id : '0';
$creation_date = $item->creation_date;
$creation_date = is_string($creation_date) ? strtotime($creation_date) : $creation_date;
$creation_date = date('Y-m-d H:i:s', $creation_date);
$now = time();
$creation_date = date('Y-m-d H:i:s', $now);
$update_date = $creation_date;
$status = (int)$item->status;
$status = $status ? $status : '0';
$table = $this->get_table();
$sql = "UPDATE $table SET
user_id = $user_id,
session_id = $session_id,
title = '$title',
description = '$description',
update_date = '$update_date',
status = $status
WHERE
c_id = $c_id AND
notebook_id = $id";
$result = (bool) Database :: query($sql);
if ($result) {
$item->update_date = $update_date;
$_course = api_get_course_info_by_id($c_id);
$tool = $this->get_tool();
//$user_id = api_get_user_id();
api_item_property_update($_course, $tool, $id, 'NotebookUpdated', $user_id);
}
return $result;
}
/**
*
* @param object $item
* @return boolean
*/
public function remove($item)
{
$table = $this->get_table();
$c_id = (int) $item->c_id;
$id = (int) $item->id;
if (empty($c_id) || empty($id)) {
return false;
}
$sql = "DELETE FROM $table WHERE c_id=$c_id AND notebook_id=$id";
$result = Database :: query($sql);
if ($result) {
$tool = $this->get_tool();
$tbl_property = Database :: get_course_table(TABLE_ITEM_PROPERTY);
$sql = "DELETE FROM $tbl_property WHERE c_id=$c_id AND ref=$id AND tool='$tool'";
Database :: query($sql);
}
return (bool) $result;
}
/**
*
* @param object $course
* @return int
*/
public function remove_by_course($course)
{
$items = $this->find_by_course($course);
foreach ($items as $item) {
$success = $this->remove($item);
if ($success) {
$result++;
}
}
return $result;
}
}

@ -0,0 +1,167 @@
<?php
namespace Notebook;
use \ChamiloSession as Session;
/**
* Html request for course description.
*
* @author Laurent Opprecht <laurent@opprecht.info> for the Univesity of Genevas
* @license /license.txt
*/
class Request extends \Request
{
const PARAM_ID = 'id';
const PARAM_IDS = 'ids';
const PARAM_C_ID = 'c_id';
const PARAM_SESSION_ID = 'id_session';
const PARAM_ACTION = 'action';
const PARAM_SEC_TOKEN = 'sec_token';
const PARAM_IS_STUDENT_VIEW = 'isStudentView';
const PARAM_SORT_COLUMN = 'sort_column';
const PARAM_SORT_DIRECTION = 'sort_direction';
/**
* Action to perform. *
* @return string
*/
public static function get_action()
{
$result = Request::get(self::PARAM_ACTION, '');
return $result;
}
/**
* Returns the object id.
*
* @return int
*/
public static function get_id()
{
$result = \Request::get(self::PARAM_ID, 0);
$result = intval($result);
return $result;
}
/**
* List of objet ids
*
* @return array
*/
public static function get_ids()
{
$result = Request::get(self::PARAM_IDS, array());
if (is_array($result)) {
return $result;
}
$result = trim($result);
if (empty($result)) {
return array();
}
$result = explode(',', $result);
return $result;
}
/**
* Returns the course id.
*
* @return int
*/
public static function get_c_id()
{
$result = Request::get(self::PARAM_C_ID, 0);
$result = intval($result);
$result = $result ? $result : api_get_real_course_id();
$result = $result ? $result : 0;
return $result;
}
/**
* Returns the session id.
*
* @return int
*/
public static function get_session_id()
{
$result = Request::get(self::PARAM_SESSION_ID, 0);
$result = intval($result);
return $result;
}
/**
* Returns the security token.
*
* @return string
*/
public static function get_security_token()
{
$result = Request::get(self::PARAM_SEC_TOKEN, 0);
return $result;
}
/**
* Returns true if the user is in "student view". False otherwise.
*
* @return bool
*/
public static function is_student_view()
{
return Request::get(self::PARAM_IS_STUDENT_VIEW, false) == 'true';
}
/**
* Returns a course key parameters. I.e. not a real course but an
* object with the course c_id and session set up.
*
* @return object
*/
public static function get_course_key()
{
$result = (object) array();
$result->c_id = Request::get_c_id();
$result->session_id = Request::get_session_id();
return $result;
}
/**
* Returns an item key. I.e. not a real entity object but an
* object with the object keys set up.
*
* @return object
*/
public static function get_item_key()
{
$result = (object) array();
$result->c_id = Request::get_c_id();
$result->id = Request::get_id();
return $result;
}
public static function get_sort_column()
{
$result = Request::get(self::PARAM_SORT_COLUMN, 'name');
if($result == 'title'){
return $result;
}
if($result == 'creation_date'){
return $result;
}
if($result == 'update_date'){
return $result;
}
return 'creation_date';
}
public static function get_sort_direction(){
$result = Request::get(self::PARAM_SORT_DIRECTION, 'name');
$result = strtoupper($result);
$result = ($result == 'DESC') ? 'DESC' : 'ASC';
return $result;
}
}

@ -0,0 +1,40 @@
/**
* Define a client proxy for ajax calls.
*/
function Proxy() {};
Proxy.prototype.root = function(){
return context.ajax;
}
Proxy.prototype.post = function(data, f){
if(typeof(context)!=='undefined' && typeof(context.sec_token)!=='undefined'){
data.sec_token = context.sec_token;
}
$.post(this.root(), data, f, 'json');
}
var notebook = new Proxy();
notebook.remove = function(c_id, id, f)
{
var data = {
c_id: c_id,
id: id,
action: 'remove'
};
this.post(data, f);
};
notebook.remove_by_course = function(c_id, session_id, f)
{
var data = {
c_id: c_id,
session_id: session_id,
action: 'remove_by_course'
};
this.post(data, f);
};

@ -0,0 +1,104 @@
/**
* User interface objects.
*/
var message = {};
message.update = function(data){
var text = typeof(data)=='string' ? data : data.message;
$('#messages').html(text);
}
message.error = function(data){
text = typeof(data)=='string' ? data : data.message;
if(! text){
return;
}
$('#messages').html('<div class="error-message">' + text + '</div>');
}
message.info = function(data){
text = typeof(data)=='string' ? data : data.message;
if(! text){
return;
}
$('#messages').html('<div class="normal-message">' + text + '</div>');
}
message.confirmation = function(data){
text = typeof(data)=='string' ? data : data.message;
if(! text){
return;
}
$('#messages').html('<div class="confirmation-message">' + text + '</div>');
}
message.warning = function(data){
text = typeof(data)=='string' ? data : data.message;
if(! text){
return;
}
$('#messages').html('<div class="warning-message">' + text + '</div>');
}
var ui = {};
ui.message = message;
ui.loading = function(btn){
$(btn).addClass("loading");
};
ui.done = function(btn){
$(btn).removeClass("loading");
};
ui.confirm = function(){
if(!window.confirm(lang.ConfirmYourChoice)){
return false;
} else {
return true;
}
};
ui.remove = function(name, btn){
if(!this.confirm()){
return false;
}
var item = $('#'+name);
var id = item.attr('data-id');
var c_id = item.attr('data-c_id');
var f = function(data){
if(data.success){
item.remove();
}
message.update(data);
ui.done(btn);
};
ui.loading(btn);
ui.proxy.remove(c_id, id, f);
};
ui.remove_by_course = function(name, btn){
if(!this.confirm()){
return false;
}
var item = $('#'+name);
var c_id = item.attr('data-c_id');
var session_id = item.attr('data-session_id');
var f = function(data){
if(data.success){
item.remove();
}
message.update(data);
ui.done(btn);
};
ui.loading(btn);
ui.proxy.remove_by_course(c_id, session_id, f);
};

@ -0,0 +1,88 @@
<?php
namespace Notebook;
use Chamilo;
/**
* Form to upload a CSV file.
*
* @license /licence.txt
* @author Laurent Opprecht <laurent@opprecht.info>
*/
class UploadFileForm extends \FormValidator
{
/**
*
* @param string $action
* @return \Glossary\UploadFileForm
*/
public static function create($action)
{
return new self('upload_file', 'post', $action);
}
function __construct($form_name = 'upload_file', $method = 'post', $action = '', $target = '', $attributes = null, $track_submit = true)
{
parent::__construct($form_name, $method, $action, $target, $attributes, $track_submit);
}
/**
*
*
*/
function init()
{
$form_name = get_lang('Import');
$this->add_header($form_name);
$this->add_hidden(Request::PARAM_SEC_TOKEN, Access::instance()->get_token());
$label = get_lang('File');
$this->add_file('file', $label);
$this->addRule('file', get_lang('ThisFieldIsRequired'), 'required');
$this->add_button('save', get_lang('Save'), array('class' => 'btn save'));
$label = get_lang('CSVMustLookLike');
$label = "$label";
$help = '<pre>
<b>title</b>;<b>description</b>;
"Hello";"Hola";
"Good";"Bueno";
</pre>';
$this->add_html($label . $help);
}
/**
*
* @return object
*/
public function get_file()
{
$result = Request::file('file', array());
if (empty($result)) {
return null;
}
$error = isset($result['error']) ? (bool) $result['error'] : false;
if ($error) {
return array();
}
return (object) $result;
}
public function validate()
{
$result = (bool) parent::validate();
if ($result == false) {
return false;
}
$file = $this->get_file();
if (empty($file)) {
return false;
}
return true;
}
}

@ -4,14 +4,23 @@
{{ message }}
{% endfor %}
<div class="actions" >
<a href = "{{root}}&amp;action=listing" class = "course_description btn back"></a>
{% for type in types %}
<a href="{{root}}&amp;action=add&amp;description_type={{type.id}}">
<img title="{{type.title}}" alt="type.title" src="{{type.icon|icon(32)}} ">
</a>
{% endfor %}
</div>
{% if is_allowed_to_edit %}
<div class="btn-toolbar actions-bar" >
<div class="btn-group">
<a href="{{root}}&amp;action=listing" class="btn" title="{{'ImportCSV'|get_lang}}">
<i class="size-32 icon-back"></i>
</a>
</div>
<div class="btn-group edit new">
{% for type in types %}
<a href="{{root}}&amp;action=add&amp;description_type={{type.id}}" class="btn ">
<img title="{{type.title}}" alt="{{type.title}}" src="{{type.icon|icon(32)}} ">
</a>
{% endfor %}
</div>
</div>
{% endif %}
{% if type.question %}
<div class="normal-message">

@ -50,15 +50,25 @@
{% endfor %}
{% if is_allowed_to_edit %}
<div class="actions" >
{% for type in types %}
<a href="{{root}}&amp;action=add&amp;description_type={{type.id}}">
<img title="{{type.title}}" alt="{{type.title}}" src="{{type.icon|icon(32)}} ">
</a>
{% endfor %}
<a href="{{root}}&amp;action=import_csv" class="btn import_csv" title="{{'ImportCSV'|get_lang}}"></a>
<a href="{{root}}&amp;action=export_csv" class="btn export_csv" title="{{'ExportAsCSV'|get_lang}}"></a>
<a href="javascript:void(0)" onclick="delete_all();return false;" class="btn delete_all" title="{{'DeleteAll'|get_lang}}"></a>
<div class="btn-toolbar actions-bar" >
<div class="btn-group edit new">
{% for type in types %}
<a href="{{root}}&amp;action=add&amp;description_type={{type.id}}" class="btn ">
<img title="{{type.title}}" alt="{{type.title}}" src="{{type.icon|icon(32)}} ">
</a>
{% endfor %}
</div>
<div class="btn-group edit">
<a href="{{root}}&amp;action=import_csv" class="btn import_csv" title="{{'ImportCSV'|get_lang}}">
<i class="size-32 icon-import-csv"></i>
</a>
<a href="{{root}}&amp;action=export_csv" class="btn export_csv" title="{{'ExportAsCSV'|get_lang}}">
<i class="size-32 icon-export-csv"></i>
</a>
<a href="javascript:void(0)" onclick="delete_all();return false;" class="btn delete_all" title="{{'DeleteAll'|get_lang}}">
<i class="size-32 icon-delete-all"></i>
</a>
</div>
</div>
{% endif %}
@ -67,17 +77,17 @@
<li id="description_{{description.id}}" class="course_description" data-id="{{description.id}}" data-c_id="{{description.c_id}}" data-type="course_description">
<div class="title sectiontitle">
{% if is_allowed_to_edit %}
<div style="float:right;">
<div class="pull-right element-actions">
{% if session_id == description.session_id %}
<a href="{{root}}&amp;action=delete&amp;id={{description.id}}"
onclick="delete_entry('description_{{description.id}}', this); return false;"
class="btn delete"
title="{{'Delete'|get_lang}}">
<i class="size-22 icon-delete"></i>
</a>
<a href="{{root}}&amp;action=edit&amp;id={{description.id}}"
class="btn edit"
title="{{'Edit'|get_lang}}">
<i class="size-22 icon-edit"></i>
</a>
{% else %}
<img title="{{'EditionNotAvailableFromSession'|get_lang}}"

@ -4,8 +4,12 @@
{{ message }}
{% endfor %}
<div class="actions" >
<a href = "{{root}}&amp;action=listing" class = "course_description btn back"></a>
<div class="btn-toolbar actions-bar" >
<div class="btn-group">
<a href="{{root}}&amp;action=listing" class="btn" title="{{'ImportCSV'|get_lang}}">
<i class="size-32 icon-back"></i>
</a>
</div>
</div>
{{form.return_form()}}

@ -1,8 +1,10 @@
{% include 'default/glossary/header.tpl' %}
<div class="actions" >
<a href = "{{root}}&amp;action=index" class = "glossary btn back"></a>
<div class="actions-bar btn-toolbar" >
<a href = "{{root}}&amp;action=index" class="btn">
<i class="size-32 icon-back"></i>
</a>
</div>
{{form.return_form()}}

@ -1,18 +1,34 @@
{% include 'default/glossary/header.tpl' %}
{% include 'default/glossary/javascript.tpl' %}
<div class="actions" >
<div class="btn-toolbar actions-bar" >
{% if is_allowed_to_edit %}
<a href="{{root}}&amp;action=add" class=" glossary btn new term" title="{{'Add'|get_lang}}"></a>
<a href="{{root}}&amp;action=import_csv" class="btn import_csv" title="{{'ImportCSV'|get_lang}}"></a>
<a href="{{root}}&amp;action=export_csv" class="btn export_csv" title="{{'ExportAsCSV'|get_lang}}"></a>
<a href="javascript:void(0)" onclick="ui.remove_by_course('entries', this);return false;" class="btn delete_all" title="{{'DeleteAll'|get_lang}}"></a>
<div class="btn-group edit">
<a href="{{root}}&amp;action=add" class=" glossary btn" title="{{'Add'|get_lang}}">
<i class="size-32 icon-new-glossary-term"></i>
</a>
<a href="{{root}}&amp;action=import_csv" class="btn import_csv" title="{{'ImportCSV'|get_lang}}">
<i class="size-32 icon-import-csv"></i>
</a>
<a href="{{root}}&amp;action=export_csv" class="btn export_csv" title="{{'ExportAsCSV'|get_lang}}">
<i class="size-32 icon-export-csv"></i>
</a>
<a href="javascript:void(0)" onclick="ui.remove_by_course('entries', this);return false;" class="btn delete_all" title="{{'DeleteAll'|get_lang}}">
<i class="size-32 icon-delete-all"></i>
</a>
</div>
{% endif %}
{% if view == 'table' %}
<a href="{{root}}&amp;view=list" class="btn view text" title="{{'ExportAsCSV'|get_lang}}"></a>
{% else %}
<a href="{{root}}&amp;view=table" class="btn view detailed" title="{{'ExportAsCSV'|get_lang}}"></a>
{% endif %}
<div class="btn-group edit">
{% if view == 'table' %}
<a href="{{root}}&amp;view=list" class="btn" title="{{'ViewList'|get_lang}}">
<i class="size-32 icon-view-text"></i>
</a>
{% else %}
<a href="{{root}}&amp;view=table" class="btn" title="{{'ViewTable'|get_lang}}">
<i class="size-32 icon-view-detailed"></i>
</a>
{% endif %}
</div>
</div>

@ -1,19 +1,19 @@
<ul id="entries" style="list-style: none; margin-left:0;" class="glossary entries" data-c_id="{{c_id}}" data-session_id="{{session_id}}" >
<ul id="entries" class="unstyled glossary entries" data-c_id="{{c_id}}" data-session_id="{{session_id}}" >
{% for item in items %}
<li id="glossary_{{item.id}}" class="glossary term" data-id="{{item.id}}" data-c_id="{{item.c_id}}" data-type="glossary">
<div class="title sectiontitle">
{% if is_allowed_to_edit %}
<div style="float:right;">
<div class="pull-right">
{% if session_id == item.session_id %}
<a href="{{root}}&amp;action=edit&amp;id={{item.id}}"
class="btn edit"
title="{{'Edit'|get_lang}}">
<i class="size-22 icon-edit"></i>
</a>
<a href="{{root}}&amp;action=delete&amp;id={{item.id}}"
onclick="ui.remove('glossary_{{item.id}}', this); return false;"
class="btn delete"
title="{{'Delete'|get_lang}}">
<i class="size-22 icon-delete"></i>
</a>
{% else %}

@ -48,13 +48,13 @@ $(document).ready(function() {
<td class="td_actions">
{% if session_id == item.session_id %}
<a href="{{root}}&amp;action=edit&amp;id={{item.id}}"
class="btn edit"
title="{{'Edit'|get_lang}}">
<i class="size-22 icon-edit"></i>
</a>
<a href="{{root}}&amp;action=delete&amp;id={{item.id}}"
onclick="ui.remove('glossary_{{item.id}}', this); return false;"
class="btn delete"
title="{{'Delete'|get_lang}}">
<i class="size-22 icon-delete"></i>
</a>
{% else %}
<img title="{{'EditionNotAvailableFromSession'|get_lang}}"

@ -1,8 +1,9 @@
{% include 'default/glossary/header.tpl' %}
<div class="actions" >
<a href = "{{root}}&amp;action=index" class = "course_description btn back"></a>
<div class="actions-bar btn-toolbar" >
<a href = "{{root}}&amp;action=index" class="btn">
<i class="size-32 icon-back"></i>
</a>
</div>
{{form.return_form()}}

@ -1,8 +1,12 @@
{{javascript}}
<div class = "actions" >
<a href = "{{root}}&amp;action=listing" class = "announce btn back"></a>
<div class="btn-toolbar actions-bar" >
<div class="btn-group">
<a href="{{root}}&amp;action=listing" class="btn">
<i class="size-32 icon-back"></i>
</a>
</div>
</div>
{% for message in messages %}

@ -1,8 +1,12 @@
{{javascript}}
<div class = "actions" >
<a href = "{{root}}&amp;action=listing" class = "announce btn back"></a>
<div class="btn-toolbar actions-bar" >
<div class="btn-group">
<a href="{{root}}&amp;action=listing" class="btn">
<i class="size-32 icon-back"></i>
</a>
</div>
</div>
{% for message in messages %}

@ -187,16 +187,34 @@ function validate_link(name, btn){
{% endfor %}
</div>
<div class="actions" >
<div class="btn-toolbar actions-bar" >
{% if is_allowed_to_edit %}
<a href="{{root}}&amp;action=add_category" class="btn new_folder" title="{{'AddCategory'|get_lang}}"></a>
<a href="{{root}}&amp;action=add_link" class="btn new_link" title="{{'AddLink'|get_lang}}"></a>
<a href="javascript:void(0)" onclick="delete_all();return false;" class="btn delete_all" title="{{'DeleteAll'|get_lang}}"></a>
<a href="{{root}}&amp;action=import_csv" class="btn import_csv" title="{{'ImportCSV'|get_lang}}"></a>
<div class="btn-group edit">
<a href="{{root}}&amp;action=add_category" class="btn new_folder" title="{{'AddCategory'|get_lang}}">
<i class="size-32 icon-new-folder"></i>
</a>
<a href="{{root}}&amp;action=add_link" class="btn new_link" title="{{'AddLink'|get_lang}}">
<i class="size-32 icon-new-link"></i>
</a>
<a href="javascript:void(0)" onclick="delete_all();return false;" class="btn delete_all" title="{{'DeleteAll'|get_lang}}">
<i class="size-32 icon-delete-all"></i>
</a>
<a href="{{root}}&amp;action=import_csv" class="btn import_csv" title="{{'ImportCSV'|get_lang}}">
<i class="size-32 icon-import-csv"></i>
</a>
<a href="{{root}}&amp;action=export_csv" class="btn" title="{{'ExportAsCSV'|get_lang}}">
<i class="size-32 icon-export-csv"></i>
</a>
</div>
{% endif %}
<a href="{{root}}&amp;action=export_csv" class="btn export_csv" title="{{'ExportAsCSV'|get_lang}}"></a>
<a href="javascript:void(0)" onclick="expand_all();return false;" class="btn expand" title="{{'showall'|get_lang}}"></a>
<a href="javascript:void(0)" onclick="collapse_all();return false;" class="btn collapse" title="{{'shownone'|get_lang}}"></a>
<div class="btn-group">
<a href="javascript:void(0)" onclick="expand_all();return false;" class="btn" title="{{'showall'|get_lang}}">
<i class="size-32 icon-expand"></i>
</a>
<a href="javascript:void(0)" onclick="collapse_all();return false;" class="btn" title="{{'shownone'|get_lang}}">
<i class="size-32 icon-collapse"></i>
</a>
</div>
</div>
<div class="data">
@ -224,13 +242,21 @@ function validate_link(name, btn){
<div style="float:right;">
<a href="javascript:void(0)" onclick="validate_link('link_{{link.id}}', this);return false;"
title="{{'CheckURL'|get_lang}}"
class="btn validate_link"></a>
class="btn validate_link">
</a>
<a href="{{root}}&amp;action=edit_link&amp;id={{link.id}}&amp;c_id={{link.c_id}}"
title="{{'Edit'|get_lang}}"
class="btn edit"></a>
class="">
<i class="size-22 icon-edit"></i>
</a>
<a href="javascript:void(0)" onclick="switch_li_visibility('link_{{link.id}}', this);return false;"
class="btn visibility {%if link.visibility == 1%}hide{%else%}show{%endif%}"></a>
<a href="javascript:void(0)" onclick="delete_link('link_{{link.id}}', this);return false;" title="{{'Delete'|get_lang}}" class="btn delete"></a>
class="btn visibility {%if link.visibility == 1%}hide{%else%}show{%endif%}">
</a>
<a href="javascript:void(0)" onclick="delete_link('link_{{link.id}}', this);return false;" title="{{'Delete'|get_lang}}" class="">
<i class="size-22 icon-delete"></i>
</a>
</div>
{% endif %}
<div class="description">{{link.description}}</div>
@ -247,11 +273,15 @@ function validate_link(name, btn){
<a href="{{root}}&amp;action=edit_category&amp;id={{category.id}}&amp;c_id={{category.c_id}}"
onclick="event.stopPropagation();"
title="{{'Edit'|get_lang}}"
class="btn edit"></a>
class="">
<i class="size-22 icon-edit"></i>
</a>
<a href="javascript:void(0)"
onclick="delete_category('category_{{category.id}}');event.stopPropagation();return false;"
title="{{'Delete'|get_lang}}"
class="btn delete"></a>
class="">
<i class="size-22 icon-delete"></i>
</a>
</div>
{% endif %}
<h3>
@ -288,14 +318,18 @@ function validate_link(name, btn){
<a href="{{root}}&amp;action=edit_link&amp;id={{link.id}}&amp;c_id={{link.c_id}}"
onclick=""
title="{{'Edit'|get_lang}}"
class="btn edit"></a>
class="">
<i class="size-22 icon-edit"></i>
</a>
<a href="javascript:void(0)"
onclick="switch_li_visibility('link_{{link.id}}', this);return false;"
class="btn visibility {%if link.visibility == 1%}hide{%else%}show{%endif%}"></a>
<a href="javascript:void(0)"
onclick="delete_link('link_{{link.id}}', this);return false;"
title="{{'Delete'|get_lang}}"
class="btn delete"></a>
class="">
<i class="size-22 icon-delete"></i>
</a>
</div>
{% endif %}
</li>

@ -0,0 +1,10 @@
{% include 'default/notebook/header.tpl' %}
<div class="actions-bar btn-toolbar" >
<a href = "{{root}}&amp;action=index" class="btn back">
<i class="size-32 icon-back"></i>
</a>
</div>
{{form.return_form()}}

@ -0,0 +1,7 @@
{{javascript}}
<div id="messages">
{% for message in messages %}
{{ message }}
{% endfor %}
</div>

@ -0,0 +1,41 @@
{% include 'default/notebook/header.tpl' %}
{% include 'default/notebook/javascript.tpl' %}
<div class="btn-toolbar actions-bar" >
{% if is_allowed_to_edit %}
<div class="btn-group edit">
<a href="{{root}}&amp;action=add" class="notebook btn new term" title="{{'Add'|get_lang}}">
<i class="size-32 icon-new-note"></i>
</a>
<a href="{{root}}&amp;action=import_csv" class="btn" title="{{'ImportCSV'|get_lang}}">
<i class="size-32 icon-import-csv"></i>
</a>
<a href="{{root}}&amp;action=export_csv" class="btn" title="{{'ExportAsCSV'|get_lang}}">
<i class="size-32 icon-export-csv"></i>
</a>
<a href="javascript:void(0)" onclick="ui.remove_by_course('entries', this);return false;" class="btn delete_all" title="{{'DeleteAll'|get_lang}}">
<i class="size-32 icon-delete-all"></i>
</a>
</div>
{% endif %}
<div class="btn-group sort">
<a href="{{root}}&amp;action=index&amp;sort_column=creation_date&amp;sort_direction={%if sort_direction == 'ASC' and sort_column == 'creation_date' %}DESC{% else %}ASC{% endif %}"
class="btn"
title="{{'SorteByCreatedDate'|get_lang}}">
<i class="size-32 icon-sort-by-created-date"></i>
</a>
<a href="{{root}}&amp;action=index&amp;sort_column=update_date&amp;sort_direction={%if sort_direction == 'ASC' and sort_column == 'update_date' %}DESC{% else %}ASC{% endif %}"
class="btn"
title="{{'SorteByUpdatedDate'|get_lang}}">
<i class="size-32 icon-sort-by-modified-date"></i>
</a>
<a href="{{root}}&amp;action=index&amp;sort_column=title&amp;sort_direction={%if sort_direction == 'ASC' and sort_column == 'title' %}DESC{% else %}ASC{% endif %}"
class="btn"
title="{{'SortByTitle'|get_lang}}">
<i class="size-32 icon-sort-by-title"></i>
</a>
</div>
</div>
{% include 'default/notebook/list.tpl' %}

@ -0,0 +1,27 @@
<script type="text/javascript" src="{{www}}/main/notebook/resources/js/proxy.js"></script>
<script type="text/javascript" src="{{www}}/main/notebook/resources/js/ui.js"></script>
<script type="text/javascript">
$(function() {
ui.proxy = notebook;
window.context = {};
context.sec_token = '{{sec_token}}';
context.c_id = '{{c_id}}';
context.session_id = '{{session_id}}';
context.www = '{{www}}';
context.ajax = '{{www}}/main/inc/ajax/notebook.ajax.php';
if(typeof(lang) == "undefined")
{
window.lang = {};
}
lang.ConfirmYourChoice = "{{'ConfirmYourChoice'|get_lang}}";
});
</script>

@ -0,0 +1,32 @@
<ul id="entries" class="notebook entries unstyled" data-c_id="{{c_id}}" data-session_id="{{session_id}}" >
{% for item in items %}
<li id="notebook_{{item.id}}" class="notebook note" data-id="{{item.id}}" data-c_id="{{item.c_id}}" data-type="notebook">
<div class="title sectiontitle">
{% if is_allowed_to_edit %}
<div class="pull-right element-actions">
<a href="{{root}}&amp;action=edit&amp;id={{item.id}}"
title="{{'Edit'|get_lang}}">
<i class="size-22 icon-edit"></i>
</a>
<a href="{{root}}&amp;action=delete&amp;id={{item.id}}"
onclick="ui.remove('notebook_{{item.id}}', this); return false;"
title="{{'Delete'|get_lang}}">
<i class="size-22 icon-delete"></i>
</a>
</div>
{% endif %}
{{item.title}}
{% if item.session_id %}
{{session_image}}
{% endif %}
</div>
<div class="sectioncomment">
{{item.description}}
</div>
<div class="sectionfooter footer">{{item.update_date|date}}</div>
</li>
{% endfor %}
</ul>

@ -0,0 +1,9 @@
{% include 'default/notebook/header.tpl' %}
<div class="actions-bar btn-toolbar" >
<a href = "{{root}}&amp;action=index" class="btn back">
<i class="size-32 icon-back"></i>
</a>
</div>
{{form.return_form()}}
Loading…
Cancel
Save