Add to Visual Task Board – Any record (List context)

In a previous article, I explored the possibility of adding any record to a Visual Task Board from a form.

So the next obvious step is to try to do the same in the list view.

Will it be possible to do that? (Spoiler alert: Yes!)

The idea

We can use Personal tasks [vtb_task] as an interface between the VTB Card [vtb_card] and the actual record

Instead of:

VTB Card [vtb_card] → Target record [task]

We can have:

VTB Card [vtb_card] → Personal Task [vtb_task] → Target record [any record in the system]

The code

How do we do that?

With a single UI Action and relying on the out of the box functionality.

Create a new Global UI action (easier if you just copy the OOTB one “Add to Visual Task Board”).

Name: Add to VTB (non-task)

Type: List context menu.

Action name: add_to_vtb_list_context_menu_non_task

Onclick:

openAddToBoardDialogListContext()
Code language: JavaScript (javascript)

Condition:

gs.hasRole('admin')
Code language: JavaScript (javascript)

Script:

function openAddToBoardDialogListContext() {
	//var taskSysID = rowSysId; //We won't use the selected record as the target record
	var tableName = g_list.getTableName();
	
	var gr = new GlideRecord('vtb_task');//TODO: Replace the Client-side GlideRecord
	var shortDescription = g_list.getCell(rowSysId,'short_description') || g_list.getCell(rowSysId,'name') || g_list.getCell(rowSysId,'number');
	shortDescription = shortDescription ? shortDescription.innerText : 'No short description defined';
	
	gr.short_description = shortDescription;
	
	var taskSysID = gr.insert();
	
	var grVTBComment = new GlideRecord('sys_journal_field');
	grVTBComment.name = 'vtb_task';
	grVTBComment.element = 'comments';
	grVTBComment.element_id = taskSysID;
	grVTBComment.value = '[code]<a href="' + tableName + '.do?sys_id=' + rowSysId + '" target="_blank">' + shortDescription + '</a>[/code]';
	grVTBComment.insert();
	
	//The code below is exactly the same that you can find in the OOTB "Add to Visual Task Board" UI Action
	
var o = new GlideOverlay({
		title : "Choose a Visual Task board",
		iframe : "$vtb_add_to_board.do?sysparm_record_id=" + taskSysID + "&sysparm_table_name=" + tableName + "&sysparm_nostack",
			allowOverflowX : true,
		height : 1000,
		width : 2000,
		messages : "",
		onAfterLoad: function() {
			document.getElementsByClassName('gb_close')[0].focus();
		}
	});
	o.setPreference("sysparm_record_id", typeof rowSysId == 'undefined' ? taskSysID : rowSysId);
	o.setPreference("sysparm_table_name", tableName);
	o.setOnBeforeClose(displayMessageStashListContext);
	o.render();
	
}

function displayMessageStashListContext() {
	if (!this.getData("messages"))
		return;
	
	GlideUI.get().clearOutputMessages();
	
	var m = this.getData("messages");
    if (m.messages.info) {
		for(var i = 0; i < m.messages.info.length; i++) {
			var msg = m.messages.info[i];
			if(msg)
				addFormMessage(msg, "info", 0);
		}
	}
	
	if (m.messages.error) {
		for(var i = 0; i < m.messages.error.length; i++) {
			var msg = m.messages.error[i];
			if(msg)
				addFormMessage(msg, "error", 0);
		}
	}
}

function addFormMessage(msg, type, id) {
	    GlideUI.get().addOutputMessage({msg: msg, type: type, id: id});
		var scrollDiv = getFormContentParent();
		scrollDiv.scrollTop = 0;
}

Code language: JavaScript (javascript)

Result

Now, we can add anything to a board.

Why don’t we use our newly created UI Action to test itself?

1 thought on “Add to Visual Task Board – Any record (List context)”

  1. Pingback: Add to Visual Task Board – Any record (List choice) (single-card) » Ruben Ferrero

Comments are closed.