function gm_Supplement_Copy() {
var lockedById = document.thisItem.getProperty("locked_by_id");
var inn = new top.Innovator();
var workOrderItemType = document.thisItem.newItem("ItemType", "get");
workOrderItemType.setProperty("keyed_name", "gm_Work Order");
workOrderItemType = workOrderItemType.apply();
var rels = document.thisItem.newItem("RelationshipType", "get");
rels.setProperty("source_id", workOrderItemType.getID());
for (var i = 0; i < rels.getItemCount(); i++)
var rel = rels.getItemByIndex(i);
document.thisItem.fetchRelationships(rel.getProperty("keyed_name"));
var copy = document.thisItem.clone(true);
var parentCoord = inn.newItem("gm_Coordination", "get");
parentCoord.setProperty("_work_order", document.itemID);
parentCoord.setProperty("classification", "Supplement");
parentCoord = parentCoord.apply();
if (parentCoord.getItemCount() === 0) {
parentCoord = inn.newItem("gm_Coordination", "add");
parentCoord.setProperty("_work_order", document.itemID);
parentCoord.setProperty("classification", "Supplement");
parentCoord = parentCoord.apply();
var relatedCoord = inn.newItem("gm_Coordination", "add");
relatedCoord.setProperty("_work_order", copy.getID());
relatedCoord.setProperty("classification", "Supplement");
relatedCoord = relatedCoord.apply();
var body = "<source_id>" + parentCoord.getID() + "</source_id><related_id>" + relatedCoord.getID() + "</related_id>";
var check = inn.applyMethod("gm_coordination attach", body);
top.aras.AlertError(check.getErrorString());
top.aras.uiReShowItemEx(document.itemID, document.item, "tab view");
top.aras.AlertSuccess(copy.getProperty("keyed_name") + " created successfully.");
<!-- (c) Copyright by Aras Corporation, 2004-2014. -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
@import "../javascript/dojo/resources/dojo.css";
@import "../javascript/dijit/themes/claro/claro.css";
@import "../javascript/dojox/grid/resources/claroGrid.css";
@import "../javascript/dojox/form/resources/CheckedMultiSelect.css";
@import "../javascript/include.aspx?classes=common.css";
@import "../styles/default.css";
display: table-cell !important;
border-top: 0px solid !important;
background-color: rgba(255, 255, 255, 0.9);
border: 1px dashed rgb(179, 179, 179);
.dropboxInternalContainer{
.dropboxInternalContainer img{
<script type="text/javascript" src="../javascript/include.aspx?classes=/dojo.js" data-dojo-config="isDebug: false, parseOnLoad: false, baseUrl:'../javascript/dojo', async: true"></script>
<script type="text/javascript" src="../javascript/dojo/commonForToolbarAndGrid.js"></script>
<script type="text/javascript" src="../javascript/include.aspx?files=TopWindowHelper&classes=DragAndDrop,ScriptSet2,ScriptSet6"></script>
<script type="text/javascript">
var topWindow_Experimental = TopWindowHelper.getMostTopWindowWithAras(window),
aras = topWindow_Experimental.aras;
var scripts_url = (aras) ? aras.getScriptsURL() : "";
if (scripts_url) document.writeln('<base HREF="' + scripts_url + '" ></base>');
window.getComputedStyleNative = window.getComputedStyle;
window.getComputedStyle = function (element, pseudoElt) {
return window.getComputedStyleNative(element, pseudoElt) || topWindow_Experimental.getComputedStyle(element, pseudoElt);
<script type="text/javascript">
var toolbarReady = false,
FilePropertyManager = null,
relationships = parent.relationships,
lookUp = showInputHelperDialog,
gridResizeHelper = { diff: 0, repeatTimer: null };
function canEditCell(rowId, field) {
var col = fieldsArr.indexOf(field);
if (!propsArr[col] || propsArr[col].DRL === "L") {
var isDescBy = (propsArr[col].DRL === "D");
if (propsArr[col].data_type === "foreign" && field !== "_ppat_dialog_part_number_D") {
checkThatItemTypePropsLoaded();
var getItem = function (item, dlr, rowId) {
return item.selectSingleNode('Relationships/Item[@id="' + rowId + '"]');
} else if (dlr === "R") {
return item.selectSingleNode('Relationships/Item[@id="' + rowId + '"]/related_id/Item')
var itm = getItem(item, propsArr[col].DRL, rowId);
if (propsArr[col].DRL === "R" && !itm && item.selectSingleNode('Relationships/Item[@id="' + rowId + '"]/related_id')) {
} else if (!itm || itm.getAttribute("loadedPartialy") !== "0") {
onSelectItem(rowId, col, true, true, true);
itm = getItem(item, propsArr[col].DRL, rowId);
if (!itm || itm.getAttribute("action") === "delete" || itm.getAttribute("action") === "purge") {
var RelTypeIT = (propsArr[col].DRL === "R") ? RelatedItemType_Nd : DescByItemType_Nd;
var propNm = propsArr[col].name;
var propNd = RelTypeIT.selectSingleNode('Relationships/Item[@type="Property" and name="' + propNm + '"]');
var readonly = (aras.getItemProperty(propNd, "readonly") === "1");
var canEditCell = !readonly && (isEditMode && isDescBy || (propsArr[col].DRL === "R" && (getLockedStatusStr(rowId) === "user" ||
(hasRelatedItem(rowId) && aras.isTempEx(system_getRelatedItem(rowId))))));
var tryEditCell = (!readonly && !canEditCell && isEditMode && propsArr[col].DRL === "R" && (RELATED_IS_DEPENDENT == true));
if ("boolean" === typeof (grid.items_Experimental.get(rowId, "value", field))) {
var propDT = propsArr[currSelCol].data_type;
var cell = grid.cells(currSelRowId, currSelCol);
var prevVal = systemGetValueForCurrentCell();
if (!handleCellEvent("oneditstart", rowId, col)) {
} else if (tryEditCell) {
if (!handleCellEvent("oneditstart", rowId, col)) {
var tmpRes = (aras.isTempEx(itm) || aras.isLocked(itm));
var isLocked = lockRelatedItem(true);
grid.cells(rowId, col).cellNod_Experimental.click();
grid.cells(rowId, col).cellNod_Experimental.click();
currSelCell = grid.Cells(rowId, col);
} else if (propDT == "formatted text") {
showHTMLEditorDialog("false");
if (propsArr[col].data_type == "filter list") {
var RelTypeIT = aras.getItemProperty(RelType_Nd, ("R" === propsArr[col].DRL) ? "related_id" : "relationship_id");
var filterValue = getFilterValue(rowId, col) || "";
var resObj = aras.uiGetFilteredObject4Grid(RelTypeIT, propsArr[col].name, filterValue);
grid.columns_Experimental.set(field, "comboList", resObj.values, resObj.labels);
var propSource_ITName = "";
if (RelType_Nm == "Property" && isDescBy) {
if (propNm == "is_required" && aras.getItemProperty(itm, "data_type") === "foreign") {
} else if (propNm == "data_source") {
propSource_ITName = aras.getItemProperty(itm, "data_type");
if (propSource_ITName == "foreign") {
setTimeout("showForeignPropDialog()", 1);
} else if (propSource_ITName != "item") {
if (propSource_ITName.search(/^list$|^color list$|^filter list$|^mv_list$/) == 0) {
propSource_ITName = "List";
else if (propSource_ITName == "sequence") {
propSource_ITName = "Sequence";
setTimeout('showDialog("' + propSource_ITName + '")', 1);
} else if (propNm == "pattern" && aras.getItemProperty(itm, "data_type") == "filter list") {
var props = item.selectNodes('Relationships/Item[@type="Property" and (not(@action) or (@action!="delete" and @action!="purge"))]');
for (var i = 0; i < props.length; i++) {
var propNm = aras.getItemProperty(props[i], "name");
grid.columns_Experimental.set(field, "editType", "FilterComboBox");
grid.columns_Experimental.set(field, "comboList", _listVals);
} else if (propNm == "class_path") {
setTimeout("showClassPathDialog()");
} else if (propNm == "classification" || (propNm == "form_classification" && RelType_Nm == "View") || (propNm == "class_path" && (RelType_Nm == "ItemType Life Cycle" || RelType_Nm == "Can Add" || RelType_Nm == "DiscussionTemplate"))) {
setTimeout("showClassificationDialog('" + propNm + "')");
if (propNm == "source_id" && RelType_Nm == "RelationshipType") {
if (propNm == "related_id" && RELATED_IS_DEPENDENT == true) {
propSource_ITName = aras.getItemTypeName(propsArr[col].data_source);
if (propSource_ITName == "File") {
grid.columns_Experimental.set(field, "editType", "InputHelper");
bKEYEDNAME_INPUT_IS_IN_PROGRESS = true;
showColorDialog(prevVal);
showTextarea(canEditCell);
var re = /^<img src=["']([^'"]*)['"]/;
showImageDialog(prevVal);
showHTMLEditorDialog(canEditCell);
if (languagesCount > 1) {
grid.columns_Experimental.set(field, "editType", "InputHelperTextBox");
if (excep != zeroError) {
function validateCell(rowId, field, value) {
if ("input_row" === rowId) {
var col = fieldsArr.indexOf(field);
var propDT = propsArr[col].data_type;
var RelTypeIT = (propsArr[col].DRL === "R") ? RelatedItemType_Nd : DescByItemType_Nd;
var propSource_ITName = aras.getItemTypeName(propsArr[col].data_source);
var tmpItem = aras.uiGetItemByKeyedName(propSource_ITName, value, true);
return !(!tmpItem && value);
var propNd = RelTypeIT.selectSingleNode('Relationships/Item[@type="Property" and name="' + propsArr[col].name + '"]');
data_type: propsArr[col].data_type,
pattern: aras.getItemProperty(propNd, "pattern"),
is_required: (aras.getItemProperty(propNd, "is_required") === "1"),
stored_length: parseInt(aras.getItemProperty(propNd, "stored_length"))
value = aras.calcMD5(value);
if (!aras.isPropertyValueValid(propertyDef, value, "invariantLocale")) {
grid.edit_Experimental.setErrorMessage(aras.ValidationMsg);
window.addEventListener("keydown", function (ev) {
isAltKeyPressed = ev.altKey;
window.addEventListener("keyup", function (ev) {
isAltKeyPressed = ev.altKey;
window.addEventListener("resize", function () {
resize_searchContainer();
var mutationHandler = function(mutation) {
var target = mutation.target;
if ((target.tagName == "DIV" || target.tagName == "IFRAME") &&
(target.id == "searchPlaceholder" || target.id == "95A2002E5AD84B9D8B2FA50B742C5973")) {
if (gridResizeHelper.repeatTimer) {
window.clearTimeout(gridResizeHelper.repeatTimer);
delete gridResizeHelper.repeatTimer;
gridResizeHelper.repeatTimer = window.setTimeout(function () {
if (window.MutationObserver) {
var observer = new MutationObserver(function(mutations) {
mutations.forEach(mutationHandler)
observer.observe(document.getElementById("searchPlaceholder"), { attributes: true });
document.getElementById("searchPlaceholder").addEventListener("DOMAttrModified", function (event) {
if ("attrChange" in event && (event.attrChange == MutationEvent.MODIFICATION || event.attrChange == MutationEvent.ADDITION)) {
if (topWindow_Experimental.updateMenuState) {
topWindow_Experimental.updateMenuState();
registerTopMenuEventsHandlers();
window.addEventListener("beforeunload", onbeforeunload_handler);
window.addEventListener("DOMContentLoaded", function () {
.then(createFilePropertyManager)
.then(createGridContainer)
.then(function() { calculateSortPriority(aras.getItemProperty(RelType_Nd, "grid_view")); })
function createToolbar() {
return new Promise(function(resolve) {
var virtualToolbarNode = document.createDocumentFragment();
clientControlsFactory.createControl("Aras.Client.Controls.Public.Toolbar", { id: "top_toolbar", connectNode: virtualToolbarNode }, function(control) {
document.toolbar = toolbar;
clientControlsFactory.on(toolbar, {
"onClick": function(tbItem) {
var tbId = tbItem.getId();
if (tbId != "search" && tbId != "newsearch" && tbId != "stop_search" && tbId != "select_all" && tbId != "next_page" && tbId != "prev_page") {
onToolbarButtonClick(tbItem);
"onDropDownItemClick": onRelationshipsMenuClickItem
document.getElementById('toolbar_container_cell').appendChild(virtualToolbarNode);
document.getElementById('toolbarContainer').style.display = "block";
function createFilePropertyManager() {
return new Promise(function(resolve) {
clientControlsFactory.createControl("Aras.Client.Controls.Experimental.ExternalCellWidget.FilePropertyManager", { aras: aras }, function(control) {
FilePropertyManager = control;
clientControlsFactory.on(FilePropertyManager, {
"onCellEditableCheck": onFileEditableCheck,
"onCellNullableCheck": onFileNullableCheck,
"onCellEnabledCheck": onFileEnabledCheck,
"onApplyEdit": onWidgetApplyEdit
function createGridContainer() {
return new Promise(function(resolve) {
var virtualGridNode = document.createDocumentFragment();
clientControlsFactory.createControl("Aras.Client.Controls.Public.GridContainer", { connectNode: virtualGridNode, onStartSearch_Experimental: doSearch, canEdit_Experimental: canEditCell, validateCell_Experimental: validateCell }, function(control) {
grid = gridApplet = control;
grid.setColumnTypeManager_Experimental("File", FilePropertyManager);
clientControlsFactory.on(grid.grid_Experimental, {
"onHeaderCellContextMenu": onRelshipsHeaderCellContextMenu,
"onHeaderContextMenu": onRelshipsHeaderContextMenu
clientControlsFactory.on(grid, {
"gridHeaderMenuClick_Experimental": onRelshipsHeaderMenuClicked,
"gridDoubleClick": onDoubleClick,
"gridXmlLoaded": onXmlLoaded,
"gridClick": onSelectItem,
"gridLinkClick": function(linkVal) {
linkVal = linkVal.replace(/'/g, "");
var typeName = linkVal.split(",")[0];
var id = linkVal.split(",")[1];
"onInputHelperShow_Experimental": relshipsGrid_showInputHelperDialog,
"onStartEdit_Experimental": startCellEditRG,
"onApplyEdit_Experimental": applyCellEditRG,
"onCancelEdit_Experimental": onCancelEditHandler,
"gridMenuInit": function(rowID, col) {
if (window.onMenuCreate) {
return window.onMenuCreate(rowID, col);
inArgs.propsArr = propsArr;
inArgs.CONTROLS_STATE_ARRAY = CONTROLS_STATE_ARRAY;
inArgs.RELATED_IT_NAME = RELATED_IT_NAME;
inArgs.RELATED_IT_LABEL = RELATED_IT_LABEL;
inArgs.RelType_Nd = RelType_Nd;
inArgs.RelType_Nm = RelType_Nm;
inArgs.RelType_Lbl = RelType_Lbl;
inArgs.DescByItemType_Nd = DescByItemType_Nd;
inArgs.RelatedItemType_Nd = RelatedItemType_Nd;
inArgs.itemType = DescByItemType_Nd;
inArgs.onSelectItem = onSelectItem;
inArgs.updateControls = updateControls;
inArgs.hasRelatedItem = hasRelatedItem;
inArgs.computeCorrectControlState = computeCorrectControlState;
inArgs.isSpecialItemType = isSpecialItemType;
inArgs.isWorkflowTool = isWorkflowTool;
inArgs.isFunctionDisabled = isFunctionDisabled;
inArgs.getPasteFlg = getPasteFlg;
inArgs.getUnlockFlg = getUnlockFlg;
inArgs.relationshipTypeActions = relationshipTypeActions;
inArgs.relationshipActions = relationshipActions;
return topWindow_Experimental.cui.fillPopupMenu("PopupMenuRelationshipGrid", grid.getMenu_Experimental(), inArgs);
"gridMenuClick": function(cmdId, rowId, col) {
return onRelationshipPopupMenuClicked(cmdId, rowId, col);
"gridKeyPress": onKeyPressed
clientControlsFactory.on(grid.items_Experimental, {
topWindow_Experimental.cui.initPopupMenu(grid.contexMenu_Experimental);
topWindow_Experimental.cui.initPopupMenu(grid.headerContexMenu_Experimental);
document.getElementById('gridTD').appendChild(virtualGridNode);
toolbar.refreshToolbar_Experimental();
aras.registerEventHandler("ItemLock", window, relatedItemLockListener);
aras.registerEventHandler("ItemSave", window, ItemSaveListener);
function onFileEditableCheck(rowId, columnName) {
var columnIndex = fieldsArr.indexOf(columnName),
isPropertyCheckPassed = propsArr[columnIndex] && propsArr[columnIndex].data_type != "foreign";
if (isPropertyCheckPassed) {
var isRelatedIdFile = (relatedItemTypeName == "File" && propsArr[columnIndex].name == "related_id");
isRelatedItemProperty = propsArr[columnIndex].DRL == "R",
selectExpression = "Relationships/Item[@id=\"" + rowId + "\"]" + (isRelatedItemProperty ? "/related_id/Item" : ""),
rowItemNode = item.selectSingleNode(selectExpression);
var isItemEditable = aras.isNew(rowItemNode) || !isRelatedItemProperty || aras.isLockedByUser(rowItemNode),
itemAction = rowItemNode.getAttribute("action"),
isItemActionAllowed = (itemAction != "delete" && itemAction != "purge");
if (isItemEditable && isItemActionAllowed) {
var relatedTypeDescriptor = isRelatedItemProperty ? RelatedItemType_Nd : DescByItemType_Nd,
propertyName = propsArr[columnIndex].name,
propertyNode = relatedTypeDescriptor ? relatedTypeDescriptor.selectSingleNode("Relationships/Item[@type=\"Property\" and name=\"" + propertyName + "\"]") : null;
if (!propertyNode || aras.getItemProperty(propertyNode, "readonly") === "1") {
function onFileNullableCheck(rowId, columnName) {
var columnIndex = fieldsArr.indexOf(columnName),
isRelatedIdFile = propsArr[columnIndex] ? (relatedItemTypeName == "File" && propsArr[columnIndex].name == "related_id") : false;
return isRelatedIdFile ? (hasRelatedItem(rowId) && replaceToNull) : true;
function onFileEnabledCheck(rowId, columnName) {
var columnIndex = fieldsArr.indexOf(columnName),
isPropertyCheckPassed = propsArr[columnIndex];
if (propsArr[columnIndex]) {
var isRelatedItemProperty = propsArr[columnIndex].DRL == "R",
selectExpression = "Relationships/Item[@id=\"" + rowId + "\"]" + (isRelatedItemProperty ? "/related_id/Item" : ""),
rowItemNode = item.selectSingleNode(selectExpression);
return rowItemNode.getAttribute("discover_only") != "1";
function onWidgetApplyEdit(rowId, fieldName, newValue) {
var propertyIndex = fieldsArr.indexOf(fieldName),
isRelatedIdFile = propsArr[propertyIndex] ? (relatedItemTypeName == "File" && propsArr[propertyIndex].name == "related_id") : false;
if (handleCellEvent("oneditstart", rowId, propertyIndex)) {
removeRelatedItem(rowId);
changeRelationship(false, newValue, rowId);
currSelCell = grid.cells(rowId, propertyIndex);
currSelCol = propertyIndex;
setupProperty(newValue, true);
handleCellEvent("onchangecell", rowId, propertyIndex);
handleCellEvent("oneditfinish", rowId, propertyIndex);
var callback4NewCmd = null;
var callbackFunction4NewCmd_data_bf = true;
function addNewRowEvent(id) {
callback4NewCmd(id, callbackFunction4NewCmd_data_bf);
callbackFunction4NewCmd_data_bf = true;
<script type="text/javascript">
var mainWnd = aras.getMainWindow();
mainWnd.Cache = mainWnd.aras.newObject();
var userID = aras.getUserID();
var loginName = aras.getLoginName();
var toolbarLoaded = false;
var activeToolbar = null;
var PickRelatedOption = undefined;
var CreateRelatedOption = undefined;
var NoRelatedOption = undefined;
var related_visible = true;
var replaceButtonEnabled = false;
var replaceToNull = true;
var redlineController = new RedlineController();
var varName_searchModeId;
var Cache = new Object();
Cache.Lists = mainWnd.aras.newObject();
var FilesCache = new Object();
var relatedItemTypeName = "";
var relationshipTypeName = "";
var RelType_ID = QueryString("relTypeID").toString();
var WorkFlowProc = QueryString("WorkFlowProc").toString();
var MAX_OCCURS, MIN_OCCURS;
var RELATED_IT_NAME = "";
var RELATED_IT_LABEL = "";
var RELATED_IS_DEPENDENT = false;
var DescByItemType_ID = "";
var DescByItemType_Nd = null;
var DescByVisibleProps = null;
var RelatedItemType_ID = "";
var RelatedItemType_Nd = null;
var RelatedVisibleProps = null;
var bSHOW_INPUT_ROW = false;
var CAN_RUN_SEARCH = false;
var isToolbarUsed = (QueryString("toolbar").toString() == "1");
var CUSTOM_TOOLBAR_SRC = QueryString("custom_toolbar_src").toString();
var bGridStarted = false;
var bKEYEDNAME_INPUT_IS_IN_PROGRESS = false;
var itemID = QueryString("itemID").toString();
var itemTypeName = QueryString("ITName").toString();
var itemTypeId = aras.getItemTypeId(itemTypeName);
var relationshipTypeActions = new Object();
var relationshipActions = new Object();
var propsArr = new Array();
var AUTO_SEARCH_FLAG = false;
var CONTROLS_STATE_ARRAY = new Object();
var ExcludedPopupMenuEntries = new Object();
var ExplicitPopupMenuEntriesVisibilities = new Object();
var ExplicitToolbarIconsEnabling = new Object();
var LATEST_DOM_FROM_SERVER = aras.createXMLDocument();
LATEST_DOM_FROM_SERVER.loadXML("<latest_result/>");
var isEditMode = (QueryString("editMode").toString() == "1");
var isPopupDisabled = (QueryString("popupDisabled").toString() == "1");
var deletedFont_const = "Arial-italic-8";
var deletedTextColor_const = "#b0b0b0";
var actionsMenuInitialized = false;
var rowEventsNames = new Array();
var rowEventsMethods_code = new Array();
var cellEventsNames = new Array();
var cellEventsMethods_code = new Array();
var addRowInProgress_Number = 0;
var isGridSortingDefined = false;
var FileIT_ID_const = aras.getFileItemTypeID();
searchLocation = "Relationships Grid";
aras.AlertError(aras.getResource("", "relationshipsgrid.initialize_relshipgrid"), null, null, window);
topWindow_Experimental.close();
function onInitialize() {
if (!RelType_ID || !aras.getMainWindow()) {
RelType_Nd = aras.getRelationshipType(RelType_ID).node;
RelType_Nm = aras.getItemProperty(RelType_Nd, "name");
RelType_Lbl = aras.getItemProperty(RelType_Nd, "label");
RelType_Lbl = RelType_Nm;
currQryItem = aras.newQryItem(RelType_Nm);
relatedItemTypeName = RELATED_IT_NAME;
relationshipTypeName = RelType_Nm;
if (aras.getLanguagesResultNd() && aras.getLanguagesResultNd().selectNodes("Item[@type='Language']")) {
languagesCount = aras.getLanguagesResultNd().selectNodes("Item[@type='Language']").length;
bSHOW_INPUT_ROW = !isSearchRowEmpty();
CAN_RUN_SEARCH = bSHOW_INPUT_ROW;
function markPopupMenuEntryExcluded(entryId, isExcluded, doResetEntryVal) {
updateGlobalHash(ExcludedPopupMenuEntries, entryId, isExcluded, doResetEntryVal, true);
function markPopupMenuEntryVisible(entryId, isVisible, doReset) {
updateGlobalHash(ExplicitPopupMenuEntriesVisibilities, entryId, isVisible, doReset, true);
function markToolbarIconEnabled(iconId, isEnabled, doReset) {
updateGlobalHash(ExplicitToolbarIconsEnabling, iconId, isEnabled, doReset, true);
function updateGlobalHash(hashObj, entryId, val, doReset, defaultVal) {
function computeColWidhtOrder() {
DescByItemType_ID = aras.getItemProperty(RelType_Nd, "relationship_id");
DescByItemType_Nd = aras.getItemTypeNodeForClient(aras.getItemTypeName(DescByItemType_ID));
RelatedItemType_ID = aras.getItemProperty(RelType_Nd, "related_id");
if (RelatedItemType_ID) {
RelatedItemType_Nd = aras.getItemTypeNodeForClient(aras.getItemTypeName(RelatedItemType_ID));
RELATED_IT_NAME = aras.getItemProperty(RelatedItemType_Nd, "name");
RELATED_IT_LABEL = aras.getItemProperty(RelatedItemType_Nd, "label");
if (RELATED_IT_LABEL == "") RELATED_IT_LABEL = RELATED_IT_NAME;
RELATED_IS_DEPENDENT = (aras.getItemProperty(RelatedItemType_Nd, "is_dependent") == "1");
AUTO_SEARCH_FLAG = (aras.getItemProperty(RelType_Nd, "auto_search") == "1");
pagesize = aras.getPreferenceItemProperty("Core_RelGridLayout", RelType_ID, "page_size");
pagesize = aras.getItemProperty(RelType_Nd, "default_page_size");
MAX_OCCURS = aras.getItemProperty(RelType_Nd, "max_occurs");
MIN_OCCURS = aras.getItemProperty(RelType_Nd, "min_occurs");
pagesize = parseInt(pagesize);
MAX_OCCURS = parseInt(MAX_OCCURS);
MIN_OCCURS = parseInt(MIN_OCCURS);
relatedItemTypeName = RELATED_IT_NAME;
relationshipTypeName = RelType_Nm;
var xpath = "Relationships/Item[@type='Property' and (not(is_hidden2) or is_hidden2='0')]";
DescByVisibleProps = DescByItemType_Nd ? DescByItemType_Nd.selectNodes(xpath) : null;
RelatedVisibleProps = RelatedItemType_Nd ? RelatedItemType_Nd.selectNodes(xpath) : null;
DescByVisibleProps = aras.sortProperties(DescByVisibleProps);
RelatedVisibleProps = aras.sortProperties(RelatedVisibleProps);
var grid_view = aras.getItemProperty(RelType_Nd, "grid_view");
aras.uiInitRelationshipsGridSetups(RelType_ID, DescByVisibleProps, RelatedVisibleProps, grid_view);
function addPropsFromArr(arr, DRL) {
for (var i = 0; i < arr.length; i++) {
var propNm = aras.getItemProperty(prop, "name");
var data_type = aras.getItemProperty(prop, "data_type");
var data_source = aras.getItemProperty(prop, "data_source");
var propID_val = prop.getAttribute("id");
var order_by = aras.getItemProperty(prop, "order_by");
fieldsArr.push(propNm + "_" + propDRL);
data_source: data_source,
if (RelatedVisibleProps) {
addPropsFromArr(DescByVisibleProps, "D");
addPropsFromArr(RelatedVisibleProps, "R");
function getGenerateRelationshipsGridXML(dom) {
var params = aras.newObject();
params["enable_links"] = !isEditMode;
params["enableFileLinks"] = true;
params["bgInvert"] = true;
if (RelatedItemType_ID) {
params[RelatedItemType_ID] = "";
return aras.uiGenerateRelationshipsGridXML(dom, DescByVisibleProps, RelatedVisibleProps, DescByItemType_ID, params, true);
if (!gridReady || (isToolbarUsed && activeToolbar == null) || !aras) {
setTimeout("initGrid()", 10);
setupGrid(true, AUTO_SEARCH_FLAG);
if (addRowInProgress_Number == 0) {
if (isGridSortingDefined) {
isGridSortingDefined = true;
addRowInProgress_Number--;
if (redlineController.isRedlineActive) {
redlineController.RefreshRedlineView();
function updateDirtyRows() {
if (!item || !item.selectSingleNode("Relationships/Item[@action='update']"))
var allRows = grid.items_Experimental.getAllId();
var dirtyItemIDs = "id='" + allRows[0] + "'";
for (var i = 1; i < allRows.length; i++) {
dirtyItemIDs += " or @id='" + allRows[i] + "'";
var dirtyItems = item.selectNodes("Relationships/Item[(" + dirtyItemIDs + ") and @action='update']");
for (var i = 0; i < dirtyItems.length; i++) {
var relatedNd = dirtyItems[i].selectSingleNode("related_id/Item");
updateRow(dirtyItems[i], relatedNd, false, true, false);
function showGridInputRow(b) {
if (grid.IsInputRowVisible() == Boolean(b)) {
function isSearchRowEmpty() {
toolbar.showLabels(aras.getPreferenceItemProperty("Core_GlobalLayout", null, "core_show_labels") == "true");
if (WorkFlowProc != "1") {
toolbar.loadXml(aras.getI18NXMLResource("relationshipsGrid_toolbar.xml"));
toolbar.loadXml(aras.getI18NXMLResource("relationshipsGrid_toolbaforInstanceWf.xml"));
function onCancelEditHandler() {
bKEYEDNAME_INPUT_IS_IN_PROGRESS = false;
function onBeforeSaveCommand() {
function registerTopMenuEventsHandlers() {
if (!topWindow_Experimental.registerCommandEventHandler) {
setTimeout(registerTopMenuEventsHandlers, 200);
if (topWindow_Experimental.registerCommandEventHandler) {
beforeSaveHandlerKey = topWindow_Experimental.registerCommandEventHandler(window, onBeforeSaveCommand, "before", "save");
function unRegisterTopMenuEventsHandlers() {
if (topWindow_Experimental.unregisterCommandEventHandler) {
topWindow_Experimental.unregisterCommandEventHandler(beforeSaveHandlerKey);
var onbeforeunload_handler = function () {
var base$onbeforeunload = window.onbeforeunload;
onbeforeunload = function onbeforeunload_handler_rg() {
aras.unregisterEventHandler("ItemLock", window, relatedItemLockListener);
aras.unregisterEventHandler("ItemSave", window, ItemSaveListener);
unRegisterTopMenuEventsHandlers();
searchContainer.onEndSearchContainer();
if (base$onbeforeunload) {
res = base$onbeforeunload();
var tmp_handleInvalidCellValue = window._handleInvalidCellValue;
window._handleInvalidCellValue = function onbeforeunload_handleInvalidCellValue(message) {
res = aras.ValidationMsg;
return InvalidCellValueAction.ContinueEdit;
window._handleInvalidCellValue = tmp_handleInvalidCellValue;
function RelationshipGridSearchContainer(itemTypeName, toolbar, grid, menu, searchLocation, searchPlaceholder, requiredProperties) {
SearchContainer.prototype.constructor.call(this, itemTypeName, toolbar, grid, menu, searchLocation, searchPlaceholder, requiredProperties);
RelationshipGridSearchContainer.prototype = new SearchContainer();
RelationshipGridSearchContainer.prototype.defaultSearchMode = "NoUI";
var searchForMenu = true;
var relationshipsGridInfoProvider = null, currentParent = window.parent;
while (!relationshipsGridInfoProvider && currentParent) {
if (currentParent.relationshipsGridInfoProvider) {
relationshipsGridInfoProvider = currentParent.relationshipsGridInfoProvider.getInstance(null);
currentParent = currentParent.parent;
if (currentParent == topWindow_Experimental) {
var tearoff_menu = relationshipsGridInfoProvider ? relationshipsGridInfoProvider.getMenu() : null;
if (tearoff_menu && !tearoff_menu.searchForMenu) {
if (!gridReady || (isToolbarUsed && !toolbarReady) || (searchForMenu && tearoff_menu && !tearoff_menu.menuApplet) || (relationshipsGridInfoProvider && relationshipsGridInfoProvider.waitForMenu && !tearoff_menu)) {
setTimeout(initSearch, 10);
var toolbar4SearchContainer = null;
var toolbarIframeNode = document.getElementById('toolbar_slot_custom_iframe');
if (toolbarIframeNode && toolbarIframeNode.contentWindow.toolbar) {
toolbar4SearchContainer = { object: toolbarIframeNode.contentWindow.toolbar, dojoOfObject: toolbarIframeNode.contentWindow.dojo };
} else if (isToolbarUsed) {
toolbar4SearchContainer = toolbar;
var menu4SearchContainer = tearoff_menu ? { object: tearoff_menu.menuApplet, dojoOfObject: topWindow_Experimental.dojo } : null;
var reqProps = new Object();
reqProps["source_id"] = itemID;
searchContainer = new RelationshipGridSearchContainer(RelType_Nm, toolbar4SearchContainer, grid, menu4SearchContainer, searchLocation, document.getElementById("searchPlaceholder"), reqProps);
searchContainer.redlineController = redlineController;
if (this.frameElement && this.frameElement.className != "inactiveTab") {
searchContainer.onStartSearchContainer();
resize_searchContainer();
currQryItem.setCriteria("source_id", itemID);
currQryItem.setSelect(aras.getSelectCriteria(aras.getItemTypeId(RelType_Nm), true));
redlineInitId = setInterval("asyncRedlineModeInit()", 10);
function asyncRedlineModeInit() {
if (currentSearchMode.name == "Advanced" && !currentSearchMode.isAdvancedModeStarted) {
clearInterval(redlineInitId);
redlineController.InitRedlinePreference();
if (redlineController.isRedlineActive) {
redlineController.RefreshRedlineView();
function onSearchCommand() {
function setControlEnabled(ctrlName, b) {
if (ExplicitToolbarIconsEnabling[ctrlName] !== undefined) {
b = Boolean(ExplicitToolbarIconsEnabling[ctrlName]);
CONTROLS_STATE_ARRAY[ctrlName] = b;
var tbi = activeToolbar.getItem(ctrlName);
function saveEditedData() {
function replaceErrorHandler() {
window.onerror = function () { return false; }
item = relationships.item;
itemTypeName = relationships.itemTypeName;
item = typeof (parent.document.item) == "object" ? parent.document.item : parent.parent.item;
itemTypeName = parent.itemTypeName || parent.document.itemTypeName;
itemTypeId = aras.getItemTypeId(itemTypeName);
if ((isEditMode && itemTypeName == "ItemType" && RelType_Nm == "Property" && aras.getItemProperty(item, "name") == "Property")
|| (isEditMode && itemTypeName == "RelationshipType" && RelType_Nm == "Relationship Grid Event" && aras.getItemProperty(item, "name") == "Relationship Grid Event")) {
var newLocation = location.href.replace(/editMode=./i, "editMode=1");
location.replace(newLocation);
searchContainer.requiredProperties["source_id"] = item.getAttribute("id");
searchContainer.requiredProperties["source_id"] = item.getAttribute("id");
setupMenu4RelationshipType();
function setupMenu4RelationshipType() {
var actionsTb = toolbar.getItem("actions_menu");
var RTActions = relationshipTypeActions[RelType_ID];
if (RTActions) for (var menuEntry in RTActions) {
actionsTb.Add(menuEntry, RTActions[menuEntry]);
function setupMenu4Relationship(add_remove) {
var actionsTb = toolbar.getItem("actions_menu");
var currCount = actionsTb.getItemCount();
if (currCount == RTActionsCount) {
var RActions = relationshipActions[RelType_ID];
for (var menuEntry in RActions) {
actionsTb.Add(menuEntry, RActions[menuEntry]);
if (currCount > RTActionsCount) setupMenu4RelationshipType();
default: throw new Error(1, 'setupMenu4Relationship: "' + add_remove + '" not supported');
function onRelationshipsMenuClickItem(menuOptionId) {
var act = aras.getItemFromServer("Action", menuOptionId, "name,method(name,method_type,method_code),type,target,location,body,on_complete(name,method_type,method_code),item_query");
if (act.getProperty("type") == "itemtype") {
aras.invokeAction(act.node, aras.getItemProperty(RelType_Nd, "relationship_id"), "");
var ids = grid.getSelectedItemIds();
for (var i = 0; i < ids.length; i++) {
aras.invokeAction(act.node, aras.getItemProperty(RelType_Nd, "relationship_id"), ids[i]);
function removeChoiceItem(name) {
var tbi = activeToolbar.getItem("related_option");
if (tbi.getItemCount() < 2) {
setControlEnabled("related_option", false);
setControlEnabled("related_option", true);
if (tbi.getItemCount() == 0) {
function getSelectedChoiceItem() {
var tbi = activeToolbar.getItem("related_option");
return tbi.getSelectedItem();
function getChoiceItemName(id) {
var tbi = activeToolbar.getItem("related_option");
activeToolbar = toolbar.getActiveToolbar();
PickRelatedOption = getChoiceItemName(0);
NoRelatedOption = getChoiceItemName(1);
CreateRelatedOption = getChoiceItemName(2);
var related_option = aras.getItemProperty(RelType_Nd, "related_option");
opts[PickRelatedOption] = false;
opts[NoRelatedOption] = false;
opts[CreateRelatedOption] = false;
if (aras.getItemProperty(RelType_Nd, "related_id") != "") {
if ("1" == aras.getItemProperty(RelatedItemType_Nd, "is_dependent")) {
opts[NoRelatedOption] = true;
opts[PickRelatedOption] = true;
switch (related_option) {
opts[PickRelatedOption] = true;
opts[CreateRelatedOption] = true;
if (aras.getItemProperty(RelType_Nd, "related_notnull") == "1") {
opts[NoRelatedOption] = true;
opts[PickRelatedOption] = true;
opts[CreateRelatedOption] = true;
if (opts[PickRelatedOption] == true) {
if (opts[NoRelatedOption] == true) {
} else if (pagesize != null) {
activeToolbar.getItem("page_size").setText(pagesize);
redlineController.InitRedlineControls();
function updateToolbar() {
var isSelectAllEnabled = grid.getRowCount() > 0;
setControlEnabled("new", computeCorrectControlState("new"));
setControlEnabled("related_option", isEditMode && related_visible);
setControlEnabled("select_all", isSelectAllEnabled);
var purgeFlg = computeCorrectControlState("delete");
setControlEnabled("delete", purgeFlg);
replaceButtonEnabled = isEditMode && (RELATED_IT_NAME != '') && replaceFlag;
setControlEnabled("pick_replace", replaceButtonEnabled && purgeFlg);
setControlEnabled("prev_page", page > 1);
setControlEnabled("next_page", pagemax - page > 0);
if (isSpecialItemType()) {
setControlEnabled("copy2clipboard", false);
setControlEnabled("paste", false);
setControlEnabled("paste_special", false);
setControlEnabled("copy2clipboard", grid.getSelectedItemIds().length > 0 && !isWorkflowTool() && !isFunctionDisabled(relationshipTypeName, "Copy"));
setControlEnabled("paste", getPasteFlg());
setControlEnabled("paste_special", getPasteSpecialFlg());
function setColumnVisibility(propertyName, isVisible, columnWidth) {
var propertyIndex = grid.GetColumnIndex(propertyName + "_D");
grid.SetColumnVisible(propertyIndex, isVisible, columnWidth);
function gm_updateToolbar() {
if (this.itemTypeName === "gm_Work Order") {
var buttonsToToggle = new Array();
if (this.RelType_Nm === "gm_Work Order Distribution") {
buttonsToToggle.push("New relationship","Pick/Replace Related Item","Delete relationship","Promote Item","Copy Relationship to Clipboard",
"Paste last copied relationships","Select All","Enable Redline Mode");
grid.SetMultiselect(true);
} else if (this.RelType_Nm === "gm_Work Order TID") {
buttonsToToggle.push("New relationship");
} else if (this.RelType_Nm === "gm_Work Order gm_PATSrc") {
buttonsToToggle.push("Export To Excel","Export To Word");
} else if (this.RelType_Nm === "gm_Work Order gm_VAT") {
buttonsToToggle.push("New relationship","Delete relationship","Copy Relationship to Clipboard","Paste last copied relationships","Select All");
grid.SetMultiselect(false);
} else if (this.RelType_Nm === "gm_Work Order gm_PIC") {
var type = aras.getItemProperty(item,"_type");
var subType = aras.getItemProperty(item,"_subtype");
buttonsToToggle.push("New relationship","Delete relationship","Copy Relationship to Clipboard","Paste last copied");
if (type == "Stop Order Type"
|| (type == "Specs Type" && subType == "STO - Specs - Create")
|| subType == "VWO - VDS - Create"
|| subType == "VWO - VDS Administration"
|| subType == "VWO - VDS not Changing - Part Impact Only"
|| subType === "MWO - Body or Paint Process"
|| subType === "MWO - Initial MPD Release"
|| subType === "MWO - MPD Updates - Correction or Carryover"
|| subType === "MWO - MPD Updates - Process Chg") {
grid.SetMultiselect(true);
grid.SetMultiselect(false);
} else if (this.RelType_Nm === "gm_Work Order PPIC") {
var type = aras.getItemProperty(item, "_type");
var subType = aras.getItemProperty(item, "_subtype");
buttonsToToggle.push("New relationship", "Delete relationship", "Copy Relationship to Clipboard", "Paste last copied");
if (subType === "BCR - Blanket" || type === "Pre-Prod Tooling Type" || type === "Misc Material Order Type") {
grid.SetMultiselect(true);
grid.SetMultiselect(false);
} else if (this.RelType_Nm === "gm_Work Order PPCost"
|| this.RelType_Nm === "gm_Work Order Shipped To"
|| this.RelType_Nm === "gm_Work Order MP Shipped To") {
buttonsToToggle.push("Promote Item", "View item", "Pick/Replace Related Item", "Lock related item");
else if (this.RelType_Nm === "gm_Work Order PPBreakpoint"
|| this.RelType_Nm === "gm_Work Order PPQP"
|| this.RelType_Nm === "gm_Work Order Order Status"
buttonsToToggle.push("New relationship","Pick/Replace Related Item","Delete relationship","Promote Item","Copy Relationship to Clipboard",
"Paste last copied relationships", "Select All", "Enable Redline Mode", "View item", "Lock related item", "Unlock related item", "View relationship");
else if (this.RelType_Nm === "gm_Work Order BSD Verification") {
buttonsToToggle.push("New relationship","Pick/Replace Related Item","Delete relationship","Promote Item","Copy Relationship to Clipboard",
"Paste last copied relationships", "Select All", "Enable Redline Mode", "View item", "Lock related item", "Unlock related item");
else if ((this.RelType_Nm === "gm_Work Order Cost" || this.RelType_Nm === "gm_Work Order Finance")
&& aras.getItemProperty(item, "_subtype", "") === "MWO - Body or Paint Process") {
removeChoiceItem("Pick Related");
replaceButtonEnabled = false;
setControlEnabled("pick_replace", false);
else if (this.RelType_Nm === "gm_Work Order Part and Cost") {
var type = aras.getItemProperty(item, "_type");
var pptOnlyProperties = ["_part_tooling_lead_weeks", "_part_matl_spec_id", "_critical_part", "_planned_bom_transmit_date", "_build_mrd", "_funds_allocated_in_tooling_db"];
if (type === "Misc Material Order Type") {
pptOnlyProperties.forEach(function (property) {
setColumnVisibility(property, false, 0);
pptOnlyProperties.forEach(function (property) {
setColumnVisibility(property, true, 100);
for (var i = 0; i < buttonsToToggle.length; i++) {
var buttonId = toolbar.GetButtonId(buttonsToToggle[i]);
if (buttonId != undefined) {
setControlVisible(buttonId, showButtons);
else if (this.itemTypeName === "gm_Work Order gm_PATSrc") {
if (this.RelType_Nm === "gm_WO gm_PATSrc gm_kcds_cd") {
replaceButtonEnabled = false;
setControlEnabled("pick_replace", false);
setControlVisible("pick_replace", false);
else if (this.itemTypeName === "gm_Query PPAT") {
var buttonIdsToToggle = new Array();
buttonIdsToToggle.push("actions_menu", "emptyId_1", "related_option", "new", "emptyId_2", "pick_replace", "delete", "emptyId_3", "export2Excel", "export2Word", "emptyId_4",
"lock", "unlock", "emptyId_5", "promote", "search", "newsearch", "stop_search", "emptyId_6", "search_mode", "saved_search", "emptyId_7", "add_criteria",
"select_all", "page_size", "prev_page", "next_page", "emptyId_8", "show_item", "show_relationship", "emptyId_9", "copy2clipboard", "paste", "redline");
for (var i = 0; i < buttonIdsToToggle.length; i++) {
setControlVisible(buttonIdsToToggle[i], showButtons);
else if (this.itemTypeName === "gm_Work Order PPPAT") {
var buttonsToToggle = new Array();
if (this.RelType_Nm === "gm_PPAT Active Build" || this.RelType_Nm === "gm_PPAT Pulled Build" || this.RelType_Nm === "gm_PPAT Completed Build") {
buttonsToToggle.push("New relationship","Pick/Replace Related Item","Delete relationship","Promote Item","Copy Relationship to Clipboard",
"Paste last copied relationships", "Select All", "Enable Redline Mode", "View item", "Lock related item", "Unlock related item", "View relationship");
for (var i = 0; i < buttonsToToggle.length; i++)
var buttonId = toolbar.GetButtonId(buttonsToToggle[i]);
if(buttonId != undefined) {
setControlVisible(buttonId, showButtons);
} else if (this.itemTypeName === "gm_Work Order History" || this.itemTypeName === "gm_Query_PATSrc") {
var showButtons1 = false;
var buttonsToToggle1 = new Array();
buttonsToToggle1.push("New relationship",
"Pick/Replace Related Item",
"Copy Relationship to Clipboard",
"Paste last copied relationships",
for (var i1 = 0; i1 < buttonsToToggle1.length; i1++) {
var buttonId1 = toolbar.GetButtonId(buttonsToToggle1[i1]);
if (buttonId1 != undefined) {
setControlVisible(buttonId1, showButtons1);
setControlVisible("search_mode", false);
else if (this.RelType_Nm === "Activity2 Assignment"){
var buttonIdsToToggle = new Array();
buttonIdsToToggle.push("promote", "export2Word","export2Excel","lock","select_all","copy2clipboard");
for (var i = 0; i < buttonIdsToToggle.length; i++)
setControlEnabled(buttonIdsToToggle[i], showButtons);
function isSpecialItemType() {
return (itemTypeName === "Life Cycle State" || itemTypeName === "Transition EMail" || itemTypeName === "Life Cycle Transition" || itemTypeName === "State EMail");
function onToolbarButtonClick(btn) {
if (!grid || bKEYEDNAME_INPUT_IS_IN_PROGRESS) {
processCommand(btn.getId());
function setAllControlsEnabled(b) {
var tbElements = ["new", "pick_replace", "delete", "lock", "unlock", "promote", "search", "show_item", "show_relationship", "copy2clipboard", "paste", "select_all"];
for (var i = 0; i < tbElements.length; i++) {
setControlEnabled(tbElements[i], false);
function updateStatusBar() {
if (isToolbarUsed && !activeToolbar) {
setTimeout("updateStatusBar()", 10);
aras.showStatusMessage("page_status", getSearchResultStatusMessage());
function initCopyPasteControls() {
if (isSpecialItemType()) {
setControlVisible("copy2clipboard", false);
setControlVisible("paste", false);
function setControlVisible(id, show_it) {
activeToolbar.showItem(id);
activeToolbar.hideItem(id);
function getLockedStatusStr(rowId) {
var rNd = item.selectSingleNode("Relationships/Item[@type='" + RelType_Nm + "' and @id='" + rowId + "']/related_id/Item");
if (aras.isTempEx(rNd)) {
} else if (aras.isLockedByUser(rNd)) {
} else if (aras.isLocked(rNd)) {
function hasRelatedItem(rowId) {
var rNd = item.selectSingleNode("Relationships/Item[@type='" + RelType_Nm + "' and @id='" + rowId + "']/related_id/Item");
function system_getRelatedItem(rowId) {
var rNd = item.selectSingleNode("Relationships/Item[@type='" + RelType_Nm + "' and @id='" + rowId + "']/related_id/Item");
function getUnlockFlg() {
var ids = grid.getSelectedItemIds();
for (var i = 0; i < ids.length; i++) {
var locked = getLockedStatusStr(rowId);
if (locked == "alien" && aras.isAdminUser()) {
} else if (locked != "user") {
function updateControls(rowId, doRepaint, relFiles, relatedFiles) {
var ids = grid.getSelectedItemIds();
doRepaint = Boolean(doRepaint);
if (isToolbarUsed && ids.length > 1) {
var purgeFlag = computeCorrectControlState("delete");
setAllControlsEnabled(false);
setControlEnabled("new", computeCorrectControlState("new"));
setControlEnabled("copy2clipboard", !isWorkflowTool() && !isFunctionDisabled(itemTypeName, "Copy"));
setControlEnabled("paste", getPasteFlg());
setControlEnabled("paste_special", getPasteSpecialFlg());
if (!purgeFlag || doRepaint) {
setupMenu4Relationship("remove");
setupMenu4Relationship("add");
setControlEnabled("delete", purgeFlag);
setControlEnabled("lock", computeCorrectControlState("lock"));
setControlEnabled("unlock", getUnlockFlg());
setControlEnabled("select_all", true);
setControlEnabled("search", true);
var selectedItem = item.selectSingleNode('Relationships/Item[@id="' + rowId + '"]'),
relatedItem = selectedItem ? selectedItem.selectSingleNode("related_id/Item") : null,
isSelectionExists = ids.length > 0,
purgeFlag = computeCorrectControlState("delete"),
promoteFlg = selectedItem
&& !aras.isLocked(selectedItem)
&& !aras.isTempEx(selectedItem)
&& !isFunctionDisabled(relationshipTypeName, "Promote");
if (!relatedFiles && RelatedItemType_Nd && relatedItem) {
relatedFiles = aras.getItemsOfFileProperties(relatedItem, RelatedItemType_Nd);
FilesCache[relatedFiles[0].getAttribute("id")] = relatedFiles[0];
setupMenu4Relationship(purgeFlag ? "add" : "remove");
setControlEnabled("delete", purgeFlag);
setControlEnabled("pick_replace", replaceButtonEnabled && purgeFlag);
setControlEnabled("lock", computeCorrectControlState("lock", selectedItem, null, relatedFiles));
setControlEnabled("unlock", getUnlockFlg());
setControlEnabled("promote", promoteFlg);
setControlEnabled("show_item", computeCorrectControlState("show_item"));
setControlEnabled("show_relationship", computeCorrectControlState("show_relationship"));
if (isSpecialItemType()) {
setControlEnabled("copy2clipboard", false);
setControlEnabled("paste", false);
setControlEnabled("paste_special", false);
setControlEnabled("copy2clipboard", (!isWorkflowTool() && isSelectionExists) && !isFunctionDisabled(relationshipTypeName, "Copy"));
setControlEnabled("paste", getPasteFlg());
setControlEnabled("paste_special", getPasteSpecialFlg());
setAllControlsEnabled(false);
setControlEnabled("new", computeCorrectControlState("new"));
setControlEnabled("search", true);
if (grid.getRowCount() > 0) {
setControlEnabled("select_all", true);
setupMenu4Relationship("remove");
function mergeWithServerDataIfRequired(relationshipId) {
var relationship = item.selectSingleNode('Relationships/Item[@id="' + relationshipId + '"]');
aras.getItemRelationship(item, RelType_Nm, relationshipId, true);
if ("0" === relationship.getAttribute("loadedPartialy") || "add" === relationship.getAttribute("action")) {
var relFromServer = aras.getItemFromServer(RelType_Nm, relationshipId, undefined, true);
if (!relFromServer || !relFromServer.node) {
aras.mergeItem(relationship, relFromServer.node);
relationship.setAttribute("loadedPartialy", "0");
var related = relationship.selectSingleNode("related_id/Item");
related.setAttribute("loadedPartialy", "0");
function onSelectItem(rowId, col, generateEvent, processAllSelected, loadItemFromServer) {
if (rowId == "header_row") {
} else if (grid.isRedlineRow_Experimental(rowId)) {
var skipColSelect = false;
if (col == undefined || col == null) {
if (generateEvent == undefined) {
if (processAllSelected == undefined) {
processAllSelected = true;
if (processAllSelected) {
var ids = grid.getSelectedItemIds();
for (var i = 0; i < ids.length; i++) {
if (ids[i] == "" || grid.isRedlineRow_Experimental(ids[i])) {
if (loadItemFromServer) {
mergeWithServerDataIfRequired(ids[i]);
var aRel = item.selectSingleNode('Relationships/Item[@id="' + ids[i] + '"]');
aras.AlertError(aras.getResource("", "relationshipsgrid.failed_get_item", RelType_Nm), null, null, window);
var selectedIds = grid.getSelectedItemIds();
if (rowId && selectedIds.indexOf(rowId) > -1) {
currSelCell = grid.cells(rowId, col);
handleRowEvent("onselectrow", rowId);
function computeCorrectControlState(controlName, arg1, relFiles, relatedFiles) {
var selectedRowIds = grid.getSelectedItemIds(),
isSelectionExists = selectedRowIds.length > 0,
isSingleSelection = selectedRowIds.length === 1,
if (!isEditMode || !canNewFlag || isFunctionDisabled(relationshipTypeName, "New")) {
var relationshipNodes = item.selectNodes("Relationships/Item[@type='" + RelType_Nm + "' " + "and (not(@action) or @action!='delete' and @action!='purge')]"),
nodesCount = relationshipNodes.length;
return MAX_OCCURS == "" || nodesCount - MAX_OCCURS < 0;
if (!isEditMode || !isSelectionExists || isFunctionDisabled(relationshipTypeName, "Delete")) {
var rowId, relationshipNode, nodeAction;
for (i = 0; i < selectedRowIds.length; i++) {
rowId = selectedRowIds[i];
relationshipNode = item.selectSingleNode("Relationships/Item[@id='" + rowId + "']");
nodeAction = relationshipNode.getAttribute("action");
if (nodeAction === "purge" || nodeAction === "delete") {
case "show_relationship":
var rowId = selectedRowIds[0],
relationshipNode = item.selectSingleNode("Relationships/Item[@id='" + rowId + "' and not(@discover_only='1')]");
var nodeAction = relationshipNode.getAttribute("action");
if (nodeAction != "purge" && nodeAction != "delete") {
var formID = aras.uiGetFormID4ItemEx(relationshipNode, "view");
if (relatedItemTypeName) {
var rowId = selectedRowIds[0],
relatedItem = item.selectSingleNode("Relationships/Item[@id='" + rowId + "']/related_id[not(@discover_only='1')]/Item");
return Boolean(relatedItem);
return replaceToNull && isEditMode && relatedItemTypeName && arg1;
if (relatedItemTypeName === "File") {
if (!isSelectionExists) {
for (i = 0; i < selectedRowIds.length; i++) {
rowId = selectedRowIds[i];
locked = getLockedStatusStr(rowId);
return (arg1 && (aras.isLockedByUser(arg1) || aras.isLocked(arg1) && loginName.search(/^admin$|^root$/) == 0));
function onRelshipsHeaderMenuClicked(m, rowsId, col) {
} else if (m == "insertCol") {
function onRelshipsHeaderCellContextMenu(e) {
return topWindow_Experimental.cui.onGridHeaderContextMenu(e, grid, true);
function onRelshipsHeaderContextMenu(e) {
return topWindow_Experimental.cui.onGridHeaderContextMenu(e, grid);
function computeCorrectControlState1(controlName, arg1, relFiles, relatedFiles) {
return computeCorrectControlState(controlName, arg1, relFiles, relatedFiles);
function onPopupMenuClick(mi, rowID, col) {
setTimeout('onPopupMenuClick2(\'' + mi + '\',\'' + rowID + '\',' + col + ')', 10);
function onRelationshipPopupMenuClicked(cmdId, rowId, col) {
return onPopupMenuClick2(cmdId, rowId, col);
function hideColumn(col) {
grid.SetColumnVisible(col, false);
function showColumn(col) {
var propsToShow = aras.newArray();
var colOrderArr = grid.getLogicalColumnOrder().split(";");
for (var i = 0; i < colOrderArr.length; i++) {
if (grid.getColWidth(i) == 0) {
var colNm = grid.GetColumnName(i);
var propertyName = colNm.substr(0, colNm.length - 2);
for (var j = 0; j < DescByVisibleProps.length; j++) {
if (aras.getItemProperty(DescByVisibleProps[j], "name") == propertyName) {
propLabel = aras.getItemProperty(DescByVisibleProps[j], "label");
propName = aras.getItemProperty(DescByVisibleProps[j], "name");
propLabel = propertyName;
var tempWidth = parseInt(aras.getItemProperty(DescByVisibleProps[j], "column_width"));
if (RelatedVisibleProps) {
for (var j = 0; j < RelatedVisibleProps.length; j++) {
if (aras.getItemProperty(RelatedVisibleProps[j], "name") == propertyName) {
propLabel = aras.getItemProperty(RelatedVisibleProps[j], "label");
propName = aras.getItemProperty(RelatedVisibleProps[j], "name");
propLabel = propertyName;
var tempWidth = parseInt(aras.getItemProperty(RelatedVisibleProps[j], "column_width"));
var propType = colNm.substring(colNm.length - 2, colNm.length);
propsToShow.push({ colNumber: i, label: propLabel, name: propName, width: propWidth, type: propType });
if (!propsToShow.length) {
aras.AlertError(aras.getResource("", "relationshipsgrid.no_additional_columns"), null, null, window);
title: aras.getResource("", "showcolumndlg.title"),
propsToShow: propsToShow,
content: "SitePreference/showColumnDialog.html"
(topWindow_Experimental.main || topWindow_Experimental).ArasModules.Dialog.show("iframe", params).promise.then(function (resArr) {
for (var j = 0; j < resArr.length; j++) {
for (var i = 0; i < propsToShow.length; i++) {
if (propsToShow[i].label == resArr[j]) {
grid.SetColumnVisible(propsToShow[i].colNumber, true, propsToShow[i].width);
function populateItemWithLoadedProps(itemToPopulate, loadedPropsItem, show_new_rows) {
var xpath_start = (show_new_rows == true) ? "//Item[@type='" + RelType_Nm + "' and @action='add']" : "//Item[@type='" + RelType_Nm + "']";
var rships = loadedPropsItem.selectNodes(xpath_start);
for (var j = 0; j < rships.length; j++) {
var xpath = "latest_result/Result";
var sub_itemToPopulate = itemToPopulate.selectSingleNode(xpath);
sub_itemToPopulate.appendChild(newItem.cloneNode(true));
var relshId = newItem.getAttribute("id");
var oldItem = itemToPopulate.selectSingleNode(xpath_start + "[@id='" + relshId + "']");
mergeProps(oldItem, newItem);
function mergeProps(oldItem, newItem) {
var newProps = newItem.selectNodes("*[local-name()!='Relationships']");
for (var i = 0; i < newProps.length; i++) {
var newProp = newProps[i];
var oldProp = oldItem.selectSingleNode(newProp.nodeName);
oldItem.appendChild(newProp.cloneNode(true));
var oldPropItem = oldProp.selectSingleNode("Item");
var newPropItem = newProp.selectSingleNode("Item");
mergeProps(oldPropItem, newPropItem);
function newPopulateRelationshipsGridDom() {
var bodyDom = aras.createXMLDocument();
bodyDom.loadXML("<table><itemID/><relTypeID/><type/><\/table>");
bodyDom.selectSingleNode("table/itemID").text = itemID;
bodyDom.selectSingleNode("table/relTypeID").text = RelType_ID;
bodyDom.selectSingleNode("table/type").text = itemTypeName;
function onPopupMenuClick2(mi, rowID, col) {
if (mi == "locked_criteria:clear") {
grid.setCellValue('input_row', 0, "<img src=''>");
} else if (mi == "locked_criteria:by_me") {
grid.setCellValue('input_row', 0, "<img src='../images/LockedByMe.svg'>");
} else if (mi == "locked_criteria:by_others") {
grid.setCellValue('input_row', 0, "<img src='../images/LockedByOthers.svg'>");
} else if (mi == "locked_criteria:by_anyone") {
grid.setCellValue('input_row', 0, "<img src='../images/LockedByAnyone.svg'>");
if ((mi.search(/ $/) != -1) || (mi.search(/ $/) != -1)) {
if (mi.search(/ $/) != -1) {
mi = mi.substring(0, mi.length - 2);
RTActions = relationshipActions[RelType_ID];
} else if (mi.search(/ $/) != -1) {
mi = mi.substring(0, mi.length - 1);
RTActions = relationshipTypeActions[RelType_ID];
for (var menuEntry in RTActions) {
if (mi == RTActions[menuEntry]) {
var act = aras.getItemFromServer("Action", actID, "name,method(name,method_type,method_code),type,target,location,body,on_complete(name,method_type,method_code),item_query");
var actType = act.getProperty("type");
if (actType == "itemtype") {
aras.invokeAction(act.node, aras.getItemProperty(RelType_Nd, "relationship_id"), "");
grid.getSelectedItemIds().forEach(function (value) {
aras.invokeAction(act.node, aras.getItemProperty(RelType_Nd, "relationship_id"), value);
function callbackFunction4NewCmd(id, bFlag) {
var show_related = bFlag ? aras.getItemProperty(RelType_Nd, "new_show_related") : null;
handleRowEvent("oninsertrow", id);
if (show_related === "1") {
if (relationships && relationships.updateTabbarState) {
relationships.updateTabbarState(RelType_ID);
editWait = setTimeout(function () {
grid.setSelectedRow(rowId, false, true);
if (bFlag && show_related !== "1" && grid.items_Experimental.is(rowId)) {
var column = RELATED_IT_NAME === "" ? 0 : 1;
for (var i = 0; i < grid.columns_Experimental.get("count") ; i++) {
if (grid.getColumnOrder(i) === column) {
var cell = grid.cells(rowId, i);
if (!cell.isCheckbox()) {
grid.edit_Experimental.set(rowId, i);
function processCommand(cmdId, col) {
if (propsArr.length == 0) {
aras.AlertError(aras.getResource("", "relationshipsgrid.no_visible_props"), null, null, window);
if (getSelectedChoiceItem() == PickRelatedOption) {
setTimeout("newRelationship(true)", 1);
if (aras.getItemProperty(RelatedItemType_Nd, "name") == "File" && getSelectedChoiceItem() == CreateRelatedOption) {
var res = aras.SelectFileFromPackage("FE_SelectFileFromPackage", true);
if (res && res.length != 0) {
for (var i = 0; i < res.getItemCount() ; i++) {
var itm = res.getItemByIndex(i);
addRelationship(itm.node);
topWindow_Experimental.ArasModules.vault.selectFile().then(function(file){
var fileNode = aras.newItem('File', file);
newRelationship(false, fileNode);
newRelationship(false, (getSelectedChoiceItem() == NoRelatedOption ? null : undefined));
setTimeout("changeRelationship(true)", 1);
var gridXmlCallback = function () {
return grid.getXML(true);
aras.export2Office(gridXmlCallback, cmdId);
var gridXmlCallback = function () {
return grid.getXML(false);
aras.export2Office(gridXmlCallback, cmdId);
var id = grid.getSelectedId();
aras.AlertError(aras.getResource("", "relationshipsgrid.select_row"), null, null, window);
var res = showRelatedItemById(id);
aras.AlertError(aras.getResource("", "relationshipsgrid.try_view", RELATED_IT_NAME, RelType_Nm), null, null, window);
case "show_relationship":
var id = grid.getSelectedId();
aras.AlertError(aras.getResource("", "relationshipsgrid.select_row"), null, null, window);
return showRelationshipById(id);
redlineController.ToggleRedline();
grid.getSelectedItemIds().forEach(function (relationshipItemId) { relatedIds.push(item.selectSingleNode('Relationships/Item[@id="' + relationshipItemId + '"]/related_id/Item/@id').text); });
aras.addItemToPackageDef(relatedIds, RELATED_IT_NAME);
function onCopy2Clipboard() {
var itemIDs = grid.getSelectedItemIds(),
itemID, relationshipItem, copiedItem,
if (itemIDs.length > 1) {
preloadItems(relationshipTypeName, itemIDs);
for (i = 0; i < itemIDs.length; i++) {
relationshipItem = tmpItem.selectSingleNode('Relationships/Item[@id="' + itemID + '"]');
if ((relationshipItem.getAttribute("isTemp") || relationshipItem.getAttribute("isDirty")) && !wasSaved) {
alert(aras.getResource("", "relationshipsgrid.copy_without_saving"));
copiedItem = aras.copyRelationship(relationshipTypeName, itemID);
itemArr.push(copiedItem);
aras.AlertError(aras.getResource("", "relationshipsgrid.failed_get_item_id", itemID), null, null, window);
aras.clipboard.copy(itemArr);
updateControls(itemIDs[0]);
if (topWindow_Experimental.updateMenuState) {
topWindow_Experimental.updateMenuState();
if (topWindow_Experimental.updateItemsGrid) {
topWindow_Experimental.updateItemsGrid(item);
function onPaste_internal(relsArr, pasteAsIs, pasteAsNew) {
var requestConfirmation = true,
currentItem, newRelationship,
for (i = 0; i < relsArr.length; i++) {
currentItem = relsArr[i];
newRelationship = aras.pasteRelationship(item, currentItem, pasteAsIs, pasteAsNew, RelType_Nm, RELATED_IT_NAME, requestConfirmation);
aras.AlertError(aras.getResource("", "relationshipsgrid.pasting_failed"), null, null, window);
if (typeof (newRelationship) == "string" && newRelationship == "user abort") {
if (requestConfirmation) {
requestConfirmation = false;
var relatedItm = newRelationship.selectSingleNode("related_id/Item");
callback4NewCmd = callbackFunction4NewCmd;
callbackFunction4NewCmd_data_bf = false;
addRow(newRelationship, relatedItm, false);
aras.AlertSuccess(aras.getResource("", "relationshipsgrid.pasting_completed_success"));
if (parent.updateItemsGrid) {
parent.updateItemsGrid(item);
if (parent.updateMenuState) {
parent.updateMenuState();
var relsArr = aras.clipboard.paste();
var as_is_Flg = (aras.getItemProperty(RelType_Nd, "copy_permissions") == "1");
var as_new_Flg = (aras.getItemProperty(RelType_Nd, "create_related") == "1");
return onPaste_internal(relsArr, as_is_Flg, as_new_Flg);
function updateRedlineView() {
redlineController.RefreshRedlineView();
function RedlineController() {
this.isRedlineActive = false;
this.isGridRedlinable = false;
this.searchAmlBackup = null;
this.searchIdBackup = null;
this.isRedlineReady = false;
this._releasedInitXML = null;
this.isBaseXmlLoaded = false;
this.InitRedlinePreference = function () {
this.isRedlineActive = (this.isGridRedlinable && ("1" === aras.getPreferenceItemProperty("Core_RelGridLayout", RelType_ID, "redline_view")));
if (this.isRedlineActive) {
this.redlineButton = activeToolbar.getItem("redline");
if (this.redlineButton) {
this.redlineButton.setState(this.isRedlineActive);
this.InitRedlineControls = function () {
var itemType = aras.getItemTypeNodeForClient(itemTypeName, "name"),
isVersionable = aras.getItemProperty(itemType, "is_versionable");
this.isGridRedlinable = (isVersionable === "1");
this.redlineButton = activeToolbar.getItem("redline");
setControlEnabled("redline", this.isGridRedlinable);
this.IsReleasedVersionExists = function () {
var configId = aras.getItemProperty(item, "config_id");
var itemType = aras.getItemTypeNodeForClient(itemTypeName, "name"),
instanceData = aras.getItemProperty(itemType, "instance_data"),
"<Item type='" + itemTypeName + "' action='GetReleasedMaxGenerationRelGrid'>" +
"<config_id>" + configId + "<\/config_id>" +
"<instance_data>" + instanceData + "<\/instance_data>" +
response = aras.soapSend("ApplyItem", lastReleasedAml);
if (response.isFault()) {
if (response.getFaultCode() != 0) {
aras.AlertError(response, null, null, window);
topWindow_Experimental.prevReleasedDom = response;
this.GetLastReleasedInitXML = function () {
var tempDom = topWindow_Experimental.prevReleasedDom.results,
result = tempDom.selectSingleNode(aras.XPathResult()),
itemNode = result.selectSingleNode("Item"),
releasedId = itemNode.getAttribute("id"),
aml = "<Item type='" + relationshipTypeName + "' action='get' page='1'>" +
" <source_id condition='like'>" + releasedId + "<\/source_id> " +
res = aras.soapSend("ApplyItem", aml);
if (res.getFaultCode() != 0) {
aras.AlertError(res, null, null, window);
tempDom = res.isFault() ? createEmptyResultDom() : res.results;
aras.uiPrepareDOM4XSLT(tempDom, RelType_ID, "RT_");
return getGenerateRelationshipsGridXML(tempDom);
function enableSearchModesMenu(enable) {
var menu = searchContainer.menu;
function menu_setControlEnabled(ctrlName, b) {
var mi = menu.findItem(ctrlName);
function menu_setControlState(ctrlName, b) {
var mi = menu.findItem(ctrlName);
var searchModes = aras.getSearchModes();
for (var i = 0; i < searchModes.length; i++) {
var sModeId = aras.getItemProperty(searchModes[i], "id");
menu_setControlEnabled(sModeId, enable);
this.RefreshRedlineView = function () {
if (!this.isRedlineReady) {
this.CheckReleasedVersion();
var itemNode = aras.getItemTypeNodeForClient(itemTypeName),
isVersionable = aras.getItemProperty(itemNode, "is_versionable");
if (isVersionable == "0" || !isVersionable) {
alert("Type not allow versions");
if (this._releasedInitXML) {
if (!this.isBaseXmlLoaded) {
grid.loadBaselineXML_Experimental(this._releasedInitXML);
grid.AddAllColumnsToDiffView();
grid.RemoveColumnFromDiffView("L");
this.isBaseXmlLoaded = true;
grid.EnableDiffMode = true;
this.isRedlineReady = true;
grid.refreshRedlineView_Experimental();
this.CheckReleasedVersion = function () {
if (!topWindow_Experimental.releasedInitXML) {
topWindow_Experimental.releasedInitXML = new Array();
if (topWindow_Experimental.window.IsReleasedVersionExists === undefined) {
topWindow_Experimental.window.IsReleasedVersionExists = this.IsReleasedVersionExists();
if (topWindow_Experimental.window.IsReleasedVersionExists) {
if (topWindow_Experimental.releasedInitXML[relationshipTypeName] === undefined) {
topWindow_Experimental.releasedInitXML[relationshipTypeName] = this.GetLastReleasedInitXML();
this._releasedInitXML = topWindow_Experimental.releasedInitXML[relationshipTypeName];
this.ToggleRedline = function () {
this.CheckReleasedVersion();
if (!topWindow_Experimental.window.IsReleasedVersionExists) {
aras.AlertError(aras.getResource("", "relationshipsgrid.no_released_generation"), null, null, window);
if (!this.isRedlineActive) {
this.IsRedlineCanBeDisable = function () {
return this.isRedlineActive && this.isRedlineReady;
this.EnableRedline = function () {
this.isRedlineActive = true;
this.redlineButton.setState(true);
if (this.RefreshRedlineView() == null) {
this.isRedlineActive = false;
this.redlineButton.setState(false);
this.RestoreSearchMode();
aras.setPreferenceItemProperties("Core_RelGridLayout", RelType_ID, { redline_view: "1" });
this.DisableRedline = function () {
if (this.isRedlineReady) {
this.isRedlineActive = false;
this.isRedlineReady = false;
this.redlineButton.setState(false);
grid.EnableDiffMode = false;
this.RestoreSearchMode();
aras.setPreferenceItemProperties("Core_RelGridLayout", RelType_ID, { redline_view: "0" });
this.TurnOffSearch = function () {
setControlEnabled("search_mode", false);
this.searchIdBackup = currentSearchMode.id;
this.searchAmlBackup = currentSearchMode.getAml();
searchContainer._updateAutoSavedSearch();
if (currentSearchMode.name != "NoUI") {
var noUISearchMode = getSearchModeByName("NoUI");
searchContainer.showSearchMode(aras.getItemProperty(noUISearchMode, "id"));
currentSearchMode.clearSearchCriteria();
currentSearchMode.setPageNumber(1);
this.RestoreSearchMode = function () {
if (this.searchIdBackup != null && this.searchAmlBackup != null) {
currentSearchMode.setAml(this.searchAmlBackup);
searchContainer.showSearchMode(this.searchIdBackup);
setControlEnabled("search_mode", true);
function getSearchModeByName(sModeName) {
var modes = aras.getSearchModes();
for (var i = 0; i < modes.length; i++) {
if (aras.getItemProperty(modes[i], "name") == sModeName) {
function onPasteSpecial() {
title: aras.getResource("", "clipboardmanager.clipboard_manager"),
itemsArr: new Array(item),
srcItemTypeId: aras.getItemTypeId(itemTypeName),
targetRelationshipTN: RelType_Nm,
targetRelatedTN: RELATED_IT_NAME,
dialogHeight: 450, dialogWidth: 700,
content: "ClipboardManager.html"
(topWindow_Experimental.main || topWindow_Experimental).ArasModules.Dialog.show("iframe", params).promise.then(function (res) {
var clipboardItems = aras.clipboard.clItems;
var ids = [].slice.call(res.ids);
var relsArr = ids.map(function (value) {
return clipboardItems[value];
onPaste_internal(relsArr, res.as_is, res.as_new);
function onDeletePressed() {
if (!relationships.isEditMode) {
currSelCell = grid.getSelectedCell();
currSelRowId = currSelCell.getRowId();
currSelCol = currSelCell.getColumnIndex();
var p = propsArr[currSelCol];
var fileItemTypeNd = aras.getItemTypeNodeForClient("File");
var fileItemTypeId = (fileItemTypeNd) ? fileItemTypeNd.getAttribute("id") : "";
if (p && fileItemTypeId && p.data_type == "item" && p.data_source == fileItemTypeId) {
var currItemNd = item.selectSingleNode("Relationships/Item[@id='" + currSelRowId + "']");
if (currItemNd && p.DRL == "R") {
currItemNd = currItemNd.selectSingleNode("related_id/Item");
var itm2CheckIsLocked = (p.DRL == "R") ? currItemNd : item;
var doSetNull = (currItemNd && (aras.isLockedByUser(itm2CheckIsLocked) || aras.isTempEx(currItemNd)));
doSetNull = (doSetNull && aras.getItemProperty(currItemNd, p.name));
doSetNull = aras.confirm(aras.getResource("", "relationshipsgrid.clear_file_field"));
var fileNd = currItemNd.selectSingleNode(p.name + "/Item[@type='File']");
aras.setItemProperty(currItemNd, p.name, null);
setDirtyAttribute(currItemNd);
setDirtyAttribute(itm2CheckIsLocked);
currSelCell.setValue("");
updateControls(currSelRowId);
if (fileNd && aras.isTempEx(fileNd)) {
aras.removeFromCache(fileNd);
function relshipsGrid_showInputHelperDialog(rowID, column) {
var currSelColOrder = grid.grid_Experimental.layout.cells[column].layoutIndex,
propDataType = propsArr[currSelColOrder].data_type,
isInputRow = (rowID === "input_row");
currSelRowId = "input_row";
currSelCell = grid.cells(rowID, currSelColOrder);
propSource_ITName = aras.getItemTypeName(propsArr[currSelColOrder].data_source);
showDialog(propSource_ITName);
lookUp(currSelRowId, currSelCol);
var RelTypeIT = (propsArr[currSelColOrder].DRL === "R") ? RelatedItemType_Nd : DescByItemType_Nd,
propNd = RelTypeIT.selectSingleNode('Relationships/Item[@type="Property" and name="' + propsArr[currSelColOrder].name + '"]');
format = aras.getItemProperty(propNd, "pattern"),
prevVal = systemGetValueForCurrentCell();
format = aras.getDotNetDatePattern(format);
showDateDialog(prevVal, format);
lookUp(currSelRowId, currSelCol);
function onLink(LinkItemType, LinkItemID) {
aras.uiShowItem(LinkItemType, LinkItemID, undefined);
function onDoubleClick(rowId) {
if (computeCorrectControlState("show_item") && showRelatedItemById(rowId)) {
} else if (computeCorrectControlState("show_relationship")) {
return showRelationshipById(rowId);
var Synchronizers = new Object();
function Synchronizer(relID, win, tmout) {
this.rel_LastModifiedOn = -1;
this.related_LastModifiedOn = -1;
var relNd = item.selectSingleNode("Relationships/Item[@id='" + this.relID + "']");
var relatedNd = relNd.selectSingleNode("related_id/Item");
this.relationshipPresence = (relNd != null);
this.relatedPresence = (relatedNd != null);
if (tmout == undefined) {
Synchronizers[relID] = this;
this.interval = setInterval('if (Synchronizers["' + relID + '"] && Synchronizers["' + relID + '"].updateData) Synchronizers["' + relID + '"].updateData();', tmout);
Synchronizer.prototype.getLastModified = function Synchronizer_getLastModified(itemNd) {
var attrNm = "LastModifiedOn";
if (itemNd && itemNd.getAttribute(attrNm)) {
res = parseInt(itemNd.getAttribute(attrNm));
if (isNaN(res)) res = -1;
Synchronizer.prototype.stop = function Synchronizer_stop() {
clearInterval(this.interval);
delete Synchronizers[this.relID];
Synchronizer.prototype.updateData = function Synchronizer_updateData() {
if (aras.isWindowClosed(this.win)) {
var relNd = aras.getItemRelationship(item, RelType_Nm, this.relID, true);
relatedNd = relNd.selectSingleNode("related_id/Item");
var rel_id = relNd.selectSingleNode("related_id[.!='']");
var query = '<Item type="' + RelType_Nm + '" id="' + this.relID + '" select="related_id" action="get"/>';
var res = aras.soapSend("ApplyItem", query);
var new_rel_id = res.results.selectSingleNode(aras.XPathResult("/Item/related_id"));
relNd.replaceChild(new_rel_id, rel_id);
relatedNd = relNd.selectSingleNode("related_id/Item");
if (!relNd && this.relationshipPresence) {
grid.setSelectedRow(this.relID, false, false);
if (!relatedNd && this.relatedPresence) {
grid.setSelectedRow(this.relID, false, false);
var rel_LastModifiedOnValue = this.getLastModified(relNd);
var relalted_LastModifiedOnValue = this.getLastModified(relatedNd);
(rel_LastModifiedOnValue > this.rel_LastModifiedOn)
(relalted_LastModifiedOnValue > this.related_LastModifiedOn));
this.rel_LastModifiedOn = rel_LastModifiedOnValue;
this.related_LastModifiedOn = relalted_LastModifiedOnValue;
updateRow(relNd, relatedNd, false, true);
function relatedItemLockListener(params) {
var itemID = params.itemID;
var new_ritem = params.itemNd;
var rels = item.selectNodes("Relationships/Item[@type='" + RelType_Nm + "' and (related_id/Item/@id='" + itemID + "' or related_id='" + itemID + "')]");
var selectedRows = grid.getSelectedItemIds();
for (var i = 0; i < rels.length; i++) {
var relId = rel.getAttribute("id");
if (selectedRows.indexOf(relId) > -1) {
if (new_ritem != rel.selectSingleNode('related_id/Item[@id="' + itemID + '"]')) {
aras.setItemProperty(rel, "related_id", new_ritem.cloneNode(true), false);
updateRow(rel, new_ritem, false, true);
function ItemSaveListener(params) {
var itemID = params.itemID;
var new_ritem = params.itemNd;
var new_ritemID = new_ritem.getAttribute("id");
var isNewVersion = (new_ritemID != itemID);
var oldVersionsXPath = "Relationships/Item[@type='" + RelType_Nm + "' and (related_id/Item/@id='" + itemID + "' or related_id='" + itemID + "')]";
var newVersionsXPath = "Relationships/Item[@type='" + RelType_Nm + "' and (related_id/Item/@id='" + new_ritemID + "' or related_id='" + new_ritemID + "')]";
var selectedRows = grid.getSelectedItemIds();
var rels2NewVers = item.selectNodes(newVersionsXPath);
for (var i = 0; i < rels2NewVers.length; i++) {
var rel = rels2NewVers[i];
var relId = rel.getAttribute("id");
if (selectedRows.indexOf(relId) > -1) {
updateRow(rel, new_ritem, false, true);
var rels = item.selectNodes(oldVersionsXPath);
for (var i = 0; i < rels.length; i++) {
var relId = rel.getAttribute("id");
if (selectedRows.indexOf(relId) > -1) {
var callUpdateRow = false;
var replaceWithNewVersion = false;
if (aras.isTempEx(rel)) {
replaceWithNewVersion = true;
var req = "<Item type='" + RelType_Nm + "' select='related_id' action='get' related_expand='0' id='" + relId + "'/>";
var res = aras.soapSend("ApplyItem", req);
if (res.getFaultCode() == 0) {
var related_idNd = res.results.selectSingleNode(aras.XPathResult("/Item/related_id"));
replaceWithNewVersion = (new_ritemID == related_idNd.text);
if (replaceWithNewVersion) {
aras.setItemProperty(rel, "related_id", new_ritem.cloneNode(true));
updateRow(rel, new_ritem, false, true);
updateControls(rowId, true);
var ItemName = aras.getItemProperty(item, "name");
if (ItemName == "ItemType" && itemTypeName == 'ItemType') {
function showRelatedItemById(relID) {
var ritem = item.selectSingleNode('Relationships/Item[@id="' + relID + '"]/related_id[not(@discover_only="1")]/Item');
if (!ritem || ritem.getAttribute("loadedPartialy") != "0") {
mergeWithServerDataIfRequired(relID);
ritem = item.selectSingleNode('Relationships/Item[@id="' + relID + '"]/related_id[not(@discover_only="1")]/Item');
ritem = aras.replacePolyItemNodeWithNativeItem(ritem);
var ritemID = ritem.getAttribute("id");
var win = aras.uiFindWindowEx(ritemID);
if (win && (win.fromRelationships == undefined || win.fromRelationships != itemID)) {
aras.AlertError(aras.getResource("", "relationshipsgrid.already_open"), null, null, window);
aras.uiShowItemEx(ritem, "tab view");
win = aras.uiFindWindowEx(ritemID);
win.fromRelationships = itemID;
new Synchronizer(relID, win);
function showRelationshipById(relID) {
var rel = item.selectSingleNode('Relationships/Item[@id="' + relID + '" and not(@discover_only="1")]');
mergeWithServerDataIfRequired(relID);
var win = aras.uiFindWindowEx(relID);
if (win && (win.fromRelationships == undefined || win.fromRelationships != itemID)) {
aras.AlertError(aras.getResource("", "relationshipsgrid.already_open"), null, null, window);
aras.uiShowItemEx(rel, "tab view");
win = aras.uiFindWindowEx(relID);
win.fromRelationships = itemID;
new Synchronizer(relID, win);
function showFileFromCell() {
var fileId = findFileId();
aras.uiShowItem("File", fileId);
var rel = item.selectSingleNode('Relationships/Item[@id="' + popupMenuRowId + '" and (not(action) or (action!="delete" and action!="purge"))]');
var prop = propsArr[popupMenuCol];
if (prop.data_source != FileIT_ID_const) {
itm = rel.selectSingleNode('related_id/Item');
} else if (propDRL == "D") {
return aras.getItemProperty(itm, prop.name);
function addRelationship(relatedItm) {
callbackFunction4NewCmd_data_bf = false;
newRelationship(false, relatedItm);
function showDialog2(relatedIT_ID, pick_replace) {
function addRelationshipHandler(result, type_of_action) {
if (type_of_action == "doubleclick") {
var type = aras.getItemTypeName(relatedIT_ID);
var itmID = result.item.getAttribute("id");
addRelationship(aras.getItemById(type, itmID, 0));
var callback = function (res) {
if (!res || res.length == 0) {
var type = aras.getItemTypeName(relatedIT_ID);
aras.AlertError(aras.getResource("", "relationshipsgrid.related_item_cannot_null"), null, null, window);
setTimeout("changeRelationship(true);", 1);
changeRelationship(false, res);
var itms = preloadItems(type, res);
for (var i = 0; i < itms.length; i++) {
var param = { aras: aras, itemtypeID: relatedIT_ID, itemContext: item, callback: callback };
param.itemSelectedID = currSelRowId;
param.multiselect = false;
mergeWithServerDataIfRequired(currSelRowId);
param.itemSelectedID = itemID;
param.handler = addRelationshipHandler;
param.multiselect = true;
param.argType = "object";
param.sourceItemTypeName = (DescByItemType_Nd) ? aras.getItemProperty(DescByItemType_Nd, "name") : "";
param.sourcePropertyName = "related_id";
param.type = "SearchDialog";
(topWindow_Experimental === aras.getMainWindow() ? topWindow_Experimental.main : topWindow_Experimental).ArasModules.MaximazableDialog.show('iframe', param).promise.then(callback);
function preloadItems(type, resArray) {
if (!resArray || resArray.length == 0) {
var idsArrayForLoad = new Array();
for (var i = 0; i < resArray.length; i++) {
var item = aras.itemsCache.getItem(resID);
if (aras.isDirtyEx(item) || aras.isTempEx(item)) {
idsArrayForLoad.push("'" + resID + "'");
idsArrayForLoad.push("'" + resID + "'");
if (idsArrayForLoad.length > 0) {
var loadedItms = aras.loadItems(type, "<id condition='in'>" + idsArrayForLoad.join(',') + "</id>");
for (var i = 0; i < loadedItms.length; i++) {
itms.push(loadedItms[i]);
function newRelationship(showSearchDialog, relatedNd, relationshipCallback) {
if (showSearchDialog == undefined) {
showSearchDialog = false;
var RelType_ID = aras.getRelationshipTypeId(RelType_Nm);
var relatedIT_ID = aras.getItemProperty(RelType_Nd, 'related_id');
aras.AlertError(aras.getResource("", "relationshipsgrid.related_it_not_spec", RelType_Nm), null, null, window);
showDialog2(relatedIT_ID);
var newRel = aras.newRelationship(RelType_ID, item, false, window, relatedNd);
if (newRel && newRel.then) {
newRel.then(processAdding);
function processAdding(relNd) {
callback4NewCmd = callbackFunction4NewCmd;
var selectedChoiceOption = getSelectedChoiceItem();
if (selectedChoiceOption == NoRelatedOption) {
var rel_id = relNd.selectSingleNode("related_id");
rel_item = rel_id.selectSingleNode("Item");
rel_id.removeChild(rel_item);
rel_id = relNd.appendChild(relNd.ownerDocument.createElement("related_id"));
rel_id.setAttribute("is_null", "1");
} else if (selectedChoiceOption == CreateRelatedOption) {
if (RelType_Nm == "View") {
var formNode = relNd.selectSingleNode("related_id/Item[@type='Form']");
var class_structure = aras.getItemProperty(item, "class_structure");
if (class_structure != "") {
var structDom = aras.createXMLDocument();
structDom.loadXML(class_structure);
var tmpNd = structDom.selectSingleNode("/*");
addCond = " or form_classification='/" + tmpNd.getAttribute("name") + "'";
var formToCopy = item.selectSingleNode(
"Relationships/Item[@type='View'][role/@keyed_name='World'][type='default']" +
"[not(form_classification) or form_classification=''" + addCond + "]/related_id/Item[@type='Form']");
formToCopy = aras.getItemById("Form", formToCopy.getAttribute("id"), 1, "Body", "id");
var bodyToCopy = formToCopy.selectSingleNode("Relationships/Item[@type='Body']");
var newBodyNd = aras.copyItemEx(bodyToCopy, "copy", false);
var nodesToDelete = newBodyNd.selectNodes(".//source_id");
for (var i = 0; i < nodesToDelete.length; i++) {
nodesToDelete[i].parentNode.removeChild(nodesToDelete[i]);
var oldBodyNd = formNode.selectSingleNode("Relationships/Item[@type='Body']");
oldBodyNd.parentNode.replaceChild(newBodyNd, oldBodyNd);
if (relationshipCallback) {
relationshipCallback(relNd);
relNd = item.selectSingleNode("Relationships").appendChild(relNd);
if (!aras.isTempEx(item)) {
var relatedItm = relNd.selectSingleNode("related_id/Item");
if (aras.isPolymorphic(RelatedItemType_Nd) && !aras.getItemProperty(relatedItm, "itemtype")) {
var typeId = relatedItm.getAttribute("typeId");
if (!typeId || typeId === "") {
var typeName = relatedItm.getAttribute('type');
typeId = aras.getItemTypeId(typeName);
aras.setItemProperty(relatedItm, 'itemtype', typeId);
addRow(relNd, relatedItm, false);
function changeRelationship(showSearchDialog, newRelatedNode, targetItemId) {
var relatedIT_ID = aras.getItemProperty(RelType_Nd, "related_id");
showSearchDialog = (showSearchDialog !== undefined) ? Boolean(showSearchDialog) : true;
aras.AlertError(aras.getResource("", "relationshipsgrid.related_it_not_spec", RelType_Nm), null, null, window);
showDialog2(relatedIT_ID, true);
aras.AlertError(aras.getResource("", "relationshipsgrid.cant_change_relship"), null, null, window);
topWindow_Experimental.focus();
var relationshipId = targetItemId || grid.getSelectedId();
aras.AlertError(aras.getResource("", "relationshipsgrid.select_relship"), null, null, window);
var relNd = item.selectSingleNode('Relationships/Item[@id="' + relationshipId + '"]');
aras.AlertError(aras.getResource("", "relationshipsgrid.no_relship_item_found"), null, null, window);
var relatedIdNode = relNd.selectSingleNode("related_id");
relNd.removeChild(relatedIdNode);
relatedIdNode = relNd.appendChild(relNd.ownerDocument.createElement("related_id"));
var related_id = aras.getItemProperty(newRelatedNode, "id");
if (item == newRelatedNode) {
newRelatedNode = item.cloneNode(true);
newRelatedNode.setAttribute("action", "skip");
var relationshipsNd = newRelatedNode.selectSingleNode("Relationships");
newRelatedNode.removeChild(relationshipsNd);
relatedIdNode.appendChild(newRelatedNode);
if (null != relatedIdNode.getAttribute("is_null")) {
relatedIdNode.setAttribute("is_null", "0");
if (null == relNd.getAttribute("action")) {
relNd.setAttribute("action", "update");
if (aras.isPolymorphic(RelatedItemType_Nd) && newRelatedNode && !aras.getItemProperty(newRelatedNode, "itemtype")) {
aras.setItemProperty(newRelatedNode, "itemtype", newRelatedNode.getAttribute("typeId"));
if (!aras.isTempID(itemID)) {
updateRow(relNd, newRelatedNode, false, true);
updateControls(relationshipId);
if (relationships && relationships.updateTabbarState) {
relationships.updateTabbarState(RelType_ID);
function removeRelatedItem(relationshipId) {
var relationshipId = relationshipId || grid.getSelectedId();
aras.AlertError(aras.getResource("", "relationshipsgrid.select_relship"), null, null, window);
var relationshipNode = item.selectSingleNode('Relationships/Item[@id="' + relationshipId + '"]');
var relatedId = relationshipNode.selectSingleNode("related_id");
relatedItem = relatedId.selectSingleNode("Item");
relatedId.removeChild(relatedItem);
relatedId = relationshipNode.appendChild(relationshipNode.ownerDocument.createElement("related_id"));
relatedId.setAttribute("is_null", "1");
if (null == relationshipNode.getAttribute("action")) {
relationshipNode.setAttribute("action", "update");
updateRow(relationshipNode, null, false);
if (relationships && relationships.updateTabbarState) {
relationships.updateTabbarState(RelType_ID);
function deleteRelationship() {
var ids = grid.getSelectedItemIds();
aras.AlertError(aras.getResource("", "relationshipsgrid.select_relship"), null, null, window);
var rowIdToSelect = undefined;
grid.grid_Experimental.beginUpdate();
var relationshipNodesCollection = {};
var relationshipNodes = item.selectNodes('Relationships/Item');
for (var index = 0; index < relationshipNodes.length; index++) {
var relationshipNode = relationshipNodes[index];
var relationshipId = relationshipNode.getAttribute("id");
relationshipNodesCollection[relationshipId] = relationshipNode;
for (var j = 0; j < ids.length; j++) {
aras.AlertError(aras.getResource("", "relationshipsgrid.select_relship"), null, null, window);
var clItem = aras.clipboard.getItem(relId)
var res = aras.confirm(aras.getResource("", "relationshipsgrid.delete_from_clipboard_not_future_pasting"));
var rel = relationshipNodesCollection[relId];
if (!handleRowEvent("ondeleterow", relId)) {
var act = rel.getAttribute("action");
var deleteRowFromGrid = false;
rel.parentNode.removeChild(rel);
deleteRowFromGrid = true;
rel.setAttribute("action", "delete");
if (!aras.isTempID(itemID)) {
deleteRowFromGrid = redlineController.isRedlineActive;
var indexRow = grid.getRowIndex(relId);
var itemToDelete = grid.grid_Experimental.getItem(indexRow);
grid.grid_Experimental.store.deleteItem(itemToDelete);
if (redlineController.isRedlineActive) {
redlineController.RefreshRedlineView();
for (var i = 0; i < grid.GetColumnCount() ; i++) {
var cell = grid.cells(relId, i);
cell.setFont(deletedFont_const);
cell.setTextColor(deletedTextColor_const);
if (relationships && relationships.updateTabbarState) {
relationships.updateTabbarState(RelType_ID);
grid.grid_Experimental.store.save();
grid.grid_Experimental.endUpdate();
onSelectItem(rowIdToSelect, null, false, false);
function lockRelatedItem(b) {
var selectedIds = grid.getSelectedItemIds();
if (selectedIds.length === 0) {
aras.AlertError(aras.getResource("", "relationshipsgrid.select_relship"), null, null, window);
var idsArray = selectedIds.map(function (id) { return "@id=\"" + id + "\""; });
var relatedNds = item.selectNodes("Relationships/Item[" + idsArray.join(" or ") + "]/related_id/Item");
var lockFunc = b ? aras.lockItemEx.bind(aras) : aras.unlockItemEx.bind(aras);
var res = Array.prototype
.map.call(relatedNds, function (relatedNode) { return lockFunc(relatedNode); })
.every(function (response) { return !!response; });
var relationshipsWithoutRelatedItem = item.selectSingleNode("Relationships/Item[not(related_id) and (" + idsArray.join(" or ") + ")]");
if (relationshipsWithoutRelatedItem) {
aras.AlertError(aras.getResource("", "relationshipsgrid.related_item_not_found"), null, null, window);
function promoteRelationship() {
var relId = grid.getSelectedId();
aras.AlertError(aras.getResource("", "relationshipsgrid.select_relship"), null, null, window);
var rel = item.selectSingleNode('Relationships/Item[@id="' + relId + '"]');
title: aras.getResource("", "promotedlg.propmote", aras.getKeyedNameEx(rel)),
dialogWidth: 400, dialogHeight: 300, resizable: true,
content: "promoteDialog.html"
(topWindow_Experimental.main || topWindow_Experimental).ArasModules.Dialog.show("iframe", params).promise.then(function (res) {
if (typeof (res) === "string" && res === "null") {
rel.parentNode.removeChild(rel);
updateRow(res, res.selectSingleNode("related_id/Item"), false, true);
for (var i = grid.getRowsNum() - 1; i >= 0; i--) {
grid.deleteRow(grid.getRowId(i));
var deletedRows = new Object();
function updateAfterSave() {
if (itemTypeName == "ItemType") {
item = aras.getItemTypeNodeForClient(aras.getItemTypeName(itemID));
item = aras.getItemById(itemTypeName, itemID, 0);
for (var rowId in deletedRows) {
delete deletedRows[rowId];
function updateRelationshipsWithInformationFromSearch(itemsNodes) {
if (itemsNodes.length == 0) {
var relshipsXml = aras.createXMLDocument();
relshipsXml.loadXML("<Relationships />");
for (var i = 0; i < itemsNodes.length; i++) {
relshipsXml.documentElement.appendChild(itemsNodes[i].cloneNode(true));
aras.mergeItemRelationships(item, relshipsXml);
var relationshipItemsNodes = item.selectNodes("Relationships/Item");
var relationshipItemCollection = {};
for (var index = 0; index < relationshipItemsNodes.length; index++) {
var relationshipItemsNode = relationshipItemsNodes[index];
var relationshipItemId = relationshipItemsNode.getAttribute("id");
relationshipItemCollection[relationshipItemId] = relationshipItemsNode;
for (var i = 0; i < itemsNodes.length; i++) {
var tmpItem = itemsNodes[i];
var tmpId = tmpItem.getAttribute("id");
var tmpRelationship = relationshipItemCollection[tmpId];
if (tmpRelationship && "0" == tmpRelationship.getAttribute("loadedPartialy")) {
tmpRelationship.removeAttribute("loadedPartialy");
if ("" != RELATED_IT_NAME && tmpRelationship) {
var tmpRelated = tmpRelationship.selectSingleNode("related_id/Item");
if (tmpRelated && "0" == tmpRelated.getAttribute("loadedPartialy")) {
tmpRelated.removeAttribute("loadedPartialy");
function syncWithClient(resDom) {
var res = resDom.selectSingleNode(aras.XPathResult());
var xpath_start = "Relationships/Item[@type='" + RelType_Nm + "' and (";
updateRelationshipsWithInformationFromSearch(res.selectNodes("Item"));
var itms = item.selectNodes(xpath_start + " (@action='delete' or @action='purge') or (@isTemp='1' or @isDirty='1'))]");
for (var i = 0; i < itms.length; i++) {
var itm_id = itm.getAttribute("id");
var item_isTemp = aras.isTempEx(itm);
var bad_itm = res.selectSingleNode("Item[@id='" + itm_id + "']");
res.replaceChild(itm.cloneNode(true), bad_itm);
res.appendChild(itm.cloneNode(true));
res.appendChild(itm.cloneNode(true));
if (redlineController.isRedlineActive) {
var relsToRemoveNds = res.selectNodes("Item[@type='" + RelType_Nm + "' and (@action='delete' or @action='purge')]");
for (var i = 0, L = relsToRemoveNds.length; i < L; i++) {
var relsToRemoveNd = relsToRemoveNds[i];
res.removeChild(relsToRemoveNd);
if (RELATED_IT_NAME != "") {
itms = res.selectNodes("Item[@type='" + RelType_Nm + "' " +
" and related_id and not(related_id/Item) and related_id != '' " +
for (var i = 0; i < itms.length; i++) {
var related_id = aras.getItemProperty(itm, "related_id");
var rItm = aras.getItemById(RELATED_IT_NAME, related_id, 0);
var rItmKN = aras.getKeyedNameEx(rItm);
var related_id_nd = itm.selectSingleNode("related_id");
related_id_nd.appendChild(rItm.cloneNode(true));
related_id_nd.setAttribute("keyed_name", rItmKN);
function generateXML4Relationship(relationshipNd) {
var tmpDom = createEmptyResultDom();
var res = tmpDom.selectSingleNode(aras.XPathResult());
res.appendChild(relationshipNd.cloneNode(true));
aras.uiPrepareDOM4XSLT(tmpDom, RelType_ID, "RT_");
var grid_xml = getGenerateRelationshipsGridXML(tmpDom);
tmpDom.loadXML(grid_xml);
function system_UpdateGridCell(cell, tdNd) {
var td_textColor = tdNd.getAttribute("textColor");
var td_link = tdNd.getAttribute("link");
var td_bgColor = tdNd.getAttribute("bgColor");
var td_font = tdNd.getAttribute("font");
var td_value = tdNd.text;
if (td_textColor) try { cell.setTextColor(td_textColor); } catch (excep) { }
if (td_link) cell.setLink(td_link);
if (td_bgColor) try { cell.setBgColor_Experimental(td_bgColor); } catch (excep) { }
if (td_font) cell.setFont(td_font);
function updateRow(relNd, relatedNd, markDirty, onlyUI, checkRelated) {
if (checkRelated === undefined) {
var relId = relNd.getAttribute("id");
if (checkRelated && relatedNd) {
var related_id = relatedNd.getAttribute("id");
"[@type='" + RelType_Nm + "' " +
"and (related_id='" + related_id + "' or related_id/Item/@id='" + related_id + "') " +
"and @id!='" + relId + "']"
for (var i = 0; i < rels2update.length; i++) {
var aRel = rels2update[i];
var relatedId = relatedNd.getAttribute('id');
if (relatedNd != aRel.selectSingleNode('related_id/Item[@id="' + relatedId + '"]')) {
aras.setItemProperty(aRel, "related_id", relatedNd.cloneNode(true), false);
updateRow(aRel, relatedNd, markDirty, onlyUI, false);
var tmpDom = aras.createXMLDocument();
var tmpNd = relNd.cloneNode(true);
var tmpNd2 = tmpNd.selectSingleNode("related_id");
tmpNd.removeChild(tmpNd2);
tmpNd2 = tmpNd.appendChild(tmpDom.createElement("related_id"));
tmpNd2.appendChild(relatedNd.cloneNode(true));
tmpDom = generateXML4Relationship(tmpNd);
var tds = tmpDom.selectNodes("/table/tr[@id='" + relId + "']/td");
for (var i = 0; i < tds.length; i++) {
var cell = grid.cells(relId, i);
system_UpdateGridCell(cell, td);
function onKeyPressed(key) {
var keyCode = key.keyCode;
if (keyCode == 9 && !key.shiftKey) {
if (grid.focus_Experimental.isLastCell()) {
function addRow(relationshipNode, relatedItemNode, markDirty) {
var clonedRelationship = relationshipNode.cloneNode(true),
sourceDom = createEmptyResultDom(),
tmpDom = createEmptyResultDom(),
targetNode = sourceDom.selectSingleNode(aras.XPathResult()),
aras.setItemProperty(clonedRelationship, "related_id", relatedItemNode.cloneNode(true), false);
targetNode.appendChild(clonedRelationship);
aras.uiPrepareDOM4XSLT(sourceDom, RelType_ID, "RT_");
gridXml = getGenerateRelationshipsGridXML(sourceDom);
rowNode = tmpDom.selectSingleNode("/table/tr");
rowNode.setAttribute("rowState", "new");
addRowInProgress_Number++;
grid.addXMLRows_Experimental("<table>" + rowNode.xml + "<\/table>", true);
rowId = rowNode.getAttribute("id");
if (!item.selectSingleNode('Relationships/Item[@id="' + rowId + '"]')) {
function applyCellEditRG(rowId, field, value) {
if (rowId == "input_row") {
applyCellEditCommon.call(this, rowId, field, value);
var col = fieldsArr.indexOf(field);
if (!bKEYEDNAME_INPUT_IS_IN_PROGRESS) {
var res = onGridCellEdit_mode2(rowId, col);
onInputKeyedNameFinished(value, col);
if (grid.focus_Experimental.isLastCell()) {
if (redlineController.isRedlineActive) {
window.setTimeout(updateRedlineView, 0);
var zeroError = { number: 0, description: aras.getResource("", "relationshipsgrid.ok") };
function checkThatItemTypePropsLoaded() {
if (!item.getAttribute("propsLoaded")) {
aras.getItemRelationships("ItemType", item.getAttribute("id"), "Property");
item.setAttribute("propsLoaded", "1");
var InvalidCellValueAction = { ContinueEdit: 1, Discard: 2 };
function _handleInvalidCellValue(message) {
continueEdit = aras.confirm(message);
continueEdit = aras.showValidationMsg();
return InvalidCellValueAction.ContinueEdit;
return InvalidCellValueAction.Discard;
function startCellEditRG(rowId, field) {
var col = fieldsArr.indexOf(field);
var propDT = propsArr[col].data_type;
var cell = grid.cells(rowId, parseInt(col));
if ("input_row" === rowId) {
if (propDT == "filter list") {
checkThatItemTypePropsLoaded();
var RelTypeIT = aras.getItemProperty(RelType_Nd, (propsArr[col].DRL == 'R') ? 'related_id' : 'relationship_id');
var filterValue = getFilterValue(rowId, col) || "";
var resObj = aras.uiGetFilteredObject4Grid(RelTypeIT, propsArr[col].name, filterValue);
grid.inputRow.set(col, "comboList", resObj.values, resObj.labels);
var currentCellValue = grid.GetCellValue(rowId, parseInt(col));
if (!hasValue(resObj.values, currentCellValue)) {
grid.inputRow.set(col, "value", "");
} else if (propDT == "item") {
cell.SetInputHelperIcon("../images/Ellipsis.svg");
cell.InputHelperEnabled = true;
if (RelType_Nm == "Property" && propsArr[col].name == "pattern") {
checkThatItemTypePropsLoaded();
var props = item.selectNodes('Relationships/Item[@type="Property" and (not(@action) or (@action!="delete" and @action!="purge"))]');
for (var i = 0; i < props.length; i++) {
_listVals.push(aras.getItemProperty(props[i], "name"));
grid.inputRow.set(col, "comboList", _listVals);
function hasValue(array, value) {
for (var i = 0; i < array.length; i++) {
function onGridCellEdit_mode2(rowId, col) {
if ("input_row" === rowId) {
var restoreGlobalVar = setGlobalVariableForEditMode(rowId, col);
var cell = grid.cells(rowId, parseInt(col));
var RelTypeIT = (propsArr[col].DRL === 'R') ? RelatedItemType_Nd : DescByItemType_Nd;
var prevCurrSelCell = currSelCell;
var prevCurrSelRowId = currSelRowId;
var prevCurrSelCol = currSelCol;
for (var i = 0; i < propsArr.length; i++) {
if (propsArr[i].data_type == "filter list") {
var propNm = propsArr[i].name;
var propNd = RelTypeIT.selectSingleNode('Relationships/Item[@type="Property" and name="' + propNm + '"]');
var pattern = aras.getItemProperty(propNd, "pattern");
if (pattern == propsArr[parseInt(col)].name) {
var tmp1 = propsArr[col].DRL;
var tmp2 = propsArr[col].name;
tmp1 = getRelationshipProperty(rowId, tmp2);
tmp1 = getRelatedItemProperty(rowId, tmp2);
currSelCell = grid.cells(rowId, i);
if (grid.cells(rowId, col).getValue() != tmp1) {
if (rowId == "input_row") {
try { grid.cells(rowId, i).setValue("") } catch (e) { }
currSelCell = prevCurrSelCell;
currSelRowId = prevCurrSelRowId;
currSelCol = prevCurrSelCol;
if (propsArr[col].DRL == "D") {
itm = item.selectSingleNode('Relationships/Item[@id="' + rowId + '"]');
} else if (propsArr[col].DRL == "R") {
itm = item.selectSingleNode('Relationships/Item[@id="' + rowId + '"]/related_id/Item');
isDescBy = (propsArr[col].DRL == "D");
var propNm = propsArr[col].name;
var propNd = RelTypeIT.selectSingleNode('Relationships/Item[@type="Property" and name="' + propNm + '"]');
var readonly = (aras.getItemProperty(propNd, "readonly") == "1");
if (readonly || !handleCellEvent("oneditstart", currSelRowId, currSelCol)) {
cell.setChecked(cell.isChecked() ? 0 : 1);
val = cell.isChecked() ? 1 : 0;
var propDT = propsArr[col].data_type;
if (RelType_Nm == "RelationshipType") {
var relationship_id_Nd = itm.selectSingleNode("relationship_id/Item");
if (relationship_id_Nd) aras.setItemProperty(relationship_id_Nd, "name", val);
setupProperty(val, true);
handleCellEvent("onchangecell", rowId, currSelCol);
handleCellEvent("oneditfinish", rowId, currSelCol);
restoreGlobalVariableForEditMode(restoreGlobalVar);
function setGlobalVariableForEditMode(rowId, col) {
if (currSelRowId == 'input_row' && rowId !== currSelRowId) {
currSelRowId: currSelRowId,
currSelCell: currSelCell,
currSelCell = grid.cells(rowId, col);
function restoreGlobalVariableForEditMode(restoreGlobalVar) {
currSelRowId = restoreGlobalVar.currSelRowId;
currSelCell = restoreGlobalVar.currSelCell;
currSelCol = restoreGlobalVar.currSelCol;
function onInputKeyedNameFinished(val, col) {
var propSource_ITName = aras.getItemTypeName(propsArr[col].data_source);
var tmpItem = aras.uiGetItemByKeyedName(propSource_ITName, val);
bKEYEDNAME_INPUT_IS_IN_PROGRESS = false;
var keyedName = tmpItem.selectSingleNode("keyed_name").text;
var res = tmpItem.getAttribute("id");
if (propsArr[currSelCol].name == "related_id" && res != itemID) {
var relatedItm = aras.getItemById(RELATED_IT_NAME, res, 0);
aras.AlertError(aras.getResource("", "relationshipsgrid.failed_get_related_item_id", RELATED_IT_NAME, res), null, null, window);
setupProperty(relatedItm, true);
var itm = item.selectSingleNode('Relationships/Item[@id="' + currSelRowId + '"]');
relatedItm = itm.selectSingleNode("related_id/Item");
updateRow(itm, relatedItm);
updateControls(itm.getAttribute("id"));
res = tmpItem.cloneNode(false);
res.setAttribute("action", "skip");
res.setAttribute("keyed_name", keyedName);
setupProperty(res, true);
handleCellEvent("onchangecell", currSelRowId, currSelCol);
handleCellEvent("oneditfinish", currSelRowId, currSelCol);
function setupProperty(propVal, markDirty, onlyUI) {
var propDRL = propsArr[currSelCol].DRL;
var propDT = propsArr[currSelCol].data_type;
var propNm = propsArr[currSelCol].name;
rel = item.selectSingleNode('Relationships/Item[@type="' + RelType_Nm + '" and @id="' + currSelRowId + '"]');
if (!rel && propDRL == "D") {
itm = rel.selectSingleNode("related_id/Item");
if (propVal.xml != undefined) {
aras.setItemProperty(itm, propNm, propVal);
var propValID = propVal.getAttribute("id");
if (aras.isTempEx(propVal) && aras.getItemProperty(rel, "data_type") == "foreign" && propNm == "data_source") {
var propKeyedName = propVal.getAttribute("keyed_name");
if (propKeyedName == '') {
propKeyedName = propValID;
var dsNd = rel.selectSingleNode(propNm);
dsNd.setAttribute("keyed_name", propKeyedName);
} else if (propNm == "data_source") {
var propKeyedName = propVal.getAttribute("keyed_name");
if (propKeyedName == "") {
propKeyedName = propValID;
var dsNd = rel.selectSingleNode(propNm);
dsNd.setAttribute("keyed_name", propKeyedName);
aras.setItemProperty(itm, propNm, propVal);
if (propDT == "ml_string") {
aras.setItemPropertyAttribute(itm, propNm, "xml:lang", aras.getSessionContextLanguageCode());
var relatedId = itm.getAttribute("id");
var relatedItems = item.selectNodes('Relationships/Item[@type="' + RelType_Nm + '"]/related_id/Item[@id="' + relatedId + '"]');
for (var i = 0; i < relatedItems.length; i++) {
setDirtyAttribute(relatedItems[i]);
if (topWindow_Experimental.updateItemsGrid) {
topWindow_Experimental.updateItemsGrid(item);
topWindow_Experimental.updateItemsGrid(itm, false);
var tmpDom = generateXML4Relationship(rel);
var td = tmpDom.selectSingleNode("/table/tr[@id='" + relId + "']/td[position()=" + (parseInt(currSelCol) + 1) + "]");
system_UpdateGridCell(currSelCell, td);
function onAfterSpecialDialog(dialogRes, acceptEmptyString, specialCase) {
if (acceptEmptyString && (dialogRes == undefined || dialogRes == null)
|| (!acceptEmptyString) && (!dialogRes)) {
if ((specialCase !== undefined) && (dialogRes === specialCase)) {
var prevVal = systemGetValueForCurrentCell();
setupProperty(dialogRes, true);
if (prevVal !== dialogRes) {
handleCellEvent("onchangecell", currSelRowId, currSelCol);
handleCellEvent("oneditfinish", currSelRowId, currSelCol);
function showDialog(IT_Name) {
var itm = item.selectSingleNode("Relationships/Item[@id='" + currSelRowId + "']" + ((propsArr[currSelCol].DRL == 'R') ? "/related_id/Item" : ""));
var curITName = (itm) ? itm.getAttribute("type") : "";
var curPropName = propsArr[currSelCol].name;
var params = { aras: aras, itemtypeName: IT_Name, itemContext: item, itemSelectedID: currSelRowId, sourceItemTypeName: curITName, sourcePropertyName: curPropName, multiselect: false };
params.type = "SearchDialog";
(topWindow_Experimental.main || topWindow_Experimental).ArasModules.MaximazableDialog.show("iframe", params).promise.then(function (dlgRes) {
if (dlgRes == undefined) {
if ("input_row" === currSelRowId) {
grid.inputRow.set(currSelCol, "value", dlgRes.keyed_name);
var keyedName = dlgRes.keyed_name;
if (propsArr[currSelCol].name == "related_id" && res != itemID) {
var relatedItm = aras.getItemById(RELATED_IT_NAME, res, 0);
aras.AlertError(aras.getResource("", "relationshipsgrid.failed_get_related_item_id", RELATED_IT_NAME, res), null, null, window);
setupProperty(relatedItm, true);
var itm = item.selectSingleNode('Relationships/Item[@id="' + currSelRowId + '"]');
relatedItm = itm.selectSingleNode("related_id/Item");
updateRow(itm, relatedItm);
updateControls(itm.getAttribute('id'));
res = dlgRes.item.cloneNode(false);
res.setAttribute("action", "skip");
res.setAttribute("keyed_name", keyedName);
setupProperty(res, true);
bKEYEDNAME_INPUT_IS_IN_PROGRESS = false;
handleCellEvent("oneditfinish", currSelRowId, currSelCol);
handleCellEvent("onchangecell", currSelRowId, currSelCol);
function showMLDialog() {
var itm = item.selectSingleNode("Relationships/Item[@id='" + currSelRowId + "']" + ((propsArr[currSelCol].DRL == 'R') ? "/related_id/Item" : ""));
itm = aras.getItemTypeNodeForClient(itemTypeName);
var curPropName = propsArr[currSelCol].name,
oldVal = aras.getItemProperty(itm, curPropName),
dialogHelper = new MLDialogHelper();
dialogHelper.show(topWindow_Experimental.main || topWindow_Experimental, aras, itm, { name: curPropName, stored_length: "", pattern: "" }, !isEditMode,
var isUpdated = dialogHelper.updateItemByShowResult(aras, itm, curPropName, result);
var newVal = aras.getItemProperty(itm, curPropName);
setupProperty(newVal, true);
handleCellEvent("oneditfinish", currSelRowId, currSelCol);
if ("input_row" !== currSelRowId) {
grid.cells(currSelRowId, currSelCol).setValue(newVal);
grid.inputRow.set(currSelCol, "value", newVal);
function showClassStructureDialog(it, dialogType, title) {
var class_structure = aras.getItemProperty(it, "class_structure");
class_structure = "<class id=\"" + aras.getItemProperty(it, "id") + "\" />";
if (item.getAttribute("type") == "ItemType") {
var propNds = aras.getItemRelationshipsEx(item, "Property");
var relshipsXml = aras.createXMLDocument();
relshipsXml.loadXML("<Relationships />");
for (var i = 0; i < propNds.length; i++) {
if (!item.selectSingleNode('Relationships/Item[@id="' + propNds[i].getAttribute("id") + '"]')) {
relshipsXml.documentElement.appendChild(propNds[i].cloneNode(true));
aras.mergeItemRelationships(item, relshipsXml);
function showClassStructureDialog(callback) {
class_structure: class_structure,
isRootClassSelectForbidden: true,
dialogHeight: 700, dialogWidth: 600, resizable: true,
content: "ClassStructureDialog.html"
if (targetItem.getAttribute("type") == "ItemType") {
param.itemTypeName = aras.getItemProperty(targetItem, "name");
if (!param.itemTypeName) {
aras.AlertError(aras.getResource("", "classstructure.itemname_cannot_be_empty"), "", "", window);
param.itemTypeName = targetItem.getAttribute("type");
param.selectLeafOnly = !(itemTypeName == "ItemType" && (RelType_Nm == "Property" || RelType_Nm == "ItemType Life Cycle" || RelType_Nm == "Can Add" || RelType_Nm == "DiscussionTemplate"));
if (currSelCell != null) {
param.expandClassPath = currSelCell.getValue();
(topWindow_Experimental.main || topWindow_Experimental).ArasModules.MaximazableDialog.show("iframe", param).promise.then(callback);
if (RelType_Nm == "View") {
function showContinueDialog(message) {
btnYes: aras.getResource("", "common.yes"),
btnCancel: aras.getResource("", "common.cancel")
defaultButton: "btnCancel",
content: "groupChgsDialog.html"
(topWindow_Experimental.main || topWindow_Experimental).ArasModules.Dialog.show("iframe", params).promise.then(function () {
if (resButton === "btnYes") {
showClassStructureDialog(function (res) { onAfterSpecialDialog(res, true); });
var viewItem = item.selectSingleNode("Relationships/Item[@type='View' and @id='" + currSelRowId + "']");
var formNd = viewItem.selectSingleNode("related_id/Item[@type='Form']");
aras.AlertError(aras.getResource("", "relationshipsgrid.no_form_view"), null, null, window);
var isTempForm = aras.isTempEx(formNd);
var formIsComplete = isTempForm;
var bodyNd = formNd.selectSingleNode("Relationships/Item[@type='Body']");
formIsComplete = (bodyNd != null);
if (!aras.isLockedByUser(formNd) && aras.isLocked(formNd)) {
showContinueDialog(aras.getResource("", "relationshipsgrid.locked_another_user_change_view_classification"))
showClassStructureDialog(function (res) {
if (res !== undefined && systemGetValueForCurrentCell() !== res) {
var propsMayDel = aras.selectPropNdsByClassPath(res, item, true);
if (propsMayDel.length != 0) {
for (var i = 0; i < propsMayDel.length; i++) {
whereClause += "propertytype_id='" + propsMayDel[i].getAttribute("id") + "'";
if (i != propsMayDel.length - 1) {
function getCompleteForm() {
var formId = formNd.getAttribute("id");
var requestedFormNd = aras.getItemById("Form", formId, 3);
aras.AlertError(aras.getResource("", "relationshipsgrid.form_defined_view_not_found"), null, null, window);
aras.mergeItem(formNd, requestedFormNd);
if (!getCompleteForm()) {
onAfterSpecialDialog(undefined, true);
var fieldsToDel = formNd.selectNodes("Relationships/Item/Relationships/Item[" + whereClause + "]");
if (fieldsToDel.length != 0) {
var message = aras.getResource("", "relationshipsgrid.modifying_class_value_remove_fields");
for (var i = 0; i < fieldsToDel.length; i++) {
message += "<b>" + aras.getItemProperty(fieldsToDel[i], "label") + "<\/b><br>";
message += aras.getResource("", "relationshipsgrid.continue_remove");
if (!showContinueDialog(message)) {
onAfterSpecialDialog(undefined, true);
if (!isTempForm && !aras.isLockedByUser(formNd)) {
formNd = aras.lockItemEx(formNd);
aras.AlertError(aras.getResource("", "relationshipsgrid.form_cannot_be_locked"), null, null, window);
onAfterSpecialDialog(undefined, true);
if (!getCompleteForm()) {
onAfterSpecialDialog(undefined, true);
fieldsToDel = formNd.selectNodes("Relationships/Item/Relationships/Item[" + whereClause + "]");
if (fieldsToDel.length > 0) {
for (var i = 0; i < fieldsToDel.length; i++) {
var fieldToDel = fieldsToDel[i];
if (fieldToDel.getAttribute("action") == "add") {
fieldToDel.parentNode.removeChild(fieldsToDel[i]);
fieldToDel.setAttribute("action", "delete");
setDirtyAttribute(formNd);
onAfterSpecialDialog(res, true);
showClassStructureDialog(function (res) {
onAfterSpecialDialog(res, true);
function showClassificationDialog (type) {
if (type == "form_classification" || type == "class_path") {
var propDRL = propsArr[currSelCol].DRL;
targetItem = ((propDRL == "D") ? DescByItemType_Nd : RelatedItemType_Nd);
showClassStructureDialog(targetItem, "classification", "classification");
function showClassPathDialog () {
var itemLabel = aras.getItemProperty(item, "label") || aras.getItemProperty(item, "name"),
selectedProperty = item.selectSingleNode("Relationships/Item[@type=\"Property\" and @id=\"" + currSelRowId + "\"]"),
title = aras.getResource("", "relationshipsgrid.class_path_prop", aras.getItemProperty(selectedProperty, "name"), itemLabel);
showClassStructureDialog(item, "class_path", title);
function showFileDialog2() {
var fileNd = aras.SelectFileFromPackage("FE_SelectFileFromPackage", false);
aras.itemsCache.addItem(fileNd);
onAfterSpecialDialog(fileNd, false);
function showFileDialog(fileId) {
function processAddingFile(file) {
var fileNd = aras.newItem("File", file);
aras.itemsCache.addItem(fileNd);
onAfterSpecialDialog(fileNd, false);
aras.vault.selectFile().then(processAddingFile.bind(this));
function showDateDialog(oldDate, format, event) {
var wndRect = aras.uiGetElementCoordinates(currSelCell.cellNod_Experimental);
date: aras.convertFromNeutral(oldDate, "date", format),
top: wndRect.top - wndRect.screenTop, left: wndRect.left - wndRect.screenLeft
var dateDialog = (topWindow_Experimental.main || topWindow_Experimental).ArasModules.Dialog.show("iframe", params);
if (aras.Browser && aras.Browser.isIe() && aras.Browser.getMajorVersionNumber() === 11) {
dateDialog.dialogNode.addEventListener('close', function(evt) {
var newDate = dateDialog.returnValue;
if (newDate !== undefined) {
newDate = aras.convertToNeutral(newDate, "date", format);
onAfterSpecialDialog(newDate, true);
dateDialog.promise.then(function (newDate) {
if (newDate !== undefined) {
newDate = aras.convertToNeutral(newDate, "date", format);
onAfterSpecialDialog(newDate, true);
function showColorDialog(oldColor) {
(topWindow_Experimental.main || topWindow_Experimental).ArasModules.Dialog.show("iframe", params).promise.then(function (newColor) {
onAfterSpecialDialog(newColor, false);
function systemGetValueForCurrentCell() {
var propNm = propsArr[currSelCol].name;
var propDRL = propsArr[currSelCol].DRL;
var res = ((propDRL == "D") ? getRelationshipProperty(currSelRowId, propNm) : getRelatedItemProperty(currSelRowId, propNm));
function showTextarea(openToEdit) {
if (openToEdit == undefined) {
content: systemGetValueForCurrentCell(),
(topWindow_Experimental.main || topWindow_Experimental).ArasModules.Dialog.show("iframe", params).promise.then(function (res) {
onAfterSpecialDialog(res, true);
function showImageDialog(img) {
(topWindow_Experimental.main || topWindow_Experimental).ArasModules.Dialog.show("iframe", params).promise.then(function (res) {
onAfterSpecialDialog(res, false, "set_nothing");
function showHTMLEditorDialog(openToEdit) {
if (openToEdit == "false") {
var content = systemGetValueForCurrentCell(),
options = { resizable: true, size: "max" };
content = content.replace(/\\/g, "\\\\");
content = content.replace(/\\n/g, '\n');
content = content.replace(/'/g, '\\\'');
option.content = "javascript: '" + content + "'";
(topWindow_Experimental.main || topWindow_Experimental).ArasModules.Dialog.show("iframe", options);
sHTML: systemGetValueForCurrentCell(),
title: aras.getResource("", "htmleditor.inn_formatted_text_editor")
param.type = "HTMLEditorDialog";
(topWindow_Experimental === aras.getMainWindow() ? topWindow_Experimental.main : topWindow_Experimental).ArasModules.Dialog.show("iframe", param).promise.then(function (val) {
onAfterSpecialDialog(val, true);
function showForeignPropDialog() {
checkThatItemTypePropsLoaded();
title: aras.getResource("", "foreignpropselecttree.foreign_prop_selec_tree"),
dialogHeight: 600, dialogWidth: 250,
content: "foreignPropSelectTree.html"
(topWindow_Experimental.main || topWindow_Experimental).ArasModules.Dialog.show("iframe", params).promise.then(function (res) {
setRelationshipProperty(currSelRowId, "data_source", res.data_source);
var relNd = item.selectSingleNode('Relationships/Item[@type="' + relationshipTypeName + '" and @id="' + currSelRowId + '"]');
aras.setItemProperty(relNd, "foreign_property", res.foreign_property);
function handleRowEvent(eventName, rowId) {
var EventName = "row_" + eventName;
var funcName = "row_" + eventName + "_func";
var retValue = handleEvent(rowEventsNames, rowEventsMethods_code, EventName, funcName, rowId);
function handleCellEvent(eventName, rowId, col) {
var prop = propsArr[col];
var EventName = prop.name + "_" + prop.DRL + "_" + eventName;
var funcName = prop.name + "_" + prop.DRL + "_" + eventName + "_func";
var retValue = handleEvent(cellEventsNames, cellEventsMethods_code, EventName, funcName, rowId, col);
function handleEvent(eventsNames, eventsMethods_code, EventName, funcName, rowId, col) {
var prop = propsArr[col];
var HandlersQueue = window[funcName];
if (HandlersQueue == undefined) {
for (var i = 0; i < eventsNames.length; i++) {
if (eventsNames[i] == EventName) {
var method_code = eventsMethods_code[i];
handler = new Function("relationshipID", "relatedID", "propertyName", "colNumber", "gridApplet", method_code);
handler = new Function("relationshipID", "relatedID", "gridApplet", method_code);
window[funcName] = new Array();
window[funcName].push(handler);
aras.AlertError(aras.getResource("", "relationshipsgrid.internal_error_event_failed_initialize"), aras.getResource("", "relationshipsgrid.custom_event_failed", eventName, excep.description), aras.getResource("", "common.client_side_err"), window);
HandlersQueue = window[funcName];
for (var i = 0; i < HandlersQueue.length; i++) {
var handler = HandlersQueue[i];
var relationshipID = rowId;
var relatedID = undefined;
if (hasRelatedItem(rowId)) {
relatedID = system_getRelatedItem(rowId).getAttribute("id");
retValue = handler(relationshipID, relatedID, prop.name, col, gridApplet);
retValue = handler(relationshipID, relatedID, gridApplet);
aras.AlertError(aras.getResource("", "relationshipsgrid.internal_err_event_failed"), aras.getResource("", "relationshipsgrid.failed_with_msg", EventName, excep.description), aras.getResource("", "common.client_side_err"), window);
if (retValue === false) {
if (retValue === undefined) {
function setRelationshipProperty(relID, propName, propVal) {
for (var col = 0; col < propsArr.length; col++) {
if (propsArr[col].DRL == "D" && propsArr[col].name == propName) {
if (col == propsArr.length) {
var relNd = item.selectSingleNode('Relationships/Item[@type="' + relationshipTypeName + '" and @id="' + relID + '"]');
var prevCurrSelCell = currSelCell;
var prevCurrSelRowId = currSelRowId;
var prevCurrSelCol = currSelCol;
var prevVal = aras.getItemProperty(relNd, propName);
currSelCell = grid.cells(relID, parseInt(col));
setupProperty(propVal, true, false);
if (currSelCell && propVal != prevVal) {
handleCellEvent("onchangecell", currSelRowId, currSelCol);
currSelCell = prevCurrSelCell;
currSelRowId = prevCurrSelRowId;
currSelCol = prevCurrSelCol;
function setRelatedItemProperty(relID, propName, propVal) {
for (var col = 0; col < propsArr.length; col++) {
if (propsArr[col].DRL == "R" && propsArr[col].name == propName) {
if (col == propsArr.length) {
var relatedNd = item.selectSingleNode('Relationships/Item[@type="' + relationshipTypeName + '" and @id="' + relID + '"]/related_id/Item');
var prevCurrSelCell = currSelCell;
var prevCurrSelRowId = currSelRowId;
var prevCurrSelCol = currSelCol;
var prevVal = aras.getItemProperty(relatedNd, propName);
currSelCell = grid.cells(relID, parseInt(col));
setupProperty(propVal, true, false);
if (currSelCell && propVal != prevVal) {
handleCellEvent("onchangecell", currSelRowId, currSelCol);
currSelCell = prevCurrSelCell;
currSelRowId = prevCurrSelRowId;
currSelCol = prevCurrSelCol;
function getRelationshipProperty(relID, propName) {
var relNd = item.selectSingleNode('Relationships/Item[@type="' + relationshipTypeName + '" and @id="' + relID + '"]');
return aras.getItemProperty(relNd, propName);
function getRelatedItemProperty(relID, propName) {
var relatedNd = item.selectSingleNode('Relationships/Item[@type="' + relationshipTypeName + '" and @id="' + relID + '"]/related_id/Item');
return aras.getItemProperty(relatedNd, propName);
function setDirtyAttribute(relationships_itemNd) {
var tmpItemTypeName = relationships_itemNd.getAttribute("type");
var act = relationships_itemNd.getAttribute("action");
if (!act || (act != "add" && act != "create" && act != "delete" && act != "purge" && act !== "copyAsNew")) {
relationships_itemNd.setAttribute("action", "update");
if (relationships_itemNd.getAttribute("isDirty") != "1") {
relationships_itemNd.setAttribute("isDirty", "1");
var openerTop = aras.getMostTopWindowWithAras(parent.opener);
if (openerTop.work.itemTypeName == tmpItemTypeName)
if (grid.getRowIndex(relationships_itemNd.getAttribute("id")) > -1)
updateRow(relationships_itemNd);
function onTabSelected() {
if (gridReady || scriptReady || document.readyState === "complete") {
if (topWindow_Experimental.updateMenuState) {
topWindow_Experimental.updateMenuState();
function getPasteFlg(special) {
return getPasteSpecialFlg();
if (topWindow_Experimental.isPasteCommandAvailable) {
return topWindow_Experimental.isPasteCommandAvailable(item, relatedItemTypeName, relationshipTypeName);
return !isWorkflowTool() && !aras.clipboard.isEmpty() && aras.isLCNCompatibleWithRT(RELATED_IT_NAME) && computeCorrectControlState("new") && !isFunctionDisabled(relationshipTypeName, "Paste");
function getPasteSpecialFlg() {
return !isWorkflowTool() && !aras.clipboard.isEmpty() && computeCorrectControlState("new") && !isFunctionDisabled(relationshipTypeName, "Paste Special");
function isWorkflowTool() {
return parent.isWorkflowTool;
function calculateSortPriority(gridView) {
var relationshipPriority, relatedItemPriority,
relationshipPriority = 1;
relationshipPriority = 0;
relationshipPriority = 0;
for (i = 0; i < propsArr.length; i++) {
if (propsArr[i].order_by && propsArr[i].DRL != "L") {
colNum: grid.GetColumnIndex(propsArr[i].name + "_" + propsArr[i].DRL),
order_by: parseInt(propsArr[i].order_by),
priority: (propsArr[i].DRL == "D") ? relationshipPriority : relatedItemPriority
function sorterF(p1, p2) {
sortPriority.sort(sorterF);
function sortRowByDefault() {
var fieldSortPriority, i;
for (i = 0; i < sortPriority.length; i++) {
fieldSortPriority = sortPriority[i];
if (fieldSortPriority.order_by >= 0) {
grid.grid_Experimental.prepareColumnForSort(fieldSortPriority.colNum, true, true);
var headerNode = grid.grid_Experimental.layout.cells[fieldSortPriority.colNum];
var columnName = headerNode.name;
var th = headerNode.getHeaderNode();
th.innerHTML = grid.grid_Experimental.getColumnHeaderHtml(columnName, fieldSortPriority);
function getFilterValue(rowId, col) {
if (propsArr[col].DRL == "R") {
RelTypeIT = RelatedItemType_Nd;
RelTypeIT = DescByItemType_Nd;
var propNm = propsArr[col].name;
var propNd = RelTypeIT.selectSingleNode('Relationships/Item[@type="Property" and name="' + propNm + '"]');
var pattern = aras.getItemProperty(propNd, "pattern");
for (var i = 0; i < propsArr.length; i++) {
if (propsArr[i].name == pattern) {
if (i == propsArr.length) {
if ("input_row" === rowId) {
res = grid.inputRow.get(i, "value");
var tmp1 = propsArr[i].DRL;
var tmp2 = propsArr[i].name;
tmp1 = getRelationshipProperty(rowId, tmp2);
tmp1 = getRelatedItemProperty(rowId, tmp2);
relationshipTypeActions[RelType_ID] = new Object();
relationshipActions[RelType_ID] = new Object();
var res = aras.getItemTypeNodeForClient(aras.getItemTypeName(DescByItemType_ID));
var nds = res.selectNodes("Relationships/Item[@type='Item Action']/related_id/Item[type='itemtype' and name]");
for (var i = 0; i < nds.length; i++) {
if (aras.isInCache(act.getAttribute("id"))) {
act = aras.getFromCache(act.getAttribute("id"));
var lbl = aras.getItemProperty(act, "label");
lbl = aras.getItemProperty(act, "name");
relationshipTypeActions[RelType_ID][act.getAttribute("id")] = lbl;
var nds = res.selectNodes("Relationships/Item[@type='Item Action']/related_id/Item[type='item' and name]");
for (var i = 0; i < nds.length; i++) {
if (aras.isInCache(act.getAttribute("id"))) {
act = aras.getFromCache(act.getAttribute("id"));
var lbl = aras.getItemProperty(act, "label");
lbl = aras.getItemProperty(act, "name");
relationshipActions[RelType_ID][act.getAttribute("id")] = lbl;
var res = aras.getRelationshipType(RelType_ID).node;
nds = res.selectNodes("Relationships/Item[grid_event != '' and related_id/Item/method_code != '']");
for (var i = 0; i < nds.length; i++) {
rowEventsNames[i] = "row_" + aras.getItemProperty(nds[i], "grid_event");
var methodName = aras.getItemProperty(nds[i], "related_id/Item/name"),
methodCode = aras.getItemProperty(nds[i], "related_id/Item/method_code"),
methodNamesWithTopAras = ["INCREMENT SEQUENCE NUMBER", "PM_ACT2ASMNT_ONSELECTROW"];
if (methodName && methodNamesWithTopAras.indexOf(methodName.toUpperCase()) !== -1) {
methodCode = methodCode.replace(/\btop.aras\b/g, "aras");
rowEventsMethods_code[i] = methodCode;
for (var i = 0; i < propsArr.length; i++) {
if (propsArr[i].propID) {
critStr += "'" + propsArr[i].propID + "',";
var res = aras.getItemTypeNodeForClient(aras.getItemTypeName(DescByItemType_ID));
nds = res.selectNodes("Relationships/Item[@type='Property']/Relationships/Item[grid_event != '' and related_id/Item/method_code != '']");
var methodNamesWithTopAras2 = ["PE_AFFECTEDITEMGRIDHANDLER", "CHECKAFFECTEDTYPE", "RESTRICTAFFECTEDTYPE", "PM_ACT2ASMNT_ONSELECTROW", "TIMERECORD ONDATECHANGE"],
for (var i = 0; i < nds.length; i++) {
var EventName = aras.getItemProperty(ev, "source_id/Item/name") + "_";
var parentIT_ID = aras.getItemProperty(ev, "source_id/Item/source_id");
EventName += (parentIT_ID == DescByItemType_ID ? "D" : "R");
EventName += "_" + aras.getItemProperty(ev, "grid_event");
cellEventsNames[i] = EventName;
methodName2 = aras.getItemProperty(ev, "related_id/Item/name");
methodCode2 = aras.getItemProperty(ev, "related_id/Item/method_code");
if (methodName2 && methodNamesWithTopAras2.indexOf(methodName2.toUpperCase()) !== -1) {
methodCode2 = methodCode2.replace(/\btop.aras\b/g, "aras");
cellEventsMethods_code[i] = methodCode2;
if (RelatedItemType_Nd) {
nds = RelatedItemType_Nd.selectNodes("Relationships/Item[@type='Property']/Relationships/Item[grid_event != '' and related_id/Item/method_code != '']");
var curEventsCount = cellEventsNames.length;
for (var i = 0; i < nds.length; i++) {
var EventName = aras.getItemProperty(ev, "source_id/Item/name") + "_";
var parentIT_ID = aras.getItemProperty(ev, "source_id/Item/source_id");
EventName += (parentIT_ID == DescByItemType_ID ? "D" : "R");
EventName += "_" + aras.getItemProperty(ev, "grid_event");
cellEventsNames[i + curEventsCount] = EventName;
methodName2 = aras.getItemProperty(ev, "related_id/Item/name");
methodCode2 = aras.getItemProperty(ev, "related_id/Item/method_code");
if (methodName2 && methodNamesWithTopAras2.indexOf(methodName2.toUpperCase()) !== -1) {
methodCode2 = methodCode2.replace(/\btop.aras\b/g, "aras");
cellEventsMethods_code[i + curEventsCount] = methodCode2;
function resize_searchContainer() {
var spcWidth = document.getElementById("gridTD").offsetWidth;
searchContainer.searchPlaceholderCell.style.width = spcWidth + "px";
function refreshGridSize() {
if (grid && grid.grid_Experimental) {
var toolbarPanel = document.getElementById("toolbarContainer"),
searchPanel = document.getElementById("searchPlaceholder"),
currentGridTop = toolbarPanel.offsetHeight + searchPanel.offsetHeight;
document.getElementById("gridTD").style.height = "calc(100% - " + document.getElementById("topContainer").offsetHeight + "px)";
if (document.gridPreviousTop !== currentGridTop) {
document.getElementById("gridTD").style[key] = currentGridTop + "px";
grid.grid_Experimental.resize();
document.gridPreviousTop = currentGridTop;
function initializeDragAndDrop() {
var isFileRelated = relatedItemTypeName === "File";
if (relatedItemTypeName) {
var fileProperties = propsArr.filter(function (property) {
return property.DRL === "D" && property.data_source === FileIT_ID_const;
if (fileProperties.length === 1) {
var filePropertyName = fileProperties[0].name;
var dropbox = document.getElementById("dropbox");
onDragBrowserEnter: function (e) {
var isFilesDragged = e.dataTransfer && (!e.dataTransfer.types || (e.dataTransfer.types.contains ? e.dataTransfer.types.contains("Files") : e.dataTransfer.types.indexOf("Files") >= 0));
if (isFilesDragged && isEditMode) {
dropbox.style.display = "block";
onDragBrowserLeave: function () { dropbox.style.display = "none"; },
dragManager.addDropbox(dropboxHandlers);
dropbox.addEventListener('dragover', function (e) {
e.dataTransfer.dropEffect = 'copy';
dropbox.addEventListener('drop', function (e) {
dropbox.style.display = "none";
var files = Array.prototype.slice.call(e.dataTransfer.files);
files.forEach(function (filePath) {
var newFile = aras.newItem("File", filePath);
aras.itemsCache.addItem(newFile);
newRelationship(false, (isFileRelated ? newFile : undefined), function (relshipNode) {
aras.setItemProperty(relshipNode, filePropertyName, newFile);
<div style="display: none;" class="grid_icon_fix"></div>
<div style="width: 100%; height: 100%;" id="BorderContainer">
<div id="toolbarContainer" style="display: none;" class="preventDoubleBorder">
<div id="toolbar_container_cell">
if (isToolbarUsed || CUSTOM_TOOLBAR_SRC) {
if (CUSTOM_TOOLBAR_SRC) {
var customToolbarFrame = document.createElement("iframe");
customToolbarFrame.setAttribute("id", "toolbar_slot_custom_iframe");
customToolbarFrame.setAttribute("src", CUSTOM_TOOLBAR_SRC);
customToolbarFrame.setAttribute("frameborder", "0");
customToolbarFrame.setAttribute("style", "width: 100%; height: 28px; display: block;");
document.getElementById("toolbar_container_cell").appendChild(customToolbarFrame);
document.getElementById("toolbarContainer").style.display = "";
<div id="searchPlaceholder" class="preventDoubleBorder"></div>
<div id="gridTD" class="preventDoubleBorder">
<div id="dropbox" class="dropbox" style="display: none;">
<div class="dropboxInternalContainer">
<img src="../images/FileDragAndDrop.svg">
<span>Drop files here!</span>