{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/environments/environment.ts","webpack:///./src/app/_common/animations/router-transition.ts","webpack:///./src/app/_conf.ts","webpack:///./src/app/_common/components/full-screen-loader/full-screen-loader.html","webpack:///./src/app/_common/components/full-screen-loader/full-screen-loader.ts","webpack:///./src/app/app.component.html","webpack:///./src/app/app.component.ts","webpack:///./src/app/material.module.ts","webpack:///./src/app/_common/providers/models.ts","webpack:///./src/app/_common/providers/utils.ts","webpack:///./src/app/_common/providers/api-base-service.ts","webpack:///./src/app/_common/providers/key-value-storage.ts","webpack:///./src/app/_common/providers/models-storage.ts","webpack:///./src/app/_common/providers/current-user.ts","webpack:///./src/app/_common/providers/langs-provider.ts","webpack:///./src/app/projects/providers/projects-provider.ts","webpack:///./src/app/_common/providers/sync-service.ts","webpack:///./src/app/_common/pipes/translate-cut.ts","webpack:///./src/app/projects/components/register-dialog/register-dialog.html","webpack:///./src/app/projects/components/register-dialog/register-dialog.ts","webpack:///./src/app/investors/providers/investors-provider.ts","webpack:///./src/app/investors/components/register-dialog/register-dialog.html","webpack:///./src/app/investors/components/register-dialog/register-dialog.ts","webpack:///./src/app/projects/components/create-dialog/create-dialog.html","webpack:///./src/app/projects/components/create-dialog/create-dialog.ts","webpack:///./src/app/users/providers/users-provider.ts","webpack:///./src/app/_acventures-common/providers/navigation-provider.ts","webpack:///./src/app/_common/animations/translate-fade-before-after.ts","webpack:///./src/app/_common/components/auth/auth-dialog/auth-dialog.html","webpack:///./src/app/_common/components/auth/auth-dialog/auth-dialog.ts","webpack:///./src/app/_common/components/auth/auth.ts","webpack:///./src/app/_common/components/auth/auth.html","webpack:///./src/app/users/components/user-menu/user-menu.html","webpack:///./src/app/users/components/user-menu/user-menu.ts","webpack:///./src/app/_common/components/header/header.html","webpack:///./src/app/_common/components/header/header.ts","webpack:///./src/app/_acventures-common/components/company-logos/company-logos.html","webpack:///./src/app/_acventures-common/components/company-logos/company-logos.ts","webpack:///./src/app/_acventures-common/components/home-welcome/home-welcome.html","webpack:///./src/app/_acventures-common/components/home-welcome/home-welcome.ts","webpack:///./src/app/_acventures-common/components/home-showroom/home-showroom.ts","webpack:///./src/app/_acventures-common/components/home-showroom/home-showroom.html","webpack:///./src/app/_acventures-common/components/home-showroom-dialog/home-showroom-dialog.html","webpack:///./src/app/_acventures-common/components/home-showroom-dialog/home-showroom-dialog.ts","webpack:///./src/app/investors/components/home-introduction/home-introduction.html","webpack:///./src/app/investors/components/home-introduction/home-introduction.ts","webpack:///./src/app/projects/components/home-introduction/home-introduction.html","webpack:///./src/app/projects/components/home-introduction/home-introduction.ts","webpack:///./src/app/_common/components/info-dialog/info-dialog.html","webpack:///./src/app/_common/components/info-dialog/info-dialog.ts","webpack:///./src/app/_common/components/footer/footer.html","webpack:///./src/app/_common/components/footer/footer.ts","webpack:///./src/app/_common/pages/home/home.ts","webpack:///./src/app/_common/pages/home/home.html","webpack:///./src/app/_common/components/error-401/error-401.html","webpack:///./src/app/_common/components/error-401/error-401.ts","webpack:///./src/app/_common/pages/error-401/error-401.ts","webpack:///./src/app/_common/pages/error-401/error-401.html","webpack:///./src/app/_common/components/error-404/error-404.html","webpack:///./src/app/_common/components/error-404/error-404.ts","webpack:///./src/app/_common/pages/error-404/error-404.ts","webpack:///./src/app/_common/pages/error-404/error-404.html","webpack:///./src/app/users/components/change-password-dialog/change-password-dialog.html","webpack:///./src/app/users/components/change-password-dialog/change-password-dialog.ts","webpack:///./src/app/_common/components/confirm-dialog/confirm-dialog.ts","webpack:///./src/app/_common/components/confirm-dialog/confirm-dialog.html","webpack:///./src/app/investors/providers/investor-rights.ts","webpack:///./src/app/_common/guards/has-pending-changes.ts","webpack:///./src/app/_common/components/module-content/module-content.html","webpack:///./src/app/_common/components/module-content/module-content.ts","webpack:///./src/app/_common/providers/simple-mat-data-source.ts","webpack:///./src/app/alerts/providers/alerts-provider.ts","webpack:///./src/app/_common/pipes/date-closest.ts","webpack:///./src/app/alerts/components/list/list.html","webpack:///./src/app/alerts/components/list/list.ts","webpack:///./src/app/investors/components/edit-investor-profile/edit-investor-profile.html","webpack:///./src/app/investors/components/edit-investor-profile/edit-investor-profile.ts","webpack:///./src/app/users/providers/user-rights.ts","webpack:///./src/app/_common/components/page-content/page-content.ts","webpack:///./src/app/_common/components/page-content/page-content.html","webpack:///./src/app/_common/components/side-menu/side-menu.html","webpack:///./src/app/_common/components/side-menu/side-menu.ts","webpack:///./src/app/investors/components/investor-state-indicator/investor-state-indicator.html","webpack:///./src/app/investors/components/investor-state-indicator/investor-state-indicator.ts","webpack:///./src/app/_common/components/input-image/input-image.html","webpack:///./src/app/_common/components/input-image/input-image.ts","webpack:///./src/app/_common/components/main-action/main-action.html","webpack:///./src/app/_common/components/main-action/main-action.ts","webpack:///./src/app/users/pages/edit/edit.html","webpack:///./src/app/users/pages/edit/edit.ts","webpack:///./src/app/_common/pages/logout/logout.ts","webpack:///./src/app/_common/pages/logout/logout.html","webpack:///./src/app/projects/providers/project-rights.ts","webpack:///./src/app/files/providers/files-provider.ts","webpack:///./src/app/projects/components/edit-project-academic/edit-project-academic.html","webpack:///./src/app/projects/components/edit-project-academic/edit-project-academic.ts","webpack:///./src/app/_common/components/true-false-radio/true-false-radio.ts","webpack:///./src/app/_common/components/true-false-radio/true-false-radio.html","webpack:///./src/app/_common/components/public-private-radio/public-private-radio.html","webpack:///./src/app/_common/components/public-private-radio/public-private-radio.ts","webpack:///./src/app/projects/components/edit-project-situation/edit-project-situation.html","webpack:///./src/app/projects/components/edit-project-situation/edit-project-situation.ts","webpack:///./src/app/projects/components/edit-project-funding/edit-project-funding.html","webpack:///./src/app/projects/components/edit-project-funding/edit-project-funding.ts","webpack:///./src/app/projects/components/edit-project-miscellaneous/edit-project-miscellaneous.html","webpack:///./src/app/projects/components/edit-project-miscellaneous/edit-project-miscellaneous.ts","webpack:///./src/app/projects/components/edit-project-partnership/edit-project-partnership.html","webpack:///./src/app/projects/components/edit-project-partnership/edit-project-partnership.ts","webpack:///./src/app/_common/components/name-picker/name-picker.html","webpack:///./src/app/_common/components/name-picker/name-picker.ts","webpack:///./src/app/files/components/image-viewer-dialog/image-viewer-dialog.html","webpack:///./src/app/files/components/image-viewer-dialog/image-viewer-dialog.ts","webpack:///./src/app/_common/pipes/file-size.ts","webpack:///./src/app/files/components/files/files.html","webpack:///./src/app/files/components/files/files.ts","webpack:///./src/app/projects/components/edit-project-project/edit-project-project.html","webpack:///./src/app/projects/components/edit-project-project/edit-project-project.ts","webpack:///./src/app/projects/components/edit-project-team/edit-project-team.html","webpack:///./src/app/projects/components/edit-project-team/edit-project-team.ts","webpack:///./src/app/projects/components/ask-changes-dialog/ask-changes-dialog.html","webpack:///./src/app/projects/components/ask-changes-dialog/ask-changes-dialog.ts","webpack:///./src/app/projects/components/edit-project-review/edit-project-review.html","webpack:///./src/app/projects/components/edit-project-review/edit-project-review.ts","webpack:///./src/app/rich-text-editor/rich-text-editor.component.html","webpack:///./src/app/rich-text-editor/rich-text-editor.component.ts","webpack:///./src/app/projects/components/edit-project-case/edit-project-case.html","webpack:///./src/app/projects/components/edit-project-case/edit-project-case.ts","webpack:///./src/app/projects/pages/edit/edit.html","webpack:///./src/app/projects/pages/edit/edit.ts","webpack:///./src/app/_common/components/list-base/list-base.ts","webpack:///./src/app/projects/components/filter-block/filter-block.ts","webpack:///./src/app/projects/components/filter-block/filter-block.html","webpack:///./src/app/projects/components/list-project-cases/list-project-cases.html","webpack:///./src/app/projects/components/list-project-cases/list-project-cases.ts","webpack:///./src/app/_common/components/full-width-loader/full-width-loader.ts","webpack:///./src/app/_common/components/full-width-loader/full-width-loader.html","webpack:///./src/app/projects/pages/projects/projects.html","webpack:///./src/app/projects/pages/projects/projects.ts","webpack:///./src/app/alerts/pages/alerts/alerts.html","webpack:///./src/app/alerts/pages/alerts/alerts.ts","webpack:///./src/app/projects/components/list/list.html","webpack:///./src/app/projects/components/list/list.ts","webpack:///./src/app/projects/components/favorites-list/favorites-list.html","webpack:///./src/app/projects/components/favorites-list/favorites-list.ts","webpack:///./src/app/projects/pages/favorites/favorites.html","webpack:///./src/app/projects/pages/favorites/favorites.ts","webpack:///./src/app/_common/pipes/ellipsize.ts","webpack:///./src/app/_common/components/extensible-p/extensible-p.html","webpack:///./src/app/_common/components/extensible-p/extensible-p.ts","webpack:///./src/app/_common/components/item-list-dialog/item-list-dialog.html","webpack:///./src/app/_common/components/item-list-dialog/item-list-dialog.ts","webpack:///./src/app/projects/components/view-project-case/view-project-case.html","webpack:///./src/app/projects/components/view-project-case/view-project-case.ts","webpack:///./src/app/projects/pages/project/project.html","webpack:///./src/app/projects/pages/project/project.ts","webpack:///./src/app/alerts/pages/alert/alert.html","webpack:///./src/app/alerts/pages/alert/alert.ts","webpack:///./src/app/projects/pages/pending-validation/pending-validation.html","webpack:///./src/app/projects/pages/pending-validation/pending-validation.ts","webpack:///./src/app/investors/components/list/list.html","webpack:///./src/app/investors/components/list/list.ts","webpack:///./src/app/investors/pages/pending-validation/pending-validation.html","webpack:///./src/app/investors/pages/pending-validation/pending-validation.ts","webpack:///./src/app/investors/pages/investors/investors.html","webpack:///./src/app/investors/pages/investors/investors.ts","webpack:///./src/app/users/components/add-user-dialog/add-user-dialog.html","webpack:///./src/app/users/components/add-user-dialog/add-user-dialog.ts","webpack:///./src/app/users/components/list/list.html","webpack:///./src/app/users/components/list/list.ts","webpack:///./src/app/users/pages/admins/admins.html","webpack:///./src/app/users/pages/admins/admins.ts","webpack:///./src/app/users/pages/guests/guests.html","webpack:///./src/app/users/pages/guests/guests.ts","webpack:///./src/app/projects/pages/no-project-yet/no-project-yet.html","webpack:///./src/app/projects/pages/no-project-yet/no-project-yet.ts","webpack:///./src/app/_common/pages/terms/terms.ts","webpack:///./src/app/_common/pages/terms/terms.html","webpack:///./src/app/users/components/local-experts-list/local-experts-list.html","webpack:///./src/app/users/components/local-experts-list/local-experts-list.ts","webpack:///./src/app/users/pages/local-experts/local-experts.html","webpack:///./src/app/users/pages/local-experts/local-experts.ts","webpack:///./src/app/projects/pages/drafts/drafts.html","webpack:///./src/app/projects/pages/drafts/drafts.ts","webpack:///./src/app/projects/pages/dispatch/dispatch.html","webpack:///./src/app/projects/pages/dispatch/dispatch.ts","webpack:///./src/app/projects/components/project-state-indicator/project-state-indicator.ts","webpack:///./src/app/projects/components/project-state-indicator/project-state-indicator.html","webpack:///./src/app/projects/components/dashboard-overview/dashboard-overview.ts","webpack:///./src/app/projects/components/dashboard-overview/dashboard-overview.html","webpack:///./src/app/projects/components/dashboard-key-data/dashboard-key-data.html","webpack:///./src/app/projects/components/dashboard-key-data/dashboard-key-data.ts","webpack:///./src/app/projects/components/dashboard-metrics/dashboard-metrics.html","webpack:///./src/app/projects/components/dashboard-metrics/dashboard-metrics.ts","webpack:///./src/app/projects/pages/dashboard/dashboard.html","webpack:///./src/app/projects/pages/dashboard/dashboard.ts","webpack:///./src/app/investors/pages/home/home.ts","webpack:///./src/app/investors/pages/home/home.html","webpack:///./src/app/projects/pages/home/home.ts","webpack:///./src/app/projects/pages/home/home.html","webpack:///./src/app/investors/pages/welcome/welcome.html","webpack:///./src/app/investors/pages/welcome/welcome.ts","webpack:///./src/app/investors/providers/company-rights.ts","webpack:///./src/app/investors/pages/edit-company/edit-company.html","webpack:///./src/app/investors/pages/edit-company/edit-company.ts","webpack:///./src/app/_common/guards/guards-sequence.ts","webpack:///./src/app/notifications/providers/notifications-provider.ts","webpack:///./src/app/notifications/providers/todos-provider.ts","webpack:///./src/app/discussions/providers/discussions-provider.ts","webpack:///./src/app/_common/guards/is-app-ready.ts","webpack:///./src/app/_common/guards/is-logged-in.ts","webpack:///./src/app/_common/guards/is-admin.ts","webpack:///./src/app/users/guards/can-edit-user.ts","webpack:///./src/app/_common/guards/has-homepage-redirect.ts","webpack:///./src/app/project-membership/invite-user-dialog/invite-user-dialog.html","webpack:///./src/app/project-membership/invite-user-dialog/invite-user-dialog.ts","webpack:///./src/app/project-membership/providers/projects-memberships-provider.ts","webpack:///./src/app/project-membership/components/list/list.html","webpack:///./src/app/project-membership/components/list/list.ts","webpack:///./src/app/projects/pages/memberships/memberships.html","webpack:///./src/app/projects/pages/memberships/memberships.ts","webpack:///./src/app/_common/pipes/strip-http.ts","webpack:///./src/app/investors/components/list-companies/list-companies.html","webpack:///./src/app/investors/components/list-companies/list-companies.ts","webpack:///./src/app/investors/pages/companies/companies.html","webpack:///./src/app/investors/pages/companies/companies.ts","webpack:///./src/app/investors/guards/can-see-companies.ts","webpack:///./src/app/investors/pages/company/company.html","webpack:///./src/app/investors/pages/company/company.ts","webpack:///./src/app/investors/guards/can-see-company.ts","webpack:///./src/app/investors/pages/dashboard/dashboard.html","webpack:///./src/app/investors/pages/dashboard/dashboard.ts","webpack:///./src/app/app.routes.ts","webpack:///./src/app/app.resolver.ts","webpack:///./src/app/_common/components/data-list/data-list.html","webpack:///./src/app/_common/components/data-list/data-list.ts","webpack:///./src/app/_common/pipes/safe.ts","webpack:///./src/app/_common/components/embed-map/embed-map.html","webpack:///./src/app/_common/components/embed-map/embed-map.ts","webpack:///./src/app/_common/components/slider-control/slider-control.html","webpack:///./src/app/_common/components/slider-control/slider-control.ts","webpack:///./src/app/_common/components/workspace-selector/workspace-selector.html","webpack:///./src/app/_common/components/workspace-selector/workspace-selector.ts","webpack:///./src/app/_common/pipes/auto-linker.ts","webpack:///./src/app/_common/pipes/duration.ts","webpack:///./src/app/_common/providers/translatable-paginator-intl.ts","webpack:///./src/app/discussions/components/message/message.html","webpack:///./src/app/discussions/components/message/message.ts","webpack:///./src/app/discussions/components/discussion/discussion.html","webpack:///./src/app/discussions/components/discussion/discussion.ts","webpack:///./src/app/discussions/components/private-discussion-window/private-discussion-window.html","webpack:///./src/app/discussions/components/private-discussion-window/private-discussion-window.ts","webpack:///./src/app/discussions/components/edit-group-dialog/edit-group-dialog.html","webpack:///./src/app/discussions/components/edit-group-dialog/edit-group-dialog.ts","webpack:///./src/app/discussions/components/private-discussions-menu/private-discussions-menu.html","webpack:///./src/app/discussions/components/private-discussions-menu/private-discussions-menu.ts","webpack:///./src/app/like-counters/providers/like-counters-provider.ts","webpack:///./src/app/like-counters/components/like-counter/like-counter.html","webpack:///./src/app/like-counters/components/like-counter/like-counter.ts","webpack:///./src/app/notifications/components/notifications-menu/notifications-menu.html","webpack:///./src/app/notifications/components/notifications-menu/notifications-menu.ts","webpack:///./src/app/review-marks/components/review-mark-select/review-mark-select.html","webpack:///./src/app/review-marks/components/review-mark-select/review-mark-select.ts","webpack:///./src/app/tags/components/tag/tag.html","webpack:///./src/app/tags/components/tag/tag.ts","webpack:///./src/app/tags/components/tag-picker/tag-picker.html","webpack:///./src/app/tags/components/tag-picker/tag-picker.ts","webpack:///./src/app/tags/components/tag-select/tag-select.html","webpack:///./src/app/tags/components/tag-select/tag-select.ts","webpack:///./src/app/_common/providers/simple-data-source.ts","webpack:///./src/app/users/components/user-profile-dialog/user-profile-dialog.html","webpack:///./src/app/users/components/user-profile-dialog/user-profile-dialog.ts","webpack:///./src/app/users/components/user-sticker/user-sticker.html","webpack:///./src/app/users/components/user-sticker/user-sticker.ts","webpack:///./src/app/users/components/pick-users-dialog/pick-users-dialog.html","webpack:///./src/app/users/components/pick-users-dialog/pick-users-dialog.ts","webpack:///./src/app/users/components/user-picker/user-picker.html","webpack:///./src/app/users/components/user-picker/user-picker.ts","webpack:///./src/app/rich-text-editor/rich-text-editor.module.ts","webpack:///./src/app/app.module.ts","webpack:///./src/main.browser.ts","webpack:///./$_lazy_route_resource lazy namespace object"],"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","0","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","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","map","webpackContext","req","id","webpackContextResolve","code","keys","environment","production","stage","showDevModule","decorateModuleRef","modRef","ENV_PROVIDERS","routerTransition","transform","opacity","optional","Conf","platformName","googleMapsApiKey","developer","developerLink","isRegistrationDisabled","helpEmail","defaultKeyValueStore","availableLangs","dateLocale","defaultLang","this","_env","_envConfigs","dev","prodMode","apiRootUrl","storageRootUrl","assetsUrl","apiPasswordGrantClient","apiPasswordGrantSecret","facebookPageUrl","homepageRedirect","docker","staging","prod","FullScreenLoaderComponent","conf","_translater","progress","indeterminate","AppComponent","_router","_location","isLoading","_yScrollStack","loadingListener","events","pipe","filter","subscribe","unsubscribe","fixScrollNavigationIssue","routeReuseStrategy","shouldReuseRoute","ev","_lastPoppedUrl","url","scrollY","scrollTo","pop","MondayFirstDayDateAdapter","MaterialModule","provide","useClass","ModelSerialization","instance","assign","Lang","item","parseFloat","items","fromAPI","fromStorageRow","JSON","parse","stringify","toJson","tableName","ID_EN","ID_FR","ID_DEFAULT","User","langId","email","isAdmin","isInvestor","isGuest","isProjectHolder","isLocalExpert","firstName","lastName","avatar","intro","createDate","createrId","updateDate","updaterId","deleteDate","deleterId","UserLink","description","matchWith","hint","icon","translationsData","translationData","ID_LINKEDIN","ID_TWITTER","ID_GITHUB","ID_STACKOVERFLOW","ID_INSTAGRAM","Tag","colorHex","textColorHex","Discussion","DiscussionMessage","discussionId","FileFamily","ID_OTHER","ID_IMAGE","ID_AUDIO","ID_VIDEO","ID_PDF","ID_WORD","ID_EXCEL","ID_POWERPOINT","ID_FOLDER","FileType","fileFamilyId","extension","mimeType","ID_AAC","ID_AVI","ID_CSV","ID_DOC","ID_DOCX","ID_GIF","ID_JPEG","ID_JPG","ID_JSON","ID_MID","ID_MIDI","ID_MPEG","ID_PNG","ID_PPT","ID_PPTX","ID_RAR","ID_RTF","ID_SVG","ID_WEBA","ID_WEBM","ID_WEBP","ID_XLS","ID_XLSX","ID_XML","ID_ZIP","ID_3GPA","ID_3GPV","ID_7Z","ID_MP3","ID_MP4","ID_MKV","FileGroup","File","fileGroupId","fileTypeId","parentFileId","file","size","PrivateDiscussion","isGroup","image","PrivateDiscussion_User","privateDiscussionId","userId","lastSeen","lastNotification","User_UserLink","userLinkId","link","LikeCounter","LikeCounter_User","likeCounterId","CompanyCategoryGroup","ID_LIFE_SCIENCE_INDUSTRY","CompanyCategory","companyCategoryGroupId","ordinal","InvestorValidationState","ID_PENDING","ID_ACCEPTED","ID_REFUSED","InvestorProfile","super","deserialize","investorValidationStateId","companyId","investmentRangeFrom","investmentRangeTo","isInterstedInNotForProfit","isInterstedInPartnerships","isInterstedInLicenses","acceptToBeContacted","isNotificationsAlertEnabled","isNotificationsDevPhaseEnabled","isNotificationsSeekingFundsEnabled","isNotificationsLeadInvestorEnabled","phone","TherapeuticAreaOfInterest","investorProfileId","therapeuticAreaId","DevelopmentPhaseOfInterest","developmentPhaseId","ProjectFavorite","projectId","Alert","ownerId","isCompanyIncorporated","isCompanyNotIncorporated","yearOfIncorporationFrom","yearOfIncorporationTo","yearOfPlannedIncorporationFrom","yearOfPlannedIncorporationTo","isOutlicensing","isNotOutlicensing","isSeekingPartnerhips","isNotSeekingPartnerhips","isNotForProfit","isNotNotForProfit","isRaisingFunds","isNotRaisingFunds","raisingFundsAmountFrom","raisingFundsAmountTo","isPublicCompany","isPrivateCompany","Alert_ProjectType","alertId","projectTypeId","Alert_TherapeuticArea","Alert_DevelopmentPhase","Alert_FundingRound","fundingRoundId","Alert_AcademicInstitution","academicInstitutionId","ProjectTradeType","ID_PUBLIC","ID_PRIVATE","ProjectTypeGroup","ID_MEDTECH","ID_BIOTECH","ID_HEALTHCARE","ProjectType","projectTypeGroupId","TherapeuticArea","ID_ANAESTHESIOLOGY","ID_ANGIOLOGY","ID_CARDIOLOGY","ID_DERMATOLOGY","ID_ENDOCRINOLOGY","ID_GASTROENTEROLOGY","ID_GERIATRICS","ID_GYNECOLOGY","ID_HERMATOLOGY","ID_IMMUNOLOGY","ID_INFECTIOUS_DISEASES","ID_NEPHROLOGY","ID_NEUROLOGY","ID_ONCOLOGY","ID_OPHTHALMOLOGY","ID_ORTHOPAEDICS","ID_OTOROHINOLARYNGOLOGY","ID_PAEDIATRICS","ID_PULMONOLOGY","ID_PRIMARY_CARE","ID_PSYCHIATRY","ID_RADIOLOGY","ID_RHEUMATOLOGY","ID_SURGERY","ID_TROPICAL_AND_HUMANITARIAN_MEDICINE","ID_UROLOGY","ID_RARE_DISEASES","DevelopmentPhase","ID_DISCOVERY","ID_PROTOTYPING","ID_CLINICAL_DEVELOPMENT","ID_CANDIDATE","ID_CLINICAL_TRIALS","ID_APPROVAL","ID_PRODUCT","AcademicInstitutionGroup","ID_UNIVERSITIES","ID_UNIVERSITIES_OF_APPLIED_SCIENCES","ID_ETH","AcademicInstitution","academicInstitutionGroupId","ID_EPFL","ID_ETHZ","ID_UNI_ZH","ID_UNI_BS","ID_UNI_BE","ID_UNI_SG","ID_UNI_LU","ID_UNI_NE","ID_UNI_FR","ID_UNI_GE","ID_UNI_VD","ID_UNI_TI","ID_BFH","ID_FHNW","ID_ZFH","ID_HSLU","ID_FHO","ID_KALAIDOS","ID_HESSO","ID_SUPSI","ID_NONE","ID_PSI","ID_EMPA","TeamMemberType","ID_MEMBER","ID_ADVISORY_BOARD","ID_BOARD_OF_DIRECTORS","ProjectVisibility","ID_TITLE","ID_TITLE_SUBTITLE","ID_TITLE_SUBTITLE_DESCRIPTION","PatentState","ID_PLANNED","ID_FILED","ID_GRANTED","ID_NOT_PLANNED","FundingRound","ID_PRE_SEED","ID_SEED","ID_SERIES_A","ID_SERIES_B","ID_SERIES_C","ProjectValidationState","ID_DRAFT","ID_PENDING_VALIDATION","ID_PUBLISHED","ProjectPrize","ProjectPastFunding","source","amount","ProjectTeamMember","teamMemberTypeId","teamFunction","Project","projectValidationStateId","projectVisibilityId","academicInstitution1Id","academicInstitution2Id","patentStateId","logo","illustration","incorporationYear","isSpinOff","customAcademicInstitution","raisingFundsAmount","dateOfClosingRound","customFundingRound","isSeekingPartnerships","isOfferingLicensing","teamPicture","contactWebsite","contactFirstName","contactLastName","contactEmail","contactPhone","contactAddress","isLeadInvestorIdentified","isTTOAgreementAccepted","TTOContact","isInstitutionLicenseOwned","developmentPhaseUpdateDate","isRaisingFundsUpdateDate","isLeadInvestorIdentifiedUpdateDate","publishDate","pipeline","keywords","partnershipTerms","licensingOffer","biotechDirectoryUrl","projectTradeTypeId","ProjectMembership","ProjectCase_ProjectType","projectCaseId","ProjectCase_TherapeuticArea","DevelopmentPhase_ProjectTypeGroup","ProjectCase","title","subtitle","uniqueness","unmetNeed","marketSize","competition","User_AcademicInstitution","isDispatcher","MetricsRecord","tag","payload","TAG_PROJECT_SEEN","TAG_FAVORITE_ADDED","TAG_FAVORITE_REMOVED","Company","companyCompanyCategoryId","isDisplayedOnHomepage","noLogo","noWebsite","website","investmentComment","street1","street2","city","country","noContactInfos","isInvestingInPrivate","isInvestingInPublic","isCompleted","Company_TherapeuticArea","Company_DevelopmentPhase","Company_ProjectType","CompanyCompanyCategory","CompanyContact","Utils","EMAIL_REGEX","SWISS_PHONE_NUMBER_REGEX","INTERNATIONAL_PHONE_NUMBER_REGEX","URL_REGEX","arr","uniqueArr","indexOf","keyName","match","found","removeDuplicate","filterNull","values","removeDuplicates","searchItems","str","normalize","replace","toLowerCase","trim","a","b","nullAfter","Date","toISOString","now","Math","round","getTime","getTimezoneOffset","date","substr","adjustTimezone","ISODateToYmdHis","newDate","parts","split","dateParts","timeParts","parseInt","setHours","setMinutes","setSeconds","setMilliseconds","char","targetStrLength","toAddCount","dateStr","format","months","days","YmdHisToDate","dateTimestamp","getMinutes","yesterday","tomorrow","yesterdayTimestamp","tomorrowTimestamp","instant","hours","getHours","minutes","addTrailingChar","weekDay","getDay","year","getFullYear","month","getMonth","day","getDate","num","decimalsCount","formated","toFixed","buffer","charAt","floor","random","remainingMinutes","x","rulesString","fieldName","validReturn","isValid","messageKey","params","has","rules","rule","min","max","isIn","join","int","isNaN","float","regex","RegExp","translations","param","translation","lang","text","maxChars","options","ellipsize","ellipsisPosition","maxCharsHalf","models","langIds","nonTranslatableValues","nonTranslatableKeys","constructor","getNonTranslatableFields","translatableKeys","getTranslatableFields","k","reduce","acc","cur","ApiBaseService","_http","_conf","_utils","method","extra","callParams","headers","set","accessToken","resultType","responseType","log","encodeParams","post","buildFormData","put","delete","paramsElems","encodeURIComponent","paramsEncoded","getData","currentKey","keysStr","fileName","Array","concat","itemKey","dataValue","formData","FormData","append","KeyValueStorage","_memoryStore","_stores","initialize","fallback","store","STORE_MEMORY","STORE_SESSION","sessionStorage","clear","STORE_LOCAL","localStorage","ModelsStorage","_storage","modelClass","identifierValues","includeDeleted","fromIds","then","results","clone","catch","listOfIdentifierValues","table","TableStore","index","getRowIndex","forParams","ModelQuery","keepDeleted","getTableStore","updateOrAdd","save","model","select","where","equals","in","STORAGE_PREFIX","STORAGE_TYPE","storage","getName","keyFields","getStatic","getKeyFields","getIdentifierValues","getIndexNameFromModel","indexName","reindex","fromRowIndex","getIndexNameFromValues","columns","getFields","_classItem","_includeDeleted","column","_clause","QueryClause","direction","_orderBy","howMany","from","matchCounter","loop","dataLength","resultLength","hasWhatWhoWhen","orderItems","forModelClass","clause","columnType","orderItemsNumerically","orderItemsAlphabetically","sort","reverse","aString","bString","builder","_clauses","groupingPattern","_operators","val1","val2","_matchCache","_builder","newClause","on","operator","addClause","setClause","orderBy","matchByDefault","doesMatch","clauseMatch","data1","getMatchCache","data2","getMatchingItems","revertOperator","fakeColumn","data1Column","data2Column","matchingItems","CurrentUser","_api","_keyValueStore","_loginRequest","_hasPendingRequest","password","remember","isLoggedIn","grant_type","client_id","client_secret","username","scope","retrieveUser","access_token","_accessToken","saveAccessToken","originalError","retrieveAccessToken","reset","user","resetUrl","token","password_confirmation","remembe","login","LangsProvider","_currentUser","browserLang","getBrowserLang","langRegex","getLangCodes","findIn","getBestLangCode","langs","ProjectsProvider","_langs","ILLUSTRATION_MAX_SIZE","ILLUSTRATION_MAX_HEIGHT","ILLUSTRATION_MAX_WIDTH","ILLUSTRATION_FILE_TYPES","projectFiltersState","sortIndex","forEach","group","types","findManyIn","institutions","groupIds","getKeyValues","developmentPhase","groups","projectTypeIds","project","buildModelParams","getLangIds","getAccessToken","projectTranslations","fileGroup","memberships","fromAPIList","projectMemberships","projectCase","projectType","therapeuticArea","groupedProjectType","groupBy","groupedTherapeuticArea","emptyProjectType","emptyTherapeuticArea","saveProjectTypes","saveTherapeuticAreas","projectCaseTranslations","toDelete","ProjectCase_ProjectTypes","projectCase_projectTypes","therapteuticAreaIds","ProjectCase_TherapeuticAreas","projectCase_therapeuticAreas","prizes","projectPrizes","oldPrizes","fundings","projectPastFundings","members","projectTeamMembers","files","and","favorite","isFavorite","projectFavorite","newState","fromId","deleteOn","deleteMultipleOn","singleProjectCase","projectTypesCount","therapeuticAreasCount","teamMembersCount","seriesNames","viewsRecords","record","favoritesRecords","unfavoritesRecords","investorsIndex","investorsRecords","investorProfile","fromDate","toDate","DateToYmdHis","viewsData","series","buildChartSeries","investorsData","bookmarksData","chart","viewsPie","buildPieData","investorsPie","favoritesPie","records","soustractRecords","dailyData","_records","_soustractRecords","dateAtMidnight","toDateTmp","setDate","toTimestamp","dayData","row","formatDate","weeklyData","companyCategories","category","computedRecords","companyCategoryId","SyncServiceProvider","_pollId","_pollInterval","_intervals","_default","commonData","userData","_syncTimestamps","_listeners","sync","setInterval","clearInterval","stop","start","force","fromTimestamp","listener","randomString","node","interval","timestamp","since","canSync","getSyncParams","fileFamilies","fileFamilyTranslations","fileTypes","fileTypeTranslations","userLinks","userLinkTranslations","companyCategoryGroups","companyCategoryGroupTranslations","companyCategoryTranslations","investorValidationStates","investorValidationStateTranslations","projectTypeGroups","projectTypeGroupTranslations","academicInstitutionGroups","academicInstitutionGroupTranslations","projectTypes","projectTypeTranslations","therapeuticAreas","therapeuticAreaTranslations","developmentPhases","developmentPhaseTranslations","academicInstitutions","academicInstitutionTranslations","teamMemberTypes","teamMemberTypeTranslations","projectVisibilities","projectVisibilityTranslations","patentStates","patentStateTranslations","projectValidationStates","projectValidationStateTranslations","fundingRounds","fundingRoundTranslations","developmentPhase_projectTypeGroups","companies","companyCompanyCategories","companyCompanyCategoryTranslations","projectTradeTypes","projectTradeTypesTranslations","notify","syncApi","users","discussions","discussionMessages","fileGroups","privateDiscussions","privateDiscussion_users","user_userLinks","likeCounters","likeCounter_users","tags","tagTranslations","investorProfiles","therapeuticAreaOfInterests","projectFavorites","alerts","alert_academicInstitutions","alert_developmentPhases","alert_fundingRounds","alert_projectTypes","alert_therapeuticAreas","projects","developmentPhaseOfInterests","user_academicInstitutions","metricsRecords","company_therapeuticAreas","company_developmentPhases","companyContacts","company_projectTypes","rawData","TranslateCutPipe","separator","Number","ProjectsRegisterDialogComponent","dialog","utils","_projectsProvider","_sync","_toaster","_data","NAME_MAX_LENGTH","EMAIL_MAX_LENGTH","PASSWORD_MAX_LENGTH","PASSWORD_MIN_LENGTH","EXCLUDED_INSTITUTION1_GROUP_IDS","showPassword","firstNameFormControl","required","maxLength","lastNameFormControl","emailUnavailableError","emailFormControl","pattern","control","unavailable","valid","passwordFormControl","minLength","terms","academicInstitionGroups","loadStaticData","onError","register","afterClosed","navigate","close","open","duration","updateValueAndValidity","getAcademicInstitionGroups","registerAccount","status","errors","onEmailChanged","onRegisterClicked","InvestorsProvider","COMPANY_NAME_MAX_LENGTH","COMPANY_DESCRIPTION_MAX_LENGTH","COMPANY_INVESTMENT_COMMENT_MAX_LENGTH","COMPANY_CONTACT_NAME_MAX_LENGTH","COMPANY_CONTACT_EMAIL_MAX_LENGTH","COMPANY_CONTACT_PHONE_MAX_LENGTH","COMPANY_CONTACT_DEFAULT_TEXT_LENGTH","COMPANY_LOGO_MAX_SIZE","COMPANY_LOGO_MAX_HEIGHT","COMPANY_LOGO_MAX_WIDTH","COMPANY_LOGO_FILE_TYPES","investorFiltersState","categories","updateInvestorAlert","therapeuticAreaIds","developmentPhaseIds","stateId","company","newCompany","company_threapeuticAreas","projectTypesIds","companyProjectTypes","toSave","relatedData","alert","InvestorsRegisterDialogComponent","_investorsProvider","_changeDetector","password2FormControl","companyFormControl","valueChanges","detectChanges","onCompanyChanged","ProjectsCreateDialogComponent","nameFormControl","saveProject","onSaveClicked","UsersProvider","newPassword","currentPassword","addMissing","user_userLink","userLink","membership","projectMembership","isNew","isAvailable","profiles","currentUser_academicInstitutions","AcventuresNavigationProvider","_usersProvider","_dialoger","_searchProjectsMenu","_projectsPendingValidationMenu","_projectsDraftsMenu","_searchInvestorsMenu","_investorsPendingValidationMenu","_guestUsersMenu","_localExpertUsersMenu","_adminUsersMenu","_companiesMenu","_exportUsersMenu","onClicked","onExportUsersMenuClicked","_menus","updateAdminMenus","updateInvestorMenus","updateProjectHolderMenus","updateLocalExpertMenus","some","menus","exportUsers","addExternalLinks","profile","chipColor","translateFadeBeforeAfterAnimation","height","AuthDialogComponent","currentUser","_route","_dialogRef","FLOW_DEFAULT","FLOW_LOGIN","FLOW_REGISTER","FLOW_UNAUTHORIZED","FLOW_RESET_PASSWORD","SLIDE_TRANSITION_DURATION","nextUrl","defaultNextUrl","passwordWrongError","passwordWrong","resetPasswordFormControl","resetPassword2FormControl","registerPasswordFormControl","registerFirstNameFormControl","registerLastNameFormControl","applicationMessageFormControl","isNewUser","isIHaveAnAccountText","emailStepState","passwordStepState","unauthorizedStepState","forgotPasswordState","resetPasswordState","registerStepState","rememberMe","resetPasswordToken","showLoginPassword","showResetPasswordPassword","retrieveParams","startLoggedFlow","checkResetPassword","selectFlow","blur","hasError","checkEmail","flow","checkPassword","use","setValue","sendPasswordResetEmail","invalid","resetPassword","redirectUser","location","href","queryParamMap","resetPasswordUrl","origin","getBestLangId","emailControl","nativeElement","focus","passwordControl","resetPasswordControl","registerFirstNameControl","dialogContainer","scrollTop","navigateByUrl","AuthComponent","detectPasswordResets","UsersUserMenuComponent","loginText","loginNextUrl","HeaderComponent","backMenu","pageTitle","pageSubtitle","hasSideMenu","headerMarginBottom","logoAlwaysDisplayed","hasScrolled","evend","getElementsByTagName","AcventuresCommonCompanyLogosComponent","navigation","currentIndex","aIndex","bIndex","nextSlideTimestamp","sliderTimer","intervalId","startSlider","stopSlider","updateABIndexes","onNextClicked","AcventuresCommonHomeComponent","tryRedirection","tryRedirect","loadData","AcventuresCommonHomeShowroomComponent","orientation","AcventuresCommonHomeShowroomDialogComponent","showRoomsData","onPreviousClicked","InvestorsHomeIntroductionComponent","showRoomMode","ProjectsHomeIntroductionComponent","InfoDialogComponent","texts","FooterComponent","hasLeftMenu","faFacebook","faTwitter","faLinkedin","HomePageComponent","_title","setTitle","querySelector","scrollIntoView","behavior","notIn","onCallToAction1Clicked","onCallToAction2Clicked","onCreateInvestorAccountClicked","onCreateProjectAccountClicked","Error401Component","actions","Error401PageComponent","Error404Component","Error404PageComponent","UsersChangePasswordDialogComponent","_users","currentPasswordFormControl","wrong","newPassword1FormControl","newPassword2FormControl","checkPasswords","pristine","changePassword","onPassword1Change","ConfirmDialogComponent","confirmText","confirmActionText","confirmColor","confirm","confirmed","onConfirmClicked","_params","_see","_edit","_delete","_seeEditForm","_validate","evaluateAdmin","evaluateInvestor","evaluateGuest","evaluateProjectHolder","HasPendingChangesGuard","_changes","route","state","hasPendingChanges","component","nextState","warned","warn","onLeaveConfirmed","unregisterChanges","ModuleContentComponent","tooltipText","moreMenus","shortcutMenus","mainActions","mainActionsPosition","coverImage","coverImageFit","coverImageBackgroundColor","loaderPosition","disableMainActionsWhenLoading","menu","onClick","_originalData","_sortDefinitions","_sortState","count","sortBy","asc","desc","filtered","el","replaceAllWith","AlertsProvider","ids","oldItems","newItems","fundingRoundIds","academicInstitutionIds","DateClosestPipe","AlertsListComponent","_alertsProvider","dataSource","alertTooltip","initDataSource","active","deleteAlert","sorter","paginator","addSortDefinition","sortRow","rows","remove","InvestorsEditInvestorProfileComponent","_changesGuard","investmentRangeFromFormControl","checkInvestmentRange","isInteger","integer","investmentRangeToFormControl","therapeuticAreaFormControl","developmentPhaseFormControl","acceptedToBeContacted","investorProfileChange","therapeuticAreaIdsChange","developmentPhaseIdsChange","onFormChanged","developmentPhasesWithAssociatedProjectTypeGroups","linkedCompany","_investorProfile","_therapeuticAreaIds","_developmentPhaseIds","_investorRights","investorRights","updateRights","fireChange","registerChanges","emit","_onFormChanged","accepted","validateProfile","queryParams","backUrl","backTitle","getDevelopmentPhasesWithAssociatedProjectTypeGroups","disable","EDIT","enable","inconsistency","onAllTherapeuticAreasClicked","onNoTherapeuticAreasClicked","onInvestmentRangeChanged","UserRights","_addAdmin","_addGuest","_addLocalExpert","_changePassword","evaluateOther","subjectUser","PageContentComponent","SideMenuComponent","isMenuVisibleOnSmallScreen","currentUrl","_menuGroups","menuGroups","stopPropagation","onToggleMenuClicked","InvestorsInvestorStateIndicatorComponent","investorsProvider","STATE_ID_PENDING_VALIDATION","STATE_ID_ACCEPTED","STATE_ID_REFUSED","displayMode","loadState","placeholder","INPUT_IMAGE_VALUE_ACCESSOR","useExisting","multi","InputImageComponent","ERROR_EXTENSION","ERROR_SIZE","imageConf","current","new","errorCode","hintLeft","imageHost","allowedExtensions","maxFileSize","imageChange","change","imageFormControl","_required","_disabled","onChange","_","onTouched","disabled","setValidators","clearValidators","fn","openFileBrowser","removeImage","selectFile","fileInput","click","fileExtension","getFileExtension","fileSize","reader","FileReader","previewImage","readAsDataURL","textInput","onFileSelectionChange","MainActionComponent","onAction","right","bottom","color","UsersEditPageComponent","investorProvider","DESCRIPTION_MAX_LENGTH","hierarchy","isError404","isFromModerators","phoneFormControl","langFormControl","introFormControl","userLinkFormControls","avatarImage","userLinksData","therapeuticAreaIdsOfInterest","developmentPhaseIdsOfInterest","userRights","initPage","investorForm","isAddressValid","markAsTouched","validateFields","canSave","initNav","snapshot","deleteUser","initForms","userName","onChangePasswordClicked","updateMenus","startsWith","wrongLink","getLangs","parseUrl","getUserUserLinksData","evaluate","param1","path","saveUser","saveInvestorProfile","saveTherapeuticAreaOfInterests","saveDevelopmentPhaseOfInterests","LogoutPageComponent","logout","restart","_listProjects","_listProjectMemberships","_addProjectMembership","_deleteProjectMembership","_addToFavorites","_addAlerts","_askForReview","_seeTTOInformation","_seeMetasInforomation","_editAcademicInstitution1","_seeDashboard","evaluateLocalExpert","FilesProvider","api","noCache","downloadApi","callback","imageData","downloadFile","fileData","addEventListener","ProjectsEditProjectAcademicComponent","_filesProvider","CUSTOM_INSTITUTION_MAX_LENGTH","INSTITUTION_OTHER","academicInstitution1FormControl","academicInstitution2FormControl","customAcademicInstitutionFormControl","ttoContactFormControl","projectChange","_project","_rights","manageAcademicInstitutionStuff","rights","EDIT_ACADEMIC_INSTITUTION_1","onAcademicInstitutionChanged","onIsInstitutionLicenseOwnedChanged","onIsTTOAgreementAcceptedChanged","TRUE_FALSE_RADIO_VALUE_ACCESSOR","TrueFalseRadioComponent","label","trueLabel","falseLabel","valueChange","_value","_internalValue","val","PUBLIC_PRIVATE_RADIO_VALUE_ACCESSOR","PublicPrivateRadioComponent","ProjectsEditProjectSituationComponent","_langsProvider","_dateAdapter","FUNDING_ROUND_OTHER","CUSTOM_FUNDING_ROUND_MAX_LENGTH","isIncorporated","incorporationYearFormControl","projectTradeType","projectTradeTypeFormControl","fundingRoundFormControl","customFundingRoundFormControl","fundingAmountFormControl","closingRoundDateFormControl","closingRoundMinDate","closingRoundMaxDate","setLocale","onIsIncorporatedChanged","onProjectTradeTypeChanged","onfundingRoundNoneClicked","ProjectsEditProjectFundingComponent","projectsProvider","PRIZE_MAX_LENGTH","SOURCE_MAX_LENGTH","prizesFormControls","pastFundingsFormControls","prizesChange","pastFundingsChange","_isPrizesEdited","_isPastFundingsEdited","_prizes","_pastFundings","buildPrizesFormControls","pastFundings","buildPastFundingFormControls","amountFormControl","sourceFormControl","prizeId","onPrizesFormChanged","pastFoundingId","onPastFundingsFormChanged","fireChangePrizes","fireChangePastFundings","controls","onAddPrizeClicked","onAddPastFundingClicked","prizeName","prize","sourceName","funding","ProjectsEditProjectMiscellaneousComponent","ProjectsEditProjectPartnershipComponent","PARTNERSHIP_TERMS_MAX_LENGTH","OUTLICENSING_MAX_LENGTH","isSeekingPartnership","partnershipTermsFormControl","outlicensingFormControl","NamePickerComponent","explaination","onTyped","FilesImageViewerDialogComponent","_files","isDownloadLoading","loadImage","onDownloadClicked","FileSizePipe","units","unit","unitIndex","FilesFilesComponent","editionLevel","EDITION_LEVEL_NONE","filesChange","isDisabled","hideIconColumn","hideTypeColumn","hideChangedColumn","hideSizeColumn","isFoldersEnabled","hideHeaders","hideHeadersWhenEmpty","hintLabel","onItemRemoved","onItemAdded","onItemRenamed","filesDataSource","foldersStack","_types","_families","_isReady","_pendingData","parseValue","initDatasource","loadFileTypes","EDITION_LEVEL_ALL_FILES","EDITION_LEVEL_OWN_FILES","newName","folder","newFiles","buildFile","openImage","openFolder","folderId","folderData","folderFiles","NaN","buildFileRow","newStack","nextFolder","family","findIcon","isDownloadable","getFileEditionLevel","rowIndex","rawFile","fileId","parseRawFileName","fileType","parseRawType","dotIndex","lastIndexOf","mime","onNewFileSelected","ProjectsEditProjectProjectComponent","SUBTITLE_MAX_LENGTH","BIOTECH_URL_MAX_LENGTH","UNIQUENESS_MAX_LENGTH","PIPELINE_MAX_LENGTH","UNMET_NEED_MAX_LENGTH","MARKET_SIZE_MAX_LENGTH","COMPETITION_MAX_LENGTH","KEYWORDS_MAX_LENGTH","FILES_EDITION_LEVEL","FILE_MAX_SIZE","showMore","pipelineFormControl","keywordsFormControl","projectTypeFormControl","biotechUrlFormControl","logoPreview","logoImageData","illustrationPreview","illustrationImageData","initPreviewImage","loadFiles","updateFiles","addFiles","deleteFile","left","top","updateFile","onToggleShowMore","ProjectsEditProjectTeamComponent","FUNCTION_MAX_LENGTH","WEBSITE_MAX_LENGTH","PHONE_MAX_LENGTH","ADDRESS_MAX_LENGTH","IMAGE_MAX_SIZE","IMAGE_MAX_HEIGHT","IMAGE_MAX_WIDTH","teamMemberFormControls","boardMemberFormControls","directorsMemberFormControls","teamImagePreview","teamImageData","contactFirstNameFormControl","contactLastNameFormControl","contactEmailFormControl","contactWebsiteFormControl","contactPhoneFormControl","contactAddressFormControl","teamMembersChange","_isTeamMembersEdited","_teamMembers","fireChangeProject","teamMembers","buildTeamMembersFormControls","functionFormControl","addMemberFormControl","onTeamMembersFormChanged","fireChangeTeamMembers","formControls","teamMemberId","itemControl","checkNameControl","teamControls","boardControls","directorsControls","onAddTeamMemberClicked","onAddBoardMemberClicked","onAddDirectorsMemberClicked","teamMember","buildTeamMember","functionName","testedControl","relatedControl","onProjectFormChanged","ProjectsAskChangesDialogComponent","MESSAGE_MAX_LENGTH","messageFormControl","ProjectsEditProjectReviewComponent","STATE_ID_DRAFT","STATE_ID_REVIEW","STATE_ID_PUBLISHED","mandatoryFields","onAskedForReview","missingMandatoryFields","fields","formControl","stepIndex","stepName","fieldId","stepper","selectedIndex","getElementById","validateProject","RichTextEditorComponent","quillConfig","toolbar","list","styles","width","minHeight","fontSize","changeFunction","onContentChanged","ProjectsEditProjectCaseComponent","TITLE_MAX_LENGTH","REVIEW_IDENTIFIER","titleFormControl","subtitleFormControl","descriptionFormControl","uniquenessFormControl","unmetNeedFormControl","marketSizeFormControl","competitionFormControl","patentStateFormControl","_projectTypeIds","onProjectCaseProjectTypeChange","onProjectCaseTherapeuticAreaChange","onAddProjectCase","onRemoveProjectCase","_projectCase","_projectCaseProjectType","_projectCaseTherapeuticArea","projectCaseProjectType","projectCaseTherapeuticArea","onProjectTypeIdChanged","groupData","selectedItems","field","getProjectTypeGroups","itemId","newItem","areas","onAllProjectTypesClicked","onNoProjectTypesClicked","ProjectsEditPageComponent","isSaveLoading","is401","is404","listingProgress","groupedProjectCaseProjectType","projectCases","lastUpdater","_user_academicInstitutions","selectionChange","scrollToStep","loadProject","onStepChanged","initFormFields","reviewComponent","updateMissingMandatoryFields","updateListingProgress","casesComponents","element","situationComponent","fundingComponent","partnershipComponent","projectComponent","teamComponent","academicComponent","canProjectCasesSave","deleteProjectCase","identifier","projectCasesId","prefix","projectCaseComponent","toArray","findIndex","askForReview","SEE_EDIT_FORM","deleteProject","diff","next","previous","saveProjectCase","shouldSaveCases","saveProjectPrizes","saveProjectPastFundings","saveProjectTeamMembers","saveAcademicInsitution1","nextResults","computeListingProgress","ListBaseComponent","INVESTOR_VALIDATION_STATE_PENDING","INVESTOR_VALIDATION_STATE_ACCEPTED","toggleProjectFavorite","ProjectsFilterBlockComponent","_projectProvider","isInvalid","_selectionLabel","onEditClicked","onDeleteClicked","ProjectCasesListComponent","INCORPORATION_YEAR_MIN","INCORPORATION_YEAR_MAX","TARGETED_INCORPORATION_YEAR_MIN","TARGETED_INCORPORATION_YEAR_MAX","AMOUNT_RAISED_MIN","AMOUNT_RAISED_MAX","MAX_PROJECT_TYPES_DISPLAYED","isReady","isAlertLoading","disableSearchEngine","moduleTitle","hideLogoColumn","hideNameColumn","hideProjectColumn","hideProjectTypeColumn","hideActionsColumn","preserveFilters","onRowClicked","onFavoriteClicked","searchInput","projectTypesCheckboxes","filteredProjectTypes","therapeuticAreasCheckboxes","filteredTherapeuticAreas","developmentPhasesCheckboxes","filteredDevelopmentPhases","fundingRoundsCheckboxes","filteredFundingRound","filteredOthers","collaborationSelectionLabel","moreFiltersSelectionLabel","yearOfIncorporationToFormControl","checkMinMaxFormControl","yearOfIncorporationFromFormControl","targetedYearOfIncorporationToFormControl","targetedYearOfIncorporationFromFormControl","amountRaisedToFormControl","amountRaisedFromFormControl","fundingRound","projectCaseProjectTypes","projectCaseTherapeuticAreas","_projects","_allRows","_projectCases","buildDataRows","applyFilters","initColumns","getFiltersStateFromAlert","initFilters","saveFiltersState","normalizeString","SEE","switchAllCheckboxesWithGroup","switchAllCheckboxes","toggleFilterSelection","area","phase","selectionLabels","saveAlert","isMoreFiltersValid","checkAgainst","areFiltersValid","matchFilterSomeList","matchFilterCollaboration","matchFilterMoreFilters","projectCaseIds","projectIds","pageIndex","filtersState","onMoreFiltersItemClicked","filterPredicate","includes","searchInputChanged","targetControl","minControl","maxControl","minFallback","maxFallback","consistency","filters","_keys","matchFilterYesNo","matchPrivateCompanyFilter","matchPublicCompanyFilter","yesValue","noValue","actualValue","savedAlert","saveAlertProjectTypes","saveAlertTherapeuticAreas","saveAlertDevelopmentPhases","saveAlertFundingRounds","FullWidthLoaderComponent","position","anchor","ProjectsProjectsPageComponent","ngAfterViewInit","AlertsAlertsPageComponent","ProjectsListComponent","hideWebsiteColumn","institution1","FavoritesListComponent","deleteFavorite","ProjectsFavoritesPageComponent","EllipsizePipe","ExtensiblePComponent","isExtended","_text","ItemListDialogComponent","ProjectsViewProjectCaseComponent","P_MAX_LENGTH","MAX_ITEMS_TO_DISPLAY","ProjectsProjectPageComponent","_currencyPipe","INSTUTION_ID_NONE","isFavoriteLoading","patentState","academicInstitution1Title","academicInstitution1","academicInstitution2","boardMembers","directorsMembers","projectCaseView","upcomingFundingItems","allPatentStates","addProjectMetrics","illustrationInput","updateIllustration","dateToday","find","updateAcademicInstitution1Title","prepareProjectCase","updatedProject","AlertsAlertPageComponent","loadAlertData","ProjectsPendingValidationPageComponent","onCompanyClicked","onDeleteRowClicked","InvestorsListComponent","companyCategoriesCheckboxes","filteredCompanyCategories","noDataMessage","hideValidationStateColumn","hideCompanyColumn","hideCreateDateColumn","hideContactableColumn","_investorProfiles","companyCategory","therapeuticAreasIdsOfInterest","developmentPhasesIdsOfInterest","validationState","therapeuticAreasOfInterest","developmentPhasesOfInterest","inFilterRange","filterFrom","filterTo","valueFrom","valueTo","companyCategoryIds","isNoNotForProfit","isNotSeekingPartnerships","InvestorsPendingValidationPageComponent","InvestorsInvestorsPageComponent","UsersAddUserDialogComponent","_fb","CHECK_EMAIL_THRESHOLD","infoMessage","_checkEmailAvailabilityRequestTimestamp","userForm","checkEmailAvailability","onAddClicked","UsersListComponent","addTitle","isAddEnabled","hideEmailColumn","hideActionsColumns","addMenu","UsersAdminPageComponent","addUser","createdUser","UsersGuestsPageComponent","ProjectsNotProjectYetPageComponent","TermsPageComponent","UsersLocalExpertsListComponent","AVOIDED_ACADEMIC_INSTITUTION_IDS","hideInstitutionsColumn","onAcademicInstitutionsChanged","_hasChanges","detailsRow","updateRow","expertInstitutions","institutionDetails","detail","institution","user_institutions","user_institution","UsersLocalExpertsPageComponent","saveUserRow","institutionRow","saveUserAcademicInstitutions","user_academicInsitutions","ProjectsDraftsPageComponent","ProjectsDispatchPageComponent","isError","sendNotification","checkRights","isAuthorized","dispatchNotification","ProjectsProjectStateIndicatorComponent","ProjectsDashboardOverviewComponent","ProjectsDashboardKeyDataComponent","onHelpClicked","isRaisingFundsEditMode","isLeadInvestorIdentifiedEditMode","Boolean","savedProject","ProjectsDashboardMetricsComponent","CHART_HEIGHT","chartData","serie1Name","serie2Name","serie3Name","serie1Color","serie2Color","serie3Color","customColors","pieColorScheme","viewsChartData","investorsChartData","bookmarksChartData","allData","getProjectChartData","filterData","ProjectsDashboardPageComponent","InvestorsHomePageComponent","ProjectsHomePageComponent","InvestorsWelcomePageComponent","hasTherapeuticAreaOfInterest","hasDevelopmentPhaseOfInterest","CompanyRights","_add","hasCompanyLink","InvestorsEditCompanyPageComponent","logoDisabled","companyData","formGroup","websiteFormControl","companyCategoryFormControl","investmentCommentFormControl","contactInformationFormControl","street1FormControl","street2FormControl","cityFormControl","countryFormControl","companyContactExists","companyContactFormControls","projectTypesIdsOfInterest","onlySelf","logoComponent","areContactInfosValid","companyContactId","validateRequiredFieldsForAdmin","saveCompany","collectData","deleteCompany","projectTypesOfInterest","makeCompanyFieldsRequired","contact","onAddCompanyContactFormControl","contacts","checkCompanyRequiredFields","saveCompanyTherapeuticAreas","saveCompanyDevelopmentPhases","saveCompanyProjectTypes","saveCompanyContacts","GuardsSequenceGuard","_injector","_guardsSequence","guards","runGuards","canActivate","NotificationsProvider","_notifications","notification","notifications","NotificationsTodosProvider","_todosCollectors","onCommonDataSynced","onUserDataSynced","updateTodos","replaceAll","collector","DiscussionsProvider","_privateDiscussionsData","_activePrivateDiscussions","_privateDiscussionsDataWithUnreadMessages","updatePrivateDiscussions","loadPrivateDiscussionsData","updateActivePrivateDiscussion","discussionMessage","privateDiscussion","isMinimized","updateLastSeen","privateDiscussion_user","usersData","randomId","tempPrivateDiscussion","newDiscussion","discussion","messages","unreadMessagesCount","savePrivateDiscussion","countUnreadMessages","hadUnreadMessages","activePrivateDiscussion","userIds","storageData","unreadCount","dataIndex","privateDiscussionData","privateDiscussionIds","notEquals","discussionIds","unreadData","sortPrivateDiscussionsData","aDate","bDate","IsAppReadyGuard","_todos","_discussions","initI18n","tryLoginFromRemember","initTodos","initDiscussions","onReady","addLangs","setDefaultLang","listeners","getSyncListeners","addSyncListener","IsLoggedInGuard","redirect","urlSegments","segment","promptLogin","IsAdminGuard","_isLoggedIn","UsersCanEditUserGuard","getUserId","HasHomepageRedirectGuard","paramsString","InviteUserDialogComponent","fb","submitted","inviteUserForm","updateUser","onInviteClicked","ProjectsMembershipsProvider","ProjectMembershipListComponent","projectsMembershipsProvider","displayedColumns","onAddMembershipClicked","canAddMembership","addMembershipMenu","getProject","onDataSortChange","ProjectsMembershipsPageComponent","_projectMembershipsProvider","userProvider","_membership","invite","MyStripHttpPipe","substring","onEditRowClicked","InvestorsListCompaniesComponent","hideCategoryColumn","hideIsDisplayedOnHomepageColumn","isClickable","_companies","filteredInvestingInPrivate","filteredInvestingInPublic","InvestorsCompaniesPageComponent","accessBlocked","isProjectValidated","CanSeeCompanies","canAccess","InvestorsCompanyPageComponent","CanSeeCompany","hasLink","InvestorsDashboardPageComponent","ROUTES","canDeactivate","APP_RESOLVER_PROVIDERS","DataResolver","of","res","DataListComponent","rowsData","SafePipe","_sanitizer","bypassSecurityTrustResourceUrl","EmbedMapComponent","sanitizer","apiKey","query","zoom","isActivated","showHint","_iframeBaseUrl","SliderControlComponent","currentItemChange","itemsCount","onSlided","_currentItem","currentItem","WorkspaceSelectorComponent","activeWorkspaceLogo","activeWorkspaceName","_workspaces","workspaces","updateActiveWorkspace","initWorkspaces","AutoLinkerPipe","AutoLinker","DurationPipe","input","output","precision","conversion","miliseconds","divider","seconds","weeks","to","itemsPerPageLabel","nextPageLabel","previousPageLabel","lastPageLabel","firstPageLabel","getRangeLabel","page","pageSize","translate","startIndex","onLangChange","translateLabels","DISCUSSION_MESSAGE_VALUE_ACCESSOR","DiscussionsMessageComponent","DELETE_MESSAGE_PATTERNS","DeleteMessagePattern","isAuthor","author","deleteMessagePattern","NONE","onDeleteMessage","loadMessage","DiscussionsDiscussionComponent","newMessagePlaceholder","disableNewMessage","sendAPI","deleteAPI","newMessageDisableMessage","isStacked","isStackable","isShowMore","messagesDisplayedCount","noMessageText","autoScrollToBottom","focusMessageInputOnLoad","inputMaxRows","newMessage","messagesScrollTop","_syncListenerId","_syncMaxId","_discussionId","loadDiscussion","scrollToBottom","focusInput","removeSyncListener","sendNewMessage","deleteMessage","messageInput","pushMessage","initSync","checkForNewMessages","greater","newMessages","hasNewMessage","newSyncMaxId","alreadyIn","DiscussionsPrivateDiscussionWindowComponent","activePrivateDiscussionChange","onClose","discussionName","_activePrivatediscussion","updateDiscussionName","discussionComponent","DiscussionsEditGroupDialogComponent","MAX_LENGTH","usersDataSource","usersColumns","_privateDiscussion","usersPaginator","startGroupDiscussion","isSelected","usersIds","onSubmitClicked","DiscussionsPrivateDiscussionsMenuComponent","discussionData","startOneToOneDiscussion","closePrivateDiscussion","LikeCountersProvider","like","likeCounter_user","LikeCountersLikeCounterComponent","_likeCounters","MAX_DISPLAYED_LIKERS","isUserLiking","likers","likersNames","likeAPI","likeCounterIdChange","userChange","onLikeChanged","_likeCounterId","_user","updateIsUserLiking","onLikeClicked","updateLikersNames","updateLike","onCounterClicked","NotificationsNotificationsMenuComponent","REVIEW_MARK_SELECT_VALUE_ACCESSOR","ReviewMarksReviewMarkSelectComponent","minValue","maxValue","lowerIcon","greaterIcon","onSelectEvent","availableMarks","roundedValue","writeValue","onSelect","TagsTagComponent","textColor","actionIcon","actionTooltip","action","TagsTagPickerComponent","submitText","tagNameFormControl","availableColors","selectColor","add","TAG_SELECT_VALUE_ACCESSOR","TagsTagSelectComponent","onUnselectEvent","getSelectionIndex","onUnselect","BehaviorSubject","_count","UsersUserProfileDialogComponent","loadUserLinks","UsersUserStickerComponent","isEmailVisible","isRegistrationDateVisible","legend","avatarHideable450","avatarOnly","avatarOnlyTooltip","UsersPickUsersDialogComponent","availableUsersDataSource","availableUsers","loadDataSource","getSelectedUsers","selected","UsersUserPickerComponent","pickedUserChange","userPicked","userFormControl","checkUser","exists","filteredUsers","_pickedUser","startWith","filterUsers","option","pickedUser","getUserName","onSearchChanged","onUserSelected","RichTextEditorModule","forRoot","createTranslateLoader","http","APP_PROVIDERS","AppModule","useFactory","service","injectTranslateService","deps","useHash","preloadingStrategy","loader","main","modulePromise","bootstrapModule","readyState","_domReadyHandler","removeEventListener","webpackEmptyAsyncContext"],"mappings":"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ACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,CACI/uE,QAAS,IACTivE,WAAa3J,IACT,MAAM4J,EAAU,IAAI,GAEpB,OADAA,EAAQC,uBAAuB7J,GACxB4J,GAEXE,KAAM,CAAC,OAEd,SAtEQ,CACL,IACA,IACA,IACA,IACA,IACA,IAAaR,QAAQ1M,GAAQ,CACzBmN,SAAS,EACTC,mBAAoB,MAExB,EACA,KACA,KACA,KACA,KACA,KACA,GACA,IAAgBV,QAAQ,CACpBW,OAAQ,CACJvvE,QAAS,IACTivE,WAAY,GACZG,KAAM,CAAC,IAAY,MAG3B,S,GAgDD,GCxdA,SAASI,KACZ,IAAIC,EAAiD,KAuBrD,OAFAA,EAAgB,MAAyBC,gBAAgB,IAElDD,EAAcluD,KAAKvlB,EAAYI,mBAAmBslB,MAAOvmB,GAAQC,QAAQ3C,MAAM0C,IAO1F,Q,gDDyba,GAAS,eArMd,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IAA2C,SAM3C,IACA,IACA,IACA,IACA,IAAgB,IAKhB,EACA,KACA,KACA,KACA,KACA,KACA,GAAoB,IAQpB,Q,KAtHA,GAA2B,qBAuD3B,IAAyB,KAlFzB,GACA,K,KAgGA,GAAyB,CAvFzB,GA6BA,GA/BA,GAAe,IA4Cf,GAAsC,gBAVtC,GAAmC,QACnC,GAhCA,GAAsB,QAiCtB,GAGA,GAFA,GAGA,GAGA,GAFA,GA3BA,GAPA,GACA,GAPA,GAKA,IAAwB,KAdxB,KCxPAnD,SAAS23E,YACb,IAAK,UACD33E,SAASq8C,iBAAiB,oBAQlC,SAASu7B,IACL53E,SAAS63E,oBAAoB,mBAAoBD,GAAkB,GACnEJ,QAVoE,GAChE,MACJ,IAAK,cACL,IAAK,WACL,QACIA,O,mBCvDR,SAASM,EAAyBn0E,GAGjC,OAAOhE,QAAQC,UAAU2pB,MAAK,WAC7B,IAAIhqB,EAAI,IAAImB,MAAM,uBAAyBiD,EAAM,KAEjD,MADApE,EAAEuE,KAAO,mBACHvE,KAGRu4E,EAAyB/zE,KAAO,WAAa,MAAO,IACpD+zE,EAAyBl4E,QAAUk4E,EACnCz4E,EAAOD,QAAU04E,EACjBA,EAAyBl0E,GAAK","file":"main.47a1cf8343a9ade6f85e.bundle.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\t0: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({}[chunkId]||chunkId) + \".\" + {\"4\":\"cf9398536d8aea193d06\"}[chunkId] + \".chunk.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([\"iTwO\",2]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn-bd\": \"loYQ\",\n\t\"./bn-bd.js\": \"loYQ\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-in\": \"7C5Q\",\n\t\"./en-in.js\": \"7C5Q\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./en-sg\": \"t+mt\",\n\t\"./en-sg.js\": \"t+mt\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-mx\": \"tbfe\",\n\t\"./es-mx.js\": \"tbfe\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fil\": \"1ppg\",\n\t\"./fil.js\": \"1ppg\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-deva\": \"qvJo\",\n\t\"./gom-deva.js\": \"qvJo\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./oc-lnc\": \"Fnuy\",\n\t\"./oc-lnc.js\": \"Fnuy\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tk\": \"Wv91\",\n\t\"./tk.js\": \"Wv91\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-mo\": \"OmwH\",\n\t\"./zh-mo.js\": \"OmwH\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\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 = \"RnhZ\";","/* tslint:disable */\nimport { enableProdMode, NgModuleRef } from '@angular/core';\nimport { disableDebugTools } from '@angular/platform-browser';\nimport { Environment } from './model';\n\nenableProdMode();\n\n// export const ENV_FIREBASE_CONFIG: any = FIREBASE_CONFIG;\n\nexport const environment: Environment = {\n production: true,\n stage: 'prod',\n showDevModule: false,\n\n /** Angular debug tools in the dev console\n * https://github.com/angular/angular/blob/86405345b781a9dc2438c0fbe3e9409245647019/TOOLS_JS.md\n * @param modRef\n * @return {any}\n */\n decorateModuleRef(modRef: NgModuleRef) {\n disableDebugTools();\n return modRef;\n },\n ENV_PROVIDERS: []\n};\n","// TODO work in progres ...\nimport { animate, group, query, style, transition, trigger } from '@angular/animations';\n\nexport const routerTransition = trigger('routerTransition', [\n transition('* <=> *', [\n /* order */\n // * 1 */ query(':enter, :leave', style({ position: 'fixed', width: '100%', height: '100%', opacity: '0' }), { optional: true }),\n /* 2 */ group([\n query('.routerTransitionClassEnter', [\n style({transform: 'translateX(100%)', opacity: '1'}),\n animate('1.3s ease-in-out', style({transform: 'translateX(0%)'}))\n ],\n {optional: true}\n ),\n query('.routerTransitionClassLeave', [\n style({transform: 'translateX(0%)'}),\n animate('1.3s ease-in-out', style({transform: 'translateX(-100%)'}))\n ],\n {optional: true}\n )\n ])\n ])\n]);\n","import { Injectable } from '@angular/core';\nimport { environment } from '../environments/environment';\n\n@Injectable()\nexport class Conf {\n\n //\n //\n // MISC\n //\n //\n\n public prodMode: boolean;\n public platformName: string = 'Swiss Biotech Ventures';\n public googleMapsApiKey: string = '';\n public developer: string = 'tokiwi';\n public developerLink: string = 'https://tokiwi.ch';\n public isRegistrationDisabled: boolean = true;\n public helpEmail: string = null;\n\n //\n //\n // URLs & APIs\n //\n //\n\n public apiRootUrl: string;\n public storageRootUrl: string;\n public apiPasswordGrantClient: number;\n public apiPasswordGrantSecret: number;\n public facebookPageUrl: string;\n public assetsUrl: string;\n public homepageRedirect: string;\n\n //\n //\n // STORAGE\n //\n //\n\n public defaultKeyValueStore = 'memory';\n\n //\n //\n // LOCALES\n //\n //\n\n public availableLangs: any[] = [\n {id: 1, name: 'English', code: 'en', dateLocale: 'en-GB'},\n // { id: 2, name: 'Français', code: 'fr', dateLocale: 'fr-FR' },\n // { id: 3, name: 'Deutsch', code: 'de', dateLocale: 'de-DE' }\n ];\n\n public defaultLang: any = this.availableLangs[0];\n\n //\n //\n // ENVIRONNEMENTS (constantes privées pour être utilisées par proxy)\n //\n //\n\n private _env: string = environment.stage;\n private _envConfigs: Object = {\n dev: {\n prodMode: false,\n apiRootUrl: '/api/',\n storageRootUrl: '/api/storage/',\n assetsUrl: '/assets/res_8_5/',\n apiPasswordGrantClient: 4,\n apiPasswordGrantSecret: 'QBpuSvwmzzZvAHVr1RQIoWp04jH2xPBYH1s40BKg',\n facebookPageUrl: 'https://facebook.com',\n homepageRedirect: null,\n helpEmail: 'help@academic-ventures.org'\n },\n docker: {\n prodMode: false,\n apiRootUrl: '/api/',\n storageRootUrl: '/api/storage/',\n assetsUrl: '/assets/res_8_5/',\n apiPasswordGrantClient: 4,\n apiPasswordGrantSecret: 'QBpuSvwmzzZvAHVr1RQIoWp04jH2xPBYH1s40BKg',\n facebookPageUrl: 'https://facebook.com',\n homepageRedirect: null,\n helpEmail: 'help@academic-ventures.org'\n },\n staging: {\n prodMode: true,\n apiRootUrl: '/api/',\n storageRootUrl: '/api/storage/',\n assetsUrl: '/assets/res_8_5/',\n apiPasswordGrantClient: 4,\n apiPasswordGrantSecret: 'QBpuSvwmzzZvAHVr1RQIoWp04jH2xPBYH1s40BKg',\n facebookPageUrl: 'https://facebook.com/',\n homepageRedirect: null,\n helpEmail: 'help@academic-ventures.org'\n },\n prod: {\n prodMode: true,\n apiRootUrl: '/api/',\n storageRootUrl: '/api/storage/',\n assetsUrl: '/assets/res_8_5/',\n apiPasswordGrantClient: 4,\n apiPasswordGrantSecret: 'QBpuSvwmzzZvAHVr1RQIoWp04jH2xPBYH1s40BKg',\n facebookPageUrl: 'https://facebook.com/',\n homepageRedirect: null,\n helpEmail: 'help@academic-ventures.org'\n },\n };\n\n constructor() {\n this.prodMode = this._envConfigs[this._env].prodMode;\n this.apiRootUrl = this._envConfigs[this._env].apiRootUrl;\n this.storageRootUrl = this._envConfigs[this._env].storageRootUrl;\n this.assetsUrl = this._envConfigs[this._env].assetsUrl;\n this.apiPasswordGrantClient = this._envConfigs[this._env].apiPasswordGrantClient;\n this.apiPasswordGrantSecret = this._envConfigs[this._env].apiPasswordGrantSecret;\n this.facebookPageUrl = this._envConfigs[this._env].facebookPageUrl;\n this.homepageRedirect = this._envConfigs[this._env].homepageRedirect;\n this.helpEmail = this._envConfigs[this._env].helpEmail;\n }\n}\n","
\n
\n
\n
\n
\n
\n
{{ message | translate }}
\n
\n
\n","import { AfterViewInit, Component, Input } from '@angular/core';\nimport { Conf } from '../../../_conf';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'full-screen-loader',\n providers: [],\n styleUrls: ['./full-screen-loader.scss'],\n templateUrl: './full-screen-loader.html'\n})\nexport class FullScreenLoaderComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public progress: number = 0;\n @Input() public indeterminate: boolean = true;\n @Input() public message: string = 'Loading';\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","\n
\n \n
\n
\n \n
","import { filter } from 'rxjs/operators';\nimport { Component, OnInit } from '@angular/core';\nimport { NavigationEnd, NavigationStart, Router } from '@angular/router';\nimport { Location, PopStateEvent } from '@angular/common';\nimport { routerTransition } from './_common/animations/router-transition';\n\nexport const ROOT_SELECTOR = 'app';\n\n@Component({\n selector: 'app',\n providers: [],\n styleUrls: ['./app.component.css'],\n templateUrl: './app.component.html',\n animations: [routerTransition]\n})\nexport class AppComponent implements OnInit {\n\n public isLoading: boolean = true;\n\n private _lastPoppedUrl: string;\n private _yScrollStack: number[] = [];\n\n constructor(\n private _router: Router,\n private _location: Location\n ) {\n // Tant que la route n'est pas compl�tement load�e, on affiche un waiter\n // (c'est surtout utile pour laisser le temps � la synchronisation des donn�es de se faire)\n const loadingListener = this._router.events.pipe(\n filter((event) => event instanceof NavigationEnd))\n .subscribe((event) => {\n this.isLoading = false;\n loadingListener.unsubscribe();\n });\n }\n\n public ngOnInit() {\n this.fixScrollNavigationIssue();\n // permet de corriger le problème lorsqu'on navigue et que la nouvelle route\n // charge le même composant (la page n'est pas reloadée ...)\n // inspiré de : https://stackoverflow.com/a/45737269\n this._router.routeReuseStrategy.shouldReuseRoute = () => {\n return false;\n };\n }\n\n public getTransition(): string {\n // TODO pour pas calculer la transition toutes les 2ms,\n // peut �tre utiliser une variable qui se met � jour\n // quand on d�tecte un navigationStart/navigationEnd\n return 'todo';\n }\n\n private fixScrollNavigationIssue(): void {\n // r�soud le probl�me de la position du scroll quand on navigue d'une page � une autre.\n // (si sur une page on click sur un lien qui se trouve plus bas que la hauteur view port\n // et que le lien pointe vers une page plus grande que la hauteur du viewport\n // on arrive le scroll est conserv� ...)\n // doc : https://stackoverflow.com/questions/39601026/angular-2-scroll-to-top-on-route-change\n this._location.subscribe((ev: PopStateEvent) => {\n this._lastPoppedUrl = ev.url;\n });\n this._router.events.subscribe((ev: any) => {\n if (ev instanceof NavigationStart) {\n if (ev.url != this._lastPoppedUrl) {\n this._yScrollStack.push(window.scrollY);\n }\n } else if (ev instanceof NavigationEnd) {\n if (ev.url == this._lastPoppedUrl) {\n this._lastPoppedUrl = undefined;\n window.scrollTo(0, this._yScrollStack.pop());\n } else {\n window.scrollTo(0, 0);\n }\n }\n });\n }\n}\n\n/**\n * Please review the https://github.com/AngularClass/angular2-examples/ repo for\n * more angular app examples that you may copy/paste\n * (The examples may not be updated as quickly. Please open an issue on github for us to update it)\n * For help or questions please contact us at @AngularClass on twitter\n * or our chat on Slack at https://AngularClass.com/slack-join\n */\n","import { Injectable, NgModule } from '@angular/core';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { DateAdapter, MatNativeDateModule, MatRippleModule, NativeDateAdapter } from '@angular/material/core';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatStepperModule } from '@angular/material/stepper';\nimport { MatSelectModule } from '@angular/material/select';\n\n// tir� de : https://stackoverflow.com/questions/45057191/angular-4-material-2-md-datepicker-set-first-day-of-the-week\n@Injectable()\nexport class MondayFirstDayDateAdapter extends NativeDateAdapter {\n getFirstDayOfWeek(): number {\n return 1;\n }\n}\n\n@NgModule({\n imports: [\n MatAutocompleteModule,\n MatSortModule,\n MatPaginatorModule,\n MatCheckboxModule,\n MatDatepickerModule,\n MatFormFieldModule,\n MatInputModule,\n MatRadioModule,\n MatMenuModule,\n MatToolbarModule,\n MatCardModule,\n MatTabsModule,\n MatButtonModule,\n MatNativeDateModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatProgressBarModule,\n MatDialogModule,\n MatTooltipModule,\n MatSnackBarModule,\n MatTableModule,\n MatExpansionModule,\n MatSlideToggleModule,\n MatDividerModule,\n MatChipsModule,\n MatRippleModule,\n MatStepperModule\n ],\n exports: [\n MatAutocompleteModule,\n MatSortModule,\n MatPaginatorModule,\n MatCheckboxModule,\n MatDatepickerModule,\n MatFormFieldModule,\n MatInputModule,\n MatRadioModule,\n MatSelectModule,\n MatMenuModule,\n MatToolbarModule,\n MatCardModule,\n MatTabsModule,\n MatButtonModule,\n MatNativeDateModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatProgressBarModule,\n MatDialogModule,\n MatTooltipModule,\n MatSnackBarModule,\n MatTableModule,\n MatExpansionModule,\n MatSlideToggleModule,\n MatDividerModule,\n MatChipsModule,\n MatRippleModule,\n MatStepperModule\n ],\n providers: [\n // tir� de : https://stackoverflow.com/questions/39589844/alternative-for-provide-in-angular2\n {provide: DateAdapter, useClass: MondayFirstDayDateAdapter}\n ]\n})\nexport class MaterialModule {\n constructor() {\n }\n}\n","class ModelSerialization {\n public static deserialize(instance: any, data: any): any {\n return Object.assign(new instance(), data);\n }\n}\n\n//\n//\n// Lang\n//\n//\n\nexport class Lang {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Lang';\n public static readonly ID_EN: number = 1;\n public static readonly ID_FR: number = 2;\n public static readonly ID_DEFAULT: number = 1;\n public id: number;\n\n //\n // CONSTANTS\n //\n public name: string;\n public code: string;\n\n constructor() {\n }\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'name', 'code'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'code'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Lang {\n const item = new Lang();\n item.id = data['id'];\n item.name = data['name'];\n item.code = data['code'];\n return item;\n }\n\n public static fromAPI(data: any): Lang {\n const item: Lang = new Lang();\n item.id = parseFloat(data['id']);\n item.name = data['name'];\n item.code = data['code'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): Lang[] {\n const items: Lang[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Lang.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n code: this.code\n };\n return item;\n }\n\n public clone(): Lang {\n return Lang.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// User\n//\n//\n\nexport class User {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'User';\n public id: number;\n public langId: number;\n public email: string;\n public isAdmin: number;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public isInvestor: number;\n public isGuest: number;\n public isProjectHolder: number;\n\n //\n // ATTRIBUTES\n //\n public isLocalExpert: number;\n public firstName: string;\n public lastName: string;\n public avatar: string;\n public intro: string;\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'langId', 'email', 'isAdmin', 'isInvestor', 'isGuest', 'isProjectHolder', 'isLocalExpert', 'firstName', 'lastName', 'avatar', 'intro', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'langId', 'email', 'isAdmin', 'isInvestor', 'isGuest', 'isProjectHolder', 'isLocalExpert', 'firstName', 'lastName', 'avatar', 'intro', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): User {\n const item = new User();\n item.id = data['id'];\n item.langId = data['langId'];\n item.email = data['email'];\n item.isAdmin = data['isAdmin'];\n item.isInvestor = data['isInvestor'];\n item.isGuest = data['isGuest'];\n item.isProjectHolder = data['isProjectHolder'];\n item.isLocalExpert = data['isLocalExpert'];\n item.firstName = data['firstName'];\n item.lastName = data['lastName'];\n item.avatar = data['avatar'];\n item.intro = data['intro'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): User {\n const item: User = new User();\n item.id = parseFloat(data['id']);\n item.langId = parseFloat(data['langId']);\n item.email = data['email'];\n item.isAdmin = parseFloat(data['isAdmin']);\n item.isInvestor = parseFloat(data['isInvestor']);\n item.isGuest = parseFloat(data['isGuest']);\n item.isProjectHolder = parseFloat(data['isProjectHolder']);\n item.isLocalExpert = parseFloat(data['isLocalExpert']);\n item.firstName = data['firstName'];\n item.lastName = data['lastName'];\n item.avatar = data['avatar'];\n item.intro = data['intro'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): User[] {\n const items: User[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(User.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n langId: this.langId,\n email: this.email,\n isAdmin: this.isAdmin,\n isInvestor: this.isInvestor,\n isGuest: this.isGuest,\n isProjectHolder: this.isProjectHolder,\n isLocalExpert: this.isLocalExpert,\n firstName: this.firstName,\n lastName: this.lastName,\n avatar: this.avatar,\n intro: this.intro,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): User {\n return User.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// UserLink\n//\n//\n\nexport class UserLink {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'UserLink';\n public static readonly ID_LINKEDIN: number = 1;\n public static readonly ID_TWITTER: number = 2;\n public static readonly ID_GITHUB: number = 3;\n public static readonly ID_STACKOVERFLOW: number = 4;\n\n //\n // CONSTANTS\n //\n public static readonly ID_INSTAGRAM: number = 5;\n public id: number;\n public name: string;\n public description: string;\n public matchWith: string;\n\n //\n // FACTORIES\n //\n public hint: string;\n public icon: string;\n\n constructor() {\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'matchWith', 'icon'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description', 'hint'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'description', 'matchWith', 'hint', 'icon'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): UserLink {\n const item = new UserLink();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n item.matchWith = data['matchWith'];\n item.hint = data['hint'];\n item.icon = data['icon'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): UserLink {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['userLinkId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: UserLink = new UserLink();\n item.id = parseFloat(data['id']);\n item.matchWith = data['matchWith'];\n item.icon = data['icon'];\n item.name = translationData['name'];\n item.description = translationData['description'];\n item.hint = translationData['hint'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): UserLink[] {\n const items: UserLink[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(UserLink.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description,\n matchWith: this.matchWith,\n hint: this.hint,\n icon: this.icon\n };\n return item;\n }\n\n public clone(): UserLink {\n return UserLink.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// Tag\n//\n//\n\nexport class Tag {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Tag';\n public id: number;\n public name: string;\n public colorHex: string;\n public textColorHex: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n\n //\n // ATTRIBUTES\n //\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'colorHex', 'textColorHex', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'colorHex', 'textColorHex', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Tag {\n const item = new Tag();\n item.id = data['id'];\n item.name = data['name'];\n item.colorHex = data['colorHex'];\n item.textColorHex = data['textColorHex'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): Tag {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['tagId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: Tag = new Tag();\n item.id = parseFloat(data['id']);\n item.colorHex = data['colorHex'];\n item.textColorHex = data['textColorHex'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n item.name = translationData['name'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): Tag[] {\n const items: Tag[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Tag.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n colorHex: this.colorHex,\n textColorHex: this.textColorHex,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): Tag {\n return Tag.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// Discussion\n//\n//\n\nexport class Discussion {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Discussion';\n public id: number;\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n //\n // ATTRIBUTES\n //\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Discussion {\n const item = new Discussion();\n item.id = data['id'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): Discussion {\n const item: Discussion = new Discussion();\n item.id = parseFloat(data['id']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): Discussion[] {\n const items: Discussion[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Discussion.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): Discussion {\n return Discussion.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// DiscussionMessage\n//\n//\n\nexport class DiscussionMessage {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'DiscussionMessage';\n public id: number;\n public discussionId: number;\n public message: string;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'discussionId', 'message', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'discussionId', 'message', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): DiscussionMessage {\n const item = new DiscussionMessage();\n item.id = data['id'];\n item.discussionId = data['discussionId'];\n item.message = data['message'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): DiscussionMessage {\n const item: DiscussionMessage = new DiscussionMessage();\n item.id = parseFloat(data['id']);\n item.discussionId = parseFloat(data['discussionId']);\n item.message = data['message'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): DiscussionMessage[] {\n const items: DiscussionMessage[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(DiscussionMessage.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n discussionId: this.discussionId,\n message: this.message,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): DiscussionMessage {\n return DiscussionMessage.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// FileFamily\n//\n//\n\nexport class FileFamily {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'FileFamily';\n public static readonly ID_OTHER: number = 1;\n public static readonly ID_IMAGE: number = 2;\n public static readonly ID_AUDIO: number = 3;\n public static readonly ID_VIDEO: number = 4;\n\n //\n // CONSTANTS\n //\n public static readonly ID_PDF: number = 5;\n public static readonly ID_WORD: number = 6;\n public static readonly ID_EXCEL: number = 7;\n public static readonly ID_POWERPOINT: number = 8;\n public static readonly ID_FOLDER: number = 9;\n public id: number;\n public name: string;\n public description: string;\n\n constructor() {\n }\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): FileFamily {\n const item = new FileFamily();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): FileFamily {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['fileFamilyId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: FileFamily = new FileFamily();\n item.id = parseFloat(data['id']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): FileFamily[] {\n const items: FileFamily[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(FileFamily.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description\n };\n return item;\n }\n\n public clone(): FileFamily {\n return FileFamily.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// FileType\n//\n//\n\nexport class FileType {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'FileType';\n public static readonly ID_OTHER: number = 1;\n public static readonly ID_AAC: number = 2;\n public static readonly ID_AVI: number = 3;\n public static readonly ID_CSV: number = 4;\n\n //\n // CONSTANTS\n //\n public static readonly ID_DOC: number = 5;\n public static readonly ID_DOCX: number = 6;\n public static readonly ID_GIF: number = 7;\n public static readonly ID_JPEG: number = 8;\n public static readonly ID_JPG: number = 9;\n public static readonly ID_JSON: number = 10;\n public static readonly ID_MID: number = 11;\n public static readonly ID_MIDI: number = 12;\n public static readonly ID_MPEG: number = 13;\n public static readonly ID_PNG: number = 14;\n public static readonly ID_PDF: number = 15;\n public static readonly ID_PPT: number = 16;\n public static readonly ID_PPTX: number = 17;\n public static readonly ID_RAR: number = 18;\n public static readonly ID_RTF: number = 19;\n public static readonly ID_SVG: number = 20;\n public static readonly ID_WEBA: number = 21;\n public static readonly ID_WEBM: number = 22;\n public static readonly ID_WEBP: number = 23;\n public static readonly ID_XLS: number = 24;\n public static readonly ID_XLSX: number = 25;\n public static readonly ID_XML: number = 26;\n public static readonly ID_ZIP: number = 27;\n public static readonly ID_3GPA: number = 28;\n public static readonly ID_3GPV: number = 29;\n public static readonly ID_7Z: number = 30;\n public static readonly ID_MP3: number = 31;\n public static readonly ID_MP4: number = 32;\n public static readonly ID_MKV: number = 33;\n public static readonly ID_FOLDER: number = 34;\n public id: number;\n public fileFamilyId: number;\n public name: string;\n public extension: string;\n\n //\n // FACTORIES\n //\n public mimeType: string;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'fileFamilyId', 'extension', 'mimeType'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getTranslatableFields(): string[] {\n return ['name'];\n }\n\n public static getFields(): string[] {\n return ['id', 'fileFamilyId', 'name', 'extension', 'mimeType'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): FileType {\n const item = new FileType();\n item.id = data['id'];\n item.fileFamilyId = data['fileFamilyId'];\n item.name = data['name'];\n item.extension = data['extension'];\n item.mimeType = data['mimeType'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): FileType {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['fileTypeId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: FileType = new FileType();\n item.id = parseFloat(data['id']);\n item.fileFamilyId = parseFloat(data['fileFamilyId']);\n item.extension = data['extension'];\n item.mimeType = data['mimeType'];\n item.name = translationData['name'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): FileType[] {\n const items: FileType[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(FileType.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n fileFamilyId: this.fileFamilyId,\n name: this.name,\n extension: this.extension,\n mimeType: this.mimeType\n };\n return item;\n }\n\n public clone(): FileType {\n return FileType.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// FileGroup\n//\n//\n\nexport class FileGroup {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'FileGroup';\n public id: number;\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n //\n // ATTRIBUTES\n //\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): FileGroup {\n const item = new FileGroup();\n item.id = data['id'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): FileGroup {\n const item: FileGroup = new FileGroup();\n item.id = parseFloat(data['id']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): FileGroup[] {\n const items: FileGroup[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(FileGroup.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): FileGroup {\n return FileGroup.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// File\n//\n//\n\nexport class File {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'File';\n public id: number;\n public fileGroupId: number;\n public fileTypeId: number;\n public parentFileId: number;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public file: string;\n public name: string;\n public size: number;\n\n //\n // ATTRIBUTES\n //\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'fileGroupId', 'fileTypeId', 'parentFileId', 'file', 'name', 'size', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'fileGroupId', 'fileTypeId', 'parentFileId', 'file', 'name', 'size', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): File {\n const item = new File();\n item.id = data['id'];\n item.fileGroupId = data['fileGroupId'];\n item.fileTypeId = data['fileTypeId'];\n item.parentFileId = data['parentFileId'];\n item.file = data['file'];\n item.name = data['name'];\n item.size = data['size'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): File {\n const item: File = new File();\n item.id = parseFloat(data['id']);\n item.fileGroupId = parseFloat(data['fileGroupId']);\n item.fileTypeId = parseFloat(data['fileTypeId']);\n item.parentFileId = parseFloat(data['parentFileId']);\n item.file = data['file'];\n item.name = data['name'];\n item.size = parseFloat(data['size']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): File[] {\n const items: File[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(File.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n fileGroupId: this.fileGroupId,\n fileTypeId: this.fileTypeId,\n parentFileId: this.parentFileId,\n file: this.file,\n name: this.name,\n size: this.size,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): File {\n return File.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// PrivateDiscussion\n//\n//\n\nexport class PrivateDiscussion {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'PrivateDiscussion';\n public id: number;\n public discussionId: number;\n public isGroup: number;\n public name: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public image: string;\n public createDate: string;\n public createrId: number;\n\n //\n // ATTRIBUTES\n //\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'discussionId', 'isGroup', 'name', 'image', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'discussionId', 'isGroup', 'name', 'image', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): PrivateDiscussion {\n const item = new PrivateDiscussion();\n item.id = data['id'];\n item.discussionId = data['discussionId'];\n item.isGroup = data['isGroup'];\n item.name = data['name'];\n item.image = data['image'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): PrivateDiscussion {\n const item: PrivateDiscussion = new PrivateDiscussion();\n item.id = parseFloat(data['id']);\n item.discussionId = parseFloat(data['discussionId']);\n item.isGroup = parseFloat(data['isGroup']);\n item.name = data['name'];\n item.image = data['image'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): PrivateDiscussion[] {\n const items: PrivateDiscussion[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(PrivateDiscussion.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n discussionId: this.discussionId,\n isGroup: this.isGroup,\n name: this.name,\n image: this.image,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): PrivateDiscussion {\n return PrivateDiscussion.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// PrivateDiscussion_User\n//\n//\n\nexport class PrivateDiscussion_User {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'PrivateDiscussion_User';\n public id: number;\n public privateDiscussionId: number;\n public userId: number;\n public lastSeen: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public lastNotification: string;\n public createDate: string;\n public createrId: number;\n\n //\n // ATTRIBUTES\n //\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'privateDiscussionId', 'userId', 'lastSeen', 'lastNotification', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'privateDiscussionId', 'userId', 'lastSeen', 'lastNotification', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): PrivateDiscussion_User {\n const item = new PrivateDiscussion_User();\n item.id = data['id'];\n item.privateDiscussionId = data['privateDiscussionId'];\n item.userId = data['userId'];\n item.lastSeen = data['lastSeen'];\n item.lastNotification = data['lastNotification'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): PrivateDiscussion_User {\n const item: PrivateDiscussion_User = new PrivateDiscussion_User();\n item.id = parseFloat(data['id']);\n item.privateDiscussionId = parseFloat(data['privateDiscussionId']);\n item.userId = parseFloat(data['userId']);\n item.lastSeen = data['lastSeen'];\n item.lastNotification = data['lastNotification'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): PrivateDiscussion_User[] {\n const items: PrivateDiscussion_User[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(PrivateDiscussion_User.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n privateDiscussionId: this.privateDiscussionId,\n userId: this.userId,\n lastSeen: this.lastSeen,\n lastNotification: this.lastNotification,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): PrivateDiscussion_User {\n return PrivateDiscussion_User.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// User_UserLink\n//\n//\n\nexport class User_UserLink {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'User_UserLink';\n public id: number;\n public userId: number;\n public userLinkId: number;\n public link: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n\n //\n // ATTRIBUTES\n //\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'userId', 'userLinkId', 'link', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'userId', 'userLinkId', 'link', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): User_UserLink {\n const item = new User_UserLink();\n item.id = data['id'];\n item.userId = data['userId'];\n item.userLinkId = data['userLinkId'];\n item.link = data['link'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): User_UserLink {\n const item: User_UserLink = new User_UserLink();\n item.id = parseFloat(data['id']);\n item.userId = parseFloat(data['userId']);\n item.userLinkId = parseFloat(data['userLinkId']);\n item.link = data['link'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): User_UserLink[] {\n const items: User_UserLink[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(User_UserLink.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n userId: this.userId,\n userLinkId: this.userLinkId,\n link: this.link,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): User_UserLink {\n return User_UserLink.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// LikeCounter\n//\n//\n\nexport class LikeCounter {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'LikeCounter';\n public id: number;\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n //\n // ATTRIBUTES\n //\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): LikeCounter {\n const item = new LikeCounter();\n item.id = data['id'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): LikeCounter {\n const item: LikeCounter = new LikeCounter();\n item.id = parseFloat(data['id']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): LikeCounter[] {\n const items: LikeCounter[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(LikeCounter.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): LikeCounter {\n return LikeCounter.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// LikeCounter_User\n//\n//\n\nexport class LikeCounter_User {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'LikeCounter_User';\n public id: number;\n public likeCounterId: number;\n public userId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'likeCounterId', 'userId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'likeCounterId', 'userId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): LikeCounter_User {\n const item = new LikeCounter_User();\n item.id = data['id'];\n item.likeCounterId = data['likeCounterId'];\n item.userId = data['userId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): LikeCounter_User {\n const item: LikeCounter_User = new LikeCounter_User();\n item.id = parseFloat(data['id']);\n item.likeCounterId = parseFloat(data['likeCounterId']);\n item.userId = parseFloat(data['userId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): LikeCounter_User[] {\n const items: LikeCounter_User[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(LikeCounter_User.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n likeCounterId: this.likeCounterId,\n userId: this.userId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): LikeCounter_User {\n return LikeCounter_User.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// CompanyCategoryGroup\n//\n//\n\nexport class CompanyCategoryGroup {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'CompanyCategoryGroup';\n public static readonly ID_LIFE_SCIENCE_INDUSTRY: number = 1;\n public id: number;\n public name: string;\n public description: string;\n\n //\n // CONSTANTS\n //\n\n constructor() {\n }\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): CompanyCategoryGroup {\n const item = new CompanyCategoryGroup();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): CompanyCategoryGroup {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['companyCategoryGroupId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: CompanyCategoryGroup = new CompanyCategoryGroup();\n item.id = parseFloat(data['id']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): CompanyCategoryGroup[] {\n const items: CompanyCategoryGroup[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(CompanyCategoryGroup.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description\n };\n return item;\n }\n\n public clone(): CompanyCategoryGroup {\n return CompanyCategoryGroup.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// CompanyCategory\n//\n//\n\nexport class CompanyCategory {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'CompanyCategory';\n public id: number;\n public companyCategoryGroupId: number;\n public name: string;\n public description: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public ordinal: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'companyCategoryGroupId', 'ordinal'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'companyCategoryGroupId', 'name', 'description', 'ordinal'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): CompanyCategory {\n const item = new CompanyCategory();\n item.id = data['id'];\n item.companyCategoryGroupId = data['companyCategoryGroupId'];\n item.name = data['name'];\n item.description = data['description'];\n item.ordinal = data['ordinal'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): CompanyCategory {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['companyCategoryId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: CompanyCategory = new CompanyCategory();\n item.id = parseFloat(data['id']);\n item.companyCategoryGroupId = parseFloat(data['companyCategoryGroupId']);\n item.ordinal = parseFloat(data['ordinal']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): CompanyCategory[] {\n const items: CompanyCategory[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(CompanyCategory.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n companyCategoryGroupId: this.companyCategoryGroupId,\n name: this.name,\n description: this.description,\n ordinal: this.ordinal\n };\n return item;\n }\n\n public clone(): CompanyCategory {\n return CompanyCategory.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// InvestorValidationState\n//\n//\n\nexport class InvestorValidationState {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'InvestorValidationState';\n public static readonly ID_PENDING: number = 1;\n public static readonly ID_ACCEPTED: number = 2;\n public static readonly ID_REFUSED: number = 3;\n public id: number;\n\n //\n // CONSTANTS\n //\n public name: string;\n public description: string;\n\n constructor() {\n }\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): InvestorValidationState {\n const item = new InvestorValidationState();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): InvestorValidationState {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['investorValidationStateId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: InvestorValidationState = new InvestorValidationState();\n item.id = parseFloat(data['id']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): InvestorValidationState[] {\n const items: InvestorValidationState[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(InvestorValidationState.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description\n };\n return item;\n }\n\n public clone(): InvestorValidationState {\n return InvestorValidationState.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// InvestorProfile\n//\n//\n\nexport class InvestorProfile extends ModelSerialization {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'InvestorProfile';\n public id: number;\n public userId: number;\n public investorValidationStateId: number;\n public companyId: number;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n public investmentRangeFrom: number;\n public investmentRangeTo: number;\n public isInterstedInNotForProfit: number;\n\n //\n // ATTRIBUTES\n //\n public isInterstedInPartnerships: number;\n public isInterstedInLicenses: number;\n public acceptToBeContacted: number;\n public isNotificationsAlertEnabled: number;\n public isNotificationsDevPhaseEnabled: number;\n public isNotificationsSeekingFundsEnabled: number;\n public isNotificationsLeadInvestorEnabled: number;\n public phone: string;\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'userId', 'investorValidationStateId', 'companyId', 'investmentRangeFrom', 'investmentRangeTo', 'isInterstedInNotForProfit', 'isInterstedInPartnerships', 'isInterstedInLicenses', 'acceptToBeContacted', 'isNotificationsAlertEnabled', 'isNotificationsDevPhaseEnabled', 'isNotificationsSeekingFundsEnabled', 'isNotificationsLeadInvestorEnabled', 'phone', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'userId', 'investorValidationStateId', 'companyId', 'investmentRangeFrom', 'investmentRangeTo', 'isInterstedInNotForProfit', 'isInterstedInPartnerships', 'isInterstedInLicenses', 'acceptToBeContacted', 'isNotificationsAlertEnabled', 'isNotificationsDevPhaseEnabled', 'isNotificationsSeekingFundsEnabled', 'isNotificationsLeadInvestorEnabled', 'phone', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n //\n public static deserialize(data: any): InvestorProfile {\n return super.deserialize(InvestorProfile, data);\n }\n\n public static fromAPI(data: any): InvestorProfile {\n const item = new InvestorProfile();\n item.id = parseFloat(data['id']);\n item.userId = parseFloat(data['userId']);\n item.investorValidationStateId = parseFloat(data['investorValidationStateId']);\n item.companyId = parseFloat(data['companyId']);\n item.investmentRangeFrom = parseFloat(data['investmentRangeFrom']);\n item.investmentRangeTo = parseFloat(data['investmentRangeTo']);\n item.isInterstedInNotForProfit = parseFloat(data['isInterstedInNotForProfit']);\n item.isInterstedInPartnerships = parseFloat(data['isInterstedInPartnerships']);\n item.isInterstedInLicenses = parseFloat(data['isInterstedInLicenses']);\n item.acceptToBeContacted = parseFloat(data['acceptToBeContacted']);\n item.isNotificationsAlertEnabled = parseFloat(data['isNotificationsAlertEnabled']);\n item.isNotificationsDevPhaseEnabled = parseFloat(data['isNotificationsDevPhaseEnabled']);\n item.isNotificationsSeekingFundsEnabled = parseFloat(data['isNotificationsSeekingFundsEnabled']);\n item.isNotificationsLeadInvestorEnabled = parseFloat(data['isNotificationsLeadInvestorEnabled']);\n item.phone = data['phone'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n public static fromAPIList(data: any[]): InvestorProfile[] {\n const items: InvestorProfile[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(InvestorProfile.fromAPI(data[i]));\n }\n return items;\n }\n\n public clone(): InvestorProfile {\n return InvestorProfile.deserialize(JSON.parse(JSON.stringify(this)));\n }\n}\n\n//\n//\n// TherapeuticAreaOfInterest\n//\n//\n\nexport class TherapeuticAreaOfInterest {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'TherapeuticAreaOfInterest';\n public id: number;\n public investorProfileId: number;\n public therapeuticAreaId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'investorProfileId', 'therapeuticAreaId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'investorProfileId', 'therapeuticAreaId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): TherapeuticAreaOfInterest {\n const item = new TherapeuticAreaOfInterest();\n item.id = data['id'];\n item.investorProfileId = data['investorProfileId'];\n item.therapeuticAreaId = data['therapeuticAreaId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): TherapeuticAreaOfInterest {\n const item: TherapeuticAreaOfInterest = new TherapeuticAreaOfInterest();\n item.id = parseFloat(data['id']);\n item.investorProfileId = parseFloat(data['investorProfileId']);\n item.therapeuticAreaId = parseFloat(data['therapeuticAreaId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): TherapeuticAreaOfInterest[] {\n const items: TherapeuticAreaOfInterest[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(TherapeuticAreaOfInterest.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n investorProfileId: this.investorProfileId,\n therapeuticAreaId: this.therapeuticAreaId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): TherapeuticAreaOfInterest {\n return TherapeuticAreaOfInterest.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// DevelopmentPhaseOfInterest\n//\n//\n\nexport class DevelopmentPhaseOfInterest {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'DevelopmentPhaseOfInterest';\n public id: number;\n public investorProfileId: number;\n public developmentPhaseId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'investorProfileId', 'developmentPhaseId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'investorProfileId', 'developmentPhaseId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): DevelopmentPhaseOfInterest {\n const item = new DevelopmentPhaseOfInterest();\n item.id = data['id'];\n item.investorProfileId = data['investorProfileId'];\n item.developmentPhaseId = data['developmentPhaseId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): DevelopmentPhaseOfInterest {\n const item: DevelopmentPhaseOfInterest = new DevelopmentPhaseOfInterest();\n item.id = parseFloat(data['id']);\n item.investorProfileId = parseFloat(data['investorProfileId']);\n item.developmentPhaseId = parseFloat(data['developmentPhaseId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): DevelopmentPhaseOfInterest[] {\n const items: DevelopmentPhaseOfInterest[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(DevelopmentPhaseOfInterest.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n investorProfileId: this.investorProfileId,\n developmentPhaseId: this.developmentPhaseId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): DevelopmentPhaseOfInterest {\n return DevelopmentPhaseOfInterest.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// ProjectFavorite\n//\n//\n\nexport class ProjectFavorite {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'ProjectFavorite';\n public id: number;\n public userId: number;\n public projectId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'userId', 'projectId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'userId', 'projectId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): ProjectFavorite {\n const item = new ProjectFavorite();\n item.id = data['id'];\n item.userId = data['userId'];\n item.projectId = data['projectId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): ProjectFavorite {\n const item: ProjectFavorite = new ProjectFavorite();\n item.id = parseFloat(data['id']);\n item.userId = parseFloat(data['userId']);\n item.projectId = parseFloat(data['projectId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): ProjectFavorite[] {\n const items: ProjectFavorite[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectFavorite.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n userId: this.userId,\n projectId: this.projectId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): ProjectFavorite {\n return ProjectFavorite.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// Alert\n//\n//\n\nexport class Alert {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Alert';\n public id: number;\n public ownerId: number;\n public name: string;\n public isCompanyIncorporated: number;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public isCompanyNotIncorporated: number;\n public yearOfIncorporationFrom: number;\n public yearOfIncorporationTo: number;\n\n //\n // ATTRIBUTES\n //\n public yearOfPlannedIncorporationFrom: number;\n public yearOfPlannedIncorporationTo: number;\n public isOutlicensing: number;\n public isNotOutlicensing: number;\n public isSeekingPartnerhips: number;\n public isNotSeekingPartnerhips: number;\n public isNotForProfit: number;\n public isNotNotForProfit: number;\n public isRaisingFunds: number;\n public isNotRaisingFunds: number;\n public raisingFundsAmountFrom: number;\n public raisingFundsAmountTo: number;\n public isPublicCompany: number;\n public isPrivateCompany: number;\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'ownerId', 'name', 'isCompanyIncorporated', 'isCompanyNotIncorporated', 'yearOfIncorporationFrom', 'yearOfIncorporationTo', 'yearOfPlannedIncorporationFrom', 'yearOfPlannedIncorporationTo', 'isOutlicensing', 'isNotOutlicensing', 'isSeekingPartnerhips', 'isNotSeekingPartnerhips', 'isNotForProfit', 'isNotNotForProfit', 'isRaisingFunds', 'isNotRaisingFunds', 'raisingFundsAmountFrom', 'raisingFundsAmountTo', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId', 'isPublicCompany', 'isPrivateCompany'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'ownerId', 'name', 'isCompanyIncorporated', 'isCompanyNotIncorporated', 'yearOfIncorporationFrom', 'yearOfIncorporationTo', 'yearOfPlannedIncorporationFrom', 'yearOfPlannedIncorporationTo', 'isOutlicensing', 'isNotOutlicensing', 'isSeekingPartnerhips', 'isNotSeekingPartnerhips', 'isNotForProfit', 'isNotNotForProfit', 'isRaisingFunds', 'isNotRaisingFunds', 'raisingFundsAmountFrom', 'raisingFundsAmountTo', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId', 'isPublicCompany', 'isPrivateCompany'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Alert {\n const item = new Alert();\n item.id = data['id'];\n item.ownerId = data['ownerId'];\n item.name = data['name'];\n item.isCompanyIncorporated = data['isCompanyIncorporated'];\n item.isCompanyNotIncorporated = data['isCompanyNotIncorporated'];\n item.yearOfIncorporationFrom = data['yearOfIncorporationFrom'];\n item.yearOfIncorporationTo = data['yearOfIncorporationTo'];\n item.yearOfPlannedIncorporationFrom = data['yearOfPlannedIncorporationFrom'];\n item.yearOfPlannedIncorporationTo = data['yearOfPlannedIncorporationTo'];\n item.isOutlicensing = data['isOutlicensing'];\n item.isNotOutlicensing = data['isNotOutlicensing'];\n item.isSeekingPartnerhips = data['isSeekingPartnerhips'];\n item.isNotSeekingPartnerhips = data['isNotSeekingPartnerhips'];\n item.isNotForProfit = data['isNotForProfit'];\n item.isNotNotForProfit = data['isNotNotForProfit'];\n item.isRaisingFunds = data['isRaisingFunds'];\n item.isNotRaisingFunds = data['isNotRaisingFunds'];\n item.raisingFundsAmountFrom = data['raisingFundsAmountFrom'];\n item.raisingFundsAmountTo = data['raisingFundsAmountTo'];\n item.isPublicCompany = data['isPublicCompany'];\n item.isPrivateCompany = data['isPrivateCompany'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): Alert {\n const item: Alert = new Alert();\n item.id = parseFloat(data['id']);\n item.ownerId = parseFloat(data['ownerId']);\n item.name = data['name'];\n item.isCompanyIncorporated = parseFloat(data['isCompanyIncorporated']);\n item.isCompanyNotIncorporated = parseFloat(data['isCompanyNotIncorporated']);\n item.yearOfIncorporationFrom = parseFloat(data['yearOfIncorporationFrom']);\n item.yearOfIncorporationTo = parseFloat(data['yearOfIncorporationTo']);\n item.yearOfPlannedIncorporationFrom = parseFloat(data['yearOfPlannedIncorporationFrom']);\n item.yearOfPlannedIncorporationTo = parseFloat(data['yearOfPlannedIncorporationTo']);\n item.isOutlicensing = parseFloat(data['isOutlicensing']);\n item.isNotOutlicensing = parseFloat(data['isNotOutlicensing']);\n item.isSeekingPartnerhips = parseFloat(data['isSeekingPartnerhips']);\n item.isNotSeekingPartnerhips = parseFloat(data['isNotSeekingPartnerhips']);\n item.isNotForProfit = parseFloat(data['isNotForProfit']);\n item.isNotNotForProfit = parseFloat(data['isNotNotForProfit']);\n item.isRaisingFunds = parseFloat(data['isRaisingFunds']);\n item.isNotRaisingFunds = parseFloat(data['isNotRaisingFunds']);\n item.raisingFundsAmountFrom = parseFloat(data['raisingFundsAmountFrom']);\n item.raisingFundsAmountTo = parseFloat(data['raisingFundsAmountTo']);\n item.isPublicCompany = parseFloat(data['isPublicCompany']);\n item.isPrivateCompany = parseFloat(data['isPrivateCompany']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): Alert[] {\n const items: Alert[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Alert.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n ownerId: this.ownerId,\n name: this.name,\n isCompanyIncorporated: this.isCompanyIncorporated,\n isCompanyNotIncorporated: this.isCompanyNotIncorporated,\n yearOfIncorporationFrom: this.yearOfIncorporationFrom,\n yearOfIncorporationTo: this.yearOfIncorporationTo,\n yearOfPlannedIncorporationFrom: this.yearOfPlannedIncorporationFrom,\n yearOfPlannedIncorporationTo: this.yearOfPlannedIncorporationTo,\n isOutlicensing: this.isOutlicensing,\n isNotOutlicensing: this.isNotOutlicensing,\n isSeekingPartnerhips: this.isSeekingPartnerhips,\n isNotSeekingPartnerhips: this.isNotSeekingPartnerhips,\n isNotForProfit: this.isNotForProfit,\n isNotNotForProfit: this.isNotNotForProfit,\n isRaisingFunds: this.isRaisingFunds,\n isNotRaisingFunds: this.isNotRaisingFunds,\n raisingFundsAmountFrom: this.raisingFundsAmountFrom,\n raisingFundsAmountTo: this.raisingFundsAmountTo,\n isPrivateCompany: this.isPrivateCompany,\n isPublicCompany: this.isPublicCompany,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): Alert {\n return Alert.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// Alert_ProjectType\n//\n//\n\nexport class Alert_ProjectType {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Alert_ProjectType';\n public id: number;\n public alertId: number;\n public projectTypeId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'alertId', 'projectTypeId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'alertId', 'projectTypeId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Alert_ProjectType {\n const item = new Alert_ProjectType();\n item.id = data['id'];\n item.alertId = data['alertId'];\n item.projectTypeId = data['projectTypeId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): Alert_ProjectType {\n const item: Alert_ProjectType = new Alert_ProjectType();\n item.id = parseFloat(data['id']);\n item.alertId = parseFloat(data['alertId']);\n item.projectTypeId = parseFloat(data['projectTypeId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): Alert_ProjectType[] {\n const items: Alert_ProjectType[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Alert_ProjectType.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n alertId: this.alertId,\n projectTypeId: this.projectTypeId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): Alert_ProjectType {\n return Alert_ProjectType.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// Alert_TherapeuticArea\n//\n//\n\nexport class Alert_TherapeuticArea {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Alert_TherapeuticArea';\n public id: number;\n public alertId: number;\n public therapeuticAreaId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'alertId', 'therapeuticAreaId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'alertId', 'therapeuticAreaId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Alert_TherapeuticArea {\n const item = new Alert_TherapeuticArea();\n item.id = data['id'];\n item.alertId = data['alertId'];\n item.therapeuticAreaId = data['therapeuticAreaId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): Alert_TherapeuticArea {\n const item: Alert_TherapeuticArea = new Alert_TherapeuticArea();\n item.id = parseFloat(data['id']);\n item.alertId = parseFloat(data['alertId']);\n item.therapeuticAreaId = parseFloat(data['therapeuticAreaId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): Alert_TherapeuticArea[] {\n const items: Alert_TherapeuticArea[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Alert_TherapeuticArea.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n alertId: this.alertId,\n therapeuticAreaId: this.therapeuticAreaId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): Alert_TherapeuticArea {\n return Alert_TherapeuticArea.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// Alert_DevelopmentPhase\n//\n//\n\nexport class Alert_DevelopmentPhase {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Alert_DevelopmentPhase';\n public id: number;\n public alertId: number;\n public developmentPhaseId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'alertId', 'developmentPhaseId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'alertId', 'developmentPhaseId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Alert_DevelopmentPhase {\n const item = new Alert_DevelopmentPhase();\n item.id = data['id'];\n item.alertId = data['alertId'];\n item.developmentPhaseId = data['developmentPhaseId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): Alert_DevelopmentPhase {\n const item: Alert_DevelopmentPhase = new Alert_DevelopmentPhase();\n item.id = parseFloat(data['id']);\n item.alertId = parseFloat(data['alertId']);\n item.developmentPhaseId = parseFloat(data['developmentPhaseId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): Alert_DevelopmentPhase[] {\n const items: Alert_DevelopmentPhase[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Alert_DevelopmentPhase.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n alertId: this.alertId,\n developmentPhaseId: this.developmentPhaseId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): Alert_DevelopmentPhase {\n return Alert_DevelopmentPhase.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// Alert_FundingRound\n//\n//\n\nexport class Alert_FundingRound {\n\n public static readonly tableName = 'Alert_FundingRound';\n public id: number;\n public alertId: number;\n public fundingRoundId: number;\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'alertId', 'fundingRoundId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'alertId', 'fundingRoundId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Alert_FundingRound {\n const item = new Alert_FundingRound();\n item.id = data['id'];\n item.alertId = data['alertId'];\n item.fundingRoundId = data['fundingRoundId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): Alert_FundingRound {\n const item: Alert_FundingRound = new Alert_FundingRound();\n item.id = parseFloat(data['id']);\n item.alertId = parseFloat(data['alertId']);\n item.fundingRoundId = parseFloat(data['fundingRoundId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n public static fromAPIList(data: any[]): Alert_FundingRound[] {\n const items: Alert_FundingRound[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Alert_FundingRound.fromAPI(data[i]));\n }\n return items;\n }\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n alertId: this.alertId,\n fundingRoundId: this.fundingRoundId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): Alert_FundingRound {\n return Alert_FundingRound.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// Alert_AcademicInstitution\n//\n//\n\nexport class Alert_AcademicInstitution {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Alert_AcademicInstitution';\n public id: number;\n public alertId: number;\n public academicInstitutionId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'alertId', 'academicInstitutionId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'alertId', 'academicInstitutionId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Alert_AcademicInstitution {\n const item = new Alert_AcademicInstitution();\n item.id = data['id'];\n item.alertId = data['alertId'];\n item.academicInstitutionId = data['academicInstitutionId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): Alert_AcademicInstitution {\n const item: Alert_AcademicInstitution = new Alert_AcademicInstitution();\n item.id = parseFloat(data['id']);\n item.alertId = parseFloat(data['alertId']);\n item.academicInstitutionId = parseFloat(data['academicInstitutionId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): Alert_AcademicInstitution[] {\n const items: Alert_AcademicInstitution[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Alert_AcademicInstitution.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n alertId: this.alertId,\n academicInstitutionId: this.academicInstitutionId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): Alert_AcademicInstitution {\n return Alert_AcademicInstitution.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\nexport class ProjectTradeType extends ModelSerialization {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'ProjectTradeType';\n public static readonly ID_PUBLIC: number = 1;\n public static readonly ID_PRIVATE: number = 2;\n public id: number;\n public name: string;\n\n //\n // CONSTANTS\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name'];\n }\n\n //\n // FACTORIES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static deserialize(data: any): ProjectTradeType {\n return super.deserialize(ProjectTradeType, data);\n }\n\n public static fromAPI(data: any, translationsData: any[]): ProjectTradeType {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['projectTradeTypeId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: ProjectTradeType = new ProjectTradeType();\n item.id = parseFloat(data['id']);\n item.name = translationData['name'];\n return item;\n }\n\n public static fromAPIList(data: any[], translationsData: any[]): ProjectTradeType[] {\n const items: ProjectTradeType[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectTradeType.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n public clone(): ProjectTradeType {\n return ProjectTradeType.deserialize(JSON.parse(JSON.stringify(this)));\n }\n}\n\n//\n//\n// ProjectTypeGroup\n//\n//\n\nexport class ProjectTypeGroup {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'ProjectTypeGroup';\n public static readonly ID_MEDTECH: number = 1;\n public static readonly ID_BIOTECH: number = 2;\n public static readonly ID_HEALTHCARE: number = 3;\n public id: number;\n\n //\n // CONSTANTS\n //\n public name: string;\n public description: string;\n\n constructor() {\n }\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): ProjectTypeGroup {\n const item = new ProjectTypeGroup();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): ProjectTypeGroup {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['projectTypeGroupId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: ProjectTypeGroup = new ProjectTypeGroup();\n item.id = parseFloat(data['id']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): ProjectTypeGroup[] {\n const items: ProjectTypeGroup[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectTypeGroup.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description\n };\n return item;\n }\n\n public clone(): ProjectTypeGroup {\n return ProjectTypeGroup.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// ProjectType\n//\n//\n\nexport class ProjectType {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'ProjectType';\n public id: number;\n public projectTypeGroupId: number;\n public name: string;\n public description: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'projectTypeGroupId'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getFields(): string[] {\n return ['id', 'projectTypeGroupId', 'name', 'description'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): ProjectType {\n const item = new ProjectType();\n item.id = data['id'];\n item.projectTypeGroupId = data['projectTypeGroupId'];\n item.name = data['name'];\n item.description = data['description'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): ProjectType {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['projectTypeId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: ProjectType = new ProjectType();\n item.id = parseFloat(data['id']);\n item.projectTypeGroupId = parseFloat(data['projectTypeGroupId']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): ProjectType[] {\n const items: ProjectType[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectType.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n projectTypeGroupId: this.projectTypeGroupId,\n name: this.name,\n description: this.description\n };\n return item;\n }\n\n public clone(): ProjectType {\n return ProjectType.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// TherapeuticArea\n//\n//\n\nexport class TherapeuticArea {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'TherapeuticArea';\n public static readonly ID_ANAESTHESIOLOGY: number = 1;\n public static readonly ID_ANGIOLOGY: number = 2;\n public static readonly ID_CARDIOLOGY: number = 3;\n public static readonly ID_DERMATOLOGY: number = 4;\n\n //\n // CONSTANTS\n //\n public static readonly ID_ENDOCRINOLOGY: number = 5;\n public static readonly ID_GASTROENTEROLOGY: number = 6;\n public static readonly ID_GERIATRICS: number = 7;\n public static readonly ID_GYNECOLOGY: number = 8;\n public static readonly ID_HERMATOLOGY: number = 9;\n public static readonly ID_IMMUNOLOGY: number = 10;\n public static readonly ID_INFECTIOUS_DISEASES: number = 11;\n public static readonly ID_NEPHROLOGY: number = 12;\n public static readonly ID_NEUROLOGY: number = 13;\n public static readonly ID_ONCOLOGY: number = 14;\n public static readonly ID_OPHTHALMOLOGY: number = 15;\n public static readonly ID_ORTHOPAEDICS: number = 16;\n public static readonly ID_OTOROHINOLARYNGOLOGY: number = 17;\n public static readonly ID_PAEDIATRICS: number = 18;\n public static readonly ID_PULMONOLOGY: number = 18;\n public static readonly ID_PRIMARY_CARE: number = 20;\n public static readonly ID_PSYCHIATRY: number = 21;\n public static readonly ID_RADIOLOGY: number = 22;\n public static readonly ID_RHEUMATOLOGY: number = 23;\n public static readonly ID_SURGERY: number = 24;\n public static readonly ID_TROPICAL_AND_HUMANITARIAN_MEDICINE: number = 25;\n public static readonly ID_UROLOGY: number = 26;\n public static readonly ID_RARE_DISEASES: number = 27;\n public id: number;\n public name: string;\n public description: string;\n\n constructor() {\n }\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): TherapeuticArea {\n const item = new TherapeuticArea();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): TherapeuticArea {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['therapeuticAreaId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: TherapeuticArea = new TherapeuticArea();\n item.id = parseFloat(data['id']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): TherapeuticArea[] {\n const items: TherapeuticArea[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(TherapeuticArea.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description\n };\n return item;\n }\n\n public clone(): TherapeuticArea {\n return TherapeuticArea.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// DevelopmentPhase\n//\n//\n\nexport class DevelopmentPhase {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'DevelopmentPhase';\n public static readonly ID_DISCOVERY: number = 2;\n public static readonly ID_PROTOTYPING: number = 3;\n public static readonly ID_CLINICAL_DEVELOPMENT: number = 4;\n public static readonly ID_CANDIDATE: number = 5;\n\n //\n // CONSTANTS\n //\n public static readonly ID_CLINICAL_TRIALS: number = 6;\n public static readonly ID_APPROVAL: number = 7;\n public static readonly ID_PRODUCT: number = 8;\n public id: number;\n public name: string;\n public description: string;\n public ordinal: number;\n\n //\n // FACTORIES\n //\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'ordinal'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getFields(): string[] {\n return ['id', 'name', 'description', 'ordinal'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): DevelopmentPhase {\n const item = new DevelopmentPhase();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n item.ordinal = data['ordinal'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): DevelopmentPhase {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['developmentPhaseId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: DevelopmentPhase = new DevelopmentPhase();\n item.id = parseFloat(data['id']);\n item.ordinal = parseFloat(data['ordinal']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): DevelopmentPhase[] {\n const items: DevelopmentPhase[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(DevelopmentPhase.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description,\n ordinal: this.ordinal\n };\n return item;\n }\n\n public clone(): DevelopmentPhase {\n return DevelopmentPhase.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// AcademicInstitutionGroup\n//\n//\n\nexport class AcademicInstitutionGroup {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'AcademicInstitutionGroup';\n public static readonly ID_UNIVERSITIES: number = 1;\n public static readonly ID_UNIVERSITIES_OF_APPLIED_SCIENCES: number = 2;\n public static readonly ID_OTHER: number = 3;\n public static readonly ID_ETH: number = 4;\n\n //\n // CONSTANTS\n //\n public id: number;\n public name: string;\n public description: string;\n public ordinal: number;\n\n //\n // FACTORIES\n //\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'ordinal'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getFields(): string[] {\n return ['id', 'name', 'description', 'ordinal'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): AcademicInstitutionGroup {\n const item = new AcademicInstitutionGroup();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n item.ordinal = data['ordinal'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): AcademicInstitutionGroup {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['academicInstitutionGroupId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: AcademicInstitutionGroup = new AcademicInstitutionGroup();\n item.id = parseFloat(data['id']);\n item.ordinal = parseFloat(data['ordinal']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): AcademicInstitutionGroup[] {\n const items: AcademicInstitutionGroup[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(AcademicInstitutionGroup.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description,\n ordinal: this.ordinal\n };\n return item;\n }\n\n public clone(): AcademicInstitutionGroup {\n return AcademicInstitutionGroup.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// AcademicInstitution\n//\n//\n\nexport class AcademicInstitution {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'AcademicInstitution';\n public static readonly ID_EPFL: number = 1;\n public static readonly ID_ETHZ: number = 2;\n public static readonly ID_UNI_ZH: number = 3;\n public static readonly ID_UNI_BS: number = 4;\n\n //\n // CONSTANTS\n //\n public static readonly ID_UNI_BE: number = 5;\n public static readonly ID_UNI_SG: number = 6;\n public static readonly ID_UNI_LU: number = 7;\n public static readonly ID_UNI_NE: number = 8;\n public static readonly ID_UNI_FR: number = 9;\n public static readonly ID_UNI_GE: number = 10;\n public static readonly ID_UNI_VD: number = 11;\n public static readonly ID_UNI_TI: number = 12;\n public static readonly ID_BFH: number = 13;\n public static readonly ID_FHNW: number = 14;\n public static readonly ID_ZFH: number = 15;\n public static readonly ID_HSLU: number = 16;\n public static readonly ID_FHO: number = 17;\n public static readonly ID_KALAIDOS: number = 18;\n public static readonly ID_HESSO: number = 19;\n public static readonly ID_SUPSI: number = 20;\n public static readonly ID_NONE: number = 21;\n public static readonly ID_OTHER: number = 22;\n public static readonly ID_PSI: number = 23;\n public static readonly ID_EMPA: number = 24;\n public id: number;\n public academicInstitutionGroupId: number;\n public name: string;\n public description: string;\n\n //\n // FACTORIES\n //\n public ordinal: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'academicInstitutionGroupId', 'ordinal'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'academicInstitutionGroupId', 'name', 'description', 'ordinal'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): AcademicInstitution {\n const item = new AcademicInstitution();\n item.id = data['id'];\n item.academicInstitutionGroupId = data['academicInstitutionGroupId'];\n item.name = data['name'];\n item.description = data['description'];\n item.ordinal = data['ordinal'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): AcademicInstitution {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['academicInstitutionId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: AcademicInstitution = new AcademicInstitution();\n item.id = parseFloat(data['id']);\n item.academicInstitutionGroupId = parseFloat(data['academicInstitutionGroupId']);\n item.ordinal = parseFloat(data['ordinal']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): AcademicInstitution[] {\n const items: AcademicInstitution[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(AcademicInstitution.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n academicInstitutionGroupId: this.academicInstitutionGroupId,\n name: this.name,\n description: this.description,\n ordinal: this.ordinal\n };\n return item;\n }\n\n public clone(): AcademicInstitution {\n return AcademicInstitution.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// TeamMemberType\n//\n//\n\nexport class TeamMemberType {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'TeamMemberType';\n public static readonly ID_MEMBER: number = 1;\n public static readonly ID_ADVISORY_BOARD: number = 2;\n public static readonly ID_BOARD_OF_DIRECTORS: number = 3;\n public id: number;\n\n //\n // CONSTANTS\n //\n public name: string;\n public description: string;\n\n constructor() {\n }\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): TeamMemberType {\n const item = new TeamMemberType();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): TeamMemberType {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['teamMemberTypeId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: TeamMemberType = new TeamMemberType();\n item.id = parseFloat(data['id']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): TeamMemberType[] {\n const items: TeamMemberType[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(TeamMemberType.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description\n };\n return item;\n }\n\n public clone(): TeamMemberType {\n return TeamMemberType.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// ProjectVisibility\n//\n//\n\nexport class ProjectVisibility {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'ProjectVisibility';\n public static readonly ID_NONE: number = 1;\n public static readonly ID_TITLE: number = 2;\n public static readonly ID_TITLE_SUBTITLE: number = 3;\n public static readonly ID_TITLE_SUBTITLE_DESCRIPTION: number = 4;\n\n //\n // CONSTANTS\n //\n public id: number;\n public name: string;\n public description: string;\n\n constructor() {\n }\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): ProjectVisibility {\n const item = new ProjectVisibility();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): ProjectVisibility {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['projectVisibilityId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: ProjectVisibility = new ProjectVisibility();\n item.id = parseFloat(data['id']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): ProjectVisibility[] {\n const items: ProjectVisibility[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectVisibility.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description\n };\n return item;\n }\n\n public clone(): ProjectVisibility {\n return ProjectVisibility.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// PatentState\n//\n//\n\nexport class PatentState {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'PatentState';\n public static readonly ID_PLANNED: number = 1;\n public static readonly ID_FILED: number = 2;\n public static readonly ID_GRANTED: number = 3;\n public static readonly ID_NOT_PLANNED: number = 4;\n\n //\n // CONSTANTS\n //\n public id: number;\n public name: string;\n public description: string;\n\n constructor() {\n }\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): PatentState {\n const item = new PatentState();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): PatentState {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['patentStateId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: PatentState = new PatentState();\n item.id = parseFloat(data['id']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): PatentState[] {\n const items: PatentState[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(PatentState.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description\n };\n return item;\n }\n\n public clone(): PatentState {\n return PatentState.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// FundingRound\n//\n//\n\nexport class FundingRound {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'FundingRound';\n public static readonly ID_PRE_SEED: number = 1;\n public static readonly ID_SEED: number = 2;\n public static readonly ID_SERIES_A: number = 3;\n public static readonly ID_SERIES_B: number = 4;\n\n //\n // CONSTANTS\n //\n public static readonly ID_SERIES_C: number = 5;\n public static readonly ID_OTHER: number = 6;\n public id: number;\n public name: string;\n public description: string;\n\n constructor() {\n }\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): FundingRound {\n const item = new FundingRound();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): FundingRound {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['fundingRoundId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: FundingRound = new FundingRound();\n item.id = parseFloat(data['id']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): FundingRound[] {\n const items: FundingRound[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(FundingRound.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description\n };\n return item;\n }\n\n public clone(): FundingRound {\n return FundingRound.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// ProjectValidationState\n//\n//\n\nexport class ProjectValidationState {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'ProjectValidationState';\n public static readonly ID_DRAFT: number = 1;\n public static readonly ID_PENDING_VALIDATION: number = 2;\n public static readonly ID_PUBLISHED: number = 3;\n public static readonly ID_REFUSED: number = 4;\n\n //\n // CONSTANTS\n //\n public id: number;\n public name: string;\n public description: string;\n\n constructor() {\n }\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): ProjectValidationState {\n const item = new ProjectValidationState();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): ProjectValidationState {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['projectValidationStateId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: ProjectValidationState = new ProjectValidationState();\n item.id = parseFloat(data['id']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): ProjectValidationState[] {\n const items: ProjectValidationState[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectValidationState.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description\n };\n return item;\n }\n\n public clone(): ProjectValidationState {\n return ProjectValidationState.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// ProjectPrize\n//\n//\n\nexport class ProjectPrize {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'ProjectPrize';\n public id: number;\n public projectId: number;\n public name: string;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'projectId', 'name', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'projectId', 'name', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): ProjectPrize {\n const item = new ProjectPrize();\n item.id = data['id'];\n item.projectId = data['projectId'];\n item.name = data['name'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): ProjectPrize {\n const item: ProjectPrize = new ProjectPrize();\n item.id = parseFloat(data['id']);\n item.projectId = parseFloat(data['projectId']);\n item.name = data['name'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): ProjectPrize[] {\n const items: ProjectPrize[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectPrize.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n projectId: this.projectId,\n name: this.name,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): ProjectPrize {\n return ProjectPrize.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// ProjectPastFunding\n//\n//\n\nexport class ProjectPastFunding {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'ProjectPastFunding';\n public id: number;\n public projectId: number;\n public source: string;\n public amount: number;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n\n //\n // ATTRIBUTES\n //\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'projectId', 'source', 'amount', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'projectId', 'source', 'amount', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): ProjectPastFunding {\n const item = new ProjectPastFunding();\n item.id = data['id'];\n item.projectId = data['projectId'];\n item.source = data['source'];\n item.amount = data['amount'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): ProjectPastFunding {\n const item: ProjectPastFunding = new ProjectPastFunding();\n item.id = parseFloat(data['id']);\n item.projectId = parseFloat(data['projectId']);\n item.source = data['source'];\n item.amount = parseFloat(data['amount']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): ProjectPastFunding[] {\n const items: ProjectPastFunding[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectPastFunding.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n projectId: this.projectId,\n source: this.source,\n amount: this.amount,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): ProjectPastFunding {\n return ProjectPastFunding.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// ProjectTeamMember\n//\n//\n\nexport class ProjectTeamMember {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'ProjectTeamMember';\n public id: number;\n public projectId: number;\n public teamMemberTypeId: number;\n public firstName: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public lastName: string;\n public teamFunction: string;\n public createDate: string;\n\n //\n // ATTRIBUTES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'projectId', 'teamMemberTypeId', 'firstName', 'lastName', 'teamFunction', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'projectId', 'teamMemberTypeId', 'firstName', 'lastName', 'teamFunction', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): ProjectTeamMember {\n const item = new ProjectTeamMember();\n item.id = data['id'];\n item.projectId = data['projectId'];\n item.teamMemberTypeId = data['teamMemberTypeId'];\n item.firstName = data['firstName'];\n item.lastName = data['lastName'];\n item.teamFunction = data['teamFunction'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): ProjectTeamMember {\n const item: ProjectTeamMember = new ProjectTeamMember();\n item.id = parseFloat(data['id']);\n item.projectId = parseFloat(data['projectId']);\n item.teamMemberTypeId = parseFloat(data['teamMemberTypeId']);\n item.firstName = data['firstName'];\n item.lastName = data['lastName'];\n item.teamFunction = data['teamFunction'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): ProjectTeamMember[] {\n const items: ProjectTeamMember[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectTeamMember.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n projectId: this.projectId,\n teamMemberTypeId: this.teamMemberTypeId,\n firstName: this.firstName,\n lastName: this.lastName,\n teamFunction: this.teamFunction,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): ProjectTeamMember {\n return ProjectTeamMember.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// Project\n//\n//\n\nexport class Project extends ModelSerialization {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Project';\n public id: number;\n public ownerId: number;\n public projectValidationStateId: number;\n public fileGroupId: number;\n public projectVisibilityId: number;\n public developmentPhaseId: number;\n public academicInstitution1Id: number;\n\n //\n // ATTRIBUTES\n //\n public academicInstitution2Id: number;\n public patentStateId: number;\n public fundingRoundId: number;\n public name: string;\n public pipeline: string;\n public keywords: string;\n public logo: string;\n public illustration: string;\n public isNotForProfit: number;\n public isCompanyIncorporated: number;\n public incorporationYear: number;\n public isSpinOff: number;\n public customAcademicInstitution: string;\n public isRaisingFunds: number;\n public raisingFundsAmount: number;\n public dateOfClosingRound: string;\n public customFundingRound: string;\n public isSeekingPartnerships: number;\n public partnershipTerms: string;\n public isOfferingLicensing: number;\n public licensingOffer: string;\n public teamPicture: string;\n public contactWebsite: string;\n public contactFirstName: string;\n public contactLastName: string;\n public contactEmail: string;\n public contactPhone: string;\n public contactAddress: string;\n public isLeadInvestorIdentified: number;\n public isTTOAgreementAccepted: number;\n public TTOContact: string;\n public isInstitutionLicenseOwned: number;\n public developmentPhaseUpdateDate: string;\n public isRaisingFundsUpdateDate: string;\n public isLeadInvestorIdentifiedUpdateDate: string;\n public publishDate: string;\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n public biotechDirectoryUrl: string;\n public projectTradeTypeId: number;\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'ownerId', 'projectValidationStateId', 'fileGroupId', 'projectVisibilityId', 'developmentPhaseId', 'academicInstitution1Id', 'academicInstitution2Id', 'patentStateId', 'fundingRoundId', 'logo', 'illustration', 'isNotForProfit', 'isCompanyIncorporated', 'incorporationYear', 'isSpinOff', 'customAcademicInstitution', 'isRaisingFunds', 'raisingFundsAmount', 'dateOfClosingRound', 'customFundingRound', 'isSeekingPartnerships', 'isOfferingLicensing', 'teamPicture', 'contactWebsite', 'contactFirstName', 'contactLastName', 'contactEmail', 'contactPhone', 'contactAddress', 'isLeadInvestorIdentified', 'isTTOAgreementAccepted', 'TTOContact', 'isInstitutionLicenseOwned', 'developmentPhaseUpdateDate', 'isRaisingFundsUpdateDate', 'isLeadInvestorIdentifiedUpdateDate', 'publishDate', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId', 'biotechDirectoryUrl', 'projectTradeTypeId'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'pipeline', 'keywords', 'partnershipTerms', 'licensingOffer'];\n }\n\n public static getFields(): string[] {\n return ['id', 'ownerId', 'projectValidationStateId', 'fileGroupId', 'projectVisibilityId', 'developmentPhaseId', 'academicInstitution1Id', 'academicInstitution2Id', 'patentStateId', 'fundingRoundId', 'name', 'pipeline', 'keywords', 'logo', 'illustration', 'isNotForProfit', 'isCompanyIncorporated', 'incorporationYear', 'isSpinOff', 'customAcademicInstitution', 'isRaisingFunds', 'raisingFundsAmount', 'dateOfClosingRound', 'customFundingRound', 'isSeekingPartnerships', 'partnershipTerms', 'isOfferingLicensing', 'licensingOffer', 'teamPicture', 'contactWebsite', 'contactFirstName', 'contactLastName', 'contactEmail', 'contactPhone', 'contactAddress', 'isLeadInvestorIdentified', 'isTTOAgreementAccepted', 'TTOContact', 'isInstitutionLicenseOwned', 'developmentPhaseUpdateDate', 'isRaisingFundsUpdateDate', 'isLeadInvestorIdentifiedUpdateDate', 'publishDate', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId', 'biotechDirectoryUrl', 'projectTradeTypeId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static deserialize(data: any): Project {\n return super.deserialize(Project, data);\n }\n\n public static fromAPI(data: any, translationsData: any[]): Project {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['projectId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: Project = new Project();\n item.id = parseFloat(data['id']);\n item.ownerId = parseFloat(data['ownerId']);\n item.projectValidationStateId = parseFloat(data['projectValidationStateId']);\n item.fileGroupId = parseFloat(data['fileGroupId']);\n item.projectVisibilityId = parseFloat(data['projectVisibilityId']);\n item.developmentPhaseId = parseFloat(data['developmentPhaseId']);\n item.academicInstitution1Id = data['academicInstitution1Id'];\n item.academicInstitution2Id = data['academicInstitution2Id'];\n item.patentStateId = parseFloat(data['patentStateId']);\n item.fundingRoundId = parseFloat(data['fundingRoundId']);\n item.logo = data['logo'];\n item.illustration = data['illustration'];\n item.isNotForProfit = parseFloat(data['isNotForProfit']);\n item.isCompanyIncorporated = parseFloat(data['isCompanyIncorporated']);\n item.incorporationYear = parseFloat(data['incorporationYear']);\n item.isSpinOff = parseFloat(data['isSpinOff']);\n item.customAcademicInstitution = data['customAcademicInstitution'];\n item.isRaisingFunds = parseFloat(data['isRaisingFunds']);\n item.raisingFundsAmount = parseFloat(data['raisingFundsAmount']);\n item.dateOfClosingRound = data['dateOfClosingRound'];\n item.customFundingRound = data['customFundingRound'];\n item.isSeekingPartnerships = parseFloat(data['isSeekingPartnerships']);\n item.isOfferingLicensing = parseFloat(data['isOfferingLicensing']);\n item.teamPicture = data['teamPicture'];\n item.contactWebsite = data['contactWebsite'];\n item.contactFirstName = data['contactFirstName'];\n item.contactLastName = data['contactLastName'];\n item.contactEmail = data['contactEmail'];\n item.contactPhone = data['contactPhone'];\n item.contactAddress = data['contactAddress'];\n item.isLeadInvestorIdentified = parseFloat(data['isLeadInvestorIdentified']);\n item.isTTOAgreementAccepted = parseFloat(data['isTTOAgreementAccepted']);\n item.TTOContact = data['TTOContact'];\n item.isInstitutionLicenseOwned = parseFloat(data['isInstitutionLicenseOwned']);\n item.developmentPhaseUpdateDate = data['developmentPhaseUpdateDate'];\n item.isRaisingFundsUpdateDate = data['isRaisingFundsUpdateDate'];\n item.isLeadInvestorIdentifiedUpdateDate = data['isLeadInvestorIdentifiedUpdateDate'];\n item.publishDate = data['publishDate'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n item.name = translationData['name'];\n item.pipeline = translationData['pipeline'];\n item.keywords = translationData['keywords'];\n item.partnershipTerms = translationData['partnershipTerms'];\n item.licensingOffer = translationData['licensingOffer'];\n item.biotechDirectoryUrl = data['biotechDirectoryUrl'];\n item.projectTradeTypeId = parseFloat(data['projectTradeTypeId']);\n return item;\n }\n\n public static fromAPIList(data: any[], translationsData: any[]): Project[] {\n const items: Project[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Project.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n public clone(): Project {\n return Project.deserialize(JSON.parse(JSON.stringify(this)));\n }\n}\n\n//\n//\n// ProjectMembership\n//\n//\n\nexport class ProjectMembership {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'ProjectMembership';\n public id: number;\n public projectId: number;\n public userId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'projectId', 'userId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'projectId', 'userId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): ProjectMembership {\n const item = new ProjectMembership();\n item.id = data['id'];\n item.projectId = data['projectId'];\n item.userId = data['userId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): ProjectMembership {\n const item: ProjectMembership = new ProjectMembership();\n item.id = parseFloat(data['id']);\n item.projectId = parseFloat(data['projectId']);\n item.userId = parseFloat(data['userId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): ProjectMembership[] {\n const items: ProjectMembership[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectMembership.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n projectId: this.projectId,\n userId: this.userId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): ProjectMembership {\n return ProjectMembership.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// ProjectCase_ProjectType\n//\n//\n\nexport class ProjectCase_ProjectType {\n\n public static readonly tableName = 'ProjectCase_ProjectType';\n public id: number;\n public projectCaseId: number;\n public projectTypeId: number;\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'projectCaseId', 'projectTypeId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'projectCaseId', 'projectTypeId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): ProjectCase_ProjectType {\n const item = new ProjectCase_ProjectType();\n item.id = data['id'];\n item.projectCaseId = data['projectCaseId'];\n item.projectTypeId = data['projectTypeId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): ProjectCase_ProjectType {\n const item: ProjectCase_ProjectType = new ProjectCase_ProjectType();\n item.id = parseFloat(data['id']);\n item.projectCaseId = parseFloat(data['projectCaseId']);\n item.projectTypeId = parseFloat(data['projectTypeId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n public static fromAPIList(data: any[]): ProjectCase_ProjectType[] {\n const items: ProjectCase_ProjectType[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectCase_ProjectType.fromAPI(data[i]));\n }\n return items;\n }\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n projectCaseId: this.projectCaseId,\n projectTypeId: this.projectTypeId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): ProjectCase_ProjectType {\n return ProjectCase_ProjectType.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// ProjectCase_TherapeuticArea\n//\n//\n\nexport class ProjectCase_TherapeuticArea {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'ProjectCase_TherapeuticArea';\n public id: number;\n public projectCaseId: number;\n public therapeuticAreaId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'projectCaseId', 'therapeuticAreaId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'projectCaseId', 'therapeuticAreaId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): ProjectCase_TherapeuticArea {\n const item = new ProjectCase_TherapeuticArea();\n item.id = data['id'];\n item.projectCaseId = data['projectCaseId'];\n item.therapeuticAreaId = data['therapeuticAreaId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): ProjectCase_TherapeuticArea {\n const item: ProjectCase_TherapeuticArea = new ProjectCase_TherapeuticArea();\n item.id = parseFloat(data['id']);\n item.projectCaseId = parseFloat(data['projectCaseId']);\n item.therapeuticAreaId = parseFloat(data['therapeuticAreaId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): ProjectCase_TherapeuticArea[] {\n const items: ProjectCase_TherapeuticArea[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectCase_TherapeuticArea.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n projectCaseId: this.projectCaseId,\n therapeuticAreaId: this.therapeuticAreaId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): ProjectCase_TherapeuticArea {\n return ProjectCase_TherapeuticArea.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// DevelopmentPhase_ProjectTypeGroup\n//\n//\n\nexport class DevelopmentPhase_ProjectTypeGroup {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'DevelopmentPhase_ProjectTypeGroup';\n public id: number;\n public developmentPhaseId: number;\n public projectTypeGroupId: number;\n\n constructor() {\n }\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'developmentPhaseId', 'projectTypeGroupId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'developmentPhaseId', 'projectTypeGroupId'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): DevelopmentPhase_ProjectTypeGroup {\n const item = new DevelopmentPhase_ProjectTypeGroup();\n item.id = data['id'];\n item.developmentPhaseId = data['developmentPhaseId'];\n item.projectTypeGroupId = data['projectTypeGroupId'];\n return item;\n }\n\n public static fromAPI(data: any): DevelopmentPhase_ProjectTypeGroup {\n const item: DevelopmentPhase_ProjectTypeGroup = new DevelopmentPhase_ProjectTypeGroup();\n item.id = parseFloat(data['id']);\n item.developmentPhaseId = parseFloat(data['developmentPhaseId']);\n item.projectTypeGroupId = parseFloat(data['projectTypeGroupId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): DevelopmentPhase_ProjectTypeGroup[] {\n const items: DevelopmentPhase_ProjectTypeGroup[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(DevelopmentPhase_ProjectTypeGroup.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n developmentPhaseId: this.developmentPhaseId,\n projectTypeGroupId: this.projectTypeGroupId\n };\n return item;\n }\n\n public clone(): DevelopmentPhase_ProjectTypeGroup {\n return DevelopmentPhase_ProjectTypeGroup.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// NotificationType\n//\n//\n\nexport class NotificationType {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'NotificationType';\n public static readonly ID_FAVORITE_PHASE_CHANGED: number = 1;\n public static readonly ID_ALERT_MATCH: number = 2;\n public static readonly ID_FAVORITE_SEEKING_FUNDS_CHANGED: number = 3;\n public static readonly ID_FAVORITE_LEAD_INVESTOR_CHANGED: number = 4;\n\n //\n // CONSTANTS\n //\n public static readonly ID_PROJECT_OBSOLESCENCE_REMINDER_1: number = 5;\n public static readonly ID_PROJECT_OBSOLESCENCE_REMINDER_2: number = 6;\n public static readonly ID_PROJECT_OBSOLESCENCE_DELETE: number = 7;\n public id: number;\n public name: string;\n public description: string;\n\n constructor() {\n }\n\n //\n // FACTORIES\n //\n\n public static getNonTranslatableFields(): string[] {\n return ['id'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n public static getFields(): string[] {\n return ['id', 'name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): NotificationType {\n const item = new NotificationType();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): NotificationType {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['notificationTypeId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: NotificationType = new NotificationType();\n item.id = parseFloat(data['id']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): NotificationType[] {\n const items: NotificationType[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(NotificationType.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description\n };\n return item;\n }\n\n public clone(): NotificationType {\n return NotificationType.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// ProjectCase\n//\n//\n\nexport class ProjectCase {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'ProjectCase';\n public id: number;\n public projectId: number;\n public developmentPhaseId: number;\n public patentStateId: number;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public title: string;\n public subtitle: string;\n public description: string;\n\n //\n // ATTRIBUTES\n //\n public uniqueness: string;\n public unmetNeed: string;\n public marketSize: string;\n public competition: string;\n public developmentPhaseUpdateDate: string;\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'projectId', 'developmentPhaseId', 'patentStateId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['title', 'subtitle', 'description', 'uniqueness', 'unmetNeed', 'marketSize', 'competition'];\n }\n\n public static getFields(): string[] {\n return ['id', 'projectId', 'developmentPhaseId', 'patentStateId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId', 'title', 'subtitle', 'description', 'uniqueness', 'unmetNeed', 'marketSize', 'competition'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): ProjectCase {\n const item = new ProjectCase();\n item.id = data['id'];\n item.projectId = data['projectId'];\n item.developmentPhaseId = data['developmentPhaseId'];\n item.patentStateId = data['patentStateId'];\n item.title = data['title'];\n item.subtitle = data['subtitle'];\n item.description = data['description'];\n item.uniqueness = data['uniqueness'];\n item.unmetNeed = data['unmetNeed'];\n item.marketSize = data['marketSize'];\n item.competition = data['competition'];\n item.developmentPhaseUpdateDate = data['developmentPhaseUpdateDate'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): ProjectCase {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['projectCaseId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: ProjectCase = new ProjectCase();\n item.id = parseFloat(data['id']);\n item.projectId = parseFloat(data['projectId']);\n item.developmentPhaseId = parseFloat(data['developmentPhaseId']);\n item.patentStateId = parseFloat(data['patentStateId']);\n item.developmentPhaseUpdateDate = data['developmentPhaseUpdateDate'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n item.title = translationData['title'];\n item.subtitle = translationData['subtitle'];\n item.description = translationData['description'];\n item.uniqueness = translationData['uniqueness'];\n item.unmetNeed = translationData['unmetNeed'];\n item.marketSize = translationData['marketSize'];\n item.competition = translationData['competition'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): ProjectCase[] {\n const items: ProjectCase[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(ProjectCase.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n projectId: this.projectId,\n developmentPhaseId: this.developmentPhaseId,\n patentStateId: this.patentStateId,\n title: this.title,\n subtitle: this.subtitle,\n description: this.description,\n uniqueness: this.uniqueness,\n unmetNeed: this.unmetNeed,\n marketSize: this.marketSize,\n competition: this.competition,\n developmentPhaseUpdateDate: this.developmentPhaseUpdateDate,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): ProjectCase {\n return ProjectCase.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// Notification\n//\n//\n\nexport class Notification {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Notification';\n public id: number;\n public notificationTypeId: number;\n public userId: number;\n public isEmailed: boolean;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public isSeen: boolean;\n public isOpen: boolean;\n public link: string;\n\n //\n // ATTRIBUTES\n //\n public linkTitle: string;\n public title: string;\n public message: string;\n public icon: string;\n public payload: string;\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'notificationTypeId', 'userId', 'isEmailed', 'isSeen', 'isOpen', 'link', 'linkTitle', 'title', 'message', 'icon', 'payload', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'notificationTypeId', 'userId', 'isEmailed', 'isSeen', 'isOpen', 'link', 'linkTitle', 'title', 'message', 'icon', 'payload', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Notification {\n const item = new Notification();\n item.id = data['id'];\n item.notificationTypeId = data['notificationTypeId'];\n item.userId = data['userId'];\n item.isEmailed = data['isEmailed'];\n item.isSeen = data['isSeen'];\n item.isOpen = data['isOpen'];\n item.link = data['link'];\n item.linkTitle = data['linkTitle'];\n item.title = data['title'];\n item.message = data['message'];\n item.icon = data['icon'];\n item.payload = data['payload'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): Notification {\n const item: Notification = new Notification();\n item.id = parseFloat(data['id']);\n item.notificationTypeId = parseFloat(data['notificationTypeId']);\n item.userId = parseFloat(data['userId']);\n item.isEmailed = data['isEmailed'];\n item.isSeen = data['isSeen'];\n item.isOpen = data['isOpen'];\n item.link = data['link'];\n item.linkTitle = data['linkTitle'];\n item.title = data['title'];\n item.message = data['message'];\n item.icon = data['icon'];\n item.payload = data['payload'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): Notification[] {\n const items: Notification[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Notification.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n notificationTypeId: this.notificationTypeId,\n userId: this.userId,\n isEmailed: this.isEmailed,\n isSeen: this.isSeen,\n isOpen: this.isOpen,\n link: this.link,\n linkTitle: this.linkTitle,\n title: this.title,\n message: this.message,\n icon: this.icon,\n payload: this.payload,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): Notification {\n return Notification.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// User_AcademicInstitution\n//\n//\n\nexport class User_AcademicInstitution {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'User_AcademicInstitution';\n public id: number;\n public userId: number;\n public academicInstitutionId: number;\n public isDispatcher: boolean;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n\n //\n // ATTRIBUTES\n //\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'userId', 'academicInstitutionId', 'isDispatcher', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'userId', 'academicInstitutionId', 'isDispatcher', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): User_AcademicInstitution {\n const item = new User_AcademicInstitution();\n item.id = data['id'];\n item.userId = data['userId'];\n item.academicInstitutionId = data['academicInstitutionId'];\n item.isDispatcher = data['isDispatcher'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): User_AcademicInstitution {\n const item: User_AcademicInstitution = new User_AcademicInstitution();\n item.id = parseFloat(data['id']);\n item.userId = parseFloat(data['userId']);\n item.academicInstitutionId = parseFloat(data['academicInstitutionId']);\n item.isDispatcher = data['isDispatcher'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): User_AcademicInstitution[] {\n const items: User_AcademicInstitution[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(User_AcademicInstitution.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n userId: this.userId,\n academicInstitutionId: this.academicInstitutionId,\n isDispatcher: this.isDispatcher,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): User_AcademicInstitution {\n return User_AcademicInstitution.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// MetricsRecord\n//\n//\n\nexport class MetricsRecord {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'MetricsRecord';\n public static readonly TAG_PROJECT_SEEN: string = 'seen';\n public static readonly TAG_FAVORITE_ADDED: string = 'favorite-added';\n public static readonly TAG_FAVORITE_REMOVED: string = 'favorite-removed';\n public id: number;\n\n //\n // CONSTANTS\n //\n public projectId: number;\n public tag: string;\n public payload: string;\n\n //\n // FACTORIES\n //\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n\n //\n // ATTRIBUTES\n //\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'projectId', 'tag', 'payload', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'projectId', 'tag', 'payload', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): MetricsRecord {\n const item = new MetricsRecord();\n item.id = data['id'];\n item.projectId = data['projectId'];\n item.tag = data['tag'];\n item.payload = data['payload'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): MetricsRecord {\n const item: MetricsRecord = new MetricsRecord();\n item.id = parseFloat(data['id']);\n item.projectId = parseFloat(data['projectId']);\n item.tag = data['tag'];\n item.payload = data['payload'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): MetricsRecord[] {\n const items: MetricsRecord[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(MetricsRecord.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n projectId: this.projectId,\n tag: this.tag,\n payload: this.payload,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): MetricsRecord {\n return MetricsRecord.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// Company\n//\n//\n\nexport class Company extends ModelSerialization {\n\n public static readonly tableName = 'Company';\n public id: number;\n public companyCompanyCategoryId: number;\n public isDisplayedOnHomepage: number;\n public name: string;\n public logo: string;\n public description: string;\n public website: string;\n public noWebsite: number;\n public noLogo: number;\n public investmentRangeFrom: number;\n public investmentRangeTo: number;\n public investmentComment: string;\n public isInterstedInPartnerships: number;\n public isInterstedInLicenses: number;\n public street1: string;\n public street2: string;\n public city: string;\n public country: string;\n public phone: string;\n public email: string;\n public noContactInfos: number;\n public createDate: string;\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n public isInvestingInPrivate: number;\n public isInvestingInPublic: number;\n public isCompleted: number;\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'companyCompanyCategoryId', 'isDisplayedOnHomepage', 'name', 'logo', 'description', 'website', 'investmentRangeFrom', 'investmentRangeTo', 'investmentComment', 'isInterstedInPartnerships', 'isInterstedInLicenses', 'street1', 'street2', 'city', 'country', 'phone', 'email', 'noContactInfos', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId', 'noWebsite', 'noLogo', 'isInvestingInPrivate', 'isInvestingInPublic', 'isCompleted'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'companyCompanyCategoryId', 'isDisplayedOnHomepage', 'name', 'logo', 'description', 'website', 'investmentRangeFrom', 'investmentRangeTo', 'investmentComment', 'isInterstedInPartnerships', 'isInterstedInLicenses', 'street1', 'street2', 'city', 'country', 'phone', 'email', 'noContactInfos', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId', 'noWebsite', 'noLogo', 'isInvestingInPrivate', 'isInvestingInPublic', 'isCompleted'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static deserialize(data: any): Company {\n return super.deserialize(Company, data);\n }\n\n public static fromAPI(data: any): Company {\n const item = new Company();\n item.id = parseFloat(data['id']);\n item.companyCompanyCategoryId = parseFloat(data['companyCompanyCategoryId']);\n item.isDisplayedOnHomepage = parseFloat(data['isDisplayedOnHomepage']);\n item.name = data['name'];\n item.logo = data['logo'];\n item.noLogo = parseFloat(data['noLogo']);\n item.noWebsite = parseFloat(data['noWebsite']);\n item.description = data['description'];\n item.website = data['website'];\n item.investmentRangeFrom = parseFloat(data['investmentRangeFrom']);\n item.investmentRangeTo = parseFloat(data['investmentRangeTo']);\n item.investmentComment = data['investmentComment'];\n item.isInterstedInPartnerships = parseFloat(data['isInterstedInPartnerships']);\n item.isInterstedInLicenses = parseFloat(data['isInterstedInLicenses']);\n item.street1 = data['street1'];\n item.street2 = data['street2'];\n item.city = data['city'];\n item.country = data['country'];\n item.phone = data['phone'];\n item.email = data['email'];\n item.noContactInfos = parseFloat(data['noContactInfos']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n item.isInvestingInPrivate = parseFloat(data['isInvestingInPrivate']);\n item.isInvestingInPublic = parseFloat(data['isInvestingInPublic']);\n item.isCompleted = parseFloat(data['isCompleted']);\n return item;\n }\n\n public static fromAPIList(data: any[]): Company[] {\n const items: Company[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Company.fromAPI(data[i]));\n }\n return items;\n }\n\n public clone(): Company {\n return Company.deserialize(JSON.parse(JSON.stringify(this)));\n }\n}\n\n//\n//\n// Company_TherapeuticArea\n//\n//\n\nexport class Company_TherapeuticArea {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Company_TherapeuticArea';\n public id: number;\n public companyId: number;\n public therapeuticAreaId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'companyId', 'therapeuticAreaId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'companyId', 'therapeuticAreaId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Company_TherapeuticArea {\n const item = new Company_TherapeuticArea();\n item.id = data['id'];\n item.companyId = data['companyId'];\n item.therapeuticAreaId = data['therapeuticAreaId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): Company_TherapeuticArea {\n const item: Company_TherapeuticArea = new Company_TherapeuticArea();\n item.id = parseFloat(data['id']);\n item.companyId = parseFloat(data['companyId']);\n item.therapeuticAreaId = parseFloat(data['therapeuticAreaId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): Company_TherapeuticArea[] {\n const items: Company_TherapeuticArea[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Company_TherapeuticArea.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n companyId: this.companyId,\n therapeuticAreaId: this.therapeuticAreaId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): Company_TherapeuticArea {\n return Company_TherapeuticArea.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// Company_DevelopmentPhase\n//\n//\n\nexport class Company_DevelopmentPhase {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Company_DevelopmentPhase';\n public id: number;\n public companyId: number;\n public developmentPhaseId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'companyId', 'developmentPhaseId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'companyId', 'developmentPhaseId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Company_DevelopmentPhase {\n const item = new Company_DevelopmentPhase();\n item.id = data['id'];\n item.companyId = data['companyId'];\n item.developmentPhaseId = data['developmentPhaseId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): Company_DevelopmentPhase {\n const item: Company_DevelopmentPhase = new Company_DevelopmentPhase();\n item.id = parseFloat(data['id']);\n item.companyId = parseFloat(data['companyId']);\n item.developmentPhaseId = parseFloat(data['developmentPhaseId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): Company_DevelopmentPhase[] {\n const items: Company_DevelopmentPhase[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Company_DevelopmentPhase.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n companyId: this.companyId,\n developmentPhaseId: this.developmentPhaseId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): Company_DevelopmentPhase {\n return Company_DevelopmentPhase.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\nexport class Company_ProjectType {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'Company_ProjectType';\n public id: number;\n public companyId: number;\n public projectTypeId: number;\n public createDate: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n\n //\n // ATTRIBUTES\n //\n public deleteDate: string;\n public deleterId: number;\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'companyId', 'projectTypeId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'companyId', 'projectTypeId', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): Company_ProjectType {\n const item = new Company_ProjectType();\n item.id = data['id'];\n item.companyId = data['companyId'];\n item.projectTypeId = data['projectTypeId'];\n item.createDate = data['createDate'];\n item.createrId = data['createrId'];\n item.updateDate = data['updateDate'];\n item.updaterId = data['updaterId'];\n item.deleteDate = data['deleteDate'];\n item.deleterId = data['deleterId'];\n return item;\n }\n\n public static fromAPI(data: any): Company_ProjectType {\n const item: Company_ProjectType = new Company_ProjectType();\n item.id = parseFloat(data['id']);\n item.companyId = parseFloat(data['companyId']);\n item.projectTypeId = parseFloat(data['projectTypeId']);\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[]): Company_ProjectType[] {\n const items: Company_ProjectType[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(Company_ProjectType.fromAPI(data[i]));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n companyId: this.companyId,\n projectTypeId: this.projectTypeId,\n createDate: this.createDate,\n createrId: this.createrId,\n updateDate: this.updateDate,\n updaterId: this.updaterId,\n deleteDate: this.deleteDate,\n deleterId: this.deleterId\n };\n return item;\n }\n\n public clone(): Company_ProjectType {\n return Company_ProjectType.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// CompanyCompanyCategory\n//\n//\n\nexport class CompanyCompanyCategory {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'CompanyCompanyCategory';\n public id: number;\n public name: string;\n public description: string;\n public ordinal: number;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n //\n\n constructor() {\n }\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'ordinal'];\n }\n\n public static getTranslatableFields(): string[] {\n return ['name', 'description'];\n }\n\n //\n // ATTRIBUTES\n //\n\n public static getFields(): string[] {\n return ['id', 'name', 'description', 'ordinal'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n public static fromStorageRow(data: any): CompanyCompanyCategory {\n const item = new CompanyCompanyCategory();\n item.id = data['id'];\n item.name = data['name'];\n item.description = data['description'];\n item.ordinal = data['ordinal'];\n return item;\n }\n\n public static fromAPI(data: any, translationsData: any[]): CompanyCompanyCategory {\n let translationData = {};\n for (let i = 0; i < translationsData.length; i++) {\n if (translationsData[i]['companyCompanyCategoryId'] === data['id']) {\n translationData = translationsData[i];\n i = translationsData.length;\n }\n }\n const item: CompanyCompanyCategory = new CompanyCompanyCategory();\n item.id = parseFloat(data['id']);\n item.ordinal = parseFloat(data['ordinal']);\n item.name = translationData['name'];\n item.description = translationData['description'];\n return item;\n }\n\n //\n // CONSTRUCTOR\n //\n\n public static fromAPIList(data: any[], translationsData: any[]): CompanyCompanyCategory[] {\n const items: CompanyCompanyCategory[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(CompanyCompanyCategory.fromAPI(data[i], translationsData));\n }\n return items;\n }\n\n //\n // METHODS\n //\n\n public toJson(): Object {\n const item: any = {\n id: this.id,\n name: this.name,\n description: this.description,\n ordinal: this.ordinal\n };\n return item;\n }\n\n public clone(): CompanyCompanyCategory {\n return CompanyCompanyCategory.fromStorageRow(JSON.parse(JSON.stringify(this.toJson())));\n }\n}\n\n//\n//\n// CompanyContact\n//\n//\n\nexport class CompanyContact extends ModelSerialization {\n\n //\n // DESCRIPTORS\n //\n\n public static readonly tableName = 'CompanyContact';\n public id: number;\n public companyId: number;\n public firstName: string;\n public lastName: string;\n\n //\n // CONSTANTS\n //\n\n //\n // FACTORIES\n public email: string;\n public phone: string;\n public createDate: string;\n\n //\n // ATTRIBUTES\n //\n public createrId: number;\n public updateDate: string;\n public updaterId: number;\n public deleteDate: string;\n public deleterId: number;\n\n public static getNonTranslatableFields(): string[] {\n return ['id', 'companyId', 'firstName', 'lastName', 'email', 'phone', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getTranslatableFields(): string[] {\n return [];\n }\n\n public static getFields(): string[] {\n return ['id', 'companyId', 'firstName', 'lastName', 'email', 'phone', 'createDate', 'createrId', 'updateDate', 'updaterId', 'deleteDate', 'deleterId'];\n }\n\n public static getKeyFields(): string[] {\n return ['id'];\n }\n\n //\n public static deserialize(data: any): CompanyContact {\n return super.deserialize(CompanyContact, data);\n }\n\n public static fromAPI(data: any): CompanyContact {\n const item = new CompanyContact();\n item.id = parseFloat(data['id']);\n item.companyId = parseFloat(data['companyId']);\n item.firstName = data['firstName'];\n item.lastName = data['lastName'];\n item.email = data['email'];\n item.phone = data['phone'];\n item.createDate = data['createDate'];\n item.createrId = parseFloat(data['createrId']);\n item.updateDate = data['updateDate'];\n item.updaterId = parseFloat(data['updaterId']);\n item.deleteDate = data['deleteDate'];\n item.deleterId = parseFloat(data['deleterId']);\n return item;\n }\n\n public static fromAPIList(data: any[]): CompanyContact[] {\n const items: CompanyContact[] = [];\n for (let i = 0; i < data.length; i++) {\n items.push(CompanyContact.fromAPI(data[i]));\n }\n return items;\n }\n\n public clone(): CompanyContact {\n return CompanyContact.deserialize(JSON.parse(JSON.stringify(this)));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable()\nexport class Utils {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public EMAIL_REGEX: RegExp = /^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,10}$/;\n public SWISS_PHONE_NUMBER_REGEX: RegExp = /^(0041|041|\\+41|\\+\\+41|41)?(0|\\(0\\))?([1-9]\\d{1})(\\d{3})(\\d{2})(\\d{2})$/;\n public INTERNATIONAL_PHONE_NUMBER_REGEX: RegExp = /^\\+(?:[0-9]●?){6,14}[0-9]$/; // https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s03.html\n public URL_REGEX: RegExp = /(http(s)?:\\/\\/.)?(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/; // https://regexr.com/3e6m0\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _translater: TranslateService\n ) {\n\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public removeDuplicates(arr: any[]): any[] {\n const uniqueArr = [];\n for (let i = 0; i < arr.length; i++) {\n if (uniqueArr.indexOf(arr[i]) < 0) {\n uniqueArr.push(arr[i]);\n }\n }\n return uniqueArr;\n }\n\n public findIn(key: any, items: any[], keyName: string = 'id'): any {\n for (let i = 0; i < items.length; i++) {\n if (items[i][keyName] === key) {\n return items[i];\n }\n }\n return null;\n }\n\n public findManyIn(keys: any[], items: any[], keyName: string = 'id'): any[] {\n const match: any[] = [];\n for (let i = 0; i < items.length; i++) {\n let found: boolean = false;\n for (let j = 0; j < keys.length && !found; j++) {\n if (items[i][keyName] == keys[j]) {\n found = true;\n match.push(items[i]);\n }\n }\n }\n\n return match;\n }\n\n public getKeyValues(items: any[], keyName: string = 'id', removeDuplicate: boolean = true, filterNull: boolean = true): any[] {\n let values = [];\n for (let i = 0; i < items.length; i++) {\n if (!filterNull || items[i][keyName]) {\n values.push(items[i][keyName]);\n }\n }\n if (removeDuplicate) {\n values = this.removeDuplicates(values);\n }\n return values;\n }\n\n public hasOneOfs(items: any[], searchItems: any[]): boolean {\n for (let i = 0; i < items.length; i++) {\n for (let j = 0; j < searchItems.length; j++) {\n if (items[i] === searchItems[j]) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n public normalizeString(str: string): string {\n // inspiré de : https://stackoverflow.com/a/37511463\n return str.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase().trim();\n }\n\n public sortRow(a: string | number, b: string | number, nullAfter: boolean = true): number {\n if (a) {\n if (b) {\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n }\n\n return -1;\n }\n\n if (b) {\n return 1;\n }\n\n return 0;\n }\n\n public nowISO(): string {\n return (new Date()).toISOString();\n // toISOString convertit tout seul la date en UTC :o)\n /*\n let now = new Date();\n now.setMinutes(now.getMinutes() + now.getTimezoneOffset());\n return now.toISOString();\n */\n }\n\n public nowTimestamp(): number {\n const now = new Date();\n const timestamp = Math.round(now.getTime() / 1000);\n const timezoneOffset = now.getTimezoneOffset() * 60;\n return timestamp - timezoneOffset;\n }\n\n public ISODateToYmdHis(date: string): string {\n return date.replace('T', ' ').substr(0, 19);\n }\n\n public DateToYmdHis(date: Date, adjustTimezone: boolean = true): string {\n if (adjustTimezone) {\n return this.ISODateToYmdHis(date.toISOString());\n }\n\n const newDate: Date = new Date(date.getTime() - (date.getTimezoneOffset() * 60 * 1000));\n\n return this.ISODateToYmdHis(newDate.toISOString());\n }\n\n public YmdHisToDate(date: string): Date {\n // on reçoit la date au format YYYY-mm-dd HH:ii:ss (iso8601)\n // mais safari n'arrive pas à parser correctement ce format...\n // let date: Date = new Date(dateStr);\n const parts: string[] = date.split(' ');\n if (parts.length !== 2) {\n return null;\n }\n const dateParts: string[] = parts[0].split('-');\n const timeParts: string[] = parts[1].split(':');\n if (dateParts.length !== 3 || timeParts.length !== 3) {\n return null;\n }\n return new Date(\n parseInt(dateParts[0], 10),\n parseInt(dateParts[1], 10) - 1,\n parseInt(dateParts[2], 10),\n parseInt(timeParts[0], 10),\n parseInt(timeParts[1], 10),\n parseInt(timeParts[2], 10),\n 0\n );\n }\n\n public dateAtMidnight(date: Date): Date {\n date.setHours(0);\n date.setMinutes(0);\n date.setSeconds(0);\n date.setMilliseconds(0);\n\n return date;\n }\n\n public addTrailingChar(str: string, char: string, targetStrLength: number): string {\n const toAddCount: number = targetStrLength - str.length;\n for (let i = 0; i < toAddCount; i++) {\n str = char + str;\n }\n\n return str;\n }\n\n public formatDate(dateStr: string, format: string, adjustTimezone: boolean = true): string {\n // TODO finir ca ...\n\n const oneDay: number = 1000 * 60 * 60 * 24;\n const months: string[] = [\n 'January', 'February', 'March',\n 'April', 'May', 'June',\n 'July', 'August', 'September',\n 'October', 'November', 'December'\n ];\n const days: string[] = [\n 'Sunday', 'Monday', 'Tuesday', 'Wednesday',\n 'Thursday', 'Friday', 'Saturday'\n ];\n\n if (!dateStr || dateStr.length === 0) {\n return '';\n }\n\n const date: Date = this.YmdHisToDate(dateStr);\n if (!date) {\n return '';\n }\n let dateTimestamp: number = date.getTime();\n if (adjustTimezone) {\n dateTimestamp = date.getTime() - (date.getTimezoneOffset() * 60 * 1000);\n date.setMinutes(date.getMinutes() - date.getTimezoneOffset());\n }\n\n if (format === 'closest' || format === 'closest-short') {\n // examples (closest) :\n // - DateFormat_FjY: December 23, 2021\n // - DateFormat_NextlG: Next Monday, at 7:33\n // - DateFormat_TomorrowG: Tomorrow, at 10:51\n // - DateFormat_TodayG: Today, at 18:23\n // - DateFormat_YesterdayG: Yesterday, at 9:21\n // - DateFormat_LastlG: Last Tuesday, at 15:05\n // - DateFormat_FjY: August 4, 2017\n // examples (closest-short) :\n // - DateFormat_mdY: 12.23.2017\n // - DateFormat_Tomorrow: Tomorrow\n // - DateFormat_Hi: 18:23\n // - DateFormat_Yesterday: Yesterday\n // - DateFormat_mdY: 08.04.2017\n\n const yesterday: Date = new Date();\n yesterday.setHours(0);\n yesterday.setMinutes(0);\n yesterday.setSeconds(0);\n yesterday.setMilliseconds(0);\n const tomorrow: Date = new Date();\n tomorrow.setHours(23);\n tomorrow.setMinutes(59);\n tomorrow.setSeconds(59);\n tomorrow.setMilliseconds(999);\n const yesterdayTimestamp: number = yesterday.getTime();\n const tomorrowTimestamp: number = tomorrow.getTime();\n\n if (dateTimestamp < yesterdayTimestamp) {\n // on va chercher dans le passé ...\n if (dateTimestamp >= (yesterdayTimestamp - oneDay)) {\n if (format === 'closest') {\n return this._translater.instant('DateFormat_YesterdayG', {\n hours: date.getHours(),\n minutes: this.addTrailingChar('' + date.getMinutes(), '0', 2)\n });\n } else if (format === 'closest-short') {\n return this._translater.instant('DateFormat_Yesterday');\n }\n } else if (dateTimestamp >= (yesterdayTimestamp - (6 * oneDay))) {\n if (format === 'closest') {\n return this._translater.instant('DateFormat_LastlG', {\n weekDay: this._translater.instant(days[date.getDay()]),\n hours: date.getHours(),\n minutes: this.addTrailingChar('' + date.getMinutes(), '0', 2)\n });\n } else if (format === 'closest-short') {\n return this._translater.instant('DateFormat_mdY', {\n year: date.getFullYear(),\n month: this.addTrailingChar('' + (date.getMonth() + 1), '0', 2),\n day: this.addTrailingChar('' + (date.getDate() + 1), '0', 2)\n });\n }\n }\n } else if (dateTimestamp > tomorrowTimestamp) {\n // on va chercher dans le futur ...\n if (dateTimestamp <= (tomorrowTimestamp + oneDay)) {\n if (format === 'closest') {\n return this._translater.instant('DateFormat_TomorrowG', {\n hours: date.getHours(),\n minutes: this.addTrailingChar('' + date.getMinutes(), '0', 2)\n });\n } else if (format === 'closest-short') {\n return this._translater.instant('DateFormat_Tomorrow');\n }\n } else if (dateTimestamp <= (tomorrowTimestamp + (6 * oneDay))) {\n if (format === 'closest') {\n return this._translater.instant('DateFormat_NextlG', {\n weekDay: this._translater.instant(days[date.getDay()]),\n hours: date.getHours(),\n minutes: this.addTrailingChar('' + date.getMinutes(), '0', 2)\n });\n } else if (format === 'closest-short') {\n return this._translater.instant('DateFormat_mdY', {\n year: date.getFullYear(),\n month: this.addTrailingChar('' + (date.getMonth() + 1), '0', 2),\n day: this.addTrailingChar('' + (date.getDate() + 1), '0', 2)\n });\n }\n }\n } else {\n // c'est aujourd'hui ...\n if (format === 'closest') {\n return this._translater.instant('DateFormat_TodayG', {\n hours: date.getHours(),\n minutes: this.addTrailingChar('' + date.getMinutes(), '0', 2)\n });\n } else if (format === 'closest-short') {\n return this._translater.instant('DateFormat_Hi', {\n hours: this.addTrailingChar('' + date.getHours(), '0', 2),\n minutes: this.addTrailingChar('' + date.getMinutes(), '0', 2)\n });\n }\n }\n\n if (format === 'closest') {\n return this._translater.instant('DateFormat_FjY', {\n year: date.getFullYear(),\n month: this._translater.instant(months[date.getMonth()]),\n day: date.getDate()\n });\n } else if (format === 'closest-short') {\n return this._translater.instant('DateFormat_mdY', {\n year: date.getFullYear(),\n month: this.addTrailingChar('' + (date.getMonth() + 1), '0', 2),\n day: this.addTrailingChar('' + (date.getDate() + 1), '0', 2)\n });\n }\n } else if (format === 'full-date') {\n return this._translater.instant('DateFormat_lFdY', {\n weekDay: this._translater.instant(days[date.getDay()]),\n day: date.getDate(),\n month: this._translater.instant(months[date.getMonth()]),\n year: date.getFullYear()\n });\n } else if (format === 'FjY') {\n return this._translater.instant('DateFormat_FjY', {\n year: date.getFullYear(),\n month: this._translater.instant(months[date.getMonth()]),\n day: date.getDate()\n });\n } else if (format === 'mdY') {\n return this._translater.instant('DateFormat_mdY', {\n year: date.getFullYear(),\n month: this.addTrailingChar('' + (date.getMonth() + 1), '0', 2),\n day: this.addTrailingChar('' + date.getDate(), '0', 2)\n });\n }\n\n return dateStr;\n }\n\n public formatNumber(num: number, decimalsCount: number): string {\n let formated = num.toFixed(decimalsCount);\n const parts = ('' + formated).split('.');\n formated = parts[0].replace(/(.)(?=(\\d{3})+$)/g, \"$1'\");\n if (parts.length > 1) {\n formated += '.' + parts[1];\n }\n return formated;\n }\n\n public randomString(length: number, buffer: string = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'): string {\n let str: string = '';\n for (let i = 0; i < length; i++) {\n str += buffer.charAt(Math.floor(Math.random() * buffer.length));\n }\n\n return str;\n }\n\n public convertToHours(minutes: number): string {\n const hours: number = parseInt('' + (minutes / 60));\n const remainingMinutes: number = minutes % 60;\n\n return this._translater.instant(hours > 1 ? 'x_hours' : 'x_hour', {x: hours}) +\n ' ' +\n this._translater.instant(remainingMinutes > 1 ? 'x_minutes' : 'x_minute', {x: remainingMinutes});\n }\n\n /**\n * Return an object { isValid: true } if validation succeeds. Return an object { isValid: false, code: 745, message: } otherwise.\n * Validations supported (examples) :\n * - type[string]: 'nullable|noTrim|min:5|max:5|in:salut,hello,guten tag,hola'\n * - type[int]: 'nullable|min:-3|max:1200|in:3,4,500'\n * - type[decimal]: 'nullable|min:-2.1|max:22.0|in:1.0,1.1,1.2'\n * - type[url]: 'nullable'\n * @param data\n * @param type\n * @param rulesString\n * @param fieldName\n */\n public validateFormField(data: any, type: string, rulesString: string, fieldName: string): any {\n // TODO remplacer une bonne partie de ce cheni par validator.js : https://github.com/chriso/validator.js\n // le jour où je saurais comment en faire un module angular ...\n\n const validReturn = {isValid: true};\n\n const error: any = (messageKey: string, params: any[]): any => {\n const message: string = this._translater.instant(messageKey, params);\n return {isValid: false, code: 745, message};\n };\n\n const has: any = (key: string, rules: string[]): boolean => {\n for (let i = 0; i < rules.length; i++) {\n if (rules[i].split(':')[0] === key) {\n return true;\n }\n }\n return false;\n };\n\n const rules: string[] = rulesString.split('|');\n\n const canBeNull: boolean = has('nullable', rules);\n if (canBeNull && (data === null || data === undefined)) {\n return validReturn;\n }\n\n //\n // STRING\n //\n if (type === 'string') {\n\n if (data && !has('noTrim', rules)) {\n data = data.trim();\n }\n\n for (let i = 0; i < rules.length; i++) {\n const rule: string[] = rules[i].split(':');\n if (rule[0] === 'min') {\n if (!data || data.length < parseInt(rule[1], 10)) {\n return error('The_field_x_must_be_y_characters_at_min', {fieldName, min: rule[1]});\n }\n } else if (rule[0] === 'max') {\n if (!data || data.length > parseInt(rule[1], 10)) {\n return error('The_field_x_must_be_y_characters_at_max', {fieldName, max: rule[1]});\n }\n } else if (rule[0] === 'in') {\n const items: string[] = rules[1].split(',');\n let isIn: boolean = false;\n for (let j = 0; j < items.length && !isIn; j++) {\n isIn = items[j] === data;\n }\n if (!isIn) {\n return error('The_field_x_must_be_one_of_y', {fieldName, items: items.join(', ')});\n }\n }\n }\n }\n\n //\n // INTEGER\n //\n else if (type === 'integer') {\n const int: number = parseInt(data, 10);\n if (isNaN(int)) {\n return error('The_field_x_must_be_an_integer', {fieldName});\n }\n\n for (let i = 0; i < rules.length; i++) {\n const rule: string[] = rules[i].split(':');\n if (rule[0] === 'min') {\n if (int < parseInt(rule[1], 10)) {\n return error('The_field_x_must_be_greater_than_y', {fieldName, min: rule[1]});\n }\n } else if (rule[0] === 'max') {\n if (int > parseInt(rule[1], 10)) {\n return error('The_field_x_must_be_lower_than_y', {fieldName, max: rule[1]});\n }\n } else if (rule[0] === 'in') {\n const items: string[] = rules[1].split(',');\n let isIn: boolean = false;\n for (let j = 0; j < items.length && !isIn; j++) {\n isIn = parseInt(items[j], 10) === int;\n }\n if (!isIn) {\n return error('The_field_x_must_be_one_of_y', {fieldName, items: items.join(', ')});\n }\n }\n }\n }\n\n //\n // DECIMAL\n //\n else if (type === 'decimal') {\n const float: number = parseFloat(data);\n if (isNaN(float)) {\n return error('The_field_x_must_be_a_decimal', {fieldName});\n }\n\n for (let i = 0; i < rules.length; i++) {\n const rule: string[] = rules[i].split(':');\n if (rule[0] === 'min') {\n if (float < parseInt(rule[1], 10)) {\n return error('The_field_x_must_be_greater_than_y', {fieldName, min: rule[1]});\n }\n } else if (rule[0] === 'max') {\n if (float > parseInt(rule[1], 10)) {\n return error('The_field_x_must_be_lower_than_y', {fieldName, max: rule[1]});\n }\n } else if (rule[0] === 'in') {\n const items: string[] = rules[1].split(',');\n let isIn: boolean = false;\n for (let j = 0; j < items.length && !isIn; j++) {\n isIn = parseFloat(items[j]) === float;\n }\n if (!isIn) {\n return error('The_field_x_must_be_one_of_y', {fieldName, items: items.join(', ')});\n }\n }\n }\n }\n\n //\n // URL\n //\n else if (type === 'url') {\n // http://stackoverflow.com/questions/3809401/what-is-a-good-regular-expression-to-match-a-url\n // surement pas la meilleure regex du monde pour ca, mais ca va pour nos besoins\n const expression: string = '[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?';\n const regex: RegExp = new RegExp(expression, 'gi');\n const match: string[] = data.match(regex);\n if (match.length !== 1 || match[0] !== data) {\n return error('The_field_x_must_be_a_valid_url', {fieldName});\n }\n }\n\n return validReturn;\n }\n\n public buildTranslationParam(translations: any[]): any {\n const param: any = {};\n for (let i = 0; i < translations.length; i++) {\n const item: any = {};\n for (const key in translations[i].translation) {\n if (translations[i].translation.hasOwnProperty(key)) {\n item[key] = translations[i].translation[key];\n }\n }\n param[translations[i].lang.code] = item;\n }\n\n return param;\n }\n\n public truncateText(text: string, maxChars: number, options: any = {}): string {\n if (maxChars < 5) {\n maxChars = 5;\n }\n if (options.ellipsize === undefined) {\n options.ellipsize = false;\n }\n if (options.ellipsisPosition === undefined) {\n options.ellipsisPosition = 'end';\n }\n\n if (text.length <= maxChars) {\n return text;\n }\n\n if (options.ellipsize) {\n if (options.ellipsisPosition === 'center') {\n const maxCharsHalf: number = parseInt('' + (maxChars / 2), 10);\n return text.substr(0, maxCharsHalf - 2) + ' ... ' + text.substr(text.length - maxCharsHalf + 3);\n } else {\n return text.substr(0, maxChars - 3) + '...';\n }\n }\n\n return text.substr(0, maxChars);\n }\n\n public buildModelParams(models: any[], langIds: number[]): any[] {\n /**\n * Construit un tableau d'objets ayant la structure suivante :\n * [{\n * item: { key: value, ... }\n * translations: [\n * { langId: number, key: value, ... },\n * ]\n * },]\n * Les valeurs traductibles du model sont recopiées dans toutes les langues activées\n */\n\n const items: any[] = [];\n for (let i = 0; i < models.length; i++) {\n const nonTranslatableValues: Object = {};\n const nonTranslatableKeys: string[] = models[i].constructor.getNonTranslatableFields();\n for (let j = 0; j < nonTranslatableKeys.length; j++) {\n nonTranslatableValues[nonTranslatableKeys[j]] =\n !models[i][nonTranslatableKeys[j]] && (models[i][nonTranslatableKeys[j]] === undefined || isNaN(models[i][nonTranslatableKeys[j]])) ?\n null : models[i][nonTranslatableKeys[j]];\n }\n\n const translations: Object[] = [];\n const translatableKeys: string[] = models[i].constructor.getTranslatableFields();\n for (let j = 0; j < langIds.length; j++) {\n const translation: Object = {langId: langIds[j]};\n for (let k = 0; k < translatableKeys.length; k++) {\n translation[translatableKeys[k]] =\n !models[i][translatableKeys[k]] && (models[i][translatableKeys[k]] === undefined || isNaN(models[i][translatableKeys[k]])) ?\n null : models[i][translatableKeys[k]];\n }\n\n translations.push(translation);\n }\n\n items.push({\n item: nonTranslatableValues,\n translations\n });\n }\n\n return items;\n }\n\n public groupBy(arr: any[], property: string): any[] {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...acc[cur[property]] || [], cur];\n return acc;\n }, {});\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Utils } from './utils';\nimport { Conf } from '../../_conf';\n\n@Injectable()\nexport class ApiBaseService {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _http: HttpClient,\n private _conf: Conf,\n private _utils: Utils\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n /**\n * Base method to call a webservice\n * @param method one of 'get'|'post'|'put'\n * @param url the full url of the webservice\n * @param params key-value object containing the parameters to send with the webservice call\n * @param extra an literal object containing extra configuration of the webservice call ; 'accessToken' add a header container the bearer authorization token.\n */\n public call(method: string, url: string, params: Object = {}, extra: any = null): Promise {\n return new Promise((resolve, reject) => {\n const callParams: any = {};\n\n let headers: HttpHeaders = new HttpHeaders();\n headers = headers\n .set('Access-Control-Allow-Origin', '*')\n .set('Access-Control-Allow-Headers', 'origin, content-type, accept, authorization')\n .set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS, HEAD');\n\n if (typeof extra === 'string') {\n extra = {accessToken: extra};\n } else if (!extra) {\n extra = {};\n }\n\n if (extra.accessToken) {\n headers = headers.set('Authorization', 'Bearer ' + extra.accessToken);\n }\n\n if (['json', 'file'].indexOf(extra.resultType) < 0) {\n extra.resultType = 'json';\n } else if (extra.resultType === 'file') {\n callParams.responseType = 'blob';\n }\n\n url = \"/api/\" + url\n\n console.log(url);\n\n callParams.headers = headers;\n\n let call = null;\n if (method === 'get') {\n call = this._http.get(url + this.encodeParams(params), callParams);\n } else if (method === 'post') {\n call = this._http.post(url, this.buildFormData(params), callParams);\n } else if (method === 'put') {\n call = this._http.put(url, this.buildFormData(params), callParams);\n } else if (method === 'delete') {\n call = this._http.delete(url + this.encodeParams(params), callParams);\n } else if (method === 'options') {\n call = this._http.options(url + this.encodeParams(params), callParams);\n } else {\n reject({error: 'API call method unrecognized: ' + method});\n return;\n }\n\n call.subscribe(\n (data) => resolve(data),\n (error) => reject(error)\n );\n\n /*\n\n if (extra.resultType === 'json') {\n call.pipe(map((res: Response) => { console.log(res); })).subscribe(\n (data) => {\n resolve(data);\n },\n (error) => {\n reject(error);\n }\n );\n }\n else if (extra.resultType === 'file') {\n call.pipe(map((res: Response) => res.blob())).subscribe(\n (file: any) => {\n resolve(file);\n },\n (error: any) => reject(error)\n );\n }\n */\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private encodeParams(params: any): string {\n const paramsElems = [];\n for (const key in params) {\n if (params.hasOwnProperty(key)) {\n paramsElems.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));\n }\n }\n let paramsEncoded = '';\n if (paramsElems.length) {\n paramsEncoded += '?' + paramsElems.join('&');\n }\n\n return paramsEncoded;\n }\n\n private buildFormData(params: any): FormData {\n const getData = (keys: string[], data: any): any[] => {\n let items: any[] = [];\n const currentKey: string = keys[keys.length - 1];\n\n if (data[currentKey] instanceof File) {\n const firstKey: string = keys.splice(0, 1)[0];\n let keysStr: string = firstKey;\n if (keys.length) {\n keysStr += '[' + keys.join('][') + ']';\n }\n items.push({key: keysStr, value: data[currentKey], fileName: data[currentKey].name});\n } else if (data[currentKey] instanceof Array) {\n for (let i = 0; i < data[currentKey].length; i++) {\n items = items.concat(getData(keys.concat(['' + i]), data[currentKey]));\n }\n } else if (data[currentKey] instanceof Object) {\n for (const itemKey in data[currentKey]) {\n if (data[currentKey].hasOwnProperty(itemKey)) {\n items = items.concat(getData(keys.concat([itemKey]), data[currentKey]));\n }\n }\n } else {\n let dataValue: any = data[currentKey];\n if (dataValue === undefined || dataValue === null) {\n // c'est un hack très vilain\n // mais formdata.append(null) revient à faire formdata.append('null')\n // ce qui est vraiment pas ce qu'on veut ...\n dataValue = '';\n }\n if (dataValue !== null) {\n const firstKey: string = keys.splice(0, 1)[0];\n let keysStr: string = firstKey;\n if (keys.length) {\n keysStr += '[' + keys.join('][') + ']';\n }\n items.push({key: keysStr, value: dataValue});\n }\n }\n\n return items;\n };\n\n const formData: FormData = new FormData();\n for (const key in params) {\n if (params.hasOwnProperty(key)) {\n const data: any = getData([key], params);\n for (let i = 0; i < data.length; i++) {\n if (data[i].fileName) {\n formData.append(data[i].key, data[i].value, data[i].fileName);\n } else {\n formData.append(data[i].key, data[i].value);\n }\n }\n }\n }\n\n return formData;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Conf } from '../../_conf';\nimport { Utils } from './utils';\n\n@Injectable()\nexport class KeyValueStorage {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public static STORE_MEMORY: string = 'memory';\n public static STORE_SESSION: string = 'session';\n public static STORE_LOCAL: string = 'local';\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _memoryStore: Object = {};\n private _stores: Object = {};\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _utils: Utils\n ) {\n this.initialize();\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public get(key: string, fallback: any = null, store: string = this._conf.defaultKeyValueStore): any {\n const value = this._stores[store][key];\n if (value === null || value === undefined) {\n return fallback;\n }\n\n return value;\n }\n\n public set(key: string, value: any, store: string = this._conf.defaultKeyValueStore): void {\n this._stores[store][key] = value;\n }\n\n public remove(key: string, store: string = this._conf.defaultKeyValueStore): void {\n delete this._stores[store][key];\n }\n\n public clear(store: string): void {\n if (store === KeyValueStorage.STORE_MEMORY) {\n this._memoryStore = {};\n this._stores[KeyValueStorage.STORE_MEMORY] = this._memoryStore;\n } else if (store === KeyValueStorage.STORE_SESSION) {\n window.sessionStorage.clear();\n this._stores[KeyValueStorage.STORE_SESSION] = window.sessionStorage;\n } else if (store === KeyValueStorage.STORE_LOCAL) {\n window.localStorage.clear();\n this._stores[KeyValueStorage.STORE_LOCAL] = window.localStorage;\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private initialize(): void {\n this._stores[KeyValueStorage.STORE_MEMORY] = this._memoryStore;\n this._stores[KeyValueStorage.STORE_SESSION] = window.sessionStorage;\n this._stores[KeyValueStorage.STORE_LOCAL] = window.localStorage;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Utils } from './utils';\nimport { Conf } from '../../_conf';\nimport { KeyValueStorage } from './key-value-storage';\n\n@Injectable()\nexport class ModelsStorage {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public static STORAGE_PREFIX: string = 'modelsStorage_';\n public static STORAGE_TYPE: string = KeyValueStorage.STORE_MEMORY; // on stock des trucs pas sérialisables, du coup si on est tenté de mettre ca dans du local, ca va plus fonctionner ...\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _utils: Utils,\n private _storage: KeyValueStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n /**\n * Récupère le Model correspondant à/aux identifiant(s) passés en paramètre. Retourne null si aucun Model ne correspond.\n * @param modelClass\n * @param identifierValues\n */\n public fromId(modelClass: any, identifierValues: number[], includeDeleted: boolean = false): Promise {\n return new Promise((resolve, reject) => {\n this.fromIds(modelClass, [identifierValues], includeDeleted)\n .then((results) => {\n if (results.length) {\n resolve(results[0].clone());\n } else {\n resolve(null);\n }\n })\n .catch((error) => reject(error));\n });\n }\n\n /**\n * Récupère les Model correspondant à la liste d'identifiant(s) passés en paramètre. Retourne un tableau vide si aucun ne correspond.\n * @param modelClass\n * @param identifierValues\n */\n public fromIds(modelClass: any, listOfIdentifierValues: any, includeDeleted: boolean = false): Promise {\n return new Promise((resolve, reject) => {\n const table = TableStore.get(modelClass, this._storage);\n if (table) {\n const results: any[] = [];\n for (let i = 0; i < listOfIdentifierValues.length; i++) {\n const index = table.getRowIndex(listOfIdentifierValues[i]);\n if (index >= 0) {\n if (includeDeleted || !table.data[index].deleterId) {\n results.push(table.data[index].clone());\n }\n }\n }\n resolve(results);\n } else {\n reject({message: 'Table Store not found', forParams: [modelClass, listOfIdentifierValues]});\n }\n });\n }\n\n /**\n * Récupère les Model correspondant aux critères de recherche passés en paramètre. Retourne un tableau vide si aucun ne correspond.\n * Un Model doit avoir les attributs/méthodes suivants :\n * - tableName\n * - getFields()\n * - fromStorageRow()\n * - clone()\n * @param modelClass\n */\n public select(modelClass: any, includeDeleted: boolean = false): ModelQuery {\n return new ModelQuery(this._storage, modelClass, includeDeleted);\n }\n\n /**\n * Met à jour les Model passés en paramètre qui existent déjà dans la base de données et insére ceux qui n'existent pas.\n * Un Model doit avoir les attributs/méthodes suivants :\n * - tableName\n * - getFields()\n * - getKeyFields()\n * - toJson()\n * - clone()\n * @param models\n */\n public save(models: any[], keepDeleted: boolean = false): Promise {\n return new Promise((resolve, reject) => {\n const table = this.getTableStore(models);\n if (table) {\n for (let i = 0; i < models.length; i++) {\n // les relations avec des tables de liaisons contenant des models supprimés n'est pas supporté en l'état\n // du coup pour empêcher tout problème, on supprime les models qui sont marqués comme supprimés\n // (c'est un vilain hack pas très sexy, mais au moins ca marche)\n if (!keepDeleted && models[i].deleteDate) {\n table.delete(models[i]);\n } else {\n table.updateOrAdd(models[i].clone());\n }\n }\n table.save();\n resolve(table);\n } else {\n resolve(table);\n }\n });\n }\n\n /**\n * Supprime les Model passés en paramètre qui existent dans la base de données.\n * Un Model doit avoir les attributs/méthodes suivants :\n * - tableName\n * - getFields()\n * - getKeyFields()\n * - toJson()\n * @param models\n */\n public delete(models: any[]): Promise {\n return new Promise((resolve, reject): void => {\n const table = this.getTableStore(models);\n if (table) {\n for (let i = 0; i < models.length; i++) {\n table.delete(models[i]);\n }\n table.save();\n resolve();\n } else {\n resolve();\n }\n });\n }\n\n /**\n * Supprime les models du store \"model\" dont la valeur de l'attribut \"key\" correspond à la valeur de \"value\".\n * @param model\n * @param key\n * @param value\n */\n public deleteOn(model: any, key: string, value: number): Promise {\n return new Promise((resolve, reject) => {\n this.select(model).where(key).equals(value).get()\n .then((items: any[]) => {\n this.delete(items)\n .then(() => resolve())\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public deleteMultipleOn(model: any, key: string, value: number[]): Promise {\n return new Promise((resolve, reject) => {\n this.select(model).where(key).in(value).get()\n .then((items: any[]) => {\n this.delete(items)\n .then(() => resolve())\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private getTableStore(model: any): TableStore {\n if (model.constructor.tableName) {\n return TableStore.get(model, this._storage);\n }\n if (model.length && model[0].constructor.tableName) {\n return TableStore.get(model[0], this._storage);\n }\n return null;\n }\n}\n\n//\n//\n// SUBCLASSESS\n//\n//\n\nexport class TableStore {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n public name: string;\n public modelClass: any;\n public index: any;\n\n //\n //\n // ATTRIBUTES\n //\n //\n public data: any[];\n public keyFields: string[];\n private _storage: KeyValueStorage;\n\n constructor() {\n }\n\n public static get(modelClass: any, storage: KeyValueStorage): TableStore {\n const name: string = TableStore.getName(modelClass);\n let store: TableStore = storage.get(name, null, ModelsStorage.STORAGE_TYPE);\n if (store) {\n return store;\n }\n\n store = new TableStore();\n store.name = name;\n store.modelClass = modelClass;\n store.index = {};\n store.data = [];\n store.keyFields = TableStore.getStatic(modelClass).getKeyFields();\n store._storage = storage;\n\n return store;\n }\n\n public static getName(modelClass: any): string {\n return ModelsStorage.STORAGE_PREFIX + TableStore.getStatic(modelClass).tableName;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n private static getStatic(modelClass: any): any {\n if (modelClass.tableName) {\n return modelClass;\n }\n\n return modelClass.constructor;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public save(): void {\n this._storage.set(this.name, this, ModelsStorage.STORAGE_TYPE);\n }\n\n public updateOrAdd(model: any): TableStore {\n const identifierValues: number[] = this.getIdentifierValues(model);\n let index: number = this.getRowIndex(identifierValues);\n if (index >= 0) {\n this.data[index] = model;\n } else {\n index = this.data.length;\n this.data.push(model);\n this.index[this.getIndexNameFromModel(model)] = index;\n }\n return this;\n }\n\n public delete(model: any): TableStore {\n const indexName = this.getIndexNameFromModel(model);\n const index: number = this.index[indexName];\n if (index >= 0) {\n this.data.splice(index, 1);\n delete this.index[indexName];\n this.reindex(index);\n }\n\n return this;\n }\n\n public reindex(fromRowIndex: number = 0): TableStore {\n for (let i = fromRowIndex; i < this.data.length; i++) {\n this.index[this.getIndexNameFromModel(this.data[i])] = i;\n }\n\n return this;\n }\n\n public getRowIndex(identifierValues: number[]): number {\n const key = this.getIndexNameFromValues(identifierValues);\n if (this.index[key] >= 0) {\n return this.index[key];\n }\n\n return -1;\n }\n\n public hasWhatWhoWhen(): boolean {\n const columns: string[] = TableStore.getStatic(this.modelClass).getFields();\n return columns.indexOf('createrId') >= 0 && columns.indexOf('updaterId') >= 0 && columns.indexOf('deleterId') >= 0;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private getIndexNameFromValues(identifierValues: any): string {\n if (typeof identifierValues === 'number') {\n identifierValues = [identifierValues];\n }\n return '' + identifierValues.join('_');\n }\n\n private getIndexNameFromModel(model: any): string {\n return this.getIndexNameFromValues(this.getIdentifierValues(model));\n }\n\n private getIdentifierValues(model: any): number[] {\n const keys: number[] = [];\n for (let i = 0; i < this.keyFields.length; i++) {\n keys.push(model[this.keyFields[i]]);\n }\n\n return keys;\n }\n}\n\nexport class ModelQuery {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _storage: KeyValueStorage;\n private _classItem: any;\n private _clause: QueryClause;\n private _orderBy: any;\n private _includeDeleted: boolean;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n storage: any,\n modelClass: any,\n includeDeleted: boolean\n ) {\n this._storage = storage;\n this._classItem = modelClass;\n this._includeDeleted = includeDeleted;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public where(column: string, modelClass: any = null): QueryClause {\n if (modelClass === null) {\n modelClass = this._classItem;\n }\n\n this._clause = new QueryClause(this, this._storage, column, modelClass);\n return this._clause;\n }\n\n public orderBy(fieldName: string, direction: string = 'asc'): ModelQuery {\n this._orderBy = {\n column: fieldName,\n direction\n };\n return this;\n }\n\n /**\n * Exécute la requête et retourne la liste des Model correspondant aux critères de la requête. Retourne un tableau vide si aucun ne correspond.\n * @param howMany Le nombre de Model récupéré au maximum. Si howMany vaut 1, le résultat sera le Model directement (pas dans un tableau) et null si aucun ne correspond.\n * @param from L'index à partir duquel on souhaite récupérer les models (utile pour la pagination).\n */\n public get(howMany: number = -1, from: number = -1): Promise {\n return new Promise((resolve, reject) => {\n const table = TableStore.get(this._classItem, this._storage);\n\n if (table) {\n let matchCounter: number = 0;\n const results: any[] = [];\n let loop: any = null;\n if (howMany > -1) {\n loop = (i: number, dataLength: number, resultLength: number, howMany: number) => {\n return i < dataLength && resultLength < howMany;\n };\n } else {\n loop = (i: number, dataLength: number, resultLength: number, howMany: number) => {\n return i < dataLength;\n };\n }\n\n let i: number = 0;\n while (loop(i, table.data.length, results.length, howMany)) {\n if (!this._clause || this._clause.match(table.data[i])) {\n if (this._includeDeleted || !table.hasWhatWhoWhen() || !table.data[i].deleterId) {\n matchCounter++;\n if (matchCounter > from) {\n results.push(table.data[i].clone());\n }\n }\n }\n i++;\n }\n\n if (howMany === 1) {\n if (results.length) {\n resolve(results[0]);\n } else {\n resolve(null);\n }\n } else {\n resolve(this.orderItems(results));\n }\n } else {\n reject({message: 'Table Store not found', forModelClass: this._classItem});\n }\n resolve(null);\n });\n }\n\n public setClause(clause: QueryClause): ModelQuery {\n this._clause = clause;\n return this;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private orderItems(models: any[]): any[] {\n if (!this._orderBy || models.length <= 1) {\n return models;\n }\n\n const columnType: string = typeof models[0][this._orderBy.column];\n if (columnType === 'number') {\n return this.orderItemsNumerically(models);\n } else if (columnType === 'string') {\n return this.orderItemsAlphabetically(models);\n }\n\n console.log('Unsupported ordering column type [' + columnType + '] of column [' + this._orderBy.column + ']');\n return models;\n }\n\n private orderItemsNumerically(models: any[]): any[] {\n models = models.sort((a: any, b: any) => {\n if (a[this._orderBy.column] < b[this._orderBy.column]) {\n return -1;\n }\n if (a[this._orderBy.column] > b[this._orderBy.column]) {\n return 1;\n }\n\n return 0;\n });\n\n if (this._orderBy.direction === 'desc') {\n return models.reverse();\n }\n\n return models;\n }\n\n private orderItemsAlphabetically(models: any[]): any[] {\n models = models.sort((a: any, b: any) => {\n const aString: string = a[this._orderBy.column] ? a[this._orderBy.column].toLowerCase() : '';\n const bString: string = b[this._orderBy.column] ? b[this._orderBy.column].toLowerCase() : '';\n if (aString < bString) {\n return -1;\n }\n if (aString > bString) {\n return 1;\n }\n\n return 0;\n });\n\n if (this._orderBy.direction === 'desc') {\n return models.reverse();\n }\n\n return models;\n }\n}\n\nexport class QueryClause {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _builder: ModelQuery;\n private _clause: any;\n private _clauses: any = {\n items: [],\n groupingPattern: 'and'\n };\n private _storage: KeyValueStorage;\n\n private _operators: any = {\n '=': (val1: any, val2: any): boolean => {\n // null == undefined ...\n if (val1 === undefined) {\n val1 = null;\n }\n if (val2 === undefined) {\n val2 = null;\n }\n\n return val1 === val2;\n },\n '!=': (val1: any, val2: any): boolean => {\n return val1 !== val2;\n },\n '>': (val1: any, val2: any): boolean => {\n return val1 > val2;\n },\n '>=': (val1: any, val2: any): boolean => {\n return val1 >= val2;\n },\n '<': (val1: any, val2: any): boolean => {\n return val1 < val2;\n },\n '<=': (val1: any, val2: any): boolean => {\n return val1 <= val2;\n },\n 'in': (val1: any, val2: any[]): boolean => {\n for (let i = 0; i < val2.length; i++) {\n if (val1 === val2[i]) {\n return true;\n }\n }\n\n return false;\n },\n 'notIn': (val1: any, val2: any): boolean => {\n for (let i = 0; i < val2.length; i++) {\n if (val1 === val2[i]) {\n return false;\n }\n }\n\n return true;\n }\n };\n\n private _matchCache: any = {};\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n builder: ModelQuery,\n storage: any,\n column: string,\n modelClass: any\n ) {\n this._builder = builder;\n this._storage = storage;\n this._clause = this.newClause(column, modelClass);\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public equals(value: any, on: string = null): QueryClause {\n this._clause.operator = '=';\n this._clause.value = value;\n this._clause.on = on;\n return this;\n }\n\n public notEquals(value: any): QueryClause {\n this._clause.operator = '!=';\n this._clause.value = value;\n return this;\n }\n\n public greater(value: any): QueryClause {\n this._clause.operator = '>';\n this._clause.value = value;\n return this;\n }\n\n public greaterOrEqual(value: any): QueryClause {\n this._clause.operator = '>=';\n this._clause.value = value;\n return this;\n }\n\n public lower(value: any): QueryClause {\n this._clause.operator = '<';\n this._clause.value = value;\n return this;\n }\n\n public lowerOrEqual(value: any): QueryClause {\n this._clause.operator = '<=';\n this._clause.value = value;\n return this;\n }\n\n public in(values: any[]): QueryClause {\n this._clause.operator = 'in';\n this._clause.value = values;\n return this;\n }\n\n public notIn(values: any[]): QueryClause {\n this._clause.operator = 'notIn';\n this._clause.value = values;\n return this;\n }\n\n public and(column: string, modelClass: any = null): QueryClause {\n if (modelClass === null) {\n modelClass = this._clause.modelClass;\n }\n\n this.addClause();\n this._clause = this.newClause(column, modelClass);\n this._clauses.groupingPattern = 'and';\n return this;\n }\n\n public or(column: string, modelClass: any = null): QueryClause {\n if (modelClass === null) {\n modelClass = this._clause.modelClass;\n }\n\n this.addClause();\n this._clause = this.newClause(column, modelClass);\n this._clauses.groupingPattern = 'or';\n return this;\n }\n\n public orderBy(fieldName: string, direction: string = 'asc'): ModelQuery {\n this.addClause();\n return this._builder.setClause(this).orderBy(fieldName, direction);\n }\n\n public get(howMany: number = -1, from: number = -1): any {\n this.addClause();\n return this._builder.setClause(this).get(howMany, from);\n }\n\n public match(model: any): boolean {\n this._matchCache = {};\n this._matchCache[model.constructor.tableName] = [model];\n\n // si on veut des \"and\", quand on va parcourir les clauses\n // on ve retourner false si une clause ne match pas\n // donc si on arrive jusqu'à la fin de la méthode\n // c'est que toutes les clauses match\n // à l'inverse, si on veut des \"or\", quand on va parcourir les clauses\n // on va retourner true si une clause match\n // donc si on arrive jusqu'à la fin de la méthode\n // c'est que toutes les clauses ne match pas\n const matchByDefault: boolean = this._clauses.groupingPattern === 'and';\n\n for (let i = 0; i < this._clauses.items.length; i++) {\n const doesMatch: boolean = this.clauseMatch(this._clauses.items[i]);\n if (doesMatch && !matchByDefault) {\n return true;\n }\n if (!doesMatch && matchByDefault) {\n return false;\n }\n }\n\n return matchByDefault;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private newClause(column: string, modelClass: any, operator: string = '', value: any = '', on: string = null): any {\n const clause = {\n modelClass,\n column,\n operator,\n value,\n on\n };\n\n return clause;\n }\n\n private addClause(): void {\n this._clauses.items.push(this._clause);\n }\n\n private clauseMatch(clause: any): boolean {\n let data1: any[] = this.getMatchCache(clause.modelClass);\n let data2: any[] = null;\n const data2On: string = '';\n\n if (clause.on) {\n data2 = this.getMatchCache(clause.value);\n\n data1 = this.getMatchingItems(data1, data2, clause.operator, clause.column, clause.on);\n this._matchCache[clause.modelClass.tableName] = data1;\n\n data2 = this.getMatchingItems(data2, data1, this.revertOperator(clause.operator), clause.on, clause.column); // TODO operator !!!\n this._matchCache[clause.value.tableName] = data2;\n\n return data1.length > 0 && data2.length > 0;\n }\n\n data1 = this.getMatchingItems(data1, [{fakeColumn: clause.value}], clause.operator, clause.column, 'fakeColumn');\n this._matchCache[clause.modelClass.tableName] = data1;\n\n return data1.length > 0;\n }\n\n private getMatchCache(modelClass: any): any {\n if (!this._matchCache[modelClass.tableName]) {\n const table = TableStore.get(modelClass, this._storage);\n if (table) {\n this._matchCache[modelClass.tableName] = table.data;\n } else {\n console.log('StoreTable[' + modelClass.tableName + '] not found');\n }\n }\n\n return this._matchCache[modelClass.tableName];\n }\n\n private getMatchingItems(data1: any[], data2: any[], operator: string, data1Column, data2Column: string): any[] {\n const matchingItems: any[] = [];\n for (let i = 0; i < data1.length; i++) {\n for (let j = 0; j < data2.length; j++) {\n if (this._operators[operator](data1[i][data1Column], data2[j][data2Column])) {\n matchingItems.push(data1[i].clone());\n j = data2.length;\n }\n }\n }\n\n return matchingItems;\n }\n\n private revertOperator(operator: string): string {\n if (operator === '<') {\n return '>';\n }\n if (operator === '<=') {\n return '>=';\n }\n if (operator === '>') {\n return '<';\n }\n if (operator === '>=') {\n return '<=';\n }\n\n return operator;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Utils } from './utils';\nimport { Conf } from '../../_conf';\nimport { ApiBaseService } from './api-base-service';\nimport { KeyValueStorage } from './key-value-storage';\nimport { ModelsStorage } from './models-storage';\nimport { User } from './models';\n\n@Injectable()\nexport class CurrentUser {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public user: User;\n\n private _accessToken: string;\n private _loginRequest: Promise = null;\n private _hasPendingRequest: boolean = false;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _utils: Utils,\n private _api: ApiBaseService,\n private _keyValueStore: KeyValueStorage,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public checkEmail(email: string): Promise {\n return new Promise((resolve, reject) => {\n const params: Object = {email};\n this._api.call('get', 'auth/check-email', params)\n .then((result) => {\n resolve(result);\n })\n .catch((error) => reject(error));\n });\n }\n\n public checkResetPassword(email: string): Promise {\n return new Promise((resolve, reject) => {\n const params: Object = {email};\n this._api.call('get', 'auth/check-reset-password', params)\n .then((result) => {\n resolve(result.isValid);\n })\n .catch((error) => reject(error));\n });\n }\n\n public login(email: string, password: string, remember: boolean): Promise {\n if (!this._hasPendingRequest) {\n this._hasPendingRequest = true;\n this._loginRequest = new Promise((resolve, reject) => {\n if (this.isLoggedIn()) {\n this._hasPendingRequest = false;\n resolve(true);\n } else {\n this._api.call('post', 'oauth/token', {\n grant_type: 'password',\n client_id: this._conf.apiPasswordGrantClient,\n client_secret: this._conf.apiPasswordGrantSecret,\n username: email,\n password,\n scope: '*'\n })\n .then((result) => {\n this.retrieveUser(result.access_token)\n .then(() => {\n this._accessToken = result.access_token;\n this.saveAccessToken(remember);\n this._hasPendingRequest = false;\n resolve(true);\n })\n .catch((error) => {\n this._hasPendingRequest = false;\n reject({code: 2, message: 'Could not retrieve user data', originalError: error});\n });\n })\n .catch((error) => {\n this._hasPendingRequest = false;\n reject({code: 1, message: 'Wrong email/password', originalError: error});\n });\n }\n });\n }\n\n return this._loginRequest;\n }\n\n public tryLoginFromRemember(): Promise {\n if (!this._hasPendingRequest) {\n this._loginRequest = new Promise((resolve, reject) => {\n this._hasPendingRequest = true;\n if (this.isLoggedIn()) {\n this._hasPendingRequest = false;\n resolve(true);\n } else if (this.retrieveAccessToken()) {\n this.retrieveUser(this._accessToken)\n .then(() => {\n this._hasPendingRequest = false;\n resolve(true);\n })\n .catch(() => {\n this._hasPendingRequest = false;\n resolve(false);\n });\n } else {\n this._hasPendingRequest = false;\n resolve(false);\n }\n });\n }\n\n return this._loginRequest;\n }\n\n public logout(): Promise {\n return new Promise((resolve, reject) => {\n const reset: any = () => {\n this.user = null;\n this._accessToken = null;\n this._keyValueStore.clear(KeyValueStorage.STORE_MEMORY);\n this._keyValueStore.clear(KeyValueStorage.STORE_SESSION);\n this._keyValueStore.clear(KeyValueStorage.STORE_LOCAL);\n };\n this._api.call('post', 'auth/logout', {}, {accessToken: this._accessToken})\n .then((result) => {\n reset();\n resolve();\n })\n .catch((error) => {\n console.log(error);\n reset();\n resolve();\n });\n });\n }\n\n public isLoggedIn(): boolean {\n return this.user != null && this._accessToken != null;\n }\n\n public getAccessToken() {\n return this._accessToken;\n }\n\n public sendPasswordResetEmail(email: string, resetUrl: string): Promise {\n return this._api.call('post', 'auth/password/reset-token', {\n email,\n resetUrl\n });\n }\n\n public resetPassword(email: string, password: string, token: string): Promise {\n return this._api.call('post', 'auth/password/reset', {\n token,\n email,\n password,\n password_confirmation: password\n });\n }\n\n public register(email: string, password: string, remembe: boolean, langId: number, firstName: string, lastName: string): Promise {\n return new Promise((resolve, reject) => {\n this._api.call('post', 'auth/register', {\n email,\n password,\n firstName,\n lastName,\n langId\n })\n .then((result) => {\n this.login(email, password, remembe)\n .then(() => resolve())\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private saveAccessToken(remember: boolean = true): void {\n this._keyValueStore.set(\n 'currentUser_accessToken',\n this._accessToken,\n remember ? KeyValueStorage.STORE_LOCAL : KeyValueStorage.STORE_SESSION\n );\n }\n\n private retrieveAccessToken(): boolean {\n let accessToken = this._keyValueStore.get('currentUser_accessToken', null, KeyValueStorage.STORE_LOCAL);\n if (!accessToken) {\n accessToken = this._keyValueStore.get('currentUser_accessToken', null, KeyValueStorage.STORE_SESSION);\n }\n\n if (accessToken) {\n this._accessToken = accessToken;\n return true;\n }\n\n return false;\n }\n\n private retrieveUser(accessToken: string): Promise {\n return new Promise((resolve, reject) => {\n this._api.call('get', 'auth/current-user', {}, {accessToken})\n .then((result) => {\n this.user = User.fromAPI(result.user);\n this._storage.save([this.user]);\n resolve();\n })\n .catch((error) => reject(error));\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Utils } from './utils';\nimport { Conf } from '../../_conf';\nimport { CurrentUser } from './current-user';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable()\nexport class LangsProvider {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _utils: Utils,\n private _currentUser: CurrentUser,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public getBestLangCode(): string {\n if (this._currentUser.isLoggedIn()) {\n for (let i = 0; i < this._conf.availableLangs.length; i++) {\n if (this._conf.availableLangs[i].id === this._currentUser.user.langId) {\n return this._conf.availableLangs[i].code;\n }\n }\n }\n\n const defaultLang = this._conf.defaultLang.code;\n const browserLang = this._translater.getBrowserLang();\n const langRegex = new RegExp(this.getLangCodes().join('|'));\n return browserLang.match(langRegex) ? browserLang : defaultLang;\n }\n\n public getBestLangId(): number {\n if (this._currentUser.isLoggedIn()) {\n return this._currentUser.user.langId;\n }\n\n return this._utils.findIn(this.getBestLangCode(), this._conf.availableLangs, 'code').id;\n }\n\n public getLangs(): any[] {\n const langs: any[] = [];\n for (let i = 0; i < this._conf.availableLangs.length; i++) {\n langs.push(this._conf.availableLangs[i]);\n }\n\n return langs;\n }\n\n public getLangCodes(): string[] {\n const langs: string[] = [];\n for (let i = 0; i < this._conf.availableLangs.length; i++) {\n langs.push(this._conf.availableLangs[i].code);\n }\n\n return langs;\n }\n\n public getLangIds(): number[] {\n const langs: number[] = [];\n for (let i = 0; i < this._conf.availableLangs.length; i++) {\n langs.push(this._conf.availableLangs[i].id);\n }\n\n return langs;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../_common/providers/utils';\nimport { Conf } from '../../_conf';\nimport { ApiBaseService } from '../../_common/providers/api-base-service';\nimport { LangsProvider } from '../../_common/providers/langs-provider';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { ModelsStorage } from '../../_common/providers/models-storage';\nimport { ProjectRights } from './project-rights';\nimport {\n AcademicInstitution,\n AcademicInstitutionGroup,\n Alert,\n CompanyCategory,\n DevelopmentPhase,\n DevelopmentPhase_ProjectTypeGroup,\n File,\n FileGroup,\n MetricsRecord,\n PatentState,\n Project,\n ProjectCase,\n ProjectCase_ProjectType,\n ProjectCase_TherapeuticArea,\n ProjectFavorite,\n ProjectMembership,\n ProjectPastFunding,\n ProjectPrize,\n ProjectTeamMember,\n ProjectType,\n ProjectTypeGroup,\n TherapeuticArea,\n User\n} from '../../_common/providers/models';\n\n@Injectable()\nexport class ProjectsProvider {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly ILLUSTRATION_MAX_SIZE: number = 2; // Mo\n public readonly ILLUSTRATION_MAX_HEIGHT: number = 5000;\n public readonly ILLUSTRATION_MAX_WIDTH: number = 5000;\n public readonly ILLUSTRATION_FILE_TYPES: string[] = ['jpg', 'jpeg', 'png', 'JPG', 'JPEG', 'PNG'];\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public projectFiltersState: ProjectFiltersState = null;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _translater: TranslateService,\n private _router: Router,\n private _api: ApiBaseService,\n private _langs: LangsProvider,\n private _utils: Utils,\n private _currentUser: CurrentUser,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public getProjectTypeGroups() {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(ProjectTypeGroup).get(),\n this._storage.select(ProjectType).get()\n ])\n .then((data: any[]) => {\n const items: ProjectTypeGoupWithTypes[] = [];\n\n // vilain hack degueux pour afficher les groupes dans l'ordre que le client veut...\n const sortIndex: any = {};\n sortIndex['' + ProjectTypeGroup.ID_BIOTECH] = 0;\n sortIndex['' + ProjectTypeGroup.ID_MEDTECH] = 1;\n sortIndex['' + ProjectTypeGroup.ID_HEALTHCARE] = 2;\n data[0].forEach(() => {\n items.push(null);\n });\n\n for (let i = 0; i < data[0].length; i++) {\n const index: number = sortIndex[data[0][i].id] >= 0 ? sortIndex[data[0][i].id] : i;\n items[index] = {\n group: data[0][i],\n types: this._utils.findManyIn([data[0][i].id], data[1], 'projectTypeGroupId')\n };\n }\n\n resolve(items);\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public getAcademicInstitionGroups() {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(AcademicInstitutionGroup).orderBy('ordinal').get(),\n this._storage.select(AcademicInstitution).orderBy('ordinal').get()\n ])\n .then((data: any[]) => {\n const items: AcademicInstitutionGroupWithInstitution[] = [];\n for (let i = 0; i < data[0].length; i++) {\n items.push({\n group: data[0][i],\n institutions: this._utils.findManyIn([data[0][i].id], data[1], 'academicInstitutionGroupId')\n });\n }\n resolve(items);\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public getDevelopmentPhasesWithAssociatedProjectTypeGroups() {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(DevelopmentPhase).orderBy('ordinal').get(),\n this._storage.select(ProjectTypeGroup).get(),\n this._storage.select(DevelopmentPhase_ProjectTypeGroup).get()\n ])\n .then((data: any[]) => {\n const items: DevelopmentPhaseWithAssociatedProjectTypeGroups[] = [];\n for (let i = 0; i < data[0].length; i++) {\n const groupIds: number[] = this._utils.getKeyValues(this._utils.findManyIn([data[0][i].id], data[2], 'developmentPhaseId'), 'projectTypeGroupId');\n items.push({\n developmentPhase: data[0][i],\n groups: this._utils.findManyIn(groupIds, data[1], 'id')\n });\n }\n\n resolve(items);\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public getAvailableDevelopmentPhases(projectTypeIds: number[]): Promise {\n // Note FG:\n // for the time being, we don't filter development phases based on project types\n // but this might change in the future\n return this._storage.select(DevelopmentPhase).orderBy('ordinal').get();\n /*\n return this._storage.select(DevelopmentPhase)\n .where('id').equals(DevelopmentPhase_ProjectTypeGroup, 'developmentPhaseId')\n .and('projectTypeGroupId', DevelopmentPhase_ProjectTypeGroup).equals(ProjectType, 'projectTypeGroupId')\n .and('id', ProjectType).in(projectTypeIds)\n .orderBy('ordinal')\n .get();\n */\n }\n\n public saveProject(project: Project): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/' + (project.id ? project.id : 0),\n this._utils.buildModelParams([project], this._langs.getLangIds())[0],\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n project = Project.fromAPI(data.project, data.projectTranslations);\n const fileGroup: FileGroup = FileGroup.fromAPI(data.fileGroup);\n const memberships: ProjectMembership[] = ProjectMembership.fromAPIList(data.projectMemberships);\n Promise.all([\n this._storage.save([project]),\n this._storage.save([fileGroup]),\n this._storage.save(memberships)\n ])\n .then(() => resolve(project))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveProjectCase(projectId: number, projectCase: ProjectCase[], projectType: ProjectCase_ProjectType[], therapeuticArea: ProjectCase_TherapeuticArea[]): Promise {\n\n const groupedProjectType = this._utils.groupBy(projectType, 'projectCaseId');\n const groupedTherapeuticArea = this._utils.groupBy(therapeuticArea, 'projectCaseId');\n\n // add empty object, so that ProjectCase relations are deleted, when all items are removed\n projectCase.forEach((item) => {\n if (item.id) {\n if (groupedProjectType[item.id] === undefined) {\n const emptyProjectType = new ProjectCase_ProjectType();\n groupedProjectType[item.id] = {emptyProjectType};\n }\n if (groupedTherapeuticArea[item.id] === undefined) {\n const emptyTherapeuticArea = new ProjectCase_TherapeuticArea();\n groupedTherapeuticArea[item.id] = {emptyTherapeuticArea};\n }\n }\n });\n\n return new Promise((resolve, reject) => {\n Promise.all([\n /* 1 */ Object.keys(groupedProjectType).forEach((id) => this.saveProjectTypes(parseFloat(id), groupedProjectType[id])),\n /* 2 */ Object.keys(groupedTherapeuticArea).forEach((id) => this.saveTherapeuticAreas(parseFloat(id), groupedTherapeuticArea[id])),\n this._api.call(\n 'post',\n 'projects/' + projectId + '/project-case',\n {projectCase: this._utils.buildModelParams(projectCase, this._langs.getLangIds())},\n this._currentUser.getAccessToken()\n )\n ])\n .then((data: any) => {\n projectCase = ProjectCase.fromAPIList(data[2].projectCase, data[2].projectCaseTranslations);\n this._storage.select(ProjectCase).where('projectId').equals(projectId).get()\n .then((toDelete: ProjectCase[]) => {\n Promise.all([\n this._storage.delete(toDelete),\n this._storage.save(projectCase)\n ])\n .then(() => resolve(projectCase))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveProjectTypes(projectCaseId: number, projectType: ProjectCase_ProjectType[]): Promise {\n return new Promise((resolve, reject) => {\n\n this._api.call(\n 'post',\n 'projects/project-case/' + projectCaseId + '/project-types',\n {ProjectCase_ProjectTypes: this._utils.buildModelParams(projectType, this._langs.getLangIds())},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n projectType = ProjectCase_ProjectType.fromAPIList(data.projectCase_projectTypes);\n this._storage.select(ProjectCase_ProjectType).where('projectCaseId').equals(projectCaseId).get()\n .then((toDelete: ProjectCase_ProjectType[]) => {\n Promise.all([\n this._storage.delete(toDelete),\n this._storage.save(projectType)\n ])\n .then(() => resolve(projectType))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveTherapeuticAreas(projectCaseId: number, therapteuticAreaIds: ProjectCase_TherapeuticArea[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/project-case/' + projectCaseId + '/therapeutic-areas',\n {ProjectCase_TherapeuticAreas: this._utils.buildModelParams(therapteuticAreaIds, this._langs.getLangIds())},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n therapteuticAreaIds = ProjectCase_TherapeuticArea.fromAPIList(data.projectCase_therapeuticAreas);\n this._storage.select(ProjectCase_TherapeuticArea).where('projectCaseId').equals(projectCaseId).get()\n .then((toDelete: ProjectCase_TherapeuticArea[]) => {\n Promise.all([\n this._storage.delete(toDelete),\n this._storage.save(therapteuticAreaIds)\n ])\n .then(() => resolve(therapteuticAreaIds))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveProjectPrizes(projectId: number, prizes: ProjectPrize[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/' + projectId + '/prizes',\n {projectPrizes: this._utils.buildModelParams(prizes, this._langs.getLangIds())},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n this._storage.select(ProjectPrize).where('projectId').equals(projectId).get()\n .then((oldPrizes: ProjectPrize[]) => {\n prizes = ProjectPrize.fromAPIList(data.projectPrizes);\n Promise.all([\n this._storage.delete(oldPrizes),\n this._storage.save(prizes)\n ])\n .then(() => resolve(prizes))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveProjectPastFundings(projectId: number, fundings: ProjectPastFunding[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/' + projectId + '/past-fundings',\n {projectPastFundings: this._utils.buildModelParams(fundings, this._langs.getLangIds())},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n fundings = ProjectPastFunding.fromAPIList(data.projectPastFundings);\n this._storage.save(fundings)\n .then(() => resolve(fundings))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveProjectTeamMembers(projectId: number, members: ProjectTeamMember[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/' + projectId + '/team-members',\n {projectTeamMembers: this._utils.buildModelParams(members, this._langs.getLangIds())},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n members = ProjectTeamMember.fromAPIList(data.projectTeamMembers);\n this._storage.select(ProjectTeamMember).where('projectId').equals(projectId).get()\n .then((toDelete: ProjectTeamMember[]) => {\n Promise.all([\n this._storage.delete(toDelete),\n this._storage.save(members)\n ])\n .then(() => resolve(members))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public addFiles(project: Project, files: File[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/' + project.id + '/files/add',\n {files: this._utils.buildModelParams(files, this._langs.getLangIds())},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n files = File.fromAPIList(data.files);\n this._storage.save(files)\n .then(() => resolve(files))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public updateFile(project: Project, file: File): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/' + project.id + '/files/' + file.id,\n this._utils.buildModelParams([file], this._langs.getLangIds())[0],\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n file = File.fromAPI(data.file);\n this._storage.save([file])\n .then(() => resolve(file))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public deleteFile(project: Project, file: File): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'delete',\n 'projects/' + project.id + '/files/' + file.id,\n this._utils.buildModelParams([file], this._langs.getLangIds())[0],\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n this._storage.delete([file])\n .then(() => resolve())\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public toggleProjectFavorite(project: Project): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(ProjectFavorite)\n .where('userId').equals(this._currentUser.user.id)\n .and('projectId').equals(project.id)\n .get(1)\n .then((favorite: ProjectFavorite) => {\n const isFavorite: boolean = favorite != null;\n this._api.call(\n isFavorite ? 'delete' : 'post',\n 'projects/' + project.id + '/favorite',\n {},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n const promise: Promise = isFavorite ? this._storage.delete([favorite]) : this._storage.save([ProjectFavorite.fromAPI(data.projectFavorite)]);\n promise\n .then(() => {\n resolve(!isFavorite);\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public validateProject(project: Project, newState: number, message: string = null): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/' + project.id + '/validate',\n {projectValidationStateId: newState, message},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n project = Project.fromAPI(data.project, data.projectTranslations);\n this._storage.save([project])\n .then(() => resolve(project))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public askForReview(project: Project): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/' + project.id + '/ask-for-review',\n {},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n project = Project.fromAPI(data.project, data.projectTranslations);\n this._storage.save([project])\n .then(() => resolve(project))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public registerAccount(firstName: string, lastName: string, email: string, password: string): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/account',\n {\n firstName,\n lastName,\n email,\n password\n }\n )\n // on stock pas localement les données parce qu'après cette opération, on serait censé lancé un sync ...\n .then((data: any) => resolve())\n .catch((error: any) => reject(error));\n });\n }\n\n public getProject(id): Promise {\n return this._storage.fromId(Project, id);\n }\n\n public deleteProject(project: Project): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'delete',\n 'projects/' + project.id,\n {},\n this._currentUser.getAccessToken()\n )\n .then(() => {\n Promise.all([\n this._storage.delete([project]),\n this._storage.deleteOn(ProjectFavorite, 'projectId', project.id),\n this._storage.deleteOn(ProjectPrize, 'projectId', project.id),\n this._storage.deleteOn(ProjectPastFunding, 'projectId', project.id),\n this._storage.deleteOn(ProjectTeamMember, 'projectId', project.id),\n this._storage.deleteOn(ProjectMembership, 'projectId', project.id),\n this._storage.select(ProjectCase).where('projectId').equals(project.id).get()\n ])\n .then((data: any[]) => {\n const projectCaseId: number[] = data[6];\n Promise.all([\n this._storage.deleteOn(ProjectCase, 'projectId', project.id),\n this._storage.deleteMultipleOn(ProjectCase_ProjectType, 'projectCaseId', projectCaseId),\n this._storage.deleteMultipleOn(ProjectCase_TherapeuticArea, 'projectCaseId', projectCaseId),\n ]).then(() => resolve())\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public deleteProjectCase(singleProjectCase: ProjectCase): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'delete',\n 'projects/project-case/' + singleProjectCase.id,\n {},\n this._currentUser.getAccessToken()\n )\n .then(() => {\n Promise.all([\n this._storage.delete([singleProjectCase]),\n this._storage.deleteOn(ProjectCase_ProjectType, 'projectCaseId', singleProjectCase.id),\n this._storage.deleteOn(ProjectCase_TherapeuticArea, 'projectCaseId', singleProjectCase.id),\n ])\n .then(() => resolve())\n .catch((error: any) => reject(error));\n\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveAcademicInsitution1(projectId: number, academicInstitution1Id: number): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/' + projectId + '/academic-institution-1',\n {academicInstitution1Id},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n const project: Project = Project.fromAPI(data.project, data.projectTranslations);\n this._storage.save([project])\n .then(() => resolve(project))\n .catch(reject);\n })\n .catch(reject);\n });\n }\n\n public dispatchNotification(project: Project, user: User): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/' + project.id + '/dispatch-notification/' + user.id,\n {},\n this._currentUser.getAccessToken()\n )\n .then(() => resolve())\n .catch(reject);\n });\n }\n\n public computeListingProgress(project: Project, projectTypesCount: number, therapeuticAreasCount: number, teamMembersCount: number): number {\n let progress: number = 0;\n\n project.name ? progress++ : progress += 0;\n projectTypesCount ? progress++ : progress += 0;\n therapeuticAreasCount ? progress++ : progress += 0;\n project.pipeline ? progress++ : progress += 0;\n project.keywords ? progress++ : progress += 0;\n project.logo ? progress++ : progress += 0;\n project.illustration ? progress++ : progress += 0;\n project.developmentPhaseId ? progress++ : progress += 0;\n project.patentStateId ? progress++ : progress += 0;\n project.incorporationYear ? progress++ : progress += 0;\n project.academicInstitution1Id ? progress++ : progress += 0;\n teamMembersCount ? progress++ : progress += 0;\n project.teamPicture ? progress++ : progress += 0;\n project.contactFirstName ? progress++ : progress += 0;\n project.contactLastName ? progress++ : progress += 0;\n project.contactEmail ? progress++ : progress += 0;\n project.contactWebsite ? progress++ : progress += 0;\n project.contactPhone ? progress++ : progress += 0;\n project.contactAddress ? progress++ : progress += 0;\n project.isTTOAgreementAccepted || project.isInstitutionLicenseOwned ? progress++ : progress += 0;\n\n return Math.round((progress / 26) * 100);\n }\n\n public addProjectMetrics(projectId: number, tag: string): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/' + projectId + '/metrics',\n {\n tag\n },\n this._currentUser.getAccessToken()\n )\n .then(() => resolve())\n .catch(reject);\n });\n }\n\n public getProjectChartData(project: Project, groupBy: 'day' | 'week', seriesNames: string[]): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(MetricsRecord).where('projectId').equals(project.id).get(),\n this._storage.select(CompanyCategory).orderBy('ordinal').get()\n ])\n .then((data: any[]) => {\n if (data[0].length === 0) {\n resolve(null);\n return;\n }\n\n const viewsRecords: MetricsRecord[] = data[0].filter((record: MetricsRecord) => record.tag === MetricsRecord.TAG_PROJECT_SEEN);\n const favoritesRecords: MetricsRecord[] = data[0].filter((record: MetricsRecord) => record.tag === MetricsRecord.TAG_FAVORITE_ADDED);\n const unfavoritesRecords: MetricsRecord[] = data[0].filter((record: MetricsRecord) => record.tag === MetricsRecord.TAG_FAVORITE_REMOVED);\n const investorsIndex: any = {};\n const investorsRecords: MetricsRecord[] = viewsRecords.filter((record: MetricsRecord) => {\n const payload: any = JSON.parse(record.payload);\n // a noter qu'avec ce système, si un investisseur change de catégorie d'entreprise\n // il sera affiché avec sa première catégorie, pas la dernière en date\n // de plus, ça créé un delta entre les uniques investors et les details views\n // (mais c'est normal, la personne physique derrière ne change pas !)\n if (payload.investorProfile && !investorsIndex[payload.investorProfile.id]) {\n investorsIndex[payload.investorProfile.id] = true;\n return true;\n }\n\n return false;\n });\n\n const fromDate: string = project.publishDate ? project.publishDate : project.createDate;\n const toDate: string = this._utils.DateToYmdHis(new Date());\n\n const viewsData: any = {\n name: seriesNames[0],\n series: this.buildChartSeries(viewsRecords, [], fromDate, toDate, groupBy)\n };\n\n const investorsData: any = {\n name: seriesNames[1],\n series: this.buildChartSeries(investorsRecords, [], fromDate, toDate, groupBy)\n };\n\n const bookmarksData: any = {\n name: seriesNames[2],\n series: this.buildChartSeries(favoritesRecords, unfavoritesRecords, fromDate, toDate, groupBy)\n };\n\n resolve({\n chart: [viewsData, investorsData, bookmarksData],\n viewsPie: this.buildPieData(viewsRecords, [], data[1]),\n investorsPie: this.buildPieData(investorsRecords, [], data[1]),\n favoritesPie: this.buildPieData(favoritesRecords, unfavoritesRecords, data[1])\n });\n })\n .catch(reject);\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private buildChartSeries(records: MetricsRecord[], soustractRecords: MetricsRecord[], fromDate: string, toDate: string, groupBy: 'day' | 'week'): any[] {\n const dailyData: any[] = [];\n const _records: MetricsRecord[] = records.slice();\n const _soustractRecords: MetricsRecord[] = soustractRecords.slice();\n\n const date: Date = this._utils.dateAtMidnight(new Date(fromDate));\n const toDateTmp: Date = this._utils.dateAtMidnight(new Date(toDate));\n toDateTmp.setDate(toDateTmp.getDate() + 1);\n const toTimestamp: number = toDateTmp.getTime();\n let value: number = 0;\n while (date.getTime() <= toTimestamp) {\n const dateStr: string = this._utils.DateToYmdHis(date).split(' ')[0];\n const dayData: any = {\n name: dateStr,\n value\n };\n\n let i: number = 0;\n while (i < _records.length) {\n if (_records[i].createDate.split(' ')[0] === dateStr) {\n value++;\n dayData.value = value;\n _records.splice(i, 1);\n } else {\n i++;\n }\n }\n i = 0;\n while (i < _soustractRecords.length) {\n if (_soustractRecords[i].createDate.split(' ')[0] === dateStr) {\n value--;\n dayData.value = value;\n _soustractRecords.splice(i, 1);\n } else {\n i++;\n }\n }\n\n dailyData.push(dayData);\n date.setDate(date.getDate() + 1);\n }\n\n if (groupBy === 'day') {\n dailyData.forEach((row: any) => row.name = this._utils.formatDate(row.name + ' 00:00:00', 'mdY'));\n\n return dailyData;\n }\n\n const weeklyData: any[] = [];\n for (let i = dailyData.length - 1; i >= 0; i -= 7) {\n weeklyData.push({\n name: this._utils.formatDate(dailyData[i].name + ' 00:00:00', 'mdY'),\n value: dailyData[i].value\n });\n }\n weeklyData.reverse();\n\n return weeklyData;\n }\n\n private buildPieData(records: MetricsRecord[], soustractRecords: MetricsRecord[], companyCategories: CompanyCategory[]): any[] {\n const data: any[] = [];\n companyCategories.forEach((category: CompanyCategory) => {\n data.push({\n id: category.id,\n name: category.name,\n value: 0\n });\n });\n data.push({\n id: null,\n name: this._translater.instant('Unknown'),\n value: 0\n });\n\n const computedRecords: MetricsRecord[] = records.slice();\n soustractRecords.forEach((record: MetricsRecord) => {\n for (let i = 0; i < computedRecords.length; i++) {\n if (record.createrId === computedRecords[i].createrId) {\n computedRecords.splice(i, 1);\n i = computedRecords.length;\n }\n }\n });\n\n computedRecords.forEach((record: MetricsRecord) => {\n const payload: any = JSON.parse(record.payload);\n if (payload.investorProfile && payload.investorProfile.companyCategoryId) {\n const row: any = this._utils.findIn(payload.investorProfile.companyCategoryId, data, 'id');\n row.value++;\n } else {\n data[data.length - 1].value++;\n }\n });\n\n return data;\n }\n}\n\nexport interface ProjectTypeGoupWithTypes {\n group: ProjectTypeGroup;\n types: ProjectType[];\n}\n\nexport interface AcademicInstitutionGroupWithInstitution {\n group: AcademicInstitutionGroup;\n institutions: AcademicInstitution[];\n}\n\nexport interface DevelopmentPhaseWithAssociatedProjectTypeGroups {\n developmentPhase: DevelopmentPhase;\n groups: ProjectTypeGroup[];\n}\n\nexport interface ProjectSearchResultRow {\n project: Project;\n institution1: AcademicInstitution;\n fundingRoundId: number;\n rights: ProjectRights;\n projectTypes: ProjectType[];\n projectTypeIds: number[];\n therapeuticAreas: TherapeuticArea[];\n therapeuticAreaIds: number[];\n logoImage?: any;\n institution2?: AcademicInstitution;\n isLoading?: boolean;\n isFavorite?: boolean;\n}\n\nexport interface IProjectCaseSearchResultRow {\n projectCase: ProjectCase;\n project: Project;\n fundingRoundId: number;\n rights: ProjectRights;\n projectTypes: ProjectType[];\n projectTypeIds: number[];\n therapeuticAreas: TherapeuticArea[];\n therapeuticAreaIds: number[];\n logoImage?: any;\n isLoading?: boolean;\n isFavorite?: boolean;\n}\n\nexport interface ProjectFiltersState {\n projectTypeIds: number[];\n therapeuticAreaIds: number[];\n developmentPhaseIds: number[];\n fundingRoundIds?: number[];\n alert: Alert;\n pageIndex: number;\n}\n\nexport interface ProjectChartData {\n chart: {\n name: string,\n series: {\n name: string,\n value: number\n }[]\n }[];\n viewsPie: {\n id: number,\n name: string,\n value: number\n }[];\n investorsPie: {\n id: number,\n name: string,\n value: number\n }[];\n favoritesPie: {\n id: number,\n name: string,\n value: number\n }[];\n}\n\nexport interface IGroupedProjectCaseTherapeuticArea {\n projectCaseId: number;\n therapeuticArea: ProjectCase_TherapeuticArea[];\n}\n\nexport interface IGroupedProjectCaseProjectTypes {\n projectCaseId: number;\n projectTypes: ProjectCase_ProjectType[];\n}\n\nexport interface IProjectCaseView {\n projectCaseId: number;\n projectCase: ProjectCase;\n projectTypes: ProjectType[];\n therapeuticArea: TherapeuticArea[];\n developmentPhase: DevelopmentPhase;\n patentState: PatentState;\n}\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from './utils';\nimport { Conf } from '../../_conf';\nimport { ApiBaseService } from './api-base-service';\nimport { CurrentUser } from './current-user';\nimport { ModelsStorage } from './models-storage';\nimport { LangsProvider } from './langs-provider';\nimport {\n AcademicInstitution,\n AcademicInstitutionGroup,\n Alert,\n Alert_AcademicInstitution,\n Alert_DevelopmentPhase,\n Alert_FundingRound,\n Alert_ProjectType,\n Alert_TherapeuticArea,\n Company,\n Company_DevelopmentPhase,\n Company_ProjectType,\n Company_TherapeuticArea,\n CompanyCategory,\n CompanyCategoryGroup,\n CompanyCompanyCategory,\n CompanyContact,\n DevelopmentPhase,\n DevelopmentPhase_ProjectTypeGroup,\n DevelopmentPhaseOfInterest,\n Discussion,\n DiscussionMessage,\n File,\n FileFamily,\n FileGroup,\n FileType,\n FundingRound,\n InvestorProfile,\n InvestorValidationState,\n Lang,\n LikeCounter,\n LikeCounter_User,\n MetricsRecord,\n PatentState,\n PrivateDiscussion,\n PrivateDiscussion_User,\n Project,\n ProjectCase,\n ProjectCase_ProjectType,\n ProjectCase_TherapeuticArea,\n ProjectFavorite,\n ProjectMembership,\n ProjectPastFunding,\n ProjectPrize,\n ProjectTeamMember,\n ProjectTradeType,\n ProjectType,\n ProjectTypeGroup,\n ProjectValidationState,\n ProjectVisibility,\n Tag,\n TeamMemberType,\n TherapeuticArea,\n TherapeuticAreaOfInterest,\n User,\n User_AcademicInstitution,\n User_UserLink,\n UserLink\n} from './models';\n\n@Injectable()\nexport class SyncServiceProvider {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _pollId: any = null;\n private _pollInterval: number = 5000; // 5 secondes\n private _intervals: any = {\n _default: 0, // pas de limitation\n commonData: 3600, // 1 heure\n userData: 30 // 30 secondes\n };\n\n private _syncTimestamps: any = {};\n\n private _listeners: SyncListener[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _translater: TranslateService,\n private _conf: Conf,\n private _utils: Utils,\n private _api: ApiBaseService,\n private _currentUser: CurrentUser,\n private _langs: LangsProvider,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public start(): Promise {\n return new Promise((resolve, reject) => {\n this.sync()\n .then(() => {\n this._pollId = setInterval(() => {\n this.sync(false)\n .then((error) => {\n if (error) {\n console.log(error);\n }\n });\n }, this._pollInterval);\n resolve();\n });\n });\n }\n\n public stop(): void {\n if (this._pollId) {\n clearInterval(this._pollId);\n }\n this._syncTimestamps = {};\n }\n\n public restart(): Promise {\n this.stop();\n return this.start();\n }\n\n public sync(force: boolean = true, fromTimestamp: number = null): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this.commonData(force, fromTimestamp),\n this.userData(force, fromTimestamp)\n ])\n .then((results) => resolve(results))\n .catch((error) => resolve(error));\n });\n }\n\n /**\n * Register the listener and returns an auto-generated identifier that can be used to remove it using the \"removeSyncListener\" method.\n * @param listener\n */\n public addSyncListener(listener: SyncListener): string {\n listener.id = this._utils.randomString(16);\n this._listeners.push(listener);\n\n return listener.id;\n }\n\n /**\n * Unregister the listener corresponding to the id. The id must match with the id generated when registering the listener using the \"addSyncListener\" method.\n * @param id\n */\n public removeSyncListener(id: string): void {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i].id === id) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private canSync(node: string): boolean {\n if (this._syncTimestamps[node]) {\n let interval: number = this._intervals[node];\n if (!interval) {\n interval = this._intervals._default;\n }\n\n return this.now() - this._syncTimestamps[node] > interval;\n } else {\n this._syncTimestamps[node] = 0;\n }\n\n return true;\n }\n\n private now(): number {\n return parseInt('' + (Date.now() / 1000));\n }\n\n private getSyncParams(node: string, fromTimestamp: number = null): any {\n let timestamp: number = fromTimestamp || fromTimestamp === 0 ? fromTimestamp : this._syncTimestamps[node];\n if (!timestamp) {\n timestamp = 0;\n }\n\n return {since: timestamp, lang: this._langs.getBestLangCode()};\n }\n\n private commonData(force: boolean = true, fromTimestamp: number = null): Promise {\n return new Promise((resolve, reject) => {\n if (force || this.canSync('commonData')) {\n const timestamp: number = this.now();\n this._api.call('get', 'sync/common-data', this.getSyncParams('commonData', fromTimestamp))\n .then((data) => {\n Promise.all([\n this._storage.save(Lang.fromAPIList(data.langs)),\n this._storage.save(FileFamily.fromAPIList(data.fileFamilies, data.fileFamilyTranslations)),\n this._storage.save(FileType.fromAPIList(data.fileTypes, data.fileTypeTranslations)),\n this._storage.save(UserLink.fromAPIList(data.userLinks, data.userLinkTranslations)),\n this._storage.save(CompanyCategoryGroup.fromAPIList(data.companyCategoryGroups, data.companyCategoryGroupTranslations)),\n this._storage.save(CompanyCategory.fromAPIList(data.companyCategories, data.companyCategoryTranslations)),\n this._storage.save(InvestorValidationState.fromAPIList(data.investorValidationStates, data.investorValidationStateTranslations)),\n this._storage.save(ProjectTypeGroup.fromAPIList(data.projectTypeGroups, data.projectTypeGroupTranslations)),\n this._storage.save(AcademicInstitutionGroup.fromAPIList(data.academicInstitutionGroups, data.academicInstitutionGroupTranslations)),\n this._storage.save(ProjectType.fromAPIList(data.projectTypes, data.projectTypeTranslations)),\n this._storage.save(TherapeuticArea.fromAPIList(data.therapeuticAreas, data.therapeuticAreaTranslations)),\n this._storage.save(DevelopmentPhase.fromAPIList(data.developmentPhases, data.developmentPhaseTranslations)),\n this._storage.save(AcademicInstitution.fromAPIList(data.academicInstitutions, data.academicInstitutionTranslations)),\n this._storage.save(TeamMemberType.fromAPIList(data.teamMemberTypes, data.teamMemberTypeTranslations)),\n this._storage.save(ProjectVisibility.fromAPIList(data.projectVisibilities, data.projectVisibilityTranslations)),\n this._storage.save(PatentState.fromAPIList(data.patentStates, data.patentStateTranslations)),\n this._storage.save(ProjectValidationState.fromAPIList(data.projectValidationStates, data.projectValidationStateTranslations)),\n this._storage.save(FundingRound.fromAPIList(data.fundingRounds, data.fundingRoundTranslations)),\n this._storage.save(DevelopmentPhase_ProjectTypeGroup.fromAPIList(data.developmentPhase_projectTypeGroups)),\n this._storage.save(Company.fromAPIList(data.companies)),\n this._storage.save(CompanyCompanyCategory.fromAPIList(data.companyCompanyCategories, data.companyCompanyCategoryTranslations)),\n this._storage.save(ProjectTradeType.fromAPIList(data.projectTradeTypes, data.projectTradeTypesTranslations))\n ])\n .then(() => {\n this._syncTimestamps['commonData'] = timestamp;\n this.notify('onCommonDataSynced', data);\n resolve();\n })\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n } else {\n resolve();\n }\n });\n }\n\n private userData(force: boolean = true, fromTimestamp: number = null): Promise {\n return new Promise((resolve, reject) => {\n if (this._currentUser.isLoggedIn() && (force || this.canSync('userData'))) {\n let syncApi: string = 'sync/';\n if (this._currentUser.user.isAdmin) {\n syncApi += 'admin-data';\n } else if (this._currentUser.user.isInvestor || this._currentUser.user.isGuest) {\n syncApi += 'investor-data';\n } else if (this._currentUser.user.isProjectHolder) {\n syncApi += 'project-holder-data';\n } else if (this._currentUser.user.isLocalExpert) {\n syncApi += 'local-expert-data';\n }\n\n const timestamp: number = this.now();\n this._api.call(\n 'get',\n syncApi,\n this.getSyncParams('userData', fromTimestamp),\n this._currentUser.getAccessToken()\n )\n .then((data) => {\n Promise.all([\n // on enlève pas les éléments supprimés des users\n // parce qu'ils peuvent quand même être récupérés dans certaines situations\n this._storage.save(User.fromAPIList(data.users), true),\n this._storage.save(Discussion.fromAPIList(data.discussions)),\n this._storage.save(DiscussionMessage.fromAPIList(data.discussionMessages)),\n this._storage.save(FileGroup.fromAPIList(data.fileGroups)),\n this._storage.save(File.fromAPIList(data.files)),\n this._storage.save(PrivateDiscussion.fromAPIList(data.privateDiscussions)),\n this._storage.save(PrivateDiscussion_User.fromAPIList(data.privateDiscussion_users)),\n this._storage.save(User_UserLink.fromAPIList(data.user_userLinks)),\n this._storage.save(LikeCounter.fromAPIList(data.likeCounters)),\n this._storage.save(LikeCounter_User.fromAPIList(data.likeCounter_users)),\n this._storage.save(Tag.fromAPIList(data.tags, data.tagTranslations)),\n this._storage.save(InvestorProfile.fromAPIList(data.investorProfiles)),\n this._storage.save(TherapeuticAreaOfInterest.fromAPIList(data.therapeuticAreaOfInterests)),\n this._storage.save(ProjectFavorite.fromAPIList(data.projectFavorites)),\n this._storage.save(Alert.fromAPIList(data.alerts)),\n this._storage.save(Alert_AcademicInstitution.fromAPIList(data.alert_academicInstitutions)),\n this._storage.save(Alert_DevelopmentPhase.fromAPIList(data.alert_developmentPhases)),\n this._storage.save(Alert_FundingRound.fromAPIList(data.alert_fundingRounds)),\n this._storage.save(Alert_ProjectType.fromAPIList(data.alert_projectTypes)),\n this._storage.save(Alert_TherapeuticArea.fromAPIList(data.alert_therapeuticAreas)),\n this._storage.save(Project.fromAPIList(data.projects, data.projectTranslations)),\n this._storage.save(ProjectPrize.fromAPIList(data.projectPrizes)),\n this._storage.save(ProjectPastFunding.fromAPIList(data.projectPastFundings)),\n this._storage.save(ProjectTeamMember.fromAPIList(data.projectTeamMembers)),\n this._storage.save(ProjectMembership.fromAPIList(data.projectMemberships)),\n this._storage.save(ProjectCase.fromAPIList(data.projectCase, data.projectCaseTranslations)),\n this._storage.save(ProjectCase_ProjectType.fromAPIList(data.projectCase_projectTypes)),\n this._storage.save(ProjectCase_TherapeuticArea.fromAPIList(data.projectCase_therapeuticAreas)),\n this._storage.save(DevelopmentPhaseOfInterest.fromAPIList(data.developmentPhaseOfInterests)),\n this._storage.save(User_AcademicInstitution.fromAPIList(data.user_academicInstitutions)),\n this._storage.save(MetricsRecord.fromAPIList(data.metricsRecords)),\n this._storage.save(Company.fromAPIList(data.companies)),\n this._storage.save(Company_TherapeuticArea.fromAPIList(data.company_therapeuticAreas)),\n this._storage.save(Company_DevelopmentPhase.fromAPIList(data.company_developmentPhases)),\n this._storage.save(CompanyContact.fromAPIList(data.companyContacts)),\n this._storage.save(Company_ProjectType.fromAPIList(data.company_projectTypes)),\n ])\n .then(() => {\n this._syncTimestamps['userData'] = timestamp;\n this.notify('onUserDataSynced', data);\n resolve();\n })\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n } else {\n resolve();\n }\n });\n }\n\n private notify(event: string, rawData: any): void {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i][event]) {\n this._listeners[i][event](rawData);\n }\n }\n }\n}\n\nexport interface SyncListener {\n id?: string;\n onCommonDataSynced: any;\n onUserDataSynced: any;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\n\n// inspiré de : https://github.com/ngx-translate/core/issues/223#issuecomment-333335132\n\n@Pipe({name: 'translateCut'})\nexport class TranslateCutPipe implements PipeTransform {\n constructor(\n private _translater: TranslateService\n ) {\n }\n\n public transform(str: string, params: TranslatecutParams) {\n if (!params.separator) {\n params.separator = '||';\n }\n\n const translated: string = this._translater.instant(str);\n\n return translated.split(params.separator)[Number(params.index)];\n }\n}\n\nexport interface TranslatecutParams {\n separator: string;\n index: number;\n}\n","

{{ 'New_account' | translate }}

\n\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ firstNameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n \n \n {{ 'Invalid_value' | translate }}\n {{ lastNameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ 'Email_unavailable' | translate }}\n {{ emailFormControl.value.length }}/{{ EMAIL_MAX_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n \n \n
\n
\n \n {{ 'I_agree_with_terms' | translateCut: {index: 0} }}{{ 'I_agree_with_terms' | translateCut: {index: 1} }}{{ 'I_agree_with_terms' | translateCut: {index: 2} }}\n \n
\n
 
\n
\n\n \n \n\n
\n \n \n
\n","import { AfterViewInit, Component, Inject } from '@angular/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Router } from '@angular/router';\nimport { AcademicInstitutionGroupWithInstitution, ProjectsProvider } from '../../providers/projects-provider';\nimport { SyncServiceProvider } from '../../../_common/providers/sync-service';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { AcademicInstitutionGroup } from '../../../_common/providers/models';\nimport { Utils } from '../../../_common/providers/utils';\n\n@Component({\n selector: 'projects-register-dialog',\n providers: [],\n styleUrls: ['./register-dialog.scss'],\n templateUrl: './register-dialog.html'\n})\nexport class ProjectsRegisterDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly NAME_MAX_LENGTH: number = 100;\n public readonly EMAIL_MAX_LENGTH: number = 200;\n public readonly PASSWORD_MAX_LENGTH: number = 200;\n public readonly PASSWORD_MIN_LENGTH: number = 8;\n public readonly EXCLUDED_INSTITUTION1_GROUP_IDS: number[] = [AcademicInstitutionGroup.ID_OTHER];\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n public showPassword: boolean = false;\n\n public firstNameFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.maxLength(this.NAME_MAX_LENGTH)\n ]);\n public lastNameFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.maxLength(this.NAME_MAX_LENGTH)\n ]);\n public emailUnavailableError: boolean = false;\n public emailFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.maxLength(this.EMAIL_MAX_LENGTH),\n Validators.email,\n Validators.pattern(this.utils.EMAIL_REGEX),\n (control: any) => {\n return this.emailUnavailableError ? {unavailable: {valid: false}} : null;\n }\n ]);\n public passwordFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.maxLength(this.PASSWORD_MAX_LENGTH),\n Validators.minLength(this.PASSWORD_MIN_LENGTH)\n ]);\n public terms: boolean = false;\n\n public academicInstitionGroups: AcademicInstitutionGroupWithInstitution[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public dialog: MatDialogRef,\n public utils: Utils,\n private _translater: TranslateService,\n private _projectsProvider: ProjectsProvider,\n private _sync: SyncServiceProvider,\n private _currentUser: CurrentUser,\n private _router: Router,\n private _toaster: MatSnackBar,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.loadStaticData().catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onRegisterClicked(): void {\n this.isLoading = true;\n this.register()\n .then(() => {\n this.dialog.afterClosed().subscribe(() => this._router.navigate(['academic-ventures', 'welcome']));\n this.dialog.close();\n this._toaster.open(this._translater.instant('Account_created'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n\n public onEmailChanged(): void {\n this.emailUnavailableError = false;\n this.emailFormControl.updateValueAndValidity();\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadStaticData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._projectsProvider.getAcademicInstitionGroups()\n ])\n .then((data: any[]) => {\n this.academicInstitionGroups = data[0];\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private register(): Promise {\n return new Promise((resolve, reject) => {\n this._projectsProvider.registerAccount(\n this.firstNameFormControl.value,\n this.lastNameFormControl.value,\n this.emailFormControl.value,\n this.passwordFormControl.value\n )\n .then(() => {\n this._currentUser.login(this.emailFormControl.value, this.passwordFormControl.value, false)\n .then(() => {\n this._sync.sync(true, 0)\n .then(() => {\n resolve();\n })\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n this.isLoading = false;\n\n if (error.status === 422 && error.error.errors['email']) {\n this.emailUnavailableError = true;\n this.emailFormControl.updateValueAndValidity();\n } else {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../_common/providers/utils';\nimport { Conf } from '../../_conf';\nimport { ApiBaseService } from '../../_common/providers/api-base-service';\nimport { LangsProvider } from '../../_common/providers/langs-provider';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { ModelsStorage } from '../../_common/providers/models-storage';\nimport { InvestorRights } from './investor-rights';\nimport {\n Alert,\n Company,\n Company_DevelopmentPhase,\n Company_ProjectType,\n Company_TherapeuticArea,\n CompanyCategory,\n CompanyCategoryGroup,\n CompanyCompanyCategory,\n CompanyContact,\n DevelopmentPhase,\n DevelopmentPhaseOfInterest,\n InvestorProfile,\n InvestorValidationState,\n ProjectType,\n TherapeuticArea,\n TherapeuticAreaOfInterest,\n User\n} from '../../_common/providers/models';\nimport { CompanyRights } from './company-rights';\n\n@Injectable()\nexport class InvestorsProvider {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly COMPANY_NAME_MAX_LENGTH: number = 250;\n public readonly COMPANY_DESCRIPTION_MAX_LENGTH: number = 2000;\n public readonly COMPANY_INVESTMENT_COMMENT_MAX_LENGTH: number = 2000;\n public readonly COMPANY_CONTACT_NAME_MAX_LENGTH: number = 250;\n public readonly COMPANY_CONTACT_EMAIL_MAX_LENGTH: number = 250;\n public readonly COMPANY_CONTACT_PHONE_MAX_LENGTH: number = 250;\n public readonly COMPANY_CONTACT_DEFAULT_TEXT_LENGTH: number = 250;\n public readonly COMPANY_LOGO_MAX_SIZE: number = 2; // Mo\n public readonly COMPANY_LOGO_MAX_HEIGHT: number = 5000;\n public readonly COMPANY_LOGO_MAX_WIDTH: number = 5000;\n public readonly COMPANY_LOGO_FILE_TYPES: string[] = ['jpg', 'jpeg', 'png', 'JPG', 'JPEG', 'PNG'];\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public investorFiltersState: InvestorFiltersState = null;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _translater: TranslateService,\n private _router: Router,\n private _api: ApiBaseService,\n private _langs: LangsProvider,\n private _utils: Utils,\n private _currentUser: CurrentUser,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public getCompanyCategoryGroups(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(CompanyCategoryGroup).get(),\n this._storage.select(CompanyCategory).get()\n ])\n .then((data: any[]) => {\n const items: CompanyCategoryGoupWithCategories[] = [];\n for (let i = 0; i < data[0].length; i++) {\n items.push({\n group: data[0][i],\n categories: this._utils.findManyIn([data[0][i].id], data[1], 'companyCategoryGroupId')\n });\n\n }\n resolve(items);\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public async saveInvestorProfile(investorProfile: InvestorProfile): Promise {\n return new Promise(async (resolve, reject) => {\n try {\n const data: any = await this._api.call(\n 'post',\n 'investors/' + investorProfile.id,\n this._utils.buildModelParams([investorProfile], this._langs.getLangIds())[0],\n this._currentUser.getAccessToken()\n );\n\n investorProfile = InvestorProfile.fromAPI(data.investorProfile);\n await this.updateInvestorAlert(data, 'investorPartnershipAlert');\n\n await this._storage.save([investorProfile]);\n\n resolve();\n\n } catch (e) {\n reject(e);\n }\n });\n }\n\n public saveTherapeuticAreaOfInterests(investorProfileId: number, therapeuticAreaIds: number[]): Promise {\n return new Promise((resolve, reject) => {\n let therapeuticAreaOfInterests: TherapeuticAreaOfInterest[] = [];\n for (let i = 0; i < therapeuticAreaIds.length; i++) {\n const item: TherapeuticAreaOfInterest = new TherapeuticAreaOfInterest();\n item.investorProfileId = investorProfileId;\n item.therapeuticAreaId = therapeuticAreaIds[i];\n therapeuticAreaOfInterests.push(item);\n }\n\n this._api.call(\n 'post',\n 'investors/' + investorProfileId + '/therapeutic-areas-of-interest',\n {therapeuticAreaOfInterests: this._utils.buildModelParams(therapeuticAreaOfInterests, this._langs.getLangIds())},\n this._currentUser.getAccessToken()\n )\n .then(async (data: any) => {\n therapeuticAreaOfInterests = TherapeuticAreaOfInterest.fromAPIList(data.therapeuticAreaOfInterests);\n\n await this.updateInvestorAlert(data, 'investorTherapeuticAreaAlert');\n\n this._storage.select(TherapeuticAreaOfInterest).where('investorProfileId').equals(investorProfileId).get()\n .then((toDelete: TherapeuticAreaOfInterest[]) => {\n Promise.all([\n this._storage.delete(toDelete),\n this._storage.save(therapeuticAreaOfInterests)\n ])\n .then(() => resolve())\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveDevelopmentPhaseOfInterests(investorProfileId: number, developmentPhaseIds: number[]): Promise {\n return new Promise((resolve, reject) => {\n let items: DevelopmentPhaseOfInterest[] = [];\n for (let i = 0; i < developmentPhaseIds.length; i++) {\n const item: DevelopmentPhaseOfInterest = new DevelopmentPhaseOfInterest();\n item.investorProfileId = investorProfileId;\n item.developmentPhaseId = developmentPhaseIds[i];\n items.push(item);\n }\n\n this._api.call(\n 'post',\n 'investors/' + investorProfileId + '/development-phases-of-interest',\n {developmentPhaseOfInterests: this._utils.buildModelParams(items, this._langs.getLangIds())},\n this._currentUser.getAccessToken()\n )\n .then(async (data: any) => {\n items = DevelopmentPhaseOfInterest.fromAPIList(data.developmentPhaseOfInterests);\n\n await this.updateInvestorAlert(data, 'investorDevelopmentPhaseAlert');\n\n this._storage.select(DevelopmentPhaseOfInterest).where('investorProfileId').equals(investorProfileId).get()\n .then((toDelete: DevelopmentPhaseOfInterest[]) => {\n Promise.all([\n this._storage.delete(toDelete),\n this._storage.save(items)\n ])\n .then(() => resolve())\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public validateProfile(investorProfile: InvestorProfile, stateId: number): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'investors/' + investorProfile.id + '/validate',\n {investorValidationStateId: stateId},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n investorProfile = InvestorProfile.fromAPI(data.investorProfile);\n this._storage.save([investorProfile])\n .then(() => resolve(investorProfile))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public registerAccount(firstName: string, lastName: string, email: string, password: string, companyId: number): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'investors/account',\n {\n firstName,\n lastName,\n email,\n password,\n companyId,\n }\n )\n // on stock pas localement les données parce qu'après cette opération, on serait censé lancé un sync ...\n .then((data: any) => resolve(User.fromAPI(data.user)))\n .catch((error: any) => reject(error));\n });\n }\n\n public saveCompany(company: Company): Promise {\n const data: any = this._utils.buildModelParams([company], this._langs.getLangIds())[0];\n data.item.isDisplayedOnHomepage = data.item.isDisplayedOnHomepage ? 1 : 0;\n data.item.isInterstedInLicenses = data.item.isInterstedInLicenses ? 1 : 0;\n data.item.isInterstedInPartnerships = data.item.isInterstedInPartnerships ? 1 : 0;\n data.item.isInvestingInPrivate = Number(data.item.isInvestingInPrivate);\n data.item.isInvestingInPublic = Number(data.item.isInvestingInPublic);\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'investors/company/' + (company.id ? company.id : 0),\n data,\n this._currentUser.getAccessToken()\n )\n .then((result) => {\n const newCompany: Company = Company.fromAPI(result.company);\n this._storage.save([newCompany])\n .then(() => resolve(newCompany))\n .catch(reject);\n })\n .catch(reject);\n });\n }\n\n public saveCompanyTherapeuticAreas(companyId: number, therapeuticAreaIds: number[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'investors/company/' + companyId + '/therapeutic-areas',\n {therapeuticAreaIds},\n this._currentUser.getAccessToken()\n )\n .then((result) => {\n const company_threapeuticAreas = Company_TherapeuticArea.fromAPIList(result.company_therapeuticAreas);\n this._storage.save(company_threapeuticAreas)\n .then(() => resolve(company_threapeuticAreas))\n .catch(reject);\n })\n .catch(reject);\n });\n }\n\n public async saveCompanyProjectTypes(companyId: number, projectTypesIds: number[]): Promise {\n try {\n const result = await this._api.call('post', 'investors/company/' + companyId + '/project-types',\n {projectTypesIds},\n this._currentUser.getAccessToken()\n );\n const companyProjectTypes = await Company_ProjectType.fromAPIList(result.company_projectTypes);\n return await this._storage.save(companyProjectTypes);\n } catch (e) {\n return e;\n }\n }\n\n public saveCompanyDevelopmentPhases(companyId: number, developmentPhaseIds: number[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'investors/company/' + companyId + '/development-phases',\n {developmentPhaseIds},\n this._currentUser.getAccessToken()\n )\n .then((result) => {\n const company_developmentPhases = Company_DevelopmentPhase.fromAPIList(result.company_developmentPhases);\n this._storage.save(company_developmentPhases)\n .then(() => resolve(company_developmentPhases))\n .catch(reject);\n })\n .catch(reject);\n });\n }\n\n public saveCompanyContacts(companyId: number, companyContacts: CompanyContact[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'investors/company/' + companyId + '/contacts',\n {companyContacts: this._utils.buildModelParams(companyContacts, this._langs.getLangIds())},\n this._currentUser.getAccessToken()\n )\n .then((result) => {\n this._storage.select(CompanyContact).where('companyId').equals(companyId).get()\n .then((toDelete) => {\n const toSave: CompanyContact[] = CompanyContact.fromAPIList(result.companyContacts);\n Promise.all([\n this._storage.delete(toDelete),\n this._storage.save(toSave)\n ])\n .then(() => resolve(toSave))\n .catch(reject);\n })\n .catch(reject);\n })\n .catch(reject);\n });\n }\n\n public deleteCompany(company: Company): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'delete',\n 'investors/company/' + company.id,\n {},\n this._currentUser.getAccessToken()\n )\n .then(() => {\n Promise.all([\n this._storage.select(Company_TherapeuticArea).where('companyId').equals(company.id).get(),\n this._storage.select(Company_DevelopmentPhase).where('companyId').equals(company.id).get(),\n this._storage.select(Company_ProjectType).where('companyId').equals(company.id).get()\n ])\n .then((relatedData: any[]) => {\n Promise.all([\n this._storage.delete([company]),\n this._storage.delete(relatedData[0]),\n this._storage.delete(relatedData[1]),\n this._storage.delete(relatedData[2])\n ])\n .then(() => resolve())\n .catch(reject);\n })\n .catch(reject);\n })\n .catch(reject);\n });\n }\n\n private async updateInvestorAlert(data: any, key: string) {\n if (data[key]) {\n const alert: Alert = Alert.fromAPI(data[key]);\n if (!alert.deleteDate) {\n return this._storage.save([alert]);\n } else {\n return this._storage.delete([alert]);\n }\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n\nexport interface CompanyCategoryGoupWithCategories {\n group: CompanyCategoryGroup;\n categories: CompanyCategory[];\n}\n\nexport interface InvestorDataRow {\n user: User;\n profile: InvestorProfile;\n company: Company;\n validationState: InvestorValidationState;\n companyCategory: CompanyCompanyCategory;\n therapeuticAreasOfInterest: TherapeuticArea[];\n developmentPhasesOfInterest: DevelopmentPhase[];\n therapeuticAreasIdsOfInterest?: number[];\n developmentPhasesIdsOfInterest?: number[];\n rights: InvestorRights;\n isLoading?: boolean;\n}\n\nexport interface CompanyDataRow {\n company: Company;\n companyCategory: CompanyCompanyCategory;\n companyContacts: CompanyContact[];\n therapeuticAreasOfInterest: TherapeuticArea[];\n developmentPhasesOfInterest: DevelopmentPhase[];\n projectTypesOfInterest: ProjectType[];\n therapeuticAreasIdsOfInterest?: number[];\n developmentPhasesIdsOfInterest?: number[];\n projectTypesIdsOfInterest?: number[];\n rights: CompanyRights;\n isLoading?: boolean;\n}\n\nexport interface InvestorFiltersState {\n companyCategoryIds: number[];\n therapeuticAreaIds: number[];\n developmentPhaseIds: number[];\n projectTypeIds?: number[];\n investmentRangeFrom: number;\n investmentRangeTo: number;\n isSeekingPartnerships: number;\n isNotSeekingPartnerships: number;\n isOutlicensing: number;\n isNotOutlicensing: number;\n isNotForProfit: number;\n isNoNotForProfit: number;\n pageIndex: number;\n}\n","

{{ 'New_account' | translate }}

\n\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ firstNameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n \n \n {{ 'Invalid_value' | translate }}\n {{ lastNameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ 'Email_unavailable' | translate }}\n {{ emailFormControl.value.length }}/{{ EMAIL_MAX_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n \n \n
\n
\n \n \n {{ 'Company_link_hint' | translate }}info@swissbiotech.org\n \n \n \n {{ company.name }}\n \n \n {{ 'Invalid_value' | translate }}\n \n
\n
\n \n {{ 'I_agree_with_terms' | translateCut: {index: 0} }}{{ 'I_agree_with_terms' | translateCut: {index: 1} }}{{ 'I_agree_with_terms' | translateCut: {index: 2} }}\n \n
\n
\n\n \n \n\n
\n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, Inject } from '@angular/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Router } from '@angular/router';\nimport { InvestorsProvider } from '../../providers/investors-provider';\nimport { SyncServiceProvider } from '../../../_common/providers/sync-service';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { Company, CompanyCategory, User } from '../../../_common/providers/models';\nimport { Utils } from '../../../_common/providers/utils';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'investors-register-dialog',\n providers: [],\n styleUrls: ['./register-dialog.scss'],\n templateUrl: './register-dialog.html'\n})\nexport class InvestorsRegisterDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly NAME_MAX_LENGTH: number = 100;\n public readonly EMAIL_MAX_LENGTH: number = 200;\n public readonly PASSWORD_MAX_LENGTH: number = 200;\n public readonly PASSWORD_MIN_LENGTH: number = 6;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n public showPassword: boolean = false;\n\n public firstNameFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.maxLength(this.NAME_MAX_LENGTH)\n ]);\n public lastNameFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.maxLength(this.NAME_MAX_LENGTH)\n ]);\n public emailUnavailableError: boolean = false;\n public emailFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.maxLength(this.EMAIL_MAX_LENGTH),\n Validators.email,\n Validators.pattern(this.utils.EMAIL_REGEX),\n (control: any) => {\n return this.emailUnavailableError ? {unavailable: {valid: false}} : null;\n }\n ]);\n public passwordFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.maxLength(this.PASSWORD_MAX_LENGTH),\n Validators.minLength(this.PASSWORD_MIN_LENGTH)\n ]);\n public password2FormControl: FormControl = new FormControl('', [\n Validators.required,\n (control: any) => {\n // TODO carrément supprimer ce field\n return null;\n /*\n return this.passwordFormControl &&\n this.password2FormControl &&\n this.passwordFormControl.value == this.password2FormControl.value ?\n null : { passwordsDontMatch: { valid: false } };\n */\n }\n ]);\n\n public companyFormControl: FormControl = new FormControl('', [\n Validators.required,\n ]);\n public terms: boolean = false;\n\n public companyCategories: CompanyCategory[] = [];\n public companies: Company[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public dialog: MatDialogRef,\n public utils: Utils,\n private _investorsProvider: InvestorsProvider,\n private _translater: TranslateService,\n private _sync: SyncServiceProvider,\n private _currentUser: CurrentUser,\n private _changeDetector: ChangeDetectorRef,\n private _storage: ModelsStorage,\n private _router: Router,\n private _toaster: MatSnackBar,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.loadStaticData().catch((error: any) => this.onError(error));\n this.passwordFormControl.valueChanges.subscribe(() => {\n this.password2FormControl.updateValueAndValidity();\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onRegisterClicked(): void {\n this.isLoading = true;\n this.register()\n .then((user: User) => {\n this.dialog.afterClosed().subscribe(() => this._router.navigate(['welcome']));\n this.dialog.close();\n this._toaster.open(this._translater.instant('Account_created'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n\n public onEmailChanged(): void {\n this.emailUnavailableError = false;\n this.emailFormControl.updateValueAndValidity();\n }\n\n public onCompanyChanged(): void {\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadStaticData(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(Company).orderBy('name').get()\n .then((data: Company[]) => {\n this.companies = data;\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private register(): Promise {\n return new Promise((resolve, reject) => {\n this._investorsProvider.registerAccount(\n this.firstNameFormControl.value,\n this.lastNameFormControl.value,\n this.emailFormControl.value,\n this.passwordFormControl.value,\n this.companyFormControl.value,\n )\n .then((user: User) => {\n this._currentUser.login(this.emailFormControl.value, this.passwordFormControl.value, false)\n .then(() => {\n this._sync.sync(true, 0)\n .then(() => {\n resolve(user);\n })\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n this.isLoading = false;\n\n if (error.status === 422 && error.error.errors['email']) {\n this.emailUnavailableError = true;\n this.emailFormControl.updateValueAndValidity();\n } else {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n }\n}\n","
{{ 'New_project' | translate }}
\n\n
\n \n \n {{ 'Field_required' | translate }}\n {{ nameFormControl.value?.length }} / {{ NAME_MAX_LENGTH }}\n \n
\n \n
\n\n \n \n\n
\n \n \n
\n","import { AfterViewInit, Component, Inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { Utils } from '../../../_common/providers/utils';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { AcademicInstitutionGroup, Project, ProjectVisibility } from '../../../_common/providers/models';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'projects-create-dialog',\n providers: [],\n styleUrls: ['./create-dialog.scss'],\n templateUrl: './create-dialog.html'\n})\nexport class ProjectsCreateDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly NAME_MAX_LENGTH: number = 200;\n public readonly EXCLUDED_INSTITUTION1_GROUP_IDS: number[] = [AcademicInstitutionGroup.ID_OTHER];\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public nameFormControl: FormControl = new FormControl('', [\n Validators.required\n ]);\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public dialog: MatDialogRef,\n private _utils: Utils,\n private _projectsProvider: ProjectsProvider,\n private _toaster: MatSnackBar,\n private _router: Router,\n private _translater: TranslateService,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onSaveClicked(): void {\n this.isLoading = true;\n this.save()\n .then((project: Project) => {\n this.isLoading = false;\n this._toaster.open(this._translater.instant('Project_saved'), '', {duration: 5000});\n this.dialog.close(project);\n this._router.navigate(['academic-ventures', project.id, 'edit']);\n })\n .catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private save(): Promise {\n return new Promise((resolve, reject) => {\n const project: Project = new Project();\n project.name = this.nameFormControl.value;\n project.projectVisibilityId = ProjectVisibility.ID_NONE;\n this._projectsProvider.saveProject(project)\n .then((project: Project) => {\n resolve(project);\n })\n .catch((error: any) => this.onError(error));\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Utils } from '../../_common/providers/utils';\nimport { Conf } from '../../_conf';\nimport { ApiBaseService } from '../../_common/providers/api-base-service';\nimport { ModelsStorage } from '../../_common/providers/models-storage';\nimport { LangsProvider } from '../../_common/providers/langs-provider';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { UserRights } from './user-rights';\nimport {\n AcademicInstitution,\n InvestorProfile,\n ProjectMembership,\n User,\n User_AcademicInstitution,\n User_UserLink,\n UserLink\n} from '../../_common/providers/models';\n\n@Injectable()\nexport class UsersProvider {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _utils: Utils,\n private _api: ApiBaseService,\n private _storage: ModelsStorage,\n private _langs: LangsProvider,\n private _currentUser: CurrentUser\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public getAdministrators(): Promise {\n return this._storage\n .select(User)\n .where('isAdmin').equals(1)\n .orderBy('firstName')\n .get();\n }\n\n public saveUser(user: User): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'users/' + user.id,\n user.toJson(),\n this._currentUser.getAccessToken()\n )\n .then((result) => {\n user = User.fromAPI(result.user);\n this._storage.save([user])\n .then(() => resolve(user))\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n });\n }\n\n public changePassword(user: User, newPassword: string, currentPassword: string): Promise {\n return this._api.call(\n 'post',\n 'users/' + user.id + '/change-password',\n {\n newPassword,\n currentPassword\n },\n this._currentUser.getAccessToken()\n );\n }\n\n public saveUserLinks(userId: number, user_userLinks: User_UserLink[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'users/' + userId + '/user-links',\n {user_userLinks: this._utils.buildModelParams(user_userLinks, this._langs.getLangIds())},\n this._currentUser.getAccessToken()\n )\n .then((result: any) => {\n user_userLinks = User_UserLink.fromAPIList(result.user_userLinks);\n this._storage.save(user_userLinks)\n .then(() => resolve(user_userLinks))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public getUserUserLinksData(userId: number, addMissing: boolean = true): Promise {\n /**\n * Retourne un objet formaté comme suit :\n * [{\n * userLink: UserLink,\n * user_userLink: User_UserLink\n * },]\n */\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(UserLink).get(),\n this._storage.select(User_UserLink)\n .where('userId').equals(userId)\n .get()\n ])\n .then((results: any[]) => {\n const data: any[] = [];\n for (let i = 0; i < results[0].length; i++) {\n let user_userLink: User_UserLink = this._utils.findIn(results[0][i].id, results[1], 'userLinkId');\n if (!user_userLink && addMissing) {\n user_userLink = new User_UserLink();\n user_userLink.userId = userId;\n user_userLink.userLinkId = results[0][i].id;\n }\n\n if (user_userLink || addMissing) {\n data.push({\n userLink: results[0][i],\n user_userLink\n });\n }\n }\n\n resolve(data);\n })\n .catch((error) => reject(error));\n });\n }\n\n public saveToStorage() {\n this._storage.save([User]);\n }\n\n public findAllMembershipsByProjectId(projectId): User[] {\n return this._storage\n .select(User)\n .where('id')\n .equals(ProjectMembership, 'userId')\n .and('projectId', ProjectMembership)\n .equals(projectId)\n .get()\n ;\n }\n\n public invite(user, projectId): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'projects/' + projectId + '/memberships/invite',\n {user},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n user = User.fromAPI(data.user);\n const membership = ProjectMembership.fromAPI(data.projectMembership);\n Promise.all([\n this._storage.save([user]),\n this._storage.save([membership])\n ])\n .then(() => resolve({user, membership, isNew: data.isNew}))\n .catch((error: any) => reject(error));\n })\n .catch((error) => reject(error));\n });\n }\n\n public checkEmailAvailability(email: string): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'get',\n 'users/email-availability',\n {email}\n )\n .then((result: any) => resolve(result.isAvailable))\n .catch((error: any) => reject(error));\n });\n }\n\n public deleteUser(user: User): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'delete',\n 'users/' + user.id,\n {},\n this._currentUser.getAccessToken()\n )\n .then(() => {\n // TODO c'est tout pourri comme architecture ... il aurait fallu faire en sorte que ce soit le investorProvider qui delete le user ...\n if (user.isInvestor) {\n this._storage.select(InvestorProfile).where('userId').equals(user.id).get()\n .then((profiles: InvestorProfile[]) => {\n Promise.all([\n this._storage.delete([user]),\n this._storage.delete(profiles)\n ])\n .then(() => resolve())\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n } else {\n this._storage.delete([user])\n .then(() => resolve())\n .catch((error: any) => reject(error));\n }\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveUserAcademicInstitutions(userId: number, user_academicInstitutions: User_AcademicInstitution[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'users/' + userId + '/academic-institutions',\n {user_academicInstitutions: this._utils.buildModelParams(user_academicInstitutions, this._langs.getLangIds())},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n this._storage.select(User_AcademicInstitution).where('userId').equals(userId).get()\n .then((currentUser_academicInstitutions: User_AcademicInstitution[]) => {\n user_academicInstitutions = User_AcademicInstitution.fromAPIList(data.user_academicInstitutions);\n Promise.all([\n this._storage.delete(currentUser_academicInstitutions),\n this._storage.save(user_academicInstitutions)\n ])\n .then((results: any[]) => resolve(user_academicInstitutions))\n .catch((error: any) => reject(error));\n })\n .catch(reject);\n })\n .catch(reject);\n });\n }\n\n public exportUsers(): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'get',\n 'users/export',\n {},\n {\n accessToken: this._currentUser.getAccessToken(),\n resultType: 'file'\n }\n )\n .then((file: any) => {\n resolve(file);\n })\n .catch((error) => reject(error));\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n\nexport interface UsersRow {\n user: User;\n rights: UserRights;\n isLoading?: boolean;\n}\n\nexport interface LocalExpertRow {\n user: User;\n institutionDetails: InstitutionLocalExpertRow[];\n expertInstitutions: AcademicInstitution[];\n rights: UserRights;\n isLoading?: boolean;\n}\n\nexport interface InstitutionLocalExpertRow {\n institution: AcademicInstitution;\n isLocalExpert: boolean;\n isDispatcher: boolean;\n}\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ProjectsCreateDialogComponent } from '../../projects/components/create-dialog/create-dialog';\nimport { MenuGroup, MenuItem } from '../../_common/components/side-menu/side-menu';\nimport { Utils } from '../../_common/providers/utils';\nimport { Conf } from '../../_conf';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { UsersProvider } from '../../users/providers/users-provider';\nimport { ModelsStorage } from '../../_common/providers/models-storage';\nimport { Company, InvestorProfile, InvestorValidationState, Project, ProjectMembership } from '../../_common/providers/models';\n\nimport * as FileSaver from 'file-saver';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Injectable()\nexport class AcventuresNavigationProvider {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _searchProjectsMenu: MenuItem = {\n icon: 'search',\n title: this._translater.instant('Search'),\n url: '/academic-ventures'\n };\n private _projectsPendingValidationMenu: MenuItem = {\n icon: 'assignment_late',\n title: this._translater.instant('Pending_validation'),\n url: '/academic-ventures/pending-validation'\n };\n private _projectsDraftsMenu: MenuItem = {\n icon: 'extension',\n title: this._translater.instant('Drafts'),\n url: '/academic-ventures/drafts'\n };\n private _searchInvestorsMenu: MenuItem = {\n icon: 'search',\n title: this._translater.instant('Search_investors'),\n url: '/investors'\n };\n private _investorsPendingValidationMenu: MenuItem = {\n icon: 'assignment_late',\n title: this._translater.instant('Investors_pending_validation'),\n url: '/investors/pending-validation'\n };\n private _guestUsersMenu: MenuItem = {\n icon: 'people',\n title: this._translater.instant('Guests'),\n url: '/users/guests'\n };\n private _localExpertUsersMenu: MenuItem = {\n icon: 'people',\n title: this._translater.instant('Local_experts'),\n url: '/users/local-experts'\n };\n private _adminUsersMenu: MenuItem = {\n icon: 'people',\n title: this._translater.instant('Administrators'),\n url: '/users/admins'\n };\n private _companiesMenu: MenuItem = {\n icon: 'business',\n title: this._translater.instant('Companies'),\n url: '/investors/companies'\n };\n private _exportUsersMenu: MenuItem = {\n icon: 'save_alt',\n title: this._translater.instant('Download_users_list'),\n onClicked: () => {\n this.onExportUsersMenuClicked();\n }\n };\n\n constructor(\n private _conf: Conf,\n private _translater: TranslateService,\n private _router: Router,\n private _usersProvider: UsersProvider,\n private _dialoger: MatDialog,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _currentUser: CurrentUser,\n private _storage: ModelsStorage\n ) {\n }\n\n private _menus: MenuGroup[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n public get menus() {\n return this._menus;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public updateMenus(): void {\n if (this._currentUser.isLoggedIn()) {\n if (this._currentUser.user.isAdmin) {\n this.updateAdminMenus();\n } else if (this._currentUser.user.isGuest || this._currentUser.user.isInvestor) {\n this.updateInvestorMenus();\n } else if (this._currentUser.user.isProjectHolder) {\n this.updateProjectHolderMenus();\n } else if (this._currentUser.user.isLocalExpert) {\n this.updateLocalExpertMenus();\n }\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n //\n private addExternalLinks(): void {\n if (!this._menus.some((item) => item.title === 'Swiss Biotech Association')) {\n this._menus.push({\n title: 'Swiss Biotech Association',\n menus: [{\n icon: 'analytics',\n title: 'swissbiotech.org',\n onClicked: () => {\n if (window) {\n window.open('https://swissbiotech.org');\n }\n }\n }]\n });\n }\n }\n\n private onExportUsersMenuClicked(): void {\n this._exportUsersMenu.isLoading = true;\n this._usersProvider.exportUsers()\n .then((file: any) => {\n const fileName: string = this._conf.platformName + ' - '\n + this._translater.instant('Users')\n + '.xlsx';\n FileSaver.saveAs(file, fileName);\n this._exportUsersMenu.isLoading = false;\n })\n .catch((error: any) => {\n this._exportUsersMenu.isLoading = false;\n console.log(error);\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n });\n }\n\n private updateAdminMenus(): void {\n const menus: MenuGroup[] = [\n {\n title: this._translater.instant('Academic_ventures'),\n menus: [\n this._searchProjectsMenu,\n this._projectsPendingValidationMenu,\n this._projectsDraftsMenu\n ]\n }, {\n title: this._translater.instant('Investors'),\n menus: [\n this._searchInvestorsMenu,\n this._investorsPendingValidationMenu,\n this._companiesMenu\n ]\n }, {\n title: this._translater.instant('Back_office'),\n menus: [\n this._guestUsersMenu,\n this._localExpertUsersMenu,\n this._adminUsersMenu,\n this._exportUsersMenu\n ]\n }\n ];\n\n this._menus = menus;\n this.addExternalLinks();\n }\n\n private updateLocalExpertMenus(): void {\n const menus: MenuGroup[] = [\n {\n title: this._translater.instant('Academic_ventures'),\n menus: [\n this._searchProjectsMenu,\n this._projectsPendingValidationMenu\n ]\n }\n ];\n\n this._menus = menus;\n this.addExternalLinks();\n }\n\n private async updateInvestorMenus() {\n const menus: MenuGroup[] = [];\n\n try {\n const [profile, company] = await Promise.all([\n this._storage.select(InvestorProfile)\n .where('userId').equals(this._currentUser.user.id).get(1),\n this._storage.select(Company).where('id')\n .equals(InvestorProfile, 'companyId')\n .and('userId', InvestorProfile).equals(this._currentUser.user.id).get(1)\n ]);\n\n if (this._currentUser.user.isGuest\n || profile.investorValidationStateId === InvestorValidationState.ID_ACCEPTED\n || profile.investorValidationStateId === InvestorValidationState.ID_PENDING) {\n menus.push({\n title: this._translater.instant('Academic_ventures'),\n menus: [\n {\n icon: 'dashboard',\n title: 'Dashboard',\n url: 'investors/dashboard',\n chipColor: 'primary'\n },\n {\n icon: 'search',\n title: 'Search',\n url: '/academic-ventures'\n },\n {\n icon: 'star',\n title: 'Favorites',\n url: '/favorites'\n },\n {\n icon: 'notifications',\n title: 'Alerts',\n url: '/alerts'\n }\n ]\n });\n }\n\n // SB-787 Allow unvalidated investors to update company\n if (!company.isCompleted) {\n // related company\n menus.push({\n title: company.name,\n menus: [\n {\n icon: 'edit',\n title: 'Company_information',\n url: '/investors/companies/' + company.id + '/edit'\n },\n {\n icon: 'slideshow',\n title: 'View_company',\n url: '/investors/companies/' + company.id\n }\n ]\n });\n }\n\n this._menus = menus;\n this.addExternalLinks();\n\n } catch (e) {\n this.onError(e);\n }\n }\n\n private updateProjectHolderMenus(): void {\n const menus: MenuGroup[] = [{\n title: this._translater.instant('Investors'),\n menus: [\n this._companiesMenu\n ]\n }];\n this._storage.select(Project)\n .where('id').equals(ProjectMembership, 'projectId')\n .and('userId', ProjectMembership).equals(this._currentUser.user.id)\n .orderBy('name')\n .get()\n .then((projects: Project[]) => {\n for (let i = 0; i < projects.length; i++) {\n menus.push({\n title: projects[i].name,\n menus: [\n {\n icon: 'dashboard',\n title: 'Dashboard',\n url: '/academic-ventures/' + projects[i].id + '/dashboard',\n // chip: 'Beta',\n chipColor: 'primary'\n },\n {\n icon: 'edit',\n title: 'Academic_venture_information',\n url: '/academic-ventures/' + projects[i].id + '/edit'\n },\n {\n icon: 'people',\n title: 'Users',\n url: '/academic-ventures/' + projects[i].id + '/memberships'\n },\n {\n icon: 'slideshow',\n title: 'Preview',\n url: '/academic-ventures/' + projects[i].id + '/edit/preview'\n }\n ]\n });\n }\n menus.push({\n title: '',\n menus: [{\n icon: 'add_circle_outline',\n title: 'New_project',\n onClicked: () => {\n this._dialoger.open(ProjectsCreateDialogComponent, {});\n }\n }]\n });\n this.addExternalLinks();\n })\n .catch((error: any) => this.onError(error));\n\n this._menus = menus;\n }\n\n private onError(error: any): void {\n console.log(error);\n this._menus = [];\n }\n}\n\nexport interface GetMenuExtra {\n}\n","import { animate, state, style, transition, trigger } from '@angular/animations';\n\nexport const translateFadeBeforeAfterAnimation = trigger('translateFadeBeforeAfter', [\n state('before', style({transform: 'translateX(-350px)', opacity: '0', height: '0px'})),\n state('active', style({transform: 'translateX(0)', opacity: '1', height: 'auto'})),\n state('after', style({transform: 'translateX(350px)', opacity: '0', height: '0px'})),\n transition('before => active', animate('200ms linear')),\n transition('active => before', animate('200ms linear')),\n transition('active => after', animate('200ms linear')),\n transition('after => active', animate('200ms linear'))\n]);\n","\n
\n \n {{ title }}\n
\n
\n \n \n
\n
\n
{{ 'Connection' | translate }}
\n
{{ 'Use_your_x_account' | translate:{platformName: conf.platformName} }}
\n
{{ 'Registration' | translate }}
\n
{{ 'Create_your_x_account' | translate:{platformName: conf.platformName} }}
\n
\n
\n \n \n mail_outline  \n {{ 'Email_invalid' | translate }}\n \n
\n
\n \n \n \n \n \n
\n
\n \n \n
\n
\n
{{ 'Welcome' | translate }}
\n
\n arrow_back\n {{ emailFormControl.value }}
\n
\n
\n \n \n lock_outline  \n {{ 'Password_required' | translate }}\n {{ 'Password_wrong' | translate }}\n \n \n
\n {{ 'Remember_me' | translate }}\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
:-(
\n
{{ 'You_are_not_authorized_here' | translate }}
\n
\n
\n \n
\n
\n \n \n
\n
\n
{{ 'Recover_password' | translate }}
\n {{ 'Instructions_to_renew_password_sent' | translate:{email: emailFormControl.value} }}
\n
\n
\n \n
\n
\n \n \n
\n
\n
{{ 'Create_password' | translate }}
\n
{{ emailFormControl.value }}
\n
\n
\n \n \n {{ 'New_password_hint' | translate }}\n {{ 'Password_required' | translate }}\n {{ 'Password_too_short' | translate:{length: PASSWORD_MIN_LENGTH} }}\n \n \n \n
\n
\n \n
\n
\n \n \n
\n
\n
{{ 'Registration' | translate }}
\n
{{ emailFormControl.value }}
\n
\n
\n
\n \n \n perm_identity  \n {{ 'First_name_required' | translate }}\n \n \n \n {{ 'Last_name_required' | translate }}\n \n
\n \n \n lock_outline  \n {{ 'New_password_hint' | translate }}\n {{ 'Password_required' | translate }}\n {{ 'Password_too_short' | translate:{length: PASSWORD_MIN_LENGTH} }}\n \n
\n {{ 'Remember_me' | translate }}\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, Inject, ViewChild } from '@angular/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../../_conf';\nimport { Utils } from '../../../providers/utils';\nimport { CurrentUser } from '../../../providers/current-user';\nimport { LangsProvider } from '../../../providers/langs-provider';\nimport { ModelsStorage } from '../../../providers/models-storage';\nimport { SyncServiceProvider } from '../../../providers/sync-service';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'auth-dialog',\n providers: [],\n styleUrls: ['./auth-dialog.scss'],\n templateUrl: './auth-dialog.html'/*,\n animations: [translateFadeBeforeAfterAnimation]*/\n})\nexport class AuthDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public FLOW_DEFAULT: string = 'default';\n public FLOW_LOGIN: string = 'login';\n public FLOW_REGISTER: string = 'register';\n public FLOW_UNAUTHORIZED: string = 'unauthorized';\n public FLOW_RESET_PASSWORD: string = 'resetPassword';\n public PASSWORD_MIN_LENGTH: number = 6;\n\n public SLIDE_TRANSITION_DURATION: number = 300; // ms\n\n public image: string = this.conf.assetsUrl + 'img/sbv-logo.svg';\n public title: string = '';\n public nextUrl: string = null;\n public defaultNextUrl: string = null;\n public isRegistrationDisabled: boolean = false;\n\n @ViewChild('emailControl', {static: false}) public emailControl: ElementRef;\n public emailFormControl: FormControl = new FormControl('', [\n Validators.email\n ]);\n\n @ViewChild('passwordControl', {static: false}) public passwordControl: ElementRef;\n public passwordWrongError: boolean = false;\n public passwordFormControl: FormControl = new FormControl('', [\n Validators.required,\n // doc : https://blog.thoughtram.io/angular/2016/03/14/custom-validators-in-angular-2.html#building-a-custom-validator\n (control: any) => {\n return !this.passwordWrongError ? null : {passwordWrong: {valid: false}};\n }\n ]);\n @ViewChild('resetPasswordControl', {static: false}) public resetPasswordControl: ElementRef;\n public resetPasswordFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.minLength(this.PASSWORD_MIN_LENGTH)\n ]);\n\n @ViewChild('resetPassword2Control', {static: false}) public resetPassword2Control: ElementRef;\n public resetPassword2FormControl: FormControl = new FormControl('', [\n // Validators.required,\n (control: any) => {\n return null;\n /*\n return this.resetPasswordFormControl &&\n this.resetPassword2FormControl &&\n this.resetPasswordFormControl.value == this.resetPassword2FormControl.value ?\n null : { passwordsDontMatch: { valid: false } };\n */\n }\n ]);\n\n @ViewChild('registerPasswordControl', {static: false}) public registerPasswordControl: ElementRef;\n public registerPasswordFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.minLength(this.PASSWORD_MIN_LENGTH)\n ]);\n @ViewChild('registerFirstNameControl', {static: false}) public registerFirstNameControl: ElementRef;\n public registerFirstNameFormControl: FormControl = new FormControl('', [\n Validators.required\n ]);\n @ViewChild('registerLastNameControl', {static: false}) public registerLastNameControl: ElementRef;\n public registerLastNameFormControl: FormControl = new FormControl('', [\n Validators.required\n ]);\n\n @ViewChild('applicationMessageControl', {static: false}) public applicationMessageControl: ElementRef;\n public applicationMessageFormControl: FormControl = new FormControl('', [\n Validators.required\n ]);\n\n public isLoading: boolean = true;\n public isNewUser: boolean = false;\n public isIHaveAnAccountText: boolean = true;\n public emailStepState: string = 'before';\n public passwordStepState: string = 'after';\n public unauthorizedStepState: string = 'after';\n public forgotPasswordState: string = 'after';\n public resetPasswordState: string = 'after';\n public registerStepState: string = 'after';\n\n public rememberMe: boolean = true;\n public resetPasswordToken: string = null;\n\n public showLoginPassword: boolean = false;\n public showResetPasswordPassword: boolean = false;\n\n @ViewChild('dialogContainer', {static: false}) public dialogContainer: any;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public currentUser: CurrentUser,\n private _storage: ModelsStorage,\n private _langs: LangsProvider,\n private _sync: SyncServiceProvider,\n private _router: Router,\n private _route: ActivatedRoute,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _changeDetector: ChangeDetectorRef,\n private _dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n if (_data.title) {\n this.title = _data.title;\n }\n if (_data.image) {\n this.image = _data.image;\n }\n if (_data.nextUrl) {\n this.nextUrl = _data.nextUrl;\n }\n if (_data.defaultNextUrl) {\n this.defaultNextUrl = _data.defaultNextUrl;\n }\n if (_data.isRegistrationDisabled) {\n this.isRegistrationDisabled = true;\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.retrieveParams();\n\n if (this.currentUser.isLoggedIn()) {\n this.startLoggedFlow()\n .then(() => {\n this.isLoading = false;\n this._changeDetector.detectChanges();\n })\n .catch((error) => this.onError(error));\n } else {\n if (this.resetPasswordToken) {\n this.checkResetPassword()\n .then((result: any) => {\n this.isLoading = false;\n if (result) {\n this.selectFlow(this.FLOW_RESET_PASSWORD);\n } else {\n this.selectFlow(this.FLOW_DEFAULT);\n }\n })\n .catch((error: any) => this.onError(error));\n } else {\n this.isLoading = false;\n this.selectFlow(this.FLOW_DEFAULT);\n }\n this._changeDetector.detectChanges();\n }\n\n this.resetPasswordFormControl.valueChanges.subscribe(() => {\n this.resetPassword2FormControl.updateValueAndValidity();\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onCheckEmailClicked(event: any): void {\n // on blur systématiquement tous les events issu d'un textbox\n // car si l'utilisateur déclenche cet event via la toucher enter\n // le textbox reste focus même s'il est plus affiché\n // et l'utilisateur risque de taper au mauvais endroit ...\n event.target.blur();\n\n if (this.isLoading || this.emailFormControl.hasError('required') || this.emailFormControl.hasError('email')) {\n return;\n }\n\n this.isLoading = true;\n this.checkEmail()\n .then((flow: string) => {\n this.selectFlow(flow);\n this.isLoading = false;\n })\n .catch((error) => this.onError(error));\n }\n\n public onCheckPasswordClicked(event: any): void {\n // on blur systématiquement tous les events issu d'un textbox\n // car si l'utilisateur déclenche cet event via la toucher enter\n // le textbox reste focus même s'il est plus affiché\n // et l'utilisateur risque de taper au mauvais endroit ...\n event.target.blur();\n\n if (this.isLoading\n || this.passwordFormControl.hasError('required')\n || this.passwordFormControl.hasError('passwordWrong')) {\n return;\n }\n\n this.isLoading = true;\n this.checkPassword()\n .then((result) => {\n this._translater.use(this._langs.getBestLangCode());\n this.startLoggedFlow()\n .then(() => {\n this.isLoading = false;\n this._changeDetector.detectChanges();\n })\n .catch((error) => this.onError(error));\n })\n .catch((error) => {\n if (error.code === 1) {\n this.isLoading = false;\n this.passwordWrongError = true;\n this.passwordFormControl.updateValueAndValidity();\n } else {\n this.onError(error);\n }\n });\n }\n\n public onPasswordKeyPressed(): void {\n this.passwordWrongError = false;\n }\n\n public onNotYouClicked(): void {\n this.passwordFormControl.setValue('');\n this.selectFlow(this.FLOW_DEFAULT);\n }\n\n public onForgotPasswordClicked(): void {\n if (this.isLoading) {\n return;\n }\n\n this.isLoading = true;\n this.sendPasswordResetEmail()\n .then((result) => {\n this.passwordStepState = 'before';\n this.forgotPasswordState = 'active';\n this.isLoading = false;\n })\n .catch((error) => this.onError(error));\n }\n\n public onResetPasswordClicked(event: any): void {\n // on blur systématiquement tous les events issu d'un textbox\n // car si l'utilisateur déclenche cet event via la toucher enter\n // le textbox reste focus même s'il est plus affiché\n // et l'utilisateur risque de taper au mauvais endroit ...\n event.target.blur();\n\n if (this.isLoading || this.resetPasswordFormControl.invalid || this.resetPassword2FormControl.invalid) {\n return;\n }\n\n this.isLoading = true;\n this.resetPassword()\n .then(() => {\n // on simule un login droit derrière avec les nouveaux creditentials\n // pour connecter le type et le rediriger là où il devrait\n this.rememberMe = false;\n this.passwordFormControl.setValue(this.resetPasswordFormControl.value);\n this.checkPassword()\n .then(() => {\n this.isLoading = false;\n this.redirectUser();\n })\n .catch((error) => this.onError(error));\n })\n .catch((error) => this.onError(error));\n }\n\n public onCheckRegisterClicked(event: any): void {\n // on blur systématiquement tous les events issu d'un textbox\n // car si l'utilisateur déclenche cet event via la toucher enter\n // le textbox reste focus même s'il est plus affiché\n // et l'utilisateur risque de taper au mauvais endroit ...\n event.target.blur();\n\n if (this.isLoading\n || this.registerPasswordFormControl.hasError('required')\n || this.registerPasswordFormControl.hasError('minlength')\n || this.registerFirstNameFormControl.hasError('required')\n || this.registerLastNameFormControl.hasError('required')) {\n return;\n }\n\n this.isLoading = true;\n this.register()\n .then(() => {\n this.startLoggedFlow()\n .then(() => {\n this.isLoading = false;\n this._changeDetector.detectChanges();\n })\n .catch((error) => this.onError(error));\n })\n .catch((error) => this.onError(error));\n }\n\n public onUseAccountClicked(): void {\n this.isIHaveAnAccountText = true;\n }\n\n public onNoAccountClicked(): void {\n this.isIHaveAnAccountText = false;\n }\n\n public onCompleteProfileClicked(): void {\n this._dialogRef.afterClosed().subscribe(() => this._router.navigate(['users', this.currentUser.user.id, 'edit']));\n this._dialogRef.close();\n }\n\n public onBackHomeClicked(): void {\n // pour une sombre raison, le routing standard change l'url dans le navigateur\n // mais n'initie pas de rechargement de la page en fonction de l'url ...\n // du coup recharge tout de façon abrupte ...\n // this._router.navigate(['/']);\n window.location.href = '';\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private retrieveParams(): void {\n this._route.queryParamMap.subscribe((params) => {\n if (params.has('authEmail') && params.has('authToken')) {\n this.emailFormControl.setValue(params.get('authEmail'));\n this.resetPasswordToken = params.get('authToken');\n } else if (params.has('nextUrl')) {\n this.nextUrl = params.get('nextUrl');\n }\n // pour éviter l'erreur décrite ici : https://github.com/angular/angular/issues/6005\n // on utilise ce workaround : https://stackoverflow.com/questions/34827334/triggering-angular2-change-detection-manually\n this._changeDetector.detectChanges();\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n console.log(error);\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n\n private checkEmail(): Promise {\n return new Promise((resolve, reject) => {\n this.currentUser.checkEmail(this.emailFormControl.value)\n .then((result) => {\n resolve(result.flow);\n })\n .catch((error) => reject(error));\n });\n }\n\n private checkResetPassword(): Promise {\n return new Promise((resolve, reject) => {\n this.currentUser.checkResetPassword(this.emailFormControl.value)\n .then((result: boolean) => {\n resolve(result);\n })\n .catch((error) => reject(error));\n });\n }\n\n private checkPassword(): Promise {\n return new Promise((resolve, reject) => {\n this.currentUser.login(this.emailFormControl.value, this.passwordFormControl.value, this.rememberMe)\n .then(() => {\n this._sync.sync(true, 0)\n .then(() => resolve())\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n });\n }\n\n private sendPasswordResetEmail(): Promise {\n const resetPasswordUrl: string = window.location.origin + this.conf.apiRootUrl + 'auth';\n\n return this.currentUser.sendPasswordResetEmail(this.emailFormControl.value, resetPasswordUrl);\n }\n\n private resetPassword(): Promise {\n return this.currentUser.resetPassword(this.emailFormControl.value, this.resetPasswordFormControl.value, this.resetPasswordToken);\n }\n\n private register(): Promise {\n return new Promise((resolve, reject) => {\n this.currentUser.register(\n this.emailFormControl.value,\n this.registerPasswordFormControl.value,\n this.rememberMe,\n this._langs.getBestLangId(),\n this.registerFirstNameFormControl.value,\n this.registerLastNameFormControl.value\n )\n .then(() => {\n this._sync.sync()\n .then(() => resolve())\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n });\n }\n\n private startLoggedFlow(): Promise {\n return new Promise((resolve, reject) => {\n resolve();\n this.redirectUser();\n });\n }\n\n private selectFlow(flow: string): void {\n if (flow === this.FLOW_DEFAULT) {\n this.emailStepState = 'active';\n this.passwordStepState = 'after';\n this.forgotPasswordState = 'after';\n this.unauthorizedStepState = 'after';\n this.resetPasswordState = 'after';\n this.registerStepState = 'after';\n setTimeout(() => this.emailControl.nativeElement.focus(), this.SLIDE_TRANSITION_DURATION);\n } else if (flow === this.FLOW_LOGIN) {\n this.emailStepState = 'before';\n this.passwordStepState = 'active';\n setTimeout(() => this.passwordControl.nativeElement.focus(), this.SLIDE_TRANSITION_DURATION);\n } else if (flow === this.FLOW_RESET_PASSWORD) {\n this.emailStepState = 'before';\n this.resetPasswordState = 'active';\n setTimeout(() => this.resetPasswordControl.nativeElement.focus(), this.SLIDE_TRANSITION_DURATION);\n } else if (flow === this.FLOW_UNAUTHORIZED) {\n this.emailStepState = 'before';\n this.passwordStepState = 'before';\n this.unauthorizedStepState = 'active';\n } else if (flow === this.FLOW_REGISTER) {\n this.isNewUser = true;\n this.emailStepState = 'before';\n this.registerStepState = 'active';\n setTimeout(() => this.registerFirstNameControl.nativeElement.focus(), this.SLIDE_TRANSITION_DURATION);\n } else {\n this.onError({error: 'Unknown auth flow[' + flow + ']'});\n }\n\n // hack pour corriger un problème d'affichage lié à l'animation d'ouverture de la popup + les animations de slide\n setInterval(() => {\n this.dialogContainer.nativeElement.scrollTop = 0;\n }, 1);\n }\n\n private redirectUser(): void {\n this._dialogRef.afterClosed().subscribe(() => {\n if (this.nextUrl) {\n this._router.navigateByUrl(this.nextUrl);\n } else if (this.defaultNextUrl) {\n this._router.navigateByUrl(this.defaultNextUrl);\n } else {\n this._router.navigate(['']);\n }\n });\n this._dialogRef.close();\n }\n}\n","import { AfterViewInit, ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { Utils } from '../../providers/utils';\nimport { CurrentUser } from '../../providers/current-user';\nimport { LangsProvider } from '../../providers/langs-provider';\nimport { ModelsStorage } from '../../providers/models-storage';\nimport { SyncServiceProvider } from '../../providers/sync-service';\nimport { translateFadeBeforeAfterAnimation } from '../../animations/translate-fade-before-after';\nimport { AuthDialogComponent } from './auth-dialog/auth-dialog';\nimport { MatDialog } from '@angular/material/dialog';\n\n@Component({\n selector: 'auth',\n providers: [],\n styleUrls: ['./auth.scss'],\n templateUrl: './auth.html',\n animations: [translateFadeBeforeAfterAnimation]\n})\nexport class AuthComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public image: string = '';\n @Input() public title: string = '';\n @Input() public nextUrl: string = null;\n @Input() public defaultNextUrl: string = null;\n @Input() public detectPasswordResets: boolean = false;\n @Input() public isRegistrationDisabled: boolean = false;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public currentUser: CurrentUser,\n private _storage: ModelsStorage,\n private _langs: LangsProvider,\n private _sync: SyncServiceProvider,\n private _router: Router,\n private _route: ActivatedRoute,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this._route.queryParamMap.subscribe((params) => {\n if (params.has('promptLogin')) {\n // on met ça dans un timeout pour éviter un bug d'initialisation de la popup\n // (bug lié à la librairie material donc ...)\n setTimeout(() => {\n this.onClicked();\n }, 1);\n } else if (this.detectPasswordResets) {\n // c'est que l'utilisateur a cliqué sur un lien de renouvellement du mot de passe\n // on affiche donc le dialog qui va permettre de mettre à jour son mot de passe\n if ((params.has('authEmail') && params.has('authToken'))) {\n // on met ça dans un timeout pour éviter un bug d'initialisation de la popup\n // (bug lié à la librairie material donc ...)\n setTimeout(() => {\n this.onClicked();\n }, 1);\n }\n }\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onClicked(): void {\n const dialog: any = this._dialoger.open(AuthDialogComponent, {\n data: {\n title: this.title,\n image: this.image,\n nextUrl: this.nextUrl,\n defaultNextUrl: this.defaultNextUrl ? this.defaultNextUrl : '/?' + (new Date()).getTime(), // vilain hack pour forcer un refresh de la homepage (il se passe plein de trucs quand on l'init...)\n isRegistrationDisabled: this.isRegistrationDisabled\n }\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","
\n \n
","
\n \n \n account_circle\n \n \n \n \n \n
\n
\n \n \n \n
\n","import { AfterViewInit, Component, Input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { SyncServiceProvider } from '../../../_common/providers/sync-service';\n\n@Component({\n selector: 'users-user-menu',\n providers: [],\n styleUrls: ['./user-menu.scss'],\n templateUrl: './user-menu.html'\n})\nexport class UsersUserMenuComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public loginText: string = 'Access_platform';\n @Input() public loginNextUrl: string = null;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n private _sync: SyncServiceProvider,\n private _translater: TranslateService,\n private _router: Router\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onLogoutClicked(): void {\n this._router.navigate(['logout']);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","
\n
1 || hasScrolled\"\n class=\"bar\">\n
\n \n
\n
\n
\n \n
\n {{ pageTitle }}\n
\n
\n {{ pageSubtitle }}\n
\n
\n
\n \n
\n
\n
\n \n \n
\n
\n","import { AfterViewInit, ChangeDetectorRef, Component, HostListener, Input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Conf } from '../../../_conf';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../providers/utils';\nimport { ModelsStorage } from '../../providers/models-storage';\nimport { MenuItem } from '../side-menu/side-menu';\nimport { CurrentUser } from '../../providers/current-user';\n\n@Component({\n selector: 'header',\n providers: [],\n styleUrls: ['./header.scss'],\n templateUrl: './header.html'\n})\nexport class HeaderComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public backMenu: MenuItem = null;\n @Input() public pageTitle: string = null;\n @Input() public pageSubtitle: string = null;\n @Input() public loginNextUrl: string = null;\n @Input() public loginText: string = 'Connection';\n @Input() public hasSideMenu: boolean = true;\n @Input() public headerMarginBottom: number = 32;\n @Input() public logoAlwaysDisplayed: boolean = false;\n\n public hasScrolled: boolean = false;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public utils: Utils,\n private _translater: TranslateService,\n private _changeDetector: ChangeDetectorRef,\n private _router: Router,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n @HostListener('window:scroll', []) onWindowsScrolled(evend: any): void {\n this.hasScrolled = document.getElementsByTagName('html')[0].scrollTop > this.headerMarginBottom;\n }\n\n public onBackClicked(): void {\n if (this.backMenu.onClicked) {\n this.backMenu.onClicked();\n return;\n }\n\n this._router.navigateByUrl(this.backMenu.url);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","
{{ 'Investors' | translate:{platformName: conf.platformName} }}*
\n
\n \n 0\"\n [matTooltip]=\"companies[currentIndex].name\"\n [src]=\"conf.storageRootUrl + companies[aIndex].logo\">\n \n \n
\n
*{{ 'Company_logo_title_asterisk' | translate }}
\n","import { AfterViewInit, ChangeDetectorRef, Component, Input, OnDestroy } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog } from '@angular/material/dialog';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { Company } from '../../../_common/providers/models';\n\n@Component({\n selector: 'acventures-common-company-logos',\n providers: [],\n styleUrls: ['./company-logos.scss'],\n templateUrl: './company-logos.html'\n})\nexport class AcventuresCommonCompanyLogosComponent implements AfterViewInit, OnDestroy {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public companies: Company[] = [];\n public currentIndex: number = 0;\n public aIndex: number = 0;\n public bIndex: number = 0;\n public nextSlideTimestamp: number = 0;\n public sliderTimer: number = 2000;\n\n private intervalId = null;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _router: Router,\n private _route: ActivatedRoute,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef,\n private _storage: ModelsStorage,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.startSlider();\n }\n\n public ngOnDestroy(): void {\n this.stopSlider();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onNextClicked(stopSlider: boolean = true): void {\n if (this.currentIndex === this.companies.length - 1) {\n this.currentIndex = 0;\n } else {\n this.currentIndex++;\n }\n this.updateABIndexes();\n\n if (stopSlider) {\n this.stopSlider();\n }\n }\n\n public onPreviousClicked(stopSlider: boolean = true): void {\n if (this.currentIndex === 0) {\n this.currentIndex = this.companies.length - 1;\n } else {\n this.currentIndex--;\n }\n this.updateABIndexes();\n\n if (stopSlider) {\n this.stopSlider();\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private startSlider(): void {\n this.intervalId = setInterval(() => {\n this.onNextClicked(false);\n }, this.sliderTimer);\n }\n\n private stopSlider(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n\n private updateABIndexes(): void {\n if (this.currentIndex % 2 === 0) {\n this.aIndex = this.currentIndex;\n } else {\n this.bIndex = this.currentIndex;\n }\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","
\n \n \n
\n {{ 'home_section1_text1' | translate }}\n
\n \n \n
\n \n
\n
\n","import { AfterViewInit, ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { Company, InvestorProfile, InvestorValidationState, ProjectMembership } from '../../../_common/providers/models';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { Conf } from '../../../_conf';\nimport { MatDialog } from '@angular/material/dialog';\n\n@Component({\n selector: 'acventures-common-home-welcome',\n providers: [],\n styleUrls: ['./home-welcome.scss'],\n templateUrl: './home-welcome.html'\n})\nexport class AcventuresCommonHomeComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public tryRedirection: boolean = true;\n public companies: Company[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _router: Router,\n private _route: ActivatedRoute,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n if (this.tryRedirection && this.currentUser.isLoggedIn()) {\n this.tryRedirect();\n } else {\n this.loadData().catch((error) => this.onError(error));\n }\n\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(Company).where('isDisplayedOnHomepage').equals(1).get()\n .then((companies: Company[]) => {\n this.companies = companies.filter((company) => company.logo);\n })\n .catch(reject);\n });\n }\n\n private tryRedirect(): void {\n if (this.currentUser.user.isProjectHolder) {\n this._storage.select(ProjectMembership).where('userId').equals(this.currentUser.user.id).get(1)\n .then((membership: ProjectMembership) => {\n if (membership) {\n this._router.navigate(['academic-ventures', membership.projectId, 'dashboard']);\n } else {\n this._router.navigate(['academic-ventures', 'welcome']);\n }\n })\n .catch((error: any) => this.onError(error));\n } else if (this.currentUser.user.isInvestor) {\n this._storage.select(InvestorProfile).where('userId').equals(this.currentUser.user.id).get(1)\n .then((investorProfile: InvestorProfile) => {\n if (investorProfile.investorValidationStateId === InvestorValidationState.ID_ACCEPTED) {\n this._router.navigate(['investors', 'dashboard']);\n } else {\n this._router.navigate(['welcome']);\n }\n })\n .catch((error: any) => this.onError(error));\n } else if (this.currentUser.user.isGuest) {\n this._router.navigate(['academic-ventures']);\n } else if (this.currentUser.user.isAdmin) {\n this._router.navigate(['academic-ventures']);\n } else if (this.currentUser.user.isLocalExpert) {\n this._router.navigate(['academic-ventures']);\n }\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","import { AfterViewInit, ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog } from '@angular/material/dialog';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\n\n@Component({\n selector: 'acventures-common-home-showroom',\n providers: [],\n styleUrls: ['./home-showroom.scss'],\n templateUrl: './home-showroom.html'\n})\nexport class AcventuresCommonHomeShowroomComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public orientation: string = 'left';\n @Input() public image: string = null;\n @Input() public icon: string = null;\n @Input() public title: string = null;\n @Input() public text: string = null;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _router: Router,\n private _route: ActivatedRoute,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n\nexport interface ShowRoomData {\n orientation: string;\n image: string;\n icon: string;\n title: string;\n text: string;\n}\n","
\n
\n \n
\n
\n {{ icon }}\n
\n
{{ title }}
\n
{{ text }}
\n
\n
\n
\n","\n \n \n \n \n
\n
{{ (currentIndex + 1) + ' / ' + showRoomsData.length }}
\n \n \n
\n
\n\n \n\n","import { AfterViewInit, Component, Inject } from '@angular/core';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { ShowRoomData } from '../home-showroom/home-showroom';\n\n@Component({\n selector: 'acventures-common-home-showroom-dialog',\n providers: [],\n styleUrls: ['./home-showroom-dialog.scss'],\n templateUrl: './home-showroom-dialog.html'\n})\nexport class AcventuresCommonHomeShowroomDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public currentIndex: number = 0;\n public showRoomsData: ShowRoomData[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n private _translater: TranslateService,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n this.showRoomsData = _data.showRoomsData;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onNextClicked(): void {\n this.currentIndex++;\n }\n\n public onPreviousClicked(): void {\n this.currentIndex--;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","
\n
\n
\n
\n
\n
\n
{{ 'home_section2_text1' | translate }}
\n
{{ 'home_section2_text2' | translate }}
\n
\n

{{ 'home_section2_text3' | translate }}

\n

{{ 'home_section2_text4' | translate }}

\n
\n \n \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport {\n AcventuresCommonHomeShowroomDialogComponent\n} from '../../../_acventures-common/components/home-showroom-dialog/home-showroom-dialog';\nimport { ShowRoomData } from '../../../_acventures-common/components/home-showroom/home-showroom';\nimport { MatDialog } from '@angular/material/dialog';\n\n@Component({\n selector: 'investors-home-introduction',\n providers: [],\n styleUrls: ['./home-introduction.scss'],\n templateUrl: './home-introduction.html'\n})\nexport class InvestorsHomeIntroductionComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public showRoomMode: 'normal' | 'dialog' = 'normal';\n public showRoomsData: ShowRoomData[] = [\n {\n orientation: 'right',\n icon: 'search',\n image: this.conf.assetsUrl + 'img/home/section-2-showroom-1.jpg',\n title: 'home_section2_showroom1_title',\n text: 'home_section2_showroom1_text'\n },\n {\n orientation: 'left',\n icon: 'notifications_none',\n image: this.conf.assetsUrl + 'img/home/section-2-showroom-2.jpg',\n title: 'home_section2_showroom2_title',\n text: 'home_section2_showroom2_text'\n },\n {\n orientation: 'right',\n icon: 'star_outline',\n image: this.conf.assetsUrl + 'img/home/section-2-showroom-3.jpg',\n title: 'home_section2_showroom3_title',\n text: 'home_section2_showroom3_text'\n }\n ];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _router: Router,\n private _route: ActivatedRoute,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onMoreInformationClicked(): void {\n this._dialoger.open(AcventuresCommonHomeShowroomDialogComponent, {\n data: {\n showRoomsData: this.showRoomsData\n }\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","
\n
\n
\n
\n
{{ 'home_section3_text1' | translate }}
\n
{{ 'home_section3_text2' | translate }}
\n
\n

{{ 'home_section3_text3' | translate }}

\n

{{ 'home_section3_text4' | translate }}

\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n \n \n \n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog } from '@angular/material/dialog';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport {\n AcventuresCommonHomeShowroomDialogComponent\n} from '../../../_acventures-common/components/home-showroom-dialog/home-showroom-dialog';\nimport { ShowRoomData } from '../../../_acventures-common/components/home-showroom/home-showroom';\n\n@Component({\n selector: 'projects-home-introduction',\n providers: [],\n styleUrls: ['./home-introduction.scss'],\n templateUrl: './home-introduction.html'\n})\nexport class ProjectsHomeIntroductionComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public showRoomMode: 'normal' | 'dialog' = 'normal';\n public showRoomsData: ShowRoomData[] = [\n {\n orientation: 'right',\n icon: 'assignment',\n image: this.conf.assetsUrl + 'img/home/section-3-showroom-1.jpg',\n title: 'home_section3_showroom1_title',\n text: 'home_section3_showroom1_text'\n }\n ];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _router: Router,\n private _route: ActivatedRoute,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onMoreInformationClicked(): void {\n this._dialoger.open(AcventuresCommonHomeShowroomDialogComponent, {\n data: {\n showRoomsData: this.showRoomsData\n }\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","
\n info_outline {{ title | translate }}\n
\n\n
\n {{ text | translate }}\n
\n
\n {{ text | translate }}\n
\n
\n\n \n\n","import { AfterViewInit, ChangeDetectorRef, Component, Inject } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\n\n@Component({\n selector: 'info-dialog',\n providers: [],\n styleUrls: ['./info-dialog.scss'],\n templateUrl: './info-dialog.html'\n})\nexport class InfoDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public text: string = '';\n public texts: string[] = [];\n public title: string = 'Information';\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _changeDetector: ChangeDetectorRef,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n this.text = this._data.text;\n this.texts = this._data.texts;\n if ('title' in this._data) {\n this.title = this._data.title;\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","
\n \n
\n
\n
Platform operated by
\n
Swiss Biotech Association
\n
\n
\n
\n\n\n\n
\n \n
© {{ year }}, Swiss Biotech Association - Imprint\n
\n
\n","import { AfterViewInit, Component, Input } from '@angular/core';\nimport { Conf } from '../../../_conf';\nimport { InfoDialogComponent } from '../../../_common/components/info-dialog/info-dialog';\nimport { TranslateService } from '@ngx-translate/core';\nimport { faFacebookF, faLinkedinIn, faTwitter } from '@fortawesome/free-brands-svg-icons';\nimport { MatDialog } from '@angular/material/dialog';\n\n@Component({\n selector: 'footer',\n providers: [],\n styleUrls: ['./footer.scss'],\n templateUrl: './footer.html'\n})\nexport class FooterComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public hasLeftMenu: boolean = true;\n\n public year: number = 2000;\n\n public faFacebook = faFacebookF;\n public faTwitter = faTwitter;\n public faLinkedin = faLinkedinIn;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n private _dialoger: MatDialog,\n private _translater: TranslateService\n ) {\n this.year = (new Date()).getFullYear();\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onHelpClicked(): void {\n window.location.href = 'mailto:' + this.conf.helpEmail;\n }\n\n public onAboutClicked(): void {\n this._dialoger.open(InfoDialogComponent, {\n data: {\n texts: ['About_text_1', 'About_text_2'],\n title: this._translater.instant('About_x', {x: this.conf.platformName})\n }\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../providers/current-user';\nimport { ModelsStorage } from '../../providers/models-storage';\nimport { ProjectsRegisterDialogComponent } from '../../../projects/components/register-dialog/register-dialog';\nimport { InvestorsRegisterDialogComponent } from '../../../investors/components/register-dialog/register-dialog';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { AcademicInstitution } from '../../providers/models';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'home-page',\n providers: [],\n styleUrls: ['./home.scss'],\n templateUrl: './home.html'\n})\nexport class HomePageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public institutions: AcademicInstitution[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _route: ActivatedRoute,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this._title.setTitle(this.conf.platformName);\n\n this.loadData().catch((error: any) => this.onError(error));\n\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onCallToAction1Clicked(): void {\n document.querySelector('.section-2').scrollIntoView({\n behavior: 'smooth'\n });\n }\n\n public onCallToAction2Clicked(): void {\n document.querySelector('.section-3').scrollIntoView({\n behavior: 'smooth'\n });\n }\n\n public onCreateProjectAccountClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(ProjectsRegisterDialogComponent, {\n data: {}\n });\n }\n\n public onCreateInvestorAccountClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(InvestorsRegisterDialogComponent, {\n data: {}\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(AcademicInstitution).where('id').notIn([AcademicInstitution.ID_OTHER, AcademicInstitution.ID_NONE]).get()\n .then((data: AcademicInstitution[]) => {\n this.institutions = data;\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n","
\n
\n
:,-(
\n
{{ 'Error_401' | translate }}
\n
{{ message }}
\n
\n \n
\n
\n
\n","import { AfterViewInit, Component, Input } from '@angular/core';\nimport { Conf } from '../../../_conf';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'error-401',\n providers: [],\n styleUrls: ['./error-401.scss'],\n templateUrl: './error-401.html'\n})\nexport class Error401Component implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input()\n public message: string = '';\n @Input()\n public actions: any[] = [{name: 'Okay_then...', link: '/'}];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { Conf } from '../../../_conf';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'error-401-page',\n providers: [],\n styleUrls: ['./error-401.scss'],\n templateUrl: './error-401.html'\n})\nexport class Error401PageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","","
\n
\n
:,-(
\n
{{ 'Error_404' | translate }}
\n
{{ message }}
\n
\n \n
\n
\n
\n","import { AfterViewInit, Component, Input } from '@angular/core';\nimport { Conf } from '../../../_conf';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'error-404',\n providers: [],\n styleUrls: ['./error-404.scss'],\n templateUrl: './error-404.html'\n})\nexport class Error404Component implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input()\n public message: string = '';\n @Input()\n public actions: any[] = [{name: 'Okay_then...', link: '/'}];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { Conf } from '../../../_conf';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'error-404-page',\n providers: [],\n styleUrls: ['./error-404.scss'],\n templateUrl: './error-404.html'\n})\nexport class Error404PageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","","
{{ 'Change_password' | translate }}
\n\n
2 && !currentUser.user.isAdmin\" class=\"line\">\n \n \n {{ 'Password_required' | translate }}\n {{ 'Password_wrong' | translate }}\n \n
\n
\n \n \n {{ 'New_password_required' | translate }}\n {{ 'Password_too_short' | translate:{length: PASSWORD_MIN_LENGTH} }}\n \n \n
\n \n
\n\n \n \n\n
\n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, Inject } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Utils } from '../../../_common/providers/utils';\nimport { Conf } from '../../../_conf';\nimport { UsersProvider } from '../../providers/users-provider';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { User, } from '../../../_common/providers/models';\n\n@Component({\n selector: 'users-change-password-dialog',\n providers: [],\n styleUrls: ['./change-password-dialog.scss'],\n templateUrl: './change-password-dialog.html'\n})\nexport class UsersChangePasswordDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public PASSWORD_MIN_LENGTH = 8;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n public showPassword: boolean = false;\n public passwordWrongError: boolean = false;\n public currentPasswordFormControl: FormControl = new FormControl('', [\n Validators.required,\n // doc : https://blog.thoughtram.io/angular/2016/03/14/custom-validators-in-angular-2.html#building-a-custom-validator\n (control: FormControl) => this.passwordWrongError ? {wrong: {valid: false}} : null\n ]);\n public newPassword1FormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.minLength(this.PASSWORD_MIN_LENGTH)\n ]);\n public newPassword2FormControl: FormControl = new FormControl('', [\n // Validators.required,\n (control: FormControl) => this.checkPasswords()\n ]);\n\n public user: User = new User();\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public dialog: MatDialogRef,\n public utils: Utils,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _users: UsersProvider,\n private _changeDetector: ChangeDetectorRef,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n this.user = _data.user;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onSaveClicked(): void {\n this.isLoading = true;\n this.save()\n .then((result) => {\n this._toaster.open(this._translater.instant('Password_updated'), '', {duration: 5000});\n this.isLoading = false;\n this.dialog.close(result);\n })\n .catch((error) => this.onError(error));\n }\n\n public onCurrentPasswordChange(): void {\n this.passwordWrongError = false;\n }\n\n public onPassword1Change(): void {\n if (!this.newPassword2FormControl.pristine) {\n this.newPassword2FormControl.updateValueAndValidity();\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private save(): Promise {\n return this._users.changePassword(this.user, this.newPassword1FormControl.value, this.currentPasswordFormControl.value);\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n if (error.status === 401) {\n this.passwordWrongError = true;\n this.currentPasswordFormControl.updateValueAndValidity();\n return;\n }\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n\n private checkPasswords(): any {\n return null;\n /*\n if (!this.newPassword1FormControl\n || !this.newPassword2FormControl\n || this.newPassword1FormControl.value === this.newPassword2FormControl.value) {\n return null;\n }\n\n return { match: { valid: false } };\n */\n }\n}\n","import { AfterViewInit, Component, Inject } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'confirm-dialog',\n providers: [],\n styleUrls: ['./confirm-dialog.scss'],\n templateUrl: './confirm-dialog.html'\n})\nexport class ConfirmDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public confirmText: string = '';\n public confirmActionText: string = '';\n public confirmColor: string = 'warn';\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public dialog: MatDialogRef,\n private _translater: TranslateService,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n if (_data && _data.confirmText) {\n this.confirmText = _data.confirmText;\n } else {\n this.confirmText = 'AreYouSureDeleteWarning';\n }\n\n if (_data && _data.confirmActionText) {\n this.confirmActionText = _data.confirmActionText;\n } else {\n this.confirmActionText = 'Delete';\n }\n\n if (_data && _data.confirmColor) {\n this.confirmColor = _data.confirmColor;\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onConfirmClicked(): void {\n this.confirm(true);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private confirm(confirmed: boolean): void {\n this.dialog.close(confirmed);\n }\n}\n","{{ confirmText | translate }}\n\n \n \n\n","import { Utils } from '../../_common/providers/utils';\nimport { InvestorProfile, InvestorValidationState, User } from '../../_common/providers/models';\n\nexport class InvestorRights {\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _utils: Utils;\n private _params: InvestorRightsParams = null;\n private _see: boolean = false;\n private _edit: boolean = false;\n private _delete: boolean = false;\n private _seeEditForm: boolean = false;\n private _validate: boolean = false;\n\n constructor(\n utils: Utils\n ) {\n this._utils = utils;\n }\n\n public get SEE() {\n return this._see;\n }\n\n public get EDIT() {\n return this._edit;\n }\n\n public get DELETE() {\n return this._delete;\n }\n\n public get SEE_EDIT_FORM() {\n return this._seeEditForm;\n }\n\n public get VALIDATE() {\n return this._validate;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n public evaluate(params: InvestorRightsParams): void {\n this._params = params;\n\n if (params.user.isAdmin) {\n this.evaluateAdmin();\n } else if (params.user.isInvestor) {\n this.evaluateInvestor();\n } else if (params.user.isGuest) {\n this.evaluateGuest();\n } else if (params.user.isProjectHolder) {\n this.evaluateProjectHolder();\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private evaluateAdmin(): void {\n this._see = true;\n this._edit = false;\n this._delete = true;\n this._seeEditForm = true;\n if (this._params.investorProfile && this._params.investorProfile.investorValidationStateId === InvestorValidationState.ID_PENDING) {\n this._validate = true;\n } else {\n this._validate = false;\n }\n }\n\n private evaluateGuest(): void {\n this._see = false;\n this._edit = false;\n this._delete = false;\n this._seeEditForm = false;\n this._validate = false;\n }\n\n private evaluateInvestor(): void {\n this._delete = false;\n this._validate = false;\n if (this._params.user.id === this._params.investorProfile.userId) {\n this._see = true;\n this._seeEditForm = true;\n\n if ([InvestorValidationState.ID_ACCEPTED, InvestorValidationState.ID_PENDING].indexOf(this._params.investorProfile.investorValidationStateId) >= 0) {\n this._edit = true;\n } else {\n this._edit = true;\n }\n } else {\n this._see = false;\n this._edit = false;\n this._seeEditForm = false;\n }\n }\n\n private evaluateProjectHolder(): void {\n this._see = false;\n this._edit = false;\n this._delete = false;\n this._seeEditForm = false;\n this._validate = false;\n }\n}\n\nexport interface InvestorRightsParams {\n user: User;\n investorProfile?: InvestorProfile;\n}\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ActivatedRouteSnapshot, CanActivate, CanDeactivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { Conf } from '../../_conf';\nimport { ConfirmDialogComponent } from '../components/confirm-dialog/confirm-dialog';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\n\n@Injectable()\nexport class HasPendingChangesGuard implements CanActivate, CanDeactivate {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n /*\n * { url: { warned: boolean, nextUrl: string }, } // false = pas encore warné, true = déjà warné\n */\n private _changes: Object = {};\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _translater: TranslateService,\n private _router: Router,\n private _conf: Conf,\n private _dialoger: MatDialog\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise {\n return this.hasPendingChanges(route.url.join('/'));\n }\n\n public canDeactivate(component: any, route: ActivatedRouteSnapshot, state: RouterStateSnapshot, nextState?: RouterStateSnapshot): Promise {\n if (!nextState) {\n return new Promise((resolve, reject) => resolve(true));\n }\n\n return this.hasPendingChanges(nextState.url);\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public registerChanges(url: string = null): void {\n if (!url) {\n url = this._router.url;\n }\n this._changes[url] = {warned: false, nextUrl: ''};\n }\n\n public unregisterChanges(url: string = null): void {\n if (!url) {\n url = this._router.url;\n }\n delete this._changes[url];\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private hasPendingChanges(nextUrl: string): Promise {\n return new Promise((resolve, reject) => {\n // s'il n'y a pas de clé, c'est qu'il n'y a pas de changement\n // s'il y une clé, c'est qu'on surveille les changements\n // si cette clé vaut false, on doit warner l'utilisateur avant de laisser naviguer\n // si cette clé vaut true, on doit le laisser naviguer et supprimer la clé\n const url = this._router.url;\n if (this._changes.hasOwnProperty(url) && !this._changes[url].warned) {\n // this._changes[url].nextUrl = route.url.join('/');\n this._changes[url].nextUrl = nextUrl;\n this.warn();\n resolve(false);\n } else {\n resolve(true);\n }\n });\n }\n\n private warn(): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'PendingChangesWarning'\n }\n });\n dialog.afterClosed().subscribe((result) => {\n if (result) {\n this.onLeaveConfirmed();\n }\n });\n }\n\n private onLeaveConfirmed(): void {\n const nextUrl = this._changes[this._router.url].nextUrl;\n this.unregisterChanges();\n this._router.navigateByUrl(nextUrl);\n }\n\n}\n","\n \n 0 || shortcutMenus.length > 0\"\n class=\"header\">\n
\n \n {{ title | translate }}\n \n info_outline\n \n
\n
\n \n \n \n \n \n
\n
\n \n \n \n
0\"\n [class.main-actions-bottom]=\"mainActionsPosition == 'bottom'\"\n [class.main-actions-top]=\"mainActionsPosition == 'top'\"\n class=\"main-actions\">\n \n
\n \n
\n","import { AfterViewInit, Component, Input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Conf } from '../../../_conf';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'module-content',\n providers: [],\n styleUrls: ['./module-content.scss'],\n templateUrl: './module-content.html'\n})\nexport class ModuleContentComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public title: string = '';\n @Input() public tooltipText: string = undefined;\n @Input() public moreMenus: ModuleMenu[] = [];\n @Input() public shortcutMenus: ModuleMenu[] = [];\n @Input() public mainActions: ModuleMenu[] = [];\n @Input() public mainActionsPosition: 'top' | 'bottom' = 'bottom';\n @Input() public coverImage: string = null;\n @Input() public coverImageFit: string = 'cover';\n @Input() public coverImageBackgroundColor: string = '#000';\n @Input() public isLoading: boolean = false;\n @Input() public loaderPosition: 'top' | 'bottom' = 'bottom';\n @Input() public disableMainActionsWhenLoading: boolean = true;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n private _router: Router,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onMenuClicked(menu: ModuleMenu): void {\n if (menu.onClick) {\n menu.onClick();\n } else if (menu.url) {\n this._router.navigateByUrl(menu.url);\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n\nexport interface ModuleMenu {\n title: string;\n icon: string;\n url: string;\n onClick: any;\n}\n","import { MatTableDataSource } from '@angular/material/table';\n\nexport class SimpleMatDataSource extends MatTableDataSource {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _originalData: any[] = [];\n private _sortDefinitions: {} = {};\n private _sortState: SortState = null;\n\n constructor(_data: any[]) {\n super(_data);\n this._originalData = _data.slice();\n }\n\n public get count() {\n return this.data.length;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n public set count(count: number) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public push(item: any): void {\n this._originalData.push(item);\n\n if (this._sortState) {\n this.sortBy(this._sortState.name, this._sortState.direction);\n } else {\n this.data = this._originalData.slice();\n }\n }\n\n public set(index: number, item: any): void {\n if (this._sortState) {\n for (let i = 0; i < this._originalData.length; i++) {\n if (this._originalData[i] == this.data[index]) {\n this._originalData[i] = item;\n i = this._originalData.length;\n }\n }\n\n this.sortBy(this._sortState.name, this._sortState.direction);\n } else {\n this._originalData[index] = item;\n this.data = this._originalData.slice();\n }\n }\n\n public get(index: number): any {\n return this.data[index];\n }\n\n public getAll(): any[] {\n return this.data;\n }\n\n public remove(index: number): void {\n const data: any[] = this.data.slice();\n if (this._sortState) {\n for (let i = 0; i < this._originalData.length; i++) {\n if (this._originalData[i] == data[index]) {\n this._originalData.splice(i, 1);\n i = this._originalData.length;\n }\n }\n } else {\n this._originalData.splice(index, 1);\n }\n\n data.splice(index, 1);\n\n this.data = data;\n }\n\n public replaceAllWith(data: any[]): void {\n this._originalData = data.slice();\n\n if (this._sortState) {\n this.sortBy(this._sortState.name, this._sortState.direction);\n } else {\n this.data = data.slice();\n }\n }\n\n public addSortDefinition(name: string, asc: (a: any, b: any) => number, desc: (a: any, b: any) => number): void {\n this._sortDefinitions[name] = {\n name,\n asc,\n desc\n };\n }\n\n public removeSortDefinition(name: string): void {\n delete this._sortDefinitions[name];\n }\n\n public sortBy(name: string, direction: 'asc' | 'desc' | ''): void {\n if (!this._sortDefinitions[name]) {\n return;\n }\n\n if (direction !== 'asc' && direction !== 'desc') {\n this.data = this._originalData.slice();\n this._sortState = null;\n\n return;\n }\n\n const data: any[] = this._originalData.slice();\n data.sort(this._sortDefinitions[name][direction]);\n this._sortState = {name, direction};\n\n this.data = data;\n }\n\n /**\n * Remove an element by his id. The element MUST HAVE an id attribute.\n *\n * @param id\n */\n public removeElementById(id): void {\n const filtered = this.data.filter(function(el) {\n return el.id != id;\n });\n\n this.replaceAllWith(filtered);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n\nexport interface SortDefinition {\n name: string;\n asc: (a: any, b: any) => number;\n desc: (a: any, b: any) => number;\n}\n\nexport interface SortState {\n name: string;\n direction: 'asc' | 'desc';\n}\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../_common/providers/utils';\nimport { Conf } from '../../_conf';\nimport { ApiBaseService } from '../../_common/providers/api-base-service';\nimport { LangsProvider } from '../../_common/providers/langs-provider';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { ModelsStorage } from '../../_common/providers/models-storage';\nimport {\n Alert,\n Alert_AcademicInstitution,\n Alert_DevelopmentPhase,\n Alert_FundingRound,\n Alert_ProjectType,\n Alert_TherapeuticArea\n} from '../../_common/providers/models';\n\n@Injectable()\nexport class AlertsProvider {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _translater: TranslateService,\n private _api: ApiBaseService,\n private _langs: LangsProvider,\n private _utils: Utils,\n private _currentUser: CurrentUser,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public saveAlert(alert: Alert): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'alerts/' + (alert.id ? alert.id : 0),\n this._utils.buildModelParams([alert], this._langs.getLangIds())[0],\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n alert = Alert.fromAPI(data.alert);\n this._storage.save([alert])\n .then(() => resolve(alert))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveAlertProjectTypes(alertId: number, projectTypeIds: number[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'alerts/' + alertId + '/project-types',\n {ids: projectTypeIds},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n this._storage.select(Alert_ProjectType).where('alertId').equals(alertId).get()\n .then((oldItems: Alert_ProjectType[]) => {\n const newItems: Alert_ProjectType[] = Alert_ProjectType.fromAPIList(data.alert_projectTypes);\n Promise.all([\n this._storage.delete(oldItems),\n this._storage.save(newItems)\n ])\n .then(() => resolve(newItems))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveAlertTherapeuticAreas(alertId: number, therapeuticAreaIds: number[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'alerts/' + alertId + '/therapeutic-areas',\n {ids: therapeuticAreaIds},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n this._storage.select(Alert_TherapeuticArea).where('alertId').equals(alertId).get()\n .then((oldItems: Alert_TherapeuticArea[]) => {\n const newItems: Alert_TherapeuticArea[] = Alert_TherapeuticArea.fromAPIList(data.alert_therapeuticAreas);\n Promise.all([\n this._storage.delete(oldItems),\n this._storage.save(newItems)\n ])\n .then(() => resolve(newItems))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveAlertDevelopmentPhases(alertId: number, developmentPhaseIds: number[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'alerts/' + alertId + '/development-phases',\n {ids: developmentPhaseIds},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n this._storage.select(Alert_DevelopmentPhase).where('alertId').equals(alertId).get()\n .then((oldItems: Alert_DevelopmentPhase[]) => {\n const newItems: Alert_DevelopmentPhase[] = Alert_DevelopmentPhase.fromAPIList(data.alert_developmentPhases);\n Promise.all([\n this._storage.delete(oldItems),\n this._storage.save(newItems)\n ])\n .then(() => resolve(newItems))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveAlertFundingRounds(alertId: number, fundingRoundIds: number[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'alerts/' + alertId + '/funding-rounds',\n {ids: fundingRoundIds},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n this._storage.select(Alert_FundingRound).where('alertId').equals(alertId).get()\n .then((oldItems: Alert_FundingRound[]) => {\n const newItems: Alert_FundingRound[] = Alert_FundingRound.fromAPIList(data.alert_fundingRounds);\n Promise.all([\n this._storage.delete(oldItems),\n this._storage.save(newItems)\n ])\n .then(() => resolve(newItems))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public saveAlertAcademicInstitutions(alertId: number, academicInstitutionIds: number[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'alerts/' + alertId + '/academic-institutions',\n {ids: academicInstitutionIds},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n this._storage.select(Alert_AcademicInstitution).where('alertId').equals(alertId).get()\n .then((oldItems: Alert_AcademicInstitution[]) => {\n const newItems: Alert_AcademicInstitution[] = Alert_AcademicInstitution.fromAPIList(data.alert_academicInstitutions);\n Promise.all([\n this._storage.delete(oldItems),\n this._storage.save(newItems)\n ])\n .then(() => resolve(newItems))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public deleteAlert(alert: Alert): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'delete',\n 'alerts/' + alert.id,\n {},\n this._currentUser.getAccessToken()\n )\n .then(() => {\n this._storage.delete([alert])\n .then(() => resolve())\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Utils } from '../providers/utils';\n\n@Pipe({name: 'dateClosest'})\nexport class DateClosestPipe implements PipeTransform {\n constructor(\n private _utils: Utils\n ) {\n }\n\n public transform(str: string, format: string = 'closest') {\n return this._utils.formatDate(str, format);\n }\n}\n","\n
\n

{{ 'No_alert_yet' | translate }}

\n \n
\n 0\"\n [dataSource]=\"dataSource\"\n matSort>\n \n \n \n {{ 'Name' | translate }}\n \n \n \n \n \n {{ 'Creation_date' | translate }}\n \n {{ row.alert.createDate | dateClosest:'FjY' }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, ViewChild } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Router } from '@angular/router';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { SimpleMatDataSource } from '../../../_common/providers/simple-mat-data-source';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { Utils } from '../../../_common/providers/utils';\nimport { AlertsProvider } from '../../providers/alerts-provider';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { Alert } from '../../../_common/providers/models';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'alerts-list',\n providers: [],\n styleUrls: ['./list.scss'],\n templateUrl: './list.html'\n})\nexport class AlertsListComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public dataSource: SimpleMatDataSource = new SimpleMatDataSource([]);\n public columns: string[] = ['name', 'createDate', 'actions'];\n public alertTooltip: string = this._translater.instant('Alert_tooltip');\n\n @ViewChild(MatPaginator, {static: false}) public paginator: MatPaginator;\n @ViewChild(MatSort, {static: false}) public sorter: MatSort;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public currentUser: CurrentUser,\n private _dialoger: MatDialog,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _router: Router,\n private _alertsProvider: AlertsProvider,\n private _storage: ModelsStorage,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.initDataSource();\n this.loadData().catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onDataSortChange(event: any): void {\n this.dataSource.sortBy(event.active, event.direction);\n }\n\n public onDeleteClicked(row: AlertsListRow): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {confirmText: 'Confirm_delete_alert_warning'}\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n row.isLoading = true;\n this.deleteAlert(row.alert)\n .then(() => {\n this._toaster.open(this._translater.instant('Alert_deleted'), '', {duration: 5000});\n })\n .catch((error: any) => {\n row.isLoading = false;\n this.onError(error);\n });\n }\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private initDataSource(): void {\n this.dataSource.sort = this.sorter;\n this.dataSource.paginator = this.paginator;\n\n this.dataSource.addSortDefinition(\n 'name',\n (a: Alert, b: Alert) => this.utils.sortRow(a.name.toLowerCase(), b.name.toLowerCase()),\n (a: Alert, b: Alert) => this.utils.sortRow(b.name.toLowerCase(), a.name.toLowerCase())\n );\n\n this.dataSource.addSortDefinition(\n 'createDate',\n (a: Alert, b: Alert) => this.utils.sortRow(a.createDate, b.createDate),\n (a: Alert, b: Alert) => this.utils.sortRow(b.createDate, a.createDate)\n );\n }\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(Alert).where('ownerId').equals(this.currentUser.user.id).orderBy('name').get()\n .then((alerts: Alert[]) => {\n const rows: AlertsListRow[] = [];\n alerts.forEach((alert: Alert) => rows.push({alert, isLoading: false}));\n\n this.dataSource.replaceAllWith(rows);\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private deleteAlert(alert: Alert): Promise {\n return new Promise((resolve, reject) => {\n this._alertsProvider.deleteAlert(alert)\n .then(() => {\n for (let i = 0; i < this.dataSource.count; i++) {\n if (this.dataSource.get(i).alert.id === alert.id) {\n this.dataSource.remove(i);\n i = this.dataSource.count;\n }\n\n resolve();\n }\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n\nexport interface AlertsListRow {\n alert: Alert;\n isLoading: boolean;\n}\n","\n
\n \n \n
\n \n \n
\n \n {{ area.name }}\n \n
\n {{ 'Invalid_value' | translate }}\n
\n
\n
\n \n \n \n {{ phase.developmentPhase.name }}\n \n \n \n {{ 'Invalid_value' | translate }}\n \n
\n
\n
{{ 'Investment_range' | translate }}
\n
\n
\n \n \n CHF \n {{ 'Invalid_value' | translate }}\n \n \n \n CHF \n {{ 'Invalid_value' | translate }}\n \n
\n
\n \n {{ 'Intersted_in_non_profit_ventures' | translate }}\n \n
\n
\n \n {{ 'Intersted_in_partnerships' | translate }}\n \n
\n
\n \n {{ 'Intersted_to_in_licence_a_technology_of_product' | translate }}\n \n
\n \n
\n\n
\n \n {{ 'Receive_notification_new_project' | translate }}\n \n
\n
\n \n {{ 'Receive_notification_dev_phase' | translate }}\n \n
\n
\n \n {{ 'Receive_notification_seeking_funds' | translate }}\n \n
\n
\n \n {{ 'Receive_notification_lead_investor' | translate }}\n \n
\n
\n\n\n\n\n
\n
\n
\n \n \n {{ company.name }}\n \n \n
\n \n
{{ linkedCompany.name }}
\n
\n
\n
\n \n more_vert\n \n \n \n \n
\n
\n
\n\n

{{ 'Investor_validation_explanation_1' | translate }}

\n

{{ 'Investor_validation_explanation_2' | translate }}

\n
{{ 'Company' | translate }}
\n

\n {{ 'Investor_validation_company_completed' | translate }}\n {{ linkedCompany.isCompleted ? ('Yes' | translate) : ('No' | translate) }}\n

\n
\n \n \n
\n
\n","import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { Conf } from '../../../_conf';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { InvestorRights } from '../../providers/investor-rights';\nimport { InvestorsProvider } from '../../providers/investors-provider';\nimport {\n DevelopmentPhaseWithAssociatedProjectTypeGroups,\n ProjectsProvider\n} from '../../../projects/providers/projects-provider';\nimport {\n Company,\n CompanyCategory,\n InvestorProfile,\n InvestorValidationState,\n TherapeuticArea\n} from '../../../_common/providers/models';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog } from '@angular/material/dialog';\n\n@Component({\n selector: 'investors-edit-investor-profile',\n providers: [],\n styleUrls: ['./edit-investor-profile.scss'],\n templateUrl: './edit-investor-profile.html'\n})\nexport class InvestorsEditInvestorProfileComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public companyFormControl: FormControl = new FormControl('', [\n Validators.min(1)\n ]);\n\n public investmentRangeFromFormControl: FormControl = new FormControl('', [\n Validators.min(0),\n (control: any) => this.checkInvestmentRange(),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n\n public investmentRangeToFormControl: FormControl = new FormControl('', [\n Validators.min(0),\n (control: any) => this.checkInvestmentRange(),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n\n public therapeuticAreaFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.min(1)\n ]);\n\n public developmentPhaseFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.min(1)\n ]);\n\n public isInterstedInNotForProfit: boolean = false;\n public isInterstedInPartnerships: boolean = false;\n public isInterstedInLicenses: boolean = false;\n public acceptedToBeContacted: boolean = false;\n public isNotificationsAlertEnabled: boolean = false;\n public isNotificationsDevPhaseEnabled: boolean = false;\n public isNotificationsSeekingFundsEnabled: boolean = false;\n public isNotificationsLeadInvestorEnabled: boolean = false;\n @Output() public investorProfileChange: EventEmitter = new EventEmitter();\n @Output() public therapeuticAreaIdsChange: EventEmitter = new EventEmitter();\n @Output() public developmentPhaseIdsChange: EventEmitter = new EventEmitter();\n @Output() public onFormChanged: EventEmitter = new EventEmitter();\n public companyCategories: CompanyCategory[] = [];\n public therapeuticAreas: TherapeuticArea[] = [];\n public developmentPhasesWithAssociatedProjectTypeGroups: DevelopmentPhaseWithAssociatedProjectTypeGroups[] = [];\n public companies: Company[] = [];\n public linkedCompany: Company = null;\n public ID_ACCEPTED: number = InvestorValidationState.ID_ACCEPTED;\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n private _investorsProvider: InvestorsProvider,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _changeDetector: ChangeDetectorRef,\n private _utils: Utils,\n private _dialoger: MatDialog,\n private _storage: ModelsStorage,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n private _investorProfile: InvestorProfile = new InvestorProfile();\n\n public get investorProfile() {\n return this._investorProfile;\n }\n\n @Input()\n public set investorProfile(investorProfile: InvestorProfile) {\n if (!investorProfile) {\n this.investorProfile = new InvestorProfile();\n return;\n }\n\n this._investorProfile = investorProfile;\n this.companyFormControl.setValue(investorProfile.companyId || '');\n this.investmentRangeFromFormControl.setValue(investorProfile.investmentRangeFrom);\n this.investmentRangeToFormControl.setValue(investorProfile.investmentRangeTo);\n this.isInterstedInNotForProfit = investorProfile.isInterstedInNotForProfit ? true : false;\n this.isInterstedInPartnerships = investorProfile.isInterstedInPartnerships ? true : false;\n this.isInterstedInLicenses = investorProfile.isInterstedInLicenses ? true : false;\n this.acceptedToBeContacted = investorProfile.acceptToBeContacted ? true : false;\n this.isNotificationsAlertEnabled = investorProfile.isNotificationsAlertEnabled ? true : false;\n this.isNotificationsDevPhaseEnabled = investorProfile.isNotificationsDevPhaseEnabled ? true : false;\n this.isNotificationsSeekingFundsEnabled = investorProfile.isNotificationsSeekingFundsEnabled ? true : false;\n this.isNotificationsLeadInvestorEnabled = investorProfile.isNotificationsLeadInvestorEnabled ? true : false;\n }\n\n private _therapeuticAreaIds: number[] = [];\n\n public get therapeuticAreaIds() {\n return this._therapeuticAreaIds;\n }\n\n @Input()\n public set therapeuticAreaIds(therapeuticAreaIds: number[]) {\n this._therapeuticAreaIds = therapeuticAreaIds;\n this.therapeuticAreaFormControl.setValue(therapeuticAreaIds);\n }\n\n private _developmentPhaseIds: number[] = [];\n\n public get developmentPhaseIds() {\n return this._developmentPhaseIds;\n }\n\n @Input()\n public set developmentPhaseIds(developmentPhaseIds: number[]) {\n this._developmentPhaseIds = developmentPhaseIds;\n this.developmentPhaseFormControl.setValue(developmentPhaseIds);\n }\n\n private _investorRights = new InvestorRights(this._utils);\n\n public get investorRights() {\n return this._investorRights;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set investorRights(investorRights: InvestorRights) {\n this._investorRights = investorRights ? investorRights : new InvestorRights(this._utils);\n this.updateRights();\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.loadStaticData().catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public canSave(): boolean {\n return !this.companyFormControl.invalid\n && !this.investmentRangeFromFormControl.invalid\n && !this.investmentRangeToFormControl.invalid\n && !this.therapeuticAreaFormControl.invalid\n && !this.developmentPhaseFormControl.invalid;\n }\n\n public _onFormChanged(): void {\n this.fireChange();\n this._changesGuard.registerChanges();\n this.onFormChanged.emit();\n }\n\n public onCategoryChanged(): void {\n this._onFormChanged();\n this._changeDetector.detectChanges();\n }\n\n public onInvestmentRangeChanged(): void {\n this.investmentRangeFromFormControl.updateValueAndValidity();\n this.investmentRangeToFormControl.updateValueAndValidity();\n this._onFormChanged();\n }\n\n public onValidateClicked(accepted: boolean): void {\n /*\n let dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: accepted ? 'Investor_validation_explanation_1' : 'Investor_validation_explanation_2',\n confirmActionText: accepted ? 'Accept' : 'Refuse',\n confirmColor: accepted ? 'primary' : 'warn'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n this.isLoading = true;\n this._investorsProvider.validateProfile(this.investorProfile, accepted ? InvestorValidationState.ID_ACCEPTED : InvestorValidationState.ID_REFUSED)\n .then(() => {\n this.isLoading = false;\n this._router.navigate(['investors', 'pending-validation']);\n this._toaster.open(this._translater.instant('User_saved'), '', { duration: 5000 });\n })\n .catch((error: any) => this.onError(error));\n }\n });\n */\n this.isLoading = true;\n this._investorsProvider.validateProfile(this.investorProfile, accepted ? InvestorValidationState.ID_ACCEPTED : InvestorValidationState.ID_REFUSED)\n .then(() => {\n this.isLoading = false;\n this._router.navigate(['investors', 'pending-validation']);\n this._toaster.open(this._translater.instant('User_saved'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n\n public onAllTherapeuticAreasClicked(): void {\n this.therapeuticAreaFormControl.setValue(this._utils.getKeyValues(this.therapeuticAreas, 'id'));\n this._onFormChanged();\n }\n\n public onNoTherapeuticAreasClicked(): void {\n this.therapeuticAreaFormControl.setValue([]);\n this._onFormChanged();\n }\n\n public onEditClicked(): void {\n this._router.navigate(['investors', 'companies', this._investorProfile.companyId, 'edit'], {\n queryParams: {backUrl: this._router.url, backTitle: this._translater.instant('My_account')}\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadStaticData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(CompanyCategory).orderBy('ordinal').get(),\n this._storage.select(TherapeuticArea).orderBy('name').get(),\n this._projectsProvider.getDevelopmentPhasesWithAssociatedProjectTypeGroups(),\n this._storage.select(Company).get()\n ])\n .then((data: any[]) => {\n this.companyCategories = data[0];\n this.therapeuticAreas = data[1];\n this.developmentPhasesWithAssociatedProjectTypeGroups = data[2];\n this.companies = data[3];\n this.linkedCompany = this._utils.findIn(this._investorProfile.companyId, this.companies);\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private updateRights(): void {\n this.companyFormControl.disable();\n if (this.investorRights.EDIT) {\n this.therapeuticAreaFormControl.enable();\n this.developmentPhaseFormControl.enable();\n this.investmentRangeFromFormControl.enable();\n this.investmentRangeToFormControl.enable();\n } else {\n this.therapeuticAreaFormControl.disable();\n this.developmentPhaseFormControl.disable();\n this.investmentRangeFromFormControl.disable();\n this.investmentRangeToFormControl.disable();\n }\n\n if (this.currentUser.user.isAdmin) {\n this.companyFormControl.enable();\n }\n }\n\n private fireChange(): void {\n this._investorProfile.companyId = this.companyFormControl.value;\n this._investorProfile.investmentRangeFrom = this.investmentRangeFromFormControl.value;\n this._investorProfile.investmentRangeTo = this.investmentRangeToFormControl.value;\n this._investorProfile.isInterstedInNotForProfit = this.isInterstedInNotForProfit ? 1 : 0;\n this._investorProfile.isInterstedInPartnerships = this.isInterstedInPartnerships ? 1 : 0;\n this._investorProfile.isInterstedInLicenses = this.isInterstedInLicenses ? 1 : 0;\n this._investorProfile.acceptToBeContacted = this.acceptedToBeContacted ? 1 : 0;\n this._investorProfile.isNotificationsAlertEnabled = this.isNotificationsAlertEnabled ? 1 : 0;\n this._investorProfile.isNotificationsDevPhaseEnabled = this.isNotificationsDevPhaseEnabled ? 1 : 0;\n this._investorProfile.isNotificationsSeekingFundsEnabled = this.isNotificationsSeekingFundsEnabled ? 1 : 0;\n this._investorProfile.isNotificationsLeadInvestorEnabled = this.isNotificationsLeadInvestorEnabled ? 1 : 0;\n this._therapeuticAreaIds = this.therapeuticAreaFormControl.value ? this.therapeuticAreaFormControl.value : [];\n this._developmentPhaseIds = this.developmentPhaseFormControl.value ? this.developmentPhaseFormControl.value : [];\n\n this.investorProfileChange.emit(this._investorProfile);\n this.therapeuticAreaIdsChange.emit(this._therapeuticAreaIds);\n this.developmentPhaseIdsChange.emit(this._developmentPhaseIds);\n }\n\n private checkInvestmentRange(): any {\n if (\n this.investmentRangeFromFormControl\n && this.investmentRangeToFormControl\n && this.investmentRangeFromFormControl.value\n && this.investmentRangeToFormControl.value\n && this.investmentRangeFromFormControl.value > this.investmentRangeToFormControl.value\n ) {\n return {inconsistency: {valid: false}};\n }\n\n return null;\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n","import { Utils } from '../../_common/providers/utils';\nimport { User } from '../../_common/providers/models';\n\nexport class UserRights {\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _utils: Utils;\n private _params: UserRightsParams = null;\n private _see: boolean = false;\n private _edit: boolean = false;\n private _delete: boolean = false;\n private _seeEditForm: boolean = false;\n private _addAdmin: boolean = false;\n private _addGuest: boolean = false;\n private _addLocalExpert: boolean = false;\n private _changePassword: boolean = false;\n\n constructor(\n utils: Utils\n ) {\n this._utils = utils;\n }\n\n public get SEE() {\n return this._see;\n }\n\n public get EDIT() {\n return this._edit;\n }\n\n public get DELETE() {\n return this._delete;\n }\n\n public get SEE_EDIT_FORM() {\n return this._seeEditForm;\n }\n\n public get ADD_ADMIN() {\n return this._addAdmin;\n }\n\n public get ADD_GUEST() {\n return this._addGuest;\n }\n\n public get ADD_LOCAL_EXPERT() {\n return this._addLocalExpert;\n }\n\n public get CHANGE_PASSWORD() {\n return this._changePassword;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n public evaluate(params: UserRightsParams): void {\n this._params = params;\n\n if (params.user.isAdmin) {\n this.evaluateAdmin();\n } else {\n this.evaluateOther();\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private evaluateAdmin(): void {\n this._see = true;\n this._seeEditForm = true;\n this._addAdmin = true;\n this._addGuest = true;\n this._addLocalExpert = true;\n\n if (this._params.subjectUser && this._params.subjectUser.id === this._params.user.id) {\n this._edit = true;\n this._delete = false;\n this._changePassword = true;\n } else {\n this._edit = false;\n this._delete = true;\n this._changePassword = false;\n }\n }\n\n private evaluateOther(): void {\n if (this._params.subjectUser && this._params.subjectUser.id === this._params.user.id) {\n this._see = true;\n this._edit = true;\n this._delete = false;\n this._seeEditForm = true;\n this._changePassword = true;\n } else {\n this._see = false;\n this._edit = false;\n this._delete = false;\n this._seeEditForm = false;\n this._changePassword = false;\n }\n this._addAdmin = false;\n this._addGuest = false;\n this._addLocalExpert = false;\n }\n}\n\nexport interface UserRightsParams {\n user: User;\n subjectUser?: User;\n}\n","import { AfterViewInit, Component } from '@angular/core';\nimport { Conf } from '../../../_conf';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'page-content',\n providers: [],\n styleUrls: ['./page-content.scss'],\n templateUrl: './page-content.html'\n})\nexport class PageContentComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n \n
","
\n
\n\n
\n
\n \n
\n
\n
\n
\n
{{ group.title }}
\n \n
\n
\n
\n
\n
\n","import { AfterViewInit, ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Conf } from '../../../_conf';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'side-menu',\n providers: [],\n styleUrls: ['./side-menu.scss'],\n templateUrl: './side-menu.html'\n})\nexport class SideMenuComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isMenuVisibleOnSmallScreen: boolean = false;\n public currentUrl: string = null;\n\n constructor(\n public conf: Conf,\n private _router: Router,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService\n ) {\n }\n\n private _menuGroups: MenuGroup[] = [];\n\n public get menuGroups() {\n return this._menuGroups;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set menuGroups(menuGroups: MenuGroup[]) {\n this._menuGroups = menuGroups;\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.currentUrl = this._router.url;\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onToggleMenuClicked(event: any): void {\n event.stopPropagation();\n this.isMenuVisibleOnSmallScreen = !this.isMenuVisibleOnSmallScreen;\n }\n\n public onMenuItemClicked(menu: MenuItem): void {\n if (menu.onClicked) {\n menu.onClicked();\n } else if (menu.url) {\n this._router.navigateByUrl(menu.url);\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n\nexport interface MenuGroup {\n title: string;\n menus: MenuItem[];\n}\n\nexport interface MenuItem {\n title: string;\n icon: string;\n url?: string;\n onClicked?: any;\n chip?: string;\n chipColor?: string;\n isLoading?: boolean;\n}\n","
\n
\n
\n {{ state.name }}\n
\n","import { AfterViewInit, ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { Utils } from '../../../_common/providers/utils';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { InvestorsProvider } from '../../providers/investors-provider';\nimport { InvestorProfile, InvestorValidationState } from '../../../_common/providers/models';\n\n@Component({\n selector: 'investors-investor-state-indicator',\n providers: [],\n styleUrls: ['./investor-state-indicator.scss'],\n templateUrl: './investor-state-indicator.html'\n})\nexport class InvestorsInvestorStateIndicatorComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly STATE_ID_PENDING_VALIDATION: number = InvestorValidationState.ID_PENDING;\n public readonly STATE_ID_ACCEPTED: number = InvestorValidationState.ID_ACCEPTED;\n public readonly STATE_ID_REFUSED: number = InvestorValidationState.ID_REFUSED;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n @Input() public state: InvestorValidationState = new InvestorValidationState();\n @Input() public displayMode: 'chip' | 'text' | 'chip-text' = 'chip-text';\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public currentUser: CurrentUser,\n public investorsProvider: InvestorsProvider,\n private _translater: TranslateService,\n private _storage: ModelsStorage,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n private _investorProfile: InvestorProfile = null;\n\n public get investorProfile() {\n return this._investorProfile;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set investorProfile(investorProfile: InvestorProfile) {\n this._investorProfile = investorProfile;\n if (this._investorProfile) {\n this.loadState().catch((error: any) => this.onError(error));\n } else {\n this.state = new InvestorValidationState();\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadState(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(InvestorValidationState).where('id').equals(this._investorProfile.investorValidationStateId).get(1)\n .then((state: InvestorValidationState) => {\n this.state = state;\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","
\n
{{ placeholder | translate }}
\n
\n
\n \"{{\n \"{{\n \n
\n
\n
\n
\n {{ hintLeft }}\n
\n
\n {{ hint }}\n
\n
\n
\n {{ 'Image_extension_error' | translate:{extension: allowedExtensions.join(', ')} }}\n
\n
\n {{ 'Image_size_error' | translate:{size: maxFileSize + ' Mo'} }}\n
\n
\n\n\n\n \n {{ hint }}\n {{ 'Image_extension_error' | translate:{extension: allowedExtensions.join(', ')} }}\n {{ 'Image_size_error' | translate:{size: maxFileSize + ' Mo'} }}\n {{ 'No_logo_validation' | translate }}\n\n
\n \n
\n","import { AfterViewInit, Component, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild } from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';\nimport { Conf } from '../../../_conf';\n\nexport const INPUT_IMAGE_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => InputImageComponent),\n multi: true\n};\n\n// doc pour le ngModel : http://almerosteyn.com/2016/04/linkup-custom-control-to-ngcontrol-ngmodel\n\n@Component({\n selector: 'input-image',\n providers: [INPUT_IMAGE_VALUE_ACCESSOR],\n styleUrls: ['./input-image.scss'],\n templateUrl: './input-image.html'\n})\nexport class InputImageComponent implements AfterViewInit, ControlValueAccessor {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public ERROR_EXTENSION: number = 1;\n public ERROR_SIZE: number = 2;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @ViewChild('fileInput', {static: false}) public fileInput;\n @ViewChild('textInput', {static: false}) public textInput;\n\n @Input() public previewImage: any;\n public imageConf: ImageData = {current: null, new: null};\n public errorCode: number = 0;\n\n @Input() public placeholder: string;\n @Input() public hint: string = null;\n @Input() public hintLeft: string = null;\n @Input() public imageHost: string = null;\n @Input() public allowedExtensions: string[] = ['jpg', 'jpeg', 'png', 'JPG', 'JPEG', 'PNG'];\n @Input() public maxFileSize: number = 0; // in Mo, 0 or less = unlimited\n @Output() public imageChange: EventEmitter = new EventEmitter();\n @Output('change') public change: EventEmitter = new EventEmitter();\n public imageFormControl: FormControl = new FormControl('', [\n // doc : https://blog.thoughtram.io/angular/2016/03/14/custom-validators-in-angular-2.html#building-a-custom-validator\n (control: any) => {\n return this.errorCode !== this.ERROR_EXTENSION ? null : {extension: {valid: false}};\n },\n (control: any) => {\n return this.errorCode === this.ERROR_SIZE ? {size: {valid: false}} : null;\n }\n ]);\n private _required: boolean = false;\n\n constructor(\n public conf: Conf\n ) {\n }\n\n private _disabled: boolean = false;\n\n public get disabled() {\n return this._disabled;\n }\n\n @Input()\n public set disabled(disabled: boolean) {\n this._disabled = disabled;\n if (this._disabled) {\n this.imageFormControl.disable();\n } else {\n this.imageFormControl.enable();\n }\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set isRequired(required: boolean) {\n this._required = required;\n if (this._required) {\n this.imageFormControl.setValidators(Validators.required);\n this.imageFormControl.updateValueAndValidity();\n } else {\n this.imageFormControl.clearValidators();\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n public writeValue(value: any): void {\n if (value) {\n this.imageConf.current = value.current;\n this.imageConf.new = value.new;\n } else {\n this.imageConf.current = null;\n this.imageConf.new = null;\n }\n }\n\n @HostListener('imageChange')\n public onChange = (_: any) => {\n };\n\n public registerOnChange(fn: any) {\n this.onChange = fn;\n }\n\n public onTouched = () => {\n };\n\n public registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n public onBlur(): void {\n this.onTouched();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onFocus(): void {\n if (this.disabled) {\n return;\n }\n\n this.openFileBrowser();\n }\n\n public onTextChange(): void {\n if (this.disabled) {\n return;\n }\n\n this.openFileBrowser();\n this.imageFormControl.setValue('');\n }\n\n public onRemoveImageClicked(): void {\n if (this.disabled) {\n return;\n }\n\n this.removeImage();\n }\n\n public onFileSelectionChange(event): void {\n if (this.disabled) {\n return;\n }\n\n const files: FileList = event.target.files;\n if (files.length) {\n this.selectFile(files[0]);\n }\n }\n\n public getSelectedImage(): File {\n return this.imageConf.new;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private openFileBrowser(): void {\n this.fileInput.nativeElement.click();\n }\n\n private selectFile(file: File): void {\n const fileExtension: string = this.getFileExtension(file);\n if (this.allowedExtensions.indexOf(fileExtension) < 0) {\n this.onError(this.ERROR_EXTENSION, fileExtension);\n return;\n }\n\n const fileSize: number = file.size / 1048576; // converson o => Mo\n if (this.maxFileSize && fileSize > this.maxFileSize) {\n this.onError(this.ERROR_SIZE, fileSize);\n return;\n }\n\n this.errorCode = 0;\n this.imageConf.new = file;\n const reader: FileReader = new FileReader();\n reader.onload = () => {\n this.previewImage = reader.result;\n };\n reader.readAsDataURL(file);\n this.onChange(this.imageConf);\n }\n\n private removeImage(): void {\n this.fileInput.nativeElement.value = null;\n this.imageConf.new = null;\n this.imageConf.current = null;\n this.previewImage = null;\n this.onChange(this.imageConf);\n this.change.emit(this.imageConf);\n }\n\n private getFileExtension(file: File): string {\n const parts: string[] = file.name.split('.');\n\n return parts[parts.length - 1];\n }\n\n private onError(errorCode: number, extra: any): void {\n this.errorCode = errorCode;\n if (this.textInput) {\n this.textInput.nativeElement.blur();\n }\n this.imageFormControl.updateValueAndValidity();\n }\n}\n\nexport interface ImageData {\n current: string;\n // on peut pas explicitement mettre un type File parce que\n // sinon on peut pas attribuer cette valeur � un model\n // dont le champs file est d�clar� en type string\n // new: File;\n new: any;\n}\n","
\n
\n \n \n \n
\n
\n \n
\n
\n","import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'main-action',\n providers: [],\n styleUrls: ['./main-action.scss'],\n templateUrl: './main-action.html'\n})\nexport class MainActionComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public displayMode: string = 'fab';\n @Input() public isLoading: boolean = false;\n @Input() public title: string = '';\n @Input() public icon: string = null;\n @Input() public disabled: boolean = false;\n @Output() public onAction: EventEmitter = new EventEmitter();\n @Input() public link: string = null;\n @Input() public right: number = 32;\n @Input() public bottom: number = 16;\n @Input() public color: string = 'accent';\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _router: Router,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onClicked(): void {\n if (this.link) {\n this._router.navigateByUrl(this.link);\n }\n\n this.onAction.emit();\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","\n \n \n
\n \n \n \n \n
\n \n \n
\n \n \n \n {{ 'The_first_name_required' | translate }}\n \n \n \n {{ 'The_last_name_required' | translate }}\n \n \n \n {{ 'Email_invalid' | translate }}\n {{ 'Email_unavailable' | translate }}\n \n \n \n {{ 'International_phone_number_hint' | translate }}\n {{ 'Account_phone_hint' | translate }}\n {{ phoneFormControl.value.length }}\n /{{ investorProvider.COMPANY_NAME_MAX_LENGTH }}\n \n \n \n \n \n
\n
\n \n \n \n
\n \n \n
\n
\n\n","import { AfterViewInit, ChangeDetectorRef, Component, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { FormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Title } from '@angular/platform-browser';\nimport { Conf } from '../../../_conf';\nimport { Utils } from '../../../_common/providers/utils';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { UsersProvider } from '../../providers/users-provider';\nimport { LangsProvider } from '../../../_common/providers/langs-provider';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { UsersChangePasswordDialogComponent } from '../../components/change-password-dialog/change-password-dialog';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { MenuItem } from '../../../_common/components/side-menu/side-menu';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport {\n InvestorsEditInvestorProfileComponent\n} from '../../../investors/components/edit-investor-profile/edit-investor-profile';\nimport { InvestorsProvider } from '../../../investors/providers/investors-provider';\nimport { InvestorRights } from '../../../investors/providers/investor-rights';\nimport { UserRights } from '../../providers/user-rights';\nimport {\n DevelopmentPhaseOfInterest,\n InvestorProfile,\n InvestorValidationState,\n Lang,\n TherapeuticAreaOfInterest,\n User\n} from '../../../_common/providers/models';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'users-edit-page',\n providers: [],\n styleUrls: ['./edit.scss'],\n templateUrl: './edit.html'\n})\nexport class UsersEditPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n public DESCRIPTION_MAX_LENGTH: number = 5000;\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public moreMenus: any[] = [];\n public hierarchy: any[] = [];\n public isLoading: boolean = true;\n public isError404: boolean = false;\n public isFromModerators: boolean = false;\n\n public backMenu: MenuItem = null;\n public backUrl: string = null;\n public backTitle: string = this._translater.instant('Back');\n\n public firstNameFormControl: FormControl = new FormControl('', [\n Validators.required\n ]);\n public lastNameFormControl: FormControl = new FormControl('', [\n Validators.required\n ]);\n public phoneFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.maxLength(this.investorProvider.COMPANY_CONTACT_PHONE_MAX_LENGTH),\n Validators.pattern(this._utils.INTERNATIONAL_PHONE_NUMBER_REGEX)\n ]);\n public langFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.min(1)\n ]);\n public introFormControl: FormControl = new FormControl('');\n public emailUnavailableError: boolean = false;\n public emailFormControl: FormControl = new FormControl('', [\n Validators.email,\n // doc : https://blog.thoughtram.io/angular/2016/03/14/custom-validators-in-angular-2.html#building-a-custom-validator\n (control: any) => {\n return this.emailUnavailableError ? {unavailable: {valid: false}} : null;\n }\n ]);\n public userLinkFormControls: FormControl[] = [];\n\n public user: User = new User();\n public avatarImage: any = {};\n public langs: Lang[] = [];\n public userLinksData: any[] = [];\n public investorProfile: InvestorProfile = null;\n public therapeuticAreaIdsOfInterest: number[] = [];\n public developmentPhaseIdsOfInterest: number[] = [];\n\n public investorRights: InvestorRights = new InvestorRights(this._utils);\n public userRights: UserRights = new UserRights(this._utils);\n\n @ViewChild(InvestorsEditInvestorProfileComponent, {static: false}) public investorForm: InvestorsEditInvestorProfileComponent;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n public investorProvider: InvestorsProvider,\n private _utils: Utils,\n private _title: Title,\n private _router: Router,\n private _route: ActivatedRoute,\n private _users: UsersProvider,\n private _langs: LangsProvider,\n private _storage: ModelsStorage,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _changesGuard: HasPendingChangesGuard,\n private _changeDetector: ChangeDetectorRef,\n private _dialoger: MatDialog\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this._route.params.subscribe((params) => {\n this.initPage();\n });\n this._route.queryParams.subscribe((params: any) => {\n if (params.backUrl) {\n this.backUrl = params.backUrl;\n if (params.backTitle) {\n this.backTitle = params.backTitle;\n }\n this.backMenu = {\n icon: 'arrow_back',\n title: this.backTitle,\n url: this.backUrl\n };\n this._changeDetector.detectChanges();\n }\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n\n public canSave() {\n if (this.investorForm) {\n return this.isAddressValid() &&\n this.investorForm.therapeuticAreaFormControl.valid &&\n this.investorForm.developmentPhaseFormControl.valid;\n }\n return this.isAddressValid();\n }\n\n public validateFields(): void {\n this.phoneFormControl.markAsTouched();\n this.firstNameFormControl.markAsTouched();\n this.lastNameFormControl.markAsTouched();\n this.emailFormControl.markAsTouched();\n this.investorForm.therapeuticAreaFormControl.markAsTouched();\n this.investorForm.developmentPhaseFormControl.markAsTouched();\n }\n\n public onSaveClicked(): void {\n\n if (this.currentUser.user.isInvestor) {\n this.validateFields();\n\n if (!this.canSave()) {\n this._toaster.open(this._translater.instant('Field_validation_failure'), '', {duration: 5000});\n return;\n }\n }\n\n this.isLoading = true;\n this.save()\n .then((result) => {\n this.user = result[0];\n this.isLoading = false;\n this._changesGuard.unregisterChanges();\n\n if (this.currentUser.user.id === this.user.id\n && (this.currentUser.user.avatar !== this.user.avatar\n || this.currentUser.user.langId !== this.user.langId)) {\n window.location.href = this._route.snapshot.url.join('/') + '?' + this._utils.randomString(8);\n } else {\n this._toaster.open(this._translater.instant('User_saved'), '', {duration: 5000});\n this.initNav();\n if (this.currentUser.user.isInvestor &&\n this.investorProfile.investorValidationStateId === InvestorValidationState.ID_PENDING) {\n this._router.navigate(['/welcome']);\n }\n }\n })\n .catch((error) => this.onError(error));\n }\n\n public onFormChange(): void {\n this._changesGuard.registerChanges();\n }\n\n public onEmailChange(): void {\n this._changesGuard.registerChanges();\n this.emailUnavailableError = false;\n this.emailFormControl.updateValueAndValidity();\n }\n\n public onAvatarImageChange(): void {\n this._changesGuard.registerChanges();\n }\n\n public onIntroChange(): void {\n this._changesGuard.registerChanges();\n if (this.user.intro && this.user.intro.length > this.DESCRIPTION_MAX_LENGTH) {\n this.user.intro = this.user.intro.substr(0, this.DESCRIPTION_MAX_LENGTH);\n }\n }\n\n public onLangChange(): void {\n this._changesGuard.registerChanges();\n }\n\n public onUserLinksChanged(): void {\n this._changesGuard.registerChanges();\n }\n\n public onChangePasswordClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(UsersChangePasswordDialogComponent, {\n data: {\n user: this.user\n }\n });\n }\n\n public onDeleteClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_user'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n this.isLoading = true;\n this._users.deleteUser(this.user)\n .then(() => {\n this.isLoading = false;\n this._router.navigate(['/']);\n this._toaster.open(this._translater.instant('User_deleted'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n public isFormValid(): boolean {\n if (this.firstNameFormControl.invalid\n || this.lastNameFormControl.invalid\n || this.emailFormControl.invalid\n ) {\n return false;\n }\n\n for (let i = 0; i < this.userLinkFormControls.length; i++) {\n if (this.userLinkFormControls[i].invalid) {\n return false;\n }\n }\n\n if (this.investorForm) {\n if (!this.investorForm.canSave() || this.phoneFormControl.invalid) {\n return false;\n }\n }\n\n return true;\n }\n\n //\n private isAddressValid(): boolean {\n return this.phoneFormControl.valid &&\n this.emailFormControl.valid &&\n this.firstNameFormControl.valid &&\n this.lastNameFormControl.valid;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private initPage(): void {\n this.loadData()\n .then(() => {\n this.initForms();\n this.initNav();\n this.isLoading = false;\n this._changeDetector.detectChanges();\n })\n .catch((error) => this.onError(error));\n this._changeDetector.detectChanges();\n }\n\n private initNav(): void {\n const userName: string = this.user.firstName + ' ' + this.user.lastName;\n this._title.setTitle(userName + ' | ' + this.conf.platformName);\n this.moreMenus = [\n {\n name: 'Change_password', link: '.', click: () => {\n this.onChangePasswordClicked();\n }\n }\n ];\n this.navigation.updateMenus();\n }\n\n private initForms(): void {\n this.firstNameFormControl.setValue(this.user.firstName);\n this.lastNameFormControl.setValue(this.user.lastName);\n this.emailFormControl.setValue(this.user.email);\n this.introFormControl.setValue(this.user.intro);\n this.langFormControl.setValue(this.user.langId);\n\n if (this.user.isInvestor) {\n this.phoneFormControl.setValue(this.investorProfile.phone || '');\n }\n\n if (this.userRights.EDIT) {\n this.firstNameFormControl.enable();\n this.lastNameFormControl.enable();\n this.emailFormControl.enable();\n this.phoneFormControl.enable();\n this.introFormControl.enable();\n this.langFormControl.enable();\n } else {\n this.firstNameFormControl.disable();\n this.lastNameFormControl.disable();\n this.emailFormControl.disable();\n this.phoneFormControl.disable();\n this.introFormControl.disable();\n this.langFormControl.disable();\n }\n\n this.userLinkFormControls = [];\n for (let i = 0; i < this.userLinksData.length; i++) {\n const control: FormControl = new FormControl('', [\n (control: any) => {\n if (!control.value || !this.userLinksData[i].userLink.matchWith) {\n return null;\n }\n\n return control.value.startsWith(this.userLinksData[i].userLink.matchWith) ? null : {wrongLink: {valid: false}};\n }\n ]);\n if (!this.userRights.EDIT) {\n control.disable();\n }\n this.userLinkFormControls.push(control);\n }\n }\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n this.langs = this._langs.getLangs();\n const userId: number = this.parseUrl();\n if (userId) {\n const promises: Promise[] = [\n /* 0 */ this._storage.fromId(User, [userId]),\n /* 1 */ this._users.getUserUserLinksData(userId)\n ];\n\n Promise.all(promises)\n .then((results) => {\n if (results[0]) {\n this.user = results[0];\n this.avatarImage = {current: this.user.avatar, new: null};\n this.userLinksData = results[1];\n\n if (this.user.isInvestor) {\n this._storage.select(InvestorProfile).where('userId').equals(this.user.id).get(1)\n .then((investorProfile: InvestorProfile) => {\n this.investorProfile = investorProfile;\n this.investorProfile.investmentRangeFrom = this.investorProfile.investmentRangeFrom ? this.investorProfile.investmentRangeFrom / 100 : this.investorProfile.investmentRangeFrom;\n this.investorProfile.investmentRangeTo = this.investorProfile.investmentRangeTo ? this.investorProfile.investmentRangeTo / 100 : this.investorProfile.investmentRangeTo;\n Promise.all([\n this._storage.select(TherapeuticAreaOfInterest).where('investorProfileId').equals(this.investorProfile.id).get(),\n this._storage.select(DevelopmentPhaseOfInterest).where('investorProfileId').equals(this.investorProfile.id).get()\n ])\n .then((data: any[]) => {\n this.therapeuticAreaIdsOfInterest = this._utils.getKeyValues(data[0], 'therapeuticAreaId');\n this.developmentPhaseIdsOfInterest = this._utils.getKeyValues(data[1], 'developmentPhaseId');\n\n this.investorRights.evaluate({\n user: this.currentUser.user,\n investorProfile: this.investorProfile\n });\n this.userRights.evaluate({\n user: this.currentUser.user,\n subjectUser: this.user\n });\n\n resolve();\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n } else {\n this.userRights.evaluate({\n user: this.currentUser.user,\n subjectUser: this.user\n });\n\n resolve();\n }\n } else {\n reject({status: 404});\n }\n })\n .catch((error) => this.onError(error));\n } else {\n reject({status: 404});\n }\n });\n }\n\n private parseUrl(): number {\n let userId: number = 0;\n this.isFromModerators = false;\n const param1: any = this._route.snapshot.url[1].path;\n if (param1 === 'moderators') {\n userId = parseInt(this._route.snapshot.url[2].path, 10);\n this.isFromModerators = true;\n } else {\n userId = parseInt(param1, 10);\n }\n\n return userId;\n }\n\n private save(): Promise {\n // on est obligé de cloner parce que sinon l'image qui est bindée\n // va devenir un fichier au lieu d'une url dans la barre de navigation\n const user: User = this.user.clone();\n if (this.avatarImage.new) {\n user.avatar = this.avatarImage.new;\n } else if (!this.avatarImage.current) {\n user.avatar = null;\n }\n user.firstName = this.firstNameFormControl.value;\n user.lastName = this.lastNameFormControl.value;\n user.email = this.emailFormControl.value;\n user.intro = this.introFormControl.value;\n user.langId = this.langFormControl.value;\n\n const promises: Promise[] = [\n this._users.saveUser(user)\n ];\n\n if (this.user.isInvestor && (this.investorRights.EDIT || this.currentUser.user.isAdmin)) {\n const profile: InvestorProfile = this.investorProfile.clone();\n profile.phone = this.phoneFormControl.value;\n profile.investmentRangeFrom = profile.investmentRangeFrom ? profile.investmentRangeFrom * 100 : profile.investmentRangeFrom;\n profile.investmentRangeTo = profile.investmentRangeTo ? profile.investmentRangeTo * 100 : profile.investmentRangeTo;\n promises.push(this.investorProvider.saveInvestorProfile(profile));\n promises.push(this.investorProvider.saveTherapeuticAreaOfInterests(this.investorProfile.id, this.therapeuticAreaIdsOfInterest));\n promises.push(this.investorProvider.saveDevelopmentPhaseOfInterests(this.investorProfile.id, this.developmentPhaseIdsOfInterest));\n }\n\n return Promise.all(promises);\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n if (error.status === 422) {\n if (error.error.errors['email']) {\n this.emailUnavailableError = true;\n this.emailFormControl.updateValueAndValidity();\n } else {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n } else if (error.status === 404) {\n this._router.navigate(['404']);\n } else {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n }\n\n}\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../providers/current-user';\nimport { SyncServiceProvider } from '../../providers/sync-service';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'logout-page',\n providers: [],\n styleUrls: ['./logout.scss'],\n templateUrl: './logout.html'\n})\nexport class LogoutPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _changeDetector: ChangeDetectorRef,\n private _router: Router,\n private _translater: TranslateService,\n private _currentUser: CurrentUser,\n private _sync: SyncServiceProvider\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this._currentUser.logout()\n .then(() => {\n this._sync.restart()\n .then(() => this._router.navigate(['']))\n .catch((error: any) => this.onError(error));\n })\n .catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","","import { Utils } from '../../_common/providers/utils';\nimport {\n InvestorProfile,\n InvestorValidationState,\n Project,\n ProjectMembership,\n ProjectValidationState,\n User,\n User_AcademicInstitution\n} from '../../_common/providers/models';\n\nexport class ProjectRights {\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _utils: Utils;\n private _params: ProjectRightsParams = null;\n private _listProjects: boolean = false;\n private _listProjectMemberships: boolean = false;\n private _addProjectMembership: boolean = false;\n private _deleteProjectMembership: boolean = false;\n private _see: boolean = false;\n private _edit: boolean = false;\n private _delete: boolean = false;\n private _seeEditForm: boolean = false;\n private _addToFavorites: boolean = false;\n private _addAlerts: boolean = false;\n private _askForReview: boolean = false;\n private _validate: boolean = false;\n private _seeTTOInformation: boolean = false;\n private _seeMetasInforomation: boolean = false;\n private _editAcademicInstitution1: boolean = false;\n private _seeDashboard: boolean = false;\n\n constructor(\n utils: Utils\n ) {\n this._utils = utils;\n }\n\n public get LIST_PROJECTS() {\n return this._listProjects;\n }\n\n public get LIST_PROJECT_MEMBERSHIPS() {\n return this._listProjectMemberships;\n }\n\n public get ADD_PROJECT_MEMBERSHIP() {\n return this._addProjectMembership;\n }\n\n public get DELETE_PROJECT_MEMBERSHIP() {\n return this._deleteProjectMembership;\n }\n\n public get SEE() {\n return this._see;\n }\n\n public get EDIT() {\n return this._edit;\n }\n\n public get DELETE() {\n return this._delete;\n }\n\n public get SEE_EDIT_FORM() {\n return this._seeEditForm;\n }\n\n public get ADD_TO_FAVORITES() {\n return this._addToFavorites;\n }\n\n public get ADD_ALERTS() {\n return this._addAlerts;\n }\n\n public get ASK_FOR_REVIEW() {\n return this._askForReview;\n }\n\n public get VALIDATE() {\n return this._validate;\n }\n\n public get SEE_TTO_INFORMATION() {\n return this._seeTTOInformation;\n }\n\n public get SEE_METAS_INFORMATION() {\n return this._seeMetasInforomation;\n }\n\n public get EDIT_ACADEMIC_INSTITUTION_1() {\n return this._editAcademicInstitution1;\n }\n\n public get SEE_DASHBOARD() {\n return this._seeDashboard;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n public evaluate(params: ProjectRightsParams): void {\n this._params = params;\n\n if (params.user.isAdmin) {\n this.evaluateAdmin();\n } else if (params.user.isInvestor) {\n this.evaluateInvestor();\n } else if (params.user.isGuest) {\n this.evaluateGuest();\n } else if (params.user.isProjectHolder) {\n this.evaluateProjectHolder();\n } else if (params.user.isLocalExpert) {\n this.evaluateLocalExpert();\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private evaluateAdmin(): void {\n this._listProjects = true;\n this._see = true;\n this._edit = true;\n this._editAcademicInstitution1 = true;\n this._delete = true;\n this._seeEditForm = true;\n this._addToFavorites = false;\n this._addAlerts = false;\n this._askForReview = false;\n this._listProjectMemberships = true;\n this._addProjectMembership = false;\n this._deleteProjectMembership = false;\n this._seeTTOInformation = true;\n this._seeMetasInforomation = true;\n this._seeDashboard = false;\n if (this._params.project && this._params.project.projectValidationStateId === ProjectValidationState.ID_PENDING_VALIDATION) {\n this._validate = true;\n } else {\n this._validate = false;\n }\n }\n\n private evaluateGuest(): void {\n this._listProjects = true;\n this._see = true;\n this._edit = false;\n this._editAcademicInstitution1 = false;\n this._delete = false;\n this._seeEditForm = false;\n this._addToFavorites = true;\n this._addAlerts = true;\n this._askForReview = false;\n this._validate = false;\n this._listProjectMemberships = false;\n this._addProjectMembership = false;\n this._deleteProjectMembership = false;\n this._seeTTOInformation = false;\n this._seeMetasInforomation = false;\n this._seeDashboard = false;\n }\n\n private evaluateInvestor(): void {\n if (this._params.investorProfile && this._params.investorProfile.investorValidationStateId === InvestorValidationState.ID_ACCEPTED) {\n this.evaluateGuest(); // un investisseur validé est exactement comme un guest\n return;\n }\n\n // s'il n'est pas validé, il peut rien faire...\n this._listProjects = false;\n this._see = false;\n this._edit = false;\n this._editAcademicInstitution1 = false;\n this._delete = false;\n this._seeEditForm = false;\n this._addToFavorites = false;\n this._addAlerts = false;\n this._askForReview = false;\n this._validate = false;\n this._listProjectMemberships = false;\n this._addProjectMembership = false;\n this._deleteProjectMembership = false;\n this._seeTTOInformation = false;\n this._seeMetasInforomation = false;\n this._seeDashboard = false;\n }\n\n private evaluateProjectHolder(): void {\n this._listProjects = false;\n this._addToFavorites = false;\n this._addAlerts = false;\n this._validate = false;\n this._seeTTOInformation = false;\n this._seeMetasInforomation = false;\n\n if (this._params.membership) {\n this._see = true;\n this._seeEditForm = true;\n this._seeDashboard = true;\n this._listProjectMemberships = true;\n this._addProjectMembership = true;\n this._deleteProjectMembership = true;\n this._delete = true;\n // si le projet est en cours de validation ou refusé, on peut plus le toucher\n if ([ProjectValidationState.ID_PENDING_VALIDATION, ProjectValidationState.ID_REFUSED].indexOf(this._params.project.projectValidationStateId) >= 0) {\n this._edit = false;\n } else {\n this._edit = true;\n }\n\n if (this._params.project && this._params.project.projectValidationStateId === ProjectValidationState.ID_DRAFT) {\n this._askForReview = true;\n this._editAcademicInstitution1 = true;\n } else {\n this._askForReview = false;\n this._editAcademicInstitution1 = false;\n }\n } else {\n this._see = false;\n this._seeEditForm = false;\n this._seeDashboard = false;\n this._edit = false;\n this._delete = false;\n this._askForReview = false;\n this._editAcademicInstitution1 = false;\n this._listProjectMemberships = false;\n this._addProjectMembership = false;\n this._deleteProjectMembership = false;\n this._delete = false;\n }\n }\n\n private evaluateLocalExpert(): void {\n this._listProjects = true;\n this._see = true;\n this._editAcademicInstitution1 = false;\n this._addToFavorites = false;\n this._addAlerts = false;\n this._askForReview = false;\n this._listProjectMemberships = false;\n this._addProjectMembership = false;\n this._deleteProjectMembership = false;\n this._seeDashboard = false;\n\n if (this._params.project\n && this._params.user_academicInstitutions\n && this._utils.findIn(this._params.project.academicInstitution1Id, this._params.user_academicInstitutions, 'academicInstitutionId')) {\n this._edit = true;\n this._delete = true;\n this._seeEditForm = true;\n this._seeTTOInformation = true;\n this._seeMetasInforomation = true;\n\n if (this._params.project.projectValidationStateId === ProjectValidationState.ID_PENDING_VALIDATION) {\n this._validate = true;\n\n } else {\n this._validate = false;\n }\n } else {\n this._validate = false;\n this._edit = false;\n this._delete = false;\n this._seeEditForm = false;\n this._seeTTOInformation = false;\n this._seeMetasInforomation = false;\n }\n }\n}\n\nexport interface ProjectRightsParams {\n user: User;\n project?: Project;\n membership?: ProjectMembership;\n investorProfile?: InvestorProfile;\n user_academicInstitutions?: User_AcademicInstitution[];\n}\n","import { Injectable } from '@angular/core';\nimport { Utils } from '../../_common/providers/utils';\nimport { Conf } from '../../_conf';\nimport { ApiBaseService } from '../../_common/providers/api-base-service';\nimport { ModelsStorage } from '../../_common/providers/models-storage';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { ImageData } from '../../_common/components/input-image/input-image';\n\nimport { File } from '../../_common/providers/models';\n\n@Injectable()\nexport class FilesProvider {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _utils: Utils,\n private _api: ApiBaseService,\n private _storage: ModelsStorage,\n private _currentUser: CurrentUser\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public downloadFile(api: string, file: File = null, options: any = null): Promise {\n if (!options) {\n options = {};\n }\n const params: any = {};\n if (options.noCache) {\n params.noCache = (new Date()).getTime();\n }\n\n const downloadApi: string = file ? api + '/' + file.id : api;\n return new Promise((resolve, reject) => {\n this._api.call(\n 'get',\n downloadApi,\n params,\n {\n accessToken: this._currentUser.getAccessToken(),\n resultType: 'file'\n }\n )\n .then((data: any) => {\n resolve(data);\n })\n .catch((error) => reject(error));\n });\n }\n\n public initPreviewImage(callback: any, imageData: ImageData, downloadApi: string): Promise {\n return new Promise((resolve, reject) => {\n if (!imageData.current) {\n resolve();\n return;\n }\n\n this.downloadFile(downloadApi, null, {noCache: true})\n .then((fileData: any) => {\n // tiré de : https://stackoverflow.com/questions/45530752/getting-image-from-api-in-angular-4\n const reader: FileReader = new FileReader();\n reader.addEventListener('load', () => callback(reader.result), false);\n reader.readAsDataURL(fileData);\n resolve();\n })\n .catch((error) => reject(error));\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","\n
\n \n \n \n \n \n {{ institution.name }}\n \n \n \n \n \n \n \n {{ 'Invalid_value' | translate }}\n {{ customAcademicInstitutionFormControl.value?.length }}\n /{{ CUSTOM_INSTITUTION_MAX_LENGTH }}\n \n \n \n \n \n {{ institution.name }}\n \n \n \n \n \n \n {{ 'Invalid_value' | translate }}\n {{ customAcademicInstitutionFormControl.value?.length }}\n /{{ CUSTOM_INSTITUTION_MAX_LENGTH }}\n \n
\n

\n {{ 'Academic_link_notice' | translateCut:{index: 0} }}\n {{ 'Academic_link_notice' | translateCut:{index: 1} }}\n {{ 'Academic_link_notice' | translateCut:{index: 2} }}\n

\n
\n \n {{ 'My_company_owns_a_license_from_institution' | translate }}\n \n
\n
\n \n {{ 'I_confirm_TTO_stuff' | translate }}\n \n \n \n {{ 'Invalid_value' | translate }}\n {{ ttoContactFormControl.value?.length }}\n /{{ CUSTOM_INSTITUTION_MAX_LENGTH }}\n \n
\n
\n","import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Conf } from '../../../_conf';\nimport { AcademicInstitutionGroupWithInstitution, ProjectsProvider } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { AcademicInstitution, AcademicInstitutionGroup, Project } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-edit-project-academic',\n providers: [],\n styleUrls: ['./edit-project-academic.scss'],\n templateUrl: './edit-project-academic.html'\n})\nexport class ProjectsEditProjectAcademicComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly CUSTOM_INSTITUTION_MAX_LENGTH: number = 250;\n public readonly INSTITUTION_OTHER: number = AcademicInstitution.ID_OTHER;\n public readonly EXCLUDED_INSTITUTION1_GROUP_IDS: number[] = [AcademicInstitutionGroup.ID_OTHER];\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n public academicInstitution1FormControl: FormControl = new FormControl('', [\n Validators.min(1)\n ]);\n public academicInstitution2FormControl: FormControl = new FormControl('', [\n Validators.min(1)\n ]);\n public customAcademicInstitutionFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.CUSTOM_INSTITUTION_MAX_LENGTH)\n ]);\n public isTTOAgreementAccepted: boolean = false;\n public isInstitutionLicenseOwned: boolean = false;\n public ttoContactFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.CUSTOM_INSTITUTION_MAX_LENGTH)\n ]);\n @Output() public projectChange: EventEmitter = new EventEmitter();\n @Output() onFormChanged: EventEmitter = new EventEmitter();\n public academicInstitionGroups: AcademicInstitutionGroupWithInstitution[] = [];\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n private _project: Project = new Project();\n\n public get project() {\n return this._project;\n }\n\n @Input()\n public set project(project: Project) {\n this._project = project;\n this.academicInstitution1FormControl.setValue(project.academicInstitution1Id);\n this.academicInstitution2FormControl.setValue(project.academicInstitution2Id);\n this.customAcademicInstitutionFormControl.setValue(project.customAcademicInstitution ? project.customAcademicInstitution : '');\n this.isTTOAgreementAccepted = project.isTTOAgreementAccepted ? true : false;\n this.isInstitutionLicenseOwned = project.isInstitutionLicenseOwned ? true : false;\n this.ttoContactFormControl.setValue(project.TTOContact ? project.TTOContact : '');\n\n this.manageAcademicInstitutionStuff(); // doit être appelé après avoir initialiser les données !!!\n this.updateRights();\n }\n\n private _rights: ProjectRights = new ProjectRights(this._utils);\n\n public get rights() {\n return this._rights;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set rights(rights: ProjectRights) {\n this._rights = rights;\n this.updateRights();\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.loadStaticData().catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public canSave(): boolean {\n return !this.academicInstitution1FormControl.invalid\n && !this.academicInstitution2FormControl.invalid\n && !this.customAcademicInstitutionFormControl.invalid\n && !this.customAcademicInstitutionFormControl.invalid;\n }\n\n public onAcademicInstitutionChanged(): void {\n this.manageAcademicInstitutionStuff();\n this._onFormChanged();\n }\n\n public _onFormChanged(): void {\n this.fireChange();\n this._changesGuard.registerChanges();\n this.onFormChanged.emit();\n }\n\n public onIsInstitutionLicenseOwnedChanged(): void {\n this.isTTOAgreementAccepted = false;\n this._onFormChanged();\n }\n\n public onIsTTOAgreementAcceptedChanged(): void {\n this.isInstitutionLicenseOwned = false;\n this._onFormChanged();\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadStaticData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._projectsProvider.getAcademicInstitionGroups()\n ])\n .then((data: any[]) => {\n this.academicInstitionGroups = data[0];\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private updateRights(): void {\n if (this.rights.EDIT) {\n this.academicInstitution2FormControl.enable();\n this.customAcademicInstitutionFormControl.enable();\n this.ttoContactFormControl.enable();\n } else {\n this.academicInstitution2FormControl.disable();\n this.customAcademicInstitutionFormControl.disable();\n this.ttoContactFormControl.disable();\n }\n if (this.rights.EDIT_ACADEMIC_INSTITUTION_1) {\n this.academicInstitution1FormControl.enable();\n } else {\n this.academicInstitution1FormControl.disable();\n }\n }\n\n private manageAcademicInstitutionStuff(): void {\n if (this.academicInstitution1FormControl.value != AcademicInstitution.ID_OTHER\n && this.academicInstitution2FormControl.value != AcademicInstitution.ID_OTHER) {\n this.customAcademicInstitutionFormControl.setValue('');\n }\n this.fireChange();\n }\n\n private fireChange(): void {\n this._project.academicInstitution1Id = this.academicInstitution1FormControl.value;\n this._project.academicInstitution2Id = this.academicInstitution2FormControl.value;\n this._project.customAcademicInstitution = this.customAcademicInstitutionFormControl.value;\n this._project.isTTOAgreementAccepted = this.isTTOAgreementAccepted ? 1 : 0;\n this._project.isInstitutionLicenseOwned = this.isInstitutionLicenseOwned ? 1 : 0;\n this._project.TTOContact = this.ttoContactFormControl.value;\n\n if (this._project.academicInstitution1Id !== AcademicInstitution.ID_OTHER && this._project.academicInstitution2Id !== AcademicInstitution.ID_OTHER) {\n this._project.customAcademicInstitution = null;\n }\n\n this.projectChange.emit(this._project);\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n","import { AfterViewInit, Component, EventEmitter, forwardRef, HostListener, Input, Output } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\n\nexport const TRUE_FALSE_RADIO_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TrueFalseRadioComponent),\n multi: true\n};\n\n// doc pour le ngModel : http://almerosteyn.com/2016/04/linkup-custom-control-to-ngcontrol-ngmodel\n\n@Component({\n selector: 'true-false-radio',\n providers: [TRUE_FALSE_RADIO_VALUE_ACCESSOR],\n styleUrls: ['./true-false-radio.scss'],\n templateUrl: './true-false-radio.html'\n})\nexport class TrueFalseRadioComponent implements AfterViewInit, ControlValueAccessor {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public label: string = '';\n @Input() public trueLabel: string = this._translater.instant('Yes');\n @Input() public falseLabel: string = this._translater.instant('No');\n @Input() public color: string = 'primary';\n @Input() public disabled: boolean = false;\n @Output() public valueChange: EventEmitter = new EventEmitter();\n @Output('change') public change: EventEmitter = new EventEmitter();\n\n private _value: boolean = false;\n\n constructor(\n private _translater: TranslateService,\n ) {\n }\n\n private _internalValue: boolean = false;\n\n public get internalValue() {\n return this._internalValue;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n public set internalValue(val: boolean) {\n this._internalValue = val;\n this._value = val;\n this.onChange(val);\n this.change.emit(val);\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n public writeValue(value: any): void {\n this._value = value;\n this._internalValue = value;\n }\n\n @HostListener('valChange')\n public onChange = (_: any) => {\n };\n\n public registerOnChange(fn: any) {\n this.onChange = fn;\n }\n\n public onTouched = () => {\n };\n\n public registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n public onBlur(): void {\n this.onTouched();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","
{{ label }}
\n\n \n {{ trueLabel }}\n \n \n {{ falseLabel }}\n \n\n","
{{ label }}
\n\n \n {{ projectTradeType.name }}\n \n\n","import { AfterViewInit, Component, EventEmitter, forwardRef, HostListener, Input, Output } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ProjectTradeType } from '../../providers/models';\nimport { ModelsStorage } from '../../providers/models-storage';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nexport const PUBLIC_PRIVATE_RADIO_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PublicPrivateRadioComponent),\n multi: true\n};\n\n@Component({\n selector: 'public-private-radio',\n providers: [PUBLIC_PRIVATE_RADIO_VALUE_ACCESSOR],\n styleUrls: ['./public-private-radio.scss'],\n templateUrl: './public-private-radio.html'\n})\nexport class PublicPrivateRadioComponent implements AfterViewInit, ControlValueAccessor {\n\n @Input() public label: string = '';\n @Input() public color: string = 'primary';\n @Input() public disabled: boolean = false;\n @Output() public valueChange: EventEmitter = new EventEmitter();\n @Output('change') public change: EventEmitter = new EventEmitter();\n\n public projectTradeTypes: ProjectTradeType[] = [];\n\n constructor(\n private _translater: TranslateService,\n private _storage: ModelsStorage,\n private _toaster: MatSnackBar,\n ) {\n }\n\n private _internalValue: number = null;\n\n public get internalValue() {\n return this._internalValue;\n }\n\n public set internalValue(val: number) {\n this._internalValue = val;\n this.onChange(val);\n this.change.emit(val);\n }\n\n public ngAfterViewInit() {\n this.loadStaticData().catch((error: any) => this.onError(error));\n }\n\n public writeValue(value: any): void {\n this._internalValue = value;\n }\n\n @HostListener('valChange')\n public onChange = (_: any) => {\n };\n\n public registerOnChange(fn: any) {\n this.onChange = fn;\n }\n\n public onTouched = () => {\n };\n\n public registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n public onBlur(): void {\n this.onTouched();\n }\n\n private async loadStaticData(): Promise {\n try {\n this.projectTradeTypes = await this._storage.select(ProjectTradeType).get();\n } catch (e) {\n this.onError(e);\n }\n }\n\n private onError(error: any): void {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n","\n \n
\n \n \n \n \n {{ 'Invalid_value' | translate }}\n \n
\n
\n \n \n
\n
\n\n
\n \n \n \n \n \n {{ item.name }}\n \n \n {{ 'None' | translate }}\n \n \n \n \n \n {{ 'Invalid_value' | translate }}\n {{ customFundingRoundFormControl.value.length }}\n /{{ CUSTOM_FUNDING_ROUND_MAX_LENGTH }}\n \n \n \n \n \n \n \n \n \n CHF \n {{ 'Invalid_value' | translate }}\n \n \n \n \n \n \n \n
\n
\n \n \n
\n
\n","import * as _moment from 'moment';\nimport { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { DateAdapter } from '@angular/material/core';\nimport { Conf } from '../../../_conf';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { LangsProvider } from '../../../_common/providers/langs-provider';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { AcademicInstitution, FundingRound, Project } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-edit-project-situation',\n providers: [],\n styleUrls: ['./edit-project-situation.scss'],\n templateUrl: './edit-project-situation.html'\n})\nexport class ProjectsEditProjectSituationComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly FUNDING_ROUND_OTHER: number = FundingRound.ID_OTHER;\n public readonly CUSTOM_FUNDING_ROUND_MAX_LENGTH: number = 250;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public isNotForProfit: number = null;\n public isIncorporated: boolean = false;\n public incorporationYearFormControl: FormControl = new FormControl('', [\n (control: any) => {\n if (control.value && control.value != '') {\n return control.value >= (this.isIncorporated ? 1900 : (new Date()).getFullYear()) ? null : {min: {valid: false}};\n }\n\n return null;\n },\n (control: any) => {\n if (control.value && control.value != '') {\n return control.value <= (this.isIncorporated ? (new Date()).getFullYear() : 2050) ? null : {max: {valid: false}};\n }\n\n return null;\n },\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public isRaisingFunds: boolean = null;\n public isLeadInvestorIdentified: boolean = null;\n public projectTradeType: number = null;\n public projectTradeTypeFormControl: FormControl = new FormControl('', []);\n public fundingRoundFormControl: FormControl = new FormControl('', [\n Validators.min(1)\n ]);\n public customFundingRoundFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.CUSTOM_FUNDING_ROUND_MAX_LENGTH)\n ]);\n public fundingAmountFormControl: FormControl = new FormControl('', [\n Validators.min(0),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public closingRoundDateFormControl: FormControl = new FormControl('', []);\n public closingRoundMinDate: Date = new Date('1900-01-01 00:00:00');\n public closingRoundMaxDate: Date = new Date('2050-12-31 23:59:59');\n @Output() public projectChange: EventEmitter = new EventEmitter();\n @Input() public rights: ProjectRights = new ProjectRights(this._utils);\n @Output() onFormChanged: EventEmitter = new EventEmitter();\n public fundingRounds: FundingRound[] = [];\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router,\n private _langsProvider: LangsProvider,\n private _dateAdapter: DateAdapter\n ) {\n const lang: any = this._utils.findIn(this._langsProvider.getBestLangId(), this.conf.availableLangs, 'id');\n this._dateAdapter.setLocale(lang.dateLocale);\n }\n\n private _project: Project = new Project();\n\n public get project() {\n return this._project;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set project(project: Project) {\n this._project = project;\n this.isNotForProfit = project.isNotForProfit;\n this.isIncorporated = project.isCompanyIncorporated ? true : false;\n this.projectTradeType = project.projectTradeTypeId;\n this.projectTradeTypeFormControl.setValue(this.projectTradeType);\n this.incorporationYearFormControl.setValue(project.incorporationYear);\n this.isRaisingFunds = project.isRaisingFunds ? true : false;\n this.isLeadInvestorIdentified = project.isLeadInvestorIdentified ? true : false;\n this.fundingRoundFormControl.setValue(project.fundingRoundId);\n this.customFundingRoundFormControl.setValue(project.customFundingRound ? project.customFundingRound : '');\n this.fundingAmountFormControl.setValue(project.raisingFundsAmount);\n this.closingRoundDateFormControl.setValue(project.dateOfClosingRound);\n this.updateRights();\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.loadStaticData().catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public canSave(): boolean {\n return !this.incorporationYearFormControl.invalid\n && !this.fundingRoundFormControl.invalid\n && !this.customFundingRoundFormControl.invalid\n && !this.fundingAmountFormControl.invalid\n && !this.closingRoundDateFormControl.invalid\n && !this.projectTradeTypeFormControl.invalid;\n }\n\n public onIsIncorporatedChanged(): void {\n this.incorporationYearFormControl.setValue(this.incorporationYearFormControl.value); // pour réévaluer les conditions de validation ...\n this.incorporationYearFormControl.markAsTouched();\n this._onFormChanged();\n }\n\n public _onFormChanged(): void {\n this.fireChange();\n this._changesGuard.registerChanges();\n this.onFormChanged.emit();\n }\n\n public onProjectTradeTypeChanged(): void {\n this.projectTradeTypeFormControl.setValue(this.projectTradeType);\n this.projectTradeTypeFormControl.markAsTouched();\n this._onFormChanged();\n }\n\n public onfundingRoundNoneClicked(): void {\n this.fundingRoundFormControl.setValue(null);\n this._onFormChanged();\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadStaticData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(FundingRound).get(),\n ])\n .then((data: any[]) => {\n this.fundingRounds = data[0];\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private updateRights(): void {\n if (this.rights.EDIT) {\n this.incorporationYearFormControl.enable();\n this.fundingRoundFormControl.enable();\n this.fundingAmountFormControl.enable();\n this.customFundingRoundFormControl.enable();\n this.closingRoundDateFormControl.enable();\n this.projectTradeTypeFormControl.enable();\n } else {\n this.incorporationYearFormControl.disable();\n this.fundingRoundFormControl.disable();\n this.fundingAmountFormControl.disable();\n this.customFundingRoundFormControl.disable();\n this.closingRoundDateFormControl.disable();\n this.projectTradeTypeFormControl.disable();\n }\n }\n\n private fireChange(): void {\n this._project.isNotForProfit = this.isNotForProfit ? 1 : 0;\n this._project.isCompanyIncorporated = this.isIncorporated ? 1 : 0;\n this._project.incorporationYear = this.incorporationYearFormControl.value;\n this._project.isRaisingFunds = this.isRaisingFunds ? 1 : 0;\n this._project.isLeadInvestorIdentified = this.isLeadInvestorIdentified ? 1 : 0;\n this._project.fundingRoundId = this.fundingRoundFormControl.value;\n this._project.customFundingRound = this.customFundingRoundFormControl.value;\n this._project.raisingFundsAmount = this.fundingAmountFormControl.value;\n this._project.dateOfClosingRound = this.closingRoundDateFormControl.value && _moment(this.closingRoundDateFormControl.value).format('YYYY-MM-DD HH:mm:ss');\n // on empêche de saisir des données pas cohérentes - ca peut avoir un impact sur la recherche par la suite ...\n if (this._project.isCompanyIncorporated) {\n this._project.academicInstitution2Id = null;\n } else {\n this._project.isSpinOff = null;\n }\n if (this._project.academicInstitution1Id !== AcademicInstitution.ID_OTHER && this._project.academicInstitution2Id !== AcademicInstitution.ID_OTHER) {\n this._project.customAcademicInstitution = null;\n }\n\n if (!this._project.isRaisingFunds) {\n this._project.isLeadInvestorIdentified = null;\n } else if (this._project.fundingRoundId !== FundingRound.ID_OTHER) {\n this._project.customFundingRound = null;\n }\n this._project.projectTradeTypeId = this.projectTradeTypeFormControl.value;\n\n this.projectChange.emit(this._project);\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n","\n
\n
{{ 'List_of_prizes' | translate }}
\n
{{ 'List_of_prizes_info' | translate }}
\n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ control.nameFormControl.value.length }}/{{ PRIZE_MAX_LENGTH }}\n \n \n
\n
\n \n
\n
\n
{{ 'Past_and_current_funding' | translate }}
\n
{{ 'Past_and_current_funding_info' | translate }}
\n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ control.sourceFormControl.value.length }}/{{ SOURCE_MAX_LENGTH }}\n \n \n \n CHF \n {{ 'Invalid_value' | translate }}\n \n \n
\n
\n \n
\n
\n","import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Conf } from '../../../_conf';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { Project, ProjectPastFunding, ProjectPrize } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-edit-project-funding',\n providers: [],\n styleUrls: ['./edit-project-funding.scss'],\n templateUrl: './edit-project-funding.html'\n})\nexport class ProjectsEditProjectFundingComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly PRIZE_MAX_LENGTH: number = 250;\n public readonly SOURCE_MAX_LENGTH: number = 250;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public prizesFormControls: prizeFormControl[] = [];\n public pastFundingsFormControls: pastFoundingFormControls[] = [];\n @Output() public projectChange: EventEmitter = new EventEmitter();\n @Input() public rights: ProjectRights = new ProjectRights(this._utils);\n @Output() public prizesChange: EventEmitter = new EventEmitter();\n @Output() public pastFundingsChange: EventEmitter = new EventEmitter();\n @Output() onFormChanged: EventEmitter = new EventEmitter();\n private _isPrizesEdited: boolean = false;\n private _isPastFundingsEdited: boolean = false;\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n private _project: Project = new Project();\n\n public get project() {\n return this._project;\n }\n\n @Input()\n public set project(project: Project) {\n this._project = project;\n this.updateRights();\n }\n\n private _prizes: ProjectPrize[] = [];\n\n public get prizes() {\n return this._prizes;\n }\n\n @Input()\n public set prizes(prizes: ProjectPrize[]) {\n if (prizes) {\n this._prizes = prizes;\n if (!this._isPrizesEdited) { // si on vérifie pas ce flag, on reset le formulaire à chaque fois qu'on tappe dedans\n this.buildPrizesFormControls();\n this.updateRights();\n }\n }\n }\n\n private _pastFundings: ProjectPastFunding[] = [];\n\n public get pastFundings() {\n return this._pastFundings;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set pastFundings(pastFundings: ProjectPastFunding[]) {\n if (pastFundings) {\n this._pastFundings = pastFundings;\n if (!this._isPastFundingsEdited) { // si on vérifie pas ce flag, on reset le formulaire à chaque fois qu'on tappe dedans\n this.buildPastFundingFormControls();\n this.updateRights();\n }\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public canSave(): boolean {\n for (let i = 0; i < this.prizesFormControls.length; i++) {\n if (this.prizesFormControls[i].nameFormControl.invalid) {\n return false;\n }\n }\n\n for (let i = 0; i < this.pastFundingsFormControls.length; i++) {\n if (this.pastFundingsFormControls[i].amountFormControl.invalid || this.pastFundingsFormControls[i].sourceFormControl.invalid) {\n return false;\n }\n }\n\n return true;\n }\n\n public onAddPrizeClicked(): void {\n this.prizesFormControls.push({\n prizeId: 0,\n nameFormControl: new FormControl('', [\n Validators.maxLength(this.PRIZE_MAX_LENGTH)\n ])\n });\n }\n\n public onRemovePrizeClicked(index: number): void {\n this.prizesFormControls.splice(index, 1);\n this.onPrizesFormChanged();\n }\n\n public onAddPastFundingClicked(): void {\n this.pastFundingsFormControls.push({\n pastFoundingId: 0,\n sourceFormControl: new FormControl('', [\n Validators.maxLength(this.SOURCE_MAX_LENGTH)\n ]),\n amountFormControl: new FormControl('', [\n Validators.min(0)\n ])\n });\n }\n\n public onRemovePastFundingClicked(index: number): void {\n this.pastFundingsFormControls.splice(index, 1);\n this.onPastFundingsFormChanged();\n }\n\n public onPrizesFormChanged(): void {\n this._isPrizesEdited = true;\n this.fireChangePrizes();\n this._changesGuard.registerChanges();\n this.onFormChanged.emit();\n }\n\n public onPastFundingsFormChanged(): void {\n this._isPastFundingsEdited = true;\n this.fireChangePastFundings();\n this._changesGuard.registerChanges();\n this.onFormChanged.emit();\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private updateRights(): void {\n if (this.rights.EDIT) {\n this.prizesFormControls.forEach((control: prizeFormControl) => control.nameFormControl.enable());\n this.pastFundingsFormControls.forEach((control: pastFoundingFormControls) => {\n control.amountFormControl.enable();\n control.sourceFormControl.enable();\n });\n } else {\n this.prizesFormControls.forEach((control: prizeFormControl) => control.nameFormControl.disable());\n this.pastFundingsFormControls.forEach((control: pastFoundingFormControls) => {\n control.amountFormControl.disable();\n control.sourceFormControl.disable();\n });\n }\n }\n\n private buildPrizesFormControls(): void {\n const controls: prizeFormControl[] = [];\n for (let i = 0; i < this._prizes.length; i++) {\n const control: prizeFormControl = {\n prizeId: this._prizes[i].id,\n nameFormControl: new FormControl('', [\n Validators.maxLength(this.PRIZE_MAX_LENGTH)\n ])\n };\n control.nameFormControl.setValue(this._prizes[i].name);\n\n controls.push(control);\n }\n\n this.prizesFormControls = controls;\n\n if (this.prizesFormControls.length === 0) {\n this.onAddPrizeClicked();\n }\n }\n\n private buildPastFundingFormControls(): void {\n const controls: pastFoundingFormControls[] = [];\n for (let i = 0; i < this._pastFundings.length; i++) {\n const control: pastFoundingFormControls = {\n pastFoundingId: this._pastFundings[i].id,\n sourceFormControl: new FormControl('', [\n Validators.maxLength(this.SOURCE_MAX_LENGTH)\n ]),\n amountFormControl: new FormControl('', [\n Validators.min(0),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ])\n };\n control.sourceFormControl.setValue(this._pastFundings[i].source);\n control.amountFormControl.setValue(this._pastFundings[i].amount);\n controls.push(control);\n }\n\n this.pastFundingsFormControls = controls;\n\n if (this.pastFundingsFormControls.length === 0) {\n this.onAddPastFundingClicked();\n }\n }\n\n private fireChangePrizes(): void {\n const prizes: ProjectPrize[] = [];\n for (let i = 0; i < this.prizesFormControls.length; i++) {\n const prizeName: string = this.prizesFormControls[i].nameFormControl.value ? this.prizesFormControls[i].nameFormControl.value.trim() : '';\n if (prizeName.length) {\n const prize: ProjectPrize = new ProjectPrize();\n prize.id = this.prizesFormControls[i].prizeId;\n prize.projectId = this._project.id;\n prize.name = prizeName;\n prizes.push(prize);\n }\n }\n this._prizes = prizes;\n\n this.prizesChange.emit(prizes);\n }\n\n private fireChangePastFundings(): void {\n const fundings: ProjectPastFunding[] = [];\n for (let i = 0; i < this.pastFundingsFormControls.length; i++) {\n const sourceName: string = this.pastFundingsFormControls[i].sourceFormControl.value ? this.pastFundingsFormControls[i].sourceFormControl.value.trim() : '';\n const amount: number = this.pastFundingsFormControls[i].amountFormControl.value ? this.pastFundingsFormControls[i].amountFormControl.value : null;\n if (sourceName.length || amount) {\n const funding: ProjectPastFunding = new ProjectPastFunding();\n funding.id = this.pastFundingsFormControls[i].pastFoundingId;\n funding.projectId = this._project.id;\n funding.source = sourceName;\n funding.amount = amount;\n fundings.push(funding);\n }\n }\n this._pastFundings = fundings;\n\n this.pastFundingsChange.emit(this._pastFundings);\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n\nexport interface prizeFormControl {\n prizeId: number;\n nameFormControl: FormControl;\n}\n\nexport interface pastFoundingFormControls {\n pastFoundingId: number;\n sourceFormControl: FormControl;\n amountFormControl: FormControl;\n}\n","\n
\n
\n
\n {{ 'Project_visibility_for_the_public' | translate }}\n
\n
\n \n \n {{ option.name }}\n \n \n
\n
\n
\n info_outline\n
{{ 'Project_visibility_info' | translate }}
\n
\n
\n
\n","import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Conf } from '../../../_conf';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { Project, ProjectVisibility } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-edit-project-miscellaneous',\n providers: [],\n styleUrls: ['./edit-project-miscellaneous.scss'],\n templateUrl: './edit-project-miscellaneous.html'\n})\nexport class ProjectsEditProjectMiscellaneousComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public projectVisibilityId: number = null;\n @Output() public projectChange: EventEmitter = new EventEmitter();\n @Input() public rights: ProjectRights = new ProjectRights(this._utils);\n @Output() onFormChanged: EventEmitter = new EventEmitter();\n public projectVisibilities: ProjectVisibility[] = [];\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n private _project: Project = new Project();\n\n public get project() {\n return this._project;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set project(project: Project) {\n this._project = project;\n\n this.projectVisibilityId = project.projectVisibilityId;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.loadStaticData().catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public _onFormChanged(): void {\n this.fireChange();\n this._changesGuard.registerChanges();\n this.onFormChanged.emit();\n }\n\n public canSave(): boolean {\n return true;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadStaticData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(ProjectVisibility).get()\n ])\n .then((data: any[]) => {\n this.projectVisibilities = data[0];\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private fireChange(): void {\n this._project.projectVisibilityId = this.projectVisibilityId;\n\n this.projectChange.emit(this._project);\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n","\n
\n \n \n \n \n {{ 'Invalid_value' | translate }}\n {{ partnershipTermsFormControl.value.length }}\n /{{ PARTNERSHIP_TERMS_MAX_LENGTH }}\n \n
\n
\n \n \n \n \n {{ 'Invalid_value' | translate }}\n {{ outlicensingFormControl.value.length }}/{{ OUTLICENSING_MAX_LENGTH }}\n \n
\n
\n","import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Conf } from '../../../_conf';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { Project } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-edit-project-partnership',\n providers: [],\n styleUrls: ['./edit-project-partnership.scss'],\n templateUrl: './edit-project-partnership.html'\n})\nexport class ProjectsEditProjectPartnershipComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly PARTNERSHIP_TERMS_MAX_LENGTH: number = 2000;\n public readonly OUTLICENSING_MAX_LENGTH: number = 2000;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public isSeekingPartnership: boolean = null;\n public partnershipTermsFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.PARTNERSHIP_TERMS_MAX_LENGTH)\n ]);\n public isOutlicensing: boolean = null;\n public outlicensingFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.OUTLICENSING_MAX_LENGTH)\n ]);\n @Output() public projectChange: EventEmitter = new EventEmitter();\n @Input() public rights: ProjectRights = new ProjectRights(this._utils);\n @Output() onFormChanged: EventEmitter = new EventEmitter();\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n private _project: Project = new Project();\n\n public get project() {\n return this._project;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set project(project: Project) {\n this._project = project;\n this.isSeekingPartnership = project.isSeekingPartnerships ? true : false;\n this.partnershipTermsFormControl.setValue(project.partnershipTerms ? project.partnershipTerms : '');\n this.isOutlicensing = project.isOfferingLicensing ? true : false;\n this.outlicensingFormControl.setValue(project.licensingOffer ? project.licensingOffer : '');\n this.updateRights();\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public canSave(): boolean {\n return !this.partnershipTermsFormControl.invalid\n && !this.outlicensingFormControl.invalid;\n }\n\n public _onFormChanged(): void {\n this.fireChange();\n this._changesGuard.registerChanges();\n this.onFormChanged.emit();\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private updateRights(): void {\n if (this.rights.EDIT) {\n this.partnershipTermsFormControl.enable();\n this.outlicensingFormControl.enable();\n } else {\n this.partnershipTermsFormControl.disable();\n this.outlicensingFormControl.disable();\n }\n }\n\n private fireChange(): void {\n this._project.isSeekingPartnerships = this.isSeekingPartnership ? 1 : 0;\n this._project.partnershipTerms = this.partnershipTermsFormControl.value;\n this._project.isOfferingLicensing = this.isOutlicensing ? 1 : 0;\n this._project.licensingOffer = this.outlicensingFormControl.value;\n\n this.projectChange.emit(this._project);\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n","
{{ title | translate }}
\n\n \n \n {{ 'Field_required' | translate }}\n {{ nameFormControl.value?.length }} / {{ maxLength }}\n \n
\n info_outline\n
\n {{ explaination | translate }}\n
\n
\n
\n\n \n \n\n","import { AfterViewInit, Component, Inject } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { Utils } from '../../providers/utils';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'name-picker',\n providers: [],\n styleUrls: ['./name-picker.scss'],\n templateUrl: './name-picker.html'\n})\nexport class NamePickerComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public nameFormControl: FormControl = new FormControl('', [\n Validators.required\n ]);\n\n public title: string = '';\n public placeholder: string = '';\n public maxLength: number = 0;\n public explaination: string = null;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public dialog: MatDialogRef,\n private _utils: Utils,\n private _translater: TranslateService,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n this.nameFormControl.setValue(this._data.name ? this._data.name : '');\n this.title = this._data.title;\n this.placeholder = this._data.placeholder;\n if (this._data.maxLength) {\n this.maxLength = this._data.maxLength;\n }\n this.explaination = this._data.explaination;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onTyped(): void {\n if (this.maxLength && this.nameFormControl.value && this.nameFormControl.value.length > this.maxLength) {\n this.nameFormControl.setValue(this.nameFormControl.value.substr(0, this.maxLength));\n }\n }\n\n public onSaveClicked(): void {\n this.save();\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private save(): void {\n this.dialog.close(this.nameFormControl.value);\n }\n}\n","
{{ file.name }}
\n\n
\n \n
{{ 'Loading' | translate }}
\n
\n \n
\n\n \n \n\n
\n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, Inject } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { Conf } from '../../../_conf';\nimport { FilesProvider } from '../../providers/files-provider';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { File, FileType } from '../../../_common/providers/models';\n\nimport * as FileSaver from 'file-saver';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'files-image-viewer-dialog',\n providers: [],\n styleUrls: ['./image-viewer-dialog.scss'],\n templateUrl: './image-viewer-dialog.html'\n})\nexport class FilesImageViewerDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = true;\n public isDownloadLoading: boolean = false;\n public src: any = null;\n\n public file: File = new File();\n public type: FileType = new FileType();\n public downloadApi: string = null;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public dialog: MatDialogRef,\n public utils: Utils,\n public currentUser: CurrentUser,\n private _files: FilesProvider,\n private _translater: TranslateService,\n private _changeDetector: ChangeDetectorRef,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n this.file = this._data.file;\n this.type = this._data.type;\n this.downloadApi = this._data.downloadApi;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.loadImage()\n .then(() => this.isLoading = false)\n .catch((error) => this.onError(error));\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onDownloadClicked(): void {\n if (this.downloadApi) {\n this.isDownloadLoading = true;\n this._files.downloadFile(this.downloadApi, this.file)\n .then((fileData: any) => {\n const fileName: string = this.file.name + '.' + this.type.extension;\n FileSaver.saveAs(fileData, fileName);\n this.isDownloadLoading = false;\n })\n .catch((error) => this.onError(error));\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadImage(): Promise {\n return new Promise((resolve, reject) => {\n if (this.downloadApi) {\n this._files.downloadFile(this.downloadApi, this.file)\n .then((fileData: any) => {\n // tiré de : https://stackoverflow.com/questions/45530752/getting-image-from-api-in-angular-4\n const reader: FileReader = new FileReader();\n reader.addEventListener('load', () => this.src = reader.result, false);\n reader.readAsDataURL(fileData);\n resolve();\n })\n .catch((error) => this.onError(error));\n } else {\n reject({error: 'No download API'});\n }\n });\n }\n\n private onError(error: any): void {\n this.isDownloadLoading = false;\n this.isLoading = false;\n\n console.log(error);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({name: 'fileSize'})\nexport class FileSizePipe implements PipeTransform {\n public units: string[] = ['o', 'ko', 'Mo', 'Go', 'To'];\n\n constructor() {\n }\n\n public transform(str: string, unit: string) {\n let unitIndex = this.units.indexOf(unit);\n if (unitIndex < 0) {\n unitIndex = 0;\n }\n\n let value: number = parseFloat(str);\n while (value > 1024) {\n value = value / 1024;\n unitIndex++;\n }\n\n return Math.round(value) + ' ' + this.units[unitIndex];\n }\n}\n","
\n
\n \n \n arrow_right\n \n \n
\n \n
\n
\n 0 && (!hideHeadersWhenEmpty || (hideHeadersWhenEmpty && filesDataSource.count > 0))\"\n [dataSource]=\"filesDataSource\"\n matSort>\n \n \n \n \n \n \n \n \n \n \n \n \n {{ 'Name' | translate }}\n \n \n \n \n \n \n {{ 'Type' | translate }}\n \n {{ row.type.name }}\n \n \n \n {{ 'Changed' | translate }}\n \n {{ row.file.updateDate | dateClosest }}\n \n \n \n {{ 'Size' | translate }}\n \n \n {{ row.file.size | fileSize:'ko' }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n
\n {{ 'This_folder_is_empty' | translate }}\n \n {{ 'There_is_no_file' | translate }}\n \n
\n
\n {{ hintLabel }}\n
\n
\n \n \n \n \n \n \n
\n\n","import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { Utils } from '../../../_common/providers/utils';\nimport { NamePickerComponent } from '../../../_common/components/name-picker/name-picker';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { FilesImageViewerDialogComponent } from '../image-viewer-dialog/image-viewer-dialog';\nimport { SimpleMatDataSource } from '../../../_common/providers/simple-mat-data-source';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { FilesProvider } from '../../providers/files-provider';\nimport { File, FileFamily, FileType, User } from '../../../_common/providers/models';\n\nimport * as FileSaver from 'file-saver';\nimport { MatSort } from '@angular/material/sort';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'files-files',\n styleUrls: ['./files.scss'],\n templateUrl: './files.html'\n})\nexport class FilesFilesComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public static readonly EDITION_LEVEL_NONE: number = 1;\n public static readonly EDITION_LEVEL_OWN_FILES: number = 2;\n public static readonly EDITION_LEVEL_ALL_FILES: number = 3;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @ViewChild(MatSort, {static: false}) public sorter: MatSort;\n @ViewChild('fileInput', {static: false}) public fileInput;\n @Input() public editionLevel: number = FilesFilesComponent.EDITION_LEVEL_NONE;\n @Input() public currentUser: User = new User();\n @Output() filesChange: EventEmitter = new EventEmitter();\n @Input() public fileGroupId: number = 0;\n @Input() public downloadApi: string = null;\n @Input() public maxFileSize: number = 30720; // 30 Mo en ko\n @Input() public isDisabled: boolean = false;\n @Input() public hideIconColumn: boolean = false;\n @Input() public hideTypeColumn: boolean = false;\n @Input() public hideChangedColumn: boolean = false;\n @Input() public hideSizeColumn: boolean = false;\n @Input() public isFoldersEnabled: boolean = true;\n @Input() public hideHeaders: boolean = false;\n @Input() public hideHeadersWhenEmpty: boolean = false;\n @Input() public hintLabel: string = null;\n @Output() public onItemRemoved: EventEmitter = new EventEmitter();\n @Output() public onItemAdded: EventEmitter = new EventEmitter();\n @Output() public onItemRenamed: EventEmitter = new EventEmitter();\n public filesDataSource: SimpleMatDataSource = new SimpleMatDataSource([]);\n public foldersStack: File[] = [];\n public columns: string[] = [];\n private _types: FileType[] = [];\n private _families: FileFamily[] = [];\n private _isReady: boolean = false;\n private _pendingData: any = null;\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n private _dialoger: MatDialog,\n private _toaster: MatSnackBar,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage,\n private _filesProvider: FilesProvider\n ) {\n }\n\n private _files: File[] = [];\n\n public get files() {\n return this._files;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set files(value: File[]) {\n if (!this._isReady) {\n this._pendingData = value;\n return;\n }\n\n this.parseValue(value);\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.initDatasource();\n this.loadFileTypes()\n .then(() => {\n this._isReady = true;\n if (this._pendingData) {\n this.files = this._pendingData;\n this._pendingData = null;\n }\n })\n .catch((error) => this.onError(error));\n\n const columns: string[] = [];\n if (!this.hideIconColumn) {\n columns.push('icon');\n }\n columns.push('name');\n if (!this.hideTypeColumn) {\n columns.push('type');\n }\n if (!this.hideChangedColumn) {\n columns.push('change');\n }\n if (!this.hideSizeColumn) {\n columns.push('size');\n }\n columns.push('actions');\n\n this.columns = columns;\n\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onAddFileClicked(): void {\n if ([FilesFilesComponent.EDITION_LEVEL_ALL_FILES, FilesFilesComponent.EDITION_LEVEL_OWN_FILES].indexOf(this.editionLevel) >= 0) {\n this.fileInput.nativeElement.click();\n }\n }\n\n public onAddFolderClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(NamePickerComponent, {\n data: {\n name: '',\n title: 'New_folder',\n placeholder: 'Name',\n maxLength: 255\n }\n });\n dialog.afterClosed().subscribe((newName: string) => {\n if (newName) {\n const folder: File = new File();\n folder.fileGroupId = this.fileGroupId;\n folder.fileTypeId = FileType.ID_FOLDER;\n folder.parentFileId = this.foldersStack.length > 0 ? this.foldersStack[this.foldersStack.length - 1].id : null;\n folder.name = newName;\n folder.size = 0;\n this.onItemAdded.emit([folder]);\n }\n });\n }\n\n public onRenameClicked(row: FileRow): void {\n const dialog: MatDialogRef = this._dialoger.open(NamePickerComponent, {\n data: {\n name: row.file.name,\n title: 'Rename',\n placeholder: 'New_name',\n maxLength: 255\n }\n });\n dialog.afterClosed().subscribe((newName) => {\n if (newName) {\n row.file.name = newName;\n // this.filesDataSource.set(rowIndex, row);\n this.onItemRenamed.emit(row.file);\n }\n });\n }\n\n public onRemoveClicked(row: FileRow): void {\n const message: string = row.type.id === FileFamily.ID_FOLDER ? 'Confirm_delete_folder' : 'Confirm_delete_file';\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: this._translater.instant(message)\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n // this.removeFile(row.file);\n this.onItemRemoved.emit(row.file);\n }\n });\n\n }\n\n public onNewFileSelected(event: any): void {\n if (event.target.files && event.target.files.length > 0) {\n const newFiles: File[] = [];\n for (let i = 0; i < event.target.files.length; i++) {\n newFiles.push(this.buildFile(event.target.files[i]));\n }\n this.onItemAdded.emit(newFiles);\n }\n }\n\n public onDownloadClicked(row: any): void {\n if (this.downloadApi) {\n row.isDownloadLoading = true;\n this._filesProvider.downloadFile(this.downloadApi, row.file)\n .then((file: any) => {\n const type: FileType = this.utils.findIn(row.file.fileTypeId, this._types, 'id');\n const fileName: string = row.file.name + '.' + type.extension;\n FileSaver.saveAs(file, fileName);\n row.isDownloadLoading = false;\n })\n .catch((error) => this.onError(error));\n }\n }\n\n public onRowClicked(row: FileRow): void {\n if (row.type.id === FileFamily.ID_IMAGE) {\n this.openImage(row.file);\n } else if (row.type.id === FileFamily.ID_FOLDER) {\n this.openFolder(row.file.id);\n } else {\n this.onDownloadClicked(row);\n }\n }\n\n public onSortChange(event: any): void {\n this.filesDataSource.sortBy(event.active, event.direction);\n this.filesDataSource.addSortDefinition(\n 'icon',\n (a: FileRow, b: FileRow) => this.utils.sortRow(\n a.type.name.toLowerCase(),\n b.type.name.toLowerCase(),\n true\n ),\n (a: FileRow, b: FileRow) => this.utils.sortRow(\n b.type.name.toLowerCase(),\n a.type.name.toLowerCase(),\n false\n )\n );\n this.filesDataSource.addSortDefinition(\n 'name',\n (a: FileRow, b: FileRow) => this.utils.sortRow(\n a.file.name.toLowerCase(),\n b.file.name.toLowerCase(),\n true\n ),\n (a: FileRow, b: FileRow) => this.utils.sortRow(\n b.file.name.toLowerCase(),\n a.file.name.toLowerCase(),\n false\n )\n );\n this.filesDataSource.addSortDefinition(\n 'type',\n (a: FileRow, b: FileRow) => this.utils.sortRow(\n a.type.name.toLowerCase(),\n b.type.name.toLowerCase(),\n true\n ),\n (a: FileRow, b: FileRow) => this.utils.sortRow(\n b.type.name.toLowerCase(),\n a.type.name.toLowerCase(),\n false\n )\n );\n this.filesDataSource.addSortDefinition(\n 'change',\n (a: FileRow, b: FileRow) => this.utils.sortRow(\n a.file.updateDate,\n b.file.updateDate,\n true\n ),\n (a: FileRow, b: FileRow) => this.utils.sortRow(\n b.file.updateDate,\n a.file.updateDate,\n false\n )\n );\n this.filesDataSource.addSortDefinition(\n 'size',\n (a: FileRow, b: FileRow) => this.utils.sortRow(\n a.file.size,\n b.file.size,\n true\n ),\n (a: FileRow, b: FileRow) => this.utils.sortRow(\n b.file.size,\n a.file.size,\n false\n )\n );\n }\n\n public onHomeFolderClicked(): void {\n this.openFolder(null);\n }\n\n public onBackFolderClicked(): void {\n if (this.foldersStack.length > 1) {\n this.openFolder(this.foldersStack[this.foldersStack.length - 1].parentFileId);\n return;\n }\n\n this.openFolder(null);\n }\n\n public onStackFolderClicked(folder: File): void {\n this.openFolder(folder.id);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private initDatasource(): void {\n this.filesDataSource.sort = this.sorter;\n }\n\n private loadFileTypes(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(FileType).get(),\n this._storage.select(FileFamily).get()\n ])\n .then((data: any[]) => {\n this._types = data[0];\n this._families = data[1];\n resolve();\n })\n .catch((error) => reject(error));\n });\n }\n\n private parseValue(value: File[]): void {\n if (value) {\n if (this.isFoldersEnabled) {\n this._files = value;\n } else {\n // si on d�sactive les folders, on filtre tous les dossiers ...\n this._files = [];\n for (let i = 0; i < value.length; i++) {\n if (value[i].fileTypeId !== FileType.ID_FOLDER) {\n this._files.push(value[i]);\n }\n }\n }\n\n let folderId: number = null;\n let i = this.foldersStack.length - 1;\n while (i >= 0 && !folderId) {\n folderId = this.utils.findIn(this.foldersStack[i].id, this._files, 'id') ? this.foldersStack[i].id : null;\n if (!folderId) {\n this.foldersStack.splice(i, 1);\n }\n i--;\n }\n\n this.openFolder(folderId);\n } else {\n this._files = [];\n this.filesDataSource.replaceAllWith([]);\n }\n }\n\n private openFolder(folderId: number): void {\n // TODO disabler le mode search (s'il �tait actif)\n const folderData: FileRow[] = [];\n let folderFiles: File[] = [];\n\n // si les folders sont d�sactiv�s, on affiche tous les fichiers peu importe leur dossier parent\n if (this.isFoldersEnabled) {\n if (folderId) {\n folderFiles = this.utils.findManyIn(folderId ? [folderId] : [null, undefined, NaN], this._files, 'parentFileId');\n } else {\n // des fois parentFileId vaut null, des fois undefined et des fois NaN\n // on peut donc pas utiliser utils.findManyIn dans ce\n for (let i = 0; i < this._files.length; i++) {\n if (!this._files[i].parentFileId) {\n folderFiles.push(this._files[i]);\n }\n }\n }\n } else {\n folderFiles = this._files; // les folders ont d�j� �t� filtr�s dans \"parseValue\"\n }\n\n for (let i = 0; i < folderFiles.length; i++) {\n folderData.push(this.buildFileRow(folderFiles[i]));\n }\n\n this.filesDataSource.replaceAllWith(folderData);\n\n const newStack: File[] = [];\n let nextFolder: File = this.utils.findIn(folderId, this._files, 'id');\n while (nextFolder) {\n newStack.splice(0, 0, nextFolder);\n nextFolder = this.utils.findIn(nextFolder.parentFileId, this._files, 'id');\n }\n this.foldersStack = newStack;\n }\n\n private buildFileRow(file: File): FileRow {\n let type: FileType = this.utils.findIn(file.fileTypeId, this._types, 'id');\n if (!type) {\n type = this._types[0];\n }\n const family: FileFamily = this.utils.findIn(type.fileFamilyId, this._families, 'id');\n\n return {\n file,\n icon: this.findIcon(type),\n type: family,\n isDownloadable: family.id !== FileFamily.ID_FOLDER,\n isDownloadLoading: false,\n editionLevel: this.getFileEditionLevel(file)\n };\n }\n\n private findIcon(type: FileType): string {\n return this.conf.assetsUrl + 'files/families/' + type.fileFamilyId + '.png';\n }\n\n private getRowIndex(row: any): number {\n for (let i = 0; i < this.filesDataSource.count; i++) {\n if (this.filesDataSource.get(i).file.id === row.file.id) {\n return i;\n }\n }\n\n return this.filesDataSource.count;\n }\n\n private removeFile(row: any): void {\n const rowIndex: number = this.getRowIndex(row);\n this.filesDataSource.remove(rowIndex);\n this._files.splice(rowIndex, 1);\n this.onItemRemoved.emit(row.file);\n }\n\n private buildFile(rawFile: any): File {\n const file: File = new File();\n const fileId: any = this.utils.randomString(16);\n const fileName: string[] = this.parseRawFileName(rawFile.name);\n const fileType: FileType = this.parseRawType(rawFile.type, fileName[1]);\n const fileSize: number = Math.round(rawFile.size / 1024);\n const fileData: any = rawFile;\n\n if (fileSize > this.maxFileSize) {\n this._toaster.open(this._translater.instant(\n 'File_is_too_big_max_x',\n {size: Math.round(this.maxFileSize / 1024), unit: 'Mo'}),\n '',\n {duration: 5000}\n );\n return;\n }\n\n file.id = fileId; // on assigne pas directement pour �viter un probl�me de typage entre string et number\n file.name = fileName[0];\n if (fileType.id === FileType.ID_OTHER) {\n file.name += '.' + fileName[1];\n }\n file.size = fileSize;\n file.fileTypeId = fileType.id;\n file.file = fileData;\n file.parentFileId = this.foldersStack.length > 0 ? this.foldersStack[this.foldersStack.length - 1].id : null;\n file.fileGroupId = this.fileGroupId;\n file.updateDate = this.utils.DateToYmdHis(new Date());\n file.createrId = this.currentUser.id;\n\n return file;\n }\n\n private parseRawFileName(fileName: string): string[] {\n const dotIndex: number = fileName.lastIndexOf('.');\n if (dotIndex >= 0) {\n return [fileName.substr(0, dotIndex), fileName.substr(dotIndex + 1)];\n }\n\n return [fileName, ''];\n }\n\n private parseRawType(mime: string, extension: string): FileType {\n for (let i = 1; i < this._types.length; i++) {\n if (this._types[i].mimeType === mime && this._types[i].extension === extension) {\n return this._types[i].clone();\n }\n }\n\n return this._types[0].clone(); // le premier de la liste c'est \"other\" ...\n }\n\n private getFileEditionLevel(file: File): number {\n // si le composant est en mode \"ALL\" ou \"NONE\", on override les droits sp�cifiques du fichier\n // sinon on indique que l'utilisateur peut le modifier s'il est l'owener, sinon on retourne none;\n if (this.editionLevel === FilesFilesComponent.EDITION_LEVEL_ALL_FILES) {\n return FilesFilesComponent.EDITION_LEVEL_ALL_FILES;\n }\n if (this.editionLevel === FilesFilesComponent.EDITION_LEVEL_NONE) {\n return FilesFilesComponent.EDITION_LEVEL_NONE;\n }\n\n return file.createrId === this.currentUser.id ? FilesFilesComponent.EDITION_LEVEL_OWN_FILES : FilesFilesComponent.EDITION_LEVEL_NONE;\n }\n\n private openImage(file: File): void {\n const dialog: MatDialogRef = this._dialoger.open(FilesImageViewerDialogComponent, {\n data: {\n file,\n type: this.utils.findIn(file.fileTypeId, this._types, 'id'),\n downloadApi: this.downloadApi\n }\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n\nexport interface FileRow {\n file: File;\n icon: string;\n type: FileFamily;\n isDownloadable: boolean;\n isDownloadLoading: boolean;\n editionLevel: number;\n}\n","\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ nameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ biotechUrlFormControl.value.length }}/{{ BIOTECH_URL_MAX_LENGTH }}\n \n
\n \n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ pipelineFormControl.value.length }}/{{ PIPELINE_MAX_LENGTH }}\n \n
\n \n
\n \n \n
\n
\n \n \n
\n
\n attach_file\n {{ 'Upload_files_hint' | translate }}\n
\n
\n \n \n
\n
\n \n
\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Conf } from '../../../_conf';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { Utils } from '../../../_common/providers/utils';\nimport { FilesFilesComponent } from '../../../files/components/files/files';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ImageData } from '../../../_common/components/input-image/input-image';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { File, FileType, Project, ProjectValidationState } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-edit-project-project',\n providers: [],\n styleUrls: ['./edit-project-project.scss'],\n templateUrl: './edit-project-project.html'\n})\nexport class ProjectsEditProjectProjectComponent {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly NAME_MAX_LENGTH: number = 250;\n public readonly SUBTITLE_MAX_LENGTH: number = 250;\n public readonly DESCRIPTION_MAX_LENGTH: number = 5000;\n public readonly BIOTECH_URL_MAX_LENGTH: number = 255;\n public readonly UNIQUENESS_MAX_LENGTH: number = 2000;\n public readonly PIPELINE_MAX_LENGTH: number = 2000;\n public readonly UNMET_NEED_MAX_LENGTH: number = 2000;\n public readonly MARKET_SIZE_MAX_LENGTH: number = 2000;\n public readonly COMPETITION_MAX_LENGTH: number = 2000;\n public readonly KEYWORDS_MAX_LENGTH: number = 250;\n public FILES_EDITION_LEVEL: number = FilesFilesComponent.EDITION_LEVEL_ALL_FILES;\n public FILE_MAX_SIZE: number = 10;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n public showMore: boolean = false;\n\n public nameFormControl: FormControl = new FormControl('', [\n Validators.required,\n Validators.maxLength(this.NAME_MAX_LENGTH)\n ]);\n public pipelineFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.PIPELINE_MAX_LENGTH)\n ]);\n public keywordsFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.KEYWORDS_MAX_LENGTH)\n ]);\n public projectTypeFormControl: FormControl = new FormControl('', [\n Validators.min(1)\n ]);\n public therapeuticAreaFormControl: FormControl = new FormControl('', [\n Validators.min(1)\n ]);\n public biotechUrlFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.BIOTECH_URL_MAX_LENGTH)\n ]);\n public logoPreview: any = null;\n public logoImageData: ImageData = {current: null, new: null};\n public illustrationPreview: any = null;\n public illustrationImageData: ImageData = {current: null, new: null};\n public files: File[] = [];\n @Output() public projectChange: EventEmitter = new EventEmitter();\n @Input() public rights: ProjectRights = new ProjectRights(this._utils);\n @Output() onFormChanged: EventEmitter = new EventEmitter();\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n private _project: Project = new Project();\n\n public get project() {\n return this._project;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set project(project: Project) {\n this._project = project;\n this.nameFormControl.setValue(project.name ? project.name : '');\n this.pipelineFormControl.setValue(project.pipeline ? project.pipeline : '');\n this.keywordsFormControl.setValue(project.keywords ? project.keywords : '');\n this.biotechUrlFormControl.setValue(project.biotechDirectoryUrl ? project.biotechDirectoryUrl : '');\n this.logoImageData.current = project.logo;\n this.illustrationImageData.current = project.illustration;\n this._filesProvider.initPreviewImage((data: any) => this.logoPreview = data, this.logoImageData, 'projects/' + this.project.id + '/download-logo');\n this._filesProvider.initPreviewImage((data: any) => this.illustrationPreview = data, this.illustrationImageData, 'projects/' + this.project.id + '/download-illustration');\n this.loadFiles().catch((error: any) => this.onError(error));\n this.updateRights();\n\n this.showMore = !(project && ([ProjectValidationState.ID_DRAFT, ProjectValidationState.ID_PENDING_VALIDATION].indexOf(project.projectValidationStateId) >= 0));\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public _onFormChanged(): void {\n this.fireChange();\n this._changesGuard.registerChanges();\n this.onFormChanged.emit();\n }\n\n public onFileRenamed(file: File): void {\n this.isLoading = true;\n this.updateFiles(file)\n .then(() => {\n this.isLoading = false;\n const text: string = file.fileTypeId === FileType.ID_FOLDER ? 'Folder_saved' : 'Files_saved';\n this._toaster.open(this._translater.instant(text), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n\n public onFilesAdded(files: File[]): void {\n if (!files.length) {\n return;\n }\n\n this.isLoading = true;\n this.addFiles(files)\n .then(() => {\n this.isLoading = false;\n const text: string = files[0].fileTypeId === FileType.ID_FOLDER ? 'Folder_saved' : 'Files_saved';\n this._toaster.open(this._translater.instant(text), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n\n public onFileRemoved(file: File): void {\n this.isLoading = true;\n this.deleteFile(file)\n .then(() => {\n this.isLoading = false;\n const text: string = file.fileTypeId === FileType.ID_FOLDER ? 'Folder_deleted' : 'File_deleted';\n this._toaster.open(this._translater.instant(text), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n\n public canSave(): boolean {\n return !this.keywordsFormControl.invalid\n && !this.nameFormControl.invalid\n && !this.pipelineFormControl.invalid\n && !this.projectTypeFormControl.invalid\n && !this.therapeuticAreaFormControl.invalid;\n }\n\n public onToggleShowMore(): void {\n this.showMore = !this.showMore;\n if (!this.showMore) {\n setTimeout(() => {\n document.getElementsByTagName('html')[0].scrollTo({\n left: 0,\n top: 96,\n behavior: 'smooth'\n });\n }, 10);\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private updateRights(): void {\n if (this.rights.EDIT) {\n this.nameFormControl.enable();\n this.projectTypeFormControl.enable();\n this.therapeuticAreaFormControl.enable();\n this.pipelineFormControl.enable();\n this.keywordsFormControl.enable();\n this.biotechUrlFormControl.enable();\n this.FILES_EDITION_LEVEL = FilesFilesComponent.EDITION_LEVEL_ALL_FILES;\n } else {\n this.nameFormControl.disable();\n this.projectTypeFormControl.disable();\n this.therapeuticAreaFormControl.disable();\n this.pipelineFormControl.disable();\n this.keywordsFormControl.disable();\n this.biotechUrlFormControl.disable();\n this.FILES_EDITION_LEVEL = FilesFilesComponent.EDITION_LEVEL_NONE;\n }\n }\n\n private loadFiles(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(File).where('fileGroupId').equals(this._project.fileGroupId).get()\n .then((files: File[]) => {\n this.files = files;\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private addFiles(files: File[]): Promise {\n return new Promise((resolve, reject) => {\n this.projectsProvider.addFiles(this._project, files)\n .then((data: File[]) => {\n this.files = this.files.concat(data);// TODO tester (que ca refresh aussi)\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private updateFiles(file: File): Promise {\n return new Promise((resolve, reject) => {\n this.projectsProvider.updateFile(this._project, file)\n .then((data: File) => {\n for (let i = 0; i < this.files.length; i++) {\n if (data.id === this.files[i].id) {\n this.files[i] = data;\n i = this.files.length;\n }\n }\n\n this.files = this.files.slice(); // pour trigger un refresh\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private deleteFile(file: File): Promise {\n return new Promise((resolve, reject) => {\n this.projectsProvider.deleteFile(this._project, file)\n .then(() => {\n for (let i = 0; i < this.files.length; i++) {\n if (this.files[i].id === file.id) {\n this.files.splice(i, 1);\n i = this.files.length;\n }\n }\n\n this.files = this.files.slice(); // pour trigger un refresh\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private fireChange(): void {\n this._project.name = this.nameFormControl.value;\n this._project.pipeline = this.pipelineFormControl.value;\n this._project.keywords = this.keywordsFormControl.value;\n this._project.logo = this.logoImageData.new ? this.logoImageData.new : this.logoImageData.current;\n this._project.illustration = this.illustrationImageData.new ? this.illustrationImageData.new : this.illustrationImageData.current;\n this._project.biotechDirectoryUrl = this.biotechUrlFormControl.value;\n\n this.projectChange.emit(this._project);\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n","\n
\n
{{ 'Contact' | translate }}
\n
{{ 'Contact_info' | translate }}
\n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ contactFirstNameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n \n \n {{ 'Invalid_value' | translate }}\n {{ contactLastNameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ contactEmailFormControl.value.length }}/{{ EMAIL_MAX_LENGTH }}\n \n \n \n {{ 'Invalid_value' | translate }}\n {{ contactWebsiteFormControl.value.length }}/{{ WEBSITE_MAX_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ contactAddressFormControl.value.length }}/{{ ADDRESS_MAX_LENGTH }}\n \n
\n \n
\n
{{ 'Team' | translate }}
\n
{{ 'Team_info' | translate }}
\n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ control.firstNameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n \n \n {{ 'Invalid_value' | translate }}\n {{ control.lastNameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n \n \n {{ 'Invalid_value' | translate }}\n {{ control.functionFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n \n
\n
\n \n
\n
\n \n \n
\n
\n
{{ 'Advisory_board' | translate }}
\n
{{ 'Advisory_board_info' | translate }}
\n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ control.firstNameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n \n \n {{ 'Invalid_value' | translate }}\n {{ control.lastNameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n \n
\n
\n \n
\n
\n
{{ 'Board_of_directors' | translate }}
\n
{{ 'Board_of_directors_info' | translate }}
\n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ control.firstNameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n \n \n {{ 'Invalid_value' | translate }}\n {{ control.lastNameFormControl.value.length }}/{{ NAME_MAX_LENGTH }}\n \n \n
\n
\n \n
\n
\n \n
\n","import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Conf } from '../../../_conf';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ImageData } from '../../../_common/components/input-image/input-image';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { Project, ProjectTeamMember, ProjectValidationState, TeamMemberType } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-edit-project-team',\n providers: [],\n styleUrls: ['./edit-project-team.scss'],\n templateUrl: './edit-project-team.html'\n})\nexport class ProjectsEditProjectTeamComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly NAME_MAX_LENGTH: number = 250;\n public readonly FUNCTION_MAX_LENGTH: number = 250;\n public readonly EMAIL_MAX_LENGTH: number = 250;\n public readonly WEBSITE_MAX_LENGTH: number = 250;\n public readonly PHONE_MAX_LENGTH: number = 15;\n public readonly ADDRESS_MAX_LENGTH: number = 1000;\n public readonly IMAGE_MAX_SIZE: number = 2; // Mo\n public readonly IMAGE_MAX_HEIGHT: number = 5000;\n public readonly IMAGE_MAX_WIDTH: number = 5000;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n public showMore: boolean = false;\n\n public teamMemberFormControls: TeamMemberFormControl[] = [];\n public boardMemberFormControls: TeamMemberFormControl[] = [];\n public directorsMemberFormControls: TeamMemberFormControl[] = [];\n public teamImagePreview: any = null;\n public teamImageData: ImageData = {current: null, new: null};\n public contactFirstNameFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.NAME_MAX_LENGTH)\n ]);\n public contactLastNameFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.NAME_MAX_LENGTH)\n ]);\n public contactEmailFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.EMAIL_MAX_LENGTH),\n Validators.email,\n Validators.pattern(this._utils.EMAIL_REGEX),\n ]);\n public contactWebsiteFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.WEBSITE_MAX_LENGTH),\n Validators.pattern(this._utils.URL_REGEX)\n ]);\n public contactPhoneFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.PHONE_MAX_LENGTH),\n Validators.pattern(this._utils.INTERNATIONAL_PHONE_NUMBER_REGEX)\n ]);\n public contactAddressFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.ADDRESS_MAX_LENGTH)\n ]);\n @Output() public projectChange: EventEmitter = new EventEmitter();\n @Input() public rights: ProjectRights = new ProjectRights(this._utils);\n @Output() public teamMembersChange: EventEmitter = new EventEmitter();\n @Output() onFormChanged: EventEmitter = new EventEmitter();\n private _isTeamMembersEdited: boolean = false;\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n private _project: Project = new Project();\n\n public get project() {\n return this._project;\n }\n\n @Input()\n public set project(project: Project) {\n this._project = project;\n\n // si c'est la première fois qu'on affiche le formulaire,\n // on prérempli les infos de contact avec celles du user connecté\n if (this.project.updateDate === this.project.createDate) {\n this.contactFirstNameFormControl.setValue(this.currentUser.user.firstName);\n this.contactLastNameFormControl.setValue(this.currentUser.user.lastName);\n this.contactEmailFormControl.setValue(this.currentUser.user.email);\n this.fireChangeProject();\n } else {\n this.contactFirstNameFormControl.setValue(project.contactFirstName ? project.contactFirstName : '');\n this.contactLastNameFormControl.setValue(project.contactLastName ? project.contactLastName : '');\n this.contactEmailFormControl.setValue(project.contactEmail ? project.contactEmail : '');\n }\n this.contactWebsiteFormControl.setValue(project.contactWebsite ? project.contactWebsite : '');\n this.contactPhoneFormControl.setValue(project.contactPhone ? project.contactPhone : '');\n this.contactAddressFormControl.setValue(project.contactAddress ? project.contactAddress : '');\n this.teamImageData.current = project.teamPicture;\n this._filesProvider.initPreviewImage((data: any) => this.teamImagePreview = data, this.teamImageData, 'projects/' + this.project.id + '/download-team-picture');\n this.updateRights();\n\n this.showMore = !(project && ([ProjectValidationState.ID_DRAFT, ProjectValidationState.ID_PENDING_VALIDATION].indexOf(project.projectValidationStateId) >= 0));\n }\n\n private _teamMembers: ProjectTeamMember[] = [];\n\n public get teamMembers() {\n return this._teamMembers;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set teamMembers(teamMembers: ProjectTeamMember[]) {\n // on split les team member et des board members à la saisie pour des questions d'ux\n // et on les regroupe à la volée en retour parce que c'est plus facile à gérer coté backend\n if (teamMembers) {\n this._teamMembers = teamMembers;\n if (!this._isTeamMembersEdited) { // si on vérifie pas ce flag, on reset le formulaire à chaque fois qu'on tappe dedans\n this.buildTeamMembersFormControls();\n this.updateRights();\n }\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public canSave(): boolean {\n for (let i = 0; i < this.teamMemberFormControls.length; i++) {\n if (this.teamMemberFormControls[i].firstNameFormControl.invalid\n || this.teamMemberFormControls[i].lastNameFormControl.invalid\n || this.teamMemberFormControls[i].functionFormControl.invalid) {\n return false;\n }\n }\n for (let i = 0; i < this.boardMemberFormControls.length; i++) {\n if (this.boardMemberFormControls[i].firstNameFormControl.invalid\n || this.boardMemberFormControls[i].lastNameFormControl.invalid\n || this.boardMemberFormControls[i].functionFormControl.invalid) {\n return false;\n }\n }\n for (let i = 0; i < this.directorsMemberFormControls.length; i++) {\n if (this.directorsMemberFormControls[i].firstNameFormControl.invalid\n || this.directorsMemberFormControls[i].lastNameFormControl.invalid\n || this.directorsMemberFormControls[i].functionFormControl.invalid) {\n return false;\n }\n }\n\n return !this.contactFirstNameFormControl.invalid\n && !this.contactLastNameFormControl.invalid\n && !this.contactEmailFormControl.invalid\n && !this.contactWebsiteFormControl.invalid\n && !this.contactPhoneFormControl.invalid\n && !this.contactAddressFormControl.invalid;\n }\n\n public onAddTeamMemberClicked(): void {\n this.addMemberFormControl(this.teamMemberFormControls);\n }\n\n public onAddBoardMemberClicked(): void {\n this.addMemberFormControl(this.boardMemberFormControls);\n }\n\n public onAddDirectorsMemberClicked(): void {\n this.addMemberFormControl(this.directorsMemberFormControls);\n }\n\n public onRemoveTeamMemberClicked(index: number): void {\n this.teamMemberFormControls.splice(index, 1);\n this.onTeamMembersFormChanged();\n }\n\n public onRemoveBoardMemberClicked(index: number): void {\n this.boardMemberFormControls.splice(index, 1);\n this.onTeamMembersFormChanged();\n }\n\n public onRemoveDirectorsMemberClicked(index: number): void {\n this.directorsMemberFormControls.splice(index, 1);\n this.onTeamMembersFormChanged();\n }\n\n public onTeamNameFieldChanged(index: number): void {\n this.teamMemberFormControls[index].firstNameFormControl.updateValueAndValidity();\n this.teamMemberFormControls[index].lastNameFormControl.updateValueAndValidity();\n this.onTeamMembersFormChanged();\n }\n\n public onBoardNameFieldChanged(index: number): void {\n this.boardMemberFormControls[index].firstNameFormControl.updateValueAndValidity();\n this.boardMemberFormControls[index].lastNameFormControl.updateValueAndValidity();\n this.onTeamMembersFormChanged();\n }\n\n public onDirectorsNameFieldChanged(index: number): void {\n this.directorsMemberFormControls[index].firstNameFormControl.updateValueAndValidity();\n this.directorsMemberFormControls[index].lastNameFormControl.updateValueAndValidity();\n this.onTeamMembersFormChanged();\n }\n\n public onTeamMembersFormChanged(): void {\n this._isTeamMembersEdited = true;\n this.fireChangeTeamMembers();\n this._changesGuard.registerChanges();\n this.onFormChanged.emit();\n }\n\n public onProjectFormChanged(): void {\n this.fireChangeProject();\n this._changesGuard.registerChanges();\n this.onFormChanged.emit();\n }\n\n public onToggleShowMore(): void {\n this.showMore = !this.showMore;\n if (!this.showMore) {\n setTimeout(() => {\n document.getElementsByTagName('html')[0].scrollTo({\n left: 0,\n top: 96 + (4 * 72),\n behavior: 'smooth'\n });\n }, 10);\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private updateRights(): void {\n if (this.rights.EDIT) {\n this.teamMemberFormControls.forEach((control: TeamMemberFormControl) => {\n control.firstNameFormControl.enable();\n control.lastNameFormControl.enable();\n control.functionFormControl.enable();\n });\n this.boardMemberFormControls.forEach((control: TeamMemberFormControl) => {\n control.firstNameFormControl.enable();\n control.lastNameFormControl.enable();\n });\n this.directorsMemberFormControls.forEach((control: TeamMemberFormControl) => {\n control.firstNameFormControl.enable();\n control.lastNameFormControl.enable();\n });\n this.contactAddressFormControl.enable();\n this.contactEmailFormControl.enable();\n this.contactFirstNameFormControl.enable();\n this.contactLastNameFormControl.enable();\n this.contactPhoneFormControl.enable();\n this.contactWebsiteFormControl.enable();\n } else {\n this.teamMemberFormControls.forEach((control: TeamMemberFormControl) => {\n control.firstNameFormControl.disable();\n control.lastNameFormControl.disable();\n control.functionFormControl.disable();\n });\n this.boardMemberFormControls.forEach((control: TeamMemberFormControl) => {\n control.firstNameFormControl.disable();\n control.lastNameFormControl.disable();\n });\n this.directorsMemberFormControls.forEach((control: TeamMemberFormControl) => {\n control.firstNameFormControl.disable();\n control.lastNameFormControl.disable();\n });\n this.contactAddressFormControl.disable();\n this.contactEmailFormControl.disable();\n this.contactFirstNameFormControl.disable();\n this.contactLastNameFormControl.disable();\n this.contactPhoneFormControl.disable();\n this.contactWebsiteFormControl.disable();\n }\n }\n\n private addMemberFormControl(formControls: TeamMemberFormControl[]): void {\n const control: TeamMemberFormControl = {\n teamMemberId: 0,\n firstNameFormControl: new FormControl(''),\n lastNameFormControl: new FormControl(''),\n functionFormControl: new FormControl('', [\n Validators.maxLength(this.FUNCTION_MAX_LENGTH)\n ])\n };\n control.firstNameFormControl.setValidators([\n Validators.maxLength(this.NAME_MAX_LENGTH),\n (itemControl: any) => this.checkNameControl(control.firstNameFormControl, control.lastNameFormControl) ? null : {required: {valid: false}}\n ]);\n control.lastNameFormControl.setValidators([\n Validators.maxLength(this.NAME_MAX_LENGTH),\n (itemControl: any) => this.checkNameControl(control.lastNameFormControl, control.firstNameFormControl) ? null : {required: {valid: false}}\n ]);\n formControls.push(control);\n }\n\n private buildTeamMembersFormControls(): void {\n const teamControls: TeamMemberFormControl[] = [];\n const boardControls: TeamMemberFormControl[] = [];\n const directorsControls: TeamMemberFormControl[] = [];\n for (let i = 0; i < this._teamMembers.length; i++) {\n const control: TeamMemberFormControl = {\n teamMemberId: this._teamMembers[i].id,\n firstNameFormControl: new FormControl('', [\n Validators.maxLength(this.NAME_MAX_LENGTH),\n (itemControl: any) => itemControl &&\n this.checkNameControl(itemControl.firstNameFormControl, itemControl.lastNameFormControl) ? null\n : {required: {valid: false}}\n ]),\n lastNameFormControl: new FormControl('', [\n Validators.maxLength(this.NAME_MAX_LENGTH),\n (itemControl: any) => itemControl &&\n this.checkNameControl(itemControl.lastNameFormControl, itemControl.firstNameFormControl) ? null\n : {required: {valid: false}}\n ]),\n functionFormControl: new FormControl('', [\n Validators.maxLength(this.FUNCTION_MAX_LENGTH)\n ])\n };\n control.firstNameFormControl.setValue(this._teamMembers[i].firstName);\n control.lastNameFormControl.setValue(this._teamMembers[i].lastName);\n control.functionFormControl.setValue(this._teamMembers[i].teamFunction);\n\n if (this._teamMembers[i].teamMemberTypeId === TeamMemberType.ID_MEMBER) {\n teamControls.push(control);\n } else if (this._teamMembers[i].teamMemberTypeId === TeamMemberType.ID_ADVISORY_BOARD) {\n boardControls.push(control);\n } else if (this._teamMembers[i].teamMemberTypeId === TeamMemberType.ID_BOARD_OF_DIRECTORS) {\n directorsControls.push(control);\n }\n }\n\n this.teamMemberFormControls = teamControls;\n this.boardMemberFormControls = boardControls;\n this.directorsMemberFormControls = directorsControls;\n\n if (this.teamMemberFormControls.length === 0) {\n this.onAddTeamMemberClicked();\n }\n if (this.boardMemberFormControls.length === 0) {\n this.onAddBoardMemberClicked();\n }\n if (this.directorsMemberFormControls.length === 0) {\n this.onAddDirectorsMemberClicked();\n }\n }\n\n private fireChangeTeamMembers(): void {\n const teamMembers: ProjectTeamMember[] = [];\n for (let i = 0; i < this.teamMemberFormControls.length; i++) {\n const teamMember: ProjectTeamMember = this.buildTeamMember(this.teamMemberFormControls[i]);\n if (teamMember) {\n teamMember.teamMemberTypeId = TeamMemberType.ID_MEMBER;\n teamMembers.push(teamMember);\n }\n }\n for (let i = 0; i < this.boardMemberFormControls.length; i++) {\n const teamMember: ProjectTeamMember = this.buildTeamMember(this.boardMemberFormControls[i]);\n if (teamMember) {\n teamMember.teamMemberTypeId = TeamMemberType.ID_ADVISORY_BOARD;\n teamMembers.push(teamMember);\n }\n }\n for (let i = 0; i < this.directorsMemberFormControls.length; i++) {\n const teamMember: ProjectTeamMember = this.buildTeamMember(this.directorsMemberFormControls[i]);\n if (teamMember) {\n teamMember.teamMemberTypeId = TeamMemberType.ID_BOARD_OF_DIRECTORS;\n teamMembers.push(teamMember);\n }\n }\n\n this._teamMembers = teamMembers;\n this.teamMembersChange.emit(teamMembers);\n }\n\n private buildTeamMember(control: TeamMemberFormControl): ProjectTeamMember {\n const firstName: string = control.firstNameFormControl.value ? control.firstNameFormControl.value.trim() : '';\n const lastName: string = control.lastNameFormControl.value ? control.lastNameFormControl.value.trim() : '';\n const functionName: string = control.functionFormControl.value ? control.functionFormControl.value.trim() : '';\n if (firstName.length && lastName) {\n const teamMember: ProjectTeamMember = new ProjectTeamMember();\n teamMember.id = control.teamMemberId;\n teamMember.projectId = this._project.id;\n teamMember.firstName = firstName;\n teamMember.lastName = lastName;\n teamMember.teamFunction = functionName;\n return teamMember;\n }\n\n return null;\n }\n\n private fireChangeProject(): void {\n this._project.teamPicture = this.teamImageData.new ? this.teamImageData.new : this.teamImageData.current;\n this._project.contactFirstName = this.contactFirstNameFormControl.value;\n this._project.contactLastName = this.contactLastNameFormControl.value;\n this._project.contactEmail = this.contactEmailFormControl.value;\n this._project.contactWebsite = this.contactWebsiteFormControl.value;\n this._project.contactPhone = this.contactPhoneFormControl.value;\n this._project.contactAddress = this.contactAddressFormControl.value;\n\n this.projectChange.emit(this._project);\n }\n\n private checkNameControl(testedControl: FormControl, relatedControl: FormControl): boolean {\n // si le related control est null, c'est ok\n // si le related control contient quelque chose, le tested doit aussi contenir quelque chose\n const relatedValue: string = relatedControl?.value ? relatedControl?.value.trim() : '';\n if (relatedValue.length) {\n const testedValue: string = testedControl?.value ? testedControl?.value.trim() : '';\n\n return testedValue.length > 0;\n }\n\n return true;\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n\nexport interface TeamMemberFormControl {\n teamMemberId: number;\n firstNameFormControl: FormControl;\n lastNameFormControl: FormControl;\n functionFormControl?: FormControl;\n}\n","\n

{{ 'Review_explanation_5' | translate }}

\n \n \n {{ 'Invalid_value' | translate }}\n {{ messageFormControl.value.length }}/{{ MESSAGE_MAX_LENGTH }}\n \n
\n\n \n \n\n","import { AfterViewInit, Component, Inject } from '@angular/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'projects-ask-changes-dialog',\n providers: [],\n styleUrls: ['./ask-changes-dialog.scss'],\n templateUrl: './ask-changes-dialog.html'\n})\nexport class ProjectsAskChangesDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly MESSAGE_MAX_LENGTH: number = 500;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public messageFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.MESSAGE_MAX_LENGTH)\n ]);\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public dialog: MatDialogRef,\n private _translater: TranslateService,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onConfirmClicked(): void {\n this.dialog.close({\n confirmed: true,\n message: this.messageFormControl.value\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","\n \n

{{ 'Review_explanation_1' | translate }}

\n

{{ 'Review_explanation_2' | translate }}

\n

\n warning_outline\n {{ 'Project_contains_invalid_data' | translate }}\n

\n

0\"\n class=\"warning\">\n warning_outline\n {{ 'The_following_fields_must_be_completed_before_asking_a_review' | translate }}\n

\n
\n
{{ group.stepName | translate }}
\n \n
\n \n
\n \n

{{ 'Review_explanation_3' | translate }}

\n

{{ 'Review_explanation_4' | translate }}

\n

{{ 'Review_explanation_5' | translate }}

\n
\n \n \n \n
\n
\n

{{ 'Review_explanation_6' | translate }}

\n

{{ 'Review_explanation_7' | translate }}

\n

{{ 'Review_explanation_8' | translate }}

\n

{{ 'Review_explanation_9' | translate }}

\n
\n","import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { ProjectsAskChangesDialogComponent } from '../ask-changes-dialog/ask-changes-dialog';\nimport { Conf } from '../../../_conf';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ProjectListingFieldsGroup } from '../../pages/edit/edit';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { Project, ProjectValidationState } from '../../../_common/providers/models';\nimport { MatStepper } from '@angular/material/stepper';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'projects-edit-project-review',\n providers: [],\n styleUrls: ['./edit-project-review.scss'],\n templateUrl: './edit-project-review.html'\n})\nexport class ProjectsEditProjectReviewComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly STATE_ID_DRAFT: number = ProjectValidationState.ID_DRAFT;\n public readonly STATE_ID_REVIEW: number = ProjectValidationState.ID_PENDING_VALIDATION;\n public readonly STATE_ID_PUBLISHED: number = ProjectValidationState.ID_PUBLISHED;\n public readonly STATE_ID_REFUSED: number = ProjectValidationState.ID_REFUSED;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public isLoading: boolean = false;\n @Output() public projectChange: EventEmitter = new EventEmitter();\n @Input() public rights: ProjectRights = new ProjectRights(this._utils);\n @Input() public canSave: boolean = false;\n @Input() public mandatoryFields: ProjectListingFieldsGroup[] = [];\n @Input() public stepper: MatStepper;\n @Output() public onAskedForReview: EventEmitter = new EventEmitter();\n public missingMandatoryFields: ProjectListingFieldsGroup[] = [];\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _dialoger: MatDialog,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n private _project: Project = new Project();\n\n public get project() {\n return this._project;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set project(project: Project) {\n this._project = project;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public canAskForReview(): boolean {\n return this.canSave\n && this.missingMandatoryFields.length == 0\n && !this.isLoading;\n }\n\n public updateMissingMandatoryFields(): void {\n const fields: ProjectListingFieldsGroup[] = [];\n for (let i = 0; i < this.mandatoryFields.length; i++) {\n let group: ProjectListingFieldsGroup = null;\n for (let j = 0; j < this.mandatoryFields[i].fields.length; j++) {\n if (!this.mandatoryFields[i].fields[j].formControl.value || this.mandatoryFields[i].fields[j].formControl.value.length === 0) {\n if (!group) {\n group = {\n stepIndex: this.mandatoryFields[i].stepIndex,\n stepName: this.mandatoryFields[i].stepName,\n fields: []\n };\n }\n\n group.fields.push(this.mandatoryFields[i].fields[j]);\n }\n }\n\n if (group) {\n fields.push(group);\n }\n }\n\n this.missingMandatoryFields = fields;\n }\n\n public onFieldClicked(stepIndex: number, fieldId: string): void {\n if (this.stepper) {\n this.stepper.selectedIndex = stepIndex;\n setTimeout(() => document.getElementById(fieldId).focus(), 300); // le temps que l'animation se termine\n }\n }\n\n public onAsForReviewClicked(): void {\n /*\n let dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Review_explanation_1',\n confirmActionText: 'Ask_for_review',\n confirmColor: 'primary'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n this.onAskedForReview.emit();\n }\n });\n */\n this.onAskedForReview.emit();\n }\n\n public onPublishClicked(): void {\n /*\n let dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Review_explanation_3',\n confirmActionText: 'Publish',\n confirmColor: 'primary'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n this.isLoading = true;\n this._projectsProvider.validateProject(this.project, ProjectValidationState.ID_PUBLISHED)\n .then(() => {\n this.isLoading = false;\n this._router.navigate(['academic-ventures', this.project.id]);\n this._toaster.open(this._translater.instant('Project_saved'), '', { duration: 5000 });\n })\n .catch((error: any) => this.onError(error));\n }\n });\n */\n this.isLoading = true;\n this._projectsProvider.validateProject(this.project, ProjectValidationState.ID_PUBLISHED)\n .then(() => {\n this.isLoading = false;\n this._router.navigate(['academic-ventures', this.project.id]);\n this._toaster.open(this._translater.instant('Project_saved'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n\n public onRefuseClicked(): void {\n /*\n let dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Review_explanation_4',\n confirmActionText: 'Refuse',\n confirmColor: 'warn'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n this.isLoading = true;\n this._projectsProvider.validateProject(this.project, ProjectValidationState.ID_REFUSED)\n .then(() => {\n this.isLoading = false;\n this._router.navigate(['academic-ventures', 'pending-validation']);\n this._toaster.open(this._translater.instant('Project_saved'), '', { duration: 5000 });\n })\n .catch((error: any) => this.onError(error));\n }\n });\n */\n this.isLoading = true;\n this._projectsProvider.validateProject(this.project, ProjectValidationState.ID_REFUSED)\n .then(() => {\n this.isLoading = false;\n this._router.navigate(['academic-ventures', 'pending-validation']);\n this._toaster.open(this._translater.instant('Project_saved'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n\n public onAskChangesClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(ProjectsAskChangesDialogComponent);\n dialog.afterClosed().subscribe((result: any) => {\n if (result) {\n this.isLoading = true;\n this._projectsProvider.validateProject(this.project, ProjectValidationState.ID_DRAFT, result.message)\n .then(() => {\n this.isLoading = false;\n this._router.navigate(['academic-ventures', 'pending-validation']);\n this._toaster.open(this._translater.instant('Project_saved'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n","
\n \n
\n \n \n
\n
\n {{ 'Invalid_value' | translate }}\n {{ control.value?.length || 0 }}/{{ maxFieldLength }}\n
\n
\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormControl } from '@angular/forms';\n\n@Component({\n selector: 'rich-text-editor',\n templateUrl: './rich-text-editor.component.html',\n styleUrls: ['./rich-text-editor.component.css'],\n})\nexport class RichTextEditorComponent implements OnInit {\n\n public quillConfig = {\n toolbar: [\n ['bold', 'italic'],\n [{list: 'ordered'}, {list: 'bullet'}],\n [{script: 'sub'}, {script: 'super'}],\n ['link', 'video'],\n ['clean'],\n ],\n };\n\n public styles = {\n width: '100%',\n minHeight: '85px',\n fontSize: '14px',\n };\n\n @Input() public control: FormControl;\n @Input() public id: string;\n @Input() public maxFieldLength: number;\n @Input() public placeholder: string;\n @Output() public changeFunction: EventEmitter = new EventEmitter();\n\n constructor() {\n }\n\n public ngOnInit() {\n this.control = this.control || new FormControl();\n }\n\n public onContentChanged(event): void {\n this.changeFunction.emit();\n }\n\n}\n","\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ titleFormControl.value.length }}/{{ TITLE_MAX_LENGTH }}\n \n \n \n {{ 'Invalid_value' | translate }}\n {{ subtitleFormControl.value.length }}/{{ SUBTITLE_MAX_LENGTH }}\n \n\n \n\n
\n
\n \n \n
\n \n \n
\n \n
\n {{ getProjectGroupTypeIcon(item) }}\n {{ item.group.name }}\n
\n \n {{ type.name }}\n \n
\n
\n \n \n
\n
\n
\n \n \n
\n \n \n
\n \n {{ area.name }}\n \n
\n \n \n
\n
\n
\n
\n \n \n
\n = 0 ? '' : 'You_must_specify_project_type' | translate\">\n \n \n {{ item.name }}\n \n \n \n \n \n \n {{ item.name }}\n \n \n \n
\n \n
{{('required_warning' | translate)}}
\n
\n \n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ uniquenessFormControl.value.length }}/{{ UNIQUENESS_MAX_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ unmetNeedFormControl.value.length }}/{{ UNMET_NEED_MAX_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ marketSizeFormControl.value.length }}/{{ MARKET_SIZE_MAX_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ competitionFormControl.value.length }}/{{ COMPETITION_MAX_LENGTH }}\n \n
\n
\n \n
\n","import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Conf } from '../../../_conf';\nimport { ProjectsProvider, ProjectTypeGoupWithTypes } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { Utils } from '../../../_common/providers/utils';\nimport { ProjectRights } from '../../providers/project-rights';\nimport {\n DevelopmentPhase,\n PatentState,\n ProjectCase,\n ProjectCase_ProjectType,\n ProjectCase_TherapeuticArea,\n ProjectType,\n TherapeuticArea\n} from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-edit-project-case',\n providers: [],\n styleUrls: ['./edit-project-case.scss'],\n templateUrl: './edit-project-case.html'\n})\nexport class ProjectsEditProjectCaseComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly TITLE_MAX_LENGTH: number = 250;\n public readonly SUBTITLE_MAX_LENGTH: number = 250;\n public readonly DESCRIPTION_MAX_LENGTH: number = 1000;\n public readonly UNIQUENESS_MAX_LENGTH: number = 1000;\n public readonly UNMET_NEED_MAX_LENGTH: number = 1000;\n public readonly MARKET_SIZE_MAX_LENGTH: number = 1000;\n public readonly COMPETITION_MAX_LENGTH: number = 1000;\n public readonly REVIEW_IDENTIFIER: string = 'projectcase-';\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n public showMore: boolean = false;\n\n public titleFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.TITLE_MAX_LENGTH),\n ]);\n public subtitleFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.SUBTITLE_MAX_LENGTH)\n ]);\n public descriptionFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.DESCRIPTION_MAX_LENGTH),\n ]);\n public uniquenessFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.UNIQUENESS_MAX_LENGTH)\n ]);\n public unmetNeedFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.UNMET_NEED_MAX_LENGTH)\n ]);\n public marketSizeFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.MARKET_SIZE_MAX_LENGTH)\n ]);\n public competitionFormControl: FormControl = new FormControl('', [\n Validators.maxLength(this.COMPETITION_MAX_LENGTH)\n ]);\n public projectTypeFormControl: FormControl = new FormControl('', [\n Validators.min(1),\n ]);\n public therapeuticAreaFormControl: FormControl = new FormControl('', [\n Validators.min(1),\n ]);\n\n public developmentPhaseFormControl: FormControl = new FormControl('', [\n Validators.min(1),\n ]);\n public developmentPhases: DevelopmentPhase[] = [];\n public patentStateFormControl: FormControl = new FormControl('', [\n Validators.min(1),\n ]);\n\n public _projectTypeIds: number[] = [];\n public _therapeuticAreaIds: number[] = [];\n @Output() public onProjectCaseProjectTypeChange: EventEmitter = new EventEmitter();\n @Output() public onProjectCaseTherapeuticAreaChange: EventEmitter = new EventEmitter();\n @Output() public onFormChanged: EventEmitter = new EventEmitter();\n @Output() public onAddProjectCase: EventEmitter = new EventEmitter();\n @Output() public onRemoveProjectCase: EventEmitter = new EventEmitter();\n public projectTypeGroups: ProjectTypeGoupWithTypes[] = [];\n public projectTypes: ProjectType[] = [];\n public therapeuticAreas: TherapeuticArea[] = [];\n public patentStates: PatentState[] = [];\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _dialoger: MatDialog,\n private _utils: Utils,\n private _storage: ModelsStorage,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n private _projectCase: ProjectCase = new ProjectCase();\n\n public get projectCase() {\n return this._projectCase;\n }\n\n @Input()\n public set projectCase(projectCase: ProjectCase) {\n this._projectCase = projectCase;\n this.titleFormControl.setValue(projectCase.title ? projectCase.title : '');\n this.developmentPhaseFormControl.setValue(projectCase.developmentPhaseId);\n this.patentStateFormControl.setValue(projectCase.patentStateId);\n this.subtitleFormControl.setValue(projectCase.subtitle ? projectCase.subtitle : '');\n this.descriptionFormControl.setValue(projectCase.description ? projectCase.description : '');\n this.uniquenessFormControl.setValue(projectCase.uniqueness ? projectCase.uniqueness : '');\n this.unmetNeedFormControl.setValue(projectCase.unmetNeed ? projectCase.unmetNeed : '');\n this.marketSizeFormControl.setValue(projectCase.marketSize ? projectCase.marketSize : '');\n this.competitionFormControl.setValue(projectCase.competition ? projectCase.competition : '');\n this.updateRights();\n }\n\n private _rights: ProjectRights = new ProjectRights(this._utils);\n\n public get rights() {\n return this._rights;\n }\n\n @Input()\n public set rights(rights: ProjectRights) {\n this._rights = rights;\n this.updateRights();\n }\n\n // bind projectCaseProjectType and filter with projectCaseId\n private _projectCaseProjectType: ProjectCase_ProjectType[] = [];\n\n public get projectCaseProjectType() {\n return this._projectCaseProjectType;\n }\n\n @Input()\n public set projectCaseProjectType(projectCaseProjectType: ProjectCase_ProjectType[]) {\n this._projectCaseProjectType = projectCaseProjectType;\n this._projectTypeIds = this._utils.getKeyValues(projectCaseProjectType, 'projectTypeId');\n this.projectTypeFormControl.setValue(this._projectTypeIds);\n }\n\n // bind projectCaseTherapeuticArea and filter for projectCases\n private _projectCaseTherapeuticArea: ProjectCase_TherapeuticArea[] = [];\n\n public get projectCaseTherapeuticArea() {\n return this._projectCaseTherapeuticArea;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set projectCaseTherapeuticArea(projectCaseTherapeuticArea: ProjectCase_TherapeuticArea[]) {\n this._projectCaseTherapeuticArea = projectCaseTherapeuticArea;\n this.therapeuticAreaFormControl.setValue(this._utils.getKeyValues(projectCaseTherapeuticArea, 'therapeuticAreaId'));\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public async ngAfterViewInit() {\n try {\n await this.loadStaticData();\n this.onAddProjectCase.emit(this._projectCase.id);\n } catch (e) {\n this.onError(e);\n }\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onProjectTypeIdChanged(): void {\n this._onFormChanged();\n }\n\n public _onFormChanged(): void {\n this.fireChange();\n this._changesGuard.registerChanges();\n this.onFormChanged.emit();\n }\n\n public canSave(): boolean {\n return !this.descriptionFormControl.invalid\n && !this.titleFormControl.invalid\n && !this.uniquenessFormControl.invalid\n && !this.marketSizeFormControl.invalid\n && !this.competitionFormControl.invalid\n && !this.projectTypeFormControl.invalid\n && !this.subtitleFormControl.invalid\n && !this.therapeuticAreaFormControl.invalid\n && !this.uniquenessFormControl.invalid\n && !this.developmentPhaseFormControl.invalid;\n }\n\n public onAllProjectTypesClicked(): void {\n this.projectTypeFormControl.setValue(this._utils.getKeyValues(this.projectTypes, 'id'));\n this.onProjectTypeIdChanged();\n }\n\n public onNoProjectTypesClicked(): void {\n this.projectTypeFormControl.setValue([]);\n this.onProjectTypeIdChanged();\n }\n\n public getProjectGroupTypeIcon(groupData: ProjectTypeGoupWithTypes): string {\n const selectedItems: number[] = this._utils.findManyIn(this._projectTypeIds, groupData.types);\n if (selectedItems.length === groupData.types.length) {\n return 'check_box';\n } else if (selectedItems.length === 0) {\n return 'check_box_outline_blank';\n }\n\n return 'indeterminate_check_box';\n }\n\n public onProjectTypeGroupClicked(groupData: ProjectTypeGoupWithTypes): void {\n const selectedItems: ProjectType[] = this._utils.findManyIn(this._projectTypeIds, groupData.types);\n if (selectedItems.length === groupData.types.length) {\n selectedItems.forEach((item: ProjectType) => {\n this._projectTypeIds.splice(this._projectTypeIds.indexOf(item.id), 1);\n });\n } else {\n groupData.types.forEach((type: ProjectType) => {\n if (this._projectTypeIds.indexOf(type.id) < 0) {\n this._projectTypeIds.push(type.id);\n }\n });\n }\n\n this.projectTypeFormControl.setValue(this._projectTypeIds);\n this.onProjectTypeIdChanged();\n }\n\n public onAllTherapeuticAreasClicked(): void {\n this.therapeuticAreaFormControl.setValue(this._utils.getKeyValues(this.therapeuticAreas, 'id'));\n this._onFormChanged();\n }\n\n public onNoTherapeuticAreasClicked(): void {\n this.therapeuticAreaFormControl.setValue([]);\n this._onFormChanged();\n }\n\n public onToggleShowMore(): void {\n this.showMore = !this.showMore;\n if (!this.showMore) {\n setTimeout(() => {\n document.getElementsByTagName('html')[0].scrollTo({\n left: 0,\n top: 96,\n behavior: 'smooth'\n });\n }, 10);\n }\n }\n\n public getIdField(field: string) {\n return `${this.REVIEW_IDENTIFIER}${this._projectCase.id}_${field}`;\n }\n\n public removeProjectCase(): void {\n this.onRemoveProjectCase.emit(this._projectCase);\n }\n\n public hasMissingFields(): boolean {\n return !((this._projectCase.title !== '' && this._projectCase.title !== null) &&\n this._projectCase.developmentPhaseId !== null &&\n (this._projectCase.description !== null && this._projectCase.description !== '') &&\n this._projectCase.patentStateId !== null &&\n this._projectCaseProjectType.length > 0 &&\n this._projectCaseTherapeuticArea.length > 0);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadStaticData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this.projectsProvider.getProjectTypeGroups(),\n this._storage.select(TherapeuticArea).orderBy('name').get(),\n this._storage.select(ProjectType).get(),\n this._storage.select(PatentState).get(),\n this._storage.select(DevelopmentPhase).orderBy('ordinal').get()\n ])\n .then((data: any[]) => {\n this.projectTypeGroups = data[0];\n this.therapeuticAreas = data[1];\n this.projectTypes = data[2];\n this.patentStates = data[3];\n this.developmentPhases = data[4];\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private updateRights(): void {\n if (this.rights.EDIT) {\n this.titleFormControl.enable();\n this.subtitleFormControl.enable();\n this.projectTypeFormControl.enable();\n this.therapeuticAreaFormControl.enable();\n this.descriptionFormControl.enable();\n this.uniquenessFormControl.enable();\n this.unmetNeedFormControl.enable();\n this.marketSizeFormControl.enable();\n this.competitionFormControl.enable();\n this.developmentPhaseFormControl.enable();\n this.patentStateFormControl.enable();\n } else {\n this.titleFormControl.disable();\n this.subtitleFormControl.disable();\n this.projectTypeFormControl.disable();\n this.therapeuticAreaFormControl.disable();\n this.descriptionFormControl.disable();\n this.uniquenessFormControl.disable();\n this.unmetNeedFormControl.disable();\n this.marketSizeFormControl.disable();\n this.competitionFormControl.disable();\n this.developmentPhaseFormControl.disable();\n this.patentStateFormControl.disable();\n }\n }\n\n private fireChange(): void {\n this._projectCase.title = this.titleFormControl.value;\n this._projectCase.subtitle = this.subtitleFormControl.value;\n this._projectCase.description = this.descriptionFormControl.value;\n this._projectCase.uniqueness = this.uniquenessFormControl.value;\n this._projectCase.unmetNeed = this.unmetNeedFormControl.value;\n this._projectCase.marketSize = this.marketSizeFormControl.value;\n this._projectCase.competition = this.competitionFormControl.value;\n this._projectCase.developmentPhaseId = this.developmentPhaseFormControl.value;\n this._projectCase.patentStateId = this.patentStateFormControl.value;\n\n this._projectTypeIds = this.projectTypeFormControl.value ? this.projectTypeFormControl.value : [];\n this._therapeuticAreaIds = this.therapeuticAreaFormControl.value ? this.therapeuticAreaFormControl.value : [];\n\n // filter projectTypes\n if (this._projectTypeIds.length < 1) {\n // remove all\n this._projectCaseProjectType = [];\n // this._projectCaseProjectType = this._projectCaseProjectType.filter((item) => item.projectCaseId !== this._projectCase.id);\n } else {\n // remove items which are not selected anymore\n this._projectTypeIds.forEach((itemId) => {\n\n const selectedItemsOnly = (item) => this._projectTypeIds.indexOf(item.projectTypeId) > -1;\n this._projectCaseProjectType = this._projectCaseProjectType.filter(selectedItemsOnly);\n\n // add new items\n if (!this._projectCaseProjectType.some((e) => e.projectTypeId === itemId)) {\n const newItem = new ProjectCase_ProjectType();\n newItem.projectCaseId = this._projectCase.id;\n newItem.projectTypeId = itemId;\n this._projectCaseProjectType.push(newItem);\n }\n });\n }\n\n // filter therapeuticArea\n if (this._therapeuticAreaIds.length < 1) {\n this._projectCaseTherapeuticArea = [];\n } else {\n // remove items which are not selected anymore\n this._therapeuticAreaIds.forEach((itemId) => {\n\n const selectedItemsOnly = (item) => this._therapeuticAreaIds.indexOf(item.therapeuticAreaId) > -1;\n this._projectCaseTherapeuticArea = this._projectCaseTherapeuticArea.filter(selectedItemsOnly);\n\n // add new items\n if (!this._projectCaseTherapeuticArea.some((e) => e.therapeuticAreaId === itemId)) {\n const newItem = new ProjectCase_TherapeuticArea();\n newItem.projectCaseId = this._projectCase.id;\n newItem.therapeuticAreaId = itemId;\n this._projectCaseTherapeuticArea.push(newItem);\n }\n });\n }\n\n this.onProjectCaseProjectTypeChange.emit({projectCaseId: this._projectCase.id, types: this._projectCaseProjectType});\n this.onProjectCaseTherapeuticAreaChange.emit({\n projectCaseId: this._projectCase.id,\n areas: this._projectCaseTherapeuticArea\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n\n}\n\nexport interface ProjectCaseProjectTypes {\n projectCaseId: number;\n types: ProjectCase_ProjectType[];\n}\n\nexport interface ProjectCaseTherapeuticArea {\n projectCaseId: number;\n areas: ProjectCase_TherapeuticArea[];\n}\n","\n \n \n
\n \n more_vert\n \n
\n \n
\n {{ 'Last_changed_by_x_on_y' | translate: {\n x: lastUpdater.firstName + ' ' + lastUpdater.lastName,\n y: (project.updateDate | dateClosest)\n } }}\n
\n \n \n {{ 'Biotech_venture' | translate }}\n \n \n
\n \n
\n
\n\n \n {{ 'Project_cases' | translate }}\n
0\">\n
\n \n \n
\n
\n\n
\n \n
\n
{{ 'add_new_project' | translate }}
\n
\n \n
\n
\n
\n
\n
\n \n \n
\n
\n\n\n \n {{ 'Current_situation' | translate }}\n \n \n
\n \n \n
\n
\n \n {{ 'Past_funding_and_prizes' | translate }}\n \n \n
\n \n \n
\n
\n \n {{ 'Partnership_and_outlicensing' | translate }}\n \n \n
\n \n \n
\n
\n \n {{ 'Team_and_contacts' | translate }}\n \n \n
\n \n \n
\n
\n \n \n {{ 'Academic_link' | translate }}\n \n \n
\n \n \n
\n
\n \n {{ 'Review' | translate }}\n \n \n
\n \n
\n
\n
\n
\n \n
\n \n \n \n \n
\n \n \n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component, QueryList, ViewChild, ViewChildren } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { MenuItem } from '../../../_common/components/side-menu/side-menu';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { IGroupedProjectCaseProjectTypes, ProjectsProvider } from '../../providers/projects-provider';\nimport { ProjectsEditProjectAcademicComponent } from '../../components/edit-project-academic/edit-project-academic';\nimport { ProjectsEditProjectSituationComponent } from '../../components/edit-project-situation/edit-project-situation';\nimport { ProjectsEditProjectFundingComponent } from '../../components/edit-project-funding/edit-project-funding';\nimport {\n ProjectsEditProjectMiscellaneousComponent\n} from '../../components/edit-project-miscellaneous/edit-project-miscellaneous';\nimport { ProjectsEditProjectPartnershipComponent } from '../../components/edit-project-partnership/edit-project-partnership';\nimport { ProjectsEditProjectProjectComponent } from '../../components/edit-project-project/edit-project-project';\nimport { ProjectsEditProjectTeamComponent } from '../../components/edit-project-team/edit-project-team';\nimport { ProjectsEditProjectReviewComponent } from '../../components/edit-project-review/edit-project-review';\nimport {\n ProjectCaseProjectTypes,\n ProjectCaseTherapeuticArea,\n ProjectsEditProjectCaseComponent\n} from '../../components/edit-project-case/edit-project-case';\nimport { ProjectRights } from '../../providers/project-rights';\nimport {\n Project,\n ProjectCase,\n ProjectCase_ProjectType,\n ProjectCase_TherapeuticArea,\n ProjectMembership,\n ProjectPastFunding,\n ProjectPrize,\n ProjectTeamMember,\n User,\n User_AcademicInstitution\n} from '../../../_common/providers/models';\nimport { MatStepper } from '@angular/material/stepper';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'projects-edit-page',\n providers: [],\n styleUrls: ['./edit.scss'],\n templateUrl: './edit.html'\n})\nexport class ProjectsEditPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = true;\n public isSaveLoading: boolean = false;\n public is401: boolean = false;\n public is404: boolean = false;\n public listingProgress: number = 0;\n public rights: ProjectRights = new ProjectRights(this._utils);\n\n public backMenu: MenuItem = null;\n public backUrl: string = null;\n public backTitle: string = this._translater.instant('Back');\n\n public project: Project = new Project();\n public membership: ProjectMembership = null;\n public projectTypeIds: number[] = [];\n public projectCaseProjectType: ProjectCase_ProjectType[] = null;\n public groupedProjectCaseProjectType: IGroupedProjectCaseProjectTypes[] = null;\n public projectCaseTherapeuticArea: ProjectCase_TherapeuticArea[] = null;\n public therapeuticAreaIds: number[] = [];\n public prizes: ProjectPrize[] = [];\n public pastFundings: ProjectPastFunding[] = [];\n public teamMembers: ProjectTeamMember[] = [];\n public projectCases: ProjectCase[] = [];\n public lastUpdater: User = null;\n\n @ViewChild(MatStepper, {static: false}) public stepper: MatStepper;\n @ViewChild(ProjectsEditProjectAcademicComponent, {static: false}) public academicComponent: ProjectsEditProjectAcademicComponent;\n @ViewChild(ProjectsEditProjectCaseComponent, {static: false}) public casesComponent: ProjectsEditProjectCaseComponent;\n @ViewChild(ProjectsEditProjectSituationComponent, {static: false}) public situationComponent: ProjectsEditProjectSituationComponent;\n @ViewChild(ProjectsEditProjectFundingComponent, {static: false}) public fundingComponent: ProjectsEditProjectFundingComponent;\n @ViewChild(ProjectsEditProjectMiscellaneousComponent, {static: false}) public miscellaneousComponent: ProjectsEditProjectMiscellaneousComponent;\n @ViewChild(ProjectsEditProjectPartnershipComponent, {static: false}) public partnershipComponent: ProjectsEditProjectPartnershipComponent;\n @ViewChild(ProjectsEditProjectProjectComponent, {static: false}) public projectComponent: ProjectsEditProjectProjectComponent;\n @ViewChild(ProjectsEditProjectTeamComponent, {static: false}) public teamComponent: ProjectsEditProjectTeamComponent;\n @ViewChild(ProjectsEditProjectReviewComponent, {static: false}) public reviewComponent: ProjectsEditProjectReviewComponent;\n\n @ViewChildren(ProjectsEditProjectCaseComponent) public casesComponents!: QueryList;\n\n public mandatoryFields: ProjectListingFieldsGroup[] = [];\n //\n public readonly REVIEW_IDENTIFIER: string = 'projectcase-';\n\n //\n //\n // CONSTRUCTOR\n //\n private _user_academicInstitutions: User_AcademicInstitution[] = [];\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _toaster: MatSnackBar,\n private _dialoger: MatDialog,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _changesGuard: HasPendingChangesGuard,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n // hack pour corriger position du stepper, inspiré de : https://github.com/angular/material2/issues/8881\n this.stepper.selectionChange.subscribe((event: any) => {\n this.scrollToStep(event.selectedIndex);\n });\n\n this.navigation.updateMenus();\n this._route.params.subscribe((params: any) => {\n this.isLoading = true;\n this.loadProject(parseInt(params.projectId))\n .then(() => {\n this.loadData()\n .then(() => {\n this.stepper.selectionChange.subscribe(() => this.onStepChanged());\n this._title.setTitle(this.project.name + ' | ' + this.conf.platformName);\n this.initFormFields();\n this.reviewComponent.updateMissingMandatoryFields();\n this.updateListingProgress();\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n })\n .catch((error: any) => this.onError(error));\n\n this._changeDetector.detectChanges();\n });\n\n this._route.queryParams.subscribe((params: any) => {\n if (params.backUrl) {\n this.backUrl = params.backUrl;\n if (params.backTitle) {\n this.backTitle = params.backTitle;\n }\n this.backMenu = {\n icon: 'arrow_back',\n title: this.backTitle,\n url: this.backUrl\n };\n this._changeDetector.detectChanges();\n }\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public canProjectCasesSave(): boolean {\n // this.casesComponents.some returns true if any of canSave() is false, so the return value has to be negated\n return !this.casesComponents.some((element) => element.canSave() === false);\n }\n\n public canSave(): boolean {\n return this.rights.EDIT\n && this.situationComponent && this.situationComponent.canSave()\n && this.fundingComponent && this.fundingComponent.canSave()\n // && this.miscellaneousComponent && this.miscellaneousComponent.canSave()\n && this.partnershipComponent && this.partnershipComponent.canSave()\n && this.projectComponent && this.projectComponent.canSave()\n && this.teamComponent && this.teamComponent.canSave()\n && this.academicComponent && this.academicComponent.canSave()\n && this.canProjectCasesSave();\n }\n\n public onListUsersClicked(): void {\n this._router.navigate(['academic-ventures', this.project.id, 'memberships'], {\n queryParams: {\n backUrl: this._router.url\n }\n });\n }\n\n public onSaveClicked(): void {\n this.isLoading = true;\n this.isSaveLoading = true;\n this.save()\n .then(() => {\n // au cas où le nom du projet ait changé ...\n this.navigation.updateMenus();\n this._title.setTitle(this.project.name + ' | ' + this.conf.platformName);\n\n this.isLoading = false;\n this.isSaveLoading = false;\n this._toaster.open(this._translater.instant('Project_saved'), '', {duration: 5000});\n this._changesGuard.unregisterChanges();\n })\n .catch((error: any) => this.onError(error));\n }\n\n public async onRemoveProjectCase(projectCase: ProjectCase): Promise {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_projectCase'\n }\n });\n dialog.afterClosed().subscribe(async (confirmed: boolean) => {\n if (confirmed) {\n try {\n this.isLoading = true;\n await this.projectsProvider.deleteProjectCase(projectCase);\n this._toaster.open(this._translater.instant('ProjectCase_deleted'), '', {duration: 5000});\n\n // remove projectCase\n this.projectCases = this.projectCases.filter((item) => item.id !== projectCase.id);\n\n // remove mandatory fields\n this.mandatoryFields[1].fields = this.mandatoryFields[1].fields.filter((item) => item.identifier !== projectCase.id);\n\n // remove projectTypes and therapeuticAreas\n this.projectCaseProjectType = this.projectCaseProjectType.filter((item) => item.projectCaseId !== projectCase.id);\n this.projectCaseTherapeuticArea = this.projectCaseTherapeuticArea.filter((item) => item.projectCaseId !== projectCase.id);\n\n // add empty FormControl if no projectCase exist for review component\n if (this.projectCases.length === 0) {\n this.mandatoryFields[1].fields.push({\n fieldId: 'step_project_cases',\n name: 'Projects',\n formControl: new FormControl()\n });\n }\n this.isLoading = false;\n this.onFormChanged();\n } catch (e) {\n this.onError(e);\n }\n }\n });\n }\n\n public onFormChanged(): void {\n this.reviewComponent.updateMissingMandatoryFields();\n this.updateListingProgress();\n }\n\n public onAddProjectCase(projectCasesId: number): void {\n const prefix = this.REVIEW_IDENTIFIER + projectCasesId;\n // access projectCaseComponent from childrens with index\n const children = this.casesComponents.toArray();\n const projectCaseComponent = children[this.projectCases.findIndex((projectCase) => projectCase.id === projectCasesId)];\n this.mandatoryFields[1].fields.push(\n {\n fieldId: `${prefix}_title`,\n name: 'Name',\n formControl: projectCaseComponent.titleFormControl,\n identifier: projectCasesId\n },\n {\n fieldId: `${prefix}_type`,\n name: 'Type_of_project',\n formControl: projectCaseComponent.projectTypeFormControl,\n identifier: projectCasesId\n },\n {\n fieldId: `${prefix}_area`,\n name: 'Therapeutic_area',\n formControl: projectCaseComponent.therapeuticAreaFormControl,\n identifier: projectCasesId\n },\n {\n fieldId: `${prefix}_description`,\n name: 'Description',\n formControl: projectCaseComponent.descriptionFormControl,\n identifier: projectCasesId\n },\n {\n fieldId: `${prefix}_developmentPhase`,\n name: 'Phase_of_development',\n formControl: projectCaseComponent.developmentPhaseFormControl,\n identifier: projectCasesId\n },\n {\n fieldId: `${prefix}_patent`,\n name: 'Patent',\n formControl: projectCaseComponent.patentStateFormControl,\n identifier: projectCasesId\n },\n );\n this.reviewComponent.updateMissingMandatoryFields();\n }\n\n public onStepChanged(): void {\n this.reviewComponent.updateMissingMandatoryFields();\n }\n\n public onAskedForReview(): void {\n this.isLoading = true;\n this.isSaveLoading = true;\n this.save()\n .then(() => {\n // au cas où le nom du projet ait changé ...\n this.navigation.updateMenus();\n this._title.setTitle(this.project.name + ' | ' + this.conf.platformName);\n this._changesGuard.unregisterChanges();\n\n this.askForReview()\n .then(() => {\n this.isLoading = false;\n this.isSaveLoading = false;\n this.rights.evaluate({\n project: this.project,\n membership: this.membership,\n user: this.currentUser.user,\n user_academicInstitutions: this._user_academicInstitutions\n });\n this.is401 = !this.rights.SEE_EDIT_FORM;\n this._toaster.open(this._translater.instant('Project_saved'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n })\n .catch((error: any) => this.onError(error));\n }\n\n public onDeleteClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_project'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n this.isLoading = true;\n this.projectsProvider.deleteProject(this.project)\n .then(() => {\n this._toaster.open(this._translater.instant('Project_deleted'), '', {duration: 5000});\n this._router.navigate(['/']);\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n public onChangeStepClicked(index: number) {\n if (index > this.stepper.selectedIndex) {\n const diff: number = index - this.stepper.selectedIndex;\n for (let i = 0; i < diff; i++) {\n this.stepper.next();\n }\n } else if (index < this.stepper.selectedIndex) {\n const diff: number = this.stepper.selectedIndex - index;\n for (let i = 0; i < diff; i++) {\n this.stepper.previous();\n }\n }\n }\n\n public onAddNewProjectCaseClicked(): void {\n this.isLoading = true;\n this.saveProjectCase()\n .then(() => {\n this.isLoading = false;\n // reset mandatory field for projectCase after adding one\n if (this.projectCases.length > 0) {\n this.mandatoryFields[1].fields = [];\n this.onFormChanged();\n }\n this._toaster.open(this._translater.instant('Project_saved'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n\n public getProjectCaseProjectType(projectCaseId: number) {\n return this.projectCaseProjectType.filter((item) => item.projectCaseId === projectCaseId);\n }\n\n public getProjectCaseTherapeuticArea(projectCaseId: number) {\n return this.projectCaseTherapeuticArea.filter((item) => item.projectCaseId === projectCaseId);\n }\n\n public onProjectCaseProjectTypeChange(projectCaseProjectType: ProjectCaseProjectTypes) {\n // remove all entries related to projectCaseId\n this.projectCaseProjectType = this.projectCaseProjectType.filter((item) => item.projectCaseId !== projectCaseProjectType.projectCaseId);\n // add newly\n this.projectCaseProjectType.push(...projectCaseProjectType.types);\n }\n\n public onProjectCaseTherapeuticAreaChange(projectCaseTherapeuticArea: ProjectCaseTherapeuticArea) {\n // remove all entries related to projectCaseId\n this.projectCaseTherapeuticArea = this.projectCaseTherapeuticArea.filter((item) => item.projectCaseId !== projectCaseTherapeuticArea.projectCaseId);\n // add newly\n this.projectCaseTherapeuticArea.push(...projectCaseTherapeuticArea.areas);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n // creates new empty projectCase and save it with all projectCases in case adding and updating at the same time\n // needed, because required field reference in ask-for-review-component needs identifier for each project case\n private saveProjectCase(): Promise {\n return new Promise((resolve, reject) => {\n const singleProjectCase: ProjectCase = new ProjectCase();\n singleProjectCase.projectId = this.project.id;\n this.projectsProvider.saveProjectCase(this.project.id, [...this.projectCases, singleProjectCase], this.projectCaseProjectType, this.projectCaseTherapeuticArea)\n .then((projectCase: ProjectCase[]) => {\n this.projectCases = projectCase;\n resolve(singleProjectCase);\n })\n .catch((error: any) => this.onError(error));\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadProject(projectId: number): Promise {\n return new Promise((resolve, reject) => {\n if (!this.currentUser.isLoggedIn()) {\n reject({status: 401});\n }\n\n Promise.all([\n this._storage.select(Project).where('id').equals(projectId).get(1),\n this._storage.select(ProjectMembership)\n .where('userId').equals(this.currentUser.user.id)\n .and('projectId').equals(projectId)\n .get(1),\n this._storage.select(ProjectCase).where('projectId').equals(projectId).get()\n ])\n .then((data: any[]) => {\n if (!data[0]) {\n reject({status: 404});\n return;\n }\n\n const project: Project = data[0].clone(); // TODO si on clone pas, il y a un scénario quelque part que j'ai pas réussi à identifier qui fait altère le model en DB et je pige pas bien pourquoi ... à creuser\n if (project.raisingFundsAmount) {\n project.raisingFundsAmount = project.raisingFundsAmount / 100; // on convertit le montant en dollars (il est en cents en DB)\n }\n this.project = project;\n\n this.membership = data[1];\n\n this.projectCases = data[2];\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n /* 0 */ this._storage.select(ProjectCase_ProjectType).where('projectCaseId').in(this._utils.getKeyValues(this.projectCases, 'id')).get(),\n /* 1 */ this._storage.select(ProjectCase_TherapeuticArea).where('projectCaseId').in(this._utils.getKeyValues(this.projectCases, 'id')).get(),\n /* 2 */ this._storage.select(ProjectPrize).where('projectId').equals(this.project.id).get(),\n /* 3 */ this._storage.select(ProjectPastFunding).where('projectId').equals(this.project.id).get(),\n /* 4 */ this._storage.select(ProjectTeamMember).where('projectId').equals(this.project.id).get(),\n /* 5 */ this._storage.select(User).where('id').equals(this.project.updaterId).get(1),\n /* 6 */ this._storage.select(User_AcademicInstitution).where('userId').equals(this.currentUser.user.id).get(),\n ])\n .then((data: any[]) => {\n this.projectTypeIds = this._utils.getKeyValues(data[0], 'projectTypeId');\n this.projectCaseProjectType = data[0];\n this.therapeuticAreaIds = this._utils.getKeyValues(data[1], 'therapeuticAreaId');\n this.projectCaseTherapeuticArea = data[1];\n this.prizes = data[2];\n const pastFundings: ProjectPastFunding[] = data[3];\n for (let i = 0; i < pastFundings.length; i++) {\n pastFundings[i] = pastFundings[i];\n if (pastFundings[i].amount) {\n pastFundings[i].amount = pastFundings[i].amount / 100; // on convertit le montant en dollars (il est en cents en DB)\n }\n }\n this.pastFundings = data[3];\n this.teamMembers = data[4];\n this.lastUpdater = data[5];\n this._user_academicInstitutions = data[6];\n\n this.rights.evaluate({\n user: this.currentUser.user,\n project: this.project,\n membership: this.membership,\n user_academicInstitutions: this._user_academicInstitutions\n });\n this.is401 = !this.rights.SEE_EDIT_FORM;\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private initFormFields(): void {\n this.mandatoryFields = [\n // les step mentionné dans les fieldId ne correspondent plus aux stepIndex parce qu'on en a rajouté par la suite ...\n {\n stepIndex: 0,\n stepName: 'Biotech_venture',\n fields: [\n {fieldId: 'step0_name', name: 'Name', formControl: this.projectComponent.nameFormControl},\n ]\n },\n {\n stepIndex: 1,\n stepName: 'Projects',\n fields: []\n },\n {\n stepIndex: 2,\n stepName: 'Current_situation',\n fields: [\n {\n fieldId: 'step2_incorporationYear',\n name: 'Year_of_incorporation',\n formControl: this.situationComponent.incorporationYearFormControl\n },\n {\n fieldId: 'step2_tradeType',\n name: 'Project_trade_type',\n formControl: this.situationComponent.projectTradeTypeFormControl\n }\n ]\n },\n {\n stepIndex: 3,\n stepName: 'Past_funding_and_prizes',\n fields: []\n },\n {\n stepIndex: 4,\n stepName: 'Partnership_and_outlicensing',\n fields: []\n },\n {\n stepIndex: 5,\n stepName: 'Team_and_contacts',\n fields: [\n {\n fieldId: 'step5_firstName',\n name: 'Contact_first_name',\n formControl: this.teamComponent.contactFirstNameFormControl\n },\n {\n fieldId: 'step5_lastName',\n name: 'Contact_last_name',\n formControl: this.teamComponent.contactLastNameFormControl\n },\n {\n fieldId: 'step5_address',\n name: 'Contact_address',\n formControl: this.teamComponent.contactAddressFormControl\n },\n {fieldId: 'step5_email', name: 'Contact_email', formControl: this.teamComponent.contactEmailFormControl},\n {fieldId: 'step5_website', name: 'Website', formControl: this.teamComponent.contactWebsiteFormControl},\n ]\n },\n {\n stepIndex: 6,\n stepName: 'Academic_link',\n fields: []\n },\n {\n stepIndex: 7,\n stepName: 'Miscellaneous',\n fields: []\n }\n ];\n\n // add empty FormControl if no projectCase exist\n if (this.projectCases.length === 0) {\n this.mandatoryFields[1].fields.push({\n fieldId: 'step_project_cases',\n name: 'Projects',\n formControl: new FormControl()\n });\n }\n }\n\n private save(): Promise {\n let project: Project = this.project.clone();\n if (project.raisingFundsAmount) {\n project.raisingFundsAmount *= 100; // on convertit en cents ...\n }\n // on remet les fichiers à leur emplacement\n project.logo = this.project.logo;\n project.illustration = this.project.illustration;\n project.teamPicture = this.project.teamPicture;\n\n let pastFundings: ProjectPastFunding[] = [];\n for (let i = 0; i < this.pastFundings.length; i++) {\n pastFundings.push(this.pastFundings[i].clone());\n if (pastFundings[i].amount) {\n pastFundings[i].amount *= 100; // on convertit en cents ...\n }\n }\n\n const shouldSaveCases = this.projectCases.length > 0;\n\n return new Promise((resolve, reject) => {\n Promise.all([\n /* 0 */ this.projectsProvider.saveProject(project),\n /* 3 1 */ this.projectsProvider.saveProjectPrizes(this.project.id, this.prizes),\n /* 4 2*/ this.projectsProvider.saveProjectPastFundings(this.project.id, pastFundings),\n /* 5 3*/ this.projectsProvider.saveProjectTeamMembers(this.project.id, this.teamMembers),\n /* 6 4*/ shouldSaveCases && this.projectsProvider.saveProjectCase(this.project.id, this.projectCases, this.projectCaseProjectType, this.projectCaseTherapeuticArea)\n ])\n .then((results: any[]) => {\n const promises: Promise[] = [];\n if (this.rights.EDIT_ACADEMIC_INSTITUTION_1) {\n promises.push(this.projectsProvider.saveAcademicInsitution1(this.project.id, this.project.academicInstitution1Id));\n }\n\n Promise.all(promises)\n .then((nextResults: any[]) => {\n project = results[0];\n if (project.raisingFundsAmount) {\n project.raisingFundsAmount = project.raisingFundsAmount / 100; // on convertit en dollars\n }\n if (nextResults.length > 0) {\n project.academicInstitution1Id = nextResults[0].academicInstitution1Id;\n }\n\n pastFundings = results[2];\n for (let i = 0; i < this.pastFundings.length; i++) {\n if (pastFundings[i].amount) {\n pastFundings[i].amount = pastFundings[i].amount / 100; // on convertit en dollars\n }\n }\n\n this.project = project;\n this.projectCases = shouldSaveCases ? results[4] : this.projectCases;\n this.prizes = results[1];\n this.pastFundings = pastFundings;\n this.teamMembers = results[3];\n\n // delete mandatory fields for projects (they are added again on view render)\n this.mandatoryFields[1].fields = [];\n\n resolve();\n })\n .catch(reject);\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private askForReview(): Promise {\n return new Promise((resolve, reject) => {\n this.projectsProvider.askForReview(this.project)\n .then((project: Project) => {\n this.project = project;\n this.rights.evaluate({\n user: this.currentUser.user,\n investorProfile: null,\n membership: this.membership,\n project: this.project,\n user_academicInstitutions: this._user_academicInstitutions\n });\n this.is401 = !this.rights.SEE_EDIT_FORM;\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private scrollToStep(index: number): void {\n setTimeout(() => {\n document.getElementsByTagName('html')[0].scrollTo({\n left: 0,\n top: 96 + ((index - 1) * 72),\n behavior: 'smooth'\n });\n }, 250);\n }\n\n private updateListingProgress(): void {\n this.listingProgress = this.projectsProvider.computeListingProgress(\n this.project,\n this.projectTypeIds.length,\n this.therapeuticAreaIds.length,\n this.teamMembers.length\n );\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n this.isSaveLoading = false;\n\n if (error.status === 404) {\n this.is404 = true;\n } else if (error.status === 422) {\n if (error.error && error.error.errors && error.error.errors) {\n if (error.error.errors['item.logo']) {\n this._toaster.open(this._translater.instant('Image_has_invalid_dimensions'), '', {duration: 5000});\n this.stepper.selectedIndex = 1;\n } else if (error.error.errors['item.illustration']) {\n this._toaster.open(this._translater.instant('Image_has_invalid_dimensions'), '', {duration: 5000});\n this.stepper.selectedIndex = 1;\n } else if (error.error.errors['item.teamPicture']) {\n this._toaster.open(this._translater.instant('Image_has_invalid_dimensions'), '', {duration: 5000});\n this.stepper.selectedIndex = 5;\n } else {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n } else {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n } else {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n }\n}\n\nexport interface ProjectListingFieldsGroup {\n stepIndex: number;\n stepName: string;\n fields: {\n name: string,\n identifier?: number,\n formControl: FormControl,\n fieldId: string // pour pouvoir le focus, avec le formcontrol c'est pas possible... https://github.com/angular/angular/issues/12463\n }[];\n}\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../providers/current-user';\nimport { MenuItem } from '../side-menu/side-menu';\nimport { ModelsStorage } from '../../providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { IProjectCaseSearchResultRow, ProjectsProvider } from '../../../projects/providers/projects-provider';\nimport { ProjectRights } from '../../../projects/providers/project-rights';\nimport {\n InvestorProfile,\n InvestorValidationState,\n Project,\n ProjectCase,\n ProjectValidationState,\n} from '../../providers/models';\nimport { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog';\n\n@Component({\n template: ''\n})\nexport class ListBaseComponent implements AfterViewInit {\n\n public readonly INVESTOR_VALIDATION_STATE_PENDING: number = InvestorValidationState.ID_PENDING;\n public readonly INVESTOR_VALIDATION_STATE_ACCEPTED: number = InvestorValidationState.ID_ACCEPTED;\n\n public isLoading: boolean = true;\n public rights: ProjectRights = new ProjectRights(this._utils);\n public is404: boolean = false;\n public backMenu: MenuItem = null;\n\n public investorProfile: InvestorProfile = null;\n public projects: Project[] = [];\n public projectCases: ProjectCase[] = [];\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n public _title: Title,\n public _router: Router,\n public _dialoger: MatDialog,\n public _utils: Utils,\n public _toaster: MatSnackBar,\n public _route: ActivatedRoute,\n public _changeDetector: ChangeDetectorRef,\n public _projectsProvider: ProjectsProvider,\n public _translater: TranslateService,\n public _storage: ModelsStorage\n ) {\n }\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._changeDetector.detectChanges();\n }\n\n public async loadData(): Promise {\n try {\n this.investorProfile = await this._storage.select(InvestorProfile)\n .where('userId').equals(this.currentUser.user.id).get(1);\n this.projects = await this._storage.select(Project)\n .where('projectValidationStateId').equals(ProjectValidationState.ID_PUBLISHED)\n .orderBy('name').get();\n const projectCases = await this._storage.select(ProjectCase).get();\n this.projectCases = projectCases.filter((item) => this._utils.getKeyValues(this.projects).indexOf(item.projectId) > -1);\n\n this.rights.evaluate({\n user: this.currentUser.user,\n project: null,\n membership: null,\n investorProfile: this.investorProfile,\n });\n\n } catch (e) {\n this.onError(e);\n }\n }\n\n public onFavoriteClicked(row: IProjectCaseSearchResultRow): void {\n row.isLoading = true;\n this._projectsProvider.toggleProjectFavorite(row.project)\n .then((isFavorite: boolean) => {\n row.isFavorite = isFavorite;\n row.isLoading = false;\n this.onError({status: 429});\n })\n .catch((error: any) => {\n row.isLoading = false;\n this.onError(error);\n });\n }\n\n public onDeleteClicked(row: IProjectCaseSearchResultRow): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_project'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n row.isLoading = true;\n this._projectsProvider.deleteProjectCase(row.projectCase)\n .then(() => {\n this.projectCases = this.projectCases.filter((item) => item.id !== row.projectCase.id);\n this._toaster.open(this._translater.instant('Project_deleted'), '', {duration: 5000});\n })\n .catch((error: any) => {\n row.isLoading = false;\n this.onError(error);\n });\n }\n });\n }\n\n public onEditClicked(row: IProjectCaseSearchResultRow): void {\n this._router.navigate(['academic-ventures', row.project.id, 'edit'], {\n queryParams: {\n backUrl: this._router.url,\n backTitle: this._translater.instant('Search_results')\n }\n });\n }\n\n public onError(error: any): void {\n this.isLoading = false;\n\n this.is404 = error.status === 404;\n\n if (error.status !== 429) {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n\n }\n}\n","import { AfterViewInit, ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { Utils } from '../../../_common/providers/utils';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { FilesProvider } from '../../../files/providers/files-provider';\n\n@Component({\n selector: 'projects-filter-block',\n providers: [],\n styleUrls: ['./filter-block.scss'],\n templateUrl: './filter-block.html'\n})\nexport class ProjectsFilterBlockComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public label: string = '';\n @Input() public isInvalid: boolean = false;\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public currentUser: CurrentUser,\n private _projectProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n private _selectionLabel: string = null;\n\n public get selectionLabel() {\n return this._selectionLabel;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set selectionLabel(label: string) {\n this._selectionLabel = label;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","\n\n \n\n","\n\n
\n
\n 0 ? (filteredProjectTypes.length === 1 ? filteredProjectTypes[0].name : 'n_types_of_project' | translate:{count: filteredProjectTypes.length}) : null\">\n
\n
\n
\n {{ getGroupCheckboxIcon(group.types, filteredProjectTypes) }}\n {{ group.group.name }}\n
\n \n
{{ type.name }}
\n
\n
\n
\n
\n \n \n
\n
\n 0 ? (filteredTherapeuticAreas.length === 1 ? filteredTherapeuticAreas[0].name : 'n_therapeutic_areas' | translate:{count: filteredTherapeuticAreas.length}) : null\">\n
\n \n
{{ area.name }}
\n
\n
\n
\n \n \n
\n
\n 0 ? (filteredDevelopmentPhases.length === 1 ? filteredDevelopmentPhases[0].name : 'n_development_phases' | translate:{count: filteredDevelopmentPhases.length}) : null\">\n
\n \n
{{ phase.developmentPhase.name }}\n
\n
\n
\n
\n \n \n
\n
\n 0 ? (filteredFundingRound.length === 1 ? filteredFundingRound[0].name : 'n_funding_rounds' | translate:{count: filteredFundingRound.length}) : null\">\n
\n \n
{{ round.name }}\n
\n
\n
\n
\n \n \n
\n
\n \n
\n
\n
{{ 'Companies' | translate }}
\n \n
{{ 'Currently_raising_funds' | translate }}
\n
\n \n
{{ 'Currently_not_raising_funds' | translate }}
\n
\n \n
{{ 'Company_incorporated' | translate }}
\n
\n \n
{{ 'Company_not_incorporated' | translate }}
\n
\n
\n
\n
{{ 'Seeking_partnerships' | translate }}
\n \n
{{ 'Yes' | translate }}
\n
\n \n
{{ 'No' | translate }}
\n
\n
\n
\n
{{ 'Out_licensing_opportunities' | translate }}
\n \n
{{ 'Yes' | translate }}
\n
\n \n
{{ 'No' | translate }}
\n
\n
\n
\n
{{ 'Project_trade_type' | translate }}
\n \n
{{ 'Public_companies' | translate }}
\n
\n \n
{{ 'Private_companies' | translate }}
\n
\n
\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n \n 1\">\n {{ 'Project_search_results' | translate:{count: dataSource.filteredData.length} }}\n \n \n {{ 'Project_search_result' | translate }}\n \n \n {{ 'Project_search_no_results' | translate }}\n \n \n
\n \n \n search\n \n
\n
\n\n
\n {{ 'No_item_yet' | translate }}\n
\n 0\"\n [dataSource]=\"dataSource\"\n matSort>\n \n \n \n \n \n \n \n \n \n {{ 'Name' | translate }}\n \n \n \n \n \n {{ 'Venture' | translate }}\n \n\n
\n
{{ row.project.name }}
\n
\n
\n
\n \n {{ 'Type_of_project' | translate }}\n \n \n \n {{ type.name }}\n \n \n \n MAX_PROJECT_TYPES_DISPLAYED\">\n {{ 'and_n_more' | translate:{n: (row.projectTypes.length - MAX_PROJECT_TYPES_DISPLAYED)} }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { FormControl } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { NamePickerComponent } from '../../../_common/components/name-picker/name-picker';\nimport { SimpleMatDataSource } from '../../../_common/providers/simple-mat-data-source';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { Utils } from '../../../_common/providers/utils';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AlertsProvider } from '../../../alerts/providers/alerts-provider';\nimport {\n DevelopmentPhaseWithAssociatedProjectTypeGroups,\n IProjectCaseSearchResultRow,\n ProjectFiltersState,\n ProjectsProvider,\n ProjectTypeGoupWithTypes\n} from '../../providers/projects-provider';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport {\n Alert,\n Alert_DevelopmentPhase,\n Alert_FundingRound,\n Alert_ProjectType,\n Alert_TherapeuticArea,\n DevelopmentPhase,\n FundingRound,\n InvestorProfile,\n Project,\n ProjectCase,\n ProjectCase_ProjectType,\n ProjectCase_TherapeuticArea,\n ProjectFavorite,\n ProjectTradeType,\n ProjectType,\n TherapeuticArea,\n User_AcademicInstitution\n} from '../../../_common/providers/models';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'project-cases-list',\n providers: [],\n styleUrls: ['./list-project-cases.scss'],\n templateUrl: './list-project-cases.html'\n})\nexport class ProjectCasesListComponent implements AfterViewInit, OnDestroy {\n\n public readonly INCORPORATION_YEAR_MIN: number = 1900;\n public readonly INCORPORATION_YEAR_MAX: number = (new Date()).getFullYear();\n\n //\n //\n // CONSTANTS\n //\n //\n public readonly TARGETED_INCORPORATION_YEAR_MIN: number = (new Date()).getFullYear();\n public readonly TARGETED_INCORPORATION_YEAR_MAX: number = 2050;\n public readonly AMOUNT_RAISED_MIN: number = 0;\n public readonly AMOUNT_RAISED_MAX: number = 99999999999; // 100 mia\n public readonly MAX_PROJECT_TYPES_DISPLAYED: number = 5;\n public isReady: boolean = false;\n public isAlertLoading: boolean = false;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n public rights: ProjectRights = new ProjectRights(this.utils);\n @Input() public disableSearchEngine: boolean = false;\n @Input() public moduleTitle: string = null;\n @Input() public hideLogoColumn: boolean = false;\n @Input() public hideNameColumn: boolean = false;\n @Input() public hideProjectColumn: boolean = false;\n @Input() public hideProjectTypeColumn: boolean = false;\n @Input() public hideActionsColumn: boolean = false;\n @Input() public investorProfile: InvestorProfile = null;\n @Input() public preserveFilters: boolean = false;\n @Output() public onRowClicked: EventEmitter = new EventEmitter();\n @Output() public onFavoriteClicked: EventEmitter = new EventEmitter();\n @Output() public onDeleteClicked: EventEmitter = new EventEmitter();\n @Output() public onEditClicked: EventEmitter = new EventEmitter();\n public dataSource: SimpleMatDataSource = new SimpleMatDataSource([]);\n public columns: string[] = [];\n @ViewChild(MatPaginator, {static: false}) public paginator: MatPaginator;\n @ViewChild(MatSort, {static: false}) public sorter: MatSort;\n public searchInput: FormControl = new FormControl('');\n public projectTypesCheckboxes: boolean[][] = [];\n public filteredProjectTypes: ProjectType[] = [];\n public therapeuticAreasCheckboxes: boolean[] = [];\n public filteredTherapeuticAreas: TherapeuticArea[] = [];\n public developmentPhasesCheckboxes: boolean[] = [];\n public filteredDevelopmentPhases: DevelopmentPhase[] = [];\n public fundingRoundsCheckboxes: boolean[] = [];\n public filteredFundingRound: FundingRound[] = [];\n public filteredOthers: Alert = new Alert(); // mini hack, we use this structure directly to bind the yes/no - it's simpler\n public collaborationSelectionLabel: string = null;\n public moreFiltersSelectionLabel: string = null;\n public yearOfIncorporationToFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.yearOfIncorporationToFormControl, this.yearOfIncorporationFromFormControl, null, this.INCORPORATION_YEAR_MIN, this.INCORPORATION_YEAR_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public yearOfIncorporationFromFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.yearOfIncorporationFromFormControl, null, this.yearOfIncorporationToFormControl, this.INCORPORATION_YEAR_MIN, this.INCORPORATION_YEAR_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public targetedYearOfIncorporationToFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.targetedYearOfIncorporationToFormControl, this.targetedYearOfIncorporationFromFormControl, null, this.TARGETED_INCORPORATION_YEAR_MIN, this.TARGETED_INCORPORATION_YEAR_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public targetedYearOfIncorporationFromFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.targetedYearOfIncorporationFromFormControl, null, this.targetedYearOfIncorporationToFormControl, this.TARGETED_INCORPORATION_YEAR_MIN, this.TARGETED_INCORPORATION_YEAR_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public amountRaisedToFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.amountRaisedToFormControl, this.amountRaisedFromFormControl, null, this.AMOUNT_RAISED_MIN, this.AMOUNT_RAISED_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public amountRaisedFromFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.amountRaisedFromFormControl, null, this.amountRaisedToFormControl, this.AMOUNT_RAISED_MIN, this.AMOUNT_RAISED_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public projectTypeGroups: ProjectTypeGoupWithTypes[] = [];\n public projectTypes: ProjectType[] = [];\n public therapeuticAreas: TherapeuticArea[] = [];\n public developmentPhases: DevelopmentPhase[] = [];\n public fundingRound: FundingRound[] = [];\n public projectCaseProjectTypes: ProjectCase_ProjectType[] = [];\n public projectCaseTherapeuticAreas: ProjectCase_TherapeuticArea[] = [];\n public developmentPhasesWithAssociatedProjectTypeGroups: DevelopmentPhaseWithAssociatedProjectTypeGroups[] = [];\n private _projects: Project[] = [];\n private _allRows: IProjectCaseSearchResultRow[] = [];\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public currentUser: CurrentUser,\n public projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _dialoger: MatDialog,\n private _router: Router,\n private _route: ActivatedRoute,\n private _toaster: MatSnackBar,\n private _alertsProvider: AlertsProvider,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n private _projectCases: ProjectCase[] = [];\n\n public get projectCases() {\n return this._projectCases;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set projectCases(projectCases: ProjectCase[]) {\n // remove projectCases in search when name is not filed\n this._projectCases = projectCases.filter((item) => item.title);\n if (this._projectCases && this._projectCases.length) {\n this.loadStaticData()\n .then(() => {\n this.buildDataRows(this._projectCases)\n .then((rows: IProjectCaseSearchResultRow[]) => {\n this._allRows = rows;\n this.applyFilters();\n })\n .catch((error: any) => this.onError(error));\n })\n .catch((error: any) => this.onError(error));\n } else {\n this._allRows = [];\n this.applyFilters();\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.initColumns();\n this.initDataSource();\n this.loadStaticData()\n .then(() => {\n this._route.params.subscribe((params: any) => {\n this.rights.evaluate({\n investorProfile: this.investorProfile,\n user: this.currentUser.user\n });\n const alertId: number = parseInt(params.alertId, 10);\n if (alertId) {\n this.getFiltersStateFromAlert(alertId)\n .then((state: ProjectFiltersState) => {\n this.initFilters(state)\n .then(() => this.isReady = true)\n .catch((error: any) => this.onError(error));\n })\n .catch((error: any) => this.onError(error));\n } else if (this.preserveFilters) {\n this.initFilters(this.projectsProvider.projectFiltersState)\n .then(() => this.isReady = true)\n .catch((error: any) => this.onError(error));\n } else {\n this.initFilters(null)\n .then(() => this.isReady = true)\n .catch((error: any) => this.onError(error));\n }\n });\n })\n .catch((error: any) => this.onError(error));\n }\n\n public ngOnDestroy() {\n if (this.preserveFilters) {\n this.saveFiltersState();\n }\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onDataSortChange(event: any): void {\n this.dataSource.sortBy(event.active, event.direction);\n }\n\n public searchInputChanged(filter: string): void {\n this.dataSource.filter = this.utils.normalizeString(filter);\n }\n\n public _onRowClicked(row: IProjectCaseSearchResultRow): void {\n if (row.rights.SEE) {\n this.onRowClicked.emit(row);\n }\n }\n\n public onAllProjectTypesClicked(event: any): void {\n event.stopPropagation();\n this.filteredProjectTypes = this.projectTypes.slice();\n this.switchAllCheckboxesWithGroup(this.projectTypesCheckboxes, this.projectTypeGroups, 'types', true);\n this.applyFilters();\n }\n\n public onNoProjectTypesClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredProjectTypes = [];\n this.switchAllCheckboxesWithGroup(this.projectTypesCheckboxes, this.projectTypeGroups, 'types', false);\n this.applyFilters();\n }\n\n public onAllTherapeuticAreasClicked(event: any): void {\n event.stopPropagation();\n this.filteredTherapeuticAreas = this.therapeuticAreas.slice();\n this.switchAllCheckboxes(this.therapeuticAreasCheckboxes, this.therapeuticAreas, true);\n this.applyFilters();\n }\n\n public onNoTherapeuticAreasClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredTherapeuticAreas = [];\n this.switchAllCheckboxes(this.therapeuticAreasCheckboxes, this.therapeuticAreas, false);\n this.applyFilters();\n }\n\n public onAllDevelopmentPhasesClicked(event: any): void {\n event.stopPropagation();\n this.filteredDevelopmentPhases = this.developmentPhases.slice();\n this.switchAllCheckboxes(this.developmentPhasesCheckboxes, this.developmentPhases, true);\n this.applyFilters();\n }\n\n public onNoDevelopmentPhasesClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredDevelopmentPhases = [];\n this.switchAllCheckboxes(this.developmentPhasesCheckboxes, this.developmentPhases, false);\n this.applyFilters();\n }\n\n public onAllFundingRoundsClicked(event: any): void {\n event.stopPropagation();\n this.filteredFundingRound = this.fundingRound.slice();\n this.switchAllCheckboxes(this.fundingRoundsCheckboxes, this.fundingRound, true);\n this.applyFilters();\n }\n\n public onNoFundingRoundsClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredFundingRound = [];\n this.switchAllCheckboxes(this.fundingRoundsCheckboxes, this.fundingRound, false);\n this.applyFilters();\n }\n\n public onProjectTypeClicked(event: any, type: ProjectType): void {\n setTimeout(() => {\n this.toggleFilterSelection(type, this.filteredProjectTypes);\n this.applyFilters();\n }, 1);\n }\n\n public onTherapeuticAreaClicked(event: any, area: TherapeuticArea): void {\n setTimeout(() => {\n this.toggleFilterSelection(area, this.filteredTherapeuticAreas);\n this.applyFilters();\n }, 1);\n }\n\n public onDevelopmentPhaseClicked(event: any, phase: DevelopmentPhase): void {\n setTimeout(() => {\n this.toggleFilterSelection(phase, this.filteredDevelopmentPhases);\n this.applyFilters();\n }, 1);\n }\n\n public onFundingRoundClicked(event: any, round: FundingRound): void {\n setTimeout(() => {\n this.toggleFilterSelection(round, this.filteredFundingRound);\n this.applyFilters();\n }, 1);\n }\n\n public onMoreFiltersItemClicked(event: any): void {\n setTimeout(() => {\n const selectionLabels: string[] = [];\n\n this.yearOfIncorporationFromFormControl.updateValueAndValidity();\n this.yearOfIncorporationToFormControl.updateValueAndValidity();\n this.targetedYearOfIncorporationFromFormControl.updateValueAndValidity();\n this.targetedYearOfIncorporationToFormControl.updateValueAndValidity();\n this.amountRaisedFromFormControl.updateValueAndValidity();\n this.amountRaisedToFormControl.updateValueAndValidity();\n\n if (this.filteredOthers.isSeekingPartnerhips || this.filteredOthers.isNotSeekingPartnerhips) {\n selectionLabels.push('Seeking_partnerships');\n }\n if (this.filteredOthers.isOutlicensing || this.filteredOthers.isNotOutlicensing) {\n selectionLabels.push('Out_licensing_opportunities');\n }\n if (this.filteredOthers.isNotForProfit || this.filteredOthers.isNotNotForProfit) {\n selectionLabels.push('Not_for_profit_ventures');\n }\n if (this.filteredOthers.isCompanyIncorporated) {\n selectionLabels.push('Company_incorporated');\n } else {\n this.yearOfIncorporationFromFormControl.setValue(null);\n this.yearOfIncorporationToFormControl.setValue(null);\n }\n if (this.filteredOthers.isCompanyNotIncorporated) {\n selectionLabels.push('Company_not_incorporated');\n } else {\n this.targetedYearOfIncorporationFromFormControl.setValue(null);\n this.targetedYearOfIncorporationToFormControl.setValue(null);\n }\n if (this.filteredOthers.isRaisingFunds) {\n selectionLabels.push('Currently_raising_funds');\n } else {\n this.amountRaisedFromFormControl.setValue(null);\n this.amountRaisedToFormControl.setValue(null);\n }\n if (this.filteredOthers.isNotRaisingFunds) {\n selectionLabels.push('Currently_not_raising_funds');\n }\n if (this.filteredOthers.isPublicCompany || this.filteredOthers.isPrivateCompany) {\n selectionLabels.push('Project_trade_type');\n }\n\n if (selectionLabels.length === 0) {\n this.moreFiltersSelectionLabel = null;\n } else if (selectionLabels.length === 1) {\n this.moreFiltersSelectionLabel = this._translater.instant(selectionLabels[0]);\n } else {\n this.moreFiltersSelectionLabel = this._translater.instant('n_filters', {count: selectionLabels.length});\n }\n\n this.applyFilters();\n }, 1);\n }\n\n public onResetFiltersClicked(): void {\n this.filteredProjectTypes = [];\n this.switchAllCheckboxesWithGroup(this.projectTypesCheckboxes, this.projectTypeGroups, 'types', false);\n this.filteredTherapeuticAreas = [];\n this.switchAllCheckboxes(this.therapeuticAreasCheckboxes, this.therapeuticAreas, false);\n this.filteredDevelopmentPhases = [];\n this.switchAllCheckboxes(this.developmentPhasesCheckboxes, this.developmentPhases, false);\n this.filteredFundingRound = [];\n this.switchAllCheckboxes(this.fundingRoundsCheckboxes, this.fundingRound, false);\n this.filteredOthers.isSeekingPartnerhips = null;\n this.filteredOthers.isNotSeekingPartnerhips = null;\n this.filteredOthers.isOutlicensing = null;\n this.filteredOthers.isNotOutlicensing = null;\n this.filteredOthers.isNotForProfit = null;\n this.filteredOthers.isNotNotForProfit = null;\n this.filteredOthers.isCompanyIncorporated = null;\n this.filteredOthers.isCompanyNotIncorporated = null;\n this.filteredOthers.isRaisingFunds = null;\n this.filteredOthers.isNotRaisingFunds = null;\n this.filteredOthers.isPrivateCompany = null;\n this.filteredOthers.isPublicCompany = null;\n this.yearOfIncorporationFromFormControl.setValue(null);\n this.yearOfIncorporationToFormControl.setValue(null);\n this.targetedYearOfIncorporationFromFormControl.setValue(null);\n this.targetedYearOfIncorporationToFormControl.setValue(null);\n this.amountRaisedFromFormControl.setValue(null);\n this.amountRaisedToFormControl.setValue(null);\n this.moreFiltersSelectionLabel = null;\n\n this.applyFilters();\n }\n\n public onProjectTypeGroupClicked(event: any, row: ProjectTypeGoupWithTypes, rowIndex: number): void {\n const matchingItems: ProjectType[] = this.utils.findManyIn(\n this.utils.getKeyValues(row.types, 'id'),\n this.filteredProjectTypes,\n 'id'\n );\n\n // si tout était déjà sélectionné ...\n if (matchingItems.length === row.types.length) {\n // on enlève tout\n for (let i = 0; i < row.types.length; i++) {\n this.filteredProjectTypes.splice(this.filteredProjectTypes.indexOf(row.types[i]), 1);\n this.projectTypesCheckboxes[rowIndex][i] = false;\n }\n } else {\n // sinon on ajoute celles qui manquent\n for (let i = 0; i < row.types.length; i++) {\n if (this.filteredProjectTypes.indexOf(row.types[i]) < 0) {\n this.filteredProjectTypes.push(row.types[i]);\n this.projectTypesCheckboxes[rowIndex][i] = true;\n }\n }\n }\n\n this.applyFilters();\n }\n\n public stopPropagation(event): void {\n event.stopPropagation();\n }\n\n public onAddAlertClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(NamePickerComponent, {\n data: {\n name: '',\n title: 'Add_an_alert',\n placeholder: 'Alert_name',\n maxLength: 255,\n explaination: 'Add_alert_explaination'\n }\n });\n dialog.afterClosed().subscribe((name: string) => {\n if (name) {\n this.isAlertLoading = true;\n this.saveAlert(name)\n .then((alert: Alert) => {\n this.isAlertLoading = false;\n this._router.navigate(['alerts', alert.id])\n .then(() => this._toaster.open(this._translater.instant('Alert_saved'), '', {duration: 5000}))\n .catch((error: any) => this.onError(error));\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n public areFiltersValid(): boolean {\n // les seuls filtres qui peuvent potentiellement être invalides sont les inputs\n // (je vois pas comment les checkbox pourront être invalides ...)\n return this.isMoreFiltersValid();\n }\n\n public isMoreFiltersValid(): boolean {\n return !this.amountRaisedFromFormControl.invalid\n && !this.amountRaisedToFormControl.invalid\n && !this.targetedYearOfIncorporationFromFormControl.invalid\n && !this.targetedYearOfIncorporationToFormControl.invalid\n && !this.yearOfIncorporationFromFormControl.invalid\n && !this.yearOfIncorporationToFormControl.invalid;\n }\n\n public hasFilters(): boolean {\n return this.filteredProjectTypes.length > 0\n || this.filteredTherapeuticAreas.length > 0\n || this.filteredDevelopmentPhases.length > 0\n || this.filteredFundingRound.length > 0\n || this.collaborationSelectionLabel != null\n || this.moreFiltersSelectionLabel != null;\n }\n\n public _onFavoriteClicked(row: IProjectCaseSearchResultRow): void {\n this.onFavoriteClicked.emit(row);\n }\n\n public getGroupCheckboxIcon(items: any[], checkAgainst: any): string {\n const matchingItems: number[] = this.utils.findManyIn(this.utils.getKeyValues(checkAgainst), items, 'id');\n if (matchingItems.length === 0) {\n return 'check_box_outline_blank';\n } else if (matchingItems.length === items.length) {\n return 'check_box';\n }\n\n return 'indeterminate_check_box';\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadStaticData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(ProjectType).get(),\n this._storage.select(TherapeuticArea).orderBy('name').get(),\n this._storage.select(DevelopmentPhase).orderBy('ordinal').get(),\n this.projectsProvider.getProjectTypeGroups(),\n this.projectsProvider.getDevelopmentPhasesWithAssociatedProjectTypeGroups(),\n this._storage.select(FundingRound).get(),\n ])\n .then((data: any[]) => {\n this.projectTypes = data[0];\n this.therapeuticAreas = data[1];\n this.developmentPhases = data[2];\n this.projectTypeGroups = data[3];\n this.developmentPhasesWithAssociatedProjectTypeGroups = data[4];\n this.fundingRound = data[5];\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private applyFilters(): void {\n if (!this.areFiltersValid()) {\n return;\n }\n\n const rows: IProjectCaseSearchResultRow[] = [];\n for (let i = 0; i < this._allRows.length; i++) {\n if (this.matchFilterSomeList(this._allRows[i].projectTypeIds, this.filteredProjectTypes)\n && this.matchFilterSomeList(this._allRows[i].therapeuticAreaIds, this.filteredTherapeuticAreas)\n && this.matchFilterSomeList([this._allRows[i].projectCase.developmentPhaseId], this.filteredDevelopmentPhases)\n && this.matchFilterSomeList([this._allRows[i].fundingRoundId], this.filteredFundingRound)\n && this.matchFilterCollaboration(this._allRows[i])\n && this.matchFilterMoreFilters(this._allRows[i])) {\n rows.push(this._allRows[i]);\n }\n }\n\n this.dataSource.replaceAllWith(rows);\n }\n\n private toggleFilterSelection(item: any, list: any[]): boolean {\n const index: number = list.indexOf(item);\n if (index >= 0) {\n list.splice(index, 1);\n\n return false;\n }\n\n list.push(item);\n\n return true;\n }\n\n private buildDataRows(projectCases: ProjectCase[]): Promise {\n return new Promise((resolve, reject) => {\n if (projectCases.length === 0) {\n resolve([]);\n return;\n }\n\n const projectCaseIds: number[] = this.utils.getKeyValues(projectCases, 'id');\n const projectIds: number[] = this.utils.getKeyValues(projectCases, 'projectId');\n Promise.all([\n this._storage.select(ProjectCase_ProjectType).where('projectCaseId').in(projectCaseIds).get(),\n this._storage.select(ProjectCase_TherapeuticArea).where('projectCaseId').in(projectCaseIds).get(),\n this._storage.select(ProjectFavorite).where('userId').equals(this.currentUser.user.id).get(),\n this._storage.select(User_AcademicInstitution).where('userId').equals(this.currentUser.user.id).get(),\n this._storage.select(Project).where('id').in(projectIds).get(),\n ])\n .then((relatedData: any[]) => {\n const data: IProjectCaseSearchResultRow[] = [];\n for (let i = 0; i < projectCases.length; i++) {\n\n // get project\n const project = this.utils.findIn(projectCases[i].projectId, relatedData[4]);\n\n const rights: ProjectRights = new ProjectRights(this.utils);\n rights.evaluate({\n project,\n user: this.currentUser.user,\n investorProfile: this.investorProfile,\n user_academicInstitutions: relatedData[3]\n });\n\n const projectCaseProjectType = this.utils.findManyIn([projectCases[i].id], relatedData[0], 'projectCaseId');\n const projectTypeIds: number[] = projectCaseProjectType ? this.utils.getKeyValues(projectCaseProjectType, 'projectTypeId') : [];\n\n const projectCaseTherapeuticArea = this.utils.findManyIn([projectCases[i].id], relatedData[1], 'projectCaseId');\n const therapeuticAreaIds: number[] = projectCaseTherapeuticArea ? this.utils.getKeyValues(projectCaseTherapeuticArea, 'therapeuticAreaId') : [];\n\n const row: IProjectCaseSearchResultRow = {\n projectCase: projectCases[i],\n project,\n fundingRoundId: project && project.isRaisingFunds === 1 && this.utils.findIn(project.fundingRoundId, this.fundingRound) ? this.utils.findIn(project.fundingRoundId, this.fundingRound).id : 0,\n rights,\n projectTypes: this.utils.findManyIn(projectTypeIds, this.projectTypes),\n therapeuticAreas: this.utils.findManyIn(therapeuticAreaIds, this.therapeuticAreas),\n projectTypeIds,\n therapeuticAreaIds,\n isLoading: false,\n isFavorite: this.utils.findIn(project.id, relatedData[2], 'projectId') !== null\n };\n\n // FIXME: deactivate thumbnail because it is not resized (> 1MB) and list loads multiple images, which block\n // the execution of other requests\n // if (project && project.illustration) {\n // this._filesProvider.downloadFile('projects/' + projects[i].id + '/download-logo')\n // this._filesProvider.downloadFile('projects/' + project.id + '/download-illustration', null, {noCache: true})\n // .then((fileData: any) => {\n // const reader: FileReader = new FileReader();\n // reader.addEventListener('load', () => row.logoImage = reader.result, false);\n // reader.readAsDataURL(fileData);\n // })\n // .catch((error: any) => this.onError(error));\n // } else {\n row.logoImage = null;\n // }\n\n data.push(row);\n }\n\n resolve(data);\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private saveFiltersState(): void {\n const projectTypeIds: number[] = this.utils.getKeyValues(this.filteredProjectTypes);\n const therapeuticAreaIds: number[] = this.utils.getKeyValues(this.filteredTherapeuticAreas);\n const developmentPhaseIds: number[] = this.utils.getKeyValues(this.filteredDevelopmentPhases);\n const fundingRoundIds: number[] = this.utils.getKeyValues(this.filteredFundingRound);\n const alert: Alert = this.filteredOthers.clone();\n\n this.projectsProvider.projectFiltersState = {\n alert,\n developmentPhaseIds,\n fundingRoundIds,\n projectTypeIds,\n therapeuticAreaIds,\n pageIndex: this.paginator.pageIndex\n };\n }\n\n private getFiltersStateFromAlert(alertId: number): Promise {\n return new Promise((resolve, reject) => {\n alertId = alertId ? alertId : 0;\n Promise.all([\n this._storage.select(Alert_ProjectType).where('alertId').equals(alertId).get(),\n this._storage.select(Alert_TherapeuticArea).where('alertId').equals(alertId).get(),\n this._storage.select(Alert_DevelopmentPhase).where('alertId').equals(alertId).get(),\n this._storage.select(Alert).where('id').equals(alertId).get(1),\n this._storage.select(Alert_FundingRound).where('alertId').equals(alertId).get()\n ])\n .then((data: any[]) => {\n resolve({\n alert: data[3],\n developmentPhaseIds: this.utils.getKeyValues(data[2], 'developmentPhaseId'),\n projectTypeIds: this.utils.getKeyValues(data[0], 'projectTypeId'),\n therapeuticAreaIds: this.utils.getKeyValues(data[1], 'therapeuticAreaId'),\n fundingRoundIds: this.utils.getKeyValues(data[4], 'fundingRoundId'),\n pageIndex: 0\n });\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private initFilters(filtersState: ProjectFiltersState): Promise {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n filtersState = filtersState ? filtersState : {\n alert: new Alert(),\n developmentPhaseIds: [],\n fundingRoundIds: [],\n projectTypeIds: [],\n therapeuticAreaIds: [],\n pageIndex: 0\n };\n\n this.filteredProjectTypes = [];\n this.projectTypesCheckboxes = [];\n this.filteredTherapeuticAreas = [];\n this.therapeuticAreasCheckboxes = [];\n this.filteredDevelopmentPhases = [];\n this.developmentPhasesCheckboxes = [];\n this.filteredFundingRound = [];\n this.fundingRoundsCheckboxes = [];\n\n this.projectTypeGroups.forEach((item: ProjectTypeGoupWithTypes, i: number) => {\n const rows: boolean[] = [];\n item.types.forEach((type: ProjectType, j: number) => {\n if (filtersState.projectTypeIds.indexOf(type.id) >= 0) {\n rows.push(true);\n this.filteredProjectTypes.push(type);\n } else {\n rows.push(false);\n }\n });\n this.projectTypesCheckboxes.push(rows);\n });\n\n this.therapeuticAreas.forEach((item: TherapeuticArea, i: number) => {\n if (filtersState.therapeuticAreaIds.indexOf(item.id) >= 0) {\n this.therapeuticAreasCheckboxes.push(true);\n this.filteredTherapeuticAreas.push(item);\n } else {\n this.therapeuticAreasCheckboxes.push(false);\n }\n });\n\n this.fundingRound.forEach((item: FundingRound, i: number) => {\n if (filtersState.fundingRoundIds && filtersState.fundingRoundIds.indexOf(item.id) >= 0) {\n this.fundingRoundsCheckboxes.push(true);\n this.filteredFundingRound.push(item);\n } else {\n this.fundingRoundsCheckboxes.push(false);\n }\n });\n\n this.developmentPhases.forEach((item: DevelopmentPhase, i: number) => {\n if (filtersState.developmentPhaseIds.indexOf(item.id) >= 0) {\n this.developmentPhasesCheckboxes.push(true);\n this.filteredDevelopmentPhases.push(item);\n } else {\n this.developmentPhasesCheckboxes.push(false);\n }\n });\n\n this.filteredOthers = filtersState.alert ? filtersState.alert.clone() : new Alert();\n this.filteredOthers.id = 0; // pour être sûr de ne pas lier de futures recherches avec cette alerte\n this.onMoreFiltersItemClicked({}); // vilain hack pour refresh le control ...\n\n this.applyFilters();\n\n this.paginator.pageIndex = filtersState.pageIndex;\n\n resolve();\n }, 1);\n });\n }\n\n private initColumns(): void {\n const columns: string[] = [];\n // if (!this.hideLogoColumn) {\n // columns.push('logo');\n // }\n if (!this.hideNameColumn) {\n columns.push('name');\n }\n if (!this.hideProjectColumn) {\n columns.push('venture');\n }\n if (!this.hideProjectTypeColumn) {\n columns.push('type');\n }\n if (!this.hideActionsColumn) {\n columns.push('actions');\n }\n\n this.columns = columns;\n }\n\n private initDataSource(): void {\n this.dataSource.sort = this.sorter;\n this.dataSource.paginator = this.paginator;\n this.dataSource.filterPredicate = (row: IProjectCaseSearchResultRow, filter: string) => {\n return this.utils.normalizeString(\n row.projectCase.title +\n (row.projectCase.subtitle ? row.projectCase.subtitle : '') +\n (row.projectCase.description ? row.projectCase.description : '') +\n (row.projectCase.uniqueness ? row.projectCase.uniqueness : '') +\n (row.projectCase.unmetNeed ? row.projectCase.unmetNeed : '') +\n (row.projectCase.marketSize ? row.projectCase.marketSize : '') +\n (row.projectCase.competition ? row.projectCase.competition : '') +\n (row.project.name ? row.project.name : '')\n ).includes(filter);\n };\n this.searchInput.valueChanges.subscribe((value: string) => this.searchInputChanged(value)); // on utilise pas un bête keyup parce que si on sélectionne le texte et qu'on le coupe par exemple, on catch pas l'event ...\n\n this.dataSource.addSortDefinition(\n 'name',\n (a: IProjectCaseSearchResultRow, b: IProjectCaseSearchResultRow) => this.utils.sortRow(a.projectCase.title.toLowerCase(), b.projectCase.title.toLowerCase()),\n (a: IProjectCaseSearchResultRow, b: IProjectCaseSearchResultRow) => this.utils.sortRow(b.projectCase.title.toLowerCase(), a.projectCase.title.toLowerCase())\n );\n\n this.dataSource.addSortDefinition(\n 'venture',\n (a: IProjectCaseSearchResultRow, b: IProjectCaseSearchResultRow) => {\n if (!a.project.name) {\n return -1;\n } else if (!b.project.name) {\n return 1;\n }\n\n return this.utils.sortRow(a.project.name.toLowerCase(), b.project.name.toLowerCase());\n },\n (a: IProjectCaseSearchResultRow, b: IProjectCaseSearchResultRow) => {\n if (!b.project.name) {\n return -1;\n } else if (!a.project.name) {\n return 1;\n }\n\n return this.utils.sortRow(b.project.name.toLowerCase(), a.project.name.toLowerCase());\n }\n );\n\n this.dataSource.addSortDefinition(\n 'type',\n (a: IProjectCaseSearchResultRow, b: IProjectCaseSearchResultRow) => this.utils.sortRow(this.utils.getKeyValues(a.projectTypes, 'name').join('').toLowerCase(), this.utils.getKeyValues(b.projectTypes, 'name').join('').toLowerCase()),\n (a: IProjectCaseSearchResultRow, b: IProjectCaseSearchResultRow) => this.utils.sortRow(this.utils.getKeyValues(b.projectTypes, 'name').join('').toLowerCase(), this.utils.getKeyValues(a.projectTypes, 'name').join('').toLowerCase())\n );\n }\n\n private switchAllCheckboxes(list: boolean[], data: any, value: boolean): void {\n for (let i = 0; i < data.length; i++) {\n list[i] = value;\n }\n }\n\n private switchAllCheckboxesWithGroup(list: boolean[][], data: any, keyName: string, value: boolean): void {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i][keyName].length; j++) {\n list[i][j] = value;\n }\n }\n }\n\n private checkMinMaxFormControl(targetControl: FormControl, minControl: FormControl, maxControl: FormControl, minFallback: number, maxFallback: number): any {\n if (!targetControl || !targetControl.value) {\n return null;\n }\n\n if (minControl && minControl.value && targetControl.value < minControl.value) {\n return {consistency: {valid: false}};\n } else if (targetControl.value < minFallback) {\n return {consistency: {valid: false}};\n }\n\n if (maxControl && maxControl.value && targetControl.value > maxControl.value) {\n return {consistency: {valid: false}};\n } else if (targetControl.value > maxFallback) {\n return {consistency: {valid: false}};\n }\n\n return null;\n }\n\n private matchFilterSomeList(keys: number[], filters: any[]): boolean {\n // s'il n'y a pas de filter, ça match ...\n if (filters.length === 0) {\n return true;\n }\n\n // on prend pas en considération les clés qui seraient null ...\n const _keys: number[] = keys.filter((val: number) => val ? true : false);\n\n return this.utils.findManyIn(_keys, filters, 'id').length > 0;\n }\n\n private matchFilterCollaboration(row: IProjectCaseSearchResultRow): boolean {\n if (!this.matchFilterYesNo(this.filteredOthers.isSeekingPartnerhips, this.filteredOthers.isNotSeekingPartnerhips, row.project.isSeekingPartnerships)) {\n return false;\n }\n\n if (!this.matchFilterYesNo(this.filteredOthers.isOutlicensing, this.filteredOthers.isNotOutlicensing, row.project.isOfferingLicensing)) {\n return false;\n }\n\n if (!this.matchFilterYesNo(this.filteredOthers.isNotForProfit, this.filteredOthers.isNotNotForProfit, row.project.isNotForProfit)) {\n return false;\n }\n\n return true;\n }\n\n private matchFilterMoreFilters(row: IProjectCaseSearchResultRow): boolean {\n if (!this.matchFilterYesNo(this.filteredOthers.isRaisingFunds, this.filteredOthers.isNotRaisingFunds, row.project.isRaisingFunds)) {\n return false;\n }\n // *100 ; on a le montant en cents, et on l'utilisateur le saisit en dollars\n if (this.amountRaisedFromFormControl.value && (!row.project.raisingFundsAmount || (this.amountRaisedFromFormControl.value * 100) > row.project.raisingFundsAmount)) {\n return false;\n }\n if (this.amountRaisedToFormControl.value && (!row.project.raisingFundsAmount || (this.amountRaisedToFormControl.value * 100) < row.project.raisingFundsAmount)) {\n return false;\n }\n\n if (!this.matchFilterYesNo(this.filteredOthers.isCompanyIncorporated, this.filteredOthers.isCompanyNotIncorporated, row.project.isCompanyIncorporated)) {\n return false;\n }\n if (row.project.isCompanyIncorporated) {\n if (this.yearOfIncorporationFromFormControl.value && (!row.project.incorporationYear || this.yearOfIncorporationFromFormControl.value > row.project.incorporationYear)) {\n return false;\n }\n if (this.yearOfIncorporationToFormControl.value && (!row.project.incorporationYear || this.yearOfIncorporationToFormControl.value < row.project.incorporationYear)) {\n return false;\n }\n } else {\n if (this.targetedYearOfIncorporationFromFormControl.value && (!row.project.incorporationYear || this.targetedYearOfIncorporationFromFormControl.value > row.project.incorporationYear)) {\n return false;\n }\n if (this.targetedYearOfIncorporationToFormControl.value && (!row.project.incorporationYear || this.targetedYearOfIncorporationToFormControl.value < row.project.incorporationYear)) {\n return false;\n }\n\n }\n\n if (this.filteredOthers.isPrivateCompany || this.filteredOthers.isPublicCompany) {\n if (!this.matchPrivateCompanyFilter(row.project.projectTradeTypeId) && !this.matchPublicCompanyFilter(row.project.projectTradeTypeId)) {\n return false;\n }\n }\n\n return true;\n }\n\n private matchPrivateCompanyFilter(projectTradeType: number): boolean {\n return this.filteredOthers.isPrivateCompany && projectTradeType === ProjectTradeType.ID_PRIVATE;\n }\n\n private matchPublicCompanyFilter(projectTradeType: number): boolean {\n return this.filteredOthers.isPublicCompany && projectTradeType === ProjectTradeType.ID_PUBLIC;\n\n }\n\n private matchFilterYesNo(yesValue: number, noValue: number, actualValue: number): boolean {\n // si rien n'est coché, on ignore le filtre (l'utilisateur n'a pas renseigner l'info ...)\n // si les deux sont cochés, on ignore le filtre (l'utilisateur indique explicitement qu'il veut les 2, et y a que 2 possibilités, donc ce sera forcément true)\n // si un seul des deux est cochés, on check que ca match avec le model\n if (yesValue) {\n if (!noValue) {\n if (!(actualValue == 1)) {\n return false;\n }\n }\n } else {\n if (noValue) {\n if (actualValue == 1) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n private saveAlert(name: string): Promise {\n return new Promise((resolve, reject) => {\n const alert: Alert = this.filteredOthers.clone();\n alert.id = 0; // on peut pas modifier une alerte, on en créé systématiquement des nouvelles\n alert.name = name;\n alert.isCompanyIncorporated = alert.isCompanyIncorporated ? 1 : 0;\n alert.isCompanyNotIncorporated = alert.isCompanyNotIncorporated ? 1 : 0;\n alert.isSeekingPartnerhips = alert.isSeekingPartnerhips ? 1 : 0;\n alert.isNotSeekingPartnerhips = alert.isNotSeekingPartnerhips ? 1 : 0;\n alert.isOutlicensing = alert.isOutlicensing ? 1 : 0;\n alert.isNotOutlicensing = alert.isNotOutlicensing ? 1 : 0;\n alert.isNotForProfit = alert.isNotForProfit ? 1 : 0;\n alert.isNotNotForProfit = alert.isNotNotForProfit ? 1 : 0;\n alert.isRaisingFunds = alert.isRaisingFunds ? 1 : 0;\n alert.isNotRaisingFunds = alert.isNotRaisingFunds ? 1 : 0;\n alert.isPublicCompany = Number(alert.isPublicCompany);\n alert.isPrivateCompany = Number(alert.isPrivateCompany);\n\n this._alertsProvider.saveAlert(alert)\n .then((savedAlert: Alert) => {\n Promise.all([\n this._alertsProvider.saveAlertProjectTypes(savedAlert.id, this.utils.getKeyValues(this.filteredProjectTypes, 'id')),\n this._alertsProvider.saveAlertTherapeuticAreas(savedAlert.id, this.utils.getKeyValues(this.filteredTherapeuticAreas, 'id')),\n this._alertsProvider.saveAlertDevelopmentPhases(savedAlert.id, this.utils.getKeyValues(this.filteredDevelopmentPhases, 'id')),\n this._alertsProvider.saveAlertFundingRounds(savedAlert.id, this.utils.getKeyValues(this.filteredFundingRound, 'id'))\n ])\n .then(() => resolve(savedAlert))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n this.isReady = true;\n this.isAlertLoading = false;\n console.log(error);\n if (error.status === 429) {\n return;\n }\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","import { AfterViewInit, Component, Input } from '@angular/core';\nimport { Conf } from '../../../_conf';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'full-width-loader',\n providers: [],\n styleUrls: ['./full-width-loader.scss'],\n templateUrl: './full-width-loader.html'\n})\nexport class FullWidthLoaderComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public mode: string = 'indeterminate';\n @Input() public position: string = 'fixed';\n @Input() public anchor: string = 'top';\n @Input() public color: string = 'accent';\n @Input() public progress: number = 0;\n @Input() public buffer: number = 0;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","\n\n","\n \n \n
\n
\n
\n \n
\n info_outline\n {{ 'You_can_not_access_here_yet' | translate }}\n \n
\n \n
\n \n
\n info_outline\n {{ 'company_incomplete_warning' | translate }}\n \n
\n \n \n 0 && (!investorProfile || (company && company.isCompleted))\"\n [investorProfile]=\"investorProfile\"\n [preserveFilters]=\"true\"\n [projectCases]=\"projectCases\">\n \n \n

{{ 'No_projects' | translate }}

\n
\n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { IProjectCaseSearchResultRow, ProjectsProvider } from '../../providers/projects-provider';\nimport { ListBaseComponent } from '../../../_common/components/list-base/list-base';\nimport { Company } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-projects-page',\n providers: [],\n styleUrls: ['./projects.scss'],\n templateUrl: './projects.html'\n})\nexport class ProjectsProjectsPageComponent extends ListBaseComponent implements AfterViewInit {\n\n public company: Company = null;\n\n constructor(\n conf: Conf,\n currentUser: CurrentUser,\n navigation: AcventuresNavigationProvider,\n _title: Title,\n _router: Router,\n _dialoger: MatDialog,\n _utils: Utils,\n _toaster: MatSnackBar,\n _route: ActivatedRoute,\n _changeDetector: ChangeDetectorRef,\n _projectsProvider: ProjectsProvider,\n _translater: TranslateService,\n _storage: ModelsStorage\n ) {\n super(conf, currentUser, navigation, _title, _router, _dialoger, _utils,\n _toaster, _route, _changeDetector, _projectsProvider, _translater, _storage);\n }\n\n public async ngAfterViewInit() {\n try {\n await super.loadData();\n if (this.investorProfile) {\n this.company = await this._storage.select(Company).where('id').equals(this.investorProfile.companyId).get(1);\n }\n this._title.setTitle(`${this._translater.instant('Projects')} | ${this.conf.platformName}`);\n this.isLoading = false;\n super.ngAfterViewInit();\n } catch (e) {\n this.onError(e);\n }\n\n }\n\n public onRowClicked(row: IProjectCaseSearchResultRow): void {\n this._router.navigate(['academic-ventures', row.project.id], {\n queryParams: {\n 'backUrl': this._router.url,\n 'backTitle': this._translater.instant('Search_results')\n }\n });\n }\n\n}\n","\n \n \n
\n
\n \n \n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'alerts-alerts-page',\n providers: [],\n styleUrls: ['./alerts.scss'],\n templateUrl: './alerts.html'\n})\nexport class AlertsAlertsPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._title.setTitle(this._translater.instant('Alerts') + ' | ' + this.conf.platformName);\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private onError(error: any): void {\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","\n\n
\n
\n 0 ? (filteredProjectTypes.length === 1 ? filteredProjectTypes[0].name : 'n_types_of_project' | translate:{count: filteredProjectTypes.length}) : null\">\n
\n
\n
\n {{ getGroupCheckboxIcon(group.types, filteredProjectTypes) }}\n {{ group.group.name }}\n
\n \n
{{ type.name }}
\n
\n
\n
\n
\n \n \n
\n
\n 0 ? (filteredTherapeuticAreas.length === 1 ? filteredTherapeuticAreas[0].name : 'n_therapeutic_areas' | translate:{count: filteredTherapeuticAreas.length}) : null\">\n
\n \n
{{ area.name }}
\n
\n
\n
\n \n \n
\n
\n 0 ? (filteredDevelopmentPhases.length === 1 ? filteredDevelopmentPhases[0].name : 'n_development_phases' | translate:{count: filteredDevelopmentPhases.length}) : null\">\n
\n \n
{{ phase.developmentPhase.name }}\n
\n
\n
\n
\n \n \n
\n
\n 0 ? (filteredFundingRound.length === 1 ? filteredFundingRound[0].name : 'n_funding_rounds' | translate:{count: filteredFundingRound.length}) : null\">\n
\n \n
{{ round.name }}\n
\n
\n
\n
\n \n \n
\n
\n \n
\n
\n
{{ 'Companies' | translate }}
\n \n
{{ 'Currently_raising_funds' | translate }}
\n
\n \n \n
{{ 'Currently_not_raising_funds' | translate }}
\n
\n \n
{{ 'Company_incorporated' | translate }}
\n
\n \n \n
{{ 'Company_not_incorporated' | translate }}
\n
\n \n
\n
\n
{{ 'Seeking_partnerships' | translate }}
\n \n
{{ 'Yes' | translate }}
\n
\n \n
{{ 'No' | translate }}
\n
\n
\n
\n
{{ 'Out_licensing_opportunities' | translate }}
\n \n
{{ 'Yes' | translate }}
\n
\n \n
{{ 'No' | translate }}
\n
\n
\n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n \n 1\">\n {{ 'Project_search_results' | translate:{count: dataSource.filteredData.length} }}\n \n \n {{ 'Project_search_result' | translate }}\n \n \n {{ 'Project_search_no_results' | translate }}\n \n \n
\n \n \n search\n \n
\n
\n\n
\n {{ 'No_item_yet' | translate }}\n
\n 0\"\n [dataSource]=\"dataSource\"\n matSort>\n \n \n \n \n \n \n \n \n \n {{ 'Name' | translate }}\n \n \n \n \n \n {{ 'Website' | translate }}\n \n\n \n \n \n \n {{ 'Type_of_project' | translate }}\n \n \n \n {{ type.name }}\n \n \n \n MAX_PROJECT_TYPES_DISPLAYED\">\n {{ 'and_n_more' | translate:{n: (row.projectTypes.length - MAX_PROJECT_TYPES_DISPLAYED)} }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { FormControl } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { NamePickerComponent } from '../../../_common/components/name-picker/name-picker';\nimport { SimpleMatDataSource } from '../../../_common/providers/simple-mat-data-source';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { Utils } from '../../../_common/providers/utils';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AlertsProvider } from '../../../alerts/providers/alerts-provider';\nimport {\n DevelopmentPhaseWithAssociatedProjectTypeGroups,\n ProjectFiltersState,\n ProjectSearchResultRow,\n ProjectsProvider,\n ProjectTypeGoupWithTypes\n} from '../../providers/projects-provider';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport {\n Alert,\n Alert_DevelopmentPhase,\n Alert_FundingRound,\n Alert_ProjectType,\n Alert_TherapeuticArea,\n DevelopmentPhase,\n FundingRound,\n InvestorProfile,\n Project,\n ProjectCase_ProjectType,\n ProjectCase_TherapeuticArea,\n ProjectFavorite,\n ProjectType,\n TherapeuticArea,\n User_AcademicInstitution\n} from '../../../_common/providers/models';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'projects-list',\n providers: [],\n styleUrls: ['./list.scss'],\n templateUrl: './list.html'\n})\nexport class ProjectsListComponent implements AfterViewInit, OnDestroy {\n public readonly INCORPORATION_YEAR_MIN: number = 1900;\n public readonly INCORPORATION_YEAR_MAX: number = (new Date()).getFullYear();\n\n //\n //\n // CONSTANTS\n //\n //\n public readonly TARGETED_INCORPORATION_YEAR_MIN: number = (new Date()).getFullYear();\n public readonly TARGETED_INCORPORATION_YEAR_MAX: number = 2050;\n public readonly AMOUNT_RAISED_MIN: number = 0;\n public readonly AMOUNT_RAISED_MAX: number = 99999999999; // 100 mia\n public readonly MAX_PROJECT_TYPES_DISPLAYED: number = 5;\n public isReady: boolean = false;\n public isAlertLoading: boolean = false;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n public rights: ProjectRights = new ProjectRights(this.utils);\n @Input() public disableSearchEngine: boolean = false;\n @Input() public moduleTitle: string = null;\n @Input() public hideLogoColumn: boolean = false;\n @Input() public hideNameColumn: boolean = false;\n @Input() public hideWebsiteColumn: boolean = false;\n @Input() public hideProjectTypeColumn: boolean = false;\n @Input() public hideActionsColumn: boolean = false;\n @Input() public investorProfile: InvestorProfile = null;\n @Input() public preserveFilters: boolean = false;\n @Output() public onRowClicked: EventEmitter = new EventEmitter();\n @Output() public onFavoriteClicked: EventEmitter = new EventEmitter();\n @Output() public onDeleteClicked: EventEmitter = new EventEmitter();\n @Output() public onEditClicked: EventEmitter = new EventEmitter();\n public dataSource: SimpleMatDataSource = new SimpleMatDataSource([]);\n public columns: string[] = [];\n @ViewChild(MatPaginator, {static: false}) public paginator: MatPaginator;\n @ViewChild(MatSort, {static: false}) public sorter: MatSort;\n public searchInput: FormControl = new FormControl('');\n public projectTypesCheckboxes: boolean[][] = [];\n public filteredProjectTypes: ProjectType[] = [];\n public therapeuticAreasCheckboxes: boolean[] = [];\n public filteredTherapeuticAreas: TherapeuticArea[] = [];\n public developmentPhasesCheckboxes: boolean[] = [];\n public filteredDevelopmentPhases: DevelopmentPhase[] = [];\n public fundingRoundsCheckboxes: boolean[] = [];\n public filteredFundingRound: FundingRound[] = [];\n public filteredOthers: Alert = new Alert(); // mini hack, on utilise directement cette structure pour binder les oui/non - c'est plus simple\n public collaborationSelectionLabel: string = null;\n public moreFiltersSelectionLabel: string = null;\n public yearOfIncorporationToFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.yearOfIncorporationToFormControl, this.yearOfIncorporationFromFormControl, null, this.INCORPORATION_YEAR_MIN, this.INCORPORATION_YEAR_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public yearOfIncorporationFromFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.yearOfIncorporationFromFormControl, null, this.yearOfIncorporationToFormControl, this.INCORPORATION_YEAR_MIN, this.INCORPORATION_YEAR_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public targetedYearOfIncorporationToFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.targetedYearOfIncorporationToFormControl, this.targetedYearOfIncorporationFromFormControl, null, this.TARGETED_INCORPORATION_YEAR_MIN, this.TARGETED_INCORPORATION_YEAR_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public targetedYearOfIncorporationFromFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.targetedYearOfIncorporationFromFormControl, null, this.targetedYearOfIncorporationToFormControl, this.TARGETED_INCORPORATION_YEAR_MIN, this.TARGETED_INCORPORATION_YEAR_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public amountRaisedToFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.amountRaisedToFormControl, this.amountRaisedFromFormControl, null, this.AMOUNT_RAISED_MIN, this.AMOUNT_RAISED_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public amountRaisedFromFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.amountRaisedFromFormControl, null, this.amountRaisedToFormControl, this.AMOUNT_RAISED_MIN, this.AMOUNT_RAISED_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public projectTypeGroups: ProjectTypeGoupWithTypes[] = [];\n public projectTypes: ProjectType[] = [];\n public therapeuticAreas: TherapeuticArea[] = [];\n public developmentPhases: DevelopmentPhase[] = [];\n public fundingRound: FundingRound[] = [];\n public developmentPhasesWithAssociatedProjectTypeGroups: DevelopmentPhaseWithAssociatedProjectTypeGroups[] = [];\n private _allRows: ProjectSearchResultRow[] = [];\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public currentUser: CurrentUser,\n public projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _dialoger: MatDialog,\n private _router: Router,\n private _route: ActivatedRoute,\n private _toaster: MatSnackBar,\n private _alertsProvider: AlertsProvider,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n private _projects: Project[] = [];\n\n public get projects() {\n return this._projects;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set projects(projects: Project[]) {\n this._projects = projects;\n if (projects && projects.length) {\n this.loadStaticData()\n .then(() => {\n this.buildDataRows(projects)\n .then((rows: ProjectSearchResultRow[]) => {\n this._allRows = rows;\n this.applyFilters();\n })\n .catch((error: any) => this.onError(error));\n })\n .catch((error: any) => this.onError(error));\n } else {\n this._allRows = [];\n this.applyFilters();\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.initColumns();\n this.initDataSource();\n this.loadStaticData()\n .then(() => {\n this._route.params.subscribe((params: any) => {\n this.rights.evaluate({\n investorProfile: this.investorProfile,\n user: this.currentUser.user\n });\n const alertId: number = parseInt(params.alertId, 10);\n if (alertId) {\n this.getFiltersStateFromAlert(alertId)\n .then((state: ProjectFiltersState) => {\n this.initFilters(state)\n .then(() => this.isReady = true)\n .catch((error: any) => this.onError(error));\n })\n .catch((error: any) => this.onError(error));\n } else if (this.preserveFilters) {\n this.initFilters(this.projectsProvider.projectFiltersState)\n .then(() => this.isReady = true)\n .catch((error: any) => this.onError(error));\n } else {\n this.initFilters(null)\n .then(() => this.isReady = true)\n .catch((error: any) => this.onError(error));\n }\n });\n })\n .catch((error: any) => this.onError(error));\n }\n\n public ngOnDestroy() {\n if (this.preserveFilters) {\n this.saveFiltersState();\n }\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onDataSortChange(event: any): void {\n this.dataSource.sortBy(event.active, event.direction);\n }\n\n public searchInputChanged(filter: string): void {\n this.dataSource.filter = this.utils.normalizeString(filter);\n }\n\n public _onRowClicked(row: ProjectSearchResultRow): void {\n if (row.rights.SEE) {\n this.onRowClicked.emit(row);\n }\n }\n\n public onAllProjectTypesClicked(event: any): void {\n event.stopPropagation();\n this.filteredProjectTypes = this.projectTypes.slice();\n this.switchAllCheckboxesWithGroup(this.projectTypesCheckboxes, this.projectTypeGroups, 'types', true);\n this.applyFilters();\n }\n\n public onNoProjectTypesClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredProjectTypes = [];\n this.switchAllCheckboxesWithGroup(this.projectTypesCheckboxes, this.projectTypeGroups, 'types', false);\n this.applyFilters();\n }\n\n public onAllTherapeuticAreasClicked(event: any): void {\n event.stopPropagation();\n this.filteredTherapeuticAreas = this.therapeuticAreas.slice();\n this.switchAllCheckboxes(this.therapeuticAreasCheckboxes, this.therapeuticAreas, true);\n this.applyFilters();\n }\n\n public onNoTherapeuticAreasClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredTherapeuticAreas = [];\n this.switchAllCheckboxes(this.therapeuticAreasCheckboxes, this.therapeuticAreas, false);\n this.applyFilters();\n }\n\n public onAllDevelopmentPhasesClicked(event: any): void {\n event.stopPropagation();\n this.filteredDevelopmentPhases = this.developmentPhases.slice();\n this.switchAllCheckboxes(this.developmentPhasesCheckboxes, this.developmentPhases, true);\n this.applyFilters();\n }\n\n public onNoDevelopmentPhasesClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredDevelopmentPhases = [];\n this.switchAllCheckboxes(this.developmentPhasesCheckboxes, this.developmentPhases, false);\n this.applyFilters();\n }\n\n public onAllFundingRoundsClicked(event: any): void {\n event.stopPropagation();\n this.filteredFundingRound = this.fundingRound.slice();\n this.switchAllCheckboxes(this.fundingRoundsCheckboxes, this.fundingRound, true);\n this.applyFilters();\n }\n\n public onNoFundingRoundsClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredFundingRound = [];\n this.switchAllCheckboxes(this.fundingRoundsCheckboxes, this.fundingRound, false);\n this.applyFilters();\n }\n\n public onProjectTypeClicked(event: any, type: ProjectType): void {\n setTimeout(() => {\n this.toggleFilterSelection(type, this.filteredProjectTypes);\n this.applyFilters();\n }, 1);\n }\n\n public onTherapeuticAreaClicked(event: any, area: TherapeuticArea): void {\n setTimeout(() => {\n this.toggleFilterSelection(area, this.filteredTherapeuticAreas);\n this.applyFilters();\n }, 1);\n }\n\n public onDevelopmentPhaseClicked(event: any, phase: DevelopmentPhase): void {\n setTimeout(() => {\n this.toggleFilterSelection(phase, this.filteredDevelopmentPhases);\n this.applyFilters();\n }, 1);\n }\n\n public onFundingRoundClicked(event: any, round: FundingRound): void {\n setTimeout(() => {\n this.toggleFilterSelection(round, this.filteredFundingRound);\n this.applyFilters();\n }, 1);\n }\n\n public onMoreFiltersItemClicked(event: any): void {\n setTimeout(() => {\n const selectionLabels: string[] = [];\n\n this.yearOfIncorporationFromFormControl.updateValueAndValidity();\n this.yearOfIncorporationToFormControl.updateValueAndValidity();\n this.targetedYearOfIncorporationFromFormControl.updateValueAndValidity();\n this.targetedYearOfIncorporationToFormControl.updateValueAndValidity();\n this.amountRaisedFromFormControl.updateValueAndValidity();\n this.amountRaisedToFormControl.updateValueAndValidity();\n\n if (this.filteredOthers.isSeekingPartnerhips || this.filteredOthers.isNotSeekingPartnerhips) {\n selectionLabels.push('Seeking_partnerships');\n }\n if (this.filteredOthers.isOutlicensing || this.filteredOthers.isNotOutlicensing) {\n selectionLabels.push('Out_licensing_opportunities');\n }\n if (this.filteredOthers.isNotForProfit || this.filteredOthers.isNotNotForProfit) {\n selectionLabels.push('Not_for_profit_ventures');\n }\n if (this.filteredOthers.isCompanyIncorporated) {\n selectionLabels.push('Company_incorporated');\n } else {\n this.yearOfIncorporationFromFormControl.setValue(null);\n this.yearOfIncorporationToFormControl.setValue(null);\n }\n if (this.filteredOthers.isCompanyNotIncorporated) {\n selectionLabels.push('Company_not_incorporated');\n } else {\n this.targetedYearOfIncorporationFromFormControl.setValue(null);\n this.targetedYearOfIncorporationToFormControl.setValue(null);\n }\n if (this.filteredOthers.isRaisingFunds) {\n selectionLabels.push('Currently_raising_funds');\n } else {\n this.amountRaisedFromFormControl.setValue(null);\n this.amountRaisedToFormControl.setValue(null);\n }\n if (this.filteredOthers.isNotRaisingFunds) {\n selectionLabels.push('Currently_not_raising_funds');\n }\n\n if (selectionLabels.length === 0) {\n this.moreFiltersSelectionLabel = null;\n } else if (selectionLabels.length === 1) {\n this.moreFiltersSelectionLabel = this._translater.instant(selectionLabels[0]);\n } else {\n this.moreFiltersSelectionLabel = this._translater.instant('n_filters', {count: selectionLabels.length});\n }\n\n this.applyFilters();\n }, 1);\n }\n\n public onResetFiltersClicked(): void {\n this.filteredProjectTypes = [];\n this.switchAllCheckboxesWithGroup(this.projectTypesCheckboxes, this.projectTypeGroups, 'types', false);\n this.filteredTherapeuticAreas = [];\n this.switchAllCheckboxes(this.therapeuticAreasCheckboxes, this.therapeuticAreas, false);\n this.filteredDevelopmentPhases = [];\n this.switchAllCheckboxes(this.developmentPhasesCheckboxes, this.developmentPhases, false);\n this.filteredFundingRound = [];\n this.switchAllCheckboxes(this.fundingRoundsCheckboxes, this.fundingRound, false);\n this.filteredOthers.isSeekingPartnerhips = null;\n this.filteredOthers.isNotSeekingPartnerhips = null;\n this.filteredOthers.isOutlicensing = null;\n this.filteredOthers.isNotOutlicensing = null;\n this.filteredOthers.isNotForProfit = null;\n this.filteredOthers.isNotNotForProfit = null;\n this.filteredOthers.isCompanyIncorporated = null;\n this.filteredOthers.isCompanyNotIncorporated = null;\n this.filteredOthers.isRaisingFunds = null;\n this.filteredOthers.isNotRaisingFunds = null;\n this.yearOfIncorporationFromFormControl.setValue(null);\n this.yearOfIncorporationToFormControl.setValue(null);\n this.targetedYearOfIncorporationFromFormControl.setValue(null);\n this.targetedYearOfIncorporationToFormControl.setValue(null);\n this.amountRaisedFromFormControl.setValue(null);\n this.amountRaisedToFormControl.setValue(null);\n this.moreFiltersSelectionLabel = null;\n\n this.applyFilters();\n }\n\n public onProjectTypeGroupClicked(event: any, row: ProjectTypeGoupWithTypes, rowIndex: number): void {\n const matchingItems: ProjectType[] = this.utils.findManyIn(\n this.utils.getKeyValues(row.types, 'id'),\n this.filteredProjectTypes,\n 'id'\n );\n\n // si tout était déjà sélectionné ...\n if (matchingItems.length === row.types.length) {\n // on enlève tout\n for (let i = 0; i < row.types.length; i++) {\n this.filteredProjectTypes.splice(this.filteredProjectTypes.indexOf(row.types[i]), 1);\n this.projectTypesCheckboxes[rowIndex][i] = false;\n }\n } else {\n // sinon on ajoute celles qui manquent\n for (let i = 0; i < row.types.length; i++) {\n if (this.filteredProjectTypes.indexOf(row.types[i]) < 0) {\n this.filteredProjectTypes.push(row.types[i]);\n this.projectTypesCheckboxes[rowIndex][i] = true;\n }\n }\n }\n\n this.applyFilters();\n }\n\n public stopPropagation(event): void {\n event.stopPropagation();\n }\n\n public onAddAlertClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(NamePickerComponent, {\n data: {\n name: '',\n title: 'Add_an_alert',\n placeholder: 'Alert_name',\n maxLength: 255,\n explaination: 'Add_alert_explaination'\n }\n });\n dialog.afterClosed().subscribe((name: string) => {\n if (name) {\n this.isAlertLoading = true;\n this.saveAlert(name)\n .then((alert: Alert) => {\n this.isAlertLoading = false;\n this._router.navigate(['alerts', alert.id])\n .then(() => this._toaster.open(this._translater.instant('Alert_saved'), '', {duration: 5000}))\n .catch((error: any) => this.onError(error));\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n public areFiltersValid(): boolean {\n // les seuls filtres qui peuvent potentiellement être invalides sont les inputs\n // (je vois pas comment les checkbox pourront être invalides ...)\n return this.isMoreFiltersValid();\n }\n\n public isMoreFiltersValid(): boolean {\n return !this.amountRaisedFromFormControl.invalid\n && !this.amountRaisedToFormControl.invalid\n && !this.targetedYearOfIncorporationFromFormControl.invalid\n && !this.targetedYearOfIncorporationToFormControl.invalid\n && !this.yearOfIncorporationFromFormControl.invalid\n && !this.yearOfIncorporationToFormControl.invalid;\n }\n\n public hasFilters(): boolean {\n return this.filteredProjectTypes.length > 0\n || this.filteredTherapeuticAreas.length > 0\n || this.filteredDevelopmentPhases.length > 0\n || this.filteredFundingRound.length > 0\n || this.collaborationSelectionLabel != null\n || this.moreFiltersSelectionLabel != null;\n }\n\n public _onFavoriteClicked(row: ProjectSearchResultRow): void {\n this.onFavoriteClicked.emit(row);\n }\n\n public getGroupCheckboxIcon(items: any[], checkAgainst: any): string {\n const matchingItems: number[] = this.utils.findManyIn(this.utils.getKeyValues(checkAgainst), items, 'id');\n if (matchingItems.length === 0) {\n return 'check_box_outline_blank';\n } else if (matchingItems.length === items.length) {\n return 'check_box';\n }\n\n return 'indeterminate_check_box';\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadStaticData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(ProjectType).get(),\n this._storage.select(TherapeuticArea).orderBy('name').get(),\n this._storage.select(DevelopmentPhase).orderBy('ordinal').get(),\n this.projectsProvider.getProjectTypeGroups(),\n this.projectsProvider.getDevelopmentPhasesWithAssociatedProjectTypeGroups(),\n this._storage.select(FundingRound).get(),\n ])\n .then((data: any[]) => {\n this.projectTypes = data[0];\n this.therapeuticAreas = data[1];\n this.developmentPhases = data[2];\n this.projectTypeGroups = data[3];\n this.developmentPhasesWithAssociatedProjectTypeGroups = data[4];\n this.fundingRound = data[5];\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private applyFilters(): void {\n if (!this.areFiltersValid()) {\n return;\n }\n\n const rows: ProjectSearchResultRow[] = [];\n for (let i = 0; i < this._allRows.length; i++) {\n if (this.matchFilterSomeList(this._allRows[i].projectTypeIds, this.filteredProjectTypes)\n && this.matchFilterSomeList(this._allRows[i].therapeuticAreaIds, this.filteredTherapeuticAreas)\n && this.matchFilterSomeList([this._allRows[i].project.developmentPhaseId], this.filteredDevelopmentPhases)\n && this.matchFilterSomeList([this._allRows[i].fundingRoundId], this.filteredFundingRound)\n && this.matchFilterCollaboration(this._allRows[i])\n && this.matchFilterMoreFilters(this._allRows[i])) {\n rows.push(this._allRows[i]);\n }\n }\n\n this.dataSource.replaceAllWith(rows);\n }\n\n private toggleFilterSelection(item: any, list: any[]): boolean {\n const index: number = list.indexOf(item);\n if (index >= 0) {\n list.splice(index, 1);\n\n return false;\n }\n\n list.push(item);\n\n return true;\n }\n\n private buildDataRows(projects: Project[]): Promise {\n return new Promise((resolve, reject) => {\n if (projects.length === 0) {\n resolve([]);\n return;\n }\n\n const projectIds: number[] = this.utils.getKeyValues(projects, 'id');\n Promise.all([\n this._storage.select(ProjectCase_ProjectType).where('projectId').in(projectIds).get(),\n this._storage.select(ProjectCase_TherapeuticArea).where('projectId').in(projectIds).get(),\n this._storage.select(ProjectFavorite).where('userId').equals(this.currentUser.user.id).get(),\n this._storage.select(User_AcademicInstitution).where('userId').equals(this.currentUser.user.id).get()\n ])\n .then((relatedData: any[]) => {\n const data: ProjectSearchResultRow[] = [];\n for (let i = 0; i < projects.length; i++) {\n const rights: ProjectRights = new ProjectRights(this.utils);\n rights.evaluate({\n project: projects[i],\n user: this.currentUser.user,\n investorProfile: this.investorProfile,\n user_academicInstitutions: relatedData[3]\n });\n\n const projectTypesIds: number[] = this.utils.getKeyValues(this.utils.findManyIn([projects[i].id], relatedData[0], 'projectId'), 'projectTypeId');\n const therapeuticAreaIds: number[] = this.utils.getKeyValues(this.utils.findManyIn([projects[i].id], relatedData[1], 'projectId'), 'therapeuticAreaId');\n const row: ProjectSearchResultRow = {\n project: projects[i],\n institution1: null,\n fundingRoundId: projects[i].isRaisingFunds === 1 && this.utils.findIn(projects[i].fundingRoundId, this.fundingRound) ? this.utils.findIn(projects[i].fundingRoundId, this.fundingRound).id : 0,\n rights,\n projectTypes: this.utils.findManyIn(projectTypesIds, this.projectTypes),\n therapeuticAreas: this.utils.findManyIn(therapeuticAreaIds, this.therapeuticAreas),\n projectTypeIds: projectTypesIds,\n therapeuticAreaIds,\n isLoading: false,\n isFavorite: this.utils.findIn(projects[i].id, relatedData[2], 'projectId') !== null\n };\n\n // FIXME: deactivate thumbnail because it is not resized (> 1MB) and list loads multiple images, which block\n // the execution of other requests\n // if (projects[i].logo) { // on remplace le logo par l'illustration, mais c'est pas encore définitif...\n // if (projects[i].illustration) {\n // this._filesProvider.downloadFile('projects/' + projects[i].id + '/download-logo')\n // this._filesProvider.downloadFile('projects/' + projects[i].id + '/download-illustration', null, {noCache: true})\n // .then((fileData: any) => {\n // const reader: FileReader = new FileReader();\n // reader.addEventListener('load', () => row.logoImage = reader.result, false);\n // reader.readAsDataURL(fileData);\n // })\n // .catch((error: any) => this.onError(error));\n // } else {\n row.logoImage = null;\n // }\n\n data.push(row);\n }\n\n resolve(data);\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private saveFiltersState(): void {\n const projectTypeIds: number[] = this.utils.getKeyValues(this.filteredProjectTypes);\n const therapeuticAreaIds: number[] = this.utils.getKeyValues(this.filteredTherapeuticAreas);\n const developmentPhaseIds: number[] = this.utils.getKeyValues(this.filteredDevelopmentPhases);\n const fundingRoundIds: number[] = this.utils.getKeyValues(this.filteredFundingRound);\n const alert: Alert = this.filteredOthers.clone();\n\n this.projectsProvider.projectFiltersState = {\n alert,\n developmentPhaseIds,\n fundingRoundIds,\n projectTypeIds,\n therapeuticAreaIds,\n pageIndex: this.paginator.pageIndex\n };\n }\n\n private getFiltersStateFromAlert(alertId: number): Promise {\n return new Promise((resolve, reject) => {\n alertId = alertId ? alertId : 0;\n Promise.all([\n this._storage.select(Alert_ProjectType).where('alertId').equals(alertId).get(),\n this._storage.select(Alert_TherapeuticArea).where('alertId').equals(alertId).get(),\n this._storage.select(Alert_DevelopmentPhase).where('alertId').equals(alertId).get(),\n this._storage.select(Alert).where('id').equals(alertId).get(1),\n this._storage.select(Alert_FundingRound).where('alertId').equals(alertId).get(),\n ])\n .then((data: any[]) => {\n resolve({\n alert: data[3],\n developmentPhaseIds: this.utils.getKeyValues(data[2], 'developmentPhaseId'),\n projectTypeIds: this.utils.getKeyValues(data[0], 'projectTypeId'),\n therapeuticAreaIds: this.utils.getKeyValues(data[1], 'therapeuticAreaId'),\n fundingRoundIds: this.utils.getKeyValues(data[1], 'fundingRoundId'),\n pageIndex: 0\n });\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private initFilters(filtersState: ProjectFiltersState): Promise {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n filtersState = filtersState ? filtersState : {\n alert: new Alert(),\n developmentPhaseIds: [],\n fundingRoundIds: [],\n projectTypeIds: [],\n therapeuticAreaIds: [],\n pageIndex: 0\n };\n\n this.filteredProjectTypes = [];\n this.projectTypesCheckboxes = [];\n this.filteredTherapeuticAreas = [];\n this.therapeuticAreasCheckboxes = [];\n this.filteredDevelopmentPhases = [];\n this.developmentPhasesCheckboxes = [];\n this.filteredFundingRound = [];\n this.fundingRoundsCheckboxes = [];\n\n this.projectTypeGroups.forEach((item: ProjectTypeGoupWithTypes, i: number) => {\n const rows: boolean[] = [];\n item.types.forEach((type: ProjectType, j: number) => {\n if (filtersState.projectTypeIds.indexOf(type.id) >= 0) {\n rows.push(true);\n this.filteredProjectTypes.push(type);\n } else {\n rows.push(false);\n }\n });\n this.projectTypesCheckboxes.push(rows);\n });\n\n this.therapeuticAreas.forEach((item: TherapeuticArea, i: number) => {\n if (filtersState.therapeuticAreaIds.indexOf(item.id) >= 0) {\n this.therapeuticAreasCheckboxes.push(true);\n this.filteredTherapeuticAreas.push(item);\n } else {\n this.therapeuticAreasCheckboxes.push(false);\n }\n });\n\n this.fundingRound.forEach((item: FundingRound, i: number) => {\n if (filtersState.fundingRoundIds) {\n if (filtersState.fundingRoundIds.indexOf(item.id) >= 0) {\n this.fundingRoundsCheckboxes.push(true);\n this.filteredFundingRound.push(item);\n } else {\n this.fundingRoundsCheckboxes.push(false);\n }\n }\n });\n\n this.developmentPhases.forEach((item: DevelopmentPhase, i: number) => {\n if (filtersState.developmentPhaseIds.indexOf(item.id) >= 0) {\n this.developmentPhasesCheckboxes.push(true);\n this.filteredDevelopmentPhases.push(item);\n } else {\n this.developmentPhasesCheckboxes.push(false);\n }\n });\n\n this.filteredOthers = filtersState.alert ? filtersState.alert.clone() : new Alert();\n this.filteredOthers.id = 0; // pour être sûr de ne pas lier de futures recherches avec cette alerte\n this.onMoreFiltersItemClicked({}); // vilain hack pour refresh le control ...\n\n this.applyFilters();\n\n this.paginator.pageIndex = filtersState.pageIndex;\n\n resolve();\n }, 1);\n });\n }\n\n private initColumns(): void {\n const columns: string[] = [];\n // if (!this.hideLogoColumn) {\n // columns.push('logo');\n // }\n if (!this.hideNameColumn) {\n columns.push('name');\n }\n if (!this.hideWebsiteColumn) {\n columns.push('website');\n }\n if (!this.hideProjectTypeColumn) {\n columns.push('type');\n }\n if (!this.hideActionsColumn) {\n columns.push('actions');\n }\n\n this.columns = columns;\n }\n\n private initDataSource(): void {\n this.dataSource.sort = this.sorter;\n this.dataSource.paginator = this.paginator;\n this.dataSource.filterPredicate = (row: ProjectSearchResultRow, filter: string) => {\n return this.utils.normalizeString(\n row.project.name +\n (row.project.keywords ? row.project.keywords : '') +\n (row.project.pipeline ? row.project.pipeline : '') +\n (row.institution1 ? row.institution1.name : '')\n ).includes(filter);\n };\n this.searchInput.valueChanges.subscribe((value: string) => this.searchInputChanged(value)); // on utilise pas un bête keyup parce que si on sélectionne le texte et qu'on le coupe par exemple, on catch pas l'event ...\n\n this.dataSource.addSortDefinition(\n 'name',\n (a: ProjectSearchResultRow, b: ProjectSearchResultRow) => this.utils.sortRow(a.project.name.toLowerCase(), b.project.name.toLowerCase()),\n (a: ProjectSearchResultRow, b: ProjectSearchResultRow) => this.utils.sortRow(b.project.name.toLowerCase(), a.project.name.toLowerCase())\n );\n\n this.dataSource.addSortDefinition(\n 'website',\n (a: ProjectSearchResultRow, b: ProjectSearchResultRow) => {\n if (!a.project.contactWebsite) {\n return -1;\n } else if (!b.project.contactWebsite) {\n return 1;\n }\n\n return this.utils.sortRow(a.project.contactWebsite.toLowerCase(), b.project.contactWebsite.toLowerCase());\n },\n (a: ProjectSearchResultRow, b: ProjectSearchResultRow) => {\n if (!b.project.contactWebsite) {\n return -1;\n } else if (!a.project.contactWebsite) {\n return 1;\n }\n\n return this.utils.sortRow(b.project.contactWebsite.toLowerCase(), a.project.contactWebsite.toLowerCase());\n }\n );\n\n this.dataSource.addSortDefinition(\n 'type',\n (a: ProjectSearchResultRow, b: ProjectSearchResultRow) => this.utils.sortRow(this.utils.getKeyValues(a.projectTypes, 'name').join('').toLowerCase(), this.utils.getKeyValues(b.projectTypes, 'name').join('').toLowerCase()),\n (a: ProjectSearchResultRow, b: ProjectSearchResultRow) => this.utils.sortRow(this.utils.getKeyValues(b.projectTypes, 'name').join('').toLowerCase(), this.utils.getKeyValues(a.projectTypes, 'name').join('').toLowerCase())\n );\n }\n\n private switchAllCheckboxes(list: boolean[], data: any, value: boolean): void {\n for (let i = 0; i < data.length; i++) {\n list[i] = value;\n }\n }\n\n private switchAllCheckboxesWithGroup(list: boolean[][], data: any, keyName: string, value: boolean): void {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i][keyName].length; j++) {\n list[i][j] = value;\n }\n }\n }\n\n private checkMinMaxFormControl(targetControl: FormControl, minControl: FormControl, maxControl: FormControl, minFallback: number, maxFallback: number): any {\n if (!targetControl || !targetControl.value) {\n return null;\n }\n\n if (minControl && minControl.value && targetControl.value < minControl.value) {\n return {consistency: {valid: false}};\n } else if (targetControl.value < minFallback) {\n return {consistency: {valid: false}};\n }\n\n if (maxControl && maxControl.value && targetControl.value > maxControl.value) {\n return {consistency: {valid: false}};\n } else if (targetControl.value > maxFallback) {\n return {consistency: {valid: false}};\n }\n\n return null;\n }\n\n private matchFilterSomeList(keys: number[], filters: any[]): boolean {\n // s'il n'y a pas de filter, ça match ...\n if (filters.length === 0) {\n return true;\n }\n\n // on prend pas en considération les clés qui seraient null ...\n const _keys: number[] = keys.filter((val: number) => val ? true : false);\n\n return this.utils.findManyIn(_keys, filters, 'id').length > 0;\n }\n\n private matchFilterCollaboration(row: ProjectSearchResultRow): boolean {\n if (!this.matchFilterYesNo(this.filteredOthers.isSeekingPartnerhips, this.filteredOthers.isNotSeekingPartnerhips, row.project.isSeekingPartnerships)) {\n return false;\n }\n\n if (!this.matchFilterYesNo(this.filteredOthers.isOutlicensing, this.filteredOthers.isNotOutlicensing, row.project.isOfferingLicensing)) {\n return false;\n }\n\n if (!this.matchFilterYesNo(this.filteredOthers.isNotForProfit, this.filteredOthers.isNotNotForProfit, row.project.isNotForProfit)) {\n return false;\n }\n\n return true;\n }\n\n private matchFilterMoreFilters(row: ProjectSearchResultRow): boolean {\n if (!this.matchFilterYesNo(this.filteredOthers.isRaisingFunds, this.filteredOthers.isNotRaisingFunds, row.project.isRaisingFunds)) {\n return false;\n }\n // *100 ; on a le montant en cents, et on l'utilisateur le saisit en dollars\n if (this.amountRaisedFromFormControl.value && (!row.project.raisingFundsAmount || (this.amountRaisedFromFormControl.value * 100) > row.project.raisingFundsAmount)) {\n return false;\n }\n if (this.amountRaisedToFormControl.value && (!row.project.raisingFundsAmount || (this.amountRaisedToFormControl.value * 100) < row.project.raisingFundsAmount)) {\n return false;\n }\n\n if (!this.matchFilterYesNo(this.filteredOthers.isCompanyIncorporated, this.filteredOthers.isCompanyNotIncorporated, row.project.isCompanyIncorporated)) {\n return false;\n }\n if (row.project.isCompanyIncorporated) {\n if (this.yearOfIncorporationFromFormControl.value && (!row.project.incorporationYear || this.yearOfIncorporationFromFormControl.value > row.project.incorporationYear)) {\n return false;\n }\n if (this.yearOfIncorporationToFormControl.value && (!row.project.incorporationYear || this.yearOfIncorporationToFormControl.value < row.project.incorporationYear)) {\n return false;\n }\n } else {\n if (this.targetedYearOfIncorporationFromFormControl.value && (!row.project.incorporationYear || this.targetedYearOfIncorporationFromFormControl.value > row.project.incorporationYear)) {\n return false;\n }\n if (this.targetedYearOfIncorporationToFormControl.value && (!row.project.incorporationYear || this.targetedYearOfIncorporationToFormControl.value < row.project.incorporationYear)) {\n return false;\n }\n }\n\n return true;\n }\n\n private matchFilterYesNo(yesValue: number, noValue: number, actualValue: number): boolean {\n // si rien n'est coché, on ignore le filtre (l'utilisateur n'a pas renseigner l'info ...)\n // si les deux sont cochés, on ignore le filtre (l'utilisateur indique explicitement qu'il veut les 2, et y a que 2 possibilités, donc ce sera forcément true)\n // si un seul des deux est cochés, on check que ca match avec le model\n if (yesValue) {\n if (!noValue) {\n if (!(actualValue == 1)) {\n return false;\n }\n }\n } else {\n if (noValue) {\n if (actualValue == 1) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n private saveAlert(name: string): Promise {\n return new Promise((resolve, reject) => {\n const alert: Alert = this.filteredOthers.clone();\n alert.id = 0; // on peut pas modifier une alerte, on en créé systématiquement des nouvelles\n alert.name = name;\n alert.isCompanyIncorporated = alert.isCompanyIncorporated ? 1 : 0;\n alert.isCompanyNotIncorporated = alert.isCompanyNotIncorporated ? 1 : 0;\n alert.isSeekingPartnerhips = alert.isSeekingPartnerhips ? 1 : 0;\n alert.isNotSeekingPartnerhips = alert.isNotSeekingPartnerhips ? 1 : 0;\n alert.isOutlicensing = alert.isOutlicensing ? 1 : 0;\n alert.isNotOutlicensing = alert.isNotOutlicensing ? 1 : 0;\n alert.isNotForProfit = alert.isNotForProfit ? 1 : 0;\n alert.isNotNotForProfit = alert.isNotNotForProfit ? 1 : 0;\n alert.isRaisingFunds = alert.isRaisingFunds ? 1 : 0;\n alert.isNotRaisingFunds = alert.isNotRaisingFunds ? 1 : 0;\n\n this._alertsProvider.saveAlert(alert)\n .then((savedAlert: Alert) => {\n Promise.all([\n this._alertsProvider.saveAlertProjectTypes(savedAlert.id, this.utils.getKeyValues(this.filteredProjectTypes, 'id')),\n this._alertsProvider.saveAlertTherapeuticAreas(savedAlert.id, this.utils.getKeyValues(this.filteredTherapeuticAreas, 'id')),\n this._alertsProvider.saveAlertDevelopmentPhases(savedAlert.id, this.utils.getKeyValues(this.filteredDevelopmentPhases, 'id')),\n this._alertsProvider.saveAlertFundingRounds(savedAlert.id, this.utils.getKeyValues(this.filteredFundingRound, 'id'))\n ])\n .then(() => resolve(savedAlert))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n this.isReady = true;\n this.isAlertLoading = false;\n console.log(error);\n if (error.status === 429) {\n return;\n }\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","\n

{{ 'No_favorites_yet' | translate }}

\n \n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { ProjectSearchResultRow, ProjectsProvider } from '../../providers/projects-provider';\nimport { InvestorProfile, Project, ProjectFavorite } from '../../../_common/providers/models';\n\n@Component({\n selector: 'favorites-list',\n providers: [],\n styleUrls: ['./favorites-list.scss'],\n templateUrl: './favorites-list.html'\n})\nexport class FavoritesListComponent implements AfterViewInit {\n\n public isLoading: boolean = false;\n\n public projects: Project[] = [];\n public investorProfile: InvestorProfile = null;\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _dialoger: MatDialog,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this.loadData()\n .then(() => {\n this._title.setTitle(this._translater.instant('Favorites') + ' | ' + this.conf.platformName);\n })\n .catch((error: any) => this.onError(error));\n this._changeDetector.detectChanges();\n }\n\n public onRowClicked(row: ProjectSearchResultRow): void {\n this._router.navigate(['academic-ventures', row.project.id], {\n queryParams: {\n 'backUrl': this._router.url,\n 'backTitle': this._translater.instant('Favorites')\n }\n });\n }\n\n public onFavoriteClicked(row: ProjectSearchResultRow): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_favorite_warning',\n confirmActionText: 'Remove'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n row.isLoading = true;\n this.deleteFavorite(row.project)\n .then(() => {\n this.projects = this.projects.slice(); // pour trigger un refresh\n this._toaster.open(this._translater.instant('Favorite_deleted'), '', {duration: 5000});\n })\n .catch((error: any) => {\n row.isLoading = false;\n this.onError(error);\n });\n }\n });\n }\n\n private loadData(): Promise {\n return Promise.all([\n this._storage.select(Project)\n .where('id').equals(ProjectFavorite, 'projectId')\n .and('userId', ProjectFavorite).equals(this.currentUser.user.id)\n .orderBy('name')\n .get(),\n this._storage.select(InvestorProfile).where('userId').equals(this.currentUser.user.id).get(1)\n ])\n .then((data: any[]) => {\n this.projects = data[0];\n this.investorProfile = data[1];\n\n });\n }\n\n private deleteFavorite(project: Project): Promise {\n return this._projectsProvider.toggleProjectFavorite(project)\n .then(() => {\n for (let i = 0; i < this.projects.length; i++) {\n if (this.projects[i].id === project.id) {\n this.projects.splice(i, 1);\n i = this.projects.length;\n }\n\n break;\n }\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","\n \n \n
\n
\n \n \n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Title } from '@angular/platform-browser';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { InvestorProfile, Project } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-favorites-page',\n providers: [],\n styleUrls: ['./favorites.scss'],\n templateUrl: './favorites.html'\n})\nexport class ProjectsFavoritesPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public projects: Project[] = [];\n public investorProfile: InvestorProfile = null;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _toaster: MatSnackBar,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._title.setTitle(this._translater.instant('Favorites'));\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n // PRIVATE METHODS\n //\n //\n\n private onError(error: any): void {\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({name: 'ellipsize'})\nexport class EllipsizePipe implements PipeTransform {\n constructor() {\n }\n\n public transform(str: string, maxLength: number) {\n if (!maxLength) {\n return str;\n }\n\n if (str.length > maxLength) {\n return str.substr(0, maxLength) + '...';\n }\n\n return str;\n }\n}\n","{{ isExtended ? text : (text | ellipsize:max) }}\n\n","import { AfterViewInit, Component, Input } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'extensible-p',\n styleUrls: ['./extensible-p.scss'],\n templateUrl: './extensible-p.html'\n})\nexport class ExtensiblePComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public max: number = 0;\n @Input() public color: string = 'accent';\n @Input() public isExtended: boolean = false;\n\n constructor(\n private _translater: TranslateService,\n ) {\n }\n\n private _text: string = '';\n\n public get text() {\n return this._text;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set text(text: string) {\n this._text = text ? text : '';\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onToggleClicked(): void {\n this.isExtended = !this.isExtended;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","
{{ title }}
\n\n
    \n
  • {{ item }}
  • \n
\n
\n\n \n","import { AfterViewInit, Component, Inject } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { Utils } from '../../providers/utils';\n\n@Component({\n selector: 'item-list-dialog',\n providers: [],\n styleUrls: ['./item-list-dialog.scss'],\n templateUrl: './item-list-dialog.html'\n})\nexport class ItemListDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public title: string = '';\n public items: string[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public dialog: MatDialogRef,\n private _utils: Utils,\n private _translater: TranslateService,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n this.title = this._data.title;\n this.items = this._data.items;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","\n
\n
\n \n
\n
\n
{{ 'Project_title' | translate }}:
\n
{{ projectCase.projectCase.title }}
\n
\n
\n
{{ 'Subtitle' | translate }}:
\n
{{ projectCase.projectCase.subtitle }}
\n
\n
\n
{{ 'Phase_of_development' | translate }}:
\n
{{ projectCase.developmentPhase.name }}
\n
\n
\n
{{ 'Patent' | translate }}:
\n
{{ projectCase.patentState.name }}
\n
\n\n
\n
{{ 'Type_of_project' | translate }}:
\n
\n \n {{ projectType.name }}\n \n \n \n \n
\n
\n\n\n
\n
{{ 'Therapeutic_area' | translate }}:
\n
\n \n {{ therapeuticArea.name }}\n , \n \n \n \n \n
\n
\n\n
\n\n
\n
{{ 'Description' | translate }}
\n \n
\n
\n
{{ 'Uniqueness' | translate }}
\n \n \n
\n
\n
{{ 'Unmet_medical_need' | translate }}
\n \n \n
\n
\n
{{ 'Market_size' | translate }}
\n \n \n
\n
\n
{{ 'Current_and_future_competition' | translate }}
\n \n \n
\n
\n
\n
\n
\n","import { AfterViewInit, Component, Input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Conf } from '../../../_conf';\nimport { IProjectCaseView, ProjectsProvider, } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { Utils } from '../../../_common/providers/utils';\nimport { ItemListDialogComponent } from '../../../_common/components/item-list-dialog/item-list-dialog';\n\n@Component({\n selector: 'projects-view-project-case',\n providers: [],\n styleUrls: ['./view-project-case.scss'],\n templateUrl: './view-project-case.html'\n})\nexport class ProjectsViewProjectCaseComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly P_MAX_LENGTH: number = 255;\n public readonly MAX_ITEMS_TO_DISPLAY: number = 1;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n public showMore: boolean = false;\n @Input() public projectCase: IProjectCaseView;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _dialoger: MatDialog,\n private _utils: Utils,\n private _storage: ModelsStorage,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onMoreProjectTypesClicked(): void {\n this._dialoger.open(ItemListDialogComponent, {\n data: {\n title: this._translater.instant('Type_of_project'),\n items: this._utils.getKeyValues(this.projectCase.projectTypes, 'name')\n }\n });\n }\n\n public onMoreTherapeuticAreasClicked(): void {\n this._dialoger.open(ItemListDialogComponent, {\n data: {\n title: this._translater.instant('Therapeutic_area'),\n items: this._utils.getKeyValues(this.projectCase.therapeuticArea, 'name')\n }\n });\n }\n}\n","\n \n \n
\n
\n \n \n \n
\n
\n
\n
\n
{{ project.name }}
\n
\n \n
\n \n
\n
\n \n
\n {{ 'Last_modified' | translate }}: {{ project.updateDate | dateClosest }}\n
\n
\n
\n \n
\n {{ 'Academic_link' | translate }}:\n
\n
\n {{ academicInstitution1 }}\n \n , \n \n {{ academicInstitution2 }}\n
\n
\n \n
\n
{{ 'Intellectual_prorerty' | translate }}:
\n
\n {{ 'TTO_agreement_accepted' | translate }}\n {{ 'License_from_academic_institution' | translate }}\n
\n
\n
\n
{{ 'Contact_at_TTO' | translate }}:
\n
{{ project.TTOContact }}
\n
\n
\n\n
\n {{ (project.isCompanyIncorporated ? 'Inscorporated_since' : 'Targeted_year_of_incorporation') | translate }}\n :\n
\n
{{ project.incorporationYear }}
\n
\n
\n
{{ 'Project_trade_type' | translate }}:
\n {{ (project.projectTradeTypeId === 1 ? 'Public_company' : 'Private_company') | translate}}
\n
\n \n
\n
{{ 'Pipeline' | translate }}
\n \n \n
\n
\n
{{ 'Documents' | translate }}
\n \n \n
\n \n\n
\n \n \n \n \n
\n\n \n
\n
\n \n \n
\n \n
\n \n
{{ 'Currently_raising_funds' | translate }}
\n
\n
{{ fundingRound }}
\n
\n  {{ (project.raisingFundsAmount / 100) | currency:'CHF ' : 'symbol' : '1.0-0' }}
\n
\n
\n {{ 'Date_of_closing_round' | translate }}: \n {{ project.dateOfClosingRound | dateClosest:'FjY' }}\n
\n
\n {{ 'Lead_investor_identified' | translate }}\n
\n
\n \n
{{ 'Currently_not_raising_funds' | translate }}
\n \n
{{ 'Upcoming_funding_round' | translate }}:
\n
\n {{ upcomingFundingItems.join(', ') }}\n
\n
\n
\n
\n \n \n \n \n {{ 'Seeking_partnership__alt' | translate }}\n \n \n {{ isOpen0 ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\n \n \n

{{ project.partnershipTerms }}

\n
\n
\n \n \n \n \n {{ 'Seeking_outlicense' | translate }}\n \n \n {{ isOpen1 ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\n \n \n

{{ project.licensingOffer }}

\n
\n
\n
\n
\n
{{ 'Main_contact' | translate }}
\n
\n {{ project?.contactFirstName }} {{ project?.contactLastName }}\n
\n
{{ project.contactAddress }}
\n
\n
\n \n \n \n
\n
\n \n
\n
\n
{{ 'Team' | translate }}
\n
    \n
  • {{ member.firstName + ' ' + member.lastName }}\n
    {{ member.teamFunction }}
  • \n
\n
\n
\n
{{ 'Advisory_board_alt1' | translate }}
\n
    \n
  • {{ member.firstName + ' ' + member.lastName }}
  • \n
\n
\n
\n
{{ 'Board_of_directors' | translate }}
\n
    \n
  • {{ member.firstName + ' ' + member.lastName }}
  • \n
\n
\n
\n
\n \n
\n
\n
\n
{{ 'Prizes' | translate }}
\n
    \n
  • {{ prize.name }}
  • \n
\n
\n
\n
{{ 'Past_and_current_funding' | translate }}
\n
    \n
  • {{ funding.source }} ({{ (funding.amount / 100) | currency:'CHF ' : 'symbol' : '1.0-0' }}\n )
  • \n
\n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { CurrencyPipe } from '@angular/common';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { MenuItem } from '../../../_common/components/side-menu/side-menu';\nimport { FilesFilesComponent } from '../../../files/components/files/files';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { IProjectCaseView, ProjectsProvider } from '../../providers/projects-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { ApiBaseService } from '../../../_common/providers/api-base-service';\nimport {\n AcademicInstitution,\n DevelopmentPhase,\n File,\n FundingRound,\n InvestorProfile,\n MetricsRecord,\n PatentState,\n Project,\n ProjectCase,\n ProjectCase_ProjectType,\n ProjectCase_TherapeuticArea,\n ProjectFavorite,\n ProjectMembership,\n ProjectPastFunding,\n ProjectPrize,\n ProjectTeamMember,\n ProjectType,\n TeamMemberType,\n TherapeuticArea,\n User_AcademicInstitution\n} from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-project-page',\n providers: [],\n styleUrls: ['./project.scss'],\n templateUrl: './project.html'\n})\nexport class ProjectsProjectPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly FILES_EDITION_LEVEL: number = FilesFilesComponent.EDITION_LEVEL_NONE;\n public readonly INSTUTION_ID_NONE: number = AcademicInstitution.ID_NONE;\n public readonly P_MAX_LENGTH: number = 220;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = true;\n public isFavoriteLoading: boolean = false;\n public is404: boolean = false;\n public rights: ProjectRights = new ProjectRights(this._utils);\n\n public backMenu: MenuItem = null;\n public backUrl: string = null;\n public backTitle: string = this._translater.instant('Back');\n\n public investorProfile: InvestorProfile = null;\n public project: Project = new Project();\n public projectTypes: ProjectType[] = [];\n public projectCaseProjectType: any[] = null;\n public projectCaseTherapeuticArea: any[] = null;\n public therapeuticAreas: TherapeuticArea[] = [];\n public logo: any = null;\n public illustration: any = null;\n public isFavorite: boolean = false;\n public developmentPhase: DevelopmentPhase[] = [];\n public patentState: PatentState[] = [];\n public academicInstitution1Title: string = null;\n public academicInstitution1: string = null;\n public academicInstitution2: string = null;\n public fundingRound: string = null;\n public teamPicture: any = null;\n public teamMembers: ProjectTeamMember[] = [];\n public boardMembers: ProjectTeamMember[] = [];\n public directorsMembers: ProjectTeamMember[] = [];\n public files: File[] = [];\n public prizes: ProjectPrize[] = [];\n public pastFundings: ProjectPastFunding[] = [];\n public projectCase: ProjectCase[] = [];\n public projectCaseView: IProjectCaseView[] = [];\n public upcomingFundingItems: string[] = [];\n\n public allPatentStates: PatentState[] = [];\n\n @ViewChild('illustrationInput', {static: false}) public illustrationInput;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n public projectsProvider: ProjectsProvider,\n private _title: Title,\n private _router: Router,\n private _dialoger: MatDialog,\n private _utils: Utils,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _currencyPipe: CurrencyPipe,\n private _api: ApiBaseService,\n private _filesProvider: FilesProvider,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._route.params.subscribe((params: any) => {\n this.loadProject(parseInt(params.projectId))\n .then(() => {\n this.loadData()\n .then(() => {\n this._title.setTitle(this.project.name + ' | ' + this.conf.platformName);\n this.isLoading = false;\n if (this.currentUser.user.isInvestor) {\n this.projectsProvider.addProjectMetrics(this.project.id, MetricsRecord.TAG_PROJECT_SEEN)\n .catch((error: any) => this.onError(error));\n }\n })\n .catch((error: any) => this.onError(error));\n })\n .catch((error: any) => this.onError(error));\n });\n this._route.queryParams.subscribe((params: any) => {\n if (params.backUrl) {\n this.backUrl = params.backUrl;\n if (params.backTitle) {\n this.backTitle = params.backTitle;\n this.backMenu = {\n icon: 'arrow_back',\n title: this.backTitle,\n url: this.backUrl\n };\n }\n }\n });\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onFavoriteClicked(): void {\n this.isFavoriteLoading = true;\n this.projectsProvider.toggleProjectFavorite(this.project)\n .then((isFavorite: boolean) => {\n this.isFavorite = isFavorite;\n this.isFavoriteLoading = false;\n })\n .catch((error: any) => this.onError(error));\n }\n\n public onEditClicked(): void {\n this._router.navigate(['academic-ventures', this.project.id, 'edit'], {\n queryParams: {\n backUrl: this._router.url\n }\n });\n }\n\n public onListUsersClicked(): void {\n this._router.navigate(['academic-ventures', this.project.id, 'memberships'], {\n queryParams: {\n backUrl: this._router.url\n }\n });\n }\n\n public onContactMailClicked(): void {\n window.location.href = 'mailto:' + this.project.contactEmail;\n }\n\n public onContactPhoneClicked(): void {\n window.location.href = 'tel:' + this.project.contactPhone;\n }\n\n public onContactWebsiteClicked(): void {\n let url: string = this.project.contactWebsite;\n if (!this.project.contactWebsite.startsWith('http')) {\n url = 'http://' + url;\n }\n\n // on fait tout ce micmac pour ajouter un www automatiquement devant l'url au cas où\n // le type l'a oublié et que le webserver qui host le site n'a pas fait de redirection...\n // TODO ca marche pas ce micmac à cause des CORS...\n /*\n this._api.call('options', url)\n .then(() => window.open(url, '_blank'))\n .catch((error: any) => {\n if (url.startsWith('http://')) {\n url = 'http://www.' + url.substr(7);\n }\n else if (url.startsWith('https://')) {\n url = 'https://www.' + url.substr(8);\n }\n\n window.open(url, '_blank');\n });\n */\n window.open(url, '_blank');\n }\n\n public onEditIllustrationClicked(): void {\n this.illustrationInput.nativeElement.click();\n }\n\n public onFileSelectionChange(event): void {\n const files: FileList = event.target.files;\n if (files.length) {\n this.isLoading = true;\n this.selectFile(files[0])\n .then(() => {\n this.isLoading = false;\n this._toaster.open(this._translater.instant('Illustration_saved'), '', {duration: 5000});\n this.updateIllustration();\n })\n .catch((error: any) => this.onError(error));\n }\n }\n\n public shouldDisplayProjectCase(singleProjectCase: IProjectCaseView) {\n return (singleProjectCase.projectCase.title !== '' && singleProjectCase.projectCase.title !== null) &&\n singleProjectCase.projectCase.developmentPhaseId !== null &&\n (singleProjectCase.projectCase.description !== '' && singleProjectCase.projectCase.description !== null) &&\n singleProjectCase.projectCase.patentStateId !== null &&\n singleProjectCase.projectTypes.length > 0 &&\n singleProjectCase.therapeuticArea.length > 0;\n }\n\n public displayDateOfClosing() {\n const dateToday = new Date();\n dateToday.setHours(0, 0, 0, 0);\n return new Date(this.project.dateOfClosingRound) >= dateToday;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadProject(projectId: number): Promise {\n return new Promise((resolve, reject) => {\n\n Promise.all([\n this._storage.select(Project).where('id').equals(projectId).get(1),\n this._storage.select(ProjectCase).where('projectId').equals(projectId).get()\n ])\n .then((data: any[]) => {\n if (!data[0]) {\n reject({status: 404});\n return;\n }\n\n this.project = data[0].clone(); // TODO si on clone pas, il y a un scénario quelque part que j'ai pas réussi à identifier qui fait altère le model en DB et je pige pas bien pourquoi ... à creuser\n this.projectCase = data[1];\n\n resolve();\n })\n .catch((error: any) => reject(error));\n\n });\n }\n\n private prepareProjectCase(): IProjectCaseView[] {\n this.projectCase.forEach((singleProjectCase) => {\n\n const projectCaseProjectTypes: number[] = this.projectCaseProjectType[singleProjectCase.id] ? this._utils.getKeyValues(this.projectCaseProjectType[singleProjectCase.id], 'projectTypeId') : [];\n const projectCaseTherapeuticArea: number[] = this.projectCaseTherapeuticArea[singleProjectCase.id] ? this._utils.getKeyValues(this.projectCaseTherapeuticArea[singleProjectCase.id], 'therapeuticAreaId') : [];\n\n const projectCaseView: IProjectCaseView = {\n projectCaseId: singleProjectCase.id,\n projectCase: singleProjectCase,\n developmentPhase: this.developmentPhase.find((item) => item.id === singleProjectCase.developmentPhaseId),\n patentState: this.patentState.find((item) => item.id === singleProjectCase.patentStateId),\n projectTypes: projectCaseProjectTypes.length > 0 ? this.projectTypes.filter((item) => projectCaseProjectTypes.indexOf(item.id) > -1) : [],\n therapeuticArea: projectCaseTherapeuticArea.length > 0 ? this.therapeuticAreas.filter((item) => projectCaseTherapeuticArea.indexOf(item.id) > -1) : []\n };\n\n this.projectCaseView.push(projectCaseView);\n });\n return [];\n }\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n /* 0 */ this._storage.select(InvestorProfile).where('userId').equals(this.currentUser.user.id).get(1),\n /* 1 */ this._storage.select(ProjectCase_ProjectType).where('projectCaseId').in(this._utils.getKeyValues(this.projectCase, 'id')).get(),\n /* 2 */ this._storage.select(ProjectCase_TherapeuticArea).where('projectCaseId').in(this._utils.getKeyValues(this.projectCase, 'id')).get(),\n /* 3 */ this._storage.select(ProjectFavorite)\n .where('userId').equals(this.currentUser.user.id)\n .and('projectId').equals(this.project.id)\n .get(1),\n /* 4 */ this._storage.select(DevelopmentPhase).where('id').in(this._utils.getKeyValues(this.projectCase, 'developmentPhaseId')).get(),\n /* 5 */ this._storage.select(PatentState).where('id').in(this._utils.getKeyValues(this.projectCase, 'patentStateId')).get(),\n /* 6 */ this._storage.select(AcademicInstitution).where('id').equals(this.project.academicInstitution1Id).get(1),\n /* 7 */ this._storage.select(AcademicInstitution).where('id').equals(this.project.academicInstitution2Id).get(1),\n /* 8 */ this._storage.select(FundingRound).where('id').equals(this.project.fundingRoundId).get(1),\n /* 9 */ this._storage.select(ProjectTeamMember)\n .where('projectId').equals(this.project.id)\n .and('teamMemberTypeId').equals(TeamMemberType.ID_MEMBER)\n .get(),\n /* 10 */ this._storage.select(ProjectTeamMember)\n .where('projectId').equals(this.project.id)\n .and('teamMemberTypeId').equals(TeamMemberType.ID_ADVISORY_BOARD)\n .get(),\n /* 11 */ this._storage.select(File).where('fileGroupId').equals(this.project.fileGroupId).get(),\n /* 12 */ this._storage.select(ProjectPrize).where('projectId').equals(this.project.id).get(),\n /* 13 */ this._storage.select(ProjectPastFunding).where('projectId').equals(this.project.id).get(),\n /* 14 */ this._storage.select(ProjectMembership)\n .where('userId').equals(this.currentUser.user.id)\n .and('projectId').equals(this.project.id)\n .get(1),\n /* 15 */ this._storage.select(TherapeuticArea).get(),\n /* 16 */ this._storage.select(ProjectType).get(),\n /* 17 */ this._storage.select(User_AcademicInstitution).where('userId').equals(this.currentUser.user.id).get(),\n /* 18 */ this._storage.select(ProjectTeamMember)\n .where('projectId').equals(this.project.id)\n .and('teamMemberTypeId').equals(TeamMemberType.ID_BOARD_OF_DIRECTORS)\n .get()\n ])\n .then((data: any[]) => {\n this.upcomingFundingItems = [];\n this.investorProfile = data[0];\n this.projectCaseProjectType = this._utils.groupBy(data[1], 'projectCaseId');\n this.projectCaseTherapeuticArea = this._utils.groupBy(data[2], 'projectCaseId');\n this.isFavorite = data[3] !== null;\n this.developmentPhase = data[4];\n this.patentState = data[5];\n if (this.project.academicInstitution1Id === AcademicInstitution.ID_OTHER) {\n this.academicInstitution1 = this.project.customAcademicInstitution ? this.project.customAcademicInstitution : (data[6] ? data[6].name : '');\n } else {\n this.academicInstitution1 = (data[6] ? data[6].name : '');\n }\n if (this.project.academicInstitution2Id && this.project.academicInstitution2Id !== AcademicInstitution.ID_NONE) {\n if (this.project.academicInstitution2Id === AcademicInstitution.ID_OTHER) {\n this.academicInstitution2 = this.project.customAcademicInstitution ? this.project.customAcademicInstitution : (data[7] ? data[7].name : '');\n } else {\n this.academicInstitution2 = (data[7] ? data[7].name : '');\n }\n }\n this.updateAcademicInstitution1Title();\n if (this.project.fundingRoundId) {\n this.fundingRound = this.project.fundingRoundId === FundingRound.ID_OTHER ? this.project.customFundingRound : data[8].name;\n if (this.fundingRound && this.fundingRound.length) {\n this.upcomingFundingItems.push(this.fundingRound);\n }\n }\n this.teamMembers = data[9];\n this.boardMembers = data[10];\n this.files = data[11];\n this.prizes = data[12];\n this.pastFundings = data[13];\n\n this.therapeuticAreas = data[15];\n this.projectTypes = data[16];\n this.directorsMembers = data[18];\n\n // prepare projectCases for display\n this.prepareProjectCase();\n\n if (this.project.logo) {\n this._filesProvider.downloadFile('projects/' + this.project.id + '/download-logo', null, {noCache: true})\n .then((fileData: any) => {\n const reader: FileReader = new FileReader();\n reader.addEventListener('load', () => this.logo = reader.result, false);\n reader.readAsDataURL(fileData);\n })\n .catch((error: any) => this.onError(error));\n }\n\n this.updateIllustration();\n\n if (this.project.teamPicture) {\n this._filesProvider.downloadFile('projects/' + this.project.id + '/download-team-picture', null, {noCache: true})\n .then((fileData: any) => {\n const reader: FileReader = new FileReader();\n reader.addEventListener('load', () => this.teamPicture = reader.result, false);\n reader.readAsDataURL(fileData);\n })\n .catch((error: any) => this.onError(error));\n }\n\n if (this.project.raisingFundsAmount) {\n this.upcomingFundingItems.push(this._currencyPipe.transform((this.project.raisingFundsAmount / 100), 'CHF ', 'symbol', '1.0-0'));\n }\n\n if (this.project.dateOfClosingRound) {\n this.upcomingFundingItems.push(\n this._translater.instant('opening_around')\n + ' ' +\n this._utils.formatDate(this.project.dateOfClosingRound, 'FjY')\n );\n }\n\n this.rights.evaluate({\n user: this.currentUser.user,\n project: this.project,\n membership: data[14],\n investorProfile: this.investorProfile,\n user_academicInstitutions: data[17]\n });\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private updateIllustration(): void {\n if (this.project.illustration) {\n this._filesProvider.downloadFile('projects/' + this.project.id + '/download-illustration', null, {noCache: true})\n .then((fileData: any) => {\n const reader: FileReader = new FileReader();\n reader.addEventListener('load', () => this.illustration = reader.result, false);\n reader.readAsDataURL(fileData);\n })\n .catch((error: any) => this.onError(error));\n } else {\n this.illustration = null;\n }\n }\n\n private selectFile(file: any): Promise {\n return new Promise((resolve, reject) => {\n const parts: string[] = file.name.split('.');\n if (this.projectsProvider.ILLUSTRATION_FILE_TYPES.indexOf(parts[parts.length - 1]) < 0) {\n this._toaster.open(this._translater.instant('Error_image_extension'), '', {duration: 5000});\n resolve();\n return;\n }\n\n const fileSize: number = file.size / 1048576; // converson o => Mo\n if (fileSize > this.projectsProvider.ILLUSTRATION_MAX_SIZE) {\n this._toaster.open(this._translater.instant('Error_image_size'), '', {duration: 5000});\n resolve();\n return;\n }\n\n const project: Project = this.project.clone();\n project.illustration = file;\n this.projectsProvider.saveProject(project)\n .then((updatedProject: Project) => {\n this.project = updatedProject;\n resolve();\n })\n .catch(reject);\n });\n }\n\n private updateAcademicInstitution1Title(): void {\n if (!this.project.isCompanyIncorporated) {\n this.academicInstitution1Title = 'Primary_academic_institution_related_with';\n } else {\n if (this.project.isSpinOff) {\n this.academicInstitution1Title = 'Spinoff_of';\n } else {\n this.academicInstitution1Title = 'Primary_academic_institution_related_with';\n }\n\n }\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n this.isFavoriteLoading = false;\n console.log(error);\n\n if (error.status === 404) {\n this.is404 = true;\n } else if (error.status === 429) {\n // do nothing ...\n } else {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n }\n}\n","\n \n \n
\n
\n \n
\n info_outline\n {{ 'You_can_not_access_here_yet' | translate }}
\n \n \n \n 0\"\n [investorProfile]=\"investorProfile\"\n [preserveFilters]=\"true\"\n [projectCases]=\"projectCases\">\n \n \n

{{ 'No_projects' | translate }}

\n
\n\n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { MenuItem } from '../../../_common/components/side-menu/side-menu';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { IProjectCaseSearchResultRow, ProjectsProvider } from '../../../projects/providers/projects-provider';\nimport { Alert, } from '../../../_common/providers/models';\nimport { ListBaseComponent } from '../../../_common/components/list-base/list-base';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'alerts-alert-page',\n providers: [],\n styleUrls: ['./alert.scss'],\n templateUrl: './alert.html'\n})\nexport class AlertsAlertPageComponent extends ListBaseComponent implements AfterViewInit {\n\n public backMenu: MenuItem = null;\n public alert: Alert = null;\n\n constructor(\n conf: Conf,\n currentUser: CurrentUser,\n navigation: AcventuresNavigationProvider,\n _title: Title,\n _router: Router,\n _dialoger: MatDialog,\n _utils: Utils,\n _toaster: MatSnackBar,\n _route: ActivatedRoute,\n _changeDetector: ChangeDetectorRef,\n _projectsProvider: ProjectsProvider,\n _translater: TranslateService,\n _storage: ModelsStorage\n ) {\n super(conf, currentUser, navigation, _title, _router, _dialoger, _utils,\n _toaster, _route, _changeDetector, _projectsProvider, _translater, _storage);\n }\n\n public ngAfterViewInit() {\n this._route.params.subscribe((params: any) => {\n Promise.all([\n super.loadData(),\n this.loadAlertData(parseInt(params.alertId))\n ])\n .then(() => {\n this._title.setTitle(this.alert.name + ' | ' + this.conf.platformName);\n this.backMenu = {\n icon: 'arrow_back',\n title: this._translater.instant('Alerts'),\n url: '/alerts'\n };\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n });\n super.ngAfterViewInit();\n }\n\n public onRowClicked(row: IProjectCaseSearchResultRow): void {\n this._router.navigate(['academic-ventures', row.project.id], {\n queryParams: {backUrl: this._router.url, backTitle: this.alert.name}\n });\n }\n\n private loadAlertData(alertId: number): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(Alert).where('id').equals(alertId).get(1)\n .then((data: Alert) => {\n this.alert = data;\n if (!this.alert) {\n reject({status: 404});\n return;\n }\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n}\n","\n \n \n
\n
\n \n \n \n

{{ 'You_can_admin_following_insitutions' | translate }}:

\n
    \n
  • {{ institution.name }}
  • \n
\n
\n \n

{{ 'No_projects_pending_validation' | translate }}

\n
\n \n \n
\n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { ProjectSearchResultRow, ProjectsProvider } from '../../providers/projects-provider';\nimport {\n AcademicInstitution,\n Project,\n ProjectValidationState,\n User_AcademicInstitution\n} from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-pending-validation-page',\n providers: [],\n styleUrls: ['./pending-validation.scss'],\n templateUrl: './pending-validation.html'\n})\nexport class ProjectsPendingValidationPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public projects: Project[] = [];\n public institutions: AcademicInstitution[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _dialoger: MatDialog,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this.loadData()\n .then(() => {\n this._title.setTitle(this._translater.instant('Projects_pending_validation') + ' | ' + this.conf.platformName);\n })\n .catch((error: any) => this.onError(error));\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onRowClicked(row: ProjectSearchResultRow): void {\n // this._router.navigate(['academic-ventures', row.project.id]);\n this._router.navigate(['academic-ventures', row.project.id, 'edit'], {\n queryParams: {\n 'backUrl': this._router.url,\n 'backTitle': this._translater.instant('Projects_pending_validation')\n }\n });\n }\n\n public onDeleteClicked(row: ProjectSearchResultRow): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_project'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n row.isLoading = true;\n this.deleteProject(row.project)\n .then(() => {\n this.projects = this.projects.slice();\n this._toaster.open(this._translater.instant('Project_deleted'), '', {duration: 5000});\n })\n .catch((error: any) => {\n row.isLoading = false;\n this.onError(error);\n });\n }\n });\n }\n\n public onEditRowClicked(row: ProjectSearchResultRow): void {\n this.onRowClicked(row);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(Project)\n .where('projectValidationStateId').equals(ProjectValidationState.ID_PENDING_VALIDATION)\n .orderBy('name')\n .get(),\n this._storage.select(AcademicInstitution)\n .where('id').equals(User_AcademicInstitution, 'academicInstitutionId')\n .and('userId', User_AcademicInstitution).equals(this.currentUser.user.id)\n .get()\n ])\n .then((data: any[]) => {\n this.projects = data[0];\n this.institutions = data[1];\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private deleteProject(project: Project): Promise {\n return new Promise((resolve, reject) => {\n this._projectsProvider.deleteProject(project)\n .then(() => {\n for (let i = 0; i < this.projects.length; i++) {\n if (this.projects[i].id === project.id) {\n this.projects.splice(i, 1);\n i = this.projects.length;\n }\n }\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","\n\n
\n
\n 0 ? (filteredCompanyCategories.length === 1 ? filteredCompanyCategories[0].name : 'n_categories_of_company' | translate:{count: filteredCompanyCategories.length}) : null\">\n
\n \n
{{ category.name }}
\n
\n
\n
\n \n \n
\n
\n 0 ? (filteredTherapeuticAreas.length === 1 ? filteredTherapeuticAreas[0].name : 'n_therapeutic_areas' | translate:{count: filteredTherapeuticAreas.length}) : null\">\n
\n \n
{{ area.name }}
\n
\n
\n
\n \n \n
\n
\n 0 ? (filteredDevelopmentPhases.length === 1 ? filteredDevelopmentPhases[0].name : 'n_therapeutic_areas' | translate:{count: filteredDevelopmentPhases.length}) : null\">\n
\n \n
{{ phase.name }}
\n
\n
\n
\n \n \n
\n
\n \n
\n
\n
{{ 'Investment_range' | translate }}
\n
\n \n \n CHF \n {{ 'Invalid_value' | translate }}\n \n \n \n CHF \n {{ 'Invalid_value' | translate }}\n \n
\n
\n
\n
{{ 'Seeking_partnerships' | translate }}
\n \n
{{ 'Yes' | translate }}
\n
\n \n
{{ 'No' | translate }}
\n
\n
\n
\n
{{ 'Out_licensing_opportunities' | translate }}
\n \n
{{ 'Yes' | translate }}
\n
\n \n
{{ 'No' | translate }}
\n
\n
\n
\n
{{ 'Not_for_profit_ventures' | translate }}
\n \n
{{ 'Yes' | translate }}
\n
\n \n
{{ 'No' | translate }}
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n 1\">\n {{ 'Investor_search_results' | translate:{count: dataSource.filteredData.length} }}\n \n \n {{ 'Investor_search_result' | translate }}\n \n \n {{ 'Investor_search_no_results' | translate }}\n \n \n
\n \n \n search\n \n
\n
\n 0) || !isReady\"\n [title]=\"title\">\n
\n

{{ noDataMessage | translate }}

\n
\n 0\"\n [dataSource]=\"dataSource\"\n matSort>\n \n \n \n {{ 'State' | translate }}\n \n \n \n \n \n \n {{ 'Name' | translate }}\n \n \n \n \n \n {{ 'Company' | translate }}\n \n \n \n \n \n {{ 'Registration_date' | translate }}\n \n {{ row.profile.createDate | dateClosest:'FjY' }}\n \n \n \n \n contact_mail\n \n \n check\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { FormControl } from '@angular/forms';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { SimpleMatDataSource } from '../../../_common/providers/simple-mat-data-source';\nimport { Utils } from '../../../_common/providers/utils';\nimport { InvestorDataRow, InvestorFiltersState, InvestorsProvider } from '../../providers/investors-provider';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { InvestorRights } from '../../providers/investor-rights';\nimport {\n Alert,\n Company,\n CompanyCategory,\n CompanyCompanyCategory,\n DevelopmentPhase,\n DevelopmentPhaseOfInterest,\n InvestorProfile,\n InvestorValidationState,\n TherapeuticArea,\n TherapeuticAreaOfInterest,\n User\n} from '../../../_common/providers/models';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'investors-list',\n providers: [],\n styleUrls: ['./list.scss'],\n templateUrl: './list.html'\n})\nexport class InvestorsListComponent implements AfterViewInit, OnDestroy {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly AMOUNT_RAISED_MIN: number = 0;\n public readonly AMOUNT_RAISED_MAX: number = 99999999999; // 100 mia\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isReady: boolean = false;\n public dataSource: SimpleMatDataSource = new SimpleMatDataSource([]);\n public columns: string[] = [];\n\n public searchInput: FormControl = new FormControl('');\n public therapeuticAreas: TherapeuticArea[] = [];\n public developmentPhases: DevelopmentPhase[] = [];\n public companyCategories: CompanyCompanyCategory[] = [];\n\n public companyCategoriesCheckboxes: boolean[] = [];\n public filteredCompanyCategories: CompanyCompanyCategory[] = [];\n public therapeuticAreasCheckboxes: boolean[] = [];\n public filteredTherapeuticAreas: TherapeuticArea[] = [];\n public developmentPhasesCheckboxes: boolean[] = [];\n public filteredDevelopmentPhases: DevelopmentPhase[] = [];\n public investmentRangeToFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.investmentRangeToFormControl, this.investmentRangeFromFormControl, null, this.AMOUNT_RAISED_MIN, this.AMOUNT_RAISED_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public investmentRangeFromFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.investmentRangeFromFormControl, null, this.investmentRangeToFormControl, this.AMOUNT_RAISED_MIN, this.AMOUNT_RAISED_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public filteredOthers: Alert = new Alert(); // mini hack, on utilise directement cette structure pour binder les oui/non - c'est plus simple\n public moreFiltersSelectionLabel: string = null;\n\n @Input() public title: string = null;\n @Input() public noDataMessage: string = 'There_are_no_investors_to_display';\n @Input() public hideNameColumn: boolean = false;\n @Input() public hideValidationStateColumn: boolean = false;\n @Input() public hideCompanyColumn: boolean = false;\n @Input() public hideCreateDateColumn: boolean = false;\n @Input() public hideContactableColumn: boolean = false;\n @Input() public hideActionsColumn: boolean = false;\n @Input() public disableSearchEngine: boolean = false;\n @Input() public preserveFilters: boolean = false;\n @Output() public onRowClicked: EventEmitter = new EventEmitter();\n @Output() public onCompanyClicked: EventEmitter = new EventEmitter();\n @Output() public onDeleteRowClicked: EventEmitter = new EventEmitter();\n @ViewChild(MatPaginator, {static: false}) public paginator: MatPaginator;\n @ViewChild(MatSort, {static: false}) public sorter: MatSort;\n private _allRows: InvestorDataRow[] = [];\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public currentUser: CurrentUser,\n private _dialoger: MatDialog,\n private _translater: TranslateService,\n private _route: ActivatedRoute,\n private _toaster: MatSnackBar,\n private _router: Router,\n private _storage: ModelsStorage,\n private _investorsProvider: InvestorsProvider,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n private _investorProfiles: InvestorProfile[] = [];\n\n public get investorProfiles() {\n return this._investorProfiles;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set investorProfiles(investorProfiles: InvestorProfile[]) {\n this._investorProfiles = investorProfiles;\n if (this._investorProfiles && this._investorProfiles.length) {\n this.loadData(investorProfiles)\n .then((data: InvestorDataRow[]) => {\n this._allRows = data;\n this.applyFilters();\n })\n .catch((error: any) => this.onError(error));\n } else {\n this._allRows = [];\n this.applyFilters();\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.initColumns();\n this.initDataSource();\n this.loadStaticData()\n .then(() => {\n this._route.params.subscribe((params: any) => {\n this.initFilters(this.preserveFilters ? this._investorsProvider.investorFiltersState : null)\n .then(() => this.isReady = true)\n .catch((error: any) => this.onError(error));\n });\n })\n .catch((error: any) => this.onError(error));\n }\n\n public ngOnDestroy() {\n if (this.preserveFilters) {\n this.saveFiltersState();\n }\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onDataSortChange(event: any): void {\n this.dataSource.sortBy(event.active, event.direction);\n }\n\n public hasFilters(): boolean {\n return this.filteredCompanyCategories.length > 0\n || this.filteredDevelopmentPhases.length > 0\n || this.filteredTherapeuticAreas.length > 0\n || this.moreFiltersSelectionLabel != null;\n }\n\n public isMoreFiltersValid(): boolean {\n return !this.investmentRangeFromFormControl.invalid\n && !this.investmentRangeToFormControl.invalid;\n }\n\n public searchInputChanged(filter: string): void {\n this.dataSource.filter = this.utils.normalizeString(filter);\n }\n\n public onAllCompanyCategoriesClicked(event: any): void {\n event.stopPropagation();\n this.filteredCompanyCategories = this.companyCategories.slice();\n this.switchAllCheckboxes(this.companyCategoriesCheckboxes, this.companyCategories, true);\n this.applyFilters();\n }\n\n public onNoCompanyCategoriesClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredCompanyCategories = [];\n this.switchAllCheckboxes(this.companyCategoriesCheckboxes, this.companyCategories, false);\n this.applyFilters();\n }\n\n public onCompanyCategoryClicked(event: any, category: CompanyCompanyCategory): void {\n setTimeout(() => {\n this.toggleFilterSelection(category, this.filteredCompanyCategories);\n this.applyFilters();\n }, 1);\n }\n\n public onAllDevelopmentPhasesClicked(event: any): void {\n event.stopPropagation();\n this.filteredDevelopmentPhases = this.developmentPhases.slice();\n this.switchAllCheckboxes(this.developmentPhasesCheckboxes, this.developmentPhases, true);\n this.applyFilters();\n }\n\n public onNoDevelopmentPhasesClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredDevelopmentPhases = [];\n this.switchAllCheckboxes(this.developmentPhasesCheckboxes, this.developmentPhases, false);\n this.applyFilters();\n }\n\n public onDevelopmentPhaseClicked(event: any, phase: DevelopmentPhase): void {\n setTimeout(() => {\n this.toggleFilterSelection(phase, this.filteredDevelopmentPhases);\n this.applyFilters();\n }, 1);\n }\n\n public onAllTherapeuticAreasClicked(event: any): void {\n event.stopPropagation();\n this.filteredTherapeuticAreas = this.therapeuticAreas.slice();\n this.switchAllCheckboxes(this.therapeuticAreasCheckboxes, this.therapeuticAreas, true);\n this.applyFilters();\n }\n\n public onNoTherapeuticAreasClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredTherapeuticAreas = [];\n this.switchAllCheckboxes(this.therapeuticAreasCheckboxes, this.therapeuticAreas, false);\n this.applyFilters();\n }\n\n public onTherapeuticAreaClicked(event: any, area: TherapeuticArea): void {\n setTimeout(() => {\n this.toggleFilterSelection(area, this.filteredTherapeuticAreas);\n this.applyFilters();\n }, 1);\n }\n\n public stopPropagation(event): void {\n event.stopPropagation();\n }\n\n public onResetFiltersClicked(): void {\n this.filteredCompanyCategories = [];\n this.switchAllCheckboxes(this.companyCategoriesCheckboxes, this.companyCategories, false);\n this.filteredTherapeuticAreas = [];\n this.switchAllCheckboxes(this.therapeuticAreasCheckboxes, this.therapeuticAreas, false);\n this.filteredDevelopmentPhases = [];\n this.switchAllCheckboxes(this.developmentPhasesCheckboxes, this.developmentPhases, false);\n this.filteredOthers.isSeekingPartnerhips = null;\n this.filteredOthers.isNotSeekingPartnerhips = null;\n this.filteredOthers.isOutlicensing = null;\n this.filteredOthers.isNotOutlicensing = null;\n this.filteredOthers.isNotForProfit = null;\n this.filteredOthers.isNotNotForProfit = null;\n this.investmentRangeFromFormControl.setValue(null);\n this.investmentRangeToFormControl.setValue(null);\n this.moreFiltersSelectionLabel = null;\n\n this.applyFilters();\n }\n\n public onMoreFiltersItemClicked(event: any): void {\n setTimeout(() => {\n const selectionLabels: string[] = [];\n\n this.investmentRangeFromFormControl.updateValueAndValidity();\n this.investmentRangeToFormControl.updateValueAndValidity();\n if (this.investmentRangeFromFormControl.value || this.investmentRangeToFormControl.value) {\n selectionLabels.push('Investment_range');\n }\n\n if (this.filteredOthers.isSeekingPartnerhips || this.filteredOthers.isNotSeekingPartnerhips) {\n selectionLabels.push('Intersted_in_partnerships');\n }\n if (this.filteredOthers.isOutlicensing || this.filteredOthers.isNotOutlicensing) {\n selectionLabels.push('Intersted_to_in_licence_a_technology_of_product');\n }\n if (this.filteredOthers.isNotForProfit || this.filteredOthers.isNotNotForProfit) {\n selectionLabels.push('Intersted_in_non_profit_ventures');\n }\n\n if (selectionLabels.length === 0) {\n this.moreFiltersSelectionLabel = null;\n } else if (selectionLabels.length === 1) {\n this.moreFiltersSelectionLabel = this._translater.instant(selectionLabels[0]);\n } else {\n this.moreFiltersSelectionLabel = this._translater.instant('n_filters', {count: selectionLabels.length});\n }\n\n this.applyFilters();\n }, 1);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private initColumns(): void {\n const columns: string[] = [];\n if (!this.hideValidationStateColumn) {\n columns.push('validationState');\n }\n if (!this.hideNameColumn) {\n columns.push('name');\n }\n if (!this.hideCompanyColumn) {\n columns.push('company');\n }\n if (!this.hideCreateDateColumn) {\n columns.push('createDate');\n }\n if (!this.hideContactableColumn) {\n columns.push('contactable');\n }\n if (!this.hideActionsColumn) {\n columns.push('actions');\n }\n\n this.columns = columns;\n }\n\n private initDataSource(): void {\n this.dataSource.sort = this.sorter;\n this.dataSource.paginator = this.paginator;\n this.dataSource.filterPredicate = (row: InvestorDataRow, filter: string) => {\n return this.utils.normalizeString(\n row.user.firstName +\n row.user.lastName +\n (row.profile.companyId || '') +\n (row.company && row.company.name || '') +\n (row.companyCategory || '')\n ).includes(filter);\n };\n this.searchInput.valueChanges.subscribe((value: string) => this.searchInputChanged(value)); // on utilise pas un bête keyup parce que si on sélectionne le texte et qu'on le coupe par exemple, on catch pas l'event ...\n\n this.dataSource.addSortDefinition(\n 'validationState',\n (a: InvestorDataRow, b: InvestorDataRow) => this.utils.sortRow(a.profile.investorValidationStateId, b.profile.investorValidationStateId),\n (a: InvestorDataRow, b: InvestorDataRow) => this.utils.sortRow(b.profile.investorValidationStateId, a.profile.investorValidationStateId)\n );\n\n this.dataSource.addSortDefinition(\n 'name',\n (a: InvestorDataRow, b: InvestorDataRow) => this.utils.sortRow(a.user.firstName.toLowerCase() + a.user.lastName.toLowerCase(), b.user.firstName.toLowerCase() + b.user.lastName.toLowerCase()),\n (a: InvestorDataRow, b: InvestorDataRow) => this.utils.sortRow(b.user.firstName.toLowerCase() + b.user.lastName.toLowerCase(), a.user.firstName.toLowerCase() + a.user.lastName.toLowerCase())\n );\n\n this.dataSource.addSortDefinition(\n 'company',\n (a: InvestorDataRow, b: InvestorDataRow) => this.utils.sortRow(a.company.name.toLowerCase(), b.company.name.toLowerCase()),\n (a: InvestorDataRow, b: InvestorDataRow) => this.utils.sortRow(b.company.name.toLowerCase(), a.company.name.toLowerCase())\n );\n\n this.dataSource.addSortDefinition(\n 'createDate',\n (a: InvestorDataRow, b: InvestorDataRow) => this.utils.sortRow(a.profile.createDate, b.profile.createDate),\n (a: InvestorDataRow, b: InvestorDataRow) => this.utils.sortRow(b.profile.createDate, a.profile.createDate)\n );\n\n this.dataSource.addSortDefinition(\n 'contactable',\n (a: InvestorDataRow, b: InvestorDataRow) => this.utils.sortRow(a.profile.acceptToBeContacted, b.profile.acceptToBeContacted),\n (a: InvestorDataRow, b: InvestorDataRow) => this.utils.sortRow(b.profile.acceptToBeContacted, a.profile.acceptToBeContacted)\n );\n }\n\n private loadStaticData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(DevelopmentPhase).orderBy('ordinal').get(),\n this._storage.select(TherapeuticArea).get(),\n this._storage.select(CompanyCompanyCategory).orderBy('ordinal').get()\n ])\n .then((data: any[]) => {\n this.developmentPhases = data[0];\n this.therapeuticAreas = data[1];\n this.companyCategories = data[2];\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private loadData(investorProfiles: InvestorProfile[]): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(User).where('id').in(this.utils.getKeyValues(investorProfiles, 'userId')).get(),\n this._storage.select(CompanyCompanyCategory).get(),\n this._storage.select(InvestorValidationState).get(),\n this._storage.select(TherapeuticAreaOfInterest).get(),\n this._storage.select(DevelopmentPhaseOfInterest).get(),\n this._storage.select(Company).where('id').in(this.utils.getKeyValues(investorProfiles, 'companyId')).get()\n ])\n .then((data: any[]) => {\n const rows: InvestorDataRow[] = [];\n investorProfiles.forEach((profile: InvestorProfile, i: number) => {\n const company: Company = profile.companyId ? this.utils.findIn(profile.companyId, data[5]) : null;\n const companyCategory: CompanyCompanyCategory = company ? this.utils.findIn(company.companyCompanyCategoryId, data[1]) : null;\n const rights: InvestorRights = new InvestorRights(this.utils);\n rights.evaluate({\n user: this.currentUser.user,\n investorProfile: profile\n });\n const therapeuticAreasIdsOfInterest: number[] = this.utils.getKeyValues(this.utils.findManyIn([profile.id], data[3], 'investorProfileId'), 'therapeuticAreaId');\n const developmentPhasesIdsOfInterest: number[] = this.utils.getKeyValues(this.utils.findManyIn([profile.id], data[4], 'investorProfileId'), 'developmentPhaseId');\n rows.push({\n profile,\n user: this.utils.findIn(profile.userId, data[0]),\n validationState: this.utils.findIn(profile.investorValidationStateId, data[2]),\n company,\n companyCategory,\n isLoading: false,\n rights,\n therapeuticAreasOfInterest: this.utils.findManyIn(therapeuticAreasIdsOfInterest, this.therapeuticAreas),\n developmentPhasesOfInterest: this.utils.findManyIn(developmentPhasesIdsOfInterest, this.developmentPhases),\n therapeuticAreasIdsOfInterest,\n developmentPhasesIdsOfInterest\n });\n });\n this.dataSource.replaceAllWith(rows);\n\n resolve(rows);\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private applyFilters(): void {\n const rows: InvestorDataRow[] = [];\n for (let i = 0; i < this._allRows.length; i++) {\n if (this.matchFilterSomeList([this._allRows[i].companyCategory ? this._allRows[i].companyCategory.id : null], this.filteredCompanyCategories)\n && this.matchFilterSomeList(this._allRows[i].therapeuticAreasIdsOfInterest, this.filteredTherapeuticAreas)\n && this.matchFilterSomeList(this._allRows[i].developmentPhasesIdsOfInterest, this.filteredDevelopmentPhases)\n && this.matchFilterMoreFilters(this._allRows[i])\n && this.inFilterRange(this.investmentRangeFromFormControl.value * 100, this.investmentRangeToFormControl.value * 100, this._allRows[i].profile.investmentRangeFrom, this._allRows[i].profile.investmentRangeTo)) {\n rows.push(this._allRows[i]);\n }\n }\n\n this.dataSource.replaceAllWith(rows);\n }\n\n private switchAllCheckboxesWithGroup(list: boolean[][], data: any, keyName: string, value: boolean): void {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i][keyName].length; j++) {\n list[i][j] = value;\n }\n }\n }\n\n private switchAllCheckboxes(list: boolean[], data: any, value: boolean): void {\n for (let i = 0; i < data.length; i++) {\n list[i] = value;\n }\n }\n\n private checkMinMaxFormControl(targetControl: FormControl, minControl: FormControl, maxControl: FormControl, minFallback: number, maxFallback: number): any {\n if (!targetControl || !targetControl.value) {\n return null;\n }\n\n if (minControl && minControl.value && targetControl.value < minControl.value) {\n return {consistency: {valid: false}};\n } else if (targetControl.value < minFallback) {\n return {consistency: {valid: false}};\n }\n\n if (maxControl && maxControl.value && targetControl.value > maxControl.value) {\n return {consistency: {valid: false}};\n } else if (targetControl.value > maxFallback) {\n return {consistency: {valid: false}};\n }\n\n return null;\n }\n\n private inFilterRange(filterFrom: number, filterTo: number, valueFrom: number, valueTo: number): boolean {\n if (filterFrom) {\n if (!valueFrom || filterFrom > valueTo) {\n return false;\n }\n }\n\n if (filterTo) {\n if (!valueTo || filterTo < valueTo) {\n return false;\n }\n }\n\n return true;\n }\n\n private matchFilterSomeList(keys: number[], filters: any[]): boolean {\n // s'il n'y a pas de filter, ça match ...\n if (filters.length === 0) {\n return true;\n }\n\n // on prend pas en considération les clés qui seraient null ...\n const _keys: number[] = keys.filter((val: number) => val ? true : false);\n\n return this.utils.findManyIn(_keys, filters, 'id').length > 0;\n }\n\n private matchFilterYesNo(yesValue: number, noValue: number, actualValue: number): boolean {\n // si rien n'est coché, on ignore le filtre (l'utilisateur n'a pas renseigner l'info ...)\n // si les deux sont cochés, on ignore le filtre (l'utilisateur indique explicitement qu'il veut les 2, et y a que 2 possibilités, donc ce sera forcément true)\n // si un seul des deux est cochés, on check que ca match avec le model\n if (yesValue) {\n if (!noValue) {\n if (!(actualValue == 1)) {\n return false;\n }\n }\n } else {\n if (noValue) {\n if (actualValue == 1) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n private matchFilterMoreFilters(row: InvestorDataRow): boolean {\n // *100 ; on a le montant en cents, et on l'utilisateur le saisit en dollars\n if (this.investmentRangeFromFormControl.value && (!row.profile.investmentRangeFrom || (this.investmentRangeFromFormControl.value * 100) > row.profile.investmentRangeFrom)) {\n return false;\n }\n if (this.investmentRangeToFormControl.value && (!row.profile.investmentRangeTo || (this.investmentRangeToFormControl.value * 100) < row.profile.investmentRangeTo)) {\n return false;\n }\n if (!this.matchFilterYesNo(this.filteredOthers.isSeekingPartnerhips, this.filteredOthers.isNotSeekingPartnerhips, row.profile.isInterstedInPartnerships)) {\n return false;\n }\n if (!this.matchFilterYesNo(this.filteredOthers.isOutlicensing, this.filteredOthers.isNotOutlicensing, row.profile.isInterstedInLicenses)) {\n return false;\n }\n if (!this.matchFilterYesNo(this.filteredOthers.isNotForProfit, this.filteredOthers.isNotNotForProfit, row.profile.isInterstedInNotForProfit)) {\n return false;\n }\n\n return true;\n }\n\n private toggleFilterSelection(item: any, list: any[]): boolean {\n const index: number = list.indexOf(item);\n if (index >= 0) {\n list.splice(index, 1);\n\n return false;\n }\n\n list.push(item);\n\n return true;\n }\n\n private saveFiltersState(): void {\n this._investorsProvider.investorFiltersState = {\n companyCategoryIds: this.utils.getKeyValues(this.filteredCompanyCategories),\n developmentPhaseIds: this.utils.getKeyValues(this.filteredDevelopmentPhases),\n therapeuticAreaIds: this.utils.getKeyValues(this.filteredTherapeuticAreas),\n investmentRangeFrom: this.investmentRangeFromFormControl.value,\n investmentRangeTo: this.investmentRangeToFormControl.value,\n isNotForProfit: this.filteredOthers.isNotForProfit,\n isNoNotForProfit: this.filteredOthers.isNotNotForProfit,\n isOutlicensing: this.filteredOthers.isOutlicensing,\n isNotOutlicensing: this.filteredOthers.isNotOutlicensing,\n isSeekingPartnerships: this.filteredOthers.isSeekingPartnerhips,\n isNotSeekingPartnerships: this.filteredOthers.isNotSeekingPartnerhips,\n pageIndex: this.paginator.pageIndex\n };\n }\n\n private initFilters(filtersState: InvestorFiltersState): Promise {\n return new Promise((resolve, reject) => {\n if (!filtersState) {\n filtersState = {\n companyCategoryIds: [],\n developmentPhaseIds: [],\n therapeuticAreaIds: [],\n investmentRangeFrom: null,\n investmentRangeTo: null,\n isNoNotForProfit: 0,\n isNotForProfit: 0,\n isNotOutlicensing: 0,\n isNotSeekingPartnerships: 0,\n isOutlicensing: 0,\n isSeekingPartnerships: 0,\n pageIndex: 0\n };\n }\n\n this.filteredCompanyCategories = [];\n this.companyCategoriesCheckboxes = [];\n this.filteredTherapeuticAreas = [];\n this.therapeuticAreasCheckboxes = [];\n this.filteredDevelopmentPhases = [];\n this.developmentPhasesCheckboxes = [];\n\n this.companyCategories.forEach((item: CompanyCategory, i: number) => {\n if (filtersState.companyCategoryIds.indexOf(item.id) >= 0) {\n this.companyCategoriesCheckboxes.push(true);\n this.filteredCompanyCategories.push(item);\n } else {\n this.companyCategoriesCheckboxes.push(false);\n }\n });\n\n this.therapeuticAreas.forEach((item: TherapeuticArea, i: number) => {\n if (filtersState.therapeuticAreaIds.indexOf(item.id) >= 0) {\n this.therapeuticAreasCheckboxes.push(true);\n this.filteredTherapeuticAreas.push(item);\n } else {\n this.therapeuticAreasCheckboxes.push(false);\n }\n });\n\n this.developmentPhases.forEach((item: DevelopmentPhase, i: number) => {\n if (filtersState.developmentPhaseIds.indexOf(item.id) >= 0) {\n this.developmentPhasesCheckboxes.push(true);\n this.filteredDevelopmentPhases.push(item);\n } else {\n this.developmentPhasesCheckboxes.push(false);\n }\n });\n\n this.investmentRangeFromFormControl.setValue(filtersState.investmentRangeFrom);\n this.investmentRangeToFormControl.setValue(filtersState.investmentRangeTo);\n this.filteredOthers.isNotForProfit = filtersState.isNotForProfit;\n this.filteredOthers.isNotNotForProfit = filtersState.isNoNotForProfit;\n this.filteredOthers.isOutlicensing = filtersState.isOutlicensing;\n this.filteredOthers.isNotOutlicensing = filtersState.isNotOutlicensing;\n this.filteredOthers.isSeekingPartnerhips = filtersState.isSeekingPartnerships;\n this.filteredOthers.isNotSeekingPartnerhips = filtersState.isNotSeekingPartnerships;\n this.paginator.pageIndex = filtersState.pageIndex;\n\n this.onMoreFiltersItemClicked({}); // vilain hack pour refresh le control ...\n\n this.applyFilters();\n resolve();\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n this.isReady = true;\n }\n}\n","\n \n \n
\n
\n \n \n \n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { InvestorDataRow } from '../../providers/investors-provider';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { InvestorProfile, InvestorValidationState } from '../../../_common/providers/models';\n\n@Component({\n selector: 'investors-pending-validation-page',\n providers: [],\n styleUrls: ['./pending-validation.scss'],\n templateUrl: './pending-validation.html'\n})\nexport class InvestorsPendingValidationPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public investorProfiles: InvestorProfile[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._title.setTitle(this._translater.instant('Investors_pending_validation') + ' | ' + this.conf.platformName);\n this.loadData()\n .then(() => {\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onRowClicked(row: InvestorDataRow): void {\n this._router.navigate(['users', row.profile.userId, 'edit']);\n }\n\n public onCompanyClicked(row: InvestorDataRow): void {\n this._router.navigate(['investors', 'companies', row.company.id], {\n queryParams: {\n 'backUrl': this._router.url,\n }\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(InvestorProfile)\n .where('investorValidationStateId').equals(InvestorValidationState.ID_PENDING)\n .get()\n .then((data: InvestorProfile[]) => {\n this.investorProfiles = data;\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","\n \n \n
\n
\n \n \n \n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { InvestorDataRow } from '../../providers/investors-provider';\nimport { UsersProvider } from '../../../users/providers/users-provider';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { InvestorProfile, InvestorValidationState, User } from '../../../_common/providers/models';\n\n@Component({\n selector: 'investors-investors-page',\n providers: [],\n styleUrls: ['./investors.scss'],\n templateUrl: './investors.html'\n})\nexport class InvestorsInvestorsPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public investorProfiles: InvestorProfile[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _dialoger: MatDialog,\n private _toaster: MatSnackBar,\n private _usersProvider: UsersProvider,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._title.setTitle(this._translater.instant('Investors') + ' | ' + this.conf.platformName);\n this.loadData()\n .then(() => {\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onRowClicked(row: InvestorDataRow): void {\n this._router.navigate(['users', row.profile.userId, 'edit'], {\n queryParams: {\n 'backUrl': this._router.url,\n 'backTitle': this._translater.instant('Search_results')\n }\n });\n }\n\n public onCompanyClicked(row: InvestorDataRow): void {\n this._router.navigate(['investors', 'companies', row.company.id], {\n queryParams: {\n 'backUrl': this._router.url,\n 'backTitle': this._translater.instant('Search_results')\n }\n });\n }\n\n public onDeleteRowClicked(row: InvestorDataRow): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_user'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n row.isLoading = true;\n this.deleteUser(row.user)\n .then(() => {\n this.investorProfiles = this.investorProfiles.slice();\n this._toaster.open(this._translater.instant('User_deleted'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(InvestorProfile)\n .where('investorValidationStateId').equals(InvestorValidationState.ID_ACCEPTED)\n .get()\n .then((data: InvestorProfile[]) => {\n this.investorProfiles = data;\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private deleteUser(user: User): Promise {\n return new Promise((resolve, reject) => {\n this._usersProvider.deleteUser(user)\n .then(() => {\n for (let i = 0; i < this.investorProfiles.length; i++) {\n if (this.investorProfiles[i].userId === user.id) {\n this.investorProfiles.splice(i, 1);\n i = this.investorProfiles.length;\n }\n }\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","

{{ title | translate }}

\n\n
\n
\n \n \n {{ 'Field_required' | translate }}\n \n \n \n {{ 'Field_required' | translate }}\n \n
\n
\n \n \n {{ 'Field_required' | translate }}\n {{ 'Field_invalid_email' | translate }}\n {{ 'Email_unavailable' | translate }}\n \n
\n
\n

{{ infoMessage | translate }}

\n
\n\n \n \n\n\n","import { Component, Inject } from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { UsersProvider } from '../../providers/users-provider';\nimport { User } from '../../../_common/providers/models';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'users-add-user-dialog',\n providers: [],\n styleUrls: ['add-user-dialog.scss'],\n templateUrl: 'add-user-dialog.html'\n})\nexport class UsersAddUserDialogComponent {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly NAME_MAX_LENGTH: number = 200;\n public readonly CHECK_EMAIL_THRESHOLD: number = 750;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public userForm: FormGroup;\n public emailUnavailableError: boolean = false;\n\n public title: string = null;\n public infoMessage: string = null;\n\n private _checkEmailAvailabilityRequestTimestamp: number = 0;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public dialog: MatDialogRef,\n private _fb: FormBuilder,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _usersProvider: UsersProvider,\n @Inject(MAT_DIALOG_DATA) public data\n ) {\n this.userForm = this._fb.group({\n firstName: new FormControl('', [Validators.required, Validators.maxLength(this.NAME_MAX_LENGTH)]),\n lastName: new FormControl('', [Validators.required, Validators.maxLength(this.NAME_MAX_LENGTH)]),\n email: new FormControl('', [\n Validators.required,\n Validators.email,\n Validators.maxLength(this.NAME_MAX_LENGTH),\n (control: any) => {\n return this.emailUnavailableError ? {unavailable: {valid: false}} : null;\n }\n ])\n });\n\n this.title = data.title;\n this.infoMessage = data.infoMessage;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onEmailChanged(): void {\n this.emailUnavailableError = false;\n this.userForm.controls.email.markAsTouched();\n this.userForm.controls.email.updateValueAndValidity();\n if (!this.userForm.controls.email.hasError('email')) {\n // on check la dispo que si l'email est valide ...\n this.checkEmailAvailability();\n }\n }\n\n public onAddClicked(): void {\n if (this.userForm.invalid) {\n return;\n }\n\n this.dialog.close(Object.assign(new User(), this.userForm.value));\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private checkEmailAvailability(): void {\n this._checkEmailAvailabilityRequestTimestamp = (new Date()).getTime();\n setTimeout(() => {\n const now: number = (new Date()).getTime();\n if (now - this._checkEmailAvailabilityRequestTimestamp >= this.CHECK_EMAIL_THRESHOLD) {\n this._usersProvider.checkEmailAvailability(this.userForm.controls.email.value)\n .then((isAvailable: boolean) => {\n this.emailUnavailableError = !isAvailable;\n this.userForm.controls.email.updateValueAndValidity();\n })\n .catch((error: any) => this.onError(error));\n }\n }, this.CHECK_EMAIL_THRESHOLD);\n }\n\n private onError(error: any): void {\n console.log(error);\n\n if (error.status === 422) {\n this.emailUnavailableError = true;\n this.userForm.controls.email.updateValueAndValidity();\n } else {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n }\n}\n","\n
\n

{{ noDataMessage | translate }}

\n
\n 0\"\n [dataSource]=\"dataSource\"\n matSort>\n \n \n \n {{ 'Name' | translate }}\n \n \n \n \n \n {{ 'Email' | translate }}\n \n {{ row.user.email }}\n \n \n \n {{ 'Registration_date' | translate }}\n \n {{ row.user.createDate | dateClosest:'FjY' }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Router } from '@angular/router';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Conf } from '../../../_conf';\nimport { ModuleMenu } from '../../../_common/components/module-content/module-content';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { SimpleMatDataSource } from '../../../_common/providers/simple-mat-data-source';\nimport { Utils } from '../../../_common/providers/utils';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { UsersRow } from '../../providers/users-provider';\nimport { UserRights } from '../../providers/user-rights';\nimport { User } from '../../../_common/providers/models';\n\n@Component({\n selector: 'users-list',\n providers: [],\n styleUrls: ['./list.scss'],\n templateUrl: './list.html'\n})\nexport class UsersListComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public dataSource: SimpleMatDataSource = new SimpleMatDataSource([]);\n public columns: string[] = [];\n\n @Input() public title: string = null;\n @Input() public addTitle: string = 'Add';\n @Input() public noDataMessage: string = 'No_data_yet';\n @Input() public isAddEnabled: boolean = false;\n @Input() public hideNameColumn: boolean = false;\n @Input() public hideEmailColumn: boolean = false;\n @Input() public hideCreateDateColumn: boolean = false;\n @Input() public hideActionsColumns: boolean = false;\n @Output() public onRowClicked: EventEmitter = new EventEmitter();\n @Output() public onAddClicked: EventEmitter = new EventEmitter();\n @Output() public onDeleteRowClicked: EventEmitter = new EventEmitter();\n @ViewChild(MatPaginator, {static: false}) public paginator: MatPaginator;\n @ViewChild(MatSort, {static: false}) public sorter: MatSort;\n public addMenu: ModuleMenu = null;\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public currentUser: CurrentUser,\n private _dialoger: MatDialog,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _router: Router,\n private _storage: ModelsStorage,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n private _users: User[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set users(users: User[]) {\n this._users = users;\n this.loadData(users).catch((error: any) => this.onError(error));\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.initColumns();\n this.initDataSource();\n this.addMenu = {\n icon: 'add',\n title: this.addTitle,\n url: null,\n onClick: () => this.onAddClicked.emit()\n };\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onDataSortChange(event: any): void {\n this.dataSource.sortBy(event.active, event.direction);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private initColumns(): void {\n const columns: string[] = [];\n if (!this.hideNameColumn) {\n columns.push('name');\n }\n if (!this.hideEmailColumn) {\n columns.push('email');\n }\n if (!this.hideCreateDateColumn) {\n columns.push('createDate');\n }\n if (!this.hideActionsColumns) {\n columns.push('actions');\n }\n\n this.columns = columns;\n }\n\n private initDataSource(): void {\n this.dataSource.sort = this.sorter;\n this.dataSource.paginator = this.paginator;\n\n this.dataSource.addSortDefinition(\n 'name',\n (a: UsersRow, b: UsersRow) => this.utils.sortRow(a.user.firstName.toLowerCase() + a.user.lastName.toLowerCase(), b.user.firstName.toLowerCase() + b.user.lastName.toLowerCase()),\n (a: UsersRow, b: UsersRow) => this.utils.sortRow(b.user.firstName.toLowerCase() + b.user.lastName.toLowerCase(), a.user.firstName.toLowerCase() + a.user.lastName.toLowerCase())\n );\n\n this.dataSource.addSortDefinition(\n 'email',\n (a: UsersRow, b: UsersRow) => this.utils.sortRow(a.user.email.toLowerCase(), b.user.email.toLowerCase()),\n (a: UsersRow, b: UsersRow) => this.utils.sortRow(b.user.email.toLowerCase(), a.user.email.toLowerCase())\n );\n\n this.dataSource.addSortDefinition(\n 'createDate',\n (a: UsersRow, b: UsersRow) => this.utils.sortRow(a.user.createDate, b.user.createDate),\n (a: UsersRow, b: UsersRow) => this.utils.sortRow(b.user.createDate, a.user.createDate)\n );\n }\n\n private loadData(users: User[]): Promise {\n return new Promise((resolve, reject) => {\n // si on devait charger les users links ... c'est bien de garder un promise\n const rows: UsersRow[] = [];\n users.forEach((user: User) => {\n const rights: UserRights = new UserRights(this.utils);\n rights.evaluate({\n user: this.currentUser.user,\n subjectUser: user\n });\n rows.push({\n user,\n rights\n });\n });\n this.dataSource.replaceAllWith(rows);\n\n resolve();\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","\n \n \n
\n
\n \n \n \n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { UsersProvider, UsersRow } from '../../providers/users-provider';\nimport { UsersAddUserDialogComponent } from '../../components/add-user-dialog/add-user-dialog';\nimport { UserRights } from '../../providers/user-rights';\nimport { User } from '../../../_common/providers/models';\n\n@Component({\n selector: 'users-admins-page',\n providers: [],\n styleUrls: ['./admins.scss'],\n templateUrl: './admins.html'\n})\nexport class UsersAdminPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public users: User[] = [];\n public rights: UserRights = new UserRights(this._utils);\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef,\n private _usersProvider: UsersProvider,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._title.setTitle(this._translater.instant('Administrators') + ' | ' + this.conf.platformName);\n this.loadData()\n .then(() => {\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onRowClicked(row: UsersRow): void {\n this._router.navigate(['users', row.user.id, 'edit'], {\n queryParams: {\n backUrl: this._router.url,\n backTitle: this._translater.instant('Administrators')\n }\n });\n }\n\n public onAddClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(UsersAddUserDialogComponent, {\n data: {}\n });\n dialog.afterClosed().subscribe((user: User) => {\n if (user) {\n this.isLoading = true;\n this.addUser(user)\n .then(() => {\n this.isLoading = false;\n this.users = this.users.slice();\n this._toaster.open(this._translater.instant('User_added'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n public onDeleteRowClicked(row: UsersRow): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_user'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n row.isLoading = true;\n this.deleteUser(row.user)\n .then(() => {\n this.users = this.users.slice();\n this._toaster.open(this._translater.instant('User_deleted'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(User).where('isAdmin').equals(1).get()\n .then((data: User[]) => {\n this.users = data;\n this.rights.evaluate({\n user: this.currentUser.user\n });\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private addUser(user: User): Promise {\n return new Promise((resolve, reject) => {\n user.isAdmin = 1;\n user.id = 0;\n user.langId = this.currentUser.user.langId;\n this._usersProvider.saveUser(user)\n .then((createdUser: User) => {\n this.users.push(createdUser);\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private deleteUser(user: User): Promise {\n return new Promise((resolve, reject) => {\n this._usersProvider.deleteUser(user)\n .then(() => {\n for (let i = 0; i < this.users.length; i++) {\n if (this.users[i].id === user.id) {\n this.users.splice(i, 1);\n i = this.users.length;\n }\n }\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","\n \n \n
\n
\n \n \n \n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { UsersProvider, UsersRow } from '../../providers/users-provider';\nimport { UsersAddUserDialogComponent } from '../../components/add-user-dialog/add-user-dialog';\nimport { UserRights } from '../../providers/user-rights';\nimport { User } from '../../../_common/providers/models';\n\n@Component({\n selector: 'users-guests-page',\n providers: [],\n styleUrls: ['./guests.scss'],\n templateUrl: './guests.html'\n})\nexport class UsersGuestsPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public users: User[] = [];\n public rights: UserRights = new UserRights(this._utils);\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef,\n private _usersProvider: UsersProvider,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._title.setTitle(this._translater.instant('Guests') + ' | ' + this.conf.platformName);\n this.loadData()\n .then(() => {\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onRowClicked(row: UsersRow): void {\n this._router.navigate(['users', row.user.id, 'edit'], {\n queryParams: {\n backUrl: this._router.url,\n backTitle: this._translater.instant('Guests')\n }\n });\n }\n\n public onAddClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(UsersAddUserDialogComponent, {\n data: {}\n });\n dialog.afterClosed().subscribe((user: User) => {\n if (user) {\n this.isLoading = true;\n this.addUser(user)\n .then(() => {\n this.isLoading = false;\n this.users = this.users.slice();\n this._toaster.open(this._translater.instant('User_added'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n public onDeleteRowClicked(row: UsersRow): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_user'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n row.isLoading = true;\n this.deleteUser(row.user)\n .then(() => {\n this.users = this.users.slice();\n this._toaster.open(this._translater.instant('User_deleted'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(User).where('isGuest').equals(1).get()\n .then((data: User[]) => {\n this.users = data;\n this.rights.evaluate({\n user: this.currentUser.user\n });\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private addUser(user: User): Promise {\n return new Promise((resolve, reject) => {\n user.isGuest = 1;\n user.id = 0;\n user.langId = this.currentUser.user.langId;\n this._usersProvider.saveUser(user)\n .then((createdUser: User) => {\n this.users.push(createdUser);\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private deleteUser(user: User): Promise {\n return new Promise((resolve, reject) => {\n this._usersProvider.deleteUser(user)\n .then(() => {\n for (let i = 0; i < this.users.length; i++) {\n if (this.users[i].id === user.id) {\n this.users.splice(i, 1);\n i = this.users.length;\n }\n }\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","\n \n \n
\n
\n \n
\n \n
{{ 'Project_welcome_title' | translate:{name: currentUser.user.firstName} }}
\n
{{ 'Project_welcome_subtitle' | translate }}
\n
\n
\n add\n
{{ 'Project_welcome_section1' | translate }}
\n
\n
\n thumb_up_alt\n
{{ 'Project_welcome_section2' | translate }}
\n
\n
\n edit\n
{{ 'Project_welcome_section3' | translate }}
\n
\n
\n show_chart\n
{{ 'Project_welcome_section4' | translate }}
\n
\n
\n
\n \n
\n
\n
\n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { ProjectsCreateDialogComponent } from '../../components/create-dialog/create-dialog';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { ProjectSearchResultRow, ProjectsProvider } from '../../providers/projects-provider';\n\n@Component({\n selector: 'projects-no-project-yet-page',\n providers: [],\n styleUrls: ['./no-project-yet.scss'],\n templateUrl: './no-project-yet.html'\n})\nexport class ProjectsNotProjectYetPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _dialoger: MatDialog,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onCreateProjectClicked(row: ProjectSearchResultRow): void {\n const dialog: MatDialogRef = this._dialoger.open(ProjectsCreateDialogComponent, {\n data: {}\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private onError(error: any): void {\n this.isLoading = false;\n\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { MatDialog } from '@angular/material/dialog';\n\n@Component({\n selector: 'terms-page',\n providers: [],\n styleUrls: ['./terms.scss'],\n templateUrl: './terms.html'\n})\nexport class TermsPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n private _title: Title,\n private _router: Router,\n private _route: ActivatedRoute,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this._title.setTitle(this._translater.instant('Terms_and_conditions') + ' | ' + this.conf.platformName);\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","
\n
\n
\n

{{ 'Terms_and_conditions' | translate }}

\n

This version of the Terms and Conditions (V1.0) for the Swiss Biotech Ventures Platform (SBVP)\n will come into effect on July 5, 2021. The platform is currently still being developed. The formal launch is\n planned for Sept. 7, 2021 in the context of the Swiss Biotech Day 2021 in Basel.

\n

The platform is developed and operated by the Swiss Biotech Association.

\n

Welcome to the Swiss Biotech Ventures Platform (SBVP)

\n

The SBVP provides a platform where biotech ventures can meet investors and industry partners. Users of this\n website may create an account as a “Biotech venture” (biotech venture companies looking for visibility,\n funding and/or partnership), or as an “Investor or industry partner” (who are looking for investment and\n partnering opportunities). Employees of investors and industry partners can establish their personal account\n which is linked to the investors/industry partners company account. Biotech ventures can see the\n investors/industry partner company information and vice versa.

\n

The main purpose of the SBVP is twofold:

\n
    \n
  1. Increasing the transparency by listing the biotech investment opportunities in Switzerland and by\n disclosing the investment preferences of global investors and the partnering focus of industry partners.\n
  2. \n
  3. Facilitating the matchmaking so that biotech ventures and investors as well as industry partners avoid\n wasting time in their search for suitable investors/business partners and can contact each other easily.\n
  4. \n
\n

By using SBVP, including by simply viewing content on the site, you are agreeing that you, and each person\n you allow to access the site through your account, will abide by these Terms and Conditions. Your access to\n and use of the platform are conditioned on your acceptance of and compliance with this Terms and Conditions\n (Agreement).

\n

Two key principles shall apply for all users:

\n
    \n
  • Any information shared on the platform must be uploaded by the users themselves
  • \n
  • No confidential data shall be shared on the SBVP
  • \n
\n\n

Definitions

\n \n

SWISS BIOTECH VENTURES

\n

Swiss biotech ventures represent companies that develop innovative drug or cell-based products, technologies,\n devices, materials, diagnostics that help to avoid, monitor, treat or cure diseases.

\n

Investors

\n

Investors are individuals either working for public or private institutions that fund life science ventures\n (eg venture capital firms, foundations, banks) or invest directly for their own account (professional\n investors). Both institutions and individual investors must have a track record of significant investment in\n life science ventures (documentation to be provided upon request). Business angels investing via an angel\n community will be represented on SBVP by the management and the deal leaders of their community.

\n

Industry partners

\n

Industry partners are individuals working in the industry (in particular the biotech, medtech and pharma\n industry) and directly involved in the development of partnerships between industry and biotech projects and\n spin-offs (eg Search & Evaluation or Business Development professionals).

\n\n

User obligations

\n \n

You understand and confirm that:

\n
    \n
  1. Leader of biotech ventures\n
      \n
    1. you have adequate rights to all copyrights, trademarks, trade secrets, intellectual property or\n other material provided by you for display on SBVP;\n
    2. \n
    3. you will update your registration information as needed so that it remains true, correct and\n complete;\n
    4. \n
    5. you have the right, authority, and capacity to enter into this Agreement on your own behalf and\n on behalf on any entity for whom you are acting and to abide by all of the terms and conditions\n contained herein, and that if any aspect of your participation in SBVP violates provisions of\n the law to which you are subject, you will cease using the platform and close your account;\n
    6. \n
    7. you shall not use a name or address owned or controlled by another person with the intent to\n impersonate that person or for any other reason;\n
    8. \n
    9. you shall not use a User ID name that is subject to any rights of a person other than yourself\n without appropriate authorization;\n
    10. \n
    11. you shall be solely responsible for maintaining the confidentiality of your password;
    12. \n
    13. you will be solely responsible for complying with applicable law regarding any transaction,\n including without limitation the determination of whether any investor is an Accredited Investor\n and whether any investment complies with the terms of local law;\n
    14. \n
    15. you will obtain such professional advice as is appropriate to protect your interests, including\n legal, tax, accounting and other advice (i.e., get a good startup attorney);\n
    16. \n
    17. you shall not have access to details about investors registered on the platform, with the\n exception of the name of the institution or company they work for;\n
    18. \n
    19. your profile is reviewed by the administrator or the local experts who reserve the right to\n accept or decline a registration without further explanation.\n
    20. \n
    \n
  2. \n
  3. Investors, industry partners\n
      \n
    1. you shall not use the platform to market own services (eg consulting) or contact biotech\n ventures to offer unspecific services;\n
    2. \n
    3. you shall not use a false name, function, or email;
    4. \n
    5. you shall not use a name or address owned or controlled by another person with the intent to\n impersonate that person or for any other reason;\n
    6. \n
    7. your profile is reviewed by the administrator or the local experts who reserve the right to\n accept or decline a registration without further explanation;\n
    8. \n
    9. you do not expect SBVP to evaluate, confirm or otherwise stand behind any user’s statements or\n recommend any investment;\n
    10. \n
    11. SBVP does not, endorse, support, represent or guarantee the completeness, truthfulness, accuracy\n or reliability of any content on SBVP;\n
    12. \n
    13. by using the platform, you may be exposed to content that might be inaccurate or otherwise\n inappropriate, and that you have no claim against SBVP for any such material;\n
    14. \n
    15. you will use your own judgment before making any decision to invest or to accept an\n investment;\n
    16. \n
    17. you are aware of the risks of investing and/or partnering with early biotech projects and\n spin-offs;\n
    18. \n
    19. you will not copy or distribute content except as specifically allowed in this Agreement;
    20. \n
    21. will hold the Company harmless against any damage that may happen to us as a result of your use\n of SBVP;\n
    22. \n
    23. by registering on SBVP, or otherwise using the platform, you may have an opportunity to see\n exclusive information although we disadvise all users to publish any confidential data. It is\n expected that you will use discretion in determining what you do with that information. You\n agree that you will not republish any information you acquire through the platform;\n
    24. \n
    25. your profile will not be shared with leaders of biotech ventures, with the exception of the name\n of your institution or company.\n
    26. \n
    \n
  4. \n
  5. General\n
      \n
    1. SBVP is not responsible for doing diligence on the ventures, investors, industry partners you\n meet through SBVP or verifying any representations, materials or other information provided by\n them;\n
    2. \n
    3. SBVP does not recommend any ventures for investment, endorse their fitness for investment or\n verify or claim the accuracy of information provided by startups on the platform or in our\n emails. In particular, we do not act as an investment adviser to any investor(s);\n
    4. \n
    5. SBVP does not control or endorse the content, messages or information found on the website,\n therefore, SBVP specifically disclaims any responsibility with regard thereto;\n
    6. \n
    7. SBVP may, but is not required to, monitor, or control the content posted on the platform. Our\n failure to exercise this right does not give you any right to make a claim against SBVP. Any\n content that has been uploaded on the platform may be deleted at any time without notice to you;\n
    8. \n
    9. SBVP reserves the right to discontinue its services or to change its services in any way and at\n any time, with or without notice to you, without liability;\n
    10. \n
    11. SBVP reserves the right to terminate your access to the platform without notice and, if you\n violate this Agreement, to pursue other remedies at law or in equity. We may delete your account\n for any reason or for no reason at all, and if we delete your account, you will lose all access\n to any information, connections or other features that may have value to you that may have been\n associated with your account;\n
    12. \n
    13. SBVP has the right to refuse registration of or cancel your user account in its discretion for\n any reason or for no reason. In addition, the SBVP reserves the right at all times (but will not\n have an obligation) to remove any content on the platform and to terminate users and/or reclaim\n usernames. We also reserve the right to access, read, preserve, and disclose any information as\n we reasonably believe is necessary to (i) satisfy any applicable law, regulation, legal process\n or governmental request, (ii) enforce this Agreement (including investigation of potential\n violations hereof), (iii) detect, prevent or otherwise address fraud, security or technical\n issues, (iv) respond to user support requests or (v) protect the rights, property or safety of\n SBVP, its users and the public;\n
    14. \n
    15. Without limiting the generality of the foregoing, you specifically acknowledge that SBVP is\n exempt from liability to any person for any claim based upon its termination of an account or\n disabling of access to or removal of any content, including material it believes, in its sole\n discretion to violate this Agreement, regardless of whether the material ultimately is\n determined to be infringing or otherwise prohibited, and regardless of whether such termination\n or disabling has the effect of reducing the value of any content or opportunities that might\n otherwise have been available to you. By using the platform, you agree that notice to you\n through an email to the email address you provided in your profile constitutes reasonable\n efforts to notify you of any removal or disabling if such notice is required;\n
    16. \n
    17. SBVP has no obligation to monitor or enforce any intellectual property rights that may be\n associated with content you provide to us, but SBVP does have the right to enforce such rights\n through any means it sees fit, including bringing and controlling actions on your behalf.\n
    18. \n
    \n\n
  6. \n
\n

Termination

\n \n

Unless terminated by SBVP, this Agreement will remain in full force and effect while you\n use any of the services. You may terminate this Agreement at any time by deleting all content you have\n provided to SBVP and ceasing to use the services. SBVP may terminate this Agreement at any time,\n particularly if you are suspected of violating any provision of this Agreement. Upon termination of this\n Agreement for any reason, you shall destroy and remove from all computers, and other storage media all\n copies of any intellectual property owned by SBVP or any other user of the services that you acquired via\n use of the platform. Your representations in this Agreement shall survive any termination or expiration of\n this Agreement.

\n

Jurisdiction & applicable law

\n \n

Swiss Law shall apply to these Terms and Conditions. Place of jurisdiction is Zurich.

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

{{ noDataMessage | translate }}

\n
\n 0\"\n [dataSource]=\"dataSource\"\n matSort>\n \n \n \n {{ 'Name' | translate }}\n \n \n \n \n \n {{ 'Email' | translate }}\n \n {{ row.user.email }}\n \n \n \n {{ 'Academic_institution' | translate }}\n \n \n \n \n \n \n \n \n \n \n {{ 'Registration_date' | translate }}\n \n {{ row.user.createDate | dateClosest:'FjY' }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Router } from '@angular/router';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Conf } from '../../../_conf';\nimport { ModuleMenu } from '../../../_common/components/module-content/module-content';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { SimpleMatDataSource } from '../../../_common/providers/simple-mat-data-source';\nimport { Utils } from '../../../_common/providers/utils';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { InstitutionLocalExpertRow, LocalExpertRow } from '../../providers/users-provider';\nimport { UserRights } from '../../providers/user-rights';\nimport { AcademicInstitution, User, User_AcademicInstitution } from '../../../_common/providers/models';\n\n@Component({\n selector: 'users-local-experts-list',\n providers: [],\n styleUrls: ['./local-experts-list.scss'],\n templateUrl: './local-experts-list.html'\n})\nexport class UsersLocalExpertsListComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly AVOIDED_ACADEMIC_INSTITUTION_IDS: number[] = [\n AcademicInstitution.ID_NONE,\n AcademicInstitution.ID_OTHER\n ];\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public dataSource: SimpleMatDataSource = new SimpleMatDataSource([]);\n public institutions: AcademicInstitution[] = [];\n\n public columns: string[] = [];\n\n @Input() public title: string = null;\n @Input() public addTitle: string = 'Add';\n @Input() public noDataMessage: string = 'No_data_yet';\n @Input() public isAddEnabled: boolean = false;\n @Input() public hideNameColumn: boolean = false;\n @Input() public hideEmailColumn: boolean = false;\n @Input() public hideCreateDateColumn: boolean = false;\n @Input() public hideActionsColumns: boolean = false;\n @Input() public hideInstitutionsColumn: boolean = false;\n @Output() public onRowClicked: EventEmitter = new EventEmitter();\n @Output() public onAddClicked: EventEmitter = new EventEmitter();\n @Output() public onDeleteRowClicked: EventEmitter = new EventEmitter();\n @Output() public onAcademicInstitutionsChanged: EventEmitter = new EventEmitter();\n @ViewChild(MatPaginator, {static: false}) public paginator: MatPaginator;\n @ViewChild(MatSort, {static: false}) public sorter: MatSort;\n public addMenu: ModuleMenu = null;\n private _hasChanges: any = {};\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public currentUser: CurrentUser,\n private _dialoger: MatDialog,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _router: Router,\n private _storage: ModelsStorage,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n private _users: User[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set users(users: User[]) {\n this._users = users;\n this.loadData(users).catch((error: any) => this.onError(error));\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.initColumns();\n this.initDataSource();\n this.addMenu = {\n icon: 'add',\n title: this.addTitle,\n url: null,\n onClick: () => this.onAddClicked.emit()\n };\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onDataSortChange(event: any): void {\n this.dataSource.sortBy(event.active, event.direction);\n }\n\n public stopPropagation(event: any): void {\n event.stopPropagation();\n }\n\n public onRowLocalExpertChanged(row: LocalExpertRow, detailsRow: InstitutionLocalExpertRow): void {\n this._hasChanges[row.user.id] = true;\n // si il n'est plus expert, on s'assure qu'il ne soit plus dispatcher non plus\n if (!detailsRow.isLocalExpert && detailsRow.isDispatcher) {\n detailsRow.isDispatcher = false;\n }\n\n this.updateRow(row);\n }\n\n public onRowDispatcherChanged(row: LocalExpertRow, detailsRow: InstitutionLocalExpertRow): void {\n this._hasChanges[row.user.id] = true;\n // si il est dispatcher, on s'assure qu'il soit aussi local expert\n if (detailsRow.isDispatcher && !detailsRow.isLocalExpert) {\n detailsRow.isLocalExpert = true;\n }\n\n this.updateRow(row);\n }\n\n public _onAcademicInstitutionsChanged(row: LocalExpertRow): void {\n if (this._hasChanges[row.user.id]) {\n this._hasChanges[row.user.id] = false;\n this.onAcademicInstitutionsChanged.emit(row);\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private updateRow(row: LocalExpertRow): void {\n const expertInstitutions: AcademicInstitution[] = [];\n row.institutionDetails.forEach((detail: InstitutionLocalExpertRow) => {\n if (detail.isLocalExpert) {\n expertInstitutions.push(detail.institution);\n }\n });\n row.expertInstitutions = expertInstitutions;\n }\n\n private initColumns(): void {\n const columns: string[] = [];\n if (!this.hideNameColumn) {\n columns.push('name');\n }\n if (!this.hideEmailColumn) {\n columns.push('email');\n }\n if (!this.hideInstitutionsColumn) {\n columns.push('institution');\n }\n if (!this.hideCreateDateColumn) {\n columns.push('createDate');\n }\n if (!this.hideActionsColumns) {\n columns.push('actions');\n }\n\n this.columns = columns;\n }\n\n private initDataSource(): void {\n this.dataSource.sort = this.sorter;\n this.dataSource.paginator = this.paginator;\n\n this.dataSource.addSortDefinition(\n 'name',\n (a: LocalExpertRow, b: LocalExpertRow) => this.utils.sortRow(a.user.firstName.toLowerCase() + a.user.lastName.toLowerCase(), b.user.firstName.toLowerCase() + b.user.lastName.toLowerCase()),\n (a: LocalExpertRow, b: LocalExpertRow) => this.utils.sortRow(b.user.firstName.toLowerCase() + b.user.lastName.toLowerCase(), a.user.firstName.toLowerCase() + a.user.lastName.toLowerCase())\n );\n\n this.dataSource.addSortDefinition(\n 'email',\n (a: LocalExpertRow, b: LocalExpertRow) => this.utils.sortRow(a.user.email.toLowerCase(), b.user.email.toLowerCase()),\n (a: LocalExpertRow, b: LocalExpertRow) => this.utils.sortRow(b.user.email.toLowerCase(), a.user.email.toLowerCase())\n );\n\n this.dataSource.addSortDefinition(\n 'createDate',\n (a: LocalExpertRow, b: LocalExpertRow) => this.utils.sortRow(a.user.createDate, b.user.createDate),\n (a: LocalExpertRow, b: LocalExpertRow) => this.utils.sortRow(b.user.createDate, a.user.createDate)\n );\n }\n\n private loadData(users: User[]): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(AcademicInstitution).orderBy('ordinal').get(),\n this._storage.select(User_AcademicInstitution).where('userId').in(this.utils.getKeyValues(users)).get()\n ])\n .then((data: any[]) => {\n this.institutions = data[0];\n const rows: LocalExpertRow[] = [];\n users.forEach((user: User) => {\n const user_institutions: User_AcademicInstitution[] = this.utils.findManyIn([user.id], data[1], 'userId');\n const institutions: InstitutionLocalExpertRow[] = [];\n const expertInstitutions: AcademicInstitution[] = [];\n this.institutions.forEach((institution: AcademicInstitution) => {\n const user_institution: User_AcademicInstitution = this.utils.findIn(institution.id, user_institutions, 'academicInstitutionId');\n if (user_institution) {\n expertInstitutions.push(institution);\n }\n institutions.push({\n institution,\n isLocalExpert: user_institution != null,\n isDispatcher: user_institution != null && user_institution.isDispatcher\n });\n });\n const rights: UserRights = new UserRights(this.utils);\n rights.evaluate({\n user: this.currentUser.user,\n subjectUser: user\n });\n rows.push({\n user,\n rights,\n institutionDetails: institutions,\n expertInstitutions\n });\n });\n this.dataSource.replaceAllWith(rows);\n\n resolve();\n })\n .catch(reject);\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","\n \n \n
\n
\n \n \n \n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { InstitutionLocalExpertRow, LocalExpertRow, UsersProvider } from '../../providers/users-provider';\nimport { UsersAddUserDialogComponent } from '../../components/add-user-dialog/add-user-dialog';\nimport { UserRights } from '../../providers/user-rights';\nimport { User, User_AcademicInstitution } from '../../../_common/providers/models';\n\n@Component({\n selector: 'local-experts-page',\n providers: [],\n styleUrls: ['./local-experts.scss'],\n templateUrl: './local-experts.html'\n})\nexport class UsersLocalExpertsPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public users: User[] = [];\n public rights: UserRights = new UserRights(this._utils);\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef,\n private _usersProvider: UsersProvider,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._title.setTitle(this._translater.instant('Local_experts') + ' | ' + this.conf.platformName);\n this.loadData()\n .then(() => {\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onRowClicked(row: LocalExpertRow): void {\n this._router.navigate(['users', row.user.id, 'edit'], {\n queryParams: {\n backUrl: this._router.url,\n backTitle: this._translater.instant('Local_experts')\n }\n });\n }\n\n public onAddClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(UsersAddUserDialogComponent, {\n data: {}\n });\n dialog.afterClosed().subscribe((user: User) => {\n if (user) {\n this.isLoading = true;\n this.addUser(user)\n .then(() => {\n this.isLoading = false;\n this.users = this.users.slice();\n this._toaster.open(this._translater.instant('User_added'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n public onDeleteRowClicked(row: LocalExpertRow): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_user'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n row.isLoading = true;\n this.deleteUser(row.user)\n .then(() => {\n this.users = this.users.slice();\n this._toaster.open(this._translater.instant('User_deleted'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n public onAcademicInstitutionsChanged(row: LocalExpertRow): void {\n row.isLoading = true;\n this.saveUserRow(row)\n .then(() => {\n row.isLoading = false;\n this._toaster.open(this._translater.instant('Academic_institutions_saved'), '', {duration: 5000});\n })\n .catch((error: any) => {\n row.isLoading = false;\n this.onError(error);\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(User).where('isLocalExpert').equals(1).get()\n .then((data: User[]) => {\n this.users = data;\n this.rights.evaluate({\n user: this.currentUser.user\n });\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private addUser(user: User): Promise {\n return new Promise((resolve, reject) => {\n user.isLocalExpert = 1;\n user.id = 0;\n user.langId = this.currentUser.user.langId;\n this._usersProvider.saveUser(user)\n .then((createdUser: User) => {\n this.users.push(createdUser);\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private deleteUser(user: User): Promise {\n return new Promise((resolve, reject) => {\n this._usersProvider.deleteUser(user)\n .then(() => {\n for (let i = 0; i < this.users.length; i++) {\n if (this.users[i].id === user.id) {\n this.users.splice(i, 1);\n i = this.users.length;\n }\n }\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private saveUserRow(row: LocalExpertRow): Promise {\n return new Promise((resolve, reject) => {\n const user_academicInstitutions: User_AcademicInstitution[] = [];\n row.institutionDetails.forEach((institutionRow: InstitutionLocalExpertRow) => {\n if (institutionRow.isLocalExpert) {\n const item: User_AcademicInstitution = new User_AcademicInstitution();\n item.academicInstitutionId = institutionRow.institution.id;\n item.userId = row.user.id;\n item.isDispatcher = institutionRow.isDispatcher;\n user_academicInstitutions.push(item);\n }\n });\n\n this._usersProvider.saveUserAcademicInstitutions(row.user.id, user_academicInstitutions)\n .then((user_academicInsitutions: User_AcademicInstitution[]) => {\n // y a rien à updater dans la vue vu qu'on stock dans la row que les AcademicInstitution\n // et pas les User_AcademicInsitution ...\n resolve();\n })\n .catch(reject);\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","\n \n \n
\n
\n \n \n \n

{{ 'You_can_admin_following_insitutions' | translate }}:

\n
    \n
  • {{ institution.name }}
  • \n
\n
\n \n

{{ 'No_projects_pending_validation' | translate }}

\n
\n \n \n
\n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { ProjectSearchResultRow, ProjectsProvider } from '../../providers/projects-provider';\nimport {\n AcademicInstitution,\n Project,\n ProjectValidationState,\n User_AcademicInstitution\n} from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-drafts-page',\n providers: [],\n styleUrls: ['./drafts.scss'],\n templateUrl: './drafts.html'\n})\nexport class ProjectsDraftsPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public projects: Project[] = [];\n public institutions: AcademicInstitution[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _dialoger: MatDialog,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this.loadData()\n .then(() => {\n this._title.setTitle(this._translater.instant('Projects_in_draft_state') + ' | ' + this.conf.platformName);\n })\n .catch((error: any) => this.onError(error));\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onRowClicked(row: ProjectSearchResultRow): void {\n this._router.navigate(['academic-ventures', row.project.id, 'edit'], {\n queryParams: {\n 'backUrl': this._router.url,\n 'backTitle': this._translater.instant('Projects_in_draft_state')\n }\n });\n }\n\n public onDeleteClicked(row: ProjectSearchResultRow): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_project'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n row.isLoading = true;\n this.deleteProject(row.project)\n .then(() => {\n this.projects = this.projects.slice();\n this._toaster.open(this._translater.instant('Project_deleted'), '', {duration: 5000});\n })\n .catch((error: any) => {\n row.isLoading = false;\n this.onError(error);\n });\n }\n });\n }\n\n public onEditRowClicked(row: ProjectSearchResultRow): void {\n this.onRowClicked(row);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(Project)\n .where('projectValidationStateId').equals(ProjectValidationState.ID_DRAFT)\n .orderBy('name')\n .get(),\n this._storage.select(AcademicInstitution)\n .where('id').equals(User_AcademicInstitution, 'academicInstitutionId')\n .and('userId', User_AcademicInstitution).equals(this.currentUser.user.id)\n .get()\n ])\n .then((data: any[]) => {\n this.projects = data[0];\n this.institutions = data[1];\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private deleteProject(project: Project): Promise {\n return new Promise((resolve, reject) => {\n this._projectsProvider.deleteProject(project)\n .then(() => {\n for (let i = 0; i < this.projects.length; i++) {\n if (this.projects[i].id === project.id) {\n this.projects.splice(i, 1);\n i = this.projects.length;\n }\n }\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","\n \n \n
\n
\n \n
\n
\n \n \n \n {{ isError ? 'close' : 'check' }}\n \n
\n \n {{ (isLoading ? 'Sending_notification_to' : 'Notification_sent_to') | translate }}
\n
{{ user?.firstName + ' ' + user?.lastName }}
\n \n
\n {{ 'Error_unknown' | translate }}\n
\n
\n
\n \n \n
\n
\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { Project, ProjectValidationState, User, User_AcademicInstitution } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-dispatch-page',\n providers: [],\n styleUrls: ['./dispatch.scss'],\n templateUrl: './dispatch.html'\n})\nexport class ProjectsDispatchPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = true;\n public is401: boolean = false;\n public isError: boolean = false;\n\n public project: Project = null;\n public user: User = null;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _dialoger: MatDialog,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._changeDetector.detectChanges();\n this._route.params.subscribe((params: any) => {\n this.loadData(parseInt(params.projectId), parseInt(params.userId))\n .then(() => {\n this.sendNotification()\n .then(() => this.isLoading = false)\n .catch((error: any) => this.onError(error));\n })\n .catch((error: any) => this.onError(error));\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(projectId: number, userId: number): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.fromId(Project, [projectId]),\n this._storage.fromId(User, [userId])\n ])\n .then((data: any[]) => {\n this.project = data[0];\n this.user = data[1];\n\n resolve();\n })\n .catch(reject);\n });\n }\n\n private sendNotification(): Promise {\n return new Promise((resolve, reject) => {\n this.checkRights()\n .then((isAuthorized: boolean) => {\n if (!isAuthorized) {\n reject({status: 401});\n return;\n }\n\n this._projectsProvider.dispatchNotification(this.project, this.user)\n .then(() => resolve())\n .catch(reject);\n })\n .catch(reject);\n });\n }\n\n private checkRights(): Promise {\n return new Promise((resolve, reject) => {\n if (!this.project || !this.user || this.project.projectValidationStateId !== ProjectValidationState.ID_PENDING_VALIDATION) {\n resolve(false);\n return;\n }\n\n Promise.all([\n this._storage.select(User_AcademicInstitution)\n .where('userId').equals(this.currentUser.user.id)\n .and('academicInstitutionId').equals(this.project.academicInstitution1Id)\n .get(1),\n this._storage.select(User_AcademicInstitution)\n .where('userId').equals(this.user.id)\n .and('academicInstitutionId').equals(this.project.academicInstitution1Id)\n .get(1)\n ])\n .then((data: any[]) => {\n resolve(data[0] && data[1] && data[0].isDispatcher && !data[1].isDispatcher);\n })\n .catch(reject);\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n if (error.status === 401) {\n this.is401 = true;\n return;\n }\n\n this.isError = true;\n console.log(error);\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","import { AfterViewInit, ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { Utils } from '../../../_common/providers/utils';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { Project, ProjectValidationState } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-project-state-indicator',\n providers: [],\n styleUrls: ['./project-state-indicator.scss'],\n templateUrl: './project-state-indicator.html'\n})\nexport class ProjectsProjectStateIndicatorComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly STATE_ID_DRAFT: number = ProjectValidationState.ID_DRAFT;\n public readonly STATE_ID_PENDING_VALIDATION: number = ProjectValidationState.ID_PENDING_VALIDATION;\n public readonly STATE_ID_PUBLISHED: number = ProjectValidationState.ID_PUBLISHED;\n public readonly STATE_ID_REFUSED: number = ProjectValidationState.ID_REFUSED;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n @Input() public size: 'normal' | 'big' = 'normal';\n public state: ProjectValidationState = new ProjectValidationState();\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public currentUser: CurrentUser,\n private _projectProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _storage: ModelsStorage,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n private _project: Project = null;\n\n public get project() {\n return this._project;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set project(project: Project) {\n this._project = project;\n this.loadState().catch((error: any) => this.onError(error));\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadState(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(ProjectValidationState).where('id').equals(this._project.projectValidationStateId).get(1)\n .then((state: ProjectValidationState) => {\n this.state = state;\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","
\n
\n {{ state.name }}\n
\n","import { AfterViewInit, Component, Input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { Conf } from '../../../_conf';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport {\n Project,\n ProjectCase_ProjectType,\n ProjectCase_TherapeuticArea,\n ProjectTeamMember\n} from '../../../_common/providers/models';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog } from '@angular/material/dialog';\n\n@Component({\n selector: 'projects-dashboard-overview',\n providers: [],\n styleUrls: ['./dashboard-overview.scss'],\n templateUrl: './dashboard-overview.html'\n})\nexport class ProjectsDashboardOverviewComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public isLoading: boolean = false;\n @Input() public rights: ProjectRights = new ProjectRights(this._utils);\n public listingProgress: number = 0;\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _dialoger: MatDialog,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n private _project: Project = new Project();\n\n public get project() {\n return this._project;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set project(project: Project) {\n this._project = project;\n this.loadData().catch((error: any) => this.onError(error));\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(ProjectCase_ProjectType).where('projectId').equals(this.project.id).get(),\n this._storage.select(ProjectCase_TherapeuticArea).where('projectId').equals(this.project.id).get(),\n this._storage.select(ProjectTeamMember).where('projectId').equals(this.project.id).get()\n ])\n .then((data: any[]) => {\n this.listingProgress = this._projectsProvider.computeListingProgress(\n this.project,\n data[0].length,\n data[1].length,\n data[2].length\n );\n\n resolve();\n })\n .catch(reject);\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n","\n \n \n \n \n
{{ 'Listing_completed_at_x' | translate:{progress: listingProgress} }}
\n
\n \n
\n
\n","\n
\n \n
\n
{{ 'Last_changed' | translate }}\n : {{ project.isRaisingFundsUpdateDate | dateClosest }}
\n {{ (project.isRaisingFunds ? 'Currently_raising_funds' : 'Currently_not_raising_funds') | translate }}
\n
\n
\n \n
\n \n \n
\n \n \n
\n
\n \n \n
\n
\n \n
\n \n
\n
{{ 'Last_changed' | translate }}\n : {{ project.isLeadInvestorIdentifiedUpdateDate | dateClosest }}
\n {{ (project.isLeadInvestorIdentified ? 'Lead_investor_identified' : 'Lead_investor_not_identified_yet') | translate }}
\n
\n
\n \n
\n \n \n
\n \n \n
\n
\n \n \n
\n
\n \n
\n","import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { InfoDialogComponent } from '../../../_common/components/info-dialog/info-dialog';\nimport { Conf } from '../../../_conf';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModuleMenu } from '../../../_common/components/module-content/module-content';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { Project } from '../../../_common/providers/models';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog } from '@angular/material/dialog';\n\n@Component({\n selector: 'projects-dashboard-key-data',\n providers: [],\n styleUrls: ['./dashboard-key-data.scss'],\n templateUrl: './dashboard-key-data.html'\n})\nexport class ProjectsDashboardKeyDataComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public isLoading: boolean = false;\n @Output() public projectChange: EventEmitter = new EventEmitter();\n @Input() public rights: ProjectRights = new ProjectRights(this._utils);\n public menus: ModuleMenu[] = [{\n icon: 'info_outline',\n title: 'Information',\n onClick: () => {\n this.onHelpClicked();\n },\n url: null\n }];\n public isRaisingFundsEditMode: boolean = false;\n public isRaisingFunds: boolean = false;\n public isLeadInvestorIdentifiedEditMode: boolean = false;\n public isLeadInvestorIdentified: boolean = false;\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _dialoger: MatDialog,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n private _project: Project = new Project();\n\n public get project() {\n return this._project;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set project(project: Project) {\n this._project = project;\n this.isRaisingFunds = Boolean(this.project.isRaisingFunds);\n this.isLeadInvestorIdentified = Boolean(this.project.isLeadInvestorIdentified);\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onHelpClicked(): void {\n this._dialoger.open(InfoDialogComponent, {\n data: {\n text: 'Why_these_are_key_data'\n }\n });\n }\n\n public onEditIsRaisingFundsClicked(): void {\n this.isRaisingFundsEditMode = true;\n this.isRaisingFunds = Boolean(this.project.isRaisingFunds);\n }\n\n public onCancelEditIsRaisingFundsClicked(): void {\n this.isRaisingFundsEditMode = false;\n }\n\n public onEditIsLeadInvestorIdentifiedClicked(): void {\n this.isLeadInvestorIdentifiedEditMode = true;\n this.isLeadInvestorIdentified = Boolean(this.project.isLeadInvestorIdentified);\n }\n\n public onCancelEditIsLeadInvestorIdentifiedClicked(): void {\n this.isLeadInvestorIdentifiedEditMode = false;\n }\n\n public onSaveClicked(): void {\n this.isLoading = true;\n this.save()\n .then(() => {\n this.isLoading = false;\n this.isRaisingFundsEditMode = false;\n this.isLeadInvestorIdentifiedEditMode = false;\n this._toaster.open(this._translater.instant('Project_saved'), '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private save(): Promise {\n return new Promise((resolve, reject) => {\n const project: Project = this.project.clone();\n project.isRaisingFunds = this.isRaisingFunds ? 1 : 0;\n project.isLeadInvestorIdentified = this.isLeadInvestorIdentified ? 1 : 0;\n this._projectsProvider.saveProject(project)\n .then((savedProject: Project) => {\n this.project = savedProject;\n this.projectChange.emit(this.project);\n\n resolve();\n })\n .catch(reject);\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n","\n
{{ 'No_data_available_yet' | translate }}
\n \n
\n \n \n
\n
\n
\n
\n
\n
\n
{{ chartData[0].series[chartData[0].series.length - 1].value }}
\n
{{ serie1Name }}
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
{{ chartData[1].series[chartData[1].series.length - 1].value }}
\n
{{ serie2Name }}
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
{{ chartData[2].series[chartData[2].series.length - 1].value }}
\n
{{ serie3Name }}
\n
\n
\n \n \n
\n
\n
\n
\n
\n","import { AfterViewInit, Component, Input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { Conf } from '../../../_conf';\nimport { ProjectChartData, ProjectsProvider } from '../../providers/projects-provider';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { FilesProvider } from '../../../files/providers/files-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { Project } from '../../../_common/providers/models';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog } from '@angular/material/dialog';\n\n@Component({\n selector: 'projects-dashboard-metrics',\n providers: [],\n styleUrls: ['./dashboard-metrics.scss'],\n templateUrl: './dashboard-metrics.html'\n})\nexport class ProjectsDashboardMetricsComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly CHART_HEIGHT: number = 400;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public isLoading: boolean = false;\n @Input() public rights: ProjectRights = new ProjectRights(this._utils);\n public fromDate: string = null;\n public toDate: string = null;\n public chartData: any[] = [];\n public serie1Name: string = this._translater.instant('Details_views');\n public serie2Name: string = this._translater.instant('Unique_investors');\n public serie3Name: string = this._translater.instant('Bookmarks');\n public serie1Color: string = '#005aff';\n public serie2Color: string = '#af00ff';\n public serie3Color: string = '#ff0000';\n public customColors: any[] = [\n {name: this.serie1Name, value: this.serie1Color},\n {name: this.serie2Name, value: this.serie2Color},\n {name: this.serie3Name, value: this.serie3Color}\n ];\n public pieColorScheme: string = 'vivid';\n public viewsChartData: any[] = [];\n public investorsChartData: any[] = [];\n public bookmarksChartData: any[] = [];\n public allData: ProjectChartData = null;\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _filesProvider: FilesProvider,\n private _storage: ModelsStorage,\n private _dialoger: MatDialog,\n private _changesGuard: HasPendingChangesGuard,\n private _router: Router\n ) {\n }\n\n private _project: Project = new Project();\n\n public get project() {\n return this._project;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set project(project: Project) {\n this._project = project;\n if (project) {\n if (!this.fromDate) {\n this.fromDate = project.createDate;\n }\n if (!this.toDate) {\n this.toDate = this._utils.DateToYmdHis(new Date());\n }\n this.loadData().catch((error: any) => this.onError(error));\n } else {\n this.chartData = [];\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public filterData(): void {\n // TODO\n if (this.allData) {\n this.chartData = this.allData.chart.slice();\n this.viewsChartData = this.allData.viewsPie.slice();\n this.investorsChartData = this.allData.investorsPie.slice();\n this.bookmarksChartData = this.allData.favoritesPie.slice();\n } else {\n this.chartData = [];\n this.viewsChartData = [];\n this.investorsChartData = [];\n this.bookmarksChartData = [];\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._projectsProvider.getProjectChartData(this.project, 'week', [this.serie1Name, this.serie2Name, this.serie3Name])\n ])\n .then((data: any[]) => {\n this.allData = data[0];\n this.filterData();\n\n resolve();\n })\n .catch(reject);\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n","\n \n \n
\n
\n\n \n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { ProjectsProvider } from '../../providers/projects-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { Project, ProjectMembership } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-dashboard-page',\n providers: [],\n styleUrls: ['./dashboard.scss'],\n templateUrl: './dashboard.html'\n})\nexport class ProjectsDashboardPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = true;\n public is404: boolean = false;\n public rights: ProjectRights = new ProjectRights(this._utils);\n\n public project: Project = null;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _dialoger: MatDialog,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private _projectsProvider: ProjectsProvider,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._route.params.subscribe((params: any) => {\n this.loadProject(parseInt(params.projectId))\n .then(() => {\n this.loadData()\n .then(() => {\n this._title.setTitle(this.project.name + ' | ' + this.conf.platformName);\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n })\n .catch((error: any) => this.onError(error));\n });\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadProject(projectId: number): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(Project).where('id').equals(projectId).get(1)\n .then((project: Project) => {\n if (!project) {\n reject({status: 404});\n return;\n }\n\n this.project = project;\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n /* 0 */ this._storage.select(ProjectMembership)\n .where('userId').equals(this.currentUser.user.id)\n .and('projectId').equals(this.project.id)\n .get(1)\n ])\n .then((data: any[]) => {\n this.rights.evaluate({\n project: this.project,\n user: this.currentUser.user,\n membership: data[0]\n });\n\n resolve();\n })\n .catch(reject);\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n console.log(error);\n\n if (error.status === 404) {\n this.is404 = true;\n } else {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n }\n}\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { InvestorsRegisterDialogComponent } from '../../../investors/components/register-dialog/register-dialog';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { AcademicInstitution } from '../../../_common/providers/models';\n\n@Component({\n selector: 'investors-home-page',\n providers: [],\n styleUrls: ['./home.scss'],\n templateUrl: './home.html'\n})\nexport class InvestorsHomePageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public institutions: AcademicInstitution[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _route: ActivatedRoute,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this._title.setTitle(this.conf.platformName);\n\n this.loadData()\n .then(() => this.onCreateInvestorAccountClicked()) // pour afficher la popup directement\n .catch((error: any) => this.onError(error));\n\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onCallToAction1Clicked(): void {\n document.querySelector('.section-2').scrollIntoView({\n behavior: 'smooth'\n });\n }\n\n public onCreateInvestorAccountClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(InvestorsRegisterDialogComponent, {\n data: {}\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(AcademicInstitution).where('id').notIn([AcademicInstitution.ID_OTHER, AcademicInstitution.ID_NONE]).get()\n .then((data: AcademicInstitution[]) => {\n this.institutions = data;\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","
\n
\n \n \n \n \n \n
\n
\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { ProjectsRegisterDialogComponent } from '../../../projects/components/register-dialog/register-dialog';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { AcademicInstitution } from '../../../_common/providers/models';\n\n@Component({\n selector: 'projects-home-page',\n providers: [],\n styleUrls: ['./home.scss'],\n templateUrl: './home.html'\n})\nexport class ProjectsHomePageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public institutions: AcademicInstitution[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _route: ActivatedRoute,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this._title.setTitle(this.conf.platformName);\n\n this.loadData()\n .then(() => this.onCreateProjectAccountClicked()) // pour afficher la popup directement\n .catch((error: any) => this.onError(error));\n\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onCreateProjectAccountClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(ProjectsRegisterDialogComponent, {\n data: {}\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(AcademicInstitution).where('id').notIn([AcademicInstitution.ID_OTHER, AcademicInstitution.ID_NONE]).get()\n .then((data: AcademicInstitution[]) => {\n this.institutions = data;\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","
\n
\n \n \n \n \n \n
\n
\n","\n \n \n
\n
\n \n
\n \n\n
\n
\n {{ 'Investor_welcome_title' | translate:{name: currentUser.user.firstName} }}
\n
{{ 'Investor_welcome_subtitle1' | translate }}
\n
\n
\n
\n \n
\n
{{ 'User profile' | translate }}
\n \n
\n \n
\n
{{ company.name }}
\n \n
\n \n
\n
\n
{{ 'Investor_welcome_sections_title' | translate }}:
\n
\n star\n
{{ 'Investor_welcome_section1' | translate }}
\n
\n
\n notifications\n
{{ 'Investor_welcome_section2' | translate }}
\n
\n
\n\n \n \n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport {\n Company,\n DevelopmentPhaseOfInterest,\n InvestorProfile,\n TherapeuticAreaOfInterest\n} from '../../../_common/providers/models';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'investors-welcome-page',\n providers: [],\n styleUrls: ['./welcome.scss'],\n templateUrl: './welcome.html'\n})\nexport class InvestorsWelcomePageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n public investorProfile: InvestorProfile = null;\n public company: Company = null;\n\n private hasTherapeuticAreaOfInterest: TherapeuticAreaOfInterest = null;\n private hasDevelopmentPhaseOfInterest: DevelopmentPhaseOfInterest = null;\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _dialoger: MatDialog,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this.loadData()\n .then(() => {\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public isProfileCompleted(): boolean {\n return this.currentUser.user.email &&\n this.currentUser.user.firstName &&\n this.currentUser.user.lastName &&\n Boolean(this.investorProfile.phone) &&\n Boolean(this.hasTherapeuticAreaOfInterest) &&\n Boolean(this.hasDevelopmentPhaseOfInterest);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n public async loadData(): Promise {\n try {\n this.investorProfile = await this._storage.select(InvestorProfile)\n .where('userId').equals(this.currentUser.user.id).get(1);\n this.company = await this._storage.select(Company)\n .where('id').equals(this.investorProfile.companyId).get(1);\n this.hasTherapeuticAreaOfInterest = await this._storage.select(TherapeuticAreaOfInterest)\n .where('investorProfileId').equals(this.investorProfile.id).get(1);\n this.hasDevelopmentPhaseOfInterest = await this._storage.select(DevelopmentPhaseOfInterest)\n .where('investorProfileId').equals(this.investorProfile.id).get(1);\n } catch (e) {\n this.onError(e);\n }\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","import { Utils } from '../../_common/providers/utils';\nimport { Company, InvestorProfile, User } from '../../_common/providers/models';\n\nexport class CompanyRights {\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _utils: Utils;\n private _params: CompanyRightsParams = null;\n private _add: boolean = false;\n private _see: boolean = false;\n private _edit: boolean = false;\n private _delete: boolean = false;\n\n constructor(\n utils: Utils\n ) {\n this._utils = utils;\n }\n\n public get ADD() {\n return this._add;\n }\n\n public get SEE() {\n return this._see;\n }\n\n public get EDIT() {\n return this._edit;\n }\n\n public get DELETE() {\n return this._delete;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n public evaluate(params: CompanyRightsParams): void {\n this._params = params;\n if (params.user.isAdmin) {\n this.evaluateAdmin();\n } else if (params.user.isInvestor) {\n this.evaluateInvestor();\n } else if (params.user.isGuest) {\n this.evaluateGuest();\n } else if (params.user.isProjectHolder) {\n this.evaluateProjectHolder();\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private evaluateAdmin(): void {\n this._add = true;\n this._see = true;\n this._edit = true;\n this._delete = true;\n }\n\n private evaluateGuest(): void {\n this._add = false;\n this._see = false;\n this._edit = false;\n this._delete = false;\n }\n\n private evaluateInvestor(): void {\n // Investor can see and edit company, if he is linked to it\n const hasCompanyLink = this._params.investorProfile && this._params.investorProfile.companyId === this._params.company.id;\n this._see = hasCompanyLink;\n this._edit = hasCompanyLink;\n this._add = false;\n this._delete = false;\n }\n\n private evaluateProjectHolder(): void {\n this._add = false;\n this._see = true;\n this._edit = false;\n this._delete = false;\n }\n}\n\nexport interface CompanyRightsParams {\n user: User;\n company?: Company;\n investorProfile?: InvestorProfile;\n}\n","\n \n \n
\n
\n \n \n \n \n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ formGroup.nameFormControl.value.length }}\n /{{ investorsProvider.COMPANY_NAME_MAX_LENGTH }}\n \n
\n
\n \n \n \n {{ category.name }}\n \n \n {{ 'Invalid_value' | translate }}\n \n
\n \n \n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ 'No_website_validation' | translate }}\n \n
\n
\n \n {{ 'No_website' | translate }}\n \n
\n
\n \n \n
\n
\n \n {{ 'No_logo' | translate }}\n \n
\n
\n \n
\n \n \n
\n \n \n
\n \n {{ area.name }}\n \n
\n {{ 'Invalid_value' | translate }}\n
\n
\n
\n \n \n
\n \n \n
\n \n {{ phase.name }}\n \n
\n {{ 'Invalid_value' | translate }}\n
\n
\n\n
\n\n \n \n
\n \n \n
\n \n
\n {{ getProjectGroupTypeIcon(item) }}\n {{ item.group.name }}\n
\n \n {{ type.name }}\n \n
\n
\n \n \n
\n
\n {{ 'Invalid_value' | translate }}\n
\n\n
\n\n
\n
{{ 'Investment_range' | translate }}
\n
\n
\n \n \n CHF \n {{ 'Invalid_value' | translate }}\n \n \n \n CHF \n {{ 'Invalid_value' | translate }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ formGroup.investmentCommentFormControl.value.length }}\n /{{ investorsProvider.COMPANY_INVESTMENT_COMMENT_MAX_LENGTH }}\n \n
\n
\n \n {{ 'Intersted_in_partnerships' | translate }}\n \n
\n
\n \n {{ 'Intersted_to_in_licence_a_technology_of_product' | translate }}\n \n
\n
\n \n {{ 'Investing_in_private' | translate }}\n \n
\n
\n \n {{ 'Investing_in_public' | translate }}\n \n
\n
\n\n \n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ contactInformationFormControl.street1FormControl.value.length }}\n /{{ investorsProvider.COMPANY_CONTACT_DEFAULT_TEXT_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ contactInformationFormControl.street2FormControl.value.length }}\n /{{ investorsProvider.COMPANY_CONTACT_DEFAULT_TEXT_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ contactInformationFormControl.cityFormControl.value.length }}\n /{{ investorsProvider.COMPANY_CONTACT_DEFAULT_TEXT_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ contactInformationFormControl.countryFormControl.value.length }}\n /{{ investorsProvider.COMPANY_CONTACT_DEFAULT_TEXT_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ contactInformationFormControl.emailFormControl.value.length }}\n /{{ investorsProvider.COMPANY_CONTACT_EMAIL_MAX_LENGTH }}\n \n
\n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ contactInformationFormControl.phoneFormControl.value.length }}\n /{{ investorsProvider.COMPANY_CONTACT_PHONE_MAX_LENGTH }}\n \n
\n
\n\n \n
\n \n \n {{ 'Invalid_value' | translate }}\n {{ control.firstNameFormControl.value.length }}\n /{{ investorsProvider.COMPANY_CONTACT_NAME_MAX_LENGTH }}\n \n \n \n {{ 'Invalid_value' | translate }}\n {{ control.lastNameFormControl.value.length }}\n /{{ investorsProvider.COMPANY_CONTACT_NAME_MAX_LENGTH }}\n \n \n \n {{ 'Invalid_value' | translate }}\n \n \n \n {{ 'Invalid_value' | translate }}\n {{ control.phoneFormControl.value.length }}\n /{{ investorsProvider.COMPANY_NAME_MAX_LENGTH }}\n \n \n
\n
\n {{ 'No_company_contact' | translate }}\n
\n
\n {{ 'No_contact_validation' | translate }}\n
\n
\n \n
\n
\n \n
\n \n {{ 'Displayed_on_homepage' | translate }}\n \n
\n
\n
\n \n
\n \n \n
\n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { CompanyDataRow, InvestorsProvider } from '../../providers/investors-provider';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport {\n Company,\n Company_DevelopmentPhase,\n Company_ProjectType,\n Company_TherapeuticArea,\n CompanyCompanyCategory,\n CompanyContact,\n DevelopmentPhase,\n InvestorProfile,\n InvestorValidationState,\n ProjectType,\n TherapeuticArea\n} from '../../../_common/providers/models';\nimport { CompanyRights } from '../../providers/company-rights';\nimport { MenuItem } from '../../../_common/components/side-menu/side-menu';\nimport { FormControl, Validators } from '@angular/forms';\nimport { ImageData, InputImageComponent } from '../../../_common/components/input-image/input-image';\nimport { HasPendingChangesGuard } from '../../../_common/guards/has-pending-changes';\nimport { ProjectsProvider, ProjectTypeGoupWithTypes } from '../../../projects/providers/projects-provider';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'investors-edit-company-page',\n providers: [],\n styleUrls: ['./edit-company.scss'],\n templateUrl: './edit-company.html'\n})\nexport class InvestorsEditCompanyPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n @ViewChild(InputImageComponent, {static: false}) public logoComponent: InputImageComponent;\n public logoDisabled = false;\n\n public isLoading = true;\n public isSaveLoading = false;\n public is404 = false;\n public is401 = false;\n\n public backMenu: MenuItem = {\n icon: 'back',\n title: this._translater.instant('Companies'),\n url: '/investors/companies'\n };\n\n public companyData: CompanyDataRow = null;\n\n public formGroup = {\n nameFormControl: new FormControl('', [\n Validators.required,\n Validators.maxLength(this.investorsProvider.COMPANY_NAME_MAX_LENGTH)\n ]),\n descriptionFormControl: new FormControl('', [\n Validators.maxLength(this.investorsProvider.COMPANY_DESCRIPTION_MAX_LENGTH)\n ]),\n websiteFormControl: new FormControl('', [\n Validators.pattern(this.utils.URL_REGEX)\n ]),\n companyCategoryFormControl: new FormControl('', [\n Validators.required,\n Validators.min(1)\n ]),\n therapeuticAreaFormControl: new FormControl('', [\n Validators.min(1)\n ]),\n projectTypeFormControl: new FormControl('', [\n Validators.min(1)\n ]),\n developmentPhaseFormControl: new FormControl('', []),\n investmentCommentFormControl: new FormControl('', [\n Validators.maxLength(this.investorsProvider.COMPANY_INVESTMENT_COMMENT_MAX_LENGTH)\n ])\n };\n\n public investmentRangeFromFormControl: FormControl = new FormControl('', [\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public investmentRangeToFormControl: FormControl = new FormControl('', [\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n\n public contactInformationFormControl: CompanyContactInformationFormControl = {\n street1FormControl: new FormControl('', [\n Validators.maxLength(this.investorsProvider.COMPANY_CONTACT_DEFAULT_TEXT_LENGTH),\n ]),\n street2FormControl: new FormControl('', [\n Validators.maxLength(this.investorsProvider.COMPANY_CONTACT_DEFAULT_TEXT_LENGTH)\n ]),\n cityFormControl: new FormControl('', [\n Validators.required,\n Validators.maxLength(this.investorsProvider.COMPANY_CONTACT_DEFAULT_TEXT_LENGTH)\n ]),\n countryFormControl: new FormControl('', [\n Validators.required,\n Validators.maxLength(this.investorsProvider.COMPANY_CONTACT_DEFAULT_TEXT_LENGTH)\n ]),\n emailFormControl: new FormControl('', [\n Validators.required,\n Validators.maxLength(this.investorsProvider.COMPANY_CONTACT_EMAIL_MAX_LENGTH),\n Validators.email,\n Validators.pattern(this.utils.EMAIL_REGEX),\n ]),\n phoneFormControl: new FormControl('', [\n Validators.maxLength(this.investorsProvider.COMPANY_CONTACT_PHONE_MAX_LENGTH),\n Validators.pattern(this.utils.INTERNATIONAL_PHONE_NUMBER_REGEX)\n ]),\n };\n\n public isInterstedInPartnerships = 0;\n public noLogo = 0;\n public noWebsite = 0;\n public noContactInfos = 0;\n public isInterstedInLicenses = 0;\n public isInvestingInPrivate = 0;\n public isInvestingInPublic = 0;\n public isDisplayedOnHomepage = 0;\n public companyContactExists = true;\n public logoImageData: ImageData = null;\n public companyContactFormControls: CompanyContactFormControl[] = [];\n\n public categories: CompanyCompanyCategory[] = [];\n public therapeuticAreas: TherapeuticArea[] = [];\n public developmentPhases: DevelopmentPhase[] = [];\n public projectTypes: ProjectType[] = [];\n public rights: CompanyRights = new CompanyRights(this.utils);\n public projectTypeGroups: ProjectTypeGoupWithTypes[] = [];\n\n private investorProfile: InvestorProfile = null;\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n public utils: Utils,\n public investorsProvider: InvestorsProvider,\n public projectsProvider: ProjectsProvider,\n private _title: Title,\n private _router: Router,\n private _dialoger: MatDialog,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _changesGuard: HasPendingChangesGuard,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this._route.queryParams.subscribe((params: any) => {\n if (params.backUrl) {\n this.backMenu = {\n icon: 'arrow_back',\n title: params.backTitle || this._translater.instant('Back'),\n url: params.backUrl || '/investors/companies'\n };\n this._changeDetector.detectChanges();\n }\n });\n this._route.params.subscribe((params: any) => {\n this.initPage(parseInt(params.id, 10)).catch((error) => this.onError(error));\n });\n this.navigation.updateMenus();\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onProjectTypeIdChanged(): void {\n this.onFormChanged();\n }\n\n public onAllProjectTypesClicked(): void {\n this.formGroup.projectTypeFormControl.setValue(this.utils.getKeyValues(this.projectTypes, 'id'));\n this.onProjectTypeIdChanged();\n }\n\n public onNoProjectTypesClicked(): void {\n this.formGroup.projectTypeFormControl.setValue([]);\n this.onProjectTypeIdChanged();\n }\n\n public getProjectGroupTypeIcon(groupData: ProjectTypeGoupWithTypes): string {\n const selectedItems: number[] = this.utils.findManyIn(this.formGroup.projectTypeFormControl.value, groupData.types);\n if (selectedItems.length === groupData.types.length) {\n return 'check_box';\n } else if (selectedItems.length === 0) {\n return 'check_box_outline_blank';\n }\n\n return 'indeterminate_check_box';\n }\n\n public onProjectTypeGroupClicked(groupData: ProjectTypeGoupWithTypes): void {\n const selectedItems: ProjectType[] = this.utils.findManyIn(this.companyData.projectTypesIdsOfInterest, groupData.types);\n if (selectedItems.length === groupData.types.length) {\n selectedItems.forEach((item: ProjectType) => {\n this.companyData.projectTypesIdsOfInterest.splice(this.companyData.projectTypesIdsOfInterest.indexOf(item.id), 1);\n });\n } else {\n groupData.types.forEach((type: ProjectType) => {\n if (this.companyData.projectTypesIdsOfInterest.indexOf(type.id) < 0) {\n this.companyData.projectTypesIdsOfInterest.push(type.id);\n }\n });\n }\n\n this.formGroup.projectTypeFormControl.setValue(this.companyData.projectTypesIdsOfInterest);\n }\n\n public onAllTherapeuticAreasClicked(): void {\n this.formGroup.therapeuticAreaFormControl.setValue(this.utils.getKeyValues(this.therapeuticAreas, 'id'));\n }\n\n public onNoTherapeuticAreasClicked(): void {\n this.formGroup.therapeuticAreaFormControl.setValue([]);\n }\n\n public onAllDevelopmentPhasesClicked(): void {\n this.formGroup.developmentPhaseFormControl.setValue(\n this.utils.getKeyValues(this.developmentPhases, 'id')\n );\n }\n\n public onNoDevelopmentPhasesClicked(): void {\n this.formGroup.developmentPhaseFormControl.setValue([]);\n }\n\n public validateFields(): void {\n\n this.companyContactFormControls.forEach((control) => {\n Object.keys(control).forEach((key) => {\n if (control[key] instanceof FormControl) {\n control[key].markAsTouched({onlySelf: true});\n }\n });\n });\n\n if (Object.keys(this.companyContactFormControls).length === 0) {\n this.companyContactExists = false;\n }\n\n Object.keys(this.contactInformationFormControl).forEach((field) => {\n const control = this.contactInformationFormControl[field];\n control.markAsTouched({onlySelf: true});\n });\n\n Object.keys(this.formGroup).forEach((field) => {\n const control = this.formGroup[field];\n control.markAsTouched({onlySelf: true});\n });\n\n this.investmentRangeFromFormControl.markAsTouched({onlySelf: true});\n this.investmentRangeToFormControl.markAsTouched({onlySelf: true});\n\n this.logoComponent.imageFormControl.markAsTouched({onlySelf: true});\n }\n\n public validateRequiredFieldsForAdmin(): void {\n this.formGroup.nameFormControl.markAsTouched({onlySelf: true});\n this.formGroup.companyCategoryFormControl.markAsTouched({onlySelf: true});\n }\n\n public canSave(): boolean {\n let canSave = true;\n for (const formControl of this.companyContactFormControls) {\n if (formControl.firstNameFormControl.invalid\n || formControl.lastNameFormControl.invalid\n || formControl.emailFormControl.invalid\n || formControl.phoneFormControl.invalid) {\n canSave = false;\n }\n }\n\n if (this.currentUser.user.isInvestor) {\n // check if image or noLogo checkbox is set\n // validation check on input-image formControl does not work, because image does not set field value when added\n if (!this.noLogo && !this.logoImageData.new && !this.logoImageData.current) {\n canSave = false;\n }\n if (!this.areContactInfosValid()) {\n canSave = false;\n }\n\n if (Object.keys(this.companyContactFormControls).length === 0) {\n canSave = false;\n }\n\n }\n\n if (this.isLoading\n || this.isSaveLoading\n || this.formGroup.developmentPhaseFormControl.invalid\n || this.formGroup.descriptionFormControl.invalid\n || this.formGroup.companyCategoryFormControl.invalid\n || this.formGroup.websiteFormControl.invalid\n || this.investmentRangeFromFormControl.invalid\n || this.investmentRangeToFormControl.invalid\n || this.formGroup.investmentCommentFormControl.invalid\n || this.formGroup.nameFormControl.invalid\n || this.formGroup.therapeuticAreaFormControl.invalid\n || this.formGroup.projectTypeFormControl.invalid) {\n canSave = false;\n }\n\n return canSave;\n\n }\n\n public onAddCompanyContactFormControl(registerChanges: boolean = true): CompanyContactFormControl {\n const control: CompanyContactFormControl = {\n companyContactId: 0,\n firstNameFormControl: new FormControl('', [\n Validators.required,\n Validators.maxLength(this.investorsProvider.COMPANY_CONTACT_NAME_MAX_LENGTH)\n ]),\n lastNameFormControl: new FormControl('', [\n Validators.required,\n Validators.maxLength(this.investorsProvider.COMPANY_CONTACT_NAME_MAX_LENGTH)\n ]),\n emailFormControl: new FormControl('', [\n Validators.email,\n Validators.required,\n Validators.maxLength(this.investorsProvider.COMPANY_CONTACT_NAME_MAX_LENGTH),\n Validators.pattern(this.utils.EMAIL_REGEX)\n ]),\n phoneFormControl: new FormControl('', [\n Validators.maxLength(this.investorsProvider.COMPANY_CONTACT_PHONE_MAX_LENGTH),\n Validators.pattern(this.utils.INTERNATIONAL_PHONE_NUMBER_REGEX)\n ])\n };\n this.companyContactFormControls.push(control);\n\n this.companyContactExists = true;\n\n if (registerChanges) {\n this.onFormChanged();\n }\n\n return control;\n }\n\n public onRemoveCompanyContact(index: number): void {\n this.companyContactFormControls.splice(index, 1);\n if (this.companyContactFormControls.length === 0) {\n this.companyContactExists = false;\n }\n this.onFormChanged();\n }\n\n public onInvestmentRangeChanged(): void {\n this.investmentRangeFromFormControl.updateValueAndValidity();\n this.investmentRangeToFormControl.updateValueAndValidity();\n }\n\n public onSaveClicked(): void {\n\n if (this.currentUser.user.isInvestor) {\n this.validateFields();\n }\n\n if (this.currentUser.user.isAdmin) {\n this.validateRequiredFieldsForAdmin();\n }\n\n if (!this.canSave()) {\n this._toaster.open(this._translater.instant('Field_validation_failure'), '', {duration: 5000});\n return;\n }\n\n this.isSaveLoading = true;\n this.saveCompany(this.collectData())\n .then((company: Company) => {\n this._changesGuard.unregisterChanges();\n const promise: Promise = this.companyData.company.id ?\n this.initPage(this.companyData.company.id) :\n this._router.navigate(['investors', 'companies', company.id, 'edit']);\n\n if (this.currentUser.user.isInvestor && this.investorProfile.investorValidationStateId === InvestorValidationState.ID_PENDING) {\n this._router.navigate(['welcome']);\n }\n\n promise\n .then(() => {\n this.isSaveLoading = false;\n this._toaster.open(this._translater.instant('Company_saved'), '', {duration: 5000});\n })\n .catch((error) => this.onError(error));\n })\n .catch((error) => this.onError(error));\n }\n\n public onDeleteClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_company'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n this.isLoading = true;\n this.deleteCompany(this.companyData)\n .then(() => {\n this._changesGuard.unregisterChanges();\n const message = this._translater.instant('Company_deleted');\n this._toaster.open(message, '', {duration: 5000});\n this._router.navigate(['investors', 'companies']);\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n public onFormChanged(): void {\n this._changesGuard.registerChanges();\n }\n\n public onCheckboxChanged(): void {\n // enable or disable website field if noWebsite is checked\n if (this.noWebsite) {\n this.formGroup.websiteFormControl.setValue('');\n this.formGroup.websiteFormControl.disable();\n this.formGroup.websiteFormControl.clearValidators();\n } else {\n this.formGroup.websiteFormControl.enable();\n if (this.currentUser.user.isInvestor) {\n this.formGroup.websiteFormControl.setValidators(Validators.required);\n }\n this.formGroup.websiteFormControl.updateValueAndValidity();\n }\n\n // disable logo field and clear image if noLogo is checked\n this.logoDisabled = Boolean(this.noLogo);\n if (this.logoDisabled) {\n this.logoImageData = {current: null, new: null};\n }\n this._changesGuard.registerChanges();\n }\n\n private areContactInfosValid(): boolean {\n if (this.noContactInfos) {\n return true;\n }\n\n for (const control in this.contactInformationFormControl) {\n if (this.contactInformationFormControl[control].invalid) {\n return false;\n }\n }\n\n return true;\n }\n\n private makeCompanyFieldsRequired(): void {\n this.formGroup.therapeuticAreaFormControl.setValidators(Validators.required);\n this.formGroup.therapeuticAreaFormControl.updateValueAndValidity();\n this.formGroup.projectTypeFormControl.setValidators(Validators.required);\n this.formGroup.projectTypeFormControl.updateValueAndValidity();\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private initPage(companyId: number): Promise {\n return new Promise((resolve, reject) => {\n this.isLoading = true;\n this.loadData(companyId)\n .then(() => {\n this._title.setTitle(\n (this.companyData.company.name || this._translater.instant('New_company'))\n + ' | ' + this.conf.platformName\n );\n this.initFormFields();\n this.is401 = !this.rights.EDIT;\n this.isLoading = false;\n\n resolve();\n })\n .catch(reject);\n\n this._changeDetector.detectChanges();\n });\n }\n\n private loadData(companyId: number): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(Company).where('id').equals(companyId).get(1),\n this._storage.select(CompanyContact).where('companyId').equals(companyId).get(),\n this._storage.select(Company_TherapeuticArea).where('companyId').equals(companyId).get(),\n this._storage.select(Company_DevelopmentPhase).where('companyId').equals(companyId).get(),\n this._storage.select(CompanyCompanyCategory).orderBy('ordinal').get(),\n this._storage.select(TherapeuticArea).get(),\n this._storage.select(DevelopmentPhase).orderBy('ordinal').get(),\n this._storage.select(Company_ProjectType).where('companyId').equals(companyId).get(),\n this._storage.select(ProjectType).get(),\n this.projectsProvider.getProjectTypeGroups(),\n this.currentUser.user.isInvestor && this._storage.select(InvestorProfile).where('userId').equals(this.currentUser.user.id).get(1)\n ])\n .then((data: any[]) => {\n // if the companyId was provided and we can't find it, it's a 404\n // otherwise we assume that we are trying to create a new company\n if (!data[0] && companyId > 0) {\n this.is404 = true;\n reject({});\n return;\n }\n\n const company: Company = data[0] || new Company();\n\n this.rights.evaluate({\n user: this.currentUser.user,\n company: data[0],\n investorProfile: this.currentUser.user.isInvestor ? data[10] : null\n });\n this.investorProfile = this.currentUser.user.isInvestor ? data[10] : null;\n this.companyData = {\n company,\n companyCategory: this.utils.findIn(company.companyCompanyCategoryId, data[4]),\n companyContacts: data[1],\n therapeuticAreasOfInterest: data[2],\n therapeuticAreasIdsOfInterest: this.utils.getKeyValues(data[2], 'therapeuticAreaId'),\n developmentPhasesOfInterest: data[3],\n developmentPhasesIdsOfInterest: this.utils.getKeyValues(data[3], 'developmentPhaseId'),\n projectTypesOfInterest: data[7],\n projectTypesIdsOfInterest: this.utils.getKeyValues(data[7], 'projectTypeId'),\n rights: this.rights\n };\n\n this.categories = data[4];\n this.therapeuticAreas = data[5];\n this.developmentPhases = data[6];\n this.projectTypes = data[8];\n this.projectTypeGroups = data[9];\n\n resolve();\n\n })\n .catch(reject);\n });\n }\n\n private initFormFields(): void {\n this.logoImageData = {current: this.companyData.company.logo, new: null};\n this.formGroup.nameFormControl.setValue(this.companyData.company.name || '');\n this.formGroup.descriptionFormControl.setValue(this.companyData.company.description || '');\n this.formGroup.websiteFormControl.setValue(this.companyData.company.website || '');\n this.noWebsite = this.companyData.company.noWebsite;\n if (this.noWebsite) {\n this.formGroup.websiteFormControl.disable();\n }\n this.noLogo = this.companyData.company.noLogo;\n this.logoDisabled = Boolean(this.noLogo);\n this.formGroup.companyCategoryFormControl.setValue(this.companyData.company.companyCompanyCategoryId);\n this.investmentRangeFromFormControl.setValue(\n this.companyData.company.investmentRangeFrom ? this.companyData.company.investmentRangeFrom / 100 : null\n );\n this.investmentRangeToFormControl.setValue(\n this.companyData.company.investmentRangeTo ? this.companyData.company.investmentRangeTo / 100 : null\n );\n this.formGroup.investmentCommentFormControl.setValue(this.companyData.company.investmentComment || '');\n this.isDisplayedOnHomepage = this.companyData.company.isDisplayedOnHomepage;\n this.isInterstedInPartnerships = this.companyData.company.isInterstedInPartnerships;\n this.isInterstedInLicenses = this.companyData.company.isInterstedInLicenses;\n this.isInvestingInPublic = this.companyData.company.isInvestingInPublic;\n this.isInvestingInPrivate = this.companyData.company.isInvestingInPrivate;\n this.formGroup.therapeuticAreaFormControl.setValue(this.companyData.therapeuticAreasIdsOfInterest || []);\n this.formGroup.developmentPhaseFormControl.setValue(this.companyData.developmentPhasesIdsOfInterest || []);\n this.formGroup.projectTypeFormControl.setValue(this.companyData.projectTypesIdsOfInterest || []);\n\n // company contact information form control\n this.noContactInfos = this.companyData.company.noContactInfos;\n this.contactInformationFormControl.street1FormControl.setValue(this.companyData.company.street1 || '');\n this.contactInformationFormControl.street2FormControl.setValue(this.companyData.company.street2 || '');\n this.contactInformationFormControl.cityFormControl.setValue(this.companyData.company.city || '');\n this.contactInformationFormControl.countryFormControl.setValue(this.companyData.company.country || '');\n this.contactInformationFormControl.emailFormControl.setValue(this.companyData.company.email || '');\n this.contactInformationFormControl.phoneFormControl.setValue(this.companyData.company.phone || '');\n\n // make some fields required for investor\n if (this.currentUser.user.isInvestor) {\n this.makeCompanyFieldsRequired();\n this.formGroup.websiteFormControl.setValidators(Validators.required);\n this.formGroup.websiteFormControl.updateValueAndValidity();\n }\n\n this.companyContactFormControls = [];\n for (const contact of this.companyData.companyContacts) {\n const control: CompanyContactFormControl = this.onAddCompanyContactFormControl(false);\n control.companyContactId = contact.id;\n control.firstNameFormControl.setValue(contact.firstName);\n control.lastNameFormControl.setValue(contact.lastName);\n control.emailFormControl.setValue(contact.email);\n control.phoneFormControl.setValue(contact.phone || '');\n }\n }\n\n private checkInvestmentRange(): any {\n if (\n this.investmentRangeFromFormControl\n && this.investmentRangeToFormControl\n && this.investmentRangeFromFormControl.value\n && this.investmentRangeToFormControl.value\n && this.investmentRangeFromFormControl.value > this.investmentRangeToFormControl.value\n ) {\n return {inconsistency: {valid: false}};\n }\n\n return null;\n }\n\n private collectData(): CompanyDataRow {\n const company: Company = this.companyData.company.clone();\n company.name = this.formGroup.nameFormControl.value;\n company.description = this.formGroup.descriptionFormControl.value;\n company.website = this.formGroup.websiteFormControl.value;\n company.noWebsite = Number(this.noWebsite);\n company.logo = this.logoImageData.new ? this.logoImageData.new : this.logoImageData.current;\n company.noLogo = Number(this.noLogo);\n company.companyCompanyCategoryId = this.formGroup.companyCategoryFormControl.value;\n company.investmentRangeFrom = this.investmentRangeFromFormControl.value ?\n this.investmentRangeFromFormControl.value * 100 :\n null;\n company.investmentRangeTo = this.investmentRangeToFormControl.value ?\n this.investmentRangeToFormControl.value * 100 :\n null;\n company.investmentComment = this.formGroup.investmentCommentFormControl.value;\n company.isInterstedInLicenses = this.isInterstedInLicenses;\n company.isInvestingInPrivate = this.isInvestingInPrivate;\n company.isInvestingInPublic = this.isInvestingInPublic;\n company.isInterstedInPartnerships = this.isInterstedInPartnerships;\n company.isDisplayedOnHomepage = this.isDisplayedOnHomepage;\n\n company.street1 = this.contactInformationFormControl.street1FormControl.value;\n company.street2 = this.contactInformationFormControl.street2FormControl.value;\n company.city = this.contactInformationFormControl.cityFormControl.value;\n company.country = this.contactInformationFormControl.countryFormControl.value;\n company.email = this.contactInformationFormControl.emailFormControl.value;\n company.phone = this.contactInformationFormControl.phoneFormControl.value;\n company.noContactInfos = Number(this.noContactInfos);\n\n const contacts: CompanyContact[] = [];\n for (const control of this.companyContactFormControls) {\n const contact: CompanyContact = new CompanyContact();\n contact.id = control.companyContactId;\n contact.firstName = control.firstNameFormControl.value;\n contact.lastName = control.lastNameFormControl.value;\n contact.email = control.emailFormControl.value;\n contact.phone = control.phoneFormControl.value;\n contacts.push(contact);\n }\n\n return {\n company,\n companyCategory: this.utils.findIn(company.companyCompanyCategoryId, this.categories),\n companyContacts: contacts,\n therapeuticAreasOfInterest: this.utils.findManyIn(this.formGroup.therapeuticAreaFormControl.value, this.therapeuticAreas),\n therapeuticAreasIdsOfInterest: this.formGroup.therapeuticAreaFormControl.value,\n developmentPhasesOfInterest: this.utils.findManyIn(this.formGroup.developmentPhaseFormControl.value, this.developmentPhases),\n developmentPhasesIdsOfInterest: this.formGroup.developmentPhaseFormControl.value,\n projectTypesOfInterest: this.utils.findManyIn(this.formGroup.projectTypeFormControl.value, this.projectTypes),\n projectTypesIdsOfInterest: this.formGroup.projectTypeFormControl.value,\n rights: this.companyData.rights\n };\n }\n\n // check if all required fields of the company are set\n // not possible to check formControls, because the required fields are different for investors or admins\n private checkCompanyRequiredFields(companyData: CompanyDataRow): number {\n return Number(!(companyData.company.name === '' || companyData.company.companyCompanyCategoryId === null ||\n (companyData.company.website === '' && companyData.company.noWebsite === 0) ||\n (companyData.company.logo === null && companyData.company.noLogo === 0) ||\n companyData.therapeuticAreasIdsOfInterest.length === 0 ||\n companyData.projectTypesOfInterest.length === 0 ||\n (companyData.company.noContactInfos === 0 &&\n companyData.company.city === '' ||\n companyData.company.country === '' ||\n companyData.company.email === '')\n || companyData.companyContacts.length === 0));\n }\n\n private saveCompany(companyData: CompanyDataRow): Promise {\n // if all required fields of the company are set, then the company is marked as isCompleted\n // if an admin deletes an required field, the company is not completed anymore\n companyData.company.isCompleted = this.checkCompanyRequiredFields(companyData);\n return new Promise((resolve, reject) => {\n this.investorsProvider.saveCompany(companyData.company)\n .then((company: Company) => {\n Promise.all([\n this.investorsProvider.saveCompanyTherapeuticAreas(company.id, companyData.therapeuticAreasIdsOfInterest),\n this.investorsProvider.saveCompanyDevelopmentPhases(company.id, companyData.developmentPhasesIdsOfInterest),\n this.investorsProvider.saveCompanyProjectTypes(company.id, companyData.projectTypesIdsOfInterest),\n this.investorsProvider.saveCompanyContacts(company.id, companyData.companyContacts)\n ])\n .then(() => {\n resolve(company);\n })\n .catch(reject);\n })\n .catch(reject);\n });\n }\n\n private deleteCompany(companyData: CompanyDataRow): Promise {\n return new Promise((resolve, reject) => {\n this.investorsProvider.deleteCompany(companyData.company)\n .then(() => {\n resolve();\n })\n .catch(reject);\n });\n }\n\n private onError(error: any, row: CompanyDataRow = null): void {\n this.isLoading = false;\n this.isSaveLoading = false;\n if (row) {\n row.isLoading = false;\n }\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n\nexport interface CompanyContactFormControl {\n companyContactId: number;\n firstNameFormControl: FormControl;\n lastNameFormControl: FormControl;\n emailFormControl: FormControl;\n phoneFormControl: FormControl;\n}\n\nexport interface CompanyContactInformationFormControl {\n street1FormControl: FormControl;\n street2FormControl: FormControl;\n cityFormControl: FormControl;\n countryFormControl: FormControl;\n emailFormControl: FormControl;\n phoneFormControl: FormControl;\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\n\n@Injectable()\nexport class GuardsSequenceGuard implements CanActivate {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _isReady: boolean = false;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _injector: Injector,\n private _router: Router\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise {\n return new Promise((resolve, reject) => {\n if (route.data._guardsSequence && route.data._guardsSequence.length) {\n const guards: any[] = route.data._guardsSequence.slice();\n this.runGuards(route, state, guards)\n .then((canActivate: boolean) => resolve(canActivate))\n .catch((error) => {\n console.log(error);\n resolve(false);\n });\n } else {\n resolve(true);\n }\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private runGuards(route: ActivatedRouteSnapshot, state: RouterStateSnapshot, guards: any[]): Promise {\n return new Promise((resolve, reject) => {\n if (guards.length === 0) {\n resolve(true);\n return;\n }\n\n const guard: any = this._injector.get(guards[0]);\n guard.canActivate(route, state)\n .then((canActivate) => {\n if (!canActivate) {\n resolve(false);\n return;\n }\n\n guards.splice(0, 1);\n this.runGuards(route, state, guards)\n .then((canActivate) => resolve(canActivate))\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n });\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { Utils } from '../../_common/providers/utils';\n\n@Injectable()\nexport class NotificationsProvider {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n constructor(\n private _utils: Utils,\n ) {\n }\n\n private _notifications: Notification[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n public get notifications() {\n return this._notifications;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public add(notification: Notification): NotificationsProvider {\n if (!this.find(notification.id)) {\n this._notifications.push(notification);\n }\n\n return this;\n }\n\n public remove(id: string): NotificationsProvider {\n for (let i = 0; i < this._notifications.length; i++) {\n if (this._notifications[i].id === id) {\n this._notifications.splice(i, 1);\n return this;\n }\n }\n\n return this;\n }\n\n public clear(): NotificationsProvider {\n this._notifications.length = 0; // https://stackoverflow.com/questions/1232040/how-do-i-empty-an-array-in-javascript\n\n return this;\n }\n\n public replaceAll(notifications: Notification[]): NotificationsProvider {\n this._notifications = notifications;\n\n return this;\n }\n\n public find(id: string): Notification {\n return this._utils.findIn(id, this._notifications, 'id');\n }\n\n //\n //\n // PRIVATE METHODS\n //\n // )\n}\n\nexport interface Notification {\n id: string;\n icon: string;\n title: string;\n text: string;\n legend: string;\n url: string;\n date: string;\n}\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../_common/providers/utils';\nimport { ModelsStorage } from '../../_common/providers/models-storage';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { Notification, NotificationsProvider } from './notifications-provider';\nimport { SyncListener } from '../../_common/providers/sync-service';\n\n@Injectable()\nexport class NotificationsTodosProvider {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _todosCollectors: any[] = []; // a function that return a Promise\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _translater: TranslateService,\n private _utils: Utils,\n private _storage: ModelsStorage,\n private _currentUser: CurrentUser,\n private _notifications: NotificationsProvider\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public getSyncListeners(): SyncListener[] {\n const todoListener: SyncListener = {\n id: '',\n onCommonDataSynced: null,\n onUserDataSynced: () => {\n this.updateTodos();\n }\n };\n\n return [todoListener];\n }\n\n public updateTodos(): Promise {\n return new Promise((resolve, reject) => {\n if (this._currentUser.isLoggedIn()) {\n const promises: Promise[] = [];\n for (let i = 0; i < this._todosCollectors.length; i++) {\n promises.push(this._todosCollectors[i]());\n }\n Promise.all(promises)\n .then((results: any[]) => {\n let notifications: Notification[] = [];\n for (let i = 0; i < results.length; i++) {\n notifications = notifications.concat(results[i]);\n }\n notifications.sort((a: Notification, b: Notification) => {\n return a.date > b.date ? 1 : -1;\n });\n\n this._notifications.replaceAll(notifications);\n resolve();\n })\n .catch((error) => reject(error));\n } else {\n this._notifications.clear();\n resolve();\n }\n });\n }\n\n public registerTodosCollector(collector: any): void {\n this._todosCollectors.push(collector);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","import { Injectable } from '@angular/core';\nimport { Utils } from '../../_common/providers/utils';\nimport { Conf } from '../../_conf';\nimport { ApiBaseService } from '../../_common/providers/api-base-service';\nimport { ModelsStorage } from '../../_common/providers/models-storage';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { SyncListener } from '../../_common/providers/sync-service';\nimport { Discussion, DiscussionMessage, PrivateDiscussion, PrivateDiscussion_User, User } from '../../_common/providers/models';\n\n@Injectable()\nexport class DiscussionsProvider {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n constructor(\n private _conf: Conf,\n private _utils: Utils,\n private _api: ApiBaseService,\n private _storage: ModelsStorage,\n private _currentUser: CurrentUser\n ) {\n\n }\n\n private _privateDiscussionsData: PrivateDiscussionData[] = [];\n\n public get privateDiscussionsData() {\n return this._privateDiscussionsData;\n }\n\n private _activePrivateDiscussions: ActivePrivateDiscussion[] = [];\n\n public get activePrivateDiscussions() {\n return this._activePrivateDiscussions;\n }\n\n private _privateDiscussionsDataWithUnreadMessages: PrivateDiscussionData[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n public get privateDiscussionsDataWithUnreadMessages() {\n return this._privateDiscussionsDataWithUnreadMessages;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public getSyncListeners(): SyncListener[] {\n const privateDiscussionsListener: SyncListener = {\n id: '',\n onCommonDataSynced: null,\n onUserDataSynced: () => {\n this.updatePrivateDiscussions();\n }\n };\n\n return [privateDiscussionsListener];\n }\n\n public updatePrivateDiscussions(): Promise {\n return new Promise((resolve, reject) => {\n this.loadPrivateDiscussionsData()\n .then(() => {\n this.updateActivePrivateDiscussion();\n resolve();\n })\n .catch((error) => console.log(error));\n });\n }\n\n public sendNewMessage(api: string, message: DiscussionMessage): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n api,\n {discussionMessage: message.toJson()},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n message = DiscussionMessage.fromAPI(data.discussionMessage);\n this._storage.save([message])\n .then(() => resolve(message))\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n });\n }\n\n public deleteMessage(api: string, message: DiscussionMessage): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n api,\n {discussionMessage: message.toJson()},\n this._currentUser.getAccessToken()\n )\n .then(() => {\n this._storage.delete([message])\n .then(() => resolve())\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n });\n }\n\n public startGroupDiscussion(group: PrivateDiscussion): Promise {\n return new Promise((resolve, reject) => {\n // on check d'abord dans les discussions active si elle existe\n // si c'est le cas\n // si elle est minimisée, on la maximise\n // sinon on fait rien du tout\n // si c'est pas le cas\n // on check si elle existe déjà dans les discussions disponibles\n // si c'est le cas, on ajoute ses données dans la discussion active qu'on a déjà créée\n // si c'est pas le cas, on retourne une erreur\n for (let i = 0; i < this._activePrivateDiscussions.length; i++) {\n if (this._activePrivateDiscussions[i].data.privateDiscussion.id === group.id) {\n if (this._activePrivateDiscussions[i].isMinimized) {\n this._activePrivateDiscussions[i].isMinimized = false;\n }\n\n this.updateLastSeen(this._privateDiscussionsData[i].privateDiscussion_user)\n .then(() => resolve())\n .catch((error: any) => reject(error));\n return;\n }\n }\n\n for (let i = 0; i < this._privateDiscussionsData.length; i++) {\n if (this._privateDiscussionsData[i].privateDiscussion.id === group.id) {\n this._activePrivateDiscussions.push({\n data: this._privateDiscussionsData[i],\n isMinimized: false,\n isReady: true\n });\n\n this.updateLastSeen(this._privateDiscussionsData[i].privateDiscussion_user)\n .then(() => resolve())\n .catch((error: any) => reject(error));\n return;\n }\n }\n\n reject({status: 404, message: 'Private group discussion not found.'});\n });\n }\n\n public startOneToOneDiscussion(user: User): Promise {\n return new Promise((resolve, reject) => {\n // on check d'abord dans les discussions active si elle existe\n // si c'est le cas\n // si elle est minimisée, on la maximise\n // sinon on fait rien du tout\n // si c'est pas le cas\n // on check si elle existe déjà dans les discussions disponibles\n // si c'est le cas, on ajoute ses données dans la discussion active qu'on a déjà créée\n // si c'est pas le cas\n // on check que l'utilisateur n'ait pas été supprimé\n // si c'est le cas, on retourne une erreur unknown\n // si c'est pas le cas\n // on ajoute une dicussion active sans donnée\n // on créé la discussion via l'api\n // on sauve les données\n // on ajoute les données à la liste des discussions disponibles\n // on ajoute les données dans la discussion active qu'on a déjà créée\n for (let i = 0; i < this._activePrivateDiscussions.length; i++) {\n if (!this._activePrivateDiscussions[i].data.privateDiscussion.isGroup && this._activePrivateDiscussions[i].data.usersData[0].user.id === user.id) {\n if (this._activePrivateDiscussions[i].isMinimized) {\n this._activePrivateDiscussions[i].isMinimized = false;\n }\n\n this.updateLastSeen(this._privateDiscussionsData[i].privateDiscussion_user)\n .then(() => resolve())\n .catch((error: any) => reject(error));\n return;\n }\n }\n\n for (let i = 0; i < this._privateDiscussionsData.length; i++) {\n if (!this._privateDiscussionsData[i].privateDiscussion.isGroup && this._privateDiscussionsData[i].usersData[0].user.id === user.id) {\n this._activePrivateDiscussions.push({\n data: this._privateDiscussionsData[i],\n isMinimized: false,\n isReady: true\n });\n\n this.updateLastSeen(this._privateDiscussionsData[i].privateDiscussion_user)\n .then(() => resolve())\n .catch((error: any) => reject(error));\n return;\n }\n }\n\n if (user.deleteDate) {\n reject({error: 'User has been deleted'});\n return;\n }\n\n const randomId: any = this._utils.randomString(16);\n const tempPrivateDiscussion: PrivateDiscussion = new PrivateDiscussion();\n tempPrivateDiscussion.id = randomId;\n const newDiscussion: ActivePrivateDiscussion = {\n data: {\n privateDiscussion: tempPrivateDiscussion,\n privateDiscussion_user: new PrivateDiscussion_User,\n usersData: [{\n privateDiscussion_user: new PrivateDiscussion_User(),\n user\n }],\n discussion: new Discussion(),\n messages: [],\n unreadMessagesCount: 0\n },\n isMinimized: false,\n isReady: false\n };\n this._activePrivateDiscussions.push(newDiscussion);\n const privateDiscussion: PrivateDiscussion = new PrivateDiscussion();\n privateDiscussion.isGroup = 0;\n privateDiscussion.name = null;\n privateDiscussion.image = null;\n this.savePrivateDiscussion(privateDiscussion, [user.id])\n .then((data: PrivateDiscussionData) => {\n newDiscussion.data = data;\n newDiscussion.isReady = true;\n\n this.updateLastSeen(data.privateDiscussion_user)\n .then(() => {\n resolve();\n })\n .catch((error: any) => reject(error));\n })\n .catch((error) => {\n for (let i = 0; i < this._activePrivateDiscussions.length; i++) {\n if (this._activePrivateDiscussions[i].data.privateDiscussion.id === randomId) {\n this._activePrivateDiscussions.splice(i);\n }\n }\n\n reject(error);\n });\n });\n }\n\n public updateLastSeen(privateDiscussion_user: PrivateDiscussion_User): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'users/' + privateDiscussion_user.userId + '/discussions/' + privateDiscussion_user.privateDiscussionId + '/messages-seen',\n {},\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n privateDiscussion_user = PrivateDiscussion_User.fromAPI(data.privateDiscussion_user);\n this._storage.save([privateDiscussion_user])\n .then(() => {\n for (let i = 0; i < this._privateDiscussionsData.length; i++) {\n if (this._privateDiscussionsData[i].privateDiscussion_user.id === privateDiscussion_user.id) {\n const unreadMessagesCount: number = this.countUnreadMessages(privateDiscussion_user, this._privateDiscussionsData[i].messages);\n let hadUnreadMessages: boolean = false;\n for (let j = 0; !hadUnreadMessages && j < this._privateDiscussionsDataWithUnreadMessages.length; j++) {\n if (this._privateDiscussionsDataWithUnreadMessages[j].privateDiscussion_user.id === privateDiscussion_user.id) {\n hadUnreadMessages = true;\n if (unreadMessagesCount === 0) {\n this._privateDiscussionsDataWithUnreadMessages.splice(j, 1);\n }\n }\n }\n\n if (!hadUnreadMessages && unreadMessagesCount > 0) {\n this._privateDiscussionsDataWithUnreadMessages.push(this._privateDiscussionsData[i]);\n }\n\n this._privateDiscussionsData[i].privateDiscussion_user = privateDiscussion_user;\n this._privateDiscussionsData[i].unreadMessagesCount = unreadMessagesCount;\n resolve(privateDiscussion_user);\n return;\n }\n }\n\n reject({error: 'Failed to update privateDiscussion_user in provider'});\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n public closePrivateDiscussion(activePrivateDiscussion: ActivePrivateDiscussion): void {\n for (let i = 0; i < this._activePrivateDiscussions.length; i++) {\n if (this._activePrivateDiscussions[i].data.privateDiscussion.id === activePrivateDiscussion.data.privateDiscussion.id) {\n this._activePrivateDiscussions.splice(i, 1);\n return;\n }\n }\n }\n\n public savePrivateDiscussion(privateDiscussion: PrivateDiscussion, userIds: number[]): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n 'users/' + this._currentUser.user.id + '/discussions/' + (privateDiscussion.id ? privateDiscussion.id : 0),\n {\n userIds,\n isGroup: privateDiscussion.isGroup ? 1 : 0,\n name: privateDiscussion.name,\n image: privateDiscussion.image\n },\n this._currentUser.getAccessToken()\n )\n .then((data: any) => {\n privateDiscussion = PrivateDiscussion.fromAPI(data.privateDiscussion);\n const privateDiscussion_users: PrivateDiscussion_User[] = PrivateDiscussion_User.fromAPIList(data.privateDiscussion_users);\n const discussion: Discussion = Discussion.fromAPI(data.discussion);\n Promise.all([\n this._storage.save([discussion]),\n this._storage.save([privateDiscussion]),\n this._storage.save(privateDiscussion_users),\n this._storage.select(User).get()\n ])\n .then((storageData: any[]) => {\n const privateDiscussion_user: PrivateDiscussion_User = this._utils.findIn(this._currentUser.user.id, privateDiscussion_users, 'userId');\n let messages: DiscussionMessage[] = [];\n let unreadCount: number = 0;\n let dataIndex: number = -1;\n for (let i = 0; i < this._privateDiscussionsData.length; i++) {\n if (this._privateDiscussionsData[i].privateDiscussion.id === privateDiscussion.id) {\n dataIndex = i;\n messages = this._privateDiscussionsData[i].messages;\n unreadCount = this._privateDiscussionsData[i].unreadMessagesCount;\n i = this._privateDiscussionsData.length;\n }\n }\n const usersData: PrivateDiscussionUserData[] = [];\n for (let j = 0; j < privateDiscussion_users.length; j++) {\n if (privateDiscussion_users[j].userId !== this._currentUser.user.id) {\n usersData.push({\n user: this._utils.findIn(privateDiscussion_users[j].userId, storageData[3], 'id'),\n privateDiscussion_user: privateDiscussion_users[j]\n });\n }\n }\n const privateDiscussionData: PrivateDiscussionData = {\n privateDiscussion,\n privateDiscussion_user,\n usersData,\n discussion,\n messages,\n unreadMessagesCount: unreadCount\n };\n if (dataIndex >= 0) {\n this._privateDiscussionsData.push(privateDiscussionData);\n } else {\n this._privateDiscussionsData.splice(0, 0, privateDiscussionData);\n }\n\n resolve(privateDiscussionData);\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadPrivateDiscussionsData(): Promise {\n return new Promise((resolve, reject) => {\n if (!this._currentUser.isLoggedIn()) {\n this._privateDiscussionsData = [];\n resolve();\n return;\n }\n\n this._storage.select(PrivateDiscussion_User).where('userId').equals(this._currentUser.user.id).get()\n .then((privateDiscussion_users: PrivateDiscussion_User[]) => {\n const privateDiscussionIds: number[] = this._utils.getKeyValues(privateDiscussion_users, 'privateDiscussionId');\n Promise.all([\n this._storage.fromIds(PrivateDiscussion, privateDiscussionIds),\n this._storage.select(PrivateDiscussion_User)\n .where('privateDiscussionId').in(privateDiscussionIds)\n .and('userId').notEquals(this._currentUser.user.id)\n .get()\n ])\n .then((data1: any[]) => {\n const discussionIds: number[] = this._utils.getKeyValues(data1[0], 'discussionId');\n const userIds: number[] = this._utils.getKeyValues(data1[1], 'userId', true);\n Promise.all([\n this._storage.fromIds(Discussion, discussionIds),\n this._storage.select(DiscussionMessage).where('discussionId').in(discussionIds).get(),\n this._storage.fromIds(User, userIds, true)\n ])\n .then((data2: any[]) => {\n const data: PrivateDiscussionData[] = [];\n const unreadData: PrivateDiscussionData[] = [];\n for (let i = 0; i < data1[0].length; i++) {\n const usersData: PrivateDiscussionUserData[] = [];\n for (let j = 0; j < data1[1].length; j++) {\n if (data1[1][j].privateDiscussionId === data1[0][i].id) {\n usersData.push({\n user: this._utils.findIn(data1[1][j].userId, data2[2], 'id'),\n privateDiscussion_user: data1[1][j]\n });\n }\n }\n\n const privateDiscussion_user: PrivateDiscussion_User = this._utils.findIn(data1[0][i].id, privateDiscussion_users, 'privateDiscussionId');\n const messages: DiscussionMessage[] = this._utils.findManyIn([data1[0][i].discussionId], data2[1], 'discussionId');\n const unreadMessagesCount: number = this.countUnreadMessages(privateDiscussion_user, messages);\n const privateDiscussionData: PrivateDiscussionData = {\n privateDiscussion: data1[0][i],\n privateDiscussion_user,\n usersData,\n discussion: this._utils.findIn(data1[0][i].discussionId, data2[0], 'id'),\n messages,\n unreadMessagesCount\n };\n data.push(privateDiscussionData);\n if (unreadMessagesCount > 0) {\n unreadData.push(privateDiscussionData);\n }\n }\n\n this._privateDiscussionsData = this.sortPrivateDiscussionsData(data);\n this._privateDiscussionsDataWithUnreadMessages = unreadData;\n resolve();\n })\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n })\n .catch((error) => reject(error));\n });\n }\n\n private updateActivePrivateDiscussion(): void {\n let i: number = 0;\n while (i < this._activePrivateDiscussions.length) {\n let found: boolean = false;\n for (let j = 0; !found && j < this._privateDiscussionsData.length; j++) {\n if (this._privateDiscussionsData[j].privateDiscussion.id === this._activePrivateDiscussions[i].data.privateDiscussion.id) {\n found = true;\n this._activePrivateDiscussions[i].data = this._privateDiscussionsData[j];\n }\n }\n\n if (!found) {\n this._activePrivateDiscussions.splice(i, 1);\n } else {\n i++;\n }\n }\n }\n\n private countUnreadMessages(privateDiscussion_user: PrivateDiscussion_User, messages: DiscussionMessage[]): number {\n if (!privateDiscussion_user.lastSeen) {\n return messages.length;\n }\n\n let count: number = 0;\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].createDate > privateDiscussion_user.lastSeen) {\n count++;\n }\n }\n\n return count;\n }\n\n private sortPrivateDiscussionsData(data: PrivateDiscussionData[]): PrivateDiscussionData[] {\n data.sort((a: PrivateDiscussionData, b: PrivateDiscussionData) => {\n let aDate: string = a.privateDiscussion.createDate;\n if (a.messages.length > 0) {\n aDate = a.messages[a.messages.length - 1].createDate;\n }\n let bDate: string = b.privateDiscussion.createDate;\n if (b.messages.length > 0) {\n bDate = b.messages[b.messages.length - 1].createDate;\n }\n\n return aDate < bDate ? 1 : -1;\n });\n\n return data;\n }\n}\n\nexport interface PrivateDiscussionUserData {\n user: User;\n privateDiscussion_user: PrivateDiscussion_User;\n}\n\nexport interface PrivateDiscussionData {\n privateDiscussion: PrivateDiscussion;\n privateDiscussion_user: PrivateDiscussion_User;\n usersData: PrivateDiscussionUserData[];\n discussion: Discussion;\n messages: DiscussionMessage[];\n unreadMessagesCount: number;\n}\n\nexport interface ActivePrivateDiscussion {\n data: PrivateDiscussionData;\n isMinimized: boolean;\n isReady: boolean;\n}\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { Conf } from '../../_conf';\nimport { SyncListener, SyncServiceProvider } from '../providers/sync-service';\nimport { CurrentUser } from '../providers/current-user';\nimport { LangsProvider } from '../providers/langs-provider';\nimport { NotificationsTodosProvider } from '../../notifications/providers/todos-provider';\nimport { DiscussionsProvider } from '../../discussions/providers/discussions-provider';\n\n@Injectable()\nexport class IsAppReadyGuard implements CanActivate {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n private _isReady: boolean = false;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _translater: TranslateService,\n private _currentUser: CurrentUser,\n private _router: Router,\n private _sync: SyncServiceProvider,\n private _conf: Conf,\n private _langs: LangsProvider,\n private _todos: NotificationsTodosProvider,\n private _discussions: DiscussionsProvider\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise {\n return new Promise((resolve, reject) => {\n if (this._isReady) {\n resolve(true);\n } else {\n this.initI18n();\n this._currentUser.tryLoginFromRemember()\n .then(() => {\n this._sync.start()\n .then(() => {\n Promise.all([\n this.initTodos(),\n this.initDiscussions()\n ])\n .then(() => {\n this.onReady();\n resolve(true);\n })\n .catch((error: any) => {\n this.onReady();\n resolve(true);\n });\n })\n .catch((error) => {\n this.onReady();\n resolve(true);\n });\n });\n }\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private onReady(): void {\n this._translater.use(this._langs.getBestLangCode());\n this._isReady = true;\n }\n\n private initI18n(): void {\n this._translater.addLangs(this._langs.getLangCodes());\n this._translater.setDefaultLang(this._conf.defaultLang.code);\n this._translater.use(this._langs.getBestLangCode());\n }\n\n private registerSyncListeners(): void {\n let listeners: SyncListener[] = this._todos.getSyncListeners();\n listeners = listeners.concat(this._discussions.getSyncListeners());\n for (let i = 0; i < listeners.length; i++) {\n this._sync.addSyncListener(listeners[i]);\n }\n }\n\n private initTodos(): Promise {\n return new Promise((resolve, reject) => {\n this._todos.updateTodos();\n const listeners: SyncListener[] = this._todos.getSyncListeners();\n for (let i = 0; i < listeners.length; i++) {\n this._sync.addSyncListener(listeners[i]);\n }\n\n resolve();\n });\n }\n\n private initDiscussions(): Promise {\n return new Promise((resolve, reject) => {\n this._discussions.updatePrivateDiscussions();\n const listeners: SyncListener[] = this._discussions.getSyncListeners();\n for (let i = 0; i < listeners.length; i++) {\n this._sync.addSyncListener(listeners[i]);\n }\n\n resolve();\n });\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlSegment } from '@angular/router';\nimport { CurrentUser } from '../providers/current-user';\n\n@Injectable()\nexport class IsLoggedInGuard implements CanActivate {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _currentUser: CurrentUser,\n private _router: Router\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise {\n return new Promise((resolve, reject) => {\n if (this._currentUser.isLoggedIn()) {\n resolve(true);\n } else {\n this._currentUser.tryLoginFromRemember()\n .then((isLoggedIn) => {\n if (!isLoggedIn) {\n this.redirect(route);\n }\n resolve(isLoggedIn);\n })\n .catch((error) => {\n this.redirect(route);\n resolve(false);\n });\n }\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private redirect(route: ActivatedRouteSnapshot): void {\n const urlSegments: string[] = [];\n route.url.forEach((segment: UrlSegment) => urlSegments.push(segment.path));\n this._router.navigate([], {\n queryParams: {\n promptLogin: true,\n nextUrl: urlSegments.join('/')\n }\n });\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { CurrentUser } from '../providers/current-user';\nimport { IsLoggedInGuard } from './is-logged-in';\n\n@Injectable()\nexport class IsAdminGuard implements CanActivate {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _currentUser: CurrentUser,\n private _isLoggedIn: IsLoggedInGuard,\n private _router: Router\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise {\n return new Promise((resolve, reject) => {\n this._isLoggedIn.canActivate(route, state)\n .then((isLoggedIn) => {\n if (isLoggedIn && this._currentUser.user.isAdmin) {\n resolve(true);\n } else if (isLoggedIn) {\n this.redirect();\n resolve(false);\n } else {\n resolve(false);\n }\n })\n .catch((error) => {\n this.redirect();\n resolve(false);\n });\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private redirect(): void {\n this._router.navigate(['401']);\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { IsLoggedInGuard } from '../../_common/guards/is-logged-in';\n\n@Injectable()\nexport class UsersCanEditUserGuard implements CanActivate {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _currentUser: CurrentUser,\n private _isLoggedIn: IsLoggedInGuard,\n private _router: Router\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise {\n return new Promise((resolve, reject) => {\n this._isLoggedIn.canActivate(route, state)\n .then((isLoggedIn) => {\n const userId: number = this.getUserId(route);\n\n if (isLoggedIn && (this._currentUser.user.id === userId || this._currentUser.user.isAdmin)) {\n resolve(true);\n } else if (isLoggedIn) {\n this.redirect();\n resolve(false);\n } else {\n resolve(false);\n }\n })\n .catch((error) => {\n this.redirect();\n resolve(false);\n });\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private redirect(): void {\n this._router.navigate(['401']);\n }\n\n private getUserId(route: ActivatedRouteSnapshot): number {\n if (route.params.userId) {\n return parseInt(route.params.userId, 10);\n }\n\n return null;\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, ParamMap, Router, RouterStateSnapshot } from '@angular/router';\nimport { Conf } from '../../_conf';\nimport { CurrentUser } from '../providers/current-user';\n\n@Injectable()\nexport class HasHomepageRedirectGuard implements CanActivate {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _router: Router,\n private _conf: Conf,\n private _currentUser: CurrentUser\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise {\n return new Promise((resolve, reject) => {\n if (!this._currentUser.isLoggedIn() && this._conf.homepageRedirect) {\n this.redirect(route.queryParamMap);\n resolve(false);\n }\n\n resolve(true);\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private redirect(params: ParamMap): void {\n // on fait tout ce schmiblik de paramètre pour les conserver dans le cas\n // où l'utilisateur aurait cliqué sur un lien de renouvellement de mot de passe\n let paramsString: string = '';\n if (params && params.keys.length > 0) {\n const items: string[] = [];\n for (let i = 0; i < params.keys.length; i++) {\n items.push([params.keys[i]] + '=' + params.get(params.keys[i]));\n }\n\n paramsString = '?' + items.join('&');\n }\n\n this._router.navigateByUrl(this._conf.homepageRedirect + paramsString);\n }\n\n}\n","

{{ 'Invite_user' | translate }}

\n\n
\n
\n \n \n {{ 'Field_required' | translate }}\n \n \n \n {{ 'Field_required' | translate }}\n \n
\n
\n \n \n {{ 'Field_required' | translate }}\n {{ 'Field_invalid_email' | translate }}\n \n
\n
\n

{{ 'Project_invite_user_info' | translate }}

\n
\n\n \n \n\n\n","import { Component, Inject } from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\nimport { User } from '../../_common/providers/models';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'projects-invite-user-dialog',\n providers: [],\n styleUrls: ['invite-user-dialog.scss'],\n templateUrl: 'invite-user-dialog.html'\n})\nexport class InviteUserDialogComponent {\n\n public readonly NAME_MAX_LENGTH: number = 200;\n\n /**\n * @see https://stackoverflow.com/questions/47884655/display-custom-validator-error-with-mat-error\n *\n * @type {FormGroup}\n */\n public inviteUserForm: FormGroup;\n public submitted = false;\n public user: User = {} as User;\n\n constructor(\n public dialog: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) public data,\n private fb: FormBuilder,\n ) {\n this.inviteUserForm = this.fb.group({\n firstName: new FormControl('', [Validators.required, Validators.maxLength(this.NAME_MAX_LENGTH)]),\n lastName: new FormControl('', [Validators.required, Validators.maxLength(this.NAME_MAX_LENGTH)]),\n email: new FormControl('', [Validators.required, Validators.email, Validators.maxLength(this.NAME_MAX_LENGTH)])\n });\n }\n\n get f() {\n return this.inviteUserForm.controls;\n }\n\n public onInviteClicked(): void {\n this.submitted = true;\n\n if (this.inviteUserForm.invalid) {\n return;\n }\n\n // update user model (bind form values to user model)\n this.updateUser(this.inviteUserForm.value);\n\n this.dialog.close(this.user);\n }\n\n updateUser(values: Object) {\n Object.assign(this.user, values);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiBaseService } from '../../_common/providers/api-base-service';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { Project, ProjectMembership, User } from '../../_common/providers/models';\nimport { ProjectRights } from '../../projects/providers/project-rights';\nimport { ModelsStorage } from '../../_common/providers/models-storage';\n\n@Injectable()\nexport class ProjectsMembershipsProvider {\n\n constructor(\n private _api: ApiBaseService,\n private _currentUser: CurrentUser,\n private _storage: ModelsStorage\n ) {\n\n }\n\n remove(membership: ProjectMembership): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'delete',\n 'projects/' + membership.projectId + '/memberships/' + membership.userId + '',\n {},\n this._currentUser.getAccessToken()\n )\n .then((result) => {\n this._storage.delete([membership])\n .then(() => resolve(result))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n}\n\nexport interface ProjectMembershipRow {\n user?: User;\n project?: Project;\n membership: ProjectMembership;\n rights: ProjectRights;\n isLoading?: boolean;\n}\n","\n \n \n \n \n {{ 'Name' | translate }}\n \n {{row.user.firstName}} {{row.user.lastName}}\n  error_outline\n \n \n \n \n \n {{ 'Email' | translate }}\n {{row.user.email}}\n \n \n {{ 'Added_date' | translate }}\n {{row.membership.createDate | date:'mediumDate' }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n","import { AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport { SimpleMatDataSource } from '../../../_common/providers/simple-mat-data-source';\nimport { ProjectMembershipRow, ProjectsMembershipsProvider } from '../../providers/projects-memberships-provider';\nimport { ActivatedRoute } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ModuleMenu } from '../../../_common/components/module-content/module-content';\nimport { Utils } from '../../../_common/providers/utils';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ProjectsProvider } from '../../../projects/providers/projects-provider';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MatDialog } from '@angular/material/dialog';\n\n@Component({\n selector: 'project-membership-list',\n providers: [],\n styleUrls: ['./list.scss'],\n templateUrl: './list.html'\n})\nexport class ProjectMembershipListComponent implements OnInit, AfterViewInit {\n public dataSource = new SimpleMatDataSource([]);\n public displayedColumns: string[] = ['name', 'email', 'createDate', 'action'];\n public project;\n\n @ViewChild(MatPaginator, {static: true}) public paginator: MatPaginator;\n @ViewChild(MatSort, {static: true}) public sorter: MatSort;\n @Output() public onAddMembershipClicked: EventEmitter = new EventEmitter();\n @Input() public canAddMembership: boolean = false;\n public addMembershipMenu: ModuleMenu = {\n icon: 'add',\n title: 'Invite_user',\n onClick: () => this.onAddMembershipClicked.emit(),\n url: null\n };\n @Output() public onDeleteClicked: EventEmitter = new EventEmitter();\n private projectId: number;\n private projectsMembershipsProvider: ProjectsMembershipsProvider;\n\n constructor(\n public _projectsProvider: ProjectsProvider,\n public currentUser: CurrentUser,\n private _route: ActivatedRoute,\n private _toaster: MatSnackBar,\n private _translater: TranslateService,\n private _utils: Utils,\n private _dialoger: MatDialog,\n projectsMembershipsProvider: ProjectsMembershipsProvider\n ) {\n this.projectsMembershipsProvider = projectsMembershipsProvider;\n }\n\n @Input()\n set projectMemberships(projectMemberships: ProjectMembershipRow[]) {\n this.dataSource.replaceAllWith(projectMemberships);\n }\n\n public ngAfterViewInit() {\n\n }\n\n public ngOnInit() {\n this._route.params.subscribe((params: any) => {\n this.projectId = +params.projectId;\n });\n\n this.initDataSource();\n\n this.project = this._projectsProvider.getProject(this.projectId).then((result) => {\n this.project = result;\n });\n }\n\n public onDataSortChange(event: any): void {\n this.dataSource.sortBy(event.active, event.direction);\n }\n\n private initDataSource(): void {\n this.dataSource.paginator = this.paginator;\n this.dataSource.sort = this.sorter;\n\n this.dataSource.addSortDefinition(\n 'name',\n (a: ProjectMembershipRow, b: ProjectMembershipRow) => this._utils.sortRow(a.user.firstName.toLowerCase() + a.user.lastName.toLowerCase(), b.user.firstName.toLowerCase() + b.user.lastName.toLowerCase()),\n (a: ProjectMembershipRow, b: ProjectMembershipRow) => this._utils.sortRow(b.user.firstName.toLowerCase() + b.user.lastName.toLowerCase(), a.user.firstName.toLowerCase() + a.user.lastName.toLowerCase())\n );\n\n this.dataSource.addSortDefinition(\n 'email',\n (a: ProjectMembershipRow, b: ProjectMembershipRow) => this._utils.sortRow(a.user.email.toLowerCase(), b.user.email.toLowerCase()),\n (a: ProjectMembershipRow, b: ProjectMembershipRow) => this._utils.sortRow(b.user.email.toLowerCase(), a.user.email.toLowerCase())\n );\n\n this.dataSource.addSortDefinition(\n 'createDate',\n (a: ProjectMembershipRow, b: ProjectMembershipRow) => this._utils.sortRow(a.membership.createDate, b.membership.createDate),\n (a: ProjectMembershipRow, b: ProjectMembershipRow) => this._utils.sortRow(b.membership.createDate, a.membership.createDate)\n );\n }\n}\n","\n \n
\n
\n \n \n \n \n \n \n
\n
\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { MenuItem } from '../../../_common/components/side-menu/side-menu';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { ProjectRights } from '../../providers/project-rights';\nimport { Project, ProjectMembership, User } from '../../../_common/providers/models';\nimport { InviteUserDialogComponent } from '../../../project-membership/invite-user-dialog/invite-user-dialog';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { UsersProvider } from '../../../users/providers/users-provider';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport {\n ProjectMembershipRow,\n ProjectsMembershipsProvider\n} from '../../../project-membership/providers/projects-memberships-provider';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'projects-memberships-page',\n providers: [],\n styleUrls: ['./memberships.scss'],\n templateUrl: './memberships.html'\n})\nexport class ProjectsMembershipsPageComponent implements AfterViewInit {\n public isLoading: boolean = true;\n public is404: boolean = false;\n\n public backMenu: MenuItem = null;\n public backUrl: string = null;\n public backTitle: string = this._translater.instant('Back');\n\n public rights: ProjectRights = new ProjectRights(this._utils);\n public projectMemberships: ProjectMembershipRow[] = [];\n public project: Project = null;\n private _membership: ProjectMembership = null;\n\n private projectId: number;\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _utils: Utils,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage,\n private _route: ActivatedRoute,\n private _router: Router,\n private dialog: MatDialog,\n private _projectMembershipsProvider: ProjectsMembershipsProvider,\n private userProvider: UsersProvider,\n private _toaster: MatSnackBar,\n ) {\n }\n\n public ngAfterViewInit() {\n this._route.params.subscribe((params: any) => {\n this.projectId = +params.projectId;\n this.isLoading = true;\n this.loadData()\n .then(() => {\n this._title.setTitle(this.project.name + ' | ' + this.conf.platformName);\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n });\n this._route.queryParams.subscribe((params: any) => {\n if (params.backUrl) {\n this.backUrl = params.backUrl;\n if (params.backTitle) {\n this.backTitle = params.backTitle;\n } else {\n this.backTitle = this._translater.instant('Back');\n }\n this.backMenu = {\n icon: 'arrow_back',\n title: this.backTitle,\n url: this.backUrl\n };\n }\n });\n\n this.navigation.updateMenus();\n this._changeDetector.detectChanges();\n }\n\n public onDeleteClicked(row: ProjectMembershipRow) {\n const dialog: MatDialogRef = this.dialog.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'ProjectConfirmDeleteMembership',\n confirmActionText: 'Delete',\n confirmColor: 'warn'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n row.isLoading = true;\n this._projectMembershipsProvider.remove(row.membership)\n .then((result) => {\n for (let i = 0; i < this.projectMemberships.length; i++) {\n if (this.projectMemberships[i].user.id === row.user.id) {\n this.projectMemberships.splice(i, 1);\n i = this.projectMemberships.length;\n }\n }\n this.projectMemberships = this.projectMemberships.slice();\n this._toaster.open(this._translater.instant('Project_membership_deleted'), '', {duration: 5000});\n row.isLoading = false;\n if (row.membership.userId === this.currentUser.user.id) {\n window.location.href = '';\n }\n })\n .catch((error) => {\n this._toaster.open(error.error.message, '', {duration: 5000});\n });\n }\n });\n }\n\n /**\n * Open a dialog to add a user to the users project.\n */\n inviteUserDialog(): void {\n const dialogRef = this.dialog.open(InviteUserDialogComponent, {\n width: '412px',\n data: {\n projectId: this.projectId\n }\n });\n\n dialogRef.afterClosed().subscribe((data: User) => {\n if (data) {\n this.isLoading = true;\n this.userProvider.invite(data, this.projectId)\n .then((result: any) => {\n const rights: ProjectRights = new ProjectRights(this._utils);\n rights.evaluate({\n membership: this._membership,\n project: this.project,\n user: this.currentUser.user\n });\n this.projectMemberships.push({\n membership: result.membership,\n project: this.project,\n user: result.user,\n rights\n });\n this.projectMemberships = this.projectMemberships.slice();\n\n const message = result.isNewUser ? 'Invitation_link_sent' : 'User_successfully_added';\n this._toaster.open(this._translater.instant(message), '', {duration: 5000});\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n }\n });\n }\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(User).get(),\n this._storage.select(ProjectMembership).where('projectId').equals(this.projectId).get(),\n this._storage.fromId(Project, [this.projectId]),\n this._storage.select(ProjectMembership)\n .where('userId').equals(this.currentUser.user.id)\n .and('projectId').equals(this.projectId)\n .get(1)\n ])\n .then((data: any[]) => {\n this.project = data[2];\n if (!this.project) {\n reject({status: 404});\n return;\n }\n\n const rows: ProjectMembershipRow[] = [];\n data[1].forEach((membership: ProjectMembership, i: number) => {\n const rights: ProjectRights = new ProjectRights(this._utils);\n rights.evaluate({\n membership: data[3],\n project: this.project,\n user: this.currentUser.user\n });\n rows.push({\n membership,\n project: this.project,\n user: this._utils.findIn(membership.userId, data[0]),\n rights\n });\n });\n this.projectMemberships = rows;\n\n this._membership = data[3];\n this.rights.evaluate({\n user: this.currentUser.user,\n project: this.project,\n membership: this._membership\n });\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n\n if (error.status === 404) {\n this.is404 = true;\n } else if (error.status === 422 && error.error && error.error.errors && error.error.errors.email) {\n this._toaster.open(this._translater.instant('User_cannot_be_added_to_project_error'), '', {duration: 7500});\n } else if (error.status === 400) {\n this._toaster.open(this._translater.instant('User_is_already_member'), '', {duration: 7500});\n } else {\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({name: 'myStripHttp'})\nexport class MyStripHttpPipe implements PipeTransform {\n constructor() {\n }\n\n public transform(str: string) {\n if (str.startsWith('https')) {\n return str.substring(8);\n }\n if (str.startsWith('http')) {\n return str.substring(7);\n }\n\n return str;\n }\n}\n","\n\n
\n
\n 0 ? (filteredCompanyCategories.length === 1 ? filteredCompanyCategories[0].name : 'n_categories_of_company' | translate:{count: filteredCompanyCategories.length}) : null\">\n
\n \n
{{ category.name }}
\n
\n
\n
\n \n \n
\n
\n 0 ? (filteredProjectTypes.length === 1 ? filteredProjectTypes[0].name : 'n_types_of_project' | translate:{count: filteredProjectTypes.length}) : null\">\n
\n
\n
\n {{ getGroupCheckboxIcon(group.types, filteredProjectTypes) }}\n {{ group.group.name }}\n
\n \n
{{ type.name }}
\n
\n
\n
\n
\n \n \n
\n
\n 0 ? (filteredTherapeuticAreas.length === 1 ? filteredTherapeuticAreas[0].name : 'n_therapeutic_areas' | translate:{count: filteredTherapeuticAreas.length}) : null\">\n
\n \n
{{ area.name }}
\n
\n
\n
\n \n \n
\n
\n 0 ? (filteredDevelopmentPhases.length === 1 ? filteredDevelopmentPhases[0].name : 'n_therapeutic_areas' | translate:{count: filteredDevelopmentPhases.length}) : null\">\n
\n \n
{{ phase.name }}
\n
\n
\n
\n \n \n
\n
\n \n
\n
\n
{{ 'Investment_range' | translate }}
\n
\n \n \n CHF \n {{ 'Invalid_value' | translate }}\n \n \n \n CHF \n {{ 'Invalid_value' | translate }}\n \n
\n
\n
\n
{{ 'Seeking_partnerships' | translate }}
\n \n
{{ 'Yes' | translate }}
\n
\n \n
{{ 'No' | translate }}
\n
\n
\n
\n
{{ 'Out_licensing_opportunities' | translate }}
\n \n
{{ 'Yes' | translate }}
\n
\n \n
{{ 'No' | translate }}
\n
\n
\n
\n
{{ 'Investing_in' | translate }}
\n \n
{{ 'Private_companies' | translate }}
\n
\n \n
{{ 'Public_companies' | translate }}
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n 1\">\n {{ 'Company_search_results' | translate:{count: dataSource.filteredData.length} }}\n \n \n {{ 'Company_search_result' | translate }}\n \n \n {{ 'Company_search_no_results' | translate }}\n \n \n
\n \n \n search\n \n
\n
\n 0) || !isReady\"\n [mainActions]=\"isAddEnabled ? [addMenu] : []\"\n [title]=\"title\">\n
\n

{{ noDataMessage | translate }}

\n
\n 0\"\n [dataSource]=\"dataSource\"\n matSort>\n \n \n \n \n \n \n \n \n \n {{ 'Name' | translate }}\n \n
\n {{ row.company.name }}\n
\n
\n
\n \n {{ 'Category' | translate }}\n \n {{ row.companyCategory.name }}\n \n \n \n {{ 'Website' | translate }}\n \n \n {{ row.company.website | myStripHttp }}\n \n \n \n \n \n \n \n home\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { FormControl } from '@angular/forms';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { SimpleMatDataSource } from '../../../_common/providers/simple-mat-data-source';\nimport { Utils } from '../../../_common/providers/utils';\nimport { CompanyDataRow, InvestorFiltersState, InvestorsProvider } from '../../providers/investors-provider';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport {\n Alert,\n Company,\n Company_DevelopmentPhase,\n Company_ProjectType,\n Company_TherapeuticArea,\n CompanyCompanyCategory,\n CompanyContact,\n DevelopmentPhase,\n ProjectType,\n TherapeuticArea\n} from '../../../_common/providers/models';\nimport { CompanyRights } from '../../providers/company-rights';\nimport { ModuleMenu } from '../../../_common/components/module-content/module-content';\nimport { ProjectsProvider, ProjectTypeGoupWithTypes } from '../../../projects/providers/projects-provider';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'investors-list-companies',\n providers: [],\n styleUrls: ['./list-companies.scss'],\n templateUrl: './list-companies.html'\n})\nexport class InvestorsListCompaniesComponent implements AfterViewInit, OnDestroy {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public readonly AMOUNT_RAISED_MIN: number = 0;\n public readonly AMOUNT_RAISED_MAX: number = 99999999999; // 100 mia\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isReady: boolean = false;\n public dataSource: SimpleMatDataSource = new SimpleMatDataSource([]);\n public columns: string[] = [];\n\n public searchInput: FormControl = new FormControl('');\n public therapeuticAreas: TherapeuticArea[] = [];\n public developmentPhases: DevelopmentPhase[] = [];\n public projectTypes: ProjectType[] = [];\n public companyCategories: CompanyCompanyCategory[] = [];\n public projectTypeGroups: ProjectTypeGoupWithTypes[] = [];\n public projectTypesCheckboxes: boolean[][] = [];\n\n public companyCategoriesCheckboxes: boolean[] = [];\n public filteredCompanyCategories: CompanyCompanyCategory[] = [];\n public therapeuticAreasCheckboxes: boolean[] = [];\n public filteredTherapeuticAreas: TherapeuticArea[] = [];\n public developmentPhasesCheckboxes: boolean[] = [];\n public filteredDevelopmentPhases: DevelopmentPhase[] = [];\n public filteredProjectTypes: ProjectType[] = [];\n public filteredInvestingInPrivate: boolean;\n public filteredInvestingInPublic: boolean;\n public investmentRangeToFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.investmentRangeToFormControl, this.investmentRangeFromFormControl, null, this.AMOUNT_RAISED_MIN, this.AMOUNT_RAISED_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public investmentRangeFromFormControl: FormControl = new FormControl('', [\n (control: any) => this.checkMinMaxFormControl(this.investmentRangeFromFormControl, null, this.investmentRangeToFormControl, this.AMOUNT_RAISED_MIN, this.AMOUNT_RAISED_MAX),\n (control: any) => !control.value || Number.isInteger(control.value) ? null : {integer: {valid: false}}\n ]);\n public filteredOthers: Alert = new Alert(); // mini hack, on utilise directement cette structure pour binder les oui/non - c'est plus simple\n public moreFiltersSelectionLabel: string = null;\n\n @Input() public title: string = null;\n @Input() public noDataMessage: string = 'No_data';\n @Input() public hideNameColumn: boolean = false;\n @Input() public hideLogoColumn: boolean = false;\n @Input() public hideWebsiteColumn: boolean = false;\n @Input() public hideCategoryColumn: boolean = false;\n @Input() public hideActionsColumn: boolean = false;\n @Input() public hideIsDisplayedOnHomepageColumn: boolean = true;\n @Input() public disableSearchEngine: boolean = false;\n @Input() public isClickable: boolean = true;\n @Input() public isAddEnabled: boolean = false;\n @Output() public onRowClicked: EventEmitter = new EventEmitter();\n @Output() public onEditRowClicked: EventEmitter = new EventEmitter();\n @Output() public onDeleteRowClicked: EventEmitter = new EventEmitter();\n @Output() public onAddClicked: EventEmitter = new EventEmitter();\n @ViewChild(MatPaginator, {static: false}) public paginator: MatPaginator;\n @ViewChild(MatSort, {static: false}) public sorter: MatSort;\n public addMenu: ModuleMenu = null;\n private _allRows: CompanyDataRow[] = [];\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public currentUser: CurrentUser,\n public projectsProvider: ProjectsProvider,\n private _dialoger: MatDialog,\n private _translater: TranslateService,\n private _route: ActivatedRoute,\n private _toaster: MatSnackBar,\n private _router: Router,\n private _storage: ModelsStorage,\n private _investorsProvider: InvestorsProvider,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n private _companies: Company[] = [];\n\n public get companies() {\n return this._companies;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set companies(companies: Company[]) {\n this._companies = companies;\n if (this._companies && this._companies.length) {\n this.loadData(companies)\n .then((data: CompanyDataRow[]) => {\n this._allRows = data;\n this.applyFilters();\n })\n .catch((error: any) => this.onError(error));\n } else {\n this._allRows = [];\n this.applyFilters();\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.initColumns();\n this.initDataSource();\n this.loadStaticData()\n .then(() => {\n this._route.params.subscribe((params: any) => {\n this.initFilters(null)\n .then(() => this.isReady = true)\n .catch((error: any) => this.onError(error));\n });\n })\n .catch((error: any) => this.onError(error));\n this.addMenu = {\n icon: 'add',\n title: 'Add_company',\n url: null,\n onClick: () => this.onAddClicked.emit()\n };\n }\n\n public ngOnDestroy() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public _onRowClicked(row: CompanyDataRow): void {\n if (this.isClickable) {\n this.onRowClicked.emit(row);\n }\n }\n\n public onWebsiteClicked(row: CompanyDataRow): void {\n let url: string = row.company.website;\n if (!url.startsWith('http')) {\n url = 'http://' + url;\n }\n window.open(url, '_blank');\n }\n\n public onDataSortChange(event: any): void {\n this.dataSource.sortBy(event.active, event.direction);\n }\n\n public hasFilters(): boolean {\n return this.filteredCompanyCategories.length > 0\n || this.filteredDevelopmentPhases.length > 0\n || this.filteredProjectTypes.length > 0\n || this.filteredTherapeuticAreas.length > 0\n || this.moreFiltersSelectionLabel != null;\n }\n\n public isMoreFiltersValid(): boolean {\n return !this.investmentRangeFromFormControl.invalid\n && !this.investmentRangeToFormControl.invalid;\n }\n\n public searchInputChanged(filter: string): void {\n this.dataSource.filter = this.utils.normalizeString(filter);\n }\n\n public onAllCompanyCategoriesClicked(event: any): void {\n event.stopPropagation();\n this.filteredCompanyCategories = this.companyCategories.slice();\n this.switchAllCheckboxes(this.companyCategoriesCheckboxes, this.companyCategories, true);\n this.applyFilters();\n }\n\n public onNoCompanyCategoriesClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredCompanyCategories = [];\n this.switchAllCheckboxes(this.companyCategoriesCheckboxes, this.companyCategories, false);\n this.applyFilters();\n }\n\n public onCompanyCategoryClicked(event: any, category: CompanyCompanyCategory): void {\n setTimeout(() => {\n this.toggleFilterSelection(category, this.filteredCompanyCategories);\n this.applyFilters();\n }, 1);\n }\n\n public onAllDevelopmentPhasesClicked(event: any): void {\n event.stopPropagation();\n this.filteredDevelopmentPhases = this.developmentPhases.slice();\n this.switchAllCheckboxes(this.developmentPhasesCheckboxes, this.developmentPhases, true);\n this.applyFilters();\n }\n\n public onAllProjectTypesClicked(event: any): void {\n event.stopPropagation();\n this.filteredProjectTypes = this.projectTypes.slice();\n this.switchAllCheckboxesWithGroup(this.projectTypesCheckboxes, this.projectTypeGroups, 'types', true);\n this.applyFilters();\n }\n\n public onNoProjectTypesClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredProjectTypes = [];\n this.switchAllCheckboxesWithGroup(this.projectTypesCheckboxes, this.projectTypeGroups, 'types', false);\n this.applyFilters();\n }\n\n public onProjectTypeClicked(event: any, type: ProjectType): void {\n setTimeout(() => {\n this.toggleFilterSelection(type, this.filteredProjectTypes);\n this.applyFilters();\n }, 1);\n }\n\n public getGroupCheckboxIcon(items: any[], checkAgainst: any): string {\n const matchingItems: number[] = this.utils.findManyIn(this.utils.getKeyValues(checkAgainst), items, 'id');\n if (matchingItems.length === 0) {\n return 'check_box_outline_blank';\n } else if (matchingItems.length === items.length) {\n return 'check_box';\n }\n\n return 'indeterminate_check_box';\n }\n\n public onProjectTypeGroupClicked(event: any, row: ProjectTypeGoupWithTypes, rowIndex: number): void {\n const matchingItems: ProjectType[] = this.utils.findManyIn(\n this.utils.getKeyValues(row.types, 'id'),\n this.filteredProjectTypes,\n 'id'\n );\n\n // if everything was already selected ...\n if (matchingItems.length === row.types.length) {\n // we remove everything\n row.types.forEach((item, index) => {\n this.filteredProjectTypes.splice(this.filteredProjectTypes.indexOf(row.types[index]), 1);\n this.projectTypesCheckboxes[rowIndex][index] = false;\n });\n } else {\n // otherwise we add the missing ones\n row.types.forEach((item, index) => {\n if (this.filteredProjectTypes.indexOf(row.types[index]) < 0) {\n this.filteredProjectTypes.push(row.types[index]);\n this.projectTypesCheckboxes[rowIndex][index] = true;\n }\n });\n }\n\n this.applyFilters();\n }\n\n public onNoDevelopmentPhasesClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredDevelopmentPhases = [];\n this.switchAllCheckboxes(this.developmentPhasesCheckboxes, this.developmentPhases, false);\n this.applyFilters();\n }\n\n public onDevelopmentPhaseClicked(event: any, phase: DevelopmentPhase): void {\n setTimeout(() => {\n this.toggleFilterSelection(phase, this.filteredDevelopmentPhases);\n this.applyFilters();\n }, 1);\n }\n\n public onAllTherapeuticAreasClicked(event: any): void {\n event.stopPropagation();\n this.filteredTherapeuticAreas = this.therapeuticAreas.slice();\n this.switchAllCheckboxes(this.therapeuticAreasCheckboxes, this.therapeuticAreas, true);\n this.applyFilters();\n }\n\n public onNoTherapeuticAreasClicked(event: any = null): void {\n if (event) {\n event.stopPropagation();\n }\n this.filteredTherapeuticAreas = [];\n this.switchAllCheckboxes(this.therapeuticAreasCheckboxes, this.therapeuticAreas, false);\n this.applyFilters();\n }\n\n public onTherapeuticAreaClicked(event: any, area: TherapeuticArea): void {\n setTimeout(() => {\n this.toggleFilterSelection(area, this.filteredTherapeuticAreas);\n this.applyFilters();\n }, 1);\n }\n\n public stopPropagation(event): void {\n event.stopPropagation();\n }\n\n public onResetFiltersClicked(): void {\n this.filteredCompanyCategories = [];\n this.switchAllCheckboxes(this.companyCategoriesCheckboxes, this.companyCategories, false);\n this.filteredTherapeuticAreas = [];\n this.switchAllCheckboxes(this.therapeuticAreasCheckboxes, this.therapeuticAreas, false);\n this.filteredDevelopmentPhases = [];\n this.switchAllCheckboxes(this.developmentPhasesCheckboxes, this.developmentPhases, false);\n this.filteredProjectTypes = [];\n this.switchAllCheckboxesWithGroup(this.projectTypesCheckboxes, this.projectTypeGroups, 'types', false);\n this.filteredOthers.isSeekingPartnerhips = null;\n this.filteredOthers.isNotSeekingPartnerhips = null;\n this.filteredOthers.isOutlicensing = null;\n this.filteredOthers.isNotOutlicensing = null;\n this.filteredOthers.isNotForProfit = null;\n this.filteredOthers.isNotNotForProfit = null;\n this.filteredInvestingInPrivate = null;\n this.filteredInvestingInPublic = null;\n this.investmentRangeFromFormControl.setValue(null);\n this.investmentRangeToFormControl.setValue(null);\n this.moreFiltersSelectionLabel = null;\n\n this.applyFilters();\n }\n\n public onMoreFiltersItemClicked(event: any): void {\n setTimeout(() => {\n const selectionLabels: string[] = [];\n\n this.investmentRangeFromFormControl.updateValueAndValidity();\n this.investmentRangeToFormControl.updateValueAndValidity();\n if (this.investmentRangeFromFormControl.value\n || this.investmentRangeToFormControl.value) {\n selectionLabels.push('Investment_range');\n }\n\n if (this.filteredOthers.isSeekingPartnerhips\n || this.filteredOthers.isNotSeekingPartnerhips) {\n selectionLabels.push('Intersted_in_partnerships');\n }\n if (this.filteredOthers.isOutlicensing || this.filteredOthers.isNotOutlicensing) {\n selectionLabels.push('Intersted_to_in_licence_a_technology_of_product');\n }\n\n if (this.filteredInvestingInPublic || this.filteredInvestingInPrivate) {\n selectionLabels.push('Investing_in');\n }\n\n if (selectionLabels.length === 0) {\n this.moreFiltersSelectionLabel = null;\n } else if (selectionLabels.length === 1) {\n this.moreFiltersSelectionLabel = this._translater.instant(selectionLabels[0]);\n } else {\n this.moreFiltersSelectionLabel = this._translater.instant(\n 'n_filters',\n {count: selectionLabels.length}\n );\n }\n\n this.applyFilters();\n }, 1);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private initColumns(): void {\n const columns: string[] = [];\n if (!this.hideLogoColumn) {\n columns.push('logo');\n }\n if (!this.hideNameColumn) {\n columns.push('name');\n }\n if (!this.hideCategoryColumn) {\n columns.push('category');\n }\n if (!this.hideWebsiteColumn) {\n columns.push('website');\n }\n if (!this.hideIsDisplayedOnHomepageColumn) {\n columns.push('isDisplayedOnHomepage');\n }\n if (!this.hideActionsColumn) {\n columns.push('actions');\n }\n\n this.columns = columns;\n }\n\n private initDataSource(): void {\n this.dataSource.sort = this.sorter;\n this.dataSource.paginator = this.paginator;\n this.dataSource.filterPredicate = (row: CompanyDataRow, filter: string) => {\n return this.utils.normalizeString(\n (row.company ? row.company.name : '') +\n (row.companyCategory ? row.companyCategory.name : '')\n ).includes(filter);\n };\n // on utilise pas un bête keyup\n // parce que si on sélectionne le texte\n // et qu'on le coupe par exemple, on catch pas l'event ...\n this.searchInput.valueChanges.subscribe((value: string) => this.searchInputChanged(value));\n\n this.dataSource.addSortDefinition(\n 'name',\n (a: CompanyDataRow, b: CompanyDataRow) => this.utils.sortRow(\n this.utils.normalizeString(a.company.name), this.utils.normalizeString(b.company.name)\n ),\n (a: CompanyDataRow, b: CompanyDataRow) => this.utils.sortRow(\n this.utils.normalizeString(b.company.name), this.utils.normalizeString(a.company.name)\n )\n );\n\n this.dataSource.addSortDefinition(\n 'category',\n (a: CompanyDataRow, b: CompanyDataRow) => this.utils.sortRow(\n this.utils.normalizeString(a.companyCategory.name), this.utils.normalizeString(b.companyCategory.name)\n ),\n (a: CompanyDataRow, b: CompanyDataRow) => this.utils.sortRow(\n this.utils.normalizeString(b.companyCategory.name), this.utils.normalizeString(a.companyCategory.name)\n )\n );\n\n this.dataSource.addSortDefinition(\n 'website',\n (a: CompanyDataRow, b: CompanyDataRow) => this.utils.sortRow(\n this.utils.normalizeString(a.company.website || ''), this.utils.normalizeString(b.company.website || '')\n ),\n (a: CompanyDataRow, b: CompanyDataRow) => this.utils.sortRow(\n this.utils.normalizeString(b.company.website || ''), this.utils.normalizeString(a.company.website || '')\n )\n );\n\n this.dataSource.addSortDefinition(\n 'isDisplayedOnHomepage',\n (a: CompanyDataRow, b: CompanyDataRow) => this.utils.sortRow(\n a.company.isDisplayedOnHomepage ? 1 : 0, b.company.isDisplayedOnHomepage ? 1 : 0\n ),\n (a: CompanyDataRow, b: CompanyDataRow) => this.utils.sortRow(\n b.company.isDisplayedOnHomepage ? 1 : 0, a.company.isDisplayedOnHomepage ? 1 : 0\n )\n );\n }\n\n private loadStaticData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(DevelopmentPhase).orderBy('ordinal').get(),\n this._storage.select(TherapeuticArea).get(),\n this._storage.select(CompanyCompanyCategory).orderBy('ordinal').get(),\n this.projectsProvider.getProjectTypeGroups(),\n this._storage.select(ProjectType).get()\n ])\n .then((data: any[]) => {\n this.developmentPhases = data[0];\n this.therapeuticAreas = data[1];\n this.companyCategories = data[2];\n this.projectTypeGroups = data[3];\n this.projectTypes = data[4];\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private loadData(companies: Company[]): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(Company)\n .where('id').in(this.utils.getKeyValues(companies, 'id'))\n .get(),\n this._storage.select(CompanyCompanyCategory).get(),\n this._storage.select(Company_TherapeuticArea).get(),\n this._storage.select(Company_DevelopmentPhase).get(),\n this._storage.select(CompanyContact).get(),\n this._storage.select(Company_ProjectType).get()\n ])\n .then((data: any[]) => {\n const rows: CompanyDataRow[] = [];\n companies.forEach((company: Company, i: number) => {\n const companyCategory: CompanyCompanyCategory = this.utils.findIn(\n company.companyCompanyCategoryId,\n data[1]\n );\n const rights: CompanyRights = new CompanyRights(this.utils);\n rights.evaluate({\n user: this.currentUser.user,\n company\n });\n const therapeuticAreasIdsOfInterest: number[] = this.utils.getKeyValues(\n this.utils.findManyIn([company.id], data[2], 'companyId'),\n 'therapeuticAreaId'\n );\n const developmentPhasesIdsOfInterest: number[] = this.utils.getKeyValues(\n this.utils.findManyIn([company.id], data[3], 'companyId'),\n 'developmentPhaseId'\n );\n\n const projectTypesIdsOfInterest: number[] = this.utils.getKeyValues(\n this.utils.findManyIn([company.id], data[5], 'companyId'),\n 'projectTypeId'\n );\n\n rows.push({\n company,\n companyCategory,\n companyContacts: this.utils.findManyIn([company.id], data[4], 'companyId'),\n isLoading: false,\n rights,\n therapeuticAreasOfInterest: this.utils.findManyIn(\n therapeuticAreasIdsOfInterest,\n this.therapeuticAreas\n ),\n developmentPhasesOfInterest: this.utils.findManyIn(\n developmentPhasesIdsOfInterest,\n this.developmentPhases\n ),\n projectTypesOfInterest: this.utils.findManyIn(\n projectTypesIdsOfInterest,\n this.projectTypes\n ),\n projectTypesIdsOfInterest,\n therapeuticAreasIdsOfInterest,\n developmentPhasesIdsOfInterest\n });\n });\n this.dataSource.replaceAllWith(rows);\n\n resolve(rows);\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private applyFilters(): void {\n const rows: CompanyDataRow[] = [];\n for (let i = 0; i < this._allRows.length; i++) {\n if (this.matchFilterSomeList([\n this._allRows[i].companyCategory ? this._allRows[i].companyCategory.id : null\n ], this.filteredCompanyCategories)\n && this.matchFilterSomeList(this._allRows[i].therapeuticAreasIdsOfInterest, this.filteredTherapeuticAreas)\n && this.matchFilterSomeList(this._allRows[i].developmentPhasesIdsOfInterest, this.filteredDevelopmentPhases)\n && this.matchFilterSomeList(this._allRows[i].projectTypesIdsOfInterest, this.filteredProjectTypes)\n && this.matchFilterMoreFilters(this._allRows[i])\n && this.inFilterRange(this.investmentRangeFromFormControl.value * 100, this.investmentRangeToFormControl.value * 100, this._allRows[i].company.investmentRangeFrom, this._allRows[i].company.investmentRangeTo)) {\n rows.push(this._allRows[i]);\n }\n }\n\n this.dataSource.replaceAllWith(rows);\n }\n\n private switchAllCheckboxesWithGroup(list: boolean[][], data: any, keyName: string, value: boolean): void {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i][keyName].length; j++) {\n list[i][j] = value;\n }\n }\n }\n\n private switchAllCheckboxes(list: boolean[], data: any, value: boolean): void {\n for (let i = 0; i < data.length; i++) {\n list[i] = value;\n }\n }\n\n private checkMinMaxFormControl(targetControl: FormControl, minControl: FormControl, maxControl: FormControl, minFallback: number, maxFallback: number): any {\n if (!targetControl || !targetControl.value) {\n return null;\n }\n\n if (minControl && minControl.value && targetControl.value < minControl.value) {\n return {consistency: {valid: false}};\n } else if (targetControl.value < minFallback) {\n return {consistency: {valid: false}};\n }\n\n if (maxControl && maxControl.value && targetControl.value > maxControl.value) {\n return {consistency: {valid: false}};\n } else if (targetControl.value > maxFallback) {\n return {consistency: {valid: false}};\n }\n\n return null;\n }\n\n private inFilterRange(filterFrom: number, filterTo: number, valueFrom: number, valueTo: number): boolean {\n if (filterFrom) {\n if (!valueFrom || filterFrom > valueTo) {\n return false;\n }\n }\n\n if (filterTo) {\n if (!valueTo || filterTo < valueTo) {\n return false;\n }\n }\n\n return true;\n }\n\n private matchFilterSomeList(keys: number[], filters: any[]): boolean {\n // s'il n'y a pas de filter, ça match ...\n if (filters.length === 0) {\n return true;\n }\n\n // on prend pas en considération les clés qui seraient null ...\n const _keys: number[] = keys.filter((val: number) => val ? true : false);\n\n return this.utils.findManyIn(_keys, filters, 'id').length > 0;\n }\n\n private matchFilterYesNo(yesValue: number, noValue: number, actualValue: number): boolean {\n // si rien n'est coché, on ignore le filtre (l'utilisateur n'a pas renseigner l'info ...)\n // si les deux sont cochés, on ignore le filtre\n // (l'utilisateur indique explicitement qu'il veut les 2, et y a que 2 possibilités, donc ce sera forcément true)\n // si un seul des deux est cochés, on check que ca match avec le model\n if (yesValue) {\n if (!noValue) {\n if (!(actualValue == 1)) {\n return false;\n }\n }\n } else {\n if (noValue) {\n if (actualValue == 1) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n private matchFilterMoreFilters(row: CompanyDataRow): boolean {\n // *100 ; on a le montant en cents, et on l'utilisateur le saisit en dollars\n if (this.investmentRangeFromFormControl.value\n && (!row.company.investmentRangeFrom\n || (this.investmentRangeFromFormControl.value * 100) > row.company.investmentRangeFrom)\n ) {\n return false;\n }\n if (this.investmentRangeToFormControl.value\n && (!row.company.investmentRangeTo\n || (this.investmentRangeToFormControl.value * 100) < row.company.investmentRangeTo)\n ) {\n return false;\n }\n if (!this.matchFilterYesNo(\n this.filteredOthers.isSeekingPartnerhips,\n this.filteredOthers.isNotSeekingPartnerhips,\n row.company.isInterstedInPartnerships ? 1 : 0)\n ) {\n return false;\n }\n if (!this.matchFilterYesNo(\n this.filteredOthers.isOutlicensing,\n this.filteredOthers.isNotOutlicensing,\n row.company.isInterstedInLicenses ? 1 : 0)\n ) {\n return false;\n }\n\n if (this.filteredInvestingInPublic && !row.company.isInvestingInPublic) {\n return false;\n }\n if (this.filteredInvestingInPrivate && !row.company.isInvestingInPrivate) {\n return false;\n }\n\n return true;\n }\n\n private toggleFilterSelection(item: any, list: any[]): boolean {\n const index: number = list.indexOf(item);\n if (index >= 0) {\n list.splice(index, 1);\n\n return false;\n }\n\n list.push(item);\n\n return true;\n }\n\n private initFilters(filtersState: InvestorFiltersState): Promise {\n return new Promise((resolve, reject) => {\n if (!filtersState) {\n filtersState = {\n companyCategoryIds: [],\n developmentPhaseIds: [],\n therapeuticAreaIds: [],\n projectTypeIds: [],\n investmentRangeFrom: null,\n investmentRangeTo: null,\n isNoNotForProfit: 0,\n isNotForProfit: 0,\n isNotOutlicensing: 0,\n isNotSeekingPartnerships: 0,\n isOutlicensing: 0,\n isSeekingPartnerships: 0,\n pageIndex: 0\n };\n }\n\n this.filteredCompanyCategories = [];\n this.companyCategoriesCheckboxes = [];\n this.filteredTherapeuticAreas = [];\n this.therapeuticAreasCheckboxes = [];\n this.filteredDevelopmentPhases = [];\n this.developmentPhasesCheckboxes = [];\n this.filteredProjectTypes = [];\n this.projectTypesCheckboxes = [];\n\n this.companyCategories.forEach((item: CompanyCompanyCategory, i: number) => {\n if (filtersState.companyCategoryIds.indexOf(item.id) >= 0) {\n this.companyCategoriesCheckboxes.push(true);\n this.filteredCompanyCategories.push(item);\n } else {\n this.companyCategoriesCheckboxes.push(false);\n }\n });\n\n this.therapeuticAreas.forEach((item: TherapeuticArea, i: number) => {\n if (filtersState.therapeuticAreaIds.indexOf(item.id) >= 0) {\n this.therapeuticAreasCheckboxes.push(true);\n this.filteredTherapeuticAreas.push(item);\n } else {\n this.therapeuticAreasCheckboxes.push(false);\n }\n });\n\n this.developmentPhases.forEach((item: DevelopmentPhase, i: number) => {\n if (filtersState.developmentPhaseIds.indexOf(item.id) >= 0) {\n this.developmentPhasesCheckboxes.push(true);\n this.filteredDevelopmentPhases.push(item);\n } else {\n this.developmentPhasesCheckboxes.push(false);\n }\n });\n\n this.projectTypeGroups.forEach((item: ProjectTypeGoupWithTypes, i: number) => {\n const rows: boolean[] = [];\n item.types.forEach((type: ProjectType, j: number) => {\n if (filtersState.projectTypeIds.indexOf(type.id) >= 0) {\n rows.push(true);\n this.filteredProjectTypes.push(type);\n } else {\n rows.push(false);\n }\n });\n this.projectTypesCheckboxes.push(rows);\n });\n\n this.investmentRangeFromFormControl.setValue(filtersState.investmentRangeFrom);\n this.investmentRangeToFormControl.setValue(filtersState.investmentRangeTo);\n this.filteredOthers.isNotForProfit = filtersState.isNotForProfit;\n this.filteredOthers.isNotNotForProfit = filtersState.isNoNotForProfit;\n this.filteredOthers.isOutlicensing = filtersState.isOutlicensing;\n this.filteredOthers.isNotOutlicensing = filtersState.isNotOutlicensing;\n this.filteredOthers.isSeekingPartnerhips = filtersState.isSeekingPartnerships;\n this.filteredOthers.isNotSeekingPartnerhips = filtersState.isNotSeekingPartnerships;\n this.paginator.pageIndex = filtersState.pageIndex;\n\n this.onMoreFiltersItemClicked({}); // vilain hack pour refresh le control ...\n\n this.applyFilters();\n resolve();\n });\n }\n\n private onError(error: any): void {\n console.log(error);\n this.isReady = true;\n }\n}\n","\n \n \n
\n
\n \n
\n info_outline\n {{ 'Venture_incomplete_warning' | translate }}\n
\n
\n \n \n \n \n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { CompanyDataRow, InvestorsProvider } from '../../providers/investors-provider';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { Company, Project, ProjectValidationState } from '../../../_common/providers/models';\nimport { CompanyRights } from '../../providers/company-rights';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'investors-companies-page',\n providers: [],\n styleUrls: ['./companies.scss'],\n templateUrl: './companies.html'\n})\nexport class InvestorsCompaniesPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public companies: Company[] = [];\n public rights: CompanyRights = new CompanyRights(this._utils);\n public accessBlocked: boolean = false;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _title: Title,\n private _router: Router,\n private _utils: Utils,\n private _dialoger: MatDialog,\n private _toaster: MatSnackBar,\n private _investorsProvider: InvestorsProvider,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n const pageTitle = this._translater.instant('Companies') + ' | ' + this.conf.platformName;\n this._title.setTitle(pageTitle);\n this.loadData()\n .then(() => {\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onRowClicked(row: CompanyDataRow): void {\n this._router.navigate(['investors', 'companies', row.company.id]);\n }\n\n public onDeleteRowClicked(row: CompanyDataRow): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: 'Confirm_delete_company'\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n row.isLoading = true;\n this.deleteCompany(row)\n .then(() => {\n this.companies = this.companies.slice();\n const message = this._translater.instant('Company_deleted');\n this._toaster.open(message, '', {duration: 5000});\n })\n .catch((error: any) => this.onError(error, row));\n }\n });\n }\n\n public onEditRowClicked(row: CompanyDataRow): void {\n this._router.navigate(['investors', 'companies', row.company.id, 'edit']);\n }\n\n public onAddClicked(): void {\n this._router.navigate(['investors', 'companies', 'new']);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private async loadData(): Promise {\n try {\n const companies: Company[] = await this._storage.select(Company).get();\n\n if (this.currentUser.user.isProjectHolder) {\n const isProjectValidated = await this._storage.select(Project).where('ownerId').equals(this.currentUser.user.id)\n .and('projectValidationStateId').equals(ProjectValidationState.ID_PUBLISHED).get(1);\n this.accessBlocked = !isProjectValidated;\n }\n\n companies.sort((a: Company, b: Company) => this._utils.sortRow(\n this._utils.normalizeString(a.name),\n this._utils.normalizeString(b.name)\n ));\n this.companies = companies;\n this.rights.evaluate({\n user: this.currentUser.user,\n company: null\n });\n\n } catch (e) {\n this.onError(e);\n }\n }\n\n private deleteCompany(companyData: CompanyDataRow): Promise {\n return new Promise((resolve, reject) => {\n this._investorsProvider.deleteCompany(companyData.company)\n .then(() => {\n const rowIndex = this.companies.findIndex((item: Company) => item.id === companyData.company.id);\n this.companies.splice(rowIndex, 1);\n resolve();\n })\n .catch(reject);\n });\n }\n\n private onError(error: any, row: CompanyDataRow = null): void {\n this.isLoading = false;\n if (row) {\n row.isLoading = false;\n }\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { IsLoggedInGuard } from '../../_common/guards/is-logged-in';\n\n@Injectable()\nexport class CanSeeCompanies implements CanActivate {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _currentUser: CurrentUser,\n private _isLoggedIn: IsLoggedInGuard,\n private _router: Router\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot)\n : Promise {\n return new Promise((resolve, reject) => {\n this._isLoggedIn.canActivate(route, state)\n .then((isLoggedIn) => {\n if (isLoggedIn) {\n const canAccess = this._currentUser.user.isAdmin\n || this._currentUser.user.isProjectHolder;\n if (!canAccess) {\n this.redirect();\n }\n resolve(!!canAccess);\n } else {\n resolve(false);\n }\n })\n .catch((error) => {\n this.redirect();\n resolve(false);\n });\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private redirect(): void {\n this._router.navigate(['401']);\n }\n\n}\n","\n \n \n
\n
\n \n \n \n \n
\n \n
\n
{{ companyData.company.name }}
\n
{{ companyData.companyCategory.name }}
\n
\n \n
\n\n \n
\n
\n
\n \n
\n
\n {{ 'Investment_range' | translate }}:\n {{ 'Not_specified' | translate }}\n {{ (companyData.company.investmentRangeFrom / 100) | currency:'CHF ' : 'symbol' : '1.0-0' }}\n - \n {{ (companyData.company.investmentRangeTo / 100) | currency:'CHF ' : 'symbol' : '1.0-0' }}\n
\n
\n {{ companyData.company.investmentComment }}\n
\n
\n check_box\n {{ 'Intersted_to_in_licence_a_technology_of_product' | translate }}\n
\n
\n check_box\n {{ 'Intersted_in_partnerships' | translate }}\n
\n
\n check_box\n {{ 'Investing_in_public' | translate }}\n
\n
\n check_box\n {{ 'Investing_in_private' | translate }}\n
\n
\n
\n
\n
{{ 'Therapeutic_areas_of_interest' | translate }}
\n
{{ 'Not_specified' | translate }}
\n
    \n
  • {{ item.name }}
  • \n
\n
\n
\n
{{ 'Development_phases_of_interest' | translate }}
\n
{{ 'Not_specified' | translate }}
\n
    \n
  • {{ item.name }}
  • \n
\n
\n
\n
{{ 'Project_types_of_interest' | translate }}
\n
{{ 'Not_specified' | translate }}
\n
    \n
  • {{ item.name }}
  • \n
\n
\n
\n
\n \n
\n
\n
{{ 'Adress' | translate }}:
\n {{ companyData.company.street1 }},\n {{ companyData.company.street2 }}\n ,\n {{ companyData.company.city }},\n {{ companyData.company.country }}\n
\n
\n
{{ 'Email_switchboard' | translate }}:
\n {{ companyData.company.email }}\n
\n
\n
{{ 'Phone_switchboard' | translate }}:
\n {{ companyData.company.phone }}\n
\n
\n
\n \n 0\"\n [dataSource]=\"dataSource\"\n matSort>\n \n \n \n {{ 'Name' | translate }}\n \n {{ row.firstName + ' ' + row.lastName }}\n \n \n \n {{ 'Email' | translate }}\n \n {{ row.email }}\n \n \n \n {{ 'Phone' | translate }}\n \n {{ row.phone }}\n \n \n \n \n \n
{{ 'Company_information_disclaimer' | translate }}
\n
\n \n \n
\n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { Utils } from '../../../_common/providers/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { CompanyDataRow, InvestorsProvider } from '../../providers/investors-provider';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport {\n Company,\n Company_DevelopmentPhase,\n Company_ProjectType,\n Company_TherapeuticArea,\n CompanyCompanyCategory,\n CompanyContact,\n DevelopmentPhase,\n InvestorProfile,\n ProjectType,\n TherapeuticArea\n} from '../../../_common/providers/models';\nimport { CompanyRights } from '../../providers/company-rights';\nimport { MenuItem } from '../../../_common/components/side-menu/side-menu';\nimport { SimpleMatDataSource } from '../../../_common/providers/simple-mat-data-source';\nimport { MatSort } from '@angular/material/sort';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'investors-company-page',\n providers: [],\n styleUrls: ['./company.scss'],\n templateUrl: './company.html'\n})\nexport class InvestorsCompanyPageComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = true;\n public is404: boolean = false;\n public is401: boolean = false;\n\n public backMenu: MenuItem = {\n icon: 'back',\n title: this._translater.instant('Companies'),\n url: '/investors/companies'\n };\n\n public companyData: CompanyDataRow = null;\n\n public categories: CompanyCompanyCategory[] = [];\n public therapeuticAreas: TherapeuticArea[] = [];\n public developmentPhases: DevelopmentPhase[] = [];\n public projectTypes: ProjectType[] = [];\n public rights: CompanyRights = new CompanyRights(this.utils);\n\n public dataSource: SimpleMatDataSource = new SimpleMatDataSource([]);\n public columns: string[] = ['name', 'email', 'phone'];\n\n @ViewChild(MatSort, {static: false}) public sorter: MatSort;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n public utils: Utils,\n public investorsProvider: InvestorsProvider,\n private _title: Title,\n private _router: Router,\n private _toaster: MatSnackBar,\n private _route: ActivatedRoute,\n private _changeDetector: ChangeDetectorRef,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this._route.queryParams.subscribe((params: any) => {\n if (params.backUrl) {\n this.backMenu = {\n icon: 'arrow_back',\n title: params.backTitle || this._translater.instant('Back'),\n url: params.backUrl || '/investors/companies'\n };\n this._changeDetector.detectChanges();\n }\n });\n this._route.params.subscribe((params: any) => {\n this.initPage(parseInt(params.id, 10)).catch((error) => this.onError(error));\n });\n this.navigation.updateMenus();\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onEditClicked(): void {\n this._router.navigate(['investors', 'companies', this.companyData.company.id, 'edit'], {\n queryParams: {backUrl: this._router.url, backTitle: this._translater.instant('Company_details')}\n });\n }\n\n public onWebsiteClicked(): void {\n let url: string = this.companyData.company.website;\n if (!url.startsWith('http')) {\n url = 'http://' + url;\n }\n window.open(url, '_blank');\n }\n\n public onDataSortChange(event: any): void {\n this.dataSource.sortBy(event.active, event.direction);\n }\n\n public displayAdress(): boolean {\n return this.companyData.company.noContactInfos ? false : !!(this.companyData.company.street1\n && this.companyData.company.city\n && this.companyData.company.country\n && this.companyData.company.email\n && this.companyData.company.phone);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private initPage(companyId: number): Promise {\n return new Promise((resolve, reject) => {\n this.isLoading = true;\n this.loadData(companyId)\n .then(() => {\n this.initDataSource();\n this._title.setTitle(\n (this.companyData.company.name || this._translater.instant('Company_details'))\n + ' | ' +\n this.conf.platformName\n );\n this.is401 = !this.rights.SEE;\n this.isLoading = false;\n\n resolve();\n })\n .catch(reject);\n\n this._changeDetector.detectChanges();\n });\n }\n\n private loadData(companyId: number): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(Company).where('id').equals(companyId).get(1),\n this._storage.select(CompanyContact).where('companyId').equals(companyId).get(),\n this._storage.select(Company_TherapeuticArea).where('companyId').equals(companyId).get(),\n this._storage.select(Company_DevelopmentPhase).where('companyId').equals(companyId).get(),\n this._storage.select(CompanyCompanyCategory).get(),\n this._storage.select(TherapeuticArea).get(),\n this._storage.select(DevelopmentPhase).orderBy('ordinal').get(),\n this._storage.select(ProjectType).get(),\n this._storage.select(Company_ProjectType).where('companyId').equals(companyId).get(),\n this.currentUser.user.isInvestor && this._storage.select(InvestorProfile).where('userId').equals(this.currentUser.user.id).get(1)\n ])\n .then((data: any[]) => {\n if (!data[0]) {\n this.is404 = true;\n reject({});\n return;\n }\n\n this.categories = data[4];\n this.therapeuticAreas = data[5];\n this.developmentPhases = data[6];\n this.projectTypes = data[7];\n\n const company: Company = data[0];\n\n this.rights.evaluate({\n user: this.currentUser.user,\n company: data[0],\n investorProfile: this.currentUser.user.isInvestor ? data[9] : null\n });\n const therapeuticAreaIds = this.utils.getKeyValues(data[2], 'therapeuticAreaId');\n const developmentPhaseIds = this.utils.getKeyValues(data[3], 'developmentPhaseId');\n const projectTypeIds = this.utils.getKeyValues(data[8], 'projectTypeId');\n this.companyData = {\n company,\n companyCategory: this.utils.findIn(company.companyCompanyCategoryId, data[4]),\n companyContacts: data[1],\n therapeuticAreasOfInterest: this.utils.findManyIn(therapeuticAreaIds, this.therapeuticAreas),\n therapeuticAreasIdsOfInterest: therapeuticAreaIds,\n developmentPhasesOfInterest: this.utils.findManyIn(developmentPhaseIds, this.developmentPhases),\n developmentPhasesIdsOfInterest: developmentPhaseIds,\n projectTypesOfInterest: this.utils.findManyIn(projectTypeIds, this.projectTypes),\n projectTypesIdsOfInterest: projectTypeIds,\n rights: this.rights\n };\n this.dataSource.replaceAllWith(data[1]);\n\n resolve();\n\n })\n .catch(reject);\n });\n }\n\n private initDataSource(): void {\n this.dataSource.sort = this.sorter;\n\n this.dataSource.addSortDefinition(\n 'name',\n (a: CompanyContact, b: CompanyContact) => this.utils.sortRow(\n this.utils.normalizeString(a.firstName + a.lastName), this.utils.normalizeString(b.firstName + b.lastName)\n ),\n (a: CompanyContact, b: CompanyContact) => this.utils.sortRow(\n this.utils.normalizeString(b.firstName + b.lastName), this.utils.normalizeString(a.firstName + a.lastName)\n )\n );\n\n this.dataSource.addSortDefinition(\n 'email',\n (a: CompanyContact, b: CompanyContact) => this.utils.sortRow(\n this.utils.normalizeString(a.email || ''), this.utils.normalizeString(b.email || '')\n ),\n (a: CompanyContact, b: CompanyContact) => this.utils.sortRow(\n this.utils.normalizeString(b.email || ''), this.utils.normalizeString(a.email || '')\n )\n );\n\n this.dataSource.addSortDefinition(\n 'phone',\n (a: CompanyContact, b: CompanyContact) => this.utils.sortRow(\n this.utils.normalizeString(a.phone || ''), this.utils.normalizeString(b.phone || '')\n ),\n (a: CompanyContact, b: CompanyContact) => this.utils.sortRow(\n this.utils.normalizeString(b.phone || ''), this.utils.normalizeString(a.phone || '')\n )\n );\n\n }\n\n private onError(error: any, row: CompanyDataRow = null): void {\n this.isLoading = false;\n if (row) {\n row.isLoading = false;\n }\n console.log(error);\n\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { IsLoggedInGuard } from '../../_common/guards/is-logged-in';\nimport {\n Company,\n InvestorProfile,\n InvestorValidationState,\n Project,\n ProjectValidationState\n} from '../../_common/providers/models';\nimport { ModelsStorage } from '../../_common/providers/models-storage';\n\n@Injectable()\nexport class CanSeeCompany implements CanActivate {\n\n constructor(\n private _currentUser: CurrentUser,\n private _isLoggedIn: IsLoggedInGuard,\n private _storage: ModelsStorage,\n private _router: Router\n ) {\n }\n\n public async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot)\n : Promise {\n\n try {\n const isLoggedIn = await this._isLoggedIn.canActivate(route, state);\n if (isLoggedIn) {\n if (this._currentUser.user.isAdmin) {\n return true;\n } else if (this._currentUser.user.isProjectHolder) {\n const isProjectValidated = await this._storage.select(Project).where('ownerId').equals(this._currentUser.user.id)\n .and('projectValidationStateId').equals(ProjectValidationState.ID_PUBLISHED).get(1);\n if (isProjectValidated) {\n return true;\n }\n } else if (this._currentUser.user.isInvestor) {\n const hasLink: InvestorProfile = await this._storage.select(InvestorProfile)\n .where('userId').equals(this._currentUser.user.id)\n .and('companyId', InvestorProfile).equals(Number(route.params.id))\n .get(1);\n\n const linkedCompany: Company = await this._storage.select(Company)\n .where('id').equals(hasLink.companyId).get(1);\n\n // SB-787 Allow investor to update company before validation when company is not completed\n if (!linkedCompany.isCompleted && hasLink) {\n return true;\n }\n return hasLink.investorValidationStateId === InvestorValidationState.ID_ACCEPTED;\n }\n }\n\n this.redirect();\n return false;\n\n } catch (e) {\n this.redirect();\n return false;\n }\n }\n\n private redirect(): void {\n this._router.navigate(['401']);\n }\n\n}\n","\n \n \n
\n
\n \n\n
\n \n
\n\n \n
\n
\n\n\n","import { AfterViewInit, ChangeDetectorRef, Component } from '@angular/core';\nimport { Conf } from '../../../_conf';\nimport { AcventuresNavigationProvider } from '../../../_acventures-common/providers/navigation-provider';\nimport { CurrentUser } from '../../../_common/providers/current-user';\n\n@Component({\n selector: 'investors-dashboard-page',\n providers: [],\n styleUrls: ['./dashboard.scss'],\n templateUrl: './dashboard.html'\n})\nexport class InvestorsDashboardPageComponent implements AfterViewInit {\n\n public isLoading: boolean = false;\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public navigation: AcventuresNavigationProvider,\n private _changeDetector: ChangeDetectorRef,\n ) {\n }\n\n public ngAfterViewInit() {\n this.navigation.updateMenus();\n this._changeDetector.detectChanges();\n }\n}\n","import { Routes } from '@angular/router';\n\n//\n// PAGES\n//\nimport { HomePageComponent } from './_common/pages/home/home';\nimport { Error401PageComponent } from './_common/pages/error-401/error-401';\nimport { Error404PageComponent } from './_common/pages/error-404/error-404';\nimport { UsersEditPageComponent } from './users/pages/edit/edit';\nimport { LogoutPageComponent } from './_common/pages/logout/logout';\nimport { ProjectsEditPageComponent } from './projects/pages/edit/edit';\nimport { ProjectsProjectsPageComponent } from './projects/pages/projects/projects';\nimport { AlertsAlertsPageComponent } from './alerts/pages/alerts/alerts';\nimport { ProjectsFavoritesPageComponent } from './projects/pages/favorites/favorites';\nimport { ProjectsProjectPageComponent } from './projects/pages/project/project';\nimport { AlertsAlertPageComponent } from './alerts/pages/alert/alert';\nimport { ProjectsPendingValidationPageComponent } from './projects/pages/pending-validation/pending-validation';\nimport { InvestorsPendingValidationPageComponent } from './investors/pages/pending-validation/pending-validation';\nimport { InvestorsInvestorsPageComponent } from './investors/pages/investors/investors';\nimport { UsersAdminPageComponent } from './users/pages/admins/admins';\nimport { UsersGuestsPageComponent } from './users/pages/guests/guests';\nimport { ProjectsNotProjectYetPageComponent } from './projects/pages/no-project-yet/no-project-yet';\nimport { TermsPageComponent } from './_common/pages/terms/terms';\nimport { UsersLocalExpertsPageComponent } from './users/pages/local-experts/local-experts';\nimport { ProjectsDraftsPageComponent } from './projects/pages/drafts/drafts';\nimport { ProjectsDispatchPageComponent } from './projects/pages/dispatch/dispatch';\nimport { ProjectsDashboardPageComponent } from './projects/pages/dashboard/dashboard';\nimport { InvestorsHomePageComponent } from './investors/pages/home/home';\nimport { ProjectsHomePageComponent } from './projects/pages/home/home';\nimport { InvestorsWelcomePageComponent } from './investors/pages/welcome/welcome';\nimport { InvestorsEditCompanyPageComponent } from './investors/pages/edit-company/edit-company';\n\n//\n// GUARDS\n//\nimport { GuardsSequenceGuard } from './_common/guards/guards-sequence';\nimport { IsAppReadyGuard } from './_common/guards/is-app-ready';\nimport { IsLoggedInGuard } from './_common/guards/is-logged-in';\nimport { IsAdminGuard } from './_common/guards/is-admin';\nimport { HasPendingChangesGuard } from './_common/guards/has-pending-changes';\nimport { UsersCanEditUserGuard } from './users/guards/can-edit-user';\nimport { HasHomepageRedirectGuard } from './_common/guards/has-homepage-redirect';\nimport { ProjectsMembershipsPageComponent } from './projects/pages/memberships/memberships';\nimport { InvestorsCompaniesPageComponent } from './investors/pages/companies/companies';\nimport { CanSeeCompanies } from './investors/guards/can-see-companies';\nimport { InvestorsCompanyPageComponent } from './investors/pages/company/company';\nimport { CanSeeCompany } from './investors/guards/can-see-company';\nimport { InvestorsDashboardPageComponent } from './investors/pages/dashboard/dashboard';\n\nexport const ROUTES: Routes = [\n {\n path: '',\n component: HomePageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, HasHomepageRedirectGuard]}\n },\n {\n path: '401',\n component: Error401PageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard]}\n },\n {\n path: '404',\n component: Error404PageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard]}\n },\n {\n path: 'logout',\n component: LogoutPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'terms',\n component: TermsPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard]}\n },\n {\n path: 'auth?*nextUrl=*',\n component: HomePageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard]}\n },\n {\n path: 'users/:userId/edit',\n component: UsersEditPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, UsersCanEditUserGuard]}\n },\n {\n path: 'users/admins',\n component: UsersAdminPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsAdminGuard]}\n },\n {\n path: 'users/guests',\n component: UsersGuestsPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsAdminGuard]}\n },\n {\n path: 'users/local-experts',\n component: UsersLocalExpertsPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsAdminGuard]}\n },\n {\n path: 'investors/pending-validation',\n component: InvestorsPendingValidationPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsAdminGuard]}\n },\n {\n path: 'investors/companies',\n component: InvestorsCompaniesPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, CanSeeCompanies]}\n },\n {\n path: 'investors/companies/:id/edit',\n component: InvestorsEditCompanyPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, CanSeeCompany]}\n },\n {\n path: 'investors/companies/new',\n component: InvestorsEditCompanyPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsAdminGuard]}\n },\n {\n path: 'investors/companies/:id',\n component: InvestorsCompanyPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, CanSeeCompany]}\n },\n {\n path: 'investors/dashboard',\n component: InvestorsDashboardPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'investor',\n component: InvestorsHomePageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, HasHomepageRedirectGuard]}\n },\n {\n path: 'investors',\n component: InvestorsInvestorsPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsAdminGuard]}\n },\n {\n path: 'academic-ventures/:projectId/dispatch/:userId',\n component: ProjectsDispatchPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'academic-ventures/:projectId/edit/preview',\n component: ProjectsProjectPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'academic-ventures/:projectId/edit',\n component: ProjectsEditPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'academic-ventures/:projectId/dashboard',\n component: ProjectsDashboardPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'academic-ventures/:projectId/memberships',\n component: ProjectsMembershipsPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'academic-ventures/pending-validation',\n component: ProjectsPendingValidationPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'academic-ventures/drafts',\n component: ProjectsDraftsPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'academic-ventures/welcome',\n component: ProjectsNotProjectYetPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'alerts/:alertId',\n component: AlertsAlertPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'academic-ventures',\n component: ProjectsProjectsPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'project-leader',\n component: ProjectsHomePageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, HasHomepageRedirectGuard]}\n },\n {\n path: 'welcome',\n component: InvestorsWelcomePageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'academic-ventures/:projectId',\n component: ProjectsProjectPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'alerts',\n component: AlertsAlertsPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: 'favorites',\n component: ProjectsFavoritesPageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard, IsLoggedInGuard]}\n },\n {\n path: '**',\n component: Error404PageComponent,\n canActivate: [GuardsSequenceGuard],\n canDeactivate: [HasPendingChangesGuard],\n data: {_guardsSequence: [IsAppReadyGuard]}\n },\n];\n","import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';\nimport { Injectable } from '@angular/core';\nimport { of } from 'rxjs';\n\n@Injectable()\nexport class DataResolver implements Resolve {\n public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\n return of({res: 'I am data'});\n }\n}\n\n/**\n * An array of services to resolve routes with data.\n */\nexport const APP_RESOLVER_PROVIDERS = [\n DataResolver\n];\n","\n 0\">\n \n \n \n \n \n \n \n \n \n
{{ header.title }}
{{ item }}
\n","import { AfterViewInit, Component, Input } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'data-list',\n providers: [],\n styleUrls: ['./data-list.scss'],\n templateUrl: './data-list.html'\n})\nexport class DataListComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input()\n public headers: any[];\n @Input()\n public rowsData: string[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _router: Router\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onRowClicked(link: string, params: any = null): void {\n if (params) {\n this._router.navigateByUrl(link, params);\n } else {\n this._router.navigateByUrl(link);\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Pipe({name: 'safe'})\nexport class SafePipe implements PipeTransform {\n constructor(\n private _sanitizer: DomSanitizer) {\n }\n\n public transform(url) {\n return this._sanitizer.bypassSecurityTrustResourceUrl(url);\n }\n}\n","
\n \n
{{ 'Click_to_enable_map' | translate }}
\n
\n","import { AfterViewInit, Component, HostListener, Input } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { Conf } from '../../../_conf';\nimport { TranslateService } from '@ngx-translate/core';\n\n// doc :\n// - https://developers.google.com/maps/documentation/embed/guide#directions_mode\n// - https://stackoverflow.com/questions/38879993/angular-2-google-map-implementation\n// - https://stackoverflow.com/questions/21992498/disable-mouse-scroll-wheel-zoom-on-embedded-google-maps\n\n@Component({\n selector: 'embed-map',\n providers: [],\n styleUrls: ['./embed-map.scss'],\n templateUrl: './embed-map.html'\n})\nexport class EmbedMapComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input()\n public apiKey: string = '';\n @Input()\n public query: string = '';\n @Input()\n public zoom: number = 10;\n @Input()\n public width: string = '100%';\n @Input()\n public height: string = '450px';\n\n public isActivated: boolean = false;\n public showHint: boolean = false;\n\n private _iframeBaseUrl: string = 'https://www.google.com/maps/embed/v1/place';\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public sanitizer: DomSanitizer,\n public conf: Conf,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n @HostListener('mouseleave')\n public onMouseLeave(): void {\n this.isActivated = false;\n this.showHint = false;\n }\n\n @HostListener('blur')\n public onBlur(): void {\n this.isActivated = false;\n }\n\n @HostListener('click')\n public onClick(): void {\n this.isActivated = true;\n }\n\n @HostListener('mouseenter')\n public onHover(): void {\n this.showHint = true;\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public getIframeUrl(): string {\n return this._iframeBaseUrl\n + '?key=' + this.apiKey\n + '&q=' + this.query\n + '&zoom=' + this.zoom;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","
0\"\n class=\"container\">\n
{{ 'x_of_y' | translate:{current: currentItem, total: itemsCount} }}
\n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { Utils } from '../../providers/utils';\n\n@Component({\n selector: 'slider-control',\n providers: [],\n styleUrls: ['./slider-control.scss'],\n templateUrl: './slider-control.html'\n})\nexport class SliderControlComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Output() public currentItemChange: EventEmitter = new EventEmitter();\n @Input() public itemsCount: number = 1;\n @Output() public onSlided: EventEmitter = new EventEmitter();\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n private _translater: TranslateService,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n private _currentItem: number = 1;\n\n public get currentItem() {\n return this._currentItem;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set currentItem(currentItem: number) {\n this._currentItem = currentItem;\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onNextClicked(): void {\n if (this._currentItem >= this.itemsCount) {\n return;\n }\n\n const previous: number = this._currentItem;\n this._currentItem++;\n this.currentItemChange.emit(this._currentItem);\n this.onSlided.emit({previous, next: this._currentItem});\n }\n\n public onPreviousClicked(): void {\n if (this._currentItem <= 1) {\n return;\n }\n\n const previous: number = this._currentItem;\n this._currentItem--;\n this.currentItemChange.emit(this._currentItem);\n this.onSlided.emit({previous, next: this._currentItem});\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","
0\"\n [matMenuTriggerFor]=\"workspaceMenu\"\n class=\"workspace-selector\">\n \n cloud\n {{ activeWorkspaceName }}\n arrow_drop_down\n
\n\n \n
\n \n cloud\n
{{ workspace.name }}
\n
\n
\n \n 2\">\n
\n {{ 'Administration' | translate }}\n
\n \n \n
\n
\n \n \n \n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { Utils } from '../../providers/utils';\nimport { ModelsStorage } from '../../providers/models-storage';\nimport { CurrentUser } from '../../providers/current-user';\n\n@Component({\n selector: 'workspace-selector',\n providers: [],\n styleUrls: ['./workspace-selector.scss'],\n templateUrl: './workspace-selector.html'\n})\nexport class WorkspaceSelectorComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public activeWorkspaceLogo: string = null;\n public activeWorkspaceName: string = '';\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n public utils: Utils,\n private _translater: TranslateService,\n private _changeDetector: ChangeDetectorRef,\n private _route: ActivatedRoute,\n private _router: Router,\n private _storage: ModelsStorage\n ) {\n }\n\n private _workspaces: any[] = null;\n\n public get workspaces() {\n return this._workspaces;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set workspaces(workspaces: any[]) {\n this._workspaces = workspaces;\n if (this._workspaces) {\n const id: any = workspaces && workspaces.length > 0 ? workspaces[0].id : null;\n this.updateActiveWorkspace(id);\n } else {\n this.initWorkspaces()\n .catch((error: any) => this.onError(error));\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.initWorkspaces()\n .catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private initWorkspaces(): Promise {\n return new Promise((resolve, reject) => {\n if (this._workspaces || !this.currentUser.isLoggedIn()) {\n resolve();\n return;\n }\n });\n }\n\n private updateActiveWorkspace(id: any): void {\n let found: boolean = false;\n for (let i = 0; i < this._workspaces.length; i++) {\n if (this._workspaces[i].id === id) {\n found = true;\n this.activeWorkspaceLogo = this._workspaces[i].logo;\n this.activeWorkspaceName = this._workspaces[i].name;\n this._workspaces[i].active = true;\n } else {\n this._workspaces[i].active = false;\n }\n }\n\n if (!found) {\n this.activeWorkspaceLogo = null;\n this.activeWorkspaceName = '';\n }\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n\nexport interface Workspace {\n id: any;\n name: string;\n logo: string;\n url: string;\n active: boolean;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { AutoLinker } from '../../app.module';\n\n@Pipe({name: 'autoLinker'})\nexport class AutoLinkerPipe implements PipeTransform {\n constructor() {\n }\n\n public transform(str: string) {\n return AutoLinker.link(str);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Utils } from '../providers/utils';\n\n@Pipe({name: 'duration'})\nexport class DurationPipe implements PipeTransform {\n constructor(\n private _utils: Utils\n ) {\n }\n\n public transform(str: string, params: DurationParams): string {\n let num: number = parseFloat(str);\n if (!num) {\n return str;\n }\n\n if (!params.input) {\n params.input = 'minutes';\n }\n if (!params.output) {\n params.output = 'hours';\n }\n if (!params.precision) {\n params.precision = 1;\n }\n\n const conversion: any = {\n miliseconds: {ordinal: 0, divider: 1000},\n seconds: {ordinal: 1, divider: 60},\n minutes: {ordinal: 2, divider: 60},\n hours: {ordinal: 3, divider: 24},\n days: {ordinal: 4, divider: 7},\n weeks: {ordinal: 5, divider: 1}\n };\n const index: string[] = ['miliseconds', 'seconds', 'minutes', 'hours', 'days', 'weeks'];\n\n const from: any = conversion[params.input];\n const to: any = conversion[params.output];\n\n if (from.ordinal < to.ordinal) {\n for (let i = conversion[params.output].ordinal - 1; i >= conversion[params.input].ordinal; i--) {\n num /= conversion[index[i]].divider;\n }\n } else if (from.ordinal > to.ordinal) {\n for (let i = conversion[params.output].ordinal; i < conversion[params.input].ordinal; i++) {\n num *= conversion[index[i]].divider;\n }\n }\n\n return '' + (Math.round(num * (10 * params.precision))) / (params.precision > 0 ? (10 * params.precision) : 1);\n }\n}\n\nexport interface DurationParams {\n input: string;\n output: string;\n precision: number;\n}\n","import { TranslateService } from '@ngx-translate/core';\nimport { MatPaginatorIntl } from '@angular/material/paginator';\n\n// inspired from : https://stackoverflow.com/a/49532776\nexport class TranslatablePaginatorIntl extends MatPaginatorIntl {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public translate: TranslateService;\n\n public itemsPerPageLabel: string = 'Items_per_page';\n public nextPageLabel: string = 'Next_page';\n public previousPageLabel: string = 'Previous_page';\n public lastPageLabel: string = 'Last_page';\n public firstPageLabel: string = 'First_page';\n\n constructor() {\n super();\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n public getRangeLabel: any = (page, pageSize, length) => {\n const of = this.translate ? this.translate.instant('of') : 'of';\n if (length === 0 || pageSize === 0) {\n return '0 ' + of + ' ' + length;\n }\n length = Math.max(length, 0);\n const startIndex = page * pageSize;\n // If the start index exceeds the list length, do not try and fix the end index to the end.\n const endIndex = startIndex < length ?\n Math.min(startIndex + pageSize, length) :\n startIndex + pageSize;\n return startIndex + 1 + ' - ' + endIndex + ' ' + of + ' ' + length;\n };\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public injectTranslateService(translate: TranslateService) {\n this.translate = translate;\n\n this.translate.onLangChange.subscribe(() => {\n this.translateLabels();\n });\n\n this.translateLabels();\n }\n\n public translateLabels() {\n this.itemsPerPageLabel = this.translate.instant('Items_per_page');\n this.nextPageLabel = this.translate.instant('Next_page');\n this.previousPageLabel = this.translate.instant('Previous_page');\n this.lastPageLabel = this.translate.instant('Last_page');\n this.firstPageLabel = this.translate.instant('First_page');\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n}\n","
\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n
\n","import { AfterViewInit, Component, EventEmitter, forwardRef, HostListener, Input, Output } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { DiscussionMessage, Project, User } from '../../../_common/providers/models';\nimport { ConfirmDialogComponent } from '../../../_common/components/confirm-dialog/confirm-dialog';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\n\nexport const DISCUSSION_MESSAGE_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DiscussionsMessageComponent),\n multi: true\n};\n\n@Component({\n selector: 'discussions-message',\n providers: [DISCUSSION_MESSAGE_VALUE_ACCESSOR],\n styleUrls: ['./message.scss'],\n templateUrl: './message.html'\n})\nexport class DiscussionsMessageComponent implements AfterViewInit, ControlValueAccessor {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public DELETE_MESSAGE_PATTERNS: any = DeleteMessagePattern;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isAuthor: boolean = false;\n\n public message: DiscussionMessage = null;\n public author: User = null;\n\n @Input() public project: Project = null;\n @Input() public deleteMessagePattern: DeleteMessagePattern = DeleteMessagePattern.NONE;\n @Output() public valueChange: EventEmitter = new EventEmitter();\n @Output() public onDeleteMessage: EventEmitter = new EventEmitter();\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n private _title: Title,\n private _router: Router,\n private _route: ActivatedRoute,\n private _translater: TranslateService,\n private _storage: ModelsStorage,\n private _dialoger: MatDialog\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n public writeValue(value: DiscussionMessage): void {\n if (value) {\n this.loadMessage(value)\n .catch((error) => console.log(error));\n } else {\n this.message = null;\n this.author = null;\n }\n }\n\n @HostListener('valueChange')\n public onChange = (_: any) => {\n };\n\n public registerOnChange(fn: any) {\n this.onChange = fn;\n }\n\n public onTouched = () => {\n };\n\n public registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n public onBlur(): void {\n this.onTouched();\n }\n\n public onDeleteMessageClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(ConfirmDialogComponent, {\n data: {\n confirmText: this._translater.instant('Confirm_delete_irreversible')\n }\n });\n dialog.afterClosed().subscribe((confirmed: boolean) => {\n if (confirmed) {\n this.onDeleteMessage.emit(this.message);\n }\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadMessage(message: DiscussionMessage): Promise {\n return new Promise((resolve, reject) => {\n this._storage.fromId(User, [message.createrId], true)\n .then((author: User) => {\n this.message = message;\n this.author = author;\n this.isAuthor = this.author.id === this.currentUser.user.id;\n\n resolve();\n })\n .catch((error) => reject(error));\n });\n }\n}\n\nexport enum DeleteMessagePattern {\n NONE,\n OWN,\n ALL\n}\n","
\n
\n \n
\n
\n
\n
\n
\n chat_bubble_outline {{ title | translate }}\n
\n \n
\n
\n
\n info_outline {{ noMessageText | translate }}\n
\n
0\">\n
messagesDisplayedCount\"\n class=\"show-more-button\">\n \n
\n \n messages.length - messagesDisplayedCount - 1\"\n [(ngModel)]=\"message.message\"\n [deleteMessagePattern]=\"deleteMessagePattern\"\n [project]=\"project\">\n \n
\n
\n
\n
\n \n
\n \n \n = (MESSAGE_MAX_LENGTH - MESSAGE_MAX_LENGTH * 0.1)\"\n align=\"end\">\n {{ messageInput.value.length }} / {{ MESSAGE_MAX_LENGTH }}\n \n \n
\n \n \n
\n
\n info_outline {{ newMessageDisableMessage | translate }}\n
\n
\n
\n
\n","import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, Input, OnDestroy, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Title } from '@angular/platform-browser';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { SyncServiceProvider } from '../../../_common/providers/sync-service';\nimport { DiscussionsProvider } from '../../providers/discussions-provider';\nimport { Discussion, DiscussionMessage, Project } from '../../../_common/providers/models';\nimport { DeleteMessagePattern } from '../message/message';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'discussions-discussion',\n providers: [],\n styleUrls: ['./discussion.scss'],\n templateUrl: './discussion.html'\n})\nexport class DiscussionsDiscussionComponent implements AfterViewInit, OnDestroy {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public MESSAGE_MAX_LENGTH: number = 1000;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n @Input() public newMessagePlaceholder: string = 'Your_comment';\n @Input() public disableNewMessage: boolean = false;\n @Input() public sendAPI: string = null;\n @Input() public deleteAPI: string = null;\n @Input() public project: Project = null;\n @Input() public newMessageDisableMessage: string = null;\n @Input() public isStacked: boolean = true;\n @Input() public isStackable: boolean = true;\n @Input() public title: string = 'Comments';\n @Input() public isShowMore: boolean = true;\n @Input() public messagesDisplayedCount: number = 3;\n @Input() public noMessageText: string = 'No_comment_yet';\n @Input() public autoScrollToBottom: boolean = false;\n @Input() public deleteMessagePattern: DeleteMessagePattern = DeleteMessagePattern.NONE;\n @Input() public focusMessageInputOnLoad: boolean = false;\n @Input() public inputMaxRows: number = 25;\n @ViewChild('messageInput', {static: false}) public messageInput: ElementRef;\n public isLoading: boolean = false;\n public discussion: Discussion = new Discussion();\n public messages: any[] = [];\n public newMessage: string = '';\n public messagesScrollTop: number = 0;\n private _syncListenerId: string = null;\n private _syncMaxId: number = 0;\n\n constructor(\n public conf: Conf,\n public currentUser: CurrentUser,\n private _title: Title,\n private _router: Router,\n private _route: ActivatedRoute,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _sync: SyncServiceProvider,\n private _storage: ModelsStorage,\n private _discussions: DiscussionsProvider,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n private _discussionId;\n\n public get discussionId() {\n return this._discussionId;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set discussionId(value: number) {\n this.isLoading = true;\n this.loadDiscussion(value)\n .then(() => {\n if (this.autoScrollToBottom) {\n this.scrollToBottom();\n }\n this.isLoading = false;\n })\n .catch((error) => this.onError(error));\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n if (this.focusMessageInputOnLoad) {\n this.focusInput();\n }\n }\n\n public ngOnDestroy() {\n if (this._syncListenerId) {\n this._sync.removeSyncListener(this._syncListenerId);\n }\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onInputChange(): void {\n if (this.newMessage.length > this.MESSAGE_MAX_LENGTH) {\n this.newMessage = this.newMessage.substr(0, this.MESSAGE_MAX_LENGTH);\n }\n }\n\n public onSendClicked(): void {\n this.isLoading = true;\n this.sendNewMessage()\n .then(() => {\n // this.isShowMore = true;\n this.isLoading = false;\n if (this.autoScrollToBottom) {\n this.scrollToBottom();\n }\n })\n .catch((error) => this.onError(error));\n }\n\n public onShowMoreClicked(): void {\n this.isShowMore = true;\n }\n\n public onExpandClicked(): void {\n this.isStacked = false;\n }\n\n public onContractClicked(): void {\n this.isStacked = true;\n }\n\n public onDeleteMessage(message: DiscussionMessage): void {\n if (this.deleteAPI) {\n this.isLoading = true;\n this._discussions.deleteMessage(this.deleteAPI, message)\n .then(() => {\n for (let i = 0; i < this.messages.length; i++) {\n if (this.messages[i].message.id === message.id) {\n this.messages.splice(i, 1);\n this.isLoading = false;\n return;\n }\n }\n\n this.isLoading = false;\n })\n .catch((error) => this.onError(error));\n }\n }\n\n public focusInput(): void {\n setTimeout(() => {\n this.messageInput.nativeElement.focus();\n }, 1);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadDiscussion(discussionId: number): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.fromId(Discussion, [discussionId]),\n this._storage.select(DiscussionMessage).where('discussionId').equals(discussionId).get()\n ])\n .then((results: any[]) => {\n this._discussionId = discussionId;\n this.discussion = results[0];\n this.messages = [];\n for (let i = 0; i < results[1].length; i++) {\n this.pushMessage(results[1][i]);\n }\n\n this.initSync();\n\n resolve();\n })\n .catch((error) => reject(error));\n });\n }\n\n private sendNewMessage(): Promise {\n return new Promise((resolve, reject) => {\n if (this.sendAPI) {\n const message: DiscussionMessage = new DiscussionMessage();\n message.message = this.newMessage;\n message.createrId = this.currentUser.user.id;\n this._discussions.sendNewMessage(this.sendAPI, message)\n .then((result: DiscussionMessage) => {\n this.pushMessage(result);\n this.messagesDisplayedCount++;\n this.newMessage = '';\n\n resolve(result);\n })\n .catch((error) => reject(error));\n } else {\n reject({error: 'No sending API defined'});\n }\n });\n }\n\n private pushMessage(message: DiscussionMessage): void {\n // hack pour corriger un problème d'assignation de variables dans les template angular\n // si on parcourt directement la liste des messages et qu'on fait un [(ngModel)] sur\n // chaque message, ca fait planter.\n // si on utilise un index et qu'on assigne [(ngModel)] sur la valeur du tableau à cet index\n // ca plante aussi\n this.messages.push({message});\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n\n private scrollToBottom(): void {\n setTimeout(() => this.messagesScrollTop += 100000, 50);\n }\n\n private initSync(): void {\n if (this._syncListenerId) {\n this._sync.removeSyncListener(this._syncListenerId);\n }\n this._syncMaxId = 0;\n if (this.messages.length > 0) {\n this._syncMaxId = this.messages[this.messages.length - 1].message.id;\n }\n this._syncListenerId = this._sync.addSyncListener({\n id: null,\n onCommonDataSynced: null,\n onUserDataSynced: () => {\n this.checkForNewMessages();\n }\n });\n }\n\n private checkForNewMessages(): void {\n this._storage.select(DiscussionMessage)\n .where('discussionId').equals(this.discussionId)\n .and('id').greater(this._syncMaxId)\n .get()\n .then((newMessages: DiscussionMessage[]) => {\n let hasNewMessage: boolean = false;\n let newSyncMaxId: number = this._syncMaxId;\n for (let i = 0; i < newMessages.length; i++) {\n // le message peut déjà être dans la liste s'il a été écrit par l'utilisateur connecté\n // dans ce cas on ne l'ajoute pas\n let alreadyIn: boolean = false;\n for (let j = this.messages.length - 1; !alreadyIn && j >= 0 && this.messages[j].message.id >= this._syncMaxId; j--) {\n alreadyIn = this.messages[j].message.id === newMessages[i].id;\n }\n\n if (!alreadyIn) {\n this.pushMessage(newMessages[i]);\n this.messagesDisplayedCount++;\n hasNewMessage = true;\n }\n }\n\n if (hasNewMessage) {\n this.scrollToBottom();\n for (let i = this.messages.length - 1; i >= 0 && this.messages[i].message.id !== this._syncMaxId; i--) {\n if (this.messages[i].message.id > newSyncMaxId) {\n newSyncMaxId = this.messages[i].message.id;\n }\n }\n this._syncMaxId = newSyncMaxId;\n }\n })\n .catch((error: any) => this.onError(error));\n }\n}\n","\n \n
\n \n
\n \n
\n \n \n supervised_user_circle\n \n \n \n \n \n
\n
{{ discussionName }}
\n
\n \n \n {{ userData.user.firstName + ' ' + userData.user.lastName }}\n \n \n \n \n {{ 'Last_seen' | translate }}: \n \n {{ activePrivateDiscussion.data.usersData[0].privateDiscussion_user.lastSeen | dateClosest }}\n \n \n {{ 'not_yet' | translate }}\n \n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n","import { AfterViewInit, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { DiscussionsDiscussionComponent } from '../discussion/discussion';\nimport { Conf } from '../../../_conf';\nimport { Utils } from '../../../_common/providers/utils';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { ActivePrivateDiscussion, DiscussionsProvider } from '../../providers/discussions-provider';\nimport { CurrentUser } from '../../../_common/providers/current-user';\n\n@Component({\n selector: 'discussions-private-discussion-window',\n providers: [],\n styleUrls: ['./private-discussion-window.scss'],\n templateUrl: './private-discussion-window.html'\n})\nexport class DiscussionsPrivateDiscussionWindowComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Output() public activePrivateDiscussionChange: EventEmitter = new EventEmitter();\n @Output() public onClose: EventEmitter = new EventEmitter();\n @ViewChild('discussionComponent', {static: false}) public discussionComponent: DiscussionsDiscussionComponent;\n public discussionName: string = '';\n private _activePrivatediscussion: ActivePrivateDiscussion = null;\n\n constructor(\n public conf: Conf,\n public utils: Utils,\n public discussions: DiscussionsProvider,\n public currentUser: CurrentUser,\n private _translater: TranslateService,\n private _storage: ModelsStorage\n ) {\n }\n\n public get activePrivateDiscussion() {\n return this._activePrivatediscussion;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set activePrivateDiscussion(data: ActivePrivateDiscussion) {\n this._activePrivatediscussion = data;\n this.updateDiscussionName();\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n public onToggleClicked(): void {\n this._activePrivatediscussion.isMinimized = !this._activePrivatediscussion.isMinimized;\n if (!this._activePrivatediscussion.isMinimized && this.discussionComponent) {\n this.discussionComponent.focusInput();\n }\n this.activePrivateDiscussionChange.emit(this._activePrivatediscussion);\n this.discussions.updateLastSeen(this.activePrivateDiscussion.data.privateDiscussion_user)\n .catch((error: any) => console.log(error));\n }\n\n public onCloseClicked(event: any): void {\n event.stopPropagation();\n this.onClose.emit();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private updateDiscussionName(): void {\n if (this.activePrivateDiscussion.data.privateDiscussion.isGroup) {\n this.discussionName = this.activePrivateDiscussion.data.privateDiscussion.name;\n } else {\n this.discussionName =\n this.activePrivateDiscussion.data.usersData[0].user.firstName +\n ' ' +\n this.activePrivateDiscussion.data.usersData[0].user.lastName;\n }\n }\n}\n","
{{ title | translate }}
\n\n
\n \n \n {{ 'Field_required' | translate }}\n {{ nameFormControl.value.length }} / {{ MAX_LENGTH }}\n \n
\n \n
\n
{{ 'Group_participants' | translate }}
\n
{{ 'No_user_yet' | translate }}
\n 0\"\n class=\"search-bar\"\n color=\"primary\">\n \n search\n \n 0\"\n [dataSource]=\"usersDataSource\">\n \n \n \n \n \n \n \n account_circle\n \n \n \n \n \n \n
{{ row.user.firstName + ' ' + row.user.lastName }}
\n
\n
\n \n \n \n \n \n \n \n
\n \n \n
\n
\n\n \n \n\n
\n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { Utils } from '../../../_common/providers/utils';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { SimpleMatDataSource } from '../../../_common/providers/simple-mat-data-source';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { DiscussionsProvider, PrivateDiscussionData } from '../../providers/discussions-provider';\nimport { Conf } from '../../../_conf';\nimport { PrivateDiscussion, PrivateDiscussion_User, User } from '../../../_common/providers/models';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'discussions-edit-group-dialog',\n providers: [],\n styleUrls: ['./edit-group-dialog.scss'],\n templateUrl: './edit-group-dialog.html'\n})\nexport class DiscussionsEditGroupDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public MAX_LENGTH: number = 100;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public title: string = 'New_group';\n public isLoading: boolean = true;\n\n public usersDataSource: SimpleMatDataSource = new SimpleMatDataSource([]);\n public usersColumns: string[] = ['image', 'name', 'actions'];\n\n @ViewChild(MatPaginator, {static: false}) public usersPaginator: MatPaginator;\n\n public nameFormControl: FormControl = new FormControl('', [\n Validators.required\n ]);\n\n private _privateDiscussion: PrivateDiscussion = null;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public dialog: MatDialogRef,\n public utils: Utils,\n private _toaster: MatSnackBar,\n private _currentUser: CurrentUser,\n private _storage: ModelsStorage,\n private _translater: TranslateService,\n private _discussions: DiscussionsProvider,\n private _changeDetector: ChangeDetectorRef,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n if (_data.privateDiscussion) {\n this._privateDiscussion = _data.privateDiscussion;\n this.nameFormControl.setValue(this._privateDiscussion.name);\n } else {\n this._privateDiscussion = new PrivateDiscussion();\n this._privateDiscussion.isGroup = 1;\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.loadData()\n .then(() => {\n this.isLoading = false;\n this.usersDataSource.paginator = this.usersPaginator;\n })\n .catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public canSave(): boolean {\n return !this.isLoading\n && !this.nameFormControl.invalid;\n }\n\n public onFilterUsersKeyup(filter: string): void {\n this.usersDataSource.filter = filter.trim().toLowerCase();\n }\n\n public onSubmitClicked(): void {\n this.isLoading = true;\n this.save()\n .then((group: PrivateDiscussion) => {\n this._discussions.startGroupDiscussion(group)\n .then(() => {\n this._toaster.open(this._translater.instant('Group_saved'), '', {duration: 5000});\n this.dialog.close({});\n })\n .catch((error: any) => this.onError(error));\n\n })\n .catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(): Promise {\n return new Promise((resolve, reject) => {\n Promise.all([\n this._storage.select(User)\n .get(),\n this._storage.select(PrivateDiscussion_User)\n .where('privateDiscussionId').equals(this._privateDiscussion.id)\n .get()\n ])\n .then((data: any[]) => {\n data[0].sort((a: User, b: User) => this.utils.sortRow(a.firstName + ' ' + a.lastName, b.firstName + ' ' + b.lastName));\n if (this._privateDiscussion.discussionId) {\n\n }\n\n const rows: UsersListRow[] = [];\n for (let i = 0; i < data[0].length; i++) {\n if (data[0][i].id !== this._currentUser.user.id) {\n rows.push({\n user: data[0][i],\n isSelected: this.utils.findIn(data[0][i].id, data[1], 'userId') !== null\n });\n }\n }\n\n this.usersDataSource.replaceAllWith(rows);\n\n resolve();\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private save(): Promise {\n return new Promise((resolve, reject) => {\n const privateDiscussion: PrivateDiscussion = this._privateDiscussion.clone();\n privateDiscussion.name = this.nameFormControl.value;\n\n const usersIds: number[] = [this._currentUser.user.id];\n for (let i = 0; i < this.usersDataSource.count; i++) {\n const row: UsersListRow = this.usersDataSource.get(i);\n if (row.isSelected) {\n usersIds.push(row.user.id);\n }\n }\n\n this._discussions.savePrivateDiscussion(privateDiscussion, usersIds)\n .then((data: PrivateDiscussionData) => {\n resolve(data.privateDiscussion);\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n\n console.log(error);\n }\n}\n\nexport interface UsersListRow {\n user: User;\n isSelected: boolean;\n}\n","
\n \n
\n\n
{{ 'Private_discussions' | translate }}
\n
\n {{ 'You_have_no_discussion_yet' | translate }}\n
\n 0\">\n
\n
\n \n \n supervised_user_circle\n \n \n \n \n
\n
\n
\n
\n \n {{ privateDiscussionData.privateDiscussion.name }}\n \n \n {{ privateDiscussionData.usersData[0].user.firstName + ' ' + privateDiscussionData.usersData[0].user.lastName }}\n \n
\n
\n 0\">\n {{ privateDiscussionData.messages[privateDiscussionData.messages.length - 1].createDate | dateClosest:'closest-short' }}\n \n \n {{ privateDiscussionData.privateDiscussion.createDate | dateClosest:'closest-short' }}\n \n
\n
\n
\n
\n 0\">\n {{ privateDiscussionData.messages[privateDiscussionData.messages.length - 1].message }}\n \n
\n
\n {{ privateDiscussionData.unreadMessagesCount }}\n
\n
\n
\n
\n
\n \n
\n
0\"\n class=\"active-discussions-container\">\n \n
\n","import { AfterViewInit, Component } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Conf } from '../../../_conf';\nimport { DiscussionsEditGroupDialogComponent } from '../edit-group-dialog/edit-group-dialog';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { ActivePrivateDiscussion, DiscussionsProvider, PrivateDiscussionData } from '../../providers/discussions-provider';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'discussions-private-discussions-menu',\n providers: [],\n styleUrls: ['./private-discussions-menu.scss'],\n templateUrl: './private-discussions-menu.html'\n})\nexport class DiscussionsPrivateDiscussionsMenuComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public discussions: DiscussionsProvider,\n private _translater: TranslateService,\n private _dialoger: MatDialog,\n private _currentUser: CurrentUser,\n private _storage: ModelsStorage\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n public onPrivateDiscussionClicked(discussionData: PrivateDiscussionData): void {\n if (discussionData.privateDiscussion.isGroup) {\n this.discussions.startGroupDiscussion(discussionData.privateDiscussion)\n .catch((error: any) => this.onError(error));\n } else {\n this.discussions.startOneToOneDiscussion(discussionData.usersData[0].user)\n .catch((error: any) => this.onError(error));\n }\n }\n\n public onPrivateDiscussionClosed(discussion: ActivePrivateDiscussion): void {\n this.discussions.closePrivateDiscussion(discussion);\n }\n\n public onCreateGroupClicked(): void {\n const dialog: MatDialogRef = this._dialoger.open(DiscussionsEditGroupDialogComponent, {\n data: {}\n });\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Utils } from '../../_common/providers/utils';\nimport { Conf } from '../../_conf';\nimport { ApiBaseService } from '../../_common/providers/api-base-service';\nimport { ModelsStorage } from '../../_common/providers/models-storage';\nimport { CurrentUser } from '../../_common/providers/current-user';\nimport { LikeCounter_User } from '../../_common/providers/models';\n\n@Injectable()\nexport class LikeCountersProvider {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _conf: Conf,\n private _utils: Utils,\n private _api: ApiBaseService,\n private _storage: ModelsStorage,\n private _currentUser: CurrentUser\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public updateLike(api: string, like: boolean): Promise {\n return new Promise((resolve, reject) => {\n this._api.call(\n 'post',\n api,\n {\n like: like ? 1 : 0\n },\n this._currentUser.getAccessToken()\n )\n .then((result: any) => {\n const item: LikeCounter_User = LikeCounter_User.fromAPI(result.likeCounter_user);\n this._storage.save([item])\n .then(() => resolve(item))\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","\n\n\n
\n {{ likeCounter_users.length }}\n
\n","import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Utils } from '../../../_common/providers/utils';\nimport { LikeCountersProvider } from '../../providers/like-counters-provider';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { LikeCounter_User, User } from '../../../_common/providers/models';\n\n@Component({\n selector: 'like-counters-like-counter',\n providers: [],\n styleUrls: ['./like-counter.scss'],\n templateUrl: './like-counter.html'\n})\nexport class LikeCountersLikeCounterComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n public MAX_DISPLAYED_LIKERS: number = 10;\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n public isUserLiking: boolean = false;\n public likeCounter_users: LikeCounter_User[] = [];\n public likers: User[] = [];\n public likersNames: string = '';\n\n @Input() public disabled: boolean = false;\n @Input() public likeAPI: string = null;\n @Output() public likeCounterIdChange: EventEmitter = new EventEmitter();\n @Output() public userChange: EventEmitter = new EventEmitter();\n @Output() public onLikeChanged: EventEmitter = new EventEmitter();\n\n constructor(\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _utils: Utils,\n private _likeCounters: LikeCountersProvider,\n private _storage: ModelsStorage\n ) {\n }\n\n private _likeCounterId: number = 0;\n\n public get likeCounterId() {\n return this._likeCounterId;\n }\n\n @Input()\n public set likeCounterId(id: number) {\n this.isLoading = true;\n this.loadData(id)\n .then(() => {\n this.updateIsUserLiking();\n this.isLoading = false;\n })\n .catch((error: any) => this.onError(error));\n }\n\n private _user: User = null;\n\n public get user() {\n return this._user;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n @Input()\n public set user(user: User) {\n this._user = user;\n this.updateIsUserLiking();\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onCounterClicked(event: any): void {\n this.onLikeClicked(event);\n }\n\n public onLikeClicked(event: any): void {\n event.stopPropagation();\n if (!this.disabled && this.likeAPI && this.user) {\n this.isLoading = true;\n this.like(!this.isUserLiking)\n .then(() => {\n this.updateIsUserLiking();\n this.updateLikersNames();\n this.isLoading = false;\n this.onLikeChanged.emit(this.isUserLiking);\n })\n .catch((error: any) => this.onError(error));\n }\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadData(likeCounterId: number): Promise {\n return new Promise((resolve, reject) => {\n this._storage.select(LikeCounter_User)\n .where('likeCounterId').equals(likeCounterId)\n .get()\n .then((likeCounter_users: LikeCounter_User[]) => {\n this._storage.fromIds(User, this._utils.getKeyValues(likeCounter_users, 'userId'))\n .then((users: User[]) => {\n this._likeCounterId = likeCounterId;\n this.likeCounter_users = likeCounter_users;\n this.likers = users;\n this.updateLikersNames();\n resolve();\n })\n .catch((error: any) => reject(error));\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private updateIsUserLiking(): void {\n if (!this._user) {\n this.isUserLiking = false;\n return;\n }\n\n this.isUserLiking = this._utils.findIn(this._user.id, this.likeCounter_users, 'userId') ? true : false;\n }\n\n private updateLikersNames(): void {\n const likersNames: string[] = [];\n for (let i = 0; i < this.likers.length && i < this.MAX_DISPLAYED_LIKERS; i++) {\n likersNames.push(this.likers[i].firstName + ' ' + this.likers[i].lastName);\n }\n\n if (this.likers.length > this.MAX_DISPLAYED_LIKERS) {\n likersNames.splice(this.MAX_DISPLAYED_LIKERS - 1, 1);\n likersNames.push(this._translater.instant('And_x_more_people', {count: this.likers.length - this.MAX_DISPLAYED_LIKERS + 1}));\n }\n\n // this.likersNames = likersNames.join(',\\n'); // pour l'instant on affiche pas les noms de ceux qui aiment, mais ca pourrait revenir ...\n if (likersNames.length === 1) {\n this.likersNames = this._translater.instant('One_people_like_this');\n } else if (likersNames.length > 1) {\n this.likersNames = this._translater.instant('N_people_like_this', {count: this.likers.length});\n } else {\n this.likersNames = '';\n }\n }\n\n private like(like: boolean): Promise {\n return new Promise((resolve, reject) => {\n this._likeCounters.updateLike(this.likeAPI, like)\n .then((likeCounter_user: LikeCounter_User) => {\n if (like) {\n this.likeCounter_users.push(likeCounter_user);\n this.likers.push(this.user);\n resolve();\n } else {\n for (let i = 0; i < this.likeCounter_users.length; i++) {\n if (this.likeCounter_users[i].userId === likeCounter_user.userId) {\n this.likeCounter_users.splice(i, 1);\n i = this.likeCounter_users.length;\n }\n }\n for (let i = 0; i < this.likers.length; i++) {\n if (this.likers[i].id === likeCounter_user.userId) {\n this.likers.splice(i, 1);\n i = this.likers.length;\n }\n }\n\n resolve();\n }\n })\n .catch((error: any) => reject(error));\n });\n }\n\n private onError(error: any): void {\n this.isLoading = false;\n this._toaster.open(this._translater.instant('Error_unknown'), '', {duration: 5000});\n console.log(error);\n }\n}\n","
\n \n
\n\n
{{ 'Todo_list' | translate }}
\n
\n {{ 'All_caught_up' | translate }}\n
\n 0\">\n
\n
\n {{ notification.icon }}\n
\n
\n
\n {{ notification.legend | ellipsize:35 }}\n
\n
{{ notification.title | ellipsize:25 }}
\n
\n {{ notification.text | ellipsize:80 }}\n
\n
\n
\n
\n
\n","import { AfterViewInit, Component } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Notification, NotificationsProvider } from '../../providers/notifications-provider';\n\n@Component({\n selector: 'notifications-notifications-menu',\n providers: [],\n styleUrls: ['./notifications-menu.scss'],\n templateUrl: './notifications-menu.html'\n})\nexport class NotificationsNotificationsMenuComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public notifications: NotificationsProvider,\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onNotificationClicked(notification: Notification): void {\n\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","
\n
{{ label | translate }}
\n
\n \n
{{ value }}
\n
\n
\n \n \n \n {{ availableMark }}\n \n \n \n
{{ value }}
\n
\n
\n","import { AfterViewInit, Component, EventEmitter, forwardRef, HostListener, Input, Output } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\n\nexport const REVIEW_MARK_SELECT_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ReviewMarksReviewMarkSelectComponent),\n multi: true\n};\n\n// doc pour le ngModel : http://almerosteyn.com/2016/04/linkup-custom-control-to-ngcontrol-ngmodel\n\n@Component({\n selector: 'review-marks-review-mark-select',\n providers: [REVIEW_MARK_SELECT_VALUE_ACCESSOR],\n styleUrls: ['./review-mark-select.scss'],\n templateUrl: './review-mark-select.html'\n})\nexport class ReviewMarksReviewMarkSelectComponent implements AfterViewInit, ControlValueAccessor {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public label: string = '';\n @Input() public minValue: number = 0;\n @Input() public maxValue: number = 5;\n @Input() public lowerIcon: string = 'star';\n @Input() public greaterIcon: string = 'star_border';\n @Input() public value: number = 0;\n @Input() public disabled: boolean = false;\n @Output() public valueChange: EventEmitter = new EventEmitter();\n @Output('select') public onSelectEvent: EventEmitter = new EventEmitter();\n\n public availableMarks: number[] = [];\n public roundedValue: number = 0;\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n for (let i = this.minValue; i <= this.maxValue; i++) {\n this.availableMarks.push(i);\n }\n }\n\n public writeValue(value: any): void {\n this.value = value;\n this.roundedValue = Math.round(this.value);\n }\n\n @HostListener('valueChange')\n public onChange = (_: any) => {\n };\n\n public registerOnChange(fn: any) {\n this.onChange = fn;\n }\n\n public onTouched = () => {\n };\n\n public registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n public onBlur(): void {\n this.onTouched();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onMarkClicked(value: number): void {\n this.writeValue(value);\n this.onChange(value);\n this.onSelect(value);\n }\n\n public onMarkSelectChanged(): void {\n this.onChange(this.value);\n this.onSelect(this.value);\n }\n\n public onSelect(value: number): void {\n this.onSelectEvent.emit(value);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","
\n \n
{{ text }}
\n
\n","import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'tags-tag',\n providers: [],\n styleUrls: ['./tag.scss'],\n templateUrl: './tag.html'\n})\nexport class TagsTagComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public text: string = '';\n @Input() public color: string = '#000';\n @Input() public textColor: string = '#fff';\n @Input() public actionIcon: string = null;\n @Input() public actionTooltip: string = null;\n @Output('action') public action: EventEmitter = new EventEmitter();\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onActionClicked(): void {\n this.action.emit(true);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","
{{ 'New_tag' | translate }}
\n\n \n \n {{ 'Tag_name_required' | translate }}\n \n
{{ 'Tag_color' | translate }}
\n
\n
\n check\n
\n
\n
\n\n \n \n\n","import { AfterViewInit, Component, Inject } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { Utils } from '../../../_common/providers/utils';\nimport { Tag } from '../../../_common/providers/models';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'tags-tag-picker',\n providers: [],\n styleUrls: ['./tag-picker.scss'],\n templateUrl: './tag-picker.html'\n})\nexport class TagsTagPickerComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public submitText: string = 'Add';\n\n public tagNameFormControl: FormControl = new FormControl('', [\n Validators.required\n ]);\n\n public tag: Tag = new Tag();\n\n public availableColors: any[] = [\n {color: '#f34336', textColor: '#fff'},\n {color: '#e81e63', textColor: '#fff'},\n {color: '#9c27b0', textColor: '#fff'},\n {color: '#673ab7', textColor: '#fff'},\n {color: '#3f51b5', textColor: '#fff'},\n {color: '#2196f2', textColor: '#fff'},\n {color: '#03a9f3', textColor: '#fff'},\n {color: '#00bcd3', textColor: '#fff'},\n {color: '#009688', textColor: '#fff'},\n {color: '#4caf50', textColor: '#fff'},\n {color: '#8bc24a', textColor: '#000'},\n {color: '#ccdb39', textColor: '#000'},\n {color: '#feea3b', textColor: '#000'},\n {color: '#fec007', textColor: '#000'},\n {color: '#fe9800', textColor: '#000'},\n {color: '#fe5722', textColor: '#fff'},\n {color: '#795548', textColor: '#fff'},\n {color: '#9e9e9e', textColor: '#fff'},\n {color: '#607d8b', textColor: '#fff'},\n {color: '#212121', textColor: '#fff'}\n ];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public dialog: MatDialogRef,\n private _utils: Utils,\n private _translater: TranslateService,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n if (_data && _data.tag) {\n this.tag = _data.tag;\n this.tagNameFormControl.setValue(this.tag.name);\n } else {\n this.selectColor(0);\n }\n\n if (_data && _data.submitText) {\n this.submitText = _data.submitText;\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onColorClicked(index: number): void {\n this.selectColor(index);\n }\n\n public onAddClicked(): void {\n this.add();\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private selectColor(index: number): void {\n this.tag.colorHex = this.availableColors[index].color;\n this.tag.textColorHex = this.availableColors[index].textColor;\n }\n\n private add(): void {\n if (!this.tag.id) {\n const id: any = this._utils.randomString(16, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');\n this.tag.id = id;\n }\n\n this.tag.name = this.tagNameFormControl.value;\n this.dialog.close(this.tag);\n }\n}\n","
\n \n \n
\n","import { AfterViewInit, Component, EventEmitter, forwardRef, HostListener, Input, Output } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\n\nexport const TAG_SELECT_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TagsTagSelectComponent),\n multi: true\n};\n\n// doc pour le ngModel : http://almerosteyn.com/2016/04/linkup-custom-control-to-ngcontrol-ngmodel\n\n@Component({\n selector: 'tags-tag-select',\n providers: [TAG_SELECT_VALUE_ACCESSOR],\n styleUrls: ['./tag-select.scss'],\n templateUrl: './tag-select.html'\n})\nexport class TagsTagSelectComponent implements AfterViewInit, ControlValueAccessor {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public tags: TagData[] = [];\n @Input() public values: number[] = [];\n @Input() public disabled: boolean = false;\n @Output() public valueChange: EventEmitter = new EventEmitter();\n @Output('select') public onSelectEvent: EventEmitter = new EventEmitter();\n @Output('unselect') public onUnselectEvent: EventEmitter = new EventEmitter();\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n private _translater: TranslateService\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n }\n\n public writeValue(value: any): void {\n if (value) {\n this.values = value;\n } else {\n this.values = [];\n }\n }\n\n @HostListener('valueChange')\n public onChange = (_: any) => {\n };\n\n public registerOnChange(fn: any) {\n this.onChange = fn;\n }\n\n public onTouched = () => {\n };\n\n public registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n public onBlur(): void {\n this.onTouched();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public isSelected(tag: TagData): boolean {\n return this.getSelectionIndex(tag) >= 0;\n }\n\n public onTagClicked(tag: TagData): void {\n if (this.disabled) {\n return;\n }\n\n const index: number = this.getSelectionIndex(tag);\n if (index >= 0) {\n this.values.splice(index, 1);\n this.onUnselect(tag);\n } else {\n this.values.push(tag.id);\n this.onSelect(tag);\n }\n\n this.onChange(this.values);\n }\n\n public onSelect(tag: TagData): void {\n this.onSelectEvent.emit(tag);\n }\n\n public onUnselect(tag: TagData): void {\n this.onUnselectEvent.emit(tag);\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private getSelectionIndex(tag: TagData): number {\n for (let i = 0; i < this.values.length; i++) {\n if (this.values[i] === tag.id) {\n return i;\n }\n }\n\n return -1;\n }\n}\n\nexport interface TagData {\n\n id: number;\n text: string;\n colorHex: string;\n textColorHex: string;\n\n}\n","import { BehaviorSubject, Observable } from 'rxjs';\nimport { DataSource } from '@angular/cdk/collections';\n\nexport class SimpleDataSource extends DataSource {\n public data: BehaviorSubject = new BehaviorSubject([]);\n\n constructor(_data: any[]) {\n super();\n this._count = _data.length;\n this.data.next(_data);\n }\n\n private _count: number = 0;\n\n public get count() {\n return this._count;\n }\n\n public set count(count: number) {\n }\n\n public connect(): Observable {\n return this.data;\n }\n\n public disconnect() {\n }\n\n public push(item: any): void {\n const data: any[] = this.data.value;\n data.push(item);\n this._count = data.length;\n this.data.next(data);\n }\n\n public set(index: number, item: any): void {\n const data: any[] = this.data.value;\n data[index] = item;\n this.data.next(data);\n }\n\n public get(index: number): any {\n return this.data.value[index];\n }\n\n public getAll(): any[] {\n return this.data.value;\n }\n\n public remove(index: number): void {\n const data: any[] = this.data.value;\n data.splice(index, 1);\n this._count = data.length;\n this.data.next(data);\n }\n}\n","\n
\n
\n \n
\n
{{ user.firstName + ' ' + user.lastName }}
\n
{{ user.intro }}
\n
0\" class=\"user-links\">\n \n \n \n
\n
\n
\n\n \n \n \n \n\n","import { AfterViewInit, ChangeDetectorRef, Component, Inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { Utils } from '../../../_common/providers/utils';\nimport { Conf } from '../../../_conf';\nimport { CurrentUser } from '../../../_common/providers/current-user';\nimport { UsersProvider } from '../../providers/users-provider';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { DiscussionsProvider } from '../../../discussions/providers/discussions-provider';\nimport { User } from '../../../_common/providers/models';\n\n@Component({\n selector: 'users-user-profile-dialog',\n providers: [],\n styleUrls: ['./user-profile-dialog.scss'],\n templateUrl: './user-profile-dialog.html'\n})\nexport class UsersUserProfileDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public user: User = new User();\n public userLinksData: any[] = [];\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public dialog: MatDialogRef,\n public utils: Utils,\n public currentUser: CurrentUser,\n private _translater: TranslateService,\n private _storage: ModelsStorage,\n private _discussions: DiscussionsProvider,\n private _users: UsersProvider,\n private _changeDetector: ChangeDetectorRef,\n private _router: Router,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n if (_data.user) {\n this.user = this._data.user;\n this.loadUserLinks();\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onDiscussClicked(): void {\n this._discussions.startOneToOneDiscussion(this.user)\n .catch((error: any) => this.onError(error));\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadUserLinks(): void {\n this._users.getUserUserLinksData(this.user.id, false)\n .then((data: any[]) => this.userLinksData = data)\n .catch((error: any) => this.onError(error));\n }\n\n private onError(error: any): void {\n console.log(error);\n }\n}\n","
\n \n \n \n account_circle\n \n
\n
{{ user.firstName + ' ' + user.lastName }}
\n
{{ user.email }}
\n
{{ 'Registered_since' | translate }}\n : {{ user.createDate | dateClosest }}
\n
{{ legend }}
\n
\n
\n \n \n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { Conf } from '../../../_conf';\nimport { Project, User } from '../../../_common/providers/models';\nimport { UsersUserProfileDialogComponent } from '../user-profile-dialog/user-profile-dialog';\n\n@Component({\n selector: 'users-user-sticker',\n providers: [],\n styleUrls: ['./user-sticker.scss'],\n templateUrl: './user-sticker.html'\n})\nexport class UsersUserStickerComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public user: User = new User();\n @Input() public isEmailVisible: boolean = false;\n @Input() public isRegistrationDateVisible: boolean = false;\n @Input() public legend: string = '';\n @Input() public avatarHideable450: boolean = false;\n @Input() public avatarOnly: boolean = false;\n @Input() public avatarOnlyTooltip: string = null;\n @Input() public project: Project = null;\n @Input() public orientation: string = 'left';\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n private _translater: TranslateService,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n if (!this.avatarOnlyTooltip) {\n this.avatarOnlyTooltip = this.user.firstName + ' ' + this.user.lastName;\n this._changeDetector.detectChanges();\n }\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onClicked(event: any): void {\n event.stopPropagation();\n const dialog: MatDialogRef = this._dialoger.open(UsersUserProfileDialogComponent, {\n data: {\n user: this.user,\n project: this.project\n }\n });\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n}\n","
{{ 'Add_users' | translate }}
\n\n
{{ 'There_is_no_available_user' | translate }}
\n 0\">\n
\n
{{ 'Name' | translate }}
\n
\n
\n \n \n
\n
\n
\n\n \n \n\n
\n \n
\n","import { AfterViewInit, ChangeDetectorRef, Component, Inject } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Utils } from '../../../_common/providers/utils';\nimport { Conf } from '../../../_conf';\nimport { UsersProvider } from '../../providers/users-provider';\nimport { ModelsStorage } from '../../../_common/providers/models-storage';\nimport { LangsProvider } from '../../../_common/providers/langs-provider';\nimport { SimpleDataSource } from '../../../_common/providers/simple-data-source';\nimport { User } from '../../../_common/providers/models';\n\n@Component({\n selector: 'users-pick-users-dialog',\n providers: [],\n styleUrls: ['./pick-users-dialog.scss'],\n templateUrl: './pick-users-dialog.html'\n})\nexport class UsersPickUsersDialogComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n public isLoading: boolean = false;\n\n public availableUsersDataSource: SimpleDataSource = new SimpleDataSource([]);\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n constructor(\n public conf: Conf,\n public dialog: MatDialogRef,\n public utils: Utils,\n private _translater: TranslateService,\n private _toaster: MatSnackBar,\n private _storage: ModelsStorage,\n private _users: UsersProvider,\n private _langs: LangsProvider,\n private _changeDetector: ChangeDetectorRef,\n @Inject(MAT_DIALOG_DATA) private _data\n ) {\n if (_data.availableUsers) {\n this.loadDataSource(_data.availableUsers);\n }\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public onAddClicked(): void {\n this.dialog.close(this.getSelectedUsers());\n }\n\n public getSelectedUsers(): User[] {\n const items: User[] = [];\n for (let i = 0; i < this.availableUsersDataSource.data.value.length; i++) {\n if (this.availableUsersDataSource.data.value[i].selected) {\n items.push(this.availableUsersDataSource.data.value[i].user);\n }\n }\n\n return items;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private loadDataSource(availableUsers: User[]): void {\n const items: any[] = [];\n for (let i = 0; i < availableUsers.length; i++) {\n items.push({\n user: availableUsers[i],\n selected: false\n });\n }\n\n this.availableUsersDataSource = new SimpleDataSource(items);\n }\n}\n","\n \n \n \n
\n
\n \n
\n
{{ getUserName(user) }}
\n
\n
\n
\n {{ 'Select_a_valid_user' | translate }}\n
\n","import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormControl, Validators } from '@angular/forms';\nimport { map, startWith } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Utils } from '../../../_common/providers/utils';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Conf } from '../../../_conf';\nimport { User } from '../../../_common/providers/models';\n\n@Component({\n selector: 'users-user-picker',\n providers: [],\n styleUrls: ['./user-picker.scss'],\n templateUrl: './user-picker.html'\n})\nexport class UsersUserPickerComponent implements AfterViewInit {\n\n //\n //\n // CONSTANTS\n //\n //\n\n //\n //\n // STATICS\n //\n //\n\n //\n //\n // ATTRIBUTES\n //\n //\n\n @Input() public availableUsers: User[] = [];\n @Output() public pickedUserChange: EventEmitter = new EventEmitter();\n @Output() public userPicked: EventEmitter = new EventEmitter();\n public userFormControl: FormControl = new FormControl('', [\n Validators.required,\n // doc : https://blog.thoughtram.io/angular/2016/03/14/custom-validators-in-angular-2.html#building-a-custom-validator\n (control: any) => {\n return this.checkUser() ? null : {exists: {valid: false}};\n },\n ]);\n public filteredUsers: Observable = null;\n\n constructor(\n public conf: Conf,\n private _utils: Utils,\n private _translater: TranslateService,\n private _dialoger: MatDialog,\n private _changeDetector: ChangeDetectorRef\n ) {\n }\n\n private _pickedUser: User = null;\n\n @Input()\n public get pickedUser() {\n return this._pickedUser;\n }\n\n //\n //\n // CONSTRUCTOR\n //\n //\n\n public set pickedUser(user) {\n this._pickedUser = user;\n this.pickedUserChange.emit(user);\n }\n\n //\n //\n // SUPER METHODS\n //\n //\n\n public ngAfterViewInit() {\n this.filteredUsers = this.userFormControl.valueChanges.pipe(\n startWith(''),\n map((value: any) => typeof value === 'string' ? value : value.firstName + ' ' + value.lastName),\n map((userName: string) => userName ? this.filterUsers(userName) : this.availableUsers.slice())\n );\n this._changeDetector.detectChanges();\n }\n\n //\n //\n // PUBLIC METHODS\n //\n //\n\n public getUserName(user: User): string {\n return user ? user.firstName + ' ' + user.lastName : '';\n }\n\n public onUserSelected(event: any): void {\n this.userFormControl.setValue(event.option.value);\n this.userPicked.emit(event.option.value);\n this.pickedUser = event.option.value;\n }\n\n public onSearchChanged(): void {\n this.pickedUser = null;\n }\n\n //\n //\n // PRIVATE METHODS\n //\n //\n\n private checkUser(): boolean {\n if (!this.userFormControl || typeof this.userFormControl.value !== 'object') {\n return false;\n }\n\n return this._utils.findIn(this.userFormControl.value.id, this.availableUsers, 'id') !== null;\n }\n\n private filterUsers(name: string): User[] {\n return this.availableUsers.filter((user: User) => {\n return this.getUserName(user).toLowerCase().includes(name.toLowerCase());\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RichTextEditorComponent } from './rich-text-editor.component';\nimport { QuillModule } from 'ngx-quill';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@NgModule({\n imports: [CommonModule, QuillModule.forRoot(), ReactiveFormsModule, MatFormFieldModule, TranslateModule],\n exports: [RichTextEditorComponent],\n declarations: [RichTextEditorComponent],\n})\nexport class RichTextEditorModule {\n}\n","import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { HttpClient, HttpClientModule } from '@angular/common/http';\nimport { PreloadAllModules, RouterModule } from '@angular/router';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { MaterialModule } from './material.module';\n\n/*\n * Platform and Environment providers/directives/pipes\n */\nimport { environment } from 'environments/environment';\nimport { ROUTES } from './app.routes';\n// App is our top level component\nimport { AppComponent } from './app.component';\nimport { APP_RESOLVER_PROVIDERS } from './app.resolver';\n\nimport '../styles/styles.scss';\n\n//\n//\n// CUSTOM STUFF IMPORTS\n//\n//\n//\n// _COMMON\n//\nimport { Conf } from './_conf';\n\nimport { AuthComponent } from './_common/components/auth/auth';\nimport { AuthDialogComponent } from './_common/components/auth/auth-dialog/auth-dialog';\nimport { ConfirmDialogComponent } from './_common/components/confirm-dialog/confirm-dialog';\nimport { DataListComponent } from './_common/components/data-list/data-list';\nimport { EmbedMapComponent } from './_common/components/embed-map/embed-map';\nimport { Error401Component } from './_common/components/error-401/error-401';\nimport { Error404Component } from './_common/components/error-404/error-404';\nimport { FooterComponent } from './_common/components/footer/footer';\nimport { FullScreenLoaderComponent } from './_common/components/full-screen-loader/full-screen-loader';\nimport { FullWidthLoaderComponent } from './_common/components/full-width-loader/full-width-loader';\nimport { HeaderComponent } from './_common/components/header/header';\nimport { InfoDialogComponent } from './_common/components/info-dialog/info-dialog';\nimport { InputImageComponent } from './_common/components/input-image/input-image';\nimport { MainActionComponent } from './_common/components/main-action/main-action';\nimport { ModuleContentComponent } from './_common/components/module-content/module-content';\nimport { NamePickerComponent } from './_common/components/name-picker/name-picker';\nimport { PageContentComponent } from './_common/components/page-content/page-content';\nimport { SideMenuComponent } from './_common/components/side-menu/side-menu';\nimport { SliderControlComponent } from './_common/components/slider-control/slider-control';\nimport { WorkspaceSelectorComponent } from './_common/components/workspace-selector/workspace-selector';\nimport { TrueFalseRadioComponent } from './_common/components/true-false-radio/true-false-radio';\nimport { ItemListDialogComponent } from './_common/components/item-list-dialog/item-list-dialog';\nimport { ExtensiblePComponent } from './_common/components/extensible-p/extensible-p';\n\nimport { GuardsSequenceGuard } from './_common/guards/guards-sequence';\nimport { HasHomepageRedirectGuard } from './_common/guards/has-homepage-redirect';\nimport { HasPendingChangesGuard } from './_common/guards/has-pending-changes';\nimport { IsAdminGuard } from './_common/guards/is-admin';\nimport { IsAppReadyGuard } from './_common/guards/is-app-ready';\nimport { IsLoggedInGuard } from './_common/guards/is-logged-in';\n\nimport { Error401PageComponent } from './_common/pages/error-401/error-401';\nimport { Error404PageComponent } from './_common/pages/error-404/error-404';\nimport { HomePageComponent } from './_common/pages/home/home';\nimport { LogoutPageComponent } from './_common/pages/logout/logout';\nimport { TermsPageComponent } from './_common/pages/terms/terms';\n\nimport { AutoLinkerPipe } from './_common/pipes/auto-linker';\nimport { DateClosestPipe } from './_common/pipes/date-closest';\nimport { DurationPipe } from './_common/pipes/duration';\nimport { EllipsizePipe } from './_common/pipes/ellipsize';\nimport { FileSizePipe } from './_common/pipes/file-size';\nimport { SafePipe } from './_common/pipes/safe';\nimport { CurrencyPipe } from '@angular/common';\nimport { TranslateCutPipe } from './_common/pipes/translate-cut';\nimport { MyStripHttpPipe } from './_common/pipes/strip-http';\n\nimport { ApiBaseService } from './_common/providers/api-base-service';\nimport { CurrentUser } from './_common/providers/current-user';\nimport { KeyValueStorage } from './_common/providers/key-value-storage';\nimport { LangsProvider } from './_common/providers/langs-provider';\nimport { ModelsStorage } from './_common/providers/models-storage';\nimport { SyncServiceProvider } from './_common/providers/sync-service';\nimport { Utils } from './_common/providers/utils';\nimport { TranslatablePaginatorIntl } from './_common/providers/translatable-paginator-intl';\n\n//\n// DISCUSSIONS\n//\nimport { DiscussionsDiscussionComponent } from './discussions/components/discussion/discussion';\nimport { DiscussionsMessageComponent } from './discussions/components/message/message';\nimport {\n DiscussionsPrivateDiscussionWindowComponent\n} from './discussions/components/private-discussion-window/private-discussion-window';\nimport {\n DiscussionsPrivateDiscussionsMenuComponent\n} from './discussions/components/private-discussions-menu/private-discussions-menu';\nimport { DiscussionsEditGroupDialogComponent } from './discussions/components/edit-group-dialog/edit-group-dialog';\n\nimport { DiscussionsProvider } from './discussions/providers/discussions-provider';\n\n//\n// FILES\n//\nimport { FilesFilesComponent } from './files/components/files/files';\nimport { FilesImageViewerDialogComponent } from './files/components/image-viewer-dialog/image-viewer-dialog';\n\nimport { FilesProvider } from './files/providers/files-provider';\n\n//\n// LIKE_COUNTERS\n//\nimport { LikeCountersLikeCounterComponent } from './like-counters/components/like-counter/like-counter';\n\nimport { LikeCountersProvider } from './like-counters/providers/like-counters-provider';\n\n//\n// NOTIFICATIONS\n//\nimport { NotificationsNotificationsMenuComponent } from './notifications/components/notifications-menu/notifications-menu';\n\nimport { NotificationsProvider } from './notifications/providers/notifications-provider';\nimport { NotificationsTodosProvider } from './notifications/providers/todos-provider';\n\n//\n// REVIEW-MARKS\n//\nimport { ReviewMarksReviewMarkSelectComponent } from './review-marks/components/review-mark-select/review-mark-select';\n\n//\n// TAGS\n//\nimport { TagsTagComponent } from './tags/components/tag/tag';\nimport { TagsTagPickerComponent } from './tags/components/tag-picker/tag-picker';\nimport { TagsTagSelectComponent } from './tags/components/tag-select/tag-select';\n\n//\n// USERS\n//\nimport { UsersChangePasswordDialogComponent } from './users/components/change-password-dialog/change-password-dialog';\nimport { UsersPickUsersDialogComponent } from './users/components/pick-users-dialog/pick-users-dialog';\nimport { UsersUserMenuComponent } from './users/components/user-menu/user-menu';\nimport { UsersUserProfileDialogComponent } from './users/components/user-profile-dialog/user-profile-dialog';\nimport { UsersUserStickerComponent } from './users/components/user-sticker/user-sticker';\nimport { UsersUserPickerComponent } from './users/components/user-picker/user-picker';\nimport { UsersListComponent } from './users/components/list/list';\nimport { UsersAddUserDialogComponent } from './users/components/add-user-dialog/add-user-dialog';\nimport { UsersLocalExpertsListComponent } from './users/components/local-experts-list/local-experts-list';\n\nimport { UsersCanEditUserGuard } from './users/guards/can-edit-user';\n\nimport { UsersEditPageComponent } from './users/pages/edit/edit';\nimport { UsersAdminPageComponent } from './users/pages/admins/admins';\nimport { UsersGuestsPageComponent } from './users/pages/guests/guests';\nimport { UsersLocalExpertsPageComponent } from './users/pages/local-experts/local-experts';\n\nimport { UsersProvider } from './users/providers/users-provider';\n\n//\n// ACVENTURES_COMMON\n//\nimport { AcventuresCommonHomeComponent } from './_acventures-common/components/home-welcome/home-welcome';\nimport { AcventuresCommonHomeShowroomComponent } from './_acventures-common/components/home-showroom/home-showroom';\nimport { AcventuresCommonCompanyLogosComponent } from './_acventures-common/components/company-logos/company-logos';\nimport {\n AcventuresCommonHomeShowroomDialogComponent\n} from './_acventures-common/components/home-showroom-dialog/home-showroom-dialog';\n\nimport { AcventuresNavigationProvider } from './_acventures-common/providers/navigation-provider';\n\n//\n// PROJECTS\n//\nimport { ProjectsEditProjectProjectComponent } from './projects/components/edit-project-project/edit-project-project';\nimport { ProjectsEditProjectSituationComponent } from './projects/components/edit-project-situation/edit-project-situation';\nimport {\n ProjectsEditProjectPartnershipComponent\n} from './projects/components/edit-project-partnership/edit-project-partnership';\nimport {\n ProjectsEditProjectMiscellaneousComponent\n} from './projects/components/edit-project-miscellaneous/edit-project-miscellaneous';\nimport { ProjectsEditProjectFundingComponent } from './projects/components/edit-project-funding/edit-project-funding';\nimport { ProjectsEditProjectTeamComponent } from './projects/components/edit-project-team/edit-project-team';\nimport { ProjectsEditProjectReviewComponent } from './projects/components/edit-project-review/edit-project-review';\nimport { ProjectsEditProjectAcademicComponent } from './projects/components/edit-project-academic/edit-project-academic';\nimport { ProjectsProjectStateIndicatorComponent } from './projects/components/project-state-indicator/project-state-indicator';\nimport { ProjectsListComponent } from './projects/components/list/list';\nimport { ProjectsFilterBlockComponent } from './projects/components/filter-block/filter-block';\nimport { ProjectsAskChangesDialogComponent } from './projects/components/ask-changes-dialog/ask-changes-dialog';\nimport { ProjectsRegisterDialogComponent } from './projects/components/register-dialog/register-dialog';\nimport { ProjectsDashboardOverviewComponent } from './projects/components/dashboard-overview/dashboard-overview';\nimport { ProjectsDashboardKeyDataComponent } from './projects/components/dashboard-key-data/dashboard-key-data';\nimport { ProjectsDashboardMetricsComponent } from './projects/components/dashboard-metrics/dashboard-metrics';\nimport { ProjectsCreateDialogComponent } from './projects/components/create-dialog/create-dialog';\nimport { ProjectsHomeIntroductionComponent } from './projects/components/home-introduction/home-introduction';\n\nimport { ProjectsEditPageComponent } from './projects/pages/edit/edit';\nimport { ProjectsProjectsPageComponent } from './projects/pages/projects/projects';\nimport { ProjectsProjectPageComponent } from './projects/pages/project/project';\nimport { ProjectsFavoritesPageComponent } from './projects/pages/favorites/favorites';\nimport { ProjectsPendingValidationPageComponent } from './projects/pages/pending-validation/pending-validation';\nimport { ProjectsNotProjectYetPageComponent } from './projects/pages/no-project-yet/no-project-yet';\nimport { ProjectsDraftsPageComponent } from './projects/pages/drafts/drafts';\nimport { ProjectsDispatchPageComponent } from './projects/pages/dispatch/dispatch';\nimport { ProjectsDashboardPageComponent } from './projects/pages/dashboard/dashboard';\nimport { ProjectsHomePageComponent } from './projects/pages/home/home';\n\nimport { ProjectsProvider } from './projects/providers/projects-provider';\n\n//\n// INVESTORS\n//\nimport { InvestorsEditInvestorProfileComponent } from './investors/components/edit-investor-profile/edit-investor-profile';\nimport {\n InvestorsInvestorStateIndicatorComponent\n} from './investors/components/investor-state-indicator/investor-state-indicator';\nimport { InvestorsListComponent } from './investors/components/list/list';\nimport { InvestorsRegisterDialogComponent } from './investors/components/register-dialog/register-dialog';\nimport { InvestorsHomeIntroductionComponent } from './investors/components/home-introduction/home-introduction';\nimport { InvestorsListCompaniesComponent } from './investors/components/list-companies/list-companies';\n\nimport { InvestorsPendingValidationPageComponent } from './investors/pages/pending-validation/pending-validation';\nimport { InvestorsInvestorsPageComponent } from './investors/pages/investors/investors';\nimport { InvestorsHomePageComponent } from './investors/pages/home/home';\nimport { InvestorsWelcomePageComponent } from './investors/pages/welcome/welcome';\nimport { InvestorsCompaniesPageComponent } from './investors/pages/companies/companies';\nimport { InvestorsEditCompanyPageComponent } from './investors/pages/edit-company/edit-company';\nimport { InvestorsCompanyPageComponent } from './investors/pages/company/company';\n\nimport { CanSeeCompanies } from './investors/guards/can-see-companies';\n\nimport { InvestorsProvider } from './investors/providers/investors-provider';\n\n//\n// ALERTS\n//\nimport { AlertsListComponent } from './alerts/components/list/list';\n\nimport { AlertsAlertsPageComponent } from './alerts/pages/alerts/alerts';\nimport { AlertsAlertPageComponent } from './alerts/pages/alert/alert';\n\nimport { AlertsProvider } from './alerts/providers/alerts-provider';\n\n//\n// THIRD PARTY LIBS\n//\n// Translations\nimport { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { TranslateHttpLoader } from '@ngx-translate/http-loader';\nimport { InviteUserDialogComponent } from './project-membership/invite-user-dialog/invite-user-dialog';\nimport { ProjectMembershipListComponent } from './project-membership/components/list/list';\nimport { ProjectsMembershipsPageComponent } from './projects/pages/memberships/memberships';\nimport { ProjectsMembershipsProvider } from './project-membership/providers/projects-memberships-provider';\n// charts\nimport { ChartCommonModule, LineChartModule, PieChartModule } from '@swimlane/ngx-charts';\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\nimport { ProjectsEditProjectCaseComponent } from './projects/components/edit-project-case/edit-project-case';\nimport { ProjectsViewProjectCaseComponent } from './projects/components/view-project-case/view-project-case';\nimport { ProjectCasesListComponent } from './projects/components/list-project-cases/list-project-cases';\nimport { MatMomentDateModule } from '@angular/material-moment-adapter';\nimport { CanSeeCompany } from './investors/guards/can-see-company';\nimport { ListBaseComponent } from './_common/components/list-base/list-base';\nimport { PublicPrivateRadioComponent } from './_common/components/public-private-radio/public-private-radio';\nimport { RichTextEditorModule } from './rich-text-editor/rich-text-editor.module';\nimport { QuillModule } from 'ngx-quill';\nimport { InvestorsDashboardPageComponent } from './investors/pages/dashboard/dashboard';\nimport { FavoritesListComponent } from './projects/components/favorites-list/favorites-list';\nimport { MatPaginatorIntl } from '@angular/material/paginator';\n\nexport function createTranslateLoader(http: HttpClient, conf: Conf) {\n return new TranslateHttpLoader(http, conf.assetsUrl + 'i18n/', '.json');\n}\n\n// Autolinker : https://github.com/gregjacobs/Autolinker.js\nexport const AutoLinker = require('autolinker');\n\n//\n//\n// /CUSTOM STUFF IMPORTS\n//\n//\n\n// Application wide providers\nconst APP_PROVIDERS = [\n ...APP_RESOLVER_PROVIDERS\n];\n\n/**\n * `AppModule` is the main entry point into Angular2's bootstraping process\n */\n@NgModule({\n bootstrap: [AppComponent],\n declarations: [\n SafePipe,\n TranslateCutPipe,\n MyStripHttpPipe,\n EllipsizePipe,\n DateClosestPipe,\n AutoLinkerPipe,\n FileSizePipe,\n DurationPipe,\n AppComponent,\n AuthDialogComponent,\n EmbedMapComponent,\n DataListComponent,\n HeaderComponent,\n FooterComponent,\n PageContentComponent,\n ModuleContentComponent,\n AuthComponent,\n FullScreenLoaderComponent,\n FullWidthLoaderComponent,\n Error401Component,\n Error404Component,\n NamePickerComponent,\n ItemListDialogComponent,\n ExtensiblePComponent,\n InfoDialogComponent,\n InputImageComponent,\n MainActionComponent,\n WorkspaceSelectorComponent,\n TrueFalseRadioComponent,\n PublicPrivateRadioComponent,\n DiscussionsDiscussionComponent,\n DiscussionsMessageComponent,\n DiscussionsPrivateDiscussionWindowComponent,\n DiscussionsPrivateDiscussionsMenuComponent,\n DiscussionsEditGroupDialogComponent,\n FilesFilesComponent,\n FilesImageViewerDialogComponent,\n NotificationsNotificationsMenuComponent,\n TagsTagComponent,\n TagsTagPickerComponent,\n TagsTagSelectComponent,\n ReviewMarksReviewMarkSelectComponent,\n LikeCountersLikeCounterComponent,\n SideMenuComponent,\n ConfirmDialogComponent,\n UsersChangePasswordDialogComponent,\n ProjectsEditProjectProjectComponent,\n ProjectsEditProjectCaseComponent,\n ProjectsEditProjectSituationComponent,\n ProjectsEditProjectPartnershipComponent,\n ProjectsEditProjectMiscellaneousComponent,\n ProjectsEditProjectFundingComponent,\n ProjectsEditProjectTeamComponent,\n ProjectsEditProjectReviewComponent,\n ProjectsViewProjectCaseComponent,\n ProjectsEditProjectAcademicComponent,\n ProjectsProjectStateIndicatorComponent,\n ProjectsListComponent,\n ProjectCasesListComponent,\n ProjectsFilterBlockComponent,\n ProjectsAskChangesDialogComponent,\n ProjectsRegisterDialogComponent,\n ProjectsCreateDialogComponent,\n ProjectsHomeIntroductionComponent,\n ProjectsDashboardOverviewComponent,\n ProjectsDashboardKeyDataComponent,\n ProjectsDashboardMetricsComponent,\n InvestorsEditInvestorProfileComponent,\n InvestorsInvestorStateIndicatorComponent,\n InvestorsListComponent,\n InvestorsRegisterDialogComponent,\n InvestorsHomeIntroductionComponent,\n InvestorsListCompaniesComponent,\n InvestorsPendingValidationPageComponent,\n InvestorsInvestorsPageComponent,\n InvestorsHomePageComponent,\n InvestorsWelcomePageComponent,\n InvestorsDashboardPageComponent,\n InvestorsCompaniesPageComponent,\n InvestorsEditCompanyPageComponent,\n InvestorsCompanyPageComponent,\n AlertsListComponent,\n UsersPickUsersDialogComponent,\n UsersUserMenuComponent,\n UsersUserProfileDialogComponent,\n UsersAddUserDialogComponent,\n UsersUserStickerComponent,\n UsersUserPickerComponent,\n UsersListComponent,\n UsersLocalExpertsListComponent,\n SliderControlComponent,\n HomePageComponent,\n Error401PageComponent,\n Error404PageComponent,\n LogoutPageComponent,\n TermsPageComponent,\n UsersEditPageComponent,\n UsersAdminPageComponent,\n UsersGuestsPageComponent,\n UsersLocalExpertsPageComponent,\n ListBaseComponent,\n ProjectsEditPageComponent,\n ProjectsProjectsPageComponent,\n ProjectsMembershipsPageComponent,\n ProjectMembershipListComponent,\n InviteUserDialogComponent,\n ProjectsProjectPageComponent,\n ProjectsFavoritesPageComponent,\n FavoritesListComponent,\n ProjectsPendingValidationPageComponent,\n ProjectsNotProjectYetPageComponent,\n ProjectsDraftsPageComponent,\n ProjectsDispatchPageComponent,\n ProjectsDashboardPageComponent,\n ProjectsHomePageComponent,\n AlertsAlertsPageComponent,\n AlertsAlertPageComponent,\n AcventuresCommonHomeComponent,\n AcventuresCommonCompanyLogosComponent,\n AcventuresCommonHomeShowroomComponent,\n AcventuresCommonHomeShowroomDialogComponent\n ],\n /**\n * Import Angular's modules.\n */\n imports: [\n BrowserModule,\n BrowserAnimationsModule,\n FormsModule,\n ReactiveFormsModule,\n HttpClientModule,\n RouterModule.forRoot(ROUTES, {\n useHash: false,\n preloadingStrategy: PreloadAllModules\n }),\n MaterialModule,\n ChartCommonModule,\n LineChartModule,\n PieChartModule,\n FontAwesomeModule,\n MatMomentDateModule,\n RichTextEditorModule,\n TranslateModule.forRoot({\n loader: {\n provide: TranslateLoader,\n useFactory: (createTranslateLoader),\n deps: [HttpClient, Conf]\n }\n }),\n QuillModule,\n ],\n /**\n * Expose our Services and Providers into Angular's dependency injection.\n */\n providers: [\n environment.ENV_PROVIDERS,\n APP_PROVIDERS,\n Conf,\n Utils,\n CurrencyPipe,\n ApiBaseService,\n KeyValueStorage,\n ModelsStorage,\n CurrentUser,\n LangsProvider,\n UsersProvider,\n ProjectsMembershipsProvider,\n AcventuresNavigationProvider,\n ProjectsProvider,\n InvestorsProvider,\n AlertsProvider,\n SyncServiceProvider,\n DiscussionsProvider,\n FilesProvider,\n LikeCountersProvider,\n NotificationsProvider,\n NotificationsTodosProvider,\n GuardsSequenceGuard,\n CanSeeCompanies,\n CanSeeCompany,\n IsAppReadyGuard,\n IsLoggedInGuard,\n UsersCanEditUserGuard,\n IsAdminGuard,\n HasPendingChangesGuard,\n HasHomepageRedirectGuard,\n {\n provide: MatPaginatorIntl,\n useFactory: (translate) => {\n const service = new TranslatablePaginatorIntl();\n service.injectTranslateService(translate);\n return service;\n },\n deps: [TranslateService]\n }\n ]\n})\nexport class AppModule {\n}\n","/**\n * Angular bootstrapping\n */\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\nimport { environment } from 'environments/environment';\nimport { NgModuleRef } from '@angular/core';\n\n/**\n * App Module\n * our top level module that holds all of our components\n */\nimport { AppModule } from './app';\nimport { ROOT_SELECTOR } from './app/app.component';\n\n/**\n * Bootstrap our Angular app with a top level NgModule\n */\nexport function main(): Promise {\n let modulePromise: Promise> = null;\n\n if (module['hot']) {\n module['hot'].accept();\n module['hot'].dispose(() => {\n // Before restarting the app, we create a new root element and dispose the old one\n const oldRootElem = document.querySelector(ROOT_SELECTOR);\n const newRootElem = document.createElement(ROOT_SELECTOR);\n oldRootElem!.parentNode!.insertBefore(newRootElem, oldRootElem);\n if (modulePromise) {\n modulePromise.then((appModule) => {\n appModule.destroy();\n if (oldRootElem !== null) {\n oldRootElem!.parentNode!.removeChild(oldRootElem);\n }\n return appModule;\n });\n }\n });\n }\n\n modulePromise = platformBrowserDynamic().bootstrapModule(AppModule);\n\n return modulePromise.then(environment.decorateModuleRef).catch((err) => console.error(err));\n}\n\n/**\n * Needed for hmr\n * in prod this is replace for document ready\n */\nswitch (document.readyState) {\n case 'loading':\n document.addEventListener('DOMContentLoaded', _domReadyHandler, false);\n break;\n case 'interactive':\n case 'complete':\n default:\n main();\n}\n\nfunction _domReadyHandler() {\n document.removeEventListener('DOMContentLoaded', _domReadyHandler, false);\n main();\n}\n","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncaught exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = \"zn8P\";"],"sourceRoot":""}