/** * File : report/ActionReg.js * Created : 17/05/2016 * By : Francesc Busquets <francesc@gmail.com> * * JClic.js * An HTML5 player of JClic activities * https://projectestac.github.io/jclic.js * * @source https://github.com/projectestac/jclic.js * * @license EUPL-1.2 * @licstart * (c) 2000-2020 Educational Telematic Network of Catalonia (XTEC) * * Licensed under the EUPL, Version 1.1 or -as soon they will be approved by * the European Commission- subsequent versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * * You may obtain a copy of the Licence at: * https://joinup.ec.europa.eu/software/page/eupl * * Unless required by applicable law or agreed to in writing, software * distributed under the Licence is distributed on an "AS IS" basis, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * Licence for the specific language governing permissions and limitations * under the Licence. * @licend * @module */ import $ from 'jquery'; import { attrForEach, getBoolean } from '../Utils.js'; /** * This class stores information about one specific action done by the current user while playing * an activity. * */ export class ActionReg { /** * ActionReg constructor * @param {string} type - Type of action (`click`, `write`, `move`, `select`...) * @param {string}+ source - Description of the object on which the action is done. * @param {string}+ dest - Description of the object that acts as a target of the action (used in pairings) * @param {boolean} ok - `true` if the action was OK, `false`, `null` or `undefined` otherwise */ constructor(type, source, dest, ok) { this.type = type; this.source = source || null; this.dest = dest || null; this.ok = ok || false; this.time = (new Date()).valueOf(); } /** * Provides the data associated with this action in XML format suitable for a * {@link http://clic.xtec.cat/en/jclic/reports/|JClic Reports Server}. * @returns {external:jQuery} */ $getXML() { const attr = { ok: this.ok, time: this.time }; if (this.type) attr.type = this.type; if (this.source) attr.source = this.source; if (this.dest) attr.dest = this.dest; return $('<action/>', attr); } /** * Fills this ActionReg with data provided in XML format * @param {external:jQuery} $xml - The XML element to be processed, already wrapped as jQuery object */ setProperties($xml) { attrForEach($xml.get(0).attributes, (name, value) => { switch (name) { case 'type': case 'source': case 'dest': this[name] = value; break; case 'time': this[name] = Number(value); break; case 'ok': this[name] = getBoolean(value, false); break; } }); } } Object.assign(ActionReg.prototype, { /** * The type of action (`click`, `write`, `move`, `select`...) * @name module:report/ActionReg.ActionReg#type * @type {string} */ type: 'unknown', /** * Description of the object on which the action was done * @name module:report/ActionReg.ActionReg#source * @type {string} */ source: null, /** * Description of the object that has acted as a target of the action (used in pairings) * @name module:report/ActionReg.ActionReg#dest * @type {string} */ dest: null, /** * Time stamp taken when the action was done * @name module:report/ActionReg.ActionReg#time * @type {number} */ time: 0, /** * `true` if the action was OK * @name module:report/ActionReg.ActionReg#isOk * @type {boolean} */ isOk: false, }); export default ActionReg;