{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdateDropZoneElement.ts","webpack:///./src/modules/form-template-management/FormTemplate.model.ts","webpack:///./src/modules/form-management/form-element/FormElement.mixin.ts","webpack:///./src/modules/form-management/form-custom-element/step-wizard-step/StepWizard.ts","webpack:///./src/modules/form-management/form-custom-element/step-wizard-step/StepWizardStep.ts","webpack:///./src/modules/form-management/form-custom-element/file-upload/FileUpload.ts","webpack:///./src/modules/form-management/form-custom-element/multi-answer-row/MultiAnswerRow.ts","webpack:///./src/modules/form-management/form-custom-element/radio-group/RadioGroup.ts","webpack:///./src/modules/form-management/form-custom-element/text-field/TextField.ts","webpack:///./src/modules/form-management/form-custom-element/text-area/TextArea.ts","webpack:///./src/modules/form-management/form-custom-element/embedded-video-player/EmbeddedVideoPlayer.ts","webpack:///./src/modules/form-management/form-element/FormElement.ts","webpack:///./src/modules/category-management/category/PublicCategoryCard.html","webpack:///./src/modules/global/year/Year.store.ts","webpack:///./src/modules/form-template-management/FormTemplateAvailableElement.store.ts","webpack:///./src/store/index.ts","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment-form/AdminEvaluatorCategoryAssignmentForm.html","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdateAvailableElements.html","webpack:///./src/modules/application-form-management/application-form-creation/ApplicationFormCreationDialog.html","webpack:///./src/modules/application-form-support-management/application-form-support/AdminApplicationFormSupport.html","webpack:///./src/modules/application-form-management/AdminApplicationFormManagement.html","webpack:///./src/modules/application-form-management/application-form/ApplicationFormDepositDeadlineExtensionOverlay.html","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdateElementPanel.html","webpack:///./src/modules/application-form-management/application-forms/ApplicationForms.html","webpack:///./src/modules/application-form-management/application-form-form/ApplicationFormForm.html","webpack:///./src/modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormAssignmentRow.html","webpack:///./src/modules/public-area/form-template-preview/PublicFormTemplatePreview.html","webpack:///./src/modules/dashboard/dashboard-application-form-management/DashboardApplicationFormManagement.html","webpack:///./src/modules/dashboard/dashboard-evaluator-assignment-management/DashboardEvaluatorAssignmentManagement.html","webpack:///./src/modules/category-management/category-creation/CategoryCreationDialog.html","webpack:///./src/modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormAssignment.html","webpack:///./src/modules/application-form-support-management/application-form-support/ApplicationFormSupportReminderEmailOverlay.html","webpack:///./src/modules/user-management/UserManagement.html","webpack:///./src/modules/application-form-management/application-form/ApplicationFormAuthorizedUsersOverlay.html","webpack:///./src/modules/form-management/form-custom-element/radio-group/RadioGroup.html","webpack:///./src/modules/category-management/category-update/CategoryUpdateDialog.html","webpack:///./src/modules/application-form-management/application-form/ApplicationForm.html","webpack:///./src/assets/medias/svg/sprites.svg","webpack:///./src/modules/public-area/PublicArea.html","webpack:///./src/modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormAssignmentPopoverRow.html","webpack:///./src/modules/form-management/form-element/FormElement.html","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/modules/authentication/login/LoginPage.html","webpack:///./src/modules/email-template-management/email-template-update/EmailTemplateUpdateDialog.html","webpack:///./src/modules/session/Session.store.ts","webpack:///./src/modules/form-management/form-custom-element/step-wizard-step/StepWizard.html","webpack:///./src/modules/year-configuration-management/year-configuration/YearConfigurationHelpAreaPanel.html","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment-creation/AdminEvaluatorCategoryAssignmentCreationOverlay.html","webpack:///./src/modules/year-configuration-management/year-configuration-form/YearConfigurationForm.html","webpack:///./src/modules/application-form-validation-management/application-form-validation/AdminApplicationFormValidation.html","webpack:///./src/modules/application-form-support-management/application-form-support/ApplicationFormSupport.html","webpack:///./src/modules/global/error/ErrorPage.html","webpack:///./src/modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormSupportAssignment.html","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment/EvaluatorCategoryAssignment.html","webpack:///./src/modules/global/components/rich-text-editor/RichTextEditor.html","webpack:///./src/modules/application-form-validation-management/AdminApplicationFormValidationManagement.html","webpack:///./src/modules/email-template-management/EmailTemplateManagement.html","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdateInsertZone.ts","webpack:///./src/modules/year-configuration-management/YearConfigurationManagement.html","webpack:///./src/modules/global/breadcrumbs/Breadcrumbs.html","webpack:///./src/modules/application-form-management/application-form/ApplicationFormExportOverlay.html","webpack:///./src/modules/form-management/form-custom-element/step-wizard-step/StepWizardStep.html","webpack:///./src/modules/user-management/user-form/UserForm.html","webpack:///./src/modules/form-management/form-custom-element/file-upload/FileUpload.html","webpack:///./src/modules/dashboard/DashboardPage.html","webpack:///./src/modules/category-management/category-form/CategoryForm.html","webpack:///./src/modules/global/year/YearDropdown.html","webpack:///./src/modules/application-form-management/application-form/ApplicationFormSupportSubmitReminderEmailOverlay.html","webpack:///./src/modules/global/file/UploadedFileRow.ts","webpack:///./src/modules/form-management/form-custom-element/text-area/TextArea.html","webpack:///./src/modules/global/utilities/Events.ts","webpack:///./src/modules/year-configuration-management/year-configuration-update/YearConfigurationUpdateDialog.html","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdateDropZoneElement.html","webpack:///./src/modules/user-management/user-update/UserUpdateDialog.html","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignments/EvaluatorCategoryAssignments.html","webpack:///./src/modules/application-form-management/application-forms/AdminApplicationForms.html","webpack:///./src/modules/application-form-support-management/AdminApplicationFormSupportManagement.html","webpack:///./src/layouts/default/DefaultLayout.html","webpack:///./src/modules/form-management/form-custom-element/text-field/TextField.html","webpack:///./src/modules/form-management/form-custom-element/embedded-video-player/EmbeddedVideoPlayer.html","webpack:///./src/modules/form-management/form-element/FormElements.html","webpack:///./src/assets/medias/images/ulaval-logo.png","webpack:///./src/modules/year-configuration-management/year-configuration/YearConfigurationCategorySectionsPanel.html","webpack:///./src/modules/user-management/users/Users.html","webpack:///./src/modules/application-form-support-management/application-form-support-form/ApplicationFormSupportForm.html","webpack:///./src/modules/user-management/user-creation/UserCreationDialog.html","webpack:///./src/modules/evaluator-toolbox-file-management/evaluator-toolbox-file-deposit/EvaluatorToolboxFileDepositOverlay.html","webpack:///./src sync .*","webpack:///./src/modules/year-configuration-management/year-configuration/YearConfigurationDescriptionAreaPanel.html","webpack:///./src/modules/year-configuration-management/year-configuration/AdminYearConfiguration.html","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdateDropZone.html","webpack:///./src/modules/application-form-management/application-form/SubmitApplicationFormSupportOverlay.html","webpack:///./src/modules/evaluator-management/EvaluatorManagement.html","webpack:///./src/modules/dashboard/DashboardEvaluatorToolbox.html","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment-update/AdminEvaluatorCategoryAssignmentUpdateOverlay.html","webpack:///./src/modules/year-configuration-management/year-configuration/YearConfigurationLayout.html","webpack:///./src/modules/year-configuration-management/year-configuration/PublicYearConfiguration.html","webpack:///./src/modules/application-form-management/application-form/ApplicationFormCard.html","webpack:///./src/modules/application-form-management/application-form/AdminApplicationForm.html","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignments/AdminEvaluatorCategoryAssignments.html","webpack:///./src/modules/form-template-management/FormTemplateManagement.html","webpack:///./src/localization/index.ts","webpack:///./src/router/ROUTES.ts","webpack:///./src/router/helpers.ts","webpack:///./src/CONSTANTS.ts","webpack:///./src/App.ts","webpack:///./src/modules/global/navigation-bar/UserProfileMenu.ts","webpack:///./src/modules/session/ROLES.ts","webpack:///./src/modules/user-management/UserRole.mixin.ts","webpack:///./src/modules/global/navigation-bar/AdministratorMenu.ts","webpack:///./src/modules/global/navigation-bar/NavigationBar.ts","webpack:///./src/modules/year-configuration-management/year-configuration/YearConfigurationDescriptionAreaPanel.ts","webpack:///./src/modules/year-configuration-management/year-configuration/YearConfigurationHelpAreaPanel.ts","webpack:///./src/modules/category-management/category/PublicCategoryCard.ts","webpack:///./src/modules/year-configuration-management/year-configuration/YearConfigurationCategorySectionsPanel.ts","webpack:///./src/modules/year-configuration-management/year-configuration/YearConfigurationLayout.ts","webpack:///./src/modules/global/utilities/Base.service.ts","webpack:///./src/modules/year-configuration-management/YearConfiguration.service.ts","webpack:///./src/modules/year-configuration-management/year-configuration/PublicYearConfiguration.ts","webpack:///./src/modules/public-area/PublicArea.ts","webpack:///./src/layouts/default/DefaultLayout.ts","webpack:///./src/modules/global/error/ErrorPage.ts","webpack:///./src/modules/authentication/Authentication.service.ts","webpack:///./src/modules/authentication/form/AuthenticationForm.ts","webpack:///./src/modules/authentication/login/LoginPage.ts","webpack:///./src/modules/global/components/option-item/SoftDeleteItemOption.ts","webpack:///./src/modules/global/components/option-item/RestoreItemOption.ts","webpack:///./src/modules/application-form-support-management/application-form-support-form/ApplicationFormSupportForm.ts","webpack:///./src/modules/form-template-management/FormTemplate.service.ts","webpack:///./src/modules/application-form-management/ApplicationForm.service.ts","webpack:///./src/modules/application-form-support-management/ApplicationFormSupport.model.ts","webpack:///./src/modules/application-form-support-management/ApplicationFormSupport.mixin.ts","webpack:///./src/modules/application-form-management/application-form/SubmitApplicationFormSupportOverlay.ts","webpack:///./src/modules/application-form-management/ApplicationForm.model.ts","webpack:///./src/modules/application-form-management/ApplicationForm.mixin.ts","webpack:///./src/modules/application-form-management/application-form/ApplicationFormCard.ts","webpack:///./src/modules/application-form-management/application-forms/ApplicationForms.ts","webpack:///./src/modules/global/year/Year.service.ts","webpack:///./src/modules/global/year/YearDropdown.ts","webpack:///./src/modules/dashboard/dashboard-application-form-management/DashboardApplicationFormManagement.ts","webpack:///./src/modules/evaluator-management/evaluator-application-form-assignment-management/EvaluatorApplicationFormAssignment.model.ts","webpack:///./src/modules/evaluator-management/evaluator-application-form-assignment-management/EvaluatorApplicationFormAssignment.service.ts","webpack:///./src/modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormAssignmentRow.ts","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment/EvaluatorCategoryAssignment.ts","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignments/EvaluatorCategoryAssignments.ts","webpack:///./src/modules/dashboard/dashboard-evaluator-assignment-management/DashboardEvaluatorAssignmentManagement.ts","webpack:///./src/modules/evaluator-toolbox-file-management/EvaluatorToolboxFile.service.ts","webpack:///./src/modules/dashboard/DashboardEvaluatorToolbox.ts","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/EvaluatorCategoryAssignment.service.ts","webpack:///./src/modules/dashboard/DashboardEvaluatorSection.ts","webpack:///./src/modules/dashboard/DashboardPage.ts","webpack:///./src/modules/global/breadcrumbs/Breadcrumbs.ts","webpack:///./src/modules/user-management/User.service.ts","webpack:///./src/modules/user-management/users/Users.ts","webpack:///./src/modules/user-management/UserManagement.ts","webpack:///./src/modules/user-management/Role.service.ts","webpack:///./src/modules/user-management/user-form/UserForm.ts","webpack:///./src/modules/user-management/user-creation/UserCreationDialog.ts","webpack:///./src/modules/user-management/user-update/UserUpdateDialog.ts","webpack:///./src/modules/category-management/Category.service.ts","webpack:///./src/modules/category-management/category-copy/CategoryCopyDialog.ts","webpack:///./src/modules/category-management/categories/Categories.ts","webpack:///./src/modules/category-management/CategoryManagement.ts","webpack:///./src/modules/global/components/rich-text-editor/RichTextEditor.ts","webpack:///./src/modules/category-management/category-form/CategoryForm.ts","webpack:///./src/modules/category-management/category-creation/CategoryCreationDialog.ts","webpack:///./src/modules/category-management/category-update/CategoryUpdateDialog.ts","webpack:///./src/modules/email-template-management/EmailTemplate.service.ts","webpack:///./src/modules/email-template-management/email-templates/EmailTemplates.ts","webpack:///./src/modules/email-template-management/EmailTemplateManagement.ts","webpack:///./src/modules/email-template-management/email-template-form/EmailTemplateForm.ts","webpack:///./src/modules/email-template-management/email-template-update/EmailTemplateUpdateDialog.ts","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdateDropZone.ts","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdateAvailableElements.ts","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdateSelectedElement.ts","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdateElementPanel.ts","webpack:///./src/modules/form-template-management/FormTemplateManagement.ts","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdate.ts","webpack:///./src/modules/form-management/form-element/FormElements.ts","webpack:///./src/modules/form-template-management/form-template-preview/FormTemplatePreview.ts","webpack:///./src/modules/application-form-management/application-form/ApplicationForm.ts","webpack:///./src/modules/application-form-management/application-form-form/ApplicationFormForm.ts","webpack:///./src/modules/application-form-management/application-form-creation/ApplicationFormCreationDialog.ts","webpack:///./src/modules/global/email/EmailStatus.model.ts","webpack:///./src/modules/global/email/EmailStatus.mixin.ts","webpack:///./src/modules/global/email/EmailStatusRow.ts","webpack:///./src/modules/application-form-management/application-form/ApplicationFormReminderEmailOverlay.ts","webpack:///./src/modules/application-form-management/application-form/ApplicationFormDepositDeadlineExtensionOverlay.ts","webpack:///./src/modules/application-form-support-management/application-form-support/ApplicationFormSupportRow.ts","webpack:///./src/modules/application-form-support-management/ApplicationFormSupport.service.ts","webpack:///./src/modules/application-form-management/application-form/ApplicationFormSupportSubmitReminderEmailOverlay.ts","webpack:///./src/modules/application-form-management/application-form/ApplicationFormAuthorizedUsersOverlay.ts","webpack:///./src/modules/application-form-management/application-form/ApplicationFormExportOverlay.ts","webpack:///./src/modules/application-form-management/application-forms/AdminApplicationForms.ts","webpack:///./src/modules/application-form-management/AdminApplicationFormManagement.ts","webpack:///./src/modules/application-form-management/application-form/AdminApplicationForm.ts","webpack:///./src/modules/application-form-support-management/application-form-support/ApplicationFormSupport.ts","webpack:///./src/modules/application-form-support-management/application-form-support/AdminApplicationFormSupport.ts","webpack:///./src/modules/application-form-support-management/application-form-support/ApplicationFormSupportReminderEmailOverlay.ts","webpack:///./src/modules/application-form-support-management/application-form-supports/AdminApplicationFormSupports.ts","webpack:///./src/modules/application-form-support-management/AdminApplicationFormSupportManagement.ts","webpack:///./src/modules/application-form-validation-management/ApplicationFormValidation.model.ts","webpack:///./src/modules/application-form-validation-management/ApplicationFormValidation.mixin.ts","webpack:///./src/modules/application-form-validation-management/ApplicationFormValidation.service.ts","webpack:///./src/modules/application-form-validation-management/application-form-validations/AdminApplicationFormValidations.ts","webpack:///./src/modules/application-form-validation-management/AdminApplicationFormValidationManagement.ts","webpack:///./src/modules/application-form-validation-management/application-form-validation/AdminApplicationFormValidation.ts","webpack:///./src/modules/category-management/evaluation-card-management/evaluation-card-deposit/EvaluationCardDepositOverlay.ts","webpack:///./src/modules/evaluator-management/evaluator-application-form-assignment-management/EvaluatorApplicationFormAssignment.mixin.ts","webpack:///./src/modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormAssignmentPopoverRow.ts","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignments/AdminEvaluatorCategoryAssignments.ts","webpack:///./src/modules/evaluator-management/EvaluatorManagement.ts","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment-form/AdminEvaluatorCategoryAssignmentForm.ts","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment-creation/AdminEvaluatorCategoryAssignmentCreationOverlay.ts","webpack:///./src/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment-update/AdminEvaluatorCategoryAssignmentUpdateOverlay.ts","webpack:///./src/modules/evaluator-toolbox-file-management/evaluator-toolbox-file-deposit/EvaluatorToolboxFileDepositOverlay.ts","webpack:///./src/modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormAssignment.ts","webpack:///./src/modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormSupportAssignment.ts","webpack:///./src/modules/year-configuration-management/year-configuration/AdminYearConfiguration.ts","webpack:///./src/modules/year-configuration-management/YearConfigurationManagement.ts","webpack:///./src/modules/category-section-management/category-section-form/CategorySectionFormRow.ts","webpack:///./src/modules/category-section-management/category-section-form/CategorySectionForm.ts","webpack:///./src/modules/year-configuration-management/year-configuration-form/YearConfigurationForm.ts","webpack:///./src/modules/year-configuration-management/year-configuration-update/YearConfigurationUpdateDialog.ts","webpack:///./src/modules/public-area/form-template-preview/PublicFormTemplatePreview.ts","webpack:///./src/router/index.ts","webpack:///./src/router/Router.mixin.ts","webpack:///./src/modules/session/Session.mixin.ts","webpack:///./src/modules/global/utilities/Timestamp.mixin.ts","webpack:///./src/modules/global/utilities/String.mixin.ts","webpack:///./src/modules/global/utilities/Utilities.mixin.ts","webpack:///./src/plugins/icons.ts","webpack:///./src/main.ts","webpack:///./src/modules/category-management/category-copy/CategoryCopyDialog.html","webpack:///./src/modules/form-template-management/form-template-preview/FormTemplatePreview.html","webpack:///./src/modules/application-form-support-management/application-form-support/ApplicationFormSupportRow.html","webpack:///./src/modules/application-form-management/application-form/ApplicationFormReminderEmailOverlay.html","webpack:///./src/modules/category-management/evaluation-card-management/evaluation-card-deposit/EvaluationCardDepositOverlay.html","webpack:///./src/modules/global/navigation-bar/AdministratorMenu.html","webpack:///./src/modules/category-management/categories/Categories.html","webpack:///./src/modules/global/navigation-bar/NavigationBar.html","webpack:///./src/modules/category-section-management/category-section-form/CategorySectionFormRow.html","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdateInsertZone.html","webpack:///./src/modules/form-management/form-custom-element/multi-answer-row/MultiAnswerRow.html","webpack:///./src/modules/global/file/UploadedFileRow.html","webpack:///./src/modules/category-management/CategoryManagement.html","webpack:///./src/modules/authentication/form/AuthenticationForm.html","webpack:///./src/App.html","webpack:///./src/modules/category-section-management/category-section-form/CategorySectionForm.html","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdateSelectedElement.html","webpack:///./src/modules/global/email/EmailStatusRow.html","webpack:///./src/modules/form-template-management/form-template-update/FormTemplateUpdate.html","webpack:///./src/modules/dashboard/DashboardEvaluatorSection.html","webpack:///./src/modules/email-template-management/email-templates/EmailTemplates.html","webpack:///./src/modules/global/navigation-bar/UserProfileMenu.html","webpack:///./src/modules/email-template-management/email-template-form/EmailTemplateForm.html","webpack:///./src/modules/application-form-validation-management/application-form-validations/AdminApplicationFormValidations.html","webpack:///./src/modules/application-form-support-management/application-form-supports/AdminApplicationFormSupports.html"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","jsonpScriptSrc","p","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","window","oldJsonpFunction","slice","WRAPPER_REF","LABEL_PARAMETER_KEYS","FormTemplateUpdateDropZoneElement","mixins","constructor","insertDraggedElement","moveDraggedElement","isMouseOver","isSelectedElement","isInsertDraggedElementOver","isNewElement","this","hasChildren","requestErrors","formTemplateElement","internal_identifier","styles","childrens","sort","leftHandSide","rightHandSide","element_position_index","$store","getters","STORE_GETTERS","FORM_TEMPLATE_AVAILABLE_ELEMENT_GET_FORM_TEMPLATE_AVAILABLE_ELEMENTS_BY_TYPE","formTemplateElementType","availableFormTemplateElements","element_type","allowed_children_types","includes","parameter","element_parameters","onFormTemplateElementIdChange","mounted","id","onElementInsertDragStart","onElementInsertDragEnd","onElementInsertDragDrop","onSelectedElementChange","onFormTemplateElementDelete","onFormTemplateElementUpdate","onElementMoveDragStart","onElementMoveDragEnd","EventBus","$on","EVENT_BUS_EVENTS","FORM_TEMPLATE_ELEMENT_SELECTED","eventSelectedElement","FORM_TEMPLATE_ELEMENT_UPDATED","FORM_TEMPLATE_ELEMENT_DELETED","onElementClick","$emit","onMouseOver","onMouseLeave","onMouseOut","onDragOver","onDragLeave","wrapperDivComponent","cardDomRect","getBoundingClientRect","xLowerBound","x","xUpperBound","width","yLowerBound","y","yUpperBound","height","FORM_TEMPLATE_ELEMENT_INSERT_DRAG_STARTED","element","FORM_TEMPLATE_ELEMENT_INSERT_DRAG_ENDED","FORM_TEMPLATE_ELEMENT_INSERT_DRAG_DROPPED","FORM_TEMPLATE_ELEMENT_MOVE_DRAG_STARTED","parent_internal_identifier","FORM_TEMPLATE_ELEMENT_MOVE_DRAG_ENDED","triggerElementMoveDragStart","dataTransfer","effectAllowed","dropEffect","setData","DRAG_AND_DROP_EVENTS_IDENTIFIER_KEY","DRAG_AND_DROP_EVENTS_IDENTIFIER","FORM_TEMPLATE_ELEMENT_MOVE","JSON","stringify","triggerElementMoveDragEnd","isDraggedElementMovable","index","__decorate","Prop","required","Ref","Watch","WithRender","Component","components","FormTemplateUpdateInsertZone","FormTemplateElementParameterType","FormElementMixin","elementValue","errorMessage","hideSensitiveInformations","isElementSensitiveInformation","answer","answers","id_form_template_element","internalElement","rowPositionIndex","formAnswers","reduce","props","frontend_type","INTERNAL_LOGIC","frontend_key","parse","exception","DEFAULT_VALUE","CSS_CLASS","CSS_STYLE","CONTENT","element_options","assembledPropsList","PROP","readonly","slots","SLOT","classes","elementAdditionnalClasses","STYLE","elementAdditionnalStyles","differentStyles","split","forEach","differentStyle","stylePair","displayEvaluatorAdditionnalInformations","elementInternalLogicParameters","componentHasOptions","Array","from","lhs","rhs","order","onFormElementAnswerChange","displayDuplicateAnswers","duplicateAnswerIndex","formElementAnswers","formElementAnswer","onValueChange","isArray","validateAnswers","childrenHasError","id_form_answer","$children","component","componentAnswers","getElementAnswersRecursive","validate","isValid","formElementAnswerCount","formElement","count","componentTag","$options","elementComponentTag","component_name","assembledElementProps","$i18next","mixin_string_isEmpty","default","immediate","StepWizard","selectedStepWizardIdentifier","MButtonSkin","created","onStepWizardStepSelected","FORM_ELEMENT_STEP_WIZARD_STEP_SELECTED","elementId","onPreviousStepButtonClick","currentElementIndex","previousElement","onNextStepButtonClick","nextElement","FormElement","MButton","MSteppers","EVENT_DISPATCH_THRESHOLD","StepWizardStep","stepWizardStepState","MSteppersItemState","Visited","onItemClick","InProgress","resizeWindow","eventDispatchCount","resizeInterval","setInterval","dispatchEvent","Event","clearInterval","MSteppersItem","FileUpload","files","onFormElementAnswerChangeEvent","formAnswer","form_answer_files","map","formAnswerFile","server_file","onAttachmentsChange","GLOBAL_EVENTS","MODEL_CHANGE","onFilesChange","onFilesReady","$file","uploadTemp","onFilesUploadCompleted","file","$set","removeAttachment","$delete","computedMinFileCount","computedMaxFileCount","MFileUpload","MIcon","MValidationMessage","UploadedFileRow","MultiAnswerRow","multipleElementRows","MIconButtonSkin","Number","parseInt","isMultiElementRow","multiElementRowMinimumCount","multiElementRowMaximumCount","Math","max","values","mappedElementChildrensRecrusive","intitializeMultiElementRows","maximumAnswerRowCount","loopUpperBound","isMultiElementRowIndexLast","addMultiElementRowElement","isIndexOverMinimumCount","removeMultiElementRowElement","parentElement","children","MIconButton","RadioGroup","acc","optionAnswerCount","option","answersCountByValue","MRadio","MRadioGroup","TextField","MTextfield","TextArea","MTextarea","EmbeddedVideoPlayer","formatEmbeddedUrl","url","formatYoutubeUrl","videoId","MLink","MAccordion","MAccordionGroup","MCheckbox","MDatepicker","MDropdown","MDropdownItem","MMessage","MSwitch","MTimepicker","STORE_ACTIONS","YearStore","VuexModule","_years","_currentYear","storeYearsMutation","years","storeCurrentYearMutation","year","storeYears","context","commit","storeCurrentYear","mappedYears","slug","Mutation","Action","Module","namespaced","FormTemplateAvailableElementStore","_formTemplateAvailableElements","storeFormTemplateAvailableElementsMutation","formTemplateAvailableElements","storeFormTemplateAvailableElements","mappedFormTemplateAvailableElements","formTemplateAvailableElement","Vue","use","Vuex","SESSION_STORE_ACTIONS","YEAR_STORE_ACTIONS","FORM_TEMPLATE_AVAILABLE_ELEMENT_STORE_ACTIONS","SESSION_STORE_GETTERS","YEAR_STORE_GETTERS","FORM_TEMPLATE_AVAILABLE_ELEMENT_STORE_GETTERS","Store","session","SessionStore","webpackContext","req","webpackContextResolve","code","keys","TOKEN_LOCAL_STORAGE_KEY","_token","_isLoggedIn","_firstName","_lastName","_email","_username","_roles","storeTokenMutation","token","localStorage","setItem","synchroniseWithLocalStorageMutation","getItem","decodeTokenInformationsMutation","decodedToken","jwt","decode","firstName","lastName","email","username","roles","clearTokenMutation","removeItem","clearUserInformationsMutation","login","logout","synchroniseWithLocalStorage","userFullName","onElementDrop","eventType","getData","FORM_TEMPLATE_ELEMENT_INSERT","parentInternalIdentifier","insertionElementPositionIndex","FORM_TEMPLATE_ELEMENT_MOVE_DRAG_DROPPED","originalElement","onElementDragOver","preventDefault","stopImmediatePropagation","UploadedFileRow_EVENTS","REF_DOWNLOAD_LINK","MLinkMode","uploadedFile","file_name","size","file_size","extension","fileNameParts","download_endpoint","onDeleteOptionClick","DELETE","downloadFile","openFile","$axios","responseType","headers","Accept","then","res","URL","createObjectURL","Blob","file_format","fileName","downloadLinkHtmlElement","click","removeAttribute","MIconFile","LOCALES","MOMENT_LOCALES","DEFAULT_NAMESPACE","CURRENT_LOCALE","FR","getFromDottedNotation","properties","propertiesArray","getTranslations","translations","require","filePath","pathParameters","filter","el","translationTree","pathParameter","treeParameterPath","join","obj","lang","substring","lastIndexOf","merge","i18next","init","lng","fallbackLng","defaultNS","entries","locale","resources","addResourceBundle","ROUTES","ROUTE_LOCALE_DELIMITER","META_KEY_HIDDEN_BREADCRUMB","META_KEY_ADDITIONAL_BREADCRUMBS","META_KEY_LOCALE","META_KEY_IS_BREADCRUMB_HOME_PUBLIC_ZONE","META_KEY_DISPLAY_PUBLIC_NAVIGATION_BAR","generateLocalizedRouteName","parameters","extractLocalizedRouteParameters","routeParameters","generateLocalizedRoutePath","Localization","localizeBreadcrumbs","breadcrumbs","breadcrumb","localizeRouteConfigChildrenRecursive","routes","path","meta","localizeRouteConfig","config","localizeRouteConfigs","originalRoutes","route","CONSTANTS","HTTP_STATUS_TO_REDIRECT","HttpStatusCode","INTERNAL_SERVER_ERROR","toString","FORBIDDEN","UNAUTHORIZED","HTTP_STATUS_NOT_LOGGED_IN","App","initializeAxiosInterceptors","dispatch","SESSION_STORE_SYNCHRONISE_WITH_LOCAL_STORAGE","setAxiosBasicHeaders","title","updated","sessionToken","defaults","common","Authorization","interceptors","response","$route","LOGIN","status","SESSION_GET_TOKEN","setLocalStorageRememberedRoute","SESSION_STORE_LOGOUT","mixin_router_navigate","validation","expired_token","user_not_an_evaluator","mixin_router_redirectRequestError","ERROR","query","params","LOCAL_STORAGE_REMEMBERED_ROUTE","UserProfileMenu","SESSION_GET_USER_FULL_NAME_WITH_USERNAME","SESSION_GET_EMAIL","onLogoutOptionClick","DEFAULT","MPopup","ROLES","UserRoleMixin","mixin_session_userHasRole","GESTIONNAIRE_GABARIT_FORMULAIRE","ADMINISTRATOR","GESTIONNAIRE_CATEGORIE","GESTIONNAIRE_GABARIT_COURRIEL","GESTIONNAIRE_CANDIDATURE","GESTIONNAIRE_APPUI_CANDIDATURE","GESTIONNAIRE_VALIDATION_CANDIDATURE","GESTIONNAIRE_EVALUATEUR","GESTIONNAIRE_SECTION_PUBLIQUE","AdministratorMenu","onManageUsersOptionClick","USER_MANAGEMENT_USER_LIST","onManageCategoriesOptionClick","CATEGORY_MANAGEMENT_CATEGORY_LIST","onManageEmailTemplatesOptionClick","EMAIL_TEMPLATE_MANAGEMENT_EMAIL_TEMPLATE_LIST","onManageApplicationFormsOptionClick","ADMIN_APPLICATION_FORM_MANAGEMENT","onManageApplicationFormSupportsOptionClick","ADMIN_APPLICATION_FORM_SUPPORT_MANAGEMENT","onManageApplicationFormValidationsOptionClick","ADMIN_APPLICATION_FORM_VALIDATION_MANAGEMENT","onManageEvaluatorsOptionClick","EVALUATOR_MANAGEMENT_LIST","onManageYearConfigurationsOptionClick","YEAR_CONFIGURATION_MANAGEMENT_LIST","NavigationBar","isLoggedIn","mixin_router_generateHref","DASHBOARD","SESSION_GET_IS_LOGGED_IN","mixin_userrole_hasAdministratorRole","mixin_userrole_hasGestionnaireCategorieRole","mixin_userrole_hasGestionnaireGabaritCourrielRole","mixin_userrole_hasGestionnaireCandidatureRole","mixin_userrole_hasGestionnaireAppuiCandidatureRole","onLoginButtonClick","YearConfigurationDescriptionAreaPanel","MPanel","YearConfigurationHelpAreaPanel","PublicCategoryCard","$moment","category","application_deposit_limit_timestamp","isBefore","onCategoryTitleClick","displayFormTemplatePublicPreview","PUBLIC_FORM_TEMPLATE_PREVIEW","idCategory","YearConfigurationCategorySectionsPanel","localization","onCreateApplicationFormButtonClick","APPLICATION_FORM_CREATION","sortCategories","categories","sort_order","YearConfigurationLayout","BaseService","service_baseService_generateFilterQuery","filters","queryParameters","attribute","service_baseService_generateObjectFilter","service_baseService_emitEventBusEvent","payload","service_baseService_multipartFormDataHeader","YearConfigurationService","service_yearConfigurationService_adminFetchYearConfiguration","yearId","year_configuration","catch","service_yearConfigurationService_publicFetchYearConfiguration","service_yearConfigurationService_update","yearConfigurationId","put","updatedYearConfiguration","YEAR_CONFIGURATION_UPDATED","service_yearConfigurationService_fetchAvailableCategories","PublicYearConfiguration","yearConfiguration","isLoadingStateActive","MMessageSkin","MMessageState","loadYearConfiguration","loadingStateActivationTimeout","DEFAULT_LOADING_STATE_TIMEOUT_VALUE","finally","MSpinner","PublicArea","DefaultLayout","MANAGED_STATUSES","NOT_FOUND","ErrorPage","routeStatus","SERVICE_UNAVAILABLE","MErrorPageNotFound","MErrorAccessDenied","MErrorTechnicalDifficulty","MErrorResourceUnavailable","returnObjects","AuthenticationService","service_authenticationService_authenticate","requestPayload","post","requestResponse","store","SESSION_STORE_LOGIN","AuthenticationForm","formGroup","FormGroup","FormControl","RequiredValidator","password","isAuthenticationLoadingStateActive","MTextfieldType","MButtonType","AUTHENTICATION_LOADING_STATE_TIMEOUT","ERROR_KEY_INVALID_CREDENTIALS","getControl","authenticate","authenticationLoadingStateTimeout","usernameField","passwordField","rememberedRoute","$router","MForm","MTooltip","LoginPage","SoftDeleteItemOption","MOptionItemPredefined","RestoreItemOption","ApplicationFormSupportForm_EVENTS","ApplicationFormSupportForm","supporterName","supporterEmail","EmailValidator","submit","hasErrorDeep","formPayloadData","supporter_name","supporterNameField","supporter_email","supporterEmailField","onAddIconClick","ADD_ICON_CLICK","onDeleteIconClick","DELETE_ICON_CLICK","FormTemplateService","service_formTemplateService_fetchAvailableElements","availableElements","elements","FORM_TEMPLATE_AVAILABLE_ELEMENT_STORE_STORE_FORM_TEMPLATE_AVAILABLE_ELEMENTS","service_formTemplateService_fetch","form_template","service_formTemplateService_fetchPublic","categoryId","internal_form_template","service_formTemplateService_mapFormTemplateToInternalFormTemplate","service_formTemplateService_update","internalFormTemplate","service_formTemplateService_mapInternalFormTemplateToRequestForm","FORM_TEMPLATE_UPDATED","service_formTemplateService_fetchMappedToInternalFormTemplate","formTemplate","service_formTemplateService_mapInternalFormTemplateElementToRequestFormRecursive","formTemplateElements","mappedElements","mappedOptions","mappedParameters","elementConfiguration","elementConfigurationParameter","find","is_updateable","service_formTemplateService_mapFormTemplateElementToInternalFormTemplateElement","elementInternalIdentifier","option_component_name","isNaN","ApplicationFormService","service_applicationFormService_fetchUserApplicationFormList","queryString","year_id","application_forms","service_applicationFormService_fetchApplicationForm","application_form","form","service_applicationFormService_fetchAvailableCategories","service_applicationFormService_createApplicationForm","createdApplicationForm","APPLICATION_FORM_CREATED","service_applicationFormService_deleteApplicationForm","delete","APPLICATION_FORM_DELETED","service_applicationFormService_softDeleteApplicationForm","updatedApplicationForm","APPLICATION_FORM_UPDATED","service_applicationFormService_restoreApplicationForm","service_applicationFormService_saveApplicationForm","service_applicationFormService_generateAnswersFormData","service_applicationFormService_submitApplicationForm","FormData","answerForm","answerValue","append","fileIndex","set","service_applicationFormService_fetchAdminApplicationFormList","service_applicationFormService_sendApplicationFormReminderEmails","APPLICATION_FORM_REMINDER_EMAIL_SENT","service_applicationFormService_fetchAdminApplicationForm","service_applicationFormService_updateDepositDeadlineExtension","service_applicationFormService_submitApplicationFormSupport","APPLICATION_FORM_APPLICATION_FORM_SUPPORT_SUBMITTED","service_applicationFormService_sendApplicationFormSupportSubmitReminderEmails","APPLICATION_FORM_SUPPORT_SUBMIT_REMINDER_EMAIL_SENT","service_applicationFormService_deleteApplicationFormAdmin","service_applicationFormService_saveApplicationFormAdmin","service_applicationFormService_saveAuthorizedUsersAdmin","service_applicationFormService_deleteApplicationFormSupport","idApplicationForm","idApplicationFormSupport","service_applicationFormService_adminDownloadExportFile","ApplicationFormSupportStatus","ApplicationFormSupportMixin","mixin_applicationFormSupport_computeStatusColor","applicationFormSupport","IN_PROGRESS","OVERDUE","SUBMITTED","mixin_applicationFormSupport_computeStatusIcon","mixin_applicationFormSupport_computeStatusIconStyles","mixin_applicationFormSupport_computeStatusLabel","APPLICATION_FORM_SUPPORT_FORM_REF","SubmitApplicationFormSupportOverlay_EVENTS","SubmitApplicationFormSupportOverlay","applicationFormSupportForms","isOverlayOpen","showSubmitSuccessMessage","showSubmitErrorMessage","isDeleteLoadingStateActive","applicationFormSupportToDelete","showDeleteSuccessMessage","showDeleteErrorMessage","MDialogState","MDialogWidth","applicationForm","category_application_support_count_upper_bound","application_form_supports","closeOverlay","afterOverlayClose","AFTER_CLOSE","increaseApplicationFormSupportFormCount","decreaseApplicationFormSupportFormCount","formPayload","getFormPayload","submitApplicationFormSupports","applicationFormSupports","applicationFormSupportFormComponents","applicationFormSupportForm","applicationFormSupportFormPayload","application_form_id","onDisplayDeleteConfirmationIconClick","hideDeleteConfirmationDialog","deleteApplicationFormSupport","applicationFormSupportIndex","findIndex","MAdd","MDialog","MOverlay","ApplicationFormStatus","ApplicationFormMixin","mixin_applicationForm_computeStatusColor","INACTIVE","mixin_applicationForm_computeStatusIcon","mixin_applicationForm_computeStatusIconStyles","mixin_applicationForm_isApplicationFormInactive","mixin_applicationForm_computeStatusLabel","mixin_applicationForm_hasFormAnswerFiles","form_answers","some","mixin_applicationForm_internalDownloadFile","mixin_applicationForm_internalOpenFile","axios","downloadLinkElement","style","visibility","ApplicationFormCard","isDeleteDialogVisible","isSoftDeleteSuccessToastOpen","isRestoreSuccessToastOpen","isSubmitApplicationFormSupportOverlayDisplayed","MToastPosition","MToastState","MToastTimeout","navigateToApplicationForm","APPLICATION_FORM","deleteApplicationForm","softDeleteApplicationForm","MToastDuration","DesktopXShort","restoreApplicationForm","displayDeleteDialog","hideDeleteDialog","displaySubmitApplicationFormSupportDialog","hideSubmitApplicationFormSupportDialog","MOption","MOptionItemDelete","MToast","ApplicationForms","applicationForms","isApplicationFormDeleteSuccessToastOpen","onYearChange","loadApplicationForms","afterApplicationFormCreated","afterApplicationFormUpdated","afterApplicationFormDeleted","afterApplicationFormSupportSubmitted","originalCategoryIndex","originalApplicationFormIndex","YearService","service_yearService_fetchList","YEAR_STORE_STORE_YEARS","service_yearService_fetchCurrent","YEAR_STORE_STORE_CURRENT_YEAR","YearDropdown","selectedYearSlug","YEAR_GET_YEARS","YEAR_GET_YEARS_BY_SLUG","YEAR_GET_CURRENT_YEAR","currentYear","onCurrentYearChange","onSelectedYearSlugChange","matchingYear","yearsBySlug","hasYears","hasCurrentYear","loadCurrentYear","loadYears","DashboardApplicationFormManagement","onCreateApplicationFormButton","EvaluatorApplicationFormAssignmentStatus","EvaluatorApplicationFormAssignmentService","service_evaluatorApplicationFormAssignmentService_flagAsDone","DONE","EVALUATOR_APPLICATION_FORM_ASSIGNMENT_UPDATED","service_evaluatorApplicationFormAssignmentService_flagAsInProgress","service_evaluatorApplicationFormAssignmentService_fetchApplicationForm","evaluator_application_form_assignment","service_evaluatorApplicationFormAssignmentService_fetchApplicationFormSupports","EvaluatorApplicationFormAssignmentRow","isStatusTooltipOpen","MTooltipMode","MTooltipSize","evaluatorApplicationFormAssignment","onStatusSwitchChange","updateStatus","onDisplayApplicationFormLinkClick","isApplicationFormLinkDisabled","EVALUATOR_APPLICATION_FORM_DISPLAY","idEvaluatorApplicationFormAssignment","onStatusSwitchMouseOver","displayStatusTooltip","onStatusSwitchMouseLeave","hideStatusTooltip","EvaluatorCategoryAssignment","EvaluatorCategoryAssignments","DashboardEvaluatorAssignmentManagement","EvaluatorToolboxFileService","service_evaluatorToolboxFileService_fetchList","evaluator_toolbox_files","service_evaluatorToolboxFileService_deposit","service_evaluatorToolboxFileService_fetchEvaluatorList","DashboardEvaluatorToolbox","evaluatorToolboxFiles","evaluatorToolboxFile","EvaluatorCategoryAssignmentService","service_evaluatorCategoryAssignmentService_adminFetchEvaluatorsCategoryAssignments","service_evaluatorCategoryAssignmentService_fetchAvailableCategories","service_evaluatorCategoryAssignmentService_createEvaluatorCategoryAssignment","EVALUATOR_CATEGORY_ASSIGNMENT_CREATED","service_evaluatorCategoryAssignmentService_adminFetchEvaluatorCategoryAssignments","evaluator_category_assignments","service_evaluatorCategoryAssignmentService_updateEvaluatorCategoryAssignment","EVALUATOR_CATEGORY_ASSIGNMENT_UPDATED","service_evaluatorCategoryAssignmentService_fetchEvaluatorCategoryAssignments","DashboardEvaluatorSection","evaluatorCategoryAssignments","isUserEvaluator","loadEvaluatorToolboxFiles","loadEvaluatorCategoryAssignments","afterEvaluatorApplicationFormAssignmentUpdate","responseData","DashboardPage","Breadcrumbs","matched","additionalBreadcrumb","breacrumbRouteParameters","breacrumbRoute","href","label","currentRouteParameters","dashboardRouteName","UserService","service_userService_fetchList","service_userService_fetchUserLdapInformations","idul","user","service_userService_fetch","service_userService_create","createdUser","USER_CREATED","service_userService_update","updatedUser","USER_UPDATED","Users","users","paginationData","dataProp","textAlign","MColumnTextAlign","Right","loadUsers","afterUserCreated","current_page_index","pageIndex","page","searchField","pagination","onPageChange","newIndex","onSearchFieldChange","onCreateUserButtonClick","USER_MANAGEMENT_USER_CREATION","onUserUpdateOptionClick","USER_MANAGEMENT_USER_UPDATE","idUser","MOptionItemEdit","MPagination","MSearchfield","MTable","MTableHeader","UserManagement","RoleService","service_roleService_fetchList","UserForm","formErrors","isRoleLoadingStateActive","isLdapInformationsSearchLoadingStateActive","selectedRoles","role","errors","hasError","firstNameField","lastNameField","emailField","hideUserInformationsForm","addControl","fetchRoles","fetchLdapUserInformations","idulSearchField","userInformations","first_name","last_name","clearUserInformations","withRoleSelection","mapSelectedRolesToSlugs","slugs","clear","MMultiSelect","FORM_REF","UserCreationDialog","showCreationSuccessMessage","userFormRef","createUser","UserUpdateDialog","isUserFetchLoadingStateActive","showUpdateSuccessMessage","originalUser","onUserIdRouteParameterChange","loadUser","updateUser","MProgress","CategoryService","service_categoryService_fetchList","service_categoryService_fetch","service_categoryService_softDelete","updatedCategory","CATEGORY_UPDATED","service_categoryService_restore","service_categoryService_create","createdCAtegory","CATEGORY_CREATED","service_categoryService_update","service_categoryService_copy","copiedCategories","service_categoryService_delete","CATEGORY_DELETED","service_categoryService_evaluationCardDeposit","CategoryCopyDialog_EVENTS","CategoryCopyDialog","targetYear","DIALOG_CLOSE","onSaveButtonClick","target_year_id","categories_id","selectedCategories","Categories","selectedCopyCategoriesId","withSoftDeletedCategoriesFilter","appliedSortColumn","isCategoryCopyDialogVisible","isCategoryDeleteDialogVisible","selectedCategoryForDelete","isCategoryDeleteLoadingStateActive","isCategoryDeleteSuccessToastOpen","onWithSoftDeletedCategoriesFilterChange","loadCategories","onSelectAllCategoriesForCopyChange","sortColumn","sortDirection","leftHandSideValue","rightHandSideValue","MColumnSortDirection","Asc","Left","sortable","defaultSortDirection","Center","afterCategoryCreated","afterCategoryUpdated","afterCategoryDeleted","deleted_at","backgroundLoad","with_soft_deleted","onCreateCategoryButtonClick","CATEGORY_MANAGEMENT_CATEGORY_CREATION","onCategoryUpdateOptionClick","CATEGORY_MANAGEMENT_CATEGORY_UPDATE","onCategorySoftDeleteStateChange","newStateValue","restoreCategory","softDeleteCategory","onSelectCategoryForCopyChange","selected","selectedCategoryId","indexOf","onTableSortApplied","column","displayCategoryCopyDialog","hideCategoryCopyDialog","onCategoryDeleteOptionClick","displayCategoryDeleteDialog","hideCategoryDeleteDialog","deleteCategory","onFormTemplateOptionClick","FORM_TEMPLATE_MANAGEMENT_FORM_TEMPLATE_PREVIEW","idFormTemplate","onTriggerEvaluationCardDepositOverlayOptionClick","CATEGORY_MANAGEMENT_CATEGORY_EVALUATION_CARD_DEPOSIT","MOptionItem","CategoryManagement","RichTextEditor","content","isFocused","onModelChange","model","onContentChange","MODEL_UPDATED","onEditorFocus","onEditorBlur","Model","Editor","REF_APPLICATION_SUPPORT_CREATION_DIALOG_MESSAGE","REF_APPLICATION_SUPPORT_CREATION_EMAIL_MESSAGE","REF_DESCRIPTION_MESSAGE","CategoryForm","application_deposit_limit_date","application_deposit_limit_time","evaluation_period_limit_date","evaluation_period_limit_time","is_new_category","has_application_support","applicationSupportCreationDialogMessageModel","applicationSupportCreationEmailMessageModel","descriptionMessageModel","onHasApplicationSupportChange","containsControl","removeControl","populateFormFromModel","titleField","description","applicationDepositLimitDateField","mixin_timestamp_extractDate","applicationDepositLimitTimeField","mixin_timestamp_extractTime","evaluationPeriodLimitDateField","evaluation_period_limit_timestamp","evaluationPeriodLimitTimeField","sortOrderField","isNewCategoryCheckbox","hasApplicationSupportCheckbox","applicationSupportCountLowerBoundField","application_support_count_lower_bound","applicationSupportCountUpperBoundField","application_support_count_upper_bound","applicationSupportDepositLimitDateField","application_support_deposit_limit_timestamp","applicationSupportDepositLimitTimeField","applicationSupportSubmitLimitDateField","application_support_submit_limit_timestamp","applicationSupportSubmitLimitTimeField","application_support_creation_dialog_message","application_support_creation_email_message","areRichTextEditorsValid","applicationSupportCreationDialogMessageComponent","applicationSupportCreationEmailMessageComponent","descriptionMessageComponent","application_support_deposit_limit_date","application_support_deposit_limit_time","application_support_submit_limit_date","application_support_submit_limit_time","MIntegerfield","CategoryCreationDialog","categoryFormRef","createCategory","mixin_timstamp_dateAndTimeToTimestamp","CategoryUpdateDialog","isCategoryFetchLoadingStateActive","originalCategory","onCategoryIdRouteParameterChange","loadCategory","updateCategory","EmailTemplateService","service_emailTemplateService_fetchList","email_templates","service_emailTemplateService_fetch","email_template","service_emailTemplateService_update","content_header","content_message","carbon_copy_recipients","recipient","blind_carbon_copy_recipients","updatedEmailTemplate","EMAIL_TEMPLATE_UPDATED","EmailTemplates","emailTemplates","localeCompare","loadEmailTemplates","afterEmailTemplateUpdated","originalEmailTemplateIndex","emailTemplate","onEmailTemplateUpdateOptionClick","EMAIL_TEMPLATE_MANAGEMENT_EMAIL_TEMPLATE_UPDATE","idEmailTemplate","EmailTemplateManagement","EmailTemplateForm","contentMessage","emailTemplateAttachments","carbonCopyRecipients","blindCarbonCopyRecipients","ALLOWED_ATTACHMENT_EXTENSIONS","fields","computeCarbonCopyRecipientFieldName","computeBlindCarbonCopyRecipientFieldName","objectField","contentHeaderField","attachments","emailTemplateAttachment","addCarbonCopyRecipient","addBlindCarbonCopyRecipient","removeEmailAttachment","fieldIdentifier","onCarbonCopyRecipientValueChange","onBlindCarbonCopyRecipientValueChange","deleteCarbonCopyRecipient","deleteBlindCarbonCopyRecipient","EmailTemplateUpdateDialog","isEmailTemplateFetchLoadingStateActive","originalEmailTemplate","onEmailTemplateIdRouteParameterChange","loadEmailTemplate","emailTemplateFormRef","updateEmailTemplate","FormTemplateUpdateDropZone","allow_as_root_element","FormTemplateUpdateAvailableElements","element_section","sortedFormTemplateElements","onDragStart","onDragEnd","FormTemplateUpdateSelectedElement","parametersValue","elementOptions","mappedAvailableFormTemplateElements","selectedElement","selectedElementAvailableElementType","hasParameterTooltipLabel","exists","hasParameterHelperMessageLabel","onSelectedElementAvailableElementTypeChange","initializeParametersValue","mapSelectedElementOptions","validateForm","getParameterComponentName","options","getParameterComponentType","Text","mapSelectedElementParametersValue","selectedElementMappedParameters","parameterKey","onParameterValueChange","$forceUpdate","sortElementOptions","addElementOption","deleteElementOption","onDeleteButtonClick","onUpdateButtonClick","elementParametersValue","onOptionValueChange","optionIndex","onOptionOrderChange","onParameterOptionSelect","hasErrors","valueError","orderError","TABS_IDENTIFIER","FormTemplateUpdateElementPanel","selectedTabIdentifier","AVAILABLE_ELEMENTS","MNavbarSkin","FORM_TEMPLATE_AVAILABLE_ELEMENT_GET_FORM_TEMPLATE_AVAILABLE_ELEMENTS","SELECTED_ELEMENT","MNavbar","MNavbarItem","FormTemplateManagement","isLoadingOverlayActive","insertTimedout","onRouteIdFormTemplateChange","loadFormTemplate","onFormTemplateInsertElementDrop","onFormTemplateMoveElementDrop","afterFormTemplateUpdate","internalFormTemplateElement","recalculateFormTemplatePositionRecursive","insertElementInFormTemplateRecursive","movedInternalFormTemplateElement","assign","moveElementInFormTemplateRecursive","elementToDelete","deleteFormTemplateElementRecursive","eventPayload","updateFormTemplateElementRecursive","moveStartingIndex","elementToDeleteIndex","newElementParameters","elementParameter","FormTemplateUpdate","isFormTemplateUpdateStateActive","isFormTemplateUpdateSuccessToastActive","isFormTemplateUpdateErrorToastActive","onFormTemplateChange","loadAvailableElements","updateFormTemplate","mapRequestErrors","onPreviewButtonClick","navigateToCategoriesList","onFormTemplateUpdateSuccessToastClose","onFormTemplateUpdateErrorToastClose","elementPositionIdentifiers","matchAll","match","internalIdentifierFromErrorIdentifiers","internalIdentifier","errorIdentifier","FormElements","FORM_ELEMENTS_REF","FormTemplatePreview","FORM_TEMPLATE_MANAGEMENT_FORM_TEMPLATE_UPDATE","formElementsComponent","getElementAnswers","ApplicationForm","isSubmitConfirmationDialogActive","isSubmitSuccessToastOpen","isSubmitErrorToastOpen","isValidationErrorToastOpen","isSaveSuccessToastOpen","isDownloadAllFormAnswerFilesLoadingStateActive","VALIDATION_KEY_PROVIDED_SUPPORT_UNDER_THRESHOLD","hasSubmitErrors","Confirmation","Warning","category_application_support_count_lower_bound","onRouteParamsIdChange","loadApplicationForm","onFormNextStepButtonClick","isBackgroundRefresh","isBackgroundSave","saveApplicationForm","submitApplicationForm","errorResponse","hideSubmitConfirmationDialog","mixin_applicationForm_downloadAllFormAnswerFiles","USER_FORM_REF","ApplicationFormForm","isCategoryLoadingStateActive","mappedCategories","categoryDropdown","categoriesMappedById","onSelectedCategoryChange","loadAvailableCategories","preselectCategory","isCategoryAvailable","candidateIdul","getCandidateIdul","hasApplicationFormSupportError","category_id","candidate_idul","userFormComponent","userFormPayload","ApplicationFormCreationDialog","applicationFormFormComponent","createApplicationForm","EmailStatusType","EmailStatusMixin","mixin_emailStatus_computeStatusColor","emailStatus","QUEUED","SENT","mixin_emailStatus_computeStatusIcon","mixin_emailStatus_computeStatusIconStyles","mixin_emailStatus_computeStatusLabel","EmailStatusRow","ApplicationFormReminderEmailOverlay","showSuccessMessage","onTriggerButtonClick","categoryMultiSelect","sendReminderEmails","mapSelectedCategoriesToIds","categoriesId","ids","reset","ApplicationFormDepositDeadlineExtensionOverlay_EVENTS","ApplicationFormDepositDeadlineExtensionOverlay","date","time","dateField","deposit_deadline_extension_timestamp","category_application_deposit_limit_timestamp","timeField","updateDepositDeadlineExtension","timestamp","ApplicationFormSupportRow","onShowApplicationFormSupportIconClick","ADMIN_APPLICATION_FORM_SUPPORT","ApplicationFormSupportService","service_applicationFormSupportService_fetchApplicationFormSupport","application_form_support","service_applicationFormSupportService_fetchAdminApplicationFormSupport","service_applicationFormSupportService_submitApplicationFormSupport","service_applicationFormSupportService_generateAnswersFormData","service_applicationFormSupportService_fetchAdminApplicationFormList","service_applicationFormSupportService_sendApplicationFormSupportReminderEmails","APPLICATION_FORM_SUPPORT_REMINDER_EMAIL_SENT","service_applicationFormSupportService_saveAdmin","service_applicationFormSupportService_fetchAvailableCategoriesSubmit","service_applicationFormSupportService_fetchAvailableCategoriesDeposit","ApplicationFormSupportSubmitReminderEmailOverlay","filteredCategories","ApplicationFormAuthorizedUsersOverlay_EVENTS","ApplicationFormAuthorizedUsersOverlay","authorizedUsers","authorized_users","updateAuthorizedUsersList","iduls","onRemoveAuthorizedUserIconClick","computeUserFullName","full_name_with_email","ApplicationFormExportOverlay","selectedStatus","statusMultiSelect","AdminApplicationForms","selectedApplicationFormStatus","selectedApplicationFormDepositDeadlineExtension","selectedApplicationFormToDelete","selectedApplicationFormAuthorizedUsers","isDeleteTooltipOpen","toggleButtons","pressed","onSelectedApplicationFormStatusChange","afterApplicationFormReminderEmailSent","afterApplicationFormSupportSubmitReminderEmailSent","resetApplicationFormToDelete","onToggleButtonClick","toggleButton","statusIndex","onShowApplicationFormIconClick","ADMIN_APPLICATION_FORM","onDisplayDepositDeadlineExtensionIconClick","afterDisplayDepositDeadlineExtensionOverlayClose","triggerDeleteConfirmationDialog","onDisplayAuthorizedUsersIconClick","afterAuthorizedUsersOverlayClose","MToggleButtons","AdminApplicationFormManagement","AdminApplicationForm","ApplicationFormSupport","onRouteParamsTokenChange","loadApplicationFormSupport","submitApplicationFormSupport","AdminApplicationFormSupport","onRouteParamdIdChange","ApplicationFormSupportReminderEmailOverlay","AdminApplicationFormSupports","selectedApplicationFormSupportStatus","onSelectedApplicationFormSupportStatusChange","AdminApplicationFormSupportManagement","ApplicationFormValidationStatus","ApplicationFormValidationMixin","mixin_applicationFormValidation_computeStatusColor","INVALID","VALID","mixin_applicationFormValidation_computeStatusIcon","mixin_applicationFormValidation_computeStatusIconStyles","mixin_applicationFormValidation_computeStatusLabel","ApplicationFormValidationService","service_applicationFormValidationService_fetchAdminApplicationFormValidationList","service_applicationFormValidationService_fetchApplicationForm","application_form_validation","service_applicationFormValidationService_save","service_applicationFormValidationService_generateAnswersFormData","service_applicationFormValidationService_updateStatus","AdminApplicationFormValidations","applicationFormValidations","selectedApplicationFormValidationStatus","onSelectedApplicationFormValidationStatusChange","application_form_validations","onShowApplicationFormValidationIconClick","applicationFormValidation","ADMIN_APPLICATION_FORM_VALIDATION_FORM","idApplicationFormValidation","AdminApplicationFormValidationManagement","APPLICATION_FORM_VALIDATION_FORM_ELEMENTS","AdminApplicationFormValidation","applicationFormValidationForm","applicationFormValidationInternalFormTemplate","applicationFormForm","applicationFormInternalFormTemplate","isUpdateApplicationFormValidationSuccessToastOpen","loadApplicationFormValidation","applicationFormValidationFormElementsComponent","saveApplicationFormValidation","onFlagApplicationFormValidationAsValidButtonClick","updateApplicationFormValidationStatus","onFlagApplicationFormValidationAsInvalidButtonClick","EvaluationCardDepositOverlay","allowedExtensions","onFileChange","evaluation_card","removeFile","EvaluatorApplicationFormAssignmentMixin","mixin_evaluatorApplicationFormAssignment_computeStatusColor","mixin_evaluatorApplicationFormAssignment_computeStatusIcon","mixin_evaluatorApplicationFormAssignment_computeStatusIconStyles","AdminEvaluatorCategoryAssignments","afterEvaluatorCategoryAssignmentCreation","afterEvaluatorCategoryAssignmentUpdate","onTriggerCreationButtonClick","EVALUATOR_MANAGEMENT_CREATION","onTriggerUpdateButtonClick","evaluatorCategoryAssignment","EVALUATOR_MANAGEMENT_UPDATE","idEvaluator","evaluator_id","onTriggerEvaluatorToolboxFileDepositButtonClick","EVALUATOR_MANAGEMENT_EVALUATOR_TOOLBOX_FILE_DEPOSIT","EvaluatorApplicationFormAssignmentPopoverRow","EvaluatorManagement","AdminEvaluatorCategoryAssignmentForm","onEvaluatorIdulChange","evaluatorIdul","setControl","category_title","preselectCategories","evaluator_idul","AdminEvaluatorCategoryAssignmentCreationOverlay","showCreationErrorMessage","formComponent","createEvaluatorCategoryAssignments","AdminEvaluatorCategoryAssignmentUpdateOverlay","showUpdateErrorMessage","evaluator_username","evaluator_full_name_with_username","onParametersChange","evaluatorId","updateEvaluatorCategoryAssignments","EvaluatorToolboxFileDepositOverlay","isFilesFetchLoadingStateActive","loadFiles","depositFiles","REF_EVALUATION_CARD_DOWNLOAD_LINK","EvaluatorApplicationFormAssignment","loadEvaluatorApplicationFormAssignmentApplicationForm","downloadEvaluationCard","evaluationCard","navigateToApplicationFormSupports","EVALUATOR_APPLICATION_FORM_SUPPORT_DISPLAY","mockForm","EvaluatorApplicationFormSupportAssignment","AdminYearConfiguration","hasLoadingError","YEAR_CONFIGURATION_MANAGEMENT_UPDATE","afterYearConfigurationUpdate","idYearConfiguration","YearConfigurationManagement","CategorySectionFormRow_EVENTS","CategorySectionFormRow","onCategorySectionChange","onCategoriesMappedByIdChange","categorySection","CLICK_DELETE","REF_CATEGORY_SECTION_FORM_ROW","CategorySectionForm","categorySections","availableCategories","category_sections","onAddNewSectionButtonClick","onCategorySectionFormRowDeleteEvent","assembledCategorySections","categorySectionFormRowComponent","categorySectionFormRowComponents","categorySectionFormRowComponentFormPayload","REF_PUBLIC_AREA_DESCRIPTION_ZONE","REF_PUBLIC_AREA_HELP_ZONE","REF_CATEGORY_SECTION_FORM","YearConfigurationForm","is_public_area_available","public_area_description_zone_title","public_area_help_zone_title","publicAreaDescriptionZoneModel","publicAreaHelpZoneModel","isPublicAreaAvailableCheckbox","public_area_description_zone_html","public_area_help_zone_html","publicAreaDescriptionZoneTitleField","publicAreaHelpZoneTitleField","categorySectionFormPayload","categorySectionFormComponent","publicAreaDescriptionZoneComponent","publicAreaHelpZoneComponent","public_area_description_zone","public_area_help_zone","YearConfigurationUpdateDialog","yearConfigurationFormRef","updateYearConfiguration","REF_CONTENT_PANEL","PublicFormTemplatePreview","isInformationToastActive","onIdCategoryChange","isAfter","addEventListener","onScroll","destroyed","removeEventListener","mainPanelComponent","messageDomRect","$el","top","onReturnHomeButtonClick","VueRouter","FORM_TEMPLATE_MANAGEMENT","APPLICATION_FORM_SUPPORT","WILDCARD","router","RouterLocalizationHelper","beforeEach","to","next","RouterMixin","isEventNewTab","routeHref","tab","open","focus","ctrlKey","metaKey","mixin_router_extractLocalizedRouteName","SessionMixin","SESSION_GET_ROLES","TimestampMixin","mixin_timestamp_pretty","mixin_timestamp_prettyDate","mixin_timestamp_prettyTime","momentTimestamp","format","hour","minute","StringMixin","trim","UtilitiesMixin","mixin_utilities_userTimedTrace","SVG_PREFIX","IconPlugin","install","v","svg","$svg","addExternalSprites","utilsPluginOptions","i18PluginOptions","curLang","propagateVueParserErrors","localizationPromise","Moment","Axios","baseURL","process","toUpperCase","productionTip","UtilsPlugin","FrenchPlugin","DefaultSpritesPlugin","RichTextLicensePlugin","FormPlugin","DialogServicePlugin","ToastServicePlugin","FILESIZE_NAME","FileSizeFilter","mixin","localizationPlugin","render","h","$mount"],"mappings":"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","file":"js/app.e8250c45.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-2d22fcf5\":\"935bc3f1\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref, Watch } from 'vue-property-decorator'\n\nimport WithRender from './FormTemplateUpdateDropZoneElement.html'\n\nimport FormTemplateUpdateInsertZone from './FormTemplateUpdateInsertZone'\n\nimport { IFormTemplateAvailableElementModel, IInternalFormTemplateElementModel } from '../FormTemplate.model'\n\nimport { DRAG_AND_DROP_EVENTS_IDENTIFIER, DRAG_AND_DROP_EVENTS_IDENTIFIER_KEY, EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\nimport { STORE_GETTERS } from '@/store'\n\nconst WRAPPER_REF: string = 'wrapper'\nconst LABEL_PARAMETER_KEYS: Array = [\n 'label',\n 'header',\n 'icon-title'\n]\n\n@WithRender\n@Component({\n components: {\n FormTemplateUpdateInsertZone,\n FormTemplateUpdateDropZoneElement: () => import('./FormTemplateUpdateDropZoneElement')\n }\n})\nexport default class FormTemplateUpdateDropZoneElement extends mixins() {\n private insertDraggedElement: IFormTemplateAvailableElementModel | null = null\n private moveDraggedElement: IInternalFormTemplateElementModel | null = null\n private isMouseOver: boolean = false\n private isSelectedElement: boolean = false\n private isInsertDraggedElementOver: boolean = false\n private isNewElement: boolean = false\n\n private readonly WRAPPER_REF: string = WRAPPER_REF\n private readonly LABEL_PARAMETER_KEYS: Array = LABEL_PARAMETER_KEYS\n\n @Prop({ required: true })\n private formTemplateElement!: IInternalFormTemplateElementModel\n\n @Prop({ required: true })\n private requestErrors!: { [key: string]: string }\n\n @Ref(WRAPPER_REF)\n private wrapperDivComponent!: HTMLElement\n\n private get labelClasses(): object {\n return {\n 'form-template-update__drop-zone-element-label--with-children': this.hasChildren,\n 'form-template-update__drop-zone-element-label--without-children': !this.hasChildren\n }\n }\n\n private get wrapperClasses(): object {\n return {\n 'form-template-update__drop-zone-element--hover': this.isMouseOver,\n 'form-template-update__drop-zone-element--selected': this.isSelectedElement,\n 'form-template-update__drop-zone-element--error': this.requestErrors[this.formTemplateElement.internal_identifier],\n 'form-template-update__drop-zone-element--new': this.isNewElement\n }\n }\n\n private get childrensWrapperClasses(): object {\n return {}\n }\n\n private get wrapperStyles(): object {\n const styles: { [key: string]: string } = {}\n\n return styles\n }\n\n private get sortedChildrens(): Array {\n return this.formTemplateElement.childrens.sort((leftHandSide: IInternalFormTemplateElementModel, rightHandSide: IInternalFormTemplateElementModel) => {\n return leftHandSide.element_position_index - rightHandSide.element_position_index\n })\n }\n\n private get hasChildren(): boolean {\n return !!this.formTemplateElement && this.formTemplateElement.childrens.length > 0\n }\n\n private get availableFormTemplateElements(): { [key: string]: IFormTemplateAvailableElementModel } {\n return this.$store.getters[STORE_GETTERS.FORM_TEMPLATE_AVAILABLE_ELEMENT_GET_FORM_TEMPLATE_AVAILABLE_ELEMENTS_BY_TYPE]\n }\n\n private get isDraggedElementInsertable(): boolean {\n const formTemplateElementType: IFormTemplateAvailableElementModel = this.availableFormTemplateElements[this.formTemplateElement.element_type]\n\n if (!this.insertDraggedElement || !formTemplateElementType) {\n return false\n }\n\n return formTemplateElementType.allowed_children_types.includes(this.insertDraggedElement.element_type)\n }\n\n private get labelParameter(): string | null {\n for (const parameter of this.formTemplateElement.element_parameters) {\n if (this.LABEL_PARAMETER_KEYS.includes(parameter.key)) {\n return parameter.value\n } \n }\n\n return null\n }\n\n @Watch('formTemplateElement.id')\n private onFormTemplateElementIdChange(value: string): void {\n if (value) {\n this.isNewElement = false\n }\n }\n\n private mounted(): void {\n this.isNewElement = !this.formTemplateElement.id\n\n this.onElementInsertDragStart()\n this.onElementInsertDragEnd()\n this.onElementInsertDragDrop()\n this.onSelectedElementChange()\n this.onFormTemplateElementDelete()\n this.onFormTemplateElementUpdate()\n this.onElementMoveDragStart()\n this.onElementMoveDragEnd()\n }\n\n private onSelectedElementChange(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_SELECTED, (eventSelectedElement: IInternalFormTemplateElementModel) => {\n if (eventSelectedElement) {\n this.isSelectedElement = eventSelectedElement.internal_identifier === this.formTemplateElement.internal_identifier\n } else {\n this.isSelectedElement = false\n }\n\n this.isNewElement = false\n })\n }\n\n private onFormTemplateElementUpdate(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_UPDATED, () => {\n this.isSelectedElement = false\n })\n }\n\n private onFormTemplateElementDelete(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_DELETED, () => {\n this.isSelectedElement = false\n })\n }\n\n private onElementClick(): void {\n EventBus.$emit(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_SELECTED, this.formTemplateElement)\n this.isSelectedElement = true\n }\n\n private onMouseOver(): void {\n this.isMouseOver = true \n }\n\n private onMouseLeave(): void {\n this.isMouseOver = false\n }\n\n private onMouseOut(): void {\n if (this.hasChildren) {\n this.isMouseOver = false\n }\n }\n\n private onDragOver(): void {\n this.isInsertDraggedElementOver = true\n }\n\n private onDragLeave(event: DragEvent): void {\n if (this.wrapperDivComponent) {\n const cardDomRect: DOMRect = this.wrapperDivComponent.getBoundingClientRect() as DOMRect\n\n const xLowerBound: number = cardDomRect.x\n const xUpperBound: number = cardDomRect.x + cardDomRect.width\n const yLowerBound: number = cardDomRect.y\n const yUpperBound: number = cardDomRect.y + cardDomRect.height\n \n if (\n event.x < xLowerBound ||\n event.x > xUpperBound ||\n event.y < yLowerBound ||\n event.y > yUpperBound\n ) {\n this.isInsertDraggedElementOver = false\n }\n } else {\n this.isInsertDraggedElementOver = false\n }\n }\n\n private onElementInsertDragStart(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_INSERT_DRAG_STARTED, (element: IFormTemplateAvailableElementModel) => {\n this.insertDraggedElement = element || null\n this.isSelectedElement = false\n })\n }\n\n private onElementInsertDragEnd(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_INSERT_DRAG_ENDED, () => {\n this.insertDraggedElement = null\n })\n }\n\n private onElementInsertDragDrop(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_INSERT_DRAG_DROPPED, () => {\n this.isNewElement = false\n this.insertDraggedElement = null\n })\n }\n\n private onElementMoveDragStart(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_MOVE_DRAG_STARTED, (element: IInternalFormTemplateElementModel) => {\n if (element.parent_internal_identifier === this.formTemplateElement.internal_identifier) {\n this.moveDraggedElement = element || null\n } else {\n this.moveDraggedElement = null\n }\n \n this.isSelectedElement = false\n })\n }\n\n private onElementMoveDragEnd(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_MOVE_DRAG_ENDED, () => {\n this.moveDraggedElement = null\n this.isNewElement = false\n })\n }\n\n private triggerElementMoveDragStart(event: DragEvent): void {\n if (event && event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.dropEffect = 'move'\n\n event.dataTransfer.setData(DRAG_AND_DROP_EVENTS_IDENTIFIER_KEY, DRAG_AND_DROP_EVENTS_IDENTIFIER.FORM_TEMPLATE_ELEMENT_MOVE)\n event.dataTransfer.setData('text/plain', JSON.stringify(this.formTemplateElement))\n\n setTimeout(() => {\n EventBus.$emit(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_MOVE_DRAG_STARTED, this.formTemplateElement)\n }, 100)\n }\n }\n\n private triggerElementMoveDragEnd(): void {\n EventBus.$emit(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_MOVE_DRAG_ENDED)\n }\n\n private isDraggedElementMovable(index: number): boolean {\n if (!this.moveDraggedElement) {\n return false\n }\n\n if (this.moveDraggedElement.element_position_index === index) {\n return false\n }\n\n return this.moveDraggedElement.element_position_index !== index &&\n this.moveDraggedElement.element_position_index !== --index\n }\n}","import { ICategoryModel } from \"../category-management/Category.model\";\nimport { IBaseModel } from \"../global/utilities/Base.model\";\n\nexport interface IFormTemplateElementParameterModel extends IBaseModel {\n key: string;\n value: string;\n frontend_key: string;\n frontend_type: FormTemplateElementParameterType;\n}\n\nexport interface IFormTemplateElementOptionModel extends IBaseModel {\n value: string;\n order: string;\n}\n\nexport interface IFormTemplateElementModel extends IBaseModel {\n element_type: string;\n element_position_index: number;\n component_name: string;\n option_component_name: string;\n childrens: Array;\n element_parameters: Array;\n element_options: Array;\n}\n\nexport interface IFormTemplateModel extends IBaseModel {\n type: string;\n is_updateable: boolean;\n category?: ICategoryModel;\n elements?: Array;\n}\n\nexport interface IFormTemplateAvailableElementModelParameter {\n key: string;\n type: string;\n options: Array;\n}\n\nexport interface IFormTemplateAvailableElementModel {\n element_type: string;\n element_section: string;\n element_parameters: Array;\n allow_options: boolean;\n allow_childrens: boolean;\n allow_as_root_element: boolean;\n allowed_children_types: Array;\n}\n\nexport interface IInternalFormTemplateElementParameterModel {\n id?: string;\n key: string;\n value: string;\n frontend_key?: string;\n frontend_type?: FormTemplateElementParameterType;\n}\n\nexport interface IInternalFormTemplateElementOptionModel {\n id?: string;\n value: string;\n order: number;\n}\n\nexport interface IInternalFormTemplateElementModel {\n id?: string;\n internal_identifier: string;\n parent_internal_identifier?: string;\n element_type: string;\n element_position_index: number;\n component_name?: string;\n option_component_name?: string;\n childrens: Array;\n element_parameters: Array;\n element_options: Array;\n}\n\nexport interface IInternalFormTemplateModel {\n id: string;\n type: string;\n is_updateable: boolean;\n category: ICategoryModel;\n elements: Array;\n}\n\nexport enum FormTemplateElementParameterType {\n PROP = 'PROP',\n SLOT = 'SLOT',\n STYLE = 'STYLE',\n CONTENT = 'CONTENT',\n INTERNAL_LOGIC = 'INTERNAL_LOGIC',\n DEFAULT_VALUE = 'DEFAULT_VALUE',\n CSS_CLASS = 'CSS_CLASS',\n CSS_STYLE = 'CSS_STYLE'\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport { FormTemplateElementParameterType, IInternalFormTemplateElementModel, IInternalFormTemplateElementOptionModel, IInternalFormTemplateElementParameterModel } from '@/modules/form-template-management/FormTemplate.model'\nimport { IFormAnswerModel } from '../Form.model'\nimport { IFormAnswerForm } from '../Form.service'\n\n@Component\nexport default class FormElementMixin extends mixins() {\n protected elementValue: any = null\n protected errorMessage: string | null = null\n\n @Prop({ required: true })\n protected internalElement!: IInternalFormTemplateElementModel\n\n @Prop({ \n required: false,\n default: () => []\n })\n protected answers!: Array\n\n @Prop({ \n required: false, \n default: undefined\n })\n protected rowPositionIndex!: number | undefined\n\n @Prop({ \n required: false,\n default: false\n })\n protected readonly!: boolean\n\n @Prop({\n required: false,\n default: false\n })\n protected displayDuplicateAnswers!: boolean\n\n @Prop({\n required: false,\n default: undefined\n })\n protected duplicateAnswerIndex!: number | undefined\n\n @Prop({\n required: false,\n default: false\n })\n protected hideSensitiveInformations!: boolean\n\n @Prop({\n required: false,\n default: false\n })\n protected displayEvaluatorAdditionnalInformations!: boolean\n\n protected get formElementAnswer(): IFormAnswerModel | null {\n if (this.hideSensitiveInformations && this.isElementSensitiveInformation) {\n return null\n } \n \n for (const answer of this.answers) {\n if (answer.id_form_template_element === this.internalElement.id) {\n if (this.rowPositionIndex == undefined || answer.element_position_index === this.rowPositionIndex) {\n return answer\n }\n }\n }\n\n return null\n }\n\n protected get formElementAnswers(): Array {\n const formAnswers: Array = []\n\n if (this.hideSensitiveInformations && this.isElementSensitiveInformation) {\n return formAnswers\n } \n\n for (const answer of this.answers) {\n if (answer.id_form_template_element === this.internalElement.id) {\n if (this.rowPositionIndex == undefined || answer.element_position_index === this.rowPositionIndex) {\n formAnswers.push(answer)\n }\n }\n }\n\n return formAnswers\n }\n\n protected get elementInternalLogicParameters(): { [key: string]: any } {\n return this.internalElement.element_parameters.reduce((props: { [key: string]: any }, parameter: IInternalFormTemplateElementParameterModel) => {\n if (parameter.frontend_type === FormTemplateElementParameterType.INTERNAL_LOGIC) {\n try {\n props[parameter.frontend_key || parameter.key] = JSON.parse(parameter.value)\n } catch (exception) {\n props[parameter.frontend_key || parameter.key] = parameter.value\n }\n }\n \n return props\n }, {})\n }\n\n protected get elementDefaultValue(): any | null {\n if (this.hideSensitiveInformations && this.isElementSensitiveInformation) {\n return null\n } \n \n for (const parameter of this.internalElement.element_parameters) {\n if (parameter.frontend_type === FormTemplateElementParameterType.DEFAULT_VALUE) {\n try {\n return JSON.parse(parameter.value)\n } catch (exception) {\n return parameter.value\n } \n }\n }\n\n return null\n }\n\n protected get elementAdditionnalClasses(): string | null {\n for (const parameter of this.internalElement.element_parameters) {\n if (parameter.frontend_type === FormTemplateElementParameterType.CSS_CLASS) {\n return parameter.value\n }\n }\n\n return null\n }\n\n protected get elementAdditionnalStyles(): string | null {\n for (const parameter of this.internalElement.element_parameters) {\n if (parameter.frontend_type === FormTemplateElementParameterType.CSS_STYLE) {\n return parameter.value\n }\n }\n\n return null\n }\n\n protected get elementContent(): any | null {\n for (const parameter of this.internalElement.element_parameters) {\n if (parameter.frontend_type === FormTemplateElementParameterType.CONTENT) {\n try {\n return JSON.parse(parameter.value)\n } catch (exception) {\n return parameter.value\n } \n }\n }\n\n return null\n }\n\n protected get componentHasOptions(): boolean {\n return this.internalElement.element_options.length > 0\n }\n\n protected get assembledElementProps(): { [key: string]: any } {\n const assembledPropsList: { [key: string]: any } = this.internalElement.element_parameters.reduce((props: { [key: string]: any }, parameter: IInternalFormTemplateElementParameterModel) => {\n if (parameter.frontend_type === FormTemplateElementParameterType.PROP) {\n try {\n props[parameter.frontend_key || parameter.key] = JSON.parse(parameter.value)\n } catch (exception) {\n props[parameter.frontend_key || parameter.key] = parameter.value\n }\n }\n \n return props\n }, {})\n\n if (this.readonly) {\n assembledPropsList['disabled'] = true\n }\n\n return assembledPropsList\n }\n\n protected get elementSlots(): Array {\n return this.internalElement.element_parameters.reduce((slots: Array, parameter: IInternalFormTemplateElementParameterModel) => {\n if (parameter.frontend_type === FormTemplateElementParameterType.SLOT) {\n slots.push(parameter)\n }\n \n return slots\n }, [])\n }\n\n protected get elementClasses(): { [key: string]: boolean } {\n const classes: { [key: string]: boolean } = {}\n\n if (this.elementAdditionnalClasses) {\n classes[this.elementAdditionnalClasses] = true\n }\n\n return classes\n }\n\n protected get elementStyles(): { [key: string]: string } {\n const styles: { [key: string]: string } = this.internalElement.element_parameters.reduce((styles: { [key: string]: any }, parameter: IInternalFormTemplateElementParameterModel) => {\n if (parameter.frontend_type === FormTemplateElementParameterType.STYLE) {\n styles[parameter.frontend_key || parameter.key] = parameter.value\n }\n \n return styles\n }, {})\n\n if (this.elementAdditionnalStyles) {\n const differentStyles: Array = this.elementAdditionnalStyles.split(';')\n\n differentStyles.forEach((differentStyle: string) => {\n const stylePair: Array = differentStyle.split(':')\n\n styles[stylePair[0]] = stylePair[1]\n })\n }\n if (!this.displayEvaluatorAdditionnalInformations && this.elementInternalLogicParameters['evaluator-additionnal-informations']) {\n styles['display'] = 'none'\n }\n\n return styles\n }\n\n private get isElementSensitiveInformation(): boolean {\n return this.elementInternalLogicParameters['sensitive-information'] || false\n }\n\n private get sortedElementOptions(): Array | null {\n if (!this.componentHasOptions || !this.internalElement.element_options) {\n return null\n }\n \n return Array.from(this.internalElement.element_options)\n .sort((lhs: IInternalFormTemplateElementOptionModel, rhs: IInternalFormTemplateElementOptionModel) => {\n return lhs.order - rhs.order\n })\n }\n\n @Watch('formElementAnswer', { immediate: true })\n @Watch('duplicateAnswerIndex')\n protected onFormElementAnswerChange(): void {\n if (this.displayDuplicateAnswers && this.duplicateAnswerIndex != undefined && this.formElementAnswers.length > 0) {\n this.elementValue = this.formElementAnswers[this.duplicateAnswerIndex].value\n } else if (this.formElementAnswer) {\n this.elementValue = this.formElementAnswer.value\n }\n }\n\n protected onValueChange(value: any): void {\n if (\n Array.isArray(value) ||\n (\n typeof value !== 'object' && \n value !== null\n )\n ) {\n this.elementValue = value\n }\n }\n\n public async getElementAnswersRecursive(validateAnswers: boolean = true): Promise | null> {\n let answers: Array = []\n let childrenHasError: boolean = false\n \n if (this.elementValue) {\n answers.push({\n element_position_index: this.rowPositionIndex != undefined ? this.rowPositionIndex : undefined,\n value: this.elementValue,\n id_form_template_element: this.internalElement.id as any,\n id_form_answer: this.formElementAnswer ? this.formElementAnswer.id : undefined\n })\n }\n\n if (this.$children) {\n for (const component of this.$children) {\n if (Object.prototype.hasOwnProperty.call(component, \"getElementAnswersRecursive\")) {\n const componentAnswers: Array | null = await (component as FormElementMixin).getElementAnswersRecursive(validateAnswers)\n\n if (componentAnswers) {\n answers = [\n ...answers,\n ...componentAnswers\n ]\n } else {\n childrenHasError = true\n }\n }\n }\n }\n \n if (!validateAnswers) {\n if (this.isValid()) {\n this.errorMessage = null\n }\n\n return answers\n }\n \n return childrenHasError || !this.validate() ? null : answers\n }\n\n protected formElementAnswerCount(formElement: IInternalFormTemplateElementModel): number {\n let count: number = 0\n\n for (const answer of this.answers) {\n if (answer.id_form_template_element === formElement.id) {\n count += 1\n }\n }\n\n return count\n }\n\n protected validate(): boolean {\n this.errorMessage = null\n const componentTag: string | null = (this.$options as any)['_componentTag']\n const elementComponentTag: string | undefined = this.internalElement.component_name\n\n if (\n componentTag &&\n elementComponentTag &&\n componentTag === elementComponentTag\n ) {\n if (this.assembledElementProps['requiredMarker'] && !this.elementValue) {\n this.errorMessage = this.$i18next.t('modules.form-management.form-element.FormElement.validation.required')\n } else if (\n this.assembledElementProps['maxLength'] &&\n this.elementValue &&\n this.elementValue.length > this.assembledElementProps['maxLength']\n ) {\n this.errorMessage = this.$i18next.t('modules.form-management.form-element.FormElement.validation.max-length')\n }\n }\n \n return this.mixin_string_isEmpty(this.errorMessage)\n }\n\n protected isValid(): boolean {\n const componentTag: string | null = (this.$options as any)['_componentTag']\n const elementComponentTag: string | undefined = this.internalElement.component_name\n\n if (\n componentTag &&\n elementComponentTag &&\n componentTag === elementComponentTag\n ) {\n if (this.assembledElementProps['requiredMarker'] && !this.elementValue) {\n return false\n } else if (\n this.assembledElementProps['maxLength'] &&\n this.elementValue &&\n this.elementValue.length > this.assembledElementProps['maxLength']\n ) {\n return false\n }\n }\n \n return true\n }\n}","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './StepWizard.html'\n\nimport { \n MButton,\n MButtonSkin,\n MSteppers\n} from '@ulaval/modul-components'\n\nimport FormElementMixin from '@/modules/form-management/form-element/FormElement.mixin'\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\nimport { IInternalFormTemplateElementModel } from '@/modules/form-template-management/FormTemplate.model'\n\nexport const STEP_WIZARD_STEP_SELECTED: string = 'step-wizard-step:selected'\n\n@WithRender\n@Component({\n components: {\n FormElement: () => import('@/modules/form-management/form-element/FormElement'),\n MButton,\n MSteppers\n }\n})\nexport default class StepWizard extends mixins(FormElementMixin) {\n private selectedStepWizardIdentifier: string | null = null\n\n private readonly MButtonSkin: object = MButtonSkin\n\n private created(): void {\n this.onStepWizardStepSelected()\n }\n\n private onStepWizardStepSelected(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_ELEMENT_STEP_WIZARD_STEP_SELECTED, (elementId: string) => {\n this.selectedStepWizardIdentifier = elementId || null\n })\n }\n\n private onPreviousStepButtonClick(currentElementIndex: number): void {\n const previousElement: IInternalFormTemplateElementModel = this.internalElement.childrens[currentElementIndex - 1]\n\n EventBus.$emit(EVENT_BUS_EVENTS.FORM_ELEMENT_STEP_WIZARD_STEP_SELECTED, previousElement.id)\n }\n\n private onNextStepButtonClick(currentElementIndex: number): void {\n const nextElement: IInternalFormTemplateElementModel = this.internalElement.childrens[currentElementIndex + 1]\n\n EventBus.$emit(EVENT_BUS_EVENTS.FORM_ELEMENT_STEP_WIZARD_STEP_SELECTED, nextElement.id)\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './StepWizardStep.html'\n\nimport { \n MSteppersItem, \n MSteppersItemState \n} from '@ulaval/modul-components'\n\nimport FormElementMixin from '@/modules/form-management/form-element/FormElement.mixin'\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\n\nconst EVENT_DISPATCH_THRESHOLD: number = 3\n\n@WithRender\n@Component({\n components: {\n MSteppersItem\n }\n})\nexport default class StepWizardStep extends mixins(FormElementMixin) {\n private stepWizardStepState: MSteppersItemState = MSteppersItemState.Visited\n\n private readonly MSteppersItemState: object = MSteppersItemState\n\n private created(): void {\n this.onStepWizardStepSelected()\n\n if (this.internalElement.element_position_index === 0) {\n this.onItemClick()\n }\n }\n\n private onItemClick(): void {\n EventBus.$emit(EVENT_BUS_EVENTS.FORM_ELEMENT_STEP_WIZARD_STEP_SELECTED, this.internalElement.id)\n }\n\n private onStepWizardStepSelected(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_ELEMENT_STEP_WIZARD_STEP_SELECTED, (elementId: string) => {\n if (this.internalElement.id === elementId) {\n this.stepWizardStepState = MSteppersItemState.InProgress\n } else {\n this.stepWizardStepState = MSteppersItemState.Visited\n }\n\n this.resizeWindow()\n })\n }\n\n private resizeWindow(): void {\n let eventDispatchCount: number = 0\n const resizeInterval: NodeJS.Timeout = setInterval(() => {\n window.dispatchEvent(new Event('resize'))\n eventDispatchCount++\n\n if (eventDispatchCount >= EVENT_DISPATCH_THRESHOLD) {\n clearInterval(resizeInterval)\n }\n }, 500)\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './FileUpload.html'\n\nimport { \n MButton,\n MFileUpload,\n MIcon,\n MValidationMessage\n} from '@ulaval/modul-components'\nimport { MFile } from '@ulaval/modul-components/dist/utils/file/file'\n\nimport UploadedFileRow from '@/modules/global/file/UploadedFileRow'\n\nimport FormElementMixin from '@/modules/form-management/form-element/FormElement.mixin'\nimport { IFileUploadModel } from '../../../global/file/File.model'\nimport { Watch } from 'vue-property-decorator'\nimport { GLOBAL_EVENTS } from '../../../global/utilities/Events'\nimport { IFormAnswerForm } from '@/modules/form-management/Form.service'\nimport { IFormAnswerFileModel, IFormAnswerModel } from '@/modules/form-management/Form.model'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MFileUpload,\n MIcon,\n MValidationMessage,\n UploadedFileRow\n }\n})\nexport default class FileUpload extends mixins(FormElementMixin) {\n private files: Array> = []\n\n private get computedAllowedExtensions(): Array {\n if (!this.assembledElementProps['allowed-extensions']) {\n return []\n }\n\n return this.assembledElementProps['allowed-extensions'].split(',')\n }\n\n private get computedMinFileCount(): number {\n return this.elementInternalLogicParameters['minimum-file-count'] || 0\n }\n\n private get computedMaxFileCount(): number | null {\n return this.assembledElementProps['maxFiles'] || null\n }\n\n @Watch('formElementAnswer', { immediate: true })\n protected onFormElementAnswerChangeEvent(formAnswer: IFormAnswerModel): void {\n if (formAnswer && formAnswer.form_answer_files) {\n this.files = formAnswer.form_answer_files.map((formAnswerFile: IFormAnswerFileModel) => {\n return {\n server_file: formAnswerFile\n }\n })\n }\n }\n\n @Watch('attachments')\n private onAttachmentsChange(): void {\n this.$emit(GLOBAL_EVENTS.MODEL_CHANGE, this.files)\n }\n\n @Watch('files', { immediate: true })\n private onFilesChange(): void {\n if (!this.mixin_string_isEmpty(this.errorMessage)) {\n this.validate()\n }\n }\n\n private onFilesReady(files: Array): void {\n this.$file.uploadTemp(files)\n }\n\n private onFilesUploadCompleted(files: Array): void {\n files.forEach((file: MFile) => {\n this.$set(this.files, this.files.length, { file })\n })\n }\n\n private removeAttachment(index: number): void {\n this.$delete(this.files, index)\n }\n\n public async getElementAnswersRecursive(validateAnswers: boolean = true): Promise | null> {\n const answer: IFormAnswerForm = {\n element_position_index: this.rowPositionIndex == null ? undefined : this.rowPositionIndex,\n value: undefined,\n id_form_template_element: this.internalElement.id as any,\n id_form_answer: this.formElementAnswer ? this.formElementAnswer.id : undefined,\n files: []\n }\n\n this.files.forEach((file: IFileUploadModel) => {\n if (answer.files) {\n answer.files.push(file)\n }\n }) \n\n if (!validateAnswers) {\n return [\n answer\n ]\n }\n \n return this.validate() ? [ answer ] : null\n }\n\n protected validate(): boolean {\n this.errorMessage = null\n \n if (this.computedMinFileCount === 1 && this.files.length === 0) {\n this.errorMessage = this.$i18next.t('modules.form-management.form-custom-element.file-upload.FileUpload.validation.required')\n } else if (this.files.length < this.computedMinFileCount) {\n this.errorMessage = this.$i18next.t(\n 'modules.form-management.form-custom-element.file-upload.FileUpload.validation.min_count', \n { count: this.computedMinFileCount }\n )\n } else if (this.computedMaxFileCount && this.files.length > this.computedMaxFileCount) {\n if (this.computedMaxFileCount > 1) {\n this.errorMessage = this.$i18next.t(\n 'modules.form-management.form-custom-element.file-upload.FileUpload.validation.max_count.plural', \n { count: this.computedMaxFileCount }\n )\n } else {\n this.errorMessage = this.$i18next.t(\n 'modules.form-management.form-custom-element.file-upload.FileUpload.validation.max_count.singular', \n { count: this.computedMaxFileCount }\n )\n }\n }\n\n return this.mixin_string_isEmpty(this.errorMessage)\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './MultiAnswerRow.html'\n\nimport { \n MIconButton,\n MIconButtonSkin\n} from '@ulaval/modul-components'\n\nimport FormElementMixin from '@/modules/form-management/form-element/FormElement.mixin'\nimport { IInternalFormTemplateElementModel } from '@/modules/form-template-management/FormTemplate.model'\n\n@WithRender\n@Component({\n components: {\n FormElement: () => import('@/modules/form-management/form-element/FormElement'),\n MIconButton\n }\n})\nexport default class MultiAnswerRow extends mixins(FormElementMixin) {\n private multipleElementRows: Array = []\n\n private readonly MIconButtonSkin: object = MIconButtonSkin\n\n private get multiElementRowMinimumCount(): number | null {\n try {\n return Number.parseInt(this.elementInternalLogicParameters['minimum-answer-count'])\n } catch (exception) {\n return null\n }\n }\n\n private get multiElementRowMaximumCount(): number | null {\n try {\n return Number.parseInt(this.elementInternalLogicParameters['maximum-answer-count'])\n } catch (exception) {\n return null\n }\n }\n\n private get isMultiElementRow(): boolean {\n return this.elementInternalLogicParameters['multi-row-answer'] || false\n }\n\n private get hasDeleteIconInList(): boolean {\n if (!this.isMultiElementRow || this.readonly) {\n return false\n } else if (this.multiElementRowMinimumCount) {\n return this.multipleElementRows.length > this.multiElementRowMinimumCount\n }\n \n return this.multipleElementRows.length > 1\n }\n\n private get hasAddIconInList(): boolean {\n if (!this.isMultiElementRow || this.readonly) {\n return false\n } else if (this.multiElementRowMaximumCount) {\n return this.multipleElementRows.length < this.multiElementRowMaximumCount\n }\n \n return true\n }\n\n private get maximumAnswerRowCount(): number | null {\n if (!this.answers || this.answers.length === 0) {\n return null\n }\n\n return Math.max(...Object.values(this.mappedElementChildrensRecrusive(this.internalElement))) || null\n }\n\n private mounted(): void {\n this.intitializeMultiElementRows()\n }\n\n private intitializeMultiElementRows(): void {\n this.multipleElementRows = []\n\n if (this.isMultiElementRow && (this.multiElementRowMinimumCount || this.maximumAnswerRowCount)) {\n let loopUpperBound: number = 0\n\n if (this.maximumAnswerRowCount && this.multiElementRowMinimumCount) {\n if (this.maximumAnswerRowCount < this.multiElementRowMinimumCount) {\n loopUpperBound = this.multiElementRowMinimumCount\n } else {\n loopUpperBound = this.maximumAnswerRowCount\n }\n } else if (this.maximumAnswerRowCount) {\n loopUpperBound = this.maximumAnswerRowCount\n } else if (this.multiElementRowMinimumCount) {\n loopUpperBound = this.multiElementRowMinimumCount\n }\n\n for (let i: number = 0; i < loopUpperBound; i++) {\n this.multipleElementRows.push(this.internalElement)\n }\n } else {\n this.multipleElementRows.push(this.internalElement)\n }\n }\n\n\n\n private isMultiElementRowIndexLast(index: number): boolean {\n if (!this.multiElementRowMaximumCount) {\n if (\n this.isMultiElementRow && \n index === (this.multipleElementRows.length - 1)\n ) {\n return true\n }\n\n return false\n }\n\n return index < (this.multiElementRowMaximumCount - 1) && index === (this.multipleElementRows.length - 1)\n }\n\n private addMultiElementRowElement(): void {\n this.$set(this.multipleElementRows, this.multipleElementRows.length, this.internalElement)\n }\n\n private isIndexOverMinimumCount(index: number): boolean {\n if (this.multiElementRowMinimumCount) {\n return index > 0 && index >= this.multiElementRowMinimumCount\n }\n \n return index > 0\n } \n\n private removeMultiElementRowElement(index: number): void {\n this.$delete(this.multipleElementRows, index)\n }\n\n private mappedElementChildrensRecrusive(parentElement: IInternalFormTemplateElementModel): { [key: string]: number } {\n let childrens: { [key: string]: number } = {}\n\n parentElement.childrens.forEach((children: IInternalFormTemplateElementModel) => {\n if (children.id) {\n childrens = {\n ...childrens,\n [children.id]: this.formElementAnswerCount(children)\n }\n }\n\n childrens = {\n ...childrens,\n ...this.mappedElementChildrensRecrusive(children)\n }\n })\n\n return childrens\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './RadioGroup.html'\n\nimport { \n MRadio,\n MRadioGroup\n} from '@ulaval/modul-components'\n\nimport FormElementMixin from '../../form-element/FormElement.mixin'\nimport { IFormAnswerModel } from '../../Form.model'\n\n@WithRender\n@Component({\n components: {\n MRadio,\n MRadioGroup,\n }\n})\nexport default class RadioGroup extends mixins(FormElementMixin) {\n private get answersCountByValue(): { [key: string]: number } {\n return this.formElementAnswers.reduce((acc: { [key: string]: number }, element: IFormAnswerModel) => {\n if (!acc[element.value]) {\n acc[element.value] = 1\n } else {\n acc[element.value]++\n }\n\n return acc\n }, {})\n }\n\n private optionAnswerCount(option: IFormAnswerModel): number | null {\n return this.answersCountByValue[option.value] || null\n }\n}","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './TextField.html'\n\nimport { \n MTextfield\n} from '@ulaval/modul-components'\n\nimport FormElementMixin from '../../form-element/FormElement.mixin'\n\n@WithRender\n@Component({\n components: {\n MTextfield\n }\n})\nexport default class TextField extends mixins(FormElementMixin) {\n\n}","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './TextArea.html'\n\nimport { \n MTextarea\n} from '@ulaval/modul-components'\n\nimport FormElementMixin from '../../form-element/FormElement.mixin'\n\n@WithRender\n@Component({\n components: {\n MTextarea\n }\n})\nexport default class TextArea extends mixins(FormElementMixin) {\n\n}","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './EmbeddedVideoPlayer.html'\n\nimport { \n MLink,\n MTextfield\n} from '@ulaval/modul-components'\n\nimport FormElementMixin from '../../form-element/FormElement.mixin'\n\n@WithRender\n@Component({\n components: {\n MLink,\n MTextfield\n }\n})\nexport default class EmbeddedVideoPlayer extends mixins(FormElementMixin) {\n\n private formatEmbeddedUrl(url: string): string | null {\n if (!url) {\n return null\n }\n\n if (url.includes('youtube')) {\n return this.formatYoutubeUrl(url)\n }\n\n return null;\n }\n\n private formatYoutubeUrl(url: string): string {\n const videoId: string = url.split(\"?v=\")[1]\n\n if (!videoId) {\n return url\n }\n\n return `https://www.youtube.com/embed/${videoId}`\n }\n\n}","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './FormElement.html'\n\nimport { \n MAccordion,\n MAccordionGroup,\n MButton,\n MCheckbox,\n MDatepicker,\n MDropdown,\n MDropdownItem,\n MFileUpload,\n MIconButton,\n MIconButtonSkin,\n MMessage,\n MRadio,\n MSteppers,\n MSteppersItem,\n MSwitch,\n MTimepicker\n} from '@ulaval/modul-components'\n\nimport StepWizard from '../form-custom-element/step-wizard-step/StepWizard'\nimport StepWizardStep from '../form-custom-element/step-wizard-step/StepWizardStep'\nimport FileUpload from '@/modules/form-management/form-custom-element/file-upload/FileUpload'\nimport MultiAnswerRow from '../form-custom-element/multi-answer-row/MultiAnswerRow'\nimport FormElementMixin from './FormElement.mixin'\nimport RadioGroup from '../form-custom-element/radio-group/RadioGroup'\nimport TextField from '../form-custom-element/text-field/TextField'\nimport TextArea from '../form-custom-element/text-area/TextArea'\nimport EmbeddedVideoPlayer from '../form-custom-element/embedded-video-player/EmbeddedVideoPlayer'\n\n@WithRender\n@Component({\n components: {\n EmbeddedVideoPlayer,\n FileUpload,\n FormElement: () => import('./FormElement'),\n MAccordion,\n MAccordionGroup,\n MButton,\n MCheckbox,\n MDatepicker,\n MDropdown,\n MDropdownItem,\n MFileUpload,\n MIconButton,\n MMessage,\n MRadio,\n MSteppers,\n MSteppersItem,\n MSwitch,\n MTimepicker,\n MultiAnswerRow,\n RadioGroup,\n StepWizard,\n StepWizardStep,\n TextArea,\n TextField\n }\n})\nexport default class FormElement extends mixins(FormElementMixin) {\n private readonly MIconButtonSkin: object = MIconButtonSkin\n}","\n \n \n

\n

    \n
  • \n \n {{ $i18next.t('modules.category-management.category.PublicCategoryCard.label.application_form_deposit_limit_timestamp') }}\n \n {{ mixin_timestamp_pretty(category.application_deposit_limit_timestamp) }}\n
  • \n \n \n
\n
","import { Action, Module, Mutation, VuexModule } from 'vuex-module-decorators'\nimport { IYearModel } from './Year.model'\n\nexport enum STORE_ACTIONS {\n YEAR_STORE_STORE_YEARS = 'year/storeYears',\n YEAR_STORE_STORE_CURRENT_YEAR = 'year/storeCurrentYear'\n}\n\nexport enum STORE_GETTERS {\n YEAR_GET_YEARS = 'year/years',\n YEAR_GET_CURRENT_YEAR = 'year/currentYear',\n YEAR_GET_YEARS_BY_SLUG = 'year/yearsBySlug'\n}\n\n@Module({ namespaced: true })\nexport default class YearStore extends VuexModule {\n private _years: Array = []\n private _currentYear: IYearModel | null = null\n\n @Mutation\n private storeYearsMutation(years: Array): void {\n this._years = years\n }\n\n @Mutation\n private storeCurrentYearMutation(year: IYearModel): void {\n this._currentYear = year\n }\n\n @Action\n public storeYears(years: Array): void {\n this.context.commit('storeYearsMutation', years)\n }\n\n @Action\n public storeCurrentYear(year: IYearModel): void {\n this.context.commit('storeCurrentYearMutation', year)\n }\n\n private get years(): Array {\n return this._years\n }\n\n private get currentYear(): IYearModel | null {\n return this._currentYear\n }\n\n private get yearsBySlug(): { [key: string]: IYearModel } {\n const mappedYears: { [key: string]: IYearModel } = {}\n\n this._years.forEach((year: IYearModel) => {\n mappedYears[year.slug] = year\n })\n\n return mappedYears\n }\n}\n","import { Action, Module, Mutation, VuexModule } from 'vuex-module-decorators'\n\nimport { IFormTemplateAvailableElementModel } from './FormTemplate.model'\n\nexport enum STORE_ACTIONS {\n FORM_TEMPLATE_AVAILABLE_ELEMENT_STORE_STORE_FORM_TEMPLATE_AVAILABLE_ELEMENTS = 'formTemplateAvailableElement/storeFormTemplateAvailableElements',\n}\n\nexport enum STORE_GETTERS {\n FORM_TEMPLATE_AVAILABLE_ELEMENT_GET_FORM_TEMPLATE_AVAILABLE_ELEMENTS = 'formTemplateAvailableElement/formTemplateAvailableElements',\n FORM_TEMPLATE_AVAILABLE_ELEMENT_GET_FORM_TEMPLATE_AVAILABLE_ELEMENTS_BY_TYPE = 'formTemplateAvailableElement/formTemplateAvailableElementsByType'\n}\n\n@Module({ namespaced: true })\nexport default class FormTemplateAvailableElementStore extends VuexModule {\n private _formTemplateAvailableElements: Array = []\n\n @Mutation\n private storeFormTemplateAvailableElementsMutation(formTemplateAvailableElements: Array): void {\n this._formTemplateAvailableElements = formTemplateAvailableElements\n }\n\n @Action\n public storeFormTemplateAvailableElements(formTemplateAvailableElements: Array): void {\n this.context.commit('storeFormTemplateAvailableElementsMutation', formTemplateAvailableElements)\n }\n\n private get formTemplateAvailableElements(): Array {\n return this._formTemplateAvailableElements\n }\n\n private get formTemplateAvailableElementsByType(): { [key: string]: IFormTemplateAvailableElementModel } {\n const mappedFormTemplateAvailableElements: { [key: string]: IFormTemplateAvailableElementModel } = {}\n\n this._formTemplateAvailableElements.forEach((formTemplateAvailableElement: IFormTemplateAvailableElementModel) => {\n mappedFormTemplateAvailableElements[formTemplateAvailableElement.element_type] = formTemplateAvailableElement\n })\n\n return mappedFormTemplateAvailableElements\n }\n}\n","import Vue from 'vue'\nimport Vuex from 'vuex'\n\nimport SessionStore, { STORE_ACTIONS as SESSION_STORE_ACTIONS, STORE_GETTERS as SESSION_STORE_GETTERS } from '../modules/session/Session.store'\nimport YearStore, { STORE_ACTIONS as YEAR_STORE_ACTIONS, STORE_GETTERS as YEAR_STORE_GETTERS } from '../modules/global/year/Year.store'\nimport FormTemplateAvailableElementStore, { STORE_ACTIONS as FORM_TEMPLATE_AVAILABLE_ELEMENT_STORE_ACTIONS, STORE_GETTERS as FORM_TEMPLATE_AVAILABLE_ELEMENT_STORE_GETTERS } from '../modules/form-template-management/FormTemplateAvailableElement.store'\n\nVue.use(Vuex)\n\nexport const STORE_ACTIONS = {\n ...SESSION_STORE_ACTIONS,\n ...YEAR_STORE_ACTIONS,\n ...FORM_TEMPLATE_AVAILABLE_ELEMENT_STORE_ACTIONS\n}\ntype STORE_ACTIONS = SESSION_STORE_ACTIONS | YEAR_STORE_ACTIONS | FORM_TEMPLATE_AVAILABLE_ELEMENT_STORE_ACTIONS\n\nexport const STORE_GETTERS = {\n ...SESSION_STORE_GETTERS,\n ...YEAR_STORE_GETTERS,\n ...FORM_TEMPLATE_AVAILABLE_ELEMENT_STORE_GETTERS\n}\ntype STORE_GETTERS = SESSION_STORE_GETTERS | YEAR_STORE_GETTERS | FORM_TEMPLATE_AVAILABLE_ELEMENT_STORE_GETTERS\n\nexport default new Vuex.Store({\n modules: {\n session: SessionStore,\n year: YearStore,\n formTemplateAvailableElement: FormTemplateAvailableElementStore\n }\n})\n","\n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n","
\n \n
","\n

\n {{ $i18next.t('modules.application-form-management.application-form-creation.ApplicationFormCreationDialog.overlay_title') }}\n

\n \n \n \n \n \n","\n \n \n \n \n \n
\n \n
\n \n \n \n \n {{ $i18next.t('modules.application-form-support-management.application-form-support.AdminApplicationFormSupport.button.submit.label') }}\n \n \n \n \n
\n \n {{ $i18next.t('modules.application-form-support-management.application-form-support.AdminApplicationFormSupport.toast.submit_success.label') }}\n \n \n {{ $i18next.t('modules.application-form-support-management.application-form-support.AdminApplicationFormSupport.toast.submit_error.label') }}\n \n \n

\n \n {{ $i18next.t('modules.application-form-support-management.application-form-support.AdminApplicationFormSupport.toast.validation_error.label') }}\n \n
\n {{ $i18next.t('modules.application-form-support-management.application-form-support.AdminApplicationFormSupport.toast.validation_error.help') }}\n

\n \n","
\n \n \n

\n {{ $i18next.t('modules.application-form-management.AdminApplicationFormManagement.panel_title') }}\n

\n \n \n \n \n
\n
","\n \n \n \n \n \n \n","
\n \n \n \n \n
\n \n \n \n \n
\n
","
\n \n \n \n \n \n \n {{ $i18next.t('modules.application-form-management.application-forms.ApplicationForms.toast.delete_success.label') }}\n \n
","\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n \n
\n
\n
\n \n \n","\n \n \n {{ evaluatorApplicationFormAssignment.candidate_full_name }}\n \n \n
\n \n
\n \n \n \n","\n \n \n \n \n \n \n \n \n \n \n \n","
\n \n

\n {{ $i18next.t('modules.dashboard.dashboard-application-form-management.DashboardApplicationFormManagement.panel_title') }}\n

\n \n \n \n \n
\n \n
","
\n \n

\n {{ $i18next.t('modules.dashboard.dashboard-evaluator-assignment-management.DashboardEvaluatorAssignmentManagement.panel_title') }}\n

\n \n \n \n
\n
","\n

\n {{ $i18next.t('modules.category-management.category-creation.CategoryCreationDialog.overlay_title') }}\n

\n \n \n \n \n \n","
\n \n \n \n \n \n \n
\n \n
\n
\n \n
","\n \n \n \n \n \n \n \n","
\n \n \n

\n {{ $i18next.t('modules.user-management.UserManagement.panel_title') }}\n

\n \n
\n \n
","\n \n \n \n \n \n \n","
\n \n \n
","\n \n \n \n \n \n \n \n","
\n \n \n \n \n \n \n \n \n \n \n
\n \n
\n \n
\n \n {{ $i18next.t('modules.application-form-management.application-form.ApplicationForm.button.save.label') }}\n \n
\n \n
\n \n {{ $i18next.t('modules.application-form-management.application-form.ApplicationForm.toast.submit_success.label') }}\n \n \n {{ $i18next.t('modules.application-form-management.application-form.ApplicationForm.toast.submit_error.label') }}\n \n \n

\n \n {{ $i18next.t('modules.application-form-management.application-form.ApplicationForm.toast.validation_error.label') }}\n \n
\n {{ $i18next.t('modules.application-form-management.application-form.ApplicationForm.toast.validation_error.help') }}\n

\n \n \n {{ $i18next.t('modules.application-form-management.application-form.ApplicationForm.toast.save_success.label') }}\n \n
","module.exports = __webpack_public_path__ + \"img/sprites.d65acb37.svg\";","
\n \n \n \n \n
","
\n \n

\n {{ evaluatorApplicationFormAssignment.candidate_full_name_with_username }}\n

\n
","\n \n \n \n \n","var map = {\n\t\"./af\": \"2bfb\",\n\t\"./af.js\": \"2bfb\",\n\t\"./ar\": \"8e73\",\n\t\"./ar-dz\": \"a356\",\n\t\"./ar-dz.js\": \"a356\",\n\t\"./ar-kw\": \"423e\",\n\t\"./ar-kw.js\": \"423e\",\n\t\"./ar-ly\": \"1cfd\",\n\t\"./ar-ly.js\": \"1cfd\",\n\t\"./ar-ma\": \"0a84\",\n\t\"./ar-ma.js\": \"0a84\",\n\t\"./ar-sa\": \"8230\",\n\t\"./ar-sa.js\": \"8230\",\n\t\"./ar-tn\": \"6d83\",\n\t\"./ar-tn.js\": \"6d83\",\n\t\"./ar.js\": \"8e73\",\n\t\"./az\": \"485c\",\n\t\"./az.js\": \"485c\",\n\t\"./be\": \"1fc1\",\n\t\"./be.js\": \"1fc1\",\n\t\"./bg\": \"84aa\",\n\t\"./bg.js\": \"84aa\",\n\t\"./bm\": \"a7fa\",\n\t\"./bm.js\": \"a7fa\",\n\t\"./bn\": \"9043\",\n\t\"./bn-bd\": \"9686\",\n\t\"./bn-bd.js\": \"9686\",\n\t\"./bn.js\": \"9043\",\n\t\"./bo\": \"d26a\",\n\t\"./bo.js\": \"d26a\",\n\t\"./br\": \"6887\",\n\t\"./br.js\": \"6887\",\n\t\"./bs\": \"2554\",\n\t\"./bs.js\": \"2554\",\n\t\"./ca\": \"d716\",\n\t\"./ca.js\": \"d716\",\n\t\"./cs\": \"3c0d\",\n\t\"./cs.js\": \"3c0d\",\n\t\"./cv\": \"03ec\",\n\t\"./cv.js\": \"03ec\",\n\t\"./cy\": \"9797\",\n\t\"./cy.js\": \"9797\",\n\t\"./da\": \"0f14\",\n\t\"./da.js\": \"0f14\",\n\t\"./de\": \"b469\",\n\t\"./de-at\": \"b3eb\",\n\t\"./de-at.js\": \"b3eb\",\n\t\"./de-ch\": \"bb71\",\n\t\"./de-ch.js\": \"bb71\",\n\t\"./de.js\": \"b469\",\n\t\"./dv\": \"598a\",\n\t\"./dv.js\": \"598a\",\n\t\"./el\": \"8d47\",\n\t\"./el.js\": \"8d47\",\n\t\"./en-au\": \"0e6b\",\n\t\"./en-au.js\": \"0e6b\",\n\t\"./en-ca\": \"3886\",\n\t\"./en-ca.js\": \"3886\",\n\t\"./en-gb\": \"39a6\",\n\t\"./en-gb.js\": \"39a6\",\n\t\"./en-ie\": \"e1d3\",\n\t\"./en-ie.js\": \"e1d3\",\n\t\"./en-il\": \"7333\",\n\t\"./en-il.js\": \"7333\",\n\t\"./en-in\": \"ec2e\",\n\t\"./en-in.js\": \"ec2e\",\n\t\"./en-nz\": \"6f50\",\n\t\"./en-nz.js\": \"6f50\",\n\t\"./en-sg\": \"b7e9\",\n\t\"./en-sg.js\": \"b7e9\",\n\t\"./eo\": \"65db\",\n\t\"./eo.js\": \"65db\",\n\t\"./es\": \"898b\",\n\t\"./es-do\": \"0a3c\",\n\t\"./es-do.js\": \"0a3c\",\n\t\"./es-mx\": \"b5b7\",\n\t\"./es-mx.js\": \"b5b7\",\n\t\"./es-us\": \"55c9\",\n\t\"./es-us.js\": \"55c9\",\n\t\"./es.js\": \"898b\",\n\t\"./et\": \"ec18\",\n\t\"./et.js\": \"ec18\",\n\t\"./eu\": \"0ff2\",\n\t\"./eu.js\": \"0ff2\",\n\t\"./fa\": \"8df4\",\n\t\"./fa.js\": \"8df4\",\n\t\"./fi\": \"81e9\",\n\t\"./fi.js\": \"81e9\",\n\t\"./fil\": \"d69a\",\n\t\"./fil.js\": \"d69a\",\n\t\"./fo\": \"0721\",\n\t\"./fo.js\": \"0721\",\n\t\"./fr\": \"9f26\",\n\t\"./fr-ca\": \"d9f8\",\n\t\"./fr-ca.js\": \"d9f8\",\n\t\"./fr-ch\": \"0e49\",\n\t\"./fr-ch.js\": \"0e49\",\n\t\"./fr.js\": \"9f26\",\n\t\"./fy\": \"7118\",\n\t\"./fy.js\": \"7118\",\n\t\"./ga\": \"5120\",\n\t\"./ga.js\": \"5120\",\n\t\"./gd\": \"f6b4\",\n\t\"./gd.js\": \"f6b4\",\n\t\"./gl\": \"8840\",\n\t\"./gl.js\": \"8840\",\n\t\"./gom-deva\": \"aaf2\",\n\t\"./gom-deva.js\": \"aaf2\",\n\t\"./gom-latn\": \"0caa\",\n\t\"./gom-latn.js\": \"0caa\",\n\t\"./gu\": \"e0c5\",\n\t\"./gu.js\": \"e0c5\",\n\t\"./he\": \"c7aa\",\n\t\"./he.js\": \"c7aa\",\n\t\"./hi\": \"dc4d\",\n\t\"./hi.js\": \"dc4d\",\n\t\"./hr\": \"4ba9\",\n\t\"./hr.js\": \"4ba9\",\n\t\"./hu\": \"5b14\",\n\t\"./hu.js\": \"5b14\",\n\t\"./hy-am\": \"d6b6\",\n\t\"./hy-am.js\": \"d6b6\",\n\t\"./id\": \"5038\",\n\t\"./id.js\": \"5038\",\n\t\"./is\": \"0558\",\n\t\"./is.js\": \"0558\",\n\t\"./it\": \"6e98\",\n\t\"./it-ch\": \"6f12\",\n\t\"./it-ch.js\": \"6f12\",\n\t\"./it.js\": \"6e98\",\n\t\"./ja\": \"079e\",\n\t\"./ja.js\": \"079e\",\n\t\"./jv\": \"b540\",\n\t\"./jv.js\": \"b540\",\n\t\"./ka\": \"201b\",\n\t\"./ka.js\": \"201b\",\n\t\"./kk\": \"6d79\",\n\t\"./kk.js\": \"6d79\",\n\t\"./km\": \"e81d\",\n\t\"./km.js\": \"e81d\",\n\t\"./kn\": \"3e92\",\n\t\"./kn.js\": \"3e92\",\n\t\"./ko\": \"22f8\",\n\t\"./ko.js\": \"22f8\",\n\t\"./ku\": \"2421\",\n\t\"./ku.js\": \"2421\",\n\t\"./ky\": \"9609\",\n\t\"./ky.js\": \"9609\",\n\t\"./lb\": \"440c\",\n\t\"./lb.js\": \"440c\",\n\t\"./lo\": \"b29d\",\n\t\"./lo.js\": \"b29d\",\n\t\"./lt\": \"26f9\",\n\t\"./lt.js\": \"26f9\",\n\t\"./lv\": \"b97c\",\n\t\"./lv.js\": \"b97c\",\n\t\"./me\": \"293c\",\n\t\"./me.js\": \"293c\",\n\t\"./mi\": \"688b\",\n\t\"./mi.js\": \"688b\",\n\t\"./mk\": \"6909\",\n\t\"./mk.js\": \"6909\",\n\t\"./ml\": \"02fb\",\n\t\"./ml.js\": \"02fb\",\n\t\"./mn\": \"958b\",\n\t\"./mn.js\": \"958b\",\n\t\"./mr\": \"39bd\",\n\t\"./mr.js\": \"39bd\",\n\t\"./ms\": \"ebe4\",\n\t\"./ms-my\": \"6403\",\n\t\"./ms-my.js\": \"6403\",\n\t\"./ms.js\": \"ebe4\",\n\t\"./mt\": \"1b45\",\n\t\"./mt.js\": \"1b45\",\n\t\"./my\": \"8689\",\n\t\"./my.js\": \"8689\",\n\t\"./nb\": \"6ce3\",\n\t\"./nb.js\": \"6ce3\",\n\t\"./ne\": \"3a39\",\n\t\"./ne.js\": \"3a39\",\n\t\"./nl\": \"facd\",\n\t\"./nl-be\": \"db29\",\n\t\"./nl-be.js\": \"db29\",\n\t\"./nl.js\": \"facd\",\n\t\"./nn\": \"b84c\",\n\t\"./nn.js\": \"b84c\",\n\t\"./oc-lnc\": \"167b\",\n\t\"./oc-lnc.js\": \"167b\",\n\t\"./pa-in\": \"f3ff\",\n\t\"./pa-in.js\": \"f3ff\",\n\t\"./pl\": \"8d57\",\n\t\"./pl.js\": \"8d57\",\n\t\"./pt\": \"f260\",\n\t\"./pt-br\": \"d2d4\",\n\t\"./pt-br.js\": \"d2d4\",\n\t\"./pt.js\": \"f260\",\n\t\"./ro\": \"972c\",\n\t\"./ro.js\": \"972c\",\n\t\"./ru\": \"957c\",\n\t\"./ru.js\": \"957c\",\n\t\"./sd\": \"6784\",\n\t\"./sd.js\": \"6784\",\n\t\"./se\": \"ffff\",\n\t\"./se.js\": \"ffff\",\n\t\"./si\": \"eda5\",\n\t\"./si.js\": \"eda5\",\n\t\"./sk\": \"7be6\",\n\t\"./sk.js\": \"7be6\",\n\t\"./sl\": \"8155\",\n\t\"./sl.js\": \"8155\",\n\t\"./sq\": \"c8f3\",\n\t\"./sq.js\": \"c8f3\",\n\t\"./sr\": \"cf1e\",\n\t\"./sr-cyrl\": \"13e9\",\n\t\"./sr-cyrl.js\": \"13e9\",\n\t\"./sr.js\": \"cf1e\",\n\t\"./ss\": \"52bd\",\n\t\"./ss.js\": \"52bd\",\n\t\"./sv\": \"5fbd\",\n\t\"./sv.js\": \"5fbd\",\n\t\"./sw\": \"74dc\",\n\t\"./sw.js\": \"74dc\",\n\t\"./ta\": \"3de5\",\n\t\"./ta.js\": \"3de5\",\n\t\"./te\": \"5cbb\",\n\t\"./te.js\": \"5cbb\",\n\t\"./tet\": \"576c\",\n\t\"./tet.js\": \"576c\",\n\t\"./tg\": \"3b1b\",\n\t\"./tg.js\": \"3b1b\",\n\t\"./th\": \"10e8\",\n\t\"./th.js\": \"10e8\",\n\t\"./tk\": \"5aff\",\n\t\"./tk.js\": \"5aff\",\n\t\"./tl-ph\": \"0f38\",\n\t\"./tl-ph.js\": \"0f38\",\n\t\"./tlh\": \"cf75\",\n\t\"./tlh.js\": \"cf75\",\n\t\"./tr\": \"0e81\",\n\t\"./tr.js\": \"0e81\",\n\t\"./tzl\": \"cf51\",\n\t\"./tzl.js\": \"cf51\",\n\t\"./tzm\": \"c109\",\n\t\"./tzm-latn\": \"b53d\",\n\t\"./tzm-latn.js\": \"b53d\",\n\t\"./tzm.js\": \"c109\",\n\t\"./ug-cn\": \"6117\",\n\t\"./ug-cn.js\": \"6117\",\n\t\"./uk\": \"ada2\",\n\t\"./uk.js\": \"ada2\",\n\t\"./ur\": \"5294\",\n\t\"./ur.js\": \"5294\",\n\t\"./uz\": \"2e8c\",\n\t\"./uz-latn\": \"010e\",\n\t\"./uz-latn.js\": \"010e\",\n\t\"./uz.js\": \"2e8c\",\n\t\"./vi\": \"2921\",\n\t\"./vi.js\": \"2921\",\n\t\"./x-pseudo\": \"fd7e\",\n\t\"./x-pseudo.js\": \"fd7e\",\n\t\"./yo\": \"7f33\",\n\t\"./yo.js\": \"7f33\",\n\t\"./zh-cn\": \"5c3a\",\n\t\"./zh-cn.js\": \"5c3a\",\n\t\"./zh-hk\": \"49ab\",\n\t\"./zh-hk.js\": \"49ab\",\n\t\"./zh-mo\": \"3a6c\",\n\t\"./zh-mo.js\": \"3a6c\",\n\t\"./zh-tw\": \"90ea\",\n\t\"./zh-tw.js\": \"90ea\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"4678\";","
\n
\n \n

\n {{ $i18next.t('modules.authentication.login.LoginPage.informations_container.title') }}\n

\n

\n \n \n

\n {{ $i18next.t('modules.authentication.login.LoginPage.form_container.title') }}\n

\n \n \n \n
\n
","\n \n \n \n \n \n \n \n","import { Action, Module, Mutation, VuexModule } from 'vuex-module-decorators'\n\nimport jwt, { JwtPayload } from 'jsonwebtoken'\n\nexport enum STORE_ACTIONS {\n SESSION_STORE_LOGIN = 'session/login',\n SESSION_STORE_LOGOUT = 'session/logout',\n SESSION_STORE_SYNCHRONISE_WITH_LOCAL_STORAGE = 'session/synchroniseWithLocalStorage'\n}\n\nexport enum STORE_GETTERS {\n SESSION_GET_TOKEN = 'session/token',\n SESSION_GET_IS_LOGGED_IN = 'session/isLoggedIn',\n SESSION_GET_FIRST_NAME = 'session/firstName',\n SESSION_GET_LAST_NAME = 'session/lastName',\n SESSION_GET_EMAIL = 'session/email',\n SESSION_GET_USERNAME = 'session/username',\n SESSION_GET_ROLES = 'session/roles',\n SESSION_GET_USER_FULL_NAME = 'session/userFullName',\n SESSION_GET_USER_FULL_NAME_WITH_USERNAME = 'session/userFullNameWithUsername',\n SESSION_GET_USER_FULL_NAME_WITH_EMAIL = 'session/userFullNameWithEmail'\n}\n\nexport const TOKEN_LOCAL_STORAGE_KEY: string = 'session-token'\n\n@Module({ namespaced: true })\nexport default class SessionStore extends VuexModule {\n public readonly TOKEN_LOCAL_STORAGE_KEY: string = TOKEN_LOCAL_STORAGE_KEY\n\n private _token: string | null = null\n private _isLoggedIn: boolean = false\n private _firstName: string | null = null\n private _lastName: string | null = null\n private _email: string | null = null\n private _username: string | null = null\n private _roles: string[] = []\n\n @Mutation\n private storeTokenMutation(token: string): void {\n localStorage.setItem(this.TOKEN_LOCAL_STORAGE_KEY, token)\n }\n\n @Mutation\n private synchroniseWithLocalStorageMutation(): void {\n this._token = localStorage.getItem(this.TOKEN_LOCAL_STORAGE_KEY)\n this._isLoggedIn = !!this._token\n }\n\n @Mutation\n private decodeTokenInformationsMutation(): void {\n if (this._token) {\n const decodedToken: JwtPayload = jwt.decode(this._token || '') as JwtPayload\n\n if (decodedToken) {\n this._firstName = decodedToken.firstName\n this._lastName = decodedToken.lastName\n this._email = decodedToken.email\n this._username = decodedToken.username\n this._roles = decodedToken.roles\n }\n }\n }\n\n @Mutation\n private clearTokenMutation(): void {\n localStorage.removeItem(this.TOKEN_LOCAL_STORAGE_KEY)\n }\n\n @Mutation\n private clearUserInformationsMutation(): void {\n this._firstName = null\n this._lastName = null\n this._email = null\n this._username = null\n this._roles = []\n }\n\n @Action\n public login(token: string): void {\n this.context.commit('storeTokenMutation', token)\n this.context.commit('synchroniseWithLocalStorageMutation')\n this.context.commit('decodeTokenInformationsMutation')\n }\n\n @Action\n public logout(): void {\n this.context.commit('clearTokenMutation')\n this.context.commit('synchroniseWithLocalStorageMutation')\n this.context.commit('clearUserInformationsMutation')\n }\n\n @Action\n public synchroniseWithLocalStorage(): void {\n this.context.commit('synchroniseWithLocalStorageMutation')\n this.context.commit('decodeTokenInformationsMutation')\n }\n\n private get token(): string | null {\n return this._token\n }\n\n private get isLoggedIn(): boolean {\n return this._isLoggedIn\n }\n\n private get firstName(): string | null {\n return this._firstName\n }\n\n private get lastName(): string | null {\n return this._lastName\n }\n\n private get email(): string | null {\n return this._email\n }\n\n private get username(): string | null {\n return this._username\n }\n\n private get roles(): string[] {\n return this._roles\n }\n\n private get userFullName(): string {\n return `${this.firstName} ${this.lastName}`\n }\n\n private get userFullNameWithUsername(): string {\n return `${this.userFullName} (${this.username})`\n }\n\n private get userFullNameWithEmail(): string {\n return `${this.userFullName} (${this.email})`\n }\n}\n","
\n \n \n \n \n
","\n

\n \n

\n
\n","\n

\n {{ $i18next.t('modules.evaluator-management.evaluator-category-assignment-management.evaluator-category-assignment-creation.AdminEvaluatorCategoryAssignmentCreationOverlay.overlay_title') }}\n

\n \n \n \n \n \n \n","\n
\n
\n \n
\n
\n
\n
\n
\n \n {{ $i18next.t('modules.year-configuration-management.year-configuration-form.YearConfigurationForm.checkbox.is_public_area_available.label') }}\n \n
\n
\n \n \n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n","
\n \n
\n \n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n \n
\n \n
\n \n
\n \n {{ $i18next.t('modules.application-form-validation-management.application-form-validation.AdminApplicationFormValidation.application_form_validation.button.save.label') }}\n \n
\n
\n \n {{ $i18next.t('modules.application-form-validation-management.application-form-validation.AdminApplicationFormValidation.application_form_validation.button.flag_as_valid.label') }}\n \n \n {{ $i18next.t('modules.application-form-validation-management.application-form-validation.AdminApplicationFormValidation.application_form_validation.button.flag_as_invalid.label') }}\n \n
\n \n
\n \n {{ $i18next.t('modules.application-form-validation-management.application-form-validation.AdminApplicationFormValidation.application_form_validation.toast.update_success.label') }}\n \n
\n
","\n \n \n \n \n \n
\n \n
\n \n \n \n \n \n
\n \n {{ $i18next.t('modules.application-form-support-management.application-form-support.ApplicationFormSupport.toast.submit_success.label') }}\n \n \n {{ $i18next.t('modules.application-form-support-management.application-form-support.ApplicationFormSupport.toast.submit_error.label') }}\n \n \n

\n \n {{ $i18next.t('modules.application-form-support-management.application-form-support.ApplicationFormSupport.toast.validation_error.label') }}\n \n
\n {{ $i18next.t('modules.application-form-support-management.application-form-support.ApplicationFormSupport.toast.validation_error.help') }}\n

\n \n","
\n \n \n \n
","
\n \n \n \n \n \n \n
\n \n
\n
\n \n
","
\n
\n
\n {{ evaluatorCategoryAssignment.category_title }}\n
\n
\n {{\n $i18next.t(\n 'modules.evaluator-management.evaluator-category-assignment-management.evaluator-category-assignment.EvaluatorCategoryAssignment.label.evaluation_period_limit_timestamp',\n {\n timestamp: mixin_timestamp_pretty(evaluatorCategoryAssignment.category_evaluation_period_limit_timestamp)\n }\n ) \n }}\n
\n
\n \n \n
","
\n \n \n \n
","
\n \n \n

\n {{ $i18next.t('modules.application-form-validation-management.AdminApplicationFormValidationManagement.panel_title') }}\n

\n \n \n \n \n
\n
","
\n \n \n

\n {{ $i18next.t('modules.email-template-management.EmailTemplateManagement.panel_title') }}\n

\n \n
\n \n
","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './FormTemplateUpdateInsertZone.html'\n\nimport { \n MIcon\n} from '@ulaval/modul-components' \n\nimport { DRAG_AND_DROP_EVENTS_IDENTIFIER, DRAG_AND_DROP_EVENTS_IDENTIFIER_KEY, EventBus, EVENT_BUS_EVENTS, IFormTemplateElementInsertDragDroppedEventPayload, IFormTemplateElementMoveDragDroppedEventPayload } from '@/modules/global/utilities/Events'\n\n@WithRender\n@Component({\n components: {\n MIcon\n }\n})\nexport default class FormTemplateUpdateInsertZone extends mixins() {\n @Prop()\n private parentInternalIdentifier!: string | null\n\n @Prop({ required: true })\n private insertionElementPositionIndex!: number\n\n @Prop({ default: false })\n private dense!: boolean\n\n private onElementDrop(event: DragEvent): void {\n if (\n event &&\n event.dataTransfer\n ) {\n const eventType: string = event.dataTransfer.getData(DRAG_AND_DROP_EVENTS_IDENTIFIER_KEY)\n\n if (eventType === DRAG_AND_DROP_EVENTS_IDENTIFIER.FORM_TEMPLATE_ELEMENT_INSERT) {\n EventBus.$emit(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_INSERT_DRAG_DROPPED, {\n element_type: JSON.parse(event.dataTransfer.getData('text')),\n parentInternalIdentifier: this.parentInternalIdentifier || null,\n insertionElementPositionIndex: this.insertionElementPositionIndex\n } as IFormTemplateElementInsertDragDroppedEventPayload)\n } else if (eventType === DRAG_AND_DROP_EVENTS_IDENTIFIER.FORM_TEMPLATE_ELEMENT_MOVE) {\n EventBus.$emit(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_MOVE_DRAG_DROPPED, {\n originalElement: JSON.parse(event.dataTransfer.getData('text')),\n parentInternalIdentifier: this.parentInternalIdentifier || null,\n insertionElementPositionIndex: this.insertionElementPositionIndex\n } as IFormTemplateElementMoveDragDroppedEventPayload)\n }\n }\n }\n\n private onElementDragOver(event: DragEvent): void {\n if (event) {\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n }\n}\n","
\n \n \n

\n {{ $i18next.t('modules.year-configuration-management.YearConfigurationManagement.panel_title') }}\n

\n \n \n \n \n
\n
","","\n \n \n \n \n \n \n \n \n","\n {{ assembledElementProps['icon-title'] }}\n","\n \n \n","
\n \n
\n \n
\n
","
\n
\n \n
\n \n
","\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n {{ $i18next.t('modules.category-management.category-form.CategoryForm.checkbox.is_new_category.label') }}\n \n
\n
\n
\n
\n \n {{ $i18next.t('modules.category-management.category-form.CategoryForm.checkbox.has_application_support.label') }}\n \n
\n
\n \n \n \n","\n \n","\n \n \n \n \n \n \n \n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref } from 'vue-property-decorator'\n\nimport WithRender from './UploadedFileRow.html'\n\nimport { \n MIcon,\n MIconFile,\n MIconButton,\n MLink,\n MLinkMode\n} from '@ulaval/modul-components'\n\nimport { IFileUploadModel } from './File.model'\n\nexport enum UploadedFileRow_EVENTS {\n DELETE = 'delete'\n}\n\nconst REF_DOWNLOAD_LINK: string = 'ref-download-link'\n\n@WithRender\n@Component({\n components: {\n MIcon,\n MIconButton,\n MIconFile,\n MLink\n }\n})\nexport default class UploadedFileRow extends mixins() {\n private readonly MLinkMode: any = MLinkMode\n private readonly REF_DOWNLOAD_LINK: string = REF_DOWNLOAD_LINK\n\n @Ref(REF_DOWNLOAD_LINK)\n protected downloadLinkHtmlElement!: HTMLElement\n\n @Prop({ required: true })\n private uploadedFile!: IFileUploadModel\n\n @Prop({ default: false })\n private disabled!: boolean\n\n @Prop({\n required: false,\n default: false\n })\n private displayDivider!: boolean\n\n private get fileName(): string {\n if (this.uploadedFile.file) {\n return this.uploadedFile.file.name\n } else if (this.uploadedFile.server_file) {\n return this.uploadedFile.server_file.file_name\n }\n\n return ''\n }\n\n private get fileSize(): string | number {\n if (this.uploadedFile.file) {\n return this.uploadedFile.file.file.size\n } else if (this.uploadedFile.server_file) {\n return this.uploadedFile.server_file.file_size\n }\n\n return ''\n }\n\n private get fileExtension(): string {\n if (this.uploadedFile.file) {\n return this.uploadedFile.file.extension\n } else if (this.uploadedFile.server_file) {\n const fileNameParts: Array = this.uploadedFile.server_file.file_name.split('.')\n \n return fileNameParts[fileNameParts.length - 1]\n }\n\n return ''\n }\n\n private get isFileDownloadAvailable(): boolean {\n if (this.uploadedFile.file) {\n return true\n } else if (this.uploadedFile.server_file) {\n return !!this.uploadedFile.server_file.download_endpoint\n }\n\n return false\n }\n\n private onDeleteOptionClick(): void {\n this.$emit(UploadedFileRow_EVENTS.DELETE)\n }\n\n private downloadFile(): void {\n if (this.uploadedFile.file) {\n if (this.uploadedFile.file.url) {\n this.openFile(this.uploadedFile.file.url, this.uploadedFile.file.name)\n }\n } else if (this.uploadedFile.server_file) {\n this.$axios.get(this.uploadedFile.server_file.download_endpoint, {\n responseType: 'arraybuffer',\n headers: {\n Accept: 'application/octet-stream'\n }\n }).then((res: any) => {\n this.openFile(\n URL.createObjectURL(new Blob([res.data], { type: this.uploadedFile.server_file.file_format })),\n this.uploadedFile.server_file.file_name\n )\n })\n }\n }\n\n private openFile(url: string, fileName: string): void {\n if (this.downloadLinkHtmlElement) {\n this.downloadLinkHtmlElement.setAttribute('href', url)\n this.downloadLinkHtmlElement.setAttribute('download', fileName)\n this.downloadLinkHtmlElement.click()\n\n this.downloadLinkHtmlElement.removeAttribute('link')\n this.downloadLinkHtmlElement.removeAttribute('download')\n }\n }\n}\n","\n \n \n
","import { IFormTemplateAvailableElementModel, IInternalFormTemplateElementModel, IInternalFormTemplateElementOptionModel } from \"@/modules/form-template-management/FormTemplate.model\"\nimport Vue from \"vue\"\n\nexport enum EVENT_BUS_EVENTS {\n USER_CREATED = 'user:created',\n USER_UPDATED = 'user:updated',\n CATEGORY_CREATED = 'category:created',\n CATEGORY_UPDATED = 'category:updated',\n CATEGORY_DELETED = 'category:deleted',\n EMAIL_TEMPLATE_UPDATED = 'email-template:updated',\n FORM_TEMPLATE_UPDATED = 'form-template:updated',\n FORM_TEMPLATE_ELEMENT_SELECTED = 'form-template:element-selected',\n FORM_TEMPLATE_ELEMENT_INSERT_DRAG_STARTED = 'form-template:element-insert-drag-started',\n FORM_TEMPLATE_ELEMENT_INSERT_DRAG_ENDED = 'form-template:element-insert-drag-ended',\n FORM_TEMPLATE_ELEMENT_INSERT_DRAG_DROPPED = 'form-template:element-insert-drag-dropped',\n FORM_TEMPLATE_ELEMENT_MOVE_DRAG_STARTED = 'form-template:element-move-drag-started',\n FORM_TEMPLATE_ELEMENT_MOVE_DRAG_ENDED = 'form-template:element-move-drag-ended',\n FORM_TEMPLATE_ELEMENT_MOVE_DRAG_DROPPED = 'form-template:element-move-drag-dropped',\n FORM_TEMPLATE_ELEMENT_DELETED = 'form-template:element-deleted',\n FORM_TEMPLATE_ELEMENT_UPDATED = 'form-template:element-updated',\n FORM_ELEMENT_STEP_WIZARD_STEP_SELECTED = 'form-element-step-wizard-step:selected',\n APPLICATION_FORM_CREATED = 'application-form:created',\n APPLICATION_FORM_DELETED = 'application-form:deleted',\n APPLICATION_FORM_UPDATED = 'application-form:updated',\n APPLICATION_FORM_REMINDER_EMAIL_SENT = 'application-form:reminder-email-sent',\n APPLICATION_FORM_SUPPORT_REMINDER_EMAIL_SENT = 'application-form-support:reminder-email-sent',\n APPLICATION_FORM_APPLICATION_FORM_SUPPORT_SUBMITTED = 'application-form:application-form-support-submitted',\n APPLICATION_FORM_SUPPORT_SUBMIT_REMINDER_EMAIL_SENT = 'application-form:support-submit-reminder-email-sent',\n EVALUATOR_CATEGORY_ASSIGNMENT_CREATED = 'evaluator-category-assignment:created',\n EVALUATOR_CATEGORY_ASSIGNMENT_UPDATED = 'evaluator-category-assignment:updated',\n EVALUATOR_APPLICATION_FORM_ASSIGNMENT_UPDATED = 'evaluator-application-form-assignment:updated',\n YEAR_CONFIGURATION_UPDATED = 'year-configuration:updated'\n}\n\nexport const DRAG_AND_DROP_EVENTS_IDENTIFIER_KEY: string = 'form-template-element/key'\n\nexport enum DRAG_AND_DROP_EVENTS_IDENTIFIER {\n FORM_TEMPLATE_ELEMENT_INSERT = 'form-template-element/insert',\n FORM_TEMPLATE_ELEMENT_MOVE = 'form-template-element/move',\n}\n\nexport enum GLOBAL_EVENTS {\n MODEL_UPDATED = 'input',\n MODEL_CHANGE = 'change'\n}\n\nexport interface IFormTemplateElementInsertDragDroppedEventPayload {\n element_type: IFormTemplateAvailableElementModel;\n parentInternalIdentifier?: string;\n insertionElementPositionIndex: number;\n}\n\nexport interface IFormTemplateElementMoveDragDroppedEventPayload {\n originalElement: IInternalFormTemplateElementModel;\n parentInternalIdentifier?: string;\n insertionElementPositionIndex: number;\n}\n\nexport interface IFormTemplateElementUpdatedEventPayload {\n elementInternalIdentifier: string;\n elementParametersValue: { [key: string]: any };\n elementOptions: Array;\n}\n\nexport const EventBus: Vue = new Vue()","\n \n \n \n \n \n \n","\n
\n {{ $i18next.t(`modules.form-template-management.FormTemplateModel.element_types.${formTemplateElement.element_type}`) }}\n \n
\n \n \n \n \n \n \n \n \n \n","\n \n \n \n \n \n \n \n","
\n \n
","
\n
\n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
","
\n \n \n

\n {{ $i18next.t('modules.application-form-support-management.AdminApplicationFormSupportManagement.panel_title') }}\n

\n \n \n \n \n
\n
","
\n \n \n \n \n \n
","\n \n \n","\n \n \n","
\n \n
","module.exports = __webpack_public_path__ + \"img/ulaval-logo.64166267.png\";","\n \n {{ $i18next.t('modules.year-configuration-management.year-configuration.YearConfigurationCategorySectionsPanel.panel_title') }}\n \n \n \n","
\n \n \n \n \n \n \n \n \n \n \n
","\n
\n \n \n \n \n
\n","\n

\n {{ $i18next.t('modules.user-management.user-creation.UserCreationDialog.overlay_title') }}\n

\n \n \n \n \n \n","\n \n \n \n \n \n \n \n \n","var map = {\n\t\"./localization/main.lang.fr.json\": \"614b\",\n\t\"./modules/application-form-management/AdminApplicationFormManagement.lang.fr.json\": \"d115\",\n\t\"./modules/application-form-management/ApplicationFormMixin.lang.fr.json\": \"c165\",\n\t\"./modules/application-form-management/application-form-creation/ApplicationFormCreationDialog.lang.fr.json\": \"62c2\",\n\t\"./modules/application-form-management/application-form-form/ApplicationFormForm.lang.fr.json\": \"e1f2\",\n\t\"./modules/application-form-management/application-form/AdminApplicationForm.lang.fr.json\": \"1c1b\",\n\t\"./modules/application-form-management/application-form/ApplicationForm.lang.fr.json\": \"e008\",\n\t\"./modules/application-form-management/application-form/ApplicationFormAuthorizedUsersOverlay.lang.fr.json\": \"c22f\",\n\t\"./modules/application-form-management/application-form/ApplicationFormCard.lang.fr.json\": \"644a\",\n\t\"./modules/application-form-management/application-form/ApplicationFormDepositDeadlineExtensionOverlay.lang.fr.json\": \"4f41\",\n\t\"./modules/application-form-management/application-form/ApplicationFormExportOverlay.lang.fr.json\": \"bb4a\",\n\t\"./modules/application-form-management/application-form/ApplicationFormReminderEmailOverlay.lang.fr.json\": \"b2a8\",\n\t\"./modules/application-form-management/application-form/ApplicationFormSupportSubmitReminderEmailOverlay.lang.fr.json\": \"fa4c\",\n\t\"./modules/application-form-management/application-form/SubmitApplicationFormSupportOverlay.lang.fr.json\": \"0d0b\",\n\t\"./modules/application-form-management/application-forms/AdminApplicationForms.lang.fr.json\": \"417c\",\n\t\"./modules/application-form-management/application-forms/ApplicationForms.lang.fr.json\": \"4b37\",\n\t\"./modules/application-form-support-management/AdminApplicationFormSupportManagement.lang.fr.json\": \"bbc7\",\n\t\"./modules/application-form-support-management/ApplicationFormSupportMixin.lang.fr.json\": \"aa9c\",\n\t\"./modules/application-form-support-management/application-form-support-form/ApplicationFormSupportForm.lang.fr.json\": \"e616\",\n\t\"./modules/application-form-support-management/application-form-support/AdminApplicationFormSupport.lang.fr.json\": \"248d\",\n\t\"./modules/application-form-support-management/application-form-support/ApplicationFormSupport.lang.fr.json\": \"70bc\",\n\t\"./modules/application-form-support-management/application-form-support/ApplicationFormSupportReminderEmailOverlay.lang.fr.json\": \"f2a2\",\n\t\"./modules/application-form-support-management/application-form-support/ApplicationFormSupportRow.lang.fr.json\": \"b281\",\n\t\"./modules/application-form-support-management/application-form-supports/AdminApplicationFormSupports.lang.fr.json\": \"6dc8\",\n\t\"./modules/application-form-validation-management/AdminApplicationFormValidationManagement.lang.fr.json\": \"3880\",\n\t\"./modules/application-form-validation-management/ApplicationFormValidationMixin.lang.fr.json\": \"a413\",\n\t\"./modules/application-form-validation-management/application-form-validation/AdminApplicationFormValidation.lang.fr.json\": \"763f\",\n\t\"./modules/application-form-validation-management/application-form-validations/AdminApplicationFormValidations.lang.fr.json\": \"8f15\",\n\t\"./modules/authentication/form/AuthenticationForm.lang.fr.json\": \"1ca0\",\n\t\"./modules/authentication/login/LoginPage.lang.fr.json\": \"92f3\",\n\t\"./modules/category-management/CategoryManagement.lang.fr.json\": \"ce9c\",\n\t\"./modules/category-management/categories/Categories.lang.fr.json\": \"533b\",\n\t\"./modules/category-management/category-copy/CategoryCopyDialog.lang.fr.json\": \"c446\",\n\t\"./modules/category-management/category-creation/CategoryCreationDialog.lang.fr.json\": \"5679\",\n\t\"./modules/category-management/category-form/CategoryForm.lang.fr.json\": \"cd9b\",\n\t\"./modules/category-management/category-update/CategoryUpdateDialog.lang.fr.json\": \"fd4b\",\n\t\"./modules/category-management/category/PublicCategoryCard.lang.fr.json\": \"ec3e\",\n\t\"./modules/category-management/evaluation-card-management/evaluation-card-deposit/EvaluationCardDepositOverlay.lang.fr.json\": \"837e\",\n\t\"./modules/category-section-management/category-section-form/CategorySectionForm.lang.fr.json\": \"4670\",\n\t\"./modules/category-section-management/category-section-form/CategorySectionFormRow.lang.fr.json\": \"2d43\",\n\t\"./modules/dashboard/DashboardEvaluatorToolbox.lang.fr.json\": \"6d29\",\n\t\"./modules/dashboard/DashboardPage.lang.fr.json\": \"6189\",\n\t\"./modules/dashboard/dashboard-application-form-management/DashboardApplicationFormManagement.lang.fr.json\": \"e600\",\n\t\"./modules/dashboard/dashboard-evaluator-assignment-management/DashboardEvaluatorAssignmentManagement.lang.fr.json\": \"1d00\",\n\t\"./modules/email-template-management/EmailTemplateManagement.lang.fr.json\": \"927a\",\n\t\"./modules/email-template-management/email-template-form/EmailTemplateForm.lang.fr.json\": \"ed44\",\n\t\"./modules/email-template-management/email-template-update/EmailTemplateUpdateDialog.lang.fr.json\": \"c9f7\",\n\t\"./modules/email-template-management/email-templates/EmailTemplates.lang.fr.json\": \"cf17\",\n\t\"./modules/evaluator-management/EvaluatorManagement.lang.fr.json\": \"df34\",\n\t\"./modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormAssignment.lang.fr.json\": \"1654\",\n\t\"./modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormAssignmentRow.lang.fr.json\": \"ce2c\",\n\t\"./modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormSupportAssignment.lang.fr.json\": \"c5ae\",\n\t\"./modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment-creation/AdminEvaluatorCategoryAssignmentCreationOverlay.lang.fr.json\": \"1a6d\",\n\t\"./modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment-form/AdminEvaluatorCategoryAssignmentForm.lang.fr.json\": \"922d\",\n\t\"./modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment-update/AdminEvaluatorCategoryAssignmentUpdateOverlay.lang.fr.json\": \"048c\",\n\t\"./modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment/EvaluatorCategoryAssignment.lang.fr.json\": \"8434\",\n\t\"./modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignments/AdminEvaluatorCategoryAssignments.lang.fr.json\": \"40a7\",\n\t\"./modules/evaluator-toolbox-file-management/evaluator-toolbox-file-deposit/EvaluatorToolboxFileDepositOverlay.lang.fr.json\": \"0e6f\",\n\t\"./modules/form-management/form-custom-element/embedded-video-player/EmbeddedVideoPlayer.lang.fr.json\": \"72b7\",\n\t\"./modules/form-management/form-custom-element/file-upload/FileUpload.lang.fr.json\": \"47f7\",\n\t\"./modules/form-management/form-custom-element/step-wizard-step/StepWizard.lang.fr.json\": \"bea5\",\n\t\"./modules/form-management/form-element/FormElement.lang.fr.json\": \"4909\",\n\t\"./modules/form-template-management/FormTemplateManagement.lang.fr.json\": \"956e\",\n\t\"./modules/form-template-management/FormTemplateModel.lang.fr.json\": \"0b65\",\n\t\"./modules/form-template-management/form-template-preview/FormTemplatePreview.lang.fr.json\": \"bd94\",\n\t\"./modules/form-template-management/form-template-update/FormTemplateUpdate.lang.fr.json\": \"142d\",\n\t\"./modules/form-template-management/form-template-update/FormTemplateUpdateAvailableElements.lang.fr.json\": \"4606\",\n\t\"./modules/form-template-management/form-template-update/FormTemplateUpdateDropZoneElement.lang.fr.json\": \"f77a\",\n\t\"./modules/form-template-management/form-template-update/FormTemplateUpdateElementPanel.lang.fr.json\": \"482a\",\n\t\"./modules/form-template-management/form-template-update/FormTemplateUpdateSelectedElement.lang.fr.json\": \"b2b2\",\n\t\"./modules/global/components/option-item/RestoreItemOption.lang.fr.json\": \"0e1c\",\n\t\"./modules/global/components/option-item/SoftDeleteItemOption.lang.fr.json\": \"5da8\",\n\t\"./modules/global/components/rich-text-editor/RichTextEditor.lang.fr.json\": \"95dc\",\n\t\"./modules/global/email/EmailStatus.lang.fr.json\": \"b34f\",\n\t\"./modules/global/email/EmailStatusRow.lang.fr.json\": \"7ace\",\n\t\"./modules/global/error/ErrorPage.lang.fr.json\": \"c90d\",\n\t\"./modules/global/file/UploadedFileRow.lang.fr.json\": \"35bd\",\n\t\"./modules/global/navigation-bar/AdministratorMenu.lang.fr.json\": \"868a\",\n\t\"./modules/global/navigation-bar/NavigationBar.lang.fr.json\": \"9687\",\n\t\"./modules/global/navigation-bar/UserProfileMenu.lang.fr.json\": \"a182\",\n\t\"./modules/global/utilities/TimestampMixin.lang.fr.json\": \"460c\",\n\t\"./modules/global/utilities/Utilities.lang.fr.json\": \"ca30\",\n\t\"./modules/global/year/YearDropdown.lang.fr.json\": \"ab74\",\n\t\"./modules/public-area/form-template-preview/PublicFormTemplatePreview.lang.fr.json\": \"c225\",\n\t\"./modules/user-management/UserManagement.lang.fr.json\": \"844c\",\n\t\"./modules/user-management/user-creation/UserCreationDialog.lang.fr.json\": \"d85a\",\n\t\"./modules/user-management/user-form/UserForm.lang.fr.json\": \"df1b\",\n\t\"./modules/user-management/user-update/UserUpdateDialog.lang.fr.json\": \"bf1f\",\n\t\"./modules/user-management/users/Users.lang.fr.json\": \"006a\",\n\t\"./modules/year-configuration-management/YearConfigurationManagement.lang.fr.json\": \"f327\",\n\t\"./modules/year-configuration-management/year-configuration-form/YearConfigurationForm.lang.fr.json\": \"cc7d\",\n\t\"./modules/year-configuration-management/year-configuration-update/YearConfigurationUpdateDialog.lang.fr.json\": \"419c\",\n\t\"./modules/year-configuration-management/year-configuration/AdminYearConfiguration.lang.fr.json\": \"42ca\",\n\t\"./modules/year-configuration-management/year-configuration/PublicYearConfiguration.lang.fr.json\": \"e061\",\n\t\"./modules/year-configuration-management/year-configuration/YearConfigurationCategorySectionsPanel.lang.fr.json\": \"d524\",\n\t\"./router/breadcrumbs.lang.fr.json\": \"78ea\",\n\t\"./router/routes.lang.fr.json\": \"9fd7\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"b777\";","
\n

\n \n

\n
\n
","
\n \n \n
","
\n \n \n \n \n \n
","\n \n \n \n \n \n \n \n \n","
\n \n \n

\n {{ $i18next.t('modules.evaluator-management.EvaluatorManagement.panel_title') }}\n

\n \n \n \n \n \n
\n
","
\n \n

\n {{ $i18next.t('modules.dashboard.DashboardEvaluatorToolbox.panel_title') }}\n

\n \n \n
\n
","\n \n \n \n \n \n \n \n","
\n
\n \n
\n \n \n
","
\n \n \n
","\n \n \n \n \n \n \n \n \n
\n

\n {{ $i18next.t('modules.application-form-management.application-form.ApplicationFormCard.label.category_title', applicationForm) }}\n
\n {{ $i18next.t('modules.application-form-management.application-form.ApplicationFormCard.label.category_deposit_limit', {\n timestamp: mixin_timestamp_pretty(applicationForm.category_application_deposit_limit_timestamp)\n }) }}\n \n

\n \n \n
\n \n \n {{ $i18next.t('modules.application-form-management.application-form.ApplicationFormCard.toast.soft_delete_success.label') }}\n \n \n {{ $i18next.t('modules.application-form-management.application-form.ApplicationFormCard.toast.restore_success.label') }}\n \n \n","
\n \n \n \n \n \n \n \n \n
\n \n
\n \n \n \n \n {{ $i18next.t('modules.application-form-management.application-form.AdminApplicationForm.button.submit.label') }}\n \n \n \n \n
\n \n {{ $i18next.t('modules.application-form-management.application-form.AdminApplicationForm.toast.submit_success.label') }}\n \n \n {{ $i18next.t('modules.application-form-management.application-form.AdminApplicationForm.toast.submit_error.label') }}\n \n \n

\n \n {{ $i18next.t('modules.application-form-management.application-form.AdminApplicationForm.toast.validation_error.label') }}\n \n
\n {{ $i18next.t('modules.application-form-management.application-form.AdminApplicationForm.toast.validation_error.help') }}\n

\n \n
","
\n \n \n \n \n \n \n \n \n \n \n
","
\n \n \n

\n {{ $i18next.t(`modules.form-template-management.FormTemplateManagement.panel_title.routes.${mixin_router_extractLocalizedRouteName($route.name)}`) }}\n

\n \n \n \n \n
\n
","import i18next from 'i18next';\nimport merge from 'deepmerge'\n\nexport enum LOCALES {\n FR = 'fr'\n}\n\nexport enum MOMENT_LOCALES {\n FR = 'fr-ca'\n}\n\nconst DEFAULT_NAMESPACE: string = 'localization'\nconst CURRENT_LOCALE: LOCALES = localStorage.getItem('locale') as LOCALES || LOCALES.FR\n\nfunction getFromDottedNotation(object: { [key: string]: any }, properties: string): any {\n const propertiesArray: string[] = properties.split('.')\n\n for (let i: number = 0; i < propertiesArray.length; i++) {\n const property: string = propertiesArray[i]\n\n if ((object != null) && (typeof (object) === 'object') && Object.prototype.hasOwnProperty.call(object, property)) {\n object = object[property]\n } else {\n return undefined\n }\n }\n\n return object\n}\n\nconst getTranslations = (): any => {\n const translations: any = {}\n const context: any = require.context('../', true, /.*?(?=\\.lang\\.).*?\\.json/)\n\n context.keys().forEach((filePath: string) => {\n const pathParameters: string[] = filePath.split('/').filter((el: string) => !(el === '.'))\n const translationTree: { [key: string]: object } = {}\n\n pathParameters.forEach((pathParameter: string, index: number) => {\n if (pathParameter.includes('.lang')) {\n const treeParameterPath: string = pathParameters.slice(0, index).join('.')\n const obj: any = getFromDottedNotation(translationTree, treeParameterPath) || translationTree\n obj[pathParameter.split('.')[0]] = context(filePath)\n\n const lang: string = pathParameter.substring(\n pathParameter.lastIndexOf('lang.') + 5,\n pathParameter.lastIndexOf('.json')\n )\n\n translations[lang] = merge(translations[lang], translationTree)\n } else if (index === 0) {\n const treeParameterPath: string = pathParameters.slice(0, index + 1).join('.')\n translationTree[treeParameterPath] = {}\n } else {\n const treeParameterPath: string = pathParameters.slice(0, index).join('.')\n const obj: any = getFromDottedNotation(translationTree, treeParameterPath)\n obj[pathParameter] = {}\n }\n })\n })\n\n return translations\n}\n\ni18next\n .init({\n lng: localStorage.getItem('locale') || LOCALES.FR,\n fallbackLng: LOCALES.FR,\n ns: DEFAULT_NAMESPACE,\n defaultNS: DEFAULT_NAMESPACE\n })\n\nconst translations: any = getTranslations()\n\nObject.entries(translations).forEach(([locale, resources]: any) => {\n i18next.addResourceBundle(locale, DEFAULT_NAMESPACE, resources)\n})\n\nexport default {\n CURRENT_LOCALE,\n LOCALES,\n MOMENT_LOCALES,\n i18next\n}","enum ROUTES {\n DEFAULT = 'default',\n LOGIN = 'login',\n ERROR = 'error',\n WILDCARD = 'wildcard',\n DASHBOARD = \"home\",\n USER_MANAGEMENT_USER_LIST = 'userManagementList',\n USER_MANAGEMENT_USER_CREATION = 'userManagementCreation',\n USER_MANAGEMENT_USER_UPDATE = 'userManagementUpdate',\n CATEGORY_MANAGEMENT_CATEGORY_LIST = 'categoryManagementList',\n CATEGORY_MANAGEMENT_CATEGORY_CREATION = 'categoryManagementCreation',\n CATEGORY_MANAGEMENT_CATEGORY_UPDATE = 'categoryManagementUpdate',\n CATEGORY_MANAGEMENT_CATEGORY_EVALUATION_CARD_DEPOSIT = 'categoryManagementEvaluationCardDeposit',\n EMAIL_TEMPLATE_MANAGEMENT_EMAIL_TEMPLATE_LIST = 'emailTemplateManagementList',\n EMAIL_TEMPLATE_MANAGEMENT_EMAIL_TEMPLATE_UPDATE = 'emailTemplateManagementUpdate',\n FORM_TEMPLATE_MANAGEMENT = 'formTemplateManagement',\n FORM_TEMPLATE_MANAGEMENT_FORM_TEMPLATE_UPDATE = 'formTemplateManagementUpdate',\n FORM_TEMPLATE_MANAGEMENT_FORM_TEMPLATE_PREVIEW = 'formTemplateManagementPreview',\n ADMIN_APPLICATION_FORM_MANAGEMENT = 'adminApplicationFormManagement',\n ADMIN_APPLICATION_FORM = \"adminApplicationForm\",\n APPLICATION_FORM = \"applicationForm\",\n APPLICATION_FORM_CREATION = \"applicationFormCreation\",\n APPLICATION_FORM_SUPPORT = 'applicationFormSupport',\n ADMIN_APPLICATION_FORM_SUPPORT = 'adminApplicationFormSupport',\n ADMIN_APPLICATION_FORM_SUPPORT_MANAGEMENT = 'adminApplicationFormSupportManagement',\n ADMIN_APPLICATION_FORM_VALIDATION_MANAGEMENT = 'adminApplicationFormValidationManagement',\n ADMIN_APPLICATION_FORM_VALIDATION_FORM = 'adminApplicationFormValidationForm',\n EVALUATOR_MANAGEMENT_LIST = 'evaluatorManagmentList',\n EVALUATOR_MANAGEMENT_CREATION = 'evaluatorManagmentCreation',\n EVALUATOR_MANAGEMENT_UPDATE = 'evaluatorManagmentUpdate',\n EVALUATOR_MANAGEMENT_EVALUATOR_TOOLBOX_FILE_DEPOSIT = 'evaluatorManagementEvaluatorToolboxFileDeposit',\n EVALUATOR_APPLICATION_FORM_DISPLAY = 'evaluatorApplicationFormDisplay',\n EVALUATOR_APPLICATION_FORM_SUPPORT_DISPLAY = 'evaluatorApplicationFormSupportDisplay',\n YEAR_CONFIGURATION_MANAGEMENT_LIST = 'yearConfigurationManagementList',\n YEAR_CONFIGURATION_MANAGEMENT_UPDATE = 'yearConfigurationManagementUpdate',\n PUBLIC_FORM_TEMPLATE_PREVIEW = 'publicFormTemplatePreview'\n}\n\nexport default ROUTES","import { RouteConfig } from \"vue-router\";\nimport { RouteConfigSingleView } from \"vue-router/types/router\";\n\nimport Localization, { LOCALES } from '@/localization'\n\nconst ROUTE_LOCALE_DELIMITER: string = '|'\n\nexport const META_KEY_HIDDEN_BREADCRUMB: string = 'hidden_breadcrumb'\nexport const META_KEY_ADDITIONAL_BREADCRUMBS: string = 'additional_breadcrumb'\nexport const META_KEY_LOCALE: string = 'locale'\nexport const META_KEY_IS_BREADCRUMB_HOME_PUBLIC_ZONE: string = 'breadcrumb_home_public_zone'\nexport const META_KEY_DISPLAY_PUBLIC_NAVIGATION_BAR: string = \"breadcrumb_display_navigation_bar\"\n\nexport interface ILocalizedRouteParameters {\n name: string;\n locale: LOCALES;\n}\n\nexport function generateLocalizedRouteName(parameters: ILocalizedRouteParameters): string {\n return `${parameters.name}${ROUTE_LOCALE_DELIMITER}${parameters.locale}`\n}\n\nexport function extractLocalizedRouteParameters(name: string): ILocalizedRouteParameters {\n const routeParameters: string[] = name.split(ROUTE_LOCALE_DELIMITER)\n\n return {\n name: routeParameters[0],\n locale: routeParameters[1] as LOCALES\n }\n}\n\nfunction generateLocalizedRoutePath(name: string, locale: LOCALES = LOCALES.FR): string {\n return Localization.i18next.t(`router.routes.${name}`, { lng: locale })\n}\n\nexport function localizeBreadcrumbs(locale: LOCALES, breadcrumbs?: Array): Array | null {\n if (!breadcrumbs) {\n return null\n }\n\n return breadcrumbs.map((breadcrumb: string) => {\n return generateLocalizedRouteName({\n name: breadcrumb, \n locale\n })\n })\n}\n\nfunction localizeRouteConfigChildrenRecursive(childrens: Array | undefined, locale: LOCALES = LOCALES.FR): Array | undefined {\n if (!childrens) {\n return undefined\n }\n\n return childrens.reduce((routes: Array, children: RouteConfig) => {\n return [\n ...routes,\n {\n name: generateLocalizedRouteName({\n name: children.name as string,\n locale\n }),\n path: generateLocalizedRoutePath(children.name as string, locale),\n component: (children as RouteConfigSingleView).component,\n meta: {\n ...children.meta,\n [META_KEY_ADDITIONAL_BREADCRUMBS]: localizeBreadcrumbs(locale, children.meta ? children.meta[META_KEY_ADDITIONAL_BREADCRUMBS] : undefined),\n [META_KEY_LOCALE]: locale\n },\n children: localizeRouteConfigChildrenRecursive(children.children, locale)\n } as RouteConfig\n ]\n }, [])\n}\n\nfunction localizeRouteConfig(config: RouteConfig): Array {\n return Object.values(Localization.LOCALES).reduce((routes: Array, locale: LOCALES) => {\n return [\n ...routes,\n {\n name: generateLocalizedRouteName({\n name: config.name as string,\n locale\n }),\n path: generateLocalizedRoutePath(config.name as string, locale),\n component: (config as RouteConfigSingleView).component,\n meta: {\n ...config.meta,\n [META_KEY_ADDITIONAL_BREADCRUMBS]: localizeBreadcrumbs(locale, config.meta ? config.meta[META_KEY_ADDITIONAL_BREADCRUMBS] : undefined),\n [META_KEY_LOCALE]: locale\n },\n children: localizeRouteConfigChildrenRecursive(config.children, locale)\n } as RouteConfig\n ]\n }, [])\n}\n\nexport default function localizeRouteConfigs(originalRoutes: Array): Array {\n return originalRoutes.reduce((routes: Array, route: RouteConfig) => {\n return [\n ...routes,\n ...localizeRouteConfig(route)\n ]\n }, [])\n}","enum CONSTANTS {\n DEFAULT_LOADING_STATE_TIMEOUT_VALUE = 500,\n LOCAL_STORAGE_REMEMBERED_ROUTE = 'remembered-route'\n}\n\nexport default CONSTANTS","import Component, { mixins } from 'vue-class-component'\n\nimport { AxiosError, AxiosResponse } from 'axios';\nimport HttpStatusCode from 'http-status-codes'\n\nimport WithRender from './App.html'\n\nimport Localization from '@/localization';\nimport ROUTES from './router/ROUTES';\nimport { generateLocalizedRouteName } from '@/router/helpers';\nimport { STORE_ACTIONS, STORE_GETTERS } from './store';\nimport { TOKEN_LOCAL_STORAGE_KEY } from './modules/session/Session.store';\nimport CONSTANTS from './CONSTANTS';\n\nconst HTTP_STATUS_TO_REDIRECT: string[] = [\n HttpStatusCode.INTERNAL_SERVER_ERROR.toString(),\n HttpStatusCode.FORBIDDEN.toString(),\n HttpStatusCode.UNAUTHORIZED.toString()\n]\nconst HTTP_STATUS_NOT_LOGGED_IN: string[] = [\n HttpStatusCode.FORBIDDEN.toString(),\n HttpStatusCode.UNAUTHORIZED.toString()\n]\n\n@WithRender\n@Component\nexport default class App extends mixins() {\n private created(): void {\n this.initializeAxiosInterceptors()\n\n this.$store.dispatch(STORE_ACTIONS.SESSION_STORE_SYNCHRONISE_WITH_LOCAL_STORAGE)\n this.setAxiosBasicHeaders()\n }\n\n private mounted(): void {\n document.title = this.$i18next.t('localization.main.website_title')\n \n }\n\n private updated(): void {\n this.$store.dispatch(STORE_ACTIONS.SESSION_STORE_SYNCHRONISE_WITH_LOCAL_STORAGE)\n this.setAxiosBasicHeaders()\n }\n\n private setAxiosBasicHeaders(): void {\n const sessionToken: string | null = localStorage.getItem(TOKEN_LOCAL_STORAGE_KEY)\n\n if (sessionToken) {\n this.$axios.defaults.headers.common.Authorization = `Bearer ${sessionToken}`\n }\n }\n\n private initializeAxiosInterceptors(): void {\n this.$axios.interceptors.response.use((response: AxiosResponse) => {\n return response\n }, (error: AxiosError) => {\n if (!error.response) {\n this.mixin_router_navigate({\n name: ROUTES.ERROR,\n query: {\n token: this.$route.params.token\n }\n })\n } else if (\n this.$route.name !== generateLocalizedRouteName({\n name: ROUTES.LOGIN,\n locale: Localization.CURRENT_LOCALE\n }) && \n error.response && \n error.response.status && \n HTTP_STATUS_TO_REDIRECT.includes(error.response.status.toString())\n ) {\n if (\n HTTP_STATUS_NOT_LOGGED_IN.includes(error.response.status.toString()) &&\n this.mixin_string_isEmpty(this.$store.getters[STORE_GETTERS.SESSION_GET_TOKEN])\n ) {\n this.setLocalStorageRememberedRoute()\n\n this.$store.dispatch(STORE_ACTIONS.SESSION_STORE_LOGOUT)\n this.mixin_router_navigate({\n name: ROUTES.LOGIN\n })\n\n return null\n } else if (error.response.data && error.response.data.validation) {\n if (error.response.data.validation.expired_token) {\n this.setLocalStorageRememberedRoute()\n\n this.$store.dispatch(STORE_ACTIONS.SESSION_STORE_LOGOUT)\n this.mixin_router_navigate({\n name: ROUTES.LOGIN\n })\n\n return null\n } else if (error.response.data.validation.user_not_an_evaluator) {\n return Promise.reject(error)\n }\n } else {\n this.mixin_router_redirectRequestError(error)\n }\n }\n\n return Promise.reject(error)\n })\n }\n\n private setLocalStorageRememberedRoute(): void {\n localStorage.setItem(\n CONSTANTS.LOCAL_STORAGE_REMEMBERED_ROUTE, \n JSON.stringify({\n name: this.$route.name,\n params: this.$route.params,\n query: this.$route.query\n }) \n )\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './UserProfileMenu.html'\n\nimport { \n MButton,\n MButtonSkin,\n MIcon,\n MIconButton,\n MPopup\n} from '@ulaval/modul-components'\n\nimport { STORE_ACTIONS, STORE_GETTERS } from '@/store'\nimport ROUTES from '@/router/ROUTES'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MIcon,\n MIconButton,\n MPopup\n }\n})\nexport default class UserProfileMenu extends mixins() {\n private readonly MButtonSkin: any = MButtonSkin\n\n private get userFullNameWithUsername(): string {\n return this.$store.getters[STORE_GETTERS.SESSION_GET_USER_FULL_NAME_WITH_USERNAME]\n }\n\n private get userEmail(): string {\n return this.$store.getters[STORE_GETTERS.SESSION_GET_EMAIL]\n }\n\n private onLogoutOptionClick(): void {\n this.$store.dispatch(STORE_ACTIONS.SESSION_STORE_LOGOUT)\n this.mixin_router_navigate({\n name: ROUTES.DEFAULT\n })\n }\n}\n","enum ROLES {\n ADMINISTRATOR = 'administrator',\n GESTIONNAIRE_CATEGORIE = 'gestionnaire-categorie',\n GESTIONNAIRE_GABARIT_COURRIEL = 'gestionnaire-gabarit-courriel',\n GESTIONNAIRE_GABARIT_FORMULAIRE = 'gestionnaire-gabarit-formulaire',\n GESTIONNAIRE_CANDIDATURE = 'gestionnaire-candidature',\n GESTIONNAIRE_APPUI_CANDIDATURE = 'gestionnaire-appui-candidature',\n GESTIONNAIRE_VALIDATION_CANDIDATURE = 'gestionnaire-validation-candidature',\n GESTIONNAIRE_EVALUATEUR = 'gestionnaire-evaluateur',\n GESTIONNAIRE_SECTION_PUBLIQUE = 'gestionnaire-section-publique'\n}\n\nexport default ROLES","import Component, { mixins } from 'vue-class-component'\n\nimport ROLES from '../session/ROLES'\n\n@Component\nexport default class UserRoleMixin extends mixins() {\n protected get mixin_userrole_hasGestionnaireGabaritFormulaireRole(): boolean {\n return this.mixin_session_userHasRole(ROLES.GESTIONNAIRE_GABARIT_FORMULAIRE)\n }\n\n protected get mixin_userrole_hasAdministratorRole(): boolean {\n return this.mixin_session_userHasRole(ROLES.ADMINISTRATOR)\n }\n\n protected get mixin_userrole_hasGestionnaireCategorieRole(): boolean {\n return this.mixin_session_userHasRole(ROLES.GESTIONNAIRE_CATEGORIE)\n }\n\n protected get mixin_userrole_hasGestionnaireGabaritCourrielRole(): boolean {\n return this.mixin_session_userHasRole(ROLES.GESTIONNAIRE_GABARIT_COURRIEL)\n }\n\n protected get mixin_userrole_hasGestionnaireCandidatureRole(): boolean {\n return this.mixin_session_userHasRole(ROLES.GESTIONNAIRE_CANDIDATURE)\n }\n\n protected get mixin_userrole_hasGestionnaireAppuiCandidatureRole(): boolean {\n return this.mixin_session_userHasRole(ROLES.GESTIONNAIRE_APPUI_CANDIDATURE)\n }\n\n protected get mixin_userrole_hasGestionnaireValidationCandidatureRole(): boolean {\n return this.mixin_session_userHasRole(ROLES.GESTIONNAIRE_VALIDATION_CANDIDATURE)\n }\n\n protected get mixin_userrole_hasGestionnaireEvaluateurRole(): boolean {\n return this.mixin_session_userHasRole(ROLES.GESTIONNAIRE_EVALUATEUR)\n }\n\n protected get mixin_userrole_hasGestionnaireSectionPubliqueRole(): boolean {\n return this.mixin_session_userHasRole(ROLES.GESTIONNAIRE_SECTION_PUBLIQUE)\n }\n}","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './AdministratorMenu.html'\n\nimport { \n MButton,\n MButtonSkin,\n MIcon,\n MIconButton,\n MPopup\n} from '@ulaval/modul-components'\n\nimport ROUTES from '@/router/ROUTES'\nimport UserRoleMixin from '@/modules/user-management/UserRole.mixin'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MIcon,\n MIconButton,\n MPopup\n }\n})\nexport default class AdministratorMenu extends mixins(UserRoleMixin) {\n private readonly MButtonSkin: any = MButtonSkin\n\n private onManageUsersOptionClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.USER_MANAGEMENT_USER_LIST\n })\n }\n\n private onManageCategoriesOptionClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.CATEGORY_MANAGEMENT_CATEGORY_LIST\n })\n }\n\n private onManageEmailTemplatesOptionClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.EMAIL_TEMPLATE_MANAGEMENT_EMAIL_TEMPLATE_LIST\n })\n }\n\n private onManageApplicationFormsOptionClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.ADMIN_APPLICATION_FORM_MANAGEMENT\n })\n }\n\n private onManageApplicationFormSupportsOptionClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.ADMIN_APPLICATION_FORM_SUPPORT_MANAGEMENT\n })\n }\n\n private onManageApplicationFormValidationsOptionClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.ADMIN_APPLICATION_FORM_VALIDATION_MANAGEMENT\n })\n }\n\n private onManageEvaluatorsOptionClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.EVALUATOR_MANAGEMENT_LIST\n })\n }\n\n private onManageYearConfigurationsOptionClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.YEAR_CONFIGURATION_MANAGEMENT_LIST\n })\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './NavigationBar.html'\n\nimport { \n MButton,\n MButtonSkin,\n} from '@ulaval/modul-components'\n\nimport UserProfileMenu from './UserProfileMenu'\nimport AdministratorMenu from './AdministratorMenu'\n\nimport ROUTES from '@/router/ROUTES'\nimport { STORE_GETTERS } from '@/store'\nimport UserRoleMixin from '@/modules/user-management/UserRole.mixin'\nimport { META_KEY_DISPLAY_PUBLIC_NAVIGATION_BAR } from '@/router/helpers'\nimport { RouteMeta } from 'vue-router'\n\n@WithRender\n@Component({\n components: {\n AdministratorMenu,\n MButton,\n UserProfileMenu\n }\n})\nexport default class NavigationBar extends mixins(UserRoleMixin) {\n private readonly MButtonSkin: object = MButtonSkin\n\n private get applicationHomePageLink(): string {\n if (this.isLoggedIn) {\n return this.mixin_router_generateHref({\n name: ROUTES.DASHBOARD\n })\n }\n \n return this.mixin_router_generateHref({\n name: ROUTES.DEFAULT\n })\n }\n\n private get isLoggedIn(): boolean {\n return this.$store.getters[STORE_GETTERS.SESSION_GET_IS_LOGGED_IN]\n }\n\n private get displayAdministratorMenu(): boolean {\n return this.mixin_userrole_hasAdministratorRole ||\n this.mixin_userrole_hasGestionnaireCategorieRole ||\n this.mixin_userrole_hasGestionnaireGabaritCourrielRole ||\n this.mixin_userrole_hasGestionnaireCandidatureRole ||\n this.mixin_userrole_hasGestionnaireAppuiCandidatureRole\n }\n\n private get isNavigationBarInPublicMode(): boolean {\n const meta: RouteMeta = this.$route.meta || []\n \n return !!meta[META_KEY_DISPLAY_PUBLIC_NAVIGATION_BAR]\n }\n\n private onLoginButtonClick(): void {\n if (this.isLoggedIn) {\n this.mixin_router_navigate({\n name: ROUTES.DASHBOARD\n })\n } else {\n this.mixin_router_navigate({\n name: ROUTES.LOGIN\n })\n }\n }\n\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './YearConfigurationDescriptionAreaPanel.html'\n\nimport { \n MPanel\n} from '@ulaval/modul-components'\n\nimport { IYearConfigurationModel } from '../YearConfiguration.model'\nimport { IYearModel } from '@/modules/global/year/Year.model'\n\n\n@WithRender\n@Component({\n components: {\n MPanel\n }\n})\nexport default class YearConfigurationDescriptionAreaPanel extends mixins() {\n @Prop({ required: true })\n private yearConfiguration!: IYearConfigurationModel\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Prop({ \n required: false, \n default: false \n })\n private isPreview!: boolean\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './YearConfigurationHelpAreaPanel.html'\n\nimport { \n MPanel\n} from '@ulaval/modul-components'\n\nimport { IYearConfigurationModel } from '../YearConfiguration.model'\nimport { IYearModel } from '@/modules/global/year/Year.model'\n\n\n@WithRender\n@Component({\n components: {\n MPanel\n }\n})\nexport default class YearConfigurationHelpAreaPanel extends mixins() {\n @Prop({ required: true })\n private yearConfiguration!: IYearConfigurationModel\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Prop({ \n required: false, \n default: false \n })\n private isPreview!: boolean\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './PublicCategoryCard.html'\n\nimport {\n MIcon,\n MLink,\n MPanel\n} from '@ulaval/modul-components'\n\nimport { ICategoryModel } from '../Category.model'\nimport ROUTES from '@/router/ROUTES'\n\n@WithRender\n@Component({\n components: {\n MIcon,\n MLink,\n MPanel\n }\n})\nexport default class PublicCategoryCard extends mixins() {\n @Prop({ required: true })\n private category!: ICategoryModel\n\n private get isApplicationFormDepositTimestampOverThreshold(): boolean {\n return this.$moment(this.category.application_deposit_limit_timestamp).isBefore()\n }\n\n private onCategoryTitleClick(): void {\n this.displayFormTemplatePublicPreview()\n }\n\n private displayFormTemplatePublicPreview(): void {\n this.mixin_router_navigate({\n name: ROUTES.PUBLIC_FORM_TEMPLATE_PREVIEW,\n params: {\n idCategory: this.category.id\n }\n })\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './YearConfigurationCategorySectionsPanel.html'\n\nimport { \n MButton,\n MPanel\n} from '@ulaval/modul-components'\n\nimport PublicCategoryCard from '@/modules/category-management/category/PublicCategoryCard'\n\nimport { IYearConfigurationModel } from '../YearConfiguration.model'\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport { generateLocalizedRouteName } from '@/router/helpers'\nimport ROUTES from '@/router/ROUTES'\nimport localization from '@/localization'\nimport { ICategoryModel } from '@/modules/category-management/Category.model'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MPanel,\n PublicCategoryCard\n }\n})\nexport default class YearConfigurationCategorySectionsPanel extends mixins() {\n @Prop({ required: true })\n private yearConfiguration!: IYearConfigurationModel\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Prop({ \n required: false, \n default: false \n })\n private isPreview!: boolean\n\n private get isCreateApplicationFormButtonAvailable(): boolean {\n return this.$route.name === generateLocalizedRouteName({\n name: ROUTES.DEFAULT,\n locale: localization.CURRENT_LOCALE\n })\n }\n\n private onCreateApplicationFormButtonClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.APPLICATION_FORM_CREATION\n })\n }\n\n private sortCategories(categories: Array): Array {\n return Array.from(categories).sort((leftHandSide: ICategoryModel, rightHandSide: ICategoryModel) => leftHandSide.sort_order - rightHandSide.sort_order)\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './YearConfigurationLayout.html'\n\nimport YearConfigurationDescriptionAreaPanel from './YearConfigurationDescriptionAreaPanel'\nimport YearConfigurationHelpAreaPanel from './YearConfigurationHelpAreaPanel'\nimport YearConfigurationCategorySectionsPanel from './YearConfigurationCategorySectionsPanel'\n\nimport { IYearConfigurationModel } from '../YearConfiguration.model'\nimport { IYearModel } from '@/modules/global/year/Year.model'\n\n@WithRender\n@Component({\n components: {\n YearConfigurationCategorySectionsPanel,\n YearConfigurationDescriptionAreaPanel,\n YearConfigurationHelpAreaPanel\n }\n})\nexport default class YearConfigurationLayout extends mixins() {\n @Prop({ required: true })\n private yearConfiguration!: IYearConfigurationModel\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Prop({ \n required: false, \n default: false \n })\n private isPreview!: boolean\n}\n","import Component, { mixins } from \"vue-class-component\";\n\nimport { EventBus, EVENT_BUS_EVENTS } from \"./Events\";\n\nexport interface IPaginationQueryParameters {\n page?: number;\n limit?: number;\n}\n\n@Component\nexport default class BaseService extends mixins() {\n protected service_baseService_generateFilterQuery(filters: object): string {\n return Object.entries(filters).reduce((queryParameters: string[], [ attribute, value ]: string[]) => {\n if (value) {\n if (Array.isArray(value)) {\n value = value.join(',')\n } else if (typeof value === 'object') {\n value = this.service_baseService_generateObjectFilter(value)\n }\n\n return [\n ...queryParameters,\n `${attribute}=${value}`\n ]\n }\n\n return queryParameters\n }, []).join('&')\n }\n\n protected service_baseService_generateObjectFilter(object: object): string {\n return Object.entries(object).reduce((queryParameters: string[], [ attribute, value ]: string[]) => {\n if (value) {\n return [\n ...queryParameters,\n `${attribute},${value}`\n ]\n }\n\n return queryParameters\n }, []).join(';')\n }\n\n protected service_baseService_emitEventBusEvent(event: EVENT_BUS_EVENTS, payload: any): void {\n EventBus.$emit(event, payload)\n }\n\n protected service_baseService_multipartFormDataHeader(): object {\n return {\n 'Content-Type': 'multipart/form-data'\n }\n }\n}","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\nimport BaseService from \"../global/utilities/Base.service\";\nimport { IYearConfigurationModel } from \"./YearConfiguration.model\";\nimport { EVENT_BUS_EVENTS } from \"../global/utilities/Events\";\nimport { ICategoryModel } from \"../category-management/Category.model\";\nimport { IYearModel } from \"../global/year/Year.model\";\n\nexport interface IYearConfigurationUpdateForm {\n public_area_description_zone: string;\n public_area_help_zone: string;\n public_area_description_zone_title: string;\n public_area_help_zone_title: string;\n is_public_area_available: boolean;\n category_sections: Array<{\n id?: string;\n title: string;\n categories_id: Array;\n }>;\n}\n\nexport interface IPublicYearConfigurationResponse {\n year_configuration: IYearConfigurationModel;\n year: IYearModel;\n}\n\n@Component\nexport default class YearConfigurationService extends BaseService {\n protected service_yearConfigurationService_adminFetchYearConfiguration(yearId: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/years/${yearId}/configurations`)\n .then((response: AxiosResponse) => resolve(response.data.data.year_configuration))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_yearConfigurationService_publicFetchYearConfiguration(): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/public/year-configuration`)\n .then((response: AxiosResponse) => resolve(response.data.data))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_yearConfigurationService_update(yearConfigurationId: string, payload: IYearConfigurationUpdateForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/years/configurations/${yearConfigurationId}`, payload)\n .then((response: AxiosResponse) => {\n const updatedYearConfiguration: IYearConfigurationModel = response.data.data.year_configuration\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.YEAR_CONFIGURATION_UPDATED, updatedYearConfiguration)\n\n resolve(updatedYearConfiguration)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_yearConfigurationService_fetchAvailableCategories(yearId: string): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/years/${yearId}/configurations/available-categories`)\n .then((response: AxiosResponse) => resolve(response.data.data.categories))\n .catch((error: AxiosError) => reject(error))\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './PublicYearConfiguration.html'\n\nimport { \n MSpinner,\n MMessage,\n MMessageSkin,\n MMessageState\n} from '@ulaval/modul-components'\n\nimport YearConfigurationLayout from './YearConfigurationLayout'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport { IYearConfigurationModel } from '../YearConfiguration.model'\nimport YearConfigurationService, { IPublicYearConfigurationResponse } from '../YearConfiguration.service'\nimport CONSTANTS from '@/CONSTANTS'\n\n@WithRender\n@Component({\n components: {\n MMessage,\n MSpinner,\n YearConfigurationLayout\n }\n})\nexport default class PublicYearConfiguration extends mixins(YearConfigurationService) {\n private year: IYearModel | null = null\n private yearConfiguration: IYearConfigurationModel | null = null\n private isLoadingStateActive: boolean = false\n private requestErrors: { [key: string]: boolean } = {}\n\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MMessageState: object = MMessageState\n\n private created(): void {\n this.loadYearConfiguration()\n }\n\n private loadYearConfiguration(): void {\n const loadingStateActivationTimeout: any = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n\n this.service_yearConfigurationService_publicFetchYearConfiguration()\n .then((response: IPublicYearConfigurationResponse) => {\n this.yearConfiguration = response.year_configuration || null\n this.year = response.year || null\n }).catch((error: AxiosError) => {\n if (error.response) {\n if (error.response.data && error.response.data.validation) {\n this.requestErrors = error.response.data.validation\n }\n }\n\n if (Object.keys(this.requestErrors).length === 0) {\n this.mixin_router_redirectRequestError(error)\n }\n }).finally(() => {\n clearTimeout(loadingStateActivationTimeout)\n this.isLoadingStateActive = false\n })\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './PublicArea.html'\n\nimport PublicYearConfiguration from '@/modules/year-configuration-management/year-configuration/PublicYearConfiguration'\n\nimport { generateLocalizedRouteName } from '@/router/helpers'\nimport ROUTES from '@/router/ROUTES'\nimport localization from '@/localization'\n\n@WithRender\n@Component({\n components: {\n PublicYearConfiguration\n }\n})\nexport default class PublicArea extends mixins() {\n private get isFormTemplatePreviewActive(): boolean {\n return this.$route.name === generateLocalizedRouteName({\n name: ROUTES.PUBLIC_FORM_TEMPLATE_PREVIEW,\n locale: localization.CURRENT_LOCALE\n })\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './DefaultLayout.html'\n\nimport NavigationBar from '@/modules/global/navigation-bar/NavigationBar'\nimport PublicArea from '@/modules/public-area/PublicArea'\n\nimport { generateLocalizedRouteName } from '@/router/helpers'\nimport localization from '@/localization'\nimport ROUTES from '@/router/ROUTES'\n\n@WithRender\n@Component({\n components: {\n NavigationBar,\n PublicArea\n }\n})\nexport default class DefaultLayout extends mixins() {\n private get displayPublicZone(): boolean {\n return this.$route.name === generateLocalizedRouteName({\n name: ROUTES.DEFAULT,\n locale: localization.CURRENT_LOCALE\n })\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport HttpStatusCode from 'http-status-codes'\n\nimport WithRender from './ErrorPage.html'\n\nimport { \n MErrorAccessDenied,\n MErrorPageNotFound,\n MErrorResourceUnavailable,\n MErrorTechnicalDifficulty\n} from '@ulaval/modul-components'\n\nconst MANAGED_STATUSES: Array = [\n HttpStatusCode.NOT_FOUND.toString(),\n HttpStatusCode.UNAUTHORIZED.toString(),\n HttpStatusCode.FORBIDDEN.toString(),\n HttpStatusCode.INTERNAL_SERVER_ERROR.toString()\n]\n\n@WithRender\n@Component({\n components: {\n MErrorAccessDenied,\n MErrorPageNotFound,\n MErrorResourceUnavailable,\n MErrorTechnicalDifficulty\n }\n})\nexport default class ErrorPage extends mixins() {\n private get status(): string {\n const routeStatus: string = this.$route.params.status ? \n this.$route.params.status.toString() : \n HttpStatusCode.SERVICE_UNAVAILABLE.toString()\n\n return MANAGED_STATUSES.includes(routeStatus) ? \n routeStatus :\n HttpStatusCode.INTERNAL_SERVER_ERROR.toString()\n }\n\n private get errorPageComponent(): object {\n if (this.status) {\n if (this.status === HttpStatusCode.NOT_FOUND.toString()) {\n return MErrorPageNotFound\n } else if (\n this.status === HttpStatusCode.UNAUTHORIZED.toString() || \n this.status === HttpStatusCode.FORBIDDEN.toString()\n ) {\n return MErrorAccessDenied\n } else if (\n this.status === HttpStatusCode.INTERNAL_SERVER_ERROR.toString()\n ) {\n return MErrorTechnicalDifficulty\n }\n }\n\n return MErrorResourceUnavailable\n }\n\n private get hints(): string[] {\n return this.$i18next.t(`modules.global.error.ErrorPage.status.${this.status}.hints`, { returnObjects: true })\n }\n\n private get links(): string [] {\n return [\n ...this.$i18next.t(`modules.global.error.ErrorPage.status.${this.status}.links`, { returnObjects: true }),\n ...this.$i18next.t(`modules.global.error.ErrorPage.global_links`, {\n returnObjects: true\n })\n ]\n }\n\n private get title(): string {\n return this.$i18next.t(`modules.global.error.ErrorPage.status.${this.status}.title`)\n }\n}\n","import Component, { mixins } from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport store, { STORE_ACTIONS } from \"@/store\";\n\nexport interface IAuthenticateRequestPayload {\n username: string;\n password: string;\n}\n\nexport interface IAuthenticateRequestResponse {\n token: string;\n}\n\n@Component\nexport default class AuthenticationService extends mixins() {\n protected service_authenticationService_authenticate(requestPayload: IAuthenticateRequestPayload): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.post('/api/authenticate', requestPayload)\n .then((response: AxiosResponse) => {\n const requestResponse: IAuthenticateRequestResponse = response.data.data\n\n store.dispatch(STORE_ACTIONS.SESSION_STORE_LOGIN, requestResponse.token)\n\n resolve(requestResponse)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './AuthenticationForm.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MButton, \n MButtonType,\n MForm,\n MMessage,\n MTextfield, \n MTextfieldType,\n MTooltip,\n RequiredValidator\n} from '@ulaval/modul-components'\n\nimport AuthenticationService from '@/modules/authentication/Authentication.service';\n\nimport ROUTES from '@/router/ROUTES';\nimport { AxiosError } from 'axios';\nimport CONSTANTS from '@/CONSTANTS';\n\n@WithRender\n@Component({\n components: {\n MButton,\n MForm,\n MMessage,\n MTextfield,\n MTooltip\n }\n})\nexport default class AuthenticationForm extends mixins(AuthenticationService) {\n public formGroup: FormGroup = new FormGroup({\n username: new FormControl([\n RequiredValidator()\n ]),\n password: new FormControl([RequiredValidator()])\n })\n private isAuthenticationLoadingStateActive: boolean = false\n private requestErrors: { [key: string]: boolean } = {}\n\n private readonly MTextfieldType: object = MTextfieldType\n private readonly MButtonType: object = MButtonType\n private readonly AUTHENTICATION_LOADING_STATE_TIMEOUT: number = 500\n private readonly ERROR_KEY_INVALID_CREDENTIALS: string = 'invalid_credentials'\n\n private get usernameField(): AbstractControl {\n return this.formGroup.getControl('username');\n }\n private get passwordField(): AbstractControl {\n return this.formGroup.getControl('password');\n }\n\n private authenticate(): void {\n const authenticationLoadingStateTimeout: NodeJS.Timeout = setTimeout(() => {\n this.isAuthenticationLoadingStateActive = true\n }, this.AUTHENTICATION_LOADING_STATE_TIMEOUT)\n\n this.service_authenticationService_authenticate({\n username: this.usernameField.value,\n password: this.passwordField.value\n }).then(() => {\n const rememberedRoute: string | null = localStorage.getItem(CONSTANTS.LOCAL_STORAGE_REMEMBERED_ROUTE)\n\n if (!this.mixin_string_isEmpty(rememberedRoute) && rememberedRoute) {\n this.$router.push(JSON.parse(rememberedRoute))\n } else {\n this.mixin_router_navigate({\n name: ROUTES.DASHBOARD\n })\n }\n }).catch((error: AxiosError) => {\n if (error.response && error.response.data && error.response.data.validation) {\n this.requestErrors = {\n ...this.requestErrors,\n ...error.response.data.validation\n }\n } else {\n this.requestErrors = {}\n }\n }).finally(() => {\n clearTimeout(authenticationLoadingStateTimeout)\n this.isAuthenticationLoadingStateActive = false\n })\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './LoginPage.html'\n\nimport { \n MPanel\n} from '@ulaval/modul-components'\n\nimport AuthenticationForm from '@/modules/authentication/form/AuthenticationForm'\nimport { STORE_GETTERS } from '@/store'\nimport ROUTES from '@/router/ROUTES'\n\n@WithRender\n@Component({\n components: {\n AuthenticationForm,\n MPanel\n }\n})\nexport default class LoginPage extends mixins() {\n private mounted(): void {\n if (this.$store.getters[STORE_GETTERS.SESSION_GET_IS_LOGGED_IN]) {\n this.mixin_router_navigate({\n name: ROUTES.DASHBOARD\n })\n }\n }\n}\n","import Component from 'vue-class-component'\n\nimport {\n MOptionItemPredefined,\n} from '@ulaval/modul-components'\n\n\n@Component({})\nexport default class SoftDeleteItemOption extends MOptionItemPredefined {\n protected get iconName(): string {\n return 'm-svg__folder-open'\n }\n\n protected get label(): string {\n return this.$i18next.t('modules.global.components.option-item.SoftDeleteItemOption.label')\n }\n}\n","import Component from 'vue-class-component'\n\nimport {\n MOptionItemPredefined,\n} from '@ulaval/modul-components'\n\n\n@Component({})\nexport default class RestoreItemOption extends MOptionItemPredefined {\n protected get iconName(): string {\n return 'm-svg__arrow-return'\n }\n\n protected get label(): string {\n return this.$i18next.t('modules.global.components.option-item.RestoreItemOption.label')\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './ApplicationFormSupportForm.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MIconButton,\n MIconButtonSkin,\n MTextfield,\n MTextfieldType,\n MForm,\n RequiredValidator,\n EmailValidator,\n} from '@ulaval/modul-components'\nimport { Prop } from 'vue-property-decorator'\n\nexport interface IApplicationFormSupportFormPayloadData {\n supporter_name: string;\n supporter_email: string;\n}\n\nexport enum ApplicationFormSupportForm_EVENTS {\n ADD_ICON_CLICK = 'add-icon:click',\n DELETE_ICON_CLICK = 'delete-icon:click'\n}\n\n@WithRender\n@Component({\n components: {\n MForm,\n MIconButton,\n MTextfield,\n }\n})\nexport default class ApplicationFormSupportForm extends mixins() {\n public formGroup: FormGroup = new FormGroup({\n supporterName: new FormControl([RequiredValidator()]),\n supporterEmail: new FormControl([RequiredValidator(), EmailValidator()]),\n })\n\n private readonly MIconButtonSkin: object = MIconButtonSkin\n private readonly MTextfieldType: object = MTextfieldType\n\n @Prop({ default: false })\n private isAddIconDisplayed!: boolean\n\n @Prop({ default: false })\n private isDeleteIconDisplayed!: boolean\n\n @Prop({ default: false })\n private isAddIconColumnDisplayed!: boolean\n\n @Prop({ default: false })\n private isDeleteIconColumnDisplayed!: boolean\n\n public get supporterNameField(): AbstractControl {\n return this.formGroup.getControl('supporterName');\n }\n\n public get supporterEmailField(): AbstractControl {\n return this.formGroup.getControl('supporterEmail');\n }\n\n public async getFormPayload(): Promise {\n await this.formGroup.submit()\n\n if (this.formGroup.hasErrorDeep()) {\n return null\n }\n\n const formPayloadData: IApplicationFormSupportFormPayloadData = {\n supporter_name: this.supporterNameField.value,\n supporter_email: this.supporterEmailField.value\n }\n\n return formPayloadData\n }\n\n private onAddIconClick(): void {\n this.$emit(ApplicationFormSupportForm_EVENTS.ADD_ICON_CLICK)\n }\n\n private onDeleteIconClick(): void {\n this.$emit(ApplicationFormSupportForm_EVENTS.DELETE_ICON_CLICK)\n }\n}\n","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport BaseService from \"../global/utilities/Base.service\";\nimport { IFormTemplateAvailableElementModel, IFormTemplateAvailableElementModelParameter, IFormTemplateElementModel, IFormTemplateElementOptionModel, IFormTemplateElementParameterModel, IFormTemplateModel, IInternalFormTemplateElementModel, IInternalFormTemplateElementOptionModel, IInternalFormTemplateElementParameterModel, IInternalFormTemplateModel } from \"./FormTemplate.model\";\n\nimport { STORE_ACTIONS, STORE_GETTERS } from \"@/store\";\nimport { EVENT_BUS_EVENTS } from \"../global/utilities/Events\";\n\ninterface IFormTemplateUpdateForm {\n elements: Array;\n}\n\ninterface IFormTemplateElementUpdateForm {\n id?: string;\n element_type: string;\n element_position_index: number;\n childrens: Array;\n element_parameters: Array;\n element_options: Array;\n}\n\ninterface IFormTemplateElementParameterUpdateForm {\n id?: string;\n key: string;\n value: string;\n}\n\ninterface IFormTemplateElementOptionUpdateForm {\n id?: string;\n value: string;\n order: string;\n}\n\nexport interface IFetchPublicFormTemplateResponse {\n form_template: IFormTemplateModel;\n internal_form_template: IInternalFormTemplateModel;\n}\n\n@Component\nexport default class FormTemplateService extends BaseService {\n protected service_formTemplateService_fetchAvailableElements(): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/form-templates/available-elements`)\n .then((response: AxiosResponse) => {\n const availableElements: Array = response.data.data.elements\n\n this.$store.dispatch(STORE_ACTIONS.FORM_TEMPLATE_AVAILABLE_ELEMENT_STORE_STORE_FORM_TEMPLATE_AVAILABLE_ELEMENTS, availableElements)\n\n resolve(availableElements)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_formTemplateService_fetch(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/form-templates/${id}`)\n .then((response: AxiosResponse) => {\n resolve(response.data.data.form_template)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_formTemplateService_fetchPublic(categoryId: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/public/categories/${categoryId}/form-template`)\n .then((response: AxiosResponse) => {\n resolve({\n form_template: response.data.data.form_template,\n internal_form_template: this.service_formTemplateService_mapFormTemplateToInternalFormTemplate(response.data.data.form_template)\n })\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_formTemplateService_update(internalFormTemplate: IInternalFormTemplateModel): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/form-templates/${internalFormTemplate.id}`, this.service_formTemplateService_mapInternalFormTemplateToRequestForm(internalFormTemplate))\n .then((response: AxiosResponse) => {\n const internalFormTemplate: IInternalFormTemplateModel = this.service_formTemplateService_mapFormTemplateToInternalFormTemplate(response.data.data.form_template)\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.FORM_TEMPLATE_UPDATED, internalFormTemplate)\n\n resolve(internalFormTemplate)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_formTemplateService_fetchMappedToInternalFormTemplate(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.service_formTemplateService_fetch(id)\n .then((response: IFormTemplateModel) => {\n resolve(\n this.service_formTemplateService_mapFormTemplateToInternalFormTemplate(response)\n )\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n private service_formTemplateService_mapInternalFormTemplateToRequestForm(formTemplate: IInternalFormTemplateModel): IFormTemplateUpdateForm {\n const availableElements: { [key: string]: IFormTemplateAvailableElementModel } = this.$store.getters[STORE_GETTERS.FORM_TEMPLATE_AVAILABLE_ELEMENT_GET_FORM_TEMPLATE_AVAILABLE_ELEMENTS_BY_TYPE]\n\n return {\n elements: this.service_formTemplateService_mapInternalFormTemplateElementToRequestFormRecursive(formTemplate.elements, availableElements)\n }\n }\n\n private service_formTemplateService_mapInternalFormTemplateElementToRequestFormRecursive(\n formTemplateElements: Array,\n availableElements: { [key: string]: IFormTemplateAvailableElementModel }\n ): Array {\n return formTemplateElements.reduce((mappedElements: Array, element: IInternalFormTemplateElementModel) => {\n return [\n ...mappedElements,\n {\n id: element.id,\n element_type: element.element_type,\n element_position_index: element.element_position_index,\n childrens: this.service_formTemplateService_mapInternalFormTemplateElementToRequestFormRecursive(element.childrens, availableElements),\n element_options: element.element_options.reduce((mappedOptions: Array, option: IInternalFormTemplateElementOptionModel) => {\n return [\n ...mappedOptions,\n {\n id: option.id,\n value: option.value,\n order: option.order ? option.order.toString() : null\n } as IFormTemplateElementOptionUpdateForm\n ]\n }, []),\n element_parameters: element.element_parameters.reduce((mappedParameters: Array, parameter: IInternalFormTemplateElementParameterModel) => {\n const elementConfiguration: IFormTemplateAvailableElementModel = availableElements[element.element_type]\n\n if (!elementConfiguration) {\n return mappedParameters\n }\n \n const elementConfigurationParameter: IFormTemplateAvailableElementModelParameter | undefined = elementConfiguration.element_parameters.find(\n (elementConfigurationParameter: IFormTemplateAvailableElementModelParameter) => elementConfigurationParameter.key === parameter.key\n )\n\n if (!elementConfigurationParameter) {\n return mappedParameters\n }\n\n return [\n ...mappedParameters,\n {\n id: parameter.id,\n key: parameter.key,\n value: parameter.value ? parameter.value.toString() : parameter.value\n } as IFormTemplateElementParameterUpdateForm\n ]\n }, [])\n } as any\n ]\n }, [])\n }\n\n protected service_formTemplateService_mapFormTemplateToInternalFormTemplate(formTemplate: IFormTemplateModel): IInternalFormTemplateModel {\n const internalFormTemplate: IInternalFormTemplateModel = {\n id: formTemplate.id,\n type: formTemplate.type,\n is_updateable: formTemplate.is_updateable,\n category: formTemplate.category || {} as any,\n elements: this.service_formTemplateService_mapFormTemplateElementToInternalFormTemplateElement(formTemplate.elements)\n }\n\n return internalFormTemplate\n }\n\n private service_formTemplateService_mapFormTemplateElementToInternalFormTemplateElement(\n formTemplateElements: Array = [], \n parentInternalIdentifier: string | null = null\n ): Array {\n return formTemplateElements.reduce((mappedElements: Array, element: IFormTemplateElementModel) => {\n const elementInternalIdentifier: string = parentInternalIdentifier ? `${parentInternalIdentifier}-${element.element_position_index}` : element.element_position_index.toString()\n\n return [\n ...mappedElements,\n {\n id: element.id,\n element_type: element.element_type,\n element_position_index: element.element_position_index,\n internal_identifier: elementInternalIdentifier,\n parent_internal_identifier: parentInternalIdentifier,\n component_name: element.component_name,\n option_component_name: element.option_component_name,\n childrens: this.service_formTemplateService_mapFormTemplateElementToInternalFormTemplateElement(element.childrens, elementInternalIdentifier),\n element_options: element.element_options.reduce((mappedOptions: Array, option: IFormTemplateElementOptionModel) => {\n return [\n ...mappedOptions,\n {\n id: option.id,\n value: option.value,\n order: isNaN(option.order as any) ? null : parseInt(option.order)\n } as IInternalFormTemplateElementOptionModel\n ]\n }, []) as Array,\n element_parameters: element.element_parameters.reduce((mappedParameters: Array, parameter: IFormTemplateElementParameterModel) => {\n return [\n ...mappedParameters,\n {\n id: parameter.id,\n key: parameter.key,\n value: parameter.value,\n frontend_key: parameter.frontend_key,\n frontend_type: parameter.frontend_type\n } as IInternalFormTemplateElementParameterModel\n ]\n }, []) as Array\n } as IInternalFormTemplateElementModel\n ]\n }, []).sort((leftHandSide: IInternalFormTemplateElementModel, rightHandSide: IInternalFormTemplateElementModel) => {\n return leftHandSide.element_position_index - rightHandSide.element_position_index\n })\n }\n}","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport { IAdminApplicationFormModel, IApplicationFormModel } from \"./ApplicationForm.model\";\nimport { IFormAnswerFileModel, IFormModel } from \"../form-management/Form.model\";\nimport FormTemplateService from \"../form-template-management/FormTemplate.service\";\nimport { IInternalFormTemplateModel } from \"../form-template-management/FormTemplate.model\";\nimport { ICategoryModel } from \"../category-management/Category.model\";\nimport { EVENT_BUS_EVENTS } from \"../global/utilities/Events\";\nimport { IFormAnswerForm } from \"../form-management/Form.service\";\nimport { IFileUploadModel } from \"../global/file/File.model\";\nimport { IPaginationQueryParameters } from \"../global/utilities/Base.service\";\nimport { IPaginatedResponse } from \"../global/utilities/Pagination.model\";\n\nexport interface IFetchApplicationFormResponse {\n application_form: IApplicationFormModel;\n form: IFormModel;\n internal_form_template: IInternalFormTemplateModel;\n}\n\nexport interface ICreateApplicationFormForm {\n category_id: string;\n candidate_idul: string;\n application_form_supports?: Array<{\n supporter_name: string;\n supporter_email: string;\n }>;\n}\n\nexport interface IFetchAdminApplicationFormsListQueryParameters extends IPaginationQueryParameters {\n year_id: string;\n query?: string;\n status: Array;\n}\n\nexport interface IFetchAdminApplicationFormsListResponse extends IPaginatedResponse {\n application_forms: Array;\n}\n\nexport interface ISendApplicationFormReminderEmailForm {\n categories_id: Array;\n}\n\nexport interface ISendApplicationFormSupportSubmitReminderEmailForm {\n categories_id: Array;\n}\n\nexport interface IApplicationFormDepositDeadlineExtensionForm {\n timestamp: string;\n}\n\nexport interface IApplicationFormSubmitApplicationFormSupportForm {\n application_form_id: string;\n application_form_supports: Array<{\n supporter_name: string;\n supporter_email: string;\n }>;\n}\n\nexport interface IApplicationFormAuthorizedUsersForm {\n iduls: string[];\n}\n\nexport interface IAdminDownloadExportFileQueryParameters {\n year_id: string;\n status: Array;\n}\n\n@Component\nexport default class ApplicationFormService extends FormTemplateService {\n protected service_applicationFormService_fetchUserApplicationFormList(yearId: string): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery({\n year_id: yearId\n })\n\n this.$axios.get(`/api/application-forms?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data.application_forms))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_fetchApplicationForm(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/application-forms/${id}`)\n .then((response: AxiosResponse) => resolve({\n application_form: response.data.data.application_form,\n form: response.data.data.form,\n internal_form_template: this.service_formTemplateService_mapFormTemplateToInternalFormTemplate(response.data.data.form.form_template)\n })).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_fetchAvailableCategories(yearId: string): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery({\n year_id: yearId\n })\n\n this.$axios.get(`/api/application-forms/available-categories?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data.categories))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_createApplicationForm(payload: ICreateApplicationFormForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.post(`/api/application-forms`, payload)\n .then((response: AxiosResponse) => {\n const createdApplicationForm: IApplicationFormModel = response.data.data.application_form\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.APPLICATION_FORM_CREATED, createdApplicationForm)\n\n resolve(createdApplicationForm)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_deleteApplicationForm(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.delete(`/api/application-forms/${id}`)\n .then(() => {\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.APPLICATION_FORM_DELETED, id)\n\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_softDeleteApplicationForm(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/application-forms/${id}/soft-delete`)\n .then((response: AxiosResponse) => {\n const updatedApplicationForm: IApplicationFormModel = response.data.data.application_form\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.APPLICATION_FORM_UPDATED, updatedApplicationForm)\n\n resolve(updatedApplicationForm)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_restoreApplicationForm(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/application-forms/${id}/restore`)\n .then((response: AxiosResponse) => {\n const updatedApplicationForm: IApplicationFormModel = response.data.data.application_form\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.APPLICATION_FORM_UPDATED, updatedApplicationForm)\n\n resolve(updatedApplicationForm)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_saveApplicationForm(id: string, answers: Array): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(\n `/api/application-forms/${id}`, \n this.service_applicationFormService_generateAnswersFormData(answers), \n {\n headers: this.service_baseService_multipartFormDataHeader()\n }\n ).then(() => {\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_submitApplicationForm(id: string, answers: Array): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(\n `/api/application-forms/${id}/submit`, \n this.service_applicationFormService_generateAnswersFormData(answers), \n {\n headers: this.service_baseService_multipartFormDataHeader()\n }\n ).then(() => {\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n private service_applicationFormService_generateAnswersFormData(answers: Array): FormData {\n const data: FormData = new FormData()\n\n answers.forEach((answerForm: any, index: number) => {\n for (const key in answerForm) {\n const answerValue: any = answerForm[key]\n\n if (\n answerValue != undefined && \n answerValue != null &&\n key != 'files'\n ) {\n data.append(`answers[${index}].${key}`, answerValue)\n }\n }\n\n if (answerForm.files) {\n answerForm.files.forEach((uploadedFile: IFileUploadModel, fileIndex: number) => {\n if (uploadedFile.server_file) {\n data.set(`answers[${index}].form_answer_files[${fileIndex}].id`, uploadedFile.server_file.id)\n } else if (uploadedFile && uploadedFile.file) {\n data.append(`answers[${index}].form_answer_files[${fileIndex}].file`, uploadedFile.file.file)\n }\n })\n }\n })\n\n return data\n }\n\n protected service_applicationFormService_fetchAdminApplicationFormList(query: IFetchAdminApplicationFormsListQueryParameters): Promise {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery(query)\n\n this.$axios.get(`/api/admin/application-forms?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_sendApplicationFormReminderEmails(payload: ISendApplicationFormReminderEmailForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.post(`/api/admin/application-forms/reminder-emails`, payload)\n .then((response: AxiosResponse) => {\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.APPLICATION_FORM_REMINDER_EMAIL_SENT, null)\n\n return resolve(response.data.data)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_fetchAdminApplicationForm(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/admin/application-forms/${id}`)\n .then((response: AxiosResponse) => resolve({\n application_form: response.data.data.application_form,\n form: response.data.data.form,\n internal_form_template: this.service_formTemplateService_mapFormTemplateToInternalFormTemplate(response.data.data.form.form_template)\n })).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_updateDepositDeadlineExtension(id: string, form: IApplicationFormDepositDeadlineExtensionForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/admin/application-forms/${id}/extend-deposit-deadline`, form)\n .then((response: AxiosResponse) => {\n const updatedApplicationForm: IApplicationFormModel = response.data.data.application_form\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.APPLICATION_FORM_UPDATED, updatedApplicationForm)\n\n resolve(updatedApplicationForm)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_submitApplicationFormSupport(payload: IApplicationFormSubmitApplicationFormSupportForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/application-forms/application-form-supports`, payload)\n .then(() => {\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.APPLICATION_FORM_APPLICATION_FORM_SUPPORT_SUBMITTED, null)\n\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_sendApplicationFormSupportSubmitReminderEmails(payload: ISendApplicationFormSupportSubmitReminderEmailForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.post(`/api/admin/application-forms/support-reminder-emails`, payload)\n .then(() => {\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.APPLICATION_FORM_SUPPORT_SUBMIT_REMINDER_EMAIL_SENT, null)\n\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_deleteApplicationFormAdmin(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.delete(`/api/admin/application-forms/${id}`)\n .then(() => {\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.APPLICATION_FORM_DELETED, id)\n\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_saveApplicationFormAdmin(id: string, answers: Array): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(\n `/api/admin/application-forms/${id}`, \n this.service_applicationFormService_generateAnswersFormData(answers), \n {\n headers: this.service_baseService_multipartFormDataHeader()\n }\n ).then(() => {\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_saveAuthorizedUsersAdmin(id: string, form: IApplicationFormAuthorizedUsersForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/admin/application-forms/${id}/authorized-users`, form).then(() => {\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_deleteApplicationFormSupport(idApplicationForm: string, idApplicationFormSupport: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.delete(`/api/application-forms/${idApplicationForm}/application-form-supports/${idApplicationFormSupport}`)\n .then(() => {\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormService_adminDownloadExportFile(query: IAdminDownloadExportFileQueryParameters): Promise {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery(query)\n\n this.$axios.get(`/api/admin/application-forms/export?${queryString}`, {\n responseType: 'arraybuffer',\n headers: {\n Accept: 'application/octet-stream'\n }\n }).then((response: any) => {\n resolve(response)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n}","import { IBaseModel } from \"@/modules/global/utilities/Base.model\";\nimport { IApplicationFormModel } from \"../application-form-management/ApplicationForm.model\";\nimport { IEmailStatusModel } from \"../global/email/EmailStatus.model\";\n\nexport enum ApplicationFormSupportStatus {\n IN_PROGRESS = 'IN_PROGRESS',\n SUBMITTED = 'SUBMITTED',\n OVERDUE = 'OVERDUE'\n}\n\nexport interface IApplicationFormSupportModel extends IBaseModel {\n candidate_full_name_with_username: string;\n supporter_name_with_email: string;\n category_title: string;\n category_application_support_deposit_limit_timestamp: string;\n is_updateable: boolean;\n is_deleteable: boolean;\n status: ApplicationFormSupportStatus;\n token: string;\n}\n\nexport interface IAdminApplicationFormSupportModel extends IApplicationFormModel {\n reminder_emails_status: Array;\n creation_emails_status: Array;\n}","import Component, { mixins } from 'vue-class-component'\n\nimport { ApplicationFormSupportStatus, IApplicationFormSupportModel } from './ApplicationFormSupport.model'\n\n@Component\nexport default class ApplicationFormSupportMixin extends mixins() {\n protected mixin_applicationFormSupport_computeStatusColor(applicationFormSupport: IApplicationFormSupportModel): string {\n switch (applicationFormSupport.status) {\n case ApplicationFormSupportStatus.IN_PROGRESS:\n return '#ffc103'\n case ApplicationFormSupportStatus.OVERDUE:\n return '#e30513'\n case ApplicationFormSupportStatus.SUBMITTED:\n return '#00c77f'\n default:\n return 'grey'\n }\n }\n\n protected mixin_applicationFormSupport_computeStatusIcon(applicationFormSupport: IApplicationFormSupportModel): string | null {\n switch (applicationFormSupport.status) {\n case ApplicationFormSupportStatus.IN_PROGRESS:\n return 'pd-svg__user-wait'\n case ApplicationFormSupportStatus.OVERDUE:\n return 'm-svg__error'\n case ApplicationFormSupportStatus.SUBMITTED:\n return 'm-svg__confirmation'\n default:\n return null\n }\n }\n\n protected mixin_applicationFormSupport_computeStatusIconStyles(applicationFormSupport: IApplicationFormSupportModel): object {\n return {\n 'color': this.mixin_applicationFormSupport_computeStatusColor(applicationFormSupport)\n }\n }\n\n protected mixin_applicationFormSupport_computeStatusLabel(status: ApplicationFormSupportStatus | string): string | null {\n return this.$i18next.t(`modules.application-form-support-management.ApplicationFormSupportMixin.status.${status}`)\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref } from 'vue-property-decorator'\n\nimport WithRender from './SubmitApplicationFormSupportOverlay.html'\n\nimport { \n MAdd,\n MButton,\n MButtonSkin,\n MDialog,\n MDialogState,\n MDialogWidth,\n MIcon,\n MIconButton,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay,\n} from '@ulaval/modul-components'\n\nimport ApplicationFormSupportForm, { IApplicationFormSupportFormPayloadData } from '@/modules/application-form-support-management/application-form-support-form/ApplicationFormSupportForm'\n\nimport { IApplicationFormModel } from '../ApplicationForm.model'\nimport ApplicationFormService, { IApplicationFormSubmitApplicationFormSupportForm } from '../ApplicationForm.service'\nimport { IApplicationFormSupportModel } from '@/modules/application-form-support-management/ApplicationFormSupport.model'\nimport ROUTES from '@/router/ROUTES'\nimport ApplicationFormSupportMixin from '@/modules/application-form-support-management/ApplicationFormSupport.mixin'\n\nconst APPLICATION_FORM_SUPPORT_FORM_REF: string = 'application-form-support-form'\n\ninterface ISubmitApplicationFormSupportOverlayPayloadData {\n application_form_supports: Array;\n}\n\nexport enum SubmitApplicationFormSupportOverlay_EVENTS {\n AFTER_CLOSE = 'after-close'\n}\n\n@WithRender\n@Component({\n components: {\n ApplicationFormSupportForm,\n MAdd,\n MButton,\n MDialog,\n MIcon,\n MIconButton,\n MMessage,\n MOverlay\n }\n})\nexport default class SubmitApplicationFormSupportOverlay extends mixins(ApplicationFormService, ApplicationFormSupportMixin) {\n private applicationFormSupportForms: Array = []\n private isOverlayOpen: boolean = true\n private isLoadingStateActive: boolean = false\n private showSubmitSuccessMessage: boolean = false\n private showSubmitErrorMessage: boolean = false\n private isDeleteLoadingStateActive: boolean = false\n private applicationFormSupportToDelete: IApplicationFormSupportModel | null = null\n private showDeleteSuccessMessage: boolean = false\n private showDeleteErrorMessage: boolean = false\n\n private readonly APPLICATION_FORM_SUPPORT_FORM_REF: string = APPLICATION_FORM_SUPPORT_FORM_REF\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MDialogState: object = MDialogState\n private readonly MDialogWidth: object = MDialogWidth\n \n @Prop({ required: true })\n private applicationForm!: IApplicationFormModel\n\n @Ref(APPLICATION_FORM_SUPPORT_FORM_REF)\n private applicationFormSupportFormComponents!: Array\n\n private get applicationFormSupportLeftToDepositCount(): number {\n if (!this.applicationForm.category_application_support_count_upper_bound) {\n return 0\n }\n\n return this.applicationForm.category_application_support_count_upper_bound - this.applicationForm.application_form_supports.length\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n\n private afterOverlayClose(): void {\n this.$emit(SubmitApplicationFormSupportOverlay_EVENTS.AFTER_CLOSE)\n }\n\n private increaseApplicationFormSupportFormCount(key: number): void {\n this.$set(this.applicationFormSupportForms, this.applicationFormSupportForms.length, key + 1)\n }\n\n private decreaseApplicationFormSupportFormCount(index: number): void {\n this.$delete(this.applicationFormSupportForms, index)\n }\n\n private async onSubmitButtonClick(): Promise {\n const formPayload: ISubmitApplicationFormSupportOverlayPayloadData | null = await this.getFormPayload()\n\n if (formPayload) {\n this.submitApplicationFormSupports(formPayload)\n }\n }\n\n public async getFormPayload(): Promise {\n const applicationFormSupports: Array = []\n\n if (this.applicationFormSupportFormComponents) {\n for (const applicationFormSupportForm of this.applicationFormSupportFormComponents) {\n const applicationFormSupportFormPayload: IApplicationFormSupportFormPayloadData | null = await applicationFormSupportForm.getFormPayload()\n\n if (applicationFormSupportFormPayload) {\n applicationFormSupports.push(applicationFormSupportFormPayload)\n } else {\n return null\n }\n }\n }\n\n return {\n application_form_supports: applicationFormSupports\n }\n }\n\n private submitApplicationFormSupports(formPayload: ISubmitApplicationFormSupportOverlayPayloadData): void {\n this.isLoadingStateActive = true\n\n const requestPayload: IApplicationFormSubmitApplicationFormSupportForm = {\n ...formPayload,\n application_form_id: this.applicationForm.id\n }\n\n this.service_applicationFormService_submitApplicationFormSupport(requestPayload)\n .then(() => {\n this.applicationFormSupportForms = []\n this.showSubmitSuccessMessage = true\n this.showSubmitErrorMessage = false\n }).catch(() => {\n this.showSubmitSuccessMessage = false\n this.showSubmitErrorMessage = true\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private onDisplayDeleteConfirmationIconClick(applicationFormSupport: IApplicationFormSupportModel): void {\n this.applicationFormSupportToDelete = applicationFormSupport || null\n }\n\n private hideDeleteConfirmationDialog(): void {\n this.applicationFormSupportToDelete = null\n }\n\n private deleteApplicationFormSupport(): void {\n if (this.applicationFormSupportToDelete) {\n this.isDeleteLoadingStateActive = true\n\n this.service_applicationFormService_deleteApplicationFormSupport(this.applicationForm.id, this.applicationFormSupportToDelete.id)\n .then(() => {\n this.showDeleteSuccessMessage = true\n this.showDeleteErrorMessage = false\n\n const applicationFormSupportIndex: number | undefined = this.applicationForm.application_form_supports.findIndex((el: IApplicationFormSupportModel) => el.id === this.applicationFormSupportToDelete?.id)\n\n if (~applicationFormSupportIndex) {\n this.$delete(this.applicationForm.application_form_supports, applicationFormSupportIndex)\n }\n }).catch(() => {\n this.showDeleteSuccessMessage = false\n this.showDeleteErrorMessage = true\n }).finally(() => {\n this.isDeleteLoadingStateActive = false\n setTimeout(() => {\n this.showDeleteSuccessMessage = false\n this.showDeleteErrorMessage = false\n }, 5000)\n })\n } else {\n this.mixin_router_navigate({\n name: ROUTES.ERROR\n })\n }\n }\n}\n","import { IBaseModel } from \"@/modules/global/utilities/Base.model\";\nimport { IApplicationFormSupportModel } from \"../application-form-support-management/ApplicationFormSupport.model\";\nimport { IEmailStatusModel } from \"../global/email/EmailStatus.model\";\nimport { IUserModel } from \"../user-management/User.model\";\n\nexport enum ApplicationFormStatus {\n IN_PROGRESS = 'IN_PROGRESS',\n SUBMITTED = 'SUBMITTED',\n INACTIVE = 'INACTIVE',\n OVERDUE = 'OVERDUE'\n}\n\nexport interface IApplicationFormModel extends IBaseModel {\n candidate_full_name_with_username: string;\n category_title: string;\n category_application_deposit_limit_timestamp: string;\n is_deleteable: boolean;\n is_restorable: boolean;\n is_soft_deleteable: boolean;\n is_updateable: boolean;\n requester_full_name_with_username: string;\n status: ApplicationFormStatus;\n deposit_deadline_extension_timestamp?: string;\n category_application_support_submit_limit_timestamp: string;\n is_application_form_support_submittable: boolean;\n application_form_supports: Array;\n category_application_support_count_lower_bound?: number;\n category_application_support_count_upper_bound?: number;\n category_application_support_creation_dialog_message?: string;\n is_application_form_support_count_under_threshold: boolean;\n}\n\nexport interface IAdminApplicationFormModel extends IApplicationFormModel {\n is_deleteable_admin: boolean;\n reminder_emails_status: Array;\n support_reminder_emails_status: Array;\n support_submit_over_threshold_email_status: Array;\n application_form_created_email_status: Array;\n application_form_submitted_email_status: Array;\n authorized_users: Array;\n}","import Component, { mixins } from 'vue-class-component'\n\nimport { ApplicationFormStatus, IApplicationFormModel } from './ApplicationForm.model';\nimport { IFormAnswerModel, IFormModel } from '../form-management/Form.model';\nimport { IFileUploadModel } from '../global/file/File.model';\nimport axios from 'axios';\n\n@Component\nexport default class ApplicationFormMixin extends mixins() {\n protected mixin_applicationForm_computeStatusColor(applicationForm: IApplicationFormModel): string {\n switch (applicationForm.status) {\n case ApplicationFormStatus.INACTIVE:\n return '#d7d7d7'\n case ApplicationFormStatus.IN_PROGRESS:\n return '#ffc103'\n case ApplicationFormStatus.OVERDUE:\n return '#e30513'\n case ApplicationFormStatus.SUBMITTED:\n return '#00c77f'\n default:\n return 'grey'\n }\n }\n\n protected mixin_applicationForm_computeStatusIcon(applicationForm: IApplicationFormModel): string | null {\n switch (applicationForm.status) {\n case ApplicationFormStatus.INACTIVE:\n return 'pd-svg__circle-block'\n case ApplicationFormStatus.IN_PROGRESS:\n return 'pd-svg__user-wait'\n case ApplicationFormStatus.OVERDUE:\n return 'm-svg__error'\n case ApplicationFormStatus.SUBMITTED:\n return 'm-svg__confirmation'\n default:\n return null\n }\n }\n\n protected mixin_applicationForm_computeStatusIconStyles(applicationForm: IApplicationFormModel): object {\n return {\n 'color': this.mixin_applicationForm_computeStatusColor(applicationForm)\n }\n }\n\n protected mixin_applicationForm_isApplicationFormInactive(applicationForm: IApplicationFormModel): boolean {\n return applicationForm.status === ApplicationFormStatus.INACTIVE\n }\n\n protected mixin_applicationForm_computeStatusLabel(status: ApplicationFormStatus | string): string | null {\n return this.$i18next.t(`modules.application-form-management.ApplicationFormMixin.status.${status}`)\n }\n\n protected mixin_applicationForm_hasFormAnswerFiles(form?: IFormModel): boolean {\n if (!form || !form.form_answers) {\n return false\n }\n\n return form.form_answers.some((formAnswer: IFormAnswerModel) => formAnswer.form_answer_files.length > 0)\n }\n\n protected async mixin_applicationForm_downloadAllFormAnswerFiles(form?: IFormModel): Promise {\n if (form && form.form_answers) {\n for (const formAnswer of form.form_answers) {\n for (const formAnswerFile of formAnswer.form_answer_files) {\n await this.mixin_applicationForm_internalDownloadFile({ server_file: formAnswerFile})\n }\n }\n }\n }\n\n private async mixin_applicationForm_internalDownloadFile(file: IFileUploadModel): Promise {\n if (file.file) {\n this.mixin_applicationForm_internalOpenFile(URL.createObjectURL(file.file as any), file.file.name)\n } else if (file.server_file && file.server_file.download_endpoint) {\n const response = await axios.get(file.server_file.download_endpoint, {\n responseType: 'arraybuffer',\n headers: {\n Accept: 'application/octet-stream'\n }\n })\n\n if (file.server_file) {\n this.mixin_applicationForm_internalOpenFile(URL.createObjectURL(new Blob([response.data], { type: file.server_file.file_format })), file.server_file.file_name)\n }\n }\n }\n\n private mixin_applicationForm_internalOpenFile(url: string, fileName: string): void {\n const downloadLinkElement = document.createElement('a')\n\n downloadLinkElement.style.visibility = 'hidden'\n downloadLinkElement.setAttribute('href', url)\n downloadLinkElement.setAttribute('download', fileName)\n downloadLinkElement.click()\n\n downloadLinkElement.removeAttribute('link')\n downloadLinkElement.removeAttribute('download')\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './ApplicationFormCard.html'\n\nimport {\n MAdd,\n MDialog,\n MDialogState,\n MDialogWidth,\n MIcon,\n MLink,\n MLinkMode,\n MOption,\n MOptionItemDelete,\n MPanel,\n MToast,\n MToastDuration,\n MToastPosition,\n MToastState,\n MToastTimeout,\n} from '@ulaval/modul-components'\n\nimport SoftDeleteItemOption from '@/modules/global/components/option-item/SoftDeleteItemOption'\nimport RestoreItemOption from '@/modules/global/components/option-item/RestoreItemOption'\nimport SubmitApplicationFormSupportOverlay from './SubmitApplicationFormSupportOverlay'\n\nimport ApplicationFormMixin from '@/modules/application-form-management/ApplicationForm.mixin'\nimport { IApplicationFormModel } from '@/modules/application-form-management/ApplicationForm.model'\n\nimport ROUTES from '@/router/ROUTES'\nimport ApplicationFormService from '../ApplicationForm.service'\n\n\n@WithRender\n@Component({\n components: {\n MAdd,\n MDialog,\n MIcon,\n MLink,\n MOption,\n MOptionItemDelete,\n MPanel,\n MToast,\n SoftDeleteItemOption,\n SubmitApplicationFormSupportOverlay,\n RestoreItemOption\n }\n})\nexport default class ApplicationFormCard extends mixins(ApplicationFormMixin, ApplicationFormService) {\n private isDeleteDialogVisible: boolean = false\n private isDeleteLoadingStateActive: boolean = false\n private isSoftDeleteSuccessToastOpen: boolean = false\n private isRestoreSuccessToastOpen: boolean = false\n private isSubmitApplicationFormSupportOverlayDisplayed: boolean = false\n\n private readonly MDialogState: object = MDialogState\n private readonly MDialogWidth: object = MDialogWidth\n private readonly MToastPosition: object = MToastPosition\n private readonly MToastState: object = MToastState\n private readonly MToastTimeout: object = MToastTimeout\n private readonly MLinkMode: object = MLinkMode\n\n @Prop({ required: true })\n private applicationForm!: IApplicationFormModel\n\n private get panelStyles(): object {\n return {\n 'border-bottom-color': this.mixin_applicationForm_computeStatusColor(this.applicationForm)\n }\n }\n\n private get panelClasses(): object {\n return {\n 'application-form-card--disabled': this.mixin_applicationForm_isApplicationFormInactive(this.applicationForm)\n }\n }\n\n private get statusIconStyles(): object {\n return {\n 'color': this.mixin_applicationForm_computeStatusColor(this.applicationForm)\n }\n }\n\n private navigateToApplicationForm(): void {\n this.mixin_router_navigate({\n name: ROUTES.APPLICATION_FORM,\n params: {\n idApplicationForm: this.applicationForm.id\n }\n })\n }\n\n private deleteApplicationForm(): void {\n this.isDeleteLoadingStateActive = true\n\n this.service_applicationFormService_deleteApplicationForm(this.applicationForm.id)\n .finally(() => {\n this.isDeleteLoadingStateActive = false\n })\n }\n\n private softDeleteApplicationForm(): void {\n this.isSoftDeleteSuccessToastOpen = true\n\n this.service_applicationFormService_softDeleteApplicationForm(this.applicationForm.id)\n .then(() => {\n this.isSoftDeleteSuccessToastOpen = true\n }).finally(() => {\n setTimeout(() => {\n this.isSoftDeleteSuccessToastOpen = false\n }, MToastDuration.DesktopXShort)\n })\n }\n\n private restoreApplicationForm(): void {\n this.isRestoreSuccessToastOpen = true\n \n this.service_applicationFormService_restoreApplicationForm(this.applicationForm.id)\n .then(() => {\n this.isRestoreSuccessToastOpen = true\n }).finally(() => {\n setTimeout(() => {\n this.isRestoreSuccessToastOpen = false\n }, MToastDuration.DesktopXShort)\n })\n }\n\n private displayDeleteDialog(): void {\n this.isDeleteDialogVisible = true\n }\n\n private hideDeleteDialog(): void {\n this.isDeleteDialogVisible = false\n this.isDeleteLoadingStateActive = false\n }\n\n private displaySubmitApplicationFormSupportDialog(): void {\n this.isSubmitApplicationFormSupportOverlayDisplayed = true\n }\n\n private hideSubmitApplicationFormSupportDialog(): void {\n this.isSubmitApplicationFormSupportOverlayDisplayed = false\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport WithRender from './ApplicationForms.html'\n\nimport { \n MMessage,\n MMessageState,\n MSpinner,\n MToast,\n MToastPosition,\n MToastState,\n MToastTimeout,\n MToastDuration\n} from '@ulaval/modul-components'\n\nimport ApplicationFormCard from '../application-form/ApplicationFormCard'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport ApplicationFormService from '../ApplicationForm.service'\nimport { IApplicationFormModel } from '@/modules/application-form-management/ApplicationForm.model'\nimport CONSTANTS from '@/CONSTANTS'\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\n\n@WithRender\n@Component({\n components: {\n ApplicationFormCard,\n MMessage,\n MSpinner,\n MToast\n }\n})\nexport default class ApplicationForms extends mixins(ApplicationFormService) {\n private applicationForms: Array = []\n private isLoadingStateActive: boolean = true\n private isApplicationFormDeleteSuccessToastOpen: boolean = false\n\n private readonly MMessageState: object = MMessageState\n private readonly MToastPosition: object = MToastPosition\n private readonly MToastState: object = MToastState\n private readonly MToastTimeout: object = MToastTimeout\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Watch('year', { immediate: true })\n private onYearChange(): void {\n this.loadApplicationForms()\n }\n\n private mounted(): void {\n this.afterApplicationFormCreated()\n this.afterApplicationFormUpdated()\n this.afterApplicationFormDeleted()\n this.afterApplicationFormSupportSubmitted()\n }\n\n private afterApplicationFormCreated(): void {\n EventBus.$on(EVENT_BUS_EVENTS.APPLICATION_FORM_CREATED, () => {\n this.loadApplicationForms()\n })\n }\n\n private afterApplicationFormSupportSubmitted(): void {\n EventBus.$on(EVENT_BUS_EVENTS.APPLICATION_FORM_APPLICATION_FORM_SUPPORT_SUBMITTED, () => {\n this.loadApplicationForms()\n })\n }\n\n private afterApplicationFormUpdated(): void {\n EventBus.$on(EVENT_BUS_EVENTS.APPLICATION_FORM_UPDATED, (updatedApplicationForm: IApplicationFormModel) => {\n if (updatedApplicationForm) {\n const originalCategoryIndex: number | undefined = this.applicationForms.findIndex((applicationForm: IApplicationFormModel) => applicationForm.id === updatedApplicationForm.id)\n\n if (~originalCategoryIndex) {\n this.$set(this.applicationForms, originalCategoryIndex, updatedApplicationForm)\n }\n }\n })\n }\n\n private afterApplicationFormDeleted(): void {\n EventBus.$on(EVENT_BUS_EVENTS.APPLICATION_FORM_DELETED, (id: string) => {\n if (id) {\n const originalApplicationFormIndex: number | undefined = this.applicationForms.findIndex((applicationForm: IApplicationFormModel) => applicationForm.id === id)\n\n if (~originalApplicationFormIndex) {\n this.isApplicationFormDeleteSuccessToastOpen = true\n\n this.$delete(this.applicationForms, originalApplicationFormIndex)\n\n setTimeout(() => {\n this.isApplicationFormDeleteSuccessToastOpen = false\n }, MToastDuration.DesktopXShort)\n }\n }\n })\n }\n\n private loadApplicationForms(): void {\n const loadingStateActivationTimeout: any = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n\n this.service_applicationFormService_fetchUserApplicationFormList(this.year.id)\n .then((response: Array) => {\n this.applicationForms = response || []\n }).catch(() => {\n this.applicationForms = []\n }).finally(() => {\n clearTimeout(loadingStateActivationTimeout)\n this.isLoadingStateActive = false\n })\n }\n}\n","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport { IYearModel } from \"./Year.model\";\nimport BaseService from \"../utilities/Base.service\";\nimport { STORE_ACTIONS } from \"@/store\";\n\n@Component\nexport default class YearService extends BaseService {\n protected service_yearService_fetchList(): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/years`)\n .then((response: AxiosResponse) => {\n const years: Array = response.data.data.years\n\n this.$store.dispatch(STORE_ACTIONS.YEAR_STORE_STORE_YEARS, years)\n\n resolve(years)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_yearService_fetchCurrent(): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/years/current`)\n .then((response: AxiosResponse) => {\n const year: IYearModel = response.data.data.year\n\n this.$store.dispatch(STORE_ACTIONS.YEAR_STORE_STORE_CURRENT_YEAR, year)\n\n resolve(year)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Watch } from 'vue-property-decorator'\n\nimport WithRender from './YearDropdown.html'\n\nimport { \n MDropdown,\n MDropdownItem\n} from '@ulaval/modul-components'\n\nimport { IYearModel } from './Year.model'\nimport YearService from './Year.service'\n\nimport { STORE_GETTERS } from '@/store'\n\n@WithRender\n@Component({\n components: {\n MDropdown,\n MDropdownItem\n }\n})\nexport default class YearDropdown extends mixins(YearService) {\n private isLoadingStateActive: boolean = false\n private selectedYearSlug: string | null = null\n\n private get years(): Array {\n return this.$store.getters[STORE_GETTERS.YEAR_GET_YEARS]\n }\n \n private get yearsBySlug(): { [key: string]: IYearModel } {\n return this.$store.getters[STORE_GETTERS.YEAR_GET_YEARS_BY_SLUG]\n }\n\n private get currentYear(): IYearModel | null {\n return this.$store.getters[STORE_GETTERS.YEAR_GET_CURRENT_YEAR]\n }\n\n private get hasYears(): boolean {\n return !!(this.years && this.years.length > 0)\n }\n\n private get hasCurrentYear(): boolean {\n return !!this.currentYear\n }\n\n @Watch('currentYear')\n private onCurrentYearChange(): void {\n if (!this.selectedYearSlug && this.currentYear) {\n this.selectedYearSlug = this.currentYear.slug\n }\n }\n\n @Watch('selectedYearSlug')\n private onSelectedYearSlugChange(): void {\n if (this.selectedYearSlug) {\n const matchingYear: IYearModel | undefined = this.yearsBySlug[this.selectedYearSlug]\n\n if (matchingYear) {\n this.$emit('input', matchingYear)\n }\n }\n }\n\n private mounted(): void {\n if (!this.hasYears) {\n this.loadYears()\n } else if (this.hasCurrentYear) {\n this.onCurrentYearChange()\n } else if (!this.hasCurrentYear) {\n this.loadCurrentYear()\n }\n }\n\n private loadYears(): void {\n this.isLoadingStateActive = true\n\n this.service_yearService_fetchList()\n .then(() => {\n if (!this.hasCurrentYear) {\n this.loadCurrentYear()\n }\n }).finally(() => {\n this.isLoadingStateActive = false\n }) \n }\n\n private loadCurrentYear(): void {\n this.isLoadingStateActive = true\n\n this.service_yearService_fetchCurrent()\n .finally(() => {\n this.isLoadingStateActive = false\n }) \n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './DashboardApplicationFormManagement.html'\n\nimport {\n MButton, \n MPanel\n} from '@ulaval/modul-components'\n\nimport ApplicationForms from '../../application-form-management/application-forms/ApplicationForms'\nimport YearDropdown from '@/modules/global/year/YearDropdown'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport ROUTES from '@/router/ROUTES'\n\n@WithRender\n@Component({\n components: {\n ApplicationForms,\n MButton,\n MPanel,\n YearDropdown\n }\n})\nexport default class DashboardApplicationFormManagement extends mixins() {\n @Prop({ required: true })\n private year!: IYearModel\n \n private onCreateApplicationFormButton(): void {\n this.mixin_router_navigate({\n name: ROUTES.APPLICATION_FORM_CREATION\n })\n }\n}\n","import { IBaseModel } from \"@/modules/global/utilities/Base.model\";\n\nexport enum EvaluatorApplicationFormAssignmentStatus {\n IN_PROGRESS = 'IN_PROGRESS',\n DONE = 'DONE',\n OVERDUE = 'OVERDUE'\n}\n\nexport interface IEvaluatorApplicationFormAssignmentModel extends IBaseModel {\n status: EvaluatorApplicationFormAssignmentStatus;\n candidate_full_name: string;\n candidate_full_name_with_username: string;\n candidate_full_name_with_email: string;\n}","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport { EVENT_BUS_EVENTS } from \"@/modules/global/utilities/Events\";\nimport { EvaluatorApplicationFormAssignmentStatus, IEvaluatorApplicationFormAssignmentModel } from \"./EvaluatorApplicationFormAssignment.model\";\nimport FormTemplateService from \"@/modules/form-template-management/FormTemplate.service\";\nimport { IInternalFormTemplateModel } from \"@/modules/form-template-management/FormTemplate.model\";\nimport { IFormAnswerModel } from \"@/modules/form-management/Form.model\";\n\nexport interface IUpdateEvaluatorApplicationFormAssignmentForm {\n status: EvaluatorApplicationFormAssignmentStatus;\n}\n\nexport interface IFetchEvaluatorApplicationFormAssignmentApplicationFormResponse {\n evaluator_application_form_assignment: IEvaluatorApplicationFormAssignmentModel;\n form_answers: Array;\n internal_form_template: IInternalFormTemplateModel;\n}\n\nexport interface IFetchEvaluatorApplicationFormSupportsAssignmentApplicationFormResponse {\n evaluator_application_form_assignment: IEvaluatorApplicationFormAssignmentModel;\n form_answers: Array;\n internal_form_template: IInternalFormTemplateModel;\n}\n\n@Component\nexport default class EvaluatorApplicationFormAssignmentService extends FormTemplateService {\n protected service_evaluatorApplicationFormAssignmentService_flagAsDone(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n const payload: IUpdateEvaluatorApplicationFormAssignmentForm = {\n status: EvaluatorApplicationFormAssignmentStatus.DONE\n }\n\n this.$axios.put(`/api/evaluator-application-form-assignments/${id}`, payload)\n .then(() => {\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.EVALUATOR_APPLICATION_FORM_ASSIGNMENT_UPDATED, null)\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_evaluatorApplicationFormAssignmentService_flagAsInProgress(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n const payload: IUpdateEvaluatorApplicationFormAssignmentForm = {\n status: EvaluatorApplicationFormAssignmentStatus.IN_PROGRESS\n }\n\n this.$axios.put(`/api/evaluator-application-form-assignments/${id}`, payload)\n .then(() => {\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.EVALUATOR_APPLICATION_FORM_ASSIGNMENT_UPDATED, null)\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_evaluatorApplicationFormAssignmentService_fetchApplicationForm(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/evaluator-application-form-assignments/${id}/application-form`)\n .then((response: AxiosResponse) => {\n resolve({\n evaluator_application_form_assignment: response.data.data.evaluator_application_form_assignment,\n form_answers: response.data.data.form_answers,\n internal_form_template: this.service_formTemplateService_mapFormTemplateToInternalFormTemplate(response.data.data.form_template)\n } as IFetchEvaluatorApplicationFormAssignmentApplicationFormResponse)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_evaluatorApplicationFormAssignmentService_fetchApplicationFormSupports(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/evaluator-application-form-assignments/${id}/application-form-supports`)\n .then((response: AxiosResponse) => {\n resolve({\n evaluator_application_form_assignment: response.data.data.evaluator_application_form_assignment,\n form_answers: response.data.data.form_answers,\n internal_form_template: this.service_formTemplateService_mapFormTemplateToInternalFormTemplate(response.data.data.form_template)\n } as IFetchEvaluatorApplicationFormSupportsAssignmentApplicationFormResponse)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './EvaluatorApplicationFormAssignmentRow.html'\n\nimport { \n MLink,\n MLinkMode,\n MSwitch,\n MTooltip,\n MTooltipMode,\n MTooltipSize\n} from '@ulaval/modul-components'\n\nimport { EvaluatorApplicationFormAssignmentStatus, IEvaluatorApplicationFormAssignmentModel } from '../EvaluatorApplicationFormAssignment.model'\nimport EvaluatorApplicationFormAssignmentService from '../EvaluatorApplicationFormAssignment.service'\nimport ROUTES from '@/router/ROUTES'\n\n@WithRender\n@Component({\n components: {\n MLink,\n MSwitch,\n MTooltip\n }\n})\nexport default class EvaluatorApplicationFormAssignmentRow extends mixins(EvaluatorApplicationFormAssignmentService) {\n private isStatusTooltipOpen: boolean = false\n\n private readonly MTooltipMode: object = MTooltipMode\n private readonly MTooltipSize: object = MTooltipSize\n private readonly MLinkMode: object = MLinkMode\n\n @Prop({ required: true })\n private evaluatorApplicationFormAssignment!: IEvaluatorApplicationFormAssignmentModel\n\n private get isStatusSwitchActive(): boolean {\n return this.evaluatorApplicationFormAssignment.status === EvaluatorApplicationFormAssignmentStatus.DONE \n }\n\n private get isStatusSwitchDisabled(): boolean {\n return this.evaluatorApplicationFormAssignment.status === EvaluatorApplicationFormAssignmentStatus.OVERDUE \n }\n\n private get isApplicationFormLinkDisabled(): boolean {\n return this.evaluatorApplicationFormAssignment.status === EvaluatorApplicationFormAssignmentStatus.OVERDUE \n }\n\n private onStatusSwitchChange(value: boolean): void {\n this.updateStatus(value)\n }\n\n private updateStatus(value: boolean): void {\n const request: Promise = value ?\n this.service_evaluatorApplicationFormAssignmentService_flagAsDone(this.evaluatorApplicationFormAssignment.id) :\n this.service_evaluatorApplicationFormAssignmentService_flagAsInProgress(this.evaluatorApplicationFormAssignment.id)\n\n request\n }\n\n private onDisplayApplicationFormLinkClick(): void {\n if (!this.isApplicationFormLinkDisabled) {\n this.mixin_router_navigate({\n name: ROUTES.EVALUATOR_APPLICATION_FORM_DISPLAY,\n params: {\n idEvaluatorApplicationFormAssignment: this.evaluatorApplicationFormAssignment.id\n }\n })\n }\n }\n\n private onStatusSwitchMouseOver(): void {\n this.displayStatusTooltip()\n }\n\n private onStatusSwitchMouseLeave(): void {\n this.hideStatusTooltip()\n }\n\n private displayStatusTooltip(): void {\n this.isStatusTooltipOpen = true\n }\n\n private hideStatusTooltip(): void {\n this.isStatusTooltipOpen = false\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './EvaluatorCategoryAssignment.html'\n\nimport {\n MMessage,\n MMessageSkin,\n MMessageState\n} from '@ulaval/modul-components'\n\nimport { IEvaluatorCategoryAssignmentModel } from '../EvaluatorCategoryAsssignment.model';\n\nimport EvaluatorApplicationFormAssignmentRow from '../../evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormAssignmentRow';\n\n@WithRender\n@Component({\n components: {\n EvaluatorApplicationFormAssignmentRow,\n MMessage\n }\n})\nexport default class EvaluatorCategoryAssignment extends mixins() {\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MMessageState: object = MMessageState\n \n @Prop({ required: true })\n private evaluatorCategoryAssignment!: IEvaluatorCategoryAssignmentModel\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './EvaluatorCategoryAssignments.html'\n\nimport { IEvaluatorCategoryAssignmentModel } from '../EvaluatorCategoryAsssignment.model';\n\nimport EvaluatorCategoryAssignment from '../evaluator-category-assignment/EvaluatorCategoryAssignment';\n\n@WithRender\n@Component({\n components: {\n EvaluatorCategoryAssignment\n }\n})\nexport default class EvaluatorCategoryAssignments extends mixins() {\n @Prop({ required: true })\n private evaluatorCategoryAssignments!: Array\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './DashboardEvaluatorAssignmentManagement.html'\n\nimport {\n MMessage,\n MMessageState,\n MPanel\n} from '@ulaval/modul-components'\n\nimport EvaluatorCategoryAssignments from '@/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignments/EvaluatorCategoryAssignments'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport { IEvaluatorCategoryAssignmentModel } from '@/modules/evaluator-management/evaluator-category-assignment-management/EvaluatorCategoryAsssignment.model'\n\n@WithRender\n@Component({\n components: {\n EvaluatorCategoryAssignments,\n MMessage,\n MPanel,\n }\n})\nexport default class DashboardEvaluatorAssignmentManagement extends mixins() {\n private readonly MMessageState: object = MMessageState\n \n @Prop({ required: true })\n private year!: IYearModel\n\n @Prop({ required: true })\n private evaluatorCategoryAssignments!: Array\n}\n","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport BaseService from \"../global/utilities/Base.service\";\nimport { IEvaluatorToolboxFileModel } from \"./EvaluatorToolboxFile.model\";\nimport { IFileUploadModel } from \"../global/file/File.model\";\n\nexport interface IFetchEvaluatorToolboxFileListQueryParameters {\n year_id: string;\n}\n\nexport interface IFetchEvaluatorToolboxFileDepositQueryParameters {\n year_id: string;\n}\n\n@Component\nexport default class EvaluatorToolboxFileService extends BaseService {\n protected service_evaluatorToolboxFileService_fetchList(query: IFetchEvaluatorToolboxFileListQueryParameters): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery(query)\n\n this.$axios.get(`/api/admin/evaluator-toolbox-files?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data.evaluator_toolbox_files))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_evaluatorToolboxFileService_deposit(query: IFetchEvaluatorToolboxFileDepositQueryParameters, files: Array>): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery(query)\n const data: FormData = new FormData()\n\n files.forEach((uploadedFile: IFileUploadModel, fileIndex: number) => {\n if (uploadedFile.server_file) {\n data.set(`files[${fileIndex}].id`, uploadedFile.server_file.id)\n } else if (uploadedFile && uploadedFile.file) {\n data.append(`files[${fileIndex}].file`, uploadedFile.file.file)\n }\n })\n\n this.$axios.post(\n `/api/admin/evaluator-toolbox-files?${queryString}`,\n data,\n {\n headers: this.service_baseService_multipartFormDataHeader()\n }\n ).then((response: AxiosResponse) => resolve(response.data.data.evaluator_toolbox_files))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_evaluatorToolboxFileService_fetchEvaluatorList(query: IFetchEvaluatorToolboxFileListQueryParameters): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery(query)\n\n this.$axios.get(`/api/evaluator-toolbox-files?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data.evaluator_toolbox_files))\n .catch((error: AxiosError) => reject(error))\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './DashboardEvaluatorToolbox.html'\n\nimport {\n MMessage,\n MMessageSkin,\n MMessageState,\n MPanel\n} from '@ulaval/modul-components'\n\nimport UploadedFileRow from '../global/file/UploadedFileRow'\n\nimport { IYearModel } from '../global/year/Year.model'\nimport EvaluatorToolboxFileService from '../evaluator-toolbox-file-management/EvaluatorToolboxFile.service'\nimport { IEvaluatorToolboxFileModel } from '../evaluator-toolbox-file-management/EvaluatorToolboxFile.model'\nimport { IFileUploadModel } from '../global/file/File.model'\n\n@WithRender\n@Component({\n components: {\n MMessage,\n MPanel,\n UploadedFileRow\n }\n})\nexport default class DashboardEvaluatorToolbox extends mixins(EvaluatorToolboxFileService) {\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MMessageState: object = MMessageState\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Prop({ required: true })\n private evaluatorToolboxFiles!: Array\n\n private get mappedEvaluatorToolboxFiles(): Array> {\n return this.evaluatorToolboxFiles.reduce((acc: Array>, evaluatorToolboxFile: IEvaluatorToolboxFileModel) => {\n return [\n ...acc,\n {\n server_file: evaluatorToolboxFile\n }\n ]\n }, [])\n }\n}\n","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport BaseService, { IPaginationQueryParameters } from \"@/modules/global/utilities/Base.service\";\nimport { IPaginatedResponse } from \"@/modules/global/utilities/Pagination.model\";\nimport { IEvaluatorCategoryAssignmentAdminModel, IEvaluatorCategoryAssignmentModel } from \"./EvaluatorCategoryAsssignment.model\";\nimport { ICategoryModel } from \"@/modules/category-management/Category.model\";\nimport { EVENT_BUS_EVENTS } from \"@/modules/global/utilities/Events\";\n\nexport interface IAdminFetchEvaluatorsCategoryAssignmentsQueryParameters extends IPaginationQueryParameters {\n year_id: string;\n query?: string;\n}\n\nexport interface IAdminFetchEvaluatorsCategoryAssignmentsResponse extends IPaginatedResponse {\n evaluator_category_assignments: Array;\n}\n\nexport interface ICreateEvaluatorCategoryAssignmentForm {\n evaluator_idul: string;\n categories_id: Array;\n}\n\nexport interface IAdminFetchEvaluatorCategoryAssignmentsQueryParameters {\n year_id: string;\n evaluator_id: string;\n}\n\nexport interface IFetchEvaluatorCategoryAssignmentsQueryParameters {\n year_id: string;\n}\n\nexport interface IUpdateEvaluatorCategoryAssignmentForm {\n evaluator_idul: string;\n categories_id: Array;\n year_id: string;\n}\n\n@Component\nexport default class EvaluatorCategoryAssignmentService extends BaseService {\n protected service_evaluatorCategoryAssignmentService_adminFetchEvaluatorsCategoryAssignments(query: IAdminFetchEvaluatorsCategoryAssignmentsQueryParameters): Promise {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery(query)\n\n this.$axios.get(`/api/admin/evaluator-category-assignments?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_evaluatorCategoryAssignmentService_fetchAvailableCategories(yearId: string): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery({\n year_id: yearId\n })\n\n this.$axios.get(`/api/admin/evaluator-category-assignments/available-categories?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data.categories))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_evaluatorCategoryAssignmentService_createEvaluatorCategoryAssignment(payload: ICreateEvaluatorCategoryAssignmentForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.post(`/api/admin/evaluator-category-assignments`, payload)\n .then(() => {\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.EVALUATOR_CATEGORY_ASSIGNMENT_CREATED, null)\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_evaluatorCategoryAssignmentService_adminFetchEvaluatorCategoryAssignments(query: IAdminFetchEvaluatorCategoryAssignmentsQueryParameters): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery(query)\n\n this.$axios.get(`/api/admin/evaluator-category-assignments/evaluator?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data.evaluator_category_assignments))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_evaluatorCategoryAssignmentService_updateEvaluatorCategoryAssignment(payload: IUpdateEvaluatorCategoryAssignmentForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/admin/evaluator-category-assignments`, payload)\n .then(() => {\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.EVALUATOR_CATEGORY_ASSIGNMENT_UPDATED, null)\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_evaluatorCategoryAssignmentService_fetchEvaluatorCategoryAssignments(query: IFetchEvaluatorCategoryAssignmentsQueryParameters): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery(query)\n\n this.$axios.get(`/api/evaluator-category-assignments?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data.evaluator_category_assignments))\n .catch((error: AxiosError) => reject(error))\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport WithRender from './DashboardEvaluatorSection.html'\n\nimport {\n MPanel\n} from '@ulaval/modul-components'\n\nimport DashboardEvaluatorAssignmentManagement from './dashboard-evaluator-assignment-management/DashboardEvaluatorAssignmentManagement'\nimport DashboardEvaluatorToolbox from './DashboardEvaluatorToolbox'\n\nimport { IYearModel } from '../global/year/Year.model'\nimport EvaluatorToolboxFileService from '../evaluator-toolbox-file-management/EvaluatorToolboxFile.service'\nimport { IEvaluatorToolboxFileModel } from '../evaluator-toolbox-file-management/EvaluatorToolboxFile.model'\nimport EvaluatorCategoryAssignmentService from '../evaluator-management/evaluator-category-assignment-management/EvaluatorCategoryAssignment.service'\nimport { IEvaluatorCategoryAssignmentModel } from '../evaluator-management/evaluator-category-assignment-management/EvaluatorCategoryAsssignment.model'\nimport { EventBus, EVENT_BUS_EVENTS } from '../global/utilities/Events'\n\n@WithRender\n@Component({\n components: {\n DashboardEvaluatorAssignmentManagement,\n DashboardEvaluatorToolbox,\n MPanel\n }\n})\nexport default class DashboardEvaluatorSection extends mixins(EvaluatorToolboxFileService, EvaluatorCategoryAssignmentService) {\n private evaluatorToolboxFiles: Array = []\n private evaluatorCategoryAssignments: Array = []\n private isUserEvaluator: boolean = false\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Watch('year', { immediate: true })\n private onYearChange(): void {\n if (this.year) {\n this.isUserEvaluator = false\n \n this.loadEvaluatorToolboxFiles()\n this.loadEvaluatorCategoryAssignments()\n }\n }\n\n private mounted(): void {\n this.afterEvaluatorApplicationFormAssignmentUpdate()\n }\n\n private afterEvaluatorApplicationFormAssignmentUpdate(): void {\n EventBus.$on(EVENT_BUS_EVENTS.EVALUATOR_APPLICATION_FORM_ASSIGNMENT_UPDATED, () => {\n this.loadEvaluatorCategoryAssignments()\n })\n }\n\n private loadEvaluatorToolboxFiles(): void {\n this.service_evaluatorToolboxFileService_fetchEvaluatorList({\n year_id: this.year.id\n }).then((responseData: Array) => {\n this.evaluatorToolboxFiles = responseData\n this.isUserEvaluator = true\n }).catch(() => {\n this.evaluatorToolboxFiles = []\n })\n }\n\n private loadEvaluatorCategoryAssignments(): void {\n this.service_evaluatorCategoryAssignmentService_fetchEvaluatorCategoryAssignments({\n year_id: this.year.id\n }).then((responseData: Array) => {\n this.evaluatorCategoryAssignments = responseData\n this.isUserEvaluator = true\n }).catch(() => {\n this.evaluatorCategoryAssignments = []\n })\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './DashboardPage.html'\n\nimport DashboardApplicationFormManagement from './dashboard-application-form-management/DashboardApplicationFormManagement'\nimport DashboardEvaluatorSection from './DashboardEvaluatorSection'\nimport YearDropdown from '@/modules/global/year/YearDropdown'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\n\n@WithRender\n@Component({\n components: {\n DashboardApplicationFormManagement,\n DashboardEvaluatorSection,\n YearDropdown\n }\n})\nexport default class DashboardPage extends mixins() {\n private year: IYearModel | null = null\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './Breadcrumbs.html'\n\nimport { \n MIconButton,\n MIconButtonSkin,\n MLink,\n MLinkMode\n} from '@ulaval/modul-components'\n\nimport { extractLocalizedRouteParameters, generateLocalizedRouteName, ILocalizedRouteParameters, META_KEY_ADDITIONAL_BREADCRUMBS, META_KEY_HIDDEN_BREADCRUMB, META_KEY_IS_BREADCRUMB_HOME_PUBLIC_ZONE } from '@/router/helpers'\nimport ROUTES from '@/router/ROUTES';\nimport { RouteMeta } from 'vue-router';\n\nexport interface IBreadcrumbItem {\n label: string;\n href: string;\n}\n\n@WithRender\n@Component({\n components: {\n MIconButton,\n MLink\n }\n})\nexport default class Breadcrumbs extends mixins() {\n private readonly MIconButtonSkin: object = MIconButtonSkin\n private readonly MLinkMode: object = MLinkMode\n\n private get items(): Array {\n if (!this.$route || !this.$route.matched) {\n return []\n }\n\n const breadcrumbs: Array = this.$route.matched.reduce((breadcrumbs: Array, route: any) => {\n if (route.meta && route.meta[META_KEY_ADDITIONAL_BREADCRUMBS]) {\n route.meta[META_KEY_ADDITIONAL_BREADCRUMBS].forEach((additionalBreadcrumb: string) => {\n const breacrumbRouteParameters: ILocalizedRouteParameters = extractLocalizedRouteParameters(additionalBreadcrumb)\n const breacrumbRoute: any = this.$router.resolve({ \n name: additionalBreadcrumb\n })\n \n if (breacrumbRoute) {\n breadcrumbs.push({\n href: breacrumbRoute.href,\n label: this.$i18next.t(`router.breadcrumbs.${breacrumbRouteParameters.name}`)\n })\n }\n })\n }\n\n if (\n ((route.meta && route.meta[META_KEY_HIDDEN_BREADCRUMB]) || !route) ||\n route.name === this.$route.name\n ) {\n return breadcrumbs\n }\n\n const routeParameters: ILocalizedRouteParameters = extractLocalizedRouteParameters(route.name as string)\n\n breadcrumbs.push({\n href: this.$router.resolve(route).href,\n label: this.$i18next.t(`router.breadcrumbs.${routeParameters.name}`)\n })\n \n return breadcrumbs\n }, [])\n\n const meta: RouteMeta = this.$route.meta || []\n if (\n meta[META_KEY_IS_BREADCRUMB_HOME_PUBLIC_ZONE] !== true && \n breadcrumbs.length > 0\n ) {\n const currentRouteParameters: ILocalizedRouteParameters = extractLocalizedRouteParameters(this.$route.name as string)\n const dashboardRouteName: string = generateLocalizedRouteName({\n name: ROUTES.DASHBOARD,\n locale: currentRouteParameters.locale\n })\n\n breadcrumbs[0] = {\n href: this.$router.resolve({ name: dashboardRouteName }).href,\n label: this.$i18next.t(`router.breadcrumbs.${ROUTES.DASHBOARD}`)\n }\n }\n\n return breadcrumbs\n }\n}\n","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport { IUserModel } from \"./User.model\";\nimport { IPaginatedResponse } from \"../global/utilities/Pagination.model\";\nimport BaseService, { IPaginationQueryParameters } from \"../global/utilities/Base.service\";\nimport { EVENT_BUS_EVENTS } from \"../global/utilities/Events\";\n\nexport interface IUserListResponse extends IPaginatedResponse {\n users: Array;\n}\n\nexport interface IFetchUserListQueryParameters extends IPaginationQueryParameters {\n query?: string;\n}\n\nexport interface ICreateUserForm {\n idul: string;\n roles: Array;\n}\n\nexport interface IUpdateUserForm {\n roles: Array;\n}\n\n@Component\nexport default class UserService extends BaseService {\n protected service_userService_fetchList(query: IFetchUserListQueryParameters): Promise {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery(query)\n\n this.$axios.get(`/api/users?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_userService_fetchUserLdapInformations(idul: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery({ idul })\n\n this.$axios.get(`/api/users/ldap-search?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data.user))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_userService_fetch(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/users/${id}`)\n .then((response: AxiosResponse) => resolve(response.data.data.user))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_userService_create(payload: ICreateUserForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.post(`/api/users`, payload)\n .then((response: AxiosResponse) => {\n const createdUser: IUserModel = response.data.data.user\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.USER_CREATED, { user: createdUser })\n\n resolve(createdUser)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_userService_update(id: string, payload: IUpdateUserForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/users/${id}`, payload)\n .then((response: AxiosResponse) => {\n const updatedUser: IUserModel = response.data.data.user\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.USER_UPDATED, { user: updatedUser })\n\n resolve(updatedUser)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './Users.html'\n\nimport { \n AbstractControl,\n FormGroup,\n MButton,\n MTable,\n MTableHeader,\n MColumnTable,\n MColumnTextAlign,\n MPagination,\n MOption,\n MOptionItemEdit,\n MSearchfield,\n FormControl\n} from '@ulaval/modul-components'\n\nimport { IUserModel } from '../User.model'\nimport UserService, { IFetchUserListQueryParameters, IUserListResponse } from '../User.service'\nimport { IPaginationResultData } from '@/modules/global/utilities/Pagination.model'\nimport CONSTANTS from '@/CONSTANTS'\nimport ROUTES from '@/router/ROUTES'\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MOption,\n MOptionItemEdit,\n MPagination,\n MSearchfield,\n MTable,\n MTableHeader\n }\n})\nexport default class Users extends mixins(UserService) {\n public formGroup: FormGroup = new FormGroup({\n 'search-field': new FormControl()\n })\n\n private users: Array = []\n private paginationData: IPaginationResultData | null = null\n private isLoadingStateActive: boolean = false\n\n public get searchField(): AbstractControl {\n return this.formGroup.getControl('search-field');\n }\n\n private get tableColumns(): Array {\n return [\n {\n id: 'username',\n title: this.$i18next.t('modules.user-management.users.Users.table.headers.username.title'),\n dataProp: 'full_name_with_username'\n },\n {\n id: 'email',\n title: this.$i18next.t('modules.user-management.users.Users.table.headers.email.title'),\n dataProp: 'email'\n },\n {\n id: 'options',\n title: this.$i18next.t('modules.user-management.users.Users.table.headers.options.title'),\n dataProp: 'options',\n textAlign: MColumnTextAlign.Right,\n width: '50px'\n }\n ]\n }\n\n private mounted(): void {\n this.loadUsers()\n\n this.afterUserCreated()\n }\n\n private afterUserCreated(): void {\n EventBus.$on(EVENT_BUS_EVENTS.USER_CREATED, () => {\n if (this.paginationData) {\n this.loadUsers(this.paginationData.current_page_index)\n }\n })\n }\n\n private loadUsers(pageIndex: number = 0): void {\n const loadingStateActivationTimeout: any = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n\n const query: IFetchUserListQueryParameters = {\n page: pageIndex,\n query: this.searchField.value\n }\n\n this.service_userService_fetchList(query)\n .then((responseData: IUserListResponse) => {\n this.users = responseData.users || []\n this.paginationData = responseData.pagination || null\n }).catch(() => {\n this.users = []\n this.paginationData = null\n }).finally(() => {\n clearTimeout(loadingStateActivationTimeout)\n this.isLoadingStateActive = false\n })\n }\n\n private onPageChange(newIndex: number): void {\n this.loadUsers(newIndex - 1)\n }\n\n private onSearchFieldChange(): void {\n this.loadUsers(0)\n }\n\n private onCreateUserButtonClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.USER_MANAGEMENT_USER_CREATION\n })\n }\n\n private onUserUpdateOptionClick(user: IUserModel): void {\n if (user) {\n this.mixin_router_navigate({\n name: ROUTES.USER_MANAGEMENT_USER_UPDATE,\n params: {\n idUser: user.id\n }\n })\n }\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './UserManagement.html'\n\nimport { \n MPanel\n} from '@ulaval/modul-components'\n\nimport Breadcrumbs from '../global/breadcrumbs/Breadcrumbs'\nimport Users from './users/Users'\n\n@WithRender\n@Component({\n components: {\n Breadcrumbs,\n MPanel,\n Users\n }\n})\nexport default class UserManagement extends mixins() {}\n","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport { IRoleModel } from \"./Role.model\";\nimport BaseService from \"../global/utilities/Base.service\";\n\n@Component\nexport default class RoleService extends BaseService {\n protected service_roleService_fetchList(): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/roles`)\n .then((response: AxiosResponse) => resolve(response.data.data.roles))\n .catch((error: AxiosError) => reject(error))\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\nimport { AxiosError } from 'axios'\n\nimport WithRender from './UserForm.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MForm,\n MMultiSelect,\n MSearchfield,\n MTextfield,\n RequiredValidator\n} from '@ulaval/modul-components'\n\nimport { IUserModel } from '../User.model'\nimport UserService from '../User.service'\nimport RoleService from '../Role.service'\nimport { IRoleModel } from '../Role.model'\n\nexport interface IUserFormPayloadData {\n idul?: string;\n first_name?: string;\n last_name?: string;\n email?: string;\n roles: Array;\n}\n\n@WithRender\n@Component({\n components: {\n MForm,\n MMultiSelect,\n MSearchfield,\n MTextfield\n }\n})\nexport default class UserForm extends mixins(RoleService, UserService) {\n public formGroup: FormGroup = new FormGroup({\n 'role-multi-select': new FormControl>()\n })\n private formErrors: { [key: string]: string | boolean } = {}\n private roles: Array = []\n private isRoleLoadingStateActive: boolean = false\n private isLdapInformationsSearchLoadingStateActive: boolean = false\n private selectedRoles: string[] = []\n\n @Prop({ default: null })\n private user!: IUserModel | null\n\n @Prop({ default: null })\n private idulSearchBarPlaceholder!: string | null\n\n @Prop({ default: null })\n private idulSearchBarLabel!: string | null\n\n @Prop({ default: () => {\n return {}\n } })\n private requestErrors!: { [key: string]: string | boolean }\n\n @Prop({ default: true })\n private withRoleSelection!: boolean\n\n private get errors(): { [key: string]: string | boolean } {\n return {\n ...this.formErrors,\n ...this.requestErrors\n }\n }\n\n private get hideUserInformationsForm(): boolean {\n return !!this.user\n }\n\n public get idulSearchField(): AbstractControl | undefined {\n try {\n return this.formGroup.getControl('idul-search');\n } catch (error) {\n return undefined\n }\n }\n\n public get usernameField(): AbstractControl | undefined {\n try {\n return this.formGroup.getControl('username');\n } catch (error) {\n return undefined\n }\n }\n\n public get firstNameField(): AbstractControl | undefined {\n try {\n return this.formGroup.getControl('first-name');\n } catch (error) {\n return undefined\n }\n }\n\n public get lastNameField(): AbstractControl | undefined {\n try {\n return this.formGroup.getControl('last-name');\n } catch (error) {\n return undefined\n }\n }\n\n public get emailField(): AbstractControl | undefined {\n try {\n return this.formGroup.getControl('email');\n } catch (error) {\n return undefined\n }\n }\n\n public get roleMultiSelect(): AbstractControl> {\n return this.formGroup.getControl('role-multi-select');\n }\n\n public get rolesSelectOptions(): Array {\n return this.roles.map((role: IRoleModel) => role.label)\n }\n\n private get idulSearchFieldErrorMessage(): string | null {\n if (this.errors['idul']) {\n return this.$i18next.t('modules.user-management.user-form.UserForm.field.idul_search.errors.invalid_idul')\n } else if (this.errors['ldap_informations_not_found']) {\n return this.$i18next.t('modules.user-management.user-form.UserForm.field.idul_search.errors.ldap_informations_not_found')\n } else if (this.errors['user_already_exists']) {\n return this.$i18next.t('modules.user-management.user-form.UserForm.field.idul_search.errors.user_already_exists')\n } else if (\n (this.usernameField && this.usernameField.hasError()) ||\n (this.firstNameField && this.firstNameField.hasError()) ||\n (this.lastNameField && this.lastNameField.hasError()) ||\n (this.emailField && this.emailField.hasError())\n ) {\n return this.$i18next.t('modules.user-management.user-form.UserForm.field.idul_search.errors.form_empty')\n }\n\n return null\n }\n\n private created(): void {\n if (!this.hideUserInformationsForm) {\n this.formGroup.addControl('idul-search', new FormControl([RequiredValidator()]))\n this.formGroup.addControl('username', new FormControl([RequiredValidator()]))\n this.formGroup.addControl('first-name', new FormControl([RequiredValidator()]))\n this.formGroup.addControl('last-name', new FormControl([RequiredValidator()]))\n this.formGroup.addControl('email', new FormControl([RequiredValidator()]))\n }\n\n this.fetchRoles()\n }\n\n private mounted(): void {\n if (this.user) {\n this.selectedRoles = this.user.roles.map((role: IRoleModel) => role.label)\n }\n }\n\n public fetchLdapUserInformations(): void {\n if (this.idulSearchField) {\n this.isLdapInformationsSearchLoadingStateActive = true\n\n this.service_userService_fetchUserLdapInformations(this.idulSearchField.value)\n .then((userInformations: IUserModel) => {\n if (userInformations) {\n if (this.usernameField) {\n this.usernameField.value = userInformations.username\n }\n if (this.emailField) {\n this.emailField.value = userInformations.email\n }\n if (this.firstNameField) {\n this.firstNameField.value = userInformations.first_name\n }\n if (this.lastNameField) {\n this.lastNameField.value = userInformations.last_name\n }\n }\n\n this.formErrors = {}\n }).catch((error: AxiosError) => {\n this.clearUserInformations()\n\n if (\n error.response &&\n error.response.data &&\n error.response.data.validation\n ) {\n this.formErrors = error.response.data.validation\n } else {\n this.formErrors = {}\n }\n }).finally(() => {\n this.isLdapInformationsSearchLoadingStateActive = false\n })\n }\n }\n\n private fetchRoles(): void {\n if (this.withRoleSelection) {\n this.isRoleLoadingStateActive = true\n\n this.service_roleService_fetchList()\n .then((responseData: Array) => {\n this.roles = responseData || []\n }).catch(() => {\n this.roles = []\n }).finally(() => {\n this.isRoleLoadingStateActive = false\n })\n }\n }\n\n private clearUserInformations(): void {\n if (this.usernameField) {\n this.usernameField.value = ''\n }\n if (this.emailField) {\n this.emailField.value = ''\n }\n if (this.firstNameField) {\n this.firstNameField.value = ''\n }\n if (this.lastNameField) {\n this.lastNameField.value = ''\n }\n }\n\n public async getFormPayload(): Promise {\n await this.formGroup.submit()\n\n if (this.formGroup.hasErrorDeep()) {\n return null\n }\n\n return {\n idul: this.idulSearchField ? this.idulSearchField.value : undefined,\n first_name: this.firstNameField ? this.firstNameField.value : undefined,\n last_name: this.lastNameField ? this.lastNameField.value : undefined,\n email: this.emailField ? this.emailField.value : undefined,\n roles: this.mapSelectedRolesToSlugs()\n }\n }\n\n private mapSelectedRolesToSlugs(): Array {\n const slugs: Array = []\n\n this.roles.forEach((role: IRoleModel) => {\n if (this.selectedRoles.includes(role.label)) {\n slugs.push(role.slug)\n }\n })\n\n return slugs\n }\n\n public clear(): void {\n if (this.idulSearchField) {\n this.idulSearchField.value = ''\n }\n \n this.clearUserInformations()\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Ref } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './UserCreationDialog.html'\n\nimport { \n MButton,\n MButtonSkin,\n MIcon,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay\n} from '@ulaval/modul-components'\n\nimport UserForm, { IUserFormPayloadData } from '../user-form/UserForm'\nimport UserService from '../User.service'\n\nimport ROUTES from '@/router/ROUTES'\n\nconst FORM_REF: string = 'user-form'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MIcon,\n MMessage,\n MOverlay,\n UserForm\n }\n})\nexport default class UserCreationDialog extends mixins(UserService) {\n private isLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = true\n private showCreationSuccessMessage: boolean = false\n private requestErrors: { [key: string]: string | boolean } = {}\n\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MButtonSkin: object = MButtonSkin\n\n private readonly FORM_REF: string = FORM_REF\n\n @Ref(FORM_REF)\n private userFormRef!: UserForm\n\n private afterOverlayClose(): void {\n this.mixin_router_navigate({\n name: ROUTES.USER_MANAGEMENT_USER_LIST\n })\n }\n\n private async onSaveButtonClick(): Promise {\n if (this.userFormRef) {\n const formPayload: IUserFormPayloadData | null = await this.userFormRef.getFormPayload()\n\n if (formPayload) {\n this.createUser(formPayload)\n }\n }\n }\n\n private createUser(formPayload: IUserFormPayloadData): void {\n this.isLoadingStateActive = true\n\n this.service_userService_create({\n idul: formPayload.idul || '',\n roles: formPayload.roles\n }).then(() => {\n this.showCreationSuccessMessage = true\n }).catch((error: AxiosError) => {\n if (\n error.response &&\n error.response.data &&\n error.response.data.validation\n ) {\n this.requestErrors = error.response.data.validation\n } else {\n this.requestErrors = {}\n }\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Ref, Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './UserUpdateDialog.html'\n\nimport { \n MButton,\n MButtonSkin,\n MIcon,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay,\n MProgress\n} from '@ulaval/modul-components'\n\nimport UserForm, { IUserFormPayloadData } from '../user-form/UserForm'\nimport UserService from '../User.service'\n\nimport ROUTES from '@/router/ROUTES'\nimport { IUserModel } from '../User.model'\n\nconst FORM_REF: string = 'user-form'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MIcon,\n MMessage,\n MOverlay,\n MProgress,\n UserForm\n }\n})\nexport default class UserUpdateDialog extends mixins(UserService) {\n private isLoadingStateActive: boolean = false\n private isUserFetchLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = true\n private showUpdateSuccessMessage: boolean = false\n private requestErrors: { [key: string]: string | boolean } = {}\n private originalUser: IUserModel | null = null\n\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MButtonSkin: object = MButtonSkin\n\n private readonly FORM_REF: string = FORM_REF\n\n @Ref(FORM_REF)\n private userFormRef!: UserForm\n\n @Watch('$route.params.idUser', { immediate: true })\n private onUserIdRouteParameterChange(value: string): void {\n this.loadUser(value)\n }\n\n private afterOverlayClose(): void {\n this.mixin_router_navigate({\n name: ROUTES.USER_MANAGEMENT_USER_LIST\n })\n }\n\n private async onSaveButtonClick(): Promise {\n if (this.userFormRef) {\n const formPayload: IUserFormPayloadData | null = await this.userFormRef.getFormPayload()\n\n if (formPayload) {\n this.updateUser(formPayload)\n }\n }\n }\n\n private updateUser(formPayload: IUserFormPayloadData): void {\n if (this.originalUser) {\n this.isLoadingStateActive = true\n\n this.service_userService_update(this.originalUser.id, {\n roles: formPayload.roles\n }).then(() => {\n this.showUpdateSuccessMessage = true\n }).catch((error: AxiosError) => {\n if (\n error.response &&\n error.response.data &&\n error.response.data.validation\n ) {\n this.requestErrors = error.response.data.validation\n } else {\n this.requestErrors = {}\n }\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n }\n\n private loadUser(id: string): void {\n this.isUserFetchLoadingStateActive = true\n\n this.service_userService_fetch(id)\n .then((responseData: IUserModel) => {\n this.originalUser = responseData || null\n }).catch(() => {\n this.originalUser = null\n }).finally(() => {\n this.isUserFetchLoadingStateActive = false\n })\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n}\n","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport { ICategoryModel } from \"./Category.model\";\nimport BaseService from \"../global/utilities/Base.service\";\nimport { EVENT_BUS_EVENTS } from \"../global/utilities/Events\";\nimport { IFileUploadModel } from \"../global/file/File.model\";\nimport { IEvaluationCardModel } from \"./evaluation-card-management/EvaluationCard.model\";\n\nexport interface IFetchCategoryListQueryParameters {\n year_id: string;\n with_soft_deleted?: boolean;\n}\n\nexport interface ICreateCategoryForm {\n title: string;\n description: string;\n year_id: string;\n application_deposit_limit_timestamp: string;\n evaluation_period_limit_timestamp: string;\n sort_order: number;\n is_new_category: boolean;\n has_application_support: boolean;\n application_support_count_lower_bound? : number;\n application_support_count_upper_bound?: number;\n application_support_deposit_limit_timestamp?: string;\n application_support_submit_limit_timestamp?: string;\n application_support_creation_dialog_message?: string;\n application_support_creation_email_message?: string;\n}\n\nexport interface IUpdateCategoryForm {\n title: string;\n description: string;\n application_deposit_limit_timestamp: string;\n evaluation_period_limit_timestamp: string;\n sort_order: number;\n is_new_category: boolean;\n has_application_support: boolean;\n application_support_count_lower_bound? : number;\n application_support_count_upper_bound?: number;\n application_support_deposit_limit_timestamp?: string;\n application_support_submit_limit_timestamp?: string;\n application_support_creation_dialog_message?: string;\n application_support_creation_email_message?: string;\n}\n\nexport interface ICopyCategoryForm {\n target_year_id: string;\n categories_id: Array;\n}\n\nexport type IEvaluationCardDepositForm = IFileUploadModel\n\n@Component\nexport default class CategoryService extends BaseService {\n protected service_categoryService_fetchList(query: IFetchCategoryListQueryParameters): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery(query)\n\n this.$axios.get(`/api/categories?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data.categories))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_categoryService_fetch(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/categories/${id}`)\n .then((response: AxiosResponse) => resolve(response.data.data.category))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_categoryService_softDelete(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/categories/${id}/soft-delete`)\n .then((response: AxiosResponse) => {\n const updatedCategory: ICategoryModel = response.data.data.category\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.CATEGORY_UPDATED, updatedCategory)\n\n resolve(updatedCategory)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_categoryService_restore(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/categories/${id}/restore`)\n .then((response: AxiosResponse) => {\n const updatedCategory: ICategoryModel = response.data.data.category\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.CATEGORY_UPDATED, updatedCategory)\n\n resolve(updatedCategory)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_categoryService_create(payload: ICreateCategoryForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.post(`/api/categories`, payload)\n .then((response: AxiosResponse) => {\n const createdCAtegory: ICategoryModel = response.data.data.category\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.CATEGORY_CREATED, createdCAtegory)\n\n resolve(createdCAtegory)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_categoryService_update(id: string, payload: IUpdateCategoryForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/categories/${id}`, payload)\n .then((response: AxiosResponse) => {\n const updatedCategory: ICategoryModel = response.data.data.category\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.CATEGORY_UPDATED, updatedCategory)\n\n resolve(updatedCategory)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_categoryService_copy(payload: ICopyCategoryForm): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.post(`/api/categories/copy`, payload)\n .then((response: AxiosResponse) => {\n const copiedCategories: ICategoryModel = response.data.data.categories\n\n resolve(copiedCategories)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_categoryService_delete(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.delete(`/api/categories/${id}`)\n .then(() => {\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.CATEGORY_DELETED, id)\n \n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_categoryService_evaluationCardDeposit(id: string, file: IEvaluationCardDepositForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n const data: FormData = new FormData()\n\n if (file.server_file) {\n data.set(`id`, file.server_file.id)\n } else if (file && file.file) {\n data.append(`file`, file.file.file)\n }\n\n this.$axios.put(`/api/categories/${id}/evaluation-card`, data, {\n headers: this.service_baseService_multipartFormDataHeader()\n }).then((response: AxiosResponse) => {\n const updatedCategory: ICategoryModel = response.data.data.category\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.CATEGORY_UPDATED, updatedCategory)\n\n resolve(updatedCategory)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './CategoryCopyDialog.html'\n\nimport { \n MButton,\n MButtonSkin,\n MIcon,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay\n} from '@ulaval/modul-components'\n\nimport YearDropdown from '@/modules/global/year/YearDropdown'\n\nimport CategoryService, { ICopyCategoryForm } from '../Category.service'\nimport { IYearModel } from '@/modules/global/year/Year.model'\n\nimport { ICategoryModel } from '../Category.model'\n\nexport enum CategoryCopyDialog_EVENTS {\n DIALOG_CLOSE = 'after-close'\n}\n\n@WithRender\n@Component({\n components: {\n MButton,\n MIcon,\n MMessage,\n MOverlay,\n YearDropdown\n }\n})\nexport default class CategoryCopyDialog extends mixins(CategoryService) {\n private isLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = true\n private showCreationSuccessMessage: boolean = false\n private targetYear: IYearModel | null = null \n\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MButtonSkin: object = MButtonSkin\n\n @Prop({ \n required: true\n })\n private selectedCategories!: Array\n\n private afterOverlayClose(): void {\n this.$emit(CategoryCopyDialog_EVENTS.DIALOG_CLOSE)\n }\n\n private onSaveButtonClick(): void {\n if (this.targetYear) {\n this.isLoadingStateActive = true\n\n const requestPayload: ICopyCategoryForm = {\n target_year_id: this.targetYear.id,\n categories_id: this.selectedCategories.map((category: ICategoryModel) => category.id)\n }\n \n this.service_categoryService_copy(requestPayload)\n .then(() => {\n this.showCreationSuccessMessage = true\n }).finally(() => {\n this.isLoadingStateActive = true\n })\n }\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport WithRender from './Categories.html'\n\nimport { \n MButton,\n MButtonSkin,\n MCheckbox,\n MColumnSortDirection,\n MTable,\n MTableHeader,\n MColumnTable,\n MColumnTextAlign,\n MDialog,\n MDialogState,\n MDialogWidth,\n MIcon,\n MProgress,\n MOption,\n MOptionItem,\n MOptionItemEdit,\n MOptionItemDelete,\n MSwitch,\n MToast,\n MToastPosition,\n MToastState,\n MToastTimeout,\n MToastDuration\n} from '@ulaval/modul-components'\n\nimport CategoryCopyDialog from '../category-copy/CategoryCopyDialog'\n\nimport { ICategoryModel } from '../Category.model'\nimport CategoryService, { IFetchCategoryListQueryParameters } from '../Category.service'\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport { IFormTemplateModel } from '@/modules/form-template-management/FormTemplate.model'\n\nimport CONSTANTS from '@/CONSTANTS'\nimport ROUTES from '@/router/ROUTES'\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\nimport UserRoleMixin from '@/modules/user-management/UserRole.mixin'\n\n@WithRender\n@Component({\n components: {\n CategoryCopyDialog,\n MButton,\n MCheckbox,\n MDialog,\n MIcon,\n MProgress,\n MOption,\n MOptionItem,\n MOptionItemEdit,\n MOptionItemDelete,\n MTable,\n MTableHeader,\n MToast,\n MSwitch\n }\n})\nexport default class Categories extends mixins(CategoryService, UserRoleMixin) {\n private categories: Array = []\n private selectedCopyCategoriesId: Array = []\n private isLoadingStateActive: boolean = false\n private withSoftDeletedCategoriesFilter: boolean = true\n private appliedSortColumn: MColumnTable | null = null\n private isCategoryCopyDialogVisible: boolean = false\n private isCategoryDeleteDialogVisible: boolean = false\n private selectedCategoryForDelete: ICategoryModel | null = null\n private isCategoryDeleteLoadingStateActive: boolean = false\n private isCategoryDeleteSuccessToastOpen: boolean = false\n\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MDialogState: object = MDialogState\n private readonly MDialogWidth: object = MDialogWidth\n private readonly MToastPosition: object = MToastPosition\n private readonly MToastState: object = MToastState\n private readonly MToastTimeout: object = MToastTimeout\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Watch('withSoftDeletedCategoriesFilter')\n private onWithSoftDeletedCategoriesFilterChange(): void {\n this.loadCategories()\n this.onSelectAllCategoriesForCopyChange(false)\n }\n\n @Watch('year')\n private onYearChange(): void {\n this.loadCategories()\n this.onSelectAllCategoriesForCopyChange(false)\n }\n\n private get sortedCategories(): Array {\n if (!this.sortColumn.sortDirection) {\n return this.categories\n }\n\n return Array.from(this.categories).sort((leftHandSide: any, rightHandSide: any) => {\n const leftHandSideValue: number = leftHandSide[this.sortColumn.dataProp] as number\n const rightHandSideValue: number = rightHandSide[this.sortColumn.dataProp] as number\n\n return this.sortColumn.sortDirection === MColumnSortDirection.Asc ?\n leftHandSideValue - rightHandSideValue :\n rightHandSideValue - leftHandSideValue\n })\n }\n\n private get sortColumn(): MColumnTable {\n if (!this.appliedSortColumn) {\n return {\n id: 'sort-order',\n title: '',\n dataProp: 'sort_order',\n sortDirection: MColumnSortDirection.Asc,\n }\n }\n\n return this.appliedSortColumn\n }\n\n private get tableColumns(): Array {\n return [\n {\n id: 'copy-selector',\n title: this.$i18next.t('modules.category-management.categories.Categories.table.headers.copy_selector.title'),\n dataProp: 'copy-selector',\n textAlign: MColumnTextAlign.Left,\n width: '60px'\n },\n {\n id: 'sort-order',\n title: this.$i18next.t('modules.category-management.categories.Categories.table.headers.sort_order.title'),\n dataProp: 'sort_order',\n textAlign: MColumnTextAlign.Left,\n sortable: true,\n sortDirection: MColumnSortDirection.Asc,\n defaultSortDirection: MColumnSortDirection.Asc,\n width: '75px'\n },\n {\n id: 'title',\n title: this.$i18next.t('modules.category-management.categories.Categories.table.headers.title.title'),\n dataProp: 'title',\n textAlign: MColumnTextAlign.Left\n },\n {\n id: 'application-deposit-limit-timestamp',\n title: this.$i18next.t('modules.category-management.categories.Categories.table.headers.application_limit_timestamp.title'),\n dataProp: 'application-deposit-limit-timestamp',\n textAlign: MColumnTextAlign.Center,\n width: '200px'\n },\n {\n id: 'timestamp',\n title: this.$i18next.t('modules.category-management.categories.Categories.table.headers.timestamp.title'),\n dataProp: 'timestamp'\n },\n {\n id: 'soft-delete-state',\n title: this.$i18next.t('modules.category-management.categories.Categories.table.headers.soft_delete_state.title'),\n dataProp: 'soft-delete-state',\n textAlign: MColumnTextAlign.Center\n },\n {\n id: 'options',\n title: this.$i18next.t('modules.category-management.categories.Categories.table.headers.options.title'),\n dataProp: 'options',\n textAlign: MColumnTextAlign.Right,\n width: '50px'\n }\n ]\n }\n\n private get hasSelectedCategoriesForCopy(): boolean {\n return this.selectedCopyCategoriesId.length > 0\n }\n\n private get hasSelectedAllCategoriesForCopy(): boolean {\n return this.categories.length > 0 && this.selectedCopyCategoriesId.length === this.categories.length\n }\n\n private get selectedCopyCategories(): Array {\n return this.selectedCopyCategoriesId.map((id: string) => {\n return this.categories.find((category: ICategoryModel) => category.id === id) as ICategoryModel\n })\n }\n\n private mounted(): void {\n this.loadCategories()\n\n this.afterCategoryCreated()\n this.afterCategoryUpdated()\n this.afterCategoryDeleted()\n }\n\n private afterCategoryCreated(): void {\n EventBus.$on(EVENT_BUS_EVENTS.CATEGORY_CREATED, () => {\n this.loadCategories()\n })\n }\n\n private afterCategoryUpdated(): void {\n EventBus.$on(EVENT_BUS_EVENTS.CATEGORY_UPDATED, (updatedCategory: ICategoryModel) => {\n if (updatedCategory) {\n const originalCategoryIndex: number | undefined = this.categories.findIndex((category: ICategoryModel) => category.id === updatedCategory.id)\n\n if (~originalCategoryIndex) {\n if (!this.withSoftDeletedCategoriesFilter && updatedCategory.deleted_at) {\n this.$delete(this.categories, originalCategoryIndex)\n } else {\n this.$set(this.categories, originalCategoryIndex, updatedCategory)\n }\n }\n }\n\n this.loadCategories(true)\n })\n }\n\n private afterCategoryDeleted(): void {\n EventBus.$on(EVENT_BUS_EVENTS.CATEGORY_DELETED, (id: string) => {\n if (id) {\n const originalCategoryIndex: number | undefined = this.categories.findIndex((category: ICategoryModel) => category.id === id)\n\n if (~originalCategoryIndex) {\n this.$delete(this.categories, originalCategoryIndex)\n }\n }\n })\n }\n\n private loadCategories(backgroundLoad: boolean = false): void {\n let loadingStateActivationTimeout: any = null\n\n if (!backgroundLoad) {\n loadingStateActivationTimeout = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n }\n\n const query: IFetchCategoryListQueryParameters = {\n year_id: this.year.id,\n with_soft_deleted: this.withSoftDeletedCategoriesFilter\n }\n\n this.service_categoryService_fetchList(query)\n .then((responseData: Array) => {\n this.categories = responseData || []\n }).catch(() => {\n this.categories = []\n }).finally(() => {\n if (loadingStateActivationTimeout) {\n clearTimeout(loadingStateActivationTimeout)\n }\n this.isLoadingStateActive = false\n })\n }\n\n private onCreateCategoryButtonClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.CATEGORY_MANAGEMENT_CATEGORY_CREATION\n })\n }\n\n private onCategoryUpdateOptionClick(category: ICategoryModel): void {\n if (category) {\n this.mixin_router_navigate({\n name: ROUTES.CATEGORY_MANAGEMENT_CATEGORY_UPDATE,\n params: {\n idCategory: category.id\n }\n })\n }\n }\n\n private onCategorySoftDeleteStateChange(category: ICategoryModel, newStateValue: boolean): void {\n if (!newStateValue) {\n this.softDeleteCategory(category)\n } else {\n this.restoreCategory(category)\n }\n }\n\n private softDeleteCategory(category: ICategoryModel): void {\n const loadingStateActivationTimeout: any = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n \n this.service_categoryService_softDelete(category.id)\n .finally(() => {\n clearTimeout(loadingStateActivationTimeout)\n this.isLoadingStateActive = false\n })\n }\n\n private restoreCategory(category: ICategoryModel): void {\n const loadingStateActivationTimeout: any = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n \n this.service_categoryService_restore(category.id)\n .finally(() => {\n clearTimeout(loadingStateActivationTimeout)\n this.isLoadingStateActive = false\n })\n }\n\n private onSelectCategoryForCopyChange(categoryId: string, selected: boolean): void {\n if (selected) {\n if (!this.selectedCopyCategoriesId.includes(categoryId)) {\n this.$set(this.selectedCopyCategoriesId, this.selectedCopyCategoriesId.length, categoryId)\n }\n } else {\n const selectedCategoryId: number | undefined = this.selectedCopyCategoriesId.indexOf(categoryId)\n\n if (~selectedCategoryId) {\n this.$delete(this.selectedCopyCategoriesId, selectedCategoryId)\n }\n }\n }\n\n private onSelectAllCategoriesForCopyChange(selected: boolean): void {\n this.categories.forEach((category: ICategoryModel) => this.onSelectCategoryForCopyChange(category.id, selected))\n }\n\n private onTableSortApplied(column: MColumnTable): void {\n this.appliedSortColumn = column || null\n }\n\n private displayCategoryCopyDialog(): void {\n this.isCategoryCopyDialogVisible = true\n }\n\n private hideCategoryCopyDialog(): void {\n this.isCategoryCopyDialogVisible = false\n\n this.selectedCopyCategoriesId = []\n }\n\n private onCategoryDeleteOptionClick(category: ICategoryModel): void {\n if (category) {\n this.selectedCategoryForDelete = category\n this.displayCategoryDeleteDialog()\n }\n }\n\n private displayCategoryDeleteDialog(): void {\n this.isCategoryDeleteDialogVisible = true\n }\n\n private hideCategoryDeleteDialog(): void {\n this.isCategoryDeleteDialogVisible = false\n this.selectedCategoryForDelete = null\n this.isCategoryDeleteLoadingStateActive = false\n }\n\n private deleteCategory(): void {\n if (this.selectedCategoryForDelete) {\n this.isCategoryDeleteLoadingStateActive = true\n\n this.service_categoryService_delete(this.selectedCategoryForDelete.id)\n .then(() => {\n this.isCategoryDeleteSuccessToastOpen = true\n\n setTimeout(() => {\n this.isCategoryDeleteSuccessToastOpen = false\n }, MToastDuration.DesktopXShort)\n }).finally(() => {\n this.isCategoryDeleteLoadingStateActive = false\n })\n }\n }\n\n private onFormTemplateOptionClick(category: ICategoryModel, formTemplate: IFormTemplateModel): void {\n this.mixin_router_navigate({\n name: ROUTES.FORM_TEMPLATE_MANAGEMENT_FORM_TEMPLATE_PREVIEW,\n params: {\n idCategory: category.id,\n idFormTemplate: formTemplate.id\n }\n })\n }\n\n private onTriggerEvaluationCardDepositOverlayOptionClick(category: ICategoryModel): void {\n this.mixin_router_navigate({\n name: ROUTES.CATEGORY_MANAGEMENT_CATEGORY_EVALUATION_CARD_DEPOSIT,\n params: {\n idCategory: category.id\n }\n })\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './CategoryManagement.html'\n\nimport { \n MPanel\n} from '@ulaval/modul-components'\n\nimport Categories from './categories/Categories'\nimport YearDropdown from '../global/year/YearDropdown'\nimport Breadcrumbs from '../global/breadcrumbs/Breadcrumbs'\n\nimport { IYearModel } from '../global/year/Year.model'\n\n@WithRender\n@Component({\n components: {\n Breadcrumbs,\n Categories,\n MPanel,\n YearDropdown\n }\n})\nexport default class CategoryManagement extends mixins() {\n private year: IYearModel | null = null\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Model, Prop, Watch } from 'vue-property-decorator'\n\nimport WithRender from './RichTextEditor.html'\n\nimport Editor from '@tinymce/tinymce-vue'\nimport { MIcon } from '@ulaval/modul-components'\n\nimport { GLOBAL_EVENTS } from '../../utilities/Events'\n\n@WithRender\n@Component({\n components: {\n Editor,\n MIcon\n }\n})\nexport default class RichTextEditor extends mixins() {\n private content: string = ''\n private isFocused: boolean = false\n private hasError: boolean = false\n\n @Prop({ required: false })\n private label!: string\n\n @Model(GLOBAL_EVENTS.MODEL_UPDATED)\n private readonly model!: string\n\n private get richTextEditorClasses(): object {\n return {\n 'rich-text-editor--error': this.hasError,\n 'rich-text-editor--focused': this.isFocused\n }\n }\n\n @Watch('model', {\n immediate: true\n })\n private onModelChange(): void {\n this.content = this.model\n }\n\n @Watch('content')\n private onContentChange(): void {\n this.$emit(GLOBAL_EVENTS.MODEL_UPDATED, this.content)\n this.hasError = false\n }\n\n private onEditorFocus(): void {\n this.isFocused = true\n }\n\n private onEditorBlur(): void {\n this.isFocused = false\n }\n\n public async validate(): Promise {\n this.hasError = this.mixin_string_isEmpty(this.model)\n\n return !this.hasError\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref, Watch } from 'vue-property-decorator'\n\nimport WithRender from './CategoryForm.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MCheckbox,\n MDatepicker,\n MForm,\n MIntegerfield,\n MTextarea,\n MTextfield,\n MTimepicker,\n RequiredValidator\n} from '@ulaval/modul-components'\n\nimport { ICategoryModel } from '../Category.model'\nimport RichTextEditor from '@/modules/global/components/rich-text-editor/RichTextEditor'\n\nexport interface ICategoryFormPayloadData {\n title: string;\n description: string;\n application_deposit_limit_date: string;\n application_deposit_limit_time: string;\n evaluation_period_limit_date: string;\n evaluation_period_limit_time: string;\n sort_order: number;\n is_new_category: boolean;\n has_application_support: boolean;\n application_support_count_lower_bound?: number;\n application_support_count_upper_bound?: number;\n application_support_deposit_limit_date?: string;\n application_support_deposit_limit_time?: string;\n application_support_submit_limit_date?: string;\n application_support_submit_limit_time?: string;\n application_support_creation_dialog_message?: string;\n application_support_creation_email_message?: string;\n}\n\nconst REF_APPLICATION_SUPPORT_CREATION_DIALOG_MESSAGE: string = 'application-support-creation-dialog-message'\nconst REF_APPLICATION_SUPPORT_CREATION_EMAIL_MESSAGE: string = 'application-support-creation-email-message'\nconst REF_DESCRIPTION_MESSAGE: string = 'description'\n\n@WithRender\n@Component({\n components: {\n MCheckbox,\n MDatepicker,\n MForm,\n MIntegerfield,\n MTextarea,\n MTextfield,\n MTimepicker,\n RichTextEditor\n }\n})\nexport default class CategoryForm extends mixins() {\n public formGroup: FormGroup = new FormGroup({\n title: new FormControl([RequiredValidator()]),\n application_deposit_limit_date: new FormControl([RequiredValidator()]),\n application_deposit_limit_time: new FormControl([RequiredValidator()]),\n evaluation_period_limit_date: new FormControl([RequiredValidator()]),\n evaluation_period_limit_time: new FormControl([RequiredValidator()]),\n sort_order: new FormControl([RequiredValidator()]),\n is_new_category: new FormControl(),\n has_application_support: new FormControl()\n })\n private applicationSupportCreationDialogMessageModel: string = ''\n private applicationSupportCreationEmailMessageModel: string = ''\n private descriptionMessageModel: string = ''\n private formErrors: { [key: string]: string | boolean } = {}\n\n private readonly REF_APPLICATION_SUPPORT_CREATION_DIALOG_MESSAGE: string = REF_APPLICATION_SUPPORT_CREATION_DIALOG_MESSAGE\n private readonly REF_APPLICATION_SUPPORT_CREATION_EMAIL_MESSAGE: string = REF_APPLICATION_SUPPORT_CREATION_EMAIL_MESSAGE\n private readonly REF_DESCRIPTION_MESSAGE: string = REF_DESCRIPTION_MESSAGE\n\n @Prop({ default: null })\n private category!: ICategoryModel | null\n\n @Prop({ default: {} })\n private requestErrors!: { [key: string]: string | boolean }\n\n @Ref(REF_APPLICATION_SUPPORT_CREATION_DIALOG_MESSAGE)\n private applicationSupportCreationDialogMessageComponent!: RichTextEditor\n\n @Ref(REF_APPLICATION_SUPPORT_CREATION_EMAIL_MESSAGE)\n private applicationSupportCreationEmailMessageComponent!: RichTextEditor\n\n @Ref(REF_DESCRIPTION_MESSAGE)\n private descriptionMessageComponent!: RichTextEditor\n\n private get errors(): { [key: string]: string | boolean } {\n return {\n ...this.formErrors,\n ...this.requestErrors\n }\n }\n\n public get titleField(): AbstractControl {\n return this.formGroup.getControl('title');\n }\n\n public get applicationDepositLimitDateField(): AbstractControl {\n return this.formGroup.getControl('application_deposit_limit_date');\n }\n\n public get applicationDepositLimitTimeField(): AbstractControl {\n return this.formGroup.getControl('application_deposit_limit_time');\n }\n\n public get evaluationPeriodLimitDateField(): AbstractControl {\n return this.formGroup.getControl('evaluation_period_limit_date');\n }\n\n public get evaluationPeriodLimitTimeField(): AbstractControl {\n return this.formGroup.getControl('evaluation_period_limit_time');\n }\n\n public get sortOrderField(): AbstractControl {\n return this.formGroup.getControl('sort_order');\n }\n\n public get isNewCategoryCheckbox(): AbstractControl {\n return this.formGroup.getControl('is_new_category');\n }\n\n public get hasApplicationSupportCheckbox(): AbstractControl {\n return this.formGroup.getControl('has_application_support');\n }\n\n public get applicationSupportCountLowerBoundField(): AbstractControl | undefined {\n try {\n return this.formGroup.getControl('application_support_count_lower_bound');\n } catch {\n return undefined\n }\n }\n\n public get applicationSupportCountUpperBoundField(): AbstractControl | undefined {\n try {\n return this.formGroup.getControl('application_support_count_upper_bound');\n } catch {\n return undefined\n }\n }\n\n public get applicationSupportDepositLimitDateField(): AbstractControl | undefined {\n try {\n return this.formGroup.getControl('application_support_deposit_limit_date');\n } catch {\n return undefined\n }\n }\n\n public get applicationSupportDepositLimitTimeField(): AbstractControl | undefined {\n try {\n return this.formGroup.getControl('application_support_deposit_limit_time');\n } catch {\n return undefined\n }\n }\n\n public get applicationSupportSubmitLimitDateField(): AbstractControl | undefined {\n try {\n return this.formGroup.getControl('application_support_submit_limit_date');\n } catch {\n return undefined\n }\n }\n\n public get applicationSupportSubmitLimitTimeField(): AbstractControl | undefined {\n try {\n return this.formGroup.getControl('application_support_submit_limit_time');\n } catch {\n return undefined\n }\n }\n\n private get applicationSupportCountLowerBoundFieldErrorMessage(): string | null {\n if (this.errors['application_support_count_lower_bound_over_upper_bound_constraint']) {\n return this.$i18next.t(\n 'modules.category-management.category-form.CategoryForm.field.application_support_count_lower_bound.errors.application_support_count_lower_bound_over_upper_bound_constraint'\n )\n }\n\n return null\n }\n\n @Watch('hasApplicationSupportCheckbox.value')\n private onHasApplicationSupportChange(value: boolean) {\n if (value) {\n if (!this.formGroup.containsControl('application_support_count_lower_bound')) {\n this.formGroup.addControl(\n 'application_support_count_lower_bound',\n new FormControl([RequiredValidator()])\n )\n }\n if (!this.formGroup.containsControl('application_support_count_upper_bound')) {\n this.formGroup.addControl(\n 'application_support_count_upper_bound',\n new FormControl([RequiredValidator()])\n )\n }\n if (!this.formGroup.containsControl('application_support_deposit_limit_date')) {\n this.formGroup.addControl(\n 'application_support_deposit_limit_date',\n new FormControl([RequiredValidator()])\n )\n }\n if (!this.formGroup.containsControl('application_support_deposit_limit_time')) {\n this.formGroup.addControl(\n 'application_support_deposit_limit_time',\n new FormControl([RequiredValidator()])\n )\n }\n if (!this.formGroup.containsControl('application_support_submit_limit_date')) {\n this.formGroup.addControl(\n 'application_support_submit_limit_date',\n new FormControl([RequiredValidator()])\n )\n }\n if (!this.formGroup.containsControl('application_support_submit_limit_time')) {\n this.formGroup.addControl(\n 'application_support_submit_limit_time',\n new FormControl([RequiredValidator()])\n )\n }\n \n } else {\n this.formGroup.removeControl('application_support_deposit_limit_date')\n this.formGroup.removeControl('application_support_deposit_limit_time')\n this.formGroup.removeControl('application_support_count_lower_bound')\n this.formGroup.removeControl('application_support_count_upper_bound')\n this.formGroup.removeControl('application_support_submit_limit_date')\n this.formGroup.removeControl('application_support_submit_limit_time')\n this.applicationSupportCreationDialogMessageModel = ''\n this.applicationSupportCreationEmailMessageModel = ''\n }\n }\n\n private mounted(): void {\n this.populateFormFromModel()\n }\n\n private populateFormFromModel(): void {\n if (this.category) {\n this.titleField.value = this.category.title\n this.descriptionMessageModel = this.category.description\n this.applicationDepositLimitDateField.value = this.mixin_timestamp_extractDate(this.category.application_deposit_limit_timestamp)\n this.applicationDepositLimitTimeField.value = this.mixin_timestamp_extractTime(this.category.application_deposit_limit_timestamp)\n this.evaluationPeriodLimitDateField.value = this.mixin_timestamp_extractDate(this.category.evaluation_period_limit_timestamp)\n this.evaluationPeriodLimitTimeField.value = this.mixin_timestamp_extractTime(this.category.evaluation_period_limit_timestamp)\n this.sortOrderField.value = this.category.sort_order\n this.isNewCategoryCheckbox.value = this.category.is_new_category || false\n this.hasApplicationSupportCheckbox.value = this.category.has_application_support || false\n this.onHasApplicationSupportChange(this.category.has_application_support)\n\n if (this.category.has_application_support) {\n if (this.applicationSupportCountLowerBoundField && this.category.application_support_count_lower_bound) {\n this.applicationSupportCountLowerBoundField.value = this.category.application_support_count_lower_bound\n }\n if (this.applicationSupportCountUpperBoundField && this.category.application_support_count_upper_bound) {\n this.applicationSupportCountUpperBoundField.value = this.category.application_support_count_upper_bound\n }\n if (this.applicationSupportDepositLimitDateField) {\n this.applicationSupportDepositLimitDateField.value = this.mixin_timestamp_extractDate(this.category.application_support_deposit_limit_timestamp || '')\n }\n if (this.applicationSupportDepositLimitTimeField) {\n this.applicationSupportDepositLimitTimeField.value = this.mixin_timestamp_extractTime(this.category.application_support_deposit_limit_timestamp || '')\n }\n if (this.applicationSupportSubmitLimitDateField) {\n this.applicationSupportSubmitLimitDateField.value = this.mixin_timestamp_extractDate(this.category.application_support_submit_limit_timestamp || '')\n }\n if (this.applicationSupportSubmitLimitTimeField) {\n this.applicationSupportSubmitLimitTimeField.value = this.mixin_timestamp_extractTime(this.category.application_support_submit_limit_timestamp || '')\n }\n\n this.applicationSupportCreationDialogMessageModel = this.category.application_support_creation_dialog_message || ''\n this.applicationSupportCreationEmailMessageModel = this.category.application_support_creation_email_message || ''\n }\n }\n }\n\n public async getFormPayload(): Promise {\n let areRichTextEditorsValid: boolean = true\n await this.formGroup.submit()\n \n if (this.applicationSupportCreationDialogMessageComponent && (!await this.applicationSupportCreationDialogMessageComponent.validate())) {\n areRichTextEditorsValid = false\n }\n if (this.applicationSupportCreationEmailMessageComponent && (!await this.applicationSupportCreationEmailMessageComponent.validate())) {\n areRichTextEditorsValid = false\n }\n if (this.descriptionMessageComponent && (!await this.descriptionMessageComponent.validate())) {\n areRichTextEditorsValid = false\n }\n\n if (this.formGroup.hasErrorDeep() || !areRichTextEditorsValid) {\n return null\n }\n\n const formPayloadData: ICategoryFormPayloadData = {\n title: this.titleField.value,\n description: this.descriptionMessageModel,\n application_deposit_limit_date: this.applicationDepositLimitDateField.value,\n application_deposit_limit_time: this.applicationDepositLimitTimeField.value,\n evaluation_period_limit_date: this.evaluationPeriodLimitDateField.value,\n evaluation_period_limit_time: this.evaluationPeriodLimitTimeField.value,\n sort_order: this.sortOrderField.value,\n is_new_category: this.isNewCategoryCheckbox.value,\n has_application_support: this.hasApplicationSupportCheckbox.value\n }\n\n if (this.hasApplicationSupportCheckbox.value) {\n if (this.applicationSupportCountLowerBoundField) {\n formPayloadData.application_support_count_lower_bound = this.applicationSupportCountLowerBoundField.value\n }\n if (this.applicationSupportCountUpperBoundField) {\n formPayloadData.application_support_count_upper_bound = this.applicationSupportCountUpperBoundField.value\n }\n if (this.applicationSupportDepositLimitDateField) {\n formPayloadData.application_support_deposit_limit_date = this.applicationSupportDepositLimitDateField.value\n }\n if (this.applicationSupportDepositLimitTimeField) {\n formPayloadData.application_support_deposit_limit_time = this.applicationSupportDepositLimitTimeField.value\n }\n if (this.applicationSupportSubmitLimitDateField) {\n formPayloadData.application_support_submit_limit_date = this.applicationSupportSubmitLimitDateField.value\n }\n if (this.applicationSupportSubmitLimitTimeField) {\n formPayloadData.application_support_submit_limit_time = this.applicationSupportSubmitLimitTimeField.value\n }\n formPayloadData.application_support_creation_dialog_message = this.applicationSupportCreationDialogMessageModel\n formPayloadData.application_support_creation_email_message = this.applicationSupportCreationEmailMessageModel\n }\n\n return formPayloadData\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './CategoryCreationDialog.html'\n\nimport { \n MButton,\n MButtonSkin,\n MIcon,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay\n} from '@ulaval/modul-components'\n\nimport CategoryForm, { ICategoryFormPayloadData } from '../category-form/CategoryForm'\nimport CategoryService, { ICreateCategoryForm } from '../Category.service'\nimport { IYearModel } from '@/modules/global/year/Year.model'\n\nimport ROUTES from '@/router/ROUTES'\n\nconst FORM_REF: string = 'category-form'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MIcon,\n MMessage,\n MOverlay,\n CategoryForm\n }\n})\nexport default class CategoryCreationDialog extends mixins(CategoryService) {\n private isLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = true\n private showCreationSuccessMessage: boolean = false\n private requestErrors: { [key: string]: string | boolean } = {}\n\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MButtonSkin: object = MButtonSkin\n\n private readonly FORM_REF: string = FORM_REF\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Ref(FORM_REF)\n private categoryFormRef!: CategoryForm\n\n private afterOverlayClose(): void {\n this.mixin_router_navigate({\n name: ROUTES.CATEGORY_MANAGEMENT_CATEGORY_LIST\n })\n }\n\n private async onSaveButtonClick(): Promise {\n if (this.categoryFormRef) {\n const formPayload: ICategoryFormPayloadData | null = await this.categoryFormRef.getFormPayload()\n\n if (formPayload) {\n this.createCategory(formPayload)\n }\n }\n }\n\n private createCategory(formPayload: ICategoryFormPayloadData): void {\n this.isLoadingStateActive = true\n\n const requestPayload: ICreateCategoryForm = {\n title: formPayload.title,\n description: formPayload.description,\n year_id: this.year.id,\n application_deposit_limit_timestamp: this.mixin_timstamp_dateAndTimeToTimestamp(\n formPayload.application_deposit_limit_date, \n formPayload.application_deposit_limit_time\n ),\n evaluation_period_limit_timestamp: this.mixin_timstamp_dateAndTimeToTimestamp(\n formPayload.evaluation_period_limit_date, \n formPayload.evaluation_period_limit_time\n ),\n is_new_category: formPayload.is_new_category || false,\n has_application_support: formPayload.has_application_support || false,\n application_support_count_lower_bound: formPayload.application_support_count_lower_bound,\n application_support_count_upper_bound: formPayload.application_support_count_upper_bound,\n application_support_deposit_limit_timestamp: this.mixin_timstamp_dateAndTimeToTimestamp(\n formPayload.application_support_deposit_limit_date || '', \n formPayload.application_support_deposit_limit_time || ''\n ),\n application_support_submit_limit_timestamp: this.mixin_timstamp_dateAndTimeToTimestamp(\n formPayload.application_support_submit_limit_date || '', \n formPayload.application_support_submit_limit_time || ''\n ),\n application_support_creation_dialog_message: formPayload.application_support_creation_dialog_message,\n application_support_creation_email_message: formPayload.application_support_creation_email_message,\n sort_order: formPayload.sort_order\n }\n\n this.service_categoryService_create(requestPayload)\n .then(() => {\n this.showCreationSuccessMessage = true\n }).catch((error: AxiosError) => {\n if (\n error.response &&\n error.response.data &&\n error.response.data.validation\n ) {\n this.requestErrors = error.response.data.validation\n } else {\n this.requestErrors = {}\n }\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Ref, Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './CategoryUpdateDialog.html'\n\nimport { \n MButton,\n MButtonSkin,\n MIcon,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay,\n MProgress\n} from '@ulaval/modul-components'\n\nimport CategoryForm, { ICategoryFormPayloadData } from '../category-form/CategoryForm'\nimport CategoryService, { IUpdateCategoryForm } from '../Category.service'\n\nimport ROUTES from '@/router/ROUTES'\nimport { ICategoryModel } from '../Category.model'\n\nconst FORM_REF: string = 'category-form'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MIcon,\n MMessage,\n MOverlay,\n MProgress,\n CategoryForm\n }\n})\nexport default class CategoryUpdateDialog extends mixins(CategoryService) {\n private isLoadingStateActive: boolean = false\n private isCategoryFetchLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = true\n private showUpdateSuccessMessage: boolean = false\n private requestErrors: { [key: string]: string | boolean } = {}\n private originalCategory: ICategoryModel | null = null\n\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MButtonSkin: object = MButtonSkin\n\n private readonly FORM_REF: string = FORM_REF\n\n @Ref(FORM_REF)\n private categoryFormRef!: CategoryForm\n\n @Watch('$route.params.idCategory', { immediate: true })\n private onCategoryIdRouteParameterChange(value: string): void {\n this.loadCategory(value)\n }\n\n private afterOverlayClose(): void {\n this.mixin_router_navigate({\n name: ROUTES.CATEGORY_MANAGEMENT_CATEGORY_LIST\n })\n }\n\n private async onSaveButtonClick(): Promise {\n if (this.categoryFormRef) {\n const formPayload: ICategoryFormPayloadData | null = await this.categoryFormRef.getFormPayload()\n\n if (formPayload) {\n this.updateCategory(formPayload)\n }\n }\n }\n\n private updateCategory(formPayload: ICategoryFormPayloadData): void {\n if (this.originalCategory) {\n this.isLoadingStateActive = true\n\n const requestPayload: IUpdateCategoryForm = {\n title: formPayload.title,\n description: formPayload.description,\n application_deposit_limit_timestamp: this.mixin_timstamp_dateAndTimeToTimestamp(\n formPayload.application_deposit_limit_date, \n formPayload.application_deposit_limit_time\n ),\n evaluation_period_limit_timestamp: this.mixin_timstamp_dateAndTimeToTimestamp(\n formPayload.evaluation_period_limit_date, \n formPayload.evaluation_period_limit_time\n ),\n is_new_category: formPayload.is_new_category || false,\n has_application_support: formPayload.has_application_support || false,\n application_support_count_lower_bound: formPayload.application_support_count_lower_bound,\n application_support_count_upper_bound: formPayload.application_support_count_upper_bound,\n application_support_deposit_limit_timestamp: this.mixin_timstamp_dateAndTimeToTimestamp(\n formPayload.application_support_deposit_limit_date || '', \n formPayload.application_support_deposit_limit_time || ''\n ),\n application_support_submit_limit_timestamp: this.mixin_timstamp_dateAndTimeToTimestamp(\n formPayload.application_support_submit_limit_date || '', \n formPayload.application_support_submit_limit_time || ''\n ),\n application_support_creation_dialog_message: formPayload.application_support_creation_dialog_message,\n application_support_creation_email_message: formPayload.application_support_creation_email_message,\n sort_order: formPayload.sort_order\n }\n\n this.service_categoryService_update(this.originalCategory.id, requestPayload)\n .then(() => {\n this.showUpdateSuccessMessage = true\n }).catch((error: AxiosError) => {\n if (\n error.response &&\n error.response.data &&\n error.response.data.validation\n ) {\n this.requestErrors = error.response.data.validation\n } else {\n this.requestErrors = {}\n }\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n }\n\n private loadCategory(id: string): void {\n this.isCategoryFetchLoadingStateActive = true\n\n this.service_categoryService_fetch(id)\n .then((responseData: ICategoryModel) => {\n this.originalCategory = responseData || null\n }).catch(() => {\n this.originalCategory = null\n }).finally(() => {\n this.isCategoryFetchLoadingStateActive = false\n })\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n}\n","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport BaseService from \"../global/utilities/Base.service\";\nimport { EVENT_BUS_EVENTS } from \"../global/utilities/Events\";\nimport { IEmailTemplateAttachmentModel, IEmailTemplateModel } from \"./EmailTemplate.model\";\nimport { IFileUploadModel } from \"../global/file/File.model\";\nimport { IEmailTemplateRecipientFormPayloadData } from \"./email-template-form/EmailTemplateForm\";\n\nexport interface IUpdateEmailTemplateForm {\n object: string;\n content_header: string;\n content_message: string;\n files: Array>;\n carbon_copy_recipients: Array;\n blind_carbon_copy_recipients: Array;\n}\n\n@Component\nexport default class EmailTemplateService extends BaseService {\n protected service_emailTemplateService_fetchList(): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/email-templates`)\n .then((response: AxiosResponse) => resolve(response.data.data.email_templates))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_emailTemplateService_fetch(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/email-templates/${id}`)\n .then((response: AxiosResponse) => resolve(response.data.data.email_template))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_emailTemplateService_update(id: string, payload: IUpdateEmailTemplateForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n const data: FormData = new FormData()\n\n data.set('object', payload.object)\n data.set('content_header', payload.content_header)\n data.set('content_message', payload.content_message)\n\n payload.carbon_copy_recipients.forEach((recipient: IEmailTemplateRecipientFormPayloadData, index: number) => {\n if (recipient.id) {\n data.set(`carbon_copy_recipients[${index}].id`, recipient.id)\n }\n data.set(`carbon_copy_recipients[${index}].value`, recipient.value)\n })\n\n payload.blind_carbon_copy_recipients.forEach((recipient: IEmailTemplateRecipientFormPayloadData, index: number) => {\n if (recipient.id) {\n data.set(`blind_carbon_copy_recipients[${index}].id`, recipient.id)\n }\n data.set(`blind_carbon_copy_recipients[${index}].value`, recipient.value)\n })\n \n payload.files.forEach((uploadedFile: IFileUploadModel, index: number) => {\n if (uploadedFile.server_file) {\n data.set(`attachments[${index}].id`, uploadedFile.server_file.id)\n } else if (uploadedFile && uploadedFile.file) {\n data.append(`attachments[${index}].file`, uploadedFile.file.file)\n }\n })\n\n this.$axios.put(`/api/email-templates/${id}`, data, {\n headers: this.service_baseService_multipartFormDataHeader()\n }).then((response: AxiosResponse) => {\n const updatedEmailTemplate: IEmailTemplateModel = response.data.data.email_template\n\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.EMAIL_TEMPLATE_UPDATED, updatedEmailTemplate)\n\n resolve(updatedEmailTemplate)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './EmailTemplates.html'\n\nimport { \n MTable,\n MTableHeader,\n MOption,\n MOptionItemEdit,\n MColumnTextAlign,\n MColumnTable,\n MColumnSortDirection,\n} from '@ulaval/modul-components'\n\nimport EmailTemplateService from '../EmailTemplate.service'\nimport { IEmailTemplateModel } from '../EmailTemplate.model'\nimport CONSTANTS from '@/CONSTANTS'\nimport ROUTES from '@/router/ROUTES'\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\n\n@WithRender\n@Component({\n components: {\n MOption,\n MOptionItemEdit,\n MTable,\n MTableHeader\n }\n})\nexport default class EmailTemplates extends mixins(EmailTemplateService) {\n private emailTemplates: Array = []\n private isLoadingStateActive: boolean = false\n private appliedSortColumn: MColumnTable | null = null\n\n private get sortedEmailTemplates(): Array {\n if (!this.sortColumn.sortDirection) {\n return this.emailTemplates\n }\n\n return Array.from(this.emailTemplates).sort((leftHandSide: any, rightHandSide: any) => {\n const leftHandSideValue: string = leftHandSide[this.sortColumn.dataProp] as string\n const rightHandSideValue: string = rightHandSide[this.sortColumn.dataProp] as string\n\n return leftHandSideValue.localeCompare(rightHandSideValue) * (this.sortColumn.sortDirection || 1)\n })\n }\n\n private get sortColumn(): MColumnTable {\n if (!this.appliedSortColumn) {\n return {\n id: 'identifier',\n title: '',\n dataProp: 'slug',\n sortDirection: MColumnSortDirection.Asc,\n }\n }\n\n return this.appliedSortColumn\n }\n\n private get tableColumns(): Array {\n return [\n {\n id: 'identifier',\n title: this.$i18next.t('modules.email-template-management.email-templates.EmailTemplates.table.headers.identifier.title'),\n dataProp: 'slug',\n sortable: true,\n sortDirection: MColumnSortDirection.Asc,\n defaultSortDirection: MColumnSortDirection.Asc\n },\n {\n id: 'last-update',\n title: this.$i18next.t('modules.email-template-management.email-templates.EmailTemplates.table.headers.last_update.title'),\n dataProp: 'last-update'\n },\n {\n id: 'options',\n title: this.$i18next.t('modules.email-template-management.email-templates.EmailTemplates.table.headers.options.title'),\n dataProp: 'options',\n textAlign: MColumnTextAlign.Right,\n width: '50px'\n }\n ]\n }\n\n private mounted(): void {\n this.loadEmailTemplates()\n\n this.afterEmailTemplateUpdated()\n }\n\n private afterEmailTemplateUpdated(): void {\n EventBus.$on(EVENT_BUS_EVENTS.EMAIL_TEMPLATE_UPDATED, (updatedEmailTemplate: IEmailTemplateModel) => {\n if (updatedEmailTemplate) {\n const originalEmailTemplateIndex: number | undefined = this.emailTemplates.findIndex((emailTemplate: IEmailTemplateModel) => emailTemplate.id === updatedEmailTemplate.id)\n\n if (~originalEmailTemplateIndex) {\n this.$set(this.emailTemplates, originalEmailTemplateIndex, updatedEmailTemplate)\n }\n }\n })\n }\n\n private loadEmailTemplates(): void {\n const loadingStateActivationTimeout: any = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n\n this.service_emailTemplateService_fetchList()\n .then((responseData: Array) => {\n this.emailTemplates = responseData || []\n }).catch(() => {\n this.emailTemplates = []\n }).finally(() => {\n clearTimeout(loadingStateActivationTimeout)\n this.isLoadingStateActive = false\n })\n }\n\n private onEmailTemplateUpdateOptionClick(emailTemplate: IEmailTemplateModel): void {\n if (emailTemplate) {\n this.mixin_router_navigate({\n name: ROUTES.EMAIL_TEMPLATE_MANAGEMENT_EMAIL_TEMPLATE_UPDATE,\n params: {\n idEmailTemplate: emailTemplate.id\n }\n })\n }\n }\n\n private onTableSortApplied(column: MColumnTable): void {\n this.appliedSortColumn = column || null\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './EmailTemplateManagement.html'\n\nimport { \n MPanel\n} from '@ulaval/modul-components'\n\nimport Breadcrumbs from '../global/breadcrumbs/Breadcrumbs'\nimport EmailTemplates from './email-templates/EmailTemplates'\n\n@WithRender\n@Component({\n components: {\n Breadcrumbs,\n EmailTemplates,\n MPanel\n }\n})\nexport default class EmailTemplateManagement extends mixins() {\n\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './EmailTemplateForm.html'\n\nimport { \n AbstractControl,\n EmailValidator,\n FormControl,\n FormGroup,\n MAdd,\n MButton,\n MCheckbox,\n MDatepicker,\n MFileUpload,\n MForm,\n MIconButton,\n MIntegerfield,\n MTextarea,\n MTextfield,\n MTextfieldType,\n MTimepicker,\n RequiredValidator\n} from '@ulaval/modul-components'\nimport { MFile } from '@ulaval/modul-components/dist/utils/file/file'\n\nimport RichTextEditor from '@/modules/global/components/rich-text-editor/RichTextEditor'\nimport UploadedFileRow from '@/modules/global/file/UploadedFileRow'\n\nimport { IEmailTemplateAttachmentModel, IEmailTemplateModel, IEmailTemplateRecipientModel } from '../EmailTemplate.model'\nimport { IFileUploadModel } from '@/modules/global/file/File.model'\n\nexport interface IEmailTemplateFormPayloadData {\n object: string;\n content_header: string;\n content_message: string;\n files: Array>;\n carbon_copy_recipients: Array;\n blind_carbon_copy_recipients: Array;\n}\n\nexport interface IEmailTemplateRecipientFormPayloadData {\n id?: string;\n value: string;\n}\n\n@WithRender\n@Component({\n components: {\n MAdd,\n MButton,\n MCheckbox,\n MDatepicker,\n MFileUpload,\n MForm,\n MIconButton,\n MIntegerfield,\n MTextarea,\n MTextfield,\n MTimepicker,\n RichTextEditor,\n UploadedFileRow\n }\n})\nexport default class EmailTemplateForm extends mixins() {\n public formGroup: FormGroup = new FormGroup({\n object: new FormControl([RequiredValidator()]),\n content_header: new FormControl([RequiredValidator()])\n })\n private contentMessage: string = ''\n private emailTemplateAttachments: Array> = []\n private carbonCopyRecipients: Array = []\n private blindCarbonCopyRecipients: Array = []\n private formErrors: { [key: string]: string | boolean } = {}\n\n private readonly ALLOWED_ATTACHMENT_EXTENSIONS: Array = [\n 'pdf'\n ]\n private readonly MTextfieldType: any = MTextfieldType\n\n @Prop({ default: null })\n private emailTemplate!: IEmailTemplateModel | null\n\n @Prop({ default: {} })\n private requestErrors!: { [key: string]: string | boolean }\n\n private get errors(): { [key: string]: string | boolean } {\n return {\n ...this.formErrors,\n ...this.requestErrors\n }\n }\n\n public get objectField(): AbstractControl {\n return this.formGroup.getControl('object');\n }\n\n public get contentHeaderField(): AbstractControl {\n return this.formGroup.getControl('content_header');\n }\n\n public get carbonCopyRecipientFields(): Array> {\n const fields: Array> = []\n\n this.carbonCopyRecipients.forEach((recipient: IEmailTemplateRecipientFormPayloadData, index: number) => {\n fields.push(this.formGroup.getControl(this.computeCarbonCopyRecipientFieldName(index)))\n })\n\n return fields\n }\n\n public get blindCarbonCopyRecipientFields(): Array> {\n const fields: Array> = []\n\n this.blindCarbonCopyRecipients.forEach((recipient: IEmailTemplateRecipientFormPayloadData, index: number) => {\n fields.push(this.formGroup.getControl(this.computeBlindCarbonCopyRecipientFieldName(index)))\n })\n\n return fields\n }\n\n private mounted(): void {\n this.populateFormFromModel()\n }\n\n private populateFormFromModel(): void {\n if (this.emailTemplate) {\n this.objectField.value = this.emailTemplate.object\n this.contentHeaderField.value = this.emailTemplate.content_header\n this.contentMessage = this.emailTemplate.content_message\n\n this.emailTemplate.attachments.forEach((emailTemplateAttachment: IEmailTemplateAttachmentModel) => {\n this.emailTemplateAttachments.push({\n server_file: emailTemplateAttachment\n })\n })\n\n this.emailTemplate.carbon_copy_recipients.forEach((recipient: IEmailTemplateRecipientModel) => {\n this.addCarbonCopyRecipient(recipient)\n\n this.carbonCopyRecipients.push({\n id: recipient.id,\n value: recipient.value\n })\n })\n\n this.emailTemplate.blind_carbon_copy_recipients.forEach((recipient: IEmailTemplateRecipientModel) => {\n this.addBlindCarbonCopyRecipient(recipient)\n\n this.blindCarbonCopyRecipients.push({\n id: recipient.id,\n value: recipient.value\n })\n })\n }\n }\n\n public async getFormPayload(): Promise {\n await this.formGroup.submit()\n\n if (this.formGroup.hasErrorDeep()) {\n return null\n }\n\n const formPayloadData: IEmailTemplateFormPayloadData = {\n object: this.objectField.value,\n content_header: this.contentHeaderField.value,\n content_message: this.contentMessage,\n files: this.emailTemplateAttachments,\n carbon_copy_recipients: this.carbonCopyRecipients,\n blind_carbon_copy_recipients: this.blindCarbonCopyRecipients\n }\n\n return formPayloadData\n }\n\n private onFilesReady(files: Array): void {\n this.$file.uploadTemp(files)\n }\n\n private onFilesUploadCompleted(files: Array): void {\n files.forEach((file: MFile) => {\n this.emailTemplateAttachments.push({ file })\n })\n }\n\n private removeEmailAttachment(index: number): void {\n this.$delete(this.emailTemplateAttachments, index)\n }\n\n private computeCarbonCopyRecipientFieldName(index: number): string {\n return `carbon-copy-recipient[${index}]`\n }\n\n private computeBlindCarbonCopyRecipientFieldName(index: number): string {\n return `blind-carbon-copy-recipient[${index}]`\n }\n\n private addCarbonCopyRecipient(recipient: IEmailTemplateRecipientModel): void {\n const fieldIdentifier: string = this.computeCarbonCopyRecipientFieldName(this.carbonCopyRecipients.length)\n this.formGroup.addControl(fieldIdentifier, new FormControl([RequiredValidator(), EmailValidator()]))\n\n if (recipient) {\n this.formGroup.getControl(fieldIdentifier).value = recipient.value\n } else {\n this.carbonCopyRecipients.push({\n value: ''\n })\n }\n }\n\n private addBlindCarbonCopyRecipient(recipient: IEmailTemplateRecipientModel): void {\n const fieldIdentifier: string = this.computeBlindCarbonCopyRecipientFieldName(this.blindCarbonCopyRecipients.length)\n this.formGroup.addControl(fieldIdentifier, new FormControl([RequiredValidator(), EmailValidator()]))\n\n if (recipient) {\n this.formGroup.getControl(fieldIdentifier).value = recipient.value\n } else {\n this.blindCarbonCopyRecipients.push({\n value: ''\n })\n }\n }\n\n private onCarbonCopyRecipientValueChange(index: number, value: string): void {\n this.formGroup.getControl(this.computeCarbonCopyRecipientFieldName(index)).value = value\n this.carbonCopyRecipients[index].value = value\n }\n\n private onBlindCarbonCopyRecipientValueChange(index: number, value: string): void {\n this.formGroup.getControl(this.computeBlindCarbonCopyRecipientFieldName(index)).value = value\n this.blindCarbonCopyRecipients[index].value = value\n }\n\n private deleteCarbonCopyRecipient(index: number): void {\n this.formGroup.removeControl(this.computeCarbonCopyRecipientFieldName(index))\n this.$delete(this.carbonCopyRecipients, index)\n }\n\n private deleteBlindCarbonCopyRecipient(index: number): void {\n this.formGroup.removeControl(this.computeBlindCarbonCopyRecipientFieldName(index))\n this.$delete(this.blindCarbonCopyRecipients, index)\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Ref, Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './EmailTemplateUpdateDialog.html'\n\nimport { \n MButton,\n MButtonSkin,\n MIcon,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay,\n MProgress\n} from '@ulaval/modul-components'\n\nimport EmailTemplateForm, { IEmailTemplateFormPayloadData } from '../email-template-form/EmailTemplateForm'\n\nimport EmailTemplateService, { IUpdateEmailTemplateForm } from '../EmailTemplate.service'\n\nimport ROUTES from '@/router/ROUTES'\nimport { IEmailTemplateModel } from '../EmailTemplate.model'\n\nconst FORM_REF: string = 'emailTemplate-form'\n\n@WithRender\n@Component({\n components: {\n EmailTemplateForm,\n MButton,\n MIcon,\n MMessage,\n MOverlay,\n MProgress\n }\n})\nexport default class EmailTemplateUpdateDialog extends mixins(EmailTemplateService) {\n private isLoadingStateActive: boolean = false\n private isEmailTemplateFetchLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = true\n private showUpdateSuccessMessage: boolean = false\n private requestErrors: { [key: string]: string | boolean } = {}\n private originalEmailTemplate: IEmailTemplateModel | null = null\n\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MButtonSkin: object = MButtonSkin\n\n private readonly FORM_REF: string = FORM_REF\n\n @Ref(FORM_REF)\n private emailTemplateFormRef!: EmailTemplateForm\n\n @Watch('$route.params.idEmailTemplate', { immediate: true })\n private onEmailTemplateIdRouteParameterChange(value: string): void {\n this.loadEmailTemplate(value)\n }\n\n private afterOverlayClose(): void {\n this.mixin_router_navigate({\n name: ROUTES.EMAIL_TEMPLATE_MANAGEMENT_EMAIL_TEMPLATE_LIST\n })\n }\n\n private async onSaveButtonClick(): Promise {\n if (this.emailTemplateFormRef) {\n const formPayload: IEmailTemplateFormPayloadData | null = await this.emailTemplateFormRef.getFormPayload()\n\n if (formPayload) {\n this.updateEmailTemplate(formPayload)\n }\n }\n }\n\n private updateEmailTemplate(formPayload: IEmailTemplateFormPayloadData): void {\n if (this.originalEmailTemplate) {\n this.isLoadingStateActive = true\n\n const requestPayload: IUpdateEmailTemplateForm = formPayload\n\n this.service_emailTemplateService_update(this.originalEmailTemplate.id, requestPayload)\n .then(() => {\n this.showUpdateSuccessMessage = true\n }).catch((error: AxiosError) => {\n if (\n error.response &&\n error.response.data &&\n error.response.data.validation\n ) {\n this.requestErrors = error.response.data.validation\n } else {\n this.requestErrors = {}\n }\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n }\n\n private loadEmailTemplate(id: string): void {\n this.isEmailTemplateFetchLoadingStateActive = true\n\n this.service_emailTemplateService_fetch(id)\n .then((responseData: IEmailTemplateModel) => {\n this.originalEmailTemplate = responseData || null\n }).catch(() => {\n this.originalEmailTemplate = null\n }).finally(() => {\n this.isEmailTemplateFetchLoadingStateActive = false\n })\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './FormTemplateUpdateDropZone.html'\n\nimport FormTemplateUpdateInsertZone from './FormTemplateUpdateInsertZone'\nimport FormTemplateUpdateDropZoneElement from './FormTemplateUpdateDropZoneElement'\n\nimport { IFormTemplateAvailableElementModel, IInternalFormTemplateElementModel, IInternalFormTemplateModel } from '../FormTemplate.model'\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\n\n@WithRender\n@Component({\n components: {\n FormTemplateUpdateDropZoneElement,\n FormTemplateUpdateInsertZone\n }\n})\nexport default class FormTemplateUpdateDropZone extends mixins() {\n private insertDraggedElement: IFormTemplateAvailableElementModel | null = null\n private moveDraggedElement: IInternalFormTemplateElementModel | null = null\n private isInsertDraggedElementOver: boolean = false\n\n @Prop({ required: true })\n private formTemplate!: IInternalFormTemplateModel\n\n @Prop({ required: true })\n private requestErrors!: { [key: string]: string }\n\n private get sortedElements(): Array {\n return this.formTemplate.elements.sort((leftHandSide: IInternalFormTemplateElementModel, rightHandSide: IInternalFormTemplateElementModel) => {\n return leftHandSide.element_position_index - rightHandSide.element_position_index\n })\n }\n\n private created(): void {\n this.onElementInsertDragStart()\n this.onElementInsertDragEnd()\n this.onElementMoveDragStart()\n this.onElementMoveDragEnd()\n }\n\n private onElementInsertDragStart(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_INSERT_DRAG_STARTED, (element: IFormTemplateAvailableElementModel) => {\n if (element.allow_as_root_element) {\n this.insertDraggedElement = element || null\n }\n })\n }\n\n private onElementInsertDragEnd(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_INSERT_DRAG_ENDED, () => {\n this.insertDraggedElement = null\n })\n }\n\n private onElementMoveDragStart(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_MOVE_DRAG_STARTED, (element: IInternalFormTemplateElementModel) => {\n if (element.parent_internal_identifier == null) {\n this.moveDraggedElement = element || null\n }\n })\n }\n\n private onElementMoveDragEnd(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_MOVE_DRAG_ENDED, () => {\n this.moveDraggedElement = null\n })\n }\n\n private isDraggedElementMovable(index: number): boolean {\n if (!this.moveDraggedElement) {\n return false\n }\n\n if (this.moveDraggedElement.element_position_index === index) {\n return false\n }\n\n return this.moveDraggedElement.element_position_index !== index &&\n this.moveDraggedElement.element_position_index !== --index\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './FormTemplateUpdateAvailableElements.html'\n\nimport { IFormTemplateAvailableElementModel } from '../FormTemplate.model'\nimport { DRAG_AND_DROP_EVENTS_IDENTIFIER, DRAG_AND_DROP_EVENTS_IDENTIFIER_KEY, EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\n\n@WithRender\n@Component({\n components: {}\n})\nexport default class FormTemplateUpdateAvailableElements extends mixins() {\n @Prop({ required: true })\n private availableFormTemplateElements!: Array\n\n private get mappedFormTemplateElementsBySection(): { [key: string]: Array } {\n return this.availableFormTemplateElements.reduce((mappedElements: { [key: string]: Array }, element: IFormTemplateAvailableElementModel) => {\n if (!mappedElements[element.element_section]) {\n mappedElements[element.element_section] = []\n }\n\n mappedElements[element.element_section].push(element)\n\n return mappedElements\n }, {})\n }\n\n private sortedFormTemplateElements(elements: Array): Array {\n return elements.sort((leftHandSide: IFormTemplateAvailableElementModel, rightHandSide: IFormTemplateAvailableElementModel) => {\n return leftHandSide.element_type.localeCompare(rightHandSide.element_type)\n })\n }\n\n private onDragStart(element: IFormTemplateAvailableElementModel, event: DragEvent): void {\n if (event && event.dataTransfer) {\n event.dataTransfer.setData(DRAG_AND_DROP_EVENTS_IDENTIFIER_KEY, DRAG_AND_DROP_EVENTS_IDENTIFIER.FORM_TEMPLATE_ELEMENT_INSERT)\n event.dataTransfer.setData('text/plain', JSON.stringify(element))\n\n EventBus.$emit(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_INSERT_DRAG_STARTED, element)\n }\n }\n\n private onDragEnd(): void {\n EventBus.$emit(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_INSERT_DRAG_ENDED)\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport WithRender from './FormTemplateUpdateSelectedElement.html'\n\nimport { \n MAdd,\n MButton,\n MButtonSkin,\n MDropdown,\n MDropdownItem,\n MIconButton,\n MMessage,\n MMessageState,\n MTextfield,\n MTextfieldType,\n MTooltip,\n MSwitch,\n} from '@ulaval/modul-components'\n\nimport RichTextEditor from '@/modules/global/components/rich-text-editor/RichTextEditor'\n\nimport { \n IFormTemplateAvailableElementModel, \n IFormTemplateAvailableElementModelParameter, \n IInternalFormTemplateElementModel, \n IInternalFormTemplateElementParameterModel, \n IInternalFormTemplateElementOptionModel \n} from '../FormTemplate.model'\n\nimport { EventBus, EVENT_BUS_EVENTS, IFormTemplateElementUpdatedEventPayload } from '@/modules/global/utilities/Events'\n\n@WithRender\n@Component({\n components: {\n MAdd,\n MButton,\n MDropdown,\n MDropdownItem,\n MIconButton,\n MMessage,\n MTextfield,\n MTooltip,\n MSwitch,\n RichTextEditor\n }\n})\nexport default class FormTemplateUpdateSelectedElement extends mixins() { \n private parametersValue: { [key: string]: any } = {}\n private elementOptions: Array = []\n \n private readonly MTextfieldType: any = MTextfieldType\n private readonly MButtonSkin: any = MButtonSkin\n private readonly MMessageState: any = MMessageState\n\n @Prop({ required: true })\n private availableFormTemplateElements!: Array\n\n @Prop({ required: true })\n private selectedElement!: IInternalFormTemplateElementModel\n\n @Prop({ required: true })\n private requestErrors!: { [key: string]: string }\n\n private get mappedAvailableFormTemplateElements(): { [key: string]: IFormTemplateAvailableElementModel } {\n return Array.from(this.availableFormTemplateElements).reduce(\n (\n elements: { [key: string]: IFormTemplateAvailableElementModel }, \n element: IFormTemplateAvailableElementModel\n ) => {\n return {\n ...elements,\n [element.element_type]: element\n }\n }, {})\n }\n\n private get selectedElementAvailableElementType(): IFormTemplateAvailableElementModel | null {\n return this.mappedAvailableFormTemplateElements[this.selectedElement.element_type] || null\n }\n\n private get sortedAvailableElementTypeParameters(): Array {\n if (!this.selectedElementAvailableElementType) {\n return []\n }\n\n return Array.from(this.selectedElementAvailableElementType.element_parameters).sort((leftHandSide: IFormTemplateAvailableElementModelParameter, rightHandSide: IFormTemplateAvailableElementModelParameter) => {\n return leftHandSide.type.localeCompare(rightHandSide.type)\n })\n }\n\n private get availableElementTypeHasParameters(): boolean {\n if (!this.selectedElementAvailableElementType) {\n return false\n }\n\n return this.selectedElementAvailableElementType.element_parameters.length > 0\n }\n\n private hasParameterTooltipLabel(parameter: IInternalFormTemplateElementParameterModel): boolean {\n return this.$i18next.exists(`modules.form-template-management.FormTemplateModel.element_parameters_tooltip.${parameter.key}`)\n }\n\n private hasParameterHelperMessageLabel(parameter: IInternalFormTemplateElementParameterModel): boolean {\n return this.$i18next.exists(`modules.form-template-management.FormTemplateModel.element_parameters_helper_message.${parameter.key}`)\n }\n\n @Watch('selectedElementAvailableElementType', { immediate: true })\n private onSelectedElementAvailableElementTypeChange(): void {\n this.initializeParametersValue()\n }\n\n @Watch('selectedElement', { immediate: true })\n private onSelectedElementChange(): void {\n this.mapSelectedElementOptions()\n this.validateForm()\n }\n\n private getParameterComponentName(parameter: IFormTemplateAvailableElementModelParameter): string {\n if (!this.selectedElementAvailableElementType) {\n return ''\n }\n\n if (parameter.options.length > 0) {\n return 'm-dropdown'\n }\n\n switch (parameter.type) {\n case 'Boolean':\n return 'm-switch'\n case 'Integer':\n case 'Number':\n case 'String':\n return 'm-textfield'\n case 'RichTextParameterType':\n return 'rich-text-editor'\n default:\n return ''\n }\n }\n\n private getParameterComponentType(parameter: IFormTemplateAvailableElementModelParameter): string {\n switch (parameter.type) {\n case 'Integer':\n case 'Number':\n return MTextfieldType.Number\n case 'String':\n return MTextfieldType.Text\n default:\n return ''\n }\n }\n\n private initializeParametersValue(): void {\n if (this.selectedElementAvailableElementType) {\n this.selectedElementAvailableElementType.element_parameters.forEach((parameter: IFormTemplateAvailableElementModelParameter) => {\n switch (parameter.type) {\n case 'Boolean':\n this.parametersValue[parameter.key] = false\n break\n case 'Integer':\n this.parametersValue[parameter.key] = 0\n break\n case 'RichTextParameterType':\n case 'String':\n this.parametersValue[parameter.key] = ''\n break\n default:\n this.parametersValue[parameter.key] = null\n break\n }\n })\n }\n \n this.mapSelectedElementParametersValue()\n }\n\n private mapSelectedElementParametersValue(): void {\n const selectedElementMappedParameters: { [key: string]: IInternalFormTemplateElementParameterModel } = this.selectedElement.element_parameters.reduce(\n (\n parameters: { [key: string]: IInternalFormTemplateElementParameterModel },\n parameter: IInternalFormTemplateElementParameterModel\n ) => {\n return {\n ...parameters,\n [parameter.key]: parameter\n }\n },\n {}\n )\n\n Object.keys(this.parametersValue).forEach((parameterKey: string) => {\n if (selectedElementMappedParameters[parameterKey]) {\n try {\n this.parametersValue[parameterKey] = JSON.parse(selectedElementMappedParameters[parameterKey].value)\n } catch(exception) {\n this.parametersValue[parameterKey] = selectedElementMappedParameters[parameterKey].value\n }\n }\n })\n }\n\n private onParameterValueChange(parameterKey: string, value: any): void {\n this.$set(this.parametersValue, parameterKey, value)\n this.$forceUpdate()\n }\n\n private mapSelectedElementOptions(): void {\n this.elementOptions = []\n\n this.selectedElement.element_options.forEach((option: IInternalFormTemplateElementOptionModel) => {\n this.$set(this.elementOptions, this.elementOptions.length, {\n value: option.value,\n order: option.order\n })\n })\n\n this.sortElementOptions()\n }\n\n private addElementOption(): void {\n this.$set(this.elementOptions, this.elementOptions.length, {\n label: '',\n value: '',\n order: ''\n })\n }\n\n private deleteElementOption(index: number): void {\n this.$delete(this.elementOptions, index)\n }\n\n private onDeleteButtonClick(): void {\n EventBus.$emit(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_DELETED, this.selectedElement)\n }\n\n private onUpdateButtonClick(): void {\n if (this.validateForm()) {\n EventBus.$emit(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_UPDATED, {\n elementInternalIdentifier: this.selectedElement.internal_identifier,\n elementOptions: this.elementOptions,\n elementParametersValue: this.parametersValue\n } as IFormTemplateElementUpdatedEventPayload)\n\n this.sortElementOptions()\n }\n }\n\n private onOptionValueChange(optionIndex: number, value: string): void {\n this.$set(this.elementOptions[optionIndex], 'value', value)\n }\n\n private onOptionOrderChange(optionIndex: number, order: string): void {\n this.$set(this.elementOptions[optionIndex], 'order', order)\n }\n\n private onParameterOptionSelect(parameterKey: string, option: string): void {\n this.parametersValue[parameterKey] = option\n }\n\n private sortElementOptions(): void {\n this.elementOptions = this.elementOptions\n .sort((lhs: IInternalFormTemplateElementOptionModel, rhs: IInternalFormTemplateElementOptionModel) => {\n return lhs.order - rhs.order\n })\n }\n\n private validateForm(): boolean {\n let hasErrors: boolean = false\n\n this.elementOptions.forEach((option: any, index: number) => {\n if (!option.value) {\n hasErrors = true\n option.valueError = this.$i18next.t(`modules.form-template-management.form-template-update.FormTemplateUpdateSelectedElement.errors.option.value.empty`)\n } else {\n option.valueError = null\n }\n \n if (!option.order) {\n hasErrors = true\n option.orderError = this.$i18next.t(`modules.form-template-management.form-template-update.FormTemplateUpdateSelectedElement.errors.option.order.empty`)\n } else if (isNaN(option.order)) {\n hasErrors = true\n option.orderError = this.$i18next.t(`modules.form-template-management.form-template-update.FormTemplateUpdateSelectedElement.errors.option.order.numeric`)\n } else {\n option.orderError = null\n }\n \n this.$set(this.elementOptions, index, option)\n })\n\n return !hasErrors\n }\n\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './FormTemplateUpdateElementPanel.html'\n\nimport { \n MNavbar,\n MNavbarItem,\n MNavbarSkin\n} from '@ulaval/modul-components'\n\nimport FormTemplateUpdateAvailableElements from './FormTemplateUpdateAvailableElements'\nimport FormTemplateUpdateSelectedElement from './FormTemplateUpdateSelectedElement'\n\nimport { IFormTemplateAvailableElementModel, IInternalFormTemplateElementModel } from '../FormTemplate.model'\nimport FormTemplateService from '../FormTemplate.service'\n\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\nimport { STORE_GETTERS } from '@/store'\n\nenum TABS_IDENTIFIER {\n AVAILABLE_ELEMENTS = 'available_elements',\n SELECTED_ELEMENT = 'selected_element'\n} \n\n@WithRender\n@Component({\n components: {\n FormTemplateUpdateAvailableElements,\n FormTemplateUpdateSelectedElement,\n MNavbar,\n MNavbarItem\n }\n})\nexport default class FormTemplateUpdateElementPanel extends mixins(FormTemplateService) {\n private selectedElement: IInternalFormTemplateElementModel | null = null\n\n private selectedTabIdentifier: string = TABS_IDENTIFIER.AVAILABLE_ELEMENTS\n\n private readonly MNavbarSkin: any = MNavbarSkin\n private readonly TABS_IDENTIFIER: any = TABS_IDENTIFIER\n\n @Prop({ required: true })\n private requestErrors!: { [key: string]: string }\n\n private get availableFormTemplateElements(): Array {\n return this.$store.getters[STORE_GETTERS.FORM_TEMPLATE_AVAILABLE_ELEMENT_GET_FORM_TEMPLATE_AVAILABLE_ELEMENTS]\n }\n\n private created(): void {\n this.onSelectedElementChange()\n this.onElementInsertDragStart()\n this.onFormTemplateElementDelete()\n this.onFormTemplateElementUpdate()\n }\n\n private onSelectedElementChange(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_SELECTED, (eventSelectedElement: IInternalFormTemplateElementModel) => {\n this.selectedElement = eventSelectedElement\n this.selectedTabIdentifier = TABS_IDENTIFIER.SELECTED_ELEMENT\n })\n }\n\n private onFormTemplateElementUpdate(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_UPDATED, () => {\n this.selectedTabIdentifier = TABS_IDENTIFIER.AVAILABLE_ELEMENTS\n this.selectedElement = null\n })\n }\n\n private onElementInsertDragStart(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_INSERT_DRAG_STARTED, () => {\n this.selectedTabIdentifier = TABS_IDENTIFIER.AVAILABLE_ELEMENTS\n this.selectedElement = null\n })\n }\n\n private onFormTemplateElementDelete(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_DELETED, () => {\n this.selectedTabIdentifier = TABS_IDENTIFIER.AVAILABLE_ELEMENTS\n this.selectedElement = null \n })\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './FormTemplateManagement.html'\n\nimport { \n MMessage,\n MMessageState,\n MPanel,\n MSpinner,\n MToast\n} from '@ulaval/modul-components'\n\nimport FormTemplateUpdateDropZone from './form-template-update/FormTemplateUpdateDropZone'\nimport FormTemplateUpdateElementPanel from './form-template-update/FormTemplateUpdateElementPanel'\nimport Breadcrumbs from '../global/breadcrumbs/Breadcrumbs'\n\nimport FormTemplateService from './FormTemplate.service'\nimport { IInternalFormTemplateElementModel, IInternalFormTemplateModel } from './FormTemplate.model'\n\nimport { EventBus, EVENT_BUS_EVENTS, IFormTemplateElementInsertDragDroppedEventPayload, IFormTemplateElementMoveDragDroppedEventPayload, IFormTemplateElementUpdatedEventPayload } from '@/modules/global/utilities/Events'\n\n@WithRender\n@Component({\n components: {\n Breadcrumbs,\n FormTemplateUpdateDropZone,\n FormTemplateUpdateElementPanel,\n MMessage,\n MPanel,\n MSpinner,\n MToast\n }\n})\nexport default class FormTemplateManagement extends mixins(FormTemplateService) {\n private formTemplate: IInternalFormTemplateModel | null = null\n private isLoadingOverlayActive: boolean = true\n private insertTimedout: boolean = false\n\n private readonly MMessageState: object = MMessageState\n\n @Watch('$route.params.idFormTemplate', { immediate: true })\n private onRouteIdFormTemplateChange(id: string): void {\n if (id) {\n this.loadFormTemplate(id)\n }\n }\n\n private created(): void {\n this.onFormTemplateInsertElementDrop()\n this.onFormTemplateElementDelete()\n this.onFormTemplateElementUpdate()\n this.onFormTemplateMoveElementDrop()\n this.afterFormTemplateUpdate()\n }\n\n private loadFormTemplate(id: string): void {\n this.isLoadingOverlayActive = true\n\n this.service_formTemplateService_fetchMappedToInternalFormTemplate(id)\n .then((response: IInternalFormTemplateModel) => {\n this.formTemplate = response || null\n }).catch((error: AxiosError) => {\n this.mixin_router_redirectRequestError(error)\n }).finally(() => {\n this.isLoadingOverlayActive = false\n })\n }\n\n private afterFormTemplateUpdate(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_UPDATED, (payload: IInternalFormTemplateModel) => {\n this.formTemplate = payload || null\n })\n }\n\n private onFormTemplateInsertElementDrop(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_INSERT_DRAG_DROPPED, (payload: IFormTemplateElementInsertDragDroppedEventPayload) => {\n this.insertTimedout = true\n setTimeout(() => {\n this.insertTimedout = false\n }, 1000)\n\n if (payload && this.formTemplate) {\n if (payload.parentInternalIdentifier == null) {\n const internalFormTemplateElement: IInternalFormTemplateElementModel = {\n internal_identifier: payload.insertionElementPositionIndex.toString(),\n parent_internal_identifier: payload.parentInternalIdentifier,\n element_type: payload.element_type.element_type,\n element_position_index: payload.insertionElementPositionIndex,\n element_options: [],\n element_parameters: [],\n childrens: []\n }\n\n this.formTemplate.elements.splice(payload.insertionElementPositionIndex, 0, internalFormTemplateElement)\n } else {\n this.recalculateFormTemplatePositionRecursive(this.formTemplate.elements, 0)\n this.insertElementInFormTemplateRecursive(payload, this.formTemplate.elements)\n }\n \n this.recalculateFormTemplatePositionRecursive(this.formTemplate.elements, 0)\n }\n })\n }\n\n private onFormTemplateMoveElementDrop(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_MOVE_DRAG_DROPPED, (payload: IFormTemplateElementMoveDragDroppedEventPayload) => {\n if (payload && this.formTemplate) {\n if (payload.parentInternalIdentifier == null) {\n const movedInternalFormTemplateElement: IInternalFormTemplateElementModel = Object.assign({}, payload.originalElement)\n movedInternalFormTemplateElement.element_position_index = payload.insertionElementPositionIndex\n\n this.formTemplate.elements.splice(payload.originalElement.element_position_index, 1)\n this.formTemplate.elements.splice(payload.insertionElementPositionIndex, 0, movedInternalFormTemplateElement)\n } else {\n this.recalculateFormTemplatePositionRecursive(this.formTemplate.elements, 0)\n this.moveElementInFormTemplateRecursive(payload, this.formTemplate.elements)\n }\n\n this.recalculateFormTemplatePositionRecursive(this.formTemplate.elements, 0)\n }\n })\n }\n\n private onFormTemplateElementDelete(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_DELETED, (elementToDelete: IInternalFormTemplateElementModel) => {\n if (elementToDelete && this.formTemplate) {\n this.deleteFormTemplateElementRecursive(this.formTemplate.elements, elementToDelete)\n }\n })\n }\n\n private onFormTemplateElementUpdate(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_UPDATED, (eventPayload: IFormTemplateElementUpdatedEventPayload) => {\n if (eventPayload && this.formTemplate) {\n this.updateFormTemplateElementRecursive(this.formTemplate.elements, eventPayload)\n }\n })\n }\n\n private insertElementInFormTemplateRecursive(payload: IFormTemplateElementInsertDragDroppedEventPayload, elements: Array): void {\n elements.forEach((element: IInternalFormTemplateElementModel) => {\n if (element.internal_identifier === payload.parentInternalIdentifier) {\n const internalFormTemplateElement: IInternalFormTemplateElementModel = {\n internal_identifier: `${payload.parentInternalIdentifier}-${payload.insertionElementPositionIndex.toString()}`,\n parent_internal_identifier: payload.parentInternalIdentifier,\n element_type: payload.element_type.element_type,\n element_position_index: payload.insertionElementPositionIndex,\n element_options: [],\n element_parameters: [],\n childrens: []\n }\n\n element.childrens.splice(payload.insertionElementPositionIndex, 0, internalFormTemplateElement)\n } else {\n this.insertElementInFormTemplateRecursive(payload, element.childrens)\n } \n })\n }\n\n private moveElementInFormTemplateRecursive(payload: IFormTemplateElementMoveDragDroppedEventPayload, elements: Array): void {\n elements.forEach((element: IInternalFormTemplateElementModel) => {\n if (element.internal_identifier === payload.parentInternalIdentifier) {\n const movedInternalFormTemplateElement: IInternalFormTemplateElementModel = Object.assign({}, payload.originalElement)\n movedInternalFormTemplateElement.element_position_index = payload.insertionElementPositionIndex\n\n element.childrens.splice(payload.originalElement.element_position_index, 1)\n element.childrens.splice(payload.insertionElementPositionIndex, 0, movedInternalFormTemplateElement)\n } else {\n this.moveElementInFormTemplateRecursive(payload, element.childrens)\n }\n })\n }\n\n private recalculateFormTemplatePositionRecursive(elements: Array, moveStartingIndex: number, parentInternalIdentifier?: string): void {\n for (let i: number = elements.length - 1; i >= moveStartingIndex; i--) {\n elements[i].element_position_index = i\n elements[i].parent_internal_identifier = parentInternalIdentifier\n elements[i].internal_identifier = parentInternalIdentifier ? `${parentInternalIdentifier}-${i}` : i.toString()\n\n this.$set(elements, i, elements[i])\n\n this.recalculateFormTemplatePositionRecursive(elements[i].childrens, 0, elements[i].internal_identifier)\n }\n }\n\n private deleteFormTemplateElementRecursive(elements: Array, elementToDelete: IInternalFormTemplateElementModel, parentInternalIdentifier?: string): void {\n let elementToDeleteIndex: number | null = null\n\n elements.forEach((element: IInternalFormTemplateElementModel, index: number) => {\n if (element.internal_identifier === elementToDelete.internal_identifier) {\n elementToDeleteIndex = index\n } else {\n this.deleteFormTemplateElementRecursive(element.childrens, elementToDelete, element.internal_identifier)\n }\n })\n\n if (elementToDeleteIndex != null) {\n this.$delete(elements, elementToDeleteIndex)\n this.recalculateFormTemplatePositionRecursive(elements, 0, parentInternalIdentifier)\n }\n }\n\n private updateFormTemplateElementRecursive(elements: Array, eventPayload: IFormTemplateElementUpdatedEventPayload): void {\n elements.forEach((element: IInternalFormTemplateElementModel) => {\n if (element.internal_identifier === eventPayload.elementInternalIdentifier) {\n element.element_options = eventPayload.elementOptions\n\n const newElementParameters: { [key: string]: any } = Object.assign({}, eventPayload.elementParametersValue)\n for (const elementParameter of element.element_parameters) {\n if (typeof newElementParameters[elementParameter.key] !== 'undefined') {\n elementParameter.value = newElementParameters[elementParameter.key]\n delete newElementParameters[elementParameter.key]\n }\n }\n\n Object.entries(newElementParameters).forEach(([key, value]) => {\n element.element_parameters.push({\n key,\n value,\n })\n })\n } else {\n this.updateFormTemplateElementRecursive(element.childrens, eventPayload)\n }\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport WithRender from './FormTemplateUpdate.html'\n\nimport { \n MButton,\n MButtonSkin,\n MDialog,\n MMessage,\n MMessageState,\n MMessageSkin,\n MPanel,\n MToast,\n MToastPosition,\n MToastState,\n MToastTimeout,\n} from '@ulaval/modul-components'\n\nimport FormTemplateUpdateDropZone from './FormTemplateUpdateDropZone'\nimport FormTemplateUpdateElementPanel from './FormTemplateUpdateElementPanel'\n\nimport FormTemplateService from '../FormTemplate.service'\nimport { IInternalFormTemplateElementModel, IInternalFormTemplateModel } from '../FormTemplate.model'\n\nimport ROUTES from '@/router/ROUTES'\nimport { EventBus, EVENT_BUS_EVENTS, IFormTemplateElementUpdatedEventPayload } from '@/modules/global/utilities/Events'\nimport { AxiosError } from 'axios'\n\n@WithRender\n@Component({\n components: {\n FormTemplateUpdateDropZone,\n FormTemplateUpdateElementPanel,\n MButton,\n MDialog,\n MMessage,\n MPanel,\n MToast\n }\n})\nexport default class FormTemplateUpdate extends mixins(FormTemplateService) {\n private isFormTemplateUpdateStateActive: boolean = false\n private isFormTemplateUpdateSuccessToastActive: boolean = false\n private isFormTemplateUpdateErrorToastActive: boolean = false\n private requestErrors: { [key: string]: string } = {}\n\n private readonly MButtonSkin: any = MButtonSkin\n private readonly MToastTimeout: any = MToastTimeout\n private readonly MToastPosition: any = MToastPosition\n private readonly MToastState: any = MToastState\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n\n @Prop({ required: true })\n private formTemplate!: IInternalFormTemplateModel\n\n @Watch('formTemplate', { immediate: true })\n private onFormTemplateChange(value: IInternalFormTemplateModel): void {\n if (!value.is_updateable) {\n this.mixin_router_navigate({\n name: ROUTES.FORM_TEMPLATE_MANAGEMENT_FORM_TEMPLATE_PREVIEW,\n params: {\n idCategory: value.category.id,\n idFormTemplate: value.id\n }\n })\n }\n }\n\n private created(): void {\n this.loadAvailableElements()\n }\n\n private mounted(): void {\n this.onFormTemplateElementDelete()\n this.onFormTemplateElementUpdate()\n }\n\n private onFormTemplateElementDelete(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_DELETED, (elementToDelete: IInternalFormTemplateElementModel) => {\n if (elementToDelete) {\n this.$delete(this.requestErrors, elementToDelete.internal_identifier)\n }\n })\n }\n\n private onFormTemplateElementUpdate(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_TEMPLATE_ELEMENT_UPDATED, (eventPayload: IFormTemplateElementUpdatedEventPayload) => {\n if (eventPayload) {\n this.$delete(this.requestErrors, eventPayload.elementInternalIdentifier)\n }\n })\n }\n\n private updateFormTemplate(): Promise {\n return new Promise((resolve: any, reject: any): void => {\n if (this.formTemplate) {\n this.isFormTemplateUpdateStateActive = true\n this.isFormTemplateUpdateSuccessToastActive = false\n this.isFormTemplateUpdateErrorToastActive = false\n\n this.service_formTemplateService_update(this.formTemplate)\n .then(() => {\n this.isFormTemplateUpdateSuccessToastActive = true\n this.$forceUpdate()\n resolve()\n }).catch((error: AxiosError) => {\n this.isFormTemplateUpdateErrorToastActive = true\n\n if (\n error.response &&\n error.response.data &&\n error.response.data.validation\n ) {\n this.mapRequestErrors(error.response.data.validation)\n }\n\n reject(error)\n }).finally(() => {\n this.isFormTemplateUpdateStateActive = false\n })\n } else {\n resolve()\n }\n })\n }\n\n private loadAvailableElements(): void {\n this.service_formTemplateService_fetchAvailableElements()\n }\n\n private onPreviewButtonClick(): void {\n this.updateFormTemplate()\n .then(() => {\n this.mixin_router_navigate({\n name: ROUTES.FORM_TEMPLATE_MANAGEMENT_FORM_TEMPLATE_PREVIEW,\n params: this.$route.params\n })\n })\n }\n\n private navigateToCategoriesList(): void {\n this.mixin_router_navigate({\n name: ROUTES.CATEGORY_MANAGEMENT_CATEGORY_LIST\n })\n }\n\n private onFormTemplateUpdateSuccessToastClose(): void {\n this.isFormTemplateUpdateSuccessToastActive = false\n }\n\n private onFormTemplateUpdateErrorToastClose(): void {\n this.isFormTemplateUpdateErrorToastActive = false\n }\n\n private mapRequestErrors(errors: object): void {\n this.requestErrors = {}\n\n Object.entries(errors || {}).forEach(([key, value]: [string, string]) => {\n const elementPositionIdentifiers: Array = Array.from(key.matchAll(/\\[(.*?)\\]/g), (match: any) => match[1])\n const internalIdentifierFromErrorIdentifiers: string = elementPositionIdentifiers.reduce((internalIdentifier: string, errorIdentifier: string) => {\n if (internalIdentifier) {\n return `${internalIdentifier}-${errorIdentifier}`\n }\n\n return errorIdentifier\n })\n\n if (key.includes(\"element_options\")) {\n const parentInternalIdentifier: string = internalIdentifierFromErrorIdentifiers.substring(0, internalIdentifierFromErrorIdentifiers.lastIndexOf('-'))\n this.requestErrors[parentInternalIdentifier] = 'FormTemplateElementOptionConstraint'\n this.requestErrors[internalIdentifierFromErrorIdentifiers] = 'FormTemplateElementOptionConstraint'\n } else {\n this.requestErrors[internalIdentifierFromErrorIdentifiers] = value\n }\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './FormElements.html'\n\nimport FormElement from './FormElement'\n\nimport { IInternalFormTemplateElementModel } from '@/modules/form-template-management/FormTemplate.model'\nimport { IFormAnswerModel } from '../Form.model'\nimport { IFormAnswerForm } from '../Form.service'\nimport FormElementMixin from './FormElement.mixin'\n\n@WithRender\n@Component({\n name: 'form-elements',\n components: {\n FormElement\n }\n})\nexport default class FormElements extends mixins() {\n @Prop({ required: true })\n private elements!: Array\n\n @Prop({ \n required: false,\n default: () => []\n })\n private answers!: Array\n\n @Prop({ \n required: false,\n default: false\n })\n private isFormReadonly!: boolean\n\n @Prop({\n required: false,\n default: false\n })\n protected displayDuplicateAnswers!: boolean\n\n @Prop({\n required: false,\n default: false\n })\n protected hideSensitiveInformations!: boolean\n\n @Prop({\n required: false,\n default: false\n })\n protected displayEvaluatorAdditionnalInformations!: boolean\n\n public async getElementAnswers(validateAnswers: boolean = true): Promise | null> {\n let answers: Array = []\n let childrenHasError: boolean = false\n\n if (this.$children) {\n for (const component of this.$children) {\n const componentAnswers: Array | null = await (component as FormElementMixin).getElementAnswersRecursive(validateAnswers)\n\n if (componentAnswers) {\n answers = [\n ...answers,\n ...componentAnswers\n ]\n } else {\n childrenHasError = true\n }\n }\n }\n\n if (!validateAnswers) {\n return answers\n }\n \n return childrenHasError ? null : answers\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref } from 'vue-property-decorator'\n\nimport WithRender from './FormTemplatePreview.html'\n\nimport { \n MButton,\n MButtonSkin,\n MMessage,\n MMessageState,\n MPanel\n} from '@ulaval/modul-components'\n\nimport FormElements from '@/modules/form-management/form-element/FormElements'\n\nimport { IInternalFormTemplateModel } from '../FormTemplate.model'\n\nimport ROUTES from '@/router/ROUTES'\n\nconst FORM_ELEMENTS_REF = 'form-elements'\n\n@WithRender\n@Component({\n components: {\n FormElements,\n MButton,\n MMessage,\n MPanel\n }\n})\nexport default class FormTemplatePreview extends mixins() {\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MMessageState: object = MMessageState\n private readonly FORM_ELEMENTS_REF: string = FORM_ELEMENTS_REF\n\n @Prop({ required: true })\n private formTemplate!: IInternalFormTemplateModel\n\n @Ref(FORM_ELEMENTS_REF)\n private formElementsComponent!: FormElements\n\n private get hasFormElements(): boolean {\n return this.formTemplate.elements.length > 0\n }\n\n private onUpdateButtonClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.FORM_TEMPLATE_MANAGEMENT_FORM_TEMPLATE_UPDATE,\n params: this.$route.params\n })\n }\n\n private async onShowValidationRulesButtonClick(): Promise {\n await this.formElementsComponent.getElementAnswers()\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Ref, Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './ApplicationForm.html'\n\nimport { \n MButton,\n MButtonSkin,\n MDialog,\n MDialogState,\n MDialogWidth,\n MIcon,\n MMessage,\n MMessageState,\n MPanel,\n MSpinner,\n MToast,\n MToastDuration,\n MToastPosition,\n MToastState,\n MToastTimeout,\n} from '@ulaval/modul-components'\n\nimport Breadcrumbs from '@/modules/global/breadcrumbs/Breadcrumbs'\nimport FormElements from '@/modules/form-management/form-element/FormElements'\n\nimport ApplicationFormService, { IFetchApplicationFormResponse } from '../ApplicationForm.service'\nimport { IApplicationFormModel } from '../ApplicationForm.model'\nimport { IFormModel } from '@/modules/form-management/Form.model'\nimport { IInternalFormTemplateModel } from '@/modules/form-template-management/FormTemplate.model'\nimport { IFormAnswerForm } from '@/modules/form-management/Form.service'\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\nimport ApplicationFormMixin from '../ApplicationForm.mixin'\n\nconst FORM_ELEMENTS_REF = 'form-elements'\n\n@WithRender\n@Component({\n components: {\n Breadcrumbs,\n FormElements,\n MButton,\n MDialog,\n MIcon,\n MMessage,\n MPanel,\n MSpinner,\n MToast\n }\n})\nexport default class ApplicationForm extends mixins(ApplicationFormService, ApplicationFormMixin) {\n private applicationForm: IApplicationFormModel | null = null\n private form: IFormModel | null = null\n private internalFormTemplate: IInternalFormTemplateModel | null = null\n private isLoadingStateActive: boolean = true\n private isSubmitConfirmationDialogActive: boolean = false\n private isSubmitSuccessToastOpen: boolean = false\n private isSubmitErrorToastOpen: boolean = false\n private isValidationErrorToastOpen: boolean = false\n private isSaveSuccessToastOpen: boolean = false\n private isDownloadAllFormAnswerFilesLoadingStateActive: boolean = false\n private requestErrors: { [key: string]: boolean } = {}\n\n private readonly FORM_ELEMENTS_REF: string = FORM_ELEMENTS_REF\n private readonly MMessageState: object = MMessageState\n private readonly MDialogState: object = MDialogState\n private readonly MDialogWidth: object = MDialogWidth\n private readonly MToastPosition: object = MToastPosition\n private readonly MToastState: object = MToastState\n private readonly MToastTimeout: object = MToastTimeout\n private readonly MButtonSkin: object = MButtonSkin\n private readonly VALIDATION_KEY_PROVIDED_SUPPORT_UNDER_THRESHOLD: string = 'application_form_support_provided_under_threshold'\n\n @Ref(FORM_ELEMENTS_REF)\n private formElementsComponent!: FormElements\n\n private get submitDialogState(): MDialogState {\n if (this.isSubmitErrorToastOpen || this.hasSubmitErrors) {\n return MDialogState.Error\n } else if (this.isSubmitSuccessToastOpen) {\n return MDialogState.Confirmation\n }\n\n return MDialogState.Warning\n }\n \n private get computeSubmitDialogLabel(): string {\n if (this.requestErrors[this.VALIDATION_KEY_PROVIDED_SUPPORT_UNDER_THRESHOLD]) {\n if (this.applicationForm && this.applicationForm.category_application_support_count_lower_bound && this.applicationForm.category_application_support_count_lower_bound > 1) {\n return this.$i18next.t('modules.application-form-management.application-form.ApplicationForm.dialog.submit_confirmation.label_provided_support_under_threshold.plural', this.applicationForm as any)\n }\n \n return this.$i18next.t('modules.application-form-management.application-form.ApplicationForm.dialog.submit_confirmation.label_provided_support_under_threshold.singular', this.applicationForm as any)\n }\n\n return this.$i18next.t('modules.application-form-management.application-form.ApplicationForm.dialog.submit_confirmation.label')\n }\n\n private get hasSubmitErrors(): boolean {\n return Object.keys(this.requestErrors).length > 0\n }\n\n @Watch('$route.params.idApplicationForm', { immediate: true })\n private onRouteParamsIdChange(value: string | null) {\n if (value) {\n this.loadApplicationForm(value)\n }\n }\n\n private mounted(): void {\n this.onFormNextStepButtonClick()\n }\n\n private loadApplicationForm(id: string, isBackgroundRefresh: boolean = false): void {\n this.isLoadingStateActive = !isBackgroundRefresh\n this.isValidationErrorToastOpen = false\n\n this.service_applicationFormService_fetchApplicationForm(id)\n .then((response: IFetchApplicationFormResponse) => {\n this.applicationForm = response.application_form || null\n this.form = response.form || null\n this.internalFormTemplate = response.internal_form_template || null\n }).catch(() => {\n this.applicationForm = null\n this.form = null\n this.internalFormTemplate = null\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private onFormNextStepButtonClick(): void {\n EventBus.$on(EVENT_BUS_EVENTS.FORM_ELEMENT_STEP_WIZARD_STEP_SELECTED, () => {\n if (this.applicationForm && this.applicationForm.is_updateable) {\n this.onSaveButtonClick(true)\n }\n })\n }\n\n private async onSaveButtonClick(isBackgroundSave: boolean = false): Promise {\n const answers: Array | null = await this.formElementsComponent.getElementAnswers(false)\n\n if (answers) {\n this.saveApplicationForm(answers, isBackgroundSave)\n }\n }\n\n private saveApplicationForm(answers: Array, isBackgroundSave: boolean = false): void {\n if (this.applicationForm) {\n this.isLoadingStateActive = !isBackgroundSave\n this.isSaveSuccessToastOpen = false\n\n this.service_applicationFormService_saveApplicationForm(this.applicationForm.id, answers)\n .then(() => {\n this.loadApplicationForm(this.$route.params.idApplicationForm, isBackgroundSave)\n\n if (!isBackgroundSave) {\n this.isSaveSuccessToastOpen = true\n }\n }).catch((error: AxiosError) => {\n this.isLoadingStateActive = false\n this.mixin_router_redirectRequestError(error)\n })\n }\n }\n\n private async onSubmitButtonClick(): Promise {\n this.requestErrors = {}\n const answers: Array | null = await this.formElementsComponent.getElementAnswers()\n\n if (answers) {\n this.submitApplicationForm(answers)\n }\n }\n\n private submitApplicationForm(answers: Array): void {\n if (this.applicationForm) {\n this.isLoadingStateActive = true\n\n this.service_applicationFormService_submitApplicationForm(this.applicationForm.id, answers)\n .then(() => {\n this.loadApplicationForm(this.$route.params.idApplicationForm)\n\n this.isSubmitSuccessToastOpen = true\n this.isSubmitErrorToastOpen = false\n }).catch((errorResponse: AxiosError) => {\n if (errorResponse.response && errorResponse.response.data) {\n this.requestErrors = (errorResponse.response.data as any).validation || {}\n }\n\n this.isSubmitSuccessToastOpen = false\n this.isSubmitErrorToastOpen = true\n this.isLoadingStateActive = false\n }).finally(() => {\n setTimeout(() => {\n this.isSubmitSuccessToastOpen = false\n }, MToastDuration.DesktopXShort)\n setTimeout(() => {\n this.isSubmitErrorToastOpen = false\n }, MToastDuration.DesktopXShort)\n })\n }\n }\n\n private async displaySubmitConfirmationDialog(): Promise {\n const answers: Array | null = await this.formElementsComponent.getElementAnswers()\n\n if (answers) {\n this.isSubmitConfirmationDialogActive = true\n }\n\n this.isValidationErrorToastOpen = !answers\n }\n\n private hideSubmitConfirmationDialog(): void {\n this.isSubmitConfirmationDialogActive = false\n this.requestErrors = {}\n }\n\n private async downloadAllFormAnswerFiles(): Promise {\n this.isDownloadAllFormAnswerFilesLoadingStateActive = true\n\n await this.mixin_applicationForm_downloadAllFormAnswerFiles(this.form || undefined)\n\n this.isDownloadAllFormAnswerFilesLoadingStateActive = false\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref, Watch } from 'vue-property-decorator'\n\nimport WithRender from './ApplicationFormForm.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MAdd,\n MCheckbox,\n MDropdown,\n MDropdownItem,\n MForm,\n MMessage,\n MMessageState,\n RequiredValidator,\n} from '@ulaval/modul-components'\n\nimport UserForm, { IUserFormPayloadData } from '@/modules/user-management/user-form/UserForm'\nimport ApplicationFormSupportForm, { IApplicationFormSupportFormPayloadData } from '@/modules/application-form-support-management/application-form-support-form/ApplicationFormSupportForm'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport { ICategoryModel } from '@/modules/category-management/Category.model'\nimport ApplicationFormService from '../ApplicationForm.service'\nimport { STORE_GETTERS } from '@/store'\n\nconst USER_FORM_REF: string = 'user-form'\nconst APPLICATION_FORM_SUPPORT_FORM_REF: string = 'application-form-support-form'\n\nexport interface IApplicationFormFormPayloadData {\n category_id: string;\n candidate_idul: string;\n application_form_supports?: Array;\n}\n\n@WithRender\n@Component({\n components: {\n ApplicationFormSupportForm, \n MAdd,\n MCheckbox,\n MDropdown,\n MDropdownItem,\n MForm,\n MMessage,\n UserForm\n }\n})\nexport default class ApplicationFormForm extends mixins(ApplicationFormService) {\n public formGroup: FormGroup = new FormGroup({\n categoryId: new FormControl([RequiredValidator()])\n })\n private categories: Array = []\n private isCategoryLoadingStateActive: boolean = false\n private applicationFormSupportForms: Array = []\n\n private readonly USER_FORM_REF: string = USER_FORM_REF\n private readonly APPLICATION_FORM_SUPPORT_FORM_REF: string = APPLICATION_FORM_SUPPORT_FORM_REF\n private readonly MMessageState: object = MMessageState\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Ref(USER_FORM_REF)\n private userFormComponent!: UserForm\n\n @Ref(APPLICATION_FORM_SUPPORT_FORM_REF)\n private applicationFormSupportFormComponents!: Array\n\n private get categoryDropdown(): AbstractControl {\n return this.formGroup.getControl('categoryId');\n }\n\n private get categoriesMappedById(): { [key: string]: ICategoryModel } {\n return this.categories.reduce((mappedCategories: { [key: string]: ICategoryModel }, category: ICategoryModel) => {\n mappedCategories[category.id] = category\n return mappedCategories\n }, {})\n }\n\n private get selectedCategory(): ICategoryModel | null {\n if (!this.categoryDropdown.value) {\n return null\n }\n\n return this.categoriesMappedById[this.categoryDropdown.value] || null\n }\n\n @Watch('categoryDropdown.value')\n private onSelectedCategoryChange(): void {\n this.applicationFormSupportForms = []\n }\n\n private created(): void {\n this.loadAvailableCategories()\n }\n\n private loadAvailableCategories(): void {\n this.isCategoryLoadingStateActive = true\n\n this.service_applicationFormService_fetchAvailableCategories(this.year.id)\n .then((response: Array) => {\n this.categories = response || []\n }).catch(() => {\n this.categories = []\n }).finally(() => {\n this.isCategoryLoadingStateActive = false\n this.preselectCategory()\n })\n }\n\n private preselectCategory(): void {\n if (this.$route.query.category) {\n const isCategoryAvailable: boolean = !!this.categories.find((category: ICategoryModel) => category.id === this.$route.query.category)\n\n if (isCategoryAvailable) {\n this.categoryDropdown.value = this.$route.query.category as string\n }\n }\n }\n\n public async getFormPayload(): Promise {\n await this.formGroup.submit()\n const candidateIdul: string | null = await this.getCandidateIdul()\n const applicationFormSupports: Array = []\n let hasApplicationFormSupportError: boolean = false\n\n if (this.applicationFormSupportFormComponents) {\n for (const applicationFormSupportForm of this.applicationFormSupportFormComponents) {\n const applicationFormSupportFormPayload: IApplicationFormSupportFormPayloadData | null = await applicationFormSupportForm.getFormPayload()\n\n if (applicationFormSupportFormPayload) {\n applicationFormSupports.push(applicationFormSupportFormPayload)\n } else {\n hasApplicationFormSupportError = true\n }\n }\n }\n\n if (this.formGroup.hasErrorDeep() || !candidateIdul || hasApplicationFormSupportError) {\n return null\n }\n\n const formPayloadData: IApplicationFormFormPayloadData = {\n category_id: this.categoryDropdown.value,\n candidate_idul: candidateIdul,\n application_form_supports: applicationFormSupports\n }\n\n return formPayloadData\n }\n\n private async getCandidateIdul(): Promise {\n if (this.userFormComponent) {\n const userFormPayload: IUserFormPayloadData | null = await this.userFormComponent.getFormPayload()\n\n if (userFormPayload && userFormPayload.idul) {\n return userFormPayload.idul\n }\n } \n\n return null\n }\n\n private increaseApplicationFormSupportFormCount(key: number): void {\n this.$set(this.applicationFormSupportForms, this.applicationFormSupportForms.length, key + 1)\n }\n\n private decreaseApplicationFormSupportFormCount(index: number): void {\n this.$delete(this.applicationFormSupportForms, index)\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref } from 'vue-property-decorator'\n\nimport WithRender from './ApplicationFormCreationDialog.html'\n\nimport { \n MButton,\n MButtonSkin,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay\n} from '@ulaval/modul-components'\n\nimport ApplicationFormForm, { IApplicationFormFormPayloadData } from '../application-form-form/ApplicationFormForm'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport ApplicationFormService, { ICreateApplicationFormForm } from '../ApplicationForm.service'\nimport ROUTES from '@/router/ROUTES'\nimport { AxiosError } from 'axios'\nimport { IApplicationFormModel } from '../ApplicationForm.model'\n\nconst FORM_REF: string = 'application-form-form'\n\n@WithRender\n@Component({\n components: {\n ApplicationFormForm,\n MButton,\n MMessage,\n MOverlay\n }\n})\nexport default class ApplicationFormCreationDialog extends mixins(ApplicationFormService) {\n private isOverlayOpen: boolean = true\n private isLoadingStateActive: boolean = false\n private showCreationSuccessMessage: boolean = false\n private createdApplicationForm: IApplicationFormModel | null = null\n private requestErrors: { [key: string]: string | boolean } = {}\n\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MButtonSkin: object = MButtonSkin\n private readonly FORM_REF: string = FORM_REF\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Ref(FORM_REF)\n private applicationFormFormComponent!: ApplicationFormForm\n\n private afterOverlayClose(): void {\n this.mixin_router_navigate({\n name: ROUTES.DASHBOARD\n })\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n\n private async onSaveButtonClick(): Promise {\n if (this.applicationFormFormComponent) {\n const formPayload: IApplicationFormFormPayloadData | null = await this.applicationFormFormComponent.getFormPayload()\n \n if (formPayload) {\n this.createApplicationForm(formPayload)\n }\n }\n }\n\n private createApplicationForm(formPayload: IApplicationFormFormPayloadData): void {\n this.isLoadingStateActive = true\n\n const requestPayload: ICreateApplicationFormForm = {\n ...formPayload\n }\n\n this.service_applicationFormService_createApplicationForm(requestPayload)\n .then((response: IApplicationFormModel) => {\n this.showCreationSuccessMessage = true\n this.createdApplicationForm = response\n }).catch((error: AxiosError) => {\n if (\n error.response &&\n error.response.data &&\n error.response.data.validation\n ) {\n this.requestErrors = error.response.data.validation\n } else {\n this.requestErrors = {}\n }\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private navigateToApplicationForm(): void {\n if (this.createdApplicationForm) {\n this.mixin_router_navigate({\n name: ROUTES.APPLICATION_FORM,\n params: {\n idApplicationForm: this.createdApplicationForm.id\n }\n })\n }\n }\n}\n","export enum EmailStatusType {\n QUEUED = 'QUEUED',\n ERROR = 'ERROR',\n SENT = 'SENT'\n}\n\nexport interface IEmailStatusModel {\n correlation_id: string;\n error_message?: string;\n sent_at: string;\n sent_by: string;\n status: EmailStatusType;\n recipients?: Array;\n carbon_copy_recipients?: Array;\n blind_carbon_copy_recipients?: Array;\n}","import Component, { mixins } from 'vue-class-component'\nimport { EmailStatusType, IEmailStatusModel } from './EmailStatus.model'\n\n@Component\nexport default class EmailStatusMixin extends mixins() {\n protected mixin_emailStatus_computeStatusColor(emailStatus: IEmailStatusModel): string {\n switch (emailStatus.status) {\n case EmailStatusType.QUEUED:\n return 'grey'\n case EmailStatusType.ERROR:\n return '#e30513'\n case EmailStatusType.SENT:\n return '#00c77f'\n default:\n return 'grey'\n }\n }\n\n protected mixin_emailStatus_computeStatusIcon(emailStatus: IEmailStatusModel): string | null {\n switch (emailStatus.status) {\n case EmailStatusType.QUEUED:\n return 'm-svg__clock'\n case EmailStatusType.ERROR:\n return 'm-svg__error'\n case EmailStatusType.SENT:\n return 'm-svg__confirmation'\n default:\n return null\n }\n }\n\n protected mixin_emailStatus_computeStatusIconStyles(emailStatus: IEmailStatusModel): object {\n return {\n 'color': this.mixin_emailStatus_computeStatusColor(emailStatus)\n }\n }\n\n protected mixin_emailStatus_computeStatusLabel(status: EmailStatusType | string): string | null {\n return this.$i18next.t(`modules.global.email.EmailStatus.status.${status}`)\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './EmailStatusRow.html'\n\nimport { \n MIcon,\n MTooltip,\n MTooltipSize\n} from '@ulaval/modul-components'\n\nimport { IEmailStatusModel } from './EmailStatus.model'\nimport EmailStatusMixin from './EmailStatus.mixin'\n\n@WithRender\n@Component({\n components: {\n MIcon,\n MTooltip\n }\n})\nexport default class EmailStatusRow extends mixins(EmailStatusMixin) {\n private readonly MTooltipSize: object = MTooltipSize\n \n @Prop({ required: true })\n private emailStatus!: IEmailStatusModel\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './ApplicationFormReminderEmailOverlay.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MButton,\n MButtonSkin,\n MForm,\n MMessage,\n MMessageSkin,\n MMessageState,\n MMultiSelect,\n MOverlay,\n RequiredValidator\n} from '@ulaval/modul-components'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport ApplicationFormService from '../ApplicationForm.service'\nimport { ICategoryModel } from '@/modules/category-management/Category.model'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MForm,\n MMessage,\n MMultiSelect,\n MOverlay,\n }\n})\nexport default class ApplicationFormReminderEmailOverlay extends mixins(ApplicationFormService) {\n public formGroup: FormGroup = new FormGroup({\n 'category-multi-select': new FormControl>([RequiredValidator()])\n })\n private isLoadingStateActive: boolean = false\n private isCategoryLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = false\n private showSuccessMessage: boolean = false\n private categories: Array = []\n private selectedCategories: Array = []\n\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n\n @Prop({ required: true })\n private year!: IYearModel\n\n public get categoryMultiSelect(): AbstractControl> {\n return this.formGroup.getControl('category-multi-select');\n }\n\n private get categoriesSelectOptions(): Array {\n return this.categories.map((category: ICategoryModel) => category.title)\n }\n\n private get hasAvailableCategories(): boolean {\n return this.categories.length > 0\n }\n\n @Watch('year', { immediate: true })\n private onYearChange(): void {\n this.loadCategories()\n }\n\n private loadCategories(): void {\n this.isCategoryLoadingStateActive = true\n\n this.service_applicationFormService_fetchAvailableCategories(this.year.id)\n .then((response: Array) => {\n this.categories = response || []\n }).catch(() => {\n this.categories = []\n }).finally(() => {\n this.isCategoryLoadingStateActive = false\n })\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n\n private onTriggerButtonClick(): void {\n this.isOverlayOpen = true\n }\n\n private async onSaveButtonClick(): Promise {\n this.categoryMultiSelect.value = this.selectedCategories\n\n await this.formGroup.submit()\n\n if (!this.formGroup.hasErrorDeep()) {\n this.sendReminderEmails(this.mapSelectedCategoriesToIds())\n }\n }\n\n private sendReminderEmails(categoriesId: Array): void {\n this.isLoadingStateActive = true\n \n this.service_applicationFormService_sendApplicationFormReminderEmails({\n categories_id: categoriesId\n }).then(() => {\n this.showSuccessMessage = true\n }).catch((error: AxiosError) => {\n this.mixin_router_redirectRequestError(error)\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private mapSelectedCategoriesToIds(): Array {\n const ids: Array = []\n\n this.categories.forEach((category: ICategoryModel) => {\n if (this.selectedCategories.includes(category.title)) {\n ids.push(category.id)\n }\n })\n\n return ids\n }\n\n private afterOverlayClose(): void {\n this.isLoadingStateActive = false\n this.isCategoryLoadingStateActive = false\n this.showSuccessMessage = false\n this.selectedCategories = []\n\n this.formGroup.reset()\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './ApplicationFormDepositDeadlineExtensionOverlay.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MButton,\n MButtonSkin,\n MDatepicker,\n MIconButton,\n MForm,\n MMessage,\n MMessageSkin,\n MMessageState,\n MMultiSelect,\n MOverlay,\n MTimepicker,\n RequiredValidator\n} from '@ulaval/modul-components'\n\nimport ApplicationFormService from '../ApplicationForm.service'\nimport { IAdminApplicationFormModel } from '../ApplicationForm.model'\n\nexport enum ApplicationFormDepositDeadlineExtensionOverlay_EVENTS {\n AFTER_CLOSE = 'after-close'\n}\n\n@WithRender\n@Component({\n components: {\n MButton,\n MDatepicker,\n MIconButton,\n MForm,\n MMessage,\n MMultiSelect,\n MOverlay,\n MTimepicker\n }\n})\nexport default class ApplicationFormDepositDeadlineExtensionOverlay extends mixins(ApplicationFormService) {\n public formGroup: FormGroup = new FormGroup({\n date: new FormControl([RequiredValidator()]),\n time: new FormControl([RequiredValidator()]),\n })\n private isLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = true\n private showSuccessMessage: boolean = false\n\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n\n @Prop({ required: true })\n private applicationForm!: IAdminApplicationFormModel\n\n public get dateField(): AbstractControl {\n return this.formGroup.getControl('date');\n }\n\n public get timeField(): AbstractControl {\n return this.formGroup.getControl('time');\n }\n\n private mounted(): void {\n this.populateFormFromModel()\n }\n\n private populateFormFromModel(): void {\n if (this.applicationForm) {\n this.dateField.value = this.mixin_timestamp_extractDate(this.applicationForm.deposit_deadline_extension_timestamp || this.applicationForm.category_application_deposit_limit_timestamp)\n this.timeField.value = this.mixin_timestamp_extractTime(this.applicationForm.deposit_deadline_extension_timestamp || this.applicationForm.category_application_deposit_limit_timestamp)\n }\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n\n private onTriggerButtonClick(): void {\n this.isOverlayOpen = true\n }\n\n private async onSaveButtonClick(): Promise {\n await this.formGroup.submit()\n\n if (!this.formGroup.hasErrorDeep()) {\n this.updateDepositDeadlineExtension()\n }\n }\n\n private updateDepositDeadlineExtension(): void {\n this.isLoadingStateActive = true\n \n this.service_applicationFormService_updateDepositDeadlineExtension(this.applicationForm.id, {\n timestamp: this.mixin_timstamp_dateAndTimeToTimestamp(\n this.dateField.value || '',\n this.timeField.value || ''\n )\n }).then(() => {\n this.showSuccessMessage = true\n }).catch((error: AxiosError) => {\n this.mixin_router_redirectRequestError(error)\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private afterOverlayClose(): void {\n this.isLoadingStateActive = false\n this.showSuccessMessage = false\n\n this.formGroup.reset()\n\n this.$emit(ApplicationFormDepositDeadlineExtensionOverlay_EVENTS.AFTER_CLOSE)\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './ApplicationFormSupportRow.html'\n\nimport { \n MIcon,\n MIconButton,\n MTooltip,\n MTooltipSize\n} from '@ulaval/modul-components'\n\nimport { IApplicationFormSupportModel } from '../ApplicationFormSupport.model'\nimport ApplicationFormSupportMixin from '../ApplicationFormSupport.mixin'\nimport ROUTES from '@/router/ROUTES'\nimport UserRoleMixin from '@/modules/user-management/UserRole.mixin'\n\n@WithRender\n@Component({\n components: {\n MIcon,\n MIconButton,\n MTooltip\n }\n})\nexport default class ApplicationFormSupportRow extends mixins(ApplicationFormSupportMixin, UserRoleMixin) {\n private readonly MTooltipSize: object = MTooltipSize\n \n @Prop({ required: true })\n private applicationFormSupport!: IApplicationFormSupportModel\n\n private onShowApplicationFormSupportIconClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.ADMIN_APPLICATION_FORM_SUPPORT,\n params: {\n idApplicationFormSupport: this.applicationFormSupport.id\n }\n })\n }\n}\n","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport { IFormAnswerFileModel, IFormModel } from \"../form-management/Form.model\";\nimport FormTemplateService from \"../form-template-management/FormTemplate.service\";\nimport { IInternalFormTemplateModel } from \"../form-template-management/FormTemplate.model\";\nimport { IFormAnswerForm } from \"../form-management/Form.service\";\nimport { IFileUploadModel } from \"../global/file/File.model\";\nimport { IAdminApplicationFormSupportModel, IApplicationFormSupportModel } from \"./ApplicationFormSupport.model\";\nimport { IPaginationQueryParameters } from \"../global/utilities/Base.service\";\nimport { IPaginatedResponse } from \"../global/utilities/Pagination.model\";\nimport { EVENT_BUS_EVENTS } from \"../global/utilities/Events\";\nimport { ICategoryModel } from \"../category-management/Category.model\";\n\nexport interface IFetchApplicationFormSupportResponse {\n application_form_support: IApplicationFormSupportModel;\n form: IFormModel;\n internal_form_template: IInternalFormTemplateModel;\n}\n\n\nexport interface IFetchAdminApplicationFormSupportsListQueryParameters extends IPaginationQueryParameters {\n year_id: string;\n query?: string;\n status: Array;\n}\n\nexport interface IFetchAdminApplicationFormSupportsListResponse extends IPaginatedResponse {\n application_form_supports: Array;\n}\n\nexport interface ISendApplicationFormSupportReminderEmailForm {\n categories_id: Array;\n}\n\n@Component\nexport default class ApplicationFormSupportService extends FormTemplateService {\n protected service_applicationFormSupportService_fetchApplicationFormSupport(token: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/application-form-supports/${token}`)\n .then((response: AxiosResponse) => resolve(\n {\n application_form_support: response.data.data.application_form_support,\n form: response.data.data.form,\n internal_form_template: this.service_formTemplateService_mapFormTemplateToInternalFormTemplate(response.data.data.form.form_template)\n }\n ))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormSupportService_fetchAdminApplicationFormSupport(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/admin/application-form-supports/${id}`)\n .then((response: AxiosResponse) => resolve(\n {\n application_form_support: response.data.data.application_form_support,\n form: response.data.data.form,\n internal_form_template: this.service_formTemplateService_mapFormTemplateToInternalFormTemplate(response.data.data.form.form_template)\n }\n ))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormSupportService_submitApplicationFormSupport(token: string, answers: Array): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(\n `/api/application-form-supports/${token}/submit`, \n this.service_applicationFormSupportService_generateAnswersFormData(answers), \n {\n headers: this.service_baseService_multipartFormDataHeader()\n }\n ).then(() => {\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n private service_applicationFormSupportService_generateAnswersFormData(answers: Array): FormData {\n const data: FormData = new FormData()\n\n answers.forEach((answerForm: any, index: number) => {\n for (const key in answerForm) {\n const answerValue: any = answerForm[key]\n\n if (\n answerValue != undefined && \n answerValue != null &&\n key != 'files'\n ) {\n data.append(`answers[${index}].${key}`, answerValue)\n }\n }\n\n if (answerForm.files) {\n answerForm.files.forEach((uploadedFile: IFileUploadModel, fileIndex: number) => {\n if (uploadedFile.server_file) {\n data.set(`answers[${index}].form_answer_files[${fileIndex}].id`, uploadedFile.server_file.id)\n } else if (uploadedFile && uploadedFile.file) {\n data.append(`answers[${index}].form_answer_files[${fileIndex}].file`, uploadedFile.file.file)\n }\n })\n }\n })\n\n return data\n }\n\n protected service_applicationFormSupportService_fetchAdminApplicationFormList(query: IFetchAdminApplicationFormSupportsListQueryParameters): Promise {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery(query)\n\n this.$axios.get(`/api/admin/application-form-supports?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormSupportService_sendApplicationFormSupportReminderEmails(payload: ISendApplicationFormSupportReminderEmailForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.post(`/api/admin/application-form-supports/reminder-emails`, payload)\n .then((response: AxiosResponse) => {\n this.service_baseService_emitEventBusEvent(EVENT_BUS_EVENTS.APPLICATION_FORM_SUPPORT_REMINDER_EMAIL_SENT, null)\n\n return resolve(response.data.data)\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormSupportService_saveAdmin(id: string, answers: Array): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(\n `/api/admin/application-form-supports/${id}`, \n this.service_applicationFormSupportService_generateAnswersFormData(answers), \n {\n headers: this.service_baseService_multipartFormDataHeader()\n }\n ).then(() => {\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n \n protected service_applicationFormSupportService_fetchAvailableCategoriesSubmit(yearId: string): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery({\n year_id: yearId\n })\n\n this.$axios.get(`/api/admin/application-form-supports/available-categories:submit?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data.categories))\n .catch((error: AxiosError) => reject(error))\n })\n }\n \n protected service_applicationFormSupportService_fetchAvailableCategoriesDeposit(yearId: string): Promise> {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery({\n year_id: yearId\n })\n\n this.$axios.get(`/api/admin/application-form-supports/available-categories:deposit?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data.categories))\n .catch((error: AxiosError) => reject(error))\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './ApplicationFormSupportSubmitReminderEmailOverlay.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MButton,\n MButtonSkin,\n MForm,\n MMessage,\n MMessageSkin,\n MMessageState,\n MMultiSelect,\n MOverlay,\n RequiredValidator\n} from '@ulaval/modul-components'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport { ICategoryModel } from '@/modules/category-management/Category.model'\nimport ApplicationFormSupportService from '@/modules/application-form-support-management/ApplicationFormSupport.service'\nimport ApplicationFormService from '../ApplicationForm.service'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MForm,\n MMessage,\n MMultiSelect,\n MOverlay,\n }\n})\nexport default class ApplicationFormSupportSubmitReminderEmailOverlay extends mixins(ApplicationFormSupportService, ApplicationFormService) {\n public formGroup: FormGroup = new FormGroup({\n 'category-multi-select': new FormControl>([RequiredValidator()])\n })\n private isLoadingStateActive: boolean = false\n private isCategoryLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = false\n private showSuccessMessage: boolean = false\n private categories: Array = []\n private selectedCategories: Array = []\n\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n\n @Prop({ required: true })\n private year!: IYearModel\n\n public get categoryMultiSelect(): AbstractControl> {\n return this.formGroup.getControl('category-multi-select');\n }\n\n private get filteredCategories(): Array {\n if (!this.categories) {\n return []\n }\n\n return this.categories.filter((category: ICategoryModel) => category.has_application_support)\n }\n\n private get categoriesSelectOptions(): Array {\n return this.filteredCategories.map((category: ICategoryModel) => category.title)\n }\n\n private get hasAvailableCategories(): boolean {\n return this.categories.length > 0\n }\n\n @Watch('year', { immediate: true })\n private onYearChange(): void {\n this.loadCategories()\n }\n\n private loadCategories(): void {\n this.isCategoryLoadingStateActive = true\n\n this.service_applicationFormSupportService_fetchAvailableCategoriesSubmit(this.year.id)\n .then((response: Array) => {\n this.categories = response || []\n }).catch(() => {\n this.categories = []\n }).finally(() => {\n this.isCategoryLoadingStateActive = false\n })\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n\n private onTriggerButtonClick(): void {\n this.isOverlayOpen = true\n }\n\n private async onSaveButtonClick(): Promise {\n this.categoryMultiSelect.value = this.selectedCategories\n\n await this.formGroup.submit()\n\n if (!this.formGroup.hasErrorDeep()) {\n this.sendReminderEmails(this.mapSelectedCategoriesToIds())\n }\n }\n\n private sendReminderEmails(categoriesId: Array): void {\n this.isLoadingStateActive = true\n \n this.service_applicationFormService_sendApplicationFormSupportSubmitReminderEmails({\n categories_id: categoriesId\n }).then(() => {\n this.showSuccessMessage = true\n }).catch((error: AxiosError) => {\n this.mixin_router_redirectRequestError(error)\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private mapSelectedCategoriesToIds(): Array {\n const ids: Array = []\n\n this.categories.forEach((category: ICategoryModel) => {\n if (this.selectedCategories.includes(category.title)) {\n ids.push(category.id)\n }\n })\n\n return ids\n }\n\n private afterOverlayClose(): void {\n this.isLoadingStateActive = false\n this.isCategoryLoadingStateActive = false\n this.showSuccessMessage = false\n this.selectedCategories = []\n\n this.formGroup.reset()\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './ApplicationFormAuthorizedUsersOverlay.html'\n\nimport { \n MButton,\n MButtonSkin,\n MDatepicker,\n MIconButton,\n MForm,\n MMessage,\n MMessageSkin,\n MMessageState,\n MMultiSelect,\n MOverlay,\n MTimepicker\n} from '@ulaval/modul-components'\n\nimport UserForm, { IUserFormPayloadData } from '@/modules/user-management/user-form/UserForm'\nimport ApplicationFormService from '../ApplicationForm.service'\nimport { IAdminApplicationFormModel } from '../ApplicationForm.model'\nimport { IUserModel } from '@/modules/user-management/User.model'\n\nconst USER_FORM_REF: string = 'user-form'\n\nexport enum ApplicationFormAuthorizedUsersOverlay_EVENTS {\n AFTER_CLOSE = 'after-close'\n}\n\n@WithRender\n@Component({\n components: {\n MButton,\n MDatepicker,\n MIconButton,\n MForm,\n MMessage,\n MMultiSelect,\n MOverlay,\n MTimepicker,\n UserForm\n }\n})\nexport default class ApplicationFormAuthorizedUsersOverlay extends mixins(ApplicationFormService) {\n private isLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = true\n private showSuccessMessage: boolean = false\n private authorizedUsers: IUserModel[] = []\n\n private readonly USER_FORM_REF: string = USER_FORM_REF\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n\n @Prop({ required: true })\n private applicationForm!: IAdminApplicationFormModel\n\n @Ref(USER_FORM_REF)\n private userFormComponent!: UserForm\n\n private get isAuthorizedUserListEmpty(): boolean {\n return this.authorizedUsers.length === 0\n }\n\n private mounted(): void {\n this.populateFormFromModel()\n }\n\n private populateFormFromModel(): void {\n if (this.applicationForm) {\n this.authorizedUsers = Array.from(this.applicationForm.authorized_users)\n }\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n\n private onTriggerButtonClick(): void {\n this.isOverlayOpen = true\n }\n\n private async onSaveButtonClick(): Promise {\n this.updateAuthorizedUsersList()\n }\n\n private updateAuthorizedUsersList(): void {\n this.isLoadingStateActive = true\n \n this.service_applicationFormService_saveAuthorizedUsersAdmin(\n this.applicationForm.id,\n {\n iduls: this.authorizedUsers.map((user: any) => user.username || user.idul)\n }\n ).then(() => {\n this.showSuccessMessage = true\n }).catch((error: AxiosError) => {\n this.mixin_router_redirectRequestError(error)\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private afterOverlayClose(): void {\n this.isLoadingStateActive = false\n this.showSuccessMessage = false\n\n this.$emit(ApplicationFormAuthorizedUsersOverlay_EVENTS.AFTER_CLOSE)\n }\n\n private async onAddUserButtonClick(): Promise {\n if (this.userFormComponent) {\n const payload: IUserFormPayloadData | null = await this.userFormComponent.getFormPayload()\n\n if (payload) {\n this.$set(this.authorizedUsers, this.authorizedUsers.length, payload)\n this.userFormComponent.clear()\n }\n }\n }\n\n private onRemoveAuthorizedUserIconClick(index: number): void {\n this.$delete(this.authorizedUsers, index)\n }\n\n private computeUserFullName(user: any): string {\n if (!this.mixin_string_isEmpty(user.full_name_with_email)) {\n return user.full_name_with_email\n }\n\n return `${user.first_name} ${user.last_name} (${user.email})`\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref, Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './ApplicationFormExportOverlay.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MButton,\n MButtonSkin,\n MForm,\n MMessage,\n MMessageSkin,\n MMessageState,\n MMultiSelect,\n MOverlay,\n RequiredValidator\n} from '@ulaval/modul-components'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport ApplicationFormService from '../ApplicationForm.service'\nimport { ApplicationFormStatus } from '../ApplicationForm.model'\nimport ApplicationFormMixin from '../ApplicationForm.mixin'\n\nconst REF_DOWNLOAD_LINK: string = 'ref-download-link'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MForm,\n MMessage,\n MMultiSelect,\n MOverlay,\n }\n})\nexport default class ApplicationFormExportOverlay extends mixins(ApplicationFormService, ApplicationFormMixin) {\n public formGroup: FormGroup = new FormGroup({\n 'status-multi-select': new FormControl>([RequiredValidator()])\n })\n private isLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = false\n private showSuccessMessage: boolean = false\n private selectedStatus: Array = []\n\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly REF_DOWNLOAD_LINK: string = REF_DOWNLOAD_LINK\n\n @Ref(REF_DOWNLOAD_LINK)\n protected downloadLinkHtmlElement!: HTMLElement\n\n @Prop({ required: true })\n private year!: IYearModel\n\n public get statusMultiSelect(): AbstractControl> {\n return this.formGroup.getControl('status-multi-select');\n }\n\n private get statusSelectOptions(): Array {\n return Object.values(ApplicationFormStatus)\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n\n private onTriggerButtonClick(): void {\n this.isOverlayOpen = true\n }\n\n private async onSaveButtonClick(): Promise {\n this.statusMultiSelect.value = this.selectedStatus\n\n await this.formGroup.submit()\n\n if (!this.formGroup.hasErrorDeep()) {\n this.downloadFile()\n }\n }\n\n private downloadFile(): void {\n this.isLoadingStateActive = true\n\n this.service_applicationFormService_adminDownloadExportFile({\n status: this.selectedStatus,\n year_id: this.year.id\n }).then((res: any) => {\n if (this.downloadLinkHtmlElement) {\n this.downloadLinkHtmlElement.setAttribute('href', URL.createObjectURL(new Blob([res.data], { type: 'application/vnd.ms-excel' })))\n this.downloadLinkHtmlElement.setAttribute('download', 'dossiers-candidature.xlsx')\n this.downloadLinkHtmlElement.click()\n \n this.downloadLinkHtmlElement.removeAttribute('link')\n this.downloadLinkHtmlElement.removeAttribute('download')\n }\n\n this.showSuccessMessage = true\n }).catch((error: AxiosError) => {\n this.mixin_router_redirectRequestError(error)\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private afterOverlayClose(): void {\n this.isLoadingStateActive = false\n this.showSuccessMessage = false\n this.selectedStatus = []\n\n this.formGroup.reset()\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport WithRender from './AdminApplicationForms.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MColumnTable,\n MDialog,\n MDialogState,\n MDialogWidth,\n MIcon,\n MIconButton,\n MOption,\n MOptionItem,\n MOptionItemEdit,\n MOptionItemDelete,\n MPagination,\n MPopup,\n MTable,\n MTableHeader,\n MToggleButtons,\n MToggleButton,\n MSearchfield,\n MColumnTextAlign\n} from '@ulaval/modul-components'\n\nimport EmailStatusRow from '@/modules/global/email/EmailStatusRow'\nimport ApplicationFormReminderEmailOverlay from '../application-form/ApplicationFormReminderEmailOverlay'\nimport ApplicationFormDepositDeadlineExtensionOverlay from '../application-form/ApplicationFormDepositDeadlineExtensionOverlay'\nimport ApplicationFormSupportRow from '@/modules/application-form-support-management/application-form-support/ApplicationFormSupportRow'\nimport ApplicationFormSupportSubmitReminderEmailOverlay from '../application-form/ApplicationFormSupportSubmitReminderEmailOverlay'\nimport ApplicationFormAuthorizedUsersOverlay from '../application-form/ApplicationFormAuthorizedUsersOverlay'\nimport ApplicationFormExportOverlay from '../application-form/ApplicationFormExportOverlay'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport { IPaginationResultData } from '@/modules/global/utilities/Pagination.model'\nimport { ApplicationFormStatus, IAdminApplicationFormModel } from '../ApplicationForm.model'\nimport ApplicationFormService, { IFetchAdminApplicationFormsListQueryParameters, IFetchAdminApplicationFormsListResponse } from '../ApplicationForm.service'\nimport CONSTANTS from '@/CONSTANTS'\nimport ApplicationFormMixin from '../ApplicationForm.mixin'\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\nimport ROUTES from '@/router/ROUTES'\n\n@WithRender\n@Component({\n components: {\n ApplicationFormAuthorizedUsersOverlay,\n ApplicationFormDepositDeadlineExtensionOverlay,\n ApplicationFormExportOverlay,\n ApplicationFormReminderEmailOverlay,\n ApplicationFormSupportSubmitReminderEmailOverlay,\n ApplicationFormSupportRow,\n EmailStatusRow,\n MDialog,\n MIcon,\n MIconButton,\n MOption,\n MOptionItem,\n MOptionItemEdit,\n MOptionItemDelete,\n MPagination,\n MPopup, \n MTable,\n MTableHeader,\n MToggleButtons,\n MSearchfield\n }\n})\nexport default class AdminApplicationForms extends mixins(ApplicationFormService, ApplicationFormMixin) {\n public formGroup: FormGroup = new FormGroup({\n 'search-field': new FormControl()\n })\n private applicationForms: Array = []\n private selectedApplicationFormStatus: Array = Object.values(ApplicationFormStatus)\n private paginationData: IPaginationResultData | null = null\n private isLoadingStateActive: boolean = false\n private selectedApplicationFormDepositDeadlineExtension: IAdminApplicationFormModel | null = null\n private selectedApplicationFormToDelete: IAdminApplicationFormModel | null = null\n private selectedApplicationFormAuthorizedUsers: IAdminApplicationFormModel | null = null\n private isDeleteTooltipOpen: boolean = false\n\n private readonly MDialogState: object = MDialogState\n private readonly MDialogWidth: object = MDialogWidth\n\n @Prop({ required: true })\n private year!: IYearModel\n\n public get searchField(): AbstractControl {\n return this.formGroup.getControl('search-field');\n }\n\n private get statusToggleButtons(): Array {\n return Object.values(ApplicationFormStatus).reduce((toggleButtons: Array, key: string) => {\n return [\n ...toggleButtons,\n {\n id: key,\n title: this.mixin_applicationForm_computeStatusLabel(key),\n pressed: this.selectedApplicationFormStatus.includes(key) \n } as MToggleButton\n ]\n }, [])\n }\n\n private get tableColumns(): Array {\n return [\n {\n id: 'candidate',\n title: this.$i18next.t('modules.application-form-management.application-forms.AdminApplicationForms.table.columns.candidate.title'),\n dataProp: 'candidate_full_name_with_username',\n width: '200px'\n },\n {\n id: 'category',\n title: this.$i18next.t('modules.application-form-management.application-forms.AdminApplicationForms.table.columns.category.title'),\n dataProp: 'category_title'\n },\n {\n id: 'status',\n title: this.$i18next.t('modules.application-form-management.application-forms.AdminApplicationForms.table.columns.status.title'),\n dataProp: 'status',\n width: '200px'\n },\n {\n id: 'requester',\n title: this.$i18next.t('modules.application-form-management.application-forms.AdminApplicationForms.table.columns.requester.title'),\n dataProp: 'requester_full_name_with_username',\n width: '200px'\n },\n {\n id: 'options',\n title: '',\n dataProp: 'options',\n textAlign: MColumnTextAlign.Right,\n width: '80px'\n }\n ]\n }\n\n @Watch('year', { immediate: true })\n private onYearChange(): void {\n this.loadApplicationForms()\n }\n\n @Watch('selectedApplicationFormStatus')\n private onSelectedApplicationFormStatusChange(): void {\n if (this.paginationData) {\n this.loadApplicationForms(this.paginationData.current_page_index)\n }\n }\n\n private mounted(): void {\n this.afterApplicationFormUpdated()\n this.afterApplicationFormDeleted()\n this.afterApplicationFormReminderEmailSent()\n this.afterApplicationFormSupportSubmitReminderEmailSent()\n }\n\n private afterApplicationFormUpdated(): void {\n EventBus.$on(EVENT_BUS_EVENTS.APPLICATION_FORM_UPDATED, (updatedApplicationForm: IAdminApplicationFormModel) => {\n if (updatedApplicationForm) {\n const originalApplicationFormIndex: number | undefined = this.applicationForms.findIndex((applicationForm: IAdminApplicationFormModel) => {\n return applicationForm.id === updatedApplicationForm.id\n })\n\n if (~originalApplicationFormIndex) {\n this.$set(this.applicationForms, originalApplicationFormIndex, updatedApplicationForm)\n }\n }\n })\n }\n\n private afterApplicationFormDeleted(): void {\n EventBus.$on(EVENT_BUS_EVENTS.APPLICATION_FORM_DELETED, (id: string) => {\n if (id) {\n const originalApplicationFormIndex: number | undefined = this.applicationForms.findIndex((applicationForm: IAdminApplicationFormModel) => {\n return applicationForm.id === id\n })\n\n if (~originalApplicationFormIndex) {\n this.$delete(this.applicationForms, originalApplicationFormIndex)\n }\n }\n })\n }\n\n private afterApplicationFormReminderEmailSent(): void {\n EventBus.$on(EVENT_BUS_EVENTS.APPLICATION_FORM_REMINDER_EMAIL_SENT, () => {\n if (this.paginationData) {\n this.loadApplicationForms(this.paginationData.current_page_index)\n }\n })\n }\n\n private afterApplicationFormSupportSubmitReminderEmailSent(): void {\n EventBus.$on(EVENT_BUS_EVENTS.APPLICATION_FORM_SUPPORT_SUBMIT_REMINDER_EMAIL_SENT, () => {\n if (this.paginationData) {\n this.loadApplicationForms(this.paginationData.current_page_index)\n }\n })\n }\n\n private loadApplicationForms(pageIndex: number = 0): void {\n const loadingStateActivationTimeout: any = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n\n const query: IFetchAdminApplicationFormsListQueryParameters = {\n year_id: this.year.id,\n query: this.searchField.value,\n status: this.selectedApplicationFormStatus,\n page: pageIndex\n }\n\n this.service_applicationFormService_fetchAdminApplicationFormList(query) \n .then((responseData: IFetchAdminApplicationFormsListResponse) => {\n this.applicationForms = responseData.application_forms || []\n this.paginationData = responseData.pagination || null\n }).catch(() => {\n this.applicationForms = []\n this.paginationData = null\n }).finally(() => {\n clearTimeout(loadingStateActivationTimeout)\n this.isLoadingStateActive = false\n })\n }\n\n private deleteApplicationForm(): void {\n if (this.selectedApplicationFormToDelete) {\n const loadingStateActivationTimeout: any = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n\n this.service_applicationFormService_deleteApplicationFormAdmin(this.selectedApplicationFormToDelete.id) \n .finally(() => {\n clearTimeout(loadingStateActivationTimeout)\n this.isLoadingStateActive = false\n this.resetApplicationFormToDelete()\n })\n }\n }\n\n private onSearchFieldChange(): void {\n this.loadApplicationForms(0)\n }\n\n private onPageChange(newIndex: number): void {\n this.loadApplicationForms(newIndex - 1)\n }\n\n private onToggleButtonClick(toggleButton: MToggleButton): void {\n if (toggleButton.pressed) {\n const statusIndex: number | undefined = this.selectedApplicationFormStatus.indexOf(toggleButton.id)\n\n if (!~statusIndex) {\n this.$set(this.selectedApplicationFormStatus, this.selectedApplicationFormStatus.length, toggleButton.id)\n }\n } else {\n const statusIndex: number | undefined = this.selectedApplicationFormStatus.indexOf(toggleButton.id)\n\n if (~statusIndex) {\n this.$delete(this.selectedApplicationFormStatus, statusIndex)\n }\n }\n }\n\n private onShowApplicationFormIconClick(event: Event, applicationForm: IAdminApplicationFormModel): void {\n this.mixin_router_navigate({\n name: ROUTES.ADMIN_APPLICATION_FORM,\n params: {\n idApplicationForm: applicationForm.id\n }\n }, event)\n }\n\n private onDisplayDepositDeadlineExtensionIconClick(applicationForm: IAdminApplicationFormModel): void {\n this.selectedApplicationFormDepositDeadlineExtension = applicationForm || null\n }\n\n private afterDisplayDepositDeadlineExtensionOverlayClose(): void {\n this.selectedApplicationFormDepositDeadlineExtension = null\n }\n\n private triggerDeleteConfirmationDialog(applicationForm: IAdminApplicationFormModel): void {\n this.selectedApplicationFormToDelete = applicationForm\n }\n\n private resetApplicationFormToDelete(): void {\n this.selectedApplicationFormToDelete = null\n }\n\n private onDisplayAuthorizedUsersIconClick(applicationForm: IAdminApplicationFormModel): void {\n this.selectedApplicationFormAuthorizedUsers = applicationForm || null\n }\n\n private afterAuthorizedUsersOverlayClose(): void {\n this.loadApplicationForms(this.paginationData ? this.paginationData.current_page_index : 0)\n this.selectedApplicationFormAuthorizedUsers = null\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './AdminApplicationFormManagement.html'\n\nimport { \n MPanel\n} from '@ulaval/modul-components'\n\nimport AdminApplicationForms from './application-forms/AdminApplicationForms'\nimport YearDropdown from '../global/year/YearDropdown'\nimport Breadcrumbs from '../global/breadcrumbs/Breadcrumbs'\n\nimport { IYearModel } from '../global/year/Year.model'\n\n@WithRender\n@Component({\n components: {\n AdminApplicationForms,\n Breadcrumbs,\n MPanel,\n YearDropdown\n }\n})\nexport default class AdminApplicationFormManagement extends mixins() {\n private year: IYearModel | null = null\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Ref, Watch } from 'vue-property-decorator'\n\nimport WithRender from './AdminApplicationForm.html'\n\nimport { \n MButton,\n MButtonSkin,\n MDialog,\n MDialogState,\n MDialogWidth,\n MIcon,\n MMessage,\n MMessageState,\n MPanel,\n MSpinner,\n MToast,\n MToastDuration,\n MToastPosition,\n MToastState,\n MToastTimeout,\n} from '@ulaval/modul-components'\n\nimport Breadcrumbs from '@/modules/global/breadcrumbs/Breadcrumbs'\nimport FormElements from '@/modules/form-management/form-element/FormElements'\n\nimport ApplicationFormService, { IFetchApplicationFormResponse } from '../ApplicationForm.service'\nimport { IApplicationFormModel } from '../ApplicationForm.model'\nimport { IFormModel } from '@/modules/form-management/Form.model'\nimport { IInternalFormTemplateModel } from '@/modules/form-template-management/FormTemplate.model'\nimport ApplicationFormMixin from '../ApplicationForm.mixin'\nimport { IFormAnswerForm } from '@/modules/form-management/Form.service'\nimport { AxiosError } from 'axios'\n\nconst FORM_ELEMENTS_REF = 'form-elements'\n\n@WithRender\n@Component({\n components: {\n Breadcrumbs,\n FormElements,\n MButton,\n MDialog,\n MIcon,\n MMessage,\n MPanel,\n MSpinner,\n MToast\n }\n})\nexport default class AdminApplicationForm extends mixins(ApplicationFormService, ApplicationFormMixin) {\n private applicationForm: IApplicationFormModel | null = null\n private form: IFormModel | null = null\n private internalFormTemplate: IInternalFormTemplateModel | null = null\n private isLoadingStateActive: boolean = true \n private isSubmitConfirmationDialogActive: boolean = false\n private isSubmitSuccessToastOpen: boolean = false\n private isSubmitErrorToastOpen: boolean = false\n private isValidationErrorToastOpen: boolean = false\n private isDownloadAllFormAnswerFilesLoadingStateActive: boolean = false\n\n private readonly FORM_ELEMENTS_REF: string = FORM_ELEMENTS_REF\n private readonly MMessageState: object = MMessageState\n private readonly MDialogState: object = MDialogState\n private readonly MDialogWidth: object = MDialogWidth\n private readonly MToastPosition: object = MToastPosition\n private readonly MToastState: object = MToastState\n private readonly MToastTimeout: object = MToastTimeout\n private readonly MButtonSkin: object = MButtonSkin\n\n @Ref(FORM_ELEMENTS_REF)\n private formElementsComponent!: FormElements\n\n private get submitDialogState(): MDialogState {\n if (this.isSubmitErrorToastOpen) {\n return MDialogState.Error\n } else if (this.isSubmitSuccessToastOpen) {\n return MDialogState.Confirmation\n }\n\n return MDialogState.Warning\n }\n\n @Watch('$route.params.idApplicationForm', { immediate: true })\n private onRouteParamsIdChange(value: string | null) {\n if (value) {\n this.loadApplicationForm(value)\n }\n }\n\n private loadApplicationForm(id: string, isBackgroundRefresh: boolean = false): void {\n this.isLoadingStateActive = !isBackgroundRefresh\n\n this.service_applicationFormService_fetchAdminApplicationForm(id)\n .then((response: IFetchApplicationFormResponse) => {\n this.applicationForm = response.application_form || null\n this.form = response.form || null\n this.internalFormTemplate = response.internal_form_template || null\n }).catch(() => {\n this.applicationForm = null\n this.form = null\n this.internalFormTemplate = null\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private async onSubmitButtonClick(): Promise {\n const answers: Array | null = await this.formElementsComponent.getElementAnswers(false)\n\n if (answers) {\n this.submitApplicationForm(answers)\n }\n }\n\n private submitApplicationForm(answers: Array): void {\n if (this.applicationForm) {\n this.isLoadingStateActive = true\n\n this.service_applicationFormService_saveApplicationFormAdmin(this.applicationForm.id, answers)\n .then(() => {\n this.loadApplicationForm(this.$route.params.idApplicationForm)\n\n this.isSubmitSuccessToastOpen = true\n this.isSubmitErrorToastOpen = false\n }).catch(() => {\n this.isSubmitSuccessToastOpen = false\n this.isSubmitErrorToastOpen = true\n this.isLoadingStateActive = false\n }).finally(() => {\n setTimeout(() => {\n this.isSubmitSuccessToastOpen = false\n }, MToastDuration.DesktopXShort)\n setTimeout(() => {\n this.isSubmitErrorToastOpen = false\n }, MToastDuration.DesktopXShort)\n })\n }\n }\n\n private async displaySubmitConfirmationDialog(): Promise {\n this.isSubmitConfirmationDialogActive = true\n }\n\n private hideSubmitConfirmationDialog(): void {\n this.isSubmitConfirmationDialogActive = false\n }\n\n private async downloadAllFormAnswerFiles(): Promise {\n this.isDownloadAllFormAnswerFilesLoadingStateActive = true\n\n await this.mixin_applicationForm_downloadAllFormAnswerFiles(this.form || undefined)\n\n this.isDownloadAllFormAnswerFilesLoadingStateActive = false\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Ref, Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './ApplicationFormSupport.html'\n\nimport { \n MButton,\n MDialog,\n MDialogState,\n MDialogWidth,\n MMessage,\n MMessageState,\n MPanel,\n MSpinner,\n MToast,\n MToastDuration,\n MToastPosition,\n MToastState,\n MToastTimeout,\n} from '@ulaval/modul-components'\n\nimport Breadcrumbs from '@/modules/global/breadcrumbs/Breadcrumbs'\nimport FormElements from '@/modules/form-management/form-element/FormElements'\n\nimport { IFormModel } from '@/modules/form-management/Form.model'\nimport { IInternalFormTemplateModel } from '@/modules/form-template-management/FormTemplate.model'\nimport { IFormAnswerForm } from '@/modules/form-management/Form.service'\nimport { IApplicationFormSupportModel } from '../ApplicationFormSupport.model'\nimport ApplicationFormSupportService, { IFetchApplicationFormSupportResponse } from '../ApplicationFormSupport.service'\n\nconst FORM_ELEMENTS_REF = 'form-elements'\n\n@WithRender\n@Component({\n components: {\n Breadcrumbs,\n FormElements,\n MButton,\n MDialog,\n MMessage,\n MPanel,\n MSpinner,\n MToast\n }\n})\nexport default class ApplicationFormSupport extends mixins(ApplicationFormSupportService) {\n private applicationFormSupport: IApplicationFormSupportModel | null = null\n private form: IFormModel | null = null\n private internalFormTemplate: IInternalFormTemplateModel | null = null\n private isLoadingStateActive: boolean = true\n private isSubmitConfirmationDialogActive: boolean = false\n private isSubmitSuccessToastOpen: boolean = false\n private isSubmitErrorToastOpen: boolean = false\n private isValidationErrorToastOpen: boolean = false\n private token: string | null = null\n\n private readonly FORM_ELEMENTS_REF: string = FORM_ELEMENTS_REF\n private readonly MMessageState: object = MMessageState\n private readonly MDialogState: object = MDialogState\n private readonly MDialogWidth: object = MDialogWidth\n private readonly MToastPosition: object = MToastPosition\n private readonly MToastState: object = MToastState\n private readonly MToastTimeout: object = MToastTimeout\n\n @Ref(FORM_ELEMENTS_REF)\n private formElementsComponent!: FormElements\n\n private get submitDialogState(): MDialogState {\n if (this.isSubmitErrorToastOpen) {\n return MDialogState.Error\n } else if (this.isSubmitSuccessToastOpen) {\n return MDialogState.Confirmation\n }\n\n return MDialogState.Warning\n }\n\n @Watch('$route.params.token', { immediate: true })\n private onRouteParamsTokenChange(value: string | null) {\n this.token = value || null\n this.loadApplicationFormSupport()\n }\n\n private loadApplicationFormSupport(): void {\n if (this.token) {\n this.isLoadingStateActive = true\n this.isValidationErrorToastOpen = false\n \n this.service_applicationFormSupportService_fetchApplicationFormSupport(this.token)\n .then((response: IFetchApplicationFormSupportResponse) => {\n this.applicationFormSupport = response.application_form_support || null\n this.form = response.form || null\n this.internalFormTemplate = response.internal_form_template || null\n }).catch((error: AxiosError) => {\n this.mixin_router_redirectRequestError(error)\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n }\n\n private async onSubmitButtonClick(): Promise {\n const answers: Array | null = await this.formElementsComponent.getElementAnswers()\n\n if (answers) {\n this.submitApplicationFormSupport(answers)\n }\n }\n\n private submitApplicationFormSupport(answers: Array): void {\n if (this.token) {\n this.isLoadingStateActive = true\n\n this.service_applicationFormSupportService_submitApplicationFormSupport(this.token, answers)\n .then(() => {\n this.loadApplicationFormSupport()\n\n this.isSubmitSuccessToastOpen = true\n this.isSubmitErrorToastOpen = false\n }).catch(() => {\n this.isSubmitSuccessToastOpen = false\n this.isSubmitErrorToastOpen = true\n this.isLoadingStateActive = false\n }).finally(() => {\n setTimeout(() => {\n this.isSubmitSuccessToastOpen = false\n }, MToastDuration.DesktopXShort)\n setTimeout(() => {\n this.isSubmitErrorToastOpen = false\n }, MToastDuration.DesktopXShort)\n })\n }\n }\n\n private async displaySubmitConfirmationDialog(): Promise {\n const answers: Array | null = await this.formElementsComponent.getElementAnswers()\n\n if (answers) {\n this.isSubmitConfirmationDialogActive = true\n }\n\n this.isValidationErrorToastOpen = !answers\n }\n\n private hideSubmitConfirmationDialog(): void {\n this.isSubmitConfirmationDialogActive = true\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Ref, Watch } from 'vue-property-decorator'\n\nimport WithRender from './AdminApplicationFormSupport.html'\n\nimport { \n MButton,\n MDialog,\n MDialogState,\n MDialogWidth,\n MIcon,\n MMessage,\n MMessageState,\n MPanel,\n MSpinner,\n MToast,\n MToastDuration,\n MToastPosition,\n MToastState,\n MToastTimeout,\n} from '@ulaval/modul-components'\n\nimport Breadcrumbs from '@/modules/global/breadcrumbs/Breadcrumbs'\nimport FormElements from '@/modules/form-management/form-element/FormElements'\n\nimport { IFormModel } from '@/modules/form-management/Form.model'\nimport { IInternalFormTemplateModel } from '@/modules/form-template-management/FormTemplate.model'\nimport { IApplicationFormSupportModel } from '../ApplicationFormSupport.model'\nimport ApplicationFormSupportService, { IFetchApplicationFormSupportResponse } from '../ApplicationFormSupport.service'\nimport ApplicationFormSupportMixin from '../ApplicationFormSupport.mixin'\nimport { IFormAnswerForm } from '@/modules/form-management/Form.service'\n\nconst FORM_ELEMENTS_REF = 'form-elements'\n\n@WithRender\n@Component({\n components: {\n Breadcrumbs,\n FormElements,\n MButton,\n MDialog,\n MIcon,\n MMessage,\n MPanel,\n MSpinner,\n MToast\n }\n})\nexport default class AdminApplicationFormSupport extends mixins(ApplicationFormSupportService, ApplicationFormSupportMixin) {\n private applicationFormSupport: IApplicationFormSupportModel | null = null\n private form: IFormModel | null = null\n private internalFormTemplate: IInternalFormTemplateModel | null = null\n private isLoadingStateActive: boolean = true\n private isSubmitConfirmationDialogActive: boolean = false\n private isSubmitSuccessToastOpen: boolean = false\n private isSubmitErrorToastOpen: boolean = false\n private isValidationErrorToastOpen: boolean = false\n\n private readonly FORM_ELEMENTS_REF: string = FORM_ELEMENTS_REF\n private readonly MMessageState: object = MMessageState\n private readonly MDialogState: object = MDialogState\n private readonly MDialogWidth: object = MDialogWidth\n private readonly MToastPosition: object = MToastPosition\n private readonly MToastState: object = MToastState\n private readonly MToastTimeout: object = MToastTimeout\n\n @Ref(FORM_ELEMENTS_REF)\n private formElementsComponent!: FormElements\n\n private get submitDialogState(): MDialogState {\n if (this.isSubmitErrorToastOpen) {\n return MDialogState.Error\n } else if (this.isSubmitSuccessToastOpen) {\n return MDialogState.Confirmation\n }\n\n return MDialogState.Warning\n }\n\n @Watch('$route.params.idApplicationFormSupport', { immediate: true })\n private onRouteParamdIdChange(value: string | null) {\n if (value) {\n this.loadApplicationFormSupport(value)\n }\n }\n\n private loadApplicationFormSupport(id: string): void {\n if (id) {\n this.isLoadingStateActive = true\n \n this.service_applicationFormSupportService_fetchAdminApplicationFormSupport(id)\n .then((response: IFetchApplicationFormSupportResponse) => {\n this.applicationFormSupport = response.application_form_support || null\n this.form = response.form || null\n this.internalFormTemplate = response.internal_form_template || null\n }).catch(() => {\n this.applicationFormSupport = null\n this.form = null\n this.internalFormTemplate = null\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n }\n\n private async onSubmitButtonClick(): Promise {\n const answers: Array | null = await this.formElementsComponent.getElementAnswers(false)\n\n if (answers) {\n this.submitApplicationForm(answers)\n }\n }\n\n private submitApplicationForm(answers: Array): void {\n if (this.applicationFormSupport) {\n this.isLoadingStateActive = true\n\n this.service_applicationFormSupportService_saveAdmin(this.applicationFormSupport.id, answers)\n .then(() => {\n this.loadApplicationFormSupport(this.$route.params.idApplicationFormSupport)\n\n this.isSubmitSuccessToastOpen = true\n this.isSubmitErrorToastOpen = false\n }).catch(() => {\n this.isSubmitSuccessToastOpen = false\n this.isSubmitErrorToastOpen = true\n this.isLoadingStateActive = false\n }).finally(() => {\n setTimeout(() => {\n this.isSubmitSuccessToastOpen = false\n }, MToastDuration.DesktopXShort)\n setTimeout(() => {\n this.isSubmitErrorToastOpen = false\n }, MToastDuration.DesktopXShort)\n })\n }\n }\n\n private async displaySubmitConfirmationDialog(): Promise {\n this.isSubmitConfirmationDialogActive = true\n }\n\n private hideSubmitConfirmationDialog(): void {\n this.isSubmitConfirmationDialogActive = false\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './ApplicationFormSupportReminderEmailOverlay.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MButton,\n MButtonSkin,\n MForm,\n MMessage,\n MMessageSkin,\n MMessageState,\n MMultiSelect,\n MOverlay,\n RequiredValidator\n} from '@ulaval/modul-components'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport { ICategoryModel } from '@/modules/category-management/Category.model'\nimport ApplicationFormSupportService from '../ApplicationFormSupport.service'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MForm,\n MMessage,\n MMultiSelect,\n MOverlay,\n }\n})\nexport default class ApplicationFormSupportReminderEmailOverlay extends mixins(ApplicationFormSupportService) {\n public formGroup: FormGroup = new FormGroup({\n 'category-multi-select': new FormControl>([RequiredValidator()])\n })\n private isLoadingStateActive: boolean = false\n private isCategoryLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = false\n private showSuccessMessage: boolean = false\n private categories: Array = []\n private selectedCategories: Array = []\n\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n\n @Prop({ required: true })\n private year!: IYearModel\n\n public get categoryMultiSelect(): AbstractControl> {\n return this.formGroup.getControl('category-multi-select');\n }\n\n public get categoriesSelectOptions(): Array {\n return this.categories.map((category: ICategoryModel) => category.title)\n }\n\n private get hasAvailableCategories(): boolean {\n return this.categories.length > 0\n }\n\n @Watch('year', { immediate: true })\n private onYearChange(): void {\n this.loadCategories()\n }\n\n private loadCategories(): void {\n this.isCategoryLoadingStateActive = true\n\n this.service_applicationFormSupportService_fetchAvailableCategoriesDeposit(this.year.id)\n .then((response: Array) => {\n this.categories = response || []\n }).catch(() => {\n this.categories = []\n }).finally(() => {\n this.isCategoryLoadingStateActive = false\n })\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n\n private onTriggerButtonClick(): void {\n this.isOverlayOpen = true\n }\n\n private async onSaveButtonClick(): Promise {\n this.categoryMultiSelect.value = this.selectedCategories\n\n await this.formGroup.submit()\n\n if (!this.formGroup.hasErrorDeep()) {\n this.sendReminderEmails(this.mapSelectedCategoriesToIds())\n }\n }\n\n private sendReminderEmails(categoriesId: Array): void {\n this.isLoadingStateActive = true\n \n this.service_applicationFormSupportService_sendApplicationFormSupportReminderEmails({\n categories_id: categoriesId\n }).then(() => {\n this.showSuccessMessage = true\n }).catch((error: AxiosError) => {\n this.mixin_router_redirectRequestError(error)\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private mapSelectedCategoriesToIds(): Array {\n const ids: Array = []\n\n this.categories.forEach((category: ICategoryModel) => {\n if (this.selectedCategories.includes(category.title)) {\n ids.push(category.id)\n }\n })\n\n return ids\n }\n\n private afterOverlayClose(): void {\n this.isLoadingStateActive = false\n this.isCategoryLoadingStateActive = false\n this.showSuccessMessage = false\n this.selectedCategories = []\n\n this.formGroup.reset()\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport WithRender from './AdminApplicationFormSupports.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MColumnTable,\n MIcon,\n MIconButton,\n MOption,\n MOptionItem,\n MPagination,\n MPopup,\n MTable,\n MTableHeader,\n MToggleButtons,\n MToggleButton,\n MSearchfield,\n MColumnTextAlign\n} from '@ulaval/modul-components'\n\nimport EmailStatusRow from '@/modules/global/email/EmailStatusRow'\nimport ApplicationFormSupportRow from '@/modules/application-form-support-management/application-form-support/ApplicationFormSupportRow'\nimport ApplicationFormSupportReminderEmailOverlay from '../application-form-support/ApplicationFormSupportReminderEmailOverlay'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport { IPaginationResultData } from '@/modules/global/utilities/Pagination.model'\nimport CONSTANTS from '@/CONSTANTS'\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\nimport ROUTES from '@/router/ROUTES'\nimport ApplicationFormSupportService, { IFetchAdminApplicationFormSupportsListQueryParameters, IFetchAdminApplicationFormSupportsListResponse } from '../ApplicationFormSupport.service'\nimport ApplicationFormSupportMixin from '../ApplicationFormSupport.mixin'\nimport { ApplicationFormSupportStatus, IAdminApplicationFormSupportModel } from '../ApplicationFormSupport.model'\n\n@WithRender\n@Component({\n components: {\n ApplicationFormSupportReminderEmailOverlay,\n ApplicationFormSupportRow,\n EmailStatusRow,\n MIcon,\n MIconButton,\n MOption,\n MOptionItem,\n MPagination,\n MPopup, \n MTable,\n MTableHeader,\n MToggleButtons,\n MSearchfield\n }\n})\nexport default class AdminApplicationFormSupports extends mixins(ApplicationFormSupportService, ApplicationFormSupportMixin) {\n public formGroup: FormGroup = new FormGroup({\n 'search-field': new FormControl()\n })\n private applicationFormSupports: Array = []\n private selectedApplicationFormSupportStatus: Array = Object.values(ApplicationFormSupportStatus)\n private paginationData: IPaginationResultData | null = null\n private isLoadingStateActive: boolean = false\n\n @Prop({ required: true })\n private year!: IYearModel\n\n public get searchField(): AbstractControl {\n return this.formGroup.getControl('search-field');\n }\n\n private get statusToggleButtons(): Array {\n return Object.values(ApplicationFormSupportStatus).reduce((toggleButtons: Array, key: string) => {\n return [\n ...toggleButtons,\n {\n id: key,\n title: this.mixin_applicationFormSupport_computeStatusLabel(key),\n pressed: this.selectedApplicationFormSupportStatus.includes(key) \n } as MToggleButton\n ]\n }, [])\n }\n\n private get tableColumns(): Array {\n return [\n {\n id: 'candidate',\n title: this.$i18next.t('modules.application-form-support-management.application-form-supports.AdminApplicationFormSupports.table.columns.candidate.title'),\n dataProp: 'candidate_full_name_with_username'\n },\n {\n id: 'supporter',\n title: this.$i18next.t('modules.application-form-support-management.application-form-supports.AdminApplicationFormSupports.table.columns.supporter.title'),\n dataProp: 'supporter_name_with_email'\n },\n {\n id: 'category',\n title: this.$i18next.t('modules.application-form-support-management.application-form-supports.AdminApplicationFormSupports.table.columns.category.title'),\n dataProp: 'category_title'\n },\n {\n id: 'status',\n title: this.$i18next.t('modules.application-form-support-management.application-form-supports.AdminApplicationFormSupports.table.columns.status.title'),\n dataProp: 'status',\n width: '200px'\n },\n {\n id: 'options',\n title: '',\n dataProp: 'options',\n textAlign: MColumnTextAlign.Right,\n width: '50px'\n }\n ]\n }\n\n @Watch('year', { immediate: true })\n private onYearChange(): void {\n this.loadApplicationForms()\n }\n\n @Watch('selectedApplicationFormSupportStatus')\n private onSelectedApplicationFormSupportStatusChange(): void {\n if (this.paginationData) {\n this.loadApplicationForms(this.paginationData.current_page_index)\n }\n }\n\n private mounted(): void {\n this.afterApplicationFormReminderEmailSent()\n }\n\n private afterApplicationFormReminderEmailSent(): void {\n EventBus.$on(EVENT_BUS_EVENTS.APPLICATION_FORM_SUPPORT_REMINDER_EMAIL_SENT, () => {\n if (this.paginationData) {\n this.loadApplicationForms(this.paginationData.current_page_index)\n }\n })\n }\n\n private loadApplicationForms(pageIndex: number = 0): void {\n const loadingStateActivationTimeout: any = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n\n const query: IFetchAdminApplicationFormSupportsListQueryParameters = {\n year_id: this.year.id,\n query: this.searchField.value,\n status: this.selectedApplicationFormSupportStatus,\n page: pageIndex\n }\n\n this.service_applicationFormSupportService_fetchAdminApplicationFormList(query) \n .then((responseData: IFetchAdminApplicationFormSupportsListResponse) => {\n this.applicationFormSupports = responseData.application_form_supports || []\n this.paginationData = responseData.pagination || null\n }).catch(() => {\n this.applicationFormSupports = []\n this.paginationData = null\n }).finally(() => {\n clearTimeout(loadingStateActivationTimeout)\n this.isLoadingStateActive = false\n })\n }\n\n private onSearchFieldChange(): void {\n this.loadApplicationForms(0)\n }\n\n private onPageChange(newIndex: number): void {\n this.loadApplicationForms(newIndex - 1)\n }\n\n private onToggleButtonClick(toggleButton: MToggleButton): void {\n if (toggleButton.pressed) {\n const statusIndex: number | undefined = this.selectedApplicationFormSupportStatus.indexOf(toggleButton.id)\n\n if (!~statusIndex) {\n this.$set(this.selectedApplicationFormSupportStatus, this.selectedApplicationFormSupportStatus.length, toggleButton.id)\n }\n } else {\n const statusIndex: number | undefined = this.selectedApplicationFormSupportStatus.indexOf(toggleButton.id)\n\n if (~statusIndex) {\n this.$delete(this.selectedApplicationFormSupportStatus, statusIndex)\n }\n }\n }\n\n private onShowApplicationFormSupportIconClick(event: Event, applicationFormSupport: IAdminApplicationFormSupportModel): void {\n this.mixin_router_navigate({\n name: ROUTES.ADMIN_APPLICATION_FORM_SUPPORT,\n params: {\n idApplicationFormSupport: applicationFormSupport.id\n }\n }, event)\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './AdminApplicationFormSupportManagement.html'\n\nimport { \n MPanel\n} from '@ulaval/modul-components'\n\nimport AdminApplicationFormSupports from './application-form-supports/AdminApplicationFormSupports'\nimport YearDropdown from '../global/year/YearDropdown'\nimport Breadcrumbs from '../global/breadcrumbs/Breadcrumbs'\n\nimport { IYearModel } from '../global/year/Year.model'\n\n@WithRender\n@Component({\n components: {\n AdminApplicationFormSupports,\n Breadcrumbs,\n MPanel,\n YearDropdown\n }\n})\nexport default class AdminApplicationFormSupportManagement extends mixins() {\n private year: IYearModel | null = null\n}\n","import { IBaseModel } from \"@/modules/global/utilities/Base.model\";\n\nexport enum ApplicationFormValidationStatus {\n IN_PROGRESS = 'IN_PROGRESS',\n VALID = 'VALID',\n INVALID = 'INVALID'\n}\n\nexport interface IApplicationFormValidationModel extends IBaseModel {\n candidate_full_name_with_username: string;\n category_title: string;\n is_updateable: boolean;\n status: ApplicationFormValidationStatus;\n}","import Component, { mixins } from 'vue-class-component'\n\nimport { ApplicationFormValidationStatus, IApplicationFormValidationModel } from './ApplicationFormValidation.model'\n\n@Component\nexport default class ApplicationFormValidationMixin extends mixins() {\n protected mixin_applicationFormValidation_computeStatusColor(applicationForm: IApplicationFormValidationModel): string {\n switch (applicationForm.status) {\n case ApplicationFormValidationStatus.IN_PROGRESS:\n return '#ffc103'\n case ApplicationFormValidationStatus.INVALID:\n return '#e30513'\n case ApplicationFormValidationStatus.VALID:\n return '#00c77f'\n default:\n return 'grey'\n }\n }\n\n protected mixin_applicationFormValidation_computeStatusIcon(applicationForm: IApplicationFormValidationModel): string | null {\n switch (applicationForm.status) {\n case ApplicationFormValidationStatus.IN_PROGRESS:\n return 'pd-svg__user-wait'\n case ApplicationFormValidationStatus.INVALID:\n return 'm-svg__error'\n case ApplicationFormValidationStatus.VALID:\n return 'm-svg__confirmation'\n default:\n return null\n }\n }\n\n protected mixin_applicationFormValidation_computeStatusIconStyles(applicationForm: IApplicationFormValidationModel): object {\n return {\n 'color': this.mixin_applicationFormValidation_computeStatusColor(applicationForm)\n }\n }\n\n protected mixin_applicationFormValidation_computeStatusLabel(status: ApplicationFormValidationStatus | string): string | null {\n return this.$i18next.t(`modules.application-form-validation-management.ApplicationFormValidationMixin.status.${status}`)\n }\n}","import Component from \"vue-class-component\";\n\nimport { AxiosError, AxiosResponse } from \"axios\";\n\nimport { ApplicationFormValidationStatus, IApplicationFormValidationModel } from \"./ApplicationFormValidation.model\";\nimport FormTemplateService from \"../form-template-management/FormTemplate.service\";\nimport { IPaginationQueryParameters } from \"../global/utilities/Base.service\";\nimport { IPaginatedResponse } from \"../global/utilities/Pagination.model\";\nimport { IApplicationFormModel } from \"../application-form-management/ApplicationForm.model\";\nimport { IFormAnswerFileModel, IFormModel } from \"../form-management/Form.model\";\nimport { IInternalFormTemplateModel } from \"../form-template-management/FormTemplate.model\";\nimport { IFormAnswerForm } from \"../form-management/Form.service\";\nimport { IFileUploadModel } from \"../global/file/File.model\";\n\nexport interface IFetchApplicationFormValidationsListQueryParameters extends IPaginationQueryParameters {\n year_id: string;\n query?: string;\n status: Array;\n}\n\nexport interface IFetchApplicationFormValidationsListResponse extends IPaginatedResponse {\n application_form_validations: Array;\n}\n\nexport interface IFetchApplicationFormValidationResponse {\n application_form_validation: {\n application_form_validation: IApplicationFormValidationModel;\n form: IFormModel;\n internal_form_template: IInternalFormTemplateModel;\n };\n application_form: {\n application_form: IApplicationFormModel;\n form: IFormModel;\n internal_form_template: IInternalFormTemplateModel;\n };\n}\n\nexport interface IUpdateApplicationFormValidationStatusForm {\n status: ApplicationFormValidationStatus;\n}\n\n@Component\nexport default class ApplicationFormValidationService extends FormTemplateService {\n protected service_applicationFormValidationService_fetchAdminApplicationFormValidationList(query: IFetchApplicationFormValidationsListQueryParameters): Promise {\n return new Promise((resolve: any, reject: any): void => {\n const queryString: string = this.service_baseService_generateFilterQuery(query)\n\n this.$axios.get(`/api/application-form-validations?${queryString}`)\n .then((response: AxiosResponse) => resolve(response.data.data))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormValidationService_fetchApplicationForm(id: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/application-form-validations/${id}`)\n .then((response: AxiosResponse) => resolve({\n application_form: {\n application_form: response.data.data.application_form.application_form,\n form: response.data.data.application_form.form,\n internal_form_template: this.service_formTemplateService_mapFormTemplateToInternalFormTemplate(response.data.data.application_form.form.form_template)\n },\n application_form_validation: {\n application_form_validation: response.data.data.application_form_validation.application_form_validation,\n form: response.data.data.application_form_validation.form,\n internal_form_template: this.service_formTemplateService_mapFormTemplateToInternalFormTemplate(response.data.data.application_form_validation.form.form_template)\n }\n } as IFetchApplicationFormValidationResponse\n ))\n .catch((error: AxiosError) => reject(error))\n })\n }\n\n protected service_applicationFormValidationService_save(id: string, answers: Array): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(\n `/api/application-form-validations/${id}`, \n this.service_applicationFormValidationService_generateAnswersFormData(answers), \n {\n headers: this.service_baseService_multipartFormDataHeader()\n }\n ).then(() => {\n resolve()\n }).catch((error: AxiosError) => reject(error))\n })\n }\n\n private service_applicationFormValidationService_generateAnswersFormData(answers: Array): FormData {\n const data: FormData = new FormData()\n\n answers.forEach((answerForm: any, index: number) => {\n for (const key in answerForm) {\n const answerValue: any = answerForm[key]\n\n if (\n answerValue != undefined && \n answerValue != null &&\n key != 'files'\n ) {\n data.append(`answers[${index}].${key}`, answerValue)\n }\n }\n\n if (answerForm.files) {\n answerForm.files.forEach((uploadedFile: IFileUploadModel, fileIndex: number) => {\n if (uploadedFile.server_file) {\n data.set(`answers[${index}].form_answer_files[${fileIndex}].id`, uploadedFile.server_file.id)\n } else if (uploadedFile && uploadedFile.file) {\n data.append(`answers[${index}].form_answer_files[${fileIndex}].file`, uploadedFile.file.file)\n }\n })\n }\n })\n\n return data\n }\n\n protected service_applicationFormValidationService_updateStatus(id: string, form: IUpdateApplicationFormValidationStatusForm): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.put(`/api/application-form-validations/${id}/status`, form)\n .then(() => resolve())\n .catch((error: AxiosError) => reject(error))\n })\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport WithRender from './AdminApplicationFormValidations.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MColumnTable,\n MIcon,\n MIconButton,\n MOption,\n MOptionItem,\n MPagination,\n MPopup,\n MTable,\n MTableHeader,\n MToggleButtons,\n MToggleButton,\n MSearchfield,\n MColumnTextAlign\n} from '@ulaval/modul-components'\n\nimport ApplicationFormValidationMixin from '../ApplicationFormValidation.mixin'\nimport ApplicationFormValidationService, { IFetchApplicationFormValidationsListQueryParameters, IFetchApplicationFormValidationsListResponse } from '../ApplicationFormValidation.service'\nimport { ApplicationFormValidationStatus, IApplicationFormValidationModel } from '../ApplicationFormValidation.model'\nimport { IPaginationResultData } from '@/modules/global/utilities/Pagination.model'\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport CONSTANTS from '@/CONSTANTS'\nimport ROUTES from '@/router/ROUTES'\n\n@WithRender\n@Component({\n components: {\n MIcon,\n MIconButton,\n MOption,\n MOptionItem,\n MPagination,\n MPopup, \n MTable,\n MTableHeader,\n MToggleButtons,\n MSearchfield\n }\n})\nexport default class AdminApplicationFormValidations extends mixins(ApplicationFormValidationMixin, ApplicationFormValidationService) {\n public formGroup: FormGroup = new FormGroup({\n 'search-field': new FormControl()\n })\n private applicationFormValidations: Array = []\n private selectedApplicationFormValidationStatus: Array = Object.values(ApplicationFormValidationStatus)\n private paginationData: IPaginationResultData | null = null\n private isLoadingStateActive: boolean = false\n\n @Prop({ required: true })\n private year!: IYearModel\n\n public get searchField(): AbstractControl {\n return this.formGroup.getControl('search-field');\n }\n\n private get statusToggleButtons(): Array {\n return Object.values(ApplicationFormValidationStatus).reduce((toggleButtons: Array, key: string) => {\n return [\n ...toggleButtons,\n {\n id: key,\n title: this.mixin_applicationFormValidation_computeStatusLabel(key),\n pressed: this.selectedApplicationFormValidationStatus.includes(key) \n } as MToggleButton\n ]\n }, [])\n }\n\n private get tableColumns(): Array {\n return [\n {\n id: 'candidate',\n title: this.$i18next.t('modules.application-form-validation-management.application-form-validations.AdminApplicationFormValidations.table.columns.candidate.title'),\n dataProp: 'candidate_full_name_with_username'\n },\n {\n id: 'category',\n title: this.$i18next.t('modules.application-form-validation-management.application-form-validations.AdminApplicationFormValidations.table.columns.category.title'),\n dataProp: 'category_title'\n },\n {\n id: 'timestamp',\n title: this.$i18next.t('modules.application-form-validation-management.application-form-validations.AdminApplicationFormValidations.table.columns.timestamp.title'),\n dataProp: 'timestamp',\n width: '550px'\n },\n {\n id: 'status',\n title: this.$i18next.t('modules.application-form-validation-management.application-form-validations.AdminApplicationFormValidations.table.columns.status.title'),\n dataProp: 'status',\n width: '200px'\n },\n {\n id: 'options',\n title: '',\n dataProp: 'options',\n textAlign: MColumnTextAlign.Right,\n width: '50px'\n }\n ]\n }\n\n @Watch('year', { immediate: true })\n private onYearChange(): void {\n this.loadApplicationForms()\n }\n\n @Watch('selectedApplicationFormValidationStatus')\n private onSelectedApplicationFormValidationStatusChange(): void {\n if (this.paginationData) {\n this.loadApplicationForms(this.paginationData.current_page_index)\n }\n }\n\n private loadApplicationForms(pageIndex: number = 0): void {\n const loadingStateActivationTimeout: any = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n\n const query: IFetchApplicationFormValidationsListQueryParameters = {\n year_id: this.year.id,\n query: this.searchField.value,\n status: this.selectedApplicationFormValidationStatus,\n page: pageIndex\n }\n\n this.service_applicationFormValidationService_fetchAdminApplicationFormValidationList(query) \n .then((responseData: IFetchApplicationFormValidationsListResponse) => {\n this.applicationFormValidations = responseData.application_form_validations || []\n this.paginationData = responseData.pagination || null\n }).catch(() => {\n this.applicationFormValidations = []\n this.paginationData = null\n }).finally(() => {\n clearTimeout(loadingStateActivationTimeout)\n this.isLoadingStateActive = false\n })\n }\n\n private onSearchFieldChange(): void {\n this.loadApplicationForms(0)\n }\n\n private onPageChange(newIndex: number): void {\n this.loadApplicationForms(newIndex - 1)\n }\n\n private onToggleButtonClick(toggleButton: MToggleButton): void {\n if (toggleButton.pressed) {\n const statusIndex: number | undefined = this.selectedApplicationFormValidationStatus.indexOf(toggleButton.id)\n\n if (!~statusIndex) {\n this.$set(this.selectedApplicationFormValidationStatus, this.selectedApplicationFormValidationStatus.length, toggleButton.id)\n }\n } else {\n const statusIndex: number | undefined = this.selectedApplicationFormValidationStatus.indexOf(toggleButton.id)\n\n if (~statusIndex) {\n this.$delete(this.selectedApplicationFormValidationStatus, statusIndex)\n }\n }\n }\n\n private onShowApplicationFormValidationIconClick(event: Event, applicationFormValidation: IApplicationFormValidationModel): void {\n this.mixin_router_navigate({\n name: ROUTES.ADMIN_APPLICATION_FORM_VALIDATION_FORM,\n params: {\n idApplicationFormValidation: applicationFormValidation.id\n }\n }, event)\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './AdminApplicationFormValidationManagement.html'\n\nimport { \n MPanel\n} from '@ulaval/modul-components'\n\nimport AdminApplicationFormValidations from './application-form-validations/AdminApplicationFormValidations'\nimport YearDropdown from '../global/year/YearDropdown'\nimport Breadcrumbs from '../global/breadcrumbs/Breadcrumbs'\n\nimport { IYearModel } from '../global/year/Year.model'\n\n@WithRender\n@Component({\n components: {\n AdminApplicationFormValidations,\n Breadcrumbs,\n MPanel,\n YearDropdown\n }\n})\nexport default class AdminApplicationFormValidationManagement extends mixins() {\n private year: IYearModel | null = null\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Ref, Watch } from 'vue-property-decorator'\n\nimport WithRender from './AdminApplicationFormValidation.html'\n\nimport { \n MButton,\n MButtonSkin,\n MIcon,\n MMessage,\n MMessageState,\n MPanel,\n MSpinner,\n MToast,\n MToastPosition,\n MToastState,\n MToastTimeout,\n} from '@ulaval/modul-components'\n\nimport Breadcrumbs from '@/modules/global/breadcrumbs/Breadcrumbs'\nimport FormElements from '@/modules/form-management/form-element/FormElements'\n\nimport ApplicationFormValidationService, { IFetchApplicationFormValidationResponse } from '../ApplicationFormValidation.service'\nimport { ApplicationFormValidationStatus, IApplicationFormValidationModel } from '../ApplicationFormValidation.model'\nimport { IFormModel } from '@/modules/form-management/Form.model'\nimport { IInternalFormTemplateModel } from '@/modules/form-template-management/FormTemplate.model'\nimport { IApplicationFormModel } from '@/modules/application-form-management/ApplicationForm.model'\nimport { IFormAnswerForm } from '@/modules/form-management/Form.service'\nimport { AxiosError } from 'axios'\nimport ApplicationFormMixin from '@/modules/application-form-management/ApplicationForm.mixin'\n\nconst APPLICATION_FORM_VALIDATION_FORM_ELEMENTS: string = \"application-form-validation-form-elements\"\n\n@WithRender\n@Component({\n components: {\n Breadcrumbs,\n FormElements,\n MButton,\n MIcon,\n MMessage,\n MPanel,\n MSpinner,\n MToast\n }\n})\nexport default class AdminApplicationFormValidation extends mixins(ApplicationFormValidationService, ApplicationFormMixin) {\n private applicationFormValidation: IApplicationFormValidationModel | null = null\n private applicationFormValidationForm: IFormModel | null = null\n private applicationFormValidationInternalFormTemplate: IInternalFormTemplateModel | null = null\n private applicationForm: IApplicationFormModel | null = null\n private applicationFormForm: IFormModel | null = null\n private applicationFormInternalFormTemplate: IInternalFormTemplateModel | null = null\n private isLoadingStateActive: boolean = true\n private isUpdateApplicationFormValidationSuccessToastOpen: boolean = false\n private isDownloadAllFormAnswerFilesLoadingStateActive: boolean = false\n\n private readonly MMessageState: object = MMessageState\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MToastPosition: object = MToastPosition\n private readonly MToastState: object = MToastState\n private readonly MToastTimeout: object = MToastTimeout\n private readonly APPLICATION_FORM_VALIDATION_FORM_ELEMENTS: string = APPLICATION_FORM_VALIDATION_FORM_ELEMENTS\n\n @Ref(APPLICATION_FORM_VALIDATION_FORM_ELEMENTS)\n private applicationFormValidationFormElementsComponent!: FormElements\n\n @Watch('$route.params.idApplicationFormValidation', { immediate: true })\n private onRouteParamsIdChange(value: string | null) {\n if (value) {\n this.loadApplicationFormValidation(value)\n }\n }\n\n private loadApplicationFormValidation(id: string): void {\n this.isLoadingStateActive = true\n\n this.service_applicationFormValidationService_fetchApplicationForm(id)\n .then((response: IFetchApplicationFormValidationResponse) => {\n this.applicationFormValidation = response.application_form_validation.application_form_validation || null\n this.applicationFormValidationForm = response.application_form_validation.form || null\n this.applicationFormValidationInternalFormTemplate = response.application_form_validation.internal_form_template || null\n this.applicationForm = response.application_form.application_form || null\n this.applicationFormForm = response.application_form.form || null\n this.applicationFormInternalFormTemplate = response.application_form.internal_form_template || null\n }).catch(() => {\n this.applicationFormValidation = null\n this.applicationFormValidationForm = null\n this.applicationFormValidationInternalFormTemplate = null\n this.applicationForm = null\n this.applicationFormForm = null\n this.applicationFormInternalFormTemplate = null\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private async onSaveApplicationFormValidationButtonClick(): Promise {\n const answers: Array | null = await this.applicationFormValidationFormElementsComponent.getElementAnswers(false)\n\n if (answers) {\n this.saveApplicationFormValidation(answers)\n }\n }\n\n private saveApplicationFormValidation(answers: Array): void {\n if (this.applicationFormValidation) {\n this.isLoadingStateActive = true\n this.isUpdateApplicationFormValidationSuccessToastOpen = false\n\n this.service_applicationFormValidationService_save(this.applicationFormValidation.id, answers)\n .then(() => {\n this.isUpdateApplicationFormValidationSuccessToastOpen = true\n this.loadApplicationFormValidation(this.$route.params.idApplicationFormValidation)\n }).catch((error: AxiosError) => {\n this.isLoadingStateActive = false\n this.mixin_router_redirectRequestError(error)\n })\n }\n }\n\n private onFlagApplicationFormValidationAsValidButtonClick(): void {\n this.updateApplicationFormValidationStatus(ApplicationFormValidationStatus.VALID)\n }\n\n private onFlagApplicationFormValidationAsInvalidButtonClick(): void {\n this.updateApplicationFormValidationStatus(ApplicationFormValidationStatus.INVALID)\n }\n\n private updateApplicationFormValidationStatus(status: ApplicationFormValidationStatus): void {\n if (this.applicationFormValidation) {\n this.isLoadingStateActive = true\n this.isUpdateApplicationFormValidationSuccessToastOpen = false\n\n this.service_applicationFormValidationService_updateStatus(this.applicationFormValidation.id, { status })\n .then(() => {\n this.isUpdateApplicationFormValidationSuccessToastOpen = true\n this.loadApplicationFormValidation(this.$route.params.idApplicationFormValidation)\n }).catch((error: AxiosError) => {\n this.isLoadingStateActive = false\n this.mixin_router_redirectRequestError(error)\n })\n }\n }\n\n private async downloadAllFormAnswerFiles(): Promise {\n this.isDownloadAllFormAnswerFilesLoadingStateActive = true\n\n await this.mixin_applicationForm_downloadAllFormAnswerFiles(this.applicationFormForm || undefined)\n\n this.isDownloadAllFormAnswerFilesLoadingStateActive = false\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Watch } from 'vue-property-decorator'\n\nimport WithRender from './EvaluationCardDepositOverlay.html'\n\nimport { \n MButton,\n MButtonSkin,\n MForm,\n MIcon,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay,\n MProgress,\n MValidationMessage,\n FormGroup\n} from '@ulaval/modul-components'\n\nimport UploadedFileRow from '@/modules/global/file/UploadedFileRow'\n\nimport { ICategoryModel } from '../../Category.model'\nimport CategoryService from '../../Category.service'\nimport ROUTES from '@/router/ROUTES'\nimport { IEvaluationCardModel } from '../EvaluationCard.model'\nimport { IFileUploadModel } from '@/modules/global/file/File.model'\nimport { MFile } from '@ulaval/modul-components/dist/utils/file/file'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MForm,\n MIcon,\n MMessage,\n MOverlay,\n MProgress,\n MValidationMessage,\n UploadedFileRow\n }\n})\nexport default class EvaluationCardDepositOverlay extends mixins(CategoryService) {\n public formGroup: FormGroup = new FormGroup({\n \n })\n private file: IFileUploadModel | null = null\n protected errorMessage: string | null = null\n private isOverlayOpen: boolean = true\n private isLoadingStateActive: boolean = false\n private isCategoryFetchLoadingStateActive: boolean = false\n private showSubmitSuccessMessage: boolean = false\n private showSubmitErrorMessage: boolean = false\n private category: ICategoryModel | null = null\n\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly allowedExtensions: Array = ['pdf']\n\n @Watch('$route.params.idCategory', { immediate: true })\n private onCategoryIdRouteParameterChange(value: string): void {\n this.loadCategory(value)\n }\n\n @Watch('file')\n private onFileChange(): void {\n if (!this.file) {\n this.errorMessage = this.$i18next.t(\n 'modules.category-management.evaluation-card-management.evaluation-card-deposit.EvaluationCardDepositOverlay.validation.required'\n )\n } else {\n this.errorMessage = null\n }\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n\n private afterOverlayClose(): void {\n this.mixin_router_navigate({\n name: ROUTES.CATEGORY_MANAGEMENT_CATEGORY_LIST\n })\n }\n\n private async onSubmitButtonClick(): Promise {\n if (this.validate()) {\n this.updateCategory()\n }\n }\n\n private loadCategory(id: string): void {\n this.isCategoryFetchLoadingStateActive = true\n\n this.service_categoryService_fetch(id)\n .then((responseData: ICategoryModel) => {\n this.category = responseData || null\n \n if (this.category.evaluation_card) {\n this.file = {\n server_file: this.category.evaluation_card\n }\n }\n }).catch(() => {\n this.category = null\n }).finally(() => {\n this.isCategoryFetchLoadingStateActive = false\n })\n }\n\n private updateCategory(): void {\n if (this.category && this.file) {\n this.isLoadingStateActive = true\n\n this.service_categoryService_evaluationCardDeposit(this.category.id, this.file)\n .then(() => {\n this.showSubmitSuccessMessage = true\n this.showSubmitErrorMessage = false\n }).catch(() => {\n this.showSubmitSuccessMessage = false\n this.showSubmitErrorMessage = true\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n }\n\n private onFilesReady(files: Array): void {\n this.$file.uploadTemp(files)\n }\n\n private onFilesUploadCompleted(files: Array): void {\n if (files[0]) {\n this.file = {\n file: files[0]\n }\n } else {\n this.file = null\n }\n }\n\n private removeFile(): void {\n this.file = null\n }\n\n private validate(): boolean {\n this.errorMessage = null\n \n if (!this.file) {\n this.errorMessage = this.$i18next.t('modules.category-management.evaluation-card-management.evaluation-card-deposit.EvaluationCardDepositOverlay.validation.required')\n }\n\n return this.mixin_string_isEmpty(this.errorMessage)\n }\n}\n","import Component, { mixins } from \"vue-class-component\";\n\nimport { EvaluatorApplicationFormAssignmentStatus, IEvaluatorApplicationFormAssignmentModel } from \"./EvaluatorApplicationFormAssignment.model\";\n\n@Component\nexport default class EvaluatorApplicationFormAssignmentMixin extends mixins() {\n protected mixin_evaluatorApplicationFormAssignment_computeStatusColor(evaluatorApplicationFormAssignment: IEvaluatorApplicationFormAssignmentModel): string {\n switch (evaluatorApplicationFormAssignment.status) {\n case EvaluatorApplicationFormAssignmentStatus.IN_PROGRESS:\n return '#ffc103'\n case EvaluatorApplicationFormAssignmentStatus.OVERDUE:\n return '#e30513'\n case EvaluatorApplicationFormAssignmentStatus.DONE:\n return '#00c77f'\n default:\n return 'grey'\n }\n }\n\n protected mixin_evaluatorApplicationFormAssignment_computeStatusIcon(evaluatorApplicationFormAssignment: IEvaluatorApplicationFormAssignmentModel): string | null {\n switch (evaluatorApplicationFormAssignment.status) {\n case EvaluatorApplicationFormAssignmentStatus.IN_PROGRESS:\n return 'pd-svg__user-wait'\n case EvaluatorApplicationFormAssignmentStatus.OVERDUE:\n return 'm-svg__error'\n case EvaluatorApplicationFormAssignmentStatus.DONE:\n return 'm-svg__confirmation'\n default:\n return null\n }\n }\n\n protected mixin_evaluatorApplicationFormAssignment_computeStatusIconStyles(evaluatorApplicationFormAssignment: IEvaluatorApplicationFormAssignmentModel): object {\n return {\n 'color': this.mixin_evaluatorApplicationFormAssignment_computeStatusColor(evaluatorApplicationFormAssignment)\n }\n }\n}","import Component, { mixins } from 'vue-class-component'\nimport { Prop } from 'vue-property-decorator'\n\nimport WithRender from './EvaluatorApplicationFormAssignmentPopoverRow.html'\n\nimport { \n MIcon\n} from '@ulaval/modul-components'\n\nimport { IEvaluatorApplicationFormAssignmentModel } from '../EvaluatorApplicationFormAssignment.model'\nimport EvaluatorApplicationFormAssignmentMixin from '../EvaluatorApplicationFormAssignment.mixin'\n\n@WithRender\n@Component({\n components: {\n MIcon\n }\n})\nexport default class EvaluatorApplicationFormAssignmentRow extends mixins(EvaluatorApplicationFormAssignmentMixin) {\n @Prop({ required: true })\n private evaluatorApplicationFormAssignment!: IEvaluatorApplicationFormAssignmentModel\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport WithRender from './AdminEvaluatorCategoryAssignments.html'\n\nimport { \n AbstractControl, \n FormControl, \n FormGroup, \n MButton,\n MColumnTable, \n MColumnTextAlign, \n MIconButton,\n MOption,\n MOptionItem,\n MPagination, \n MPopup,\n MSearchfield, \n MTable, \n MTableHeader \n} from '@ulaval/modul-components'\n\nimport CONSTANTS from '@/CONSTANTS'\nimport { IPaginationResultData } from '@/modules/global/utilities/Pagination.model'\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport EvaluatorCategoryAssignmentService, { IAdminFetchEvaluatorsCategoryAssignmentsQueryParameters, IAdminFetchEvaluatorsCategoryAssignmentsResponse } from '../EvaluatorCategoryAssignment.service'\nimport EvaluatorApplicationFormAssignmentPopoverRow from '../../evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormAssignmentPopoverRow'\nimport ROUTES from '@/router/ROUTES'\nimport { IEvaluatorCategoryAssignmentAdminModel } from '../EvaluatorCategoryAsssignment.model'\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\nimport EmailStatusRow from '@/modules/global/email/EmailStatusRow'\n\n\n@WithRender\n@Component({\n components: {\n EmailStatusRow,\n EvaluatorApplicationFormAssignmentPopoverRow,\n MButton,\n MIconButton,\n MOption,\n MOptionItem,\n MPagination,\n MPopup,\n MSearchfield,\n MTable,\n MTableHeader\n }\n})\nexport default class AdminEvaluatorCategoryAssignments extends mixins(EvaluatorCategoryAssignmentService) {\n public formGroup: FormGroup = new FormGroup({\n 'search-field': new FormControl()\n })\n private evaluatorCategoryAssignments: Array = []\n private paginationData: IPaginationResultData | null = null\n private isLoadingStateActive: boolean = false\n \n @Prop({ required: true })\n private year!: IYearModel\n\n @Watch('year', { immediate: true })\n private onYearChange(): void {\n this.loadEvaluatorCategoryAssignments()\n }\n\n public get searchField(): AbstractControl {\n return this.formGroup.getControl('search-field');\n }\n\n private get tableColumns(): Array {\n return [\n {\n id: 'evaluator',\n title: this.$i18next.t('modules.evaluator-management.evaluator-category-assignment-management.evaluator-category-assignments.AdminEvaluatorCategoryAssignments.table.columns.evaluator.title'),\n dataProp: 'evaluator_full_name_with_username',\n width: '400px'\n },\n {\n id: 'category',\n title: this.$i18next.t('modules.evaluator-management.evaluator-category-assignment-management.evaluator-category-assignments.AdminEvaluatorCategoryAssignments.table.columns.category.title'),\n dataProp: 'category_title'\n },\n {\n id: 'options',\n title: this.$i18next.t('modules.evaluator-management.evaluator-category-assignment-management.evaluator-category-assignments.AdminEvaluatorCategoryAssignments.table.columns.options.title'),\n dataProp: 'options',\n textAlign: MColumnTextAlign.Right,\n width: '50px'\n }\n ]\n }\n\n private mounted(): void {\n this.afterEvaluatorCategoryAssignmentCreation()\n this.afterEvaluatorCategoryAssignmentUpdate()\n }\n\n private afterEvaluatorCategoryAssignmentCreation(): void {\n EventBus.$on(EVENT_BUS_EVENTS.EVALUATOR_CATEGORY_ASSIGNMENT_CREATED, () => {\n this.loadEvaluatorCategoryAssignments()\n })\n }\n\n private afterEvaluatorCategoryAssignmentUpdate(): void {\n EventBus.$on(EVENT_BUS_EVENTS.EVALUATOR_CATEGORY_ASSIGNMENT_UPDATED, () => {\n this.loadEvaluatorCategoryAssignments()\n })\n }\n\n private loadEvaluatorCategoryAssignments(pageIndex: number = 0): void {\n const loadingStateActivationTimeout: any = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n\n const query: IAdminFetchEvaluatorsCategoryAssignmentsQueryParameters = {\n year_id: this.year.id,\n query: this.searchField.value,\n page: pageIndex\n }\n\n this.service_evaluatorCategoryAssignmentService_adminFetchEvaluatorsCategoryAssignments(query) \n .then((responseData: IAdminFetchEvaluatorsCategoryAssignmentsResponse) => {\n this.evaluatorCategoryAssignments = responseData.evaluator_category_assignments || []\n this.paginationData = responseData.pagination || null\n }).catch(() => {\n this.evaluatorCategoryAssignments = []\n this.paginationData = null\n }).finally(() => {\n clearTimeout(loadingStateActivationTimeout)\n this.isLoadingStateActive = false\n })\n }\n\n private onSearchFieldChange(): void {\n this.loadEvaluatorCategoryAssignments(0)\n }\n\n private onPageChange(newIndex: number): void {\n this.loadEvaluatorCategoryAssignments(newIndex - 1)\n }\n\n private onTriggerCreationButtonClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.EVALUATOR_MANAGEMENT_CREATION\n })\n }\n\n private onTriggerUpdateButtonClick(evaluatorCategoryAssignment: IEvaluatorCategoryAssignmentAdminModel): void {\n if (evaluatorCategoryAssignment) {\n this.mixin_router_navigate({\n name: ROUTES.EVALUATOR_MANAGEMENT_UPDATE,\n params: {\n idEvaluator: evaluatorCategoryAssignment.evaluator_id\n }\n })\n }\n }\n\n private onTriggerEvaluatorToolboxFileDepositButtonClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.EVALUATOR_MANAGEMENT_EVALUATOR_TOOLBOX_FILE_DEPOSIT\n })\n }\n\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './EvaluatorManagement.html'\n\nimport { \n MPanel\n} from '@ulaval/modul-components'\n\nimport YearDropdown from '../global/year/YearDropdown'\nimport Breadcrumbs from '../global/breadcrumbs/Breadcrumbs'\nimport AdminEvaluatorCategoryAssignments from './evaluator-category-assignment-management/evaluator-category-assignments/AdminEvaluatorCategoryAssignments'\n\nimport { IYearModel } from '../global/year/Year.model'\n\n@WithRender\n@Component({\n components: {\n AdminEvaluatorCategoryAssignments,\n Breadcrumbs,\n MPanel,\n YearDropdown\n }\n})\nexport default class EvaluatorManagement extends mixins() {\n private year: IYearModel | null = null\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref, Watch } from 'vue-property-decorator'\n\nimport WithRender from './AdminEvaluatorCategoryAssignmentForm.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MForm,\n MMultiSelect,\n RequiredValidator\n} from '@ulaval/modul-components'\n\nimport UserForm, { IUserFormPayloadData } from '@/modules/user-management/user-form/UserForm'\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport { ICategoryModel } from '@/modules/category-management/Category.model'\nimport EvaluatorCategoryAssignmentService from '../EvaluatorCategoryAssignment.service'\nimport { IEvaluatorCategoryAssignmentAdminModel } from '../EvaluatorCategoryAsssignment.model'\n\nconst USER_FORM_REF: string = 'user-form'\n\nexport interface IAdminEvaluatorCategoryAssignmentFormFormPayloadData {\n evaluator_idul: string;\n categories: Array;\n}\n\n@WithRender\n@Component({\n components: {\n MForm,\n MMultiSelect,\n UserForm\n }\n})\nexport default class AdminEvaluatorCategoryAssignmentForm extends mixins(EvaluatorCategoryAssignmentService) {\n public formGroup: FormGroup = new FormGroup({\n 'category-multi-select': new FormControl>([RequiredValidator()])\n })\n private categories: Array = []\n private selectedCategories: Array = []\n private isCategoryLoadingStateActive: boolean = false\n\n private readonly USER_FORM_REF: string = USER_FORM_REF\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Prop({ required: false })\n private evaluatorIdul: string | undefined\n\n @Prop({ required: false })\n private evaluatorFullNameWithUsername: string | undefined\n\n @Prop({ required: false })\n private evaluatorCategoryAssignments: Array | undefined\n\n @Ref(USER_FORM_REF)\n private userFormComponent!: UserForm\n\n public get categoryMultiSelect(): AbstractControl> | null {\n if (!this.formGroup.containsControl('category-multi-select')) {\n return null\n }\n\n return this.formGroup.getControl('category-multi-select');\n }\n\n public get categoriesMappedById(): { [key: string]: ICategoryModel } {\n return this.categories.reduce((acc: { [key: string]: ICategoryModel }, category: ICategoryModel) => {\n return {\n ...acc,\n [category.id]: category\n }\n }, {}) || {}\n }\n\n @Watch('year', { immediate: true })\n private onYearChange(): void {\n this.loadCategories()\n }\n\n @Watch('evaluatorIdul', { immediate: true })\n private onEvaluatorIdulChange(): void {\n if (this.evaluatorIdul) {\n this.formGroup.setControl('category-multi-select', new FormControl>([]))\n } else {\n this.formGroup.setControl('category-multi-select', new FormControl>([RequiredValidator()]))\n }\n }\n\n private loadCategories(): void {\n this.isCategoryLoadingStateActive = true\n\n this.service_evaluatorCategoryAssignmentService_fetchAvailableCategories(this.year.id)\n .then((response: Array) => {\n this.categories = response || []\n\n if (this.evaluatorCategoryAssignments) {\n this.evaluatorCategoryAssignments.forEach((evaluatorCategoryAssignment: IEvaluatorCategoryAssignmentAdminModel) => {\n if (!this.categoriesMappedById[evaluatorCategoryAssignment.category_id]) {\n this.$set(\n this.categories, \n this.categories.length, \n {\n id: evaluatorCategoryAssignment.category_id,\n title: evaluatorCategoryAssignment.category_title\n }\n )\n }\n })\n }\n }).catch(() => {\n this.categories = []\n }).finally(() => {\n this.isCategoryLoadingStateActive = false\n this.preselectCategories()\n })\n }\n\n public async getFormPayload(): Promise {\n if (!this.categoryMultiSelect) {\n return null\n }\n\n this.categoryMultiSelect.value = this.selectedCategories\n\n await this.formGroup.submit()\n const evaluatorIdul: string | null = await this.getCandidateIdul()\n\n if (this.formGroup.hasErrorDeep() || !evaluatorIdul) {\n return null\n }\n\n return {\n evaluator_idul: evaluatorIdul,\n categories: this.categoryMultiSelect.value\n }\n }\n\n private async getCandidateIdul(): Promise {\n if (this.evaluatorIdul) {\n return this.evaluatorIdul\n } else if (this.userFormComponent) {\n const userFormPayload: IUserFormPayloadData | null = await this.userFormComponent.getFormPayload()\n\n if (userFormPayload && userFormPayload.idul) {\n return userFormPayload.idul\n }\n } \n\n return null\n }\n\n private preselectCategories(): void {\n if (this.evaluatorCategoryAssignments) {\n this.evaluatorCategoryAssignments.forEach((evaluatorCategoryAssignment: IEvaluatorCategoryAssignmentAdminModel) => {\n if (this.categoriesMappedById[evaluatorCategoryAssignment.category_id]) {\n this.$set(this.selectedCategories, this.selectedCategories.length, this.categoriesMappedById[evaluatorCategoryAssignment.category_id])\n }\n })\n }\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref } from 'vue-property-decorator'\n\nimport WithRender from './AdminEvaluatorCategoryAssignmentCreationOverlay.html'\n\nimport { \n MButton,\n MButtonSkin,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay\n} from '@ulaval/modul-components'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport ROUTES from '@/router/ROUTES'\nimport AdminEvaluatorCategoryAssignmentForm, { IAdminEvaluatorCategoryAssignmentFormFormPayloadData } from '../evaluator-category-assignment-form/AdminEvaluatorCategoryAssignmentForm'\nimport EvaluatorCategoryAssignmentService, { ICreateEvaluatorCategoryAssignmentForm } from '../EvaluatorCategoryAssignment.service'\nimport { ICategoryModel } from '@/modules/category-management/Category.model'\n\nconst FORM_REF: string = 'admin-evaluator-category-assignment-creation-form'\n\n@WithRender\n@Component({\n components: {\n AdminEvaluatorCategoryAssignmentForm,\n MButton,\n MMessage,\n MOverlay\n }\n})\nexport default class AdminEvaluatorCategoryAssignmentCreationOverlay extends mixins(EvaluatorCategoryAssignmentService) {\n private isOverlayOpen: boolean = true\n private isLoadingStateActive: boolean = false\n private showCreationSuccessMessage: boolean = false\n private showCreationErrorMessage: boolean = false\n\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MButtonSkin: object = MButtonSkin\n private readonly FORM_REF: string = FORM_REF\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Ref(FORM_REF)\n private formComponent!: AdminEvaluatorCategoryAssignmentForm\n\n private afterOverlayClose(): void {\n this.mixin_router_navigate({\n name: ROUTES.EVALUATOR_MANAGEMENT_LIST\n })\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n\n private async onSaveButtonClick(): Promise {\n if (this.formComponent) {\n const formPayload: IAdminEvaluatorCategoryAssignmentFormFormPayloadData | null = await this.formComponent.getFormPayload()\n\n if (formPayload) {\n this.createEvaluatorCategoryAssignments(formPayload)\n }\n }\n }\n\n private createEvaluatorCategoryAssignments(formPayload: IAdminEvaluatorCategoryAssignmentFormFormPayloadData): void {\n this.isLoadingStateActive = true\n\n const requestPayload: ICreateEvaluatorCategoryAssignmentForm = {\n evaluator_idul: formPayload.evaluator_idul,\n categories_id: formPayload.categories.map((category: ICategoryModel) => category.id)\n }\n\n this.service_evaluatorCategoryAssignmentService_createEvaluatorCategoryAssignment(requestPayload)\n .then(() => {\n this.showCreationSuccessMessage = true\n this.showCreationErrorMessage = false\n }).catch(() => {\n this.showCreationSuccessMessage = false\n this.showCreationErrorMessage = true\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref, Watch } from 'vue-property-decorator'\n\nimport WithRender from './AdminEvaluatorCategoryAssignmentUpdateOverlay.html'\n\nimport { \n MButton,\n MButtonSkin,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay\n} from '@ulaval/modul-components'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport ROUTES from '@/router/ROUTES'\nimport AdminEvaluatorCategoryAssignmentForm, { IAdminEvaluatorCategoryAssignmentFormFormPayloadData } from '../evaluator-category-assignment-form/AdminEvaluatorCategoryAssignmentForm'\nimport EvaluatorCategoryAssignmentService, { IUpdateEvaluatorCategoryAssignmentForm } from '../EvaluatorCategoryAssignment.service'\nimport { ICategoryModel } from '@/modules/category-management/Category.model'\nimport { IEvaluatorCategoryAssignmentAdminModel } from '../EvaluatorCategoryAsssignment.model'\n\nconst FORM_REF: string = 'admin-evaluator-category-assignment-update-form'\n\n@WithRender\n@Component({\n components: {\n AdminEvaluatorCategoryAssignmentForm,\n MButton,\n MMessage,\n MOverlay\n }\n})\nexport default class AdminEvaluatorCategoryAssignmentUpdateOverlay extends mixins(EvaluatorCategoryAssignmentService) {\n private isOverlayOpen: boolean = true\n private isLoadingStateActive: boolean = false\n private showUpdateSuccessMessage: boolean = false\n private showUpdateErrorMessage: boolean = false\n private evaluatorCategoryAssignments: Array = []\n\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MButtonSkin: object = MButtonSkin\n private readonly FORM_REF: string = FORM_REF\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Ref(FORM_REF)\n private formComponent!: AdminEvaluatorCategoryAssignmentForm\n\n private get evaluatorIdul(): string | undefined {\n if (this.evaluatorCategoryAssignments.length === 0) {\n return undefined\n }\n\n return this.evaluatorCategoryAssignments[0].evaluator_username\n }\n\n private get evaluatorFullNameWithUsername(): string | undefined {\n if (this.evaluatorCategoryAssignments.length === 0) {\n return undefined\n }\n\n return this.evaluatorCategoryAssignments[0].evaluator_full_name_with_username\n }\n\n @Watch('year', { immediate: true })\n @Watch('$route.params.idEvaluator')\n private onParametersChange(): void {\n this.loadEvaluatorCategoryAssignments(this.year.id, this.$route.params.idEvaluator)\n }\n\n private afterOverlayClose(): void {\n this.mixin_router_navigate({\n name: ROUTES.EVALUATOR_MANAGEMENT_LIST\n })\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n\n private loadEvaluatorCategoryAssignments(yearId: string, evaluatorId: string): void {\n this.isLoadingStateActive = true\n\n this.service_evaluatorCategoryAssignmentService_adminFetchEvaluatorCategoryAssignments({\n year_id: yearId,\n evaluator_id: evaluatorId\n }).then((response: Array) => {\n this.evaluatorCategoryAssignments = response || []\n }).catch(() => {\n this.evaluatorCategoryAssignments = []\n this.showUpdateErrorMessage = true\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private async onSaveButtonClick(): Promise {\n if (this.formComponent) {\n const formPayload: IAdminEvaluatorCategoryAssignmentFormFormPayloadData | null = await this.formComponent.getFormPayload()\n\n if (formPayload) {\n this.updateEvaluatorCategoryAssignments(formPayload)\n }\n }\n }\n\n private updateEvaluatorCategoryAssignments(formPayload: IAdminEvaluatorCategoryAssignmentFormFormPayloadData): void {\n this.isLoadingStateActive = true\n\n const requestPayload: IUpdateEvaluatorCategoryAssignmentForm = {\n evaluator_idul: formPayload.evaluator_idul,\n categories_id: formPayload.categories.map((category: ICategoryModel) => category.id),\n year_id: this.year.id\n }\n\n this.service_evaluatorCategoryAssignmentService_updateEvaluatorCategoryAssignment(requestPayload)\n .then(() => {\n this.showUpdateSuccessMessage = true\n this.showUpdateErrorMessage = false\n }).catch(() => {\n this.showUpdateSuccessMessage = false\n this.showUpdateErrorMessage = true\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport WithRender from './EvaluatorToolboxFileDepositOverlay.html'\n\nimport { \n MButton,\n MButtonSkin,\n MForm,\n MIcon,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay,\n MProgress,\n MValidationMessage,\n FormGroup\n} from '@ulaval/modul-components'\n\nimport UploadedFileRow from '@/modules/global/file/UploadedFileRow'\n\nimport ROUTES from '@/router/ROUTES'\nimport { IEvaluatorToolboxFileModel } from '../EvaluatorToolboxFile.model'\nimport { IFileUploadModel } from '@/modules/global/file/File.model'\nimport { MFile } from '@ulaval/modul-components/dist/utils/file/file'\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport EvaluatorToolboxFileService from '../EvaluatorToolboxFile.service'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MForm,\n MIcon,\n MMessage,\n MOverlay,\n MProgress,\n MValidationMessage,\n UploadedFileRow\n }\n})\nexport default class EvaluatorToolboxFileDepositOverlay extends mixins(EvaluatorToolboxFileService) {\n public formGroup: FormGroup = new FormGroup({\n \n })\n protected errorMessage: string | null = null\n private isOverlayOpen: boolean = true\n private isLoadingStateActive: boolean = false\n private isFilesFetchLoadingStateActive: boolean = false\n private showSubmitSuccessMessage: boolean = false\n private showSubmitErrorMessage: boolean = false\n private evaluatorToolboxFiles: Array> = []\n\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly allowedExtensions: Array = ['pdf']\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Watch('year', { immediate: true })\n private onYearChange(): void {\n if (this.year) {\n this.loadFiles()\n }\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n\n private afterOverlayClose(): void {\n this.mixin_router_navigate({\n name: ROUTES.EVALUATOR_MANAGEMENT_LIST\n })\n }\n\n private async onSubmitButtonClick(): Promise {\n this.depositFiles()\n }\n\n private depositFiles(): void {\n this.isLoadingStateActive = true\n\n this.service_evaluatorToolboxFileService_deposit(\n {\n year_id: this.year.id\n },\n this.evaluatorToolboxFiles\n ).then(() => {\n this.showSubmitSuccessMessage = true\n this.showSubmitErrorMessage = false\n }).catch(() => {\n this.showSubmitSuccessMessage = false\n this.showSubmitErrorMessage = true\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private loadFiles(): void {\n this.isFilesFetchLoadingStateActive = true\n\n this.service_evaluatorToolboxFileService_fetchList({ year_id: this.year.id })\n .then((responseData: Array) => {\n responseData.forEach((evaluatorToolboxFile: IEvaluatorToolboxFileModel) => {\n this.$set(this.evaluatorToolboxFiles, this.evaluatorToolboxFiles.length, { server_file: evaluatorToolboxFile })\n })\n }).catch(() => {\n this.evaluatorToolboxFiles = []\n }).finally(() => {\n this.isFilesFetchLoadingStateActive = false\n })\n }\n \n private onFilesReady(files: Array): void {\n this.$file.uploadTemp(files)\n }\n\n private onFilesUploadCompleted(files: Array): void {\n files.forEach((file: MFile) => {\n this.$set(this.evaluatorToolboxFiles, this.evaluatorToolboxFiles.length, { file })\n })\n }\n\n private removeAttachment(index: number): void {\n this.$delete(this.evaluatorToolboxFiles, index)\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Ref, Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './EvaluatorApplicationFormAssignment.html'\n\nimport { \n MButton,\n MButtonSkin,\n MMessage,\n MMessageState,\n MPanel,\n MSpinner,\n} from '@ulaval/modul-components'\n\nimport Breadcrumbs from '@/modules/global/breadcrumbs/Breadcrumbs'\nimport FormElements from '@/modules/form-management/form-element/FormElements'\n\nimport { IFormAnswerModel } from '@/modules/form-management/Form.model'\nimport { IInternalFormTemplateModel } from '@/modules/form-template-management/FormTemplate.model'\nimport EvaluatorApplicationFormAssignmentService, { IFetchEvaluatorApplicationFormAssignmentApplicationFormResponse } from '../EvaluatorApplicationFormAssignment.service'\nimport { IEvaluatorApplicationFormAssignmentModel } from '../EvaluatorApplicationFormAssignment.model'\nimport { IEvaluationCardModel } from '@/modules/category-management/evaluation-card-management/EvaluationCard.model'\nimport ROUTES from '@/router/ROUTES'\nimport ApplicationFormMixin from '@/modules/application-form-management/ApplicationForm.mixin'\n\nconst REF_EVALUATION_CARD_DOWNLOAD_LINK: string = 'ref-evaluation-card-download-link'\n\n@WithRender\n@Component({\n components: {\n Breadcrumbs,\n FormElements,\n MButton,\n MMessage,\n MPanel,\n MSpinner\n }\n})\nexport default class EvaluatorApplicationFormAssignment extends mixins(EvaluatorApplicationFormAssignmentService, ApplicationFormMixin) {\n private evaluatorApplicationFormAssignment: IEvaluatorApplicationFormAssignmentModel | null = null\n private formAnswers: Array = []\n private internalFormTemplate: IInternalFormTemplateModel | null = null\n private isLoadingStateActive: boolean = true\n private isDownloadAllFormAnswerFilesLoadingStateActive: boolean = false\n\n private readonly REF_EVALUATION_CARD_DOWNLOAD_LINK: string = REF_EVALUATION_CARD_DOWNLOAD_LINK\n private readonly MMessageState: object = MMessageState\n private readonly MButtonSkin: object = MButtonSkin\n\n @Ref(REF_EVALUATION_CARD_DOWNLOAD_LINK)\n protected downloadLinkHtmlElement!: HTMLElement\n\n private get evaluationCard(): IEvaluationCardModel | null {\n if (\n !this.internalFormTemplate ||\n !this.internalFormTemplate.category.evaluation_card\n ) {\n return null\n }\n\n return this.internalFormTemplate.category.evaluation_card\n }\n\n private get mockForm(): any {\n return {\n form_answers: this.formAnswers\n }\n }\n\n @Watch('$route.params.idEvaluatorApplicationFormAssignment', { immediate: true })\n private onRouteParamsIdChange(value: string | null) {\n if (value) {\n this.loadEvaluatorApplicationFormAssignmentApplicationForm(value)\n }\n }\n\n private loadEvaluatorApplicationFormAssignmentApplicationForm(id: string): void {\n this.isLoadingStateActive = true\n\n this.service_evaluatorApplicationFormAssignmentService_fetchApplicationForm(id)\n .then((response: IFetchEvaluatorApplicationFormAssignmentApplicationFormResponse) => {\n this.evaluatorApplicationFormAssignment = response.evaluator_application_form_assignment || null\n this.formAnswers = response.form_answers || []\n this.internalFormTemplate = response.internal_form_template || null\n }).catch((error: AxiosError) => {\n this.isLoadingStateActive = false\n this.mixin_router_redirectRequestError(error)\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private downloadEvaluationCard(): void {\n if (this.evaluationCard && this.evaluationCard.download_endpoint) {\n this.$axios.get(this.evaluationCard.download_endpoint, {\n responseType: 'arraybuffer',\n headers: {\n Accept: 'application/octet-stream'\n }\n }).then((res: any) => {\n if (this.evaluationCard && this.evaluationCard.download_endpoint) {\n if (this.downloadLinkHtmlElement) {\n this.downloadLinkHtmlElement.setAttribute('href', URL.createObjectURL(new Blob([res.data], { type: this.evaluationCard.file_format })))\n this.downloadLinkHtmlElement.setAttribute('download', this.evaluationCard.file_name)\n this.downloadLinkHtmlElement.click()\n \n this.downloadLinkHtmlElement.removeAttribute('link')\n this.downloadLinkHtmlElement.removeAttribute('download')\n }\n }\n })\n }\n }\n\n private navigateToApplicationFormSupports(): void {\n this.mixin_router_navigate({\n name: ROUTES.EVALUATOR_APPLICATION_FORM_SUPPORT_DISPLAY,\n params: this.$route.params\n })\n }\n\n private async downloadAllFormAnswerFiles(): Promise {\n this.isDownloadAllFormAnswerFilesLoadingStateActive = true\n\n await this.mixin_applicationForm_downloadAllFormAnswerFiles(this.mockForm || undefined)\n\n this.isDownloadAllFormAnswerFilesLoadingStateActive = false\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Ref, Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './EvaluatorApplicationFormSupportAssignment.html'\n\nimport { \n MButton,\n MButtonSkin,\n MMessage,\n MMessageState,\n MPanel,\n MSpinner,\n} from '@ulaval/modul-components'\n\nimport Breadcrumbs from '@/modules/global/breadcrumbs/Breadcrumbs'\nimport FormElements from '@/modules/form-management/form-element/FormElements'\n\nimport { IFormAnswerModel } from '@/modules/form-management/Form.model'\nimport { IInternalFormTemplateModel } from '@/modules/form-template-management/FormTemplate.model'\nimport EvaluatorApplicationFormAssignmentService, { IFetchEvaluatorApplicationFormSupportsAssignmentApplicationFormResponse } from '../EvaluatorApplicationFormAssignment.service'\nimport { IEvaluatorApplicationFormAssignmentModel } from '../EvaluatorApplicationFormAssignment.model'\nimport { IEvaluationCardModel } from '@/modules/category-management/evaluation-card-management/EvaluationCard.model'\nimport ROUTES from '@/router/ROUTES'\n\nconst REF_EVALUATION_CARD_DOWNLOAD_LINK: string = 'ref-evaluation-card-download-link'\n\n@WithRender\n@Component({\n components: {\n Breadcrumbs,\n FormElements,\n MButton,\n MMessage,\n MPanel,\n MSpinner\n }\n})\nexport default class EvaluatorApplicationFormSupportAssignment extends mixins(EvaluatorApplicationFormAssignmentService) {\n private evaluatorApplicationFormAssignment: IEvaluatorApplicationFormAssignmentModel | null = null\n private formAnswers: Array = []\n private internalFormTemplate: IInternalFormTemplateModel | null = null\n private isLoadingStateActive: boolean = true\n\n private readonly REF_EVALUATION_CARD_DOWNLOAD_LINK: string = REF_EVALUATION_CARD_DOWNLOAD_LINK\n private readonly MMessageState: object = MMessageState\n private readonly MButtonSkin: object = MButtonSkin\n\n @Ref(REF_EVALUATION_CARD_DOWNLOAD_LINK)\n protected downloadLinkHtmlElement!: HTMLElement\n\n private get evaluationCard(): IEvaluationCardModel | null {\n if (\n !this.internalFormTemplate ||\n !this.internalFormTemplate.category.evaluation_card\n ) {\n return null\n }\n\n return this.internalFormTemplate.category.evaluation_card\n }\n\n @Watch('$route.params.idEvaluatorApplicationFormAssignment', { immediate: true })\n private onRouteParamsIdChange(value: string | null) {\n if (value) {\n this.loadEvaluatorApplicationFormAssignmentApplicationForm(value)\n }\n }\n\n private loadEvaluatorApplicationFormAssignmentApplicationForm(id: string): void {\n this.isLoadingStateActive = true\n\n this.service_evaluatorApplicationFormAssignmentService_fetchApplicationFormSupports(id)\n .then((response: IFetchEvaluatorApplicationFormSupportsAssignmentApplicationFormResponse) => {\n this.evaluatorApplicationFormAssignment = response.evaluator_application_form_assignment || null\n this.formAnswers = response.form_answers || []\n this.internalFormTemplate = response.internal_form_template || null\n }).catch((error: AxiosError) => {\n this.isLoadingStateActive = false\n this.mixin_router_redirectRequestError(error)\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private downloadEvaluationCard(): void {\n if (this.evaluationCard && this.evaluationCard.download_endpoint) {\n this.$axios.get(this.evaluationCard.download_endpoint, {\n responseType: 'arraybuffer',\n headers: {\n Accept: 'application/octet-stream'\n }\n }).then((res: any) => {\n if (this.evaluationCard && this.evaluationCard.download_endpoint) {\n if (this.downloadLinkHtmlElement) {\n this.downloadLinkHtmlElement.setAttribute('href', URL.createObjectURL(new Blob([res.data], { type: this.evaluationCard.file_format })))\n this.downloadLinkHtmlElement.setAttribute('download', this.evaluationCard.file_name)\n this.downloadLinkHtmlElement.click()\n \n this.downloadLinkHtmlElement.removeAttribute('link')\n this.downloadLinkHtmlElement.removeAttribute('download')\n }\n }\n })\n }\n }\n\n private navigateToApplicationForm(): void {\n this.mixin_router_navigate({\n name: ROUTES.EVALUATOR_APPLICATION_FORM_DISPLAY,\n params: this.$route.params\n })\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\nimport HttpStatusCode from 'http-status-codes'\n\nimport WithRender from './AdminYearConfiguration.html'\n\nimport { \n MButton,\n MButtonSkin,\n MIcon,\n MSpinner,\n MMessage,\n MMessageState\n} from '@ulaval/modul-components'\n\nimport YearConfigurationLayout from './YearConfigurationLayout'\n\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport { IYearConfigurationModel } from '../YearConfiguration.model'\nimport YearConfigurationService from '../YearConfiguration.service'\nimport CONSTANTS from '@/CONSTANTS'\nimport ROUTES from '@/router/ROUTES'\nimport { EventBus, EVENT_BUS_EVENTS } from '@/modules/global/utilities/Events'\nimport { generateLocalizedRouteName } from '@/router/helpers'\nimport localization from '@/localization'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MIcon,\n MMessage,\n MSpinner,\n YearConfigurationLayout\n }\n})\nexport default class AdminYearConfiguration extends mixins(YearConfigurationService) {\n private yearConfiguration: IYearConfigurationModel | null = null\n private isLoadingStateActive: boolean = false\n private hasLoadingError: boolean = false\n\n private readonly MMessageState: object = MMessageState\n private readonly MButtonSkin: object = MButtonSkin\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Watch('year', { immediate: true })\n private onYearChange(): void {\n this.loadYearConfiguration()\n }\n\n private created(): void {\n if (\n this.$route.name === generateLocalizedRouteName({\n name: ROUTES.YEAR_CONFIGURATION_MANAGEMENT_UPDATE,\n locale: localization.CURRENT_LOCALE\n })\n ) {\n this.mixin_router_navigate({\n name: ROUTES.YEAR_CONFIGURATION_MANAGEMENT_LIST\n })\n }\n }\n\n private mounted(): void {\n this.afterYearConfigurationUpdate()\n }\n\n private afterYearConfigurationUpdate(): void {\n EventBus.$on(EVENT_BUS_EVENTS.YEAR_CONFIGURATION_UPDATED, (yearConfiguration: IYearConfigurationModel) => {\n if (yearConfiguration) {\n this.yearConfiguration = yearConfiguration\n }\n })\n }\n\n private loadYearConfiguration(): void {\n const loadingStateActivationTimeout: any = setTimeout(() => {\n this.isLoadingStateActive = true\n }, CONSTANTS.DEFAULT_LOADING_STATE_TIMEOUT_VALUE)\n this.hasLoadingError = false\n\n this.service_yearConfigurationService_adminFetchYearConfiguration(this.year.id)\n .then((response: IYearConfigurationModel) => {\n this.yearConfiguration = response || null\n }).catch((error: AxiosError) => {\n if (error.response && error.response.status === HttpStatusCode.NOT_FOUND) {\n this.yearConfiguration = null\n this.hasLoadingError = true\n } else {\n this.mixin_router_redirectRequestError(error)\n }\n }).finally(() => {\n clearTimeout(loadingStateActivationTimeout)\n this.isLoadingStateActive = false\n })\n }\n\n private onTriggerUpdateButtonClick(): void {\n if (this.yearConfiguration) {\n this.mixin_router_navigate({\n name: ROUTES.YEAR_CONFIGURATION_MANAGEMENT_UPDATE,\n params: {\n idYearConfiguration: this.yearConfiguration.id\n }\n })\n }\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport WithRender from './YearConfigurationManagement.html'\n\nimport { \n MPanel\n} from '@ulaval/modul-components'\n\nimport AdminYearConfiguration from './year-configuration/AdminYearConfiguration'\n\nimport YearDropdown from '../global/year/YearDropdown'\nimport Breadcrumbs from '../global/breadcrumbs/Breadcrumbs'\n\nimport { IYearModel } from '../global/year/Year.model'\n\n@WithRender\n@Component({\n components: {\n Breadcrumbs,\n MPanel,\n AdminYearConfiguration,\n YearDropdown\n }\n})\nexport default class YearConfigurationManagement extends mixins() {\n private year: IYearModel | null = null\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Watch } from 'vue-property-decorator'\n\nimport WithRender from './CategorySectionFormRow.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MForm,\n MIconButton,\n MMultiSelect,\n MTextfield,\n RequiredValidator\n} from '@ulaval/modul-components'\nimport { ICategoryModel } from '@/modules/category-management/Category.model'\n\nexport interface ICategorySectionFormRowPayloadData {\n id?: string;\n title: string;\n categories_id: Array;\n}\n\nexport enum CategorySectionFormRow_EVENTS {\n CLICK_DELETE = 'click:delete'\n}\n\n@WithRender\n@Component({\n components: {\n MForm,\n MIconButton,\n MMultiSelect,\n MTextfield\n }\n})\nexport default class CategorySectionFormRow extends mixins() {\n public formGroup: FormGroup = new FormGroup({\n 'title': new FormControl([RequiredValidator()]),\n 'category-multi-select': new FormControl>([RequiredValidator()])\n })\n private selectedCategories: Array = []\n private formErrors: { [key: string]: string | boolean } = {}\n\n @Prop({ required: true })\n private categorySection!: ICategorySectionFormRowPayloadData\n\n @Prop({ required: true })\n private categories!: Array\n\n @Prop({ default: {} })\n private requestErrors!: { [key: string]: string | boolean }\n\n private get errors(): { [key: string]: string | boolean } {\n return {\n ...this.formErrors,\n ...this.requestErrors\n }\n }\n\n public get titleField(): AbstractControl {\n return this.formGroup.getControl('title');\n }\n \n public get categoryMultiSelect(): AbstractControl> {\n return this.formGroup.getControl('category-multi-select');\n }\n\n public get categoriesMappedById(): { [key: string]: ICategoryModel } {\n return this.categories.reduce((acc: { [key: string]: ICategoryModel }, category: ICategoryModel) => {\n return {\n ...acc,\n [category.id]: category\n }\n }, {}) || {}\n }\n\n @Watch('categorySection')\n private onCategorySectionChange(): void {\n this.populateFormFromModel()\n }\n\n @Watch('categoriesMappedById')\n private onCategoriesMappedByIdChange(): void {\n this.populateFormFromModel()\n }\n\n private mounted(): void {\n this.populateFormFromModel()\n }\n\n private populateFormFromModel(): void {\n if (this.categorySection) {\n this.selectedCategories = []\n this.titleField.value = this.categorySection.title\n\n this.categorySection.categories_id.forEach((categoryId: string) => {\n if (this.categoriesMappedById[categoryId]) {\n this.$set(this.selectedCategories, this.selectedCategories.length, this.categoriesMappedById[categoryId])\n }\n })\n }\n }\n\n public async getFormPayload(): Promise {\n this.categoryMultiSelect.value = this.selectedCategories\n\n await this.formGroup.submit()\n\n if (this.formGroup.hasErrorDeep()) {\n return null\n }\n\n const formPayloadData: ICategorySectionFormRowPayloadData = {\n id: this.categorySection.id,\n title: this.titleField.value,\n categories_id: this.categoryMultiSelect.value.map((category: ICategoryModel) => category.id)\n }\n\n return formPayloadData\n }\n\n private onDeleteIconClick(): void {\n this.$emit(CategorySectionFormRow_EVENTS.CLICK_DELETE)\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref } from 'vue-property-decorator'\n\nimport WithRender from './CategorySectionForm.html'\n\nimport { \n MAdd,\n MForm\n} from '@ulaval/modul-components'\n\nimport CategorySectionFormRow from './CategorySectionFormRow'\n\nimport { IYearConfigurationModel } from '@/modules/year-configuration-management/YearConfiguration.model'\nimport { ICategorySectionFormRowPayloadData } from './CategorySectionFormRow'\nimport { ICategorySectionModel } from '../CategorySection.model'\nimport { ICategoryModel } from '@/modules/category-management/Category.model'\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport YearConfigurationService from '@/modules/year-configuration-management/YearConfiguration.service'\n\nexport interface ICategorySectionsFormPayloadData {\n category_sections: Array;\n}\n\nconst REF_CATEGORY_SECTION_FORM_ROW: string = 'category-section-form-row'\n\n@WithRender\n@Component({\n components: {\n CategorySectionFormRow,\n MAdd,\n MForm\n }\n})\nexport default class CategorySectionForm extends mixins(YearConfigurationService) {\n private categorySections: Array = []\n private availableCategories: Array = []\n private formErrors: { [key: string]: string | boolean } = {}\n\n private readonly REF_CATEGORY_SECTION_FORM_ROW: string = REF_CATEGORY_SECTION_FORM_ROW\n\n @Prop({ required: true })\n private yearConfiguration!: IYearConfigurationModel\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Prop({ default: {} })\n private requestErrors!: { [key: string]: string | boolean }\n\n @Ref(REF_CATEGORY_SECTION_FORM_ROW)\n private categorySectionFormRowComponents!: Array\n\n private get errors(): { [key: string]: string | boolean } {\n return {\n ...this.formErrors,\n ...this.requestErrors\n }\n }\n\n private created(): void {\n this.loadAvailableCategories()\n }\n\n private mounted(): void {\n this.populateFormFromModel()\n }\n\n private loadAvailableCategories(): void {\n this.service_yearConfigurationService_fetchAvailableCategories(this.year.id)\n .then((response: Array) => {\n this.availableCategories = response || []\n })\n }\n\n private populateFormFromModel(): void {\n if (this.yearConfiguration) {\n this.categorySections = this.yearConfiguration.category_sections.reduce(\n (acc: Array, categorySection: ICategorySectionModel) => {\n return [\n ...acc,\n {\n id: categorySection.id,\n title: categorySection.title,\n categories_id: categorySection.categories.map((category: ICategoryModel) => category.id)\n } as ICategorySectionFormRowPayloadData\n ]\n }, [])\n }\n }\n\n private onAddNewSectionButtonClick(): void {\n this.$set(this.categorySections, this.categorySections.length, {\n title: '',\n categories_id: []\n })\n }\n\n private onCategorySectionFormRowDeleteEvent(index: number): void {\n this.$delete(this.categorySections, index)\n }\n\n public async getFormPayload(): Promise {\n let hasErrors: boolean = false\n const assembledCategorySections: Array = []\n\n for (const categorySectionFormRowComponent of this.categorySectionFormRowComponents || []) {\n const categorySectionFormRowComponentFormPayload: ICategorySectionFormRowPayloadData | null = await categorySectionFormRowComponent.getFormPayload()\n\n if (categorySectionFormRowComponentFormPayload) {\n assembledCategorySections.push(categorySectionFormRowComponentFormPayload)\n } else {\n hasErrors = true\n }\n }\n\n if (hasErrors) {\n return null\n }\n\n const formPayloadData: ICategorySectionsFormPayloadData = {\n category_sections: assembledCategorySections\n }\n\n return formPayloadData\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref } from 'vue-property-decorator'\n\nimport WithRender from './YearConfigurationForm.html'\n\nimport { \n AbstractControl,\n FormControl,\n FormGroup,\n MCheckbox,\n MForm,\n MMessage,\n MMessageSkin,\n MMessageState,\n MTextfield,\n RequiredValidator\n} from '@ulaval/modul-components'\n\nimport RichTextEditor from '@/modules/global/components/rich-text-editor/RichTextEditor'\nimport { IYearConfigurationModel } from '../YearConfiguration.model'\nimport { ICategorySectionsFormPayloadData } from '@/modules/category-section-management/category-section-form/CategorySectionForm'\nimport CategorySectionForm from '@/modules/category-section-management/category-section-form/CategorySectionForm'\nimport { IYearModel } from '@/modules/global/year/Year.model'\n\nexport interface IYearConfigurationFormPayloadData {\n is_public_area_available: boolean;\n public_area_description_zone: string;\n public_area_help_zone: string;\n public_area_description_zone_title: string;\n public_area_help_zone_title: string;\n category_sections: ICategorySectionsFormPayloadData;\n}\n\nconst REF_PUBLIC_AREA_DESCRIPTION_ZONE: string = 'public-area-description-zone'\nconst REF_PUBLIC_AREA_HELP_ZONE: string = 'public-area-help-zone'\nconst REF_CATEGORY_SECTION_FORM: string = 'category-section-form'\n\n@WithRender\n@Component({\n components: {\n CategorySectionForm,\n MCheckbox,\n MForm,\n MMessage,\n MTextfield,\n RichTextEditor\n }\n})\nexport default class YearConfigurationForm extends mixins() {\n public formGroup: FormGroup = new FormGroup({\n is_public_area_available: new FormControl(),\n public_area_description_zone_title: new FormControl([RequiredValidator()]),\n public_area_help_zone_title: new FormControl([RequiredValidator()])\n })\n private publicAreaDescriptionZoneModel: string = ''\n private publicAreaHelpZoneModel: string = ''\n private formErrors: { [key: string]: string | boolean } = {}\n\n private readonly REF_PUBLIC_AREA_DESCRIPTION_ZONE: string = REF_PUBLIC_AREA_DESCRIPTION_ZONE\n private readonly REF_PUBLIC_AREA_HELP_ZONE: string = REF_PUBLIC_AREA_HELP_ZONE\n private readonly REF_CATEGORY_SECTION_FORM: string = REF_CATEGORY_SECTION_FORM\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n\n @Prop({ required: true })\n private yearConfiguration!: IYearConfigurationModel\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Prop({ default: {} })\n private requestErrors!: { [key: string]: string | boolean }\n\n @Ref(REF_PUBLIC_AREA_DESCRIPTION_ZONE)\n private publicAreaDescriptionZoneComponent!: RichTextEditor\n\n @Ref(REF_PUBLIC_AREA_HELP_ZONE)\n private publicAreaHelpZoneComponent!: RichTextEditor\n\n @Ref(REF_CATEGORY_SECTION_FORM)\n private categorySectionFormComponent!: CategorySectionForm\n\n private get errors(): { [key: string]: string | boolean } {\n return {\n ...this.formErrors,\n ...this.requestErrors\n }\n }\n\n public get isPublicAreaAvailableCheckbox(): AbstractControl {\n return this.formGroup.getControl('is_public_area_available');\n }\n\n public get publicAreaDescriptionZoneTitleField(): AbstractControl {\n return this.formGroup.getControl('public_area_description_zone_title')\n }\n\n public get publicAreaHelpZoneTitleField(): AbstractControl {\n return this.formGroup.getControl('public_area_help_zone_title')\n }\n\n private mounted(): void {\n this.populateFormFromModel()\n }\n\n private populateFormFromModel(): void {\n if (this.yearConfiguration) {\n this.isPublicAreaAvailableCheckbox.value = this.yearConfiguration.is_public_area_available\n this.publicAreaDescriptionZoneModel = this.yearConfiguration.public_area_description_zone_html\n this.publicAreaHelpZoneModel = this.yearConfiguration.public_area_help_zone_html\n this.publicAreaDescriptionZoneTitleField.value = this.yearConfiguration.public_area_description_zone_title\n this.publicAreaHelpZoneTitleField.value = this.yearConfiguration.public_area_help_zone_title\n }\n }\n\n public async getFormPayload(): Promise {\n let areRichTextEditorsValid: boolean = true\n const categorySectionFormPayload: ICategorySectionsFormPayloadData | null = await this.categorySectionFormComponent.getFormPayload()\n await this.formGroup.submit()\n\n if (this.publicAreaDescriptionZoneComponent && (!await this.publicAreaDescriptionZoneComponent.validate())) {\n areRichTextEditorsValid = false\n }\n if (this.publicAreaHelpZoneComponent && (!await this.publicAreaHelpZoneComponent.validate())) {\n areRichTextEditorsValid = false\n }\n\n if (this.formGroup.hasErrorDeep() || !areRichTextEditorsValid || !categorySectionFormPayload) {\n return null\n }\n\n const formPayloadData: IYearConfigurationFormPayloadData = {\n is_public_area_available: this.isPublicAreaAvailableCheckbox.value,\n public_area_description_zone: this.publicAreaDescriptionZoneModel,\n public_area_help_zone: this.publicAreaHelpZoneModel,\n category_sections: categorySectionFormPayload,\n public_area_description_zone_title: this.publicAreaDescriptionZoneTitleField.value,\n public_area_help_zone_title: this.publicAreaHelpZoneTitleField.value\n }\n\n return formPayloadData\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Prop, Ref } from 'vue-property-decorator'\n\nimport { AxiosError } from 'axios'\n\nimport WithRender from './YearConfigurationUpdateDialog.html'\n\nimport { \n MButton,\n MButtonSkin,\n MIcon,\n MMessage,\n MMessageSkin,\n MMessageState,\n MOverlay,\n MProgress\n} from '@ulaval/modul-components'\n\nimport ROUTES from '@/router/ROUTES'\nimport YearConfigurationService, { IYearConfigurationUpdateForm } from '../YearConfiguration.service'\nimport { IYearConfigurationModel } from '../YearConfiguration.model'\nimport { IYearModel } from '@/modules/global/year/Year.model'\nimport YearConfigurationForm, { IYearConfigurationFormPayloadData } from '../year-configuration-form/YearConfigurationForm'\nimport { ICategorySectionFormRowPayloadData } from '@/modules/category-section-management/category-section-form/CategorySectionFormRow'\n\nconst FORM_REF: string = 'year-configuration-form'\n\n@WithRender\n@Component({\n components: {\n MButton,\n MIcon,\n MMessage,\n MOverlay,\n MProgress,\n YearConfigurationForm\n }\n})\nexport default class YearConfigurationUpdateDialog extends mixins(YearConfigurationService) {\n private isLoadingStateActive: boolean = false\n private isOverlayOpen: boolean = true\n private showUpdateSuccessMessage: boolean = false\n private requestErrors: { [key: string]: string | boolean } = {}\n\n private readonly MMessageState: object = MMessageState\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MButtonSkin: object = MButtonSkin\n\n private readonly FORM_REF: string = FORM_REF\n\n @Prop({ required: true })\n private yearConfiguration!: IYearConfigurationModel\n\n @Prop({ required: true })\n private year!: IYearModel\n\n @Ref(FORM_REF)\n private yearConfigurationFormRef!: YearConfigurationForm\n\n private afterOverlayClose(): void {\n this.mixin_router_navigate({\n name: ROUTES.YEAR_CONFIGURATION_MANAGEMENT_LIST\n })\n }\n\n private async onSaveButtonClick(): Promise {\n if (this.yearConfigurationFormRef) {\n const formPayload: IYearConfigurationFormPayloadData | null = await this.yearConfigurationFormRef.getFormPayload()\n\n if (formPayload) {\n this.updateYearConfiguration(formPayload)\n }\n }\n }\n\n private updateYearConfiguration(formPayload: IYearConfigurationFormPayloadData): void {\n this.isLoadingStateActive = true\n\n const requestPayload: IYearConfigurationUpdateForm = {\n is_public_area_available: formPayload.is_public_area_available,\n public_area_description_zone: formPayload.public_area_description_zone,\n public_area_help_zone: formPayload.public_area_help_zone,\n public_area_description_zone_title: formPayload.public_area_description_zone_title,\n public_area_help_zone_title: formPayload.public_area_help_zone_title,\n category_sections: formPayload.category_sections.category_sections.reduce(\n (acc: IYearConfigurationUpdateForm['category_sections'], categorySection: ICategorySectionFormRowPayloadData) => {\n return [\n ...acc,\n {\n id: categorySection.id,\n title: categorySection.title,\n categories_id: categorySection.categories_id\n }\n ]\n }, []\n )\n }\n\n this.service_yearConfigurationService_update(this.yearConfiguration.id, requestPayload)\n .then(() => {\n this.showUpdateSuccessMessage = true\n }).catch((error: AxiosError) => {\n if (\n error.response &&\n error.response.data &&\n error.response.data.validation\n ) {\n this.requestErrors = error.response.data.validation\n } else {\n this.requestErrors = {}\n }\n }).finally(() => {\n this.isLoadingStateActive = false\n })\n }\n\n private closeOverlay(): void {\n this.isOverlayOpen = false\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Ref, Watch } from 'vue-property-decorator'\n\nimport WithRender from './PublicFormTemplatePreview.html'\n\nimport { \n MButton,\n MButtonSkin,\n MMessage,\n MMessageSkin,\n MMessageState,\n MPanel,\n MSpinner,\n MToast,\n MToastPosition,\n MToastState\n} from '@ulaval/modul-components'\n\nimport FormElements from '@/modules/form-management/form-element/FormElements'\n\nimport FormTemplateService, { IFetchPublicFormTemplateResponse } from '@/modules/form-template-management/FormTemplate.service'\nimport { IFormTemplateModel, IInternalFormTemplateModel } from '@/modules/form-template-management/FormTemplate.model'\nimport ROUTES from '@/router/ROUTES'\nimport { AxiosError } from 'axios'\n\nconst REF_CONTENT_PANEL: string = 'panel[main-content]'\n\n@WithRender\n@Component({\n components: {\n FormElements,\n MButton,\n MMessage,\n MPanel,\n MSpinner,\n MToast\n }\n})\nexport default class PublicFormTemplatePreview extends mixins(FormTemplateService) {\n private formTemplate: IFormTemplateModel | null = null\n private internalFormTemplate: IInternalFormTemplateModel | null = null\n private isLoadingOverlayActive: boolean = true\n private requestErrors: { [key: string]: boolean } = {}\n private isInformationToastActive: boolean = false\n\n private readonly MButtonSkin: object = MButtonSkin\n private readonly MMessageSkin: object = MMessageSkin\n private readonly MMessageState: object = MMessageState\n private readonly MToastPosition: object = MToastPosition\n private readonly MToastState: object = MToastState\n private readonly REF_CONTENT_PANEL: string = REF_CONTENT_PANEL\n\n @Ref(REF_CONTENT_PANEL)\n private mainPanelComponent!: MPanel\n\n @Watch('$route.params.idCategory', { immediate: true })\n private onIdCategoryChange(value: string): void {\n if (value) {\n this.loadFormTemplate(value)\n }\n }\n\n private get displayCreateApplicationFormButton(): boolean {\n if (!this.formTemplate || !this.formTemplate.category) {\n return false\n }\n\n return this.$moment(this.formTemplate.category.application_deposit_limit_timestamp).isAfter()\n }\n\n private mounted(): void {\n window.addEventListener('scroll', this.onScroll)\n }\n\n protected destroyed(): void {\n window.removeEventListener('scroll', this.onScroll)\n }\n\n private onScroll(): void {\n if (this.mainPanelComponent) {\n const messageDomRect: DOMRect = this.mainPanelComponent.$el.getBoundingClientRect()\n \n this.isInformationToastActive = messageDomRect.top < 0\n } else {\n this.isInformationToastActive = false\n }\n }\n\n private loadFormTemplate(categoryId: string): void {\n this.isLoadingOverlayActive = true\n this.requestErrors = {}\n\n this.service_formTemplateService_fetchPublic(categoryId)\n .then((response: IFetchPublicFormTemplateResponse) => {\n this.formTemplate = response.form_template || null\n this.internalFormTemplate = response.internal_form_template || null\n }).catch((error: AxiosError) => {\n if (error.response) {\n if (error.response.data && error.response.data.validation) {\n this.requestErrors = error.response.data.validation\n }\n }\n\n if (Object.keys(this.requestErrors).length === 0) {\n this.mixin_router_redirectRequestError(error)\n }\n }).finally(() => {\n this.isLoadingOverlayActive = false\n })\n }\n\n private onReturnHomeButtonClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.DEFAULT\n })\n }\n\n private onCreateApplicationFormButtonClick(): void {\n if (this.formTemplate && this.formTemplate.category) {\n this.mixin_router_navigate({\n name: ROUTES.APPLICATION_FORM_CREATION,\n query: {\n category: this.formTemplate.category.id\n }\n })\n }\n }\n}\n","import Vue from 'vue'\nimport VueRouter, { NavigationGuardNext, Route, RouteConfig } from 'vue-router'\n\nimport HttpStatusCode from 'http-status-codes'\n\nimport DefaultLayout from '@/layouts/default/DefaultLayout'\nimport ErrorPage from '@/modules/global/error/ErrorPage'\nimport LoginPage from '@/modules/authentication/login/LoginPage'\nimport DashboardPage from '@/modules/dashboard/DashboardPage'\nimport UserManagement from '@/modules/user-management/UserManagement'\nimport UserCreationDialog from '@/modules/user-management/user-creation/UserCreationDialog'\nimport UserUpdateDialog from '@/modules/user-management/user-update/UserUpdateDialog'\nimport CategoryManagement from '@/modules/category-management/CategoryManagement'\nimport CategoryCreationDialog from '@/modules/category-management/category-creation/CategoryCreationDialog'\nimport CategoryUpdateDialog from '@/modules/category-management/category-update/CategoryUpdateDialog'\nimport EmailTemplateManagement from '@/modules/email-template-management/EmailTemplateManagement'\nimport EmailTemplateUpdateDialog from '@/modules/email-template-management/email-template-update/EmailTemplateUpdateDialog'\nimport FormTemplateManagement from '@/modules/form-template-management/FormTemplateManagement'\nimport FormTemplateUpdate from '@/modules/form-template-management/form-template-update/FormTemplateUpdate'\nimport FormTemplatePreview from '@/modules/form-template-management/form-template-preview/FormTemplatePreview'\nimport ApplicationForm from '@/modules/application-form-management/application-form/ApplicationForm'\nimport ApplicationFormCreationDialog from '@/modules/application-form-management/application-form-creation/ApplicationFormCreationDialog'\nimport AdminApplicationFormManagement from '@/modules/application-form-management/AdminApplicationFormManagement'\nimport AdminApplicationForm from '@/modules/application-form-management/application-form/AdminApplicationForm'\nimport ApplicationFormSupport from '@/modules/application-form-support-management/application-form-support/ApplicationFormSupport'\nimport AdminApplicationFormSupport from '@/modules/application-form-support-management/application-form-support/AdminApplicationFormSupport'\nimport AdminApplicationFormSupportManagement from '@/modules/application-form-support-management/AdminApplicationFormSupportManagement'\nimport AdminApplicationFormValidationManagement from '@/modules/application-form-validation-management/AdminApplicationFormValidationManagement'\nimport AdminApplicationFormValidation from '@/modules/application-form-validation-management/application-form-validation/AdminApplicationFormValidation'\nimport EvaluationCardDepositOverlay from '@/modules/category-management/evaluation-card-management/evaluation-card-deposit/EvaluationCardDepositOverlay'\nimport EvaluatorManagement from '@/modules/evaluator-management/EvaluatorManagement'\nimport AdminEvaluatorCategoryAssignmentCreationOverlay from '@/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment-creation/AdminEvaluatorCategoryAssignmentCreationOverlay'\nimport AdminEvaluatorCategoryAssignmentUpdateOverlay from '@/modules/evaluator-management/evaluator-category-assignment-management/evaluator-category-assignment-update/AdminEvaluatorCategoryAssignmentUpdateOverlay'\nimport EvaluatorToolboxFileDepositOverlay from '@/modules/evaluator-toolbox-file-management/evaluator-toolbox-file-deposit/EvaluatorToolboxFileDepositOverlay'\nimport EvaluatorApplicationFormAssignment from '@/modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormAssignment'\nimport EvaluatorApplicationFormSupportAssignment from '@/modules/evaluator-management/evaluator-application-form-assignment-management/evaluator-application-form-assignment/EvaluatorApplicationFormSupportAssignment'\nimport YearConfigurationManagement from '@/modules/year-configuration-management/YearConfigurationManagement'\nimport YearConfigurationUpdateDialog from '@/modules/year-configuration-management/year-configuration-update/YearConfigurationUpdateDialog'\nimport PublicFormTemplatePreview from '@/modules/public-area/form-template-preview/PublicFormTemplatePreview'\n\nimport ROUTES from './ROUTES'\nimport Localization from '@/localization'\nimport RouterLocalizationHelper, { \n generateLocalizedRouteName, \n extractLocalizedRouteParameters, \n ILocalizedRouteParameters, \n META_KEY_HIDDEN_BREADCRUMB,\n META_KEY_ADDITIONAL_BREADCRUMBS,\n META_KEY_DISPLAY_PUBLIC_NAVIGATION_BAR\n} from '@/router/helpers'\n\nVue.use(VueRouter)\n\nconst routes: Array = [\n {\n path: '',\n name: ROUTES.DEFAULT,\n component: DefaultLayout,\n meta: {\n [META_KEY_DISPLAY_PUBLIC_NAVIGATION_BAR]: true\n },\n children: [\n {\n path: '',\n name: ROUTES.LOGIN,\n component: LoginPage\n },\n {\n path: '',\n name: ROUTES.ERROR,\n component: ErrorPage\n },\n {\n path: '',\n name: ROUTES.DASHBOARD,\n component: DashboardPage,\n children: [\n {\n path: '',\n name: ROUTES.APPLICATION_FORM_CREATION,\n component: ApplicationFormCreationDialog\n }\n ]\n },\n {\n path: '',\n name: ROUTES.USER_MANAGEMENT_USER_LIST,\n component: UserManagement,\n children: [\n {\n path: '',\n name: ROUTES.USER_MANAGEMENT_USER_CREATION,\n component: UserCreationDialog\n },\n {\n path: '',\n name: ROUTES.USER_MANAGEMENT_USER_UPDATE,\n component: UserUpdateDialog\n }\n ]\n },\n {\n path: '',\n name: ROUTES.CATEGORY_MANAGEMENT_CATEGORY_LIST,\n component: CategoryManagement,\n children: [\n {\n path: '',\n name: ROUTES.CATEGORY_MANAGEMENT_CATEGORY_CREATION,\n component: CategoryCreationDialog\n },\n {\n path: '',\n name: ROUTES.CATEGORY_MANAGEMENT_CATEGORY_UPDATE,\n component: CategoryUpdateDialog\n },\n {\n path: '',\n name: ROUTES.CATEGORY_MANAGEMENT_CATEGORY_EVALUATION_CARD_DEPOSIT,\n component: EvaluationCardDepositOverlay\n },\n ]\n },\n {\n path: '',\n name: ROUTES.EMAIL_TEMPLATE_MANAGEMENT_EMAIL_TEMPLATE_LIST,\n component: EmailTemplateManagement,\n children: [\n {\n path: '',\n name: ROUTES.EMAIL_TEMPLATE_MANAGEMENT_EMAIL_TEMPLATE_UPDATE,\n component: EmailTemplateUpdateDialog\n }\n ]\n },\n {\n path: '',\n name: ROUTES.FORM_TEMPLATE_MANAGEMENT,\n component: FormTemplateManagement,\n meta: {\n [META_KEY_HIDDEN_BREADCRUMB]: true,\n [META_KEY_ADDITIONAL_BREADCRUMBS]: [\n ROUTES.CATEGORY_MANAGEMENT_CATEGORY_LIST\n ]\n },\n children: [\n {\n path: '',\n name: ROUTES.FORM_TEMPLATE_MANAGEMENT_FORM_TEMPLATE_UPDATE,\n component: FormTemplateUpdate\n },\n {\n path: '',\n name: ROUTES.FORM_TEMPLATE_MANAGEMENT_FORM_TEMPLATE_PREVIEW,\n component: FormTemplatePreview\n }\n ]\n },\n {\n path: '',\n name: ROUTES.APPLICATION_FORM,\n component: ApplicationForm\n },\n {\n path: '',\n name: ROUTES.ADMIN_APPLICATION_FORM,\n component: AdminApplicationForm,\n meta: {\n [META_KEY_ADDITIONAL_BREADCRUMBS]: [\n ROUTES.ADMIN_APPLICATION_FORM_MANAGEMENT\n ]\n }\n },\n {\n path: '',\n name: ROUTES.ADMIN_APPLICATION_FORM_MANAGEMENT,\n component: AdminApplicationFormManagement\n },\n {\n path: '',\n name: ROUTES.ADMIN_APPLICATION_FORM_SUPPORT,\n component: AdminApplicationFormSupport,\n meta: {\n [META_KEY_ADDITIONAL_BREADCRUMBS]: [\n ROUTES.ADMIN_APPLICATION_FORM_SUPPORT_MANAGEMENT\n ]\n }\n },\n {\n path: '',\n name: ROUTES.APPLICATION_FORM_SUPPORT,\n component: ApplicationFormSupport\n },\n {\n path: '',\n name: ROUTES.ADMIN_APPLICATION_FORM_SUPPORT_MANAGEMENT,\n component: AdminApplicationFormSupportManagement\n },\n {\n path: '',\n name: ROUTES.ADMIN_APPLICATION_FORM_VALIDATION_MANAGEMENT,\n component: AdminApplicationFormValidationManagement\n },\n {\n path: '',\n name: ROUTES.ADMIN_APPLICATION_FORM_VALIDATION_FORM,\n component: AdminApplicationFormValidation,\n meta: {\n [META_KEY_ADDITIONAL_BREADCRUMBS]: [\n ROUTES.ADMIN_APPLICATION_FORM_VALIDATION_MANAGEMENT\n ]\n }\n },\n {\n path: '',\n name: ROUTES.EVALUATOR_MANAGEMENT_LIST,\n component: EvaluatorManagement,\n children: [\n {\n path: '',\n name: ROUTES.EVALUATOR_MANAGEMENT_CREATION,\n component: AdminEvaluatorCategoryAssignmentCreationOverlay\n },\n {\n path: '',\n name: ROUTES.EVALUATOR_MANAGEMENT_UPDATE,\n component: AdminEvaluatorCategoryAssignmentUpdateOverlay\n },\n {\n path: '',\n name: ROUTES.EVALUATOR_MANAGEMENT_EVALUATOR_TOOLBOX_FILE_DEPOSIT,\n component: EvaluatorToolboxFileDepositOverlay\n }\n ]\n },\n {\n path: '',\n name: ROUTES.EVALUATOR_APPLICATION_FORM_DISPLAY,\n component: EvaluatorApplicationFormAssignment\n },\n {\n path: '',\n name: ROUTES.EVALUATOR_APPLICATION_FORM_SUPPORT_DISPLAY,\n component: EvaluatorApplicationFormSupportAssignment\n },\n {\n path: '',\n name: ROUTES.YEAR_CONFIGURATION_MANAGEMENT_LIST,\n component: YearConfigurationManagement,\n children: [\n {\n path: '',\n name: ROUTES.YEAR_CONFIGURATION_MANAGEMENT_UPDATE,\n component: YearConfigurationUpdateDialog\n }\n ]\n },\n {\n path: '',\n name: ROUTES.PUBLIC_FORM_TEMPLATE_PREVIEW,\n component: PublicFormTemplatePreview,\n meta: {\n [META_KEY_DISPLAY_PUBLIC_NAVIGATION_BAR]: true\n }\n }\n ]\n },\n {\n path: '*',\n name: ROUTES.WILDCARD\n }\n]\n\nconst router = new VueRouter({\n routes: RouterLocalizationHelper(routes)\n})\n\nrouter.beforeEach((to: Route, from: Route, next: NavigationGuardNext) => {\n const routeParameters: ILocalizedRouteParameters = extractLocalizedRouteParameters(to.name as string)\n\n if (routeParameters.name === ROUTES.WILDCARD) {\n return next({\n name: generateLocalizedRouteName({\n name: ROUTES.ERROR,\n locale: Localization.CURRENT_LOCALE\n }),\n params: {\n status: HttpStatusCode.NOT_FOUND.toString()\n }\n })\n }\n\n if (routeParameters.locale !== Localization.CURRENT_LOCALE) {\n return next({\n name: generateLocalizedRouteName({\n name: routeParameters.name,\n locale: Localization.CURRENT_LOCALE\n }),\n params: to.params,\n query: to.query\n })\n }\n\n return next()\n})\n\nexport default router\n","import Component, { mixins } from 'vue-class-component'\n\nimport { AxiosError } from 'axios';\n\nimport Localization from '@/localization';\nimport { extractLocalizedRouteParameters, generateLocalizedRouteName } from '@/router/helpers';\nimport ROUTES from './ROUTES';\n\nexport interface IRouterMixin {\n mixin_router_navigate(route: any, event?: Event): void;\n mixin_router_generateHref(route: any): string;\n mixin_router_redirectRequestError(error?: AxiosError): void;\n}\n\n@Component\nexport default class RouterMixin extends mixins() implements IRouterMixin {\n public mixin_router_navigate(route: any, event?: Event): void {\n if (!route) {\n throw new Error(\"Unable to mixin_router_navigate. Route not provided.\")\n }\n\n if (this.isEventNewTab(event)) {\n const routeHref = this.mixin_router_generateHref(route)\n\n const tab: Window | null = window.open(routeHref, '_blank')\n\n if (tab) {\n tab.focus()\n }\n } else {\n this.$router.push({\n ...route,\n name: generateLocalizedRouteName({\n name: route.name as string,\n locale: Localization.CURRENT_LOCALE\n })\n })\n }\n }\n\n private isEventNewTab(event?: any) {\n if (\n event && \n (\n event.ctrlKey ||\n event.metaKey\n )\n ) {\n return true\n }\n\n return false\n }\n\n public mixin_router_generateHref(route: any): string {\n if (!route) {\n throw new Error(\"Unable to mixin_router_generateHref. Route not provided.\")\n }\n\n return this.$router.resolve({\n ...route,\n name: generateLocalizedRouteName({\n name: route.name as string,\n locale: Localization.CURRENT_LOCALE\n })\n }).href\n }\n\n public mixin_router_extractLocalizedRouteName(name: string): string {\n return extractLocalizedRouteParameters(name || '').name\n }\n\n public mixin_router_redirectRequestError(error?: AxiosError): void {\n if (error && error.response) {\n this.mixin_router_navigate({\n name: ROUTES.ERROR,\n params: {\n status: error.response.status.toString()\n },\n query: {\n token: this.$route.params.token\n }\n })\n } else {\n this.mixin_router_navigate({\n name: ROUTES.ERROR\n })\n }\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport ROLES from './ROLES';\nimport { STORE_GETTERS } from '@/store';\n\nexport interface ISessionMixin {\n mixin_session_userHasRole(role: ROLES): boolean;\n}\n\n@Component\nexport default class SessionMixin extends mixins() implements ISessionMixin {\n public mixin_session_userHasRole(role: ROLES): boolean {\n if (!role) {\n return false\n }\n \n return this.$store.getters[STORE_GETTERS.SESSION_GET_ROLES].includes(role.toString())\n }\n}\n","import { Moment } from 'moment'\nimport Component, { mixins } from 'vue-class-component'\n\nexport interface ITimestampMixin {\n mixin_timestamp_pretty(timestamp: string): string;\n mixin_timestamp_prettyDate(date: string): string;\n mixin_timestamp_prettyTime(time: string): string;\n mixin_timstamp_dateAndTimeToTimestamp(date: string, time: string): string;\n mixin_timestamp_extractDate(timestamp: string): string;\n mixin_timestamp_extractTime(timestamp: string): string;\n}\n\n@Component\nexport default class TimestampMixin extends mixins() implements ITimestampMixin {\n public mixin_timestamp_pretty(timestamp: string): string {\n if (!timestamp) {\n return ''\n }\n\n return this.$i18next.t('modules.global.utilities.TimestampMixin.mixin_timestamp_prettyTimestamp', {\n date: this.mixin_timestamp_prettyDate(timestamp),\n time: this.mixin_timestamp_prettyTime(timestamp)\n })\n }\n\n public mixin_timestamp_prettyDate(date: string): string {\n const momentTimestamp: Moment = this.$moment(date)\n\n return momentTimestamp.format('Do MMMM YYYY')\n }\n\n public mixin_timestamp_prettyTime(time: string): string {\n const momentTimestamp: Moment = this.$moment(time)\n\n return this.$i18next.t('modules.global.utilities.TimestampMixin.mixin_timestamp_prettyTime', {\n hour: momentTimestamp.format('HH'),\n minute: momentTimestamp.format('mm')\n })\n }\n\n public mixin_timstamp_dateAndTimeToTimestamp(date: string, time: string): string {\n if (!date || !time) {\n return ''\n }\n \n return `${date}T${time}`\n }\n\n public mixin_timestamp_extractDate(timestamp: string): string {\n if (!timestamp) {\n return ''\n }\n\n const momentTimestamp: Moment = this.$moment(timestamp)\n\n return momentTimestamp.format('YYYY-MM-DD')\n }\n\n public mixin_timestamp_extractTime(timestamp: string): string {\n if (!timestamp) {\n return ''\n }\n \n const momentTimestamp: Moment = this.$moment(timestamp)\n\n return momentTimestamp.format('HH:mm')\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nexport interface IStringMixin {\n mixin_string_isEmpty(value: any): boolean;\n}\n\n@Component\nexport default class StringMixin extends mixins() implements IStringMixin {\n public mixin_string_isEmpty(value: string): boolean {\n return !value || value.trim().length === 0\n }\n}\n","import Component, { mixins } from 'vue-class-component'\n\nimport RouterMixin, { IRouterMixin } from '@/router/Router.mixin'\nimport SessionMixin, { ISessionMixin } from '@/modules/session/Session.mixin'\nimport TimestampMixin, { ITimestampMixin } from './Timestamp.mixin'\nimport StringMixin, { IStringMixin } from './String.mixin'\n\nexport interface IUtilitiesMixin extends IRouterMixin, ISessionMixin, IStringMixin, ITimestampMixin {\n mixin_utilities_userTimedTrace(user: string, timestamp: string): string;\n}\n\n@Component\nexport default class UtilitiesMixin extends mixins(RouterMixin, SessionMixin, StringMixin, TimestampMixin) implements UtilitiesMixin {\n public mixin_utilities_userTimedTrace(user: string, timestamp: string): string {\n if (!user && !timestamp) {\n return ''\n } else if (!user && timestamp) {\n return this.mixin_timestamp_pretty(timestamp)\n } else if (!timestamp && user) {\n return user\n }\n\n return this.$i18next.t('modules.global.utilities.Utilities.user_timed_trace.value', {\n user,\n timestamp: this.mixin_timestamp_pretty(timestamp)\n }) \n }\n}\n","import { SpritesService } from '@ulaval/modul-components';\nimport Vue, { PluginObject, VueConstructor } from 'vue';\n\nconst SVG_PREFIX: string = 'pd'\n\nconst IconPlugin: PluginObject = {\n install(v: VueConstructor): void {\n const svg: SpritesService = v.prototype.$svg;\n /* eslint-disable @typescript-eslint/no-var-requires */\n svg.addExternalSprites(\n require('@/assets/medias/svg/sprites.svg'),\n SVG_PREFIX\n )\n },\n};\n\nexport default IconPlugin;","import Vue from 'vue'\n\nimport App from './App'\nimport router from './router'\nimport store from './store'\nimport Localization from './localization'\nimport UtilitiesMixin, { IUtilitiesMixin } from './modules/global/utilities/Utilities.mixin'\nimport IconPlugin from './plugins/icons'\n\nimport Axios, { AxiosStatic } from 'axios'\nimport * as Moment from 'moment'\nimport { i18n } from 'i18next'\n\nimport '@ulaval/modul-components/lib/modul.min.css'\nimport '@/assets/styles/main.scss'\nimport 'quill/dist/quill.bubble.css'\nimport 'quill/dist/quill.core.css'\nimport 'quill/dist/quill.snow.css'\n\nimport {\n DialogServicePlugin,\n FormPlugin,\n ToastServicePlugin,\n RichTextLicensePlugin,\n UtilsPlugin,\n UtilsPluginOptions\n} from '@ulaval/modul-components'\nimport { fileSize as FileSizeFilter } from '@ulaval/modul-components/dist/filters/filesize/filesize'\nimport { FILESIZE_NAME } from '@ulaval/modul-components/dist/filters/filter-names'\n// @ts-ignore\nimport FrenchPlugin from '@ulaval/modul-components/lib/fr'\n// @ts-ignore\nimport DefaultSpritesPlugin from '@ulaval/modul-components/lib/sprites'\n\nconst utilsPluginOptions: UtilsPluginOptions = {\n i18PluginOptions: {\n curLang: Localization.CURRENT_LOCALE,\n },\n propagateVueParserErrors: false,\n}\n\nconst localizationPromise: Promise = import('@/localization/fr.plugin');\nMoment.locale(Localization.MOMENT_LOCALES.FR)\nrequire('moment/locale/fr')\n\nAxios.defaults.baseURL = process.env.VUE_APP_API_URL\nAxios.defaults.headers['Locale'] = Localization.CURRENT_LOCALE.toUpperCase()\n\nVue.config.productionTip = false;\nVue.prototype.$moment = Moment\nVue.prototype.$axios = Axios\nVue.prototype.$i18next = Localization.i18next\n\nVue.use(UtilsPlugin, utilsPluginOptions)\nVue.use(FrenchPlugin)\nVue.use(DefaultSpritesPlugin)\nVue.use(RichTextLicensePlugin);\nVue.use(FormPlugin)\nVue.use(DialogServicePlugin)\nVue.use(ToastServicePlugin)\nVue.use(IconPlugin)\n\nVue.filter(FILESIZE_NAME, FileSizeFilter)\n\nVue.mixin(UtilitiesMixin)\n\ndeclare module 'vue/types/vue' {\n // eslint-disable-next-line @typescript-eslint/interface-name-prefix\n interface Vue extends IUtilitiesMixin {\n $axios: AxiosStatic;\n // @ts-ignore\n $moment: Moment;\n $i18next: i18n;\n }\n}\n\nlocalizationPromise.then((localizationPlugin: any) => {\n Vue.use(localizationPlugin.default)\n\n new Vue({\n router,\n store,\n render: h => h(App)\n }).$mount('#app')\n});\n","\n

\n {{ $i18next.t('modules.category-management.category-copy.CategoryCopyDialog.overlay_title') }}\n

\n \n \n \n \n \n","
\n
\n \n
    \n
  • \n \n {{ $i18next.t('modules.form-template-management.form-template-preview.FormTemplatePreview.informations.category') }}\n \n {{ formTemplate.category.title }}\n
  • \n
  • \n \n {{ $i18next.t('modules.form-template-management.form-template-preview.FormTemplatePreview.informations.year') }}\n \n {{ formTemplate.category.year.slug }}\n
  • \n
  • \n \n {{ $i18next.t('modules.form-template-management.form-template-preview.FormTemplatePreview.informations.form_type') }}\n \n {{ $i18next.t(`modules.form-template-management.FormTemplateModel.types.${formTemplate.type}`) }}\n
  • \n
\n
\n
\n
\n \n \n {{ $i18next.t('modules.form-template-management.form-template-preview.FormTemplatePreview.button.display_validation_rules.label') }}\n \n
\n \n \n
","
\n \n

\n {{ applicationFormSupport.supporter_name_with_email }}\n
\n \n \n \n \n

\n \n
","\n \n \n \n \n \n \n \n","\n \n \n \n \n \n \n \n \n","
\n \n \n \n \n \n \n \n \n \n \n \n \n
","
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{ $i18next.t('modules.category-management.categories.Categories.toast.delete_success.label') }}\n \n
","
\n
\n
\n
\n
\n \n
","\n \n \n \n \n \n \n","\n \n \n
","
\n \n
","
\n
\n
\n \n
\n
\n

\n \n \n

\n

\n \n {{ fileSize | f-m-filesize }}\n \n

\n
\n \n
\n \n \n
","
\n \n \n

\n {{ $i18next.t('modules.category-management.CategoryManagement.panel_title') }}\n

\n \n \n \n \n
\n \n
","\n \n \n \n
\n \n \n \n
\n
\n \n
\n
\n \n {{ $i18next.t('modules.authentication.form.AuthenticationForm.components.submit.label') }}\n \n
\n","
\n \n \n \n
","
\n \n {{ $i18next.t('modules.category-section-management.category-section-form.CategorySectionForm.label.add_new_section') }}\n \n \n
","
\n \n \n \n \n \n \n
\n \n \n \n \n
\n \n \n {{ $i18next.t('modules.form-template-management.form-template-update.FormTemplateUpdateSelectedElement.button.delete_element.label') }}\n \n
\n","
\n \n

\n {{ $i18next.t('modules.global.email.EmailStatusRow.label.sender', {\n 'user': emailStatus.sent_by,\n 'timestamp': mixin_timestamp_pretty(emailStatus.sent_at)\n }) }}\n

\n \n

\n \n \n \n \n

\n
\n
","
\n
\n
\n
\n
\n \n
    \n
  • \n \n {{ $i18next.t('modules.form-template-management.form-template-update.FormTemplateUpdate.informations.category') }}\n \n {{ formTemplate.category.title }}\n
  • \n
  • \n \n {{ $i18next.t('modules.form-template-management.form-template-update.FormTemplateUpdate.informations.year') }}\n \n {{ formTemplate.category.year.slug }}\n
  • \n
  • \n \n {{ $i18next.t('modules.form-template-management.form-template-update.FormTemplateUpdate.informations.form_type') }}\n \n {{ $i18next.t(`modules.form-template-management.FormTemplateModel.types.${formTemplate.type}`) }}\n
  • \n
\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n {{ $i18next.t('modules.form-template-management.form-template-update.FormTemplateUpdate.button.save.label') }}\n \n \n {{ $i18next.t('modules.form-template-management.form-template-update.FormTemplateUpdate.button.preview.label') }}\n \n \n \n {{ $i18next.t('modules.form-template-management.form-template-update.FormTemplateUpdate.dialog.cancel_confirmation.trigger_label') }}\n \n \n {{ $i18next.t('modules.form-template-management.form-template-update.FormTemplateUpdate.dialog.cancel_confirmation.message') }}\n \n \n
\n
\n \n \n \n \n \n \n
","
\n \n
","","
\n \n \n \n \n {{ $i18next.t('modules.global.navigation-bar.UserProfileMenu.options.logout.label') }}\n \n \n
","