{"version":3,"sources":["1initializers.js","punchlistmodels.js","punchlistviews.js","settingsviews.js","templateviews.js"],"names":["PJQ","collections","punchlists","models","views","modules","punchList","routes","route","name","callback","projectId","projectWall","initProjectNavigator","parseInt","punchListItemId","app","addRoutes","PunchlistItem","BaseModel","extend","notifyName","idAttribute","endpoint","arr","this","isNew","get","value","id","helpers","urlHelpers","generateEndpoint","afterInit","set","silent","on","_","bind","assignedTo","projectContacts","ProjectContact","constants","statuses","NEW","NOT_RESOLVED","ballInCourt","parse","model","groups","Groups","createdBy","size","distributionList","ProjectContacts","comments","PunchlistItemComments","attachments","PunchlistItemAttachments","beforeAttachments","afterAttachments","customFieldValues","getDeepLink","toString","getStatusColor","statusColors","ASSIGNED","getStatusName","statusNames","WORK_COMPLETED","workCompletedOverride","session","project","preferences","getPref","preferenceTypes","PUNCH_LIST_WORK_COMPLETED_STATUS_OVERRIDE","getPriorityColor","priorities","LOW","priorityColors","getPriorityName","priorityNames","beforeSave","_this$assignedTo","toJSON","getChangedModels","fetchNotifications","notifications","Notifications","punchlistItem","fetch","success","distribute","ajax","Request","post","done","response","fail","res","err","responseJSON","message","PunchlistItemComment","EditHistoryItem","createdOnDisplay","dateHelpers","getDateString","Date","createdOn","dateFormats","DATE_TIME","createdByDisplay","companyName","contactName","oldValueDisplay","oldValue","newValueDisplay","newValue","fieldType","DATE","PunchlistItemAttachment","files","File","PunchlistCustomField","customFields","CustomField","Notification","notificationTypeNames","collection","options","Settings","ProjectContactSettings","each","setting","matchProjectContact","findWhere","attributes","isSilent","filter","projectContact","hasChanged","PunchListUserSettings","params","forCompany","push","parameter","getSettings","view","find","viewSettings","ProjectContactSetting","Template","user","assignee","submitter","submittals","Comments","Attachments","punchlistItems","PunchlistItems","items","BaseCollection","EditHistoryItems","Files","PunchlistCustomFields","masterUserId","Templates","PunchlistView","BaseView","defaults","template","templating","PUNCHLISTS","events","click .btn-punchlist-settings","click .export-detailed","click .export-list","click .btn-add-punchlist-item","click .btn-edit-punchlist-item","click .btn-delete-punchlist-item","click .btn-save-a-template","click .btn-import-template","beforeFirstRender","isAdmin","hasPermission","isFetched","userSettings","fnFetch","fnRender","punchListItems","render","fetchPunchListCustomFields","hasPref","ENABLE_PROJECT_LOCATIONS","fetchLocations","locations","renderData","afterRender","renderDataTable","item","editPunchlistItem","self","punchlistDataTable","dataTables","DataTable","el","$","rowId","data","language","emptyTable","zeroRecords","subTemplates","header","pageLength","rowsPerPage","orderCookie","cookies","PUNCHLIST_ORDER_COOKIE","settings","headerData","afterHeaderRender","$header","inputs","Selectpicker","onChange","setFilter","isGrouped","isIntChoices","isMultiple","noneSelectedText","locationFilterPicker","ProjectLocationPicker","getFilterData","result","locationFilter","getFilter","row","contains","primaryFilter","statusFilter","status","priorityFilter","priority","hasAssigned","rowStatus","order","deferRender","onRowDoubleClick","contextMenuOptions","actions","onClick","isDanger","isShown","deletePunchlistItem","columns","getColumns","colReorder","fixedColumnsLeft","fixedColumnsRight","realtime","columnOrderChanged","save","includeAllColumns","arguments","length","undefined","includeColumns","customField","column","columnData","title","type","contacts","getContactAnchor","contact","visible","indexOf","width","sort","numStr","number","isNaN","display","group","join","location","getFullName","searchable","itemDueDate","dateString","RESOLVED","getDateDaysDiff","startsWith","className","commitments","customFieldType","INTEGER","MONEY","PERCENT","fieldValue","getCustomFieldValue","fieldTypes","TEXT","isURL","choices","choice","toLocaleString","parseFloat","formatHelpers","numbersOnly","formatCurrency","orderable","html","addClicked","newItem","templateId","editClicked","e","getRow","currentTarget","parents","fnRenderEditor","PunchlistItemEditorModal","onSave","addRow","add","refresh","onClose","restore","onDelete","cid","removeRow","destroy","deleteClicked","modals","DeleteCancel","body","exportList","filters","cookieHelpers","getCookie","JSON","reports","NewReport","reportTypes","PUNCH_LIST","columnOrder","export","format","then","exportDetailedList","orderBy","orderAscending","filterData","getFilteredRowData","map","loader","Loader","loadingText","itemOrder","handleDownload","remove","xhr","viewPunchListSettings","PunchListSettingsModal","punchlistsView","saveTemplate","PunchlistTemplateCreatorModal","importTemplate","ImportTemplateModal","onImport","BaseModal","contactBadge","GLOBAL","maxWidth","isShowCloseButton","noop","click .add-comment","click .item-cancel","click .edit-history","click .btn-notification-history","click .btn-export","click .item-status-not-resolved","click .item-status-work-completed","click .item-status-resolved","click .punchlist-save","click .punchlist-close","click .punchlist-delete","click .delete-comment","click .btn-distribute","beforeModalCreated","_beforeModalCreated","_asyncToGenerator","_regeneratorRuntime","mark","_callee","wrap","_context","prev","next","changedAnnotations","drawings","Annotations","sent","stop","apply","beforeRender","canEdit","canUpload","isAssignee","_this","isSaving","Binder","$el","watchElements","Datepicker","datepickerOptions","datePicker","defaultDate","newDate","currentDueDate","defaultValue","AutocompleteInput","source","renderBallInCourt","renderCustomFields","ContactsSelectInput","context","contexts","PROJECTCONTACTS","selectedContact","isSingleChoice","isReadOnly","renderStatus","canViewContacts","canEditPeople","displayContactsBlock","canSwitchContext","USERS","selectedContacts","reset","isDirty","groupListInput","GroupsSelectInput","isShowAddButton","addButton","groupLevels","GROUP_LEVELS","groupUserId","selectedGroups","onAfterSave","fileUploader","FileUploaderGrid","contextId","canAddAnnotations","onAnnotationChange","annotation","merge","mergeAnnotations","includeProjectAttachments","previewImageDimension","canDelete","attachment","beforeUploader","offsetTopText","afterUploader","renderComments","css","$ballInCourt","Alert","text","renderSubTemplate","canView","customFieldsForm","CustomFieldsForm","fieldValues","isEdit","_this2","YesNo","onYes","notify","successNotify","exportPDF","addComment","val","trim","comment","punchlistItemId","commentText","deleteComment","commentId","card","closest","isShowCancelButton","okButtonText","onOk","i","deletedOn","hide","markNotResolved","markWorkCompleted","workCompleteOverride","markResolved","validate","isValid","inputHelpers","setInputError","empty","window","scrollTo","viewEditHistory","EditHistoryModal","editHistory","viewNotificationHistory","NotificationHistory","_this3","isUploading","fnSaveAnnotations","saveAll","removeModal","close","SaveDontSave","onDontSave","minWidth","dataTable","dom","click .history-close","change .select-column","click .settings-save","click .btn-delete-punch-lists","afterModalCreated","fetchProjectContacts","fetchPunchListSettings","onAdd","updateProjectContactsSetting","rowsPerPageSelectPicker","isHideSearch","deleteItems","deleteAllPunchLists","columnSelected","sender","prop","objectHelpers","refinedType","existingSetting","newSetting","getValue","put","error","click .btn-save","fetchPunchlistTemplates","tmp","templates","$name","existingTemplate","fnSave","copyComments","copyAssignee","copyGroups","click .btn-import","templatePicker","selectedTemplate","showError","hideError","EditTemplateModal","fitHeight","click .btn-close","click .btn-delete","listenTo","TextEditorInput","label","patch","deleteTemplate","TemplateManagement","addTemplate","NewTemplateModal","editTemplate"],"mappings":"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","file":"app.js","sourcesContent":["PJQ.collections.punchlists = {};\r\n\r\nPJQ.models.punchlists = {};\r\n\r\nPJQ.views.punchlists = {};\r\n\r\n//Routes\r\nPJQ.modules.punchList = {\r\n\troutes: [\r\n\t\t{\r\n\t\t\troute: 'projects/:projectId/punchlists',\r\n\t\t\tname: 'punchList',\r\n\t\t\tcallback: function (projectId) {\r\n\t\t\t\tPJQ.modules.projectWall.initProjectNavigator(parseInt(projectId), \"punchlists\");\r\n\t\t\t}\r\n\t\t},\r\n\t\t{\r\n\t\t\troute: 'projects/:projectId/punchlists/:punchListItemId',\r\n\t\t\tname: 'punchListItem',\r\n\t\t\tcallback: function (projectId, punchListItemId) {\r\n\t\t\t\tPJQ.modules.projectWall.initProjectNavigator(parseInt(projectId), \"punchlists\", {\r\n\t\t\t\t\tpunchListItemId: parseInt(punchListItemId)\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t]\r\n};\r\n\r\nPJQ.app.addRoutes(PJQ.modules.punchList.routes);","// Models\r\nPJQ.models.punchlists.PunchlistItem = PJQ.models.BaseModel.extend({\r\n    notifyName: 'Punch List Item',\r\n    idAttribute: \"punchlistItemId\",\r\n    endpoint: function () {\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: 'punchlists',\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: 'punchlists'\r\n                },\r\n                {\r\n                    endpoint: 'templates',\r\n                    value: this.get('templateId')\r\n                },\r\n                {\r\n                    endpoint: 'item'\r\n                }\r\n            ];\r\n        } else {\r\n            arr = [\r\n                {\r\n                    endpoint: 'punchlists',\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        this.on('change:assignedTo', _.bind(function () {\r\n            let assignedTo = this.get('assignedTo');\r\n            if (assignedTo instanceof PJQ.models.projectContacts.ProjectContact) {\r\n                this.assignedTo = this.get('assignedTo');\r\n            } else if (assignedTo != null) {\r\n                this.assignedTo = new PJQ.models.projectContacts.ProjectContact(this.get('assignedTo'));\r\n            } else {\r\n                this.assignedTo = null;\r\n            }\r\n\r\n            if (this.get('status') === PJQ.constants.punchlists.statuses.NEW || PJQ.constants.punchlists.statuses.NOT_RESOLVED) {\r\n                this.ballInCourt = this.assignedTo;\r\n                this.set('ballInCourt', this.ballInCourt);\r\n            }\r\n        }, this));\r\n    },\r\n    parse: function (model) {\r\n        if (!model)\r\n            return model;\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.assignedTo) {\r\n            this.assignedTo = new PJQ.models.projectContacts.ProjectContact(model.assignedTo);\r\n        } else {\r\n            this.assignedTo = null;\r\n        }\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 (model.workCompletedBy) {\r\n        //     this.workCompletedBy = new PJQ.models.projectContacts.ProjectContact(model.workCompletedBy);\r\n        // }\r\n        // else{\r\n        //     this.workCompletedBy = null;\r\n        // }\r\n        //\r\n        // if (model.resolvedBy) {\r\n        //     this.resolvedBy = new PJQ.models.projectContacts.ProjectContact(model.resolvedBy);\r\n        // }\r\n        // else{\r\n        //     this.resolvedBy = null;\r\n        // }\r\n\r\n        if (_.size(model.comments) > 0) {\r\n            this.comments = new PJQ.collections.punchlists.PunchlistItemComments(model.comments);\r\n        } else {\r\n            this.comments = new PJQ.collections.punchlists.PunchlistItemComments();\r\n        }\r\n\r\n        if (_.size(model.attachments) > 0) {\r\n            this.attachments = new PJQ.collections.punchlists.PunchlistItemAttachments(model.attachments);\r\n        } else {\r\n            this.attachments = new PJQ.collections.punchlists.PunchlistItemAttachments();\r\n        }\r\n\r\n        if (_.size(model.beforeAttachments) > 0) {\r\n            this.beforeAttachments = new PJQ.collections.punchlists.PunchlistItemAttachments(model.beforeAttachments);\r\n        } else {\r\n            this.beforeAttachments = new PJQ.collections.punchlists.PunchlistItemAttachments();\r\n        }\r\n\r\n        if (_.size(model.afterAttachments) > 0) {\r\n            this.afterAttachments = new PJQ.collections.punchlists.PunchlistItemAttachments(model.afterAttachments);\r\n        } else {\r\n            this.afterAttachments = new PJQ.collections.punchlists.PunchlistItemAttachments();\r\n        }\r\n\r\n        if (model.customFieldValues == null) {\r\n            model.customFieldValues = [];\r\n        }\r\n\r\n        return model;\r\n    },\r\n    getDeepLink: function () {\r\n        let projectId = this.get('projectId');\r\n        if (!(this.id > 0) || !(projectId > 0)) {\r\n            return null;\r\n        }\r\n        return '#projects/' + projectId.toString() + '/punchlists/' + this.id.toString();\r\n    },\r\n    getStatusColor: function () {\r\n        if (this.get('status') == null) {\r\n            this.set('status', PJQ.constants.punchlists.statuses.NEW);\r\n        }\r\n\r\n        if (this.assignedTo != null && this.get('status') === PJQ.constants.punchlists.statuses.NEW) {\r\n            return PJQ.constants.punchlists.statusColors[PJQ.constants.punchlists.statuses.ASSIGNED];\r\n        }\r\n        return PJQ.constants.punchlists.statusColors[this.get('status')];\r\n    },\r\n    getStatusName: function () {\r\n        if (this.get('status') == null) {\r\n            this.set('status', PJQ.constants.punchlists.statuses.NEW);\r\n        }\r\n\r\n        if (this.assignedTo != null && this.get('status') === PJQ.constants.punchlists.statuses.NEW) {\r\n            return PJQ.constants.punchlists.statusNames[PJQ.constants.punchlists.statuses.ASSIGNED];\r\n        } else if (this.get('status') === PJQ.constants.punchlists.statuses.WORK_COMPLETED) {\r\n            let workCompletedOverride = PJQ.app.session.project.preferences.getPref(PJQ.constants.preferenceTypes.PUNCH_LIST_WORK_COMPLETED_STATUS_OVERRIDE);\r\n            if (workCompletedOverride != null) {\r\n                return workCompletedOverride;\r\n            }\r\n        }\r\n        return PJQ.constants.punchlists.statusNames[this.get('status')];\r\n    },\r\n    getPriorityColor: function () {\r\n        if (this.get('priority') == null) {\r\n            this.set('priority', PJQ.constants.punchlists.priorities.LOW);\r\n        }\r\n        return PJQ.constants.punchlists.priorityColors[this.get('priority')];\r\n    },\r\n    getPriorityName: function () {\r\n        if (this.get('priority') == null) {\r\n            this.set('priority', PJQ.constants.punchlists.priorities.LOW);\r\n        }\r\n        return PJQ.constants.punchlists.priorityNames[this.get('priority')];\r\n    },\r\n    beforeSave: function () {\r\n        this.set({\r\n            groups: this.groups.toJSON(),\r\n            assignedTo: this.assignedTo?.toJSON(),\r\n            distributionList: this.distributionList.toJSON(),\r\n            attachments: this.attachments.getChangedModels(),\r\n            beforeAttachments: this.beforeAttachments.getChangedModels(),\r\n            afterAttachments: this.afterAttachments.getChangedModels(),\r\n            comments: this.comments.getChangedModels()\r\n        });\r\n    },\r\n    fetchNotifications: function (callback) {\r\n        if (this.notifications == null) {\r\n            this.notifications = new PJQ.collections.punchlists.Notifications(null, {\r\n                punchlistItem: 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    distribute: function (callback) {\r\n        new PJQ.ajax.Request({\r\n            endpoint: this.endpoint() + '/distribute',\r\n        }).post().done((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});\r\n\r\nPJQ.models.punchlists.PunchlistItemComment = PJQ.models.BaseModel.extend({\r\n    idAttribute: \"commentId\",\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'punchlists',\r\n                value: this.get('punchlistItemId')\r\n            },\r\n            {\r\n                endpoint: 'comments',\r\n                value: this.get('commentId')\r\n            }\r\n        ])\r\n    },\r\n    parse: function (model) {\r\n        if (!model) {\r\n            return model;\r\n        }\r\n\r\n        if (model.createdBy != null) {\r\n            this.createdBy = new PJQ.models.projectContacts.ProjectContact(model.createdBy);\r\n        }\r\n\r\n        return model;\r\n    }\r\n});\r\n\r\nPJQ.models.punchlists.EditHistoryItem = PJQ.models.BaseModel.extend({\r\n    parse: function (model) {\r\n        if (!model)\r\n            return model;\r\n\r\n        this.createdOnDisplay = PJQ.helpers.dateHelpers.getDateString(new Date(model.createdOn), PJQ.helpers.dateHelpers.dateFormats.DATE_TIME, true);\r\n\r\n        this.createdByDisplay = '';\r\n\r\n        if (model.createdBy && model.createdBy.companyName)\r\n            this.createdByDisplay = model.createdBy.contactName + ' (' + model.createdBy.companyName + ')';\r\n\r\n        this.oldValueDisplay = model.oldValue;\r\n        this.newValueDisplay = model.newValue;\r\n\r\n        if (model.fieldType === 'DATE') {\r\n            if (model.oldValue)\r\n                this.oldValueDisplay = PJQ.helpers.dateHelpers.getDateString(new Date(model.oldValue), PJQ.helpers.dateHelpers.dateFormats.DATE, true);\r\n            if (model.newValue)\r\n                this.newValueDisplay = PJQ.helpers.dateHelpers.getDateString(new Date(model.newValue), PJQ.helpers.dateHelpers.dateFormats.DATE, true);\r\n        } else if (model.fieldType === 'DATETIME') {\r\n            if (model.oldValue)\r\n                this.oldValueDisplay = PJQ.helpers.dateHelpers.getDateString(new Date(model.oldValue), PJQ.helpers.dateHelpers.dateFormats.DATE_TIME, true);\r\n            if (model.newValue)\r\n                this.newValueDisplay = PJQ.helpers.dateHelpers.getDateString(new Date(model.newValue), PJQ.helpers.dateHelpers.dateFormats.DATE_TIME, true);\r\n        }\r\n\r\n        return model;\r\n    }\r\n});\r\n\r\nPJQ.models.punchlists.PunchlistItemAttachment = 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: 'punchlists',\r\n                value: this.get('punchlistItemId')\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.punchlists.PunchlistCustomField = PJQ.models.customFields.CustomField.extend({\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'punchlists'\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.punchlists.Notification = PJQ.models.notifications.Notification.extend({\r\n    notificationTypeNames: PJQ.constants.punchlists.notificationTypeNames,\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'punchlists',\r\n                value: this.collection.options.punchlistItem.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.punchlists.Settings = PJQ.models.BaseModel.extend({\r\n    idAttribute: 'settingId',\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'projects',\r\n                value: this.get('project').id\r\n            },\r\n            {\r\n                endpoint: 'punchlists'\r\n            },\r\n            {\r\n                endpoint: 'settings'\r\n            }\r\n        ])\r\n    },\r\n    parse: function (model) {\r\n        if (!model)\r\n            return model;\r\n\r\n        this.projectContacts = new PJQ.collections.punchlists.ProjectContactSettings(model.projectContacts);\r\n        _.each(this.projectContacts.models, _.bind(function (setting) {\r\n            let matchProjectContact = PJQ.app.session.project.projectContacts.findWhere({id: setting.get('id')});\r\n            if (matchProjectContact != null) {\r\n                setting.set(matchProjectContact.attributes, {\r\n                    isSilent: true\r\n                });\r\n            }\r\n        }, this));\r\n\r\n        return model;\r\n    },\r\n    beforeSave: function () {\r\n        this.set('projectContacts', this.projectContacts.filter(function (projectContact) {\r\n            return projectContact.hasChanged();\r\n        }));\r\n    }\r\n});\r\n\r\nPJQ.models.punchlists.PunchListUserSettings = 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: 'punchlists'\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\n\r\nPJQ.models.punchlists.ProjectContactSetting = PJQ.models.BaseModel.extend({});\r\n\r\nPJQ.models.punchlists.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: 'punchlists'\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: 'copyAssignee',\r\n                value: this.get('copyAssignee')\r\n            },\r\n            {\r\n                parameter: 'copyGroups',\r\n                value: this.get('copyGroups')\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.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.assignee != null) {\r\n            this.assignee = new PJQ.models.projectContacts.ProjectContact(model.assignee);\r\n        } else {\r\n            this.submitter = null;\r\n        }\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.punchlistItems)\r\n            this.punchlistItems = new PJQ.collections.punchlists.PunchlistItems(model.punchlistItems);\r\n        else if (model.items)\r\n            this.punchlistItems = new PJQ.collections.punchlists.PunchlistItems(model.items);\r\n        else\r\n            this.punchlistItems = new PJQ.collections.punchlists.PunchlistItems();\r\n\r\n        return model;\r\n    }\r\n});\r\n\r\n\r\n// Collections\r\nPJQ.collections.punchlists.PunchlistItems = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.punchlists.PunchlistItem,\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: 'punchlists'\r\n            }\r\n        ])\r\n    }\r\n});\r\n\r\nPJQ.collections.punchlists.Notifications = PJQ.collections.notifications.Notifications.extend({\r\n    model: PJQ.models.punchlists.Notification,\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'punchlists',\r\n                value: this.options.punchlistItem.id\r\n            },\r\n            {\r\n                endpoint: 'notifications'\r\n            }\r\n        ])\r\n    }\r\n});\r\n\r\nPJQ.collections.punchlists.EditHistoryItems = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.punchlists.EditHistoryItem\r\n});\r\n\r\nPJQ.collections.punchlists.PunchlistItemComments = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.punchlists.PunchlistItemComment\r\n});\r\n\r\nPJQ.collections.punchlists.PunchlistItemAttachments = PJQ.collections.files.Files.extend({\r\n    model: PJQ.models.punchlists.PunchlistItemAttachment\r\n});\r\n\r\nPJQ.collections.punchlists.ProjectContactSettings = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.punchlists.ProjectContactSetting\r\n});\r\n\r\nPJQ.collections.punchlists.PunchlistCustomFields = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.punchlists.PunchlistCustomField,\r\n    options: {\r\n        masterUserId: null\r\n    },\r\n    endpoint: function () {\r\n        let projectId = null;\r\n        if (this.options.project != null) {\r\n            projectId = this.options.project.id\r\n        } else if (this.options.projectId > 0) {\r\n            projectId = this.options.projectId;\r\n        }\r\n\r\n        if (projectId > 0) {\r\n            return PJQ.helpers.urlHelpers.generateEndpoint([\r\n                {\r\n                    endpoint: 'projects',\r\n                    value: projectId\r\n                },\r\n                {\r\n                    endpoint: 'punchlists'\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: 'punchlists'\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.punchlists.Templates = PJQ.collections.BaseCollection.extend({\r\n    model: PJQ.models.punchlists.Template,\r\n    endpoint: function () {\r\n        return PJQ.helpers.urlHelpers.generateEndpoint([\r\n            {\r\n                endpoint: 'punchlists'\r\n            },\r\n            {\r\n                endpoint: 'templates'\r\n            }\r\n        ]);\r\n    }\r\n});\r\n","PJQ.views.punchlists.PunchlistView = PJQ.views.BaseView.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.PUNCHLISTS, 'Punchlist-Management'),\n        punchListItemId: null\n    },\n    events: {\n        'click .btn-punchlist-settings': 'viewPunchListSettings',\n        'click .export-detailed': 'exportDetailedList',\n        'click .export-list': 'exportList',\n        'click .btn-add-punchlist-item': 'addClicked',\n        'click .btn-edit-punchlist-item': 'editClicked',\n        'click .btn-delete-punchlist-item': 'deleteClicked',\n        'click .btn-save-a-template': 'saveTemplate',\n        'click .btn-import-template': 'importTemplate'\n    },\n    beforeFirstRender: function () {\n        this.options.isAdmin = true;\n        if (PJQ.app.session.project != null) {\n            this.options.project = PJQ.app.session.project;\n            this.options.isAdmin = (PJQ.app.session.user != null && this.options.project.get('masterUserId') === PJQ.app.session.user.get('masterUserId')) && this.options.project.hasPermission('punchList.isAdmin');\n        }\n\n        this.isFetched = false;\n        this.preferences = this.options.project ? this.options.project.preferences : PJQ.app.session.preferences;\n        this.options.userSettings = new PJQ.models.punchlists.PunchListUserSettings();\n        let fnFetch = _.bind(function () {\n            this.options.userSettings.fetch({\n                success: _.bind(function () {\n                    let fnRender = _.bind(function (customFields) {\n                        this.options.customFields = customFields;\n                        if (this.collection == null && this.options.project != null) {\n                            let punchListItems = new PJQ.collections.punchlists.PunchlistItems(null, {\n                                project: this.options.project\n                            });\n                            punchListItems.fetch({\n                                success: _.bind(function () {\n                                    this.collection = punchListItems;\n                                    this.isFetched = true;\n                                    this.render();\n                                }, this)\n                            });\n                            return false;\n                        } else {\n                            this.isFetched = true;\n                            this.render();\n                        }\n                    }, this);\n                    if (this.options.project != null) {\n                        this.options.project.fetchPunchListCustomFields(_.bind(function (customFields) {\n                            fnRender(customFields);\n                        }, this));\n                    } else {\n                        PJQ.app.session.fetchPunchListCustomFields(null, _.bind(function (customFields) {\n                            fnRender(customFields);\n                        }, this));\n                    }\n                }, this)\n            });\n        }, this)\n\n        if (this.options.project != null && this.preferences.hasPref(PJQ.constants.preferenceTypes.ENABLE_PROJECT_LOCATIONS)) {\n            this.options.project.fetchLocations(_.bind(function (locations) {\n                this.locations = locations;\n                fnFetch();\n            }, this));\n        } else {\n            fnFetch();\n        }\n    },\n    renderData: function () {\n        return {\n            project: this.options.project\n        };\n    },\n    afterRender: function () {\n        if (!this.isFetched)\n            return;\n\n        this.renderDataTable();\n\n        //If there was a passed in item to be shown (for a route), show it now\n        if (this.options.punchListItemId > 0) {\n            let item = this.collection.get(this.options.punchListItemId);\n            this.options.punchListItemId = null;\n            if (item != null) {\n                this.editPunchlistItem(item);\n            }\n        }\n    },\n    renderDataTable() {\n        let self = this,\n            userSettings = this.options.userSettings.getSettings(PJQ.constants.punchlists.view.PUNCHLISTS);\n        this.punchlistDataTable = new PJQ.views.dataTables.DataTable({\n            el: this.$('.punch-list-items'),\n            rowId: \"cid\",\n            data: this.collection.models,\n            language: {\n                emptyTable: 'Click \"Add Item\" to create a Punch List Item',\n                zeroRecords: \"No items matched the search criteria\"\n            },\n            subTemplates: {\n                header: new PJQ.templating.Template(PJQ.constants.modules.PUNCHLISTS, 'Data-Table-Header-Punch-List')\n            },\n            pageLength: userSettings != null ? userSettings.rowsPerPage : 50,\n            orderCookie: PJQ.constants.cookies.PUNCHLIST_ORDER_COOKIE,\n            settings: this.options.userSettings.getSettings(PJQ.constants.punchlists.view.PUNCHLISTS),\n            headerData: function () {\n                return {\n                    project: self.options.project,\n                    preferences: self.preferences\n                };\n            },\n            afterHeaderRender: _.bind(function (view, $header) {\n                new PJQ.inputs.Selectpicker({\n                    el: $header.find('.punch-list-filter'),\n                    onChange: function (value) {\n                        view.setFilter('primary', value);\n                    },\n                    isGrouped: true,\n                    isIntChoices: true,\n                    isMultiple: true,\n                    noneSelectedText: 'No Filters'\n                });\n\n                if (this.preferences.hasPref(PJQ.constants.preferenceTypes.ENABLE_PROJECT_LOCATIONS)) {\n                    this.locationFilterPicker = new PJQ.inputs.ProjectLocationPicker({\n                        el: this.$('.filter-location'),\n                        project: this.options.project,\n                        isMultiple: true,\n                        onChange: _.bind(function (value) {\n                            view.setFilter('location', value);\n                        }, this)\n                    });\n                }\n            }, this),\n            getFilterData: function (view, data) {\n                let result = data,\n                    locationFilter = view.getFilter('location');\n                if (_.size(locationFilter) > 0) {\n                    result = _.filter(data, function (row) {\n                        return _.contains(locationFilter, row.get('locationId'));\n                    }, this);\n                }\n\n                let primaryFilter = view.getFilter('primary');\n                if (_.size(primaryFilter) === 0) {\n                    return result;\n                }\n\n                let statusFilter = primaryFilter.status,\n                    priorityFilter = primaryFilter.priority,\n                    hasAssigned = _.contains(statusFilter, PJQ.constants.punchlists.statuses.ASSIGNED);\n                return _.filter(result, function (row) {\n                    let rowStatus = row.get('status');\n                    return (_.size(priorityFilter) === 0 || _.contains(priorityFilter, row.get('priority')))\n                        && (_.size(statusFilter) === 0 || (hasAssigned && rowStatus === PJQ.constants.punchlists.statuses.NEW && row.assignedTo != null) || _.contains(statusFilter, rowStatus));\n                });\n            },\n            order: [[0, \"asc\"]],\n            deferRender: true,\n            onRowDoubleClick: _.bind(function (row) {\n                this.editPunchlistItem(row.data());\n            }, this),\n            contextMenuOptions: {\n                actions: [\n                    {\n                        name: 'Edit',\n                        onClick: _.bind(function (row) {\n                            this.editPunchlistItem(row.data());\n                        }, this)\n                    },\n                    {\n                        name: 'Delete',\n                        isDanger: true,\n                        isShown: _.bind(function () {\n                            return this.options.isAdmin;\n                        }, this),\n                        onClick: _.bind(function (row) {\n                            this.deletePunchlistItem(row);\n                        }, this)\n                    }\n                ]\n            },\n            columns: this.getColumns(false),\n            colReorder: {\n                fixedColumnsLeft: 0,\n                fixedColumnsRight: 1,\n                realtime: false\n            },\n            columnOrderChanged: _.bind(function () {\n                if (this.options.userSettings != null) {\n                    this.options.userSettings.save();\n                }\n            }, this)\n        });\n    },\n    getColumns(includeAllColumns = false) {\n        let columns = [], includeColumns = [],\n            viewSettings = this.options.userSettings.getSettings(PJQ.constants.punchlists.view.PUNCHLISTS);\n\n        if (includeAllColumns || viewSettings == null) {\n            includeColumns = [\"createdBy\", \"status\", \"priority\", \"itemNumber\", \"title\", \"assignedTo\", \"ballInCourt\", \"groupList\", \"category\", \"location\", \"dueDate\"];\n\n            if (_.size(this.options.customFields) > 0) {\n                _.each(this.options.customFields.models, function (customField) {\n                    includeColumns.push('fieldValue' + customField.get('fieldNumber'));\n                });\n            }\n        } else\n            includeColumns = viewSettings.columns;\n\n        _.each(includeColumns, _.bind(function (column) {\n                switch (column) {\n                    case \"createdBy\":\n                        columns.push({\n                            columnData: 'createdBy',\n                            title: \"Created By\",\n                            render: function (data, type, row) {\n                                return PJQ.helpers.contacts.getContactAnchor({contact: row.createdBy});\n                            },\n                            visible: viewSettings != null ? viewSettings.columns.indexOf(column) !== -1 : false\n                        });\n                        break;\n                    case \"status\":\n                        columns.push({\n                            columnData: \"status\",\n                            data: \"attributes.status\",\n                            title: \"Status\",\n                            width: \"80px\",\n                            render: function (data, type, row) {\n                                return '<span style=\"color:' + row.getStatusColor() + '\">' + row.getStatusName() + '</span>';\n                            },\n                            visible: viewSettings != null ? viewSettings.columns.indexOf(column) !== -1 : true\n                        });\n                        break;\n                    case \"priority\":\n                        columns.push({\n                            columnData: \"priority\",\n                            data: \"attributes.priority\",\n                            title: \"Priority\",\n                            width: \"40px\",\n                            render: function (data, type, row) {\n                                return '<span style=\"color:' + row.getPriorityColor() + '\">' + row.getPriorityName() + '</span>';\n                            },\n                            visible: viewSettings != null ? viewSettings.columns.indexOf(column) !== -1 : true\n                        });\n                        break;\n                    case \"itemNumber\":\n                        columns.push({\n                            columnData: \"itemNumber\",\n                            data: {\n                                \"_\": \"attributes.itemNumber\",\n                                \"sort\": _.bind(function (row) {\n                                    let numStr = row.get('itemNumber');\n                                    if (_.size(numStr) > 0) {\n                                        let number = parseInt(numStr);\n                                        if (isNaN(number)) {\n                                            return numStr;\n                                        }\n                                        return number\n                                    }\n                                    return 0;\n                                }, this),\n                                \"display\": \"attributes.itemNumber\"\n                            },\n                            title: \"Item #\",\n                            width: \"60px\",\n                            type: \"natural-ci\",\n                            visible: viewSettings != null ? viewSettings.columns.indexOf(column) !== -1 : true\n                        });\n                        break;\n                    case \"title\":\n                        columns.push({\n                            columnData: \"title\",\n                            data: \"attributes.title\",\n                            title: \"Title\",\n                            width: \"20%\",\n                            visible: viewSettings != null ? viewSettings.columns.indexOf(column) !== -1 : true\n                        });\n                        break;\n                    case \"assignedTo\":\n                        columns.push({\n                            columnData: \"assignedTo\",\n                            data: \"attributes.assignedTo\",\n                            title: \"Assigned To\",\n                            render: function (data, type, row) {\n                                let result = 'Nobody';\n                                if (row.assignedTo) {\n                                    result = PJQ.helpers.contacts.getContactAnchor({contact: row.assignedTo});\n                                }\n                                return result;\n                            },\n                            width: \"20%\",\n                            visible: viewSettings != null ? viewSettings.columns.indexOf(column) !== -1 : true\n                        });\n                        break;\n                    case \"ballInCourt\":\n                        columns.push({\n                            columnData: \"ballInCourt\",\n                            title: \"Ball In Court\",\n                            render: function (data, type, row) {\n                                let result = 'Nobody';\n\n                                if ((row.get('status') === PJQ.constants.punchlists.statuses.NEW || row.get('status') === PJQ.constants.punchlists.statuses.NOT_RESOLVED) && row.assignedTo != null) {\n                                    result = PJQ.helpers.contacts.getContactAnchor({contact: row.assignedTo});\n                                } else if (row.get('status') === PJQ.constants.punchlists.statuses.WORK_COMPLETED) {\n                                    result = 'Project Managers';\n                                }\n\n                                return result;\n                            },\n                            width: \"20%\",\n                            visible: viewSettings != null ? viewSettings.columns.indexOf(column) !== -1 : false\n                        });\n                        break;\n                    case 'groupList':\n                        columns.push({\n                            columnData: 'groupList',\n                            title: \"Trades\",\n                            render: function (data, type, row) {\n                                let result = [];\n                                if (_.size(row.groups.models) > 0) {\n                                    _.each(row.groups.models, function (group) {\n                                        result.push(group.get('groupName'));\n                                    });\n                                } else {\n                                    result.push('None');\n                                }\n                                return result.join(', ');\n                            },\n                            visible: viewSettings != null ? viewSettings.columns.indexOf(column) !== -1 : false\n                        });\n                        break;\n                    case 'category':\n                        columns.push({\n                            columnData: 'category',\n                            data: \"attributes.category\",\n                            title: \"Category\",\n                            visible: viewSettings != null ? viewSettings.columns.indexOf(column) !== -1 : false\n                        });\n                        break;\n                    case 'location':\n                        columns.push({\n                            columnData: 'location',\n                            data: \"attributes.location\",\n                            title: \"Location\",\n                            render: _.bind(function (data, type, row) {\n                                if (this.locations != null && this.preferences.hasPref(PJQ.constants.preferenceTypes.ENABLE_PROJECT_LOCATIONS)) {\n                                    let location = this.locations.get(row.get('locationId'));\n                                    return location ? this.locations.getFullName(location) : '';\n                                }\n                                return data;\n                            }, this),\n                            visible: viewSettings != null ? viewSettings.columns.indexOf(column) !== -1 : false\n                        });\n                        break;\n                    case \"dueDate\":\n                        columns.push({\n                            columnData: \"dueDate\",\n                            \"data\": \"attributes.dueDate\",\n                            \"title\": \"Due\",\n                            \"searchable\": false,\n                            \"width\": \"80px\",\n                            \"render\": function (data, type, row) {\n                                if (data != null) {\n                                    let itemDueDate = new Date(data),\n                                        dateString = PJQ.helpers.dateHelpers.getDateString(itemDueDate, PJQ.helpers.dateHelpers.dateFormats.DATE);\n                                    if (row.get('status') !== PJQ.constants.punchlists.statuses.RESOLVED && PJQ.helpers.dateHelpers.getDateDaysDiff(itemDueDate, new Date()) < 0) {\n                                        return '<span class=\"text-danger font-weight-bold\">' + dateString + '</span>';\n                                    }\n                                    return dateString;\n                                }\n                                return 'Not Set';\n                            },\n                            visible: viewSettings != null ? viewSettings.columns.indexOf(column) !== -1 : true\n                        });\n                        break;\n                    default:\n                        if (column.startsWith('fieldValue')) {\n                            _.each(this.options.customFields.models, function (customField) {\n                                if (column === 'fieldValue' + customField.get('fieldNumber')) {\n                                    columns.push({\n                                        \"columnData\": 'fieldValue' + customField.get('fieldNumber'),\n                                        \"title\": customField.get('fieldName'),\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\" : \"\",\n                                        'visible': viewSettings.columns.indexOf(column) !== -1,\n                                        \"render\": function (data, type, row) {\n                                            let fieldValue = row.getCustomFieldValue(customField.get('id'));\n                                            fieldValue = (fieldValue !== null) ? fieldValue : '';\n                                            switch (customField.get('fieldType')) {\n                                                case PJQ.constants.customFields.fieldTypes.TEXT:\n                                                    if (fieldValue && type !== 'sort' && type !== 'type') {\n                                                        if (PJQ.helpers.urlHelpers.isURL(fieldValue))\n                                                            fieldValue = '<a target=\"_blank\" href=\"' + fieldValue + '\">' + fieldValue + '</a>';\n                                                    }\n                                                    break\n                                                case 'BOOL':\n                                                    if (fieldValue != null)\n                                                        fieldValue = fieldValue ? 'Yes' : 'No';\n                                                    break;\n                                                case 'CHOICE':\n                                                    let choices = [];\n                                                    // convert single choice value into array so that the logic below can work for both types.\n                                                    if (typeof fieldValue === 'number')\n                                                        fieldValue = [fieldValue];\n\n                                                    _.each(customField.choices.models, _.bind(function (choice) {\n                                                        if (_.find(fieldValue, function (value) {\n                                                            return value === choice.get('id');\n                                                        }))\n                                                            choices.push(choice.get('choiceName'));\n                                                    }, this));\n\n                                                    fieldValue = choices.join((', '));\n                                                    break;\n                                                case 'DATE':\n                                                    if (fieldValue) {\n                                                        if (type !== 'sort' && type !== 'type')\n                                                            fieldValue = PJQ.helpers.dateHelpers.getDateString(new Date(fieldValue), PJQ.helpers.dateHelpers.dateFormats.DATE, true);\n                                                    }\n                                                    if (fieldValue === undefined)\n                                                        fieldValue = '';\n\n                                                    break;\n                                                case 'DATETIME':\n                                                    if (fieldValue) {\n                                                        if (type !== 'sort' && type !== 'type')\n                                                            fieldValue = PJQ.helpers.dateHelpers.getDateString(new Date(fieldValue), PJQ.helpers.dateHelpers.dateFormats.DATE_TIME, false);\n                                                    }\n                                                    if (fieldValue === undefined)\n                                                        fieldValue = '';\n\n                                                    break;\n                                                case 'INT':\n                                                    if (type !== 'sort' && type !== 'type' && fieldValue) {\n                                                        fieldValue = parseInt(fieldValue).toLocaleString();\n                                                    }\n                                                    break;\n                                                case 'MONEY':\n                                                    if (type === 'sort' || type === 'type') {\n                                                        if (fieldValue && fieldValue !== '$')\n                                                            fieldValue = parseFloat(PJQ.helpers.formatHelpers.numbersOnly(fieldValue, true));\n                                                        else\n                                                            fieldValue = 0;\n                                                    } else {\n                                                        fieldValue = PJQ.helpers.formatHelpers.formatCurrency(parseInt(PJQ.helpers.formatHelpers.numbersOnly(fieldValue)));\n                                                    }\n                                                    break;\n                                                case 'PERCENT':\n                                                    if (type === 'sort' || type === 'type') {\n                                                        if (!fieldValue)\n                                                            fieldValue = 0;\n                                                    } else {\n                                                        fieldValue = fieldValue ? PJQ.helpers.formatHelpers.formatCurrency(parseInt(PJQ.helpers.formatHelpers.numbersOnly(fieldValue)), 2, false) + '%' : '';\n                                                    }\n                                                    break;\n                                            }\n\n                                            return fieldValue;\n                                        }\n                                    });\n                                }\n                            });\n                        }\n                        break;\n                }\n            }, this)\n        );\n\n        if (!includeAllColumns) {\n            columns.push({\n                columnData: \"punchlistItemId\",\n                data: \"attributes.punchlistItemId\",\n                title: \"\",\n                width: '80px',\n                orderable: false,\n                searchable: false,\n                className: 'text-align-center',\n                render: _.bind(function (data) {\n                    let html = '<div class=\"show-on-row-hover\"><button type=\"button\" data-punchlist-id=\"' + data + '\" class=\"btn btn-info btn-edit-punchlist-item\"><i class=\"fal fa-pencil\"></i></button>';\n                    if (this.options.isAdmin) {\n                        html += '<button type=\"button\" data-punchlist-id=\"' + data + '\" class=\"btn btn-danger btn-delete-punchlist-item ml-1\"><i class=\"fal fa-trash\"></i></button>';\n                    }\n                    html += '</div>';\n                    return html;\n                }, this)\n            });\n        }\n\n        return columns;\n    },\n    addClicked() {\n        let newItem = new PJQ.models.punchlists.PunchlistItem({\n            projectId: this.options.project ? this.options.project.id : null,\n            templateId: this.model != null ? this.model.get('templateId') : null\n        });\n        this.editPunchlistItem(newItem);\n    },\n    editClicked(e) {\n        let row = this.punchlistDataTable.getRow($(e.currentTarget).parents('tr'));\n        this.editPunchlistItem(row.data());\n    },\n    editPunchlistItem: function (item) {\n        let isNew = item.isNew();\n        let fnRenderEditor = _.bind(function () {\n            new PJQ.views.punchlists.PunchlistItemEditorModal({\n                model: item,\n                collection: this.collection,\n                project: this.options.project,\n                onSave: _.bind(function (item) {\n                    if (isNew) {\n                        this.punchlistDataTable.addRow(item);\n                        this.collection.add(item);\n                    }\n                    this.punchlistDataTable.refresh();\n                }, this),\n                onClose: _.bind(function (item) {\n                    if (item.hasChanged()) {\n                        item.restore();\n                    }\n                }, this),\n                onDelete: _.bind(function (item) {\n                    if (item.id > 0) {\n                        let row = this.punchlistDataTable.getRow(item.cid);\n                        if (row != null) {\n                            this.punchlistDataTable.removeRow(row);\n                        }\n                    }\n                    item.destroy();\n                }, this)\n            });\n        }, this)\n        if (!item.isNew()) {\n            item.fetch({\n                success: _.bind(function () {\n                    fnRenderEditor();\n                }, this)\n            });\n        } else {\n            fnRenderEditor();\n        }\n    },\n    deleteClicked(e) {\n        let row = this.punchlistDataTable.getRow($(e.currentTarget).parents('tr'));\n        this.deletePunchlistItem(row);\n    },\n    deletePunchlistItem: function (row) {\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Confirm Delete\",\n            body: \"Are you sure you want to delete this punch list item?\",\n            onDelete: _.bind(function () {\n                row.data().destroy();\n                this.punchlistDataTable.removeRow(row);\n            }, this)\n        });\n    },\n    exportList: function () {\n        if (this.options.project == null) {\n            return;\n        }\n\n        let filters = {},\n            primaryFilter = this.punchlistDataTable.getFilter('primary');\n        if (_.size(primaryFilter) > 0) {\n            let statusFilter = primaryFilter.status,\n                priorityFilter = primaryFilter.priority,\n                hasAssigned = _.contains(statusFilter, PJQ.constants.punchlists.statuses.ASSIGNED);\n\n            if (_.size(statusFilter) > 0) {\n                filters.statuses = statusFilter;\n            }\n\n            if (_.size(priorityFilter) > 0) {\n                filters.priority = priorityFilter;\n            }\n        }\n\n        let orderCookie = PJQ.helpers.cookieHelpers.getCookie(PJQ.constants.cookies.PUNCHLIST_ORDER_COOKIE),\n            order = orderCookie != null ? JSON.parse(orderCookie) : null,\n            report = new PJQ.models.reports.NewReport({\n                type: PJQ.constants.reports.reportTypes.PUNCH_LIST.type,\n                projectId: this.options.project ? this.options.project.id : null,\n                options: {\n                    filters: filters,\n                    columns: this.options.userSettings.getSettings(PJQ.constants.punchlists.view.PUNCHLISTS).columns,\n                    columnOrder: order\n                }\n            });\n        report.export({format: 'excel'}).then(() => {\n\n        });\n    },\n    exportDetailedList: function () {\n        if (this.options.project == null) {\n            return;\n        }\n\n        let params = [\n                {\n                    parameter: 'orderBy',\n                    value: this.punchlistDataTable.options.settings.orderBy\n                },\n                {\n                    parameter: 'orderAscending',\n                    value: this.punchlistDataTable.options.settings.orderAscending\n                }\n            ],\n            filterData = this.punchlistDataTable.getFilteredRowData();\n        if (_.size(filterData) < _.size(this.collection.models)) {\n            params.push(\n                {\n                    parameter: 'ids',\n                    value: _.map(filterData, function (item) {\n                        return item.id;\n                    })\n                }\n            );\n        }\n\n        let loader = new PJQ.Loader(this.$('.btn-export'), {\n            loadingText: \"\"\n        });\n        new PJQ.ajax.Request({\n            endpoint: PJQ.helpers.urlHelpers.generateEndpoint([\n                {\n                    endpoint: 'projects',\n                    value: this.options.project.id\n                },\n                {\n                    endpoint: 'punchlists',\n                },\n                {\n                    endpoint: 'export'\n                },\n                {\n                    endpoint: 'detailed'\n                }\n            ], params),\n            data: {\n                itemOrder: _.map(filterData, (item) => {\n                    return item.id\n                })\n            }\n        }).post().done(_.bind(function (response) {\n            PJQ.files.handleDownload(response);\n            loader.remove();\n        }, this)).fail(_.bind(function (xhr, err, result) {\n            loader.remove();\n        }, this));\n    },\n    viewPunchListSettings: function () {\n        new PJQ.views.punchlists.PunchListSettingsModal({\n            punchlistsView: this,\n            project: this.options.project,\n            userSettings: this.options.userSettings,\n            onSave: _.bind(function () {\n                this.renderDataTable();\n            }, this)\n        });\n    },\n    saveTemplate: function () {\n        new PJQ.views.punchlists.PunchlistTemplateCreatorModal({\n            collection: this.collection,\n            project: this.options.project\n        });\n    },\n    importTemplate: function () {\n        new PJQ.views.punchlists.ImportTemplateModal({\n            project: this.options.project,\n            onImport: _.bind(function (submittals) {\n                this.collection = submittals;\n                this.render();\n            }, this)\n        });\n    },\n});\n\nPJQ.views.punchlists.PunchlistItemEditorModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.PUNCHLISTS, 'Modal-Punchlist-Item-Editor'),\n        subTemplates: {\n            comments: new PJQ.templating.Template(PJQ.constants.modules.PUNCHLISTS, 'Punchlist-Item-Comments'),\n            contactBadge: new PJQ.templating.Template(PJQ.constants.modules.GLOBAL, 'Contacts-Select-Input-Contacts')\n        },\n        width: '90%',\n        maxWidth: 1200,\n        isShowCloseButton: true,\n        onSave: _.noop\n    },\n    events: {\n        'click .add-comment': 'addComment',\n        'click .item-cancel': 'cancel',\n        'click .edit-history': 'viewEditHistory',\n        'click .btn-notification-history': 'viewNotificationHistory',\n        'click .btn-export': 'exportPDF',\n        'click .item-status-not-resolved': 'markNotResolved',\n        'click .item-status-work-completed': 'markWorkCompleted',\n        'click .item-status-resolved': 'markResolved',\n        'click .punchlist-save': 'save',\n        'click .punchlist-close': 'close',\n        'click .punchlist-delete': 'onDelete',\n        'click .delete-comment': 'deleteComment',\n        'click .btn-distribute': 'distribute'\n    },\n    beforeModalCreated: async function () {\n        this.isFetched = false;\n\n        this.preferences = this.options.project ? this.options.project.preferences : PJQ.app.session.preferences;\n        this.changedAnnotations = new PJQ.collections.drawings.Annotations();\n\n        if (this.options.project != null) {\n            this.options.customFields = await this.options.project.fetchPunchListCustomFields();\n        } else {\n            this.options.customFields = await PJQ.app.session.fetchPunchListCustomFields();\n        }\n\n        if (!this.model.isNew() && !this.model.isFetched) {\n            await this.model.fetch();\n        }\n\n        this.isFetched = true;\n        this.render();\n    },\n    beforeRender: function () {\n        this.options.canEdit = true;\n        this.options.canUpload = true;\n        this.options.isAdmin = true;\n\n        let isAssignee = this.model.get('isAssignee') || (this.model.assignedTo != null && (PJQ.app.session.contact != null && this.model.assignedTo.id === PJQ.app.session.contact.id || PJQ.app.session.user != null && this.model.assignedTo.id === PJQ.app.session.user.get('id')));\n        if (this.options.project != null) {\n            this.options.canEdit = this.model.isNew() || this.options.project.hasPermission('punchList.isAdmin') && this.model.get('status') !== PJQ.constants.punchlists.statuses.RESOLVED;\n            this.options.canUpload = this.options.canEdit || isAssignee;\n            this.options.isAdmin = PJQ.app.session.user != null && this.options.project.get('masterUserId') === PJQ.app.session.user.get('masterUserId') && this.options.project.hasPermission('punchList.isAdmin');\n        }\n    },\n    renderData: function () {\n        return {\n            canEdit: this.options.canEdit,\n            canUpload: this.options.canUpload,\n            isAdmin: this.options.isAdmin,\n            model: this.model,\n            preferences: this.preferences\n        };\n    },\n    afterRender: function () {\n        if (!this.isFetched) {\n            return;\n        }\n\n        this.isSaving = false;\n        if (this.options.canEdit) {\n            new PJQ.Binder(this.$el, this.model, {\n                watchElements: [\n                    'input',\n                    'textarea'\n                ]\n            });\n        }\n\n        new PJQ.inputs.Datepicker({\n            el: this.$('.punch-list-due-date'),\n            datepickerOptions: {\n                format: PJQ.helpers.dateHelpers.dateFormats.datePicker.DATE,\n                defaultDate: this.model.get('dueDate')\n            },\n            onChange: _.bind(function (newDate) {\n                let currentDueDate = this.model.get('dueDate');\n                if (currentDueDate == null || PJQ.helpers.dateHelpers.getDateDaysDiff(newDate, new Date(currentDueDate)) !== 0) {\n                    this.model.set('dueDate', newDate);\n                }\n            }, this)\n        });\n\n        new PJQ.inputs.Selectpicker({\n            el: this.$('.punch-list-priority'),\n            isIntChoices: true,\n            onChange: _.bind(function (value) {\n                this.model.set('priority', value);\n            }, this),\n            defaultValue: this.model.get('priority')\n        });\n\n        if (this.options.canEdit) {\n            new PJQ.inputs.AutocompleteInput({\n                el: this.$('input.item-category'),\n                source: this.collection == null ? [] : _.map(_.filter(this.collection.models, _.bind(function (item) {\n                    return _.size(item.get('category')) > 0 && item.id !== this.model.id;\n                }, this)), function (item) {\n                    return item.get('category');\n                })\n            });\n        }\n\n        if (this.preferences.hasPref(PJQ.constants.preferenceTypes.ENABLE_PROJECT_LOCATIONS)) {\n            new PJQ.inputs.ProjectLocationPicker({\n                el: this.$('.select-location'),\n                project: this.options.project,\n                canEdit: this.options.canEdit,\n                onChange: _.bind(function (value) {\n                    this.model.set('locationId', value);\n                }, this),\n                defaultValue: this.model.get('locationId')\n            });\n        } else {\n            new PJQ.inputs.AutocompleteInput({\n                el: this.$('input.item-location'),\n                source: this.collection == null ? [] : _.map(_.filter(this.collection.models, _.bind(function (item) {\n                    return _.size(item.get('location')) > 0 && item.id !== this.model.id;\n                }, this)), function (item) {\n                    return item.get('location');\n                })\n            });\n        }\n\n        this.renderBallInCourt();\n\n        this.renderCustomFields();\n\n        new PJQ.views.contacts.ContactsSelectInput({\n            el: this.$('.punchlist-assigned'),\n            context: PJQ.constants.contacts.contexts.PROJECTCONTACTS,\n            selectedContact: this.model.assignedTo,\n            isSingleChoice: true,\n            isReadOnly: !this.options.canEdit || !this.options.isAdmin,\n            onChange: _.bind(function (selectedContact) {\n                this.model.assignedTo = selectedContact;\n                this.renderBallInCourt();\n                this.renderStatus();\n            }, this)\n        });\n\n        if (this.options.isAdmin) {\n            new PJQ.views.contacts.ContactsSelectInput({\n                el: this.$('.punch-list-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        this.groupListInput = new PJQ.views.groups.GroupsSelectInput({\n            el: this.$('.punchlist-groups'),\n            isShowAddButton: false,\n            addButton: this.$('.btn-edit-groups'),\n            groupLevels: this.preferences.getPref(PJQ.constants.preferenceTypes.GROUP_LEVELS),\n            groupUserId: this.options.project ? this.options.project.get('masterUserId') : null,\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        this.fileUploader = new PJQ.views.files.FileUploaderGrid({\n            el: this.$('.punchlist-file-uploader'),\n            context: 'punchlist',\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            includeProjectAttachments: true,\n            previewImageDimension: 150,\n            // includeProjectAttachments: true,\n            canUpload: this.options.canUpload,\n            canDelete: this.options.canEdit && this.options.isAdmin,\n            onDelete: _.bind(function (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            }, this)\n        });\n\n        this.beforeUploader = new PJQ.views.files.FileUploaderGrid({\n            el: this.$('.punchlist-before-file-uploader'),\n            context: 'punchlist',\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.beforeAttachments,\n            includeProjectAttachments: true,\n            offsetTopText: true,\n            previewImageDimension: 150,\n            // includeProjectAttachments: true,\n            canUpload: this.options.canUpload,\n            canDelete: this.options.canEdit && this.options.isAdmin,\n            onDelete: _.bind(function (attachment, callback) {\n                if (attachment.id > 0) {\n                    attachment.set('isDeleted', true);\n                } else {\n                    attachment.destroy();\n                }\n                this.model.isDirty = true;\n                callback();\n            }, this)\n        });\n\n        this.afterUploader = new PJQ.views.files.FileUploaderGrid({\n            el: this.$('.punchlist-after-file-uploader'),\n            context: 'punchlist',\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.afterAttachments,\n            includeProjectAttachments: true,\n            offsetTopText: true,\n            previewImageDimension: 150,\n            // includeProjectAttachments: true,\n            canUpload: this.options.canUpload,\n            canDelete: this.options.canEdit && this.options.isAdmin,\n            onDelete: _.bind(function (attachment, callback) {\n                if (attachment.id > 0) {\n                    attachment.set('isDeleted', true);\n                } else {\n                    attachment.destroy();\n                }\n                this.model.isDirty = true;\n                callback();\n            }, this)\n        });\n\n        this.renderComments();\n    },\n    renderStatus: function () {\n        this.$('.punch-list-status').css('background-color', this.model.getStatusColor());\n        this.$('.punch-list-status-name').html(this.model.getStatusName());\n    },\n    renderBallInCourt: function () {\n        let $ballInCourt = this.$('.punch-list-ball-in-court');\n        if ((this.model.get('status') === PJQ.constants.punchlists.statuses.NEW || this.model.get('status') === PJQ.constants.punchlists.statuses.NOT_RESOLVED) && this.model.assignedTo != null) {\n            this.renderSubTemplate(false, this.options.subTemplates.contactBadge, $ballInCourt,\n                {\n                    models: [this.model.assignedTo],\n                    isReadOnly: true,\n                    canEdit: false,\n                    canView: false\n                });\n        } else if (this.model.get('status') === PJQ.constants.punchlists.statuses.WORK_COMPLETED) {\n            $ballInCourt.html('<div class=\"text-muted font-weight-light mt-1\">Project Managers</div>');\n        } else {\n            new PJQ.Alert($ballInCourt, {\n                type: 'warning',\n                text: 'The ball in court will set automatically'\n            });\n        }\n    },\n    renderCustomFields: function () {\n        this.customFieldsForm = new PJQ.views.customFields.CustomFieldsForm({\n            el: this.$('.punchlist-custom-fields'),\n            collection: this.options.customFields,\n            fieldValues: this.model.get('customFieldValues'),\n            isEdit: this.options.canEdit\n        });\n    },\n    distribute: function () {\n        new PJQ.views.modals.YesNo({\n            header: \"Distribute Punch List Item?\",\n            body: 'Are you sure you want to distribute this punch list item?',\n            onYes: () => {\n                this.model.distribute(() => {\n                    PJQ.notifications.notify.successNotify({\n                        message: \"Punch List Item successfully distributed\"\n                    });\n                    this.render();\n                });\n            }\n        });\n    },\n    exportPDF: function () {\n        let loader = new PJQ.Loader(this.$('.btn-export'), {\n            loadingText: \"\"\n        });\n        new PJQ.ajax.Request({\n            endpoint: PJQ.helpers.urlHelpers.generateEndpoint([\n                {\n                    endpoint: 'projects',\n                    value: PJQ.app.session.project.id\n                },\n                {\n                    endpoint: 'punchlists',\n                    value: this.model.id\n                },\n                {\n                    endpoint: 'export'\n                },\n                {\n                    endpoint: 'pdf'\n                }\n            ])\n        }).get().done(_.bind(function (response) {\n            PJQ.files.handleDownload(response);\n            loader.remove();\n        }, this)).fail(_.bind(function (xhr, err, result) {\n            loader.remove();\n        }, this));\n    },\n    addComment: function () {\n        let val = this.$('.item-new-comment').val().trim();\n        if (_.size(val) === 0)\n            return;\n\n        let comment = new PJQ.models.punchlists.PunchlistItemComment({\n            punchlistItemId: this.model.id,\n            commentText: val,\n            createdOn: new Date()\n        });\n        if (!this.model.isNew()) {\n            comment.save(null, {\n                success: _.bind(function () {\n                    this.model.comments.add(comment);\n                    this.renderComments();\n                }, this)\n            });\n        } else {\n            comment.createdBy = PJQ.app.session.user;\n            this.model.comments.add(comment);\n            this.renderComments();\n        }\n\n        this.$('.item-new-comment').val('');\n    },\n    renderComments: function () {\n        this.renderSubTemplate(false, this.options.subTemplates.comments, this.$('.item-comments'), {\n            comments: this.model.comments.models,\n            canDelete: PJQ.app.session.hasPermission('punchList.isAdmin') || (this.options.project && this.options.project.hasPermission('punchList.isAdmin'))\n        });\n    },\n    deleteComment: function (e) {\n        let cid = $(e.currentTarget).data('cid'), commentId = $(e.currentTarget).data('commentId'),\n            card = $(e.currentTarget).closest('div.card');\n        new PJQ.views.BaseModal({\n            header: \"Confirm Delete Comment\",\n            body: \"Are you sure you want to delete this comment?\",\n            isShowCancelButton: true,\n            okButtonText: \"Confirm\",\n            onOk: _.bind(function () {\n                let comments = _.filter(this.model.comments.models, _.bind(function (comment, i) {\n                    return (comment.cid === cid);\n                }, this));\n\n                if (_.size(comments) > 0) {\n                    comments[0].set('deletedOn', new Date());\n                    if (!comments[0].isNew()) {\n                        comments[0].destroy();\n                    }\n                }\n\n                _.each(this.model.get('comments'), _.bind(function (comment, i) {\n                    if (comment.commentId === commentId) {\n                        this.model.get('comments')[i].deletedOn = new Date();\n                    }\n                }, this));\n\n                card.hide();\n            }, this)\n        });\n    },\n    markNotResolved: function () {\n        new PJQ.views.BaseModal({\n            header: \"Confirm Status Change\",\n            body: \"Are you sure you want to mark this Punch List Item as <span class='text-danger'>Not Resolved</span>?\",\n            isShowCancelButton: true,\n            okButtonText: \"Confirm\",\n            onOk: _.bind(function () {\n                this.model.set('status', PJQ.constants.punchlists.statuses.NOT_RESOLVED);\n                this.save();\n            }, this)\n        });\n    },\n    markWorkCompleted: function () {\n        let workCompleteOverride = this.preferences.getPref(PJQ.constants.preferenceTypes.PUNCH_LIST_WORK_COMPLETED_STATUS_OVERRIDE);\n        new PJQ.views.BaseModal({\n            header: \"Confirm Status Change\",\n            body: \"Are you sure you want to mark this Punch List Item as <span class='text-primary'>\" + (workCompleteOverride ? workCompleteOverride : \"Work Completed\") + \"</span>?\",\n            isShowCancelButton: true,\n            okButtonText: \"Confirm\",\n            onOk: _.bind(function () {\n                this.model.set('status', PJQ.constants.punchlists.statuses.WORK_COMPLETED);\n                this.save();\n            }, this)\n        });\n    },\n    markResolved: function () {\n        new PJQ.views.BaseModal({\n            header: \"Confirm Status Change\",\n            body: \"Are you sure you want to mark this Punch List Item as <span class='text-success'>Resolved</span>?\",\n            isShowCancelButton: true,\n            okButtonText: \"Confirm\",\n            onOk: _.bind(function () {\n                this.model.set('status', PJQ.constants.punchlists.statuses.RESOLVED);\n                this.save();\n            }, this)\n        });\n    },\n    validate: function () {\n        let isValid = true;\n\n        PJQ.helpers.inputHelpers.setInputError(this.$('.item-title'), true);\n        if (_.size(this.$('.item-title').val()) === 0) {\n            isValid = false;\n            PJQ.helpers.inputHelpers.setInputError(this.$('.item-title'), false);\n        }\n\n        isValid = isValid && this.customFieldsForm.validate();\n\n        // display/clear banner on top of page\n        if (!isValid) {\n            new PJQ.Alert(this.$('.validation-error'), {\n                type: 'danger',\n                text: 'Required fields are empty'\n            });\n\n            window.scrollTo(0, 0);\n        } else {\n            this.$('.validation-error').empty();\n        }\n\n        return isValid;\n    },\n    viewEditHistory: function () {\n        new PJQ.views.punchlists.EditHistoryModal({\n            collection: this.model.editHistory\n        });\n    },\n    viewNotificationHistory: function () {\n        this.model.fetchNotifications(function (notifications) {\n            new PJQ.views.notifications.NotificationHistory({\n                collection: notifications\n            });\n        })\n    },\n    save: function () {\n        if (this.isSaving) {\n            return;\n        }\n        this.isSaving = true;\n\n        this.model.set('groups', this.groupListInput.selectedGroups);\n        if (!this.validate()) {\n            this.isSaving = false;\n            return;\n        }\n\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            this.isSaving = false;\n            return;\n        }\n\n        let fnSaveAnnotations = (callback) => {\n                if (_.size(this.changedAnnotations.models) === 0) {\n                    callback();\n                    return;\n                }\n\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.isAdmin) {\n                        this.model.set('isRead', true);\n                    }\n                    callback();\n                });\n            },\n            isNew = this.model.isNew();\n        if (this.model.hasChanged() || isNew) {\n            this.model.save(null, {\n                notify: true,\n                success: () => {\n                    fnSaveAnnotations(() => {\n                        if (typeof this.options.onSave === 'function') {\n                            this.options.onSave(this.model);\n                        }\n\n                        this.removeModal();\n                    });\n                }\n            });\n        } else {\n            fnSaveAnnotations(() => {\n                if (typeof this.options.onSave === 'function') {\n                    this.options.onSave(this.model);\n                }\n\n                PJQ.notifications.notify.successNotify({\n                    message: \"Punch List Item Saved Successfully\"\n                });\n\n                this.removeModal();\n            });\n        }\n    },\n    close: function () {\n        if (this.options.canEdit && 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.onClose(this.model);\n                    this.removeModal();\n                }, this)\n            });\n        } else {\n            this.onClose(this.model);\n            this.removeModal();\n        }\n    },\n    onDelete: function () {\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Confirm Deletion\",\n            body: \"Are you sure you want to delete this punch list item?\",\n            onDelete: _.bind(function () {\n                if (this.options.onDelete) {\n                    this.options.onDelete(this.model);\n                }\n                this.removeModal();\n            }, this)\n        });\n    }\n});\n\nPJQ.views.punchlists.EditHistoryModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.PUNCHLISTS, 'Modal-Punchlist-History'),\n        minWidth: 700\n    },\n    afterRender: function () {\n        this.$('.modal-header span').text(this.options.context + ' History');\n\n        let columns = [\n            {data: \"createdOnDisplay\", title: \"Changed\"},\n            {data: \"createdByDisplay\", title: \"Changed By\"},\n            {data: \"attributes.fieldNameDisplay\", title: \"Field Name\"},\n            {data: \"oldValueDisplay\", title: \"Old Value\"},\n            {data: \"newValueDisplay\", title: \"New Value\"}\n        ];\n\n        this.dataTable = this.$('.history-table').DataTable({\n            data: this.collection.models,\n            language: {\n                zeroRecords: \"No history found\"\n            },\n            columns: columns,\n            dom: '<\"top\"p>rt<\"bottom\"p><\"clear\">'\n        });\n    },\n    events: {\n        \"click .history-close\": \"close\"\n    },\n    close: function () {\n        this.removeModal();\n    }\n});\n","PJQ.views.punchlists.PunchListSettingsModal = PJQ.views.BaseModal.extend({\n\tdefaults: {\n\t\ttemplate: new PJQ.templating.Template(PJQ.constants.modules.PUNCHLISTS, 'Modal-Punch-List-Settings'),\n\t\tsubTemplates: {},\n\t\tmaxWidth: 500,\n\t\tonSave: _.noop\n\t},\n\tevents: {\n\t\t'change .select-column': 'columnSelected',\n\t\t'click .settings-save': 'onSave',\n\t\t'click .btn-delete-punch-lists': 'deleteItems'\n\t},\n\tafterModalCreated: function () {\n\t\tnew PJQ.Loader(this.$('.modal-body'));\n\t\tPJQ.app.session.project.fetchProjectContacts(_.bind(function(projectContacts){\n\t\t\tthis.projectContacts = projectContacts;\n\t\t\tPJQ.app.session.project.fetchPunchListSettings(_.bind(function (settings) {\n\t\t\t\tthis.model = settings;\n\t\t\t\tthis.render();\n\t\t\t}, this));\n\t\t}, this))\n\t},\n\tbeforeRender: function () {\n\t\tthis.renderData = {\n\t\t\tmodel: this.model,\n\t\t\tproject: this.options.project\n\t\t};\n\t},\n\tafterRender: function () {\n\t\tif(this.model){\n\t\t\tnew PJQ.views.contacts.ContactsSelectInput({\n\t\t\t\tel: this.$('.punch-list-creators'),\n\t\t\t\tcontacts: this.projectContacts,\n\t\t\t\tselectedContact: this.model.projectContacts.filter(function(projectContact){\n\t\t\t\t\treturn projectContact.get('canAdd');\n\t\t\t\t}),\n\t\t\t\tisSingleChoice: false,\n\t\t\t\tonAdd: _.bind(function (contacts) {\n\t\t\t\t\tthis.updateProjectContactsSetting(contacts, 'canAdd', true);\n\t\t\t\t}, this),\n\t\t\t\tonDelete: _.bind(function (contact) {\n\t\t\t\t\tthis.updateProjectContactsSetting(contact, 'canAdd', false);\n\t\t\t\t}, this)\n\t\t\t});\n\n\t\t\tnew PJQ.views.contacts.ContactsSelectInput({\n\t\t\t\tel: this.$('.punch-list-notify-created'),\n\t\t\t\tcontacts: this.projectContacts,\n\t\t\t\tselectedContact: this.model.projectContacts.filter(function(projectContact){\n\t\t\t\t\treturn projectContact.get('notifyAdded');\n\t\t\t\t}),\n\t\t\t\tisSingleChoice: false,\n\t\t\t\tonAdd: _.bind(function (contacts) {\n\t\t\t\t\tthis.updateProjectContactsSetting(contacts, 'notifyAdded', true);\n\t\t\t\t}, this),\n\t\t\t\tonDelete: _.bind(function (contact) {\n\t\t\t\t\tthis.updateProjectContactsSetting(contact, 'notifyAdded', false);\n\t\t\t\t}, this)\n\t\t\t});\n\n\t\t\tnew PJQ.views.contacts.ContactsSelectInput({\n\t\t\t\tel: this.$('.punch-list-notify-comment'),\n\t\t\t\tcontacts: this.projectContacts,\n\t\t\t\tselectedContact: this.model.projectContacts.filter(function(projectContact){\n\t\t\t\t\treturn projectContact.get('notifyComment');\n\t\t\t\t}),\n\t\t\t\tisSingleChoice: false,\n\t\t\t\tonAdd: _.bind(function (contacts) {\n\t\t\t\t\tthis.updateProjectContactsSetting(contacts, 'notifyComment', true);\n\t\t\t\t}, this),\n\t\t\t\tonDelete: _.bind(function (contact) {\n\t\t\t\t\tthis.updateProjectContactsSetting(contact, 'notifyComment', false);\n\t\t\t\t}, this)\n\t\t\t});\n\n\n\t\t\tnew PJQ.views.contacts.ContactsSelectInput({\n\t\t\t\tel: this.$('.punch-list-notify-work-completed'),\n\t\t\t\tcontacts: this.projectContacts,\n\t\t\t\tselectedContact: this.model.projectContacts.filter(function(projectContact){\n\t\t\t\t\treturn projectContact.get('notifyWorkCompleted');\n\t\t\t\t}),\n\t\t\t\tisSingleChoice: false,\n\t\t\t\tonAdd: _.bind(function (contacts) {\n\t\t\t\t\tthis.updateProjectContactsSetting(contacts, 'notifyWorkCompleted', true);\n\t\t\t\t}, this),\n\t\t\t\tonDelete: _.bind(function (contact) {\n\t\t\t\t\tthis.updateProjectContactsSetting(contact, 'notifyWorkCompleted', false);\n\t\t\t\t}, this)\n\t\t\t});\n\n\t\t\tnew PJQ.views.contacts.ContactsSelectInput({\n\t\t\t\tel: this.$('.punch-list-notify-not-resolved'),\n\t\t\t\tcontacts: this.projectContacts,\n\t\t\t\tselectedContact: this.model.projectContacts.filter(function(projectContact){\n\t\t\t\t\treturn projectContact.get('notifyNotResolved');\n\t\t\t\t}),\n\t\t\t\tisSingleChoice: false,\n\t\t\t\tonAdd: _.bind(function (contacts) {\n\t\t\t\t\tthis.updateProjectContactsSetting(contacts, 'notifyNotResolved', true);\n\t\t\t\t}, this),\n\t\t\t\tonDelete: _.bind(function (contact) {\n\t\t\t\t\tthis.updateProjectContactsSetting(contact, 'notifyNotResolved', false);\n\t\t\t\t}, this)\n\t\t\t});\n\n\t\t\tnew PJQ.views.contacts.ContactsSelectInput({\n\t\t\t\tel: this.$('.punch-list-notify-resolved'),\n\t\t\t\tcontacts: this.projectContacts,\n\t\t\t\tselectedContact: this.model.projectContacts.filter(function(projectContact){\n\t\t\t\t\treturn projectContact.get('notifyResolved');\n\t\t\t\t}),\n\t\t\t\tisSingleChoice: false,\n\t\t\t\tonAdd: _.bind(function (contacts) {\n\t\t\t\t\tthis.updateProjectContactsSetting(contacts, 'notifyResolved', true);\n\t\t\t\t}, this),\n\t\t\t\tonDelete: _.bind(function (contact) {\n\t\t\t\t\tthis.updateProjectContactsSetting(contact, 'notifyResolved', false);\n\t\t\t\t}, this)\n\t\t\t});\n\n\t\t\tthis.rowsPerPageSelectPicker = new PJQ.inputs.Selectpicker({\n\t\t\t\tel: this.$('.rows-per-page'),\n\t\t\t\tdefaultValue: this.options.userSettings.getSettings(PJQ.constants.punchlists.view.PUNCHLISTS).rowsPerPage,\n\t\t\t\tonChange: _.bind(function (value) {\n\t\t\t\t\tthis.onChange();\n\t\t\t\t}, this)\n\t\t\t});\n\n\t\t\tthis.dataTable = new PJQ.views.dataTables.DataTable({\n\t\t\t\tel: this.$('div.column-settings'),\n\t\t\t\tdata: this.options.punchlistsView.getColumns(true),\n\t\t\t\tisHideSearch: true,\n\t\t\t\torder: [],\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\"data\": \"title\", \"title\": \"Column\", \"orderable\": false},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"data\": \"visible\",\n\t\t\t\t\t\t\"title\": \"Show\",\n\t\t\t\t\t\t\"orderable\": false,\n\t\t\t\t\t\t\"searchable\": false,\n\t\t\t\t\t\t\"render\": _.bind(function (data) {\n\t\t\t\t\t\t\treturn ('<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>');\n\t\t\t\t\t\t}, this),\n\t\t\t\t\t\t\"width\": '10%'\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tdom: '<\"top\"<\"clear\">>rt<\"bottom\"p<\"clear\">>'\n\t\t\t});\n\n\t\t}\n\t},\n\tdeleteItems: function() {\n\t\tnew PJQ.views.modals.DeleteCancel({\n\t\t\theader: \"Confirm Deletion\",\n\t\t\tbody: \"Are you sure you want to delete all punch list items on this project?\",\n\t\t\tonDelete: _.bind(function () {\n\t\t\t\tthis.options.project.deleteAllPunchLists(_.bind(function () {\n\t\t\t\t\tthis.options.punchlistsView.collection.remove(this.options.punchlistsView.collection.models);\n\t\t\t\t\tif (typeof this.options.onSave === 'function') {\n\t\t\t\t\t\tthis.options.onSave(this.model);\n\t\t\t\t\t}\n\t\t\t\t\tthis.removeModal();\n\t\t\t\t}, this));\n\t\t\t}, this)\n\t\t});\n\t},\n\tcolumnSelected: function (sender) {\n\t\tthis.dataTable.dataTable.row($(sender.currentTarget).closest('tr')).data().visible = $(sender.currentTarget).prop('checked');\n\t},\n\tupdateProjectContactsSetting: function(contacts, setting, value){\n\t\tcontacts = PJQ.helpers.objectHelpers.refinedType(contacts) === 'array' ? contacts : [contacts];\n\t\t_.each(contacts, _.bind(function(contact){\n\t\t\tlet existingSetting = this.model.projectContacts.findWhere({ id: contact.id });\n\t\t\tif(existingSetting != null){\n\t\t\t\texistingSetting.set(setting, value);\n\t\t\t}\n\t\t\telse{\n\t\t\t\tlet newSetting = new PJQ.models.punchlists.ProjectContactSetting(contact.attributes);\n\t\t\t\tnewSetting.set(setting, value);\n\t\t\t\tthis.model.projectContacts.add(newSetting);\n\t\t\t}\n\t\t}, this));\n\t},\n\tonSave: function () {\n\t\tlet loader = new PJQ.Loader(this.$('.modal-content'));\n\n\t\tthis.options.punchlistsView.options.userSettings.getSettings(PJQ.constants.punchlists.view.PUNCHLISTS).rowsPerPage = parseInt(this.rowsPerPageSelectPicker.getValue());\n\t\tlet columns = this.options.punchlistsView.options.userSettings.getSettings(PJQ.constants.punchlists.view.PUNCHLISTS).columns;\n\t\t_.each(this.dataTable.dataTable.data(), function (row) {\n\t\t\tif (row.visible) {\n\t\t\t\tif (columns.indexOf(row.columnData) === -1)\n\t\t\t\t\tcolumns.push(row.columnData);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcolumns = _.filter(columns, function(column) {\n\t\t\t\t\treturn (column != row.columnData);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tthis.options.punchlistsView.options.userSettings.getSettings(PJQ.constants.punchlists.view.PUNCHLISTS).columns = columns;\n\n\t\tthis.options.punchlistsView.options.userSettings.save(null, {\n\t\t\tsuccess: _.bind(function() {\n\t\t\t\tthis.model.put(null, {\n\t\t\t\t\tsuccess: _.bind(function () {\n\t\t\t\t\t\tthis.options.onSave();\n\t\t\t\t\t\tthis.removeModal();\n\t\t\t\t\t}, this),\n\t\t\t\t\terror: function () {\n\t\t\t\t\t\tloader.remove();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}, this)\n\t\t});\n\t}\n});","PJQ.views.punchlists.PunchlistTemplateCreatorModal = PJQ.views.BaseModal.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.PUNCHLISTS, '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.punchlists.Template({\r\n            projectId: this.options.project.id\r\n        });\r\n\r\n        this.options.project.fetchPunchlistTemplates(_.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            punchlists: 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-punchlist'),\r\n                isMultiple: true,\r\n                noneSelectedText: 'Select Punchlist #',\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                    copyAssignee: this.$('.input-copy-assignee').prop('checked'),\r\n                    copyGroups: this.$('.input-copy-trades').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: 'Punchlist 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.punchlists.ImportTemplateModal = PJQ.views.BaseModal.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.PUNCHLISTS, '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.fetchPunchlistTemplates(_.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: 'punchlists'\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: 'importAssignee',\r\n                    value: this.$('.input-import-assignee').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: 'importAttachments',\r\n                    value: this.$('.input-import-attachments').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.punchlists.PunchlistItems(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: 'Punchlist Template Imported'\r\n            });\r\n        }, this));\r\n    }\r\n});\r\n\r\nPJQ.views.punchlists.EditTemplateModal = PJQ.views.BaseModal.extend({\r\n    defaults: {\r\n        template: new PJQ.templating.Template(PJQ.constants.modules.PUNCHLISTS, '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.punchlists.PunchlistView({\r\n                el: this.$('.manage-template'),\r\n                model: this.model,\r\n                collection: this.model.punchlistItems\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.punchlists.TemplateManagement = PJQ.views.templates.TemplateManagement.extend({\r\n    beforeFirstRender: function () {\r\n        this.collection = new PJQ.collections.punchlists.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.punchlists.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.punchlists.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"]}