// Put this file in path/to/plugin/amd/src
// You can call it anything you like
define(['jquery', 'core/str', 'core/ajax', 'block_gradelevel/jscolor'], function ($, str, ajax, jscolor) {
let skill_id = null;
let $skill_table = null;
let self = {
init: function init() {
// Find skill table and skill id
$skill_table = $("table#level_config");
skill_id = Number($skill_table.attr('data-skill'));
if (!skill_id && skill_id !== 0 && skill_id !== '0') {
console.error("Cannot find configured skill id");
return;
}
// load and fill the level table
self.refresh();
// make sure all uint type numbers are not able to go below 0
$(document).on('change', "input[type=number].uint", function (evt) {
let $this = $(this);
if ($this.val() < 0) {
$this.val(0);
}
});
// On click handler for add level link
$("a[data-action=addlevel]").on('click', function (evt) {
self.add_levelrow(-255, '', '7F7F7F');
});
// On click handler for save changes button
$("button[data-action=savechanges]").on('click', self.submit);
},
add_levelrow: function (id, points, color) {
// create new row
let $newtr = $("
"
+ "
"
+ "
");
// apply jscolor to new row
$newtr.find("input.jscolor").each(function () {
let picker = new jscolor(this);
});
// and add to the body of the table
$skill_table.find("tbody").append($newtr);
},
refresh: function refresh() {
console.info("Attempting to refresh");
// perform refresh call
let promises = ajax.call([{
methodname: 'block_gradelevel_list_levels',
args: { skill_id: skill_id },
}]);
// and link promise returns to callbacks
promises[0].done(self.success_refill_table).fail(self.fail_report_exception);
},
submit: function submit(evt) {
let $table = $("table#level_config");
let level_data = [];
$table.find("tbody tr[data-rowid]").each(function () {
let $this = $(this);
let row = {
id: Number($this.attr('data-rowid')),
points: $this.find("input[data-name=points]").val(),
badgecolor: $this.find("input[data-name=color]").val(),
}
if (row.points === "") { row.points = -255; }
row.points = Number(row.points);
level_data.push(row);
});
//console.info("Attempting to submit", level_data);
// perform ajax call
let promises = ajax.call([{
methodname: 'block_gradelevel_submit_levels',
args: { skill_id: skill_id, levels: level_data },
}]);
// and link promise returns to callbacks
promises[0].done(self.success_refill_table).fail(self.fail_report_exception);
},
success_refill_table: function success_refill_table(response) {
//console.info("Response from webservice: ", response);
let $tbody = $skill_table.find('tbody');
$tbody.empty();
for (let idx in response) {
let lvl = response[idx];
//console.info("Level:", lvl);
self.add_levelrow(lvl.id, lvl.points, lvl.badgecolor);
}
},
fail_report_exception: function fail_report_exception(ex) {
if (ex.error != undefined) {
console.error("Error from webservice: ", ex.error, "\n" , ex.debuginfo, "\n---Stack trace---\n", ex.stacktrace, "\n", ex);
}
else {
console.error("Exception from webservice: ", ex.message, "\n", ex.debuginfo, "\n---Stack trace---\n", ex.backtrace, "\n", ex);
}
},
};
return self;
});