{"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/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/public-area/form-template-preview/PublicApplicationFormFormTemplatePreview.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/PublicApplicationFormFormTemplatePreview.ts","webpack:///./src/modules/public-area/form-template-preview/PublicApplicationFormSupportFormTemplatePreview.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/public-area/form-template-preview/PublicApplicationFormSupportFormTemplatePreview.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_fetchPublicApplicationForm","categoryId","internal_form_template","service_formTemplateService_mapFormTemplateToInternalFormTemplate","service_formTemplateService_fetchPublicApplicationFormSupport","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","PublicApplicationFormFormTemplatePreview","isInformationToastActive","onIdCategoryChange","isAfter","addEventListener","onScroll","destroyed","removeEventListener","mainPanelComponent","messageDomRect","$el","top","onReturnHomeButtonClick","onDisplayApplicationFormSupportButtonClick","PUBLIC_APPLICATION_FORM_FORM_TEMPLATE_PREVIEW","PublicApplicationFormSupportFormTemplatePreview","onReturnToApplicationFormButtonClick","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.1c5b014c.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 {{ $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 \n \n \n \n \n \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/PublicApplicationFormFormTemplatePreview.lang.fr.json\": \"fc55\",\n\t\"./modules/public-area/form-template-preview/PublicApplicationFormSupportFormTemplatePreview.lang.fr.json\": \"432b\",\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 PUBLIC_APPLICATION_FORM_FORM_TEMPLATE_PREVIEW = 'publicApplicationFormSupportFormTemplatePreview',\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_fetchPublicApplicationForm(categoryId: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/public/categories/${categoryId}/form-templates/application-form`)\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_fetchPublicApplicationFormSupport(categoryId: string): Promise {\n return new Promise((resolve: any, reject: any): void => {\n this.$axios.get(`/api/public/categories/${categoryId}/form-templates/application-form-support`)\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 './PublicApplicationFormFormTemplatePreview.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 PublicApplicationFormFormTemplatePreview 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 get displayApplicationFormSupportDisplayButton(): boolean {\n if (!this.formTemplate || !this.formTemplate.category) {\n return false\n }\n\n return this.formTemplate.category.has_application_support\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_fetchPublicApplicationForm(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 private onDisplayApplicationFormSupportButtonClick(): void {\n if (this.formTemplate && this.formTemplate.category) {\n this.mixin_router_navigate({\n name: ROUTES.PUBLIC_APPLICATION_FORM_FORM_TEMPLATE_PREVIEW,\n params: {\n idCategory: this.$route.params.idCategory\n }\n })\n }\n }\n}\n","import Component, { mixins } from 'vue-class-component'\nimport { Ref, Watch } from 'vue-property-decorator'\n\nimport WithRender from './PublicApplicationFormSupportFormTemplatePreview.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 PublicApplicationFormSupportFormTemplatePreview 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 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_fetchPublicApplicationFormSupport(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 onReturnToApplicationFormButtonClick(): void {\n this.mixin_router_navigate({\n name: ROUTES.PUBLIC_FORM_TEMPLATE_PREVIEW,\n params: {\n idCategory: this.$route.params.idCategory\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 PublicApplicationFormFormTemplatePreview from '@/modules/public-area/form-template-preview/PublicApplicationFormFormTemplatePreview'\nimport PublicApplicationFormSupportFormTemplatePreview from '@/modules/public-area/form-template-preview/PublicApplicationFormSupportFormTemplatePreview'\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: PublicApplicationFormFormTemplatePreview,\n meta: {\n [META_KEY_DISPLAY_PUBLIC_NAVIGATION_BAR]: true\n }\n },\n {\n path: '',\n name: ROUTES.PUBLIC_APPLICATION_FORM_FORM_TEMPLATE_PREVIEW,\n component: PublicApplicationFormSupportFormTemplatePreview,\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 \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
","