Skip to content

ActionLogger Tutorial

larsb edited this page Aug 7, 2014 · 26 revisions

This tutorial describes how to set up and use the ActionLogger in the context of scaffolding apps and labs in the Go-Lab project. The ActionLogger is a middleware component to ease developers the implementation of action logging features; not caring about the actual sending of actions.

Preparations

To make use of the ActionLogger, it is neccessary to include the following Javascript sources:

Creating an ActionLogger instance

To create an ActionLogger instance, an instance of the GoLabMetadataHandler has to be created first. The MetadataHandler holds information about the current user, document, tool and ILS. This metadata will be automatically added to every log action. The MetadataHandler needs to be initialized with a default set of metadata, where some items will be automatically overridden with information from the ILS metawidget. A developer has to provide a document type (e.g. "conceptMap" or "hypotheses") and a tool name (e.g. "ut.tools.conceptmapper" or "ut.tools.hypothesisScratchpad") with the default metadata set, as these information is specific for each tool.

Please note: The GoLabMetadataHandler (and the ILS library functions it is using) are implemented to operate from within an OpenSocial gadget in an ILS space. It will not work from with the ILS itself (unless modified).

Please note: Creating a MetadataHandler requires to use a callback function, since the creation requires to use aynchronous OpenSocial calls from the ILS libaray.

The following code snippet presents an example of how to create an instance of the ActionLogger:

var documentType = "newDocumentType";
var toolName = "golab.newtool";
var initialMetadata = {
"id": "",
"published": "",
"actor": {
"objectType": "person",
"id": "unknown",
"displayName": "unknown"
},
"target": {
"objectType": documentType,
"id": ut.commons.utils.generateUUID(),
"displayName": "unnamed " + documentType
},
"generator": {
"objectType": "application",
"url": window.location.href,
"id": ut.commons.utils.generateUUID(),
"displayName": toolName
},
"provider": {
"objectType": "ils",
"url": window.location.href,
"id": "unknown",
"inquiryPhase": "unknown",
"displayName": "unknown"
}
};
new window.golab.ils.metadata.GoLabMetadataHandler(initialMetadata, function(metadataHandler) {
var actionLogger = new window.ut.commons.actionlogging.ActionLogger(metadataHandler);
actionLogger.setLoggingTarget("opensocial");
// for development, using the following line might be helpful,
// as it sets the ActionLogger to log to the console for easy debugging
// actionLogger.setLoggingTarget("console");
//here, actionLogger is ready for usage
});

Using the ActionLogger

Using the ActionLogger basically means deciding on a "verb" (a plain string) and defining an "object" (in JSON format). The verb describes what has been done, whereas the object defines the content of an action. The list of valid verbs has been organized in a taxonomy, which looks as follows:

  • content-oriented verbs (i.e. verbs that describe changes in the content of a document)
    • add
    • change
    • remove
  • process-oriented verbs (i.e. verbs that don't describe a change in the working document, but denote an otherwise interesting event)
    • access (e.g. accessing a tab, changing the ILS phase, opening a help text, etc.)
    • start (e.g. starting a simulation, an animation etc.)
    • cancel (e.g. stopping a simulation, canceling an editing process, etc.)
    • send (e.g. sending a message, responding to a question etc.)
    • receive (e.g. receiving a message, getting a popup notification from LA backend etc.)
  • storage-oriented verbs (i.e. verbs that describe the creation, reading, etc. of resources)
    • open
    • create
    • update
    • delete

The objects describes the content of an action. It needs to have an object type, an identifier (which typically identifies the added/changed/removed object in the working document), and arbitrary additional content. The examples a few lines below include possible objects. To ease the developer's life, separate functions have been created that will take care of the verb, so only the object needs to be defined.

Content-oriented verbs

For the content-oriented verbs, this means the ActionLogger provides functions called logAdd(object), logRemove(object), logChange(object). As a rule of thumb, the content-oriented action logging messages should be enough to sufficient to replicate the state of the working document and to replay its changes over time. Please consider the following examples, that describe the creation, the modification and the removal of a concept in the Concept Mapper tool.

// an new concept with the default text "new concept" is created
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "new concept"
}
actionLogger.logAdd(logObject);
// the same concept (cf. "id") is then modified to hold the new term "gravity"
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "gravity"
}
actionLogger.logChange(logObject);
// the same concept is then removed again
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
}
actionLogger.logRemove(logObject);

Process-oriented verbs

Actions, that do not change the content of the working document, but describe noteworthy activities nevertheless, are logged using process-oriented verbs. To this end, the ActionLogger provides the following functions: logAccess(object), logStart(object), logCancel(object), logSend(object), logReceive(object).

// examples follow

Storage-oriented verbs

Actions that are related to storing and retrieving documents from e.g. the Vault are categorized into storage-oriented verbs. These are handled through the functions logLoad(resource), logSaveAs(resource), logSave(resource), logDelete(resource). Please note, that the parameter of the storage-oriented functions is called "resource" (instead of "object") to indicate that these functions expect a resource object, as defined here. objectType and id will be generated automatically from the information in the resource.

// examples follow

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
ActionLogger Tutorial · go-lab/ils Wiki · GitHub
Skip to content

ActionLogger Tutorial

larsb edited this page Aug 7, 2014 · 26 revisions

This tutorial describes how to set up and use the ActionLogger in the context of scaffolding apps and labs in the Go-Lab project. The ActionLogger is a middleware component to ease developers the implementation of action logging features; not caring about the actual sending of actions.

Preparations

To make use of the ActionLogger, it is neccessary to include the following Javascript sources:

Creating an ActionLogger instance

To create an ActionLogger instance, an instance of the GoLabMetadataHandler has to be created first. The MetadataHandler holds information about the current user, document, tool and ILS. This metadata will be automatically added to every log action. The MetadataHandler needs to be initialized with a default set of metadata, where some items will be automatically overridden with information from the ILS metawidget. A developer has to provide a document type (e.g. "conceptMap" or "hypotheses") and a tool name (e.g. "ut.tools.conceptmapper" or "ut.tools.hypothesisScratchpad") with the default metadata set, as these information is specific for each tool.

Please note: The GoLabMetadataHandler (and the ILS library functions it is using) are implemented to operate from within an OpenSocial gadget in an ILS space. It will not work from with the ILS itself (unless modified).

Please note: Creating a MetadataHandler requires to use a callback function, since the creation requires to use aynchronous OpenSocial calls from the ILS libaray.

The following code snippet presents an example of how to create an instance of the ActionLogger:

var documentType = "newDocumentType";
var toolName = "golab.newtool";
var initialMetadata = {
"id": "",
"published": "",
"actor": {
"objectType": "person",
"id": "unknown",
"displayName": "unknown"
},
"target": {
"objectType": documentType,
"id": ut.commons.utils.generateUUID(),
"displayName": "unnamed " + documentType
},
"generator": {
"objectType": "application",
"url": window.location.href,
"id": ut.commons.utils.generateUUID(),
"displayName": toolName
},
"provider": {
"objectType": "ils",
"url": window.location.href,
"id": "unknown",
"inquiryPhase": "unknown",
"displayName": "unknown"
}
};
new window.golab.ils.metadata.GoLabMetadataHandler(initialMetadata, function(metadataHandler) {
var actionLogger = new window.ut.commons.actionlogging.ActionLogger(metadataHandler);
actionLogger.setLoggingTarget("opensocial");
// for development, using the following line might be helpful,
// as it sets the ActionLogger to log to the console for easy debugging
// actionLogger.setLoggingTarget("console");
//here, actionLogger is ready for usage
});

Using the ActionLogger

Using the ActionLogger basically means deciding on a "verb" (a plain string) and defining an "object" (in JSON format). The verb describes what has been done, whereas the object defines the content of an action. The list of valid verbs has been organized in a taxonomy, which looks as follows:

  • content-oriented verbs (i.e. verbs that describe changes in the content of a document)
    • add
    • change
    • remove
  • process-oriented verbs (i.e. verbs that don't describe a change in the working document, but denote an otherwise interesting event)
    • access (e.g. accessing a tab, changing the ILS phase, opening a help text, etc.)
    • start (e.g. starting a simulation, an animation etc.)
    • cancel (e.g. stopping a simulation, canceling an editing process, etc.)
    • send (e.g. sending a message, responding to a question etc.)
    • receive (e.g. receiving a message, getting a popup notification from LA backend etc.)
  • storage-oriented verbs (i.e. verbs that describe the creation, reading, etc. of resources)
    • open
    • create
    • update
    • delete

The objects describes the content of an action. It needs to have an object type, an identifier (which typically identifies the added/changed/removed object in the working document), and arbitrary additional content. The examples a few lines below include possible objects. To ease the developer's life, separate functions have been created that will take care of the verb, so only the object needs to be defined.

Content-oriented verbs

For the content-oriented verbs, this means the ActionLogger provides functions called logAdd(object), logRemove(object), logChange(object). As a rule of thumb, the content-oriented action logging messages should be enough to sufficient to replicate the state of the working document and to replay its changes over time. Please consider the following examples, that describe the creation, the modification and the removal of a concept in the Concept Mapper tool.

// an new concept with the default text "new concept" is created
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "new concept"
}
actionLogger.logAdd(logObject);
// the same concept (cf. "id") is then modified to hold the new term "gravity"
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "gravity"
}
actionLogger.logChange(logObject);
// the same concept is then removed again
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
}
actionLogger.logRemove(logObject);

Process-oriented verbs

Actions, that do not change the content of the working document, but describe noteworthy activities nevertheless, are logged using process-oriented verbs. To this end, the ActionLogger provides the following functions: logAccess(object), logStart(object), logCancel(object), logSend(object), logReceive(object).

// examples follow

Storage-oriented verbs

Actions that are related to storing and retrieving documents from e.g. the Vault are categorized into storage-oriented verbs. These are handled through the functions logLoad(resource), logSaveAs(resource), logSave(resource), logDelete(resource). Please note, that the parameter of the storage-oriented functions is called "resource" (instead of "object") to indicate that these functions expect a resource object, as defined here. objectType and id will be generated automatically from the information in the resource.

// examples follow

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ActionLogger Tutorial · go-lab/ils Wiki · GitHub
Skip to content

ActionLogger Tutorial

larsb edited this page Aug 7, 2014 · 26 revisions

This tutorial describes how to set up and use the ActionLogger in the context of scaffolding apps and labs in the Go-Lab project. The ActionLogger is a middleware component to ease developers the implementation of action logging features; not caring about the actual sending of actions.

Preparations

To make use of the ActionLogger, it is neccessary to include the following Javascript sources:

Creating an ActionLogger instance

To create an ActionLogger instance, an instance of the GoLabMetadataHandler has to be created first. The MetadataHandler holds information about the current user, document, tool and ILS. This metadata will be automatically added to every log action. The MetadataHandler needs to be initialized with a default set of metadata, where some items will be automatically overridden with information from the ILS metawidget. A developer has to provide a document type (e.g. "conceptMap" or "hypotheses") and a tool name (e.g. "ut.tools.conceptmapper" or "ut.tools.hypothesisScratchpad") with the default metadata set, as these information is specific for each tool.

Please note: The GoLabMetadataHandler (and the ILS library functions it is using) are implemented to operate from within an OpenSocial gadget in an ILS space. It will not work from with the ILS itself (unless modified).

Please note: Creating a MetadataHandler requires to use a callback function, since the creation requires to use aynchronous OpenSocial calls from the ILS libaray.

The following code snippet presents an example of how to create an instance of the ActionLogger:

var documentType = "newDocumentType";
var toolName = "golab.newtool";
var initialMetadata = {
"id": "",
"published": "",
"actor": {
"objectType": "person",
"id": "unknown",
"displayName": "unknown"
},
"target": {
"objectType": documentType,
"id": ut.commons.utils.generateUUID(),
"displayName": "unnamed " + documentType
},
"generator": {
"objectType": "application",
"url": window.location.href,
"id": ut.commons.utils.generateUUID(),
"displayName": toolName
},
"provider": {
"objectType": "ils",
"url": window.location.href,
"id": "unknown",
"inquiryPhase": "unknown",
"displayName": "unknown"
}
};
new window.golab.ils.metadata.GoLabMetadataHandler(initialMetadata, function(metadataHandler) {
var actionLogger = new window.ut.commons.actionlogging.ActionLogger(metadataHandler);
actionLogger.setLoggingTarget("opensocial");
// for development, using the following line might be helpful,
// as it sets the ActionLogger to log to the console for easy debugging
// actionLogger.setLoggingTarget("console");
//here, actionLogger is ready for usage
});

Using the ActionLogger

Using the ActionLogger basically means deciding on a "verb" (a plain string) and defining an "object" (in JSON format). The verb describes what has been done, whereas the object defines the content of an action. The list of valid verbs has been organized in a taxonomy, which looks as follows:

  • content-oriented verbs (i.e. verbs that describe changes in the content of a document)
    • add
    • change
    • remove
  • process-oriented verbs (i.e. verbs that don't describe a change in the working document, but denote an otherwise interesting event)
    • access (e.g. accessing a tab, changing the ILS phase, opening a help text, etc.)
    • start (e.g. starting a simulation, an animation etc.)
    • cancel (e.g. stopping a simulation, canceling an editing process, etc.)
    • send (e.g. sending a message, responding to a question etc.)
    • receive (e.g. receiving a message, getting a popup notification from LA backend etc.)
  • storage-oriented verbs (i.e. verbs that describe the creation, reading, etc. of resources)
    • open
    • create
    • update
    • delete

The objects describes the content of an action. It needs to have an object type, an identifier (which typically identifies the added/changed/removed object in the working document), and arbitrary additional content. The examples a few lines below include possible objects. To ease the developer's life, separate functions have been created that will take care of the verb, so only the object needs to be defined.

Content-oriented verbs

For the content-oriented verbs, this means the ActionLogger provides functions called logAdd(object), logRemove(object), logChange(object). As a rule of thumb, the content-oriented action logging messages should be enough to sufficient to replicate the state of the working document and to replay its changes over time. Please consider the following examples, that describe the creation, the modification and the removal of a concept in the Concept Mapper tool.

// an new concept with the default text "new concept" is created
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "new concept"
}
actionLogger.logAdd(logObject);
// the same concept (cf. "id") is then modified to hold the new term "gravity"
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "gravity"
}
actionLogger.logChange(logObject);
// the same concept is then removed again
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
}
actionLogger.logRemove(logObject);

Process-oriented verbs

Actions, that do not change the content of the working document, but describe noteworthy activities nevertheless, are logged using process-oriented verbs. To this end, the ActionLogger provides the following functions: logAccess(object), logStart(object), logCancel(object), logSend(object), logReceive(object).

// examples follow

Storage-oriented verbs

Actions that are related to storing and retrieving documents from e.g. the Vault are categorized into storage-oriented verbs. These are handled through the functions logLoad(resource), logSaveAs(resource), logSave(resource), logDelete(resource). Please note, that the parameter of the storage-oriented functions is called "resource" (instead of "object") to indicate that these functions expect a resource object, as defined here. objectType and id will be generated automatically from the information in the resource.

// examples follow

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ActionLogger Tutorial · go-lab/ils Wiki · GitHub
Skip to content

ActionLogger Tutorial

larsb edited this page Aug 7, 2014 · 26 revisions

This tutorial describes how to set up and use the ActionLogger in the context of scaffolding apps and labs in the Go-Lab project. The ActionLogger is a middleware component to ease developers the implementation of action logging features; not caring about the actual sending of actions.

Preparations

To make use of the ActionLogger, it is neccessary to include the following Javascript sources:

Creating an ActionLogger instance

To create an ActionLogger instance, an instance of the GoLabMetadataHandler has to be created first. The MetadataHandler holds information about the current user, document, tool and ILS. This metadata will be automatically added to every log action. The MetadataHandler needs to be initialized with a default set of metadata, where some items will be automatically overridden with information from the ILS metawidget. A developer has to provide a document type (e.g. "conceptMap" or "hypotheses") and a tool name (e.g. "ut.tools.conceptmapper" or "ut.tools.hypothesisScratchpad") with the default metadata set, as these information is specific for each tool.

Please note: The GoLabMetadataHandler (and the ILS library functions it is using) are implemented to operate from within an OpenSocial gadget in an ILS space. It will not work from with the ILS itself (unless modified).

Please note: Creating a MetadataHandler requires to use a callback function, since the creation requires to use aynchronous OpenSocial calls from the ILS libaray.

The following code snippet presents an example of how to create an instance of the ActionLogger:

var documentType = "newDocumentType";
var toolName = "golab.newtool";
var initialMetadata = {
"id": "",
"published": "",
"actor": {
"objectType": "person",
"id": "unknown",
"displayName": "unknown"
},
"target": {
"objectType": documentType,
"id": ut.commons.utils.generateUUID(),
"displayName": "unnamed " + documentType
},
"generator": {
"objectType": "application",
"url": window.location.href,
"id": ut.commons.utils.generateUUID(),
"displayName": toolName
},
"provider": {
"objectType": "ils",
"url": window.location.href,
"id": "unknown",
"inquiryPhase": "unknown",
"displayName": "unknown"
}
};
new window.golab.ils.metadata.GoLabMetadataHandler(initialMetadata, function(metadataHandler) {
var actionLogger = new window.ut.commons.actionlogging.ActionLogger(metadataHandler);
actionLogger.setLoggingTarget("opensocial");
// for development, using the following line might be helpful,
// as it sets the ActionLogger to log to the console for easy debugging
// actionLogger.setLoggingTarget("console");
//here, actionLogger is ready for usage
});

Using the ActionLogger

Using the ActionLogger basically means deciding on a "verb" (a plain string) and defining an "object" (in JSON format). The verb describes what has been done, whereas the object defines the content of an action. The list of valid verbs has been organized in a taxonomy, which looks as follows:

  • content-oriented verbs (i.e. verbs that describe changes in the content of a document)
    • add
    • change
    • remove
  • process-oriented verbs (i.e. verbs that don't describe a change in the working document, but denote an otherwise interesting event)
    • access (e.g. accessing a tab, changing the ILS phase, opening a help text, etc.)
    • start (e.g. starting a simulation, an animation etc.)
    • cancel (e.g. stopping a simulation, canceling an editing process, etc.)
    • send (e.g. sending a message, responding to a question etc.)
    • receive (e.g. receiving a message, getting a popup notification from LA backend etc.)
  • storage-oriented verbs (i.e. verbs that describe the creation, reading, etc. of resources)
    • open
    • create
    • update
    • delete

The objects describes the content of an action. It needs to have an object type, an identifier (which typically identifies the added/changed/removed object in the working document), and arbitrary additional content. The examples a few lines below include possible objects. To ease the developer's life, separate functions have been created that will take care of the verb, so only the object needs to be defined.

Content-oriented verbs

For the content-oriented verbs, this means the ActionLogger provides functions called logAdd(object), logRemove(object), logChange(object). As a rule of thumb, the content-oriented action logging messages should be enough to sufficient to replicate the state of the working document and to replay its changes over time. Please consider the following examples, that describe the creation, the modification and the removal of a concept in the Concept Mapper tool.

// an new concept with the default text "new concept" is created
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "new concept"
}
actionLogger.logAdd(logObject);
// the same concept (cf. "id") is then modified to hold the new term "gravity"
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "gravity"
}
actionLogger.logChange(logObject);
// the same concept is then removed again
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
}
actionLogger.logRemove(logObject);

Process-oriented verbs

Actions, that do not change the content of the working document, but describe noteworthy activities nevertheless, are logged using process-oriented verbs. To this end, the ActionLogger provides the following functions: logAccess(object), logStart(object), logCancel(object), logSend(object), logReceive(object).

// examples follow

Storage-oriented verbs

Actions that are related to storing and retrieving documents from e.g. the Vault are categorized into storage-oriented verbs. These are handled through the functions logLoad(resource), logSaveAs(resource), logSave(resource), logDelete(resource). Please note, that the parameter of the storage-oriented functions is called "resource" (instead of "object") to indicate that these functions expect a resource object, as defined here. objectType and id will be generated automatically from the information in the resource.

// examples follow

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' ActionLogger Tutorial · go-lab/ils Wiki · GitHub
Skip to content

ActionLogger Tutorial

larsb edited this page Aug 7, 2014 · 26 revisions

This tutorial describes how to set up and use the ActionLogger in the context of scaffolding apps and labs in the Go-Lab project. The ActionLogger is a middleware component to ease developers the implementation of action logging features; not caring about the actual sending of actions.

Preparations

To make use of the ActionLogger, it is neccessary to include the following Javascript sources:

Creating an ActionLogger instance

To create an ActionLogger instance, an instance of the GoLabMetadataHandler has to be created first. The MetadataHandler holds information about the current user, document, tool and ILS. This metadata will be automatically added to every log action. The MetadataHandler needs to be initialized with a default set of metadata, where some items will be automatically overridden with information from the ILS metawidget. A developer has to provide a document type (e.g. "conceptMap" or "hypotheses") and a tool name (e.g. "ut.tools.conceptmapper" or "ut.tools.hypothesisScratchpad") with the default metadata set, as these information is specific for each tool.

Please note: The GoLabMetadataHandler (and the ILS library functions it is using) are implemented to operate from within an OpenSocial gadget in an ILS space. It will not work from with the ILS itself (unless modified).

Please note: Creating a MetadataHandler requires to use a callback function, since the creation requires to use aynchronous OpenSocial calls from the ILS libaray.

The following code snippet presents an example of how to create an instance of the ActionLogger:

var documentType = "newDocumentType";
var toolName = "golab.newtool";
var initialMetadata = {
"id": "",
"published": "",
"actor": {
"objectType": "person",
"id": "unknown",
"displayName": "unknown"
},
"target": {
"objectType": documentType,
"id": ut.commons.utils.generateUUID(),
"displayName": "unnamed " + documentType
},
"generator": {
"objectType": "application",
"url": window.location.href,
"id": ut.commons.utils.generateUUID(),
"displayName": toolName
},
"provider": {
"objectType": "ils",
"url": window.location.href,
"id": "unknown",
"inquiryPhase": "unknown",
"displayName": "unknown"
}
};
new window.golab.ils.metadata.GoLabMetadataHandler(initialMetadata, function(metadataHandler) {
var actionLogger = new window.ut.commons.actionlogging.ActionLogger(metadataHandler);
actionLogger.setLoggingTarget("opensocial");
// for development, using the following line might be helpful,
// as it sets the ActionLogger to log to the console for easy debugging
// actionLogger.setLoggingTarget("console");
//here, actionLogger is ready for usage
});

Using the ActionLogger

Using the ActionLogger basically means deciding on a "verb" (a plain string) and defining an "object" (in JSON format). The verb describes what has been done, whereas the object defines the content of an action. The list of valid verbs has been organized in a taxonomy, which looks as follows:

  • content-oriented verbs (i.e. verbs that describe changes in the content of a document)
    • add
    • change
    • remove
  • process-oriented verbs (i.e. verbs that don't describe a change in the working document, but denote an otherwise interesting event)
    • access (e.g. accessing a tab, changing the ILS phase, opening a help text, etc.)
    • start (e.g. starting a simulation, an animation etc.)
    • cancel (e.g. stopping a simulation, canceling an editing process, etc.)
    • send (e.g. sending a message, responding to a question etc.)
    • receive (e.g. receiving a message, getting a popup notification from LA backend etc.)
  • storage-oriented verbs (i.e. verbs that describe the creation, reading, etc. of resources)
    • open
    • create
    • update
    • delete

The objects describes the content of an action. It needs to have an object type, an identifier (which typically identifies the added/changed/removed object in the working document), and arbitrary additional content. The examples a few lines below include possible objects. To ease the developer's life, separate functions have been created that will take care of the verb, so only the object needs to be defined.

Content-oriented verbs

For the content-oriented verbs, this means the ActionLogger provides functions called logAdd(object), logRemove(object), logChange(object). As a rule of thumb, the content-oriented action logging messages should be enough to sufficient to replicate the state of the working document and to replay its changes over time. Please consider the following examples, that describe the creation, the modification and the removal of a concept in the Concept Mapper tool.

// an new concept with the default text "new concept" is created
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "new concept"
}
actionLogger.logAdd(logObject);
// the same concept (cf. "id") is then modified to hold the new term "gravity"
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "gravity"
}
actionLogger.logChange(logObject);
// the same concept is then removed again
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
}
actionLogger.logRemove(logObject);

Process-oriented verbs

Actions, that do not change the content of the working document, but describe noteworthy activities nevertheless, are logged using process-oriented verbs. To this end, the ActionLogger provides the following functions: logAccess(object), logStart(object), logCancel(object), logSend(object), logReceive(object).

// examples follow

Storage-oriented verbs

Actions that are related to storing and retrieving documents from e.g. the Vault are categorized into storage-oriented verbs. These are handled through the functions logLoad(resource), logSaveAs(resource), logSave(resource), logDelete(resource). Please note, that the parameter of the storage-oriented functions is called "resource" (instead of "object") to indicate that these functions expect a resource object, as defined here. objectType and id will be generated automatically from the information in the resource.

// examples follow

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ActionLogger Tutorial · go-lab/ils Wiki · GitHub
Skip to content

ActionLogger Tutorial

larsb edited this page Aug 7, 2014 · 26 revisions

This tutorial describes how to set up and use the ActionLogger in the context of scaffolding apps and labs in the Go-Lab project. The ActionLogger is a middleware component to ease developers the implementation of action logging features; not caring about the actual sending of actions.

Preparations

To make use of the ActionLogger, it is neccessary to include the following Javascript sources:

Creating an ActionLogger instance

To create an ActionLogger instance, an instance of the GoLabMetadataHandler has to be created first. The MetadataHandler holds information about the current user, document, tool and ILS. This metadata will be automatically added to every log action. The MetadataHandler needs to be initialized with a default set of metadata, where some items will be automatically overridden with information from the ILS metawidget. A developer has to provide a document type (e.g. "conceptMap" or "hypotheses") and a tool name (e.g. "ut.tools.conceptmapper" or "ut.tools.hypothesisScratchpad") with the default metadata set, as these information is specific for each tool.

Please note: The GoLabMetadataHandler (and the ILS library functions it is using) are implemented to operate from within an OpenSocial gadget in an ILS space. It will not work from with the ILS itself (unless modified).

Please note: Creating a MetadataHandler requires to use a callback function, since the creation requires to use aynchronous OpenSocial calls from the ILS libaray.

The following code snippet presents an example of how to create an instance of the ActionLogger:

var documentType = "newDocumentType";
var toolName = "golab.newtool";
var initialMetadata = {
"id": "",
"published": "",
"actor": {
"objectType": "person",
"id": "unknown",
"displayName": "unknown"
},
"target": {
"objectType": documentType,
"id": ut.commons.utils.generateUUID(),
"displayName": "unnamed " + documentType
},
"generator": {
"objectType": "application",
"url": window.location.href,
"id": ut.commons.utils.generateUUID(),
"displayName": toolName
},
"provider": {
"objectType": "ils",
"url": window.location.href,
"id": "unknown",
"inquiryPhase": "unknown",
"displayName": "unknown"
}
};
new window.golab.ils.metadata.GoLabMetadataHandler(initialMetadata, function(metadataHandler) {
var actionLogger = new window.ut.commons.actionlogging.ActionLogger(metadataHandler);
actionLogger.setLoggingTarget("opensocial");
// for development, using the following line might be helpful,
// as it sets the ActionLogger to log to the console for easy debugging
// actionLogger.setLoggingTarget("console");
//here, actionLogger is ready for usage
});

Using the ActionLogger

Using the ActionLogger basically means deciding on a "verb" (a plain string) and defining an "object" (in JSON format). The verb describes what has been done, whereas the object defines the content of an action. The list of valid verbs has been organized in a taxonomy, which looks as follows:

  • content-oriented verbs (i.e. verbs that describe changes in the content of a document)
    • add
    • change
    • remove
  • process-oriented verbs (i.e. verbs that don't describe a change in the working document, but denote an otherwise interesting event)
    • access (e.g. accessing a tab, changing the ILS phase, opening a help text, etc.)
    • start (e.g. starting a simulation, an animation etc.)
    • cancel (e.g. stopping a simulation, canceling an editing process, etc.)
    • send (e.g. sending a message, responding to a question etc.)
    • receive (e.g. receiving a message, getting a popup notification from LA backend etc.)
  • storage-oriented verbs (i.e. verbs that describe the creation, reading, etc. of resources)
    • open
    • create
    • update
    • delete

The objects describes the content of an action. It needs to have an object type, an identifier (which typically identifies the added/changed/removed object in the working document), and arbitrary additional content. The examples a few lines below include possible objects. To ease the developer's life, separate functions have been created that will take care of the verb, so only the object needs to be defined.

Content-oriented verbs

For the content-oriented verbs, this means the ActionLogger provides functions called logAdd(object), logRemove(object), logChange(object). As a rule of thumb, the content-oriented action logging messages should be enough to sufficient to replicate the state of the working document and to replay its changes over time. Please consider the following examples, that describe the creation, the modification and the removal of a concept in the Concept Mapper tool.

// an new concept with the default text "new concept" is created
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "new concept"
}
actionLogger.logAdd(logObject);
// the same concept (cf. "id") is then modified to hold the new term "gravity"
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "gravity"
}
actionLogger.logChange(logObject);
// the same concept is then removed again
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
}
actionLogger.logRemove(logObject);

Process-oriented verbs

Actions, that do not change the content of the working document, but describe noteworthy activities nevertheless, are logged using process-oriented verbs. To this end, the ActionLogger provides the following functions: logAccess(object), logStart(object), logCancel(object), logSend(object), logReceive(object).

// examples follow

Storage-oriented verbs

Actions that are related to storing and retrieving documents from e.g. the Vault are categorized into storage-oriented verbs. These are handled through the functions logLoad(resource), logSaveAs(resource), logSave(resource), logDelete(resource). Please note, that the parameter of the storage-oriented functions is called "resource" (instead of "object") to indicate that these functions expect a resource object, as defined here. objectType and id will be generated automatically from the information in the resource.

// examples follow

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ActionLogger Tutorial · go-lab/ils Wiki · GitHub
Skip to content

ActionLogger Tutorial

larsb edited this page Aug 7, 2014 · 26 revisions

This tutorial describes how to set up and use the ActionLogger in the context of scaffolding apps and labs in the Go-Lab project. The ActionLogger is a middleware component to ease developers the implementation of action logging features; not caring about the actual sending of actions.

Preparations

To make use of the ActionLogger, it is neccessary to include the following Javascript sources:

Creating an ActionLogger instance

To create an ActionLogger instance, an instance of the GoLabMetadataHandler has to be created first. The MetadataHandler holds information about the current user, document, tool and ILS. This metadata will be automatically added to every log action. The MetadataHandler needs to be initialized with a default set of metadata, where some items will be automatically overridden with information from the ILS metawidget. A developer has to provide a document type (e.g. "conceptMap" or "hypotheses") and a tool name (e.g. "ut.tools.conceptmapper" or "ut.tools.hypothesisScratchpad") with the default metadata set, as these information is specific for each tool.

Please note: The GoLabMetadataHandler (and the ILS library functions it is using) are implemented to operate from within an OpenSocial gadget in an ILS space. It will not work from with the ILS itself (unless modified).

Please note: Creating a MetadataHandler requires to use a callback function, since the creation requires to use aynchronous OpenSocial calls from the ILS libaray.

The following code snippet presents an example of how to create an instance of the ActionLogger:

var documentType = "newDocumentType";
var toolName = "golab.newtool";
var initialMetadata = {
"id": "",
"published": "",
"actor": {
"objectType": "person",
"id": "unknown",
"displayName": "unknown"
},
"target": {
"objectType": documentType,
"id": ut.commons.utils.generateUUID(),
"displayName": "unnamed " + documentType
},
"generator": {
"objectType": "application",
"url": window.location.href,
"id": ut.commons.utils.generateUUID(),
"displayName": toolName
},
"provider": {
"objectType": "ils",
"url": window.location.href,
"id": "unknown",
"inquiryPhase": "unknown",
"displayName": "unknown"
}
};
new window.golab.ils.metadata.GoLabMetadataHandler(initialMetadata, function(metadataHandler) {
var actionLogger = new window.ut.commons.actionlogging.ActionLogger(metadataHandler);
actionLogger.setLoggingTarget("opensocial");
// for development, using the following line might be helpful,
// as it sets the ActionLogger to log to the console for easy debugging
// actionLogger.setLoggingTarget("console");
//here, actionLogger is ready for usage
});

Using the ActionLogger

Using the ActionLogger basically means deciding on a "verb" (a plain string) and defining an "object" (in JSON format). The verb describes what has been done, whereas the object defines the content of an action. The list of valid verbs has been organized in a taxonomy, which looks as follows:

  • content-oriented verbs (i.e. verbs that describe changes in the content of a document)
    • add
    • change
    • remove
  • process-oriented verbs (i.e. verbs that don't describe a change in the working document, but denote an otherwise interesting event)
    • access (e.g. accessing a tab, changing the ILS phase, opening a help text, etc.)
    • start (e.g. starting a simulation, an animation etc.)
    • cancel (e.g. stopping a simulation, canceling an editing process, etc.)
    • send (e.g. sending a message, responding to a question etc.)
    • receive (e.g. receiving a message, getting a popup notification from LA backend etc.)
  • storage-oriented verbs (i.e. verbs that describe the creation, reading, etc. of resources)
    • open
    • create
    • update
    • delete

The objects describes the content of an action. It needs to have an object type, an identifier (which typically identifies the added/changed/removed object in the working document), and arbitrary additional content. The examples a few lines below include possible objects. To ease the developer's life, separate functions have been created that will take care of the verb, so only the object needs to be defined.

Content-oriented verbs

For the content-oriented verbs, this means the ActionLogger provides functions called logAdd(object), logRemove(object), logChange(object). As a rule of thumb, the content-oriented action logging messages should be enough to sufficient to replicate the state of the working document and to replay its changes over time. Please consider the following examples, that describe the creation, the modification and the removal of a concept in the Concept Mapper tool.

// an new concept with the default text "new concept" is created
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "new concept"
}
actionLogger.logAdd(logObject);
// the same concept (cf. "id") is then modified to hold the new term "gravity"
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "gravity"
}
actionLogger.logChange(logObject);
// the same concept is then removed again
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
}
actionLogger.logRemove(logObject);

Process-oriented verbs

Actions, that do not change the content of the working document, but describe noteworthy activities nevertheless, are logged using process-oriented verbs. To this end, the ActionLogger provides the following functions: logAccess(object), logStart(object), logCancel(object), logSend(object), logReceive(object).

// examples follow

Storage-oriented verbs

Actions that are related to storing and retrieving documents from e.g. the Vault are categorized into storage-oriented verbs. These are handled through the functions logLoad(resource), logSaveAs(resource), logSave(resource), logDelete(resource). Please note, that the parameter of the storage-oriented functions is called "resource" (instead of "object") to indicate that these functions expect a resource object, as defined here. objectType and id will be generated automatically from the information in the resource.

// examples follow

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); ActionLogger Tutorial · go-lab/ils Wiki · GitHub
Skip to content

ActionLogger Tutorial

larsb edited this page Aug 7, 2014 · 26 revisions

This tutorial describes how to set up and use the ActionLogger in the context of scaffolding apps and labs in the Go-Lab project. The ActionLogger is a middleware component to ease developers the implementation of action logging features; not caring about the actual sending of actions.

Preparations

To make use of the ActionLogger, it is neccessary to include the following Javascript sources:

Creating an ActionLogger instance

To create an ActionLogger instance, an instance of the GoLabMetadataHandler has to be created first. The MetadataHandler holds information about the current user, document, tool and ILS. This metadata will be automatically added to every log action. The MetadataHandler needs to be initialized with a default set of metadata, where some items will be automatically overridden with information from the ILS metawidget. A developer has to provide a document type (e.g. "conceptMap" or "hypotheses") and a tool name (e.g. "ut.tools.conceptmapper" or "ut.tools.hypothesisScratchpad") with the default metadata set, as these information is specific for each tool.

Please note: The GoLabMetadataHandler (and the ILS library functions it is using) are implemented to operate from within an OpenSocial gadget in an ILS space. It will not work from with the ILS itself (unless modified).

Please note: Creating a MetadataHandler requires to use a callback function, since the creation requires to use aynchronous OpenSocial calls from the ILS libaray.

The following code snippet presents an example of how to create an instance of the ActionLogger:

var documentType = "newDocumentType";
var toolName = "golab.newtool";
var initialMetadata = {
"id": "",
"published": "",
"actor": {
"objectType": "person",
"id": "unknown",
"displayName": "unknown"
},
"target": {
"objectType": documentType,
"id": ut.commons.utils.generateUUID(),
"displayName": "unnamed " + documentType
},
"generator": {
"objectType": "application",
"url": window.location.href,
"id": ut.commons.utils.generateUUID(),
"displayName": toolName
},
"provider": {
"objectType": "ils",
"url": window.location.href,
"id": "unknown",
"inquiryPhase": "unknown",
"displayName": "unknown"
}
};
new window.golab.ils.metadata.GoLabMetadataHandler(initialMetadata, function(metadataHandler) {
var actionLogger = new window.ut.commons.actionlogging.ActionLogger(metadataHandler);
actionLogger.setLoggingTarget("opensocial");
// for development, using the following line might be helpful,
// as it sets the ActionLogger to log to the console for easy debugging
// actionLogger.setLoggingTarget("console");
//here, actionLogger is ready for usage
});

Using the ActionLogger

Using the ActionLogger basically means deciding on a "verb" (a plain string) and defining an "object" (in JSON format). The verb describes what has been done, whereas the object defines the content of an action. The list of valid verbs has been organized in a taxonomy, which looks as follows:

  • content-oriented verbs (i.e. verbs that describe changes in the content of a document)
    • add
    • change
    • remove
  • process-oriented verbs (i.e. verbs that don't describe a change in the working document, but denote an otherwise interesting event)
    • access (e.g. accessing a tab, changing the ILS phase, opening a help text, etc.)
    • start (e.g. starting a simulation, an animation etc.)
    • cancel (e.g. stopping a simulation, canceling an editing process, etc.)
    • send (e.g. sending a message, responding to a question etc.)
    • receive (e.g. receiving a message, getting a popup notification from LA backend etc.)
  • storage-oriented verbs (i.e. verbs that describe the creation, reading, etc. of resources)
    • open
    • create
    • update
    • delete

The objects describes the content of an action. It needs to have an object type, an identifier (which typically identifies the added/changed/removed object in the working document), and arbitrary additional content. The examples a few lines below include possible objects. To ease the developer's life, separate functions have been created that will take care of the verb, so only the object needs to be defined.

Content-oriented verbs

For the content-oriented verbs, this means the ActionLogger provides functions called logAdd(object), logRemove(object), logChange(object). As a rule of thumb, the content-oriented action logging messages should be enough to sufficient to replicate the state of the working document and to replay its changes over time. Please consider the following examples, that describe the creation, the modification and the removal of a concept in the Concept Mapper tool.

// an new concept with the default text "new concept" is created
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "new concept"
}
actionLogger.logAdd(logObject);
// the same concept (cf. "id") is then modified to hold the new term "gravity"
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
"content": "gravity"
}
actionLogger.logChange(logObject);
// the same concept is then removed again
var logObject = {
"objectType": "concept",
"id": "613028e9-c037-46a6-a196-5a590a5505a6",
}
actionLogger.logRemove(logObject);

Process-oriented verbs

Actions, that do not change the content of the working document, but describe noteworthy activities nevertheless, are logged using process-oriented verbs. To this end, the ActionLogger provides the following functions: logAccess(object), logStart(object), logCancel(object), logSend(object), logReceive(object).

// examples follow

Storage-oriented verbs

Actions that are related to storing and retrieving documents from e.g. the Vault are categorized into storage-oriented verbs. These are handled through the functions logLoad(resource), logSaveAs(resource), logSave(resource), logDelete(resource). Please note, that the parameter of the storage-oriented functions is called "resource" (instead of "object") to indicate that these functions expect a resource object, as defined here. objectType and id will be generated automatically from the information in the resource.

// examples follow

Clone this wiki locally