SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/change/documents-tab-directive.js

179 lines
9.5 KiB
JavaScript

"use strict";
(function () {
'use strict';
angular.module('changeModule')
.directive('documentsTab', ['events', 'tabIds', 'ticketModel',
function (events, tabIds, ticketModel) {
return {
restrict: 'E',
replace: true,
templateUrl: 'views/change/documents-tab.html',
scope: {
isNoteRequired: '=',
context: '=',
docTypes: '=',
editMode: '=',
metadata: '=?'
},
link: function (scope) {
//var docTypes = scope.docTypes;
scope.$watch(function () {
return scope.documents;
}, function (newVal) {
if (newVal) {
scope.$parent.$parent.documents = scope.documents;
}
});
scope.attachmentLimit = 3;
scope.state = {
documentsSelected: false,
allDocumentsSelected: false
};
scope.defaultDocumentTypes = _.cloneDeep(scope.docTypes) || [];
scope.docTypesPicked = 0;
if (scope.editMode) {
scope.selectedDocumentTypes = scope.context.documents;
scope.docTypesPicked = scope.context.documents.length || 0;
scope.documentsChunked = chunkArray(scope.selectedDocumentTypes, 2);
if (scope.selectedDocumentTypes && scope.selectedDocumentTypes.length > 0) {
scope.state.documentsSelected = true;
}
}
else {
scope.context.documents = scope.selectedDocumentTypes;
}
scope.documentsTab = {
currentNote: { id: 'note', attachments: [] },
allUserNotes: []
};
scope.addNote = {
inputText: ''
};
scope.handleDocumentsControlButtonClick = function (documentSelected) {
if (!_.isUndefined(documentSelected) && documentSelected === 'docSelect' && scope.editMode) {
scope.markSelectedDocTypeInvisible();
}
scope.state.documentsSelected = !scope.state.documentsSelected;
scope.context.documents = scope.selectedDocumentTypes;
if (scope.editMode) {
scope.$emit(events.CHANGE_REQUEST_PLANS_EDIT_STATUS, { hideButtons: !scope.state.documentsSelected });
}
};
scope.markSelectedDocTypeInvisible = function () {
_.each(scope.selectedDocumentTypes, function (selectedDoc) {
_.each(scope.defaultDocumentTypes, function (defaultDocumentType) {
if (defaultDocumentType.name === selectedDoc.name) {
defaultDocumentType.invisible = true;
}
});
});
};
scope.toggleDocumentBlock = function (docType, isRemove) {
docType.active = !docType.active;
docType.active ? scope.docTypesPicked++ : scope.docTypesPicked-- && (scope.state.allDocumentsSelected = false);
if (!docType.active) {
scope.selectedDocumentTypes = _.without(scope.selectedDocumentTypes, docType);
}
if (scope.selectedDocumentTypes === 0) {
scope.showSave = true;
}
if (scope.docTypesPicked === 0) {
_.forEach(scope.defaultDocumentTypes, function (defaultDocType) {
defaultDocType.active = false;
defaultDocType.plans = [];
});
scope.selectedDocumentTypes = [];
scope.documentsChunked = [];
scope.state.documentsSelected = false;
scope.$emit(events.CHANGE_REQUEST_PLANS_EDIT_STATUS, { hideButtons: true, showSave: true });
}
else {
if (!isRemove) {
scope.selectedDocumentTypes = _.filter(scope.defaultDocumentTypes, { active: true });
scope.documentsChunked = chunkArray(scope.selectedDocumentTypes, 2);
}
}
};
scope.handleKeydown = function ($event, item) {
if ($event.keyCode === 32) { // space key
scope.toggleDocumentBlock(item);
$event.stopPropagation();
}
};
scope.selectAllDocuments = function () {
scope.state.allDocumentsSelected = !scope.state.allDocumentsSelected;
scope.docTypesPicked = scope.state.allDocumentsSelected ? scope.defaultDocumentTypes.length : 0;
_.each(scope.defaultDocumentTypes, function (docType) {
docType.active = scope.state.allDocumentsSelected;
});
scope.selectedDocumentTypes = _.filter(scope.defaultDocumentTypes, { active: true });
scope.documentsChunked = chunkArray(scope.selectedDocumentTypes, 2);
return;
};
scope.addSameTypePlan = function (docType) {
docType.activePlanIndex = parseInt(docType.plans.push({ attachments: [], desc: '' }) - 1);
};
scope.removeActivePlanTab = function (docType) {
var activePlanIndex = docType.activePlanIndex;
if (!(docType.plans[docType.activePlanIndex].workNote && docType.plans[docType.activePlanIndex].workNote.locked)) {
docType.plans.splice(activePlanIndex, 1);
docType.activePlanIndex = 0;
if (docType.plans.length === 0) {
scope.toggleDocumentBlock(docType, true);
scope.documentsChunked = chunkArray(scope.selectedDocumentTypes, 2);
}
docType.invisible = false;
}
var replacementIndex = _.findIndex(scope.defaultDocumentTypes, function (doc) {
return doc.name === docType.name;
});
if (!_.isUndefined(replacementIndex) && replacementIndex !== -1) {
scope.defaultDocumentTypes[replacementIndex] = docType;
}
};
scope.changeDocumentTab = function (docType, plan) {
var idx = docType.plans.indexOf(plan);
docType.activePlanIndex = idx;
docType.isLocked = plan.workNote && plan.workNote.locked;
};
function chunkArray(arr, chunkSize) {
if (Object.prototype.toString.call(arr).slice(8, -1) !== 'Array') {
return arr;
}
return [].concat.apply([], arr.map(function (elem, i) {
if (!elem.plans || elem.plans.length === 0) {
elem.plans = [{ attachments: [], desc: '' }];
}
elem.activePlanIndex = 0;
return i % chunkSize ? [] : [arr.slice(i, i + chunkSize)];
}));
}
scope.$on(events.DISCARD_DOCUMENTS, function () {
scope.context.documents = [];
scope.state.documentsSelected = false;
scope.state.allDocumentsSelected = false;
_.each(scope.defaultDocumentTypes, function (docType) {
docType.active = scope.state.allDocumentsSelected;
docType.plans = [];
docType.plans.push({ attachments: [], desc: '' });
docType.activePlanIndex = 0;
});
});
scope.$watch(tabIds.wizard.documents + '.$invalid', function (invalid) {
if (typeof invalid !== 'undefined') {
scope.$emit(events.CHANGE_WIZARD_FORM_STATE, {
name: tabIds.wizard.documents,
invalid: invalid
});
scope.$emit(events.RELEASE_WIZARD_FORM_STATE, {
name: tabIds.wizard.documents,
invalid: invalid
});
}
});
}
};
}
]);
})();