├── LICENSE.md ├── README.md ├── assign.php ├── block_analytics_graphs.php ├── classes ├── event │ ├── block_analytics_graphs_event_send_email.php │ └── block_analytics_graphs_event_view_graph.php └── privacy │ └── provider.php ├── composer.json ├── db ├── access.php ├── install.xml └── upgrade.php ├── edit_form.php ├── email.php ├── externalref ├── export-csv-master │ ├── LICENSE │ ├── README.md │ ├── bower.json │ ├── export-csv.js │ ├── manifest.json │ └── package.json ├── exporting.js ├── highcharts-3d.js ├── highcharts-more.js ├── highcharts.js ├── highstock.js ├── jquery-1.12.2.js ├── jquery-3.1.1.js ├── jquery-3.1.1.min.js ├── jquery-ui-1.12.1 │ ├── AUTHORS.txt │ ├── LICENSE.txt │ ├── external │ │ └── jquery │ │ │ └── jquery.js │ ├── images │ │ ├── ui-icons_444444_256x240.png │ │ ├── ui-icons_555555_256x240.png │ │ ├── ui-icons_777620_256x240.png │ │ ├── ui-icons_777777_256x240.png │ │ ├── ui-icons_cc0000_256x240.png │ │ └── ui-icons_ffffff_256x240.png │ ├── index.html │ ├── jquery-ui.css │ ├── jquery-ui.js │ ├── jquery-ui.min.css │ ├── jquery-ui.min.js │ ├── jquery-ui.structure.css │ ├── jquery-ui.structure.min.css │ ├── jquery-ui.theme.css │ ├── jquery-ui.theme.min.css │ └── package.json └── no-data-to-display.js ├── grades_chart.php ├── graph_submission.php ├── graphresourcestartup.php ├── graphresourceurl.php ├── groupjavascript.php ├── highslide ├── graphics │ ├── close.png │ ├── closeX.png │ ├── controlbar-black-border.gif │ ├── controlbar-text-buttons.png │ ├── controlbar-white-small.gif │ ├── controlbar-white.gif │ ├── controlbar2.gif │ ├── controlbar3.gif │ ├── controlbar4-hover.gif │ ├── controlbar4.gif │ ├── fullexpand.gif │ ├── geckodimmer.png │ ├── icon.gif │ ├── loader.gif │ ├── loader.white.gif │ ├── outlines │ │ ├── Outlines.psd │ │ ├── beveled.png │ │ ├── drop-shadow.png │ │ ├── glossy-dark.png │ │ ├── outer-glow.png │ │ ├── rounded-black.png │ │ └── rounded-white.png │ ├── resize.gif │ ├── scrollarrows.png │ ├── zoomin.cur │ └── zoomout.cur ├── highslide-full.js ├── highslide-full.min.js ├── highslide-full.packed.js ├── highslide-ie6.css ├── highslide-with-gallery.js ├── highslide-with-gallery.min.js ├── highslide-with-gallery.packed.js ├── highslide-with-html.js ├── highslide-with-html.min.js ├── highslide-with-html.packed.js ├── highslide.css ├── highslide.js ├── highslide.min.js └── highslide.packed.js ├── hits.php ├── hotpot.php ├── images ├── exclamation_sign.png └── warning-attention-road-sign-exclamation-mark.png ├── javascriptfunctions.php ├── lang ├── en │ └── block_analytics_graphs.php ├── pt_br │ └── block_analytics_graphs.php └── zh_cn │ └── block_analytics_graphs.php ├── lib.php ├── query_grades.php ├── query_messages.php ├── query_resources_access.php ├── quiz.php ├── settings.php ├── thirdpartylibs.xml ├── timeaccesseschart.php ├── turnitin.php └── version.php /README.md: -------------------------------------------------------------------------------- 1 | AnalyticsGraphs 2 | =============== 3 | 4 | Learning analytics Moodle plugin - graphs to help teachers. 5 | -------------------------------------------------------------------------------- /assign.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | 18 | require('../../config.php'); 19 | require('graph_submission.php'); 20 | require('javascriptfunctions.php'); 21 | require_once('lib.php'); 22 | 23 | $course = required_param('id', PARAM_INT); 24 | 25 | /* Access control */ 26 | require_login($course); 27 | $context = context_course::instance($course); 28 | require_capability('block/analytics_graphs:viewpages', $context); 29 | require_capability('block/analytics_graphs:viewassignmentsubmissions', $context); 30 | 31 | $title = get_string('submissions_assign', 'block_analytics_graphs'); 32 | $submissionsgraph = new graph_submission($course, $title); 33 | 34 | 35 | $students = block_analytics_graphs_get_students($COURSE); 36 | $numberofstudents = count($students); 37 | if ($numberofstudents == 0) { 38 | echo(get_string('no_students', 'block_analytics_graphs')); 39 | exit; 40 | } 41 | $result = block_analytics_graphs_get_assign_submission($course, $students); 42 | $numberoftasks = count($result); 43 | if ($numberoftasks == 0) { 44 | echo(get_string('no_graph', 'block_analytics_graphs')); 45 | exit; 46 | } 47 | $submissionsgraphoptions = $submissionsgraph->create_graph($result, $students); 48 | 49 | /* Discover groups/groupings and members */ 50 | $groupmembers = block_analytics_graphs_get_course_group_members($COURSE); 51 | $groupingmembers = block_analytics_graphs_get_course_grouping_members($COURSE); 52 | $groupmembers = array_merge($groupmembers, $groupingmembers); 53 | $groupmembersjson = json_encode($groupmembers); 54 | 55 | $studentsjson = json_encode($students); 56 | $resultjson = json_encode($result); 57 | $statisticsjson = $submissionsgraph->get_statistics(); 58 | 59 | $codename = "assign.php"; 60 | require('groupjavascript.php'); 61 | -------------------------------------------------------------------------------- /block_analytics_graphs.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | defined('MOODLE_INTERNAL') || die(); 18 | 19 | require_once($CFG->dirroot . '/blocks/analytics_graphs/lib.php'); 20 | 21 | class block_analytics_graphs extends block_base { 22 | public function init() { 23 | $this->title = get_string('analytics_graphs', 'block_analytics_graphs'); 24 | } 25 | // The PHP tag and the curly bracket for the class definition 26 | // will only be closed after there is another function added in the next section. 27 | public function get_content() { 28 | global $CFG; 29 | global $DB; 30 | 31 | $course = $this->page->course; 32 | $context = context_course::instance($course->id); 33 | // Capability is course level, not block level, as graphs are for course level. 34 | $canview = has_capability('block/analytics_graphs:viewpages', $context); 35 | if (!$canview) { 36 | return; 37 | } 38 | if ($this->content !== null) { 39 | return $this->content; 40 | } 41 | 42 | $sql = "SELECT cm.module, md.name 43 | FROM {course_modules} cm 44 | LEFT JOIN {modules} md ON cm.module = md.id 45 | WHERE cm.course = ? 46 | GROUP BY cm.module, md.name"; 47 | $params = array($course->id); 48 | $availablemodulestotal = $DB->get_records_sql($sql, $params); 49 | $availablemodules = array(); 50 | foreach ($availablemodulestotal as $result) { 51 | array_push($availablemodules, $result->name); 52 | } 53 | 54 | $this->content = new stdClass; 55 | $this->content->text = ""; 56 | if (has_capability('block/analytics_graphs:viewgradeschart', $context)) { 57 | $this->content->text .= "
  • wwwroot}/blocks/analytics_graphs/grades_chart.php?id={$course->id} 58 | target=_blank>" . get_string('grades_chart', 'block_analytics_graphs') . ""; 59 | } 60 | if (has_capability('block/analytics_graphs:viewcontentaccesses', $context)) { 61 | $this->content->text .= "
  • wwwroot}/blocks/analytics_graphs/graphresourcestartup.php?id={$course->id} 62 | target=_blank>" . get_string('access_to_contents', 'block_analytics_graphs') . ""; 63 | } 64 | if (has_capability('block/analytics_graphs:viewnumberofactivestudents', $context)) { 65 | $this->content->text .= "
  • wwwroot}/blocks/analytics_graphs/timeaccesseschart.php?id={$course->id}&days=7 66 | target=_blank>" . get_string('timeaccesschart_title', 'block_analytics_graphs') . ""; 67 | } 68 | if (has_capability('block/analytics_graphs:viewassignmentsubmissions', $context) && in_array("assign", $availablemodules)) { 69 | $this->content->text .= "
  • wwwroot}/blocks/analytics_graphs/assign.php?id={$course->id} 70 | target=_blank>" . get_string('submissions_assign', 'block_analytics_graphs') . ""; 71 | } 72 | if (has_capability('block/analytics_graphs:viewquizsubmissions', $context) && in_array("quiz", $availablemodules)) { 73 | $this->content->text .= "
  • wwwroot}/blocks/analytics_graphs/quiz.php?id={$course->id} 74 | target=_blank>" . get_string('submissions_quiz', 'block_analytics_graphs') . ""; 75 | } 76 | if (in_array("hotpot", $availablemodules)) { 77 | $this->content->text .= "
  • wwwroot}/blocks/analytics_graphs/hotpot.php?id={$course->id} 78 | target=_blank>" . get_string('submissions_hotpot', 'block_analytics_graphs') . ""; 79 | } 80 | if (in_array("turnitintooltwo", $availablemodules)) { 81 | $this->content->text .= "
  • wwwroot}/blocks/analytics_graphs/turnitin.php?id={$course->id} 82 | target=_blank>" . get_string('submissions_turnitin', 'block_analytics_graphs') . ""; 83 | } 84 | if (has_capability('block/analytics_graphs:viewhitsdistribution', $context)) { 85 | $this->content->text .= "
  • wwwroot}/blocks/analytics_graphs/hits.php?id={$course->id} 86 | target=_blank>" . get_string('hits_distribution', 'block_analytics_graphs') . ""; 87 | } 88 | 89 | $this->content->footer = '
    '; 90 | return $this->content; 91 | } 92 | 93 | /** 94 | * Enables global configuration of the block in settings.php. 95 | * 96 | * @return bool True if the global configuration is enabled. 97 | */ 98 | public function has_config() { 99 | return true; 100 | } 101 | 102 | /** 103 | * Enabled config per block. 104 | * 105 | * @return true 106 | */ 107 | public function instance_allow_config() { 108 | return (bool) get_config('block_analytics_graphs', 'overrideonlyactive');; 109 | } 110 | 111 | /** 112 | * Process deletion of a block instance. 113 | */ 114 | public function instance_delete() { 115 | $needupdate = false; 116 | $onlyactivecourses = block_analytics_graphs_get_onlyactivecourses(); 117 | 118 | // If related course has "onlyactive" setting enabled, we would like to clean it up on the block deletion. 119 | if (($key = array_search($this->page->course->id, $onlyactivecourses)) !== false) { 120 | unset($onlyactivecourses[$key]); 121 | $needupdate = true; 122 | } 123 | 124 | if ($needupdate) { 125 | set_config('onlyactivecourses', implode(',', $onlyactivecourses), 'block_analytics_graphs'); 126 | } 127 | } 128 | } // Here's the closing bracket for the class definition. 129 | -------------------------------------------------------------------------------- /classes/event/block_analytics_graphs_event_send_email.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | /** 18 | * The EVENTNAME event. 19 | * 20 | * @package analytics_graphs 21 | * @copyright 2014 Marcelo Augusto Rauh Schmitt 22 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 | */ 24 | 25 | 26 | namespace block_analytics_graphs\event; 27 | defined('MOODLE_INTERNAL') || die(); 28 | /** 29 | * The block_analytics_graphs_event_send_email event class. 30 | * 31 | * @property-read array $other { 32 | * Extra information about event. 33 | * 34 | * - Whenever a teacher views a graph 35 | * } 36 | * 37 | * @since Moodle MOODLEVERSION 38 | * @copyright 2014 YOUR NAME 39 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 40 | **/ 41 | class block_analytics_graphs_event_send_email extends \core\event\base { 42 | protected function init() { 43 | $this->data['crud'] = 'c'; 44 | $this->data['edulevel'] = self::LEVEL_TEACHING; 45 | $this->data['objecttable'] = 'course'; 46 | 47 | } 48 | 49 | public static function get_name() { 50 | return get_string('event_send_email', 'block_analytics_graphs'); 51 | } 52 | 53 | public function get_description() { 54 | return "User: {$this->userid} - Course: {$this->objectid} - Graph: {$this->other}"; 55 | } 56 | 57 | public function get_url() { 58 | return new \moodle_url('/blocks/analytics_graphs/' . $this->other, array('id' => $this->objectid, 'legacy' => '0')); 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /classes/event/block_analytics_graphs_event_view_graph.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | /** 18 | * The EVENTNAME event. 19 | * 20 | * @package analytics_graphs 21 | * @copyright 2014 Marcelo Augusto Rauh Schmitt 22 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 | */ 24 | 25 | 26 | namespace block_analytics_graphs\event; 27 | defined('MOODLE_INTERNAL') || die(); 28 | /** 29 | * The block_analytics_graphs_event_view_graph event class. 30 | * 31 | * @property-read array $other { 32 | * Extra information about event. 33 | * 34 | * - Whenever a teacher views a graph 35 | * } 36 | * 37 | * @since Moodle MOODLEVERSION 38 | * @copyright 2014 YOUR NAME 39 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 40 | **/ 41 | class block_analytics_graphs_event_view_graph extends \core\event\base { 42 | protected function init() { 43 | $this->data['crud'] = 'r'; 44 | $this->data['edulevel'] = self::LEVEL_TEACHING; 45 | $this->data['objecttable'] = 'course'; 46 | } 47 | 48 | public static function get_name() { 49 | return get_string('event_view_graph', 'block_analytics_graphs'); 50 | } 51 | 52 | public function get_description() { 53 | return "User: {$this->userid} - Course: {$this->objectid} - Graph: {$this->other}"; 54 | } 55 | 56 | public function get_url() { 57 | return new \moodle_url('/blocks/analytics_graphs/' . $this->other, array('id' => $this->objectid, 'legacy' => '0')); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /classes/privacy/provider.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | namespace block_analytics_graphs\privacy; 18 | 19 | use core_privacy\local\metadata\collection; 20 | use core_privacy\local\request\approved_contextlist; 21 | use core_privacy\local\request\approved_userlist; 22 | use core_privacy\local\request\writer; 23 | use core_privacy\local\request\contextlist; 24 | use core_privacy\local\request\userlist; 25 | 26 | /** 27 | * Privacy Subsystem implementation for block_analytics_graphs. 28 | * 29 | * @package block_analytics_graphs 30 | * @author Dmitrii Metelkin 31 | * @copyright 2022 Catalyst IT 32 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 33 | */ 34 | class provider implements \core_privacy\local\metadata\provider, 35 | \core_privacy\local\request\core_userlist_provider, 36 | \core_privacy\local\request\plugin\provider { 37 | 38 | 39 | /** 40 | * Returns metadata. 41 | * 42 | * @param \core_privacy\local\metadata\collection $collection 43 | * @return \core_privacy\local\metadata\collection 44 | */ 45 | public static function get_metadata(collection $collection): collection { 46 | $collection->add_database_table( 47 | 'block_analytics_graphs_msg', 48 | [ 49 | 'fromid' => 'privacy:metadata:block_analytics_graphs_msg:fromid', 50 | 'subject' => 'privacy:metadata:block_analytics_graphs_msg:subject', 51 | ], 52 | 'privacy:metadata:block_analytics_graphs_msg' 53 | ); 54 | 55 | $collection->add_database_table( 56 | 'block_analytics_graphs_dest', 57 | [ 58 | 'toid' => 'privacy:metadata:block_analytics_graphs_dest:toid', 59 | 'messageid' => 'privacy:metadata:block_analytics_graphs_dest:messageid', 60 | ], 61 | 'privacy:metadata:block_analytics_graphs_dest' 62 | ); 63 | 64 | return $collection; 65 | } 66 | 67 | /** 68 | * Gets context for provided user ID. 69 | * 70 | * @param int $userid User ID. 71 | * @return \core_privacy\local\request\contextlist 72 | */ 73 | public static function get_contexts_for_userid(int $userid): contextlist { 74 | $contextlist = new contextlist(); 75 | 76 | $sql = "SELECT c.id 77 | FROM {context} ctx 78 | INNER JOIN {course} c ON c.id = ctx.instanceid AND ctx.contextlevel = :contextlevel 79 | INNER JOIN {block_analytics_graphs_msg} agm ON agm.courseid = c.id 80 | WHERE agm.fromid = :userid 81 | "; 82 | 83 | $contextlist->add_from_sql($sql, [ 84 | 'contextlevel' => CONTEXT_COURSE, 85 | 'userid' => $userid, 86 | ]); 87 | 88 | $sql = "SELECT c.id 89 | FROM {context} ctx 90 | INNER JOIN {course} c ON c.id = ctx.instanceid AND ctx.contextlevel = :contextlevel 91 | INNER JOIN {block_analytics_graphs_msg} agm ON agm.courseid = c.id 92 | INNER JOIN {block_analytics_graphs_dest} agd ON agd.messageid = agm.id 93 | WHERE agd.toid = :userid 94 | "; 95 | 96 | $contextlist->add_from_sql($sql, [ 97 | 'contextlevel' => CONTEXT_COURSE, 98 | 'userid' => $userid, 99 | ]); 100 | 101 | return $contextlist; 102 | } 103 | 104 | /** 105 | * Get users in the provided context. 106 | * 107 | * @param \core_privacy\local\request\userlist $userlist 108 | */ 109 | public static function get_users_in_context(userlist $userlist) { 110 | $context = $userlist->get_context(); 111 | 112 | if (!$context instanceof \context_course) { 113 | return; 114 | } 115 | 116 | $params = ['courseid' => $context->instanceid]; 117 | 118 | $sql = "SELECT fromid FROM {block_analytics_graphs_msg} WHERE courseid = :courseid"; 119 | $userlist->add_from_sql('fromid', $sql, $params); 120 | 121 | $sql = "SELECT agd.toid 122 | FROM {block_analytics_graphs_dest} agd 123 | INNER JOIN {block_analytics_graphs_msg} agm ON agd.messageid = agm.id 124 | WHERE agm.courseid = :courseid"; 125 | $userlist->add_from_sql('toid', $sql, $params); 126 | } 127 | 128 | /** 129 | * Export user data in the provided context. 130 | * 131 | * @param \core_privacy\local\request\approved_contextlist $contextlist 132 | */ 133 | public static function export_user_data(approved_contextlist $contextlist) { 134 | global $DB; 135 | 136 | $user = $contextlist->get_user(); 137 | 138 | foreach ($contextlist->get_contexts() as $context) { 139 | if ($context->contextlevel === CONTEXT_COURSE) { 140 | // Data export is organised in: {Context}/{Plugin Name}/{Table name}/{index}/data.json. 141 | $courseids[] = $context->instanceid; 142 | 143 | // Messages. 144 | $messages = $DB->get_records('block_analytics_graphs_msg', [ 145 | 'courseid' => $context->instanceid, 146 | 'fromid' => $user->id, 147 | ]); 148 | $index = 0; 149 | foreach ($messages as $message) { 150 | // Data export is organised in: {Context}/{Plugin Name}/{Table name}/{index}/data.json. 151 | $index++; 152 | $subcontext = [ 153 | get_string('pluginname', 'block_analytics_graphs'), 154 | 'block_analytics_graphs_msg', 155 | $index 156 | ]; 157 | 158 | $data = (object) [ 159 | 'fromid' => $message->fromid, 160 | 'subject' => $message->subject, 161 | ]; 162 | 163 | writer::with_context($context)->export_data($subcontext, $data); 164 | } 165 | 166 | // Destinations. 167 | $sql = "SELECT agd.toid, agd.messageid 168 | FROM {block_analytics_graphs_dest} agd 169 | INNER JOIN {block_analytics_graphs_msg} agm ON agd.messageid = agm.id 170 | WHERE agm.courseid = :courseid AND agd.toid = :userid"; 171 | 172 | $messages = $DB->get_records_sql($sql, [ 173 | 'courseid' => $context->instanceid, 174 | 'userid' => $user->id, 175 | ]); 176 | $index = 0; 177 | foreach ($messages as $message) { 178 | // Data export is organised in: {Context}/{Plugin Name}/{Table name}/{index}/data.json. 179 | $index++; 180 | $subcontext = [ 181 | get_string('pluginname', 'block_analytics_graphs'), 182 | 'block_analytics_graphs_dest', 183 | $index 184 | ]; 185 | 186 | $data = (object) [ 187 | 'toid' => $message->toid, 188 | 'messageid' => $message->messageid, 189 | ]; 190 | 191 | writer::with_context($context)->export_data($subcontext, $data); 192 | } 193 | } 194 | } 195 | } 196 | 197 | /** 198 | * Delete data for all users in the provided context. 199 | * 200 | * @param \context $context 201 | */ 202 | public static function delete_data_for_all_users_in_context(\context $context) { 203 | global $DB; 204 | 205 | if ($context->contextlevel !== CONTEXT_COURSE) { 206 | return; 207 | } 208 | 209 | $messageids = $DB->get_field('block_analytics_graphs_msg', 'id', ['courseid' => $context->instanceid]); 210 | list($insql, $inparams) = $DB->get_in_or_equal($messageids); 211 | 212 | $DB->delete_records_select('block_analytics_graphs_dest', " messageid $insql", $inparams); 213 | $DB->delete_records('block_analytics_graphs_msg', ['courseid' => $context->instanceid]); 214 | } 215 | 216 | /** 217 | * Delete data for user. 218 | * 219 | * @param \core_privacy\local\request\approved_contextlist $contextlist 220 | */ 221 | public static function delete_data_for_user(approved_contextlist $contextlist) { 222 | global $DB; 223 | 224 | // If the user has data, then only the User context should be present so get the first context. 225 | $contexts = $contextlist->get_contexts(); 226 | if (count($contexts) == 0) { 227 | return; 228 | } 229 | 230 | $userid = $contextlist->get_user()->id; 231 | 232 | $DB->set_field_select('block_analytics_graphs_dest', 'toid', 0, "toid = :toid", ['toid' => $userid]); 233 | $DB->set_field_select('block_analytics_graphs_msg', 'fromid', 0, "fromid = :fromid", ['fromid' => $userid]); 234 | } 235 | 236 | /** 237 | * Delete data for users. 238 | * 239 | * @param \core_privacy\local\request\approved_userlist $userlist 240 | */ 241 | public static function delete_data_for_users(approved_userlist $userlist) { 242 | global $DB; 243 | 244 | $context = $userlist->get_context(); 245 | 246 | if ($context->contextlevel !== CONTEXT_COURSE) { 247 | return; 248 | } 249 | 250 | $userids = $userlist->get_userids(); 251 | list($insql, $inparams) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED); 252 | 253 | $DB->set_field_select('block_analytics_graphs_dest', 'toid', 0, "toid {$insql}", $inparams); 254 | $DB->set_field_select('block_analytics_graphs_msg', 'fromid', 0, "fromid {$insql}", $inparams); 255 | } 256 | } 257 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "marceloschmitt/moodle-block_analytics_graphs", 3 | "type": "moodle-block", 4 | "require": { 5 | "composer/installers": "~1.0" 6 | }, 7 | "extra": { 8 | "installer-name": "analytics_graphs" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /db/access.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | defined('MOODLE_INTERNAL') || die(); 18 | 19 | $capabilities = array( 20 | 'block/analytics_graphs:bemonitored' => array( 21 | 'captype' => 'read', 22 | 'contextlevel' => CONTEXT_BLOCK, 23 | 'archetypes' => array( 24 | 'student' => CAP_ALLOW, 25 | ) 26 | ), 27 | 28 | 'block/analytics_graphs:viewpages' => array( 29 | 'riskbitmask' => RISK_SPAM, 30 | 'captype' => 'read', 31 | 'contextlevel' => CONTEXT_BLOCK, 32 | 'archetypes' => array( 33 | 'guest' => CAP_PREVENT, 34 | 'student' => CAP_PREVENT, 35 | 'teacher' => CAP_ALLOW, 36 | 'editingteacher' => CAP_ALLOW, 37 | 'manager' => CAP_ALLOW 38 | ) 39 | ), 40 | 'block/analytics_graphs:myaddinstance' => array( 41 | 'riskbitmask' => RISK_SPAM | RISK_XSS, 42 | 'captype' => 'write', 43 | 'contextlevel' => CONTEXT_SYSTEM, 44 | 'archetypes' => array( 45 | 'editingteacher' => CAP_ALLOW, 46 | 'manager' => CAP_ALLOW 47 | ), 48 | ), 49 | 'block/analytics_graphs:addinstance' => array( 50 | 'riskbitmask' => RISK_SPAM | RISK_XSS, 51 | 'captype' => 'write', 52 | 'contextlevel' => CONTEXT_BLOCK, 53 | 'archetypes' => array( 54 | 'editingteacher' => CAP_ALLOW, 55 | 'manager' => CAP_ALLOW 56 | ) 57 | ), 58 | 'block/analytics_graphs:viewgradeschart' => array( 59 | 'riskbitmask' => RISK_SPAM, 60 | 'captype' => 'read', 61 | 'contextlevel' => CONTEXT_BLOCK, 62 | 'archetypes' => array( 63 | 'guest' => CAP_PREVENT, 64 | 'student' => CAP_PREVENT, 65 | 'teacher' => CAP_ALLOW, 66 | 'editingteacher' => CAP_ALLOW, 67 | 'manager' => CAP_ALLOW 68 | ) 69 | ), 70 | 'block/analytics_graphs:viewcontentaccesses' => array( 71 | 'riskbitmask' => RISK_SPAM, 72 | 'captype' => 'read', 73 | 'contextlevel' => CONTEXT_BLOCK, 74 | 'archetypes' => array( 75 | 'guest' => CAP_PREVENT, 76 | 'student' => CAP_PREVENT, 77 | 'teacher' => CAP_ALLOW, 78 | 'editingteacher' => CAP_ALLOW, 79 | 'manager' => CAP_ALLOW 80 | ) 81 | ), 82 | 'block/analytics_graphs:viewnumberofactivestudents' => array( 83 | 'riskbitmask' => RISK_SPAM, 84 | 'captype' => 'read', 85 | 'contextlevel' => CONTEXT_BLOCK, 86 | 'archetypes' => array( 87 | 'guest' => CAP_PREVENT, 88 | 'student' => CAP_PREVENT, 89 | 'teacher' => CAP_ALLOW, 90 | 'editingteacher' => CAP_ALLOW, 91 | 'manager' => CAP_ALLOW 92 | ) 93 | ), 94 | 'block/analytics_graphs:viewassignmentsubmissions' => array( 95 | 'riskbitmask' => RISK_SPAM, 96 | 'captype' => 'read', 97 | 'contextlevel' => CONTEXT_BLOCK, 98 | 'archetypes' => array( 99 | 'guest' => CAP_PREVENT, 100 | 'student' => CAP_PREVENT, 101 | 'teacher' => CAP_ALLOW, 102 | 'editingteacher' => CAP_ALLOW, 103 | 'manager' => CAP_ALLOW 104 | ) 105 | ), 106 | 'block/analytics_graphs:viewquizsubmissions' => array( 107 | 'riskbitmask' => RISK_SPAM, 108 | 'captype' => 'read', 109 | 'contextlevel' => CONTEXT_BLOCK, 110 | 'archetypes' => array( 111 | 'guest' => CAP_PREVENT, 112 | 'student' => CAP_PREVENT, 113 | 'teacher' => CAP_ALLOW, 114 | 'editingteacher' => CAP_ALLOW, 115 | 'manager' => CAP_ALLOW 116 | ) 117 | ), 118 | 'block/analytics_graphs:viewhitsdistribution' => array( 119 | 'riskbitmask' => RISK_SPAM, 120 | 'captype' => 'read', 121 | 'contextlevel' => CONTEXT_BLOCK, 122 | 'archetypes' => array( 123 | 'guest' => CAP_PREVENT, 124 | 'student' => CAP_PREVENT, 125 | 'teacher' => CAP_ALLOW, 126 | 'editingteacher' => CAP_ALLOW, 127 | 'manager' => CAP_ALLOW 128 | ) 129 | ), 130 | ); 131 | -------------------------------------------------------------------------------- /db/install.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
    25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
    37 |
    38 |
    -------------------------------------------------------------------------------- /db/upgrade.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | defined('MOODLE_INTERNAL') || die(); 18 | 19 | function xmldb_block_analytics_graphs_upgrade($oldversion, $block) { 20 | global $CFG, $DB; 21 | 22 | $dbman = $DB->get_manager(); // Loads ddl manager and xmldb classes. 23 | 24 | if ($oldversion < 2015042003) { 25 | // Define table block_analytics_graphs_msg to be created. 26 | $table = new xmldb_table('block_analytics_graphs_msg'); 27 | 28 | // Adding fields to table block_analytics_graphs_msg. 29 | $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); 30 | $table->add_field('fromid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null); 31 | $table->add_field('subject', XMLDB_TYPE_TEXT, null, null, null, null, null); 32 | $table->add_field('message', XMLDB_TYPE_TEXT, null, null, null, null, null); 33 | $table->add_field('courseid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '1'); 34 | $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0'); 35 | 36 | // Adding keys to table block_analytics_graphs_msg. 37 | $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); 38 | $table->add_key('fromid', XMLDB_KEY_FOREIGN, array('fromid'), 'user', array('id')); 39 | $table->add_key('courseid', XMLDB_KEY_FOREIGN, array('courseid'), 'course', array('id')); 40 | 41 | // Conditionally launch create table for block_analytics_graphs_msg. 42 | if (!$dbman->table_exists($table)) { 43 | $dbman->create_table($table); 44 | } 45 | 46 | // Define table block_analytics_graphs_dest to be created. 47 | $table = new xmldb_table('block_analytics_graphs_dest'); 48 | 49 | // Adding fields to table block_analytics_graphs_dest. 50 | $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); 51 | $table->add_field('messageid', XMLDB_TYPE_INTEGER, '10', null, null, null, null); 52 | $table->add_field('toid', XMLDB_TYPE_INTEGER, '10', null, null, null, null); 53 | 54 | // Adding keys to table block_analytics_graphs_dest. 55 | $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); 56 | $table->add_key('messageid', XMLDB_KEY_FOREIGN, array('messageid'), 'block_analytics_graphs_msg', array('id')); 57 | $table->add_key('toid', XMLDB_KEY_FOREIGN, array('toid'), 'user', array('id')); 58 | 59 | // Conditionally launch create table for block_analytics_graphs_dest. 60 | if (!$dbman->table_exists($table)) { 61 | $dbman->create_table($table); 62 | } 63 | 64 | // Analytics_graphs savepoint reached. 65 | upgrade_block_savepoint(true, 2015042003, 'analytics_graphs'); 66 | } 67 | 68 | if ($oldversion < 2015051302) { 69 | $table = new xmldb_table('block_analytics_graphs_msg'); 70 | 71 | // Define field courseid to be added to block_analytics_graphs_msg. 72 | $field = new xmldb_field('courseid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '1', 'message'); 73 | // Conditionally launch add field courseid. 74 | if (!$dbman->field_exists($table, $field)) { 75 | $dbman->add_field($table, $field); 76 | $key = new xmldb_key('courseid', XMLDB_KEY_FOREIGN, array('courseid'), 'course', array('id')); 77 | $dbman->add_key($table, $key); 78 | } 79 | 80 | // Define field timecreated to be added to block_analytics_graphs_msg. 81 | $field = new xmldb_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, null, null, '0', 'courseid'); 82 | // Conditionally launch add field timecreated. 83 | if (!$dbman->field_exists($table, $field)) { 84 | $dbman->add_field($table, $field); 85 | $index = new xmldb_index('timecreated', XMLDB_INDEX_NOTUNIQUE, array('timecreated')); 86 | if (!$dbman->index_exists($table, $index)) { 87 | $dbman->add_index($table, $index); 88 | } 89 | } 90 | 91 | // Analytics_graphs savepoint reached. 92 | upgrade_block_savepoint(true, 2015051302, 'analytics_graphs'); 93 | } 94 | 95 | return true; 96 | } 97 | -------------------------------------------------------------------------------- /edit_form.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | defined('MOODLE_INTERNAL') || die(); 18 | 19 | require_once($CFG->dirroot . '/blocks/analytics_graphs/lib.php'); 20 | 21 | /** 22 | * Form for editing lock instances. 23 | * 24 | * @package block_analytics_graphs 25 | * @copyright 2024 Catalyst IT 26 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 27 | */ 28 | class block_analytics_graphs_edit_form extends block_edit_form { 29 | 30 | /** 31 | * Block config form definition. 32 | * 33 | * @param \MoodleQuickForm $mform Block form. 34 | * 35 | * @return void 36 | */ 37 | protected function specific_definition($mform) { 38 | // Adding a new "only active" setting only of allowed for individual blocks. 39 | if (get_config('block_analytics_graphs', 'overrideonlyactive')) { 40 | $mform->addElement('header', 'configheader', get_string('blocksettings', 'block')); 41 | $mform->addElement('advcheckbox', 'config_onlyactive', get_string('settings:onlyactive', 'block_analytics_graphs')); 42 | $mform->addHelpButton('config_onlyactive', 'settings:onlyactive', 'block_analytics_graphs'); 43 | $mform->setDefault('config_onlyactive', (bool) get_config('block_analytics_graphs', 'onlyactive')); 44 | } 45 | } 46 | 47 | /** 48 | * Display the configuration form when block is being added to the page 49 | * 50 | * @return bool 51 | */ 52 | public static function display_form_when_adding(): bool { 53 | // Makes sense to display block's setting when adding a block only if allowed extra setting. 54 | return (bool) get_config('block_analytics_graphs', 'overrideonlyactive'); 55 | } 56 | 57 | /** 58 | * Process the form submission, used if form was submitted via AJAX 59 | */ 60 | public function process_dynamic_submission() { 61 | parent::process_dynamic_submission(); 62 | 63 | // If allowed to have 'only active' setting per block, 64 | // then we would like to update it based on the curren block data. 65 | if (get_config('block_analytics_graphs', 'overrideonlyactive')) { 66 | $needupdate = false; 67 | $onlyactivecourses = block_analytics_graphs_get_onlyactivecourses(); 68 | $courseid = $this->page->course->id; 69 | $data = $this->get_data(); 70 | 71 | if(!empty($data->config_onlyactive)) { 72 | if (!in_array($courseid, $onlyactivecourses)) { 73 | $onlyactivecourses[] = $courseid; 74 | $needupdate = true; 75 | } 76 | } else { 77 | if (($key = array_search($courseid, $onlyactivecourses)) !== false) { 78 | unset($onlyactivecourses[$key]); 79 | $needupdate = true; 80 | } 81 | } 82 | 83 | // Conditionally save the settings only if updated. 84 | if ($needupdate) { 85 | set_config('onlyactivecourses', implode(',', $onlyactivecourses), 'block_analytics_graphs'); 86 | } 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /email.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | require_once("../../config.php"); 18 | require_once('lib.php'); 19 | global $USER; 20 | global $DB; 21 | require_once($CFG->dirroot.'/lib/moodlelib.php'); 22 | $course = required_param('id', PARAM_INT); 23 | $ids = required_param('ids', PARAM_TEXT); 24 | $other = required_param('other', PARAM_INT); 25 | $subject = required_param('subject', PARAM_TEXT); 26 | $messagetext = required_param('texto', PARAM_TEXT); 27 | $ccteachers = required_param('ccteachers', PARAM_BOOL); 28 | $messagehtml = $messagetext; 29 | 30 | /* Access control */ 31 | require_login($course); 32 | $context = context_course::instance($course); 33 | require_capability('block/analytics_graphs:viewpages', $context); 34 | 35 | $destination = explode(',', $ids); 36 | 37 | $touser = new stdClass(); 38 | $fromuser = new stdClass(); 39 | $touser->mailformat = 0; 40 | $fromuser->email = $USER->email; 41 | $fromuser->firstname = $USER->firstname; 42 | $fromuser->maildisplay = core_user::MAILDISPLAY_COURSE_MEMBERS_ONLY; 43 | $fromuser->lastname = $USER->lastname; 44 | $fromuser->id = $USER->id; 45 | 46 | $recordmsg = new stdClass(); 47 | $recordmsg->fromid = $fromuser->id; 48 | $recordmsg->subject = $subject; 49 | $recordmsg->message = $messagetext; 50 | $recordmsg->courseid = $course; 51 | $recordmsg->timecreated = time(); 52 | $messageid = $DB->insert_record('block_analytics_graphs_msg', $recordmsg, true); 53 | $recorddest = new stdClass(); 54 | $recorddest->messageid = $messageid; 55 | 56 | 57 | foreach ($destination as $i => $x) { 58 | $touser->id = $destination[$i]; 59 | $recorddest->toid = $touser->id; 60 | $touser->email = $DB->get_field('user', 'email', array('id' => $destination[$i])); 61 | email_to_user($touser, $fromuser, $subject, $messagetext, $messagehtml, '', '', true); 62 | $DB->insert_record('block_analytics_graphs_dest', $recorddest, false); 63 | } 64 | 65 | $messagetext = get_string('mailcopyalert', 'block_analytics_graphs') . $messagetext; 66 | $messagehtml = get_string('mailcopyalert', 'block_analytics_graphs') . $messagehtml; 67 | 68 | if ($ccteachers) { 69 | $userstocopyemail = block_analytics_graphs_get_teachers($course); 70 | 71 | foreach ($userstocopyemail as $i) { 72 | $touser->id = $i->id; 73 | $touser->email = $DB->get_field('user', 'email', array('id' => $i->id)); 74 | email_to_user($touser, $fromuser, $subject, $messagetext, $messagehtml, '', '', true); 75 | } 76 | } 77 | $mensagem = "ok"; 78 | echo json_encode($mensagem); 79 | $event = \block_analytics_graphs\event\block_analytics_graphs_event_send_email::create(array( 80 | 'objectid' => $course, 81 | 'context' => $context, 82 | 'other' => $other, 83 | )); 84 | $event->trigger(); -------------------------------------------------------------------------------- /externalref/export-csv-master/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 highslide-software 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /externalref/export-csv-master/README.md: -------------------------------------------------------------------------------- 1 | export-csv 2 | ========== 3 | This plugin allows the user to export the chart data to various formats and views. 4 | 5 | The contents of the plugin is located in the JavaScript file "export-csv.js". 6 | This plugin is published under the MIT license, and the license document is included in the repository. 7 | 8 | ### Demos 9 | * [Categorized chart](http://jsfiddle.net/highcharts/cqjvD/) 10 | * [View data table from menu](http://jsfiddle.net/highcharts/j4w4s0mw/) 11 | * [Highstock with time axis](http://jsfiddle.net/highcharts/2Jyn5/) 12 | * [Unit tests](http://jsfiddle.net/highcharts/pspdp2de/) 13 | 14 | ### Options 15 | * `exporting.csv.columnHeaderFormatter` 16 | Formatter callback for the column headers. Parameters are `item` (the series or axis object), `key` (the point key, for example `y` or `z`), and `keyLength`. By default it returns the series name, followed by the key if there is more than one key. For the axis it returns the axis title or "Category" or "DateTime" by default. 17 | 18 | * `exporting.csv.dateFormat` 19 | Which date format to use for exported dates on a datetime X axis. See [Highcharts.dateFormat](http://api.highcharts.com/highcharts#Highcharts.dateFormat\(\)). 20 | 21 | * `exporting.csv.itemDelimiter` 22 | The item delimiter, defaults to `,`. Use `;` for direct import to Excel. 23 | 24 | * `exporting.csv.lineDelimiter` 25 | The line delimiter, defaults to `\\n`. 26 | 27 | * `series.includeInCSVExport` 28 | Set this to false to prevent an individual series from being exported. To prevent the navigator in a stock chart, set `navigator.series.includeInCSVExport` to false. 29 | 30 | ### Methods 31 | * `Chart.getCSV()` 32 | Returns the current chart data as a CSV string 33 | 34 | * `Chart.getTable()` 35 | Returns the current chart data as a HTML table string, ready to be inserted into the DOM using `innerHTML`. 36 | 37 | * `Chart.getDataRows()` 38 | Returns the current chart data as a two dimensional array. 39 | 40 | * `Chart.viewData()` 41 | Inserts a data table below the chart container. -------------------------------------------------------------------------------- /externalref/export-csv-master/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "highcharts-export-csv", 3 | "version": "1.4.5", 4 | "description": "Highcharts plugin to export the chart data to CSV, XLS or HTML table", 5 | "keywords": [ 6 | "export", 7 | "csv", 8 | "xls" 9 | ], 10 | "authors": [ 11 | { "name": "Torstein Hønsi", "homepage": "https://github.com/highslide-software" } 12 | ], 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/highcharts/export-csv" 16 | }, 17 | "main": "export-csv.js", 18 | "license": "MIT", 19 | "ignore": [ 20 | "**/.*", 21 | "README.md" 22 | ], 23 | "homepage": "http://www.highcharts.com/plugin-registry/single/7/Export-CSV" 24 | } 25 | -------------------------------------------------------------------------------- /externalref/export-csv-master/export-csv.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A Highcharts plugin for exporting data from a rendered chart as CSV, XLS or HTML table 3 | * 4 | * Author: Torstein Honsi 5 | * Licence: MIT 6 | * Version: 1.4.5 7 | */ 8 | /*global Highcharts, window, document, Blob */ 9 | (function (factory) { 10 | if (typeof module === 'object' && module.exports) { 11 | module.exports = factory; 12 | } else { 13 | factory(Highcharts); 14 | } 15 | })(function (Highcharts) { 16 | 17 | 'use strict'; 18 | 19 | var each = Highcharts.each, 20 | pick = Highcharts.pick, 21 | seriesTypes = Highcharts.seriesTypes, 22 | downloadAttrSupported = document.createElement('a').download !== undefined; 23 | 24 | Highcharts.setOptions({ 25 | lang: { 26 | downloadCSV: 'Download CSV', 27 | downloadXLS: 'Download XLS', 28 | viewData: 'View data table' 29 | } 30 | }); 31 | 32 | 33 | /** 34 | * Get the data rows as a two dimensional array 35 | */ 36 | Highcharts.Chart.prototype.getDataRows = function () { 37 | var options = (this.options.exporting || {}).csv || {}, 38 | xAxis = this.xAxis[0], 39 | rows = {}, 40 | rowArr = [], 41 | dataRows, 42 | names = [], 43 | i, 44 | x, 45 | xTitle, 46 | // Options 47 | dateFormat = options.dateFormat || '%Y-%m-%d %H:%M:%S', 48 | columnHeaderFormatter = options.columnHeaderFormatter || function (item, key, keyLength) { 49 | if (item instanceof Highcharts.Axis) { 50 | return (item.options.title && item.options.title.text) || 51 | (item.isDatetimeAxis ? 'DateTime' : 'Category'); 52 | } 53 | return item.name + (keyLength > 1 ? ' ('+ key + ')' : ''); 54 | }; 55 | 56 | // Loop the series and index values 57 | i = 0; 58 | each(this.series, function (series) { 59 | var keys = series.options.keys, 60 | pointArrayMap = keys || series.pointArrayMap || ['y'], 61 | valueCount = pointArrayMap.length, 62 | requireSorting = series.requireSorting, 63 | categoryMap = {}, 64 | j; 65 | 66 | // Map the categories for value axes 67 | each(pointArrayMap, function (prop) { 68 | categoryMap[prop] = (series[prop + 'Axis'] && series[prop + 'Axis'].categories) || []; 69 | }); 70 | 71 | if (series.options.includeInCSVExport !== false && series.visible !== false) { // #55 72 | j = 0; 73 | while (j < valueCount) { 74 | names.push(columnHeaderFormatter(series, pointArrayMap[j], pointArrayMap.length)); 75 | j = j + 1; 76 | } 77 | 78 | each(series.points, function (point, pIdx) { 79 | var key = requireSorting ? point.x : pIdx, 80 | prop, 81 | val; 82 | 83 | j = 0; 84 | 85 | if (!rows[key]) { 86 | rows[key] = []; 87 | } 88 | rows[key].x = point.x; 89 | 90 | // Pies, funnels, geo maps etc. use point name in X row 91 | if (!series.xAxis || series.exportKey === 'name') { 92 | rows[key].name = point.name; 93 | } 94 | 95 | while (j < valueCount) { 96 | prop = pointArrayMap[j]; // y, z etc 97 | val = point[prop]; 98 | rows[key][i + j] = pick(categoryMap[prop][val], val); // Pick a Y axis category if present 99 | j = j + 1; 100 | } 101 | 102 | }); 103 | i = i + j; 104 | } 105 | }); 106 | 107 | // Make a sortable array 108 | for (x in rows) { 109 | if (rows.hasOwnProperty(x)) { 110 | rowArr.push(rows[x]); 111 | } 112 | } 113 | // Sort it by X values 114 | rowArr.sort(function (a, b) { 115 | return a.x - b.x; 116 | }); 117 | 118 | // Add header row 119 | xTitle = columnHeaderFormatter(xAxis); 120 | dataRows = [[xTitle].concat(names)]; 121 | 122 | // Add the category column 123 | each(rowArr, function (row) { 124 | 125 | var category = row.name; 126 | if (!category) { 127 | if (xAxis.isDatetimeAxis) { 128 | if (row.x instanceof Date) { 129 | row.x = row.x.getTime(); 130 | } 131 | category = Highcharts.dateFormat(dateFormat, row.x); 132 | } else if (xAxis.categories) { 133 | category = pick(xAxis.names[row.x], xAxis.categories[row.x], row.x) 134 | } else { 135 | category = row.x; 136 | } 137 | } 138 | 139 | // Add the X/date/category 140 | row.unshift(category); 141 | dataRows.push(row); 142 | }); 143 | 144 | return dataRows; 145 | }; 146 | 147 | /** 148 | * Get a CSV string 149 | */ 150 | Highcharts.Chart.prototype.getCSV = function (useLocalDecimalPoint) { 151 | var csv = '', 152 | rows = this.getDataRows(), 153 | options = (this.options.exporting || {}).csv || {}, 154 | itemDelimiter = options.itemDelimiter || ',', // use ';' for direct import to Excel 155 | lineDelimiter = options.lineDelimiter || '\n'; // '\n' isn't working with the js csv data extraction 156 | 157 | // Transform the rows to CSV 158 | each(rows, function (row, i) { 159 | var val = '', 160 | j = row.length, 161 | n = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.'; 162 | while (j--) { 163 | val = row[j]; 164 | if (typeof val === "string") { 165 | val = '"' + val + '"'; 166 | } 167 | if (typeof val === 'number') { 168 | if (n === ',') { 169 | val = val.toString().replace(".", ","); 170 | } 171 | } 172 | row[j] = val; 173 | } 174 | // Add the values 175 | csv += row.join(itemDelimiter); 176 | 177 | // Add the line delimiter 178 | if (i < rows.length - 1) { 179 | csv += lineDelimiter; 180 | } 181 | }); 182 | return csv; 183 | }; 184 | 185 | /** 186 | * Build a HTML table with the data 187 | */ 188 | Highcharts.Chart.prototype.getTable = function (useLocalDecimalPoint) { 189 | var html = '', 190 | rows = this.getDataRows(); 191 | 192 | // Transform the rows to HTML 193 | each(rows, function (row, i) { 194 | var tag = i ? 'td' : 'th', 195 | val, 196 | j, 197 | n = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.'; 198 | 199 | html += ''; 200 | for (j = 0; j < row.length; j = j + 1) { 201 | val = row[j]; 202 | // Add the cell 203 | if (typeof val === 'number') { 204 | val = val.toString(); 205 | if (n === ',') { 206 | val = val.replace('.', n); 207 | } 208 | html += '<' + tag + ' class="number">' + val + ''; 209 | 210 | } else { 211 | html += '<' + tag + '>' + (val === undefined ? '' : val) + ''; 212 | } 213 | } 214 | 215 | html += ''; 216 | 217 | // After the first row, end head and start body 218 | if (!i) { 219 | html += ''; 220 | } 221 | 222 | }); 223 | html += '
    '; 224 | 225 | console.log(html); 226 | return html; 227 | }; 228 | 229 | function getContent(chart, href, extension, content, MIME) { 230 | var a, 231 | blobObject, 232 | name, 233 | options = (chart.options.exporting || {}).csv || {}, 234 | url = options.url || 'http://www.highcharts.com/studies/csv-export/download.php'; 235 | 236 | if (chart.options.exporting.filename) { 237 | name = chart.options.exporting.filename; 238 | } else if (chart.title) { 239 | name = chart.title.textStr.replace(/ /g, '-').toLowerCase(); 240 | } else { 241 | name = 'chart'; 242 | } 243 | 244 | // MS specific. Check this first because of bug with Edge (#76) 245 | if (window.Blob && window.navigator.msSaveOrOpenBlob) { 246 | // Falls to msSaveOrOpenBlob if download attribute is not supported 247 | blobObject = new Blob([content]); 248 | window.navigator.msSaveOrOpenBlob(blobObject, name + '.' + extension); 249 | 250 | // Download attribute supported 251 | } else if (downloadAttrSupported) { 252 | a = document.createElement('a'); 253 | a.href = href; 254 | a.target = '_blank'; 255 | a.download = name + '.' + extension; 256 | chart.container.append(a); // #111 257 | a.click(); 258 | a.remove(); 259 | 260 | } else { 261 | // Fall back to server side handling 262 | Highcharts.post(url, { 263 | data: content, 264 | type: MIME, 265 | extension: extension 266 | }); 267 | } 268 | } 269 | 270 | /** 271 | * Call this on click of 'Download CSV' button 272 | */ 273 | Highcharts.Chart.prototype.downloadCSV = function () { 274 | var csv = this.getCSV(true); 275 | getContent( 276 | this, 277 | 'data:text/csv,\uFEFF' + encodeURIComponent(csv), 278 | 'csv', 279 | csv, 280 | 'text/csv' 281 | ); 282 | }; 283 | 284 | /** 285 | * Call this on click of 'Download XLS' button 286 | */ 287 | Highcharts.Chart.prototype.downloadXLS = function () { 288 | var uri = 'data:application/vnd.ms-excel;base64,', 289 | template = '' + 290 | '' + 293 | '' + 294 | '' + 295 | '' + 296 | '' + 297 | this.getTable(true) + 298 | '', 299 | base64 = function (s) { 300 | return window.btoa(unescape(encodeURIComponent(s))); // #50 301 | }; 302 | getContent( 303 | this, 304 | uri + base64(template), 305 | 'xls', 306 | template, 307 | 'application/vnd.ms-excel' 308 | ); 309 | }; 310 | 311 | /** 312 | * View the data in a table below the chart 313 | */ 314 | Highcharts.Chart.prototype.viewData = function () { 315 | if (!this.dataTableDiv) { 316 | this.dataTableDiv = document.createElement('div'); 317 | this.dataTableDiv.className = 'highcharts-data-table'; 318 | 319 | // Insert after the chart container 320 | this.renderTo.parentNode.insertBefore( 321 | this.dataTableDiv, 322 | this.renderTo.nextSibling 323 | ); 324 | } 325 | 326 | this.dataTableDiv.innerHTML = this.getTable(); 327 | }; 328 | 329 | 330 | // Add "Download CSV" to the exporting menu. Use download attribute if supported, else 331 | // run a simple PHP script that returns a file. The source code for the PHP script can be viewed at 332 | // https://raw.github.com/highslide-software/highcharts.com/master/studies/csv-export/csv.php 333 | if (Highcharts.getOptions().exporting) { 334 | Highcharts.getOptions().exporting.buttons.contextButton.menuItems.push({ 335 | textKey: 'downloadCSV', 336 | onclick: function () { this.downloadCSV(); } 337 | }, { 338 | textKey: 'downloadXLS', 339 | onclick: function () { this.downloadXLS(); } 340 | }/*, { 341 | textKey: 'viewData', 342 | onclick: function () { this.viewData(); } 343 | }*/ ); 344 | } 345 | 346 | // Series specific 347 | if (seriesTypes.map) { 348 | seriesTypes.map.prototype.exportKey = 'name'; 349 | } 350 | if (seriesTypes.mapbubble) { 351 | seriesTypes.mapbubble.prototype.exportKey = 'name'; 352 | } 353 | 354 | }); 355 | -------------------------------------------------------------------------------- /externalref/export-csv-master/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Export Data", 3 | "version": "1.4.5", 4 | "title": "Export chart data to CSV, XLS, HTML or JS array", 5 | "demo": [ 6 | "http://jsfiddle.net/highcharts/cqjvD/", 7 | "http://jsfiddle.net/highcharts/2Jyn5/" 8 | ], 9 | "author": { 10 | "name": "Torstein Hønsi", 11 | "url": "https://github.com/highslide-software" 12 | }, 13 | "maintainers": [ 14 | { 15 | "name": "Torgrim Thorsen", 16 | "url": "https://github.com/SirAlexiner", 17 | "email": "Sir_Alexiner@hotmail.com" 18 | } 19 | ], 20 | "licenses": [ 21 | { 22 | "type": "MIT", 23 | "url": "https://github.com/highslide-software/export-csv/blob/master/LICENSE" 24 | } 25 | ], 26 | "description": "Highcharts plugin to export the chart data to CSV, XLS or HTML table.", 27 | "keywords": [ 28 | "export", 29 | "csv", 30 | "xls" 31 | ], 32 | "dependencies": { 33 | "Highcharts": ">=3.0.0" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /externalref/export-csv-master/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "highcharts-export-csv", 3 | "version": "1.4.5", 4 | "description": "Highcharts plugin to export the chart data to CSV, XLS or HTML table", 5 | "keywords": [ 6 | "export", 7 | "csv", 8 | "xls" 9 | ], 10 | "main": "export-csv.js", 11 | "author": { 12 | "name": "Torstein Hønsi", 13 | "url": "https://github.com/highslide-software" 14 | }, 15 | "contributors": [ 16 | { 17 | "name": "Torgrim Thorsen", 18 | "url": "https://github.com/SirAlexiner", 19 | "email": "Sir_Alexiner@hotmail.com" 20 | } 21 | ], 22 | "repository": { 23 | "type": "git", 24 | "url": "https://github.com/highcharts/export-csv" 25 | }, 26 | "peerDependencies": { 27 | "highcharts": ">=3.0.0" 28 | }, 29 | "license": "MIT", 30 | "bugs": { 31 | "url": "https://github.com/highcharts/export-csv/issues" 32 | }, 33 | "homepage": "http://www.highcharts.com/plugin-registry/single/7/Export-CSV" 34 | } 35 | -------------------------------------------------------------------------------- /externalref/exporting.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v5.0.2 (2016-10-26) 3 | Exporting module 4 | 5 | (c) 2010-2016 Torstein Honsi 6 | 7 | License: www.highcharts.com/license 8 | */ 9 | (function(m){"object"===typeof module&&module.exports?module.exports=m:m(Highcharts)})(function(m){(function(f){var m=f.defaultOptions,n=f.doc,u=f.Chart,v=f.addEvent,D=f.removeEvent,E=f.fireEvent,r=f.createElement,B=f.discardElement,w=f.css,q=f.merge,C=f.pick,h=f.each,t=f.extend,G=f.splat,H=f.isTouchDevice,F=f.win,I=f.Renderer.prototype.symbols;t(m.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image", 10 | contextButtonTitle:"Chart context menu"});m.navigation={buttonOptions:{theme:{},symbolSize:14,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,verticalAlign:"top",width:24}};q(!0,m.navigation,{menuStyle:{border:"1px solid #999999",background:"#ffffff",padding:"5px 0"},menuItemStyle:{padding:"0.5em 1em",background:"none",color:"#333333",fontSize:H?"14px":"11px",transition:"background 250ms, color 250ms"},menuItemHoverStyle:{background:"#335cad",color:"#ffffff"},buttonOptions:{symbolFill:"#666666", 11 | symbolStroke:"#666666",symbolStrokeWidth:3,theme:{fill:"#ffffff",stroke:"none",padding:5}}});m.exporting={type:"image/png",url:"https://export.highcharts.com/",printMaxWidth:780,scale:2,buttons:{contextButton:{className:"highcharts-contextbutton",menuClassName:"highcharts-contextmenu",symbol:"menu",_titleKey:"contextButtonTitle",menuItems:[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}}, 12 | {textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}}};f.post=function(a,b,e){var c;a=r("form",q({method:"post",action:a,enctype:"multipart/form-data"},e),{display:"none"},n.body);for(c in b)r("input",{type:"hidden",name:c,value:b[c]},null,a);a.submit();B(a)};t(u.prototype,{sanitizeSVG:function(a){a=a.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g, 13 | "").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\(("|")(\S+)("|")\)/g,"url($2)").replace(/url\([^#]+#/g,"url(#").replace(/.*?$/,"\x3c/svg\x3e").replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g,'$1\x3d"rgb($2)" $1-opacity\x3d"$3"').replace(/ /g,"\u00a0").replace(/­/g,"\u00ad");return a=a.replace(//g,"\x3c$1title\x3e").replace(/height=([^" ]+)/g,'height\x3d"$1"').replace(/width=([^" ]+)/g,'width\x3d"$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href\x3d"$1"/\x3e').replace(/ id=([^" >]+)/g,' id\x3d"$1"').replace(/class=([^" >]+)/g,'class\x3d"$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()})},getChartHTML:function(){return this.container.innerHTML},getSVG:function(a){var b=this,e, 15 | c,g,x,k,d=q(b.options,a),p=d.exporting.allowHTML;n.createElementNS||(n.createElementNS=function(a,b){return n.createElement(b)});c=r("div",null,{position:"absolute",top:"-9999em",width:b.chartWidth+"px",height:b.chartHeight+"px"},n.body);g=b.renderTo.style.width;k=b.renderTo.style.height;g=d.exporting.sourceWidth||d.chart.width||/px$/.test(g)&&parseInt(g,10)||600;k=d.exporting.sourceHeight||d.chart.height||/px$/.test(k)&&parseInt(k,10)||400;t(d.chart,{animation:!1,renderTo:c,forExport:!0,renderer:"SVGRenderer", 16 | width:g,height:k});d.exporting.enabled=!1;delete d.data;d.series=[];h(b.series,function(a){x=q(a.userOptions,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});x.isInternal||d.series.push(x)});a&&h(["xAxis","yAxis"],function(b){h(G(a[b]),function(a,c){d[b][c]=q(d[b][c],a)})});e=new f.Chart(d,b.callback);h(["xAxis","yAxis"],function(a){h(b[a],function(b,c){c=e[a][c];var d=b.getExtremes();b=d.userMin;d=d.userMax;!c||void 0===b&&void 0===d||c.setExtremes(b,d,!0,!1)})});g=e.getChartHTML(); 17 | d=null;e.destroy();B(c);p&&(c=g.match(/<\/svg>(.*?$)/))&&(c='\x3cforeignObject x\x3d"0" y\x3d"0" width\x3d"200" height\x3d"200"\x3e\x3cbody xmlns\x3d"http://www.w3.org/1999/xhtml"\x3e'+c[1]+"\x3c/body\x3e\x3c/foreignObject\x3e",g=g.replace("\x3c/svg\x3e",c+"\x3c/svg\x3e"));g=this.sanitizeSVG(g);return g=g.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g,"'")},getSVGForExport:function(a,b){var e=this.options.exporting;return this.getSVG(q({chart:{borderRadius:0}},e.chartOptions,b, 18 | {exporting:{sourceWidth:a&&a.sourceWidth||e.sourceWidth,sourceHeight:a&&a.sourceHeight||e.sourceHeight}}))},exportChart:function(a,b){b=this.getSVGForExport(a,b);a=q(this.options.exporting,a);f.post(a.url,{filename:a.filename||"chart",type:a.type,width:a.width||0,scale:a.scale,svg:b},a.formAttributes)},print:function(){var a=this,b=a.container,e=[],c=b.parentNode,g=n.body,f=g.childNodes,k=a.options.exporting.printMaxWidth,d,p;if(!a.isPrinting){a.isPrinting=!0;a.pointer.reset(null,0);E(a,"beforePrint"); 19 | if(p=k&&a.chartWidth>k)d=[a.options.chart.width,void 0,!1],a.setSize(k,void 0,!1);h(f,function(a,b){1===a.nodeType&&(e[b]=a.style.display,a.style.display="none")});g.appendChild(b);F.focus();F.print();setTimeout(function(){c.appendChild(b);h(f,function(a,b){1===a.nodeType&&(a.style.display=e[b])});a.isPrinting=!1;p&&a.setSize.apply(a,d);E(a,"afterPrint")},1E3)}},contextMenu:function(a,b,e,c,g,f,k){var d=this,p=d.options.navigation,m=d.chartWidth,q=d.chartHeight,x="cache-"+a,l=d[x],y=Math.max(g,f), 20 | z,A,u=function(b){d.pointer.inClass(b.target,a)||A()};l||(d[x]=l=r("div",{className:a},{position:"absolute",zIndex:1E3,padding:y+"px"},d.container),z=r("div",{className:"highcharts-menu"},null,l),w(z,t({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},p.menuStyle)),A=function(){w(l,{display:"none"});k&&k.setState(0);d.openMenu=!1},v(l,"mouseleave",function(){l.hideTimer=setTimeout(A,500)}),v(l,"mouseenter",function(){clearTimeout(l.hideTimer)}),v(n, 21 | "mouseup",u),v(d,"destroy",function(){D(n,"mouseup",u)}),h(b,function(a){if(a){var b;a.separator?b=r("hr",null,null,z):(b=r("div",{className:"highcharts-menu-item",onclick:function(b){b&&b.stopPropagation();A();a.onclick&&a.onclick.apply(d,arguments)},innerHTML:a.text||d.options.lang[a.textKey]},null,z),b.onmouseover=function(){w(this,p.menuItemHoverStyle)},b.onmouseout=function(){w(this,p.menuItemStyle)},w(b,t({cursor:"pointer"},p.menuItemStyle)));d.exportDivElements.push(b)}}),d.exportDivElements.push(z, 22 | l),d.exportMenuWidth=l.offsetWidth,d.exportMenuHeight=l.offsetHeight);b={display:"block"};e+d.exportMenuWidth>m?b.right=m-e-g-y+"px":b.left=e-y+"px";c+f+d.exportMenuHeight>q&&"top"!==k.alignOptions.verticalAlign?b.bottom=q-c-y+"px":b.top=c+f-y+"px";w(l,b);d.openMenu=!0},addButton:function(a){var b=this,e=b.renderer,c=q(b.options.navigation.buttonOptions,a),f=c.onclick,m=c.menuItems,k,d,p=c.symbolSize||12;b.btnCount||(b.btnCount=0);b.exportDivElements||(b.exportDivElements=[],b.exportSVGElements=[]); 23 | if(!1!==c.enabled){var h=c.theme,n=h.states,r=n&&n.hover,n=n&&n.select,l;delete h.states;f?l=function(a){a.stopPropagation();f.call(b,a)}:m&&(l=function(){b.contextMenu(d.menuClassName,m,d.translateX,d.translateY,d.width,d.height,d);d.setState(2)});c.text&&c.symbol?h.paddingLeft=C(h.paddingLeft,25):c.text||t(h,{width:c.width,height:c.height,padding:0});d=e.button(c.text,0,0,l,h,r,n).addClass(a.className).attr({"stroke-linecap":"round",title:b.options.lang[c._titleKey],zIndex:3});d.menuClassName=a.menuClassName|| 24 | "highcharts-menu-"+b.btnCount++;c.symbol&&(k=e.symbol(c.symbol,c.symbolX-p/2,c.symbolY-p/2,p,p).addClass("highcharts-button-symbol").attr({zIndex:1}).add(d),k.attr({stroke:c.symbolStroke,fill:c.symbolFill,"stroke-width":c.symbolStrokeWidth||1}));d.add().align(t(c,{width:d.width,x:C(c.x,b.buttonOffset)}),!0,"spacingBox");b.buttonOffset+=(d.width+c.buttonSpacing)*("right"===c.align?-1:1);b.exportSVGElements.push(d,k)}},destroyExport:function(a){var b=a?a.target:this;a=b.exportSVGElements;var e=b.exportDivElements; 25 | a&&(h(a,function(a,e){a&&(a.onclick=a.ontouchstart=null,b.exportSVGElements[e]=a.destroy())}),a.length=0);e&&(h(e,function(a,e){clearTimeout(a.hideTimer);D(a,"mouseleave");b.exportDivElements[e]=a.onmouseout=a.onmouseover=a.ontouchstart=a.onclick=null;B(a)}),e.length=0)}});I.menu=function(a,b,e,c){return["M",a,b+2.5,"L",a+e,b+2.5,"M",a,b+c/2+.5,"L",a+e,b+c/2+.5,"M",a,b+c-1.5,"L",a+e,b+c-1.5]};u.prototype.renderExporting=function(){var a,b=this.options.exporting,e=b.buttons,c=this.isDirtyExporting|| 26 | !this.exportSVGElements;this.buttonOffset=0;this.isDirtyExporting&&this.destroyExport();if(c&&!1!==b.enabled){for(a in e)this.addButton(e[a]);this.isDirtyExporting=!1}v(this,"destroy",this.destroyExport)};u.prototype.callbacks.push(function(a){a.renderExporting();v(a,"redraw",a.renderExporting);h(["exporting","navigation"],function(b){a[b]={update:function(e,c){a.isDirtyExporting=!0;q(!0,a.options[b],e);C(c,!0)&&a.redraw()}}})})})(m)}); 27 | -------------------------------------------------------------------------------- /externalref/jquery-ui-1.12.1/AUTHORS.txt: -------------------------------------------------------------------------------- 1 | Authors ordered by first contribution 2 | A list of current team members is available at http://jqueryui.com/about 3 | 4 | Paul Bakaus 5 | Richard Worth 6 | Yehuda Katz 7 | Sean Catchpole 8 | John Resig 9 | Tane Piper 10 | Dmitri Gaskin 11 | Klaus Hartl 12 | Stefan Petre 13 | Gilles van den Hoven 14 | Micheil Bryan Smith 15 | Jörn Zaefferer 16 | Marc Grabanski 17 | Keith Wood 18 | Brandon Aaron 19 | Scott González 20 | Eduardo Lundgren 21 | Aaron Eisenberger 22 | Joan Piedra 23 | Bruno Basto 24 | Remy Sharp 25 | Bohdan Ganicky 26 | David Bolter 27 | Chi Cheng 28 | Ca-Phun Ung 29 | Ariel Flesler 30 | Maggie Wachs 31 | Scott Jehl 32 | Todd Parker 33 | Andrew Powell 34 | Brant Burnett 35 | Douglas Neiner 36 | Paul Irish 37 | Ralph Whitbeck 38 | Thibault Duplessis 39 | Dominique Vincent 40 | Jack Hsu 41 | Adam Sontag 42 | Carl Fürstenberg 43 | Kevin Dalman 44 | Alberto Fernández Capel 45 | Jacek Jędrzejewski (http://jacek.jedrzejewski.name) 46 | Ting Kuei 47 | Samuel Cormier-Iijima 48 | Jon Palmer 49 | Ben Hollis 50 | Justin MacCarthy 51 | Eyal Kobrigo 52 | Tiago Freire 53 | Diego Tres 54 | Holger Rüprich 55 | Ziling Zhao 56 | Mike Alsup 57 | Robson Braga Araujo 58 | Pierre-Henri Ausseil 59 | Christopher McCulloh 60 | Andrew Newcomb 61 | Lim Chee Aun 62 | Jorge Barreiro 63 | Daniel Steigerwald 64 | John Firebaugh 65 | John Enters 66 | Andrey Kapitcyn 67 | Dmitry Petrov 68 | Eric Hynds 69 | Chairat Sunthornwiphat 70 | Josh Varner 71 | Stéphane Raimbault 72 | Jay Merrifield 73 | J. Ryan Stinnett 74 | Peter Heiberg 75 | Alex Dovenmuehle 76 | Jamie Gegerson 77 | Raymond Schwartz 78 | Phillip Barnes 79 | Kyle Wilkinson 80 | Khaled AlHourani 81 | Marian Rudzynski 82 | Jean-Francois Remy 83 | Doug Blood 84 | Filippo Cavallarin 85 | Heiko Henning 86 | Aliaksandr Rahalevich 87 | Mario Visic 88 | Xavi Ramirez 89 | Max Schnur 90 | Saji Nediyanchath 91 | Corey Frang 92 | Aaron Peterson 93 | Ivan Peters 94 | Mohamed Cherif Bouchelaghem 95 | Marcos Sousa 96 | Michael DellaNoce 97 | George Marshall 98 | Tobias Brunner 99 | Martin Solli 100 | David Petersen 101 | Dan Heberden 102 | William Kevin Manire 103 | Gilmore Davidson 104 | Michael Wu 105 | Adam Parod 106 | Guillaume Gautreau 107 | Marcel Toele 108 | Dan Streetman 109 | Matt Hoskins 110 | Giovanni Giacobbi 111 | Kyle Florence 112 | Pavol Hluchý 113 | Hans Hillen 114 | Mark Johnson 115 | Trey Hunner 116 | Shane Whittet 117 | Edward A Faulkner 118 | Adam Baratz 119 | Kato Kazuyoshi 120 | Eike Send 121 | Kris Borchers 122 | Eddie Monge 123 | Israel Tsadok 124 | Carson McDonald 125 | Jason Davies 126 | Garrison Locke 127 | David Murdoch 128 | Benjamin Scott Boyle 129 | Jesse Baird 130 | Jonathan Vingiano 131 | Dylan Just 132 | Hiroshi Tomita 133 | Glenn Goodrich 134 | Tarafder Ashek-E-Elahi 135 | Ryan Neufeld 136 | Marc Neuwirth 137 | Philip Graham 138 | Benjamin Sterling 139 | Wesley Walser 140 | Kouhei Sutou 141 | Karl Kirch 142 | Chris Kelly 143 | Jason Oster 144 | Felix Nagel 145 | Alexander Polomoshnov 146 | David Leal 147 | Igor Milla 148 | Dave Methvin 149 | Florian Gutmann 150 | Marwan Al Jubeh 151 | Milan Broum 152 | Sebastian Sauer 153 | Gaëtan Muller 154 | Michel Weimerskirch 155 | William Griffiths 156 | Stojce Slavkovski 157 | David Soms 158 | David De Sloovere 159 | Michael P. Jung 160 | Shannon Pekary 161 | Dan Wellman 162 | Matthew Edward Hutton 163 | James Khoury 164 | Rob Loach 165 | Alberto Monteiro 166 | Alex Rhea 167 | Krzysztof Rosiński 168 | Ryan Olton 169 | Genie <386@mail.com> 170 | Rick Waldron 171 | Ian Simpson 172 | Lev Kitsis 173 | TJ VanToll 174 | Justin Domnitz 175 | Douglas Cerna 176 | Bert ter Heide 177 | Jasvir Nagra 178 | Yuriy Khabarov <13real008@gmail.com> 179 | Harri Kilpiö 180 | Lado Lomidze 181 | Amir E. Aharoni 182 | Simon Sattes 183 | Jo Liss 184 | Guntupalli Karunakar 185 | Shahyar Ghobadpour 186 | Lukasz Lipinski 187 | Timo Tijhof 188 | Jason Moon 189 | Martin Frost 190 | Eneko Illarramendi 191 | EungJun Yi 192 | Courtland Allen 193 | Viktar Varvanovich 194 | Danny Trunk 195 | Pavel Stetina 196 | Michael Stay 197 | Steven Roussey 198 | Michael Hollis 199 | Lee Rowlands 200 | Timmy Willison 201 | Karl Swedberg 202 | Baoju Yuan 203 | Maciej Mroziński 204 | Luis Dalmolin 205 | Mark Aaron Shirley 206 | Martin Hoch 207 | Jiayi Yang 208 | Philipp Benjamin Köppchen 209 | Sindre Sorhus 210 | Bernhard Sirlinger 211 | Jared A. Scheel 212 | Rafael Xavier de Souza 213 | John Chen 214 | Robert Beuligmann 215 | Dale Kocian 216 | Mike Sherov 217 | Andrew Couch 218 | Marc-Andre Lafortune 219 | Nate Eagle 220 | David Souther 221 | Mathias Stenbom 222 | Sergey Kartashov 223 | Avinash R 224 | Ethan Romba 225 | Cory Gackenheimer 226 | Juan Pablo Kaniefsky 227 | Roman Salnikov 228 | Anika Henke 229 | Samuel Bovée 230 | Fabrício Matté 231 | Viktor Kojouharov 232 | Pawel Maruszczyk (http://hrabstwo.net) 233 | Pavel Selitskas 234 | Bjørn Johansen 235 | Matthieu Penant 236 | Dominic Barnes 237 | David Sullivan 238 | Thomas Jaggi 239 | Vahid Sohrabloo 240 | Travis Carden 241 | Bruno M. Custódio 242 | Nathanael Silverman 243 | Christian Wenz 244 | Steve Urmston 245 | Zaven Muradyan 246 | Woody Gilk 247 | Zbigniew Motyka 248 | Suhail Alkowaileet 249 | Toshi MARUYAMA 250 | David Hansen 251 | Brian Grinstead 252 | Christian Klammer 253 | Steven Luscher 254 | Gan Eng Chin 255 | Gabriel Schulhof 256 | Alexander Schmitz 257 | Vilhjálmur Skúlason 258 | Siebrand Mazeland 259 | Mohsen Ekhtiari 260 | Pere Orga 261 | Jasper de Groot 262 | Stephane Deschamps 263 | Jyoti Deka 264 | Andrei Picus 265 | Ondrej Novy 266 | Jacob McCutcheon 267 | Monika Piotrowicz 268 | Imants Horsts 269 | Eric Dahl 270 | Dave Stein 271 | Dylan Barrell 272 | Daniel DeGroff 273 | Michael Wiencek 274 | Thomas Meyer 275 | Ruslan Yakhyaev 276 | Brian J. Dowling 277 | Ben Higgins 278 | Yermo Lamers 279 | Patrick Stapleton 280 | Trisha Crowley 281 | Usman Akeju 282 | Rodrigo Menezes 283 | Jacques Perrault 284 | Frederik Elvhage 285 | Will Holley 286 | Uri Gilad 287 | Richard Gibson 288 | Simen Bekkhus 289 | Chen Eshchar 290 | Bruno Pérel 291 | Mohammed Alshehri 292 | Lisa Seacat DeLuca 293 | Anne-Gaelle Colom 294 | Adam Foster 295 | Luke Page 296 | Daniel Owens 297 | Michael Orchard 298 | Marcus Warren 299 | Nils Heuermann 300 | Marco Ziech 301 | Patricia Juarez 302 | Ben Mosher 303 | Ablay Keldibek 304 | Thomas Applencourt 305 | Jiabao Wu 306 | Eric Lee Carraway 307 | Victor Homyakov 308 | Myeongjin Lee 309 | Liran Sharir 310 | Weston Ruter 311 | Mani Mishra 312 | Hannah Methvin 313 | Leonardo Balter 314 | Benjamin Albert 315 | Michał Gołębiowski 316 | Alyosha Pushak 317 | Fahad Ahmad 318 | Matt Brundage 319 | Francesc Baeta 320 | Piotr Baran 321 | Mukul Hase 322 | Konstantin Dinev 323 | Rand Scullard 324 | Dan Strohl 325 | Maksim Ryzhikov 326 | Amine HADDAD 327 | Amanpreet Singh 328 | Alexey Balchunas 329 | Peter Kehl 330 | Peter Dave Hello 331 | Johannes Schäfer 332 | Ville Skyttä 333 | Ryan Oriecuia 334 | -------------------------------------------------------------------------------- /externalref/jquery-ui-1.12.1/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright jQuery Foundation and other contributors, https://jquery.org/ 2 | 3 | This software consists of voluntary contributions made by many 4 | individuals. For exact contribution history, see the revision history 5 | available at https://github.com/jquery/jquery-ui 6 | 7 | The following license applies to all parts of this software except as 8 | documented below: 9 | 10 | ==== 11 | 12 | Permission is hereby granted, free of charge, to any person obtaining 13 | a copy of this software and associated documentation files (the 14 | "Software"), to deal in the Software without restriction, including 15 | without limitation the rights to use, copy, modify, merge, publish, 16 | distribute, sublicense, and/or sell copies of the Software, and to 17 | permit persons to whom the Software is furnished to do so, subject to 18 | the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be 21 | included in all copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 27 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 28 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 29 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 30 | 31 | ==== 32 | 33 | Copyright and related rights for sample code are waived via CC0. Sample 34 | code is defined as all source code contained within the demos directory. 35 | 36 | CC0: http://creativecommons.org/publicdomain/zero/1.0/ 37 | 38 | ==== 39 | 40 | All files located in the node_modules and external directories are 41 | externally maintained libraries used by this software which have their 42 | own licenses; we recommend you read them, as their terms may differ from 43 | the terms above. 44 | -------------------------------------------------------------------------------- /externalref/jquery-ui-1.12.1/images/ui-icons_444444_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/externalref/jquery-ui-1.12.1/images/ui-icons_444444_256x240.png -------------------------------------------------------------------------------- /externalref/jquery-ui-1.12.1/images/ui-icons_555555_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/externalref/jquery-ui-1.12.1/images/ui-icons_555555_256x240.png -------------------------------------------------------------------------------- /externalref/jquery-ui-1.12.1/images/ui-icons_777620_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/externalref/jquery-ui-1.12.1/images/ui-icons_777620_256x240.png -------------------------------------------------------------------------------- /externalref/jquery-ui-1.12.1/images/ui-icons_777777_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/externalref/jquery-ui-1.12.1/images/ui-icons_777777_256x240.png -------------------------------------------------------------------------------- /externalref/jquery-ui-1.12.1/images/ui-icons_cc0000_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/externalref/jquery-ui-1.12.1/images/ui-icons_cc0000_256x240.png -------------------------------------------------------------------------------- /externalref/jquery-ui-1.12.1/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/externalref/jquery-ui-1.12.1/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /externalref/jquery-ui-1.12.1/jquery-ui.structure.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.12.1 - 2016-09-14 2 | * http://jqueryui.com 3 | * Copyright jQuery Foundation and other contributors; Licensed MIT */ 4 | 5 | .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px} -------------------------------------------------------------------------------- /externalref/jquery-ui-1.12.1/jquery-ui.theme.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.12.1 - 2016-09-14 2 | * http://jqueryui.com 3 | * Copyright jQuery Foundation and other contributors; Licensed MIT */ 4 | 5 | .ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.003;filter:Alpha(Opacity=.3)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} -------------------------------------------------------------------------------- /externalref/jquery-ui-1.12.1/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-ui", 3 | "title": "jQuery UI", 4 | "description": "A curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library.", 5 | "version": "1.12.1", 6 | "homepage": "http://jqueryui.com", 7 | "author": { 8 | "name": "jQuery Foundation and other contributors", 9 | "url": "https://github.com/jquery/jquery-ui/blob/1.12.1/AUTHORS.txt" 10 | }, 11 | "main": "ui/widget.js", 12 | "maintainers": [ 13 | { 14 | "name": "Scott González", 15 | "email": "scott.gonzalez@gmail.com", 16 | "url": "http://scottgonzalez.com" 17 | }, 18 | { 19 | "name": "Jörn Zaefferer", 20 | "email": "joern.zaefferer@gmail.com", 21 | "url": "http://bassistance.de" 22 | }, 23 | { 24 | "name": "Mike Sherov", 25 | "email": "mike.sherov@gmail.com", 26 | "url": "http://mike.sherov.com" 27 | }, 28 | { 29 | "name": "TJ VanToll", 30 | "email": "tj.vantoll@gmail.com", 31 | "url": "http://tjvantoll.com" 32 | }, 33 | { 34 | "name": "Felix Nagel", 35 | "email": "info@felixnagel.com", 36 | "url": "http://www.felixnagel.com" 37 | }, 38 | { 39 | "name": "Alex Schmitz", 40 | "email": "arschmitz@gmail.com", 41 | "url": "https://github.com/arschmitz" 42 | } 43 | ], 44 | "repository": { 45 | "type": "git", 46 | "url": "git://github.com/jquery/jquery-ui.git" 47 | }, 48 | "bugs": "https://bugs.jqueryui.com/", 49 | "license": "MIT", 50 | "scripts": { 51 | "test": "grunt" 52 | }, 53 | "dependencies": {}, 54 | "devDependencies": { 55 | "commitplease": "2.3.0", 56 | "grunt": "0.4.5", 57 | "grunt-bowercopy": "1.2.4", 58 | "grunt-cli": "0.1.13", 59 | "grunt-compare-size": "0.4.0", 60 | "grunt-contrib-concat": "0.5.1", 61 | "grunt-contrib-csslint": "0.5.0", 62 | "grunt-contrib-jshint": "0.12.0", 63 | "grunt-contrib-qunit": "1.0.1", 64 | "grunt-contrib-requirejs": "0.4.4", 65 | "grunt-contrib-uglify": "0.11.1", 66 | "grunt-git-authors": "3.1.0", 67 | "grunt-html": "6.0.0", 68 | "grunt-jscs": "2.1.0", 69 | "load-grunt-tasks": "3.4.0", 70 | "rimraf": "2.5.1", 71 | "testswarm": "1.1.0" 72 | }, 73 | "keywords": [] 74 | } 75 | -------------------------------------------------------------------------------- /externalref/no-data-to-display.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v4.1.5 (2015-04-13) 3 | Plugin for displaying a message when there is no data visible in chart. 4 | 5 | (c) 2010-2014 Highsoft AS 6 | Author: Oystein Moseng 7 | 8 | License: www.highcharts.com/license 9 | */ 10 | (function(c){function i(){return!!this.points.length}function e(){this.hasData()?this.hideNoData():this.showNoData()}var f=c.seriesTypes,d=c.Chart.prototype,g=c.getOptions(),h=c.extend,j=c.each;h(g.lang,{noData:"No data to display"});g.noData={position:{x:0,y:0,align:"center",verticalAlign:"middle"},attr:{},style:{fontWeight:"bold",fontSize:"12px",color:"#60606a"}};j(["pie","gauge","waterfall","bubble"],function(a){if(f[a])f[a].prototype.hasData=i});c.Series.prototype.hasData=function(){return this.visible&& 11 | this.dataMax!==void 0&&this.dataMin!==void 0};d.showNoData=function(a){var b=this.options,a=a||b.lang.noData,b=b.noData;if(!this.noDataLabel)this.noDataLabel=this.renderer.label(a,0,0,null,null,null,null,null,"no-data").attr(b.attr).css(b.style).add(),this.noDataLabel.align(h(this.noDataLabel.getBBox(),b.position),!1,"plotBox")};d.hideNoData=function(){if(this.noDataLabel)this.noDataLabel=this.noDataLabel.destroy()};d.hasData=function(){for(var a=this.series,b=a.length;b--;)if(a[b].hasData()&&!a[b].options.isInternal)return!0; 12 | return!1};d.callbacks.push(function(a){c.addEvent(a,"load",e);c.addEvent(a,"redraw",e)})})(Highcharts); -------------------------------------------------------------------------------- /graphresourcestartup.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | require('../../config.php'); 18 | require_once('lib.php'); 19 | $course = required_param('id', PARAM_INT); 20 | global $DB; 21 | /* Access control */ 22 | require_login($course); 23 | $context = context_course::instance($course); 24 | require_capability('block/analytics_graphs:viewpages', $context); 25 | require_capability('block/analytics_graphs:viewcontentaccesses', $context); 26 | $courseparams = get_course($course); 27 | $startdate = date("Y-m-d", $courseparams->startdate); 28 | 29 | /* Initializing and filling array with available modules, to display only modules that are 30 | available on the server on the course */ 31 | $availablemodules = array(); 32 | foreach (block_analytics_graphs_get_course_used_modules($course) as $result) { 33 | array_push($availablemodules, $result->name); 34 | } 35 | 36 | ?> 37 | 38 | 48 | 49 | 55 | 56 | 57 |
    60 | "; 62 | 63 | echo "

    " . get_string('access_graph', 'block_analytics_graphs') . "

    "; 64 | echo "

    " . get_string('select_items_to_display', 'block_analytics_graphs') . ":

    "; 65 | ?> 66 |
    67 |
    68 | " . get_string('activities', 'block_analytics_graphs') . ":"; 71 | foreach ($availablemodules as $modulename) { 72 | $module = "mod_$modulename"; 73 | $typename = "typename_$modulename"; 74 | echo block_analytics_graphs_generate_graph_startup_module_entry($OUTPUT->pix_icon("icon", $module, 75 | $module, array( 76 | 'width' => 24, 77 | 'height' => 24, 78 | 'title' => '' 79 | )), "mod" . $num, $modulename, get_string('pluginname', $module)); 80 | $num++; 81 | } 82 | 83 | echo ""; 84 | 85 | echo "

    " . get_string('options', 'block_analytics_graphs') . ":

    "; 86 | 87 | echo get_string('startfrom', 'block_analytics_graphs') . ":
    "; 89 | 90 | echo "" . get_string('displayhidden', 'block_analytics_graphs'); 91 | ?> 92 |
    93 | "; 96 | echo ""; 98 | echo ""; 99 | ?> 100 | 101 |
    102 | 103 | -------------------------------------------------------------------------------- /groupjavascript.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | defined('MOODLE_INTERNAL') || die(); 18 | ?> 19 | 20 | 21 | 22 | 23 | <?php echo get_string('submissions', 'block_analytics_graphs'); ?> 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 159 | 160 | 161 | 0) { ?> 162 |
    163 | 173 |
    174 | 177 |
    178 | 330 | 331 | 332 | -------------------------------------------------------------------------------- /highslide/graphics/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/close.png -------------------------------------------------------------------------------- /highslide/graphics/closeX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/closeX.png -------------------------------------------------------------------------------- /highslide/graphics/controlbar-black-border.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/controlbar-black-border.gif -------------------------------------------------------------------------------- /highslide/graphics/controlbar-text-buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/controlbar-text-buttons.png -------------------------------------------------------------------------------- /highslide/graphics/controlbar-white-small.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/controlbar-white-small.gif -------------------------------------------------------------------------------- /highslide/graphics/controlbar-white.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/controlbar-white.gif -------------------------------------------------------------------------------- /highslide/graphics/controlbar2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/controlbar2.gif -------------------------------------------------------------------------------- /highslide/graphics/controlbar3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/controlbar3.gif -------------------------------------------------------------------------------- /highslide/graphics/controlbar4-hover.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/controlbar4-hover.gif -------------------------------------------------------------------------------- /highslide/graphics/controlbar4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/controlbar4.gif -------------------------------------------------------------------------------- /highslide/graphics/fullexpand.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/fullexpand.gif -------------------------------------------------------------------------------- /highslide/graphics/geckodimmer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/geckodimmer.png -------------------------------------------------------------------------------- /highslide/graphics/icon.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/icon.gif -------------------------------------------------------------------------------- /highslide/graphics/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/loader.gif -------------------------------------------------------------------------------- /highslide/graphics/loader.white.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/loader.white.gif -------------------------------------------------------------------------------- /highslide/graphics/outlines/Outlines.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/outlines/Outlines.psd -------------------------------------------------------------------------------- /highslide/graphics/outlines/beveled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/outlines/beveled.png -------------------------------------------------------------------------------- /highslide/graphics/outlines/drop-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/outlines/drop-shadow.png -------------------------------------------------------------------------------- /highslide/graphics/outlines/glossy-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/outlines/glossy-dark.png -------------------------------------------------------------------------------- /highslide/graphics/outlines/outer-glow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/outlines/outer-glow.png -------------------------------------------------------------------------------- /highslide/graphics/outlines/rounded-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/outlines/rounded-black.png -------------------------------------------------------------------------------- /highslide/graphics/outlines/rounded-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/outlines/rounded-white.png -------------------------------------------------------------------------------- /highslide/graphics/resize.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/resize.gif -------------------------------------------------------------------------------- /highslide/graphics/scrollarrows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/scrollarrows.png -------------------------------------------------------------------------------- /highslide/graphics/zoomin.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/zoomin.cur -------------------------------------------------------------------------------- /highslide/graphics/zoomout.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/highslide/graphics/zoomout.cur -------------------------------------------------------------------------------- /highslide/highslide-ie6.css: -------------------------------------------------------------------------------- 1 | .closebutton { 2 | /* NOTE! This URL is relative to the HTML page, not the CSS */ 3 | filter:progid:DXImageTransform.Microsoft.AlphaImageLoader( 4 | src='../highslide/graphics/close.png', sizingMethod='scale'); 5 | 6 | background: none; 7 | cursor: hand; 8 | } 9 | 10 | /* Viewport fixed hack */ 11 | .highslide-viewport { 12 | position: absolute; 13 | left: expression( ( ( ignoreMe1 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); 14 | top: expression( ( ignoreMe2 = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) + 'px' ); 15 | width: expression( ( ( ignoreMe3 = document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) ) + 'px' ); 16 | height: expression( ( ( ignoreMe4 = document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) ) + 'px' ); 17 | } 18 | 19 | /* Thumbstrip PNG fix */ 20 | .highslide-scroll-down, .highslide-scroll-up { 21 | position: relative; 22 | overflow: hidden; 23 | } 24 | .highslide-scroll-down div, .highslide-scroll-up div { 25 | /* NOTE! This URL is relative to the HTML page, not the CSS */ 26 | filter:progid:DXImageTransform.Microsoft.AlphaImageLoader( 27 | src='../highslide/graphics/scrollarrows.png', sizingMethod='scale'); 28 | background: none !important; 29 | position: absolute; 30 | cursor: hand; 31 | width: 75px; 32 | height: 75px !important; 33 | } 34 | .highslide-thumbstrip-horizontal .highslide-scroll-down div { 35 | left: -50px; 36 | top: -15px; 37 | } 38 | .highslide-thumbstrip-horizontal .highslide-scroll-up div { 39 | top: -15px; 40 | } 41 | .highslide-thumbstrip-vertical .highslide-scroll-down div { 42 | top: -50px; 43 | } 44 | 45 | /* Thumbstrip marker arrow trasparent background fix */ 46 | .highslide-thumbstrip .highslide-marker { 47 | border-color: white; /* match the background */ 48 | } 49 | .dark .highslide-thumbstrip-horizontal .highslide-marker { 50 | border-color: #111; 51 | } 52 | .highslide-viewport .highslide-marker { 53 | border-color: #333; 54 | } 55 | .highslide-thumbstrip { 56 | float: left; 57 | } 58 | 59 | /* Positioning fixes for the control bar */ 60 | .text-controls .highslide-controls { 61 | width: 480px; 62 | } 63 | .text-controls a span { 64 | width: 4em; 65 | } 66 | .text-controls .highslide-full-expand a span { 67 | width: 0; 68 | } 69 | .text-controls .highslide-close a span { 70 | width: 0; 71 | } 72 | 73 | /* Special */ 74 | .in-page .highslide-thumbstrip-horizontal .highslide-marker { 75 | border-bottom: gray; 76 | } 77 | -------------------------------------------------------------------------------- /hotpot.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | require('../../config.php'); 18 | require('graph_submission.php'); 19 | require('javascriptfunctions.php'); 20 | require_once('lib.php'); 21 | 22 | $course = required_param('id', PARAM_INT); 23 | 24 | /* Access control */ 25 | require_login($course); 26 | $context = context_course::instance($course); 27 | require_capability('block/analytics_graphs:viewpages', $context); 28 | 29 | $title = get_string('submissions_hotpot', 'block_analytics_graphs'); 30 | $submissionsgraph = new graph_submission($course, $title); 31 | 32 | 33 | $students = block_analytics_graphs_get_students($COURSE); 34 | $numberofstudents = count($students); 35 | if ($numberofstudents == 0) { 36 | echo(get_string('no_students', 'block_analytics_graphs')); 37 | exit; 38 | } 39 | $result = block_analytics_graphs_get_hotpot_submission($course, $students); 40 | $numberoftasks = count($result); 41 | if ($numberoftasks == 0) { 42 | echo(get_string('no_graph', 'block_analytics_graphs')); 43 | exit; 44 | } 45 | $submissionsgraphoptions = $submissionsgraph->create_graph($result, $students); 46 | 47 | /* Discover groups/groupings and members */ 48 | $groupmembers = block_analytics_graphs_get_course_group_members($COURSE); 49 | $groupingmembers = block_analytics_graphs_get_course_grouping_members($COURSE); 50 | $groupmembers = array_merge($groupmembers, $groupingmembers); 51 | $numberoftasks = count($result); 52 | if ($numberoftasks == 0) { 53 | error(get_string('no_graph', 'block_analytics_graphs')); 54 | } 55 | $groupmembersjson = json_encode($groupmembers); 56 | 57 | $studentsjson = json_encode($students); 58 | $resultjson = json_encode($result); 59 | $statisticsjson = $submissionsgraph->get_statistics(); 60 | 61 | $codename = "hotpot.php"; 62 | require('groupjavascript.php'); 63 | -------------------------------------------------------------------------------- /images/exclamation_sign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/images/exclamation_sign.png -------------------------------------------------------------------------------- /images/warning-attention-road-sign-exclamation-mark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marceloschmitt/moodle-block_analytics_graphs/ab538cf7689cbd24252264a65754d465a9824bd7/images/warning-attention-road-sign-exclamation-mark.png -------------------------------------------------------------------------------- /javascriptfunctions.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | defined('MOODLE_INTERNAL') || die(); 18 | ?> 19 | 20 | -------------------------------------------------------------------------------- /lang/en/block_analytics_graphs.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | 18 | 19 | $string['analytics_graphs:addinstance'] = 'Add a new AG block'; 20 | $string['analytics_graphs:bemonitored'] = 'User is monitored in the course'; 21 | $string['analytics_graphs:myaddinstance'] = 'Add a new AG block to the My Moodle page'; 22 | $string['analytics_graphs:viewassignmentsubmissions'] = 'View assignment submissions report'; 23 | $string['analytics_graphs:viewcontentaccesses'] = 'View content accesses report'; 24 | $string['analytics_graphs:viewgradeschart'] = 'View grades chart report'; 25 | $string['analytics_graphs:viewhitsdistribution'] = 'View hits distribution report'; 26 | $string['analytics_graphs:viewnumberofactivestudents'] = 'View number of active students report'; 27 | $string['analytics_graphs:viewpages'] = 'View graphs'; 28 | $string['analytics_graphs:viewquizsubmissions'] = 'View quiz submissions report'; 29 | $string['pluginname'] = 'Analytics Graphs'; 30 | $string['analytics_graphs'] = 'Analytics Graphs'; 31 | 32 | $string['no_types_requested'] = 'No modules selected to base graph on.'; 33 | 34 | $string['access_graph'] = 'Access Graph'; 35 | $string['select_items_to_display'] = 'Select items to display in graph'; 36 | 37 | $string['btn_deselect_all'] = 'Deselect All'; 38 | $string['btn_select_all'] = 'Select All'; 39 | $string['btn_submit'] = 'Build Graph'; 40 | 41 | $string['lbl_ccteachers'] = 'Send copies to other teachers in this course'; 42 | 43 | $string['typename_activequiz'] = 'Active Quiz'; 44 | $string['typename_assign'] = 'Assignment'; 45 | $string['typename_attendance'] = 'Attendance Register'; 46 | $string['typename_bigbluebuttonbn'] = 'BigBlueButtonBN'; 47 | $string['typename_booking'] = 'Booking'; 48 | $string['typename_certificate'] = 'Certificate'; 49 | $string['typename_chat'] = 'Chat'; 50 | $string['typename_checklist'] = 'Checklist'; 51 | $string['typename_choice'] = 'Choice'; 52 | $string['typename_icontent'] = 'Content Pages'; 53 | $string['typename_customcert'] = 'Custom certificate'; 54 | $string['typename_data'] = 'Database'; 55 | $string['typename_dataform'] = 'Dataform'; 56 | $string['typename_lti'] = 'External Tool'; 57 | $string['typename_feedback'] = 'Feedback'; 58 | $string['typename_forum'] = 'Forum'; 59 | $string['typename_game'] = 'Game'; 60 | $string['typename_glossary'] = 'Glossary'; 61 | $string['typename_choicegroup'] = 'Group Choice'; 62 | $string['typename_groupselect'] = 'Group Self-Selection'; 63 | $string['typename_hotpot'] = 'HotPot'; 64 | $string['typename_turnitintooltwo'] = 'Turnitin Assignment'; 65 | $string['typename_hvp'] = 'Interactive Content'; 66 | $string['typename_lesson'] = 'Lesson'; 67 | $string['typename_openmeetings'] = 'OpenMeetings'; 68 | $string['typename_questionnaire'] = 'Questionnaire'; 69 | $string['typename_quiz'] = 'Quiz'; 70 | $string['typename_quizgame'] = 'Quizventure'; 71 | $string['typename_scheduler'] = 'Scheduler'; 72 | $string['typename_scorm'] = 'SCORM Package'; 73 | $string['typename_subcourse'] = 'Subcourse'; 74 | $string['typename_survey'] = 'Survey'; 75 | $string['typename_vpl'] = 'Virtual programming lab'; 76 | $string['typename_wiki'] = 'Wiki'; 77 | $string['typename_workshop'] = 'Workshop'; 78 | $string['typename_book'] = 'Book'; 79 | $string['typename_resource'] = 'File'; 80 | $string['typename_folder'] = 'Folder'; 81 | $string['typename_imscp'] = 'IMS Content Package'; 82 | $string['typename_label'] = 'Label'; 83 | $string['typename_lightboxgallery'] = 'Lightbox Gallery'; 84 | $string['typename_page'] = 'Page'; 85 | $string['typename_poster'] = 'Poster'; 86 | $string['typename_recordingsbn'] = 'RecordingsBN'; 87 | $string['typename_url'] = 'URL'; 88 | 89 | $string['access'] = 'Access'; 90 | $string['access_to_contents'] = 'Content accesses'; 91 | $string['all_groups'] = 'Show all groups'; 92 | $string['begin_date'] = 'Begin date'; 93 | $string['contents'] = 'Contents'; 94 | $string['course'] = 'Course'; 95 | $string['date_sent'] = "Date sent"; 96 | $string['days_by_week'] = 'Number of days by week with access'; 97 | $string['days_with_access'] = 'Days with access'; 98 | $string['event_view_graph'] = 'LA - View graph'; 99 | $string['event_send_email'] = 'LA - Send email'; 100 | $string['graphs'] = 'Graphs'; 101 | $string['grades_chart'] = 'Grades chart'; 102 | $string['grades_distribution'] = "Assessment distribution"; 103 | $string['grades_mail_dialog_title'] = "Students with grades smaller than or equal to"; 104 | $string['hits'] = 'Course hits'; 105 | $string['hits_distribution'] = 'Hits distribution'; 106 | $string['in_time_ratio'] = 'On time ratio'; 107 | $string['in_time_submission'] = 'In time submission'; 108 | $string['late_submission'] = 'Late submission'; 109 | $string['legacy'] = 'Legacy (prior to 2.7)'; 110 | $string['mailcopyalert'] = 'Copy of Analytics Graphs message! ---- '; 111 | $string['message_text'] = "Message Text"; 112 | $string['new_message'] = 'New message'; 113 | $string['no_access'] = 'No access'; 114 | $string['no_graph'] = 'No data to generate graph'; 115 | $string['no_deadline'] = 'No deadline'; 116 | $string['no_messages'] = "This student has no messages"; 117 | $string['no_students'] = 'There are no students in the course'; 118 | $string['no_submission'] = 'No submission'; 119 | $string['not_sent_message'] = 'Message sending error!'; 120 | $string['number_of_students'] = 'Number of students'; 121 | $string['number_of_weeks'] = 'Number of weeks'; 122 | $string['old_log'] = 'old logs'; 123 | $string['old_messages'] = 'Messages sent'; 124 | $string['ratio'] = 'Ratio'; 125 | $string['red_tooltip'] = 'No module was accessed in the last week'; 126 | $string['resources_by_week'] = 'Number of resources accessed by week'; 127 | $string['resources_with_access'] = 'Resources with access'; 128 | $string['send_email'] = 'Send email'; 129 | $string['sender'] = "Sender"; 130 | $string['sent_message'] = 'Message sent to Moodle queue.'; 131 | $string['student_information'] = 'Information'; 132 | $string['students'] = 'Students'; 133 | $string['subject'] = 'Subject'; 134 | $string['submissions'] = 'Submissions'; 135 | $string['submissions_assign'] = 'Assignment submissions'; 136 | $string['submissions_hotpot'] = 'Hotpot submissions'; 137 | $string['submissions_turnitin'] = 'Turnitin submissions'; 138 | $string['submissions_forumchart'] = 'Forum accesses'; 139 | $string['submissions_forumchart_reads'] = 'Forum Discussion Reads'; 140 | $string['submissions_forumchart_posts'] = 'Forum Discussion Posts'; 141 | $string['forumchart_read'] = 'Forum discussions read'; 142 | $string['forumchart_notread'] = 'Forum discussions not read'; 143 | $string['forumchart_posted'] = 'Forum discussions participated'; 144 | $string['forumchart_notposted'] = 'Forum discussions not participated'; 145 | $string['submissions_quizchart'] = 'Quiz submissions'; 146 | $string['submissions_quiz'] = 'Quiz submissions'; 147 | $string['submission_ratio'] = 'Submission ratio'; 148 | $string['hitschart_totalresourcechart'] = 'Total resource access chart'; 149 | $string['hitschart_totalweekaccesseschart'] = 'Total week accesses chart'; 150 | $string['title_access'] = 'Distribution of access to contents (resources, urls and pages)'; 151 | $string['title_students'] = 'Students'; 152 | $string['topic'] = 'Topic'; 153 | $string['under_development'] = "Wait for next release!"; 154 | $string['week_number'] = 'Week number'; 155 | $string['yellow_tooltip'] = 'No module was accessed until now'; 156 | $string['total_accessed_resources'] = 'Total accessed resources'; 157 | $string['total_not_accessed_resources'] = 'Total not accessed resources'; 158 | $string['on_time'] = 'On time'; 159 | $string['late'] = 'Late'; 160 | $string['no_submission'] = 'No submission'; 161 | $string['subfailed'] = 'Failed submission'; 162 | $string['subpassed'] = 'Passed submission'; 163 | $string['no_submission_on_time'] = 'May submit'; 164 | $string['resources'] = 'Resources'; 165 | $string['task_list'] = "Assessment list"; 166 | 167 | $string['info_coursetype'] = "Course"; 168 | 169 | $string['timeaccesschart_title'] = "Number of active students"; 170 | $string['timeaccesschart_activities_title'] = "Number of student activities"; 171 | $string['timeaccesschart_tip'] = "Active students"; 172 | $string['timeaccesschart_daysforstatistics'] = "Days to base charts on: "; 173 | $string['timeaccesschart_maxdays'] = "Maximum days available for statistics: "; 174 | $string['timeaccesschart_button_apply'] = "Apply"; 175 | 176 | $string['grades_chart_no_data'] = "Use the buttons below to toggle the tasks displayed on the chart"; 177 | $string['task_name'] = "Assessments"; 178 | $string['grades'] = "Grades"; 179 | $string['total_grades'] = "Number of grades"; 180 | $string['lowest_grade'] = "Lowest grade"; 181 | $string['largest_grade'] = "Highest grade"; 182 | $string['tooltip_grade_achievement'] = "with grades inferior or equal to"; 183 | $string['add_task'] = "Add assessment to chart"; 184 | $string['remove_task'] = "Remove assessment from chart"; 185 | $string['no_student_task'] = "This assessment does not have students in the selected group"; 186 | $string['add_all'] = "Add all"; 187 | $string['remove_all'] = "Remove all"; 188 | 189 | // Graphresourcestartup. 190 | $string['activities'] = "Activities"; 191 | $string['displayhidden'] = "Display hidden items"; 192 | $string['options'] = "Options"; 193 | $string['startfrom'] = "Start from"; 194 | 195 | // Privacy. 196 | $string['privacy:metadata:block_analytics_graphs_msg'] = 'Information about the messages sent to students.'; 197 | $string['privacy:metadata:block_analytics_graphs_msg:fromid'] = 'The ID of the user the message was sent from.'; 198 | $string['privacy:metadata:block_analytics_graphs_msg:subject'] = 'Subject of the message.'; 199 | $string['privacy:metadata:block_analytics_graphs_dest'] = 'Information about students that got messages.'; 200 | $string['privacy:metadata:block_analytics_graphs_dest:toid'] = 'The ID of the user the message was sent to.'; 201 | $string['privacy:metadata:block_analytics_graphs_dest:messageid'] = 'The ID of the message.'; 202 | 203 | // Settings. 204 | $string['settings:onlyactive'] = 'Only active enrolments'; 205 | $string['settings:onlyactive_help'] = 'Consider only active enrolments for the reports'; 206 | $string['settings:overrideonlyactive'] = 'Allow \'Only active enrolments\' per block instance'; 207 | $string['settings:overrideonlyactive_help'] = 'If enabled, then \'Only active enrolments\' can be set per block instance. Otherwise, global setting will be used for all blocks.'; 208 | -------------------------------------------------------------------------------- /lang/pt_br/block_analytics_graphs.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | 18 | 19 | 20 | $string['analytics_graphs:addinstance'] = 'Add a new AG block'; 21 | $string['nalytics_graphs:bemonitored'] = 'Usuário é monitorado na disciplina'; 22 | $string['analytics_graphs:myaddinstance'] = 'Add a new AG block to the My Moodle page'; 23 | $string['analytics_graphs:viewpages'] = 'Visualiza gráficos'; 24 | 25 | $string['pluginname'] = 'Analytics Graphs'; 26 | $string['analytics_graphs'] = 'Analytics Graphs'; 27 | 28 | $string['access'] = 'Acessaram'; 29 | $string['access_to_contents'] = 'Materiais acessados'; 30 | $string['all_groups'] = 'Todos os grupos'; 31 | $string['begin_date'] = 'Data de início'; 32 | $string['contents'] = 'Material'; 33 | $string['course'] = 'Disciplina'; 34 | $string['date_sent'] = "Data de envio"; 35 | $string['days_by_week'] = 'Dias acessados na semana'; 36 | $string['days_with_access'] = 'Dias acessados'; 37 | $string['event_view_graph'] = 'LA - View graph'; 38 | $string['event_send_email'] = 'LA - Send email'; 39 | $string['grades'] = "Notas"; 40 | $string['grades_chart_no_data'] = "Use os botões abaixo para alternar quais tarefas são apresentadas no gráfico"; 41 | $string['grades_chart'] = 'Avaliações'; 42 | $string['grades_distribution'] = "Distribuição de avaliações"; 43 | $string['grades_mail_dialog_title'] = "Estudantes com notas menores ou iguais a"; 44 | $string['graphs'] = 'Gráficos'; 45 | $string['hits'] = 'Hits no curso'; 46 | $string['hits_distribution'] = 'Visualizacoes'; 47 | $string['in_time_ratio'] = 'Relação de pontualidade'; 48 | $string['in_time_submission'] = 'Envio no prazo'; 49 | $string['late_submission'] = 'Envio fora do prazo'; 50 | $string['legacy'] = 'Legacy (prior to 2.7)'; 51 | $string['mailcopyalert'] = 'Esta é uma cópia de uma mensagem enviada por um professor ou tutor pelo Analytics Graphs! ---- '; 52 | $string['message_text'] = "Texto da Mensagem"; 53 | $string['new_message'] = 'Nova mensagem'; 54 | $string['no_access'] = 'Não acessaram'; 55 | $string['no_graph'] = 'Não há dados para gerar os gráficos'; 56 | $string['no_deadline'] = 'Sem limite'; 57 | $string['no_messages'] = "Nenhuma mensagem para este aluno"; 58 | $string['no_students'] = 'Não há estudantes no curso'; 59 | $string['no_submission'] = 'Sem envio'; 60 | $string['not_sent_message'] = 'Erro no envio da mensagem!'; 61 | $string['number_of_students'] = 'Número de alunos'; 62 | $string['number_of_weeks'] = 'Número de semanas'; 63 | $string['old_log'] = 'old logs'; 64 | $string['old_messages'] = 'Mensagens enviadas'; 65 | $string['ratio'] = 'Ratio'; 66 | $string['red_tooltip'] = 'Nenhum material foi acessado na última semana'; 67 | $string['resources_by_week'] = 'Materiais acessados na semana'; 68 | $string['resources_with_access'] = 'Materiais acessados'; 69 | $string['send_email'] = 'Enviar mensagem'; 70 | $string['sender'] = "Remetente"; 71 | $string['sent_message'] = 'Mensagem colocada na fila do Moodle.'; 72 | $string['student_information'] = 'Informações'; 73 | $string['students'] = 'alunos'; 74 | $string['subject'] = 'Assunto'; 75 | $string['submissions'] = 'Submissões'; 76 | $string['submissions_assign'] = 'Submissões de tarefas'; 77 | $string['submissions_hotpot'] = 'Submissoes de Hot Potatoes'; 78 | $string['submissions_turnitin'] = 'Submissoes de Turnitin'; 79 | $string['submissions_quiz'] = 'Submissões de questionários'; 80 | $string['submission_ratio'] = 'Relação de envio'; 81 | $string['title_access'] = 'Distribuição de acesso aos materiais (recursos, links e páginas)'; 82 | $string['title_students'] = 'Estudantes'; 83 | $string['topic'] = 'Topico'; 84 | $string['under_development'] = 'Aguarde a próxima versão!'; 85 | $string['week_number'] = 'Numero da semana'; 86 | $string['yellow_tooltip'] = 'Nenhum material foi acessado até agora'; 87 | $string['total_accessed_resources'] = 'Total de materiais acessados'; 88 | $string['total_not_accessed_resources'] = 'Total de materiais não acessados'; 89 | $string['on_time'] = 'Em tempo'; 90 | $string['late'] = 'Atrasado'; 91 | $string['no_submission'] = 'Não enviou'; 92 | $string['no_submission_on_time'] = 'Aberto para envio'; 93 | $string['resources'] = 'Materiais'; 94 | 95 | $string['task_list'] = "Lista de avaliações"; 96 | $string['task_name'] = "Avaliações"; 97 | 98 | $string['total_grades'] = "Quantidade de notas"; 99 | $string['lowest_grade'] = "Nota mais baixa"; 100 | $string['largest_grade'] = "Nota mais alta"; 101 | $string['tooltip_grade_achievement'] = "obtiveram notas menores que ou iguais a"; 102 | $string['add_task'] = "Adicionar avaliação ao gráfico"; 103 | $string['remove_task'] = "Remover avaliação do gráfico"; 104 | $string['no_student_task'] = "Esta avaliação não possui estudantes no grupo selecionado"; 105 | $string['add_all'] = "Adicionar todas"; 106 | $string['remove_all'] = "Remover todas"; 107 | 108 | // Graphresourcestartup. 109 | $string['activities'] = "Atividades"; 110 | $string['displayhidden'] = "Mostrar itens escondidos"; 111 | $string['options'] = "Opções"; 112 | $string['startfrom'] = "Iniciar em"; 113 | 114 | // Privacy. 115 | $string['privacy:metadata'] = 'O bloco Analytics Graphs mostra apenas dados já existentes no moodle.'; 116 | 117 | -------------------------------------------------------------------------------- /lang/zh_cn/block_analytics_graphs.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | /** 18 | * 翻译:汤和果(hgtang93@163.com) 19 | * 插件名称:分析图 20 | * 插件类型:版块 21 | * @package block 22 | * @subpackage analytics_graphs 23 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 24 | */ 25 | 26 | $string['access'] = '已访问'; 27 | $string['access_graph'] = '访问情况统计'; 28 | $string['access_to_contents'] = '内容访问统计'; 29 | $string['add_all'] = '全部添加'; 30 | $string['add_task'] = '添加到图表'; 31 | $string['all_groups'] = 'All groups'; 32 | $string['analytics_graphs'] = '分析图'; 33 | $string['analytics_graphs:addinstance'] = '添加一个分析图版块'; 34 | $string['analytics_graphs:bemonitored'] = '记录课程中用户的行为'; 35 | $string['analytics_graphs:myaddinstance'] = '在个人主页添加一个分析图版块'; 36 | $string['analytics_graphs:viewpages'] = '查看图表'; 37 | $string['begin_date'] = '开始日期'; 38 | $string['btn_deselect_all'] = '取消全选'; 39 | $string['btn_select_all'] = '全选'; 40 | $string['btn_submit'] = '生成图表'; 41 | $string['contents'] = '内容'; 42 | $string['course'] = '课程'; 43 | $string['date_sent'] = '发送日期'; 44 | $string['days_by_week'] = '每周访问天数'; 45 | $string['days_with_access'] = '访问天数'; 46 | $string['event_send_email'] = '发送邮件'; 47 | $string['event_view_graph'] = '查看图表'; 48 | $string['forumchart_notposted'] = '未参与的讨论'; 49 | $string['forumchart_notread'] = '未读帖子'; 50 | $string['forumchart_posted'] = '已参与的讨论'; 51 | $string['forumchart_read'] = '已读帖子'; 52 | $string['grades'] = '成绩'; 53 | $string['grades_chart'] = '成绩评价表'; 54 | $string['grades_chart_no_data'] = '使用下方的按钮将评价项目添加到图表中'; 55 | $string['grades_distribution'] = '评价分布情况'; 56 | $string['grades_mail_dialog_title'] = '成绩小于或等于'; 57 | $string['graphs'] = '图表'; 58 | $string['hits'] = '访问次数'; 59 | $string['hits_distribution'] = '访问次数统计'; 60 | $string['hitschart_totalresourcechart'] = '每周资源访问情况统计'; 61 | $string['hitschart_totalweekaccesseschart'] = '每周访问天数统计'; 62 | $string['in_time_ratio'] = '准点率'; 63 | $string['in_time_submission'] = '及时提交'; 64 | $string['info_coursetype'] = "课程"; 65 | $string['largest_grade'] = '最高分'; 66 | $string['late'] = '迟交'; 67 | $string['late_submission'] = '逾期提交'; 68 | $string['lbl_ccteachers'] = '抄送给本课程其他教师'; 69 | $string['legacy'] = '传统模式 (2.7 版本以前)'; 70 | $string['lowest_grade'] = '最低分'; 71 | $string['mailcopyalert'] = '复制分析图数据! ----'; 72 | $string['message_text'] = '消息内容'; 73 | $string['new_message'] = '发送消息'; 74 | $string['no_access'] = '未访问'; 75 | $string['no_deadline'] = '无截止时间'; 76 | $string['no_graph'] = '无数据,无法生成图表'; 77 | $string['no_messages'] = '无消息'; 78 | $string['no_student_task'] = '选定分组中无学生参与此项目'; 79 | $string['no_students'] = '此课程中无学生'; 80 | $string['no_submission'] = '未提交'; 81 | $string['no_submission_on_time'] = '可以提交'; 82 | $string['no_types_requested'] = '未选中资源或活动,无法生成图表'; 83 | $string['not_sent_message'] = '消息发送失败!'; 84 | $string['number_of_students'] = '学生数'; 85 | $string['number_of_weeks'] = '周数'; 86 | $string['old_log'] = '消息日志'; 87 | $string['old_messages'] = '已发送消息'; 88 | $string['on_time'] = '准时'; 89 | $string['pluginname'] = '分析图'; 90 | $string['ratio'] = '比例'; 91 | $string['red_tooltip'] = '最近一周未访问过'; 92 | $string['remove_all'] = '全部移除'; 93 | $string['remove_task'] = '从图表移除'; 94 | $string['resources'] = '资源'; 95 | $string['resources_by_week'] = '每周资源访问情况'; 96 | $string['resources_with_access'] = '资源访问数'; 97 | $string['select_items_to_display'] = '选择要统计的项目'; 98 | $string['send_email'] = '发送邮件'; 99 | $string['sender'] = '发件人'; 100 | $string['sent_message'] = '消息已发送至 Moodle 队列'; 101 | $string['student_information'] = '详细信息'; 102 | $string['students'] = '学生'; 103 | $string['subfailed'] = '未通过'; 104 | $string['subject'] = '主题'; 105 | $string['submission_ratio'] = '提交率'; 106 | $string['submissions'] = '提交统计'; 107 | $string['submissions_assign'] = '作业提交统计'; 108 | $string['submissions_forumchart'] = '讨论区访问统计'; 109 | $string['submissions_forumchart_posts'] = '讨论区参与情况'; 110 | $string['submissions_forumchart_reads'] = '讨论区帖子阅读情况'; 111 | $string['submissions_hotpot'] = 'Hotpot 提交统计'; 112 | $string['submissions_quiz'] = '测验提交统计'; 113 | $string['submissions_quizchart'] = '测验提交统计'; 114 | $string['submissions_turnitin'] = 'Turnitin 提交统计'; 115 | $string['subpassed'] = '已通过'; 116 | $string['task_list'] = '项目列表'; 117 | $string['task_name'] = '评价项目'; 118 | $string['timeaccesschart_activities_title'] = "学生活动统计"; 119 | $string['timeaccesschart_button_apply'] = "应用"; 120 | $string['timeaccesschart_daysforstatistics'] = "图表中统计的日期数:"; 121 | $string['timeaccesschart_maxdays'] = "可用日期数最大值为:"; 122 | $string['timeaccesschart_tip'] = "活跃学生数"; 123 | $string['timeaccesschart_title'] = "活跃学生统计"; 124 | $string['title_access'] = '内容访问分布情况(资源、链接与网页)'; 125 | $string['title_students'] = '学生'; 126 | $string['tooltip_grade_achievement'] = '成绩小于或等于'; 127 | $string['topic'] = '主题'; 128 | $string['total_accessed_resources'] = '被完全访问的资源'; 129 | $string['total_grades'] = '有成绩的个数'; 130 | $string['total_not_accessed_resources'] = '未被完全访问的资源'; 131 | $string['typename_activequiz'] = '在线测验'; 132 | $string['typename_assign'] = '作业'; 133 | $string['typename_attendance'] = 'Attendance Register'; 134 | $string['typename_bigbluebuttonbn'] = 'BigBlueButtonBN'; 135 | $string['typename_book'] = '图书'; 136 | $string['typename_booking'] = 'Booking'; 137 | $string['typename_certificate'] = '证书'; 138 | $string['typename_chat'] = '聊天室'; 139 | $string['typename_checklist'] = '待办列表'; 140 | $string['typename_choice'] = '投票'; 141 | $string['typename_choicegroup'] = '群组投票'; 142 | $string['typename_customcert'] = '自定义证书'; 143 | $string['typename_data'] = '数据库'; 144 | $string['typename_dataform'] = '数据表单'; 145 | $string['typename_feedback'] = '反馈'; 146 | $string['typename_folder'] = '文件夹'; 147 | $string['typename_forum'] = '讨论区'; 148 | $string['typename_game'] = '游戏'; 149 | $string['typename_glossary'] = '词汇表'; 150 | $string['typename_groupselect'] = 'Group Self-Selection'; 151 | $string['typename_hotpot'] = 'HotPot'; 152 | $string['typename_hvp'] = '交互式内容'; 153 | $string['typename_icontent'] = '内容页面'; 154 | $string['typename_imscp'] = 'IMS 内容包'; 155 | $string['typename_label'] = '标签'; 156 | $string['typename_lesson'] = '程序教学'; 157 | $string['typename_lightboxgallery'] = 'Lightbox Gallery'; 158 | $string['typename_lti'] = '外部工具'; 159 | $string['typename_openmeetings'] = 'OpenMeetings'; 160 | $string['typename_page'] = '网页'; 161 | $string['typename_poster'] = 'Poster'; 162 | $string['typename_questionnaire'] = '问卷'; 163 | $string['typename_quiz'] = '测验'; 164 | $string['typename_quizgame'] = 'Quizventure'; 165 | $string['typename_recordingsbn'] = 'RecordingsBN'; 166 | $string['typename_resource'] = '文件'; 167 | $string['typename_scheduler'] = 'Scheduler'; 168 | $string['typename_scorm'] = 'SCORM 课件'; 169 | $string['typename_subcourse'] = '子课程'; 170 | $string['typename_survey'] = '问卷调查'; 171 | $string['typename_turnitintooltwo'] = 'Turnitin 作业'; 172 | $string['typename_url'] = '网页地址'; 173 | $string['typename_vpl'] = '虚拟编程实验室'; 174 | $string['typename_wiki'] = 'Wiki'; 175 | $string['typename_workshop'] = '互动评价'; 176 | $string['under_development'] = '开发中……敬请期待下个版本!'; 177 | $string['week_number'] = '周次'; 178 | $string['yellow_tooltip'] = '至今为止未访问过'; 179 | -------------------------------------------------------------------------------- /query_grades.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | 18 | 19 | require_once("../../config.php"); 20 | global $DB; 21 | require_once($CFG->dirroot.'/lib/moodlelib.php'); 22 | require_once('lib.php'); 23 | 24 | $courseid = required_param('course_id', PARAM_INT); 25 | $formdata = required_param_array('form_data', PARAM_INT); 26 | require_login($courseid); 27 | $context = context_course::instance($courseid); 28 | require_capability('block/analytics_graphs:viewpages', $context); 29 | 30 | list($insql, $inparams) = $DB->get_in_or_equal($formdata); 31 | 32 | $sql = "SELECT itemid + (userid*1000000) AS id, itemid, userid, usr.firstname, 33 | usr.lastname, usr.email, rawgrade/(rawgrademax-rawgrademin) AS grade 34 | FROM {grade_grades} 35 | LEFT JOIN {user} usr ON usr.id = userid 36 | WHERE itemid $insql AND rawgrade IS NOT NULL 37 | ORDER BY id"; 38 | 39 | $result = $DB->get_records_sql($sql, $inparams); 40 | $students = array_column(block_analytics_graphs_get_students($COURSE), 'id'); 41 | $taskgrades = new stdClass(); 42 | foreach ($result as $id => $taskattrs) { 43 | if (in_array($taskattrs->userid, $students) && groups_user_groups_visible($COURSE, $taskattrs->userid)) { 44 | $itemid = $taskattrs->itemid; 45 | $record = new stdClass(); 46 | $record->userid = $taskattrs->userid; 47 | $record->grade = floatval($taskattrs->grade); 48 | $record->email = $taskattrs->email; 49 | $record->name = $taskattrs->firstname . " " . $taskattrs->lastname; 50 | if (!property_exists($taskgrades, $itemid)) { 51 | $taskgrades->{$itemid} = array(); 52 | } 53 | $taskgrades->{$itemid}[] = $record; 54 | } 55 | } 56 | 57 | echo json_encode($taskgrades); 58 | -------------------------------------------------------------------------------- /query_messages.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | 18 | 19 | require_once("../../config.php"); 20 | global $DB; 21 | require_once($CFG->dirroot.'/lib/moodlelib.php'); 22 | $studentids = required_param('student_ids', PARAM_INT); 23 | $courseid = required_param('course_id', PARAM_INT); 24 | 25 | /* Access control */ 26 | require_login($courseid); 27 | $context = context_course::instance($courseid); 28 | require_capability('block/analytics_graphs:viewpages', $context); 29 | 30 | $inclause[] = $studentids; 31 | list($insql, $inparams) = $DB->get_in_or_equal($inclause); 32 | $params = array_merge(array($courseid), $inparams); 33 | 34 | $sql = "SELECT msg.id, CONCAT(firstname, ' ', lastname) fromid, subject, message, msg.timecreated 35 | FROM {block_analytics_graphs_msg} AS msg 36 | LEFT JOIN {block_analytics_graphs_dest} AS dest ON dest.messageid = msg.id 37 | LEFT JOIN {user} AS usr ON usr.id = fromid 38 | WHERE courseid = ? AND toid $insql 39 | ORDER BY timecreated"; 40 | 41 | $result = $DB->get_records_sql($sql, $params); 42 | 43 | if (count($result) > 0) { 44 | $keys = array_keys($result); 45 | for ($x = 0; $x < count($keys); $x++) { 46 | $result[$keys[$x]]->timecreated = userdate($result[$keys[$x]]->timecreated, get_string('strftimerecentfull')); 47 | } 48 | echo json_encode($result); 49 | } else { 50 | echo json_encode(array()); 51 | } 52 | -------------------------------------------------------------------------------- /query_resources_access.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | 18 | require_once('../../config.php'); 19 | require_once("lib.php"); 20 | require_once($CFG->dirroot.'/lib/moodlelib.php'); 21 | 22 | $studentid = required_param('student_id', PARAM_INT); 23 | $courseid = required_param('course_id', PARAM_INT); 24 | 25 | /* Access control */ 26 | require_login($courseid); 27 | $context = context_course::instance($courseid); 28 | require_capability('block/analytics_graphs:viewpages', $context); 29 | 30 | $resourceaccess = block_analytics_graphs_get_user_resource_url_page_access($courseid, $studentid); 31 | $assigninfo = block_analytics_graphs_get_user_assign_submission($courseid, $studentid); 32 | $quizinfo = block_analytics_graphs_get_user_quiz_state($courseid, $studentid); 33 | $foruminfo = block_analytics_graphs_get_user_forum_state($courseid, $studentid); 34 | 35 | echo json_encode(array("resources" => $resourceaccess, "assign" => $assigninfo, "quiz" => $quizinfo, 36 | "forum" => $foruminfo)); 37 | -------------------------------------------------------------------------------- /quiz.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | require('../../config.php'); 18 | require('graph_submission.php'); 19 | require('javascriptfunctions.php'); 20 | require_once('lib.php'); 21 | 22 | $course = required_param('id', PARAM_INT); 23 | 24 | /* Access control */ 25 | require_login($course); 26 | $context = context_course::instance($course); 27 | require_capability('block/analytics_graphs:viewpages', $context); 28 | require_capability('block/analytics_graphs:viewquizsubmissions', $context); 29 | 30 | $title = get_string('submissions_quiz', 'block_analytics_graphs'); 31 | $submissionsgraph = new graph_submission($course, $title); 32 | 33 | 34 | $students = block_analytics_graphs_get_students($COURSE); 35 | $numberofstudents = count($students); 36 | if ($numberofstudents == 0) { 37 | echo(get_string('no_students', 'block_analytics_graphs')); 38 | exit; 39 | } 40 | $result = block_analytics_graphs_get_quiz_submission($course, $students); 41 | $numberoftasks = count($result); 42 | if ($numberoftasks == 0) { 43 | echo(get_string('no_graph', 'block_analytics_graphs')); 44 | exit; 45 | } 46 | 47 | $submissionsgraphoptions = $submissionsgraph->create_graph($result, $students); 48 | 49 | /* Discover groups/groupings and members */ 50 | $groupmembers = block_analytics_graphs_get_course_group_members($COURSE); 51 | $groupingmembers = block_analytics_graphs_get_course_grouping_members($COURSE); 52 | $groupmembers = array_merge($groupmembers, $groupingmembers); 53 | $groupmembersjson = json_encode($groupmembers); 54 | 55 | $studentsjson = json_encode($students); 56 | $resultjson = json_encode($result); 57 | $statisticsjson = $submissionsgraph->get_statistics(); 58 | 59 | $codename = "quiz.php"; 60 | require('groupjavascript.php'); 61 | -------------------------------------------------------------------------------- /settings.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | /** 18 | * Settings for the HTML block 19 | * 20 | * @package block_analytics_graphs 21 | * @copyright 2023 Catalyst IT 22 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 | */ 24 | 25 | defined('MOODLE_INTERNAL') || die; 26 | 27 | if ($ADMIN->fulltree) { 28 | $settings->add(new admin_setting_configcheckbox( 29 | 'block_analytics_graphs/onlyactive', 30 | get_string('settings:onlyactive', 'block_analytics_graphs'), 31 | get_string('settings:onlyactive_help', 'block_analytics_graphs'), 32 | 0) 33 | ); 34 | 35 | $settings->add(new admin_setting_configcheckbox( 36 | 'block_analytics_graphs/overrideonlyactive', 37 | get_string('settings:overrideonlyactive', 'block_analytics_graphs'), 38 | get_string('settings:overrideonlyactive_help', 'block_analytics_graphs'), 39 | 0) 40 | ); 41 | } 42 | -------------------------------------------------------------------------------- /thirdpartylibs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | highslide 5 | Highslide JS 6 | 5.0.0 7 | MIT 8 | 9 | 10 | 11 | externalref 12 | Highcharts JS 13 | 5.0.2 14 | MIT 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /timeaccesseschart.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | require('../../config.php'); 18 | require_once('lib.php'); 19 | require('javascriptfunctions.php'); 20 | $course = required_param('id', PARAM_INT); 21 | $days = required_param('days', PARAM_INT); 22 | global $DB; 23 | global $CFG; 24 | 25 | /* Access control */ 26 | require_login($course); 27 | $context = context_course::instance($course); 28 | require_capability('block/analytics_graphs:viewpages', $context); 29 | require_capability('block/analytics_graphs:viewnumberofactivestudents', $context); 30 | 31 | $students = block_analytics_graphs_get_students($COURSE); 32 | $numberofstudents = count($students); 33 | if ($numberofstudents == 0) { 34 | echo(get_string('no_students', 'block_analytics_graphs')); 35 | exit; 36 | } 37 | 38 | $logstorelife = block_analytics_graphs_get_logstore_loglife(); 39 | $coursedayssincestart = block_analytics_graphs_get_course_days_since_startdate($course); 40 | if ($logstorelife === null || $logstorelife == 0) { 41 | // 0, false and NULL are threated as null in case logstore setting not found and 0 is "no removal" logs. 42 | $maximumdays = $coursedayssincestart; // The chart should not break with value more than available. 43 | } else if ($logstorelife >= $coursedayssincestart) { 44 | $maximumdays = $coursedayssincestart; 45 | } else { 46 | $maximumdays = $logstorelife; 47 | } 48 | 49 | if ($days > $maximumdays) { // Sanitycheck. 50 | $days = $maximumdays; 51 | } else if ($days < 1) { 52 | $days = 1; 53 | } 54 | 55 | $daysaccess = block_analytics_graphs_get_accesses_last_days($course, $students, $days); 56 | $daysaccess = json_encode($daysaccess); 57 | 58 | 59 | ?> 60 | 61 | 62 | 63 | 64 | 65 | <?php echo get_string('timeaccesschart_title', 'block_analytics_graphs'); ?> 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 178 | 179 | 180 | 181 |
    183 | 184 | 186 |
    187 | 189 |
    190 | " . $maximumdays . ""; ?> 191 |
    192 | 193 |
    194 |
    195 |
    196 |
    197 |
    198 | 199 | 488 | 489 | 490 | 491 | 492 | 493 | -------------------------------------------------------------------------------- /turnitin.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | require('../../config.php'); 18 | require('graph_submission.php'); 19 | require('javascriptfunctions.php'); 20 | require_once('lib.php'); 21 | 22 | $course = required_param('id', PARAM_INT); 23 | 24 | /* Access control */ 25 | require_login($course); 26 | $context = context_course::instance($course); 27 | require_capability('block/analytics_graphs:viewpages', $context); 28 | 29 | $title = get_string('submissions_turnitin', 'block_analytics_graphs'); 30 | $submissionsgraph = new graph_submission($course, $title); 31 | 32 | 33 | $students = block_analytics_graphs_get_students($COURSE); 34 | $numberofstudents = count($students); 35 | if ($numberofstudents == 0) { 36 | echo(get_string('no_students', 'block_analytics_graphs')); 37 | exit; 38 | } 39 | $result = block_analytics_graphs_get_turnitin_submission($course, $students); 40 | $numberoftasks = count($result); 41 | if ($numberoftasks == 0) { 42 | echo(get_string('no_graph', 'block_analytics_graphs')); 43 | exit; 44 | } 45 | $submissionsgraphoptions = $submissionsgraph->create_graph($result, $students); 46 | 47 | /* Discover groups/groupings and members */ 48 | $groupmembers = block_analytics_graphs_get_course_group_members($COURSE); 49 | $groupingmembers = block_analytics_graphs_get_course_grouping_members($COURSE); 50 | $groupmembers = array_merge($groupmembers, $groupingmembers); 51 | $numberoftasks = count($result); 52 | if ($numberoftasks == 0) { 53 | error(get_string('no_graph', 'block_analytics_graphs')); 54 | } 55 | $groupmembersjson = json_encode($groupmembers); 56 | 57 | $studentsjson = json_encode($students); 58 | $resultjson = json_encode($result); 59 | $statisticsjson = $submissionsgraph->get_statistics(); 60 | 61 | $codename = "turnitin.php"; 62 | require('groupjavascript.php'); 63 | -------------------------------------------------------------------------------- /version.php: -------------------------------------------------------------------------------- 1 | . 16 | 17 | 18 | defined('MOODLE_INTERNAL') || die(); 19 | $plugin->version = 2024112801; // YYYYMMDDHH (year, month, day, 24-hr time). 20 | $plugin->requires = 2015111600; // YYYYMMDDHH (This is the release version for Moodle 3.0). 21 | $plugin->maturity = MATURITY_STABLE; 22 | $plugin->release = '4.2.2'; 23 | $plugin->branch = '4.2'; 24 | $plugin->component = 'block_analytics_graphs'; 25 | --------------------------------------------------------------------------------