{"version":3,"sources":["1initializers.js","rfimodels.js","rfiviews.js","settingsviews.js"],"names":["PJQ","collections","rfi","models","views","modules","routes","route","name","callback","projectId","projectWall","initProjectNavigator","parseInt","rfiId","app","addRoutes","RFI","BaseModel","extend","notifyName","idAttribute","endpoint","urlOptions","arr","this","isNew","value","get","id","params","noNotify","push","parameter","draft","helpers","urlHelpers","generateEndpoint","parse","model","groups","Groups","createdBy","projectContacts","ProjectContact","requestedBy","assigneeList","ProjectContacts","distributionList","ballInCourt","responses","Responses","attachments","Attachments","customFieldValues","fetchNotifications","notifications","Notifications","fetch","success","_","bind","getStatusColor","set","constants","statuses","DRAFT","statusColors","getStatusName","statusNames","checkIsAssignee","user","checkIsDistribution","beforeSave","toJSON","getChangedModels","open","arguments","length","undefined","save","status","OPEN","notify","successNotify","message","error","close","CLOSED","Settings","defaults","type","project","UserSettings","options","forCompany","getSettings","view","find","attributes","viewSettings","setting","Notification","notificationTypeNames","collection","Attachment","files","File","CustomField","customFields","Response","accept","isAccepted","RFIS","BaseCollection","Files","CustomFields","masterUserId","session","RFIManagement","BaseView","template","templating","Template","events","click .btn-export-summary","click .btn-export-detailed","click .btn-rfi-settings","click .btn-add-rfi","click .btn-edit-rfi","click .btn-delete-rfi","beforeFirstRender","isAdmin","hasPermission","isFetched","preferences","userSettings","fnFetch","fnRender","fetchRFIs","rfis","render","fetchRFICustomFields","hasPref","preferenceTypes","ENABLE_PROJECT_LOCATIONS","fetchLocations","locations","renderData","settings","afterRender","editRFI","renderDataTable","self","rfiDataTable","dataTables","DataTable","el","$","rowId","pageLength","rowsPerPage","data","onPageSizeChange","language","emptyTable","zeroRecords","rowCallback","row","addClass","removeClass","subTemplates","header","headerData","afterHeaderRender","$header","inputs","Selectpicker","onChange","setFilter","isIntChoices","isMultiple","noneSelectedText","locationFilterPicker","ProjectLocationPicker","getFilterData","result","locationFilter","getFilter","size","filter","contains","statusFilter","order","deferRender","onRowDoubleClick","selectedRFI","contextMenuOptions","actions","onClick","isDanger","isShown","deleteRFI","columns","getColumns","colReorder","fixedColumnsLeft","fixedColumnsRight","realtime","columnOrderChanged","includeAllColumns","includeColumns","columnData","title","width","orderData","searchable","defaultContent","each","column","sort","number","isNaN","display","visible","indexOf","location","getFullName","group","join","contact","contacts","getContactAnchor","itemDueDate","Date","dateString","dateHelpers","getDateString","dateFormats","DATE","overdueDays","getDateDaysDiff","toString","orderable","className","html","addRFI","newRFI","editRFIClicked","e","getRow","currentTarget","parents","EditRFIModal","onClose","refresh","onSave","add","addRow","onDelete","cid","removeRow","destroy","deleteRFIClicked","modals","DeleteCancel","body","exportSummary","exportList","exportDetailed","loader","Loader","loadingText","map","getFilteredRowData","getTimezoneOffset","ajax","Request","isAPI2","done","response","downloadFile","url","isEndpoint","remove","fail","xhr","err","errorNotify","viewRFISettings","RFISettingsModal","rfiView","BaseModal","contactBadge","GLOBAL","maxWidth","isShowCloseButton","noop","click .add-response","click .edit-history","click .btn-notification-history","click .btn-export","click .btn-save","click .btn-save-open","click .btn-save-draft","click .btn-close","click .rfi-delete","click .btn-rfi-open","click .btn-rfi-close","click .btn-accept-response","click .btn-un-accept-response","click .btn-download-all-attachments","beforeModalCreated","isPublic","RFI_DEFAULT_PUBLIC","shouldNotifyProjectContacts","RFI_DEFAULT_NOTIFY_PROJECT_CONTACTS","shouldNotifyParticipants","RFI_DEFAULT_NOTIFY_PARTICIPANTS","changedAnnotations","drawings","Annotations","beforeRender","etcPerms","canAddComment","canAddAttachment","canEdit","_this","Binder","$el","watchElements","afterChange","$e","attr","val","$ph","prop","Datepicker","datepickerOptions","format","datePicker","defaultDate","newDate","currentDueDate","defaultValue","AutocompleteInput","source","item","ballInCourtInput","ContactsSelectInput","Contacts","union","selectedContact","isSingleChoice","isReadOnly","selectedContacts","reset","isDirty","context","contexts","PARTICIPANTS","PROJECTCONTACTS","refreshBallInCourtInput","renderCustomFields","renderStatus","GroupsSelectInput","isShowAddButton","groupLevels","getPref","GROUP_LEVELS","groupUserId","addButton","selectedGroups","onAfterSave","fileUploader","FileUploaderGrid","contextId","canAddAnnotations","onAnnotationChange","annotation","merge","mergeAnnotations","canUpload","canDelete","includeProjectAttachments","previewImageDimension","onSuccess","attachment","renderResponses","customFieldsForm","CustomFieldsForm","fieldValues","isEdit","css","statusActions","exportPDF","addResponseClicked","addResponse","trim","responseText","createdOn","renderAcceptedResponses","acceptedResponses","$responses","renderSubTemplate","validate","isValid","inputHelpers","setInputError","empty","Alert","text","window","scrollTo","viewEditHistory","punchlists","EditHistoryModal","editHistory","viewNotificationHistory","NotificationHistory","unAcceptResponse","closest","acceptResponse","checkNotify","modalBody","YesNo","onYes","onNo","openRFI","closeRFI","checkActiveResponse","aRes","saveDraftClicked","saveAndOpenClicked","saveClicked","_this2","isUploading","hasChanged","saveAll","removeModal","SaveDontSave","onDontSave","delete","downloadAllAttachments","downloadAttachments","entryId","guid","AttachmentManagement","click .rfi-attachment","file","attachmentClicked","selectedAttachment","viewAttachment","renderPhotoViewer","RFISettings","change .select-column","click .settings-save","listenTo","tooltip","rowsPerPageSelectPicker","dataTable","isHideSearch","dom","columnSelected","sender","fetchRFISettings","settingsView","getValue","put"],"mappings":"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","file":"app.js","sourcesContent":["PJQ.collections.rfi = {};\n\nPJQ.models.rfi = {};\n\nPJQ.views.rfi = {};\n\nPJQ.modules.rfi = {\n\troutes: [\n\t\t{\n\t\t\troute: 'projects/:projectId/rfi',\n\t\t\tname: 'rfiList',\n\t\t\tcallback: function (projectId) {\n\t\t\t\tPJQ.modules.projectWall.initProjectNavigator(parseInt(projectId), \"rfi\");\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\troute: 'projects/:projectId/rfi/:rfiId',\n\t\t\tname: 'rfiItem',\n\t\t\tcallback: function (projectId, rfiId) {\n\t\t\t\tPJQ.modules.projectWall.initProjectNavigator(parseInt(projectId), \"rfi\", {\n\t\t\t\t\trfiId: parseInt(rfiId)\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t]\n};\n\nPJQ.app.addRoutes(PJQ.modules.rfi.routes);","// Models\nPJQ.models.rfi.RFI = PJQ.models.BaseModel.extend({\n\tnotifyName: 'RFI',\n\tidAttribute: \"rfiId\",\n\tendpoint: function (urlOptions) {\n\t\tlet arr;\n\t\tif (this.isNew()) {\n\t\t\tarr = [\n\t\t\t\t{\n\t\t\t\t\tendpoint: 'projects',\n\t\t\t\t\tvalue: this.get('projectId')\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tendpoint: 'rfi',\n\t\t\t\t\tvalue: this.id\n\t\t\t\t}\n\t\t\t];\n\t\t}\n\t\telse {\n\t\t\tarr = [\n\t\t\t\t{\n\t\t\t\t\tendpoint: 'rfi',\n\t\t\t\t\tvalue: this.id\n\t\t\t\t}\n\t\t\t];\n\t\t}\n\t\tlet params = [];\n\t\tif (urlOptions != null) {\n\t\t\tif (urlOptions.noNotify) {\n\t\t\t\tparams.push({\n\t\t\t\t\tparameter: 'noNotify',\n\t\t\t\t\tvalue: true\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (urlOptions.draft === true) {\n\t\t\t\tparams.push({\n\t\t\t\t\tparameter: 'draft',\n\t\t\t\t\tvalue: true\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn PJQ.helpers.urlHelpers.generateEndpoint(arr, params);\n\t},\n\tparse: function (model) {\n\t\tif (!model)\n\t\t\treturn model;\n\n\t\tthis.groups = new PJQ.collections.groups.Groups(model.groups);\n\n\t\tif (model.createdBy != null) {\n\t\t\tthis.createdBy = new PJQ.models.projectContacts.ProjectContact(model.createdBy);\n\t\t}\n\t\telse {\n\t\t\tthis.createdBy = null;\n\t\t}\n\n\t\tif (model.requestedBy != null) {\n\t\t\tthis.requestedBy = new PJQ.models.projectContacts.ProjectContact(model.requestedBy);\n\t\t}\n\t\telse {\n\t\t\tthis.requestedBy = null;\n\t\t}\n\n\t\tthis.assigneeList = new PJQ.collections.projectContacts.ProjectContacts(model.assigneeList);\n\n\t\tthis.distributionList = new PJQ.collections.projectContacts.ProjectContacts(model.distributionList);\n\n\t\tthis.ballInCourt = new PJQ.collections.projectContacts.ProjectContacts(model.ballInCourt);\n\n\t\tthis.responses = new PJQ.collections.rfi.Responses(model.responses);\n\n\t\tthis.attachments = new PJQ.collections.rfi.Attachments(model.attachments);\n\n\t\tif (model.customFieldValues == null) {\n\t\t\tmodel.customFieldValues = [];\n\t\t}\n\n\t\treturn model;\n\t},\n\tfetchNotifications: function (callback) {\n\t\tif (this.notifications == null) {\n\t\t\tthis.notifications = new PJQ.collections.rfi.Notifications(null, {\n\t\t\t\trfi: this\n\t\t\t})\n\t\t}\n\n\t\tthis.notifications.fetch({\n\t\t\tsuccess: _.bind(function () {\n\t\t\t\tcallback(this.notifications);\n\t\t\t}, this)\n\t\t});\n\t},\n\tgetStatusColor: function () {\n\t\tif (this.get('status') == null) {\n\t\t\tthis.set('status', PJQ.constants.rfi.statuses.DRAFT);\n\t\t}\n\t\treturn PJQ.constants.rfi.statusColors[this.get('status')];\n\t},\n\tgetStatusName: function () {\n\t\tif (this.get('status') == null) {\n\t\t\tthis.set('status', PJQ.constants.rfi.statuses.DRAFT);\n\t\t}\n\t\treturn PJQ.constants.rfi.statusNames[this.get('status')];\n\t},\n\tcheckIsAssignee: function (user) {\n\t\treturn user && (this.get('isAssignee') || this.assigneeList.get(user.id) != null);\n\t},\n\tcheckIsDistribution: function (user) {\n\t\treturn user && (this.get('isDistribution') || this.distributionList.get(user.id) != null);\n\t},\n\tbeforeSave: function () {\n\t\tthis.set('assigneeList', this.assigneeList.toJSON());\n\t\tthis.set('distributionList', this.distributionList.toJSON());\n\t\tthis.set('ballInCourt', this.ballInCourt.toJSON());\n\t\tthis.set('requestedBy', this.requestedBy);\n\t\tthis.set('groups', this.groups.toJSON());\n\t\tthis.set('attachments', this.attachments.getChangedModels());\n\t\tif (this.isNew()) {\n\t\t\tthis.set('responses', this.responses.getChangedModels());\n\t\t}\n\t},\n\topen: function (callback, noNotify = false) {\n\t\tthis.save({\n\t\t\tstatus: PJQ.constants.rfi.statuses.OPEN,\n\t\t}, {\n\t\t\turlOptions: {\n\t\t\t\tnoNotify: noNotify\n\t\t\t},\n\t\t\tsuccess: function () {\n\t\t\t\tcallback(true);\n\t\t\t\tPJQ.notifications.notify.successNotify({\n\t\t\t\t\tmessage: 'RFI opened'\n\t\t\t\t});\n\t\t\t},\n\t\t\terror: function () {\n\t\t\t\tcallback(true);\n\t\t\t}\n\t\t});\n\t},\n\tclose: function (callback, noNotify = false) {\n\t\tthis.save({\n\t\t\tstatus: PJQ.constants.rfi.statuses.CLOSED,\n\t\t}, {\n\t\t\turlOptions: {\n\t\t\t\tnoNotify: noNotify\n\t\t\t},\n\t\t\tsuccess: function () {\n\t\t\t\tcallback(true);\n\t\t\t\tPJQ.notifications.notify.successNotify({\n\t\t\t\t\tmessage: 'RFI closed'\n\t\t\t\t});\n\t\t\t},\n\t\t\terror: function () {\n\t\t\t\tcallback(true);\n\t\t\t}\n\t\t});\n\t}\n});\n\nPJQ.models.rfi.Settings = PJQ.models.BaseModel.extend({\n\tidAttribute: 'settingId',\n\tdefaults: {\n\t\ttype: 'RFI'\n\t},\n\tendpoint: function () {\n\t\tlet project = this.get('project');\n\t\tif (project != null && project.id > 0) {\n\t\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t\t{\n\t\t\t\t\tendpoint: 'projects',\n\t\t\t\t\tvalue: project.id\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tendpoint: 'rfi'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tendpoint: 'settings'\n\t\t\t\t}\n\t\t\t])\n\t\t}\n\t\telse {\n\t\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t\t{\n\t\t\t\t\tendpoint: 'users'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tendpoint: 'rfi'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tendpoint: 'settings'\n\t\t\t\t}\n\t\t\t])\n\t\t}\n\t}\n});\n\nPJQ.models.rfi.UserSettings = PJQ.models.BaseModel.extend({\n\tendpoint: function () {\n\t\tlet params = [];\n\t\tif (this.options.forCompany) {\n\t\t\tparams.push({\n\t\t\t\tparameter: 'forCompany',\n\t\t\t\tvalue: true\n\t\t\t});\n\t\t}\n\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t{\n\t\t\t\tendpoint: 'rfi'\n\t\t\t},\n\t\t\t{\n\t\t\t\tendpoint: 'settings'\n\t\t\t},\n\t\t\t{\n\t\t\t\tendpoint: 'user'\n\t\t\t}\n\t\t], params);\n\t},\n\tgetSettings: function (view) {\n\t\treturn _.find(this.attributes.viewSettings, _.bind(function (setting) {\n\t\t\treturn setting.view === view;\n\t\t}, this));\n\t}\n});\n\nPJQ.models.rfi.Notification = PJQ.models.notifications.Notification.extend({\n\tnotificationTypeNames: PJQ.constants.rfi.notificationTypeNames,\n\tendpoint: function () {\n\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t{\n\t\t\t\tendpoint: 'rfi',\n\t\t\t\tvalue: this.collection.options.rfi.id\n\t\t\t},\n\t\t\t{\n\t\t\t\tendpoint: 'notifications',\n\t\t\t\tvalue: this.id\n\t\t\t}\n\t\t])\n\t}\n});\n\nPJQ.models.rfi.Attachment = PJQ.models.files.File.extend({\n\tidAttribute: 'attachmentId',\n\tendpoint: function () {\n\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t{\n\t\t\t\tendpoint: 'rfi',\n\t\t\t\tvalue: this.get('rfiId')\n\t\t\t},\n\t\t\t{\n\t\t\t\tendpoint: 'attachments',\n\t\t\t\tvalue: this.id\n\t\t\t}\n\t\t]);\n\t}\n});\n\nPJQ.models.rfi.CustomField = PJQ.models.customFields.CustomField.extend({\n\tendpoint: function () {\n\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t{\n\t\t\t\tendpoint: 'rfi'\n\t\t\t},\n\t\t\t{\n\t\t\t\tendpoint: 'customFields',\n\t\t\t\tvalue: this.id\n\t\t\t}\n\t\t])\n\t}\n});\n\nPJQ.models.rfi.Response = PJQ.models.BaseModel.extend({\n\tidAttribute: \"responseId\",\n\tendpoint: function () {\n\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t{\n\t\t\t\tendpoint: 'rfi',\n\t\t\t\tvalue: this.get('rfiId')\n\t\t\t},\n\t\t\t{\n\t\t\t\tendpoint: 'responses',\n\t\t\t\tvalue: this.id\n\t\t\t}\n\t\t])\n\t},\n\tparse: function (model) {\n\t\tif (!model) {\n\t\t\treturn model;\n\t\t}\n\n\t\tif (model.createdBy != null) {\n\t\t\tthis.createdBy = new PJQ.models.projectContacts.ProjectContact(model.createdBy);\n\t\t}\n\n\t\treturn model;\n\t},\n\taccept: function (isAccepted, callback) {\n\t\tthis.set();\n\t\tthis.save({\n\t\t\tisAccepted: isAccepted\n\t\t}, {\n\t\t\tsuccess: function () {\n\t\t\t\tcallback(true);\n\t\t\t\tlet message;\n\t\t\t\tif (isAccepted) {\n\t\t\t\t\tmessage = 'Response marked as accepted';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tmessage = 'Response marked as not accepted';\n\t\t\t\t}\n\t\t\t\tPJQ.notifications.notify.successNotify({\n\t\t\t\t\tmessage: message\n\t\t\t\t});\n\t\t\t},\n\t\t\terror: function () {\n\t\t\t\tcallback(false);\n\t\t\t}\n\t\t});\n\t}\n});\n\n\n// Collections\nPJQ.collections.rfi = {};\nPJQ.collections.rfi.RFIS = PJQ.collections.BaseCollection.extend({\n\tmodel: PJQ.models.rfi.RFI,\n\tendpoint: function () {\n\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t{\n\t\t\t\tendpoint: 'projects',\n\t\t\t\tvalue: this.options.project.id\n\t\t\t},\n\t\t\t{\n\t\t\t\tendpoint: 'rfi'\n\t\t\t}\n\t\t])\n\t}\n});\n\nPJQ.collections.rfi.Notifications = PJQ.collections.notifications.Notifications.extend({\n\tmodel: PJQ.models.rfi.Notification,\n\tendpoint: function () {\n\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t{\n\t\t\t\tendpoint: 'rfi',\n\t\t\t\tvalue: this.options.rfi.id\n\t\t\t},\n\t\t\t{\n\t\t\t\tendpoint: 'notifications'\n\t\t\t}\n\t\t])\n\t}\n});\n\nPJQ.collections.rfi.Attachments = PJQ.collections.files.Files.extend({\n\tmodel: PJQ.models.rfi.Attachment,\n\tendpoint: function () {\n\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t{\n\t\t\t\tendpoint: 'rfi',\n\t\t\t\tvalue: this.options.rfiId\n\t\t\t},\n\t\t\t{\n\t\t\t\tendpoint: 'attachments'\n\t\t\t}\n\t\t]);\n\t}\n});\n\nPJQ.collections.rfi.CustomFields = PJQ.collections.BaseCollection.extend({\n\tmodel: PJQ.models.rfi.CustomField,\n\toptions: {\n\t\tmasterUserId: null\n\t},\n\tendpoint: function () {\n\t\tlet projectId = null;\n\t\tif(this.options.project != null){\n\t\t\tprojectId = this.options.project.id\n\t\t} else if(this.options.projectId > 0){\n\t\t\tprojectId = this.options.projectId;\n\t\t}\n\n\t\tif(projectId > 0){\n\t\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t\t\t{\n\t\t\t\t\t\tendpoint: 'projects',\n\t\t\t\t\t\tvalue: projectId\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tendpoint: 'rfi'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tendpoint: 'customFields'\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tparameter: 'masterUserId',\n\t\t\t\t\t\tvalue: this.options.masterUserId > 0 ? this.options.masterUserId : PJQ.app.session.get('masterUserId')\n\t\t\t\t\t}\n\t\t\t\t]);\n\t\t}\n\n\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t\t{\n\t\t\t\t\tendpoint: 'rfi'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tendpoint: 'customFields'\n\t\t\t\t}\n\t\t\t],\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tparameter: 'masterUserId',\n\t\t\t\t\tvalue: this.options.masterUserId > 0 ? this.options.masterUserId : PJQ.app.session.get('masterUserId')\n\t\t\t\t}\n\t\t\t]);\n\t}\n});\n\nPJQ.collections.rfi.Responses = PJQ.collections.BaseCollection.extend({\n\tmodel: PJQ.models.rfi.Response,\n\tendpoint: function () {\n\t\treturn PJQ.helpers.urlHelpers.generateEndpoint([\n\t\t\t{\n\t\t\t\tendpoint: 'rfi',\n\t\t\t\tvalue: this.options.rfiId\n\t\t\t},\n\t\t\t{\n\t\t\t\tendpoint: 'responses'\n\t\t\t}\n\t\t]);\n\t}\n});\n","PJQ.views.rfi.RFIManagement = PJQ.views.BaseView.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.RFI, 'RFI-Management')\n    },\n    events: {\n        'click .btn-export-summary': 'exportSummary',\n        'click .btn-export-detailed': 'exportDetailed',\n        'click .btn-rfi-settings': 'viewRFISettings',\n        'click .btn-add-rfi': 'addRFI',\n        'click .btn-edit-rfi': 'editRFIClicked',\n        'click .btn-delete-rfi': 'deleteRFIClicked'\n    },\n    beforeFirstRender: function () {\n        if (PJQ.app.session.user == null) {\n            this.options.isAdmin = false;\n        } else {\n            this.options.isAdmin = this.options.project.get('masterUserId') === PJQ.app.session.user.get('masterUserId')\n                && this.options.project.hasPermission('rfi.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.rfi.UserSettings();\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                            this.options.project.fetchRFIs(_.bind(function (rfis) {\n                                this.collection = rfis;\n                                this.isFetched = true;\n                                this.render();\n                            }, this));\n                        } else {\n                            this.isFetched = true;\n                        }\n                    }, this);\n                    if (this.options.project != null) {\n                        this.options.project.fetchRFICustomFields(_.bind(function (customFields) {\n                            fnRender(customFields);\n                        }, this));\n                    } else {\n                        PJQ.app.session.fetchRFICustomFields(null, _.bind(function (customFields) {\n                            fnRender(customFields);\n                        }, this));\n                    }\n                }, this)\n            });\n        }, this)\n\n        if (this.options.project.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            settings: this.options.settings\n        };\n    },\n    afterRender: function () {\n        if (!this.isFetched) {\n            return;\n        }\n\n        if (this.options.rfiId > 0) {\n            let rfi = this.collection.get(this.options.rfiId);\n            this.options.rfiId = null;\n            if (rfi != null) {\n                rfi.fetch({\n                    success: _.bind(function () {\n                        this.editRFI(rfi);\n                    }, this)\n                });\n            }\n        }\n\n        this.renderDataTable();\n    },\n    renderDataTable() {\n        let self = this;\n        this.rfiDataTable = new PJQ.views.dataTables.DataTable({\n            el: this.$('.rfi-table'),\n            rowId: \"cid\",\n            pageLength: this.options.userSettings.getSettings(PJQ.constants.rfi.view.RFIS).rowsPerPage,\n            data: this.collection.models,\n            onPageSizeChange: _.bind(function (value) {\n                this.options.userSettings.getSettings(PJQ.constants.rfi.view.RFIS).rowsPerPage = value;\n                this.options.userSettings.save();\n            }, this),\n            settings: this.options.userSettings.getSettings(PJQ.constants.rfi.view.RFIS),\n            language: {\n                emptyTable: 'Click \"Add RFI\" to create a new RFI',\n                zeroRecords: \"No RFI matched the search criteria\"\n            },\n            rowCallback: function (row, data) {\n                if (!data.get('isRead') && self.options.isAdmin) {\n                    $(row).addClass('unread-highlight')\n                } else {\n                    $(row).removeClass('unread-highlight')\n                }\n            },\n            subTemplates: {\n                header: new PJQ.templating.Template(PJQ.constants.modules.RFI, 'Data-Table-Header-RFI')\n            },\n            headerData: function () {\n                return {\n                    project: self.options.project,\n                    settings: self.options.settings,\n                    preferences: self.preferences\n                };\n            },\n            afterHeaderRender: _.bind(function (view, $header) {\n                new PJQ.inputs.Selectpicker({\n                    el: $header.find('.rfi-status-filter'),\n                    onChange: function (value) {\n                        view.setFilter('status', value);\n                    },\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 statusFilter = view.getFilter('status');\n                if (_.size(statusFilter) === 0) {\n                    return result;\n                }\n\n                return _.filter(result, function (row) {\n                    return _.contains(statusFilter, row.get('status'));\n                });\n            },\n            order: [[0, \"asc\"]],\n            deferRender: true,\n            onRowDoubleClick: _.bind(function (row) {\n                let selectedRFI = row.data();\n                selectedRFI.fetch({\n                    success: _.bind(function () {\n                        this.editRFI(selectedRFI);\n                    }, this)\n                });\n            }, this),\n            contextMenuOptions: {\n                actions: [\n                    {\n                        name: 'Edit',\n                        onClick: _.bind(function (row) {\n                            this.editRFI(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.deleteRFI(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) {\n        let columns = [], includeColumns = [],\n            viewSettings = this.options.userSettings.getSettings(PJQ.constants.rfi.view.RFIS);\n\n        if (includeAllColumns) {\n            includeColumns = [\"number\", \"title\", \"question\", \"location\", \"groupList\", \"requestedBy\", \"assigneeList\", \"ballInCourt\", \"distributionList\", \"dueDate\", \"status\"];\n        } else\n            includeColumns = viewSettings.columns;\n\n        if (this.options.isAdmin && !includeAllColumns) {\n            columns.push({\n                \"columnData\": \"\",\n                \"data\": null,\n                \"title\": \"\",\n                \"width\": \"20px\",\n                \"orderData\": [0, 1],\n                \"searchable\": false,\n                \"defaultContent\": '',\n                \"render\": function (data, type, row) {\n                    if (!row.get('isRead')) {\n                        return '<i class=\"fas fs-18 text-primary fa-exclamation-circle\" title=\"Changes have been made since last viewed by your company\"></i>';\n                    }\n                    return '<div hidden>999</div>';\n                }\n            })\n        }\n\n        _.each(includeColumns, _.bind(function (column) {\n            switch (column) {\n                case 'number':\n                    columns.push({\n                        \"columnData\": \"number\",\n                        \"data\": {\n                            \"_\": \"attributes.number\",\n                            \"sort\": _.bind(function (row) {\n                                let number = parseInt(row.attributes.number);\n                                if (isNaN(number)) {\n                                    return row.attributes.number;\n                                } else {\n                                    return number\n                                }\n                            }, this),\n                            \"display\": \"attributes.number\"\n                        },\n                        \"title\": \"Number\",\n                        \"width\": \"80px\",\n                        \"type\": 'natural-ci',\n                        visible: viewSettings.columns.indexOf(column) !== -1\n                    });\n                    break;\n                case 'title':\n                    columns.push({\n                        columnData: 'title',\n                        data: \"attributes.title\",\n                        title: \"Title\",\n                        visible: viewSettings.columns.indexOf(column) !== -1\n                    });\n                    break;\n                case 'question':\n                    columns.push({\n                        columnData: 'question',\n                        data: \"attributes.question\",\n                        title: \"Question\",\n                        visible: viewSettings.columns.indexOf(column) !== -1\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.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.columns.indexOf(column) !== -1\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.columns.indexOf(column) !== -1\n                    });\n                    break;\n                case 'assigneeList':\n                    columns.push({\n                        columnData: 'assigneeList',\n                        title: \"Assignee\",\n                        render: function (data, type, row) {\n                            let result = [];\n                            if (_.size(row.assigneeList.models) > 0) {\n                                _.each(row.assigneeList.models, function (contact) {\n                                    result.push(PJQ.helpers.contacts.getContactAnchor({contact: contact}));\n                                });\n                            } else {\n                                result.push('Nobody');\n                            }\n                            return result.join(', ');\n                        },\n                        visible: viewSettings.columns.indexOf(column) !== -1\n                    });\n                    break;\n                case 'ballInCourt':\n                    columns.push({\n                        columnData: 'ballInCourt',\n                        data: \"attributes.ballInCourt\",\n                        title: \"Ball In Court\",\n                        render: function (data, type, row) {\n                            let result = [];\n                            if (_.size(row.ballInCourt.models) > 0) {\n                                _.each(row.ballInCourt.models, function (contact) {\n                                    result.push(PJQ.helpers.contacts.getContactAnchor({contact: contact}));\n                                });\n                            } else {\n                                result.push('Nobody');\n                            }\n                            return result.join(', ');\n                        },\n                        visible: viewSettings.columns.indexOf(column) !== -1\n                    });\n                    break;\n                case 'distributionList':\n                    columns.push({\n                        columnData: 'distributionList',\n                        title: \"Distribution List\",\n                        render: function (data, type, row) {\n                            let result = [];\n                            if (_.size(row.distributionList.models) > 0) {\n                                _.each(row.distributionList.models, function (contact) {\n                                    result.push(PJQ.helpers.contacts.getContactAnchor({contact: contact}));\n                                });\n                            } else {\n                                result.push('Nobody');\n                            }\n                            return result.join(', ');\n                        },\n                        visible: viewSettings.columns.indexOf(column) !== -1\n                    });\n                    break;\n                case 'dueDate':\n                    columns.push({\n                        columnData: \"dueDate\",\n                        data: \"attributes.dueDate\",\n                        title: \"Response Due\",\n                        searchable: false,\n                        width: '220px',\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                                    overdueDays = PJQ.helpers.dateHelpers.getDateDaysDiff(new Date(), itemDueDate);\n                                if (row.get('status') !== PJQ.constants.rfi.statuses.CLOSED && overdueDays > 0) {\n                                    return '<span class=\"text-danger font-weight-bold\">' + dateString + '(' + overdueDays.toString() + 'd overdue)' + '</span>';\n                                }\n                                return dateString;\n                            }\n                            return 'Not Set';\n                        },\n                        visible: viewSettings.columns.indexOf(column) !== -1\n                    });\n                    break;\n                case 'requestedBy':\n                    columns.push({\n                        columnData: 'requestedBy',\n                        title: \"Requested By\",\n                        render: function (data, type, row) {\n                            return PJQ.helpers.contacts.getContactAnchor({contact: row.requestedBy});\n                        },\n                        visible: viewSettings.columns.indexOf(column) !== -1\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.columns.indexOf(column) !== -1\n                    });\n                    break;\n            }\n        }, this));\n\n        if (!includeAllColumns) {\n            columns.push({\n                data: \"attributes.rfiId\",\n                title: \"\",\n                width: '80px',\n                orderable: false,\n                searchable: false,\n                className: 'text-align-center',\n                render: _.bind(function () {\n                    let html = '<div class=\"show-on-row-hover\"><button type=\"button\" class=\"btn btn-info btn-edit-rfi\"><i class=\"fal fa-pencil\"></i></button>';\n                    if (this.options.isAdmin) {\n                        html += '<button type=\"button\" class=\"btn btn-danger btn-delete-rfi 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    addRFI() {\n        let newRFI = new PJQ.models.rfi.RFI({\n            projectId: PJQ.app.session.project.id\n        });\n        this.editRFI(newRFI);\n    },\n    editRFIClicked(e) {\n        let row = this.rfiDataTable.getRow($(e.currentTarget).parents('tr')),\n            selectedRFI = row.data();\n        selectedRFI.fetch({\n            success: _.bind(function () {\n                this.editRFI(selectedRFI);\n            }, this)\n        });\n    },\n    editRFI(rfi) {\n        let isNew = rfi.isNew();\n        new PJQ.views.rfi.EditRFIModal({\n            model: rfi,\n            project: this.options.project,\n            onClose: _.bind(function (rfi) {\n                this.rfiDataTable.refresh();\n            }, this),\n            onSave: _.bind(function (rfi) {\n                if (isNew) {\n                    this.collection.add(rfi);\n                    this.rfiDataTable.addRow(rfi);\n                }\n                this.rfiDataTable.refresh();\n            }, this),\n            onDelete: _.bind(function (rfi) {\n                let row = this.rfiDataTable.getRow(rfi.cid);\n                if (row != null) {\n                    this.rfiDataTable.removeRow(row);\n                }\n                rfi.destroy();\n                this.rfiDataTable.refresh();\n            }, this)\n        });\n    },\n    deleteRFIClicked: function (e) {\n        let row = this.rfiDataTable.getRow($(e.currentTarget).parents('tr'));\n        this.deleteRFI(row);\n    },\n    deleteRFI(row) {\n        let rfi = row.data();\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Confirm Delete\",\n            body: \"Are you sure you want to delete this RFI?\",\n            onDelete: _.bind(function () {\n                rfi.destroy();\n                this.rfiDataTable.removeRow(row);\n            }, this)\n        });\n    },\n    exportSummary: function () {\n        this.exportList(\"SUMMARY\");\n    },\n    exportDetailed: function () {\n        this.exportList();\n    },\n    exportList: function (type) {\n        let loader = new PJQ.Loader(this.$('.btn-rfi-export'), {\n            loadingText: \"Exporting...\"\n        });\n        let params = [];\n        if (_.size(type) > 0) {\n            params.push({\n                parameter: 'type',\n                value: type\n            });\n        }\n\n        let statusFilter = this.rfiDataTable.getFilter('status');\n        //if (_.size(this.rfiDataTable.getSearchText()) > 0 || _.size(statusFilter) > 0) {\n            params.push({\n                parameter: 'ids',\n                value: _.map(this.rfiDataTable.getFilteredRowData(), function (rfi) {\n                    return rfi.id;\n                })\n            });\n        //}\n\n        params.push({\n            parameter: 'timeZoneOffset',\n            value: new Date().getTimezoneOffset()\n        })\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: 'rfi',\n                },\n                {\n                    endpoint: 'export'\n                }\n            ], params),\n            isAPI2: true\n        }).get().done(_.bind(function (response) {\n            PJQ.files.downloadFile(response.url, {\n                isEndpoint: false\n            });\n            PJQ.notifications.notify.successNotify({\n                message: 'RFIs Successfully Exported'\n            });\n            loader.remove();\n        }, this)).fail(_.bind(function (xhr, err, result) {\n            loader.remove();\n            PJQ.notifications.notify.errorNotify({\n                message: 'Failed to export RFIs'\n            });\n        }, this));\n    },\n    viewRFISettings: function () {\n        new PJQ.views.rfi.RFISettingsModal({\n            rfiView: this,\n            userSettings: this.options.userSettings,\n            onSave: _.bind(function () {\n                this.renderDataTable();\n            }, this)\n        });\n    }\n});\n\nPJQ.views.rfi.EditRFIModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.RFI, 'Modal-Edit-RFI'),\n        subTemplates: {\n            responses: new PJQ.templating.Template(PJQ.constants.modules.RFI, 'Responses'),\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-response': 'addResponseClicked',\n        'click .edit-history': 'viewEditHistory',\n        'click .btn-notification-history': 'viewNotificationHistory',\n        'click .btn-export': 'exportPDF',\n        'click .btn-save': 'saveClicked',\n        'click .btn-save-open': 'saveAndOpenClicked',\n        'click .btn-save-draft': 'saveDraftClicked',\n        'click .btn-close': 'close',\n        'click .rfi-delete': 'delete',\n        'click .btn-rfi-open': 'openRFI',\n        'click .btn-rfi-close': 'closeRFI',\n        'click .btn-accept-response': 'acceptResponse',\n        'click .btn-un-accept-response': 'unAcceptResponse',\n        'click .btn-download-all-attachments': 'downloadAllAttachments'\n    },\n    beforeModalCreated: function () {\n        this.isFetched = false;\n        this.preferences = this.options.project ? this.options.project.preferences : PJQ.app.session.preferences;\n        let fnRender = _.bind(function (customFields) {\n            this.options.customFields = customFields;\n            this.isFetched = true;\n\n            if(this.model.isNew() && this.options.project && this.options.project.hasPermission('rfi.isAdmin')){\n                this.model.set({\n                    isPublic: this.preferences.hasPref(PJQ.constants.preferenceTypes.RFI_DEFAULT_PUBLIC),\n                    shouldNotifyProjectContacts: this.preferences.hasPref(PJQ.constants.preferenceTypes.RFI_DEFAULT_NOTIFY_PROJECT_CONTACTS),\n                    shouldNotifyParticipants: this.preferences.hasPref(PJQ.constants.preferenceTypes.RFI_DEFAULT_NOTIFY_PARTICIPANTS)\n                });\n            }\n\n            this.render();\n        }, this);\n        if (this.options.project != null) {\n            this.options.project.fetchRFICustomFields(_.bind(function (customFields) {\n                fnRender(customFields);\n            }, this));\n        } else {\n            PJQ.app.session.fetchRFICustomFields(null, _.bind(function (customFields) {\n                fnRender(customFields);\n            }, this));\n        }\n        this.changedAnnotations = new PJQ.collections.drawings.Annotations();\n    },\n    beforeRender: function () {\n        if (PJQ.app.session.user == null) {\n            let etcPerms = this.model.get('status') !== PJQ.constants.rfi.statuses.CLOSED && (this.model.isNew()\n                || this.model.checkIsAssignee(PJQ.app.session.contact ? PJQ.app.session.contact : PJQ.app.session.user)\n                || this.model.checkIsDistribution(PJQ.app.session.contact ? PJQ.app.session.contact : PJQ.app.session.user));\n            this.options.canAddComment = etcPerms;\n            this.options.canAddAttachment = etcPerms;\n            this.options.canEdit = this.model.isNew();\n            this.options.isAdmin = false;\n        } else {\n            this.options.isAdmin = this.options.project.get('masterUserId') === PJQ.app.session.user.get('masterUserId') && this.options.project.hasPermission('rfi.isAdmin');\n            let etcPerms = this.model.get('status') !== PJQ.constants.rfi.statuses.CLOSED && (this.options.isAdmin || this.model.isNew()\n                || this.model.checkIsAssignee(PJQ.app.session.contact ? PJQ.app.session.contact : PJQ.app.session.user)\n                || this.model.checkIsDistribution(PJQ.app.session.contact ? PJQ.app.session.contact : PJQ.app.session.user));\n            this.options.canAddComment = etcPerms;\n            this.options.canAddAttachment = etcPerms;\n            this.options.canEdit = this.model.isNew()\n                || (this.model.get('status') !== PJQ.constants.rfi.statuses.CLOSED && this.options.isAdmin);\n        }\n    },\n    renderData: function () {\n        return {\n            model: this.model,\n            canAddComment: this.options.canAddComment,\n            canAddAttachment: this.options.canAddAttachment,\n            canEdit: this.options.canEdit,\n            isAdmin: this.options.isAdmin,\n            preferences: this.preferences\n        };\n    },\n    afterRender: function () {\n        if (this.isFetched) {\n            new PJQ.Binder(this.$el, this.model, {\n                watchElements: [\n                    'input',\n                    'textarea'\n                ],\n                afterChange: _.bind(function ($e, attr, val) {\n                    if (attr === 'isPublic') {\n                        let $ph = this.$('.public-hide');\n                        if (val) {\n                            $ph.removeClass('hidden');\n                        } else {\n                            this.model.set({\n                                shouldNotifyProjectContacts: false,\n                                shouldNotifyParticipants: false\n                            });\n                            $ph.addClass('hidden');\n                            $ph.prop('checked', false);\n                        }\n                    }\n                }, this)\n            });\n\n            new PJQ.inputs.Datepicker({\n                el: this.$('.rfi-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            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                    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.$('.rfi-location'),\n                    source: _.map(_.filter(this.model.collection != null ? this.model.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            if (this.options.isAdmin) {\n                this.model.set('isRead', true);\n                this.ballInCourtInput = new PJQ.views.contacts.ContactsSelectInput({\n                    el: this.$('.rfi-ball-in-court'),\n                    contacts: new PJQ.collections.contacts.Contacts(_.union(this.model.assigneeList.models, this.model.distributionList.models)),\n                    selectedContact: this.model.ballInCourt.models,\n                    isSingleChoice: false,\n                    isReadOnly: !this.options.canEdit,\n                    onChange: _.bind(function (selectedContacts) {\n                        this.model.ballInCourt.reset(selectedContacts);\n                        this.model.isDirty = true;\n                    }, this)\n                });\n\n                new PJQ.views.contacts.ContactsSelectInput({\n                    el: this.$('.rfi-assigned'),\n                    context: [PJQ.constants.contacts.contexts.PARTICIPANTS, PJQ.constants.contacts.contexts.PROJECTCONTACTS],\n                    selectedContact: this.model.assigneeList.models,\n                    isSingleChoice: false,\n                    isReadOnly: !this.options.canEdit,\n                    onChange: _.bind(function (selectedContacts) {\n                        this.model.assigneeList.reset(selectedContacts);\n                        this.model.isDirty = true;\n                        this.refreshBallInCourtInput();\n                    }, this)\n                });\n\n                new PJQ.views.contacts.ContactsSelectInput({\n                    el: this.$('.rfi-distribution'),\n                    context: [PJQ.constants.contacts.contexts.PARTICIPANTS, PJQ.constants.contacts.contexts.PROJECTCONTACTS],\n                    selectedContact: this.model.distributionList.models,\n                    isSingleChoice: false,\n                    isReadOnly: !this.options.canEdit,\n                    onChange: _.bind(function (selectedContacts) {\n                        this.model.distributionList.reset(selectedContacts);\n                        this.model.isDirty = true;\n                        this.refreshBallInCourtInput();\n                    }, this)\n                });\n\n                new PJQ.views.contacts.ContactsSelectInput({\n                    el: this.$('.rfi-requested-by'),\n                    context: [PJQ.constants.contacts.contexts.PARTICIPANTS, PJQ.constants.contacts.contexts.PROJECTCONTACTS],\n                    selectedContact: this.model.requestedBy,\n                    isReadOnly: !this.options.canEdit,\n                    onChange: _.bind(function (selectedContact) {\n                        this.model.requestedBy = selectedContact;\n                        this.model.isDirty = true;\n                    }, this)\n                });\n            }\n\n            this.renderCustomFields();\n\n            this.renderStatus();\n\n            new PJQ.views.groups.GroupsSelectInput({\n                el: this.$('.rfi-groups'),\n                isShowAddButton: false,\n                groupLevels: PJQ.app.session.project.preferences.getPref(PJQ.constants.preferenceTypes.GROUP_LEVELS),\n                groupUserId: PJQ.app.session.project.get('masterUserId'),\n                isReadOnly: !this.options.canEdit,\n                addButton: this.$('.btn-edit-groups'),\n                selectedGroups: this.model.groups.models,\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.$('.rfi-file-uploader'),\n                context: 'rfi',\n                contextId: this.model.id,\n                canAddAnnotations: this.options.canEdit,\n                onAnnotationChange: (annotation) => {\n                    this.changedAnnotations.merge(annotation);\n                },\n                mergeAnnotations: this.changedAnnotations,\n                collection: this.model.attachments,\n                canUpload: this.options.canAddAttachment,\n                canDelete: this.options.canEdit && this.options.isAdmin,\n                includeProjectAttachments: true,\n                previewImageDimension: 150,\n                onSuccess: _.bind(function () {\n                    this.model.isDirty = true;\n                }, this),\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            this.renderResponses();\n        }\n    },\n    renderCustomFields: function () {\n        this.customFieldsForm = new PJQ.views.customFields.CustomFieldsForm({\n            el: this.$('.rfi-custom-fields'),\n            collection: this.options.customFields,\n            fieldValues: this.model.get('customFieldValues'),\n            isEdit: this.options.canEdit\n        });\n    },\n    refreshBallInCourtInput: function () {\n        this.ballInCourtInput.options.contacts = new PJQ.collections.contacts.Contacts(_.union(this.model.assigneeList.models, this.model.distributionList.models));\n    },\n    renderStatus: function () {\n        this.$('.rfi-status').css('background-color', this.model.getStatusColor());\n        this.$('.rfi-status-name').html(this.model.getStatusName());\n\n        let statusActions,\n            status = this.model.get('status');\n        if (status === PJQ.constants.rfi.statuses.CLOSED) {\n            statusActions = '<button type=\"button\" class=\"btn btn-success btn-rfi-open\">Mark as Open</button>';\n        } else if (status === PJQ.constants.rfi.statuses.OPEN) {\n            statusActions = '<button type=\"button\" class=\"btn btn-danger btn-rfi-close\">Mark as Closed</button>';\n        } else {\n            statusActions = '';\n        }\n        this.$('.rfi-status-actions').html(statusActions);\n    },\n    exportPDF: function () {\n        PJQ.files.downloadFile(PJQ.helpers.urlHelpers.generateEndpoint([\n            {\n                endpoint: 'projects',\n                value: PJQ.app.session.project.id\n            },\n            {\n                endpoint: 'rfi',\n                value: this.model.id\n            },\n            {\n                endpoint: 'export'\n            }\n        ], [\n            {\n                parameter: 'timeZoneOffset',\n                value: new Date(this.model.get('createdOn')).getTimezoneOffset()\n            }\n        ]));\n    },\n    addResponseClicked: function () {\n        this.addResponse();\n    },\n    addResponse: function (callback) {\n        let val = this.$('.item-new-response').val().trim();\n        if (_.size(val) === 0)\n            return;\n\n        let response = new PJQ.models.rfi.Response({\n            rfiId: this.model.id,\n            responseText: val,\n            createdOn: new Date()\n        });\n        if (!this.model.isNew()) {\n            response.save(null, {\n                success: _.bind(function () {\n                    this.model.responses.add(response);\n                    this.renderResponses();\n\n                    if (typeof callback === 'function') {\n                        callback();\n                    }\n                }, this)\n            });\n        } else {\n            response.createdBy = PJQ.app.session.user;\n            this.model.responses.add(response);\n            this.renderResponses();\n\n            if (typeof callback === 'function') {\n                callback();\n            }\n        }\n\n        this.$('.item-new-response').val('');\n    },\n    renderAcceptedResponses: function () {\n        let acceptedResponses = _.filter(this.model.responses.models, function (response) {\n                return response.get('isAccepted');\n            }),\n            $responses = this.$('.rfi-accepted-responses');\n        if (_.size(acceptedResponses) > 0) {\n            this.renderSubTemplate(false, this.options.subTemplates.responses, $responses, {\n                responses: acceptedResponses,\n                canEdit: this.options.canEdit\n            });\n        } else {\n            $responses.html('<div class=\"fs-16 font-weight-light mt-2\">No Accepted Responses</div>');\n        }\n    },\n    renderResponses: function () {\n        this.renderAcceptedResponses();\n        this.renderSubTemplate(false, this.options.subTemplates.responses, this.$('.rfi-responses'), {\n            responses: this.model.responses.models,\n            canEdit: this.options.canEdit\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    unAcceptResponse: function (e) {\n        let cid = $(e.currentTarget).closest('.card').data('cid'),\n            response = this.model.responses.get(cid);\n        response.accept(false, _.bind(function () {\n            this.renderResponses();\n        }, this));\n    },\n    acceptResponse: function (e) {\n        let cid = $(e.currentTarget).closest('.card').data('cid'),\n            response = this.model.responses.get(cid);\n        response.accept(true, _.bind(function () {\n            this.renderResponses();\n        }, this));\n    },\n    checkNotify: function (modalBody, callback) {\n        new PJQ.views.modals.YesNo({\n            header: \"Send Notifications?\",\n            body: modalBody,\n            onYes: _.bind(function () {\n                if (typeof callback === 'function') {\n                    callback(true);\n                }\n            }, this),\n            onNo: _.bind(function () {\n                if (typeof callback === 'function') {\n                }\n                callback(false);\n            }, this)\n        });\n    },\n    openRFI: function () {\n        this.checkNotify('Would you like to notify users that this RFI has been opened?', _.bind(function (notify) {\n            this.model.set('closedOn', null);\n            this.model.open(_.bind(function () {\n                this.render();\n                this.options.onSave(this.model)\n            }, this), !notify);\n        }, this));\n    },\n    closeRFI: function () {\n        this.checkNotify('Would you like to notify users that this RFI has been closed?', _.bind(function (notify) {\n            this.model.set('closedOn', new Date());\n            this.model.close(_.bind(function () {\n                this.render();\n                this.options.onSave(this.model)\n            }, this), !notify);\n        }, this));\n    },\n    checkActiveResponse: function (callback) {\n        let aRes = this.$('.item-new-response').val();\n        if (_.size(aRes) > 0) {\n            new PJQ.views.modals.YesNo({\n                header: \"Post Response?\",\n                body: 'You typed a response but did not click <b>Post Response</b>.  Would you like to post this response before continuing?',\n                onYes: _.bind(function () {\n                    this.addResponse(callback);\n                }, this),\n                onNo: _.bind(function () {\n                    if (typeof callback === 'function') {\n                        callback(true);\n                    }\n                }, this)\n            });\n        } else {\n            if (typeof callback === 'function') {\n                callback(true);\n            }\n        }\n    },\n    saveDraftClicked: function () {\n        this.save(true);\n    },\n    saveAndOpenClicked: function () {\n        this.model.set('status', PJQ.constants.rfi.statuses.OPEN);\n        this.save();\n    },\n    saveClicked: function () {\n        this.save();\n    },\n    save: function (draft = false) {\n        if (!this.validate())\n            return;\n\n        this.checkActiveResponse(() => {\n            if (this.fileUploader.isUploading()) {\n                new PJQ.views.BaseModal({\n                    header: \"Files Uploading\",\n                    body: \"You can't save while files are uploading\"\n                });\n            } else {\n                if (this.model.hasChanged() || this.model.isNew()) {\n                    this.model.save(null, {\n                        notify: true,\n                        urlOptions: {\n                            draft: draft\n                        },\n                        success: () => {\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                                if (this.options.onSave) {\n                                    this.options.onSave(this.model);\n                                }\n                                this.removeModal();\n                            });\n                        }\n                    });\n                } else {\n                    this.removeModal();\n                }\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.checkActiveResponse(_.bind(function () {\n                        this.onClose(this.model);\n                        if (typeof this.options.onClose === 'function') {\n                            this.options.onClose(this.model);\n                        }\n                        this.removeModal();\n                    }, this));\n                }, this)\n            });\n        } else {\n            this.checkActiveResponse(_.bind(function () {\n                this.onClose(this.model);\n                this.removeModal();\n            }, this));\n        }\n    },\n    delete: function () {\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Confirm Deletion\",\n            body: \"Are you sure you want to delete this RFI?\",\n            onDelete: _.bind(function () {\n                if (this.options.onDelete) {\n                    this.options.onDelete(this.model);\n                }\n                this.removeModal();\n            }, this)\n        });\n    },\n    downloadAllAttachments: function () {\n        this.options.project.downloadAttachments(_.map(this.model.attachments.models, function (attachment) {\n            return new PJQ.models.files.File({\n                entryId: attachment.get('entryId'),\n                guid: attachment.get('guid')\n            });\n        }));\n    }\n});\n\nPJQ.views.rfi.AttachmentManagement = PJQ.views.BaseView.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.RFI, 'Attachment-Management')\n    },\n    events: {\n        'click .rfi-attachment': 'attachmentClicked'\n    },\n    afterRender: function () {\n        this.fileUploader = new PJQ.views.files.FileUploaderGrid({\n            el: this.$('.rfi-attachment-file-upload'),\n            endpoint: this.options.endpoint,\n            collection: this.collection,\n            onDelete: function (file, callback) {\n                new PJQ.views.modals.DeleteCancel({\n                    header: \"Confirm Deletion\",\n                    body: \"Are you sure you want to delete this attachment?\",\n                    onDelete: _.bind(function () {\n                        file.destroy();\n                        callback();\n                    }, this)\n                });\n            }\n        });\n    },\n    attachmentClicked: function (e) {\n        let selectedAttachment = this.model.attachments.get($(e.currentTarget).data('cid'));\n        this.viewAttachment(selectedAttachment);\n    },\n    viewAttachment: function (attachment) {\n        PJQ.app.view.renderPhotoViewer({\n            model: attachment\n        });\n    }\n});\n","PJQ.views.rfi.RFISettings = PJQ.views.BaseView.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.RFI, 'RFI-Settings'),\n        onChange: null\n    },\n    events: {\n        'change .select-column': 'columnSelected',\n        'click .settings-save': 'onSave'\n    },\n    beforeFirstRender: function () {\n        this.listenTo(this.model, 'fetch', this.render);\n    },\n    beforeRender: function () {\n        this.renderData = {\n            model: this.model,\n            userSettings: this.options.userSettings\n        };\n    },\n    afterRender: function () {\n        $(function () {\n            $('[data-toggle=\"tooltip\"]').tooltip()\n        });\n        if (this.model) {\n            new PJQ.Binder(this.$el, this.model, {\n                watchElements: [\n                    'input'\n                ],\n                afterChange: _.bind(function () {\n                    this.onChange();\n                }, this)\n            });\n        }\n\n        if (this.options.userSettings != null) {\n            this.rowsPerPageSelectPicker = new PJQ.inputs.Selectpicker({\n                el: this.$('.rows-per-page'),\n                defaultValue: this.options.userSettings.getSettings(PJQ.constants.rfi.view.RFIS).rowsPerPage,\n                onChange: _.bind(function (value) {\n                    this.onChange();\n                }, this)\n            });\n\n            if (this.options.rfiView != null) {\n                this.dataTable = new PJQ.views.dataTables.DataTable({\n                    el: this.$('div.column-settings'),\n                    data: this.options.rfiView.getColumns(true),\n                    isHideSearch: true,\n                    order: [],\n                    columns: [\n                        {\"data\": \"title\", \"title\": \"Column\", \"orderable\": false},\n                        {\n                            \"data\": \"visible\",\n                            \"title\": \"Show\",\n                            \"orderable\": false,\n                            \"searchable\": false,\n                            \"render\": _.bind(function (data) {\n                                return ('<div class=\"text-align-center\"><div class=\"pretty p-default p-smooth fs-18 m-0\"><input type=\"checkbox\"' + (data ? ' checked ' : '') + 'class=\"select-column\"/><div class=\"state p-primary\"><label class=\"wd-0\">&nbsp;</label></div></div></div>');\n                            }, this),\n                            \"width\": '10%'\n                        }\n                    ],\n                    dom: '<\"top\"<\"clear\">>rt<\"bottom\"p<\"clear\">>'\n                });\n            }\n        }\n    },\n    columnSelected: function (sender) {\n        this.dataTable.dataTable.row($(sender.currentTarget).closest('tr')).data().visible = $(sender.currentTarget).prop('checked');\n    },\n    onChange: function () {\n        if (typeof this.options.onChange === 'function') {\n            this.options.onChange(this.model);\n        }\n    }\n});\n\nPJQ.views.rfi.RFISettingsModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.RFI, 'Modal-RFI-Settings'),\n        subTemplates: {},\n        maxWidth: 500,\n        onSave: _.noop\n    },\n    events: {\n        'click .settings-save': 'onSave'\n    },\n    beforeModalCreated: function () {\n        PJQ.app.session.project.fetchRFISettings(_.bind(function (settings) {\n            this.model = settings;\n            this.render();\n        }, this));\n    },\n    beforeRender: function () {\n        this.renderData = {\n            model: this.model\n        };\n    },\n    afterRender: function () {\n        if (typeof this.model !== 'undefined' && this.model.isFetched) {\n            this.settingsView = new PJQ.views.rfi.RFISettings({\n                el: this.$('.modal-body'),\n                model: this.model,\n                userSettings: this.options.userSettings,\n                rfiView: this.options.rfiView\n            })\n        }\n    },\n    onSave: function () {\n        let loader = new PJQ.Loader(this.$('.modal-content'));\n        this.options.rfiView.options.userSettings.getSettings(PJQ.constants.rfi.view.RFIS).rowsPerPage = parseInt(this.settingsView.rowsPerPageSelectPicker.getValue());\n        let columns = this.options.rfiView.options.userSettings.getSettings(PJQ.constants.rfi.view.RFIS).columns;\n        _.each(this.settingsView.dataTable.dataTable.data(), function (row) {\n            if (row.visible) {\n                if (columns.indexOf(row.columnData) === -1)\n                    columns.push(row.columnData);\n            } else {\n                columns = _.filter(columns, function (column) {\n                    return (column != row.columnData);\n                });\n            }\n        });\n        this.options.rfiView.options.userSettings.getSettings(PJQ.constants.rfi.view.RFIS).columns = columns;\n        this.options.rfiView.options.userSettings.save(null, {\n            success: _.bind(function () {\n                this.model.put(null, {\n                    success: _.bind(function () {\n                        this.options.onSave();\n                        PJQ.notifications.notify.successNotify({\n                            message: 'RFI settings saved'\n                        });\n                        this.removeModal();\n                    }, this),\n                    error: function () {\n                        loader.remove();\n                    }\n                });\n            }, this),\n            error: function () {\n                loader.remove();\n            }\n        });\n    }\n});\n"]}