{"version":3,"sources":["1initializers.js","settingsviews.js","submittaleditviews.js","submittalmodels.js","submittalviews.js","templateviews.js","workflowviews.js"],"names":["PJQ","collections","submittals","models","views","modules","routes","route","name","callback","projectId","projectWall","initProjectNavigator","parseInt","app","addRoutes","Settings","BaseView","extend","defaults","template","templating","Template","constants","SUBMITTALS","subTemplates","maxWidth","overrideLockDate","onChange","events","click .settings-save","change .select-column","change .input-override-lock-date","click .btn-add-workflow-template","click .btn-edit-workflow-template","click .btn-delete-workflow-template","click .extended-settings-checkbox","beforeFirstRender","_beforeFirstRender","_asyncToGenerator","_regeneratorRuntime","mark","_callee","wrap","_context","prev","next","this","isFetched","options","project","fetchSubmittalSettings","model","sent","fetchSubmittalWorkflowTemplates","workflowTemplates","session","render","stop","apply","arguments","renderData","userSettings","afterRender","Binder","$el","watchElements","afterChange","_","bind","changeEl","attribute","value","set","renderWorkflowTemplates","inputs","Selectpicker","el","$","defaultValue","get","contacts","ContactsSelectInput","selectedContact","defaultManager","canViewContacts","hasPermission","canEdit","displayContactsBlock","canSwitchContext","context","contexts","PROJECTCONTACTS","USERS","isSingleChoice","isDirty","defaultDistributionList","selectedContacts","reset","rowsPerPageSelectPicker","getSettings","view","rowsPerPage","dataTable","dataTables","DataTable","data","submittalsView","getColumns","isHideSearch","order","columns","title","orderable","searchable","width","dom","handeExtendedSettingsCheckbox","e","_this","extendedSettings","extendedSettingsInputMap","defaultIsPublic","Object","keys","forEach","key","prop","addWorkflowTemplate","newTemplate","WorkflowTemplate","id","editWorkflowTemplate","editWorkflowTemplateClicked","$tr","currentTarget","closest","workflowTemplatesDataTable","getRow","_this2","isNew","EditWorkflowTemplateModal","onSave","addRow","add","refresh","onDelete","row","cid","removeRow","deleteWorkflowTemplateClicked","deleteWorkflowTemplate","_this3","modals","DeleteCancel","header","body","destroy","success","error","notifications","notify","errorNotify","message","_this4","language","emptyTable","zeroRecords","isStriped","paging","columnData","type","html","contextMenuOptions","actions","isDanger","onClick","isShown","isEdit","onRowDoubleClick","columnSelected","sender","visible","SettingsModal","BaseModal","minWidth","settingsView","loader","Loader","getValue","each","indexOf","push","filter","column","save","successNotify","removeModal","remove","TemplateManagement","templates","collection","Templates","listenTo","fetch","addTemplate","NewTemplateModal","editTemplate","EditTemplateModal","onClose","ItemTypeSettings","click .add-item-type","click .edit-item-type","click .delete-item-type","fetchItemTypes","ItemTypes","rowId","sortableOptions","pageLength","bSort","editItemType","deleteItemType","addItemType","EditItemTypeModal","editItemTypeClicked","$row","itemType","deleteItemTypeClicked","click .btn-save","click .btn-cancel","beforeModalCreated","ItemType","sortOrder","cancel","restore","SubmittalStatusSettings","click .add-status","click .edit-status","click .delete-status","_beforeFirstRender2","_callee2","_context2","fetchSubmittalStatuses","_this5","a","b","self","sortedRow","item","pageInfo","page","info","index","rowData","sortNumber","length","onRowSorted","editStatus","deleteStatus","statusType","statusTypeColors","statusTypeNames","copyStatuses","status","_this6","copy","newStatuses","find","addStatus","editStatusClicked","_this7","fnAdd","copiedStatus","EditStatusModal","statuses","updatedStatus","collectionStatus","deleteStatusClicked","_this8","size","fnDelete","Alert","text","animation","in","out","timeout","Status","isDefault","shouldLock","asNoted","statusTypes","NEW","mustBeDefault","isDisabled","isIntChoices","validate","isValid","helpers","inputHelpers","setInputError","trim","EditSubmittalModal","contactBadge","GLOBAL","comments","isShowCloseButton","noop","isAdmin","click .btn-close","click .submittal-delete","click .btn-add-comment","click .btn-mark-submitted","click .btn-submit","click .btn-approve","click .btn-reject","click .btn-notification-history","click .btn-edit-history","click .btn-upload-files","click .edit-file","click .edit-note","click .btn-dl-approver-attachment","click .btn-download-all-attachments","click .expand-history","click .download-history-file","click .btn-export","click .btn-delete-comment","click .btn-void","click .btn-edit-workflow","click .btn-save-workflow","click .btn-view-revision","click .btn-create-revision","click .btn-submittal-respond","click .btn-close-submittal","click .btn-email-submittal","click .btn-distribute-submittal","click .btn-reopen-submittal","_beforeModalCreated","_callee3","submitter","_this$options$setting","_this$options$setting2","_this$options$setting3","_this$options$setting4","defaultNewStatus","_context3","canEditPeople","canUpload","canSubmit","contact","user","Submittals","templateId","toJSON","settings","fetchSubmittalItemTypes","itemTypes","fetchSubmittalCustomFields","customFields","changedAnnotations","drawings","Annotations","findWhere","manager","projectContacts","ProjectContact","distributionList","ProjectContacts","beforeRender","searchId","isSubmitter","isCreator","createdBy","isApprover","isVoidStatus","isApprovedStatus","isPartiallyApproved","isSubmittedStatus","statusShouldLock","hideItemTypes","preferences","getPref","preferenceTypes","HIDE_SUBMITTAL_ITEM_TYPE","_this$model$workflow$","_this9","_this$model$ballInCou","renderCustomFields","dueDatePicker","Datepicker","datepickerOptions","format","dateHelpers","dateFormats","datePicker","DATE","defaultDate","Date","newDate","groups","GroupsSelectInput","isShowAddButton","addButton","groupLevels","GROUP_LEVELS","groupUserId","selectedGroups","isReadOnly","onAfterSave","ballInCourt","workflow","getCurrentStep","map","approvers","approver","isSortable","allowDuplicate","approvalModes","SEQUENTIAL","onStop","array","newApprovers","usedIdx","approverIdx","findIndex","idx","contactsRenderData","showApproval","canApprove","isUserCurrentApprover","onApproveBehalf","fnApprove","comment","approve","err","handleStatusError","YesNo","onYes","checkActiveResponse","hadComment","StatusChangeCommentModal","onNo","approvedByIds","hasApproved","existApproverIdx","workflowView","WorkflowView","submittal","canChangeBallInCourt","canRespond","onRespond","onSetBallInCourt","managerPicker","noneSelectedText","isMultiple","fileUploader","files","FileUploaderGrid","contextId","canAddAnnotations","onAnnotationChange","annotation","merge","mergeAnnotations","attachments","canDelete","hasNotes","isVersioned","versionByName","previewImageDimension","includeProjectAttachments","onNoteChanged","attachment","ajax","Request","endpoint","isAPIv2","patch","done","fail","xhr","result","onNewVersion","onSuccess","renderComments","renderSubTemplate","respondToSubmittal","_this10","currentStep","isMe","WorkflowResponseModal","editWorkflow","addClass","removeClass","setEdit","saveWorkflow","viewRevision","lastRevisionId","revision","submittalId","createRevision","newSubmittal","clone","submittalNumber","statusId","dueDate","revisionFor","isClosed","Attachments","Comments","closeSubmittal","_this11","ConfirmSubmittalCloseModal","onConfirm","opts","close","distribute","emailSubmittal","_this$options$project","_this$options$project2","_this12","projectName","subject","concat","email","ComposeEmailModal","enableCC","onSaveWait","cb","share","reopenSubmittal","_this13","reopen","distributeSubmittal","_this14","voidSubmittal","_this15","VOID","fnVoid","void","addCommentClicked","addComment","val","Comment","createdOn","deleteComment","customFieldsForm","CustomFieldsForm","fieldValues","_this16","isUploading","fnDisableButtons","disable","attr","fnSaveAnnotations","saveAll","submitting","initAttributes","hasChanged","SaveDontSave","onDontSave","delete","aRes","submit","_this17","SUBMITTED","fnSubmit","reject","_this18","REJECTED","fnReject","dueDateVal","_this19","APPROVED","_this20","errors","STATUS_NOT_EXISTS","then","st","editFile","file","FileEditorModal","isNewVersion","newFile","attributes","parentSubmittalDocumentId","uploadFile","createdByDisplay","contactName","notes","versionNumber","editNoteClicked","target","filesTable","editNote","isNoteEdit","viewNotificationHistory","fetchNotifications","NotificationHistory","viewEditHistory","fetchEditHistory","editHistory","EditHistoryModal","history","exportSubmittal","isApi2","post","response","downloadFile","url","isEndpoint","downloadAttachment","i","sAttachment","versions","j","ver","download","downloadAllAttachments","downloadAttachments","File","entryId","guid","click .btn-confirm","change .cb-distribute","_this21","selectedStatus","statusPicker","choices","union","tp","onDistributeChange","BaseModel","idAttribute","urlOptions","arr","urlHelpers","generateEndpoint","afterInit","silent","parse","Groups","Workflow","isNewStatus","isRejectedStatus","getStatusColor","colors","RED","PURPLE","getStatusName","undefined","getApproveStatusName","includeAsNoted","toLowerCase","beforeSave","behalfId","_this22","ep","toString","res","responseJSON","_this23","prevStatus","_this24","_this25","respond","_this26","setBallInCourt","stepId","_this27","_this28","qs","_this29","_this30","toEmails","ccEmails","approvalMode","foundNextApprover","getRemainingApprovers","isLastApprover","Notifications","EditHistory","Attachment","steps","WorkflowSteps","cloned","prototype","call","step","isActive","person","personId","isRequired","WorkflowStep","WorkflowApprovers","WorkflowApprover","WorkflowResponse","Notification","notificationTypeNames","notifyName","EditHistoryItem","suffix","statusName","substring","SubmittalUserSettings","params","forCompany","parameter","viewSettings","setting","SubmittalCustomField","CustomField","BaseCollection","WorkflowTemplates","Files","Statuses","SubmittalCustomFields","CustomFields","masterUserId","SubmittalsView","initSubmittalId","click .btn-delete-submittal","click .btn-edit-submittal","click .btn-add-submittal","click .export-detailed","click .export-list","click .btn-submittal-settings","click .btn-save-a-template","click .btn-import-template","_beforeFirstRender3","_callee4","_context4","fetchSubmittalUserSettings","canAdd","renderDataTable","initSubmittal","editSubmittal","_this31","orderCookie","cookies","SUBMITTAL_ORDER_COOKIE","headerData","afterHeaderRender","$header","stChoices","addedPartial","sortBy","style","setFilter","getFilterData","statusFilter","getFilter","showPartial","contains","showAsNoted","deleteSubmittal","colReorder","fixedColumnsLeft","fixedColumnsRight","realtime","columnOrderChanged","includeAllColumns","includeColumns","customField","_this32","sort","number","isNaN","display","itemTypeNames","join","dateString","getDateString","getDateDaysDiff","groupNames","group","getContactAnchor","startsWith","className","commitments","customFieldType","INTEGER","MONEY","PERCENT","fieldValue","getCustomFieldValue","choice","DATE_TIME","toLocaleString","parseFloat","formatHelpers","numbersOnly","formatCurrency","addClicked","editClicked","_this33","deleteClicked","editSettings","saveTemplate","SubmittalTemplateCreatorModal","importTemplate","ImportTemplateModal","onImport","exportSubmittals","exportList","cookieHelpers","getCookie","JSON","reports","NewReport","reportTypes","SUBMITTAL","columnOrder","export","renderHistory","reverse","canDownload","isRemoveOnComplete","fetchSubmittalTemplates","tmp","AutocompleteInput","source","$name","existingTemplate","fnSave","copyComments","copySubmitter","copyApprovers","copyGroups","copyDistribution","copyItemTypes","click .btn-import","templatePicker","selectedTemplate","showError","hideError","put","fitHeight","click .btn-delete","TextEditorInput","label","deleteTemplate","change .cb-required","change .cb-reject-to-manager","keyup .input-days-to-respond","click .btn-add-approver","click .btn-delete-approver","click .btn-add-step","click .btn-apply-template","click .btn-delete-step","click .btn-respond","click .btn-update-response","click .btn-set-bic","click .dl-approver-attachment","_beforeFirstRender4","_callee5","_context5","_beforeRender","_callee6","_context6","renderStepsTable","edit","approverRequiredChanged","$target","$badge","stepCid","returnOnRejectChanged","stepsDatatable","daysToRespondChanged","_this34","_this35","downloadApproverAttachment","addApprover","_this36","selector","SelectContactsModal","hideContacts","newContacts","deleteApprover","applyTemplateClicked","_this37","applyTemplate","_this38","fnApplyTemplate","cWorkflow","addStep","deleteStepClicked","deleteStep","_this39","approveLabel","_data","_toConsumableArray","personAnchor","req","companyName","_row$get","approverAttachments","_attachment$versions","newest","newestVer","max","groupBy","disableGroupToggle","getGroupHeader","bicBtn","activeBadge","keyup .input-comment","click .btn-back","click .btn-next","_beforeModalCreated2","_callee7","_context7","_this40","StepIndicator","activeStep","getParentAttachment","fileModel","commentChanged","responseText","previousStep","nextStep","_this$options$approve","_this41","_this42","_beforeModalCreated3","_callee8","_context8","_this43","focus","binder","_this44","_this45"],"mappings":"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","file":"app.js","sourcesContent":["PJQ.collections.submittals = {};\r\n\r\nPJQ.models.submittals = {};\r\n\r\nPJQ.views.submittals = {};\r\n\r\nPJQ.modules.submittals = {\r\n    routes: [\r\n        {\r\n            route: 'projects/:projectId/submittalsnew',\r\n            name: 'submittalsnew',\r\n            callback: function (projectId) {\r\n                PJQ.modules.projectWall.initProjectNavigator(parseInt(projectId), \"submittalsnew\");\r\n            }\r\n        }\r\n    ]\r\n};\r\n\r\nPJQ.app.addRoutes(PJQ.modules.submittals.routes);\r\n","PJQ.views.submittals.Settings = PJQ.views.BaseView.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'Settings'),\r\n        subTemplates: {},\r\n        maxWidth: 500,\r\n        overrideLockDate: false,\r\n        onChange: null\r\n    },\r\n    events: {\r\n        'click .settings-save': 'onSave',\r\n        'change .select-column': 'columnSelected',\r\n        'change .input-override-lock-date': 'overrideLockChanged',\r\n        'click .btn-add-workflow-template': 'addWorkflowTemplate',\r\n        'click .btn-edit-workflow-template': 'editWorkflowTemplateClicked',\r\n        'click .btn-delete-workflow-template': 'deleteWorkflowTemplateClicked',\r\n        'click .extended-settings-checkbox': 'handeExtendedSettingsCheckbox'\r\n    },\r\n    beforeFirstRender: async function () {\r\n        this.isFetched = false;\r\n\r\n        if (this.options.project != null) {\r\n            this.model = await this.options.project.fetchSubmittalSettings();\r\n            this.workflowTemplates = await this.options.project.fetchSubmittalWorkflowTemplates();\r\n        } else {\r\n            this.model = await PJQ.app.session.fetchSubmittalSettings();\r\n        }\r\n\r\n        this.isFetched = true;\r\n        this.render();\r\n    },\r\n    renderData: function () {\r\n        return {\r\n            model: this.model,\r\n            project: this.options.project,\r\n            isFetched: this.isFetched,\r\n            userSettings: this.options.userSettings\r\n        };\r\n    },\r\n    onChange: function () {\r\n        if (typeof this.options.onChange === 'function') {\r\n            this.options.onChange(this.model);\r\n        }\r\n    },\r\n    afterRender: function () {\r\n        if (!this.isFetched) {\r\n            return;\r\n        }\r\n\r\n        if (this.model) {\r\n            new PJQ.Binder(this.$el, this.model, {\r\n                watchElements: [\r\n                    'input',\r\n                    'textarea'\r\n                ],\r\n                afterChange: _.bind(function (changeEl, attribute, value) {\r\n                    if (attribute === 'isOverrideApprove') {\r\n                        if (!value) {\r\n                            this.model.set('approveNameOverride', null);\r\n                        }\r\n                        this.render();\r\n                    } else if (attribute === 'enableWorkflow') {\r\n                        this.model.set('enableWorkflow', value);\r\n                        this.render();\r\n                    }\r\n                    this.onChange();\r\n                }, this)\r\n            });\r\n\r\n            this.renderWorkflowTemplates();\r\n\r\n            new PJQ.inputs.Selectpicker({\r\n                el: this.$('.select-approval-mode'),\r\n                defaultValue: this.model.get('approvalMode'),\r\n                onChange: _.bind(function (value) {\r\n                    this.model.set('approvalMode', value);\r\n                    this.onChange();\r\n                }, this)\r\n            });\r\n\r\n            new PJQ.views.contacts.ContactsSelectInput({\r\n                el: this.$('.select-default-manager'),\r\n                selectedContact: this.model.defaultManager,\r\n                canViewContacts: this.options.project == null || this.options.project.hasPermission('projectContacts.canView'),\r\n                canEdit: true,\r\n                displayContactsBlock: true,\r\n                canSwitchContext: this.options.project == null,\r\n                context: this.options.project != null ? PJQ.constants.contacts.contexts.PROJECTCONTACTS : PJQ.constants.contacts.contexts.USERS,\r\n                isSingleChoice: true,\r\n                onChange: _.bind(function (selectedContact) {\r\n                    this.model.defaultManager = selectedContact;\r\n                    this.model.isDirty = true;\r\n                }, this)\r\n            });\r\n\r\n            new PJQ.views.contacts.ContactsSelectInput({\r\n                el: this.$('.select-default-distribution-list'),\r\n                selectedContact: this.model.defaultDistributionList.models,\r\n                canViewContacts: this.options.project == null || this.options.project.hasPermission('projectContacts.canView'),\r\n                canEdit: true,\r\n                displayContactsBlock: true,\r\n                canSwitchContext: this.options.project == null,\r\n                context: this.options.project != null ? PJQ.constants.contacts.contexts.PROJECTCONTACTS : PJQ.constants.contacts.contexts.USERS,\r\n                isSingleChoice: false,\r\n                onChange: _.bind(function (selectedContacts) {\r\n                    this.model.defaultDistributionList.reset(selectedContacts);\r\n                    this.model.isDirty = true;\r\n                }, this)\r\n            });\r\n\r\n            if (this.options.userSettings) {\r\n                this.rowsPerPageSelectPicker = new PJQ.inputs.Selectpicker({\r\n                    el: this.$('.rows-per-page'),\r\n                    defaultValue: this.options.userSettings.getSettings(PJQ.constants.submittals.view.SUBMITTALS).rowsPerPage,\r\n                    onChange: _.bind(function (value) {\r\n                        this.onChange();\r\n                    }, this)\r\n                });\r\n\r\n                this.dataTable = new PJQ.views.dataTables.DataTable({\r\n                    el: this.$('div.column-settings'),\r\n                    data: this.options.submittalsView.getColumns(true),\r\n                    isHideSearch: true,\r\n                    order: [],\r\n                    columns: [\r\n                        {\"data\": \"title\", \"title\": \"Column\", \"orderable\": false},\r\n                        {\r\n                            \"data\": \"visible\",\r\n                            \"title\": \"Show\",\r\n                            \"orderable\": false,\r\n                            \"searchable\": false,\r\n                            \"render\": _.bind(function (data) {\r\n                                return ('<div class=\"text-align-center\"><div class=\"pretty p-default p-smooth fs-18 m-0\"><input type=\"checkbox\"' + (data ? ' checked ' : '') + 'class=\"select-column\"/><div class=\"state p-primary\"><label class=\"wd-0\">&nbsp;</label></div></div></div>');\r\n                            }, this),\r\n                            \"width\": '10%'\r\n                        }\r\n                    ],\r\n                    dom: '<\"top\"<\"clear\">>rt<\"bottom\"p<\"clear\">>'\r\n                });\r\n            }\r\n        }\r\n    },\r\n    handeExtendedSettingsCheckbox: function (e) {\r\n        let extendedSettings = this.model.get('extendedSettings'),\r\n            extendedSettingsInputMap = {\r\n                defaultIsPublic: '.default-is-public'\r\n            };\r\n\r\n        Object.keys(extendedSettingsInputMap).forEach(key => {\r\n            extendedSettings[key] = this.$(extendedSettingsInputMap[key]).prop('checked');\r\n        });\r\n\r\n        this.model.set('extendedSettings', extendedSettings);\r\n\r\n        this.onChange();\r\n    },\r\n    addWorkflowTemplate: function (e) {\r\n        let newTemplate = new PJQ.models.submittals.WorkflowTemplate({\r\n            projectId: this.options.project.id\r\n        });\r\n        this.editWorkflowTemplate(newTemplate);\r\n    },\r\n    editWorkflowTemplateClicked: function (e) {\r\n        let $target = $(e.currentTarget),\r\n            $tr = $target.closest('tr'),\r\n            row = this.workflowTemplatesDataTable.getRow($tr),\r\n            template = row.data();\r\n        this.editWorkflowTemplate(template);\r\n    },\r\n    editWorkflowTemplate: function (template) {\r\n        let isNew = template.isNew();\r\n        new PJQ.views.submittals.EditWorkflowTemplateModal({\r\n            model: template,\r\n            project: this.options.project,\r\n            onSave: () => {\r\n                if (isNew) {\r\n                    this.workflowTemplatesDataTable.addRow(template);\r\n                    this.workflowTemplates.add(template);\r\n                }\r\n                this.workflowTemplatesDataTable.refresh();\r\n            },\r\n            onDelete: () => {\r\n                if (template.id > 0) {\r\n                    let row = this.workflowTemplatesDataTable.getRow(template.cid);\r\n                    if (row != null) {\r\n                        this.workflowTemplatesDataTable.removeRow(row);\r\n                    }\r\n                }\r\n\r\n                this.workflowTemplatesDataTable.refresh();\r\n            }\r\n        });\r\n    },\r\n    deleteWorkflowTemplateClicked: function (e) {\r\n        let $target = $(e.currentTarget),\r\n            $tr = $target.closest('tr'),\r\n            row = this.workflowTemplatesDataTable.getRow($tr),\r\n            template = row.data();\r\n        this.deleteWorkflowTemplate(template);\r\n    },\r\n    deleteWorkflowTemplate: function (template) {\r\n        if (template == null) {\r\n            return;\r\n        }\r\n\r\n        new PJQ.views.modals.DeleteCancel({\r\n            header: \"Delete Submittal Workflow Template?\",\r\n            body: \"Are you sure you want to delete this workflow template? This cannot be undone.\",\r\n            onDelete: () => {\r\n                template.destroy({\r\n                    success: () => {\r\n                        if (template.id > 0) {\r\n                            let row = this.workflowTemplatesDataTable.getRow(template.cid);\r\n                            if (row != null) {\r\n                                this.workflowTemplatesDataTable.removeRow(row);\r\n                            }\r\n                        }\r\n\r\n                        this.workflowTemplatesDataTable.refresh();\r\n                    },\r\n                    error: () => {\r\n                        PJQ.notifications.notify.errorNotify({\r\n                            message: 'Failed to delete workflow template'\r\n                        });\r\n                    }\r\n                });\r\n            }\r\n        });\r\n    },\r\n    renderWorkflowTemplates: function () {\r\n        if (this.workflowTemplates == null) {\r\n            return;\r\n        }\r\n\r\n        this.workflowTemplatesDataTable = new PJQ.views.dataTables.DataTable({\r\n            el: this.$('.workflow-templates'),\r\n            data: this.workflowTemplates.models,\r\n            isHideSearch: true,\r\n            language: {\r\n                emptyTable: 'No Templates have been created yet',\r\n                zeroRecords: 'No Templates have been created yet'\r\n            },\r\n            isStriped: false,\r\n            paging: false,\r\n            order: [[0, \"asc\"]],\r\n            columns: [\r\n                {\r\n                    \"data\": \"attributes.name\",\r\n                    \"columnData\": \"attributes.name\",\r\n                    \"title\": \"Name\",\r\n                    \"orderable\": false,\r\n                    \"searchable\": false,\r\n                    \"render\": _.bind(function (data, type, row) {\r\n                        return '<a class=\"btn-edit-workflow-template\" href=\"javascript:void(0)\" data-id=\"' + row.id + '\">' + row.get('name') + '</a>';\r\n                    }, this)\r\n                },\r\n                {\r\n                    \"data\": \"\",\r\n                    \"title\": \"\",\r\n                    \"orderable\": false,\r\n                    \"searchable\": false,\r\n                    \"width\": \"70px\",\r\n                    \"render\": _.bind(function (data, type, row) {\r\n                        let html = '<div class=\"text-align-right show-on-row-hover\">'\r\n                        html += '<button type=\"button\" class=\"btn btn-info btn-edit-workflow-template\"><i class=\"fal fa-pencil\"></i></button><button type=\"button\" class=\"btn btn-danger btn-delete-workflow-template ml-1\"><i class=\"fal fa-trash\"></i></button>'\r\n                        return html + '</div>';\r\n                    }, this)\r\n                }],\r\n            dom: '<\"top\"<\"clear\">>rt<\"bottom\"p<\"clear\">>',\r\n            contextMenuOptions: {\r\n                actions: [\r\n                    {\r\n                        name: 'Delete',\r\n                        isDanger: true,\r\n                        onClick: (row) => {\r\n                            this.deleteWorkflowTemplate(row.data());\r\n                        },\r\n                        isShown: () => {\r\n                            return this.options.isEdit;\r\n                        },\r\n                    }\r\n                ]\r\n            },\r\n            onRowDoubleClick: (row) => {\r\n                this.editWorkflowTemplate(row.data());\r\n            }\r\n        });\r\n    },\r\n    columnSelected: function (sender) {\r\n        this.dataTable.dataTable.row($(sender.currentTarget).closest('tr')).data().visible = $(sender.currentTarget).prop('checked');\r\n    }\r\n});\r\n\r\nPJQ.views.submittals.SettingsModal = PJQ.views.BaseModal.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'Modal-Submittal-Settings'),\r\n        minWidth: \"600px\",\r\n    },\r\n    events: {\r\n        'click .settings-save': 'onSave'\r\n    },\r\n    afterRender: function () {\r\n        this.settingsView = new PJQ.views.submittals.Settings({\r\n            el: this.$('.modal-body'),\r\n            submittalsView: this.options.submittalsView,\r\n            model: this.model,\r\n            userSettings: this.options.userSettings,\r\n            project: this.options.project\r\n        });\r\n    },\r\n    onSave: function () {\r\n        let loader = new PJQ.Loader(this.$('.modal-content'));\r\n        this.options.submittalsView.options.userSettings.getSettings(PJQ.constants.submittals.view.SUBMITTALS).rowsPerPage = parseInt(this.settingsView.rowsPerPageSelectPicker.getValue());\r\n\r\n        let columns = this.options.submittalsView.options.userSettings.getSettings(PJQ.constants.submittals.view.SUBMITTALS).columns;\r\n        _.each(this.settingsView.dataTable.dataTable.data(), function (row) {\r\n            if (row.visible) {\r\n                if (columns.indexOf(row.columnData) === -1)\r\n                    columns.push(row.columnData);\r\n            } else {\r\n                columns = _.filter(columns, function (column) {\r\n                    return (column != row.columnData);\r\n                });\r\n            }\r\n        });\r\n        this.options.submittalsView.options.userSettings.getSettings(PJQ.constants.submittals.view.SUBMITTALS).columns = columns;\r\n        this.options.submittalsView.options.userSettings.save(null, {\r\n            success: _.bind(function () {\r\n                this.settingsView.model.save(null, {\r\n                    success: _.bind(function () {\r\n                        PJQ.notifications.notify.successNotify({\r\n                            message: 'Submittal settings saved'\r\n                        });\r\n                        if (typeof this.options.onSave === 'function') {\r\n                            this.options.onSave();\r\n                        }\r\n                        this.removeModal();\r\n                    }, this),\r\n                    error: function () {\r\n                        loader.remove();\r\n                    }\r\n                });\r\n            }, this)\r\n        });\r\n    }\r\n});\r\n\r\nPJQ.views.submittals.TemplateManagement = PJQ.views.templates.TemplateManagement.extend({\r\n    beforeFirstRender: function () {\r\n        this.collection = new PJQ.collections.submittals.Templates();\r\n        this.listenTo(this.collection, 'fetch', this.render);\r\n        this.collection.fetch();\r\n    },\r\n    addTemplate: function () {\r\n        new PJQ.views.templates.NewTemplateModal({\r\n            model: new PJQ.models.submittals.Template(),\r\n            onSave: _.bind(function (template) {\r\n                this.collection.add(template);\r\n                this.editTemplate(template);\r\n            }, this)\r\n        });\r\n    },\r\n    editTemplate: function (template) {\r\n        new PJQ.views.submittals.EditTemplateModal({\r\n            model: template,\r\n            onClose: _.bind(function () {\r\n                this.dataTable.refresh();\r\n            }, this),\r\n            onDelete: _.bind(function (template) {\r\n                if (template.id > 0) {\r\n                    let row = this.dataTable.getRow(template.cid);\r\n                    this.collection.remove(template);\r\n                    template.destroy();\r\n                    this.dataTable.removeRow(row);\r\n                }\r\n            }, this)\r\n        });\r\n    }\r\n});\r\n\r\nPJQ.views.submittals.ItemTypeSettings = PJQ.views.BaseView.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'item-type-settings')\r\n    },\r\n    events: {\r\n        'click .add-item-type': 'addItemType',\r\n        'click .edit-item-type': 'editItemTypeClicked',\r\n        'click .delete-item-type': 'deleteItemTypeClicked'\r\n    },\r\n    beforeFirstRender: function () {\r\n        if (this.collection == null) {\r\n            this.fetchItemTypes(_.bind(function () {\r\n                this.render();\r\n            }, this));\r\n        }\r\n    },\r\n    fetchItemTypes: function (callback) {\r\n        this.collection = new PJQ.collections.submittals.ItemTypes();\r\n\r\n        this.collection.fetch({\r\n            success: _.bind(function () {\r\n                callback();\r\n            }, this)\r\n        })\r\n    },\r\n    afterRender: function () {\r\n        this.dataTable = new PJQ.views.dataTables.DataTable({\r\n            el: this.$(\".item-types\"),\r\n            data: this.collection.models,\r\n            rowId: \"cid\",\r\n            order: [0, 'asc'],\r\n            language: {\r\n                zeroRecords: 'Click \"Add\" to create a new line item'\r\n            },\r\n            sortableOptions: {\r\n                data: this.collection\r\n            },\r\n            isHideSearch: true,\r\n            pageLength: 50,\r\n            bSort: false,\r\n            onRowDoubleClick: _.bind(function (row) {\r\n                this.editItemType(row.data());\r\n            }, this),\r\n            contextMenuOptions: {\r\n                actions: [\r\n                    {\r\n                        name: 'Edit',\r\n                        onClick: _.bind(function (row) {\r\n                            this.editItemType(row.data());\r\n                        }, this)\r\n                    },\r\n                    {\r\n                        name: 'Delete',\r\n                        isDanger: true,\r\n                        onClick: _.bind(function (row) {\r\n                            this.deleteItemType(row);\r\n                        }, this)\r\n\r\n                    }\r\n                ]\r\n            },\r\n            columns: [\r\n                {\r\n                    \"data\": \"attributes.sortOrder\",\r\n                    \"title\": \"\",\r\n                    \"searchable\": false,\r\n                    \"orderable\": false,\r\n                    \"visible\": false\r\n                },\r\n                {\r\n                    \"title\": \"Name\",\r\n                    \"data\": \"attributes.name\",\r\n                    \"orderable\": true\r\n                },\r\n                {\r\n                    \"data\": \"\",\r\n                    \"title\": \"\",\r\n                    \"orderable\": false,\r\n                    \"searchable\": false,\r\n                    \"width\": \"80px\",\r\n                    \"render\": _.bind(function (data, type, row) {\r\n                        return '<div class=\"text-align-right show-on-row-hover\"><button type=\"button\" class=\"btn btn-info edit-item-type ht-30p wd-35p ml-1 fs-14\"><span class=\"fal fa-pencil\"></span></button><button type=\"button\" class=\"btn btn-danger delete-item-type ht-30p wd-35p ml-1 fs-14\"><span class=\"fal fa-trash\"></span></button></div>';\r\n                    }, this)\r\n                }\r\n            ]\r\n        });\r\n    },\r\n    addItemType: function () {\r\n        new PJQ.views.submittals.EditItemTypeModal({\r\n            onSave: _.bind(function (model) {\r\n                this.collection.add(model);\r\n                this.dataTable.addRow(model);\r\n            }, this)\r\n        })\r\n    },\r\n    editItemTypeClicked: function (e) {\r\n        let $target = $(e.currentTarget),\r\n            $row = $target.closest('tr'),\r\n            row = this.dataTable.getRow($row),\r\n            itemType = row.data();\r\n\r\n        this.editItemType(itemType);\r\n    },\r\n    deleteItemTypeClicked: function (e) {\r\n        let $target = $(e.currentTarget),\r\n            $row = $target.closest('tr'),\r\n            row = this.dataTable.getRow($row),\r\n            itemType = row.data();\r\n\r\n        this.deleteItemType(itemType);\r\n    },\r\n    deleteItemType: function (row) {\r\n        let itemType = row.data();\r\n        new PJQ.views.modals.DeleteCancel({\r\n            header: \"Confirm Deletion\",\r\n            body: \"Are you sure you want to delete this item type?\",\r\n            onDelete: _.bind(function () {\r\n                this.collection.remove(itemType);\r\n                itemType.destroy();\r\n                this.dataTable.removeRow(row);\r\n            }, this)\r\n        });\r\n    },\r\n    editItemType: function (itemType) {\r\n        new PJQ.views.submittals.EditItemTypeModal({\r\n            model: itemType,\r\n            onSave: _.bind(function () {\r\n                this.dataTable.refresh();\r\n            }, this)\r\n        })\r\n    }\r\n});\r\n\r\nPJQ.views.submittals.EditItemTypeModal = PJQ.views.BaseModal.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'modal-edit-item-type'),\r\n        maxWidth: \"400px\",\r\n    },\r\n    events: {\r\n        'click .btn-save': 'save',\r\n        'click .btn-cancel': 'cancel'\r\n    },\r\n    beforeModalCreated: function () {\r\n        if (!this.options.model) {\r\n            this.model = new PJQ.models.submittals.ItemType({\r\n                name: \"\",\r\n                sortOrder: 1\r\n            });\r\n        } else {\r\n            this.model = this.options.model;\r\n        }\r\n        this.render();\r\n    },\r\n    renderData: function () {\r\n        return {\r\n            model: this.model\r\n        }\r\n    },\r\n    afterRender: function () {\r\n        if (this.model) {\r\n            new PJQ.Binder(this.$el, this.model, {\r\n                watchElements: [\r\n                    'input'\r\n                ]\r\n            });\r\n        }\r\n    },\r\n    cancel: function () {\r\n        this.model.restore();\r\n        this.removeModal();\r\n    },\r\n    save: function () {\r\n        this.model.save(null, {\r\n            success: _.bind(function (model) {\r\n                if (typeof this.options.onSave === 'function') {\r\n                    this.options.onSave(model);\r\n                    this.removeModal();\r\n                }\r\n            }, this)\r\n        })\r\n    }\r\n});\r\n\r\nPJQ.views.submittals.SubmittalStatusSettings = PJQ.views.BaseView.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'status-settings')\r\n    },\r\n    events: {\r\n        'click .add-status': 'addStatus',\r\n        'click .edit-status': 'editStatusClicked',\r\n        'click .delete-status': 'deleteStatusClicked'\r\n    },\r\n    beforeFirstRender: async function () {\r\n        this.isFetched = false;\r\n\r\n        this.collection = await PJQ.app.session.fetchSubmittalStatuses();\r\n\r\n        this.isFetched = true;\r\n        this.render();\r\n    },\r\n    afterRender: function () {\r\n        if (!this.isFetched)\r\n            return;\r\n\r\n        this.dataTable = new PJQ.views.dataTables.DataTable({\r\n            el: this.$(\".statuses-table\"),\r\n            data: this.collection.models,\r\n            rowId: \"cid\",\r\n            order: [0, 'asc'],\r\n            language: {\r\n                zeroRecords: 'Click \"Add\" to create a new Status'\r\n            },\r\n            sortableOptions: {\r\n                data: this.collection,\r\n                stop: (a, b) => {\r\n                    let self = this,\r\n                        sortedRow = b.item[0].id,\r\n                        pageInfo = self.dataTable.dataTable.page.info();\r\n                    self.$('tr').filter('.odd, .even').each(function (index, html) {\r\n                        let row = $(html)[0].id,\r\n                            rowData = self.collection.get(row),\r\n                            sortNumber = (pageInfo.page * pageInfo.length) + (index + 1);\r\n                        rowData.set('sortOrder', sortNumber);\r\n                        if (row === sortedRow) {\r\n                            self.dataTable.onRowSorted(rowData, sortNumber)\r\n                        }\r\n                    });\r\n                }\r\n            },\r\n            isHideSearch: true,\r\n            pageLength: 50,\r\n            bSort: false,\r\n            onRowDoubleClick: _.bind(function (row) {\r\n                this.editStatus(row.data());\r\n            }, this),\r\n            contextMenuOptions: {\r\n                actions: [\r\n                    {\r\n                        name: 'Edit',\r\n                        onClick: _.bind(function (row) {\r\n                            this.editStatus(row.data());\r\n                        }, this)\r\n                    },\r\n                    {\r\n                        name: 'Delete',\r\n                        isDanger: true,\r\n                        isShown: (row) => {\r\n                            return !row.data().get('isDefault');\r\n                        },\r\n                        onClick: (row) => {\r\n                            this.deleteStatus(row);\r\n                        }\r\n\r\n                    }\r\n                ]\r\n            },\r\n            columns: [\r\n                {\r\n                    \"data\": \"attributes.sortOrder\",\r\n                    \"title\": \"\",\r\n                    \"searchable\": false,\r\n                    \"orderable\": false,\r\n                    \"visible\": false\r\n                },\r\n                {\r\n                    \"title\": \"Name\",\r\n                    \"data\": \"attributes.name\",\r\n                    \"orderable\": true\r\n                },\r\n                {\r\n                    \"title\": \"Type\",\r\n                    \"data\": \"attributes.type\",\r\n                    \"orderable\": true,\r\n                    \"render\": (data, type, row) => {\r\n                        let statusType = row.get('type');\r\n                        return '<span style=\"color:' + PJQ.constants.submittals.statusTypeColors[statusType] + '\">' + PJQ.constants.submittals.statusTypeNames[data] + '</span>';\r\n                    }\r\n                },\r\n                {\r\n                    \"title\": \"Default\",\r\n                    \"data\": \"attributes.isDefault\",\r\n                    \"orderable\": true,\r\n                    \"render\": (data, type, row) => {\r\n                        return data ? \"Yes\" : \"No\";\r\n                    }\r\n                },\r\n                {\r\n                    \"data\": \"\",\r\n                    \"title\": \"\",\r\n                    \"orderable\": false,\r\n                    \"searchable\": false,\r\n                    \"width\": \"80px\",\r\n                    \"render\": (data, type, row) => {\r\n                        let html = '<div class=\"text-align-right show-on-row-hover\"><button type=\"button\" class=\"btn btn-info edit-status ht-30p wd-35p ml-1 fs-14\"><span class=\"fal fa-pencil\"></span></button>';\r\n\r\n                        if (!row.get('isDefault')) {\r\n                            html += '<button type=\"button\" class=\"btn btn-danger delete-status ht-30p wd-35p ml-1 fs-14\"><span class=\"fal fa-trash\"></span></button>'\r\n                        }\r\n\r\n                        return html + '</div>';\r\n                    }\r\n                }\r\n            ]\r\n        });\r\n    },\r\n    copyStatuses: function (callback, status) {\r\n        this.collection.copy((newStatuses) => {\r\n            this.collection.reset(newStatuses);\r\n            this.render();\r\n            if (typeof callback === 'function') {\r\n                status = status ? _.find(this.collection.models, function (model) {\r\n                    return model.get('name') === status.get('name') && model.get('type') === status.get('type');\r\n                }) : null;\r\n\r\n                callback(status);\r\n            }\r\n        });\r\n    },\r\n    addStatus: function () {\r\n        this.editStatus();\r\n    },\r\n    editStatusClicked: function (e) {\r\n        let $target = $(e.currentTarget),\r\n            $row = $target.closest('tr'),\r\n            row = this.dataTable.getRow($row),\r\n            status = row.data();\r\n\r\n        this.editStatus(status);\r\n    },\r\n    editStatus: function (status) {\r\n        let isNew = status == null,\r\n            fnAdd = (copiedStatus) => {\r\n                if (copiedStatus) {\r\n                    status = copiedStatus;\r\n                }\r\n\r\n                new PJQ.views.submittals.EditStatusModal({\r\n                    model: status,\r\n                    statuses: this.collection,\r\n                    onSave: _.bind(function (updatedStatus) {\r\n                        if (isNew) {\r\n                            this.collection.add(updatedStatus);\r\n                            this.dataTable.addRow(updatedStatus);\r\n                        }\r\n\r\n                        if (updatedStatus.get('isDefault')) {\r\n                            _.each(this.collection.models, function (collectionStatus) {\r\n                                if (collectionStatus !== updatedStatus && collectionStatus.get('type') === updatedStatus.get('type')) {\r\n                                    collectionStatus.set('isDefault', false);\r\n                                }\r\n                            });\r\n                        }\r\n\r\n                        this.dataTable.refresh();\r\n                    }, this)\r\n                })\r\n            };\r\n\r\n        if (this.collection.models[0].get('masterUserId') === -1) {\r\n            this.copyStatuses(fnAdd, status);\r\n        } else {\r\n            fnAdd();\r\n        }\r\n    },\r\n    deleteStatusClicked: function (e) {\r\n        let $target = $(e.currentTarget),\r\n            $row = $target.closest('tr'),\r\n            row = this.dataTable.getRow($row)\r\n\r\n        this.deleteStatus(row);\r\n    },\r\n    deleteStatus: function (row) {\r\n        let status = row.data(),\r\n            canDelete = _.size(_.filter(this.collection.models, function (model) {\r\n                if (model.get('type') === status.get('type') && model !== status) {\r\n                    return model;\r\n                }\r\n            })) > 0;\r\n\r\n        if (canDelete) {\r\n            let fnDelete = (copiedStatus) => {\r\n                if (copiedStatus) {\r\n                    status = copiedStatus;\r\n                }\r\n\r\n                new PJQ.views.modals.DeleteCancel({\r\n                    header: \"Confirm Deletion\",\r\n                    body: \"Are you sure you want to delete this status?\",\r\n                    onDelete: _.bind(function () {\r\n                        this.collection.remove(status);\r\n                        status.destroy();\r\n                        this.dataTable.removeRow(row);\r\n                    }, this)\r\n                });\r\n            }\r\n            // Currently we only have 1 of each status type by default so this won't happen, but if we ever have more than 1 of each type, we need to copy the statuses first.\r\n            if (this.collection.models[0].get('masterUserId') === -1) {\r\n                this.copyStatuses(fnDelete, status);\r\n            } else {\r\n                fnDelete();\r\n            }\r\n        } else {\r\n            new PJQ.Alert(this.$('.error'), {\r\n                type: 'danger',\r\n                text: '\"' + status.get('name') + '\" is the only ' + PJQ.constants.submittals.statusTypeNames[status.get('type')] + ' type status and cannot be deleted until another is created.',\r\n                animation: {\r\n                    in: 'fadeIn',\r\n                    out: 'fadeOut'\r\n                },\r\n                timeout: 8000\r\n            });\r\n        }\r\n    }\r\n});\r\n\r\nPJQ.views.submittals.EditStatusModal = PJQ.views.BaseModal.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'modal-edit-status'),\r\n        maxWidth: \"400px\",\r\n    },\r\n    events: {\r\n        'click .btn-save': 'save',\r\n        'click .btn-cancel': 'cancel'\r\n    },\r\n    beforeModalCreated: function () {\r\n        if (!this.model) {\r\n            this.model = new PJQ.models.submittals.Status({\r\n                name: \"\",\r\n                isDefault: false,\r\n                shouldLock: false,\r\n                asNoted: false,\r\n                sortOrder: _.size(this.options.statuses) + 1,\r\n                type: PJQ.constants.submittals.statusTypes.NEW\r\n            });\r\n        }\r\n\r\n        // If the model comes in as default, it's the only default status.\r\n        this.mustBeDefault = this.model.get('isDefault');\r\n\r\n        this.render();\r\n    },\r\n    renderData: function () {\r\n        return {\r\n            model: this.model,\r\n            mustBeDefault: this.mustBeDefault\r\n        }\r\n    },\r\n    afterRender: function () {\r\n        new PJQ.Binder(this.$el, this.model, {\r\n            watchElements: [\r\n                'input'\r\n            ]\r\n        });\r\n\r\n        new PJQ.inputs.Selectpicker({\r\n            el: this.$('.select-status-type'),\r\n            defaultValue: this.model.get('type'),\r\n            isDisabled: !this.model.isNew(),\r\n            isIntChoices: true,\r\n            onChange: _.bind(function (value) {\r\n                this.model.set('type', value);\r\n                this.render();\r\n            }, this)\r\n        });\r\n    },\r\n    cancel: function () {\r\n        this.model.restore();\r\n        this.removeModal();\r\n    },\r\n    validate: function () {\r\n        let isValid = true;\r\n\r\n        PJQ.helpers.inputHelpers.setInputError(this.$('.input-status-name'), true);\r\n        if (_.size(this.model.get('name').trim()) === 0) {\r\n            isValid = false;\r\n            PJQ.helpers.inputHelpers.setInputError(this.$('.input-status-name'), false);\r\n        }\r\n\r\n        return isValid;\r\n    },\r\n    save: function () {\r\n        if (this.validate()) {\r\n            this.model.save(null, {\r\n                success: _.bind(function (model) {\r\n                    if (typeof this.options.onSave === 'function') {\r\n                        this.options.onSave(model);\r\n                        this.removeModal();\r\n                    }\r\n                }, this)\r\n            })\r\n        }\r\n    }\r\n});\r\n","PJQ.views.submittals.EditSubmittalModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'Modal-Edit-Submittal'),\n        subTemplates: {\n            contactBadge: new PJQ.templating.Template(PJQ.constants.modules.GLOBAL, 'Contacts-Select-Input-Contacts'),\n            comments: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'Comments'),\n        },\n        width: '90%',\n        maxWidth: 1500,\n        isShowCloseButton: true,\n        onSave: _.noop,\n        isAdmin: true\n    },\n    events: {\n        'click .btn-save': 'save',\n        'click .btn-close': 'close',\n        'click .submittal-delete': 'delete',\n        'click .btn-add-comment': 'addCommentClicked',\n        'click .btn-mark-submitted': 'submit',\n        'click .btn-submit': 'submit',\n        'click .btn-approve': 'approve',\n        'click .btn-reject': 'reject',\n        'click .btn-notification-history': 'viewNotificationHistory',\n        'click .btn-edit-history': 'viewEditHistory',\n        'click .btn-upload-files': 'uploadFile',\n        'click .edit-file': 'editFileClicked',\n        'click .edit-note': 'editNoteClicked',\n        'click .btn-dl-approver-attachment': 'downloadAttachment',\n        'click .btn-download-all-attachments': 'downloadAllAttachments',\n        'click .expand-history': 'renderHistory',\n        'click .download-history-file': 'downloadHistoryClicked',\n        'click .btn-export': 'exportSubmittal',\n        'click .btn-delete-comment': 'deleteComment',\n        'click .btn-void': 'voidSubmittal',\n        'click .btn-edit-workflow': 'editWorkflow',\n        'click .btn-save-workflow': 'saveWorkflow',\n        'click .btn-view-revision': 'viewRevision',\n        'click .btn-create-revision': 'createRevision',\n        'click .btn-submittal-respond': 'respondToSubmittal',\n        'click .btn-close-submittal': 'closeSubmittal',\n        'click .btn-email-submittal': 'emailSubmittal',\n        'click .btn-distribute-submittal': 'distributeSubmittal',\n        'click .btn-reopen-submittal': 'reopenSubmittal'\n    },\n    beforeModalCreated: async function () {\n        this.isFetched = false;\n        this.options.project = this.options.project ? this.options.project : PJQ.app.session.project;\n\n        if (this.options.project != null) {\n            this.options.isAdmin = this.options.project.hasPermission('submittals.isAdmin');\n        } else {\n            this.options.isAdmin = true;\n        }\n        this.options.canEditPeople = this.options.isAdmin;\n        this.options.canEdit = true;\n        this.options.canUpload = true;\n        this.options.canSubmit = this.options.project != null;\n\n        if (this.model == null) {\n            let submitter;\n            if (!this.options.isAdmin) {\n                submitter = PJQ.app.session.contact != null ? PJQ.app.session.contact : PJQ.app.session.user;\n            }\n\n            this.model = new PJQ.models.submittals.Submittals({\n                projectId: this.options.project ? this.options.project.id : null,\n                templateId: this.options.templateId,\n                submitter: submitter ? submitter.toJSON() : null\n            });\n        }\n\n        if (this.options.project != null) {\n            this.options.settings = await this.options.project.fetchSubmittalSettings();\n            this.options.itemTypes = await this.options.project.fetchSubmittalItemTypes();\n            this.options.customFields = await this.options.project.fetchSubmittalCustomFields();\n            this.options.statuses = await this.options.project.fetchSubmittalStatuses();\n        } else {\n            this.options.settings = await PJQ.app.session.fetchSubmittalSettings();\n            this.options.itemTypes = await PJQ.app.session.fetchSubmittalItemTypes();\n            this.options.customFields = await PJQ.app.session.fetchSubmittalCustomFields();\n            this.options.statuses = await PJQ.app.session.fetchSubmittalStatuses();\n        }\n        this.changedAnnotations = new PJQ.collections.drawings.Annotations();\n\n        if (this.model.isNew()) {\n            let defaultNewStatus = this.options.statuses.findWhere({\n                    isDefault: true,\n                    type: PJQ.constants.submittals.statusTypes.NEW\n                }),\n                defaultManager = this.options.settings?.get('defaultManager'),\n                defaultDistributionList = this.options.settings?.get('defaultDistributionList');\n\n            this.model.set('statusId', defaultNewStatus.id);\n\n            if (defaultManager && this.options.settings?.get('enableWorkflow')) {\n                this.model.manager = new PJQ.models.projectContacts.ProjectContact(defaultManager);\n                this.model.set('managerId', defaultManager);\n            }\n\n            if (defaultDistributionList) {\n                this.model.distributionList = new PJQ.collections.projectContacts.ProjectContacts(defaultDistributionList);\n                this.model.set('distributionList', defaultDistributionList);\n            }\n\n            if(this.options.settings?.get('extendedSettings').defaultIsPublic){\n                this.model.set('isPublic', true);\n            }\n        } else {\n            await this.model.fetch();\n        }\n\n        this.isFetched = true;\n        this.render();\n    },\n    beforeRender: function () {\n        if (!this.isFetched) {\n            return;\n        }\n\n        let searchId = PJQ.app.session.contact ? PJQ.app.session.contact.get('id') : PJQ.app.session.user.get('id'),\n            isSubmitter = this.model.get('isSubmitter') || (this.model.submitter && this.model.submitter.id === searchId),\n            isCreator = this.model.get('isCreator') || (this.model.createdBy && this.model.createdBy.id === searchId);\n\n        this.options.canEditPeople = this.options.isAdmin;\n        this.options.isApprover = this.model.get('isApprover') || null != _.findWhere(this.model.get('approvers'), {id: searchId});\n        if (this.model.isNew()) {\n            this.options.canEdit = true;\n            this.options.canUpload = true;\n            this.options.canSubmit = this.options.project != null;\n        } else if (this.model.get('hasRevision') || this.model.get('isClosed') || this.model.isVoidStatus(this.options.statuses)) {\n            this.options.canEditPeople = false;\n            this.options.canEdit = false;\n            this.options.canUpload = false;\n            this.options.canSubmit = false;\n        } else if (this.model.get('isClosed') || this.model.isApprovedStatus(this.options.statuses) || this.model.isVoidStatus(this.options.statuses)) {\n            this.options.canEdit = false;\n            this.options.canUpload = false;\n            this.options.canSubmit = false;\n        } else if (this.model.isPartiallyApproved()) {\n            this.options.canEdit = this.options.isAdmin;\n            this.options.canUpload = this.options.isAdmin || this.options.isApprover;\n            this.options.canSubmit = false;\n        } else if (this.model.isSubmittedStatus(this.options.statuses)) {\n            this.options.canEdit = this.options.isAdmin;\n            this.options.canUpload = this.options.isAdmin || (!this.options.settings.get('enableWorkflow') && this.options.isApprover);\n            this.options.canSubmit = false;\n        } else {\n            this.options.canEditPeople = this.options.isAdmin;\n            this.options.canEdit = this.options.isAdmin;\n            this.options.canSubmit = this.options.project != null && (this.options.isAdmin || this.options.isApprover || isSubmitter || isCreator);\n            this.options.canUpload = this.options.canSubmit || isCreator\n        }\n\n        if (this.model.statusShouldLock(this.options.statuses)) {\n            this.options.canEdit = false;\n            this.options.canEditPeople = false;\n            this.options.canSubmit = false;\n            this.options.canUpload = false;\n            this.options.isApprover = false;\n        }\n\n        this.options.hideItemTypes = PJQ.app.session.project ? PJQ.app.session.project.preferences.getPref(PJQ.constants.preferenceTypes.HIDE_SUBMITTAL_ITEM_TYPE) : PJQ.app.session.preferences.getPref(PJQ.constants.preferenceTypes.HIDE_SUBMITTAL_ITEM_TYPE);\n    },\n    renderData: function () {\n        return {\n            model: this.model,\n            project: this.options.project,\n            customFields: this.options.customFields,\n            settings: this.options.settings,\n            statuses: this.options.statuses,\n            itemTypes: this.options.itemTypes ? this.options.itemTypes : null,\n            canEdit: this.options.canEdit,\n            canEditPeople: this.options.canEditPeople,\n            canSubmit: this.options.canSubmit,\n            isAdmin: this.options.isAdmin,\n            isApprover: this.options.isApprover,\n            canUpload: this.options.canUpload,\n            hideItemTypes: this.options.hideItemTypes,\n            isFetched: this.isFetched\n        };\n    },\n    afterRender: function () {\n        if (!this.isFetched) {\n            return;\n        }\n\n        if (this.options.itemTypes == null || !this.options.itemTypes.isFetched\n            || this.options.customFields == null || !this.options.customFields.isFetched) {\n            return;\n        }\n        if (this.options.project) {\n            PJQ.app.session.project.fetchSubmittalCustomFields(_.bind(function (customFields) {\n                this.customFields = customFields;\n                this.renderCustomFields();\n            }, this));\n        }\n\n        if (this.options.canEdit) {\n            new PJQ.Binder(this.$el, this.model, {\n                watchElements: [\n                    'input',\n                    'textarea'\n                ]\n            });\n        }\n\n        this.dueDatePicker = new PJQ.inputs.Datepicker({\n            el: this.$('.input-due-date'),\n            datepickerOptions: {\n                format: PJQ.helpers.dateHelpers.dateFormats.datePicker.DATE,\n                defaultDate: this.model.get('dueDate') ? new Date(this.model.get('dueDate')) : null\n            },\n            onChange: _.bind(function (newDate) {\n                this.model.set('dueDate', newDate);\n            }, this)\n        });\n\n        new PJQ.inputs.Datepicker({\n            el: this.$('.input-received-date'),\n            datepickerOptions: {\n                format: PJQ.helpers.dateHelpers.dateFormats.datePicker.DATE,\n                defaultDate: this.model.get('receivedDate') ? new Date(this.model.get('receivedDate')) : null\n            },\n            onChange: _.bind(function (newDate) {\n                this.model.set('receivedDate', newDate);\n            }, this)\n        });\n\n        new PJQ.views.groups.GroupsSelectInput({\n            el: this.$('.submittal-groups'),\n            isShowAddButton: false,\n            addButton: this.$('.btn-edit-groups'),\n            groupLevels: PJQ.app.session.project ? PJQ.app.session.project.preferences.getPref(PJQ.constants.preferenceTypes.GROUP_LEVELS) : PJQ.app.session.preferences.getPref(PJQ.constants.preferenceTypes.GROUP_LEVELS),\n            groupUserId: PJQ.app.session.project ? PJQ.app.session.project.get('masterUserId') : PJQ.app.session.get('masterUserId'),\n            selectedGroups: this.model.groups.models,\n            isReadOnly: !this.options.canEdit,\n            onAfterSave: _.bind(function (selectedGroups) {\n                this.model.groups.reset(selectedGroups);\n                this.model.isDirty = true;\n            }, this)\n        });\n\n        if (this.model.ballInCourt || (this.options.settings.get('enableWorkflow') && this.model.isSubmittedStatus(this.options.statuses) && this.model.workflow.getCurrentStep() != null && _.size(this.model.workflow.getCurrentStep()?.get('approvers')) > 0)) {\n            new PJQ.views.contacts.ContactsSelectInput({\n                el: this.$('.submittal-ball-in-court'),\n                selectedContact: this.model.ballInCourt ?? _.map(this.model.workflow.getCurrentStep().approvers.models, (approver) => {\n                    return new PJQ.models.projectContacts.ProjectContact(approver.get('person'))\n                }),\n                canViewContacts: this.options.project == null || this.options.project.hasPermission('projectContacts.canView'),\n                isSingleChoice: this.model.ballInCourt != null,\n                isReadOnly: true,\n                displayContactsBlock: true\n            });\n        }\n\n        new PJQ.views.contacts.ContactsSelectInput({\n            el: this.$('.submittal-submitter'),\n            selectedContact: this.model.submitter,\n            canViewContacts: this.options.project == null || this.options.project.hasPermission('projectContacts.canView'),\n            canEdit: this.options.canEditPeople,\n            displayContactsBlock: true,\n            canSwitchContext: this.options.project == null,\n            context: this.options.project != null ? PJQ.constants.contacts.contexts.PROJECTCONTACTS : PJQ.constants.contacts.contexts.USERS,\n            isSingleChoice: true,\n            onChange: (selectedContact) => {\n                this.model.submitter = selectedContact;\n                this.model.isDirty = true;\n            }\n        });\n        let approvers = [];\n        _.each(this.model.get('approvers'), function (approver) {\n            approvers.push(new PJQ.models.projectContacts.ProjectContact(approver));\n        })\n\n        if (this.options.settings.get('enableWorkflow') && (!this.model.isNew() || this.options.isAdmin)) {\n            if (this.options.project != null) {\n                this.workflowView = new PJQ.views.submittals.WorkflowView({\n                    el: this.$('.workflow-outer'),\n                    model: this.model.workflow,\n                    submittal: this.model,\n                    project: this.options.project,\n                    isEdit: this.model.isNew() && this.options.isAdmin,\n                    canChangeBallInCourt: this.options.canEdit && this.options.isAdmin && !this.model.get('isClosed') && this.model.isSubmittedStatus(this.options.statuses),\n                    canEdit: this.options.canEdit && this.options.isAdmin && !this.model.get('isClosed') && !this.model.isApprovedStatus(this.options.statuses) && !this.model.isVoidStatus(this.options.statuses),\n                    canRespond: !this.model.get('isClosed'),\n                    onChange: () => {\n                        this.model.isDirty = true;\n                    },\n                    onRespond: () => {\n                        this.render();\n                    },\n                    onSetBallInCourt: () => {\n                        this.render();\n                    }\n                });\n            }\n\n            this.managerPicker = new PJQ.views.contacts.ContactsSelectInput({\n                el: this.$('.submittal-manager'),\n                selectedContact: this.model.manager,\n                canViewContacts: this.options.project == null || this.options.project.hasPermission('projectContacts.canView'),\n                canEdit: this.options.canEditPeople,\n                displayContactsBlock: true,\n                canSwitchContext: this.options.project == null,\n                context: this.options.project != null ? PJQ.constants.contacts.contexts.PROJECTCONTACTS : PJQ.constants.contacts.contexts.USERS,\n                isSingleChoice: true,\n                onChange: _.bind(function (selectedContact) {\n                    this.model.manager = selectedContact;\n                    this.model.isDirty = true;\n                }, this)\n            });\n        } else {\n            new PJQ.views.contacts.ContactsSelectInput({\n                el: this.$('.submittal-approval-list'),\n                subTemplates: {\n                    contactBadge: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'Approver-Input-Contacts')\n                },\n                isSortable: true,\n                allowDuplicate: this.options.settings.get('approvalMode') === PJQ.constants.submittals.approvalModes.SEQUENTIAL,\n                onStop: (array) => {\n                    let approvers = this.model.get('approvers'),\n                        newApprovers = [],\n                        usedIdx = [];\n                    _.each(array, function (id) {\n                        let approverIdx = _.findIndex(approvers, function (approver, idx) {\n                            return approver.id === id && usedIdx.indexOf(idx) === -1;\n                        });\n                        if (approverIdx === -1) {\n                            return;\n                        }\n                        usedIdx.push(approverIdx);\n\n                        newApprovers.push(approvers[approverIdx]);\n                    });\n                    this.model.set('approvers', newApprovers);\n                    this.model.isDirty = true;\n                },\n                contactsRenderData: {\n                    isAdmin: this.options.isAdmin,\n                    showApproval: (contact, index) => {\n                        return this.model.isSubmittedStatus(this.options.statuses);\n                    },\n                    canApprove: (contact, index) => {\n                        return !contact.get('hasApproved') && this.model.isSubmittedStatus(this.options.statuses)\n                            && this.model.isUserCurrentApprover(this.options.settings.get('approvalMode'), contact);\n                    }\n                },\n                onApproveBehalf: (contact) => {\n                    this.model.set('asNotedCommentId', null);\n\n                    let isNew = this.model.isNew(),\n                        fnApprove = (comment) => {\n                            // todo: save comment\n                            this.model.approve(null, contact.id, (success, err) => {\n                                if (!success) {\n                                    if (!this.handleStatusError(err)) {\n                                        let errTxt = 'Encountered an error while approving the submittal';\n                                        PJQ.notifications.notify.errorNotify({\n                                            message: errTxt\n                                        });\n                                    }\n                                    return;\n                                }\n\n                                if (this.options.onSave) {\n                                    this.options.onSave(this.model, isNew);\n                                }\n                                this.render();\n                            });\n                        };\n\n                    new PJQ.views.modals.YesNo({\n                        header: \"Add comment?\",\n                        body: 'Would you like to include a comment on behalf of this approver?',\n                        onYes: () => {\n                            this.checkActiveResponse(false, (hadComment) => {\n                                if (!hadComment) {\n                                    new PJQ.views.submittals.StatusChangeCommentModal({\n                                        model: this.model,\n                                        title: 'Submission Note',\n                                        onSave: _.bind(function (model, comment) {\n                                            fnApprove(comment);\n                                        }, this)\n                                    })\n                                } else {\n                                    fnApprove();\n                                }\n                            });\n                        },\n                        onNo: () => {\n                            fnApprove();\n                        }\n                    });\n                },\n                selectedContact: approvers,\n                canViewContacts: this.options.project == null || this.options.project.hasPermission('projectContacts.canView'),\n                canEdit: this.options.canEditPeople,\n                displayContactsBlock: true,\n                context: this.options.project != null ? PJQ.constants.contacts.contexts.PROJECTCONTACTS : PJQ.constants.contacts.contexts.USERS,\n                isSingleChoice: false,\n                canSwitchContext: this.options.project == null,\n                onChange: (selectedContacts) => {\n                    let newApprovers = [],\n                        approvedByIds = _.map(_.filter(this.model.get('approvers'), (approver) => {\n                            return approver.hasApproved;\n                        }), (approver) => {\n                            return approver.id;\n                        });\n                    _.each(selectedContacts, function (contact) {\n                        let existApproverIdx = approvedByIds.indexOf(contact.id)\n                        contact.set({\n                            isApprover: true,\n                            hasApproved: existApproverIdx !== -1\n                        });\n                        newApprovers.push(contact);\n\n                        if (existApproverIdx !== -1) {\n                            delete approvedByIds[existApproverIdx];\n                        }\n                    }, this)\n                    this.model.set('approvers', newApprovers);\n                    this.model.isDirty = true;\n                }\n            });\n        }\n\n        if (this.options.isAdmin) {\n            new PJQ.views.contacts.ContactsSelectInput({\n                el: this.$('.submittal-distribution-list'),\n                selectedContact: this.model.distributionList.models,\n                canViewContacts: this.options.project == null || this.options.project.hasPermission('projectContacts.canView'),\n                canEdit: this.options.canEditPeople,\n                displayContactsBlock: true,\n                canSwitchContext: this.options.project == null,\n                context: this.options.project != null ? PJQ.constants.contacts.contexts.PROJECTCONTACTS : PJQ.constants.contacts.contexts.USERS,\n                isSingleChoice: false,\n                onChange: _.bind(function (selectedContacts) {\n                    this.model.distributionList.reset(selectedContacts);\n                    this.model.isDirty = true;\n                }, this)\n            });\n        }\n\n        if (!this.options.hideItemTypes) {\n            new PJQ.inputs.Selectpicker({\n                el: this.$('.select-item-type'),\n                noneSelectedText: 'Select Value',\n                isMultiple: true,\n                isIntChoices: true,\n                defaultValue: _.map(this.model.itemTypes.models, function (model) {\n                    return model.id;\n                }),\n                onChange: _.bind(function (value) {\n                    this.model.itemTypes.reset(this.options.itemTypes.get(value));\n                    this.model.isDirty = true;\n                }, this)\n            });\n        }\n\n        this.fileUploader = new PJQ.views.files.FileUploaderGrid({\n            el: this.$('.submittal-file-uploader'),\n            context: 'submittal',\n            contextId: this.model.id,\n            canAddAnnotations: this.options.canEdit,\n            onAnnotationChange: this.model.id > 0 ? null : (annotation) => {\n                this.changedAnnotations.merge(annotation);\n            },\n            mergeAnnotations: this.changedAnnotations,\n            collection: this.model.attachments,\n            canUpload: this.options.canUpload,\n            canDelete: this.options.isAdmin,\n            hasNotes: true,\n            isVersioned: true,\n            versionByName: true,\n            previewImageDimension: 150,\n            includeProjectAttachments: true,\n            onNoteChanged: (attachment) => {\n                if (!(attachment.id > 0)) {\n                    return;\n                }\n\n                new PJQ.ajax.Request({\n                    endpoint: this.options.project.endpoint() + '/submittals/attachments/' + attachment.id,\n                    isAPIv2: true,\n                    data: attachment.toJSON()\n                }).patch().done(() => {\n                    PJQ.notifications.notify.successNotify({\n                        message: 'Attachment note updated'\n                    });\n                }).fail((xhr, err, result) => {\n                    PJQ.notifications.notify.errorNotify({\n                        message: 'Encountered an error while updating the attachment note'\n                    });\n                });\n            },\n            onNewVersion: () => {\n                this.model.isDirty = true;\n                this.fileUploader.render();\n            },\n            onSuccess: () => {\n                this.model.isDirty = true;\n            },\n            onDelete: (attachment, callback) => {\n                if (attachment.id > 0) {\n                    attachment.set('isDeleted', true);\n                } else {\n                    this.model.attachments.remove(attachment);\n                }\n                this.model.isDirty = true;\n                callback();\n            }\n        });\n\n        this.renderCustomFields();\n        this.renderComments();\n    },\n    renderComments: function () {\n        this.renderSubTemplate(false, this.options.subTemplates.comments, this.$('.comments-outer'), {\n            comments: this.model.comments.models,\n            model: this.model,\n            settings: this.options.settings,\n            statuses: this.options.statuses,\n            canDelete: this.options.canEdit && (this.options.project ? this.options.project.hasPermission('submittals.canDeleteComments') : true)\n        });\n    },\n    respondToSubmittal: function (e) {\n        let currentStep = this.model.workflow.getCurrentStep();\n        if (currentStep == null) {\n            return;\n        }\n\n        let approver = currentStep.approvers.findWhere({isMe: true});\n        new PJQ.views.submittals.WorkflowResponseModal({\n            project: this.options.project,\n            submittal: this.model,\n            approver: approver,\n            onSave: () => {\n                this.render();\n            }\n        });\n    },\n    editWorkflow: function () {\n        this.$('.btn-edit-workflow').addClass('hidden');\n        this.$('.btn-save-workflow').removeClass('hidden');\n\n        this.workflowView.setEdit(true);\n    },\n    saveWorkflow: function () {\n        this.$('.btn-save-workflow').addClass('hidden');\n        this.$('.btn-edit-workflow').removeClass('hidden');\n\n        this.workflowView.setEdit(false);\n    },\n    viewRevision: function () {\n        let lastRevisionId = this.model.get('lastRevisionId');\n        if (lastRevisionId == null) {\n            return;\n        }\n\n        this.removeModal();\n\n        let revision = new PJQ.models.submittals.Submittals({\n            submittalId: lastRevisionId\n        });\n        new PJQ.views.submittals.EditSubmittalModal({\n            model: revision,\n            project: this.options.project,\n            onSave: this.options.onSave,\n            onClose: this.options.onClose,\n            onDelete: this.options.onDelete\n        });\n    },\n    createRevision: function () {\n        this.removeModal();\n\n        let newSubmittal = this.model.clone();\n        newSubmittal.set({\n            submittalId: null,\n            attachments: [],\n            comments: [],\n            workflow: null,\n            submittalNumber: null,\n            statusId: null,\n            dueDate: null,\n            revisionFor: this.model.id,\n            isClosed: false\n        });\n        newSubmittal.attachments = new PJQ.collections.submittals.Attachments();\n        newSubmittal.comments = new PJQ.collections.submittals.Comments();\n\n        newSubmittal.workflow = this.model.workflow.clone();\n\n        new PJQ.views.submittals.EditSubmittalModal({\n            model: newSubmittal,\n            project: this.options.project,\n            onSave: this.options.onSave,\n            onClose: this.options.onClose,\n            onDelete: this.options.onDelete\n        });\n    },\n    closeSubmittal: function () {\n        new PJQ.views.submittals.ConfirmSubmittalCloseModal({\n            header: \"Close Submittal?\",\n            body: 'Are you sure you want to close this submittal? This will lock the submittal and distribute it to all submittal participants (when selected).',\n            statuses: this.options.statuses,\n            onConfirm: (opts) => {\n                this.model.close(opts, () => {\n                    PJQ.notifications.notify.successNotify({\n                        message: \"Submittal successfully closed\" + (opts.distribute ? ' and distributed' : '')\n                    });\n                    this.render();\n                });\n            }\n        });\n    },\n    emailSubmittal: function () {\n        let projectName = this.options.project?.get('projectName')?.trim(),\n            subject = `A Submittal has been shared with you ${projectName && _.size(projectName) > 0 ? `for ${projectName}` : ''}`;\n        new PJQ.views.email.ComposeEmailModal({\n            project: PJQ.app.session.project,\n            header: \"Email Submittal\",\n            enableCC: false,\n            subject: subject,\n            onSaveWait: (data, cb) => {\n                this.model.share(data, _.bind(function () {\n                    PJQ.notifications.notify.successNotify({\n                        message: 'Submittal email sent'\n                    });\n\n                    cb();\n                }, this));\n            }\n        });\n    },\n    reopenSubmittal: function () {\n        new PJQ.views.modals.YesNo({\n            header: \"Reopen Submittal?\",\n            body: 'Are you sure you want to reopen this submittal?',\n            onYes: () => {\n                this.model.reopen(() => {\n                    PJQ.notifications.notify.successNotify({\n                        message: \"Submittal successfully reopened\"\n                    });\n                    this.render();\n                });\n            }\n        });\n    },\n    distributeSubmittal: function () {\n        new PJQ.views.modals.YesNo({\n            header: \"Distribute Submittal?\",\n            body: 'Are you sure you want to distribute this submittal?',\n            onYes: () => {\n                this.model.distribute(() => {\n                    PJQ.notifications.notify.successNotify({\n                        message: \"Submittal successfully distributed\"\n                    });\n                    this.render();\n                });\n            }\n        });\n    },\n    voidSubmittal: function (e) {\n        if (this.model.get('templateId') != null) {\n            return;\n        }\n\n        if (!this.validate()) {\n            return;\n        }\n\n        let status = null;\n        if (this.options.isAdmin && e && e.currentTarget != null) {\n            statusId = $(e.currentTarget).data('statusId');\n            status = this.options.statuses.get(statusId);\n        }\n\n        if (status == null) {\n            status = this.options.statuses.findWhere({\n                type: PJQ.constants.submittals.statusTypes.VOID,\n                isDefault: true\n            });\n        }\n\n        let isNew = this.model.isNew();\n        let fnVoid = (comment) => {\n            this.model.void(status.id, (success, err) => {\n                if (!success) {\n                    if (!this.handleStatusError(err)) {\n                        let errTxt = 'Encountered an error while voiding the submittal';\n                        PJQ.notifications.notify.errorNotify({\n                            message: errTxt\n                        });\n                    }\n                    return;\n                }\n\n                if (this.options.onSave) {\n                    this.options.onSave(this.model, isNew);\n                }\n                this.render();\n            });\n        };\n\n        let asNoted = status.get('asNoted');\n        this.checkActiveResponse(asNoted, (hadComment) => {\n            if (!hadComment && asNoted) {\n                new PJQ.views.submittals.StatusChangeCommentModal({\n                    model: this.model,\n                    title: 'Void Note',\n                    onSave: _.bind(function (model, comment) {\n                        fnVoid(comment);\n                    }, this)\n                })\n            } else {\n                fnVoid();\n            }\n        });\n    },\n    addCommentClicked: function () {\n        this.addComment();\n    },\n    addComment: function (asNoted, callback) {\n        let val = this.$('.item-new-comment').val().trim();\n        if (_.size(val) === 0) {\n            callback(false);\n            return;\n        }\n\n        let comment = new PJQ.models.submittals.Comment({\n            submittalId: this.model.id,\n            comment: val,\n            createdOn: new Date(),\n            asNoted: asNoted === true\n        });\n        if (!this.model.isNew() && !asNoted) {\n            comment.save(null, {\n                success: _.bind(function () {\n                    this.model.comments.add(comment);\n                    this.renderComments();\n                    if (typeof callback === 'function') {\n                        callback(true);\n                    }\n                }, this)\n            });\n        } else {\n            comment.createdBy = PJQ.app.session.contact ? PJQ.app.session.contact : PJQ.app.session.user;\n            this.model.comments.add(comment);\n            this.renderComments();\n            if (typeof callback === 'function') {\n                callback(true);\n            }\n        }\n        this.$('.item-new-comment').val('');\n    },\n    deleteComment: function (e) {\n        let target = $(e.currentTarget),\n            $comment = target.closest('.card'),\n            cid = $comment.data().cid,\n            comment = this.model.comments.get(cid);\n\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Confirm Deletion\",\n            body: \"Are you sure you want to delete this comment?\",\n            onDelete: _.bind(function () {\n                this.model.comments.remove(comment);\n                comment.destroy();\n                this.renderComments();\n            }, this)\n        });\n    },\n    renderCustomFields: function () {\n        if (_.size(this.options.customFields.models) > 0) {\n            this.customFieldsForm = new PJQ.views.customFields.CustomFieldsForm({\n                el: this.$('.submittal-custom-fields'),\n                collection: this.options.customFields,\n                fieldValues: this.model.get('customFieldValues'),\n                isEdit: this.options.canEdit,\n                onChange: _.bind(function () {\n                    this.model.isDirty = true;\n                }, this)\n            });\n        }\n    },\n    save: function () {\n        this.checkActiveResponse(false, () => {\n            if (this.fileUploader.isUploading()) {\n                new PJQ.views.BaseModal({\n                    header: \"Files Uploading\",\n                    body: \"You can't save while files are uploading\"\n                });\n            } else {\n                let fnDisableButtons = _.bind(function (disable) {\n                    this.$('.btn-save').attr('disabled', disable);\n                    this.$('.btn-submit').attr('disabled', disable);\n                }, this)\n\n                fnDisableButtons(true);\n                if (!this.validate()) {\n                    fnDisableButtons(false);\n                    return;\n                }\n\n                PJQ.helpers.inputHelpers.setInputError(this.$('.input-user-company-name'), true);\n\n                let fnSaveAnnotations = (callback) => {\n                    _.each(this.changedAnnotations.models, (annotation) => {\n                        if (annotation.isNew()) {\n                            annotation.set('contextId', this.model.id);\n                        }\n                    });\n                    this.changedAnnotations.saveAll(() => {\n                        if (this.options.onSave) {\n                            this.options.onSave(this.model, isNew);\n                        }\n\n                        let message;\n                        if (submitting) {\n                            message = 'Submittal submitted successfully';\n                        } else {\n                            message = 'Submittal saved successfully';\n                        }\n                        PJQ.notifications.notify.successNotify({\n                            message: message\n                        });\n\n                        this.removeModal();\n\n                        if (typeof callback === 'function') {\n                            callback();\n                        }\n                    });\n                };\n\n                let submitting = this.model.isSubmittedStatus(this.options.statuses) && this.model.initAttributes.statusId !== this.model.get('statusId'),\n                    isNew = this.model.isNew();\n                if (this.model.hasChanged() || this.model.isNew()) {\n                    this.model.save({\n                        workflow: this.model.workflow && this.model.workflow.hasChanged() ? this.model.workflow.toJSON() : null,\n                    }, {\n                        notify: true,\n                        success: () => {\n                            fnSaveAnnotations();\n                        },\n                        error: () => {\n                            fnDisableButtons(false);\n                        }\n                    });\n                } else {\n                    fnSaveAnnotations();\n                }\n            }\n        });\n    },\n    close: function () {\n        if (this.model.hasChanged() && this.model.get('templateId') === null) {\n            new PJQ.views.modals.SaveDontSave({\n                header: \"Unsaved Changes\",\n                body: \"Do you want to save changes?\",\n                onSave: _.bind(function () {\n                    this.save();\n                }, this),\n                onDontSave: _.bind(function () {\n                    this.onClose(this.model);\n                    this.removeModal();\n                }, this)\n            });\n        } else {\n            this.onClose(this.model);\n            this.removeModal();\n        }\n    },\n    delete: function () {\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Confirm Deletion\",\n            body: \"Are you sure you want to delete this Submittal?\",\n            onDelete: _.bind(function () {\n                if (this.options.onDelete) {\n                    this.options.onDelete(this.model);\n                }\n                this.removeModal();\n            }, this)\n        });\n    },\n    checkActiveResponse: function (asNoted, callback) {\n        let aRes = this.$('.item-new-comment').val();\n        if (_.size(aRes) > 0) {\n            new PJQ.views.modals.YesNo({\n                header: \"Post Comment?\",\n                body: 'You typed a comment but did not click <b>Post Comment</b>.  Would you like to post this comment before continuing?',\n                onYes: _.bind(function () {\n                    this.addComment(asNoted, (hadComment) => {\n                        callback(hadComment);\n                    });\n                }, this),\n                onNo: _.bind(function () {\n                    if (typeof callback === 'function') {\n                        callback(false);\n                    }\n                }, this)\n            });\n        } else {\n            if (typeof callback === 'function') {\n                callback(false);\n            }\n        }\n    },\n    submit: function (e) {\n        if (this.model.get('templateId') != null) {\n            return;\n        }\n\n        if (!this.validate()) {\n            return;\n        }\n\n        let status = null;\n        if (e && e.currentTarget != null) {\n            statusId = $(e.currentTarget).data('statusId');\n            status = this.options.statuses.get(statusId);\n        }\n\n        if (status == null) {\n            status = this.options.statuses.findWhere({\n                type: PJQ.constants.submittals.statusTypes.SUBMITTED,\n                isDefault: true\n            });\n        }\n\n        let isNew = this.model.isNew();\n        let fnSubmit = (comment) => {\n            this.model.submit(status.id, (success, err) => {\n                if (!success) {\n                    if (!this.handleStatusError(err)) {\n                        let errTxt = 'Encountered an error while submitting the submittal';\n                        PJQ.notifications.notify.errorNotify({\n                            message: errTxt\n                        });\n                    }\n                    return;\n                }\n\n                if (this.options.onSave) {\n                    this.options.onSave(this.model, isNew);\n                }\n                this.render();\n            });\n        };\n\n        let asNoted = status.get('asNoted');\n        this.checkActiveResponse(asNoted, (hadComment) => {\n            if (!hadComment && asNoted) {\n                new PJQ.views.submittals.StatusChangeCommentModal({\n                    model: this.model,\n                    title: 'Submission Note',\n                    onSave: _.bind(function (model, comment) {\n                        fnSubmit(comment);\n                    }, this)\n                })\n            } else {\n                fnSubmit();\n            }\n        });\n    },\n    reject: function (e) {\n        if (this.model.get('templateId') != null) {\n            return;\n        }\n\n        if (!this.validate()) {\n            return;\n        }\n\n        let status = null;\n        if (this.options.isAdmin && e && e.currentTarget != null) {\n            statusId = $(e.currentTarget).data('statusId');\n            status = this.options.statuses.get(statusId);\n        }\n\n        if (status == null) {\n            status = this.options.statuses.findWhere({\n                type: PJQ.constants.submittals.statusTypes.REJECTED,\n                isDefault: true\n            });\n        }\n\n        let isNew = this.model.isNew();\n        let fnReject = (comment) => {\n            this.model.reject(status.id, (success, err) => {\n                if (!success) {\n                    if (!this.handleStatusError(err)) {\n                        let errTxt = 'Encountered an error while rejecting the submittal';\n                        PJQ.notifications.notify.errorNotify({\n                            message: errTxt\n                        });\n                    }\n                    return;\n                }\n\n                if (this.options.onSave) {\n                    this.options.onSave(this.model, isNew);\n                }\n                this.render();\n            });\n        };\n\n        let asNoted = status.get('asNoted');\n        this.checkActiveResponse(asNoted, (hadComment) => {\n            if (!hadComment && asNoted) {\n                new PJQ.views.submittals.StatusChangeCommentModal({\n                    model: this.model,\n                    title: 'Rejection Note',\n                    onSave: _.bind(function (model, comment) {\n                        fnReject(comment);\n                    }, this)\n                })\n            } else {\n                fnReject();\n            }\n        });\n    },\n    validate: function () {\n        PJQ.helpers.inputHelpers.setInputError(this.$('.input-due-date'), true);\n        let dueDateVal = this.$('.input-due-date').val().trim();\n\n        if (_.size(dueDateVal) === 0) {\n            PJQ.helpers.inputHelpers.setInputError(this.$('.input-due-date'), false);\n            return false;\n        }\n\n        if (this.managerPicker != null && !this.managerPicker.validate() && this.options.isAdmin) {\n            return false;\n        }\n\n        if (this.customFieldsForm && !this.customFieldsForm.validate()) {\n            return false;\n        }\n\n        return true\n    },\n    approve: function (e) {\n        if (this.model.get('templateId') != null) {\n            return;\n        }\n\n        if (!this.validate()) {\n            return;\n        }\n\n        let status = null;\n        if (e && e.currentTarget != null) {\n            statusId = $(e.currentTarget).data('statusId');\n            status = this.options.statuses.get(statusId);\n        }\n\n        if (status == null) {\n            status = this.options.statuses.findWhere({\n                type: PJQ.constants.submittals.statusTypes.APPROVED,\n                isDefault: true\n            });\n        }\n\n        let isNew = this.model.isNew();\n        let fnApprove = (comment) => {\n            // todo: save comment\n            this.model.approve(status.id, null, (success, err) => {\n                if (!success) {\n                    if (!this.handleStatusError(err)) {\n                        let errTxt = 'Encountered an error while approving the submittal';\n                        PJQ.notifications.notify.errorNotify({\n                            message: errTxt\n                        });\n                    }\n                    return;\n                }\n\n                if (this.options.onSave) {\n                    this.options.onSave(this.model, isNew);\n                }\n                this.render();\n            });\n        };\n\n        let asNoted = status.get('asNoted');\n        this.checkActiveResponse(asNoted, (hadComment) => {\n            if (!hadComment && asNoted) {\n                new PJQ.views.submittals.StatusChangeCommentModal({\n                    model: this.model,\n                    title: 'Approval Note',\n                    onSave: _.bind(function (model, comment) {\n                        fnApprove(comment);\n                    }, this)\n                });\n            } else {\n                fnApprove();\n            }\n\n        });\n    },\n    handleStatusError: function (err) {\n        if (err !== PJQ.constants.submittals.errors.STATUS_NOT_EXISTS) {\n            return false;\n        }\n\n        let fObj = this.options.project != null ? this.options.project : PJQ.app.session;\n        fObj.fetchSubmittalStatuses(true).then((st) => {\n            this.options.statuses = st;\n            this.render();\n        });\n\n        PJQ.notifications.notify.errorNotify({\n            message: 'The status you selected no longer exists, please select a different status'\n        });\n        return true;\n    },\n    editFile: function (file) {\n        new PJQ.views.submittals.FileEditorModal({\n            model: file,\n            collection: new PJQ.collections.submittals.Attachments(),\n            isNewVersion: true,\n            onSave: _.bind(function (file) {\n                let newFile = file.models[0];\n                if (file.models[1].get('submittalDocumentId') === file.models[1].get('parentSubmittalDocumentId')) {\n                    newFile.attributes.parentSubmittalDocumentId = file.models[1].get('submittalDocumentId');\n                } else {\n                    newFile.attributes.parentSubmittalDocumentId = file.models[1].get('parentSubmittalDocumentId');\n                }\n                _.each(this.model.attachments.models, function (model) {\n                    if (model.get('submittalDocumentId') === file.models[1].get('submittalDocumentId')) {\n                        model.attributes = newFile.attributes;\n                    }\n                }, this);\n                this.model.isDirty = true;\n            }, this)\n        });\n    },\n    uploadFile: function () {\n        new PJQ.views.submittals.FileEditorModal({\n            collection: new PJQ.collections.submittals.Attachments(),\n            isNewVersion: false,\n            onSave: _.bind(function (files) {\n                _.each(files.models, function (model) {\n                    model.attributes.createdOn = new Date();\n                    model.attributes.createdByDisplay = model.get('createdBy').contactName;\n                    model.attributes.notes = \"\";\n                    model.attributes.versionNumber = 1;\n                    this.model.attachments.add(model);\n                }, this);\n                this.model.isDirty = true;\n            }, this)\n        });\n    },\n    editNoteClicked: function (e) {\n        let target = $(e.currentTarget),\n            row = this.filesTable.getRow(target.closest('tr'));\n        this.editNote(row);\n    },\n    editNote: function (file) {\n        new PJQ.views.submittals.FileEditorModal({\n            model: file,\n            isNoteEdit: true,\n            collection: new PJQ.collections.submittals.Attachments(),\n            isNewVersion: true,\n            onSave: _.bind(function () {\n                this.model.isDirty = true;\n                // this.filesTable.render();\n            }, this)\n        });\n    },\n    viewNotificationHistory: function () {\n        this.model.fetchNotifications(function (notifications) {\n            new PJQ.views.notifications.NotificationHistory({\n                collection: notifications\n            });\n        })\n    },\n    viewEditHistory: function () {\n        this.model.fetchEditHistory(function (editHistory) {\n            new PJQ.views.submittals.EditHistoryModal({\n                history: editHistory\n            })\n        })\n    },\n    exportSubmittal: function () {\n        new PJQ.ajax.Request({\n            endpoint: this.options.project.endpoint() + '/submittals/' + this.model.get('submittalId') + '/export',\n            data: {\n                isApi2: true\n            }\n        }).post().done(_.bind(function (response) {\n            PJQ.files.downloadFile(response.url, {\n                isEndpoint: false\n            });\n        }, this)).fail(_.bind(function (xhr, err, result) {\n        }, this));\n    },\n    downloadAttachment: function (e) {\n        let $target = $(e.currentTarget),\n            cid = $target.data('cid'),\n            attachment = null;\n        for (let i = 0; i < this.model.attachments.models.length; i++) {\n            let sAttachment = this.model.attachments.models[i];\n            if (sAttachment.cid === cid) {\n                attachment = sAttachment;\n            } else if (sAttachment.versions != null) {\n                for (let j = 0; j < sAttachment.versions.models.length; j++) {\n                    let ver = sAttachment.versions.models[j];\n                    if (ver.cid === cid) {\n                        attachment = ver;\n                    }\n                }\n            }\n\n            if (attachment != null) {\n                break;\n            }\n        }\n        if (attachment != null) {\n            attachment.download();\n        }\n    },\n    downloadAllAttachments: function () {\n        this.options.project.downloadAttachments(_.map(this.model.attachments.models, function (attachment) {\n            return new PJQ.models.files.File({\n                entryId: attachment.get('entryId'),\n                guid: attachment.get('guid')\n            });\n        }));\n    }\n});\n\nPJQ.views.submittals.ConfirmSubmittalCloseModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'modal-close-submittal'),\n        statuses: null\n    },\n    events: {\n        'click .btn-confirm': 'onConfirm',\n        'change .cb-distribute': 'onDistributeChange'\n    },\n    beforeModalCreated: function () {\n        this.distribute = true;\n    },\n    renderData: function () {\n        return {\n            distribute: this.distribute,\n            statuses: this.options.statuses\n        };\n    },\n    afterRender: function () {\n        this.selectedStatus = -1;\n        if (this.options.statuses != null) {\n            this.statusPicker = new PJQ.inputs.Selectpicker({\n                el: this.$('.select-status'),\n                defaultValue: this.selectedStatus,\n                isIntChoices: true,\n                choices: _.union([{\n                    id: -1,\n                    name: 'Closed'\n                }], _.map(_.filter(this.options.statuses.models, (st) => {\n                    let tp = st.get('type');\n                    return tp === PJQ.constants.submittals.statusTypes.APPROVED\n                        || tp === PJQ.constants.submittals.statusTypes.REJECTED;\n                }), (st) => {\n                    return {\n                        id: st.id,\n                        name: st.get('name')\n                    };\n                })),\n                onChange: (value) => {\n                    this.selectedStatus = value;\n                }\n            });\n        }\n    },\n    onDistributeChange: function () {\n        this.distribute = this.$('.cb-distribute').prop('checked');\n        this.render();\n    },\n    onConfirm: function () {\n        if (typeof this.options.onConfirm === 'function') {\n            this.options.onConfirm({\n                distribute: this.distribute,\n                status: this.selectedStatus\n            });\n        }\n        this.removeModal();\n    }\n});","PJQ.models.submittals.Submittals = PJQ.models.BaseModel.extend({\r\n    idAttribute: \"submittalId\",\r\n    endpoint: function (urlOptions) {\r\n        let arr;\r\n        if (this.isNew() && this.get('projectId') > 0) {\r\n            arr = [\r\n                {\r\n                    endpoint: 'projects',\r\n                    value: this.get('projectId')\r\n                },\r\n                {\r\n                    endpoint: 'submittals',\r\n                    value: this.id\r\n                }\r\n            ];\r\n        } else if (this.isNew() && this.get('templateId') > 0) {\r\n            arr = [\r\n                {\r\n                    endpoint: 'submittals'\r\n                },\r\n                {\r\n                    endpoint: 'templates',\r\n                    value: this.get('templateId')\r\n                },\r\n                {\r\n                    endpoint: 'submittals'\r\n                }\r\n            ];\r\n        } else {\r\n            arr = [\r\n                {\r\n                    endpoint: 'submittals',\r\n                    value: this.id\r\n                }\r\n            ];\r\n        }\r\n\r\n        return PJQ.helpers.urlHelpers.generateEndpoint(arr);\r\n    },\r\n    afterInit: function () {\r\n        if (this.get('customFieldValues') == null) {\r\n            this.set('customFieldValues', [], {\r\n                silent: true\r\n            });\r\n        }\r\n    },\r\n    parse: function (model) {\r\n        model = _.defaults(model, {});\r\n\r\n        if (_.size(model.itemTypes) > 0) {\r\n            this.itemTypes = new PJQ.collections.submittals.ItemTypes(model.itemTypes);\r\n        } else if (!this.groups) {\r\n            this.itemTypes = new PJQ.collections.submittals.ItemTypes();\r\n        }\r\n\r\n        if (_.size(model.groups) > 0) {\r\n            this.groups = new PJQ.collections.groups.Groups(model.groups);\r\n        } else if (!this.groups) {\r\n            this.groups = new PJQ.collections.groups.Groups();\r\n        }\r\n\r\n        if (model.createdBy != null) {\r\n            this.createdBy = new PJQ.models.projectContacts.ProjectContact(model.createdBy);\r\n        } else {\r\n            this.createdBy = null;\r\n        }\r\n\r\n        if (model.ballInCourt != null) {\r\n            this.ballInCourt = new PJQ.models.projectContacts.ProjectContact(model.ballInCourt);\r\n        } else {\r\n            this.ballInCourt = null;\r\n        }\r\n\r\n        if (model.submitter != null) {\r\n            this.submitter = new PJQ.models.projectContacts.ProjectContact(model.submitter);\r\n        } else {\r\n            this.submitter = null;\r\n        }\r\n\r\n        if (model.manager != null) {\r\n            this.manager = new PJQ.models.projectContacts.ProjectContact(model.manager);\r\n        } else {\r\n            this.manager = null;\r\n        }\r\n\r\n        this.workflow = new PJQ.models.submittals.Workflow(model.workflow);\r\n\r\n        // this.approvers = new PJQ.collections.projectContacts.ProjectContacts(model.approvers);\r\n\r\n        if (_.size(model.distributionList) > 0) {\r\n            this.distributionList = new PJQ.collections.projectContacts.ProjectContacts(model.distributionList);\r\n        } else if (!this.distributionList) {\r\n            this.distributionList = new PJQ.collections.projectContacts.ProjectContacts();\r\n        }\r\n\r\n        if (_.size(model.comments) > 0) {\r\n            this.comments = new PJQ.collections.submittals.Comments(model.comments);\r\n        } else if (!this.comments) {\r\n            this.comments = new PJQ.collections.submittals.Comments();\r\n        }\r\n\r\n        if (_.size(model.attachments) > 0) {\r\n            this.attachments = new PJQ.collections.submittals.Attachments(model.attachments);\r\n        } else if (!this.attachments) {\r\n            this.attachments = new PJQ.collections.submittals.Attachments();\r\n        }\r\n\r\n        return model;\r\n    },\r\n    statusShouldLock: function (statuses) {\r\n        let statusId = this.get('statusId'),\r\n            status = statuses.get(statusId);\r\n        return status && status.get('shouldLock');\r\n    },\r\n    isNewStatus: function (statuses) {\r\n        let statusId = this.get('statusId'),\r\n            status = statuses.get(statusId);\r\n        return status && status.get('type') === PJQ.constants.submittals.statusTypes.NEW;\r\n    },\r\n    isSubmittedStatus: function (statuses) {\r\n        let statusId = this.get('statusId'),\r\n            status = statuses.get(statusId);\r\n        return status && status.get('type') === PJQ.constants.submittals.statusTypes.SUBMITTED;\r\n    },\r\n    isApprovedStatus: function (statuses) {\r\n        let statusId = this.get('statusId'),\r\n            status = statuses.get(statusId);\r\n\r\n        if (status.get('type') === PJQ.constants.submittals.statusTypes.SUBMITTED) {\r\n            // todo: check for submitted status type & partially approved\r\n        }\r\n\r\n        return status && status.get('type') === PJQ.constants.submittals.statusTypes.APPROVED;\r\n    },\r\n    isRejectedStatus: function (statuses) {\r\n        let statusId = this.get('statusId'),\r\n            status = statuses.get(statusId);\r\n        return status && status.get('type') === PJQ.constants.submittals.statusTypes.REJECTED;\r\n    },\r\n    isVoidStatus: function (statuses) {\r\n        let statusId = this.get('statusId'),\r\n            status = statuses.get(statusId);\r\n        return status && status.get('type') === PJQ.constants.submittals.statusTypes.VOID;\r\n    },\r\n    isPartiallyApproved: function () {\r\n        return null != _.find(this.get('approvers'), (approver) => {\r\n            return !approver.hasApproved;\r\n        }) && null != _.find(this.get('approvers'), (approver) => {\r\n            return approver.hasApproved;\r\n        });\r\n    },\r\n    getStatusColor: function (statuses) {\r\n        let statusId = this.get('statusId'),\r\n            status = statuses.get(statusId),\r\n            statusType = status.get('type');\r\n        if (status == null) {\r\n            // should never ever happen\r\n            return '#000000';\r\n        } else if (this.get('isClosed') && statusType === PJQ.constants.submittals.statusTypes.SUBMITTED) {\r\n            return PJQ.constants.colors.RED;\r\n        }\r\n\r\n        if (statusType === PJQ.constants.submittals.statusTypes.SUBMITTED && this.isPartiallyApproved()) {\r\n            return PJQ.constants.colors.PURPLE;\r\n        }\r\n\r\n        return PJQ.constants.submittals.statusTypeColors[status.get('type')];\r\n    },\r\n    getStatusName: function (settings, statuses, options = {}) {\r\n        let statusId = this.get('statusId'),\r\n            status = statuses.get(statusId),\r\n            statusType = status.get('type');\r\n        if (status == null) {\r\n            // should never ever happen\r\n            return 'New';\r\n        } else if (this.get('isClosed') && statusType === PJQ.constants.submittals.statusTypes.SUBMITTED) {\r\n            return 'Closed';\r\n        }\r\n\r\n        let result = status.get('name');\r\n        if (statusType === PJQ.constants.submittals.statusTypes.SUBMITTED && this.isPartiallyApproved()) {\r\n            let approveStatusName = settings.getApproveStatusName('ed');\r\n            return 'Partially ' + approveStatusName;\r\n        }\r\n\r\n        // todo: add 'as noted\" if asNoted is enabled and asNotedCommentId is set\r\n        if (status.get('asNoted') && this.get('asNotedCommentId') > 0 && (!options || options.includeAsNoted !== false) && -1 === result.toLowerCase().indexOf(\"as noted\")) {\r\n            result += ' as noted';\r\n        }\r\n\r\n        return result;\r\n    },\r\n    beforeSave: function () {\r\n        this.set({\r\n            groups: this.groups.toJSON(),\r\n            itemTypes: this.itemTypes.toJSON(),\r\n            submitter: this.submitter ? this.submitter.toJSON() : null,\r\n            manager: this.manager ? this.manager.toJSON() : null,\r\n            // approvers: this.approvers.toJSON(),\r\n            distributionList: this.distributionList.toJSON(),\r\n            attachments: this.attachments.toJSON(),\r\n            comments: this.comments.toJSON()\r\n        });\r\n    },\r\n    approve: function (status, behalfId, callback) {\r\n        this.beforeSave();\r\n\r\n        let ep = this.endpoint() + '/approve';\r\n        if (behalfId && behalfId != 0) {\r\n            ep += '?behalf=' + behalfId.toString();\r\n        }\r\n        if (status && status != 0) {\r\n            ep += '?approveStatus=' + status.toString();\r\n        }\r\n        new PJQ.ajax.Request({\r\n            endpoint: ep,\r\n            data: this.toJSON()\r\n        }).post().done((response) => {\r\n            this.reset(response);\r\n            if (typeof callback === 'function') {\r\n                callback(true);\r\n            }\r\n        }).fail((res) => {\r\n            let err = null;\r\n            if (res.responseJSON && res.responseJSON.message) {\r\n                err = res.responseJSON.message;\r\n            }\r\n            if (typeof callback === 'function') {\r\n                callback(false, err);\r\n            }\r\n        });\r\n    },\r\n    void: function (status, callback) {\r\n        let prevStatus = this.get('statusId');\r\n        if (status > 0) {\r\n            this.set('statusId', status);\r\n        }\r\n\r\n        this.beforeSave();\r\n        new PJQ.ajax.Request({\r\n            endpoint: this.endpoint() + '/void',\r\n            data: this.toJSON()\r\n        }).post().done(_.bind(function (response) {\r\n            this.reset(response);\r\n            if (typeof callback === 'function') {\r\n                callback(true);\r\n            }\r\n        }, this)).fail((res) => {\r\n            this.set('statusId', prevStatus);\r\n\r\n            let err = null;\r\n            if (res.responseJSON && res.responseJSON.message) {\r\n                err = res.responseJSON.message;\r\n            }\r\n            if (typeof callback === 'function') {\r\n                callback(false, err);\r\n            }\r\n        });\r\n    },\r\n    reject: function (status, callback) {\r\n        let prevStatus = this.get('statusId');\r\n        if (status > 0) {\r\n            this.set('statusId', status);\r\n        }\r\n\r\n        this.beforeSave();\r\n        new PJQ.ajax.Request({\r\n            endpoint: this.endpoint() + '/reject',\r\n            data: this.toJSON()\r\n        }).post().done(_.bind(function (response) {\r\n            this.reset(response);\r\n            if (typeof callback === 'function') {\r\n                callback(true);\r\n            }\r\n        }, this)).fail((res) => {\r\n            this.set('statusId', prevStatus);\r\n\r\n            let err = null;\r\n            if (res.responseJSON && res.responseJSON.message) {\r\n                err = res.responseJSON.message;\r\n            }\r\n            if (typeof callback === 'function') {\r\n                callback(false, err);\r\n            }\r\n        });\r\n    },\r\n    submit: function (status, callback) {\r\n        let prevStatus = this.get('statusId');\r\n        if (status > 0) {\r\n            this.set('statusId', status);\r\n        }\r\n\r\n        this.beforeSave();\r\n        if (this.id > 0) {\r\n            new PJQ.ajax.Request({\r\n                endpoint: this.endpoint() + '/submit',\r\n                data: this.toJSON()\r\n            }).post().done(_.bind(function (response) {\r\n                this.reset(response);\r\n                if (typeof callback === 'function') {\r\n                    callback(true);\r\n                }\r\n            }, this)).fail((res) => {\r\n                this.set('statusId', prevStatus);\r\n\r\n                let err = null;\r\n                if (res.responseJSON && res.responseJSON.message) {\r\n                    err = res.responseJSON.message;\r\n                }\r\n                if (typeof callback === 'function') {\r\n                    callback(false, err);\r\n                }\r\n            });\r\n        } else {\r\n            this.save(null, {\r\n                notify: false,\r\n                success: function () {\r\n                    if (typeof callback === 'function') {\r\n                        callback(true);\r\n                    }\r\n                },\r\n                error: (model, res) => {\r\n                    this.set('statusId', prevStatus);\r\n\r\n                    let err = null;\r\n                    if (res.responseJSON && res.responseJSON.message) {\r\n                        err = res.responseJSON.message;\r\n                    }\r\n\r\n                    if (typeof callback === 'function') {\r\n                        callback(false, err);\r\n                    }\r\n                }\r\n            })\r\n        }\r\n    },\r\n    respond: function (response, behalfId, callback) {\r\n        this.beforeSave();\r\n\r\n        let ep = this.endpoint() + '/respond';\r\n        if (behalfId && behalfId != 0) {\r\n            ep += '?behalf=' + behalfId.toString();\r\n        }\r\n\r\n        new PJQ.ajax.Request({\r\n            endpoint: ep,\r\n            data: response.toJSON()\r\n        }).post().done((response) => {\r\n            this.reset(response);\r\n            if (typeof callback === 'function') {\r\n                callback(true);\r\n            }\r\n        }).fail((res) => {\r\n            let err = null;\r\n            if (res.responseJSON && res.responseJSON.message) {\r\n                err = res.responseJSON.message;\r\n            }\r\n            if (typeof callback === 'function') {\r\n                callback(false, err);\r\n            }\r\n        });\r\n    },\r\n    setBallInCourt: function (stepId, callback) {\r\n        new PJQ.ajax.Request({\r\n            endpoint: this.endpoint() + '/ballincourt' + '?stepId=' + stepId\r\n        }).post().done((response) => {\r\n            this.reset(response);\r\n            if (typeof callback === 'function') {\r\n                callback(true);\r\n            }\r\n        }).fail((res) => {\r\n            let err = null;\r\n            if (res.responseJSON && res.responseJSON.message) {\r\n                err = res.responseJSON.message;\r\n            }\r\n            if (typeof callback === 'function') {\r\n                callback(false, err);\r\n            }\r\n        });\r\n    },\r\n    close: function (opts, callback) {\r\n        let qs = '?distribute=' + (opts.distribute === true).toString();\r\n        if (opts.status && opts.status > 0) {\r\n            qs += '&statusId=' + opts.status.toString();\r\n        }\r\n        new PJQ.ajax.Request({\r\n            endpoint: this.endpoint() + '/close' + qs,\r\n        }).post().done((response) => {\r\n            this.reset(response);\r\n            if (typeof callback === 'function') {\r\n                callback(true);\r\n            }\r\n        }).fail((res) => {\r\n            let err = null;\r\n            if (res.responseJSON && res.responseJSON.message) {\r\n                err = res.responseJSON.message;\r\n            }\r\n            if (typeof callback === 'function') {\r\n                callback(false, err);\r\n            }\r\n        });\r\n    },\r\n    reopen: function (callback) {\r\n        new PJQ.ajax.Request({\r\n            endpoint: this.endpoint() + '/reopen',\r\n        }).post().done((response) => {\r\n            this.reset(response);\r\n            if (typeof callback === 'function') {\r\n                callback(true);\r\n            }\r\n        }).fail((res) => {\r\n            let err = null;\r\n            if (res.responseJSON && res.responseJSON.message) {\r\n                err = res.responseJSON.message;\r\n            }\r\n            if (typeof callback === 'function') {\r\n                callback(false, err);\r\n            }\r\n        });\r\n    },\r\n    distribute: function (callback) {\r\n        new PJQ.ajax.Request({\r\n            endpoint: this.endpoint() + '/distribute',\r\n        }).post().done((response) => {\r\n            this.reset(response);\r\n            if (typeof callback === 'function') {\r\n                callback(true);\r\n            }\r\n        }).fail((res) => {\r\n            let err = null;\r\n            if (res.responseJSON && res.responseJSON.message) {\r\n                err = res.responseJSON.message;\r\n            }\r\n            if (typeof callback === 'function') {\r\n                callback(false, err);\r\n            }\r\n        });\r\n    },\r\n    share: function (data, callback) {\r\n        new PJQ.ajax.Request({\r\n            endpoint: this.endpoint() + '/email',\r\n            data: {\r\n                subject: data != null ? data.subject : null,\r\n                body: data != null ? data.body : null,\r\n                toEmails: data != null ? data.toEmails : null,\r\n                ccEmails: data != null ? data.ccEmails : null,\r\n            }\r\n        }).post().done(_.bind(function (response) {\r\n            callback();\r\n        }, this)).fail(_.bind(function (xhr, err, result) {\r\n            //todo: error\r\n        }, this));\r\n    },\r\n    isUserCurrentApprover: function (approvalMode, user) {\r\n        if (!user) {\r\n            if (approvalMode === PJQ.constants.submittals.approvalModes.SEQUENTIAL) {\r\n                return this.get('isNextApprover') && !this.get('hasApproved');\r\n            }\r\n\r\n            return this.get('isApprover') && !this.get('hasApproved');\r\n        }\r\n\r\n        let result = false;\r\n        if (approvalMode === PJQ.constants.submittals.approvalModes.SEQUENTIAL) {\r\n            let foundNextApprover = false;\r\n            _.each(this.get('approvers'), function (approver) {\r\n                if (foundNextApprover || approver.hasApproved) {\r\n                    return;\r\n                }\r\n\r\n                if (approver.id === user.get('id')) {\r\n                    result = true;\r\n                }\r\n                foundNextApprover = true;\r\n            })\r\n        } else {\r\n            result = null != _.findWhere(this.get('approvers'), {id: user.get('id'), hasApproved: false});\r\n        }\r\n        return result;\r\n    },\r\n    getRemainingApprovers: function () {\r\n        return _.filter(this.get('approvers'), (approver) => {\r\n            return !approver.hasApproved;\r\n        })\r\n    },\r\n    isLastApprover: function (approvalMode, user) {\r\n        if (!user) {\r\n            if (approvalMode === PJQ.constants.submittals.approvalModes.SEQUENTIAL) {\r\n                return _.size(this.get('approvers')) === 0 || this.get('isLastApprover');\r\n            }\r\n\r\n            return _.size(this.getRemainingApprovers()) <= 1;\r\n        }\r\n\r\n        return _.indexOf(this.get('approvers'), user.get('id')) === this.get('approvers').length - 1;\r\n    },\r\n    fetchNotifications: function (callback) {\r\n        if (this.notifications == null) {\r\n            this.notifications = new PJQ.collections.submittals.Notifications(null, {\r\n                submittal: this\r\n            })\r\n        }\r\n\r\n        this.notifications.fetch({\r\n            success: _.bind(function () {\r\n                callback(this.notifications);\r\n            }, this)\r\n        });\r\n    },\r\n    fetchEditHistory: function (callback) {\r\n        if (this.editHistory == null) {\r\n            this.editHistory = new PJQ.collections.submittals.EditHistory(null, {\r\n                submittal: this\r\n            })\r\n        }\r\n\r\n        this.editHistory.fetch({\r\n            success: _.bind(function () {\r\n                callback(this.editHistory);\r\n            }, this)\r\n        });\r\n    },\r\n});\r\n\r\nPJQ.models.submittals.Attachment = PJQ.models.files.File.extend({\r\n    idAttribute: 'attachmentId',\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'submittals',\r\n                value: this.get('submittalId')\r\n            },\r\n            {\r\n                endpoint: 'attachments',\r\n                value: this.id\r\n            }\r\n        ]);\r\n    }\r\n});\r\n\r\nPJQ.models.submittals.WorkflowTemplate = PJQ.models.BaseModel.extend({\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'projects',\r\n                value: this.get('projectId')\r\n            },\r\n            {\r\n                endpoint: 'submittals'\r\n            },\r\n            {\r\n                endpoint: 'workflows',\r\n                value: this.id\r\n            }\r\n        ]);\r\n    },\r\n    parse: function (model) {\r\n        if (model == null) {\r\n            model = {};\r\n        }\r\n\r\n        this.workflow = new PJQ.models.submittals.Workflow(model.workflow);\r\n        return model;\r\n    },\r\n    beforeSave: function () {\r\n        this.set({\r\n            workflow: this.workflow.toJSON()\r\n        });\r\n    },\r\n});\r\n\r\nPJQ.models.submittals.Workflow = PJQ.models.BaseModel.extend({\r\n    parse: function (model) {\r\n        if (model == null) {\r\n            model = {};\r\n        }\r\n\r\n        this.steps = new PJQ.collections.submittals.WorkflowSteps(model.steps);\r\n\r\n        return model;\r\n    },\r\n    clone: function () {\r\n        let cloned = PJQ.models.BaseModel.prototype.clone.call(this);\r\n        cloned.set({\r\n            submittalId: null,\r\n            templateId: null\r\n        });\r\n        _.each(cloned.steps.models, (step) => {\r\n            step.set({\r\n                id: null,\r\n                isActive: false\r\n            })\r\n\r\n            let newApprovers = _.map(step.approvers.models, (approver) => {\r\n                return {\r\n                    stepId: approver.get('stepId'),\r\n                    person: approver.get('person'),\r\n                    personId: approver.get('personId'),\r\n                    isRequired: approver.get('isRequired'),\r\n                }\r\n            });\r\n            step.approvers.reset(newApprovers);\r\n        });\r\n        return cloned;\r\n    },\r\n    beforeSave: function () {\r\n        this.set('steps', this.steps.toJSON());\r\n    },\r\n    toJSON: function () {\r\n        this.beforeSave();\r\n        return PJQ.models.BaseModel.prototype.toJSON.call(this);\r\n    },\r\n    getCurrentStep: function () {\r\n        return this.steps.findWhere({isActive: true});\r\n    }\r\n});\r\n\r\nPJQ.models.submittals.WorkflowStep = PJQ.models.BaseModel.extend({\r\n    parse: function (model) {\r\n        model = _.defaults(model, {});\r\n\r\n        this.approvers = new PJQ.collections.submittals.WorkflowApprovers(model.approvers);\r\n\r\n        return model;\r\n    },\r\n    beforeSave: function () {\r\n        this.set('approvers', this.approvers.toJSON());\r\n    },\r\n    toJSON: function () {\r\n        this.beforeSave();\r\n        return PJQ.models.BaseModel.prototype.toJSON.call(this);\r\n    }\r\n});\r\n\r\nPJQ.models.submittals.WorkflowApprover = PJQ.models.BaseModel.extend({});\r\n\r\nPJQ.models.submittals.WorkflowResponse = PJQ.models.BaseModel.extend({\r\n    parse: function (model) {\r\n        model = _.defaults(model, {});\r\n\r\n        this.attachments = new PJQ.collections.submittals.Attachments(model.attachments);\r\n\r\n        return model;\r\n    },\r\n    beforeSave: function () {\r\n        this.set({\r\n            attachments: this.attachments.toJSON()\r\n        });\r\n    },\r\n    toJSON: function () {\r\n        this.beforeSave();\r\n        return PJQ.models.BaseModel.prototype.toJSON.call(this);\r\n    }\r\n});\r\n\r\nPJQ.models.submittals.Notification = PJQ.models.notifications.Notification.extend({\r\n    notificationTypeNames: PJQ.constants.submittals.notificationTypeNames,\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'submittals',\r\n                value: this.collection.options.submittal.id\r\n            },\r\n            {\r\n                endpoint: 'notifications',\r\n                value: this.id\r\n            }\r\n        ])\r\n    }\r\n});\r\n\r\nPJQ.models.submittals.Comment = PJQ.models.BaseModel.extend({\r\n    notifyName: 'Comment',\r\n    idAttribute: 'commentId',\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'submittals',\r\n                value: this.get('submittalId')\r\n            },\r\n            {\r\n                endpoint: 'comments',\r\n                value: this.id\r\n            }\r\n        ]);\r\n    }\r\n});\r\n\r\nPJQ.models.submittals.EditHistoryItem = PJQ.models.BaseModel.extend({\r\n    idAttribute: 'auditId'\r\n});\r\n\r\nPJQ.models.submittals.ItemType = PJQ.models.BaseModel.extend({\r\n    idAttribute: 'itemTypeId',\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'submittals'\r\n            },\r\n            {\r\n                endpoint: 'itemtypes',\r\n                value: this.id\r\n            }\r\n        ]);\r\n    }\r\n});\r\n\r\nPJQ.models.submittals.Settings = PJQ.models.BaseModel.extend({\r\n    idAttribute: 'settingId',\r\n    endpoint: function () {\r\n        if (this.get('projectId') > 0) {\r\n            return PJQ.helpers.urlHelpers.generateEndpoint([\r\n                {\r\n                    endpoint: 'projects',\r\n                    value: this.get('projectId')\r\n                },\r\n                {\r\n                    endpoint: 'submittals'\r\n                },\r\n                {\r\n                    endpoint: 'settings'\r\n                }\r\n            ]);\r\n        }\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'submittals'\r\n            },\r\n            {\r\n                endpoint: 'settings'\r\n            }\r\n        ]);\r\n    },\r\n    parse: function (model) {\r\n        model = _.defaults(model, {});\r\n\r\n        if (model) {\r\n            if (_.size(model.defaultDistributionList) > 0) {\r\n                this.defaultDistributionList = new PJQ.collections.projectContacts.ProjectContacts(model.defaultDistributionList);\r\n            } else if (!this.defaultDistributionList) {\r\n                this.defaultDistributionList = new PJQ.collections.projectContacts.ProjectContacts();\r\n            }\r\n\r\n            if (model.defaultManager != null) {\r\n                this.defaultManager = new PJQ.models.projectContacts.ProjectContact(model.defaultManager);\r\n            } else {\r\n                this.defaultManager = null;\r\n            }\r\n        }\r\n\r\n        return model;\r\n    },\r\n    beforeSave: function () {\r\n        this.set({\r\n            defaultManager: this.defaultManager ? this.defaultManager.toJSON() : null,\r\n            defaultDistributionList: this.defaultDistributionList.toJSON()\r\n        });\r\n    },\r\n    getApproveStatusName: function (suffix) {\r\n        let statusName = this.get('approveNameOverride');\r\n        if (_.size(statusName) === 0) {\r\n            statusName = \"Approve\";\r\n        }\r\n\r\n        if (_.size(suffix) > 0) {\r\n            // if suffix starts with \"e\", and status name ends with \"e\"\r\n            // trim the preceding \"e\" from the suffix\r\n            if (suffix[0].toLowerCase() === \"e\" && statusName[statusName.length - 1].toLowerCase() === \"e\") {\r\n                suffix = suffix.substring(1);\r\n            }\r\n\r\n            statusName += suffix;\r\n        }\r\n\r\n        return statusName;\r\n    }\r\n});\r\n\r\nPJQ.models.submittals.Status = PJQ.models.BaseModel.extend({\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'submittals'\r\n            },\r\n            {\r\n                endpoint: 'statuses',\r\n                value: this.id\r\n            }\r\n        ]);\r\n    }\r\n});\r\n\r\nPJQ.models.submittals.SubmittalUserSettings = PJQ.models.BaseModel.extend({\r\n    endpoint: function () {\r\n        let params = [];\r\n        if (this.options.forCompany) {\r\n            params.push({\r\n                parameter: 'forCompany',\r\n                value: true\r\n            });\r\n        }\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'submittals'\r\n            },\r\n            {\r\n                endpoint: 'settings'\r\n            },\r\n            {\r\n                endpoint: 'user'\r\n            }\r\n        ], params);\r\n    },\r\n    getSettings: function (view) {\r\n        return _.find(this.attributes.viewSettings, _.bind(function (setting) {\r\n            return setting.view === view;\r\n        }, this));\r\n    }\r\n});\r\n\r\nPJQ.models.submittals.SubmittalCustomField = PJQ.models.customFields.CustomField.extend({\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'submittals'\r\n            },\r\n            {\r\n                endpoint: 'customFields',\r\n                value: this.id\r\n            }\r\n        ]);\r\n    },\r\n});\r\n\r\nPJQ.models.submittals.Template = PJQ.models.BaseModel.extend({\r\n    idAttribute: 'templateId',\r\n    notifyName: 'Template',\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'submittals'\r\n            },\r\n            {\r\n                endpoint: 'templates',\r\n                value: this.id\r\n            }\r\n        ], this.get('projectId') > 0 ? [\r\n            {\r\n                parameter: 'projectId',\r\n                value: this.get('projectId')\r\n            },\r\n            {\r\n                parameter: 'copyComments',\r\n                value: this.get('copyComments')\r\n            },\r\n            {\r\n                parameter: 'copySubmitter',\r\n                value: this.get('copySubmitter')\r\n            },\r\n            {\r\n                parameter: 'copyApprovers',\r\n                value: this.get('copyApprovers')\r\n            },\r\n            {\r\n                parameter: 'copyGroups',\r\n                value: this.get('copyGroups')\r\n            },\r\n            {\r\n                parameter: 'copyDistribution',\r\n                value: this.get('copyDistribution')\r\n            },\r\n            {\r\n                parameter: 'copyItemTypes',\r\n                value: this.get('copyItemTypes')\r\n            },\r\n            {\r\n                parameter: 'overwrite',\r\n                value: this.get('overwrite')\r\n            }\r\n        ] : null);\r\n    },\r\n    parse: function (model) {\r\n        if (!model)\r\n            return model;\r\n\r\n        if (model.project != null) {\r\n            this.project = model.project;\r\n        } else {\r\n            this.user = PJQ.app.session.user;\r\n        }\r\n\r\n        this.itemTypes = new PJQ.collections.submittals.ItemTypes(model.itemTypes);\r\n\r\n        this.groups = new PJQ.collections.groups.Groups(model.groups);\r\n\r\n        if (model.createdBy != null) {\r\n            this.createdBy = new PJQ.models.projectContacts.ProjectContact(model.createdBy);\r\n        } else {\r\n            this.createdBy = null;\r\n        }\r\n\r\n        if (model.ballInCourt != null) {\r\n            this.ballInCourt = new PJQ.models.projectContacts.ProjectContact(model.ballInCourt);\r\n        } else {\r\n            this.ballInCourt = null;\r\n        }\r\n\r\n        if (model.submitter != null) {\r\n            this.submitter = new PJQ.models.projectContacts.ProjectContact(model.submitter);\r\n        } else {\r\n            this.submitter = null;\r\n        }\r\n\r\n        this.approvers = new PJQ.collections.projectContacts.ProjectContacts(model.approvers);\r\n\r\n        this.distributionList = new PJQ.collections.projectContacts.ProjectContacts(model.distributionList);\r\n\r\n        this.comments = new PJQ.collections.submittals.Comments(model.comments);\r\n\r\n        this.attachments = new PJQ.collections.submittals.Attachments(model.attachments);\r\n\r\n        if (model.submittals)\r\n            this.submittals = new PJQ.collections.submittals.Submittals(model.submittals);\r\n\r\n        else\r\n            this.submittals = new PJQ.collections.submittals.Submittals();\r\n\r\n        return model;\r\n    }\r\n});\r\n\r\nPJQ.collections.submittals = {};\r\nPJQ.collections.submittals.Submittals = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.submittals.Submittals,\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'projects',\r\n                value: this.options.project.id\r\n            },\r\n            {\r\n                endpoint: 'submittals'\r\n            }\r\n        ])\r\n    }\r\n});\r\n\r\nPJQ.collections.submittals.WorkflowTemplates = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.submittals.WorkflowTemplate,\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'projects',\r\n                value: this.options.projectId\r\n            },\r\n            {\r\n                endpoint: 'submittals'\r\n            },\r\n            {\r\n                endpoint: 'workflows'\r\n            }\r\n        ]);\r\n    }\r\n});\r\n\r\nPJQ.collections.submittals.WorkflowSteps = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.submittals.WorkflowStep\r\n});\r\n\r\nPJQ.collections.submittals.WorkflowApprovers = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.submittals.WorkflowApprover\r\n});\r\n\r\nPJQ.collections.submittals.Attachments = PJQ.collections.files.Files.extend({\r\n    model: PJQ.models.submittals.Attachment,\r\n});\r\n\r\nPJQ.collections.submittals.Comments = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.submittals.Comment\r\n});\r\n\r\nPJQ.collections.submittals.EditHistory = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.submittals.EditHistoryItem,\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'submittals',\r\n                value: this.options.submittal.id\r\n            },\r\n            {\r\n                endpoint: 'edithistory'\r\n            }\r\n        ]);\r\n    }\r\n});\r\n\r\nPJQ.collections.submittals.ItemTypes = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.submittals.ItemType,\r\n    endpoint: function () {\r\n        if (this.options.project != null) {\r\n            return PJQ.helpers.urlHelpers.generateEndpoint([\r\n                {\r\n                    endpoint: 'projects',\r\n                    value: this.options.project.id\r\n                },\r\n                {\r\n                    endpoint: 'submittals'\r\n                },\r\n                {\r\n                    endpoint: 'itemTypes'\r\n                }\r\n            ]);\r\n        } else {\r\n            return PJQ.helpers.urlHelpers.generateEndpoint([\r\n                {\r\n                    endpoint: 'submittals'\r\n                },\r\n                {\r\n                    endpoint: 'itemTypes'\r\n                }\r\n            ]);\r\n        }\r\n\r\n    }\r\n});\r\n\r\nPJQ.collections.submittals.Statuses = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.submittals.Status,\r\n    endpoint: function () {\r\n        if (this.options.projectId > 0) {\r\n            return PJQ.helpers.urlHelpers.generateEndpoint([\r\n                {\r\n                    endpoint: 'projects',\r\n                    value: this.options.projectId\r\n                },\r\n                {\r\n                    endpoint: 'submittals'\r\n                },\r\n                {\r\n                    endpoint: 'statuses'\r\n                }\r\n            ]);\r\n        } else {\r\n            return PJQ.helpers.urlHelpers.generateEndpoint([\r\n                {\r\n                    endpoint: 'submittals'\r\n                },\r\n                {\r\n                    endpoint: 'statuses'\r\n                }\r\n            ]);\r\n        }\r\n    },\r\n    copy: function (callback) {\r\n        new PJQ.ajax.Request({\r\n            endpoint: PJQ.helpers.urlHelpers.generateEndpoint([\r\n                {\r\n                    endpoint: 'submittals'\r\n                },\r\n                {\r\n                    endpoint: 'statuses'\r\n                },\r\n                {\r\n                    endpoint: 'copy'\r\n                }\r\n            ])\r\n        }).post().done(_.bind(function (response) {\r\n            callback(response);\r\n        }, this));\r\n    },\r\n});\r\n\r\nPJQ.collections.submittals.Notifications = PJQ.collections.notifications.Notifications.extend({\r\n    model: PJQ.models.submittals.Notification,\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'submittals',\r\n                value: this.options.submittal.id\r\n            },\r\n            {\r\n                endpoint: 'notifications'\r\n            }\r\n        ])\r\n    }\r\n});\r\n\r\nPJQ.collections.submittals.SubmittalCustomFields = PJQ.collections.customFields.CustomFields.extend({\r\n    model: PJQ.models.submittals.SubmittalCustomField,\r\n    options: {\r\n        masterUserId: null\r\n    },\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'projects',\r\n                value: this.options.project ? this.options.project.id : null\r\n            },\r\n            {\r\n                endpoint: 'submittals'\r\n            },\r\n            {\r\n                endpoint: 'customFields'\r\n            }\r\n        ], [\r\n            {\r\n                parameter: 'masterUserId',\r\n                value: this.options.masterUserId > 0 ? this.options.masterUserId : PJQ.app.session.get('masterUserId')\r\n            }\r\n        ]);\r\n    }\r\n});\r\n\r\nPJQ.collections.submittals.SubmittalCustomField = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.submittals.SubmittalCustomField,\r\n    options: {\r\n        masterUserId: null\r\n    },\r\n    endpoint: function () {\r\n        if (this.options.projectId > 0) {\r\n            return PJQ.helpers.urlHelpers.generateEndpoint([\r\n                {\r\n                    endpoint: 'projects',\r\n                    value: this.options.projectId\r\n                },\r\n                {\r\n                    endpoint: 'submittals'\r\n                },\r\n                {\r\n                    endpoint: 'customFields'\r\n                }\r\n            ]);\r\n        }\r\n\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n                {\r\n                    endpoint: 'submittals'\r\n                },\r\n                {\r\n                    endpoint: 'customFields'\r\n                }\r\n            ],\r\n            [\r\n                {\r\n                    parameter: 'masterUserId',\r\n                    value: this.options.masterUserId > 0 ? this.options.masterUserId : PJQ.app.session.get('masterUserId')\r\n                }\r\n            ]);\r\n    }\r\n});\r\n\r\nPJQ.collections.submittals.Templates = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.submittals.Template,\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'submittals'\r\n            },\r\n            {\r\n                endpoint: 'templates'\r\n            }\r\n        ]);\r\n    }\r\n});","PJQ.views.submittals.SubmittalsView = PJQ.views.BaseView.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'submittals-management'),\r\n        initSubmittalId: null\r\n    },\r\n    events: {\r\n        'click .btn-delete-submittal': 'deleteClicked',\r\n        'click .btn-edit-submittal': 'editClicked',\r\n        'click .btn-add-submittal': 'addClicked',\r\n        'click .export-detailed': 'exportSubmittals',\r\n        'click .export-list': 'exportList',\r\n        'click .btn-submittal-settings': 'editSettings',\r\n        'click .btn-save-a-template': 'saveTemplate',\r\n        'click .btn-import-template': 'importTemplate'\r\n    },\r\n    beforeFirstRender: async function () {\r\n        this.isFetched = false;\r\n        this.options.project = this.options.project ? this.options.project : PJQ.app.session.project;\r\n\r\n        this.options.userSettings = await PJQ.app.session.fetchSubmittalUserSettings();\r\n        if (this.options.project) {\r\n            this.options.settings = await this.options.project.fetchSubmittalSettings();\r\n            this.options.itemTypes = await this.options.project.fetchSubmittalItemTypes();\r\n            this.options.customFields = await this.options.project.fetchSubmittalCustomFields();\r\n            this.options.statuses = await this.options.project.fetchSubmittalStatuses();\r\n        } else {\r\n            this.options.settings = await PJQ.app.session.fetchSubmittalSettings();\r\n            this.options.itemTypes = await PJQ.app.session.fetchSubmittalItemTypes();\r\n            this.options.customFields = await PJQ.app.session.fetchSubmittalCustomFields();\r\n            this.options.statuses = await PJQ.app.session.fetchSubmittalStatuses();\r\n        }\r\n\r\n        if (this.collection == null && this.options.project != null) {\r\n            this.collection = new PJQ.collections.submittals.Submittals(null, {\r\n                project: this.options.project\r\n            });\r\n            await this.collection.fetch();\r\n        }\r\n\r\n        this.isFetched = true;\r\n        this.render();\r\n    },\r\n    beforeRender: function () {\r\n        this.options.canAdd = this.options.project ? this.options.project.hasPermission('submittals.canAdd') : PJQ.app.session.hasPermission('settings.canManageSubmittals');\r\n        this.options.isAdmin = this.options.project ? this.options.project.hasPermission('submittals.isAdmin') : PJQ.app.session.hasPermission('settings.canManageSubmittals');\r\n    },\r\n    renderData: function () {\r\n        return {\r\n            project: this.options.project,\r\n            statuses: this.options.statuses\r\n        };\r\n    },\r\n    afterRender: function () {\r\n        if (!this.isFetched)\r\n            return;\r\n\r\n        this.renderDataTable();\r\n\r\n        if (this.options.initSubmittalId > 0) {\r\n            let initSubmittal = this.collection.get(this.options.initSubmittalId);\r\n            if (initSubmittal != null) {\r\n                this.options.initSubmittalId = null;\r\n                this.editSubmittal(initSubmittal);\r\n            }\r\n        }\r\n    },\r\n    renderDataTable: function () {\r\n        let self = this;\r\n        this.dataTable = new PJQ.views.dataTables.DataTable({\r\n            el: this.$(\".submittals-table\"),\r\n            data: this.collection.models,\r\n            rowId: \"cid\",\r\n            order: [[2, 'desc']],\r\n            pageLength: this.options.userSettings.getSettings(PJQ.constants.submittals.view.SUBMITTALS).rowsPerPage,\r\n            orderCookie: PJQ.constants.cookies.SUBMITTAL_ORDER_COOKIE,\r\n            settings: this.options.userSettings.getSettings(PJQ.constants.submittals.view.SUBMITTALS),\r\n            language: {\r\n                zeroRecords: 'Click \"Add New Submittal\" to create a new Submittal'\r\n            },\r\n            subTemplates: {\r\n                header: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'Data-Table-Header-submittals')\r\n            },\r\n            headerData: () => {\r\n                return {\r\n                    canAdd: this.options.canAdd,\r\n                    project: this.options.project,\r\n                    statuses: this.options.statuses\r\n                };\r\n            },\r\n            afterHeaderRender: (view, $header) => {\r\n                let statuses = [],\r\n                    addedPartial = false;\r\n                _.each(_.sortBy(this.options.statuses.models, (status) => {\r\n                    return status.get('sortOrder')\r\n                }), (status) => {\r\n                    if (this.options.settings.get('enableWorkflow')) {\r\n                        if (status.get('type') !== PJQ.constants.submittals.statusTypes.SUBMITTED\r\n                            && status.get('type') !== PJQ.constants.submittals.statusTypes.NEW) {\r\n                            return;\r\n                        }\r\n\r\n                        statuses.push({\r\n                            id: status.get('id'),\r\n                            name: status.get('name'),\r\n                            style: 'color: ' + PJQ.constants.submittals.statusTypeColors[status.get('type')]\r\n                        });\r\n                        return;\r\n                    }\r\n\r\n                    if (status.get('type') === PJQ.constants.submittals.statusTypes.APPROVED && !addedPartial) {\r\n                        statuses.push({\r\n                            id: '-1',\r\n                            name: 'Partially Approved',\r\n                            style: 'color: ' + PJQ.constants.colors.PURPLE\r\n                        });\r\n                        addedPartial = true;\r\n                    }\r\n                    statuses.push({\r\n                        id: status.get('id'),\r\n                        name: status.get('name'),\r\n                        style: 'color: ' + PJQ.constants.submittals.statusTypeColors[status.get('type')]\r\n                    });\r\n                });\r\n\r\n                let stChoices;\r\n                if (this.options.settings.get('enableWorkflow')) {\r\n                    statuses.push({\r\n                        id: '-1',\r\n                        name: 'Closed',\r\n                        style: 'color: ' + PJQ.constants.colors.RED\r\n                    });\r\n                    stChoices = statuses;\r\n                } else {\r\n                    stChoices = [\r\n                        {\r\n                            name: 'Status',\r\n                            choices: statuses\r\n                        },\r\n                        {\r\n                            name: '',\r\n                            choices: [\r\n                                {\r\n                                    id: '0',\r\n                                    name: 'As Noted'\r\n                                }\r\n                            ]\r\n                        }\r\n                    ];\r\n                }\r\n\r\n                new PJQ.inputs.Selectpicker({\r\n                    el: $header.find('.submittal-filter'),\r\n                    onChange: function (value) {\r\n                        view.setFilter('statusId', value);\r\n                    },\r\n                    choices: stChoices,\r\n                    isIntChoices: true,\r\n                    isMultiple: true,\r\n                    noneSelectedText: 'No Filters'\r\n                });\r\n            },\r\n            getFilterData: function (view, data) {\r\n                let statusFilter = view.getFilter('statusId');\r\n                if (_.size(statusFilter) === 0) {\r\n                    return data;\r\n                }\r\n\r\n                let showPartial = _.contains(statusFilter, -1),\r\n                    showAsNoted = _.contains(statusFilter, 0);\r\n\r\n                // we only want the status filter to have actual statuses in it now\r\n                statusFilter = _.filter(statusFilter, (statusId) => {\r\n                    return statusId > 0;\r\n                });\r\n                return _.filter(data, function (row) {\r\n                    let statusMatch = (statusFilter.length > 0 && _.contains(statusFilter, row.get('statusId')) && !row.get('isClosed'))\r\n                        || (showPartial && row.isPartiallyApproved())\r\n                        || (showPartial && row.get('isClosed'));\r\n                    return statusMatch && (!showAsNoted || row.get('asNotedCommentId') > 0);\r\n                });\r\n            },\r\n            onRowDoubleClick: _.bind(function (row) {\r\n                this.editSubmittal(row.data());\r\n            }, this),\r\n            contextMenuOptions: {\r\n                actions: [\r\n                    {\r\n                        name: 'Edit',\r\n                        onClick: _.bind(function (row) {\r\n                            this.editSubmittal(row.data());\r\n                        }, this)\r\n                    },\r\n                    {\r\n                        name: 'Delete',\r\n                        isDanger: true,\r\n                        onClick: _.bind(function (row) {\r\n                            this.deleteSubmittal(row);\r\n                        }, this)\r\n\r\n                    }\r\n                ]\r\n            },\r\n            columns: this.getColumns(false),\r\n            colReorder: {\r\n                fixedColumnsLeft: 0,\r\n                fixedColumnsRight: 1,\r\n                realtime: false\r\n            },\r\n            columnOrderChanged: _.bind(function () {\r\n                if (this.options.userSettings != null) {\r\n                    this.options.userSettings.save();\r\n                }\r\n            }, this)\r\n        });\r\n\r\n    },\r\n    getColumns: function (includeAllColumns = false) {\r\n        let columns = [], includeColumns = [],\r\n            viewSettings = this.options.userSettings.getSettings(PJQ.constants.submittals.view.SUBMITTALS);\r\n\r\n        if (includeAllColumns) {\r\n            includeColumns = [\"submittalNumber\", \"title\", \"itemTypes\", \"dueDate\", \"groupList\", \"submitter\", \"ballInCourt\", \"approverList\", \"distributionList\", \"status\"];\r\n\r\n            if (_.size(this.options.customFields) > 0) {\r\n                _.each(this.options.customFields.models, function (customField) {\r\n                    includeColumns.push('fieldValue' + customField.get('fieldNumber'));\r\n                });\r\n            }\r\n        } else\r\n            includeColumns = viewSettings.columns;\r\n\r\n        _.each(includeColumns, _.bind(function (column) {\r\n            if ((PJQ.app.session.project ? PJQ.app.session.project.preferences.getPref(PJQ.constants.preferenceTypes.HIDE_SUBMITTAL_ITEM_TYPE) : PJQ.app.session.preferences.getPref(PJQ.constants.preferenceTypes.HIDE_SUBMITTAL_ITEM_TYPE)) && column === 'itemTypes') {\r\n                return;\r\n            }\r\n            switch (column) {\r\n                case 'submittalNumber':\r\n                    columns.push({\r\n                        \"columnData\": \"submittalNumber\",\r\n                        \"title\": \"Number\",\r\n                        \"data\": {\r\n                            \"_\": \"attributes.submittalNumber\",\r\n                            \"sort\": _.bind(function (row) {\r\n                                let number = parseInt(row.attributes.submittalNumber);\r\n                                if (isNaN(number)) {\r\n                                    return row.attributes.submittalNumber;\r\n                                } else {\r\n                                    return number\r\n                                }\r\n                            }, this),\r\n                            \"display\": \"attributes.submittalNumber\"\r\n                        },\r\n                        'type': 'natural-ci',\r\n                        'visible': viewSettings.columns.indexOf(column) !== -1\r\n                    });\r\n                    break;\r\n                case 'title':\r\n                    columns.push({\r\n                        \"columnData\": \"title\",\r\n                        \"title\": \"Title\",\r\n                        \"data\": \"attributes.title\",\r\n                        'visible': viewSettings.columns.indexOf(column) !== -1\r\n                    });\r\n                    break;\r\n                case 'itemTypes':\r\n                    columns.push({\r\n                        \"columnData\": \"itemTypes\",\r\n                        \"title\": \"Item Types\",\r\n                        \"data\": \"itemTypes\",\r\n                        \"render\": function (data, type, row) {\r\n                            if (_.size(row.itemTypes.models) > 0) {\r\n                                let itemTypeNames = [];\r\n                                _.each(row.itemTypes.models, function (itemType) {\r\n                                    itemTypeNames.push(itemType.get('name'));\r\n                                });\r\n                                return itemTypeNames.join(\", \");\r\n                            }\r\n                            return '';\r\n                        },\r\n                        'visible': viewSettings.columns.indexOf(column) !== -1\r\n                    });\r\n                    break;\r\n                case 'dueDate':\r\n                    columns.push({\r\n                        \"columnData\": \"dueDate\",\r\n                        \"title\": \"Due Date\",\r\n                        \"data\": \"attributes.dueDate\",\r\n                        \"render\": (data, type, row) => {\r\n                            if (data != null) {\r\n                                let dueDate = new Date(data),\r\n                                    dateString = PJQ.helpers.dateHelpers.getDateString(dueDate, PJQ.helpers.dateHelpers.dateFormats.DATE);\r\n                                if (row.isNewStatus(this.options.statuses) && PJQ.helpers.dateHelpers.getDateDaysDiff(dueDate, new Date()) < 0) {\r\n                                    return '<span class=\"text-danger font-weight-bold\">' + dateString + '</span>';\r\n                                }\r\n                                return dateString;\r\n                            }\r\n                            return 'Not Set';\r\n                        },\r\n                        'visible': viewSettings.columns.indexOf(column) !== -1\r\n                    });\r\n                    break;\r\n                case 'groupList':\r\n                    columns.push({\r\n                        \"columnData\": \"groupList\",\r\n                        \"title\": \"Groups\",\r\n                        \"data\": \"groups\",\r\n                        \"render\": function (data, type, row) {\r\n                            if (_.size(row.groups.models) > 0) {\r\n                                let groupNames = [];\r\n                                _.each(row.groups.models, function (group) {\r\n                                    groupNames.push(group.get('groupName'));\r\n                                });\r\n                                return groupNames.join(\", \");\r\n                            }\r\n                            return '';\r\n                        },\r\n                        'visible': viewSettings.columns.indexOf(column) !== -1\r\n                    });\r\n                    break;\r\n                case 'submitter':\r\n                    columns.push({\r\n                        \"columnData\": \"submitter\",\r\n                        \"title\": \"Submitter\",\r\n                        \"data\": \"submitter\",\r\n                        render: function (data, type, row) {\r\n                            let result = '';\r\n                            if (row.submitter != null) {\r\n                                return PJQ.helpers.contacts.getContactAnchor({contact: row.submitter});\r\n                            } else {\r\n                                result = 'Nobody';\r\n                            }\r\n                            return result;\r\n                        },\r\n                        'visible': viewSettings.columns.indexOf(column) !== -1\r\n                    });\r\n                    break;\r\n                case 'ballInCourt':\r\n                    columns.push({\r\n                        \"columnData\": \"ballInCourt\",\r\n                        \"title\": \"Ball In Court\",\r\n                        \"data\": \"ballInCourt\",\r\n                        render: (data, type, row) => {\r\n                            let result = [];\r\n\r\n                            if (row.ballInCourt != null && !row.isVoidStatus(this.options.statuses)) {\r\n                                result.push(PJQ.helpers.contacts.getContactAnchor({contact: row.ballInCourt}));\r\n                            } else if (!this.options.settings.get('enableWorkflow') && row.isSubmittedStatus(this.options.statuses) || row.isPartiallyApproved()) {\r\n                                result.push(this.options.settings.getApproveStatusName('ers'));\r\n                            } else if (!row.get('isClosed') && this.options.settings.get('enableWorkflow') && row.isSubmittedStatus(this.options.statuses)) {\r\n                                if(_.size(row.get('ballInCourtApproverList')) > 0) {\r\n                                    _.each(row.get('ballInCourtApproverList'), function (contact) {\r\n                                        result.push(PJQ.helpers.contacts.getContactAnchor({contact: contact}));\r\n                                    });\r\n                                } else {\r\n                                    result.push(this.options.settings.getApproveStatusName('ers'));\r\n                                }\r\n                            } else {\r\n                                result.push('Nobody');\r\n                            }\r\n                            return result.join(', ');\r\n                        },\r\n                        'visible': viewSettings.columns.indexOf(column) !== -1\r\n                    });\r\n                    break;\r\n                case 'approverList':\r\n                    columns.push({\r\n                        columnData: 'approverList',\r\n                        title: \"Approver List\",\r\n                        render: function (data, type, row) {\r\n                            let result = [];\r\n                            if (_.size(row.get('approvers')) > 0) {\r\n                                _.each(row.get('approvers'), function (contact) {\r\n                                    result.push(PJQ.helpers.contacts.getContactAnchor({contact: contact}));\r\n                                });\r\n                            } else {\r\n                                result.push('Nobody');\r\n                            }\r\n                            return result.join(', ');\r\n                        },\r\n                        visible: viewSettings.columns.indexOf(column) !== -1\r\n                    });\r\n                    break;\r\n                case 'distributionList':\r\n                    columns.push({\r\n                        columnData: 'distributionList',\r\n                        title: \"Distribution List\",\r\n                        render: function (data, type, row) {\r\n                            let result = [];\r\n                            if (_.size(row.distributionList.models) > 0) {\r\n                                _.each(row.distributionList.models, function (contact) {\r\n                                    result.push(PJQ.helpers.contacts.getContactAnchor({contact: contact}));\r\n                                });\r\n                            } else {\r\n                                result.push('Nobody');\r\n                            }\r\n                            return result.join(', ');\r\n                        },\r\n                        visible: viewSettings.columns.indexOf(column) !== -1\r\n                    });\r\n                    break;\r\n                case 'status':\r\n                    columns.push({\r\n                        \"columnData\": \"status\",\r\n                        \"title\": \"Status\",\r\n                        \"data\": \"attributes.statusId\",\r\n                        \"render\": _.bind(function (data, type, row) {\r\n                            return '<span style=\"color:' + row.getStatusColor(this.options.statuses) + '\">' + row.getStatusName(this.options.settings, this.options.statuses) + '</span>';\r\n                        }, this),\r\n                        'visible': viewSettings.columns.indexOf(column) !== -1\r\n                    });\r\n                    break;\r\n                default:\r\n                    if (column.startsWith('fieldValue')) {\r\n                        _.each(this.options.customFields.models, function (customField) {\r\n                            if (column === 'fieldValue' + customField.get('fieldNumber')) {\r\n                                columns.push({\r\n                                    \"columnData\": 'fieldValue' + customField.get('fieldNumber'),\r\n                                    \"title\": customField.get('fieldName'),\r\n                                    \"className\": [PJQ.constants.commitments.customFieldType.INTEGER, PJQ.constants.commitments.customFieldType.MONEY, PJQ.constants.commitments.customFieldType.PERCENT].indexOf(customField.get('fieldTypeId')) !== -1 ? \"text-align-right\" : \"\",\r\n                                    'visible': viewSettings.columns.indexOf(column) !== -1,\r\n                                    \"render\": function (data, type, row) {\r\n                                        let fieldValue = row.getCustomFieldValue(customField.get('id'));\r\n                                        fieldValue = (fieldValue !== null) ? fieldValue : '';\r\n                                        switch (customField.get('fieldType')) {\r\n                                            case 'BOOL':\r\n                                                if (fieldValue != null)\r\n                                                    fieldValue = fieldValue ? 'Yes' : 'No';\r\n                                                break;\r\n                                            case 'CHOICE':\r\n                                                let choices = [];\r\n                                                // convert single choice value into array so that the logic below can work for both types.\r\n                                                if (typeof fieldValue === 'number')\r\n                                                    fieldValue = [fieldValue];\r\n\r\n                                                _.each(customField.choices.models, _.bind(function (choice) {\r\n                                                    if (_.find(fieldValue, function (value) {\r\n                                                        return value === choice.get('id');\r\n                                                    }))\r\n                                                        choices.push(choice.get('choiceName'));\r\n                                                }, this));\r\n\r\n                                                fieldValue = choices.join((', '));\r\n                                                break;\r\n                                            case 'DATE':\r\n                                                if (fieldValue) {\r\n                                                    if (type !== 'sort' && type !== 'type')\r\n                                                        fieldValue = PJQ.helpers.dateHelpers.getDateString(new Date(fieldValue), PJQ.helpers.dateHelpers.dateFormats.DATE, true);\r\n                                                }\r\n                                                if (fieldValue === undefined)\r\n                                                    fieldValue = '';\r\n\r\n                                                break;\r\n                                            case 'DATETIME':\r\n                                                if (fieldValue) {\r\n                                                    if (type !== 'sort' && type !== 'type')\r\n                                                        fieldValue = PJQ.helpers.dateHelpers.getDateString(new Date(fieldValue), PJQ.helpers.dateHelpers.dateFormats.DATE_TIME, false);\r\n                                                }\r\n                                                if (fieldValue === undefined)\r\n                                                    fieldValue = '';\r\n\r\n                                                break;\r\n                                            case 'INT':\r\n                                                if (type !== 'sort' && type !== 'type' && fieldValue) {\r\n                                                    fieldValue = parseInt(fieldValue).toLocaleString();\r\n                                                }\r\n                                                break;\r\n                                            case 'MONEY':\r\n                                                if (type === 'sort' || type === 'type') {\r\n                                                    if (fieldValue && fieldValue !== '$')\r\n                                                        fieldValue = parseFloat(PJQ.helpers.formatHelpers.numbersOnly(fieldValue, true));\r\n                                                    else\r\n                                                        fieldValue = 0;\r\n                                                } else {\r\n                                                    fieldValue = PJQ.helpers.formatHelpers.formatCurrency(parseInt(PJQ.helpers.formatHelpers.numbersOnly(fieldValue)));\r\n                                                }\r\n                                                break;\r\n                                            case 'PERCENT':\r\n                                                if (type === 'sort' || type === 'type') {\r\n                                                    if (!fieldValue)\r\n                                                        fieldValue = 0;\r\n                                                } else {\r\n                                                    fieldValue = fieldValue ? PJQ.helpers.formatHelpers.formatCurrency(parseInt(PJQ.helpers.formatHelpers.numbersOnly(fieldValue)), 2, false) + '%' : '';\r\n                                                }\r\n                                                break;\r\n                                        }\r\n\r\n                                        return fieldValue;\r\n                                    }\r\n                                });\r\n                            }\r\n                        });\r\n                    }\r\n                    break;\r\n            }\r\n        }, this));\r\n\r\n        if (!includeAllColumns) {\r\n            columns.push({\r\n                \"data\": \"\",\r\n                \"title\": \"\",\r\n                \"orderable\": false,\r\n                \"searchable\": false,\r\n                \"width\": '80px',\r\n                \"render\": _.bind(function () {\r\n                    let html = '<div class=\"show-on-row-hover\"><button type=\"button\" class=\"btn btn-info btn-edit-submittal\"><i class=\"fal fa-pencil\"></i></button>';\r\n                    if (this.options.isAdmin) {\r\n                        html += '<button type=\"button\" class=\"btn btn-danger btn-delete-submittal ml-1\"><i class=\"fal fa-trash\"></i></button>';\r\n                    }\r\n                    html += '</div>';\r\n                    return html;\r\n                }, this)\r\n            });\r\n        }\r\n\r\n        return columns;\r\n    },\r\n    addClicked: function () {\r\n        this.editSubmittal(null);\r\n    },\r\n    editClicked: function (e) {\r\n        let target = $(e.currentTarget),\r\n            row = this.dataTable.getRow(target.closest('tr')),\r\n            submittal = row.data();\r\n        this.editSubmittal(submittal);\r\n    },\r\n    editSubmittal: function (submittal) {\r\n        new PJQ.views.submittals.EditSubmittalModal({\r\n            model: submittal,\r\n            templateId: this.model ? this.model.get('templateId') : null,\r\n            project: this.options.project,\r\n            onSave: (model, isNew) => {\r\n                if (isNew) {\r\n                    this.collection.add(model);\r\n                    this.dataTable.addRow(model);\r\n                }\r\n                this.dataTable.refresh();\r\n            },\r\n            onClose: () => {\r\n                this.dataTable.refresh();\r\n            },\r\n            onDelete: (submittal) => {\r\n                let row = this.dataTable.getRow(submittal.cid);\r\n                if (row != null) {\r\n                    this.dataTable.removeRow(row);\r\n                }\r\n                submittal.destroy();\r\n            }\r\n        }, this)\r\n    },\r\n    deleteClicked: function (e) {\r\n        let target = $(e.currentTarget),\r\n            row = this.dataTable.getRow(target.closest('tr'));\r\n        this.deleteSubmittal(row);\r\n    },\r\n    deleteSubmittal: function (row) {\r\n        let submittal = row.data();\r\n        new PJQ.views.modals.DeleteCancel({\r\n            header: \"Confirm Delete\",\r\n            body: \"Are you sure you want to delete this Submittal?\",\r\n            onDelete: _.bind(function () {\r\n                submittal.destroy();\r\n                this.dataTable.removeRow(row);\r\n            }, this)\r\n        });\r\n    },\r\n    editSettings: function () {\r\n        new PJQ.views.submittals.SettingsModal({\r\n            submittalsView: this,\r\n            model: this.options.settings,\r\n            userSettings: this.options.userSettings,\r\n            project: this.options.project ? this.options.project : null,\r\n            onSave: _.bind(function () {\r\n                this.renderDataTable();\r\n            }, this)\r\n        });\r\n    },\r\n    saveTemplate: function () {\r\n        new PJQ.views.submittals.SubmittalTemplateCreatorModal({\r\n            collection: this.collection,\r\n            project: this.options.project\r\n        });\r\n    },\r\n    importTemplate: function () {\r\n        new PJQ.views.submittals.ImportTemplateModal({\r\n            project: this.options.project,\r\n            onImport: _.bind(function (submittals) {\r\n                this.collection = submittals;\r\n                this.render();\r\n            }, this)\r\n        });\r\n    },\r\n    exportSubmittals: function () {\r\n        new PJQ.ajax.Request({\r\n            endpoint: this.options.project.endpoint() + '/submittals/export',\r\n            data: {\r\n                isApi2: true\r\n            }\r\n        }).post().done(_.bind(function (response) {\r\n            PJQ.files.downloadFile(response.url, {\r\n                isEndpoint: false\r\n            });\r\n        }, this)).fail(_.bind(function (xhr, err, result) {\r\n        }, this));\r\n    },\r\n    exportList: function () {\r\n        if (this.options.project == null) {\r\n            return;\r\n        }\r\n\r\n        let orderCookie = PJQ.helpers.cookieHelpers.getCookie(PJQ.constants.cookies.SUBMITTAL_ORDER_COOKIE),\r\n            order = orderCookie != null ? JSON.parse(orderCookie) : null,\r\n            report = new PJQ.models.reports.NewReport({\r\n                type: PJQ.constants.reports.reportTypes.SUBMITTAL.type,\r\n                projectId: this.options.project ? this.options.project.id : null,\r\n                options: {\r\n                    columns: this.options.userSettings.getSettings(PJQ.constants.submittals.view.SUBMITTALS).columns,\r\n                    columnOrder: order\r\n                }\r\n            });\r\n        report.export({format: 'excel'}).then(() => {\r\n\r\n        });\r\n    },\r\n});\r\n\r\nPJQ.views.submittals.EditHistoryModal = PJQ.views.BaseModal.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'edit-history-modal'),\r\n        subTemplates: {\r\n            history: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'edit-history'),\r\n        },\r\n        width: '50%',\r\n        maxWidth: 700,\r\n        onSave: _.noop\r\n    },\r\n    events: {},\r\n    afterRender: function () {\r\n        this.renderHistory()\r\n    },\r\n    renderHistory: function () {\r\n        this.renderSubTemplate(false, this.options.subTemplates.history, this.$('.history-outer'), {\r\n            history: this.options.history.models.reverse()\r\n        });\r\n    }\r\n});\r\n\r\nPJQ.views.submittals.FileEditorModal = PJQ.views.BaseModal.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'modal-file-editor'),\r\n        isNewVersion: false,\r\n        isNoteEdit: false\r\n    },\r\n    events: {\r\n        'click .btn-save': 'save'\r\n    },\r\n    beforeRender: function () {\r\n        this.renderData = {\r\n            model: this.model,\r\n            isNoteEdit: this.options.isNoteEdit,\r\n            isNewVersion: this.options.isNewVersion\r\n        };\r\n    },\r\n    afterRender: function () {\r\n        new PJQ.Binder(this.$el, this.model, {\r\n            watchElements: [\r\n                'textarea'\r\n            ]\r\n        });\r\n        this.fileUploader = new PJQ.views.files.FileUploaderGrid({\r\n            el: this.$('.submittal-file-uploader'),\r\n            collection: this.collection,\r\n            style: 'list',\r\n            canUpload: (this.collection.models.length === 0 || !this.options.isNewVersion),\r\n            canDelete: true,\r\n            canDownload: true,\r\n            isRemoveOnComplete: this.options.isNewVersion,\r\n            previewImageDimension: 150,\r\n            onSuccess: _.bind(function () {\r\n                if (this.options.isNewVersion) {\r\n                    this.render();\r\n                }\r\n            }, this),\r\n            onDelete: _.bind(function (attachment, callback) {\r\n                if (attachment.id > 0) {\r\n                    attachment.set('isDeleted', true);\r\n                } else {\r\n                    attachment.destroy();\r\n                }\r\n                this.model.isDirty = true;\r\n                callback();\r\n            }, this)\r\n        });\r\n    },\r\n    save: function () {\r\n        if (this.options.isNewVersion) {\r\n            this.collection.add(this.model);\r\n        }\r\n\r\n        this.options.onSave(this.collection);\r\n        this.removeModal();\r\n    }\r\n});\r\n\r\nPJQ.views.submittals.StatusChangeCommentModal = PJQ.views.BaseModal.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'modal-status-change-comment'),\r\n        title: null\r\n    },\r\n    events: {\r\n        'click .btn-save': 'save'\r\n    },\r\n    renderData: function () {\r\n        return {\r\n            model: this.model,\r\n            title: this.options.title\r\n        }\r\n    },\r\n    afterRender: function () {\r\n        new PJQ.Binder(this.$el, this.model, {\r\n            watchElements: [\r\n                'textarea'\r\n            ]\r\n        });\r\n\r\n        new PJQ.inputs.Datepicker({\r\n            el: this.$('.input-due-date'),\r\n            datepickerOptions: {\r\n                format: PJQ.helpers.dateHelpers.dateFormats.datePicker.DATE,\r\n                defaultDate: this.model.get('dueDate') ? new Date(this.model.get('dueDate')) : null\r\n            },\r\n            onChange: _.bind(function (newDate) {\r\n                this.model.set('dueDate', newDate);\r\n            }, this)\r\n        });\r\n    },\r\n    save: function () {\r\n        let val = this.$('.item-status-change-comment').val().trim();\r\n        if (_.size(val) === 0) {\r\n            this.options.onSave(this.model, null);\r\n            this.removeModal();\r\n        } else {\r\n            let comment = new PJQ.models.submittals.Comment({\r\n                submittalId: this.model.id,\r\n                comment: val,\r\n                createdOn: new Date(),\r\n                asNoted: true\r\n            });\r\n            this.model.comments.add(comment);\r\n            this.options.onSave(this.model, comment);\r\n            this.removeModal();\r\n        }\r\n    }\r\n});\r\n","PJQ.views.submittals.SubmittalTemplateCreatorModal = PJQ.views.BaseModal.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'modal-create-template'),\r\n        width: '30%'\r\n    },\r\n    events: {\r\n        'click .btn-save' : 'save'\r\n    },\r\n    beforeModalCreated: function () {\r\n        this.model = new PJQ.models.submittals.Template({\r\n            projectId: this.options.project.id\r\n        });\r\n\r\n        this.options.project.fetchSubmittalTemplates(_.bind(function (tmp) {\r\n            this.templates = tmp;\r\n            this.render();\r\n        }, this));\r\n    },\r\n    renderData: function () {\r\n        return {\r\n            templates: this.templates,\r\n            submittals: this.collection\r\n        };\r\n    },\r\n    afterRender: function () {\r\n        if (this.templates != null && this.templates.isFetched) {\r\n            new PJQ.inputs.Selectpicker({\r\n                el: this.$('.select-submittal'),\r\n                isMultiple: true,\r\n                noneSelectedText: 'Select Submittal #',\r\n                onChange: _.bind(function (value) {\r\n\r\n                }, this)\r\n            });\r\n\r\n            new PJQ.inputs.AutocompleteInput({\r\n                el: this.$('.input-template-name'),\r\n                source: _.map(this.templates.models, function (template) {\r\n                    return template.get('name')\r\n                })\r\n            });\r\n        }\r\n    },\r\n    save: function () {\r\n        let $name = this.$('.input-template-name'),\r\n            name = $name.val();\r\n        if (_.size(name.trim()) === 0) {\r\n            PJQ.helpers.inputHelpers.setInputError($name);\r\n            return;\r\n        }\r\n        else {\r\n            PJQ.helpers.inputHelpers.setInputError($name, true);\r\n        }\r\n\r\n        let existingTemplate = this.templates.findWhere({name: name}),\r\n            fnSave = _.bind(function () {\r\n                this.model.set({\r\n                    name: name,\r\n                    copyComments: this.$('.input-copy-comments').prop('checked'),\r\n                    copySubmitter: this.$('.input-copy-submitter').prop('checked'),\r\n                    copyApprovers: this.$('.input-copy-approvers').prop('checked'),\r\n                    copyGroups: this.$('.input-copy-trades').prop('checked'),\r\n                    copyDistribution: this.$('.input-copy-distribution').prop('checked'),\r\n                    copyItemTypes: this.$('.input-copy-item-types').prop('checked')\r\n                });\r\n                this.model.save(null, {\r\n                    success: _.bind(function () {\r\n                        this.removeModal();\r\n                        PJQ.notifications.notify.successNotify({\r\n                            message: 'Submittal Template Created'\r\n                        });\r\n                    }, this)\r\n                });\r\n            }, this);\r\n        if (existingTemplate != null) {\r\n            new PJQ.views.modals.YesNo({\r\n                header: \"Overwrite Template\",\r\n                body: \"A template already exists with this name.  Would you like to overwrite it?\",\r\n                onYes: _.bind(function () {\r\n                    this.model.set('templateId', existingTemplate.id);\r\n                    fnSave();\r\n                }, this)\r\n            });\r\n        }\r\n        else {\r\n            fnSave();\r\n        }\r\n    }\r\n});\r\n\r\nPJQ.views.submittals.ImportTemplateModal = PJQ.views.BaseModal.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'modal-import-template'),\r\n        maxWidth: 500,\r\n        onImport: null\r\n    },\r\n    events: {\r\n        'click .btn-import': 'save'\r\n    },\r\n    beforeModalCreated: function () {\r\n        this.options.project.fetchSubmittalTemplates(_.bind(function (tmp) {\r\n            this.templates = tmp;\r\n            this.render();\r\n        }, this));\r\n    },\r\n    renderData: function () {\r\n        return {\r\n            templates: this.templates\r\n        };\r\n    },\r\n    afterRender: function () {\r\n        if (this.templates != null && this.templates.isFetched) {\r\n            this.templatePicker = new PJQ.inputs.Selectpicker({\r\n                el: this.$('.select-template'),\r\n                onChange: _.bind(function (value) {\r\n                    this.selectedTemplate = this.templates.get(value);\r\n                }, this),\r\n                isIntChoices: true,\r\n                noneSelectedText: 'Select Template'\r\n            });\r\n\r\n        }\r\n    },\r\n    save: function () {\r\n        let isValid = true;\r\n        if (this.selectedTemplate == null) {\r\n            this.templatePicker.showError();\r\n            isValid = false;\r\n        }\r\n        else {\r\n            this.templatePicker.hideError();\r\n        }\r\n\r\n\r\n        if (!isValid) {\r\n            return;\r\n        }\r\n\r\n        new PJQ.ajax.Request({\r\n            endpoint: PJQ.helpers.urlHelpers.generateEndpoint([\r\n                {\r\n                    endpoint: 'projects',\r\n                    value: this.options.project.id\r\n                },\r\n                {\r\n                    endpoint: 'submittals'\r\n                },\r\n                {\r\n                    endpoint: 'import',\r\n                    value: this.selectedTemplate.id\r\n                }\r\n            ], [\r\n                {\r\n                    parameter: 'importComments',\r\n                    value: this.$('.input-import-comments').prop('checked')\r\n                },\r\n                {\r\n                    parameter: 'importSubmitter',\r\n                    value: this.$('.input-import-submitter').prop('checked')\r\n                },\r\n                {\r\n                    parameter: 'importApprovers',\r\n                    value: this.$('.input-import-approvers').prop('checked')\r\n                },\r\n                {\r\n                    parameter: 'importGroups',\r\n                    value: this.$('.input-import-trades').prop('checked')\r\n                },\r\n                {\r\n                    parameter: 'importDistribution',\r\n                    value: this.$('.input-import-distribution').prop('checked')\r\n                },\r\n                {\r\n                    parameter: 'importItemTypes',\r\n                    value: this.$('.input-import-item-types').prop('checked')\r\n                },\r\n            ])\r\n        }).put().done(_.bind(function (response) {\r\n            if (typeof this.options.onImport === 'function') {\r\n                let result = new PJQ.collections.submittals.Submittals(response);\r\n                result.isFetched = true;\r\n                this.options.onImport(result);\r\n            }\r\n            this.removeModal();\r\n            PJQ.notifications.notify.successNotify({\r\n                message: 'Submittal Template Imported'\r\n            });\r\n        }, this));\r\n    }\r\n});\r\n\r\nPJQ.views.submittals.EditTemplateModal = PJQ.views.BaseModal.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'Modal-Edit-Template'),\r\n        maxWidth: '90%',\r\n        fitHeight: true,\r\n        onClose: null\r\n    },\r\n    events: {\r\n        'click .btn-close': 'close',\r\n        'click .btn-delete': 'deleteTemplate'\r\n    },\r\n    beforeModalCreated: function () {\r\n        this.listenTo(this.model, 'fetch', this.render);\r\n        this.model.fetch();\r\n    },\r\n    renderData: function () {\r\n        return {\r\n            model: this.model\r\n        };\r\n    },\r\n    afterRender: function () {\r\n        if (this.model.isFetched) {\r\n\r\n            new PJQ.inputs.TextEditorInput({\r\n                el: this.$('.edit-template-name'),\r\n                label: 'Name',\r\n                value: this.model.get('name'),\r\n                onSave: _.bind(function (value) {\r\n                    this.model.patch({\r\n                        name: value\r\n                    });\r\n                }, this)\r\n            });\r\n\r\n            new PJQ.views.submittals.SubmittalsView({\r\n                el: this.$('.manage-template'),\r\n                model: this.model,\r\n                collection: this.model.submittals\r\n            });\r\n        }\r\n    },\r\n    close: function () {\r\n        if (typeof this.options.onClose === 'function') {\r\n            this.options.onClose(this.model);\r\n        }\r\n    },\r\n    deleteTemplate: function () {\r\n        new PJQ.views.modals.DeleteCancel({\r\n            header: \"Confirm Deletion\",\r\n            body: \"Are you sure you want to delete this template?\",\r\n            onDelete: _.bind(function () {\r\n                if (typeof this.options.onDelete === 'function') {\r\n                    this.options.onDelete(this.model);\r\n                }\r\n                this.removeModal();\r\n            }, this)\r\n        });\r\n    }\r\n});\r\n\r\n\r\nPJQ.views.submittals.TemplateManagement = PJQ.views.templates.TemplateManagement.extend({\r\n    beforeFirstRender: function () {\r\n        this.collection = new PJQ.collections.submittals.Templates();\r\n        this.listenTo(this.collection, 'fetch', this.render);\r\n        this.collection.fetch();\r\n    },\r\n    addTemplate: function () {\r\n        new PJQ.views.templates.NewTemplateModal({\r\n            model: new PJQ.models.submittals.Template(),\r\n            onSave: _.bind(function (template) {\r\n                this.collection.add(template);\r\n                this.editTemplate(template);\r\n            }, this)\r\n        });\r\n    },\r\n    editTemplate: function (template) {\r\n        new PJQ.views.submittals.EditTemplateModal({\r\n            model: template,\r\n            onClose: _.bind(function () {\r\n                this.dataTable.refresh();\r\n            }, this),\r\n            onDelete: _.bind(function (template) {\r\n                if (template.id > 0) {\r\n                    let row = this.dataTable.getRow(template.cid);\r\n                    this.collection.remove(template);\r\n                    template.destroy();\r\n                    this.dataTable.removeRow(row);\r\n                }\r\n            }, this)\r\n        });\r\n    }\r\n});\r\n","PJQ.views.submittals.WorkflowView = PJQ.views.BaseView.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'submittal-workflow'),\n        onChange: null,\n        canEdit: true,\n        canChangeBallInCourt: false,\n        canRespond: true,\n        onRespond: null,\n        onSetBallInCourt: null\n    },\n    events: {\n        'click .btn-edit-workflow': 'editWorkflow',\n        'change .cb-required': 'approverRequiredChanged',\n        'change .cb-reject-to-manager': 'returnOnRejectChanged',\n        'keyup .input-days-to-respond': 'daysToRespondChanged',\n        'click .btn-add-approver': 'addApprover',\n        'click .btn-delete-approver': 'deleteApprover',\n        'click .btn-add-step': 'addStep',\n        'click .btn-apply-template': 'applyTemplateClicked',\n        'click .btn-delete-step': 'deleteStepClicked',\n        'click .btn-respond': 'respondToSubmittal',\n        'click .btn-update-response': 'respondToSubmittal',\n        'click .btn-set-bic': 'setBallInCourt',\n        'click .dl-approver-attachment': 'downloadApproverAttachment'\n    },\n    beforeFirstRender: async function () {\n        this.isFetched = false;\n        this.options.project = this.options.project ? this.options.project : PJQ.app.session.project;\n\n        this.options.userSettings = await PJQ.app.session.fetchSubmittalUserSettings();\n        if (this.options.project != null) {\n            this.options.settings = await this.options.project.fetchSubmittalSettings();\n            this.options.statuses = await this.options.project.fetchSubmittalStatuses();\n        } else {\n            this.options.settings = await PJQ.app.session.fetchSubmittalSettings();\n            this.options.statuses = await PJQ.app.session.fetchSubmittalStatuses();\n        }\n\n        this.isFetched = true;\n        this.render();\n    },\n    beforeRender: async function () {\n        this.options.canAdd = this.options.project ? this.options.project.hasPermission('submittals.canAdd') : PJQ.app.session.hasPermission('settings.canManageSubmittals');\n        this.options.isAdmin = this.options.project ? this.options.project.hasPermission('submittals.isAdmin') : PJQ.app.session.hasPermission('settings.canManageSubmittals');\n\n        if (this.isFetched && this.options.isEdit && this.workflowTemplates == null) {\n            this.isFetched = false;\n            this.workflowTemplates = await this.options.project.fetchSubmittalWorkflowTemplates();\n            this.isFetched = true;\n            this.render();\n        }\n    },\n    renderData: function () {\n        return {\n            canEdit: this.options.canEdit,\n            isEdit: this.options.isEdit === true,\n            project: this.options.project,\n            submittal: this.options.submittal,\n            workflow: this.model,\n            workflowTemplates: this.workflowTemplates,\n            isFetched: this.isFetched\n        };\n    },\n    afterRender: function () {\n        if (!this.isFetched)\n            return;\n\n        this.renderStepsTable();\n    },\n    setEdit: function (edit) {\n        this.options.isEdit = edit;\n        this.render();\n    },\n    editWorkflow: function () {\n        this.setEdit(true);\n    },\n    approverRequiredChanged: function (e) {\n        let $target = $(e.currentTarget),\n            $badge = $target.closest('.badge-approver'),\n            cid = $badge.data('cid'),\n            stepCid = $badge.data('stepCid');\n\n        let step = this.model.steps.get(stepCid);\n        if (step == null) {\n            return;\n        }\n\n        let approver = step.approvers.get(cid);\n        if (approver == null) {\n            return;\n        }\n\n        approver.set('isRequired', $target.prop('checked'));\n        this.onChange(step);\n    },\n    returnOnRejectChanged: function (e) {\n        let $target = $(e.currentTarget),\n            $tr = $target.closest('tr'),\n            row = this.stepsDatatable.getRow($tr),\n            step = row.data();\n        if (step == null) {\n            return;\n        }\n\n        step.set('returnOnReject', $target.prop('checked'));\n        this.onChange(step);\n    },\n    daysToRespondChanged: function (e) {\n        let $target = $(e.currentTarget),\n            $tr = $target.closest('tr'),\n            row = this.stepsDatatable.getRow($tr),\n            step = row.data();\n        if (step == null) {\n            return;\n        }\n\n        step.set('daysToRespond', parseInt($target.val()));\n        this.onChange(step);\n    },\n    respondToSubmittal: function (e) {\n        let $tr = $(e.currentTarget).closest('tr'),\n            row = this.stepsDatatable.getRow($tr),\n            approver = row.data();\n        new PJQ.views.submittals.WorkflowResponseModal({\n            project: this.options.project,\n            submittal: this.options.submittal,\n            approver: approver,\n            onSave: () => {\n                if (typeof this.options.onRespond === 'function') {\n                    this.options.onRespond(approver);\n                }\n            }\n        });\n    },\n    setBallInCourt: function (e) {\n        let $btn = $(e.currentTarget),\n            stepCid = $btn.data('stepCid'),\n            step = this.model.steps.get(stepCid);\n        if (step == null) {\n            return;\n        }\n\n        new PJQ.views.modals.YesNo({\n            header: \"Set Ball In Court?\",\n            body: \"Are you sure you want to set this workflow step to the ball in court? This will reset all responses on the selected step.\",\n            onYes: () => {\n                this.options.submittal.setBallInCourt(step.id, (success) => {\n                    if (success) {\n                        this.renderStepsTable();\n\n                        if (typeof this.options.onSetBallInCourt === 'function') {\n                            this.options.onSetBallInCourt(step);\n                        }\n\n                        PJQ.notifications.notify.successNotify({\n                            message: 'Ball in court changed successfully'\n                        });\n                    }\n                });\n            }\n        });\n    },\n    downloadApproverAttachment: function (e) {\n        let cid = $(e.currentTarget).data('cid'),\n            attachment = this.options.submittal.attachments.get(cid);\n        if (attachment == null) {\n            return;\n        }\n\n        attachment.download();\n    },\n    addApprover: function (e) {\n        let $tr = $(e.currentTarget).closest('tr'),\n            row = this.stepsDatatable.getRow($tr),\n            step = row.data(),\n            approvers = _.map(_.filter(step.approvers.models, (approver) => {\n                return !approver.get('delete');\n            }), (approver) => {\n                return {\n                    id: approver.get('person').id\n                };\n            });\n        this.selector = new PJQ.views.contacts.SelectContactsModal({\n            contacts: this.options.contacts,\n            hideContacts: approvers,\n            context: PJQ.constants.contacts.contexts.PROJECTCONTACTS,\n            isSingleChoice: false,\n            // saveButtonText: this.options.saveButtonText,\n            onSave: (newContacts) => {\n                _.each(newContacts, (contact) => {\n                    step.approvers.add(new PJQ.models.submittals.WorkflowApprover({\n                        personId: contact.id,\n                        isRequired: true,\n                        person: contact.toJSON()\n                    }));\n                });\n                this.renderStepsTable();\n                this.onChange(step);\n            }\n        });\n    },\n    deleteApprover: function (e) {\n        let $badge = $(e.currentTarget).closest('.badge-approver'),\n            cid = $badge.data('cid'),\n            stepCid = $badge.data('stepCid');\n\n        let step = this.model.steps.get(stepCid);\n        if (step == null) {\n            return;\n        }\n\n        let approver = step.approvers.get(cid);\n        if (approver == null) {\n            return;\n        }\n\n        if (approver.id > 0) {\n            approver.set('delete', true);\n        } else {\n            step.approvers.remove(approver);\n        }\n\n        this.renderStepsTable();\n        this.onChange(step);\n    },\n    applyTemplateClicked: function (e) {\n        let $btn = $(e.currentTarget),\n            templateId = $btn.data('id'),\n            template = this.workflowTemplates.get(templateId);\n\n        if (_.find(this.model.steps.models, (step) => {\n            return !step.get('delete')\n        })) {\n            new PJQ.views.modals.YesNo({\n                header: \"Apply Workflow Template?\",\n                body: \"Are you sure you want to apply this workflow template? All current steps will be removed.\",\n                onYes: () => {\n                    this.applyTemplate(template);\n                }\n            });\n        } else {\n            this.applyTemplate(template);\n        }\n    },\n    applyTemplate: function (template) {\n        let fnApplyTemplate = () => {\n            let cWorkflow = template.workflow.clone();\n            _.each(this.model.steps.models, (step) => {\n                if (step.id > 0) {\n                    step.set('delete', true);\n                } else {\n                    step.destroy();\n                }\n            });\n            this.model.steps.add(cWorkflow.steps.models);\n            this.renderStepsTable();\n\n            this.onChange();\n        };\n        if (template.isFetched) {\n            fnApplyTemplate();\n        } else {\n            template.fetch({\n                success: () => {\n                    fnApplyTemplate();\n                },\n                error: () => {\n                    PJQ.notifications.notify.errorNotify({\n                        message: 'Failed to fetch template'\n                    });\n                }\n            })\n        }\n    },\n    addStep: function () {\n        let step = new PJQ.models.submittals.WorkflowStep({\n            number: _.filter(this.model.steps.models, (step) => {\n                return !step.get('delete')\n            }).length + 1,\n            approvers: []\n        });\n        this.model.steps.add(step);\n        this.renderStepsTable();\n        this.onChange(step);\n    },\n    deleteStepClicked: function (e) {\n        let $tr = $(e.currentTarget).closest('tr'),\n            row = this.stepsDatatable.getRow($tr),\n            step = row.data();\n        this.deleteStep(step);\n    },\n    deleteStep: function (step) {\n        if (step == null) {\n            return;\n        }\n\n        if (step.id > 0) {\n            step.set('delete', true);\n        } else {\n            this.model.steps.remove(step);\n        }\n\n        _.each(_.sortBy(_.filter(this.model.steps.models, (step) => {\n            return !step.get('delete')\n        }), (step) => {\n            return step.id;\n        }), (step, index) => {\n            step.set('number', index + 1);\n        });\n\n        this.renderStepsTable();\n        this.onChange(step);\n    },\n    onChange: function (step) {\n        this.model.isDirty = true;\n        if (typeof this.options.onChange === 'function') {\n            this.options.onChange(step);\n        }\n    },\n    renderStepsTable: function () {\n        let columns,\n            data,\n            approveLabel = this.options.settings.getApproveStatusName('ers');\n        if (this.options.isEdit) {\n            data = _.filter(this.model.steps.models, (step) => {\n                return !step.get('delete');\n            });\n            columns = [\n                {\n                    \"data\": \"attributes.number\",\n                    \"title\": \"\",\n                    \"width\": \"20px\",\n                    \"orderable\": false,\n                    \"searchable\": false\n                },\n                {\n                    \"title\": _.size(approveLabel) > 0 ? approveLabel : \"Approvers\",\n                    \"data\": \"approvers\",\n                    \"orderable\": false,\n                    \"render\": _.bind(function (data, type, row) {\n                        let result = '',\n                            approvers = row.approvers ? _.filter(row.approvers.models, (approver) => {\n                                return !approver.get('delete')\n                            }) : [];\n                        if (_.size(approvers) === 0) {\n                            result = 'Nobody';\n                        } else {\n                            let fnMakeCheckmark = (isRequired) => {\n                                return '<div class=\"pretty p-default p-smooth ml-1\"><input type=\"checkbox\" class=\"cb-required\" ' + (isRequired ? 'checked' : '') + ' /><div class=\"state p-primary\"><label class=\"fs-15 division-expand noselect\">&nbsp;</label></div></div>';\n                            };\n                            _.each(approvers, (approver) => {\n                                result += '<div data-step-cid=\"' + row.cid + '\" data-cid=\"' + approver.cid + '\" class=\"badge-approver badge badge-light text-dark p-1 m-1 fs-14\">' + fnMakeCheckmark(approver.get('isRequired')) + approver.get('person').contactName + '<button type=\"button\" class=\"btn btn-sm btn-transparent-dark btn-delete-approver text-dark ml-1 fs-12\"><span class=\"fal fa-times text-dark\"></span></button></div>'\n                            });\n                        }\n\n                        return '<div>' + result + '<button type=\"button\" class=\"btn btn-sm btn-transparent-dark btn-add-approver text-primary ml-1 mr-1 fs-15\"><span class=\"fal fa-plus\"></span></button></div>';\n                    }, this)\n                },\n                {\n                    \"data\": \"attributes.returnOnReject\",\n                    \"title\": 'Reject to Manager',\n                    \"width\": \"100px\",\n                    \"orderable\": false,\n                    \"render\": _.bind(function (data, type, row) {\n                        return '<div class=\"text-align-center\"><div class=\"pretty p-default p-smooth\"><input type=\"checkbox\" class=\"cb-reject-to-manager\" ' + (data ? 'checked' : '') + ' /><div class=\"state p-primary\"><label class=\"fs-15\">&nbsp;</label></div></div></div>';\n                    }, this)\n                },\n                {\n                    \"data\": \"attributes.daysToRespond\",\n                    \"title\": 'Days to Respond',\n                    \"width\": \"100px\",\n                    \"orderable\": false,\n                    \"render\": _.bind(function (data, type, row) {\n                        return '<input type=\"number\" class=\"form-control input-days-to-respond\" value=\"' + (data ?? 0) + '\">';\n                    }, this)\n                },\n                {\n                    \"data\": \"\",\n                    \"title\": \"\",\n                    \"orderable\": false,\n                    \"searchable\": false,\n                    \"width\": \"40px\",\n                    \"render\": _.bind(function (data, type, row) {\n                        let html = '<div class=\"text-align-right show-on-row-hover\">'\n                        html += '<button type=\"button\" class=\"btn btn-danger btn-delete-step ht-30p wd-35p ml-1 fs-14\"><span class=\"fal fa-trash\"></span></button>'\n                        return html + '</div>';\n                    }, this)\n                }];\n        } else {\n            data = [];\n            _.each(this.model.steps.models, (step) => {\n                let approvers = step.approvers.models;\n                _.each(approvers, (approver) => {\n                    approver.step = step;\n                });\n                data.push(...approvers);\n            });\n            columns = [\n                {\n                    \"data\": \"step.attributes.number\",\n                    \"columnData\": \"step.attributes.number\",\n                    \"title\": \"\",\n                    \"width\": \"20px\",\n                    \"orderable\": false,\n                    \"searchable\": false,\n                    \"visible\": false,\n                    group: (row) => {\n                        return row.step.cid;\n                    }\n                },\n                {\n                    \"data\": \"attributes.id\",\n                    \"title\": \"\",\n                    \"width\": \"20px\",\n                    \"orderable\": false,\n                    \"searchable\": false,\n                    render: (data, type, row) => {\n                        // show icon if this is the current user\n                        return '';\n                    }\n                },\n                {\n                    \"data\": \"attributes.person\",\n                    \"title\": \"Name\",\n                    \"width\": \"200px\",\n                    \"orderable\": false,\n                    \"searchable\": false,\n                    \"render\": (data, type, row) => {\n                        let personAnchor = PJQ.helpers.contacts.getContactAnchor({contact: row.get('person')}),\n                            req = '';\n                        if (row.get('isRequired'))\n                            req = '<i class=\"fal fa-asterisk mr-2\"></i>';\n                        return '<div class=\"d-flex align-items-center\"><div style=\"width:30px\">' + req + '</div><div><div class=\"font-weight-bold\">' + row.get('person').companyName + '</div><div>' + personAnchor + '</div></div></div>';\n                    }\n                },\n                {\n                    \"data\": \"attributes.ballInCourtOn\",\n                    \"title\": 'Sent',\n                    \"render\": (data, type, row) => {\n                        if (data == null) {\n                            return '';\n                        }\n\n                        return PJQ.helpers.dateHelpers.getDateString(new Date(data), PJQ.helpers.dateHelpers.dateFormats.DATE, true);\n                    }\n                },\n                {\n                    \"data\": \"attributes.dueOn\",\n                    \"title\": 'Due',\n                    \"width\": '90px',\n                    \"render\": (data, type, row) => {\n                        if (data == null) {\n                            return '';\n                        }\n\n                        return PJQ.helpers.dateHelpers.getDateString(new Date(data), PJQ.helpers.dateHelpers.dateFormats.DATE, true);\n                    }\n                },\n                {\n                    \"data\": \"attributes.responseOn\",\n                    \"title\": \"Responded\",\n                    \"width\": \"100px\",\n                    \"render\": (data, type, row) => {\n                        if (data == null) {\n                            return '';\n                        }\n\n                        return PJQ.helpers.dateHelpers.getDateString(new Date(data), PJQ.helpers.dateHelpers.dateFormats.DATE, true);\n                    }\n                },\n                {\n                    \"data\": \"attributes.statusId\",\n                    \"title\": \"Response\",\n                    \"width\": \"120px\",\n                    \"render\": (data, type, row) => {\n                        if (data > 0) {\n                            let status = this.options.statuses.get(data);\n                            if (status == null) {\n                                return '';\n                            }\n\n                            let sColor = PJQ.constants.submittals.statusTypeColors[status.get('color')];\n                            return '<span style=\"color:' + sColor + '\">' + status.get('name') + '</span>';\n                        } else if (!this.options.canRespond || !row.step.get('isActive') || !row.get('isMe')) {\n                            return '';\n                        }\n                        return '<div class=\"text-align-center\"><button type=\"button\" class=\"btn btn-light btn-respond\">Respond</button></div>';\n                    }\n                },\n                {\n                    \"data\": \"attributes.responseText\",\n                    \"title\": \"Comments\",\n                    \"orderable\": false,\n                    \"render\": (data, type, row) => {\n                        return row.get('responseText') ?? '';\n                    }\n                },\n                {\n                    \"data\": \"attachments\",\n                    \"title\": \"Attachments\",\n                    \"orderable\": false,\n                    \"render\": (data, type, row) => {\n                        if (this.options.submittal == null || this.options.submittal.attachments == null) {\n                            return '';\n                        }\n\n                        let approverAttachments = [];\n                        _.each(this.options.submittal.attachments.models, (attachment) => {\n                            if (attachment.get('approverId') === row.id) {\n                                approverAttachments.push({\n                                    cid: attachment.cid,\n                                    name: attachment.get('name'),\n                                    newest: _.size(attachment.versions?.models) === 0\n                                });\n                            }\n\n                            if (attachment.versions != null && attachment.versions.models.length > 0) {\n                                let newestVer = _.max(attachment.versions.models, (ver) => {\n                                    return ver.get('version');\n                                }).get('version');\n                                _.each(attachment.versions.models, (ver) => {\n                                    if (ver.get('approverId') !== row.id) {\n                                        return;\n                                    }\n\n                                    approverAttachments.push({\n                                        cid: ver.cid,\n                                        name: ver.get('name'),\n                                        newest: newestVer === ver.get('version')\n                                    });\n                                })\n                            }\n                        });\n                        if (approverAttachments.length === 0) {\n                            return '';\n                        }\n\n                        let result = '';\n                        _.each(approverAttachments, (attachment) => {\n                            result += '<a href=\"javascript:void(0)\" class=\"btn-dl-approver-attachment ' + (attachment.newest ? '' : 'text-dec-line-through') + '\" data-cid=\"' + attachment.cid + '\">' + attachment.name + '</a><br>';\n                        });\n                        return '<div class=\"fs-14\">' + result + '</div>';\n                    }\n                },\n                {\n                    \"data\": \"\",\n                    \"title\": \"\",\n                    \"orderable\": false,\n                    \"searchable\": false,\n                    \"width\": \"40px\",\n                    \"render\": (data, type, row) => {\n                        if (!this.options.canRespond || !row.step.get('isActive') || (!this.options.isAdmin && (!row.get('isMe') || row.get('statusId') == null))) {\n                            return '';\n                        }\n\n                        return `<div class=\"btn-group\">\n                                    <button type=\"button\"\n                                            class=\"btn fs-16 btn-transparent-dark text-dark dropdown-toggle\" data-toggle=\"dropdown\"\n                                            aria-haspopup=\"true\"\n                                            aria-expanded=\"false\">\n                                        <i class=\"fas fa-ellipsis-vertical\"></i>\n                                    </button>\n                                    <div class=\"dropdown-menu\">\n                                        <a class=\"dropdown-item btn-update-response\"\n                                           href=\"javascript:void(0)\">Update Response</a>\n                                    </div>\n                                </div>`;\n                    }\n                }];\n        }\n\n        this.stepsDatatable = new PJQ.views.dataTables.DataTable({\n            el: this.$('.dt-steps'),\n            data: data,\n            isHideSearch: true,\n            groupBy: this.options.isEdit ? null : 'step.attributes.number',\n            language: {\n                emptyTable: 'No Steps have been created yet',\n                zeroRecords: 'No Steps have been created yet'\n            },\n            isStriped: false,\n            paging: false,\n            order: [[0, \"asc\"]],\n            columns: columns,\n            dom: '<\"top\"<\"clear\">>rt<\"bottom\"p<\"clear\">>',\n            contextMenuOptions: {\n                actions: [\n                    {\n                        name: 'Delete',\n                        isDanger: true,\n                        onClick: (row) => {\n                            this.deleteStep(row.data());\n                        },\n                        isShown: () => {\n                            return this.options.isEdit;\n                        },\n                    }\n                ]\n            },\n            disableGroupToggle: true,\n            getGroupHeader: (group) => {\n                let step = this.model.steps.get(group),\n                    bicBtn = '';\n                if (!step.get('isActive') && this.options.canChangeBallInCourt) {\n                    bicBtn = '<button data-step-cid=\"' + step.cid + '\" class=\"btn fs-14 btn-sm btn-outline-dark btn-set-bic ml-auto\">Set Ball In Court</button>';\n                }\n\n                let activeBadge = '';\n                if (step.get('isActive') && this.options.canRespond) {\n                    activeBadge = '<span class=\"badge badge-success fs-12 ml-2\">Active</span>';\n                }\n\n                return '<div class=\"d-flex align-items-center wd-100 p-2\" style=\"height:50px\"><div class=\"fs-16 font-weight-light\"><strong>#' + step.get('number') + '</strong></div>' + activeBadge + bicBtn + '</div>';\n            },\n            onRowDoubleClick: () => {\n\n            },\n        });\n    }\n});\n\nPJQ.views.submittals.WorkflowResponseModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'modal-workflow-response'),\n        maxWidth: 650,\n    },\n    events: {\n        'keyup .input-comment': 'commentChanged',\n        'click .btn-back': 'previousStep',\n        'click .btn-next': 'nextStep',\n        'click .btn-save': 'save',\n        'click .btn-cancel': 'cancel'\n    },\n    beforeModalCreated: async function () {\n        this.isFetched = false;\n        this.step = 1;\n\n        this.options.statuses = await this.options.project.fetchSubmittalStatuses();\n\n        if (this.model == null) {\n            this.model = new PJQ.models.submittals.WorkflowResponse({\n                submittalId: this.options.submittal.id\n            });\n        }\n        this.isFetched = true;\n        this.render();\n    },\n    renderData: function () {\n        return {\n            model: this.model,\n            approver: this.options.approver,\n            statuses: this.options.statuses,\n            submittal: this.options.submittal,\n            step: this.step\n        }\n    },\n    afterRender: function () {\n        if (!this.isFetched) {\n            return;\n        }\n\n        new PJQ.StepIndicator(this.$('.steps-outer'), {\n            steps: [{\n                name: '',\n                // name: 'Upload Attachments'\n            }, {\n                name: '',\n                // name: 'Respond'\n            }, {\n                name: '',\n                // name: 'Review & Submit'\n            }],\n            activeStep: this.step - 1\n        });\n\n        switch (this.step) {\n            case 1:\n                this.fileUploader = new PJQ.views.files.FileUploaderGrid({\n                    el: this.$('.step-uploader'),\n                    collection: this.model.attachments,\n                    includeProjectAttachments: true,\n                    versionByName: true,\n                    getParentAttachment: (fileModel) => {\n                        return _.find(this.options.submittal.attachments.models, (file) => {\n                            return file.get('name') === fileModel.get('name') && !file.get('delete')\n                                && (file.get('parentAttachmentId') == null || file.get('parentAttachmentId') === file.id);\n                        });\n                    },\n                    onSuccess: _.bind(function () {\n\n                    }, this),\n                    onDelete: _.bind(function (attachment, callback) {\n\n                    }, this)\n                });\n                break;\n            case 2:\n                this.statusPicker = new PJQ.inputs.Selectpicker({\n                    el: this.$('.select-status'),\n                    noneSelectedText: 'Select Status',\n                    isIntChoices: true,\n                    defaultValue: this.model.get('statusId'),\n                    choices: _.map(_.filter(this.options.statuses.models, (status) => {\n                        return status.get('type') === PJQ.constants.submittals.statusTypes.APPROVED || status.get('type') === PJQ.constants.submittals.statusTypes.REJECTED;\n                    }), (status) => {\n                        return {\n                            id: status.id,\n                            name: status.get('name')\n                        };\n                    }),\n                    onChange: _.bind(function (value) {\n                        this.model.set('statusId', value);\n                    }, this)\n                });\n                break;\n            case 3:\n                break;\n        }\n    },\n    commentChanged: function (e) {\n        this.model.set({\n            responseText: this.$('.input-comment').val()\n        });\n    },\n    previousStep: function () {\n        this.step--;\n        this.render();\n    },\n    nextStep: function () {\n        switch (this.step) {\n            case 1:\n                break;\n            case 2:\n                if (this.model.get('statusId') == null) {\n                    this.statusPicker.showError();\n                    return;\n                }\n                break;\n            case 3:\n                break;\n        }\n\n        this.step++;\n        this.render();\n    },\n    save: function () {\n        let loader = new PJQ.Loader(this.$('.modal-content'));\n        this.options.submittal.respond(this.model, this.options.approver?.get('personId'), (success) => {\n            if (!success) {\n                loader.remove();\n                return;\n            }\n\n            this.options.onSave(this.model);\n            this.removeModal();\n\n            PJQ.notifications.notify.successNotify({\n                message: 'Response submitted successfully'\n            });\n        });\n    },\n    cancel: function () {\n        new PJQ.views.modals.YesNo({\n            header: \"Cancel Response?\",\n            body: \"Are you sure you want to cancel this response? All changes will be lost.\",\n            onYes: () => {\n                this.removeModal();\n            }\n        });\n    }\n});\n\nPJQ.views.submittals.EditWorkflowTemplateModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.SUBMITTALS, 'modal-edit-workflow-template'),\n        maxWidth: 650,\n    },\n    events: {\n        'click .btn-save': 'save',\n        'click .btn-cancel': 'cancel',\n        'click .btn-delete': 'deleteTemplate'\n    },\n    beforeModalCreated: async function () {\n        this.isFetched = false;\n\n        if (this.model != null) {\n            await this.model.fetch();\n        }\n\n        this.isFetched = true;\n        this.render();\n    },\n    renderData: function () {\n        return {\n            model: this.model,\n            isFetched: this.isFetched\n        }\n    },\n    afterRender: function () {\n        if (!this.isFetched) {\n            return;\n        }\n\n        if (this.model.isNew()) {\n            this.$('.input-template-name').focus();\n        }\n\n        this.binder = new PJQ.Binder(this.$el, this.model, {\n            watchElements: [\n                'input',\n                'textarea'\n            ]\n        });\n\n        this.workflowView = new PJQ.views.submittals.WorkflowView({\n            el: this.$('.workflow-outer'),\n            model: this.model.workflow,\n            project: this.options.project,\n            isEdit: true,\n            canEdit: true,\n            onChange: () => {\n                this.model.isDirty = true;\n            }\n        });\n    },\n    validate: function () {\n        let $name = this.$('.input-template-name');\n        PJQ.helpers.inputHelpers.setInputError($name, true);\n        if (this.model.get('name') == null || this.model.get('name').trim() === '') {\n            PJQ.helpers.inputHelpers.setInputError($name, false);\n            return false;\n        }\n\n        return true;\n    },\n    save: function () {\n        if (!this.validate()) {\n            return;\n        }\n\n        this.model.save(null, {\n            success: () => {\n                if (typeof this.options.onSave === 'function') {\n                    this.options.onSave(this.model);\n                }\n                this.removeModal();\n\n                PJQ.notifications.notify.successNotify({\n                    message: 'Template saved successfully'\n                });\n            },\n            error: () => {\n                PJQ.notifications.notify.errorNotify({\n                    message: 'An error occurred while saving the template'\n                });\n            }\n        });\n    },\n    cancel: function () {\n        if (this.model.hasChanged()) {\n            new PJQ.views.modals.SaveDontSave({\n                header: \"Unsaved Changes\",\n                body: \"Do you want to save changes?\",\n                onSave: _.bind(function () {\n                    this.save();\n                }, this),\n                onDontSave: _.bind(function () {\n                    this.removeModal();\n                }, this)\n            });\n        } else {\n            this.removeModal();\n        }\n    },\n    deleteTemplate: function () {\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Delete Submittal Workflow Template?\",\n            body: \"Are you sure you want to delete this workflow template? This cannot be undone.\",\n            onDelete: () => {\n                this.model.destroy({\n                    success: () => {\n                        if (typeof this.options.onSave === 'function') {\n                            this.options.onDelete();\n                        }\n                        this.removeModal();\n                    },\n                    error: () => {\n                        PJQ.notifications.notify.errorNotify({\n                            message: 'Failed to delete workflow template'\n                        });\n                    }\n                });\n            }\n        });\n    }\n});"]}