{"version":3,"sources":["1initializers.js","meetingeditviews.js","meetingmodels.js","meetingsdatatables.js","meetingsviews.js","templateviews.js"],"names":["PJQ","collections","meetings","models","views","modules","routes","route","name","callback","projectId","projectWall","initProjectNavigator","parseInt","meetingId","app","addRoutes","MeetingEditModal","BaseModal","extend","defaults","template","templating","Template","constants","MEETINGS","subTemplates","agendaItems","agendaItem","width","maxWidth","minWidth","model","isShowCloseButton","onSave","_","noop","onDelete","events","click .btn-save","click .btn-delete","click .btn-close","click .nav-link","click .btn-add-agenda-item","click .btn-close-agenda-item","click .btn-open-agenda-item","click .btn-edit-agenda-item","click .btn-delete-agenda-item","click .btn-add-category","click .btn-edit-category","click .btn-delete-category","click .btn-edit-minutes","click .btn-save-minutes","click .category-dropdown","click .btn-view-transcription","click .btn-export","click .btn-cancel-minutes","keydown .meeting-number","click .btn-distribute","click .btn-view-previous-minutes","click .toggle-attendance","input .meeting-description","beforeModalCreated","_beforeModalCreated","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_this$options$project","wrap","_context","prev","next","this","isFetched","options","project","session","Meeting","id","templateId","statusId","number","fetchMeetingCustomFields","customFields","sent","fetchMeetingSettings","settings","isNew","fetch","set","get","size","Date","toLocaleTimeString","timeZoneName","split","render","stop","apply","arguments","beforeRender","status","canEdit","hasPermission","isAdmin","canDelete","canSave","meetingStatus","CONCLUDED","CANCELLED","canUploadRecording","canEditMinutes","IN_PROGRESS","DRAFT","renderData","activeView","canTranscribe","filter","meetingRecordings","recording","preferences","hasPref","preferenceTypes","ENABLE_MEETING_TRANSCRIPTIONS","afterRender","renderGeneral","renderAgendaItems","descriptionChanged","e","$input","$","currentTarget","val","length","slice","viewPreviousMinutes","$container","closest","$minutes","find","off","on","hasClass","html","collapse","changeActiveView","view","tab","target","hash","toUpperCase","_this","fnSaveAttachment","bind","attachment","save","success","setTimeout","listenTo","Binder","$el","useDecimalPercentFields","watchElements","defaultDate","helpers","dateHelpers","getDateString","dateFormats","DATE_TIME","datePicker","inputs","Datepicker","el","timezone","datepickerOptions","format","DATE","onChange","newDate","currentDate","getDateDaysDiff","meetingCustomFieldsForm","CustomFieldsForm","isEdit","collection","fieldValues","isDirty","startTimeString","_ref2","_slicedToArray","startHours","startMinutes","startSeconds","startDate","setHours","setMinutes","setSeconds","startTimePicker","isTimeOnly","isShowTimezone","isEditTimezone","onTimezoneChange","tz","endTimePicker","setTimezone","time","getTimeString","durationInMinutes","startTime","getDateAndTime","setValue","endTimeString","_ref4","endHours","endMinutes","endSeconds","endDate","endTime","statusPicker","Selectpicker","defaultValue","isMultiple","isIntChoices","value","newStatus","dirtyAttributes","notifications","notify","successNotify","message","SCHEDULED","attendeePicker","contacts","ContactsSelectInput","selectedContact","attendees","getAttendeeContacts","isReadOnly","displayContactsBlock","context","contexts","PROJECTCONTACTS","USERS","isSingleChoice","selectedContacts","arr","map","contact","MeetingAttendees","MeetingAttendee","attendee","renderAttendanceDatatable","fileUploader","files","FileUploaderGrid","attachments","canUpload","useApiV2","canView","previewImageDimension","onSuccess","file","destroy","recordingUploader","allowedExtensions","maxFiles","_this2","attendanceTable","dataTables","DataTable","isHideSearch","data","rowId","order","pageLength","language","zeroRecords","columns","title","type","row","result","getContactAnchor","cid","toggleAttendance","attribute","getRow","isPresent","isAbsent","isDistribution","viewTranscription","ViewMeetingTranscriptionModal","meeting","numbersOnly","inputHelpers","_this3","categories","sortBy","c","categoryIds","hasUncategorizedItems","findWhere","categoryId","each","push","renderSubTemplate","items","agendaNumber","category","renderAgendaItem","categorySortable","Sortable","multiple","tolerance","handle","onStart","hide","refreshPositions","onStop","ui","setCategorySort","item","agendaSortable","setAgendaItemSort","sortedEl","sortOrder","collapseEl","sortedCid","sortedItem","updateSort","element","itemCid","sortedCategory","$item","$agendaItemEl","minutesEditor","HTMLEditor","editorHeight","isHideTokens","addClass","categoryClicked","dropdown","caret","removeClass","editMeetingMinutes","exportMeeting","downloadFile","urlHelpers","generateEndpoint","endpoint","isAPIv2","distributeAgendaItems","isMinutes","modals","YesNo","header","body","onYes","ajax","Request","post","done","response","fail","xhr","err","errorNotify","saveMeetingMinutesClicked","saveMeetingMinutes","minutes","getValue","isEditing","saveOpenMinutes","_this4","cancelMeetingMinutes","addCategoryClicked","MeetingCategory","editCategory","editCategoryClicked","stopPropagation","deleteCategoryClicked","deleteCategory","CategoryEditModal","remove","add","DeleteCancel","addAgendaItemClicked","categoryAgendaItems","where","AgendaItem","priorityId","editAgendaItem","closeAgendaItemClicked","meetingAgendaStatus","CLOSED","openAgendaItemClicked","OPEN","editAgendaItemClicked","AgendaItemEditModal","deleteAgendaItemClicked","deleteAgendaItem","validate","isValid","$meetingName","setInputError","$meetingNumber","$meetingDate","$meetingStartTime","$meetingEndTime","saveMeeting","removeModal","isUploading","getChanged","error","deleteMeeting","close","editPerms","hasChanged","getChangedModels","SaveDontSave","onDontSave","input .agenda-item-description","_beforeModalCreated2","_callee2","_context2","priorityPicker","newPriority","categoryPicker","newCategory","assigneePicker","assignedTo","$agendaTitle","saveAgendaItem","$categoryName","saveCategory","click .btn-transcribe","transcribeMeeting","loader","Loader","BaseModel","idAttribute","parse","Attachments","meetingRecordingAttachments","AgendaItems","MeetingCategories","noCategory","beforeSave","validateHyperlink","hyperlink","test","startsWith","isToday","replace","mTime","dataProp","undefined","meetingDate","parseDateString","timeSplit","hours","isNaN","isOverdue","startDateTime","endDateTime","getDateDiff","CustomField","CustomFieldChoice","Settings","UserSettings","getSettings","attributes","viewSettings","setting","Contact","toJSON","put","res","notifyName","parameter","Meetings","Attachment","File","BaseCollection","getOriginMeetings","originMeetings","self","nonExistentOriginMeetings","meetingIds","originMeetingId","includes","followUpMeetings","sort","a","b","groupedNonExistentOriginMeetings","groupBy","group","originMeeting","followUpMeeting","getMeetingCount","getMeetingsFromOrigin","_toConsumableArray","Files","CustomFields","params","CustomFieldChoices","Templates","MeetingListDatatable","emptyTable","paging","getColumns","_this6","includeAllColumns","includeColumns","columnsDefault","columnName","_this5","columnData","_row$get","parseTimeString","meetingStatusNames","customField","fieldValue","getCustomFieldValue","commitments","customFieldType","BOOLEAN","CHOICE","choices","choice","join","DATETIME","INTEGER","toLocaleString","MONEY","parseFloat","formatHelpers","formatCurrency","PERCENT","toFixed","targetMeeting","mostRecentMeeting","max","canViewMeetings","canDeleteMeetings","orderable","searchable","className","visible","timeString","timeArray","hour","minute","hour12","getFilterData","statusFilter","getFilter","contains","MeetingsList","BaseView","comments","ACTIONITEMS","contactBadge","GLOBAL","shown.bs.collapse .meeting-collapse","hidden.bs.collapse .meeting-collapse","click .btn-settings","keyup .meeting-search","click .clear-filters","click .btn-add-meeting","click .btn-delete-meeting","click .btn-view-meeting","click .meeting-dropdown","click .btn-follow-up","click .btn-import-template","click .btn-save-a-template","beforeFirstRender","_beforeFirstRender","_callee3","_context3","expandedMeetings","canAdd","noneSelectedText","renderMeetings","initMeeting","viewMeeting","meetingCollapsed","originId","without","meetingExpanded","indexOf","searchChanged","search","clearFilters","$meetings","empty","filteredMeetings","toLowerCase","filteredOriginMeetingIds","uniq","append","dataTable","onPageSizeChange","headerData","onRowDoubleClick","contextMenuOptions","actions","onClick","isDanger","isShown","setFilter","meetingClicked","saveTemplate","MeetingTemplateCreatorModal","importTemplate","ImportTemplateModal","onImport","followUpMeetingClicked","previousMeeting","description","attendeeIds","addMeetingClicked","editSettings","viewMeetingClicked","isMostRecentMeeting","deleteMeetingClicked","TemplateManagement","templates","addTemplate","NewTemplateModal","editTemplate","EditTemplateModal","onClose","refresh","removeRow","fitHeight","TextEditorInput","label","patch","deleteTemplate","click .btn-import","fetchMeetingTemplates","tmp","templatePicker","selectedTemplate","showError","hideError","prop","AutocompleteInput","source","$name","trim","existingTemplate","overwriteExisting","fnSave","copyAttachments","copyAttendees","copyCategories","copyAgendaItems"],"mappings":"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","file":"app.js","sourcesContent":["PJQ.collections.meetings = {};\n\nPJQ.models.meetings = {};\n\nPJQ.views.meetings = {};\n\nPJQ.modules.meetings = {\n    routes: [\n        {\n            route: 'projects/:projectId/meetings',\n            name: 'meetings',\n            callback: function (projectId) {\n                PJQ.modules.projectWall.initProjectNavigator(parseInt(projectId), \"meetings\");\n            }\n        },\n        {\n            route: 'projects/:projectId/meetings/:meetingId',\n            name: 'meeting',\n            callback: function (projectId, meetingId) {\n                PJQ.modules.projectWall.initProjectNavigator(parseInt(projectId), \"meetings\", {\n                    meetingId: parseInt(meetingId)\n                });\n            }\n        }\n    ]\n};\n\nPJQ.app.addRoutes(PJQ.modules.meetings.routes);\n","PJQ.views.meetings.MeetingEditModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.MEETINGS, 'modal-meeting-edit'),\n        subTemplates: {\n            agendaItems: new PJQ.templating.Template(PJQ.constants.modules.MEETINGS, 'agenda-items'),\n            agendaItem: new PJQ.templating.Template(PJQ.constants.modules.MEETINGS, 'agenda-item')\n        },\n        width: '95%',\n        maxWidth: 1200,\n        minWidth: 700,\n        model: null,\n        isShowCloseButton: true,\n        onSave: _.noop(),\n        onDelete: _.noop()\n    },\n    events: {\n        'click .btn-save': 'saveMeeting',\n        'click .btn-delete': 'deleteMeeting',\n        'click .btn-close': 'close',\n        'click .nav-link': 'changeActiveView',\n        'click .btn-add-agenda-item': 'addAgendaItemClicked',\n        'click .btn-close-agenda-item': 'closeAgendaItemClicked',\n        'click .btn-open-agenda-item': 'openAgendaItemClicked',\n        'click .btn-edit-agenda-item': 'editAgendaItemClicked',\n        'click .btn-delete-agenda-item': 'deleteAgendaItemClicked',\n        'click .btn-add-category': 'addCategoryClicked',\n        'click .btn-edit-category': 'editCategoryClicked',\n        'click .btn-delete-category': 'deleteCategoryClicked',\n        'click .btn-edit-minutes': 'editMeetingMinutes',\n        'click .btn-save-minutes': 'saveMeetingMinutesClicked',\n        'click .category-dropdown': 'categoryClicked',\n        'click .btn-view-transcription': 'viewTranscription',\n        'click .btn-export': 'exportMeeting',\n        'click .btn-cancel-minutes': 'cancelMeetingMinutes',\n        'keydown .meeting-number': 'numbersOnly',\n        'click .btn-distribute': 'distributeAgendaItems',\n        'click .btn-view-previous-minutes': 'viewPreviousMinutes',\n        'click .toggle-attendance': 'toggleAttendance',\n        'input .meeting-description': 'descriptionChanged'\n    },\n    beforeModalCreated: async function () {\n        this.isFetched = false;\n        this.options.project = this.options.project ? this.options.project : PJQ.app.session.project;\n\n        if (this.model == null) {\n            this.model = new PJQ.models.meetings.Meeting({\n                projectId: this.options.project?.id,\n                templateId: this.options.templateId,\n                statusId: 1,\n                number: 1\n            });\n        }\n\n        if (this.options.project) {\n            this.customFields = await this.options.project.fetchMeetingCustomFields();\n        } else {\n            this.customFields = await PJQ.app.session.fetchMeetingCustomFields();\n        }\n\n        if (this.options.project) {\n            this.settings = await this.options.project.fetchMeetingSettings();\n        } else {\n            this.settings = await PJQ.app.session.fetchMeetingSettings();\n        }\n\n        if (!this.model.isNew()) {\n            await this.model.fetch();\n        } else {\n            this.model.set('isPublic', this.settings.get('isPublicDefault'));\n        }\n\n        if (_.size(this.model.get('timezone')) === 0) {\n            this.model.set('timezone', new Date().toLocaleTimeString('en-us', {timeZoneName: 'short'}).split(' ')[2]);\n        }\n\n        this.isFetched = true;\n        this.render();\n    },\n    beforeRender: function () {\n        if (!this.isFetched) {\n            return;\n        }\n\n        let status = this.model.get('statusId');\n        if (this.options.project) {\n            this.options.canEdit = PJQ.app.session.project.hasPermission('meetings.canEdit');\n            this.options.isAdmin = PJQ.app.session.project.hasPermission('meetings.isAdmin');\n            this.options.canDelete = this.options.isAdmin;\n            this.options.canSave = this.options.canEdit && status !== PJQ.constants.meetings.meetingStatus.CONCLUDED && status !== PJQ.constants.meetings.meetingStatus.CANCELLED;\n            this.options.canUploadRecording = PJQ.app.session.project.hasPermission('meetings.canEdit')\n                && status !== PJQ.constants.meetings.meetingStatus.CONCLUDED\n                && status !== PJQ.constants.meetings.meetingStatus.CANCELLED;\n        } else {\n            this.options.canEdit = true;\n            this.options.isAdmin = true;\n            this.options.canDelete = this.options.isAdmin;\n            this.options.canSave = this.options.canEdit && status !== PJQ.constants.meetings.meetingStatus.CONCLUDED && status !== PJQ.constants.meetings.meetingStatus.CANCELLED;\n            this.options.canUploadRecording = status !== PJQ.constants.meetings.meetingStatus.CONCLUDED\n                && status !== PJQ.constants.meetings.meetingStatus.CANCELLED;\n        }\n\n        this.options.canEditMinutes = (!PJQ.app.session.project || PJQ.app.session.project.hasPermission('meetings.canEdit')) &&\n            status !== PJQ.constants.meetings.meetingStatus.CONCLUDED &&\n            status !== PJQ.constants.meetings.meetingStatus.CANCELLED;\n\n        if (status === PJQ.constants.meetings.meetingStatus.IN_PROGRESS || status === PJQ.constants.meetings.meetingStatus.CONCLUDED || status === PJQ.constants.meetings.meetingStatus.CANCELLED) {\n            this.options.canEdit = false;\n            this.options.canDelete = false;\n            this.options.canUploadRecording = status === PJQ.constants.meetings.meetingStatus.IN_PROGRESS && (!PJQ.app.session.project || PJQ.app.session.project.hasPermission('meetings.canEdit'));\n        } else if (status === PJQ.constants.meetings.meetingStatus.DRAFT) {\n            this.options.canEdit = true;\n            this.options.canUploadRecording = true;\n        } else {\n            if (PJQ.app.session.project) {\n                this.options.canEdit = PJQ.app.session.project.hasPermission('meetings.canEdit');\n                this.options.canDelete = PJQ.app.session.project.hasPermission('meetings.isAdmin');\n                this.options.canUploadRecording = PJQ.app.session.project.hasPermission('meetings.canEdit');\n            } else {\n                this.options.canEdit = true;\n                this.options.canDelete = true;\n                this.options.canUploadRecording = true;\n            }\n        }\n    },\n    renderData: function () {\n        return {\n            model: this.model,\n            canEdit: this.options.canEdit,\n            canDelete: this.options.canDelete,\n            isAdmin: this.options.isAdmin,\n            isFetched: this.isFetched,\n            activeView: this.options.activeView,\n            canSave: this.options.canSave,\n            settings: this.settings,\n            canTranscribe: _.size(_.filter(this.model.meetingRecordings.models, function (recording) {\n                return !recording.get('delete')\n            }, this)) > 0 && PJQ.app.session.preferences.hasPref(PJQ.constants.preferenceTypes.ENABLE_MEETING_TRANSCRIPTIONS)\n        }\n    },\n    afterRender: function () {\n        if (!this.isFetched)\n            return;\n\n        this.renderGeneral();\n        if (!this.model.isNew()) {\n            this.renderAgendaItems();\n        }\n    },\n    descriptionChanged: function(e) {\n        let $input = $(e.currentTarget),\n            val = $input.val();\n\n        if (typeof val === 'string' && val.length > 4000) {\n            val = val.slice(0, 4000);\n            $input.val(val);\n        }\n\n        this.model.set('description', val);\n    },\n    viewPreviousMinutes: function (e) {\n        let $target = $(e.currentTarget),\n            $container = $target.closest('.agenda-item-container'),\n            $minutes = $container.find('.previous-minutes-display');\n\n        $minutes.off('shown.bs.collapse hidden.bs.collapse').on('shown.bs.collapse hidden.bs.collapse', function () {\n            if ($minutes.hasClass('show')) {\n                $container.find('.btn-view-previous-minutes').html('<i class=\"fas fa-angle-up mr-1\"></i>');\n            } else {\n                $container.find('.btn-view-previous-minutes').html('<i class=\"fas fa-angle-down mr-1\"></i>');\n            }\n        });\n\n        $minutes.collapse('toggle');\n    },\n    changeActiveView: function (e, view) {\n        let tab = e && e.target.hash ? e.target.hash.toUpperCase() : null;\n\n        if (view) {\n            tab = view;\n        }\n\n        switch (tab) {\n            case '#M_AGENDA':\n                this.options.activeView = 'agenda';\n                break;\n            default:\n                this.options.activeView = 'general';\n        }\n    },\n    renderGeneral: function () {\n        let fnSaveAttachment = _.bind(function (attachment) {\n            // If the attachment doesn't have an uploadId, recursively call this function every 2 seconds\n            if (attachment.get('uploadId')) {\n                let isNew = this.model.isNew();\n                this.model.save(null, {\n                    success: _.bind(function (model) {\n                        if (isNew && typeof this.options.onSave === 'function') {\n                            this.options.onSave(model, true);\n                        }\n                        this.render();\n                    }, this)\n                });\n            } else {\n                setTimeout(_.bind(function () {\n                    fnSaveAttachment(attachment)\n                }, this), 2000);\n            }\n        }, this);\n\n        this.listenTo(this.model.meetingRecordings, 'add', _.bind(function (attachment) {\n            // The attachment has been uploaded, but probably doesn't have an uploadId yet. Call fnSaveAttachment to make sure it saves\n            if (attachment.get('uploadId')) {\n                model.save();\n            } else {\n                fnSaveAttachment(attachment);\n            }\n        }, this));\n        new PJQ.Binder(this.$el, this.model, {\n            canEdit: !this.options.canEdit ? false : null,\n            useDecimalPercentFields: true,\n            watchElements: [\n                'input',\n                'textarea'\n            ]\n        });\n        let defaultDate = PJQ.helpers.dateHelpers.getDateString(this.model.get('date'), PJQ.helpers.dateHelpers.dateFormats.DATE_TIME, true);\n        this.datePicker = new PJQ.inputs.Datepicker({\n            el: this.$('.meeting-date'),\n            canEdit: this.options.canEdit,\n            timezone: 'UTC',\n            datepickerOptions: {\n                format: PJQ.helpers.dateHelpers.dateFormats.datePicker.DATE,\n                defaultDate: defaultDate\n            },\n            onChange: _.bind(function (newDate) {\n                let currentDate = this.model.get('date');\n                if (currentDate == null || PJQ.helpers.dateHelpers.getDateDaysDiff(newDate, new Date(currentDate)) !== 0) {\n                    this.model.set('date', newDate);\n                }\n            }, this)\n        });\n\n        if (_.size(this.customFields) > 0) {\n            this.meetingCustomFieldsForm = new PJQ.views.customFields.CustomFieldsForm({\n                el: this.$('.meeting-custom-fields'),\n                isAdmin: true,\n                isEdit: this.options.canEdit,\n                collection: this.customFields,\n                fieldValues: this.model.get('customFieldValues'),\n                onChange: () => {\n                    this.model.isDirty = true;\n                }\n            });\n        }\n\n        // Convert startTime to date for datepicker\n        let startTimeString = this.model.get('startTime'),\n            [startHours, startMinutes, startSeconds] = startTimeString ? startTimeString.split(':') : [0, 0, 0],\n            startDate = new Date();\n        startDate.setHours(startHours);\n        startDate.setMinutes(startMinutes);\n        startDate.setSeconds(startSeconds);\n\n        this.startTimePicker = new PJQ.inputs.Datepicker({\n            el: this.$('.meeting-start-time'),\n            canEdit: this.options.canEdit,\n            isTimeOnly: true,\n            timezone: this.model.get('timezone'),\n            isShowTimezone: true,\n            isEditTimezone: true,\n            datepickerOptions: {\n                format: PJQ.helpers.dateHelpers.dateFormats.datePicker.DATE_TIME,\n                defaultDate: startDate\n            },\n            onTimezoneChange: (tz) => {\n                this.model.set('timezone', tz);\n                this.endTimePicker.setTimezone(tz);\n            },\n            onChange: (newDate) => {\n                let time = PJQ.helpers.dateHelpers.getTimeString(new Date(newDate));\n                if (this.model.get('startTime') === time) {\n                    return;\n                }\n\n                this.model.set('startTime', time)\n\n                let dMinutes = this.model.durationInMinutes();\n                if (dMinutes < 0) {\n                    let startTime = this.model.getDateAndTime('start');\n                    this.model.set('endTime', PJQ.helpers.dateHelpers.getTimeString(startTime));\n\n                    if (this.endTimePicker) {\n                        this.endTimePicker.setValue(startTime)\n                    }\n                }\n            }\n        });\n\n        // Convert endTime to date for datepicker\n        let endTimeString = this.model.get('endTime'),\n            [endHours, endMinutes, endSeconds] = endTimeString ? endTimeString.split(':') : [0, 0, 0],\n            endDate = new Date();\n        endDate.setHours(endHours);\n        endDate.setMinutes(endMinutes);\n        endDate.setSeconds(endSeconds);\n\n        this.endTimePicker = new PJQ.inputs.Datepicker({\n            el: this.$('.meeting-end-time'),\n            canEdit: this.options.canEdit,\n            isTimeOnly: true,\n            timezone: this.model.get('timezone'),\n            isShowTimezone: true,\n            isEditTimezone: true,\n            datepickerOptions: {\n                format: PJQ.helpers.dateHelpers.dateFormats.datePicker.DATE_TIME,\n                defaultDate: endDate\n            },\n            onTimezoneChange: (tz) => {\n                this.model.set('timezone', tz);\n                this.startTimePicker.setTimezone(tz);\n            },\n            onChange: (newDate) => {\n                let time = PJQ.helpers.dateHelpers.getTimeString(new Date(newDate));\n                if (this.model.get('endTime') === time) {\n                    return;\n                }\n\n                this.model.set('endTime', time)\n\n                let dMinutes = this.model.durationInMinutes();\n                if (dMinutes < 0) {\n                    let endTime = this.model.getDateAndTime('end');\n                    this.model.set('startTime', PJQ.helpers.dateHelpers.getTimeString(endTime));\n\n                    if (this.startTimePicker) {\n                        this.startTimePicker.setValue(endTime)\n                    }\n                }\n            }\n        });\n\n        this.statusPicker = new PJQ.inputs.Selectpicker({\n            el: this.$('.select-status'),\n            defaultValue: this.model.get('statusId') != null ? this.model.get('statusId') : 1,\n            canEdit: ((!PJQ.app.session.project || PJQ.app.session.project.hasPermission('meetings.canEdit')) || this.options.canEdit),\n            isMultiple: false,\n            isIntChoices: true,\n            onChange: _.bind(function (value) {\n                let newStatus = value,\n                    oldStatus = this.model.get('statusId');\n                this.model.set('statusId', newStatus);\n                if (!this.model.isNew()) {\n                    this.model.save(null, {\n                        success: _.bind(function () {\n                            this.model.dirtyAttributes = {};\n                            if (typeof this.options.onSave === 'function')\n                                this.options.onSave(this.model);\n                            this.render();\n                            PJQ.notifications.notify.successNotify({\n                                message: 'Meeting saved successfully'\n                            });\n                        }, this)\n                    })\n                }\n            }, this)\n        });\n\n        if (this.model.get('statusId') === PJQ.constants.meetings.meetingStatus.DRAFT || this.model.get('statusId') === PJQ.constants.meetings.meetingStatus.SCHEDULED) {\n            this.attendeePicker = new PJQ.views.contacts.ContactsSelectInput({\n                el: this.$('.meeting-attendees'),\n                selectedContact: this.model.attendees.getAttendeeContacts(),\n                isReadOnly: !this.options.canEdit,\n                displayContactsBlock: true,\n                context: PJQ.app.session.project ? PJQ.constants.contacts.contexts.PROJECTCONTACTS : PJQ.constants.contacts.contexts.USERS,\n                isSingleChoice: false,\n                onChange: _.bind(function (selectedContacts) {\n                    let arr = _.map(selectedContacts, function (contact) {\n                        return contact.get('id') ? contact.get('id') : contact.id;\n                    });\n                    this.model.set('attendeeIds', arr);\n                    this.model.attendees = new PJQ.collections.meetings.MeetingAttendees(_.map(selectedContacts, function (contact) {\n                        return new PJQ.models.meetings.MeetingAttendee({\n                            id: contact.id,\n                            attendee: contact\n                        });\n                    }, this));\n\n                    this.model.isDirty = true;\n                }, this)\n            });\n        } else {\n            this.renderAttendanceDatatable();\n        }\n\n        this.fileUploader = new PJQ.views.files.FileUploaderGrid({\n            el: this.$('.meeting-file-uploader'),\n            collection: this.model.attachments,\n            canUpload: this.options.canEdit,\n            useApiV2: true,\n            canView: false,\n            canDelete: this.options.isAdmin && this.model.get('statusId') !== PJQ.constants.meetings.meetingStatus.CONCLUDED && this.model.get('statusId') !== PJQ.constants.meetings.meetingStatus.CANCELLED,\n            previewImageDimension: 150,\n            onSuccess: _.bind(function (file) {\n                this.model.isDirty = true;\n            }, this),\n            onDelete: _.bind(function (attachment, callback) {\n                if (attachment.get('id') > 0) {\n                    attachment.set('delete', true);\n                } else {\n                    attachment.destroy();\n                }\n\n                this.model.isDirty = true;\n                callback();\n            }, this)\n        })\n\n        this.recordingUploader = new PJQ.views.files.FileUploaderGrid({\n            el: this.$('.meeting-recording-uploader'),\n            allowedExtensions: ['wav', 'mpeg', 'mp3', 'webm'],\n            collection: this.model.meetingRecordings,\n            maxFiles: 1,\n            canUpload: this.options.canUploadRecording && _.size(this.model.meetingRecordings) === 0,\n            useApiV2: true,\n            canDelete: this.options.isAdmin && this.model.get('statusId') !== PJQ.constants.meetings.meetingStatus.CONCLUDED && this.model.get('statusId') !== PJQ.constants.meetings.meetingStatus.CANCELLED,\n            previewImageDimension: 150,\n            onSuccess: _.bind(function (file) {\n                this.model.isDirty = true;\n            }, this),\n            onDelete: _.bind(function (attachment, callback) {\n                if (attachment.get('id') > 0) {\n                    attachment.set('delete', true);\n                    this.model.save(null, {\n                        success: _.bind(function (model) {\n                            this.options.canUploadRecording = false;\n                            this.render();\n                        }, this)\n                    });\n                } else {\n                    attachment.destroy();\n                    this.options.canUploadRecording = false;\n                    this.render();\n                }\n\n                this.model.isDirty = true;\n                callback();\n            }, this)\n        })\n    },\n    renderAttendanceDatatable: function () {\n        this.attendanceTable = new PJQ.views.dataTables.DataTable({\n            el: this.$('.meeting-attendees'),\n            isHideSearch: true,\n            data: this.model.attendees.models,\n            rowId: \"cid\",\n            order: [0, 'asc'],\n            pageLength: 10,\n            language: {\n                zeroRecords: 'No Scheduled Attendees'\n            },\n            columns: [\n                {\n                    \"data\": \"attributes.attendee\",\n                    \"title\": \"Name\",\n                    \"render\": (data, type, row) => {\n                        let result = '';\n                        if (row.attendee != null) {\n                            result = PJQ.helpers.contacts.getContactAnchor({\n                                id: row.attendee.id,\n                                name: row.attendee.get('contactName')\n                            });\n                        }\n                        return result;\n                    }\n                },\n                {\n                    \"data\": \"attributes.attendee\",\n                    \"title\": \"Company\",\n                    \"render\": (data, type, row) => {\n                        let result = '';\n                        if (row.attendee != null) {\n                            return row.attendee.get('companyName');\n                        }\n                        return result;\n                    }\n                },\n                {\n                    \"data\": \"attributes.isPresent\",\n                    \"title\": \"Present\",\n                    \"width\": \"7%\",\n                    \"render\": (data, type, row) => {\n                        let html = ''\n                        if (this.model.get('statusId') === PJQ.constants.meetings.meetingStatus.IN_PROGRESS && (!PJQ.app.session.project || PJQ.app.session.project.hasPermission('meetings.canEdit'))) {\n                            html = '<div class=\"pretty p-switch ml-3\"><input type=\"radio\" name=\"attendance-' + row.cid + '\" ' + (data ? 'checked' : '') + ' class=\"cb-primary toggle-attendance\" data-attribute=\"isPresent\"/><div class=\"state p-success\"><label>&nbsp;</label></div></div>';\n                        } else {\n                            html = data ? '<i class=\"fas fa-check text-success\"></i>' : '<i class=\"fas fa-times text-danger\"></i>';\n                        }\n\n                        return '<div class=\"wd-100 text-align-center\">' + (html) + '</div>'\n                    }\n                },\n                {\n                    \"data\": \"attributes.isAbsent\",\n                    \"title\": \"Absent\",\n                    \"width\": \"7%\",\n                    \"render\": (data, type, row) => {\n                        let html = ''\n                        if (this.model.get('statusId') === PJQ.constants.meetings.meetingStatus.IN_PROGRESS && (!PJQ.app.session.project || PJQ.app.session.project.hasPermission('meetings.canEdit'))) {\n                            html = '<div class=\"pretty p-switch ml-3\"><input type=\"radio\" name=\"attendance-' + row.cid + '\" ' + (data ? 'checked' : '') + ' class=\"cb-primary toggle-attendance\" data-attribute=\"isAbsent\"/><div class=\"state p-success\"><label>&nbsp;</label></div></div>';\n                        } else {\n                            html = data ? '<i class=\"fas fa-check text-success\"></i>' : '<i class=\"fas fa-times text-danger\"></i>';\n                        }\n\n                        return '<div class=\"wd-100 text-align-center\">' + (html) + '</div>'\n                    }\n                },\n                {\n                    \"data\": \"attributes.isDistribution\",\n                    \"title\": \"For Distribution Only\",\n                    \"width\": \"18%\",\n                    \"render\": (data, type, row) => {\n                        let html = ''\n                        if (this.model.get('statusId') === PJQ.constants.meetings.meetingStatus.IN_PROGRESS && (!PJQ.app.session.project || PJQ.app.session.project.hasPermission('meetings.canEdit'))) {\n                            html = '<div class=\"pretty p-switch ml-3\"><input type=\"radio\" name=\"attendance-' + row.cid + '\" ' + (data ? 'checked' : '') + ' class=\"cb-primary toggle-attendance\" data-attribute=\"isDistribution\"/><div class=\"state p-success\"><label>&nbsp;</label></div></div>';\n                        } else {\n                            html = data ? '<i class=\"fas fa-check text-success\"></i>' : '<i class=\"fas fa-times text-danger\"></i>';\n                        }\n\n                        return '<div class=\"wd-100 text-align-center\">' + (html) + '</div>'\n                    }\n                },\n            ]\n        });\n    },\n    toggleAttendance: function (e) {\n        let target = $(e.currentTarget),\n            attribute = target.data('attribute'),\n            attendee = this.attendanceTable.getRow(target.closest('tr')).data();\n\n        attendee.set({\n            isPresent: attribute === 'isPresent',\n            isAbsent: attribute === 'isAbsent',\n            isDistribution: attribute === 'isDistribution'\n        });\n    },\n    viewTranscription: function () {\n        let recordings = _.filter(this.model.meetingRecordings.models, function (recording) {\n                return !recording.get('delete')\n            }, this),\n            recording = recordings[0];\n\n        new PJQ.views.meetings.ViewMeetingTranscriptionModal({\n            model: recording,\n            meeting: this.model\n        });\n    },\n    numbersOnly: function (e) {\n        return PJQ.helpers.inputHelpers.numbersOnly(e, false, false);\n    },\n    renderAgendaItems: function () {\n        let categories = _.sortBy(this.model.categories.models, function (c) {\n                return c.id == null ? -1 : c.id;\n            }),\n            categoryIds = [],\n            hasUncategorizedItems = this.model.agendaItems.findWhere({categoryId: null}) != null;\n        _.each(categories, _.bind(function (c) {\n            if (c.id > 0 || null != this.model.agendaItems.findWhere({categoryId: c.id})) {\n                categoryIds.push(c.id);\n            }\n        }, this));\n\n        this.renderSubTemplate(false, this.options.subTemplates.agendaItems, this.$('.meeting-agenda'), {\n            subTemplates: this.options.subTemplates,\n            items: this.model.agendaItems.models,\n            meetings: this.options.meetings,\n            categories: categories,\n            settings: this.settings,\n            meeting: this.model,\n            canEdit: this.options.canEdit,\n            canDelete: this.options.canDelete,\n            canEditMinutes: this.options.canEditMinutes,\n        }, _.bind(function (el) {\n            _.each(this.model.agendaItems.models, function (model) {\n                let category = this.model.categories.get(model.get('categoryId')),\n                    agendaNumber;\n\n                if (category) {\n                    let sortNumber = hasUncategorizedItems ? category.get('sortOrder') + 1 : category.get('sortOrder');\n                    agendaNumber = sortNumber + \".\" + model.get('sortOrder');\n                } else {\n                    agendaNumber = \"1.\" + model.get('sortOrder');\n                }\n\n                this.renderAgendaItem(model, agendaNumber);\n            }, this);\n        }, this));\n\n\n        if (this.options.canEdit) {\n            let categorySortable = new PJQ.Sortable(this.$('.agenda-items-container'), {\n                items: '.category-dropdown',\n                multiple: false,\n                tolerance: 'pointer',\n                handle: '.category-sort',\n                onStart: () => {\n                    this.$('.collapse').hide();\n                    categorySortable.refreshPositions();\n                },\n                onStop: (e, ui) => {\n                    this.setCategorySort(ui.item);\n                }\n            });\n\n            let agendaSortable = new PJQ.Sortable(this.$('.collapse'), {\n                items: '.agenda-item-outer',\n                multiple: false,\n                tolerance: 'pointer',\n                handle: '.agenda-item-sort',\n                onStart: () => {\n                    agendaSortable.refreshPositions();\n                },\n                onStop: (e, ui) => {\n                    this.setAgendaItemSort(ui.item);\n                }\n            });\n        }\n    },\n    setAgendaItemSort: function (sortedEl) {\n        let sortOrder = 1,\n            collapseEl = this.$(sortedEl).closest('.collapse'),\n            sortedCid = this.$(sortedEl).data('cid'),\n            sortedItem = this.model.agendaItems.get(sortedCid),\n            updateSort = false;\n\n        _.each(collapseEl.find('.agenda-item-outer'), function (element) {\n            let itemCid = this.$(element).data('cid');\n            let agendaItem = this.model.agendaItems.get(itemCid);\n\n            if (agendaItem) {\n                if (agendaItem === sortedItem && sortedItem.get('sortOrder') !== sortOrder) {\n                    updateSort = true;\n                }\n\n                agendaItem.set('sortOrder', sortOrder);\n                sortOrder++;\n            }\n        }, this);\n\n        if (updateSort) {\n            sortedItem.updateSort();\n        }\n\n        this.renderAgendaItems();\n    },\n    setCategorySort: function (sortedEl) {\n        let categories = this.model.categories.models,\n            sortOrder = 1,\n            sortedCid = this.$(sortedEl).data('cid'),\n            sortedCategory = this.model.categories.get(sortedCid),\n            updateSort = false;\n\n        _.each(this.$('.category-dropdown'), function (category) {\n            let cid = this.$(category).data('cid'),\n                model = _.find(categories, function (c) {\n                    return c.cid === cid;\n                });\n\n            if (model) {\n                if (model === sortedCategory && model.get('sortOrder') !== sortOrder) {\n                    updateSort = true;\n                }\n\n                model.set('sortOrder', sortOrder);\n                sortOrder++;\n            }\n        });\n\n        if (updateSort) {\n            sortedCategory.updateSort();\n        }\n        this.renderAgendaItems();\n    },\n    renderAgendaItem: function (agendaItem, agendaNumber) {\n        if (!agendaNumber && agendaItem.agendaNumber != null) {\n            agendaNumber = agendaItem.agendaNumber;\n        }\n        agendaItem.agendaNumber = agendaNumber;\n\n        let $item = this.$('.agenda-item-outer[data-cid=\"' + agendaItem.cid + '\"]');\n        this.renderSubTemplate(false, this.options.subTemplates.agendaItem, $item, {\n            model: agendaItem,\n            canEdit: this.options.canEdit,\n            settings: this.settings,\n            canEditMinutes: this.options.canEditMinutes,\n            canDelete: this.options.canDelete,\n            agendaNumber: agendaItem.agendaNumber,\n            meetings: this.options.meetings,\n        }, _.bind(function (el) {\n            let $agendaItemEl = el.find('.agenda-item-container[data-cid=\"' + (agendaItem.cid) + '\"]');\n\n            if (agendaItem.get('isEditing')) {\n                agendaItem.minutesEditor = new PJQ.inputs.HTMLEditor({\n                    el: $agendaItemEl.find('.meeting-minutes-edit'),\n                    defaultValue: agendaItem.get('minutes'),\n                    editorHeight: 100,\n                    isHideTokens: true,\n                    onChange: (val) => {\n                        agendaItem.set('minutes', val);\n                    }\n                });\n\n                el.find('.note-editor').addClass('wd-100');\n            }\n\n\n            agendaItem.fileUploader = new PJQ.views.files.FileUploaderGrid({\n                el: $agendaItemEl.find('.agenda-item-attachments'),\n                collection: agendaItem.attachments,\n                canUpload: this.options.canEditMinutes,\n                useApiV2: true,\n                canView: false,\n                canDelete: this.options.isAdmin,\n                previewImageDimension: 150,\n                onSuccess: _.bind(function (file) {\n                    agendaItem.isDirty = true;\n                }, this),\n                onDelete: (attachment, callback) => {\n                    if (attachment.get('id') > 0) {\n                        attachment.set('delete', true);\n                    } else {\n                        attachment.destroy();\n                    }\n\n                    agendaItem.isDirty = true;\n                    callback();\n                }\n            })\n        }, this));\n    },\n    categoryClicked: function (e) {\n        let dropdown = $(e.currentTarget),\n            cid = dropdown.data('cid'),\n            category = this.model.categories.get(cid),\n            collapse = dropdown.next('.collapse'),\n            caret = dropdown.find('.category-caret')\n\n        if (!collapse.hasClass('show')) {\n            caret.find('i').removeClass('fa-caret-right').addClass('fa-caret-down')\n            category.set('isExpanded', true);\n        } else {\n            caret.find('i').removeClass('fa-caret-down').addClass('fa-caret-right')\n            category.set('isExpanded', false);\n        }\n    },\n    editMeetingMinutes: function (e) {\n        let $agendaItemContainer = $(e.currentTarget).closest('.agenda-item-container'),\n            cid = $agendaItemContainer.data('cid'),\n            agendaItem = this.model.agendaItems.get(cid);\n\n        agendaItem.set('isEditing', true);\n        this.renderAgendaItems();\n    },\n    exportMeeting: function () {\n        let callback = _.bind(function () {\n            PJQ.files.downloadFile(PJQ.helpers.urlHelpers.generateEndpoint([\n                {\n                    endpoint: 'meetings',\n                    value: this.model.get('id')\n                },\n                {\n                    endpoint: 'export',\n                }\n            ]), {isAPIv2: true});\n\n            this.renderAgendaItems();\n        }, this);\n\n        if (this.options.canEdit) {\n            this.save(callback);\n        } else {\n            callback();\n        }\n    },\n    distributeAgendaItems: function () {\n        let isMinutes = this.model.get('statusId') === PJQ.constants.meetings.meetingStatus.CONCLUDED || this.model.get('statusId') === PJQ.constants.meetings.meetingStatus.IN_PROGRESS;\n        new PJQ.views.modals.YesNo({\n            header: \"Distribute \" + (isMinutes ? \"Meeting Minutes?\" : \"Meeting Agenda?\"),\n            body: \"This will email all attendees the \" + (isMinutes ? \"meeting minutes\" : \"agenda\") + \" for this meeting. Would you like to continue?\",\n            onYes: _.bind(function () {\n                this.model.save(null, {\n                    success: _.bind(function () {\n                        new PJQ.ajax.Request({\n                            isAPIv2: true,\n                            endpoint: PJQ.helpers.urlHelpers.generateEndpoint([\n                                {\n                                    endpoint: 'meetings',\n                                    value: this.model.get('id')\n                                },\n                                {\n                                    endpoint: 'email'\n                                }\n                            ]),\n                        }).post().done(_.bind(function (response) {\n                            PJQ.notifications.notify.successNotify({\n                                message: 'Successfully distributed'\n                            });\n                        }, this)).fail(_.bind(function (xhr, err, result) {\n                            PJQ.notifications.notify.errorNotify({\n                                message: \"Encountered an error while distributing this meeting. Please contact customer service.\"\n                            });\n                        }, this));\n                    }, this)\n                }, this)\n            }, this)\n        });\n    },\n    saveMeetingMinutesClicked: function (e) {\n        let $agendaItemContainer = $(e.currentTarget).closest('.agenda-item-container'),\n            cid = $agendaItemContainer.data('cid'),\n            agendaItem = this.model.agendaItems.get(cid);\n        this.saveMeetingMinutes(agendaItem);\n        this.renderAgendaItems();\n    },\n    saveMeetingMinutes: function (agendaItem) {\n        if (agendaItem == null || agendaItem.minutesEditor == null) {\n            return;\n        }\n\n        agendaItem.save({\n            minutes: agendaItem.minutesEditor.getValue(),\n            isEditing: false\n        });\n    },\n    saveOpenMinutes: function () {\n        _.each(this.model.agendaItems.models, (agendaItem) => {\n            if (agendaItem.get('isEditing') !== true) {\n                return;\n            }\n\n            this.saveMeetingMinutes(agendaItem);\n        });\n        this.renderAgendaItems();\n    },\n    cancelMeetingMinutes: function (e) {\n        let $agendaItemContainer = $(e.currentTarget).closest('.agenda-item-container'),\n            cid = $agendaItemContainer.data('cid'),\n            agendaItem = this.model.agendaItems.get(cid);\n\n        agendaItem.set('isEditing', false);\n        this.renderAgendaItems();\n    },\n    addCategoryClicked: function (e) {\n        let category = new PJQ.models.meetings.MeetingCategory({\n            meetingId: this.model.id\n        })\n\n        this.editCategory(category);\n    },\n    editCategoryClicked: function (e) {\n        e.stopPropagation();\n\n        let target = $(e.currentTarget),\n            dropdown = target.closest('.category-dropdown'),\n            cid = dropdown.data('cid'),\n            category = this.model.categories.get(cid);\n\n        this.editCategory(category);\n    },\n    deleteCategoryClicked: function (e) {\n        e.stopPropagation();\n\n        let target = $(e.currentTarget),\n            dropdown = target.closest('.category-dropdown'),\n            cid = dropdown.data('cid'),\n            category = this.model.categories.get(cid);\n\n        this.deleteCategory(category);\n    },\n    editCategory: function (category) {\n        new PJQ.views.meetings.CategoryEditModal({\n            meeting: this.model,\n            model: category,\n            onDelete: _.bind(function (category) {\n                this.model.categories.remove(category);\n                this.renderAgendaItems();\n            }, this),\n            onSave: _.bind(function (category, isNew) {\n                if (isNew) {\n                    this.model.categories.add(category);\n                }\n                this.renderAgendaItems();\n            }, this)\n        });\n    },\n    deleteCategory: function (category) {\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Confirm Delete\",\n            body: \"Are you sure you want to delete this category?  This will also delete any items in the category.\",\n            onDelete: _.bind(function () {\n                category.destroy({\n                    success: _.bind(function () {\n                        this.model.agendaItems.remove(_.filter(this.model.agendaItems.models, function (model) {\n                            return model.get('categoryId') === category.id;\n                        }, this));\n                        this.model.categories.remove(category);\n                        this.renderAgendaItems();\n                    }, this)\n                })\n            }, this)\n        });\n    },\n    addAgendaItemClicked: function (e) {\n        e.stopPropagation();\n        let categoryId = $(e.currentTarget).data('category-id'),\n            categoryAgendaItems = this.model.agendaItems.where({categoryId: categoryId == null ? null : categoryId});\n\n        let agendaItem = new PJQ.models.meetings.AgendaItem({\n            meetingId: this.model.id,\n            priorityId: 1,\n            statusId: 1,\n            categoryId: categoryId && categoryId !== '' ? parseInt(categoryId) : null,\n            sortOrder: _.size(categoryAgendaItems) + 1\n        });\n\n        this.editAgendaItem(agendaItem);\n    },\n    closeAgendaItemClicked: function (e) {\n        let $agendaItemContainer = $(e.currentTarget).closest('.agenda-item-container'),\n            cid = $agendaItemContainer.data('cid'),\n            agendaItem = this.model.agendaItems.get(cid);\n        agendaItem.set('statusId', PJQ.constants.meetings.meetingAgendaStatus.CLOSED);\n        agendaItem.save();\n        this.renderAgendaItem(agendaItem);\n    },\n    openAgendaItemClicked: function (e) {\n        let $agendaItemContainer = $(e.currentTarget).closest('.agenda-item-container'),\n            cid = $agendaItemContainer.data('cid'),\n            agendaItem = this.model.agendaItems.get(cid);\n        agendaItem.set('statusId', PJQ.constants.meetings.meetingAgendaStatus.OPEN);\n        agendaItem.save();\n        this.renderAgendaItem(agendaItem);\n    },\n    editAgendaItemClicked: function (e) {\n        let $agendaItemContainer = $(e.currentTarget).closest('.agenda-item-container'),\n            cid = $agendaItemContainer.data('cid'),\n            agendaItem = this.model.agendaItems.get(cid);\n        this.editAgendaItem(agendaItem);\n    },\n    editAgendaItem: function (agendaItem) {\n        new PJQ.views.meetings.AgendaItemEditModal({\n            meeting: this.model,\n            model: agendaItem,\n            onDelete: _.bind(function (agendaItem) {\n                this.model.agendaItems.remove(agendaItem);\n                this.renderAgendaItems();\n            }, this),\n            onSave: _.bind(function (agendaItem, isNew) {\n                if (isNew) {\n                    this.model.agendaItems.add(agendaItem);\n                    this.renderAgendaItems();\n                } else {\n                    this.renderAgendaItems();\n                }\n            }, this)\n        });\n    },\n    deleteAgendaItemClicked: function (e) {\n        let $agendaItemContainer = $(e.currentTarget).closest('.agenda-item-container'),\n            cid = $agendaItemContainer.data('cid'),\n            agendaItem = this.model.agendaItems.get(cid);\n        this.deleteAgendaItem(agendaItem);\n    },\n    deleteAgendaItem: function (agendaItem) {\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Confirm Delete\",\n            body: \"Are you sure you want to delete this agenda item?\",\n            onDelete: _.bind(function () {\n                this.model.agendaItems.remove(agendaItem);\n                agendaItem.destroy();\n                this.renderAgendaItems();\n            }, this)\n        });\n    },\n    validate: function () {\n        let isValid = true;\n\n        if (this.meetingCustomFieldsForm != null && !this.meetingCustomFieldsForm.validate()) {\n            isValid = false;\n        }\n\n        let $meetingName = this.$('.meeting-name');\n        PJQ.helpers.inputHelpers.setInputError($meetingName, true);\n        if (this.model.get('name') == null || this.model.get('name').length === 0) {\n            PJQ.helpers.inputHelpers.setInputError($meetingName, false);\n            isValid = false;\n        }\n\n        let $meetingNumber = this.$('.meeting-number');\n        PJQ.helpers.inputHelpers.setInputError($meetingNumber, true);\n        if (this.model.get('number') == null || this.model.get('number').length === 0) {\n            PJQ.helpers.inputHelpers.setInputError($meetingNumber, false);\n            isValid = false;\n        }\n\n        let $meetingDate = this.$('.meeting-date');\n        PJQ.helpers.inputHelpers.setInputError($meetingDate, true);\n        if (PJQ.app.session.project && (this.model.get('date') == null || this.model.get('date').length === 0)) {\n            PJQ.helpers.inputHelpers.setInputError($meetingDate, false);\n            isValid = false;\n        }\n\n        let $meetingStartTime = this.$('.meeting-start-time');\n        PJQ.helpers.inputHelpers.setInputError($meetingStartTime, true);\n        if (this.model.get('startTime') == null || this.model.get('startTime').length === 0) {\n            PJQ.helpers.inputHelpers.setInputError($meetingStartTime, false);\n            isValid = false;\n        }\n\n        let $meetingEndTime = this.$('.meeting-end-time');\n        PJQ.helpers.inputHelpers.setInputError($meetingEndTime, true);\n        if (this.model.get('endTime') == null || this.model.get('endTime').length === 0) {\n            PJQ.helpers.inputHelpers.setInputError($meetingEndTime, false);\n            isValid = false;\n        }\n        return isValid;\n    },\n    saveMeeting: function () {\n        let isNew = this.model.isNew(),\n            callback = _.bind(function () {\n                PJQ.notifications.notify.successNotify({\n                    message: 'Meeting saved successfully'\n                });\n\n                if (typeof this.options.onSave === 'function')\n                    this.options.onSave(this.model, isNew);\n\n                if (!isNew) {\n                    this.removeModal();\n                } else {\n                    this.render();\n                }\n            }, this);\n\n        this.saveOpenMinutes();\n        this.save(callback, isNew);\n    },\n    save: function (callback, isNew) {\n        if (!this.validate()) {\n            return;\n        }\n\n        if (this.fileUploader.isUploading() || this.recordingUploader.isUploading()) {\n            new PJQ.views.BaseModal({\n                header: \"Files Uploading\",\n                body: \"You can't save while files are uploading\"\n            });\n            return;\n        }\n\n        if (!this.model.get('attendeeIds')) {\n            this.model.set('attendeeIds', []);\n        }\n\n        this.model.set('customFieldValues', this.meetingCustomFieldsForm != null ? this.meetingCustomFieldsForm.getChanged() : null);\n\n        this.model.save(null, {\n            success: _.bind(function () {\n                if (typeof callback === 'function') {\n                    callback();\n                }\n            }, this),\n            error: _.bind(function () {\n                PJQ.notifications.notify.errorNotify({\n                    message: \"Encountered an error while saving this Meeting. Please contact customer service.\"\n                });\n            }, this)\n        })\n    },\n    deleteMeeting: function () {\n        let meetingId = this.model.id;\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Confirm Delete\",\n            body: \"Are you sure you want to delete this meeting?\",\n            onDelete: _.bind(function () {\n                this.model.destroy();\n                if (typeof this.options.onDelete === 'function') {\n                    this.options.onDelete();\n                    this.removeModal();\n                }\n            }, this)\n        });\n    },\n    close: function () {\n        let editPerms = PJQ.app.session.project.hasPermission('meetings.canEdit');\n        if ((this.model.hasChanged() || 0 < _.size(this.model.agendaItems.getChangedModels())) && editPerms) {\n            new PJQ.views.modals.SaveDontSave({\n                header: \"Unsaved Changes\",\n                body: \"Do you want to save changes?\",\n                onSave: _.bind(function () {\n                    this.saveMeeting();\n                    this.removeModal();\n                }, this),\n                onDontSave: _.bind(function () {\n                    this.removeModal();\n                }, this)\n            });\n        } else {\n            this.removeModal();\n        }\n    }\n});\n\nPJQ.views.meetings.AgendaItemEditModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.MEETINGS, 'modal-agenda-item-edit'),\n        width: '65%',\n        maxWidth: 800,\n        model: null,\n        isShowCloseButton: true,\n        onSave: _.noop(),\n        onDelete: _.noop()\n    },\n    events: {\n        'click .btn-save': 'saveAgendaItem',\n        'click .btn-delete': 'deleteAgendaItem',\n        'click .btn-close': 'close',\n        'input .agenda-item-description': 'descriptionChanged'\n    },\n    beforeModalCreated: async function () {\n        this.isFetched = false;\n        if (PJQ.app.session.project) {\n            this.options.canEdit = PJQ.app.session.project.hasPermission('meetings.canEdit');\n            this.options.isAdmin = PJQ.app.session.project.hasPermission('meetings.isAdmin');\n            this.options.canDelete = this.options.isAdmin;\n        } else {\n            this.options.canEdit = true;\n            this.options.isAdmin = true;\n            this.options.canDelete = true;\n        }\n\n        if (!this.model) {\n            this.model = new PJQ.models.meetings.AgendaItem();\n        }\n\n        if (this.options.project) {\n            this.settings = await this.options.project.fetchMeetingSettings();\n        } else {\n            this.settings = await PJQ.app.session.fetchMeetingSettings();\n        }\n        this.isFetched = true;\n\n        this.render();\n    },\n    beforeRender: function () {\n    },\n    renderData: function () {\n        return {\n            model: this.model,\n            settings: this.settings,\n            meeting: this.options.meeting,\n            canEdit: this.options.canEdit,\n            canDelete: this.options.canDelete,\n            isAdmin: this.options.isAdmin,\n            isFetched: this.isFetched,\n        }\n    },\n    afterRender: function () {\n        if (!this.isFetched)\n            return;\n\n        this.renderGeneral();\n    },\n    renderGeneral: function () {\n        new PJQ.Binder(this.$el, this.model, {\n            canEdit: !this.options.canEdit ? false : null,\n            useDecimalPercentFields: true,\n            watchElements: [\n                'input',\n                'textarea'\n            ]\n        });\n        let defaultDate = PJQ.helpers.dateHelpers.getDateString(this.model.get('dueDate'), PJQ.helpers.dateHelpers.dateFormats.DATE_TIME, true);\n        new PJQ.inputs.Datepicker({\n            el: this.$('.due-date'),\n            canEdit: this.options.canEdit,\n            timezone: 'UTC',\n            datepickerOptions: {\n                format: PJQ.helpers.dateHelpers.dateFormats.datePicker.DATE,\n                defaultDate: defaultDate\n            },\n            onChange: _.bind(function (newDate) {\n                let currentDate = this.model.get('date');\n                if (currentDate == null || PJQ.helpers.dateHelpers.getDateDaysDiff(newDate, new Date(currentDate)) !== 0) {\n                    this.model.set('dueDate', newDate);\n                }\n            }, this)\n        });\n\n        this.statusPicker = new PJQ.inputs.Selectpicker({\n            el: this.$('.select-status'),\n            defaultValue: this.model.get('statusId') != null ? this.model.get('statusId') : 1,\n            canEdit: true,\n            isMultiple: false,\n            isIntChoices: true,\n            onChange: _.bind(function (value) {\n                let newStatus = value;\n                this.model.set('statusId', newStatus);\n            }, this)\n        });\n\n        if (!this.settings.get('disableAgendaItemPriority')) {\n            this.priorityPicker = new PJQ.inputs.Selectpicker({\n                el: this.$('.select-priority'),\n                defaultValue: this.model.get('priorityId') != null ? this.model.get('priorityId') : 1,\n                canEdit: true,\n                isMultiple: false,\n                isIntChoices: true,\n                onChange: _.bind(function (value) {\n                    let newPriority = value;\n                    this.model.set('priorityId', newPriority);\n                }, this)\n            });\n        }\n\n        this.categoryPicker = new PJQ.inputs.Selectpicker({\n            el: this.$('.select-category'),\n            defaultValue: this.model.get('categoryId'),\n            canEdit: true,\n            isMultiple: false,\n            isIntChoices: true,\n            onChange: _.bind(function (value) {\n                let newCategory = value;\n                this.model.set('categoryId', newCategory);\n            }, this)\n        });\n\n        this.assigneePicker = new PJQ.views.contacts.ContactsSelectInput({\n            el: this.$('.agenda-assigned-to'),\n            selectedContact: this.model.assignedTo,\n            isReadOnly: !this.options.canEdit,\n            displayContactsBlock: true,\n            context: PJQ.app.session.project ? PJQ.constants.contacts.contexts.PROJECTCONTACTS : PJQ.constants.contacts.contexts.USERS,\n            isSingleChoice: true,\n            onChange: _.bind(function (selectedContact) {\n                this.model.isDirty = true;\n                this.model.assignedTo = selectedContact;\n                this.model.set('assignedToId', selectedContact ? selectedContact.get('id') : null);\n            }, this)\n        });\n\n        this.fileUploader = new PJQ.views.files.FileUploaderGrid({\n            el: this.$('.agenda-item-file-uploader'),\n            collection: this.model.attachments,\n            canUpload: this.options.canEdit,\n            useApiV2: true,\n            canView: false,\n            canDelete: this.options.isAdmin,\n            previewImageDimension: 150,\n            onSuccess: _.bind(function (file) {\n                this.model.isDirty = true;\n            }, this),\n            onDelete: _.bind(function (attachment, callback) {\n                if (attachment.get('id') > 0) {\n                    attachment.set('delete', true);\n                } else {\n                    attachment.destroy();\n                }\n\n                this.model.isDirty = true;\n                callback();\n            }, this)\n        })\n    },\n    descriptionChanged: function(e) {\n        let $input = $(e.currentTarget),\n            val = $input.val();\n\n        if (typeof val === 'string' && val.length > 4000) {\n            val = val.slice(0, 4000);\n            $input.val(val);\n        }\n\n        this.model.set('description', val);\n    },\n    validate: function () {\n        let isValid = true;\n\n        let $agendaTitle = this.$('.agenda-item-title');\n        PJQ.helpers.inputHelpers.setInputError($agendaTitle, true);\n        if (this.model.get('title') == null || this.model.get('title').length === 0) {\n            PJQ.helpers.inputHelpers.setInputError($agendaTitle, false);\n            isValid = false;\n        }\n\n        return isValid;\n    },\n    saveAgendaItem: function () {\n        if (!this.validate()) {\n            return;\n        }\n        let isNew = this.model.isNew();\n        let callback = _.bind(function () {\n            if (typeof this.options.onSave === 'function')\n                this.options.onSave(this.model, isNew);\n\n            this.removeModal();\n        }, this);\n\n        this.save(callback);\n    },\n    save: function (callback) {\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            return;\n        }\n\n        if (!this.model.get('assignedToId')) {\n            this.model.set('assignedToId', 0);\n        }\n\n        this.model.save(null, {\n            success: _.bind(function () {\n                if (typeof callback === 'function') {\n                    callback();\n                }\n            }, this),\n            error: _.bind(function () {\n                PJQ.notifications.notify.errorNotify({\n                    message: \"Encountered an error while saving this category. Please contact customer service.\"\n                });\n            }, this)\n        })\n    },\n    deleteAgendaItem: function () {\n        let agendaItemId = this.model.id;\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Confirm Delete\",\n            body: \"Are you sure you want to delete this agenda item?\",\n            onDelete: _.bind(function () {\n                this.model.destroy();\n                if (typeof this.options.onDelete === 'function')\n                    this.options.onDelete(this.model);\n\n                this.removeModal();\n            }, this)\n        });\n    },\n    close: function () {\n        this.removeModal();\n    }\n});\n\nPJQ.views.meetings.CategoryEditModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.MEETINGS, 'modal-category-edit'),\n        width: '40%',\n        maxWidth: 600,\n        model: null,\n        isShowCloseButton: true,\n        onSave: _.noop(),\n        onDelete: _.noop()\n    },\n    events: {\n        'click .btn-save': 'saveCategory',\n        'click .btn-delete': 'deleteCategory',\n        'click .btn-close': 'close',\n    },\n    beforeModalCreated: function () {\n        if (PJQ.app.session.project) {\n            this.options.canEdit = PJQ.app.session.project.hasPermission('meetings.canEdit');\n            this.options.isAdmin = PJQ.app.session.project.hasPermission('meetings.isAdmin');\n            this.options.canDelete = this.options.isAdmin;\n        } else {\n            this.options.canEdit = true;\n            this.options.isAdmin = true;\n            this.options.canDelete = true;\n        }\n\n        this.isFetched = false;\n\n        if (!this.model) {\n            this.model = new PJQ.models.meetings.MeetingCategory();\n        }\n\n        if (!this.model.isNew() && !this.model.isFetched) {\n            this.model.fetch({\n                success: _.bind(function () {\n                    this.isFetched = true;\n                    this.render();\n                }, this)\n            });\n        } else {\n            this.isFetched = true;\n            this.render();\n        }\n    },\n    beforeRender: function () {\n    },\n    renderData: function () {\n        return {\n            model: this.model,\n            meeting: this.options.meeting,\n            canEdit: this.options.canEdit,\n            canDelete: this.options.canDelete,\n            isAdmin: this.options.isAdmin,\n            isFetched: this.isFetched,\n        }\n    },\n    afterRender: function () {\n        if (!this.isFetched)\n            return;\n\n        new PJQ.Binder(this.$el, this.model, {\n            canEdit: !this.options.canEdit ? false : null,\n            watchElements: [\n                'input',\n            ]\n        });\n    },\n    validate: function () {\n        let isValid = true;\n\n        let $categoryName = this.$('.category-name');\n        PJQ.helpers.inputHelpers.setInputError($categoryName, true);\n        if (this.model.get('name') == null || this.model.get('name').length === 0) {\n            PJQ.helpers.inputHelpers.setInputError($categoryName, false);\n            isValid = false;\n        }\n\n        return isValid;\n    },\n    saveCategory: function () {\n        if (!this.validate()) {\n            return;\n        }\n        let isNew = this.model.isNew();\n        let callback = _.bind(function () {\n            PJQ.notifications.notify.successNotify({\n                message: 'Category saved successfully'\n            });\n\n            if (typeof this.options.onSave === 'function')\n                this.options.onSave(this.model, isNew);\n\n            this.removeModal();\n        }, this);\n\n        this.save(callback);\n    },\n    save: function (callback) {\n        this.model.save(null, {\n            success: _.bind(function () {\n                if (typeof callback === 'function') {\n                    callback();\n                }\n            }, this),\n            error: _.bind(function () {\n                PJQ.notifications.notify.errorNotify({\n                    message: \"Encountered an error while saving this category. Please contact customer service.\"\n                });\n            }, this)\n        })\n    },\n    deleteCategory: function () {\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Confirm Delete\",\n            body: \"Are you sure you want to delete this category?  This will also delete any items in the category.\",\n            onDelete: _.bind(function () {\n                this.model.destroy({\n                    success: _.bind(function () {\n                        if (typeof this.options.onDelete === 'function')\n                            this.options.onDelete(this.model);\n\n                        this.removeModal();\n                    }, this),\n                    error: _.bind(function () {\n                        PJQ.notifications.notify.errorNotify({\n                            message: 'Something went wrong!'\n                        });\n                        this.removeModal();\n                    }, this)\n                });\n            }, this)\n        });\n    },\n    close: function () {\n        if (this.model.hasChanged() && this.options.canEdit) {\n            new PJQ.views.modals.SaveDontSave({\n                header: \"Unsaved Changes\",\n                body: \"Do you want to save changes?\",\n                onSave: _.bind(function () {\n                    this.saveCategory();\n                    this.removeModal();\n                }, this),\n                onDontSave: _.bind(function () {\n                    this.removeModal();\n                }, this)\n            });\n        } else {\n            this.removeModal();\n        }\n    }\n});\n\nPJQ.views.meetings.ViewMeetingTranscriptionModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.MEETINGS, 'modal-view-transcription'),\n        width: '50%',\n        maxWidth: 800,\n        model: null,\n        isShowCloseButton: true,\n    },\n    events: {\n        'click .btn-close': 'close',\n        'click .btn-transcribe': 'transcribeMeeting'\n    },\n    beforeRender: function () {\n\n    },\n    renderData: function () {\n        return {\n            recording: this.model,\n            meeting: this.options.meeting\n        }\n    },\n    afterRender: function () {\n\n    },\n    transcribeMeeting: function () {\n        this.loader = new PJQ.Loader(this.$('.generate-transcription-div'));\n        new PJQ.ajax.Request({\n            isAPIv2: true,\n            endpoint: PJQ.helpers.urlHelpers.generateEndpoint([\n                {\n                    endpoint: 'meetings',\n                    value: this.options.meeting.id\n                },\n                {\n                    endpoint: 'transcribe'\n                }\n            ]),\n        }).get().done(_.bind(function (response) {\n            this.model.set('transcriptions', [response]);\n            this.loader.remove()\n            PJQ.notifications.notify.successNotify({\n                message: 'Recording successfully transcribed'\n            });\n            this.render();\n        }, this)).fail(_.bind(function (xhr, err, result) {//todo: error\n        }, this));\n    },\n    close: function () {\n        this.removeModal();\n    }\n});","// Models\nPJQ.models.meetings.Meeting = PJQ.models.BaseModel.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    idAttribute: 'id',\n    endpoint: function () {\n        if (this.isNew() && this.get('projectId')) {\n            return PJQ.helpers.urlHelpers.generateEndpoint([\n                {\n                    endpoint: 'projects',\n                    value: this.get('projectId')\n                },\n                {\n                    endpoint: 'meetings',\n                    value: this.id\n                }\n            ]);\n        } else if (this.isNew() && this.get('templateId')) {\n            return PJQ.helpers.urlHelpers.generateEndpoint([\n                {\n                    endpoint: 'meetings'\n                },\n                {\n                    endpoint: 'templates',\n                    value: this.get('templateId')\n                },\n                {\n                    endpoint: 'meeting'\n                }\n            ]);\n        } else {\n            return PJQ.helpers.urlHelpers.generateEndpoint([\n                {\n                    endpoint: 'meetings',\n                    value: this.id\n                }\n            ]);\n        }\n    },\n    parse: function (model) {\n        if (!model)\n            return model;\n\n        this.attachments = new PJQ.collections.meetings.Attachments(model.attachments);\n        this.meetingRecordings = new PJQ.collections.meetings.Attachments(model.meetingRecordingAttachments);\n        this.agendaItems = new PJQ.collections.meetings.AgendaItems(model.agendaItems);\n        this.categories = new PJQ.collections.meetings.MeetingCategories(model.categories);\n        this.attendees = new PJQ.collections.meetings.MeetingAttendees(model.attendees);\n\n        let noCategory = new PJQ.models.meetings.MeetingCategory({\n            meetingId: this.id,\n            id: null,\n            name: 'No Category'\n        });\n\n        this.categories.add(noCategory);\n\n        return model;\n    },\n    beforeSave: function () {\n        let agendaItems = this.agendaItems.getChangedModels();\n        _.each(agendaItems, function (agendaItem) {\n            agendaItem.beforeSave();\n        }, this);\n\n        this.set({\n            attachments: this.attachments,\n            meetingRecordingAttachments: this.meetingRecordings,\n            attendees: this.attendees,\n            agendaItems: agendaItems,\n            categories: this.categories.filter(function (category) {\n                return category.id !== null;\n            })\n        });\n    },\n    validateHyperlink: function () {\n        let hyperlink = this.get('meetingLink'),\n            urlPattern = /^(https?:\\/\\/)?([^\\s/$.?#].[^\\s]*)\\.[^\\s]+$/;\n\n        if (!urlPattern.test(hyperlink)) {\n            return false;\n        }\n\n        if (!hyperlink.startsWith(\"https://\")) {\n            hyperlink = \"https://\" + hyperlink;\n        }\n\n        return hyperlink;\n    },\n    isToday: function () {\n        if (this.get('date')) {\n            return (new Date(this.get('date').replace('Z', ''))).setHours(0, 0, 0, 0) === (new Date()).setHours(0, 0, 0, 0);\n        } else {\n            return false;\n        }\n    },\n    getDateAndTime: function (dataProp = 'start') {\n        let meetingDate = PJQ.helpers.dateHelpers.parseDateString(this.get('date'), false);\n        if (meetingDate == null) {\n            return null;\n        }\n\n        let mTime;\n        if (dataProp === 'end') {\n            mTime = this.get('endTime')\n        } else {\n            mTime = this.get('startTime')\n        }\n\n        if (_.size(mTime) === 0) {\n            return null;\n        }\n\n\n        let timeSplit = mTime.split(':');\n        if (timeSplit.length < 2) {\n            return null;\n        }\n\n        let hours = parseInt(timeSplit[0]),\n            minutes = parseInt(timeSplit[1]);\n        if (isNaN(hours) || isNaN(minutes)) {\n            return null;\n        }\n\n        meetingDate.setHours(hours, minutes);\n        return meetingDate;\n    },\n    isOverdue: function () {\n        let mDateTime = this.getDateAndTime();\n        if (mDateTime == null) {\n            return false;\n        }\n\n        return this.get('statusId') === PJQ.constants.meetings.meetingStatus.SCHEDULED && this.getDateAndTime() < new Date();\n    },\n    durationInMinutes: function () {\n        let startDateTime = this.getDateAndTime(),\n            endDateTime = this.getDateAndTime('end');\n\n        if (startDateTime == null || endDateTime == null) {\n            return null;\n        }\n\n        return PJQ.helpers.dateHelpers.getDateDiff(endDateTime, startDateTime, 'minutes');\n    }\n});\n\nPJQ.models.meetings.CustomField = PJQ.models.customFields.CustomField.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    idAttribute: 'id',\n    endpoint: function () {\n        return PJQ.helpers.urlHelpers.generateEndpoint([\n            {\n                endpoint: 'meetings'\n            },\n            {\n                endpoint: 'customfields',\n                value: this.get('id')\n            }\n        ]);\n    }\n});\n\nPJQ.models.meetings.CustomFieldChoice = PJQ.models.BaseModel.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    idAttribute: 'id',\n    endpoint: function () {\n        return PJQ.helpers.urlHelpers.generateEndpoint([\n            {\n                endpoint: 'meetings'\n            },\n            {\n                endpoint: 'customfields',\n                value: this.get('customFieldId')\n            },\n            {\n                endpoint: 'choices',\n                value: this.get('id')\n            }\n        ]);\n    }\n});\n\nPJQ.models.meetings.Settings = PJQ.models.BaseModel.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    idAttribute: 'settingId',\n    endpoint: function () {\n        if (this.options.projectId) {\n            return PJQ.helpers.urlHelpers.generateEndpoint([\n                {\n                    endpoint: 'projects',\n                    value: this.options.projectId\n                },\n                {\n                    endpoint: 'meetings'\n                },\n                {\n                    endpoint: 'settings'\n                }\n            ]);\n        } else {\n            return PJQ.helpers.urlHelpers.generateEndpoint([\n                {\n                    endpoint: 'meetings'\n                },\n                {\n                    endpoint: 'settings'\n                }\n            ]);\n        }\n    }\n});\n\nPJQ.models.meetings.UserSettings = PJQ.models.BaseModel.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    idAttribute: 'settingId',\n    endpoint: function () {\n        return PJQ.helpers.urlHelpers.generateEndpoint([\n            {\n                endpoint: 'meetings'\n            },\n            {\n                endpoint: 'settings'\n            },\n            {\n                endpoint: 'user'\n            }\n        ]);\n    },\n    getSettings: function (view) {\n        return _.find(this.attributes.viewSettings, _.bind(function (setting) {\n            return setting.view === view;\n        }, this));\n    }\n});\n\nPJQ.models.meetings.AgendaItem = PJQ.models.BaseModel.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    idAttribute: 'id',\n    endpoint: function () {\n        return PJQ.helpers.urlHelpers.generateEndpoint([\n            {\n                endpoint: 'meetings',\n                value: this.get('meetingId') ? this.get('meetingId') : this.options.meetingId\n            },\n            {\n                endpoint: 'agendaitems',\n                value: this.id\n            }\n        ]);\n    },\n    parse: function (model) {\n        if (!model)\n            return model;\n\n        this.attachments = new PJQ.collections.meetings.Attachments(model.attachments);\n\n        if (model && model.assignedTo) {\n            if (model.assignedTo instanceof PJQ.models.BaseModel) {\n                this.assignedTo = model.assignedTo;\n            } else {\n                this.assignedTo = new PJQ.models.contacts.Contact(model.assignedTo);\n            }\n        } else {\n            this.assignedTo = null;\n        }\n\n        return model;\n    },\n    beforeSave: function () {\n        this.set({\n            attachments: this.attachments,\n            assignedTo: this.assignedTo\n        });\n    },\n    updateSort: function () {\n        new PJQ.ajax.Request({\n            endpoint: this.endpoint() + '/updatesort',\n            isAPIv2: true,\n            data: this.toJSON()\n        }).put().done(_.bind(function (res) {\n\n        }, this)).fail(_.bind(function (xhr, err, result) {\n\n        }, this));\n    }\n});\n\nPJQ.models.meetings.MeetingAttendee = PJQ.models.BaseModel.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    idAttribute: 'id',\n    parse: function (model) {\n        if (!model)\n            return model;\n\n        this.attendee = new PJQ.models.contacts.Contact(model.attendee);\n\n        return model;\n    },\n})\n\nPJQ.models.meetings.MeetingCategory = PJQ.models.BaseModel.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    idAttribute: 'id',\n    endpoint: function () {\n        return PJQ.helpers.urlHelpers.generateEndpoint([\n            {\n                endpoint: 'meetings',\n                value: this.get('meetingId') ? this.get('meetingId') : this.options.meetingId\n            },\n            {\n                endpoint: 'categories',\n                value: this.id\n            }\n        ]);\n    },\n    updateSort: function () {\n        new PJQ.ajax.Request({\n            endpoint: this.endpoint() + '/updatesort',\n            isAPIv2: true,\n            data: this.toJSON()\n        }).put().done(_.bind(function (res) {\n\n        }, this)).fail(_.bind(function (xhr, err, result) {\n\n        }, this));\n    }\n});\n\nPJQ.models.meetings.Template = PJQ.models.BaseModel.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    idAttribute: 'id',\n    notifyName: 'Template',\n    endpoint: function () {\n        return PJQ.helpers.urlHelpers.generateEndpoint([\n            {\n                endpoint: 'meetings'\n            },\n            {\n                endpoint: 'templates',\n                value: !this.get('projectId') ? this.id : null\n            }\n        ], this.get('projectId') > 0 ? [\n            {\n                parameter: 'projectId',\n                value: this.get('projectId')\n            },\n            {\n                parameter: 'copyAttendees',\n                value: this.get('copyAttendees')\n            },\n            {\n                parameter: 'copyAgendaItems',\n                value: this.get('copyAgendaItems')\n            },\n            {\n                parameter: 'copyCategories',\n                value: this.get('copyCategories')\n            },\n            {\n                parameter: 'copyAttachments',\n                value: this.get('copyAttachments')\n            },\n            {\n                parameter: 'overwriteExisting',\n                value: this.get('overwriteExisting')\n            }\n        ] : null);\n    },\n    parse: function (model) {\n        if (!model)\n            return model;\n\n        if (model.meetings) {\n            this.meetings = new PJQ.collections.meetings.Meetings(model.meetings);\n        } else {\n            this.meetings = new PJQ.collections.meetings.Meetings();\n        }\n\n        return model;\n    }\n});\n\nPJQ.models.meetings.Attachment = PJQ.models.files.File.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    idAttribute: 'id'\n});\n//Collections\n\nPJQ.collections.meetings.Meetings = PJQ.collections.BaseCollection.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    model: PJQ.models.meetings.Meeting,\n    endpoint: function () {\n        let params = [];\n        return PJQ.helpers.urlHelpers.generateEndpoint([\n            {\n                endpoint: 'projects',\n                value: this.options.projectId\n            },\n            {\n                endpoint: 'meetings'\n            }\n        ], params);\n    },\n    getOriginMeetings: function () {\n        let originMeetings = new PJQ.collections.meetings.Meetings(),\n            self = this,\n            nonExistentOriginMeetings = [];\n\n        // Create a map of all meeting ids for fast existence check\n        let meetingIds = this.models.map(function (model) {\n            return model.id;\n        });\n\n        _.each(this.models, function (model) {\n            let originMeetingId = model.get('originMeetingId');\n\n            // Add to originMeetings if originMeetingId is null\n            if (!originMeetingId) {\n                originMeetings.add(model);\n                model.followUpMeetings = new PJQ.collections.meetings.Meetings();\n                model.followUpMeetings.add(model);\n            } else if (!meetingIds.includes(originMeetingId)) {\n                // If origin meeting does not exist, add it to a separate list\n                nonExistentOriginMeetings.push(model);\n            }\n        }, this);\n\n        // Sort the nonExistentOriginMeetings by id\n        nonExistentOriginMeetings.sort(function (a, b) {\n            return a.id - b.id;\n        });\n\n        // Take the first (lowest id) of each originMeetingId group as originMeeting and the rest as followUpMeetings\n        let groupedNonExistentOriginMeetings = _.groupBy(nonExistentOriginMeetings, function (model) {\n            return model.get('originMeetingId');\n        });\n        _.each(groupedNonExistentOriginMeetings, function (group) {\n            let originMeeting = group[0];\n            originMeetings.add(originMeeting);\n            originMeeting.followUpMeetings = new PJQ.collections.meetings.Meetings();\n\n            _.each(group, function (followUpMeeting) {\n                originMeeting.followUpMeetings.add(followUpMeeting);\n            });\n        });\n\n        // For each originMeeting, find and add to its followUpMeetings the meetings whose originMeetingId is its id\n        _.each(originMeetings.models, function (originMeeting) {\n            _.each(self.models, function (model) {\n                if (model.get('originMeetingId') === originMeeting.id) {\n                    originMeeting.followUpMeetings.add(model);\n                }\n            });\n        });\n\n        return originMeetings;\n    },\n    getMeetingCount: function (meetingId) {\n        return _.size(this.get(meetingId).followUpMeetings);\n    },\n    getMeetingsFromOrigin: function (meeting) {\n        let result = [],\n            originMeetingId = meeting.get('originMeetingId');\n        if (originMeetingId > 0) {\n            result.push(...this.where({originMeetingId: originMeetingId}))\n        } else {\n            result.push(meeting);\n            result.push(...this.where({originMeetingId: meeting.id}))\n        }\n        return result;\n    }\n});\n\nPJQ.collections.meetings.Attachments = PJQ.collections.files.Files.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    model: PJQ.models.meetings.Attachment,\n    endpoint: function () {\n        return PJQ.helpers.urlHelpers.generateEndpoint([\n            {\n                endpoint: 'meetings',\n                value: this.options.meetingId\n            },\n            {\n                endpoint: 'attachments'\n            }\n        ]);\n    }\n});\n\nPJQ.collections.meetings.MeetingCategories = PJQ.collections.BaseCollection.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    model: PJQ.models.meetings.MeetingCategory,\n    endpoint: function () {\n        let params = [];\n        return PJQ.helpers.urlHelpers.generateEndpoint([\n            {\n                endpoint: 'meetings',\n                value: this.options.meetingId\n            },\n            {\n                endpoint: 'categories'\n            }\n        ], params);\n    }\n});\n\nPJQ.collections.meetings.AgendaItems = PJQ.collections.BaseCollection.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    model: PJQ.models.meetings.AgendaItem,\n    endpoint: function () {\n        let params = [];\n        return PJQ.helpers.urlHelpers.generateEndpoint([\n            {\n                endpoint: 'meetings',\n                value: this.options.meetingId\n            },\n            {\n                endpoint: 'agendaitems'\n            }\n        ], params);\n    }\n});\n\nPJQ.collections.meetings.MeetingAttendees = PJQ.collections.BaseCollection.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    model: PJQ.models.meetings.MeetingAttendee,\n    getAttendeeContacts: function () {\n        return _.map(this.models, function (model) {\n            return model.attendee;\n        });\n    }\n});\n\nPJQ.collections.meetings.CustomFields = PJQ.collections.BaseCollection.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    model: PJQ.models.meetings.CustomField,\n    endpoint: function () {\n        let params = [];\n        if (this.options.projectId) {\n            return PJQ.helpers.urlHelpers.generateEndpoint([\n                {\n                    endpoint: 'projects',\n                    value: this.options.projectId\n                },\n                {\n                    endpoint: 'meetings'\n                },\n                {\n                    endpoint: 'customfields'\n                }\n            ], params);\n        } else {\n            return PJQ.helpers.urlHelpers.generateEndpoint([\n                {\n                    endpoint: 'meetings'\n                },\n                {\n                    endpoint: 'customfields'\n                }\n            ], params);\n        }\n    }\n});\n\nPJQ.collections.meetings.CustomFieldChoices = PJQ.collections.BaseCollection.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    model: PJQ.models.meetings.CustomFieldChoice\n});\n\nPJQ.collections.meetings.Templates = PJQ.collections.BaseCollection.extend({\n    defaults: {\n        isAPIv2: true\n    },\n    model: PJQ.models.meetings.Template,\n    endpoint: function () {\n        return PJQ.helpers.urlHelpers.generateEndpoint([\n            {\n                endpoint: 'meetings'\n            },\n            {\n                endpoint: 'templates'\n            }\n        ]);\n    }\n});","PJQ.views.meetings.MeetingListDatatable = PJQ.views.dataTables.DataTable.extend({\n    defaults: {\n        language: {\n            emptyTable: 'No Meetings'\n        },\n        subTemplates: {\n            header: new PJQ.templating.Template(PJQ.constants.modules.MEETINGS, 'data-table-header-meetings')\n        },\n        paging: false\n    },\n    events: {},\n    getColumns: function (includeAllColumns = false) {\n        let columns = [],\n            includeColumns = ['number', 'name', 'description', 'date', 'meetingTime', 'location', 'status'];\n\n        this.options.order = [0, 'desc'];\n\n        if (!includeAllColumns) {\n            if (this.options.settings && _.size(this.options.settings.columns) > 0)\n                includeColumns = this.options.settings.columns;\n            else\n                includeColumns = this.options.settings && this.options.settings.columnsDefault ? this.options.settings.columnsDefault : includeColumns;\n\n        }\n\n        _.each(includeColumns, _.bind(function (columnName) {\n            switch (columnName) {\n                case 'number':\n                    columns.push({\n                        \"columnData\": \"number\",\n                        \"data\": \"attributes.number\",\n                        \"title\": \"Number\",\n                        \"width\": \"20px\",\n                        \"render\": (data, type, row) => {\n                            if (type === 'sort' || type === 'type') {\n                                return data;\n                            }\n\n                            return '<a href=\"javascript:void(0)\" class=\"btn-edit-punchlist-item\">' + data + '</a>';\n                        },\n                    });\n                    break;\n                case 'name':\n                    columns.push({\n                        \"columnData\": \"name\",\n                        \"data\": \"attributes.name\",\n                        \"title\": \"Name\"\n                    });\n                    break;\n                case 'description':\n                    columns.push({\n                        \"columnData\": \"description\",\n                        \"data\": \"attributes.description\",\n                        \"title\": \"Description\"\n                    });\n                    break;\n                case 'date':\n                    columns.push({\n                        \"columnData\": \"date\",\n                        \"data\": \"attributes.date\",\n                        \"title\": 'Meeting Date',\n                        \"width\": '150px',\n                        \"render\": (data, type, row) => {\n                            if (_.size(data) === 0) {\n                                return '';\n                            }\n                            return PJQ.helpers.dateHelpers.getDateString(data, PJQ.helpers.dateHelpers.dateFormats.DATE, true)\n                        }\n                    });\n                    break;\n                case 'meetingTime':\n                    columns.push({\n                        \"columnData\": \"meetingTime\",\n                        \"data\": \"\",\n                        \"title\": 'Meeting Time',\n                        \"width\": '150px',\n                        \"render\": (data, type, row) => {\n                            return this.parseTimeString(row.get('startTime')) + ' - ' + this.parseTimeString(row.get('endTime')) + ' ' + (row.get('timezone') ?? 'CDT');\n                        }\n                    });\n                    break;\n                case 'status':\n                    columns.push({\n                        \"columnData\": \"status\",\n                        \"data\": \"attributes.statusId\",\n                        \"title\": \"Status\",\n                        \"width\": \"100px\",\n                        \"render\": (data, type, row) => {\n                            return PJQ.constants.meetings.meetingStatusNames[row.get('statusId')]\n                        }\n                    });\n                    break;\n                default:\n                    if (columnName.startsWith('fieldValue') && this.customFields) {\n                        _.each(this.customFields.models, function (customField) {\n                            if (columnName === 'fieldValue' + customField.get('fieldNumber')) {\n                                columns.push({\n                                    \"columnData\": 'fieldValue' + customField.get('fieldNumber'),\n                                    \"title\": customField.get('name'),\n                                    \"render\": function (data, type, row) {\n                                        let fieldValue = row.getCustomFieldValue(customField.get('id'));\n                                        fieldValue = (fieldValue !== null) ? fieldValue : '';\n                                        switch (customField.get('fieldTypeId')) {\n                                            case PJQ.constants.commitments.customFieldType.BOOLEAN:\n                                                if (fieldValue != null)\n                                                    fieldValue = fieldValue ? 'Yes' : 'No';\n                                                break;\n                                            case PJQ.constants.commitments.customFieldType.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('name'));\n                                                }, this));\n\n                                                fieldValue = choices.join((', '));\n                                                break;\n                                            case PJQ.constants.commitments.customFieldType.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 PJQ.constants.commitments.customFieldType.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, true);\n                                                }\n                                                if (fieldValue === undefined)\n                                                    fieldValue = '';\n\n                                                break;\n                                            case PJQ.constants.commitments.customFieldType.INTEGER:\n                                                if (type !== 'sort' && type !== 'type' && fieldValue) {\n                                                    fieldValue = parseInt(fieldValue).toLocaleString();\n                                                }\n                                                break;\n                                            case PJQ.constants.commitments.customFieldType.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 PJQ.constants.commitments.customFieldType.PERCENT:\n                                                if (type === 'sort' || type === 'type') {\n                                                    if (fieldValue && fieldValue !== '$')\n                                                        fieldValue = parseFloat(PJQ.helpers.formatHelpers.numbersOnly(fieldValue / 100, true)).toFixed(2)\n                                                    else\n                                                        fieldValue = 0;\n                                                } else {\n                                                    fieldValue = fieldValue ? parseFloat(PJQ.helpers.formatHelpers.numbersOnly(fieldValue / 100, true)).toFixed(2) + '%' : '';\n                                                }\n\n                                                break;\n                                        }\n                                        return fieldValue;\n                                    }\n                                });\n                            }\n                        });\n                    }\n                    break;\n            }\n        }, this));\n\n        if (!includeAllColumns) {\n            columns.push({\n                \"title\": '',\n                \"render\": (data, type, row) => {\n                    let html = '<div class=\"show-on-row-hover\">',\n                        status = row.get('statusId'),\n                        targetMeeting = row,\n                        originMeetingId = targetMeeting.get('originMeetingId'),\n                        originMeeting = originMeetingId ? targetMeeting.collection.get(originMeetingId) : targetMeeting,\n                        mostRecentMeeting = originMeeting ? _.max(originMeeting.followUpMeetings.models, function (model) {\n                            return model.id;\n                        }) : null;\n                    if (this.options.canViewMeetings) {\n                        html += '<button type=\"button\" class=\"btn btn-info btn-view-meeting ml-1\" data-cid=\"' + (row.cid) + '\" title=\"View meeting\"><i class=\"fal fa-arrow-alt-from-left\"></i></button>';\n                    }\n                    if (this.options.canDeleteMeetings && mostRecentMeeting === targetMeeting) {\n                        html += '<button type=\"button\" class=\"btn btn-danger btn-delete-meeting ml-1\" data-cid=\"' + (row.cid) + '\" title=\"Delete meeting\"><i class=\"fal fa-trash\"></i></button>';\n                    }\n                    html += '</div>'\n                    return html\n                },\n                \"orderable\": false,\n                \"searchable\": false,\n                \"width\": \"90px\",\n                \"className\": \"text-center\",\n                \"visible\": true\n            });\n        }\n\n        return columns;\n    },\n    parseTimeString: function (timeString) {\n        let timeArray = timeString.split(\":\"), // split the time string into an array\n            time = new Date(),\n            options = {hour: \"numeric\", minute: \"numeric\", hour12: true};\n        time.setHours(timeArray[0]); // set the hours\n        time.setMinutes(timeArray[1]); // set the minutes\n        time.setSeconds(0); // set the seconds\n        return time.toLocaleTimeString(\"en-US\", options);\n    },\n    getFilterData: function () {\n        let result = this.options.data,\n            statusFilter = this.getFilter('status');\n        if (_.size(statusFilter) === 0) {\n            return result;\n        }\n\n        return _.filter(result, function (row) {\n            return _.contains(statusFilter, row.get('statusId'));\n        });\n    },\n});","PJQ.views.meetings.MeetingsList = PJQ.views.BaseView.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.MEETINGS, 'meetings-list'),\n        subTemplates: {\n            comments: new PJQ.templating.Template(PJQ.constants.modules.ACTIONITEMS, 'Action-Item-Comments'),\n            contactBadge: new PJQ.templating.Template(PJQ.constants.modules.GLOBAL, 'Contacts-Select-Input-Contacts'),\n            meeting: new PJQ.templating.Template(PJQ.constants.modules.MEETINGS, 'meeting'),\n        },\n        meetingId: null\n    },\n    events: {\n        'shown.bs.collapse .meeting-collapse': 'meetingExpanded',\n        'hidden.bs.collapse .meeting-collapse': 'meetingCollapsed',\n        'click .btn-settings': 'editSettings',\n        'keyup .meeting-search': 'searchChanged',\n        'click .clear-filters': 'clearFilters',\n        'click .btn-add-meeting': 'addMeetingClicked',\n        'click .btn-delete-meeting': 'deleteMeetingClicked',\n        'click .btn-view-meeting': 'viewMeetingClicked',\n        'click .meeting-dropdown': 'meetingClicked',\n        'click .btn-follow-up': 'followUpMeetingClicked',\n        'click .btn-import-template': 'importTemplate',\n        'click .btn-save-a-template': 'saveTemplate'\n    },\n    beforeFirstRender: async function () {\n        this.isFetched = false;\n        this.options.project = this.options.project ? this.options.project : PJQ.app.session.project;\n\n        this.expandedMeetings = [];\n        if (this.collection == null && PJQ.app.session.project) {\n            this.collection = new PJQ.collections.meetings.Meetings(null, {\n                projectId: PJQ.app.session.project.id\n            });\n        }\n        this.isFetched = false;\n\n        if (!this.collection.isFetched && this.options.project) {\n            await this.collection.fetch();\n        }\n        this.originMeetings = this.collection.getOriginMeetings();\n\n        this.isFetched = true;\n        this.render();\n    },\n    beforeRender: function () {\n        if (!this.isFetched)\n            return;\n\n        if (this.options.project) {\n            this.options.canEdit = PJQ.app.session.project.hasPermission('meetings.isAdmin');\n            this.options.canAdd = PJQ.app.session.project.hasPermission('meetings.canAdd');\n            this.options.isAdmin = PJQ.app.session.project.hasPermission('meetings.isAdmin');\n            this.options.canDelete = this.options.isAdmin;\n        } else {\n            this.options.canEdit = true;\n            this.options.canAdd = true;\n            this.options.isAdmin = true;\n            this.options.canDelete = true;\n        }\n    },\n    renderData: function () {\n        return {\n            isFetched: this.isFetched,\n            meetings: this.collection,\n            originMeetings: this.originMeetings,\n            canEdit: this.options.canEdit,\n            canAdd: this.options.canAdd,\n            isAdmin: this.options.isAdmin,\n            project: PJQ.app.session.project\n        };\n    },\n    afterRender: function () {\n        if (!this.isFetched)\n            return;\n\n        new PJQ.inputs.Selectpicker({\n            el: this.$('.meeting-status-filter'),\n            defaultValue: null,\n            isIntChoices: true,\n            isMultiple: true,\n            noneSelectedText: 'No Filters',\n            onChange: _.bind(function (value) {\n                this.statusFilter = value;\n                this.renderMeetings();\n            }, this)\n        });\n\n        if (this.options.meetingId > 0) {\n            let initMeeting = this.collection.get(this.options.meetingId);\n            if (initMeeting != null) {\n                this.viewMeeting(initMeeting);\n                this.options.meetingId = null;\n            }\n        }\n\n        this.renderMeetings();\n    },\n    meetingCollapsed: function (e) {\n        let $target = $(e.currentTarget),\n            cid = $target.data('cid'),\n            meeting = this.collection.get(cid),\n            originId = meeting.get('originMeetingId') > 0 ? meeting.get('originMeetingId') : meeting.id;\n        this.expandedMeetings = _.without(this.expandedMeetings, originId);\n    },\n    meetingExpanded: function (e) {\n        let $target = $(e.currentTarget),\n            cid = $target.data('cid'),\n            meeting = this.collection.get(cid),\n            originId = meeting.get('originMeetingId') > 0 ? meeting.get('originMeetingId') : meeting.id;\n        if (this.expandedMeetings.indexOf(originId) === -1) {\n            this.expandedMeetings.push(originId);\n        }\n    },\n    searchChanged: function (e) {\n        this.search = $(e.currentTarget).val();\n        this.renderMeetings();\n    },\n    clearFilters: function () {\n        this.search = '';\n        this.statusFilter = null;\n        this.render();\n    },\n    renderMeetings: function () {\n        let $meetings = this.$('.meetings-container');\n        $meetings.empty();\n\n        let meetings = this.originMeetings.models;\n        if (_.size(this.search) > 0 || _.size(this.statusFilter) > 0) {\n            let filteredMeetings = this.collection.models;\n            if (_.size(this.search) > 0) {\n                filteredMeetings = _.filter(filteredMeetings, _.bind(function (meeting) {\n                    if ((meeting.get('number') + ' ' + meeting.get('name') + ' ' + meeting.get('description')).toLowerCase().indexOf(this.search.toLowerCase()) !== -1) {\n                        return true;\n                    }\n                }, this));\n            }\n\n            if (_.size(this.statusFilter) > 0) {\n                filteredMeetings = _.filter(filteredMeetings, _.bind(function (meeting) {\n                    if (this.statusFilter.indexOf(meeting.get('statusId')) !== -1) {\n                        return true;\n                    }\n                }, this));\n            }\n\n            let filteredOriginMeetingIds = _.uniq(_.map(filteredMeetings, function (meeting) {\n                return meeting.get('originMeetingId') > 0 ? meeting.get('originMeetingId') : meeting.id;\n            }));\n            meetings = _.filter(meetings, function (meeting) {\n                return filteredOriginMeetingIds.indexOf(meeting.id) !== -1;\n            })\n        }\n\n        if (_.size(meetings) === 0) {\n            $meetings.append(`<div class=\"wd-100 d-flex\" style=\"height: 80%\">\n                    <div class=\"mb-auto mt-auto wd-100 text-align-center d-flex flex-column justify-content-center align-content-center text-muted\">\n                        <div class=\"fs-24\">\n                            No meetings found matching your search\n                        </div>\n                    </div>\n                </div>`)\n        }\n\n        _.each(meetings, _.bind(function (meeting) {\n            this.renderSubTemplate(true, this.options.subTemplates.meeting, $meetings, {\n                expandedMeetings: this.expandedMeetings,\n                meetings: this.collection,\n                originMeetings: this.originMeetings,\n                meeting: meeting,\n                canEdit: this.options.canEdit,\n                canAdd: this.options.canAdd,\n                isAdmin: this.options.isAdmin,\n                project: PJQ.app.session.project\n            }, _.bind(function (el) {\n                meeting.dataTable = new PJQ.views.meetings.MeetingListDatatable({\n                    el: el.find(\".meeting-\" + meeting.cid + \"-table\"),\n                    rowId: \"cid\",\n                    data: meeting.followUpMeetings.models,\n                    canViewMeetings: true,\n                    canDeleteMeetings: this.options.isAdmin,\n                    onPageSizeChange: function (value) {\n\n                    },\n                    isAdmin: true,\n                    headerData: _.bind(function () {\n                        return {\n                            project: this.options.project,\n                            canAdd: this.options.canEdit,\n                            isAdmin: this.options.isAdmin\n                        };\n                    }, this),\n                    onRowDoubleClick: _.bind(function (row) {\n                        this.viewMeeting(row.data());\n                    }, this),\n                    contextMenuOptions: {\n                        actions: [\n                            {\n                                name: 'View',\n                                onClick: _.bind(function (row) {\n                                    this.viewMeeting(row.data());\n                                }, this)\n                            },\n                            {\n                                name: 'Delete',\n                                isDanger: true,\n                                onClick: _.bind(function (row) {\n                                    this.deleteMeeting(row);\n                                }, this),\n                                isShown: _.bind(function (row) {\n                                    let targetMeeting = row.data(),\n                                        originMeetingId = targetMeeting.get('originMeetingId'),\n                                        originMeeting = originMeetingId ? this.collection.get(originMeetingId) : targetMeeting,\n                                        mostRecentMeeting = originMeeting ? _.max(originMeeting.followUpMeetings.models, function (model) {\n                                            return model.id;\n                                        }) : null;\n\n                                    return mostRecentMeeting === targetMeeting && this.options.isAdmin;\n                                }, this)\n                            }\n                        ]\n                    }\n                });\n\n\n                meeting.dataTable.setFilter('status', this.statusFilter);\n                if (_.size(this.search) > 0) {\n                    meeting.dataTable.search(this.search.toLowerCase());\n                }\n            }, this));\n        }, this));\n    },\n    meetingClicked: function (e) {\n        let dropdown = $(e.currentTarget),\n            collapse = dropdown.next('.collapse'),\n            caret = dropdown.find('.meeting-caret')\n        if (!collapse.hasClass('show')) {\n            caret.find('i').removeClass('fa-caret-right').addClass('fa-caret-down')\n        } else {\n            caret.find('i').removeClass('fa-caret-down').addClass('fa-caret-right')\n        }\n    },\n    saveTemplate: function () {\n        new PJQ.views.meetings.MeetingTemplateCreatorModal({\n            collection: this.collection,\n            project: PJQ.app.session.project\n        });\n    },\n    importTemplate: function () {\n        new PJQ.views.meetings.ImportTemplateModal({\n            project: PJQ.app.session.project,\n            onImport: _.bind(function (meetings) {\n                this.collection = meetings;\n                this.originMeetings = this.collection.getOriginMeetings();\n                this.render();\n            }, this)\n        });\n    },\n    followUpMeetingClicked: function (e) {\n        e.stopPropagation();\n        let target = $(e.currentTarget),\n            dropdown = target.closest('.meeting-dropdown'),\n            cid = dropdown.data('cid'),\n            originMeeting = this.collection.get(cid),\n            previousMeeting = _.max(originMeeting.followUpMeetings.models, function (model) {\n                return model.id;\n            });\n\n        // We want to carry over the attendees from the previous meeting, so we have to fetch the previous meeting.\n        previousMeeting.fetch({\n            success: _.bind(function (previousMeeting) {\n                // Need to reset the attendance from previous meeting\n                if (previousMeeting.get('attendees') != null) {\n                    _.each(previousMeeting.get('attendees'), (attendee) => {\n                        attendee.isPresent = false;\n                        attendee.isAbsent = false;\n                        attendee.isDistribution = false;\n                    });\n                }\n\n                followUpMeeting = new PJQ.models.meetings.Meeting({\n                    originMeetingId: originMeeting.get('id'),\n                    number: _.size(originMeeting.followUpMeetings) + 1,\n                    startTime: previousMeeting.get('startTime'),\n                    endTime: previousMeeting.get('endTime'),\n                    name: previousMeeting.get('name'),\n                    description: previousMeeting.get('description'),\n                    attendeeIds: previousMeeting.get('attendeeIds'),\n                    attendees: previousMeeting.get('attendees'),\n                    projectId: PJQ.app.session.project ? PJQ.app.session.project.id : null,\n                    templateId: previousMeeting.get('templateId'),\n                    statusId: PJQ.constants.meetings.meetingStatus.DRAFT\n                })\n                this.viewMeeting(followUpMeeting);\n            }, this)\n        })\n    },\n    addMeetingClicked: function (e) {\n        let meeting = new PJQ.models.meetings.Meeting({\n            projectId: PJQ.app.session.project ? PJQ.app.session.project.id : null,\n            templateId: this.options.templateId,\n            statusId: PJQ.constants.meetings.meetingStatus.DRAFT,\n            number: 1\n        })\n\n        this.viewMeeting(meeting);\n    },\n    editSettings: function () {\n    },\n    viewMeetingClicked: function (e) {\n        // let row = this.dataTable.getRow((e.currentTarget).closest('tr'));\n        // this.viewMeeting(row.data());\n        let cid = $(e.currentTarget).data('cid'),\n            meeting = this.collection.get(cid);\n        if (meeting) {\n            this.viewMeeting(meeting);\n        }\n    },\n    viewMeeting: function (meeting) {\n        let originMeeting = meeting.get('originMeetingId') ? this.collection.get(meeting.get('originMeetingId')) : meeting,\n            mostRecentMeeting = originMeeting && originMeeting.followUpMeetings ? _.max(originMeeting.followUpMeetings.models, function (model) {\n                return model.id;\n            }) : meeting;\n        new PJQ.views.meetings.MeetingEditModal({\n            model: meeting,\n            meetings: this.collection,\n            isMostRecentMeeting: mostRecentMeeting === meeting || meeting.isNew(),\n            onDelete: _.bind(function () {\n                this.renderMeetings();\n            }, this),\n            onSave: _.bind(function (model, isNew) {\n                let originMeeting = model.get('originMeetingId') ? this.originMeetings.get(model.get('originMeetingId')) : model;\n                if (isNew) {\n                    this.collection.add(model);\n                    if (originMeeting !== model) {\n                        originMeeting.followUpMeetings.add(model);\n                    } else {\n                        model.followUpMeetings = new PJQ.collections.meetings.Meetings(model);\n                        this.originMeetings.add(model);\n                    }\n                }\n                if (_.size(this.collection) <= 1) {\n                    this.render();\n                } else {\n                    this.renderMeetings();\n                }\n            }, this)\n        });\n    },\n    deleteMeetingClicked: function (e) {\n        let target = $(e.currentTarget),\n            cid = target.data('cid'),\n            meeting = this.collection.get(cid),\n            originMeeting = meeting.get('originMeetingId') ? this.collection.get(meeting.get('originMeetingId')) : meeting,\n            row = originMeeting.dataTable.getRow(cid);\n\n        this.deleteMeeting(row);\n    },\n    deleteMeeting: function (row) {\n        if (row != null) {\n            let meeting = row.data();\n            if (meeting != null) {\n                let originMeeting = this.collection.get(meeting.get('originMeetingId')),\n                    dataTable = originMeeting ? originMeeting.dataTable : meeting.dataTable;\n\n                new PJQ.views.modals.DeleteCancel({\n                    header: \"Delete Meeting\",\n                    body: \"Are you sure you want to delete this Meeting?\",\n                    onDelete: _.bind(function () {\n                        meeting.destroy({\n                            success: _.bind(function () {\n                                this.renderMeetings();\n                                if (typeof this.options.onDelete === 'function') {\n                                    this.options.onDelete(meeting);\n                                }\n                            }, this)\n                        });\n                    }, this)\n                });\n            }\n        }\n    }\n});","PJQ.views.meetings.TemplateManagement = PJQ.views.templates.TemplateManagement.extend({\n    beforeFirstRender: function () {\n        this.collection = new PJQ.collections.meetings.Templates();\n        this.listenTo(this.collection, 'fetch', this.render);\n        this.collection.fetch();\n    },\n    addTemplate: function () {\n        new PJQ.views.templates.NewTemplateModal({\n            model: new PJQ.models.meetings.Template(),\n            onSave: _.bind(function (template) {\n                this.collection.add(template);\n                this.editTemplate(template);\n            }, this)\n        });\n    },\n    editTemplate: function (template) {\n        new PJQ.views.meetings.EditTemplateModal({\n            model: template,\n            onClose: _.bind(function () {\n                this.dataTable.refresh();\n            }, this),\n            onDelete: _.bind(function (template) {\n                if (template.id > 0) {\n                    let row = this.dataTable.getRow(template.cid);\n                    this.collection.remove(template);\n                    template.destroy();\n                    this.dataTable.removeRow(row);\n                }\n            }, this)\n        });\n    }\n});\n\nPJQ.views.meetings.EditTemplateModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.MEETINGS, 'Modal-Edit-Template'),\n        maxWidth: '90%',\n        fitHeight: true,\n        onClose: null\n    },\n    events: {\n        'click .btn-close': 'close',\n        'click .btn-delete': 'deleteTemplate'\n    },\n    beforeModalCreated: function () {\n        this.listenTo(this.model, 'fetch', this.render);\n        this.model.fetch();\n    },\n    renderData: function () {\n        return {\n            model: this.model\n        };\n    },\n    afterRender: function () {\n        if (this.model.isFetched) {\n\n            new PJQ.inputs.TextEditorInput({\n                el: this.$('.edit-template-name'),\n                label: 'Name',\n                value: this.model.get('name'),\n                onSave: _.bind(function (value) {\n                    this.model.patch({\n                        name: value\n                    });\n                }, this)\n            });\n\n            new PJQ.views.meetings.MeetingsList({\n                el: this.$('.manage-template'),\n                templateId: this.model.id,\n                model: this.model,\n                collection: this.model.meetings\n            });\n        }\n    },\n    close: function () {\n        if (typeof this.options.onClose === 'function') {\n            this.options.onClose(this.model);\n        }\n    },\n    deleteTemplate: function () {\n        new PJQ.views.modals.DeleteCancel({\n            header: \"Confirm Deletion\",\n            body: \"Are you sure you want to delete this template?\",\n            onDelete: _.bind(function () {\n                if (typeof this.options.onDelete === 'function') {\n                    this.options.onDelete(this.model);\n                }\n                this.removeModal();\n            }, this)\n        });\n    }\n});\n\nPJQ.views.meetings.ImportTemplateModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.MEETINGS, 'modal-import-template'),\n        maxWidth: 500,\n        onImport: null\n    },\n    events: {\n        'click .btn-import': 'save'\n    },\n    beforeModalCreated: function () {\n        this.options.project.fetchMeetingTemplates(_.bind(function (tmp) {\n            this.templates = tmp;\n            this.render();\n        }, this));\n    },\n    renderData: function () {\n        return {\n            templates: this.templates\n        };\n    },\n    afterRender: function () {\n        if (this.templates != null && this.templates.isFetched) {\n            this.templatePicker = new PJQ.inputs.Selectpicker({\n                el: this.$('.select-template'),\n                onChange: _.bind(function (value) {\n                    this.selectedTemplate = this.templates.get(value);\n                }, this),\n                isIntChoices: true,\n                noneSelectedText: 'Select Template'\n            });\n\n        }\n    },\n    save: function () {\n        let isValid = true;\n        if (this.selectedTemplate == null) {\n            this.templatePicker.showError();\n            isValid = false;\n        }\n        else {\n            this.templatePicker.hideError();\n        }\n\n\n        if (!isValid) {\n            return;\n        }\n\n        new PJQ.ajax.Request({\n            isAPIv2: true,\n            endpoint: PJQ.helpers.urlHelpers.generateEndpoint([\n                {\n                    endpoint: 'projects',\n                    value: this.options.project.id\n                },\n                {\n                    endpoint: 'meetings'\n                },\n                {\n                    endpoint: 'import',\n                    value: this.selectedTemplate.id\n                }\n            ], [\n                {\n                    parameter: 'importAttendees',\n                    value: this.$('.input-import-attendees').prop('checked')\n                },\n                {\n                    parameter: 'importAgendaItems',\n                    value: this.$('.input-import-agenda-items').prop('checked')\n                },\n                {\n                    parameter: 'importCategories',\n                    value: this.$('.input-import-categories').prop('checked')\n                },\n                {\n                    parameter: 'importAttachments',\n                    value: this.$('.input-import-attachments').prop('checked')\n                }\n            ])\n        }).put().done(_.bind(function (response) {\n            if (typeof this.options.onImport === 'function') {\n                let result = new PJQ.collections.meetings.Meetings(response);\n                result.isFetched = true;\n                this.options.onImport(result);\n            }\n            this.removeModal();\n            PJQ.notifications.notify.successNotify({\n                message: 'Meeting Template Imported'\n            });\n        }, this));\n    }\n});\n\nPJQ.views.meetings.MeetingTemplateCreatorModal = PJQ.views.BaseModal.extend({\n    defaults: {\n        template: new PJQ.templating.Template(PJQ.constants.modules.MEETINGS, 'modal-create-template'),\n        width: '30%'\n    },\n    events: {\n        'click .btn-save' : 'save'\n    },\n    beforeModalCreated: function () {\n        this.model = new PJQ.models.meetings.Template({\n            projectId: this.options.project.id\n        });\n\n        this.options.project.fetchMeetingTemplates(_.bind(function (tmp) {\n            this.templates = tmp;\n            this.render();\n        }, this));\n    },\n    renderData: function () {\n        return {\n            templates: this.templates,\n            meetings: this.collection\n        };\n    },\n    afterRender: function () {\n        if (this.templates != null && this.templates.isFetched) {\n            new PJQ.inputs.Selectpicker({\n                el: this.$('.select-meeting'),\n                isMultiple: true,\n                noneSelectedText: 'Select Meeting #',\n                onChange: _.bind(function (value) {\n\n                }, this)\n            });\n\n            new PJQ.inputs.AutocompleteInput({\n                el: this.$('.input-template-name'),\n                source: _.map(this.templates.models, function (template) {\n                    return template.get('name')\n                })\n            });\n        }\n    },\n    save: function () {\n        let $name = this.$('.input-template-name'),\n            name = $name.val();\n        if (_.size(name.trim()) === 0) {\n            PJQ.helpers.inputHelpers.setInputError($name);\n            return;\n        }\n        else {\n            PJQ.helpers.inputHelpers.setInputError($name, true);\n        }\n\n        let existingTemplate = this.templates.findWhere({name: name}),\n            overwriteExisting = this.$('.input-overwrite-existing').prop('checked'),\n            fnSave = _.bind(function () {\n                this.model.set({\n                    name: name,\n                    copyAttachments: this.$('.input-copy-attachments').prop('checked'),\n                    copyAttendees: this.$('.input-copy-attendees').prop('checked'),\n                    copyCategories: this.$('.input-copy-categories').prop('checked'),\n                    copyAgendaItems: this.$('.input-copy-agenda-items').prop('checked'),\n                    overwriteExisting: overwriteExisting\n                });\n                this.model.save(null, {\n                    success: _.bind(function () {\n                        this.removeModal();\n                        PJQ.notifications.notify.successNotify({\n                            message: 'Meeting Template Created'\n                        });\n                    }, this)\n                });\n            }, this);\n        if (existingTemplate != null) {\n            new PJQ.views.modals.YesNo({\n                header: \"Add to Template?\",\n                body: !overwriteExisting ? \"A template already exists with this name.  Would you like to add these meetings to it?\" : \"A template already exists with this name. Are you sure you'd like to overwrite this template?\",\n                onYes: _.bind(function () {\n                    this.model.set('id', existingTemplate.id);\n                    fnSave();\n                }, this)\n            });\n        }\n        else {\n            fnSave();\n        }\n    }\n});"]}