Skip to content
Snippets Groups Projects
Unverified Commit 5979bdf1 authored by Tobias Reischmann's avatar Tobias Reischmann
Browse files

Merge branch 'feature/log-actions' of...

Merge branch 'feature/log-actions' of https://github.com/justusdieckmann/moodle-tool_lifecycle into justusdieckmann-feature/log-actions
parents b75d649b 68f51159
No related branches found
No related tags found
No related merge requests found
Showing
with 178 additions and 33 deletions
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
*/ */
namespace tool_lifecycle\manager; namespace tool_lifecycle\manager;
use tool_lifecycle\entity\process;
use tool_lifecycle\processor; use tool_lifecycle\processor;
use tool_lifecycle\response\step_interactive_response; use tool_lifecycle\response\step_interactive_response;
...@@ -63,6 +64,8 @@ class interaction_manager { ...@@ -63,6 +64,8 @@ class interaction_manager {
$interactionlib = lib_manager::get_step_interactionlib($step->subpluginname); $interactionlib = lib_manager::get_step_interactionlib($step->subpluginname);
$response = $interactionlib->handle_interaction($process, $step, $action); $response = $interactionlib->handle_interaction($process, $step, $action);
self::save_interaction($process, $action);
switch ($response) { switch ($response) {
case step_interactive_response::still_processing(): case step_interactive_response::still_processing():
return false; return false;
...@@ -81,6 +84,23 @@ class interaction_manager { ...@@ -81,6 +84,23 @@ class interaction_manager {
return true; return true;
} }
/**
* @param process $process
* @throws \dml_exception
*/
public static function save_interaction($process, $action) {
global $DB, $USER;
$record = new \stdClass();
$record->userid = $USER->id;
$record->time = time();
$record->courseid = $process->courseid;
$record->processid = $process->id;
$record->workflowid = $process->workflowid;
$record->stepindex = $process->stepindex;
$record->action = $action;
$DB->insert_record('tool_lifecycle_action_log', $record);
}
/** /**
* Returns the capability a user has to have to make decisions for a specific course within the step. * Returns the capability a user has to have to make decisions for a specific course within the step.
* @param string $subpluginname name of the step * @param string $subpluginname name of the step
......
...@@ -61,11 +61,10 @@ class interaction_attention_table extends interaction_table { ...@@ -61,11 +61,10 @@ class interaction_attention_table extends interaction_table {
* Initialises the columns of the table. * Initialises the columns of the table.
*/ */
public function init() { public function init() {
$this->define_columns(['courseid', 'courseshortname', 'coursefullname', 'category', 'status', 'tools', 'date']); $this->define_columns(['courseid', 'coursefullname', 'category', 'status', 'tools', 'date']);
$this->define_headers([ $this->define_headers([
get_string('course'), get_string('course'),
get_string('shortnamecourse'), get_string('coursename', 'tool_lifecycle'),
get_string('fullnamecourse'),
get_string('category'), get_string('category'),
get_string('status', 'tool_lifecycle'), get_string('status', 'tool_lifecycle'),
get_string('tools', 'tool_lifecycle'), get_string('tools', 'tool_lifecycle'),
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
*/ */
namespace tool_lifecycle\table; namespace tool_lifecycle\table;
use tool_lifecycle\manager\lib_manager;
use tool_lifecycle\manager\workflow_manager; use tool_lifecycle\manager\workflow_manager;
defined('MOODLE_INTERNAL') || die; defined('MOODLE_INTERNAL') || die;
...@@ -40,11 +41,27 @@ class interaction_remaining_table extends interaction_table { ...@@ -40,11 +41,27 @@ class interaction_remaining_table extends interaction_table {
$this->availabletools = workflow_manager::get_manual_trigger_tools_for_active_workflows(); $this->availabletools = workflow_manager::get_manual_trigger_tools_for_active_workflows();
$fields = "c.id as courseid, p.id as processid, c.fullname as coursefullname, c.shortname as courseshortname, " . // COALESCE returns l.time if l.time != null and 0 otherwise.
"cc.name as category "; // We need to do this, so that courses without any action have a smaller timestamp than courses with an recorded action.
$from = '{course} c left join ' . // Otherwise, it would mess up the sorting.
'{tool_lifecycle_process} p on p.courseid = c.id ' . $fields = "c.id as courseid, p.id AS processid, c.fullname AS coursefullname, c.shortname AS courseshortname, " .
'left join {course_categories} cc on c.category = cc.id'; "cc.name AS category, COALESCE(l.time, 0) AS lastmodified, l.userid, l.action, s.subpluginname, " .
get_all_user_name_fields(true, 'u');
$from = '{course} c ' .
'LEFT JOIN (' .
/* This Subquery creates a table with the one record per course from {tool_lifecycle_action_log}
with the highest id (the newest record per course) */
'SELECT * FROM {tool_lifecycle_action_log} a ' .
'INNER JOIN ( ' .
'SELECT b.courseid as cid, MAX(b.id) as maxlogid ' .
'FROM {tool_lifecycle_action_log} b ' .
'GROUP BY b.courseid ' .
') m ON a.courseid = m.cid AND a.id = m.maxlogid ' .
') l ON c.id = l.courseid ' .
'LEFT JOIN {tool_lifecycle_process} p ON p.courseid = c.id ' .
'LEFT JOIN {course_categories} cc ON c.category = cc.id ' .
'LEFT JOIN {tool_lifecycle_step} s ON l.workflowid = s.workflowid AND l.stepindex = s.sortindex ' .
'LEFT JOIN {user} u ON l.userid = u.id';
$ids = implode(',', $courseids); $ids = implode(',', $courseids);
...@@ -53,8 +70,11 @@ class interaction_remaining_table extends interaction_table { ...@@ -53,8 +70,11 @@ class interaction_remaining_table extends interaction_table {
$where = 'c.id IN ('. $ids . ')'; $where = 'c.id IN ('. $ids . ')';
} }
$this->column_nosort = array('category', 'status', 'tools'); $order = ' ORDER BY lastmodified DESC';
$this->set_sql($fields, $from, $where, []);
$this->sortable(false);
$this->set_sql($fields, $from, $where . $order, []);
$this->set_count_sql("SELECT COUNT(1) FROM {course} c WHERE $where");
$this->define_baseurl($PAGE->url); $this->define_baseurl($PAGE->url);
$this->init(); $this->init();
} }
...@@ -63,13 +83,13 @@ class interaction_remaining_table extends interaction_table { ...@@ -63,13 +83,13 @@ class interaction_remaining_table extends interaction_table {
* Initialises the columns of the table. * Initialises the columns of the table.
*/ */
public function init() { public function init() {
$this->define_columns(['courseid', 'courseshortname', 'coursefullname', 'category', 'status', 'tools']); $this->define_columns(['courseid', 'coursefullname', 'category', 'status', 'lastmodified', 'tools']);
$this->define_headers([ $this->define_headers([
get_string('course'), get_string('course'),
get_string('shortnamecourse'), get_string('coursename', 'tool_lifecycle'),
get_string('fullnamecourse'),
get_string('category'), get_string('category'),
get_string('status', 'tool_lifecycle'), get_string('status', 'tool_lifecycle'),
get_string('lastaction', 'tool_lifecycle'),
get_string('tools', 'tool_lifecycle'), get_string('tools', 'tool_lifecycle'),
]); ]);
$this->setup(); $this->setup();
...@@ -110,4 +130,30 @@ class interaction_remaining_table extends interaction_table { ...@@ -110,4 +130,30 @@ class interaction_remaining_table extends interaction_table {
return $OUTPUT->render($menu); return $OUTPUT->render($menu);
} }
public function col_status($row) {
$processstatus = parent::col_status($row);
// If current process has status, show status.
if ($processstatus != '') {
return $processstatus;
}
// Otherwise, if there is no action saved for this process, show nothing.
if (!$row->subpluginname) {
return '';
}
// Otherwise, show latest action commited by user.
global $CFG;
$userlink = \html_writer::link($CFG->wwwroot . '/user/profile.php?id=' . $row->userid, fullname($row));
$interactionlib = lib_manager::get_step_interactionlib($row->subpluginname);
return $interactionlib->get_action_string($row->action, $userlink);
}
public function col_lastmodified($row) {
if (!$row->lastmodified) {
return '';
}
$dateformat = get_string('strftimedatetime', 'core_langconfig');
return userdate($row->lastmodified, $dateformat);
}
} }
\ No newline at end of file
...@@ -54,22 +54,14 @@ abstract class interaction_table extends \table_sql { ...@@ -54,22 +54,14 @@ abstract class interaction_table extends \table_sql {
return \html_writer::link(course_get_url($row->courseid), $row->courseid); return \html_writer::link(course_get_url($row->courseid), $row->courseid);
} }
/**
* Render courseshortname column.
* @param $row
* @return string course link
*/
public function col_courseshortname($row) {
return \html_writer::link(course_get_url($row->courseid), $row->courseshortname);
}
/** /**
* Render coursefullname column. * Render coursefullname column.
* @param $row * @param $row
* @return string course link * @return string course link
*/ */
public function col_coursefullname($row) { public function col_coursefullname($row) {
return \html_writer::link(course_get_url($row->courseid), $row->coursefullname); $courselink = \html_writer::link(course_get_url($row->courseid), $row->coursefullname);
return $courselink . '<br><span class="secondary-info">' . $row->courseshortname . '</span>';
} }
/** /**
......
...@@ -30,6 +30,7 @@ use tool_lifecycle\manager\process_manager; ...@@ -30,6 +30,7 @@ use tool_lifecycle\manager\process_manager;
use tool_lifecycle\manager\settings_manager; use tool_lifecycle\manager\settings_manager;
use tool_lifecycle\manager\step_manager; use tool_lifecycle\manager\step_manager;
use tool_lifecycle\manager\trigger_manager; use tool_lifecycle\manager\trigger_manager;
use tool_lifecycle\table\interaction_log_table;
use tool_lifecycle\table\interaction_remaining_table; use tool_lifecycle\table\interaction_remaining_table;
use tool_lifecycle\table\interaction_attention_table; use tool_lifecycle\table\interaction_attention_table;
...@@ -74,6 +75,7 @@ class view_controller { ...@@ -74,6 +75,7 @@ class view_controller {
"WHERE p.courseid IN (". $listofcourseids . ")"); "WHERE p.courseid IN (". $listofcourseids . ")");
$requiresinteraction = array(); $requiresinteraction = array();
$remainingcourses = $arrayofcourseids;
foreach ($processes as $process) { foreach ($processes as $process) {
$step = step_manager::get_step_instance($process->stepinstanceid); $step = step_manager::get_step_instance($process->stepinstanceid);
...@@ -82,7 +84,7 @@ class view_controller { ...@@ -82,7 +84,7 @@ class view_controller {
if (has_capability($capability, \context_course::instance($process->courseid), null, false) && if (has_capability($capability, \context_course::instance($process->courseid), null, false) &&
!empty(interaction_manager::get_action_tools($step->subpluginname, $process->processid))) { !empty(interaction_manager::get_action_tools($step->subpluginname, $process->processid))) {
$requiresinteraction[] = $process->courseid; $requiresinteraction[] = $process->courseid;
unset($arrayofcourseids[$process->courseid]); unset($remainingcourses[$process->courseid]);
} }
} }
...@@ -95,7 +97,7 @@ class view_controller { ...@@ -95,7 +97,7 @@ class view_controller {
echo $renderer->box(""); echo $renderer->box("");
echo $renderer->heading(get_string('tablecoursesremaining', 'tool_lifecycle'), 3); echo $renderer->heading(get_string('tablecoursesremaining', 'tool_lifecycle'), 3);
$table2 = new interaction_remaining_table('tool_lifecycle_remaining', $arrayofcourseids); $table2 = new interaction_remaining_table('tool_lifecycle_remaining', $remainingcourses);
echo $renderer->box_start("lifecycle-enable-overflow lifecycle-table"); echo $renderer->box_start("lifecycle-enable-overflow lifecycle-table");
$table2->out(50, false); $table2->out(50, false);
......
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<XMLDB PATH="admin/tool/lifecycle/db" VERSION="20190625" COMMENT="XMLDB file for Moodle tool/lifecycle" <XMLDB PATH="admin/tool/lifecycle/db" VERSION="20190822" COMMENT="XMLDB file for Moodle tool/lifecycle"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../../lib/xmldb/xmldb.xsd" xsi:noNamespaceSchemaLocation="../../../../lib/xmldb/xmldb.xsd"
> >
...@@ -127,5 +127,24 @@ ...@@ -127,5 +127,24 @@
<KEY NAME="workflowid_fk" TYPE="foreign" FIELDS="workflowid" REFTABLE="tool_lifecycle_workflow" REFFIELDS="id"/> <KEY NAME="workflowid_fk" TYPE="foreign" FIELDS="workflowid" REFTABLE="tool_lifecycle_workflow" REFFIELDS="id"/>
</KEYS> </KEYS>
</TABLE> </TABLE>
<TABLE NAME="tool_lifecycle_action_log" COMMENT="Logs for interactions">
<FIELDS>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
<FIELD NAME="processid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
<FIELD NAME="workflowid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
<FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
<FIELD NAME="stepindex" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
<FIELD NAME="time" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
<FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
<FIELD NAME="action" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false"/>
</FIELDS>
<KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
<KEY NAME="processid_fk" TYPE="foreign" FIELDS="processid" REFTABLE="tool_lifecycle_process" REFFIELDS="id"/>
<KEY NAME="workflowid_fk" TYPE="foreign" FIELDS="workflowid" REFTABLE="tool_lifecycle_workflow" REFFIELDS="id"/>
<KEY NAME="courseid_fk" TYPE="foreign" FIELDS="courseid" REFTABLE="course" REFFIELDS="id"/>
<KEY NAME="userid_fk" TYPE="foreign" FIELDS="userid" REFTABLE="user" REFFIELDS="id"/>
</KEYS>
</TABLE>
</TABLES> </TABLES>
</XMLDB> </XMLDB>
\ No newline at end of file
...@@ -327,7 +327,7 @@ function xmldb_tool_lifecycle_upgrade($oldversion) { ...@@ -327,7 +327,7 @@ function xmldb_tool_lifecycle_upgrade($oldversion) {
upgrade_plugin_savepoint(true, 2019053100, 'tool', 'lifecycle'); upgrade_plugin_savepoint(true, 2019053100, 'tool', 'lifecycle');
} }
if ($oldversion < 2019062600) { if ($oldversion < 2019082200) {
$duration = get_config(null, 'lifecycle_duration'); $duration = get_config(null, 'lifecycle_duration');
...@@ -379,8 +379,35 @@ function xmldb_tool_lifecycle_upgrade($oldversion) { ...@@ -379,8 +379,35 @@ function xmldb_tool_lifecycle_upgrade($oldversion) {
$dbman->create_table($table); $dbman->create_table($table);
} }
// Define table tool_lifecycle_action_log to be created.
$table = new xmldb_table('tool_lifecycle_action_log');
// Adding fields to table tool_lifecycle_action_log.
$table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
$table->add_field('processid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
$table->add_field('workflowid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
$table->add_field('courseid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
$table->add_field('stepindex', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
$table->add_field('time', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
$table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
$table->add_field('action', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
// Adding keys to table tool_lifecycle_action_log.
$table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']);
$table->add_key('processid_fk', XMLDB_KEY_FOREIGN, ['processid'], 'tool_lifecycle_process', ['id']);
$table->add_key('workflowid_fk', XMLDB_KEY_FOREIGN, ['workflowid'], 'tool_lifecycle_workflow', ['id']);
$table->add_key('courseid_fk', XMLDB_KEY_FOREIGN, ['courseid'], 'course', ['id']);
$table->add_key('userid_fk', XMLDB_KEY_FOREIGN, ['userid'], 'user', ['id']);
// Conditionally launch create table for tool_lifecycle_action_log.
if (!$dbman->table_exists($table)) {
$dbman->create_table($table);
}
// Lifecycle savepoint reached. // Lifecycle savepoint reached.
upgrade_plugin_savepoint(true, 2019062600, 'tool', 'lifecycle');
upgrade_plugin_savepoint(true, 2019082200, 'tool', 'lifecycle');
} }
return true; return true;
} }
\ No newline at end of file
...@@ -66,6 +66,7 @@ $string['trigger_enabled'] = 'Enabled'; ...@@ -66,6 +66,7 @@ $string['trigger_enabled'] = 'Enabled';
$string['trigger_sortindex'] = 'Up/Down'; $string['trigger_sortindex'] = 'Up/Down';
$string['trigger_workflow'] = 'Workflow'; $string['trigger_workflow'] = 'Workflow';
$string['workflow'] = 'Workflow';
$string['add_workflow'] = 'Add Workflow'; $string['add_workflow'] = 'Add Workflow';
$string['upload_workflow'] = 'Upload Workflow'; $string['upload_workflow'] = 'Upload Workflow';
$string['workflow_title'] = 'Title'; $string['workflow_title'] = 'Title';
...@@ -150,11 +151,15 @@ $string['workflownotfound'] = 'Workflow with id {$a} could not be found'; ...@@ -150,11 +151,15 @@ $string['workflownotfound'] = 'Workflow with id {$a} could not be found';
// View.php. // View.php.
$string['tablecoursesrequiringattention'] = 'Courses that require your attention'; $string['tablecoursesrequiringattention'] = 'Courses that require your attention';
$string['tablecoursesremaining'] = 'Remaining courses'; $string['tablecoursesremaining'] = 'Remaining courses';
$string['tablecourseslog'] = 'Past Actions';
$string['viewheading'] = 'Manage courses'; $string['viewheading'] = 'Manage courses';
$string['interaction_success'] = 'Action successfully saved.'; $string['interaction_success'] = 'Action successfully saved.';
$string['manual_trigger_success'] = 'Workflow started successfully.'; $string['manual_trigger_success'] = 'Workflow started successfully.';
$string['manual_trigger_process_existed'] = 'A workflow for this course already exists.'; $string['manual_trigger_process_existed'] = 'A workflow for this course already exists.';
$string['coursename'] = 'Course name';
$string['lastaction'] = 'Last action on';
$string['workflow_started'] = 'Workflow started.'; $string['workflow_started'] = 'Workflow started.';
$string['workflow_is_running'] = 'Workflow is running.'; $string['workflow_is_running'] = 'Workflow is running.';
......
...@@ -138,4 +138,15 @@ class interactionduplicate extends interactionlibbase { ...@@ -138,4 +138,15 @@ class interactionduplicate extends interactionlibbase {
$mform->display(); $mform->display();
echo $renderer->footer(); echo $renderer->footer();
} }
/**
* Returns the display name for the given action.
* Used for the past actions table in view.php.
* @param string $action Identifier of action
* @param string $userlink html-link with username as text that refers to the user profile.
* @return string action display name
*/
public function get_action_string($action, $user) {
return get_string('action_new_course_data', 'lifecyclestep_duplicate', $user);
}
} }
\ No newline at end of file
...@@ -30,3 +30,4 @@ $string['duplicate_form'] = 'Enter data'; ...@@ -30,3 +30,4 @@ $string['duplicate_form'] = 'Enter data';
$string['duplicate_course_header'] = 'Duplicate Course'; $string['duplicate_course_header'] = 'Duplicate Course';
$string['status_message_duplication'] = 'Duplicated course will be available shortly.'; $string['status_message_duplication'] = 'Duplicated course will be available shortly.';
$string['status_message_form'] = 'Additional information required'; $string['status_message_form'] = 'Additional information required';
$string['action_new_course_data'] = '{$a} supplied new course name';
\ No newline at end of file
...@@ -25,5 +25,5 @@ ...@@ -25,5 +25,5 @@
defined('MOODLE_INTERNAL') || die; defined('MOODLE_INTERNAL') || die;
$plugin->version = 2018080300; $plugin->version = 2019070200;
$plugin->component = 'lifecyclestep_duplicate'; $plugin->component = 'lifecyclestep_duplicate';
\ No newline at end of file
...@@ -105,4 +105,15 @@ class interactionemail extends interactionlibbase { ...@@ -105,4 +105,15 @@ class interactionemail extends interactionlibbase {
// TODO default format -- seconds -> not in this class ! // TODO default format -- seconds -> not in this class !
return date('d.m.Y', $date); return date('d.m.Y', $date);
} }
/**
* Returns the display name for the given action.
* Used for the past actions table in view.php.
* @param string $action Identifier of action
* @param string $userlink html-link with username as text that refers to the user profile.
* @return string action display name
*/
public function get_action_string($action, $user) {
return get_string('action_prevented_deletion', 'lifecyclestep_email', $user);
}
} }
\ No newline at end of file
...@@ -50,3 +50,4 @@ $string['email:preventdeletion'] = 'Prevent Deletion'; ...@@ -50,3 +50,4 @@ $string['email:preventdeletion'] = 'Prevent Deletion';
$string['keep_course'] = 'Keep Course'; $string['keep_course'] = 'Keep Course';
$string['status_message_decision_keep'] = 'Course is still needed'; $string['status_message_decision_keep'] = 'Course is still needed';
$string['status_message_requiresattention'] = 'Course is marked for deletion'; $string['status_message_requiresattention'] = 'Course is marked for deletion';
$string['action_prevented_deletion'] = '{$a} prevented deletion';
...@@ -25,5 +25,5 @@ ...@@ -25,5 +25,5 @@
defined('MOODLE_INTERNAL') || die; defined('MOODLE_INTERNAL') || die;
$plugin->version = 2017052302; $plugin->version = 2019070200;
$plugin->component = 'lifecyclestep_email'; $plugin->component = 'lifecyclestep_email';
\ No newline at end of file
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
*/ */
namespace tool_lifecycle\step; namespace tool_lifecycle\step;
use core_user;
use tool_lifecycle\entity\process; use tool_lifecycle\entity\process;
use tool_lifecycle\entity\step_subplugin; use tool_lifecycle\entity\step_subplugin;
use tool_lifecycle\response\step_interactive_response; use tool_lifecycle\response\step_interactive_response;
...@@ -65,6 +66,15 @@ abstract class interactionlibbase { ...@@ -65,6 +66,15 @@ abstract class interactionlibbase {
*/ */
public abstract function get_status_message($process); public abstract function get_status_message($process);
/**
* Returns the display name for the given action.
* Used for the past actions table in view.php.
* @param string $action Identifier of action
* @param string $userlink html-link with username as text that refers to the user profile.
* @return string action display name
*/
public abstract function get_action_string($action, $user);
/** /**
* Called when a user triggered an action for a process instance. * Called when a user triggered an action for a process instance.
* @param process $process instance of the process the action was triggered upon. * @param process $process instance of the process the action was triggered upon.
......
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
overflow: initial; overflow: initial;
} }
.lifecycle-table span.workflow_displaytitle { .lifecycle-table span.workflow_displaytitle,
.lifecycle-table span.secondary-info {
color: #888; color: #888;
font-size: .9em; font-size: .9em;
padding: 0.5em; padding: 0.5em;
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
defined('MOODLE_INTERNAL') || die; defined('MOODLE_INTERNAL') || die;
$plugin->maturity = MATURITY_ALPHA; $plugin->maturity = MATURITY_ALPHA;
$plugin->version = 2019062600; $plugin->version = 2019082200;
$plugin->component = 'tool_lifecycle'; $plugin->component = 'tool_lifecycle';
$plugin->requires = 2017111300; // Require Moodle 3.4 (or above). $plugin->requires = 2017111300; // Require Moodle 3.4 (or above).
$plugin->release = 'v3.6-r1'; $plugin->release = 'v3.6-r1';
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment