{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"angular\"","webpack:///./js/update.ts","webpack:///./js/00.FT.js","webpack:///./js/FortyTwoFramework.ts","webpack:///./js/02.FT.app.models.js","webpack:///./js/controllers/FT.app.controllers.content.js","webpack:///./node_modules/moment/locale sync [/\\\\](nl(\\.js)","webpack:///./js/controllers/FT.app.controllers.child.js","webpack:///./js/controllers/FT.app.controllers.financial.js","webpack:///./js/controllers/FT.app.controllers.help.js","webpack:///./js/controllers/FT.app.controllers.loading.js","webpack:///./js/controllers/FT.app.controllers.login.js","webpack:///./js/controllers/FT.app.controllers.message-modal.js","webpack:///./js/controllers/FT.app.controllers.messages.js","webpack:///./js/controllers/FT.app.controllers.navigation.js","webpack:///./js/controllers/planning/incidentalModalController.js","webpack:///./js/controllers/planning/planningChoiceController.js","webpack:///./js/controllers/planning/planningItemActivitiesController.js","webpack:///./js/controllers/planning/planningItemActivityController.js","webpack:///./js/controllers/planning/planningItemController.js","webpack:///./js/controllers/planning/planningItemEmployeesController.js","webpack:///./js/controllers/planning/planningListController.js","webpack:///./js/controllers/planning/presentModalController.js","webpack:///./js/controllers/planning/swapModalController.js","webpack:///./js/controllers/contract/contractCancelModalController.js","webpack:///./js/controllers/contract/contractEditModalController.js","webpack:///./js/controllers/contract/contractEndModalController.js","webpack:///./js/controllers/contract/contractModalController.js","webpack:///./js/controllers/contract/contractRejectModalController.js","webpack:///./js/controllers/FT.app.controllers.user.js","webpack:///./js/controllers/FT.app.controllers.waitinglist.js","webpack:///./js/controllers/monthPickerController.js","webpack:///./js/directives/FT.app.directives.content.js","webpack:///./js/directives/FT.app.directives.family.js","webpack:///./js/directives/FT.app.directives.formfields.js","webpack:///./js/directives/FT.app.directives.isolatedscope.js","webpack:///./js/directives/FT.app.directives.js","webpack:///./js/directives/FT.app.directives.media.js","webpack:///./js/directives/FT.app.directives.modal.js","webpack:///./js/directives/FT.app.directives.overwrites.js","webpack:///./js/directives/FT.app.directives.planning.js","webpack:///./js/directives/FT.app.directives.scroll.js","webpack:///./js/directives/FT.app.directives.touch.js","webpack:///./js/filters/FT.app.filters.contactinformation.js","webpack:///./js/filters/FT.app.filters.contract.js","webpack:///./js/filters/FT.app.filters.date.js","webpack:///./js/filters/FT.app.filters.js","webpack:///./js/filters/FT.app.filters.planning.js","webpack:///./js/filters/FT.app.filters.urlencode.js","webpack:///./js/filters/FT.app.filters.user.js","webpack:///./js/services/FT.app.services.checkStateChangeService.js","webpack:///./js/services/FT.app.services.languageservice.js","webpack:///./js/services/FT.app.services.loginservice.js","webpack:///./js/services/FT.app.services.modalservice.js","webpack:///./js/services/FT.app.services.requestservice.js","webpack:///./js/FT.app.factories.templatehandler.js","webpack:///./js/FT.app.config.datepicker.js","webpack:///./js/FT.date.js","webpack:///./js/FT.ui.zIndexManager.js","webpack:///./js/network-utils.ts","webpack:///./js/01.FT.app.js","webpack:///./js/urlHelper.ts","webpack:///./js/controllers/FT.app.controllers.app.js","webpack:///./js/models.ts","webpack:///./js/controllers/FT.app.controllers.dashboard.ts","webpack:///./js/definitions.ts","webpack:///./js/registration-form-validator.ts","webpack:///./js/controllers/FT.app.controllers.family.js","webpack:///./js/controllers/FT.app.controllers.media.ts","webpack:///./js/controllers/planning/absentModalController.ts","webpack:///./js/controllers/planning/requestModalController.ts","webpack:///./js/controllers/contract/contractActivateModalController.ts","webpack:///./js/controllers/contract/registrationIntroductionController.ts","webpack:///./js/controllers/activities.ts","webpack:///./js/controllers/documents.ts","webpack:///./js/controllers/child-documents.ts","webpack:///./js/controllers/child-requests.ts","webpack:///./js/controllers/login.ts","webpack:///./js/controllers/gotoapp.ts","webpack:///./js/directives/FT.app.directives.fancybox.ts","webpack:///./js/directives/FT.app.directives.filemodel.ts","webpack:///./js/services/FT.app.services.appservice.ts","webpack:///./js/services/FT.app.services.dataservice.ts","webpack:///./js/services/FT.app.services.planningmodalservice.ts","webpack:///./js/app.ts"],"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","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","angular","addEventListener","navigator","serviceWorker","register","registration","setInterval","update","refreshing","location","reload","ie","v","div","document","createElement","all","getElementsByTagName","innerHTML","undef","origin","protocol","hostname","port","FortyTwo","DEBUG","indexOf","createDelegate","ctx","fnc","Array","args","arguments","concat","defineNamespace","namespace","parent","nsparts","split","partname","defineBindableGetter","obj","prop","configurable","writable","getRandom","min","max","Math","floor","random","getInterval","getQueryVariable","replace","results","RegExp","exec","search","decodeURIComponent","getQueryParam","href","browser","randomNumber","ft","ng","getCount","models","Group","count","this","items","parseInt","options","title","checked","val","Timeline","date","itemDate","type","item","app","controller","$rootScope","$scope","$state","$stateParams","$timeout","AppService","offStateChangeSuccess","initialized","isLoading","menuIsOpen","appData","errorMessage","toggleMenu","clearErrorMessage","getData","prm","getFamilyAsync","then","handleGetFamily","handleGetFamilyError","finally","response","isReadable","message","handleStateChangeSuccess","current","pageStyle","handleDestroy","$on","map","webpackContext","req","id","webpackContextResolve","e","Error","code","keys","resolve","$q","DataService","child","initialize","setCurrentChild","events","family","initializeData","getUser","navigateToInfo","go","checkForFormChange","success","isBirthday","birthday","Date","dateOfBirth","today","getDate","getMonth","$filter","$translate","ModalService","openContractShowModal","evt","contract","showModal","elm","currentTarget","target","style","templateUrl","inputs","preferredLocations","requestInformation","requestedTimeslots","modal","close","getContracts","contractConfig","hasItems","openNewContract","openContract","state","contractants","getRequestInformation","getContractsAsync","handleGetContracts","handleGetContractsError","sort","a","b","aStartDate","start","bStartDate","aEndDate","end","bEndDate","reverse","instant","callback","getRequestInformationAsync","aanvraagId","handleGetRequestInformation","handleGetRequestInformationError","CheckStateChangeService","getPhoneNumber","checkFormOnStateChange","extend","ssn","placeOfBirth","gender","emergencyNumber","doctorName","doctorPhone","insuranceOrganizationName","insuranceOrganizationNumber","school","schools","dateOfBirthOpened","dateOptions","formatYear","formats","format","saving","successMessage","lastNameValid","firstNameValid","dateOfBirthValid","genderValid","ssnValid","attempts","config","remarks","contactInformation","content","doctor","insurance","organization","policyNumber","isDateOfBirthInFuture","dates","isDateInFuture","save","lastName","trim","firstName","moment","isValid","types","isContact","datetime","toAPIDate","ssnIsRequiredAndShown","phone","isEmergency","saveChildAsync","handleSave","handleSaveError","cancel","open","$event","preventDefault","stopPropagation","PlanningModalService","navigate","handleActionButton","openAbsentModal","openSickModal","openPresentModal","planning","presence","sick","LoginService","offFamily","offDestroy","invoices","annualStatements","filterChildrenInitial","documentTypes","filterChildren","toggleChild","filterItems","getDownloadLink","loading","resetDownloadLink","downloadUrl","children","filter","x","find","forEach","childHasFinancialDoc","childId","childHasAnnualStatement","childHasInvoices","handleGetFinancial","annualStatement","invoice","handleGetFinancialError","refreshLoginAsync","handleGetDownloadLink","handleGetDownloadLinkError","tokenData","getTokenData","prepareItemUrl","url","encodeURIComponent","token","initializeEvents","invoicingByDebtor","settings","ids","filteredStatements","filteredInvoices","setChildProperty","prmFamily","prmFinancial","getFinancialOverviewAsync","showOnParentApp","handleActive","handleNone","requests","active","none","form","doImpersonateAsync","accesskey","handleDoImpersonate","handleDoImpersonateError","isFromApp","isfromapp","username","password","validPassword","switchLanguage","lang","setPassword","setPasswordAsync","handleGetData","handleGetDataError","toString","handleSetPassword","handleSetPasswordError","doLogout","currentUser","$uibModalInstance","audiences","selectedChild","selectedAudienceId","selectedAudience","valid","audienceIds","dismiss","$watch","newId","allAudiencesSelected","audience","toggleSelectAudience","toggleSelectionAudiences","selected","isAllAudience","hasAudiencesSelected","selectAudience","index","saveConversation","amountOfAudiences","hasAllAudience","expectedAudienceIds","audienceId","saveConversationAsync","handleSaveConversation","handleSaveConversationError","$emit","swal","text","timer","$uibModal","lastFetchDate","loginService","conversations","messageLimit","messageListView","selectedConversation","replyComment","getMessagesAsync","loadMore","dateTime","utc","params","lastConvo","lastUpdatedUTC","returnValue","getMessagesSinceAsync","messageAudiences","groups","handleGetMessages","posts","console","log","sendNotification","doCommentsCall","$broadcast","post","postExists","postId","read","conversation","getCommentsForMessage","setComments","showMoreMessages","addConversationsToList","comments","comment","replies","replyToCommentId","commentId","hasReplies","reply","isReply","getCommentReplies","markAsRead","otherIndex","isLeft","answerComment","backToListView","sendMessage","event","answerToPostAsync","handleSaveAnswerToPost","getReplyer","getAvatarInitials","fullName","matches","match","toUpperCase","join","loadMessage","openCreateConverstationModal","animation","size","backdrop","keyboard","copy","promises","getMessageAudiencesAsync","promise","$element","saveEnabled","now","tomorrow","setDate","from","fromOpened","fromValid","isToday","minDate","selectedTimes","possibleTimes","selectedTimesValid","timesValid","possibleTimesMessage","creditHoursApplicable","useCreditHours","time","creditHours","handleChangedDate","getPossibleTimes","getPossibleTimesForDateAsync","handleGetPossibleTimes","handleGetPossibleTimesError","idx","removeLoading","some","availableTimeslots","aStart","bStart","availableTimeslotsMessage","resetTimes","apiFrom","showIrregularTimeFields","reqStart","reqEnd","startError","endError","requestedStart","requestedEnd","saveIncidentalAsync","substr","hasActions","determineHasActions","hasBlock","day","blocks","maySwapInThePast","allowSwapdaysFromPast","isClosedDay","days","closed","isSick","setHours","isInThePast","possible","action","mayShowActionButton","hasAbsenceBlock","status","states","approved","incidental","swap","holiday","absent","other","bypass","openSwapModal","openIncidental","fromDate","tillDate","openIncidentalModal","openActivity","activity","planningConfig","getStartDate","block","getEndDate","isCurrentlyActive","isAbsenceBlock","rejected","registrationType","registrations","traded","present","packageSupportsSwapdays","requested","requestable","openRequestModal","planningId","timeslotId","cancellation","dayType","addLoading","selectedYear","getFullYear","selectedMonth","weekdays","weeks","daysInWeek","activities","employees","requestables","selectedRequestables","hasRequestables","isInBulkMode","year","month","setPeriod","getSelectedMonthAndYear","getFirstStudyBlock","study","setSelectedMonthAndYear","getPlanning","getActivities","getPlanningAsync","handleGetPlanning","handleGetPlanningError","createUniqueBlockId","y","firstDay","lastDay","getActivitiesByRangeAsync","handleGetActivities","handleGetActivitiesError","getEmployees","getEmployeesByRangeAsync","handleGetEmployees","handleGetEmployeesError","getActivitiesForDay","getEmployeesForDay","dateIsThisMonth","isFirstDayOfMonthShown","week","previousDay","getPreviousDay","isLastDayOfMonthShown","nextDay","getNextDay","weekIdx","dayIdx","previousWeek","navigateToMonthOfToday","navigateToPreviousMonth","navigateToNextMonth","openChoice","openPlanningBlock","openActivities","openEmployees","openMonthPicker","selectedDate","openLegenda","toggleMode","toggleSelectedRequestable","savePresentAsync","till","tillOpened","tillValid","loadingFrom","loadingTill","selectedTimesFrom","possibleTimesFrom","selectedTimesFromValid","selectedTimesTill","possibleTimesTill","selectedTimesTillValid","fromTimesMessage","tillTimesMessage","isChecked","substring","isStudyDay","typeValue","handleGetPossibleTimesFrom","handleGetPossibleTimesFromError","handleGetPossibleTimesTill","handleGetPossibleTimesTillError","tradableTimeslots","fromTimeslotId","compare","itm","fromPlanningId","tradableTimeslotsMessage","possibleTime","apiTill","saveSwapAsync","cancelContractAsync","reduceDays","careConfig","care","maxLocations","currentStep","step","steps","description","registrationId","startdate","registerConfig","mergedPackages","locations","chosenRegisterOption","chosenLocations","chosenPackages","chosenSchool","chosenClass","configQuestions","questions","startdateOpened","initDate","add","toDate","startdateValid","chosenRegisterOptionValid","chosenSchoolValid","chosenPackagesValid","chosenLocationsValid","questionsValid","newVal","oldVal","datePickerDate","contractChangeUseCancelDate","cancelDate","careType","unshift","setupStep","changeStartDate","mergePackages","changeTimeslot","timeslots","overlapTime","overlapping","overlappingTimeslotIds","overlap","chosen","disableDay","minimal","getMinimalStartdate","validStartDays","previousStep","blur","nextStep","finishStep","element","closest","scrollTop","setupRegisterOptions","setupPackages","setupLocations","setupComments","finishRegisterOptions","finishPackages","finishLocations","finishComments","registerOptions","packageGroups","getRegisterPackagesAsync","contact","handleGetRegisterPackages","handleGetRegisterPackagesError","schoolId","getRegisterLocationsAsync","handleGetRegisterLocations","handleGetRegisterLocationsError","chosenPackage","question","packageId","outOfSchool","chosenTimeslots","pack","chosenLocationId","configQuestion","questionId","isRequired","getFilteredLocations","selectedLocations","loc","initChosenSchool","currentChild","distinctChosenLocations","showFrequencyColumn","getPackagesForSave","getLocationsForSave","getContactsForSave","contractId","editContractAsync","answers","getAnswersForSave","newContractAsync","resultPackage","holidayBalance","chosenHolidayBalance","members","roles","registerQuestion","registerQuestions","answer","regPack","times","notChosenTimes","slot","planningStart","planningEnd","packages","regPackage","useHolidayBalance","plannings","package","label","currentHolidayBalance","timeslot","toLowerCase","otherItem","endValid","dateOpened","dateValid","endContractAsync","hasSuccess","isApprovedContractEditable","isInFuture","ended","received","offered","sign","openActivate","openEdit","openEnd","openCancel","openReject","getDownloadCurrentLink","resetDownloadCurrentLink","downloadCurrentUrl","getDownloadCostLink","resetDownloadCostLink","downloadCostUrl","handleGetDownloadCurrentLink","handleGetDownloadCostLink","costOverviewUrl","reject","rejectContractAsync","user","openPasswordChange","currentPassword","newPassword","verifyPassword","currentPasswordValid","newPasswordValid","verifyPasswordValid","errorText","successText","cp","np","vp","changePasswordAsync","handleChangePassword","handleChangePasswordError","waitinglistActions","waitingListItemId","submitWaitinglistItemsAsync","initializeWaitinglistActions","actions","months","closeWithToday","up","down","isCurrentMonth","thisYear","thisMonth","isSelectedMonth","selectMonth","directive","LanguageService","$sce","scope","link","attrs","isExpanded","offCodeChange","newValue","oldValue","getContentAsync","htmlContent","trustAsHtml","template","handler","getTemplateUrl","address","singleLine","restrict","inputValue","inputId","decimalChar","allowNegatives","arr","String","temp","isNaN","require","elem","ctrl","$formatters","$modelValue","$parsers","viewValue","plainNumber","patt","test","$","css","$compile","$parse","compile","tElm","tAttrs","attrObj","ftBindController","attrInit","init","fnObj","linkFunction","$parent","view","empty","append","on","$destroy","attr","ftBindObject","fn","isObject","$observe","removeClass","remove","addClass","which","$eval","ftEnter","$apply","onSave","html5imageupload","$controller","TemplateHandler","$body","layerManager","ui","managers","zIndexManager","ftMorphModal","$elm","$wrapper","$modal","$shadow","modalSize","position","offset","getSizeAndPositionFromCss","left","outerWidth","top","outerHeight","setTimeout","height","closeHandler","sheets","styleSheets","sheet","cssFile","rules","cssRules","rule","selectorText","width","dateFilter","datepickerPopupConfig","priority","ngModel","dateFormat","datepickerPopup","ftScrollTo","animate","off","$pageButton","$content","pgRight","btn","info","category","emergency","mobile","email","cancelled","locale","isoWeekday","dateString","weekdaysMin","isOnlyTime","fromNow","diff","default","groupBy","fncFormatValue","arrGroups","objGroups","input","vacation","presences","female","images","girl","woman","boy","men","male","users","service","formName","removeListener","toState","toParams","fromState","fromParams","$pristine","confirmed","currentLanguage","dfd","defer","getAppContent","$sessionStorage","$localStorage","$cookieStore","RequestService","refreshPromise","storageRefreshToken","storeTokenData","getStoredUsername","wantsToStayLoggedIn","isLoggedInAsync","that","hasValidTokenAsync","hasRefreshTokenAsync","expiresOn","expires","refreshToken","doLoginAsync","stayLoggedIn","headers","btoa","requestAsync","path","handleDoLogin","handleDoLoginError","handleError","handleRefreshLogin","handleRefreshLoginError","method","put","accessToken","exceptions","exceptionType","invalidOperationException","providerException","unauthorizedAccessException","exceptionMessage","$document","modalController","modalScope","modalElement","modalElementTemplate","closeDeferred","deferred","controllerName","inputClose","delay","getCssRules","media","matchMedia","res","setModalSize","$new","inputName","unmatch","catch","error","$http","request","useAuthorization","baseApiUrl","factory","$templateCache","cache","uibDatepickerPopupConfig","closeText","currentText","clearText","aDate","bDate","includeToday","getFirstPossible","possibles","setMonth","_stack","mngr","NetworkUtils","tenant","param","regex","queryParam","queryValue","baseUrl","baseTemplateUrl","mainBackgroundImageUrl","secondaryApiUrl","zone","isDST","toAPITime","member","normal","unknown","studyday","beforecontract","messages","directions","in","out","categories","home","work","video","report","photoalbum","own","parents","puzzle","music","gaming","cooking","yoga","image","general","stripCard","daycare","playSchool","requestNew","language","login","urlPart","$compileProvider","$stateProvider","uibDatepickerConfig","$sceDelegateProvider","$translateProvider","startingDay","debugInfoEnabled","getTenantFromUrl","host","storedUrl","localStorage","getItem","JSON","parse","apiParam","setItem","stringify","resourceUrlWhitelist","useSanitizeValueStrategy","useStaticFilesLoader","prefix","suffix","preferredLanguage","appContent","abstract","views","pageTracker","gotoapp","introductionRegistration","newRegistration","impersonate","logout","help","documents","financial","parentApp","childProfile","childEdit","childPlanningList","childPlanningItem","childMessages","childSpecificMessage","childMedialibrary","childInfo","childDocuments","childContracts","childActivities","childUploadProfilePicture","childRequests","userProfile","userInfo","userEdit","userPasswordChange","userUploadProfilePicture","familyList","familyAddChild","familyAddUser","UrlHelper","mediaServiceUrl","relativeUrl","tenantPart","lastIndexOf","$location","offEventsActive","offEventsClear","isInitialized","showSplash","hasConnection","supported","backgroundImageUrl","getConfigAsync","handleGetConfig","handleGetConfigError","absUrl","qs","reduce","part","absolute","initRoute","handleEventsActive","handleEventsClear","AlbumType","TypeOfAudience","MediaType","ContactInfoType","ContactInfoCategory","AddressType","PersonType","PersonRole","Gender","RegisterOptionsType","PlanningDayType","Pakkettype","AbsenceType","PlanningBlockStatus","PlanningBlockPresence","EntityType","TimelineTypes","$anchorScroll","groupByFilter","hasMoreItems","showPresenceInTimeline","storyPdfLinks","hasStories","mediaConfig","activityConfig","handleGoto","anchor","hash","handleFilterChanged","handleMoreData","prmStories","mStart","mEnd","prmPostTimeline","getTimelineForPosts","prmActivities","getTimelineForMediaItems","prmPresences","getTimelineForPresences","prmDiaries","getTimelineForDiaries","getTimelineForStories","prms","storyResult","newItems","postResult","mediaResult","presenceResult","diaryResult","albums","album","posterUrl","createUrl","icon","videoUrl","poster","Media","storyEntryItems","storyEntry","Story","getStoryDownloadLink","diaryEntryItems","diaryEntry","Diary","convertItems","Presence","startTime","Post","filterGroups","fncFormatDate","groupItems","encodedToken","absoluteUrl","isUrlAbsolute","createAbsoluteMediaUrl","services","toggleShowPresenceItems","toggleMedia","timelineItem","mediaChecked","toggleComments","commentsChecked","toggleFavorite","isFavorited","toggleFavoriteAsync","saveComment","msg","saveActivityCommentAsync","handleSaveCommentError","reason","findChild","getFeatures","features","getStoryPdf","storyId","isNullOrWhitespace","isContactCompletelyValid","validation","skipPhoneAndEmail","skipAddress","phoneAndEmailValid","phoneValid","emailValid","addressValid","street","zipCode","zipCodeFormat","city","country","number","isAddressCompletelyValid","initialsValid","isNameCompletelyValid","postcodePattern","nameValidation","initials","addressValidation","isMatch","countryId","validateAddress","addValidationResult","contactValidation","postcodeFormat","pattern","navigateToUser","getPostcodeFormat","parentOne","parentTwo","countries","middleName","contactSameAsParent","fillInSecondParent","parentHasSameAddress","municipalityId","contactDateOfBirthOpened","parentOneDateOfBirthOpened","parentTwoDateOfBirthOpened","processingUserData","processingUserDataValid","initializeFamily","responsible","getResponsibleUser","setLastName","setupBasics","setupMembers","finishBasics","finishMembers","municipalities","configPackage","parentOneValidation","parentTwoValidation","validateRegistrationForm2","registerPackage","registerPackages","registerChildAsync","registerSiblingAsync","frequency","extendedHours","contactData","parentOneData","parentTwoData","addresses","getAddressValid","postalAddressValid","invoiceAddressValid","getMobilePhoneNumber","getEmailAddress","getAddress","isEditMode","sameAsPostalAddress","workphone","postalAddress","invoiceAddress","saveUserAsync","saveImage","saveProfilePictureAsync","dataService","lightbox","lastFetchDateMedia","lightboxOptions","fitImageInViewPort","showImageNumberLabel","alwaysShowNavOnTouchDevices","wrapAround","getMediaAsync","handleGetMediaInitial","openLightbox","mediaItem","getMediaUntilAsync","getMediaSinceAsync","getMoreMedia","createdOn","refreshMedia","handleGetMediaLater","handleGetMedia","isInitial","currentItems","imageLength","albumId","mediaId","src","thumbUrl","caption","existingItem","videos","newMedia","canLoadMoreImages","handleGetMediaError","SickEnd","formatTime","duration","as","checkStateChangeService","closeDialog","canSave","fromTime","tillTime","sickEnd","fromTimeValid","tillTimeValid","reasons","validate","endOf","undefined","HTML5_FMT","DATE","TIME","saveAbsentAsync","converted","field","dateResults","validateDate","isAfter","validateDuration","clone","startOf","isSameOrAfter","$inject","modalData","startDate","holidayBalanceTypes","showHolidayBalance","requestedBalance","showStripCardBalance","stripCardBalances","useBalanceAs","holidayBalanceValid","stripCardBalanceValid","irregularHoursSummaries","totalCreditHours","hasHolidayRequestables","validateHolidayBalance","getIrregularHoursSummary","hasStripCardRequestables","getStripCardBalance","every","chiStudiedag","firstItem","getIrregularHoursSummaryAsync","handleGetIrregularHoursSummary","handleGetIrregularHoursSummaryError","summary","requestableId","requestableType","validateRequestAsync","handleValidateHolidayBalance","handleValidateHolidayBalanceError","getHolidayBalance","denied","isSuccess","mDate","getHolidayBalanceAsync","handleGetHolidayBalance","handleGetHolidayBalanceError","availableBalances","getStripCardBalanceAsync","handleGetStripCardBalance","handleGetStripCardBalanceError","balances","filterStripCardItem","companyId","currentBalance","cancelRequestAsync","handleSaveCancellation","handleSaveCancellationError","asIncidental","regTime","apiDate","saveRequestAsync","saveHolidayBalance","saveHolidayBalanceAsync","handleSaveHolidayBalance","handleSaveHolidayBalanceError","saveStripCardBalance","balance","saveStripCardBalanceAsync","handleSaveStripCardBalance","handleSaveStripCardBalanceError","filterItem","filterHolidayItem","packageTypes","packageType","appService","inviteUrl","allowChangePayByDirectDebit","allowChangeChildSsn","allowChangeResponsibleIban","childBorn","accountNumber","accountCity","nameOnContract","payByDirectDebit","iAgreeToTheTermsAndConditions","accountNumberValid","accountCityValid","nameOnContractValid","payByDirectDebitValid","iAgreeToTheTermsAndConditionsValid","ssnChildValid","requireDirectDebit","directDebitNotPossible","ssnChild","payByDirectDebitPossible","birthDate","parsedBirthDate","isBefore","allSsnValid","allowChangeSSN","contractant","approveContractAsync","isApproved","newApplicationForm","navigateToLogin","navigateToForm","localeData","languageCode","countryCode","ActivitiesController","getChildActivities","programs","DocumentsController","getDocumentsAsync","ChildDocumentsController","uploadFile","getChildDocumentsAsync","uploaded","newDocument","saveChildDocumentAsync","ChildRequestsController","modalService","openWaitinglist","waitinglistItems","contractRequests","planningRequests","hasContractRequests","hasPlanningRequests","getRequestsAsync","getWaitinglistAsync","waitinglist","LoginController","currentYear","usernameRegistration","validUsername","validUsernameRegistration","registrationMessage","whitelabelApp","send","gotoRegistration","sendRegistration","un","pw","remember","forgotPasswordAsync","registerEmailCheckAsync","GotoAppController","linkAction","LightboxDirective","fancybox","defaults","buttons","render","$href","createVideoUrl","$img","$setViewValue","files","$viewValue","getAppConfig","setCurrentCountry","allChildren","persons","isCurrentUser","use","saveLanguageAsync","doRequest","loggedIn","getAllChildren","doLoggedInRequest","header","userId","userType","image64","accessKey","languageId","originalPassword","userName","packageIds","stringDate","tariefgroepIds","finalOnly","entityType","registerAsIncidental","blockId","blockType","fromTimes","tillTimes","oldDate","newDate","child_id","isDownload","item_id","parent_id","isString","childrenIds","requestId","file","fileFormData","FormData","transformRequest","identity","codes","defaultValue","parsedFrom","parseDate","parsedTill","parsedFromTime","parseDuration","parsedTillTime","subtract"],"mappings":"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,CAAYA,MAAU,KAyBtB,SAAYC,GACR,kBACA,cAFJ,CAAYA,MAAW,KAKvB,SAAYC,GACR,4BACA,wBACA,sBACA,sBACA,wBALJ,CAAYA,MAAmB,KAQ/B,SAAYC,GACR,oBACA,kBACA,cACA,oBACA,kBACA,gBANJ,CAAYA,MAAqB,KASjC,SAAYC,GACR,4BACA,sCACA,4BACA,4CACA,kDACA,oDACA,4BACA,4CACA,sCACA,oCACA,4CACA,oCACA,0BACA,0BACA,sBACA,4BACA,4BACA,8CACA,sDACA,4CACA,gBACA,8BACA,gCACA,wCACA,kCACA,sBACA,0BACA,4BACA,4BACA,oCACA,gCACA,wCACA,sCACA,sDACA,oCACA,sCACA,oCACA,gCACA,oCACA,0CACA,0DACA,sBACA,kCACA,4CACA,8CACA,8BACA,8CACA,wCACA,kCACA,oCACA,8CACA,wBACA,kCACA,wCACA,8BACA,8CACA,0BACA,0CACA,oBACA,kCACA,oCACA,oCACA,oCACA,kBACA,0BACA,oBACA,sCACA,8BACA,0CACA,0BACA,sCACA,kDACA,gCACA,oCACA,sCACA,gCACA,sBACA,sCACA,sCACA,8BACA,oCACA,kCACA,sCACA,kDACA,kDACA,oCACA,kDACA,kCACA,gCACA,wCACA,0DACA,oCACA,sBACA,4CACA,kCACA,wDACA,gCACA,8BACA,4BACA,4BACA,sCACA,oCACA,4CACA,4BACA,oBACA,oCACA,4CACA,8BACA,0BACA,sCACA,oCACA,gCACA,sBACA,0CACA,kCACA,oCACA,4CACA,oBACA,8BACA,0BACA,wBACA,kCACA,kDACA,sDACA,0CACA,8CACA,oCACA,gCACA,gCACA,kDACA,wCACA,8CACA,gDACA,gCACA,gCACA,0BACA,oCACA,sCACA,sCACA,8BACA,8CACA,oDACA,wBACA,kCACA,gCACA,4BACA,kDACA,8CACA,0CACA,0BACA,wCACA,gCACA,sBACA,wCACA,4CA3JJ,CAAYA,MAAU,KChXtB,SAAKC,GAAgB,2BAAU,mBAAM,qBAAO,qBAAO,qBAAnD,CAAKA,MAAa,KAyCl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","file":"main.427be4698644b96f59bf.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// 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\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 \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([124,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","module.exports = angular;","window.addEventListener('load', async () => {\r\n if ('serviceWorker' in navigator) {\r\n const registration = await navigator.serviceWorker.register('/service-worker.js');\r\n\r\n // Check every hour\r\n setInterval(() => registration.update(), 60 * 60 * 1000);\r\n\r\n let refreshing = false;\r\n navigator.serviceWorker.addEventListener('controllerchange', function () {\r\n if (refreshing) {\r\n return;\r\n }\r\n\r\n window.location.reload();\r\n refreshing = true;\r\n });\r\n }\r\n});","//#region IE version\r\n\r\nvar ie = (function () {\r\n\r\n var undef,\r\n v = 3,\r\n div = document.createElement('div'),\r\n all = div.getElementsByTagName('i');\r\n\r\n while (\r\n div.innerHTML = '',\r\n all[0]\r\n ){\r\n }\r\n\r\n return v > 4 ? v : undef;\r\n\r\n}());\r\n\r\n//#endregion\r\n\r\n//#region Window location origin\r\n\r\nif (!window.location.origin) {\r\n window.location.origin = window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : '');\r\n}\r\n\r\n//#endregion\r\n\r\nwindow.FortyTwo = window.FortyTwo || function () {\r\n};\r\n\r\nFortyTwo.prototype.DEBUG = window.location.origin.indexOf('.ngrok.io') >= 0 ||\r\n window.location.origin.indexOf('localhost') >= 0 ||\r\n window.location.origin.indexOf('.local') >= 0 ||\r\n window.location.origin.indexOf('.test') >= 0;\r\n\r\nFortyTwo.prototype.createDelegate = function (ctx, fnc) {\r\n\r\n // because arguments is an object that can act like an array, use slice to return arguments as array.\r\n var slice = Array.prototype.slice;\r\n\r\n // get every argument after index 1 if applied\r\n var args = arguments.length > 2 ? slice.call(arguments, 2) : null;\r\n\r\n // return a new function with pre-given parameters and parameters when called\r\n return function () {\r\n return fnc.apply(ctx, args ? args.concat(slice.call(arguments)) : arguments);\r\n };\r\n\r\n};\r\n\r\nFortyTwo.prototype.defineNamespace = function (namespace) {\r\n\r\n var nsparts = namespace.split('.');\r\n var parent;\r\n\r\n // we want to be able to include or exclude the root namespace\r\n if (nsparts[0] === 'FortyTwo') {\r\n\r\n // if not exists, create it\r\n if (!window[nsparts[0]]) {\r\n window[nsparts[0]] = {};\r\n }\r\n\r\n parent = window[nsparts[0]];\r\n nsparts = nsparts.slice(1);\r\n }\r\n\r\n // loop through the parts and create a nested namespace if necessary\r\n for (var i = 0; i < nsparts.length; i++) {\r\n\r\n var partname = nsparts[i];\r\n\r\n // check if the current parent already has the namespace declared\r\n // if it isn't, then create it\r\n if (typeof parent[partname] === 'undefined') {\r\n parent[partname] = {};\r\n }\r\n\r\n parent = parent[partname];\r\n\r\n }\r\n\r\n // the parent is now constructed with empty namespaces and can be used\r\n return parent;\r\n\r\n};\r\n\r\n/*\r\n * defineBindableGetter\r\n * purpose: defines getter property that will be seen by the hasOwnProperty method in angular.extend\r\n */\r\nFortyTwo.prototype.defineBindableGetter = function (obj, prop, fnc) {\r\n\r\n Object.defineProperty(obj, prop, {\r\n enumerable: true,\r\n configurable: false,\r\n writable: false,\r\n value: fnc.bind(obj)()\r\n });\r\n\r\n};\r\n\r\nFortyTwo.prototype.getRandom = function (min, max) {\r\n\r\n min = min || 1;\r\n max = max || 9999999;\r\n\r\n return Math.floor((Math.random() * (max - min)) + min);\r\n\r\n};\r\n\r\nFortyTwo.prototype.getInterval = function (min, max) {\r\n\r\n min = min || 10;\r\n max = max || 20;\r\n\r\n return FortyTwo.getRandom(min, max) * 1000;\r\n\r\n};\r\n\r\n// usage ft.getQueryVariable('id|name|prodId')\r\nFortyTwo.prototype.getQueryVariable = function (name) {\r\n name = name.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\r\n\r\n var regex = new RegExp('[\\\\?&]' + name + '=([^&#]*)'), results = regex.exec(location.search);\r\n return results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));\r\n};\r\n\r\n// usage ft.getQueryParam('id|name|prodId')\r\nFortyTwo.prototype.getQueryParam = function (name) {\r\n name = name.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\r\n\r\n var regex = new RegExp('[\\\\?&]' + name + '=([^/&#]*)');\r\n var results = regex.exec(window.location.href);\r\n return results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));\r\n};\r\n\r\nFortyTwo = new FortyTwo();\r\nFortyTwo.browser = ie;\r\nFortyTwo.randomNumber = FortyTwo.getRandom();","import {IAngularStatic, IModule, IHttpPromise, IRootScopeService, IPromise} from 'angular';\r\nimport { ChildCare } from './data-models';\r\n\r\ntype UserModel = ChildCare.Definitions.Account.UserModel;\r\n\r\ndeclare module 'angular' {\r\n interface IModule {\r\n animation: (element: string, options: any) => void;\r\n settings: IFortyTwoFrameworkSettings;\r\n levels: any;\r\n events: any;\r\n navigation: any;\r\n exceptions: any;\r\n }\r\n}\r\n\r\ndeclare global {\r\n\r\n interface Window {\r\n ft: IFortyTwoStatic | any;\r\n FortyTwo: IFortyTwoStatic | any;\r\n ng: IAngularStatic;\r\n $: JQueryStatic;\r\n jquery: JQueryStatic;\r\n angular: IAngularStatic;\r\n appModule: IModule | any;\r\n }\r\n}\r\n\r\nwindow.ft = window.FortyTwo;\r\nwindow.ng = window.angular;\r\n\r\nexport interface IFortyTwoStatic {\r\n DEBUG: boolean;\r\n isMobile: boolean;\r\n app: IModule | any;\r\n models: IFortyTwoModels;\r\n framework: IFortyTwoFramework;\r\n dates: any;\r\n\r\n log: (level: string, ...args: Array) => void;\r\n createDelegate: (ctx: any, fnc: any) => Function;\r\n defineNamespace: (namespace: string) => any;\r\n defineBindableProperty: (obj: any, prop: any, getter: any, setter?: any) => void;\r\n dontPropagate: (evt: any) => void;\r\n getRandom: (min?: number, max?: number) => number;\r\n getInterval: (min: number, max: number) => number;\r\n getQueryParam: (name: string) => string;\r\n removeQueryParam: (name: string, href: string) => string;\r\n hasValue: (val: any) => boolean;\r\n}\r\n\r\nexport interface IFortyTwoRootScopeService extends IRootScopeService {\r\n configuration: any;\r\n}\r\n\r\nexport interface IFortyTwoFramework\r\n{\r\n module: IModule;\r\n}\r\n\r\nexport interface IFortyTwoFrameworkSettings\r\n{\r\n datetime: any;\r\n keys: any;\r\n sorting: any;\r\n}\r\n\r\nexport interface IFortyTwoModels\r\n{\r\n User: IFortyTwoUser;\r\n Group: (options: any) => IFortyTwoGroup;\r\n}\r\n\r\nexport interface IFortyTwoUser\r\n{\r\n hasRole: (role: string) => boolean;\r\n obj: (options: any) => any;\r\n}\r\n\r\nexport interface IFortyTwoGroup\r\n{\r\n getCount: () => number;\r\n}\r\n\r\nexport interface IFortyTwoRequestService {\r\n config: any;\r\n requestAsync: (request: IFortyTwoRequest, useAuthorization?: boolean, ignoreContentType?: boolean, triggerEvents?: boolean) => IPromise;\r\n}\r\n\r\nexport interface TokenData {\r\n refreshToken: string;\r\n token: {\r\n expires: string;\r\n value: string;\r\n };\r\n}\r\n\r\nexport interface FortyTwoLoginService {\r\n doLogout(): void;\r\n getCurrentUserAsync(): IPromise;\r\n isLoggedInAsync(): IPromise;\r\n getStoredUsername(): string;\r\n wantsToStayLoggedIn(): boolean;\r\n hasValidTokenAsync(): IPromise;\r\n hasRefreshTokenAsync(): IPromise;\r\n doLoginAsync(username: string, password: string, stayLoggedIn: boolean): IPromise;\r\n refreshLoginAsync(): IPromise;\r\n getTokenData(): TokenData;\r\n}\r\n\r\nexport interface IFortyTwoRequest {\r\n url?: string;\r\n path: string;\r\n headers?: Map | { [key: string]: string };\r\n method?: string;\r\n data?: any;\r\n}\r\n\r\nexport interface FortyTwoRequest {\r\n url?: string;\r\n path: string;\r\n headers?: any;\r\n method?: 'POST' | 'GET' | 'PUT' | 'DELETE';\r\n data?: any;\r\n}","ft.defineNamespace('FortyTwo.models');\r\n\r\n//#region Group\r\n\r\n/*\r\n * Group\r\n * purpose: Object to use as placeholder for grouped items.\r\n */\r\nft.models.Group = (function () {\r\n\r\n var getCount = function () {\r\n var count = 0;\r\n\r\n for (var i = 0; i < this.items.length; i++) {\r\n count += parseInt(this.items[i].count);\r\n }\r\n\r\n return count;\r\n };\r\n\r\n var obj = function (options) {\r\n\r\n options = options || {};\r\n\r\n this.title = options.title;\r\n this.items = [];\r\n\r\n ft.defineBindableGetter(this, 'count', getCount);\r\n\r\n };\r\n\r\n obj.prototype = {\r\n //get count() {\r\n\r\n // var count = 0;\r\n\r\n // for (var i = 0; i < this.items.length; i++)\r\n // count += parseInt(this.items[i].count);\r\n\r\n // return count;\r\n\r\n //},\r\n get checked() {\r\n\r\n var checked = true;\r\n\r\n for (var i = 0; i < this.items.length; i++) {\r\n if (!this.items[i].checked) {\r\n checked = false;\r\n }\r\n }\r\n\r\n return checked;\r\n\r\n },\r\n set checked(val) {\r\n\r\n for (var i = 0; i < this.items.length; i++) {\r\n this.items[i].checked = val;\r\n }\r\n\r\n }\r\n };\r\n\r\n return obj;\r\n\r\n})();\r\n\r\n//#endregion\r\n\r\n//#region Timeline\r\n\r\nft.models.Timeline = (function () {\r\n\r\n var obj = function (options) {\r\n\r\n options = options || {};\r\n\r\n this.date = options.date;\r\n this.itemDate = options.itemDate;\r\n this.type = options.type;\r\n this.item = options.item;\r\n\r\n };\r\n\r\n return obj;\r\n\r\n})();\r\n//#endregion\r\n","ft.app.controller('appContentController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$timeout', 'AppService',\r\n function ($rootScope, $scope, $state, $stateParams, $timeout, AppService) {\r\n\r\n var initialized = false;\r\n var offStateChangeSuccess;\r\n\r\n $scope.isLoading = false;\r\n $scope.menuIsOpen = false;\r\n $scope.appData = AppService.data;\r\n $scope.data = {\r\n errorMessage: ''\r\n };\r\n\r\n //#region init\r\n\r\n var initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n offStateChangeSuccess = $rootScope.$on('$stateChangeSuccess', handleStateChangeSuccess);\r\n $scope.$on('$destroy', handleDestroy);\r\n\r\n handleStateChangeSuccess();\r\n getData();\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n //#region screen handlers\r\n\r\n $scope.toggleMenu = function () {\r\n $scope.menuIsOpen = !$scope.menuIsOpen;\r\n };\r\n\r\n $scope.clearErrorMessage = function () {\r\n $scope.data.errorMessage = '';\r\n };\r\n\r\n //#endregion\r\n\r\n //#region get data\r\n\r\n var getData = function () {\r\n\r\n $scope.isLoading = true;\r\n\r\n var prm = AppService.getFamilyAsync();\r\n prm.then(handleGetFamily, handleGetFamilyError);\r\n prm.finally(function () {\r\n $scope.isLoading = false;\r\n });\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n //#region handlers\r\n\r\n var handleGetFamily = function (results) {\r\n };\r\n\r\n var handleGetFamilyError = function (response) {\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : 'Ophalen van de familiegegevens is mislukt.';\r\n };\r\n\r\n var handleStateChangeSuccess = function () {\r\n\r\n if ($state.current && $state.current.pageStyle) {\r\n $scope.pageStyle = $state.current.pageStyle;\r\n } else {\r\n $scope.pageStyle = null;\r\n }\r\n\r\n };\r\n\r\n var handleDestroy = function () {\r\n if (offStateChangeSuccess) {\r\n offStateChangeSuccess();\r\n }\r\n };\r\n\r\n //#endregion\r\n\r\n //#region helpers\r\n\r\n //#endregion\r\n\r\n $timeout(initialize);\r\n }]);","var map = {\n\t\"./nl\": 122,\n\t\"./nl.js\": 122\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 = 318;","ft.app.controller('childProfileController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', 'DataService', 'AppService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, DataService, AppService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.appData = AppService.data;\r\n $scope.data = {\r\n child: null\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n AppService.setCurrentChild($stateParams.child);\r\n $rootScope.$on(ft.app.events.family.get, $scope.initializeData);\r\n\r\n $scope.initializeData();\r\n\r\n };\r\n\r\n $scope.initializeData = function () {\r\n $scope.data.child = AppService.getUser($stateParams.child);\r\n };\r\n\r\n $scope.navigateToInfo = function () {\r\n $state.go('app.child.info', {child: $scope.data.child.id});\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n\r\nft.app.controller('childInfoController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', 'DataService', 'AppService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, DataService, AppService) {\r\n\r\n var initialized = false;\r\n $rootScope.checkForFormChange = true;\r\n\r\n if (!$scope.data) {\r\n $scope.data = {};\r\n }\r\n\r\n $scope.data.appData = AppService.data;\r\n $scope.data.success = $stateParams.success;\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n if ($stateParams.success == true) {\r\n AppService.getFamilyAsync();\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.isBirthday = function () {\r\n\r\n if (!$scope.data.child) {\r\n return false;\r\n }\r\n\r\n var birthday = new Date($scope.data.child.dateOfBirth);\r\n var today = new Date();\r\n\r\n return birthday.getDate() == today.getDate() && birthday.getMonth() == today.getMonth();\r\n\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n\r\nft.app.controller('childContractsController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', '$filter', '$translate', 'DataService', 'AppService', 'ModalService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, $filter, $translate, DataService, AppService, ModalService) {\r\n\r\n var groupByFilter = $filter('GroupByFilter');\r\n var initialized = false;\r\n\r\n if (!$scope.data) {\r\n $scope.data = {};\r\n }\r\n\r\n $scope.isLoading = false;\r\n $scope.data.errorMessage = '';\r\n\r\n $scope.data.items = [];\r\n $scope.data.contractConfig = ft.app.contract;\r\n\r\n $scope.data.requestInformation = [];\r\n $scope.data.requestInformation.preferredLocations = [];\r\n $scope.data.requestInformation.requestedTimeslots = {};\r\n\r\n $scope.data.hasItems = true;\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n getContracts();\r\n\r\n };\r\n\r\n $scope.openNewContract = function (evt) {\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n style: 'contract-modal-settings',\r\n templateUrl: 'contracts/edit-new-modal',\r\n controller: 'contractEditModalController',\r\n inputs: {\r\n item: {\r\n child: $scope.data.child.id\r\n }\r\n }\r\n }).then(function (modal) {\r\n\r\n modal.close.then(function (result) {\r\n\r\n getContracts();\r\n\r\n }, function () {\r\n });\r\n\r\n });\r\n };\r\n \r\n $scope.openContract = function (evt, contract) {\r\n if (contract.state == 'received' || contract.contractants == 0) {\r\n getRequestInformation(contract, () => {\r\n openContractShowModal(evt, contract);\r\n });\r\n }\r\n else\r\n {\r\n openContractShowModal(evt, contract);\r\n }\r\n };\r\n\r\n function openContractShowModal(evt, contract)\r\n {\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n style: 'contract-modal-settings',\r\n templateUrl: 'contracts/item',\r\n controller: 'contractModalController',\r\n inputs: {\r\n item: {\r\n child: $scope.data.child.id,\r\n contract: contract,\r\n preferredLocations: $scope.data.requestInformation.preferredLocations,\r\n requestedTimeslots: $scope.data.requestInformation.requestedTimeslots,\r\n }\r\n }\r\n }).then(function (modal) {\r\n\r\n modal.close.then(function (result) {\r\n\r\n getContracts();\r\n\r\n }, function () {\r\n });\r\n\r\n });\r\n }\r\n\r\n var getContracts = function () {\r\n\r\n $scope.data.errorMessage = '';\r\n $scope.isLoading = true;\r\n\r\n var prm = DataService.getContractsAsync($stateParams.child);\r\n prm.then(handleGetContracts, handleGetContractsError);\r\n prm.finally(function () {\r\n $scope.isLoading = false;\r\n });\r\n\r\n };\r\n\r\n var handleGetContracts = function (results) {\r\n\r\n if (results && results.length) {\r\n $scope.data.hasItems = true;\r\n // old > new\r\n results.sort(function (a, b) {\r\n\r\n var aStartDate = new Date(a.start);\r\n var bStartDate = new Date(b.start);\r\n var aEndDate = new Date(a.end);\r\n var bEndDate = new Date(b.end);\r\n\r\n if (aStartDate < bStartDate) {\r\n return -1;\r\n }\r\n if (aStartDate > bStartDate) {\r\n return 1;\r\n }\r\n if (aEndDate < bEndDate) {\r\n return -1;\r\n }\r\n if (aEndDate > bEndDate) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n\r\n });\r\n results.reverse(); // new > old\r\n\r\n $scope.data.items = results;\r\n } else {\r\n $scope.data.hasItems = false;\r\n }\r\n };\r\n\r\n var handleGetContractsError = function (response) {\r\n\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('CONTRACTS.ERROR-GET-CONTRACTS');\r\n\r\n };\r\n\r\n var getRequestInformation = function (contract, callback) {\r\n $scope.data.errorMessage = '';\r\n $scope.isLoading = true;\r\n var prm = DataService.getRequestInformationAsync($stateParams.child, contract.aanvraagId);\r\n prm.then(handleGetRequestInformation, handleGetRequestInformationError);\r\n prm.finally(function () {\r\n if(typeof callback === 'function') {\r\n callback();\r\n }\r\n $scope.isLoading = false;\r\n });\r\n };\r\n \r\n var handleGetRequestInformation = function (result) {\r\n if (result && Object.keys(result).length != 0) { \r\n $scope.data.requestInformation.preferredLocations = result.preferredLocations;\r\n $scope.data.requestInformation.requestedTimeslots = result.requestedTimeslots;\r\n $scope.data.hasItems = true;\r\n } else {\r\n $scope.data.hasItems = false;\r\n }\r\n };\r\n\r\n var handleGetRequestInformationError = function (response) {\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('CONTRACTS.ERROR-GET-CONTRACT-REQUEST');\r\n };\r\n \r\n $timeout($scope.initialize);\r\n }\r\n ]);\r\n\r\nft.app.controller('childEditController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', '$filter', '$translate', 'DataService', 'AppService', 'CheckStateChangeService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, $filter, $translate, DataService, AppService, CheckStateChangeService) {\r\n\r\n var initialized = false;\r\n var getPhoneNumber = $filter('GetPhoneNumber');\r\n\r\n CheckStateChangeService.checkFormOnStateChange($scope, 'childForm');\r\n\r\n if (!$scope.data) {\r\n $scope.data = {};\r\n }\r\n\r\n ng.extend($scope.data, {\r\n appData: AppService.data,\r\n name: {},\r\n ssn: '',\r\n dateOfBirth: '',\r\n placeOfBirth: '',\r\n gender: '',\r\n emergencyNumber: '',\r\n doctorName: '',\r\n doctorPhone: '',\r\n insuranceOrganizationName: '',\r\n insuranceOrganizationNumber: '',\r\n school: '',\r\n schools: AppService.data.schools,\r\n dateOfBirthOpened: false,\r\n dateOptions: {\r\n formatYear: 'yy'\r\n },\r\n formats: ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'],\r\n format: 'dd-MM-yyyy',\r\n saving: false,\r\n errorMessage: '',\r\n successMessage: '',\r\n lastNameValid: true,\r\n firstNameValid: true,\r\n dateOfBirthValid: true,\r\n genderValid: true,\r\n ssnValid: true,\r\n attempts: 0\r\n });\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n $rootScope.$on(ft.app.events.app.config, function () {\r\n $scope.data.schools = AppService.data.schools;\r\n });\r\n\r\n $rootScope.$on(ft.app.events.family.get, function () {\r\n $scope.initializeData();\r\n });\r\n\r\n $scope.initializeData();\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.initializeData = function () {\r\n\r\n if ($scope.data.child) {\r\n var data = $scope.data;\r\n var child = data.child;\r\n\r\n data.name = child.name;\r\n data.ssn = child.ssn;\r\n data.dateOfBirth = new Date(child.dateOfBirth);\r\n data.placeOfBirth = child.placeOfBirth;\r\n data.gender = child.gender;\r\n data.remarks = child.remarks;\r\n \r\n var emergencyNumber = getPhoneNumber(child.contactInformation, null, true);\r\n data.emergencyNumber = emergencyNumber ? emergencyNumber.content : '';\r\n\r\n if (child.doctor) {\r\n var doctorPhone = getPhoneNumber(child.doctor.contactInformation);\r\n data.doctorName = child.doctor.name;\r\n data.doctorPhone = doctorPhone ? doctorPhone.content : '';\r\n }\r\n\r\n if (child.insurance) {\r\n data.insuranceOrganizationName = child.insurance.organization;\r\n data.insuranceOrganizationNumber = child.insurance.policyNumber;\r\n }\r\n\r\n if (child.school) {\r\n data.school = child.school.id;\r\n }\r\n }\r\n };\r\n\r\n $scope.isDateOfBirthInFuture = function () {\r\n var data = $scope.data;\r\n\r\n if (data.dateOfBirth) {\r\n return ft.dates.isDateInFuture(data.dateOfBirth);\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n $scope.save = function () {\r\n\r\n var data = $scope.data;\r\n\r\n data.errorMessage = '';\r\n data.successMessage = '';\r\n\r\n data.lastNameValid = true;\r\n data.firstNameValid = true;\r\n data.dateOfBirthValid = true;\r\n data.genderValid = true;\r\n data.ssnValid = true;\r\n\r\n if (!data.name.lastName.trim()) {\r\n data.lastNameValid = false;\r\n }\r\n\r\n if (!data.name.firstName.trim()) {\r\n data.firstNameValid = false;\r\n }\r\n\r\n if (!data.dateOfBirth) {\r\n data.dateOfBirthValid = false;\r\n } else {\r\n if (!moment(data.dateOfBirth).isValid()) {\r\n data.dateOfBirthValid = false;\r\n }\r\n }\r\n\r\n if (!data.gender) {\r\n data.genderValid = false;\r\n }\r\n\r\n // Disabled for now as it breaks the form when SSN number is not filled in, backend needs a change\r\n // to get this properly working again\r\n\r\n // if (data.appData.ssnIsRequiredAndShown && data.dateOfBirth && !$scope.isDateOfBirthInFuture() && !data.ssn.trim())\r\n // \tdata.ssnValid = false;\r\n\r\n if (!data.lastNameValid || !data.firstNameValid || !data.dateOfBirthValid || !data.genderValid || !data.ssnValid) {\r\n return;\r\n }\r\n\r\n var obj = {\r\n id: data.child.id,\r\n name: data.name,\r\n type: ft.app.family.types.child,\r\n isContact: false,\r\n dateOfBirth: moment(data.dateOfBirth).format(ft.app.datetime.formats.toAPIDate),\r\n placeOfBirth: data.placeOfBirth,\r\n gender: data.gender,\r\n ssn: data.appData.ssnIsRequiredAndShown ? data.ssn : null,\r\n doctor: {\r\n name: data.doctorName,\r\n //addresses: [],\r\n contactInformation: [\r\n {\r\n type: ft.app.contactInformation.types.phone,\r\n content: data.doctorPhone\r\n }\r\n ]\r\n },\r\n remarks: data.remarks,\r\n insurance: {\r\n organization: data.insuranceOrganizationName,\r\n policyNumber: data.insuranceOrganizationNumber\r\n },\r\n //school: {\r\n // id: data.school\r\n //},\r\n contactInformation: [\r\n {\r\n type: ft.app.contactInformation.types.phone,\r\n content: data.emergencyNumber,\r\n isEmergency: true\r\n }\r\n ]\r\n };\r\n\r\n $scope.data.saving = true;\r\n var prm = DataService.saveChildAsync(obj);\r\n prm.then($scope.handleSave, $scope.handleSaveError);\r\n prm.finally(function () {\r\n $scope.data.saving = false;\r\n });\r\n };\r\n\r\n $scope.handleSave = function (result) {\r\n $scope.data.attempts = 0;\r\n\r\n $rootScope.checkForFormChange = false;\r\n\r\n AppService.getFamilyAsync().then(function () {\r\n $state.go('app.child.info', {id: $scope.data.child.id, success: true});\r\n }, function () {\r\n });\r\n };\r\n\r\n $scope.handleSaveError = function (response) {\r\n\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorMessage = $translate.instant('CHILD-EDIT.ERROR-CONTINUES');\r\n } else {\r\n $scope.data.errorMessage = $translate.instant('CHILD-EDIT.ERROR-SAVE-CHILD');\r\n }\r\n\r\n if (response && !response.result && response.isReadable) {\r\n $scope.data.errorMessage += ' ' + response.message;\r\n }\r\n\r\n };\r\n\r\n $scope.cancel = function () {\r\n $state.go('app.child.info', {child: $stateParams.child});\r\n };\r\n\r\n $scope.open = function ($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n $scope.data.dateOfBirthOpened = true;\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n\r\nft.app.controller('childWidgetController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', 'ModalService', 'PlanningModalService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, ModalService, PlanningModalService) {\r\n\r\n var initialized = false;\r\n\r\n //#region init\r\n\r\n var initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n };\r\n\r\n //#endregion\r\n\r\n //#region screen handlers\r\n\r\n $scope.navigate = function (state) {\r\n\r\n $state.go('app.child.' + state, {child: $scope.child.id});\r\n\r\n };\r\n\r\n $scope.handleActionButton = function (evt, id, key) {\r\n\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n\r\n switch (key) {\r\n case 'absent':\r\n $scope.openAbsentModal(evt, id);\r\n break;\r\n case 'sick':\r\n $scope.openSickModal(evt, id);\r\n break;\r\n case 'present':\r\n $scope.openPresentModal(evt, id);\r\n break;\r\n }\r\n };\r\n\r\n $scope.openAbsentModal = function (evt, id) {\r\n PlanningModalService.openAbsentModal(evt, id)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.openSickModal = function (evt, id) {\r\n PlanningModalService.openAbsentModal(evt, id, null, null, null, null, ft.app.planning.presence.sick)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.openPresentModal = function (evt, id) {\r\n PlanningModalService.openPresentModal(evt, id)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n //#endregion\r\n\r\n //#region data\r\n\r\n //#endregion\r\n\r\n //#region handlers\r\n\r\n //#endregion\r\n\r\n $timeout(initialize);\r\n\r\n }\r\n ]);\r\n","ft.app.controller('financialOverviewController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', '$filter', '$translate', 'LoginService', 'DataService', 'AppService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, $filter, $translate, LoginService, DataService, AppService) {\r\n\r\n var initialized = false;\r\n var offFamily, offDestroy;\r\n var groupByFilter = $filter('GroupByFilter');\r\n var documentTypes = ft.app.document.types;\r\n var invoices, annualStatements;\r\n var filterChildrenInitial;\r\n\r\n $scope.isLoading = false;\r\n $scope.appData = AppService.data;\r\n $scope.annualStatements = [];\r\n $scope.invoices = [];\r\n $scope.filterChildren = [];\r\n\r\n $scope.toggleChild = function (child) {\r\n\r\n child.checked = !child.checked;\r\n filterItems();\r\n };\r\n\r\n $scope.getDownloadLink = function (item) {\r\n\r\n if (item.loading) {\r\n return;\r\n }\r\n\r\n getDownloadLink(item);\r\n };\r\n\r\n $scope.resetDownloadLink = function (item) {\r\n item.loading = false;\r\n item.downloadUrl = null;\r\n };\r\n\r\n var getData = function () {\r\n\r\n $scope.isLoading = true;\r\n\r\n var prmFamily = DataService.getFamilyAsync(true);\r\n prmFamily.then(handleGetFamily, handleGetFamilyError);\r\n\r\n var prmFinancial = DataService.getFinancialOverviewAsync();\r\n prmFinancial.then(handleGetFinancial, handleGetFinancialError);\r\n\r\n var prm = $q.all([prmFamily, prmFinancial]);\r\n prm.finally(function () {\r\n $scope.filterChildren = filterChildrenInitial.filter(x => x.showOnParentApp || (!x.showOnParentApp && childHasFinancialDoc(x.id)));\r\n filterItems();\r\n $scope.isLoading = false;\r\n });\r\n\r\n };\r\n\r\n var handleGetFamily = function (results) {\r\n\r\n var children = results.filter(x => x.type == 'child') || [];\r\n\r\n if (children.length && !children.find(x => x.checked == true)) {\r\n children.forEach(function (child) {\r\n child.checked = true;\r\n });\r\n }\r\n filterChildrenInitial = children;\r\n };\r\n\r\n var handleGetFamilyError = function () {\r\n };\r\n\r\n var childHasAnnualStatement = function (childId) {\r\n var statements = annualStatements.filter(x => x.childId === childId) || [];\r\n return statements.length > 0;\r\n };\r\n\r\n var childHasInvoices= function (childId) {\r\n var statements = invoices.filter(x => x.childId === childId) || [];\r\n return statements.length > 0;\r\n };\r\n\r\n var childHasFinancialDoc = function(childId) {\r\n return childHasAnnualStatement(childId) || childHasInvoices(childId);\r\n };\r\n\r\n var handleGetFinancial = function (results) {\r\n annualStatements = results.filter(x => x.type == documentTypes.annualStatement);\r\n invoices = results.filter(x => x.type == documentTypes.invoice);\r\n };\r\n\r\n var handleGetFinancialError = function (response) {\r\n $scope.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('FINANCIAL.ERROR-LOADING-DOCUMENTS');\r\n };\r\n\r\n var getDownloadLink = function (item) {\r\n item.loading = true;\r\n\r\n var prm = LoginService.refreshLoginAsync();\r\n prm.then(ft.createDelegate($scope, handleGetDownloadLink, item), ft.createDelegate($scope, handleGetDownloadLinkError, item));\r\n prm.finally(function () {\r\n item.loading = false;\r\n });\r\n };\r\n\r\n var handleGetDownloadLink = function (item, results) {\r\n var tokenData = LoginService.getTokenData();\r\n item.downloadUrl = prepareItemUrl(item.url) + 'accessToken=' + encodeURIComponent(tokenData.token.value);\r\n };\r\n\r\n var handleGetDownloadLinkError = function (response) {\r\n\r\n $scope.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('DOCUMENTS.ERROR-GET-DOCUMENT-LINK');\r\n\r\n };\r\n\r\n var handleDestroy = function () {\r\n if (offFamily) {\r\n offFamily();\r\n }\r\n if (offDestroy) {\r\n offDestroy();\r\n }\r\n };\r\n\r\n var initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initializeEvents();\r\n getData();\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n var initializeEvents = function () {\r\n\r\n offFamily = $rootScope.$on(ft.app.events.family.get, handleGetFamily);\r\n offDestroy = $scope.$on('$destroy', handleDestroy);\r\n\r\n };\r\n\r\n var filterItems = function () {\r\n\r\n var appData = $scope.appData;\r\n var invoicingByDebtor = appData.settings.invoicingByDebtor;\r\n var selected = $scope.filterChildren.filter(x => x.checked == true);\r\n var ids = selected.map(function (child) {\r\n return child.id;\r\n });\r\n\r\n var filteredStatements = [];\r\n var filteredInvoices = invoicingByDebtor ? invoices : [];\r\n\r\n if (ids && ids.length) {\r\n\r\n filteredStatements = annualStatements.filter(function (item) {\r\n return ids.indexOf(item.childId) >= 0;\r\n });\r\n\r\n if (!invoicingByDebtor) {\r\n filteredInvoices = invoices.filter(function (item) {\r\n return ids.indexOf(item.childId) >= 0;\r\n });\r\n }\r\n }\r\n\r\n setChildProperty(filteredStatements);\r\n $scope.annualStatements = filteredStatements;\r\n\r\n // don't bind for the second time when filtering is not possible due to setting\r\n if (!invoicingByDebtor || (invoicingByDebtor && !$scope.invoices.length)) {\r\n\r\n if (!invoicingByDebtor) {\r\n setChildProperty(filteredInvoices);\r\n }\r\n\r\n $scope.invoices = filteredInvoices;\r\n }\r\n };\r\n\r\n var setChildProperty = function (items) {\r\n\r\n if (!$scope.filterChildren || !$scope.filterChildren.length) {\r\n return;\r\n }\r\n\r\n var filtered = items.filter(function (item) {\r\n return item.childId;\r\n });\r\n\r\n filtered.forEach(function (item) {\r\n if (item.childId) {\r\n item.child = $scope.filterChildren.find(x => x.id == item.childId);\r\n }\r\n });\r\n };\r\n\r\n var prepareItemUrl = function (url) {\r\n return url + (url.indexOf('?') >= 0 ? '&' : '?');\r\n };\r\n\r\n var sortDocuments = function (a, b) {\r\n var aDate = new Date(a.date);\r\n var bDate = new Date(a.date);\r\n\r\n return aDate > bDate;\r\n };\r\n\r\n\r\n $timeout(initialize);\r\n\r\n }]);\r\n","ft.app.controller('helpDashboardController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', 'DataService', 'AppService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, DataService, AppService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.appData = AppService.data;\r\n $scope.data = {};\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n","ft.app.controller('LoadingController', ['$rootScope', '$scope',\r\n function ($rootScope, $scope) {\r\n\r\n $scope.data = {\r\n isLoading: false\r\n };\r\n\r\n $scope.handleActive = function () {\r\n $scope.data.isLoading = true;\r\n };\r\n\r\n $scope.handleNone = function () {\r\n $scope.data.isLoading = false;\r\n };\r\n\r\n $rootScope.$on(ft.app.events.requests.active, $scope.handleActive);\r\n $rootScope.$on(ft.app.events.requests.none, $scope.handleNone);\r\n\r\n }]);\r\n","ft.app.controller('impersonateController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$timeout', '$translate', 'DataService', 'LoginService',\r\n function ($rootScope, $scope, $state, $stateParams, $timeout, $translate, DataService, LoginService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.isLoading = false;\r\n $scope.data = {\r\n errorMessage: '',\r\n form: null\r\n };\r\n\r\n //#region init\r\n\r\n var initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n getData();\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n //#region get data\r\n\r\n var getData = function () {\r\n\r\n $scope.isLoading = true;\r\n\r\n var prm = LoginService.doImpersonateAsync($stateParams.accesskey, $stateParams.id);\r\n prm.then(handleDoImpersonate, handleDoImpersonateError);\r\n prm.finally(function () {\r\n $scope.isLoading = false;\r\n });\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n //#region handlers\r\n\r\n var handleDoImpersonate = function (results) {\r\n\r\n if (results) {\r\n window.location.replace(window.location.origin);\r\n }\r\n\r\n };\r\n\r\n var handleDoImpersonateError = function (response) {\r\n\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('IMPERSONATE.ERROR-LOGIN-AS-PARENT');\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n $timeout(initialize);\r\n\r\n }\r\n ]);\r\n\r\nft.app.controller('setPasswordController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$timeout', '$translate', 'AppService', 'DataService', 'LoginService',\r\n function ($rootScope, $scope, $state, $stateParams, $timeout, $translate, AppService, DataService, LoginService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.isLoading = false;\r\n $scope.appData = AppService.data;\r\n $scope.isFromApp = $stateParams.isfromapp ?? false;\r\n $scope.data = {\r\n username: '',\r\n password: '',\r\n validPassword: true,\r\n errorMessage: ''\r\n };\r\n\r\n //#region init\r\n\r\n var initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n getData();\r\n\r\n if ($stateParams.lang) {\r\n $scope.switchLanguage($stateParams.lang);\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n //#region screen handlers\r\n\r\n $scope.switchLanguage = function (lang) {\r\n AppService.switchLanguage(lang);\r\n };\r\n\r\n $scope.handleSave = function () {\r\n\r\n setPassword();\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n //#region data\r\n\r\n var getData = function () {\r\n\r\n $scope.isLoading = true;\r\n\r\n var prm = DataService.setPasswordAsync(encodeURIComponent($stateParams.accesskey));\r\n prm.then(handleGetData, handleGetDataError);\r\n prm.finally(function () {\r\n $scope.isLoading = false;\r\n });\r\n\r\n };\r\n\r\n var setPassword = function () {\r\n\r\n $scope.data.errorMessage = '';\r\n $scope.data.validPassword = true;\r\n\r\n var pw = $scope.data.password.toString().trim();\r\n\r\n if (!pw) {\r\n $scope.data.validPassword = false;\r\n ;\r\n return;\r\n }\r\n\r\n $scope.isLoading = true;\r\n\r\n var prm = DataService.setPasswordAsync(encodeURIComponent($stateParams.accesskey), $scope.data.password);\r\n prm.then(handleSetPassword, handleSetPasswordError);\r\n prm.finally(function () {\r\n $scope.isLoading = false;\r\n });\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n //#region handlers\r\n\r\n var handleGetData = function (results) {\r\n $scope.data.username = results.name;\r\n };\r\n\r\n var handleGetDataError = function (response) {\r\n\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('SET-PASSWORD.ERROR-GET-PERSONNAME');\r\n\r\n };\r\n\r\n var handleSetPassword = function (results) {\r\n\r\n if (results) {\r\n if ($scope.isFromApp) {\r\n $state.go('gotoapp');\r\n }\r\n else {\r\n $state.go('login');\r\n }\r\n }\r\n };\r\n\r\n var handleSetPasswordError = function (response) {\r\n\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('SET-PASSWORD.ERROR-SAVE-PASSWORD');\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n $timeout(initialize);\r\n\r\n }\r\n ]);\r\n\r\nft.app.controller('logoutController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', 'AppService', 'LoginService',\r\n function ($rootScope, $scope, $state, $stateParams, AppService, LoginService) {\r\n\r\n LoginService.doLogout();\r\n AppService.data.currentUser = null;\r\n $state.go('login');\r\n\r\n }]);\r\n","ft.app.controller('MessageModalController',\r\n ['$rootScope', '$scope', '$state', '$q', '$uibModalInstance', 'audiences', 'DataService', '$stateParams', 'selectedChild',\r\n function ($rootScope, $scope, $state, $q, $uibModalInstance, audiences, DataService, $stateParams, selectedChild) {\r\n $scope.selectedAudienceId = null;\r\n $scope.selectedAudience = null;\r\n $scope.audiences = audiences;\r\n $scope.selectedChild = selectedChild;\r\n $scope.valid = true;\r\n $scope.message = {};\r\n $scope.audienceIds = [];\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss();\r\n };\r\n\r\n $scope.$watch('selectedAudienceId', function (newId) {\r\n if (newId === null || newId == 'Select an Option') {\r\n $scope.selectedAudience = null;\r\n return;\r\n }\r\n\r\n $scope.selectedAudience = $scope.audiences[newId];\r\n if ($scope.selectedAudience.audiences.length > 0) {\r\n $scope.allAudiencesSelected = false;\r\n $scope.selectedAudience.audiences.forEach(function (audience) {\r\n audience.checked = false;\r\n });\r\n }\r\n\r\n if ($scope.selectedAudience.audiences.length === 1) {\r\n $scope.toggleSelectAudience($scope.selectedAudience.audiences[0]);\r\n }\r\n });\r\n\r\n $scope.toggleSelectionAudiences = function () {\r\n if (!$scope.audiences || !$scope.audiences.length) {\r\n return;\r\n }\r\n\r\n var selected = $scope.selectedAudience.audiences.filter(x => x.checked == true);\r\n var checked = $scope.selectedAudience.audiences.filter(x => x.isAllAudience == false).length === selected.length;\r\n\r\n $scope.allAudiencesSelected = !checked;\r\n $scope.selectedAudience.audiences.forEach(function (item) {\r\n if (!item.isAllAudience) {\r\n item.checked = !checked;\r\n }\r\n });\r\n\r\n };\r\n\r\n $scope.toggleSelectAudience = function (audience) {\r\n audience.checked = !audience.checked;\r\n $scope.allAudiencesSelected = false;\r\n\r\n var amountOfAudiences = $scope.selectedAudience.audiences.filter(x => x.isAllAudience == false).length;\r\n var checkedAmount = $scope.selectedAudience.audiences.filter(x => x.checked == true).length;\r\n\r\n if (amountOfAudiences === checkedAmount) {\r\n $scope.allAudiencesSelected = true;\r\n }\r\n };\r\n\r\n $scope.hasAudiencesSelected = function () {\r\n if ($scope.selectedAudience && $scope.selectedAudience.audiences) {\r\n return $scope.selectedAudience.audiences.filter(x => x.checked == true).length > 0;\r\n }\r\n };\r\n\r\n $scope.selectAudience = function (index) {\r\n $scope.selectedAudience = audiences[index];\r\n };\r\n\r\n $scope.saveConversation = function () {\r\n $scope.isLoading = true;\r\n $scope.errorMessage = '';\r\n\r\n $scope.valid = true;\r\n var audiences = $scope.selectedAudience.audiences.filter(x => x.checked == true);\r\n var audienceIds = [];\r\n\r\n if ($scope.message.content === null || $scope.message.content === '') {\r\n $scope.valid = false;\r\n }\r\n\r\n if ($scope.message.title === null || $scope.message.title === '') {\r\n $scope.valid = false;\r\n }\r\n\r\n if (!audiences || !audiences.length) {\r\n $scope.valid = false;\r\n } else {\r\n audienceIds = audiences.map(function (item) {\r\n return item.id;\r\n });\r\n }\r\n\r\n if (!$scope.valid) {\r\n $scope.audienceIds = audienceIds;\r\n return;\r\n }\r\n\r\n var amountOfAudiences = $scope.selectedAudience.audiences\r\n .filter(x => x.isAllAudience == false);\r\n var hasAllAudience = $scope.selectedAudience.audiences\r\n .find(x => x.isAllAudience == true);\r\n\r\n var expectedAudienceIds = [];\r\n if (amountOfAudiences.length === audienceIds.length && hasAllAudience) {\r\n expectedAudienceIds.push({id: hasAllAudience.id});\r\n } else {\r\n audienceIds.forEach(function (audienceId) {\r\n expectedAudienceIds.push({id: audienceId});\r\n });\r\n }\r\n\r\n var prm = DataService.saveConversationAsync($scope.message, expectedAudienceIds, $scope.selectedChild);\r\n prm.then(handleSaveConversation, handleSaveConversationError);\r\n prm.finally(function () {\r\n $scope.isLoading = false;\r\n });\r\n };\r\n\r\n var handleSaveConversation = function () {\r\n $scope.toggleSelectionAudiences();\r\n $scope.message.content = '';\r\n $scope.message.title = '';\r\n\r\n $rootScope.$emit('newPostMade', false);\r\n $uibModalInstance.dismiss();\r\n swal({\r\n title: 'Verzonden!',\r\n text: 'Het bericht is verzonden!',\r\n timer: 2000,\r\n type: 'success'\r\n });\r\n };\r\n\r\n var handleSaveConversationError = function () {\r\n $uibModalInstance.dismiss();\r\n swal({\r\n title: 'Oops!',\r\n text: 'Er ging iets mis bij het verzenden!',\r\n timer: 2500,\r\n type: 'error'\r\n });\r\n };\r\n }\r\n ]\r\n);\r\n","ft.app.controller('messagesController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', '$filter', '$translate', 'DataService', 'AppService', 'LoginService', '$uibModal',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, $filter, $translate, DataService, AppService, LoginService, $uibModal) {\r\n var initialized = false;\r\n var lastFetchDate = null;\r\n\r\n $scope.isLoading = false;\r\n $scope.loginService = LoginService;\r\n\r\n $scope.conversations = [];\r\n $scope.messageLimit = 3;\r\n $scope.messageListView = true;\r\n $scope.selectedConversation = null;\r\n $scope.replyComment = null;\r\n\r\n $scope.message = '';\r\n\r\n var initialize = function () {\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n getData();\r\n initialized = true;\r\n };\r\n\r\n function getData() {\r\n $scope.isLoading = true;\r\n\r\n var promises = [];\r\n promises.push(DataService.getMessageAudiencesAsync());\r\n promises.push(getMessagesAsync(false));\r\n\r\n var promise = $q.all(promises);\r\n promise.then(handleGetData, handleGetDataError);\r\n promise.finally(function () {\r\n $scope.isLoading = false;\r\n });\r\n }\r\n\r\n var getMessagesAsync = function (loadMore) {\r\n var dateTime = moment().utc().format('YYYY-MM-DDTHH-mm-ss');\r\n if (!lastFetchDate) {\r\n lastFetchDate = dateTime;\r\n return DataService.getMessagesAsync($state.params.child, lastFetchDate);\r\n }\r\n\r\n if (loadMore) {\r\n var lastConvo = $scope.conversations[$scope.conversations.length - 1];\r\n return DataService.getMessagesAsync($state.params.child, lastConvo.lastUpdatedUTC);\r\n }\r\n\r\n var returnValue = DataService.getMessagesSinceAsync($state.params.child, lastFetchDate);\r\n lastFetchDate = dateTime;\r\n return returnValue;\r\n };\r\n\r\n var handleGetData = function (results) {\r\n // Set message audiences\r\n $scope.messageAudiences = results[0].groups;\r\n\r\n // Process messages\r\n handleGetMessages(results[1]);\r\n };\r\n\r\n var handleGetDataError = function () {\r\n\r\n };\r\n\r\n var handleGetMessages = function (results) {\r\n if (!results.posts) {\r\n results = results[0];\r\n }\r\n\r\n if ($scope.conversations.length === 0) {\r\n $scope.conversations = results.posts;\r\n } else {\r\n var posts = results.posts;\r\n\r\n if (posts.length === 0) {\r\n console.log('There were no new messages...');\r\n return;\r\n }\r\n\r\n if ($scope.selectedConversation) {\r\n $scope.sendNotification = false;\r\n doCommentsCall($scope.selectedConversation);\r\n }\r\n\r\n // Send a notification that there are new messages\r\n if ($scope.sendNotification) {\r\n $rootScope.$broadcast(\r\n 'ft-notifications-add',\r\n {\r\n title: 'Nieuwe berichten!',\r\n message: 'Er zijn ' + posts.length + ' nieuwe berichten!'\r\n }\r\n );\r\n }\r\n\r\n posts.forEach(function (post) {\r\n var postExists = $scope.conversations.find(x => x.postId == post.postId);\r\n\r\n if ($scope.sendNotification) {\r\n post.read = false;\r\n }\r\n\r\n if (postExists) {\r\n var index = $scope.conversations.indexOf(postExists);\r\n $scope.conversations[index] = post;\r\n } else {\r\n $scope.conversations.push(post);\r\n }\r\n });\r\n\r\n }\r\n };\r\n\r\n var doCommentsCall = function (conversation) {\r\n DataService.getCommentsForMessage(conversation).then(\r\n setComments,\r\n handleGetDataError\r\n );\r\n };\r\n\r\n $scope.showMoreMessages = function () {\r\n getMessagesAsync(true)\r\n .then(addConversationsToList, handleGetDataError)\r\n .finally(function () {\r\n $scope.messageLimit += 3;\r\n });\r\n };\r\n\r\n var addConversationsToList = function (results) {\r\n results.posts.forEach(function (conversation) {\r\n $scope.conversations.push(conversation);\r\n });\r\n };\r\n\r\n var setComments = function (conversation) {\r\n conversation.comments.forEach(function (comment) {\r\n var replies = conversation.comments.filter(x => x.replyToCommentId == comment.commentId);\r\n\r\n comment.hasReplies = replies.length > 0;\r\n replies.forEach(function (reply) {\r\n reply.isReply = true;\r\n });\r\n });\r\n\r\n $scope.selectedConversation = getCommentReplies(conversation);\r\n markAsRead(conversation);\r\n };\r\n\r\n var getCommentReplies = function (selectedConversation) {\r\n selectedConversation.comments.forEach(function (comment) {\r\n var comments = selectedConversation.comments.filter(x => x.replyToCommentId == comment.commentId);\r\n\r\n var otherIndex = selectedConversation.comments.indexOf(comment);\r\n comments.forEach(function (comment) {\r\n var index = selectedConversation.comments.indexOf(comment);\r\n selectedConversation.comments.splice(index, 1);\r\n\r\n selectedConversation.comments.splice(otherIndex + 1, 0, comment);\r\n otherIndex++;\r\n });\r\n });\r\n\r\n selectedConversation.comments.forEach(function (comment) {\r\n var isLeft = true;\r\n if (comment.isReply) {\r\n isLeft = false;\r\n }\r\n\r\n comment.isLeft = isLeft;\r\n });\r\n\r\n return selectedConversation;\r\n };\r\n\r\n var markAsRead = function (conversation) {\r\n var index = $scope.conversations.indexOf(conversation);\r\n conversation.read = true;\r\n\r\n $scope.conversations[index] = conversation;\r\n };\r\n\r\n $scope.answerComment = function (comment) {\r\n $scope.replyComment = comment;\r\n };\r\n\r\n $scope.backToListView = function () {\r\n $scope.messageListView = true;\r\n $scope.replyComment = null;\r\n $scope.selectedConversation = null;\r\n\r\n $state.go('app.child.messages');\r\n };\r\n\r\n $scope.sendMessage = function (event, message) {\r\n $scope.isLoading = true;\r\n $scope.message = message;\r\n\r\n var prm = DataService.answerToPostAsync($scope.selectedConversation, $scope.replyComment, message);\r\n prm.then(handleSaveAnswerToPost, handleGetDataError);\r\n prm.finally(function () {\r\n $scope.isLoading = false;\r\n $scope.replyComment = null;\r\n event.message = '';\r\n\r\n $rootScope.$emit('newPostMade', false);\r\n });\r\n };\r\n\r\n $scope.getReplyer = function(selectedConversation, comment) {\r\n return selectedConversation.comments.find(x => x.commentId == comment.replyToCommentId);\r\n };\r\n\r\n $rootScope.getAvatarInitials = function (fullName) {\r\n var matches = fullName.match(/\\b(\\w)/g);\r\n if (matches.length < 2) {\r\n return fullName.slice(0, 2).toUpperCase();\r\n }\r\n\r\n matches = matches.slice(0, 2);\r\n return matches.join('').toUpperCase();\r\n };\r\n\r\n var handleSaveAnswerToPost = function (result) {\r\n doCommentsCall($scope.selectedConversation);\r\n };\r\n\r\n $scope.loadMessage = function (conversation) {\r\n $state.go('app.child.messagesSpecific', {message: conversation.postId});\r\n };\r\n\r\n $scope.openCreateConverstationModal = function () {\r\n $uibModal.open({\r\n animation: true,\r\n templateUrl: 'partials/messages/message-modal.html',\r\n controller: 'MessageModalController',\r\n size: 'lg',\r\n backdrop: true,\r\n keyboard: true,\r\n resolve: {\r\n audiences: function () {\r\n return ng.copy($scope.messageAudiences);\r\n },\r\n selectedChild: function () {\r\n return ng.copy($state.params.child);\r\n }\r\n }\r\n });\r\n };\r\n\r\n if ($stateParams.message) {\r\n doCommentsCall({postId: $stateParams.message});\r\n $scope.messageListView = false;\r\n }\r\n\r\n $timeout(initialize());\r\n }\r\n ]);\r\n","ft.app.controller('navigationController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$timeout', 'AppService', 'DataService',\r\n function ($rootScope, $scope, $state, $stateParams, $timeout, AppService, DataService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.appData = AppService.data;\r\n\r\n //#region init\r\n\r\n var initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n //#region screen handlers\r\n\r\n $scope.setCurrentChild = function (id) {\r\n AppService.setCurrentChild(id);\r\n };\r\n\r\n //#endregion\r\n\r\n $timeout(initialize);\r\n\r\n }\r\n ]);\r\n","ft.app.controller('incidentalModalController',\r\n ['$scope', '$element', 'close', 'item', '$timeout', '$translate', 'AppService', 'DataService', 'CheckStateChangeService',\r\n function ($scope, $element, close, item, $timeout, $translate, AppService, DataService, CheckStateChangeService) {\r\n ft.app.log(item);\r\n CheckStateChangeService.checkFormOnStateChange($scope, 'incidentalForm');\r\n\r\n var initialized = false;\r\n item = item || {};\r\n\r\n var loadingKeyPossibleTimes = 'possibleTimes';\r\n\r\n var addLoading = function (key) {\r\n if ($scope.data.loading.indexOf(key) < 0) {\r\n $scope.data.loading.push(key);\r\n }\r\n };\r\n\r\n var removeLoading = function (key) {\r\n var idx = $scope.data.loading.indexOf(key);\r\n if (idx >= 0) {\r\n $scope.data.loading.splice(idx, 1);\r\n }\r\n };\r\n\r\n $scope.appData = AppService.data;\r\n $scope.data = {\r\n attempts: 0,\r\n loading: [],\r\n saving: false,\r\n saveEnabled: true,\r\n comments: '',\r\n format: 'dd-MM-yyyy',\r\n now: new Date(),\r\n tomorrow: new Date(new Date().setDate(new Date().getDate() + 1)),\r\n from: null,\r\n fromOpened: false,\r\n fromValid: true,\r\n isToday: false,\r\n dateOptions: {\r\n formatYear: 'yy',\r\n minDate: new Date()\r\n },\r\n selectedTimes: [],\r\n possibleTimes: [],\r\n selectedTimesValid: true, // if a time is selected\r\n timesValid: true, // if start/end time are valid from the selected\r\n possibleTimesMessage: null,\r\n creditHoursApplicable: false,\r\n useCreditHours: true\r\n };\r\n\r\n $scope.$watch('data.selectedTimes', function () {\r\n $scope.data.selectedTimes.forEach(function (time) {\r\n if (time.creditHours > 0) {\r\n $scope.data.creditHoursApplicable = true;\r\n }\r\n });\r\n }, true);\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n $scope.data.from = item.from ? new Date(item.from) : new Date();\r\n $scope.handleChangedDate();\r\n\r\n initialized = true;\r\n };\r\n\r\n $scope.handleChangedDate = function () {\r\n\r\n if ($scope.data.from) {\r\n $scope.getPossibleTimes();\r\n }\r\n\r\n };\r\n\r\n $scope.getPossibleTimes = function () {\r\n\r\n addLoading(loadingKeyPossibleTimes);\r\n\r\n var data = $scope.data;\r\n\r\n data.possibleTimes.length = 0;\r\n data.selectedTimes.length = 0;\r\n data.possibleTimesMessage = null;\r\n data.timesValid = true;\r\n\r\n var date = moment($scope.data.from).format(ft.app.datetime.formats.toAPIDate);\r\n var prm = DataService.getPossibleTimesForDateAsync(item.child, date, true, 3458);\r\n prm.then($scope.handleGetPossibleTimes, $scope.handleGetPossibleTimesError);\r\n prm.finally(function () {\r\n removeLoading(loadingKeyPossibleTimes);\r\n data.creditHoursApplicable = data.possibleTimes.some(function (e) {\r\n return e.creditHoursApplicable;\r\n });\r\n });\r\n\r\n };\r\n\r\n $scope.handleGetPossibleTimes = function (results) {\r\n var data = $scope.data;\r\n\r\n if (results.availableTimeslots) {\r\n results.availableTimeslots.sort(function (a, b) {\r\n\r\n var aStart = parseInt(a.start);\r\n var bStart = parseInt(b.start);\r\n\r\n if (aStart > bStart) {\r\n return 1;\r\n } else if (aStart < bStart) {\r\n return -1;\r\n } else {\r\n return 0;\r\n }\r\n\r\n });\r\n\r\n if (results.availableTimeslots.length == 1) {\r\n data.selectedTimes.push(results.availableTimeslots[0]);\r\n }\r\n }\r\n\r\n $scope.data.possibleTimesMessage = results.availableTimeslotsMessage || null;\r\n $scope.data.possibleTimes = results.availableTimeslots || [];\r\n\r\n $scope.data.possibleTimes.forEach(function (time) {\r\n $scope.resetTimes(time);\r\n });\r\n\r\n };\r\n\r\n $scope.handleGetPossibleTimesError = function (response) {\r\n $scope.data.possibleTimes.length = 0;\r\n };\r\n\r\n $scope.open = function (evt) {\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n\r\n $scope.data.fromOpened = true;\r\n };\r\n\r\n $scope.save = function () {\r\n var apiFrom, date;\r\n var data = $scope.data;\r\n data.errorMessage = '';\r\n data.successMessage = '';\r\n data.isToday = false;\r\n data.fromValid = true;\r\n data.selectedTimesValid = true;\r\n data.timesValid = true;\r\n\r\n date = moment().format(ft.app.datetime.formats.toAPIDate);\r\n\r\n // if from is not defined or not valid if defined\r\n if (!data.from) {\r\n data.fromValid = false;\r\n } else {\r\n apiFrom = moment(data.from).format(ft.app.datetime.formats.toAPIDate);\r\n data.fromValid = moment(apiFrom).isValid();\r\n }\r\n\r\n if (data.selectedTimes && !data.selectedTimes.length) {\r\n data.selectedTimesValid = false;\r\n } else if ($scope.appData.showIrregularTimeFields) {\r\n\r\n var reqStart, reqEnd, start, end;\r\n\r\n if (data.fromValid) {\r\n data.isToday = date == apiFrom;\r\n }\r\n\r\n // don't validate, but just set to initial value\r\n // should be done by binding, but for some reason that doesn't work\r\n data.selectedTimes.forEach(function (item) {\r\n\r\n item.startError = false;\r\n item.endError = false;\r\n\r\n if (!item.requestedStart) {\r\n item.requestedStart = item.start;\r\n }\r\n\r\n if (!item.requestedEnd) {\r\n item.requestedEnd = item.end;\r\n }\r\n\r\n reqStart = new Date(date + ' ' + item.requestedStart);\r\n reqEnd = new Date(date + ' ' + item.requestedEnd);\r\n start = new Date(date + ' ' + item.start);\r\n end = new Date(date + ' ' + item.end);\r\n\r\n if (reqEnd < reqStart) {\r\n item.endError = true;\r\n }\r\n\r\n if (data.isToday && reqStart < start) {\r\n item.startError = true;\r\n }\r\n\r\n if (item.startError || item.endError) {\r\n data.timesValid = false;\r\n }\r\n\r\n });\r\n\r\n }\r\n\r\n if (!data.fromValid || !data.selectedTimesValid) {\r\n return;\r\n }\r\n\r\n apiFrom = moment(data.from).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n data.saving = true;\r\n var prm = DataService.saveIncidentalAsync(item.child, apiFrom, data.selectedTimes, data.useCreditHours, data.comments);\r\n prm.then($scope.handleSave, $scope.handleSaveError);\r\n prm.finally(function () {\r\n data.saving = false;\r\n $scope.close();\r\n });\r\n };\r\n\r\n $scope.handleSave = function (results) {\r\n $scope.data.saveEnabled = false;\r\n $scope.data.attempts = 0;\r\n $scope.data.successMessage = $translate.instant('PLANNING-INCIDENTAL.SAVED');\r\n };\r\n\r\n $scope.handleSaveError = function (response) {\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorMessage = $translate.instant('PLANNING-INCIDENTAL.ERROR-CONTINUES');\r\n } else {\r\n $scope.data.errorMessage = $translate.instant('PLANNING-INCIDENTAL.ERROR-SAVE-INCIDENTAL');\r\n }\r\n\r\n if (response && !response.result && response.isReadable) {\r\n $scope.data.errorMessage += ' ' + response.message;\r\n }\r\n };\r\n\r\n $scope.resetTimes = function (time) {\r\n time.requestedStart = time.start.substr(0, 5);\r\n time.requestedEnd = time.end.substr(0, 5);\r\n };\r\n\r\n $scope.close = function () {\r\n if (!$scope.data.saving) {\r\n ($scope.data.saveEnabled) ? close() : close({});\r\n }\r\n };\r\n\r\n $scope.cancel = function () {\r\n if (!$scope.data.saving) {\r\n close();\r\n }\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }]);","ft.app.controller('planningChoiceController',\r\n ['$scope', '$element', 'close', 'child', 'item', '$timeout', 'AppService', 'PlanningModalService',\r\n function ($scope, $element, close, child, item, $timeout, AppService, PlanningModalService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.data = {\r\n item: item,\r\n child: null,\r\n hasActions: false\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n $scope.data.child = AppService.getUser(child);\r\n $scope.determineHasActions();\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.hasBlock = function () {\r\n return $scope.data.item.day.blocks.length > 0;\r\n };\r\n\r\n $scope.maySwapInThePast = function () {\r\n return AppService.data.allowSwapdaysFromPast;\r\n };\r\n\r\n $scope.isClosedDay = function () {\r\n return $scope.data.item.day.type == ft.app.planning.days.closed;\r\n };\r\n\r\n $scope.isSick = function () {\r\n\r\n // check if child is currently sick\r\n if (new Date($scope.data.item.day.date).setHours(0, 0, 0, 0) == new Date().setHours(0, 0, 0, 0) && $scope.data.child.isSick) {\r\n return true;\r\n }\r\n\r\n var blocks = $scope.data.item.day.blocks;\r\n var result = false;\r\n\r\n if (blocks) {\r\n blocks.forEach(function (item, idx) {\r\n\r\n if (item.presence == ft.app.planning.presence.sick) {\r\n result = true;\r\n }\r\n\r\n });\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.isInThePast = function () {\r\n return new Date(item.day.date).setHours(0, 0, 0, 0) < new Date().setHours(0, 0, 0, 0);\r\n };\r\n\r\n $scope.isToday = function () {\r\n return new Date(item.day.date).setHours(0, 0, 0, 0) == new Date().setHours(0, 0, 0, 0);\r\n };\r\n\r\n $scope.determineHasActions = function () {\r\n\r\n var actions = ['absentFrom', 'absentTill', 'present', 'swapFrom', 'swapTill', 'incidental'];\r\n $scope.data.hasActions = false;\r\n\r\n var possible = actions.filter(function (action) {\r\n return $scope.mayShowActionButton(action, true);\r\n });\r\n\r\n $scope.data.hasActions = possible && possible.length > 0;\r\n\r\n };\r\n\r\n $scope.hasAbsenceBlock = function (blocks) {\r\n\r\n if (!$scope.hasBlock()) {\r\n return false;\r\n }\r\n\r\n var config = ft.app.planning;\r\n\r\n var results = blocks.filter(function (item) {\r\n\r\n if ((item.status == config.states.approved) &&\r\n (item.type == config.types.planning || item.type == config.types.incidental || item.type == config.types.swap) &&\r\n (item.presence == config.presence.sick || item.presence == config.presence.holiday || item.presence == config.presence.absent || item.presence == config.presence.other)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n\r\n });\r\n\r\n return results && results.length;\r\n\r\n };\r\n\r\n $scope.mayShowActionButton = function (key, bypass) {\r\n\r\n var result = false;\r\n var day = $scope.data.item.day;\r\n\r\n if (!$scope.data.hasActions && !bypass) {\r\n return false;\r\n }\r\n\r\n if (day.type == ft.app.planning.days.closed) {\r\n return false;\r\n }\r\n\r\n if ($scope.isInThePast()) {\r\n switch (key) {\r\n case 'swapFrom':\r\n result = $scope.maySwapInThePast() && ($scope.isClosedDay() || $scope.hasAbsenceBlock(day.blocks));\r\n break;\r\n }\r\n } else {\r\n switch (key) {\r\n case 'absentFrom':\r\n result = true;\r\n break;\r\n case 'absentTill':\r\n result = !$scope.isToday();\r\n break;\r\n case 'sick': // ziek melden\r\n result = !$scope.isSick();\r\n break;\r\n case 'present': // beter melden\r\n result = $scope.isSick();\r\n break;\r\n case 'swapFrom':\r\n result = $scope.hasBlock();\r\n break;\r\n case 'swapTill':\r\n result = !$scope.hasBlock();\r\n break;\r\n case 'incidental':\r\n result = true;\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.handleActionButton = function (evt, key) {\r\n\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n\r\n switch (key) {\r\n case 'absentFrom':\r\n case 'absentTill':\r\n $scope.openAbsentModal(evt, (key == 'absentFrom'));\r\n break;\r\n case 'sick':\r\n $scope.openSickModal(evt);\r\n break;\r\n case 'present':\r\n $scope.openPresentModal(evt);\r\n break;\r\n case 'swapFrom':\r\n case 'swapTill':\r\n $scope.openSwapModal(evt, (key == 'swapFrom'));\r\n break;\r\n case 'incidental':\r\n $scope.openIncidental(evt);\r\n break;\r\n }\r\n };\r\n\r\n $scope.openAbsentModal = function (evt, from) {\r\n var item = $scope.data.item;\r\n var fromDate = from ? item.day.date : null;\r\n var tillDate = !from ? item.day.date : null;\r\n\r\n PlanningModalService.openAbsentModal(evt, child, fromDate, tillDate)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.openSickModal = function (evt) {\r\n PlanningModalService.openAbsentModal(evt, child, $scope.data.item.day.date, null, null, null, ft.app.planning.presence.sick)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.openPresentModal = function (evt) {\r\n PlanningModalService.openPresentModal(evt, child, $scope.data.item.day.date)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.openSwapModal = function (evt, from) {\r\n var item = $scope.data.item;\r\n var fromDate = from ? item.day.date : null;\r\n var tillDate = !from ? item.day.date : null;\r\n\r\n PlanningModalService.openSwapModal(evt, child, fromDate, tillDate)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.openIncidental = function (evt) {\r\n var from = $scope.data.item.day.date;\r\n\r\n PlanningModalService.openIncidentalModal(evt, child, from)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.close = function () {\r\n close({});\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);","ft.app.controller('planningItemActivitiesController',\r\n ['$scope', '$element', 'close', 'item', '$timeout', 'AppService', 'ModalService',\r\n function ($scope, $element, close, item, $timeout, AppService, ModalService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.data = {\r\n child: null,\r\n item: item,\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n $scope.data.child = AppService.getUser($scope.data.item.child);\r\n\r\n };\r\n\r\n $scope.openActivity = function (evt, activity) {\r\n var modal = ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n templateUrl: 'planning/activity-modal',\r\n controller: 'planningItemActivityController',\r\n inputs: {\r\n item: {\r\n activity: activity\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.close = function () {\r\n close();\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);","ft.app.controller('planningItemActivityController',\r\n ['$scope', '$element', 'close', 'item', '$timeout',\r\n function ($scope, $element, close, item, $timeout) {\r\n\r\n var initialized = false;\r\n\r\n $scope.data = {\r\n item: item,\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.close = function () {\r\n close();\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);","ft.app.controller('planningItemController',\r\n ['$scope', '$element', 'close', 'child', 'item', '$timeout', 'AppService', 'PlanningModalService',\r\n function ($scope, $element, close, child, item, $timeout, AppService, PlanningModalService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.data = {\r\n child: null,\r\n planningConfig: ft.app.planning,\r\n hasActions: false,\r\n item: item\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n $scope.determineHasActions();\r\n $scope.data.child = AppService.getUser(child);\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.getStartDate = function () {\r\n\r\n if (!item.day.date || !item.block.start) {\r\n return;\r\n }\r\n\r\n var m = moment(item.day.date).format(ft.app.datetime.formats.toAPIDate);\r\n var date = new Date(m + ' ' + item.block.start);\r\n\r\n return date;\r\n };\r\n\r\n $scope.getEndDate = function () {\r\n\r\n if (!item.day.date || !item.block.end) {\r\n return;\r\n }\r\n\r\n var m = moment(item.day.date).format(ft.app.datetime.formats.toAPIDate);\r\n var date = new Date(m + ' ' + item.block.end);\r\n\r\n return date;\r\n\r\n };\r\n\r\n $scope.isCurrentlyActive = function () {\r\n\r\n var now = new Date();\r\n var start = $scope.getStartDate();\r\n var end = $scope.getEndDate();\r\n\r\n if (!start || !end) {\r\n return false;\r\n }\r\n\r\n return start <= now && now <= end;\r\n };\r\n\r\n $scope.maySwapInThePast = function () {\r\n return AppService.data.allowSwapdaysFromPast;\r\n };\r\n\r\n $scope.isToday = function () {\r\n return new Date().setHours(0, 0, 0, 0) == new Date(item.day.date).setHours(0, 0, 0, 0);\r\n };\r\n\r\n $scope.isInThePast = function () {\r\n\r\n var m = moment(item.day.date).format(ft.app.datetime.formats.toAPIDate);\r\n var end = item.block.end ? new Date(m + 'T' + item.block.end) : new Date(m);\r\n var now = new Date();\r\n\r\n return end < now;\r\n };\r\n\r\n $scope.isClosedDay = function () {\r\n return $scope.data.item.day.type == ft.app.planning.days.closed;\r\n };\r\n\r\n $scope.isAbsenceBlock = function () {\r\n\r\n var block = $scope.data.item.block;\r\n var config = ft.app.planning;\r\n\r\n return (block.status == config.states.approved) &&\r\n (\r\n block.type == config.types.planning ||\r\n block.type == config.types.incidental ||\r\n block.type == config.types.swap ||\r\n block.type == config.types.absent\r\n ) && (\r\n block.presence == config.presence.sick ||\r\n block.presence == config.presence.holiday ||\r\n block.presence == config.presence.absent ||\r\n block.presence == config.presence.other\r\n );\r\n };\r\n\r\n $scope.determineHasActions = function () {\r\n\r\n var actions = ['absent', 'present', 'swap', 'cancel', 'request']; // TODO: add action 'edit'\r\n $scope.data.hasActions = false;\r\n\r\n var possible = actions.filter(function (action) {\r\n return $scope.mayShowActionButton(action, true);\r\n });\r\n\r\n $scope.data.hasActions = possible && possible.length > 0;\r\n };\r\n\r\n $scope.mayShowActionButton = function (key, bypass) {\r\n\r\n var result = false;\r\n var block = $scope.data.item.block;\r\n var config = ft.app.planning;\r\n\r\n if (!$scope.data.hasActions && !bypass) {\r\n return false;\r\n }\r\n\r\n // if block is rejected\r\n if (block.status == config.states.rejected) {\r\n return false;\r\n }\r\n\r\n // if block is a swap traded from day\r\n if (block.type == config.types.registration && block.registrationType == config.registrations.swap && block.presence == config.presence.traded) {\r\n return false;\r\n }\r\n\r\n if ($scope.isInThePast()) {\r\n switch (key) {\r\n case 'swap':\r\n if ($scope.maySwapInThePast() && ($scope.isClosedDay() || $scope.isAbsenceBlock())) {\r\n result = true;\r\n }\r\n\r\n break;\r\n }\r\n } else {\r\n\r\n if ($scope.data.item.day.type == config.days.closed && key != 'swap') {\r\n return false;\r\n }\r\n\r\n switch (key) {\r\n case 'absent':\r\n // if not already absent and the child is expected\r\n result = block.type != config.types.absent && block.presence == config.presence.present && block.status == config.states.approved;\r\n break;\r\n case 'present':\r\n // if the child is sick during this block\r\n result = block.presence == config.presence.sick;\r\n break;\r\n case 'swap':\r\n result = block.type == config.days.closed || \r\n (block.presence != config.presence.traded && block.status == config.states.approved && \r\n ((block.type == config.types.planning && block.packageSupportsSwapdays) || \r\n (block.type == config.types.registration && block.registrationType == config.registrations.incidental) || \r\n (block.type == config.types.registration && block.registrationType == config.registrations.swap) || \r\n block.type == config.types.absent));\r\n break;\r\n case 'cancel': \r\n result = block.type != config.types.absent && block.status == config.states.requested;\r\n break;\r\n case 'request':\r\n result = block.type != config.types.absent && block.status == config.states.requestable;\r\n break;\r\n case 'edit':\r\n result = block.type != config.types.absent && block.status == config.states.rejected;\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.handleActionButton = function (evt, key) {\r\n\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n\r\n switch (key) {\r\n case 'absent':\r\n $scope.openAbsentModal(evt);\r\n break;\r\n case 'sick':\r\n $scope.openSickModal(evt);\r\n break;\r\n case 'present':\r\n $scope.openPresentModal(evt);\r\n break;\r\n case 'swap':\r\n $scope.openSwapModal(evt);\r\n break;\r\n case 'incidental':\r\n $scope.openIncidental(evt);\r\n break;\r\n case 'request':\r\n $scope.openRequestModal(evt, false);\r\n break;\r\n case 'cancel':\r\n $scope.openRequestModal(evt, true);\r\n break;\r\n }\r\n };\r\n\r\n $scope.openAbsentModal = function (evt) {\r\n var item = $scope.data.item;\r\n\r\n PlanningModalService.openAbsentModal(evt, child, item.day.date, item.day.date, item.block.start, item.block.end)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.openSickModal = function (evt) {\r\n PlanningModalService.openAbsentModal(evt, child, $scope.data.item.day.date, null, null, null, ft.app.planning.presence.sick)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.openPresentModal = function (evt) {\r\n PlanningModalService.openPresentModal(evt, child, $scope.data.item.day.date)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.openSwapModal = function (evt) {\r\n var data = $scope.data;\r\n var block = data.item.block;\r\n\r\n PlanningModalService.openSwapModal(evt, child, $scope.data.item.day.date, null, block.planningId, block.timeslotId)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.openIncidental = function (evt) {\r\n PlanningModalService.openIncidentalModal(evt, child, $scope.data.item.day.date)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.openRequestModal = function (evt, cancellation) {\r\n var data = $scope.data.item;\r\n\r\n var item = {\r\n date: data.day.date,\r\n dayType: data.day.type,\r\n block: data.block\r\n };\r\n\r\n PlanningModalService.openRequestModal(evt, child, [item], cancellation)\r\n .then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.close = function () {\r\n close({});\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);","ft.app.controller('planningItemEmployeesController',\r\n ['$scope', '$element', 'close', 'item', '$timeout',\r\n function ($scope, $element, close, item, $timeout) {\r\n\r\n var initialized = false;\r\n\r\n $scope.data = {\r\n item: item,\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.close = function () {\r\n close();\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);","ft.app.controller('planningListController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', '$translate', 'AppService', 'DataService', 'ModalService', 'PlanningModalService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, $translate, AppService, DataService, ModalService, PlanningModalService) {\r\n\r\n var initialized = false;\r\n\r\n var loadingKeyPlanning = 'planning';\r\n var loadingKeyActivities = 'activities';\r\n var loadingKeyEmployees = 'employees';\r\n\r\n var addLoading = function (key) {\r\n if ($scope.data.loading.indexOf(key) < 0) {\r\n $scope.data.loading.push(key);\r\n }\r\n };\r\n\r\n var removeLoading = function (key) {\r\n var idx = $scope.data.loading.indexOf(key);\r\n if (idx >= 0) {\r\n $scope.data.loading.splice(idx, 1);\r\n }\r\n };\r\n\r\n $scope.data = {\r\n child: null,\r\n loading: [],\r\n message: '',\r\n planningConfig: ft.app.planning,\r\n selectedYear: new Date().getFullYear(),\r\n selectedMonth: new Date().getMonth(),\r\n weekdays: [''],\r\n weeks: [],\r\n daysInWeek: 5,\r\n activities: [],\r\n employees: [],\r\n requestables: [],\r\n selectedRequestables: {},\r\n hasRequestables: false,\r\n isInBulkMode: false\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n $scope.data.child = AppService.getUser($stateParams.child);\r\n\r\n if ($stateParams.year || $stateParams.month) {\r\n $scope.setPeriod($stateParams.year, $stateParams.month);\r\n } else if (AppService.getSelectedMonthAndYear()) {\r\n var obj = AppService.getSelectedMonthAndYear();\r\n $scope.setPeriod(obj.year, obj.month);\r\n }\r\n\r\n $rootScope.$on(ft.app.events.family.get, function () {\r\n if (!$scope.data.weeks) {\r\n $scope.getData();\r\n }\r\n });\r\n\r\n $scope.getData();\r\n\r\n };\r\n\r\n $scope.getFirstStudyBlock = (day) => {\r\n return day.blocks.filter(x => x.type == $scope.data.planningConfig.types.study)[0];\r\n };\r\n\r\n $scope.setPeriod = function (year, month) {\r\n\r\n if (year) {\r\n $scope.data.selectedYear = parseInt(year);\r\n }\r\n\r\n if (month || month == 0) {\r\n $scope.data.selectedMonth = parseInt(month);\r\n }\r\n\r\n AppService.setSelectedMonthAndYear(month, year);\r\n\r\n };\r\n\r\n $scope.getData = function () {\r\n $scope.getPlanning();\r\n $scope.getActivities();\r\n };\r\n\r\n $scope.getPlanning = function () {\r\n $scope.data.message = '';\r\n\r\n addLoading(loadingKeyPlanning);\r\n var prm = DataService.getPlanningAsync($stateParams.child, $scope.data.selectedYear, $scope.data.selectedMonth);\r\n prm.then($scope.handleGetPlanning, $scope.handleGetPlanningError);\r\n prm.finally(function () {\r\n removeLoading(loadingKeyPlanning);\r\n });\r\n };\r\n\r\n $scope.handleGetPlanning = function (results) {\r\n\r\n $scope.data.hasRequestables = false;\r\n $scope.data.selectedRequestables = {};\r\n var requestables = $scope.data.requestables = {};\r\n\r\n if (results.weeks) {\r\n for (let week of results.weeks) {\r\n for (let day of week.days) {\r\n\r\n // get all future requestables (including today)\r\n if (!$scope.isInThePast(day.date)) {\r\n\r\n for (let block of day.blocks) {\r\n // if it is a requestable that requires action\r\n if (block.type != ft.app.planning.types.absent && block.status == ft.app.planning.states.requestable) {\r\n $scope.data.hasRequestables = true;\r\n\r\n const blockId = $scope.createUniqueBlockId(day.date, block.planningId || block.id, block.timeslotId);\r\n requestables[blockId] = {\r\n date: day.date,\r\n dayType: day.type,\r\n block: block\r\n };\r\n }\r\n }\r\n }\r\n\r\n\r\n }\r\n }\r\n }\r\n\r\n $scope.data.daysInWeek = results.daysInWeek;\r\n $scope.data.weeks = results.weeks;\r\n };\r\n\r\n $scope.handleGetPlanningError = function (response) {\r\n\r\n $scope.data.weeks = null;\r\n $scope.data.message = $translate.instant('PLANNING.ERROR-NO-PLANNING-FOUND');\r\n\r\n if (response && !response.result && response.isReadable) {\r\n $scope.data.message += ' ' + response.message;\r\n }\r\n };\r\n\r\n $scope.getActivities = function () {\r\n\r\n var date = new Date(), y = date.getFullYear(), m = date.getMonth();\r\n var firstDay = new Date(y, m, 1);\r\n var lastDay = new Date(y, m + 1, 0);\r\n firstDay = firstDay.setDate(firstDay.getDate() - 7);\r\n lastDay = lastDay.setDate(lastDay.getDate() + 7);\r\n\r\n var start = moment(firstDay).format(ft.app.datetime.formats.toAPIDate);\r\n var end = moment(lastDay).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n addLoading(loadingKeyActivities);\r\n\r\n var prm = DataService.getActivitiesByRangeAsync($stateParams.child, start, end);\r\n prm.then($scope.handleGetActivities, $scope.handleGetActivitiesError);\r\n prm.finally(function () {\r\n removeLoading(loadingKeyActivities);\r\n });\r\n\r\n };\r\n\r\n $scope.handleGetActivities = function (results) {\r\n $scope.data.activities = results;\r\n };\r\n\r\n $scope.handleGetActivitiesError = function (results) {\r\n };\r\n\r\n $scope.getEmployees = function () {\r\n\r\n var date = new Date(), y = date.getFullYear(), m = date.getMonth();\r\n var firstDay = new Date(y, m, 1);\r\n var lastDay = new Date(y, m + 1, 0);\r\n firstDay = firstDay.setDate(firstDay.getDate() - 7);\r\n lastDay = lastDay.setDate(lastDay.getDate() + 7);\r\n\r\n var start = moment(firstDay).format(ft.app.datetime.formats.toAPIDate);\r\n var end = moment(lastDay).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n addLoading(loadingKeyEmployees);\r\n\r\n var prm = DataService.getEmployeesByRangeAsync($stateParams.child, start, end);\r\n prm.then($scope.handleGetEmployees, $scope.handleGetEmployeesError);\r\n prm.finally(function () {\r\n removeLoading(loadingKeyEmployees);\r\n });\r\n\r\n };\r\n\r\n $scope.handleGetEmployees = function (results) {\r\n $scope.data.employees = results;\r\n };\r\n\r\n $scope.handleGetEmployeesError = function (results) {\r\n };\r\n\r\n $scope.getActivitiesForDay = function (date) {\r\n var m = moment(date).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n var results = $scope.data.activities.filter(function (item) {\r\n return item.date == m;\r\n });\r\n\r\n if (results && results.length) {\r\n return results[0].activities || [];\r\n }\r\n\r\n return [];\r\n };\r\n\r\n $scope.getEmployeesForDay = function (date) {\r\n var m = moment(date).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n var results = $scope.data.employees.filter(function (item) {\r\n return item.date == m;\r\n });\r\n\r\n if (results && results.length) {\r\n return results[0].employees || [];\r\n }\r\n\r\n return [];\r\n };\r\n\r\n $scope.dateIsThisMonth = function (date) {\r\n return new Date(date).getMonth() == $scope.data.selectedMonth;\r\n };\r\n\r\n $scope.isInThePast = function (date) {\r\n\r\n return ft.dates.isDateInFuture(date, true) == false;\r\n\r\n };\r\n\r\n $scope.isFirstDayOfMonthShown = function (week, day) {\r\n\r\n var previousDay = $scope.getPreviousDay(week, day);\r\n var result;\r\n\r\n if (!previousDay) {\r\n result = false; // not interrested if this day is the actual first day on the calendar\r\n } else {\r\n var month = new Date(previousDay.date).getMonth();\r\n result = month != $scope.data.selectedMonth;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.isLastDayOfMonthShown = function (week, day) {\r\n\r\n var nextDay = $scope.getNextDay(week, day);\r\n var result;\r\n\r\n if (!nextDay) {\r\n result = true;\r\n } else {\r\n var month = new Date(nextDay.date).getMonth();\r\n result = month != $scope.data.selectedMonth;\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n $scope.getPreviousDay = function (week, day) {\r\n\r\n var weekIdx = $scope.data.weeks.indexOf(week);\r\n var dayIdx = week.days.indexOf(day);\r\n var result;\r\n\r\n if (weekIdx == 0 && dayIdx == 0) {\r\n result = null;\r\n } else if (dayIdx == 0) {\r\n var previousWeek = $scope.data.weeks[weekIdx - 1];\r\n result = previousWeek.days[previousWeek.days.length - 1];\r\n } else {\r\n result = week.days[dayIdx - 1];\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n $scope.getNextDay = function (week, day) {\r\n\r\n var weekIdx = $scope.data.weeks.indexOf(week);\r\n var dayIdx = week.days.indexOf(day);\r\n var result;\r\n\r\n if (weekIdx == $scope.data.weeks.length - 1 && dayIdx == week.days.length - 1) {\r\n result = null;\r\n } else if (dayIdx == week.days.length - 1) {\r\n var nextWeek = $scope.data.weeks[weekIdx + 1];\r\n result = nextWeek.days[0];\r\n } else {\r\n result = week.days[dayIdx + 1];\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n $scope.navigateToMonthOfToday = function () {\r\n var today = new Date();\r\n var month = today.getMonth().toString();\r\n var year = today.getFullYear().toString();\r\n\r\n $scope.setPeriod(year, month);\r\n $scope.getData();\r\n };\r\n\r\n $scope.navigateToPreviousMonth = function () {\r\n var data = $scope.data;\r\n var month = data.selectedMonth == 0 ? 11 : data.selectedMonth - 1;\r\n var year = data.selectedMonth == 0 ? data.selectedYear - 1 : data.selectedYear;\r\n\r\n $scope.setPeriod(year.toString(), month.toString());\r\n $scope.getData();\r\n };\r\n\r\n $scope.navigateToNextMonth = function () {\r\n var data = $scope.data;\r\n var month = data.selectedMonth == 11 ? 0 : data.selectedMonth + 1;\r\n var year = data.selectedMonth == 11 ? data.selectedYear + 1 : data.selectedYear;\r\n\r\n $scope.setPeriod(year.toString(), month.toString());\r\n $scope.getData();\r\n };\r\n\r\n $scope.handleActionButton = function (evt, key) {\r\n\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n\r\n var id = $stateParams.child;\r\n\r\n switch (key) {\r\n case 'absent':\r\n $scope.openAbsentModal(evt, id);\r\n break;\r\n case 'sick':\r\n $scope.openSickModal(evt, id);\r\n break;\r\n case 'present':\r\n $scope.openPresentModal(evt, id);\r\n break;\r\n case 'swap':\r\n $scope.openSwapModal(evt, id);\r\n break;\r\n case 'incidental':\r\n $scope.openIncidental(evt, id);\r\n break;\r\n }\r\n };\r\n\r\n $scope.openAbsentModal = function (evt, id) {\r\n PlanningModalService.openAbsentModal(evt, id)\r\n .then(function (modal) {\r\n\r\n modal.close.then(function () {\r\n\r\n $scope.getData();\r\n\r\n }, function () {\r\n });\r\n\r\n });\r\n };\r\n\r\n $scope.openSickModal = function (evt, id) {\r\n PlanningModalService.openAbsentModal(evt, id, null, null, null, null, ft.app.planning.presence.sick)\r\n .then(function (modal) {\r\n\r\n modal.close.then(function () {\r\n\r\n $scope.getData();\r\n\r\n }, function () {\r\n });\r\n\r\n });\r\n };\r\n\r\n $scope.openPresentModal = function (evt, id) {\r\n PlanningModalService.openPresentModal(evt, id)\r\n .then(function (modal) {\r\n\r\n modal.close.then(function () {\r\n\r\n $scope.getData();\r\n\r\n }, function () {\r\n });\r\n\r\n });\r\n };\r\n\r\n $scope.openSwapModal = function (evt, id) {\r\n PlanningModalService.openSwapModal(evt, id)\r\n .then(function (modal) {\r\n\r\n modal.close.then(function () {\r\n\r\n $scope.getData();\r\n\r\n }, function () {\r\n });\r\n\r\n });\r\n };\r\n\r\n $scope.openIncidental = function (evt, id) {\r\n PlanningModalService.openIncidentalModal(evt, id)\r\n .then(function (modal) {\r\n\r\n modal.close.then(function () {\r\n\r\n $scope.getData();\r\n\r\n }, function () {\r\n });\r\n\r\n });\r\n };\r\n\r\n $scope.openChoice = function (evt, day) {\r\n\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n templateUrl: 'planning/choice',\r\n controller: 'planningChoiceController',\r\n inputs: {\r\n child: $stateParams.child,\r\n item: {\r\n day: day\r\n }\r\n }\r\n }).then(function (modal) {\r\n\r\n modal.close.then(function () {\r\n\r\n $scope.getData();\r\n\r\n }, function () {\r\n });\r\n\r\n });\r\n\r\n };\r\n\r\n $scope.openPlanningBlock = function (evt, day, block) {\r\n\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n templateUrl: 'planning/item',\r\n controller: 'planningItemController',\r\n inputs: {\r\n child: $stateParams.child,\r\n item: {\r\n day: day,\r\n block: block\r\n }\r\n }\r\n }).then(function (modal) {\r\n\r\n modal.close.then(function () {\r\n\r\n $scope.getData();\r\n\r\n }, function () {\r\n });\r\n\r\n });\r\n\r\n };\r\n\r\n $scope.openActivities = function (evt, day) {\r\n\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n\r\n var activities = $scope.getActivitiesForDay(day.date);\r\n\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n style: '.activities-modal-settings',\r\n templateUrl: 'planning/activities-modal',\r\n controller: 'planningItemActivitiesController',\r\n inputs: {\r\n item: {\r\n child: $stateParams.child,\r\n day: day,\r\n activities: activities\r\n }\r\n }\r\n }).then(function (modal) {\r\n });\r\n\r\n };\r\n\r\n $scope.openEmployees = function (evt, day, employees) {\r\n\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n\r\n //var employees = $scope.getEmployeesForDay(day.date);\r\n\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n templateUrl: 'planning/employees-modal',\r\n controller: 'planningItemEmployeesController',\r\n inputs: {\r\n item: {\r\n day: day,\r\n employees: employees\r\n }\r\n }\r\n }).then(function (modal) {\r\n });\r\n\r\n };\r\n\r\n $scope.openMonthPicker = function (evt) {\r\n\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n style: '.month-picker-modal-settings',\r\n templateUrl: 'month-picker-modal',\r\n controller: 'monthPickerController',\r\n inputs: {\r\n selectedDate: {\r\n year: $scope.data.selectedYear,\r\n month: $scope.data.selectedMonth\r\n }\r\n }\r\n }).then(function (modal) {\r\n\r\n // handle close\r\n modal.close.then(function (result) {\r\n console.log(result);\r\n if (!result) {\r\n return;\r\n }\r\n\r\n $scope.setPeriod(result.year, result.month);\r\n $scope.getData();\r\n\r\n });\r\n\r\n });\r\n\r\n };\r\n\r\n $scope.openLegenda = function (evt) {\r\n\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n templateUrl: 'planning/legenda-modal',\r\n controller: 'dummyModalController'\r\n });\r\n\r\n };\r\n\r\n $scope.toggleMode = function () {\r\n\r\n $scope.data.isInBulkMode = !$scope.data.isInBulkMode;\r\n\r\n };\r\n\r\n $scope.toggleSelectedRequestable = function (key) {\r\n\r\n var selectedRequestables = $scope.data.selectedRequestables;\r\n selectedRequestables[key] = !selectedRequestables[key];\r\n };\r\n\r\n $scope.openRequestModal = function (evt) {\r\n\r\n var selected = [];\r\n var requestables = $scope.data.requestables;\r\n var selectedRequestables = $scope.data.selectedRequestables;\r\n\r\n for (var key in selectedRequestables) {\r\n\r\n if (selectedRequestables[key] == true) {\r\n selected.push(requestables[key]);\r\n }\r\n\r\n }\r\n\r\n // sort on date\r\n selected.sort(function (a, b) {\r\n\r\n var aDate = new Date(a.date);\r\n var bDate = new Date(b.date);\r\n\r\n return aDate > bDate;\r\n\r\n });\r\n\r\n PlanningModalService.openRequestModal(evt, $stateParams.child, selected, false)\r\n .then(function (modal) {\r\n\r\n // handle close\r\n modal.close.then(function (result) {\r\n\r\n $scope.getData();\r\n\r\n });\r\n\r\n });\r\n\r\n };\r\n\r\n $scope.createUniqueBlockId = function (date, id, timeslotId) {\r\n return date + '-' + id + '-' + timeslotId;\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);","ft.app.controller('presentModalController',\r\n ['$scope', '$element', 'close', 'item', '$timeout', '$translate', 'DataService', 'CheckStateChangeService',\r\n function ($scope, $element, close, item, $timeout, $translate, DataService, CheckStateChangeService) {\r\n\r\n CheckStateChangeService.checkFormOnStateChange($scope, 'presentForm');\r\n\r\n var initialized = false;\r\n item = item || {};\r\n\r\n $scope.data = {\r\n attempts: 0,\r\n saveEnabled: true,\r\n saving: false,\r\n format: 'dd-MM-yyyy',\r\n now: new Date(),\r\n from: null,\r\n fromOpened: false,\r\n fromValid: true,\r\n dateOptions: {\r\n formatYear: 'yy'\r\n }\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n $scope.data.from = item.from ? new Date(item.from) : null;\r\n\r\n initialized = true;\r\n };\r\n\r\n $scope.open = function ($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n $scope.data.fromOpened = true;\r\n };\r\n\r\n $scope.save = function () {\r\n\r\n var apiFrom;\r\n $scope.data.errorMessage = '';\r\n $scope.data.successMessage = '';\r\n $scope.data.fromValid = true;\r\n\r\n // if from is not defined or not valid if defined\r\n if (!$scope.data.from) {\r\n $scope.data.fromValid = false;\r\n } else {\r\n apiFrom = moment($scope.data.from).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n if (!moment(apiFrom).isValid()) {\r\n $scope.data.fromValid = false;\r\n } else if (new Date(apiFrom).setHours(0, 0, 0, 0) < new Date().setHours(0, 0, 0, 0)) {\r\n $scope.data.fromValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.fromValid) {\r\n return;\r\n }\r\n\r\n // start from today and by today\r\n var d = new Date($scope.data.from);\r\n //d.setDate(d.getDate() - 1);\r\n apiFrom = moment(d).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n $scope.data.saving = true;\r\n var prm = DataService.savePresentAsync(item.child, apiFrom);\r\n prm.then($scope.handleSave, $scope.handleSaveError);\r\n prm.finally(function () {\r\n $scope.data.saving = false;\r\n $scope.close();\r\n });\r\n };\r\n\r\n $scope.handleSave = function (results) {\r\n $scope.data.saveEnabled = false;\r\n $scope.data.attempts = 0;\r\n $scope.data.successMessage = $translate.instant('PLANNING-PRESENT.SAVED');\r\n };\r\n\r\n $scope.handleSaveError = function (response) {\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorMessage = $translate.instant('PLANNING-PRESENT.ERROR-CONTINUES');\r\n } else {\r\n $scope.data.errorMessage = $translate.instant('PLANNING-PRESENT.ERROR-SAVE-PRESENT');\r\n }\r\n\r\n if (response && !response.result && response.isReadable) {\r\n $scope.data.errorMessage += ' ' + response.message;\r\n }\r\n };\r\n\r\n $scope.close = function () {\r\n if (!$scope.data.saving) {\r\n ($scope.data.saveEnabled) ? close() : close({});\r\n }\r\n };\r\n\r\n $scope.cancel = function () {\r\n if (!$scope.data.saving) {\r\n close();\r\n }\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }]);","ft.app.controller('swapModalController',\r\n ['$scope', '$element', 'close', 'item', '$timeout', '$translate', 'DataService', 'CheckStateChangeService', 'AppService',\r\n function ($scope, $element, close, item, $timeout, $translate, DataService, CheckStateChangeService, AppService) {\r\n\r\n CheckStateChangeService.checkFormOnStateChange($scope, 'swapForm');\r\n\r\n var initialized = false;\r\n item = item || {};\r\n\r\n $scope.appData = AppService.data;\r\n\r\n $scope.data = {\r\n attempts: 0,\r\n saveEnabled: true,\r\n saving: false,\r\n comments: '',\r\n format: 'dd-MM-yyyy',\r\n now: new Date(),\r\n from: null,\r\n till: null,\r\n fromOpened: false,\r\n tillOpened: false,\r\n fromValid: true,\r\n tillValid: true,\r\n loadingFrom: false,\r\n loadingTill: false,\r\n dateOptions: {\r\n formatYear: 'yy'\r\n },\r\n selectedTimesFrom: [],\r\n possibleTimesFrom: [],\r\n selectedTimesFromValid: true,\r\n selectedTimesTill: [],\r\n possibleTimesTill: [],\r\n selectedTimesTillValid: true,\r\n fromTimesMessage: null,\r\n tillTimesMessage: null,\r\n errorMessage: null,\r\n successMessage: null\r\n };\r\n\r\n $scope.isChecked = function (item) {\r\n if ($scope.data.selectedTimesFrom.indexOf(item) !== -1) {\r\n return true;\r\n }\r\n if ($scope.data.selectedTimesTill.indexOf(item) !== -1) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n $scope.resetTimes = function (time) {\r\n time.requestedStart = time.start.substring(0, 5);\r\n time.requestedEnd = time.end.substring(0, 5);\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n $scope.data.from = item.from ? new Date(item.from) : null;\r\n $scope.data.till = item.till ? new Date(item.till) : null;\r\n\r\n if ($scope.data.from) {\r\n $scope.getPossibleTimes(true);\r\n }\r\n\r\n if ($scope.data.till) {\r\n $scope.getPossibleTimes(false);\r\n }\r\n\r\n initialized = true;\r\n };\r\n\r\n $scope.isStudyDay = (time) => time.typeValue === 3463;\r\n\r\n $scope.getPossibleTimes = function (from) {\r\n var data = $scope.data;\r\n data.saveEnabled = false;\r\n data.fromTimesMessage = null;\r\n data.tillTimesMessage = null;\r\n\r\n if (from) {\r\n data.loadingFrom = true;\r\n data.possibleTimesFrom.length = 0;\r\n\r\n const date = moment(data.from).format(ft.app.datetime.formats.toAPIDate);\r\n const prm = DataService.getPossibleTimesForDateAsync(item.child, date, false, 4240);\r\n prm.then($scope.handleGetPossibleTimesFrom, $scope.handleGetPossibleTimesFromError);\r\n prm.finally(function () {\r\n data.loadingFrom = false;\r\n data.saveEnabled = true;\r\n });\r\n } else {\r\n data.loadingTill = true;\r\n data.possibleTimesTill.length = 0;\r\n\r\n const date = moment(data.till).format(ft.app.datetime.formats.toAPIDate);\r\n const prm = DataService.getPossibleTimesForDateAsync(item.child, date, false, 4240);\r\n prm.then($scope.handleGetPossibleTimesTill, $scope.handleGetPossibleTimesTillError);\r\n prm.finally(function () {\r\n data.loadingTill = false;\r\n data.saveEnabled = true;\r\n });\r\n }\r\n };\r\n\r\n $scope.handleGetPossibleTimesFrom = function (results) {\r\n\r\n var data = $scope.data;\r\n data.selectedTimesFrom.length = 0;\r\n\r\n if (results.tradableTimeslots) {\r\n\r\n results.tradableTimeslots.sort(function (a, b) {\r\n\r\n var aStart = parseInt(a.start);\r\n var bStart = parseInt(b.start);\r\n\r\n if (aStart > bStart) {\r\n return 1;\r\n } else if (aStart < bStart) {\r\n return -1;\r\n } else {\r\n return 0;\r\n }\r\n\r\n });\r\n\r\n // if the modal opened from item and the date is selected, then try to select the item timeslot\r\n if (item.fromTimeslotId && ft.dates.compare($scope.data.from, item.from) == 0) {\r\n\r\n results.tradableTimeslots.forEach(function (itm) {\r\n if (itm.planningId == item.fromPlanningId && itm.timeslotId == item.fromTimeslotId) {\r\n data.selectedTimesFrom.push(itm);\r\n }\r\n });\r\n\r\n } else if (results.tradableTimeslots.length == 1) {\r\n data.selectedTimesFrom.push(results.tradableTimeslots[0]);\r\n }\r\n\r\n }\r\n\r\n $scope.data.fromTimesMessage = results.tradableTimeslotsMessage || null;\r\n $scope.data.possibleTimesFrom = results.tradableTimeslots || [];\r\n\r\n $scope.data.possibleTimesFrom.forEach(function (possibleTime) {\r\n possibleTime.requestedStart = possibleTime.start.substring(0, 5);\r\n possibleTime.requestedEnd = possibleTime.end.substring(0, 5);\r\n });\r\n };\r\n\r\n $scope.handleGetPossibleTimesTill = function (results) {\r\n\r\n var data = $scope.data;\r\n data.selectedTimesTill.length = 0;\r\n\r\n if (results.availableTimeslots) {\r\n\r\n results.availableTimeslots.sort(function (a, b) {\r\n\r\n var aStart = parseInt(a.start);\r\n var bStart = parseInt(b.start);\r\n\r\n if (aStart > bStart) {\r\n return 1;\r\n } else if (aStart < bStart) {\r\n return -1;\r\n } else {\r\n return 0;\r\n }\r\n\r\n });\r\n\r\n if (results.availableTimeslots.length == 1) {\r\n data.selectedTimesTill.push(results.availableTimeslots[0]);\r\n }\r\n\r\n }\r\n\r\n $scope.data.tillTimesMessage = results.availableTimeslotsMessage || null;\r\n $scope.data.possibleTimesTill = results.availableTimeslots || [];\r\n\r\n $scope.data.possibleTimesTill.forEach(function (possibleTime) {\r\n possibleTime.requestedStart = possibleTime.start.substring(0, 5);\r\n possibleTime.requestedEnd = possibleTime.start.substring(0, 5);\r\n });\r\n };\r\n\r\n $scope.handleGetPossibleTimesFromError = function (response) {\r\n $scope.data.selectedTimesFrom.length = 0;\r\n $scope.data.possibleTimesFrom.length = 0;\r\n };\r\n\r\n $scope.handleGetPossibleTimesTillError = function (result) {\r\n $scope.data.selectedTimesTill.length = 0;\r\n $scope.data.possibleTimesTill.length = 0;\r\n };\r\n\r\n $scope.open = function (from, $event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n if (from) {\r\n $scope.data.fromOpened = true;\r\n } else {\r\n $scope.data.tillOpened = true;\r\n }\r\n };\r\n\r\n $scope.save = function () {\r\n\r\n var apiFrom, apiTill;\r\n $scope.data.errorMessage = '';\r\n $scope.data.successMessage = '';\r\n $scope.data.fromValid = true;\r\n $scope.data.tillValid = true;\r\n $scope.data.selectedTimesFromValid = true;\r\n $scope.data.selectedTimesTillValid = true;\r\n\r\n // if from is not defined or not valid if defined\r\n if (!$scope.data.from) {\r\n $scope.data.fromValid = false;\r\n } else {\r\n apiFrom = moment($scope.data.from).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n if (!moment(apiFrom).isValid()) {\r\n $scope.data.fromValid = false;\r\n }\r\n }\r\n\r\n // if till is not defined or not valid if defined\r\n if (!$scope.data.till) {\r\n $scope.data.tillValid = false;\r\n } else {\r\n apiTill = moment($scope.data.till).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n if (!moment(apiTill).isValid()) {\r\n $scope.data.tillValid = false;\r\n }\r\n }\r\n\r\n if (!$scope.data.selectedTimesFrom.length) {\r\n $scope.data.selectedTimesFromValid = false;\r\n }\r\n\r\n if (!$scope.data.selectedTimesTill.length) {\r\n $scope.data.selectedTimesTillValid = false;\r\n }\r\n\r\n if ($scope.data.selectedTimesFrom.length != $scope.data.selectedTimesTill.length) {\r\n $scope.data.selectedTimesFromValid = false;\r\n $scope.data.selectedTimesTillValid = false;\r\n }\r\n\r\n if (!$scope.data.fromValid || !$scope.data.tillValid || !$scope.data.selectedTimesFromValid || !$scope.data.selectedTimesTillValid) {\r\n return;\r\n }\r\n\r\n apiFrom = moment($scope.data.from).format(ft.app.datetime.formats.toAPIDate);\r\n apiTill = moment($scope.data.till).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n if (new Date().setHours(0, 0, 0, 0) > new Date(apiTill).setHours(0, 0, 0, 0)) {\r\n $scope.data.tillValid = false;\r\n return;\r\n }\r\n\r\n $scope.data.saving = true;\r\n var prm = DataService.saveSwapAsync(item.child, apiFrom, apiTill, $scope.data.selectedTimesFrom, $scope.data.selectedTimesTill, $scope.data.comments);\r\n prm.then($scope.handleSave, $scope.handleSaveError);\r\n prm.finally(function () {\r\n $scope.data.saving = false;\r\n });\r\n };\r\n\r\n $scope.handleSave = function (results) {\r\n $scope.data.saveEnabled = false;\r\n $scope.data.attempts = 0;\r\n $scope.data.successMessage = $translate.instant('PLANNING-SWAP.SAVED');\r\n $scope.data.saving = false;\r\n $scope.close();\r\n };\r\n\r\n $scope.handleSaveError = function (response) {\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorMessage = $translate.instant('PLANNING-SWAP.ERROR-CONTINUES');\r\n } else {\r\n $scope.data.errorMessage = $translate.instant('PLANNING-SWAP.ERROR-SAVE-SWAP');\r\n }\r\n\r\n if (response && !response.result && response.isReadable) {\r\n $scope.data.saveEnabled = false;\r\n $scope.data.errorMessage += ' ' + response.message;\r\n }\r\n };\r\n\r\n $scope.close = function () {\r\n if (!$scope.data.saving) {\r\n ($scope.data.saveEnabled) ? close() : close({});\r\n }\r\n };\r\n\r\n $scope.cancel = function () {\r\n if (!$scope.data.saving) {\r\n close();\r\n }\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }]);","ft.app.controller('contractCancelModalController',\r\n ['$scope', '$element', 'close', 'item', '$timeout', '$translate', 'DataService', 'AppService',\r\n function ($scope, $element, close, item, $timeout, $translate, DataService, AppService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.data = {\r\n item: item,\r\n cancellation: false,\r\n comments: '',\r\n saving: false,\r\n saveEnabled: true,\r\n attempts: 0,\r\n successMessage: '',\r\n errorMessage: ''\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n var data = $scope.data;\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.save = function () {\r\n var data = $scope.data;\r\n data.successMessage = '';\r\n data.errorMessage = '';\r\n\r\n if (!data.cancellation) {\r\n return;\r\n }\r\n\r\n data.saving = true;\r\n var prm = DataService.cancelContractAsync(item.child, item.contract.id, data.comments);\r\n prm.then($scope.handleSave, $scope.handleSaveError);\r\n prm.finally(function () {\r\n data.saving = false;\r\n });\r\n\r\n };\r\n\r\n $scope.handleSave = function (results) {\r\n $scope.data.saveEnabled = false;\r\n $scope.data.attempts = 0;\r\n $scope.data.successMessage = $translate.instant('CONTRACTS-CANCEL.CANCELLATION-SAVED');\r\n };\r\n\r\n $scope.handleSaveError = function (response) {\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorMessage = $translate.instant('CONTRACTS-CANCEL.ERROR-CONTINUES');\r\n } else {\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('CONTRACTS-CANCEL.ERROR-SAVE-CANCELLATION');\r\n }\r\n };\r\n\r\n $scope.cancel = function () {\r\n close();\r\n };\r\n\r\n $scope.close = function () {\r\n close({\r\n success: !$scope.data.saveEnabled\r\n });\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n","ft.app.controller('contractEditModalController',\r\n ['$rootScope', '$scope', '$stateParams', '$element', 'close', 'item', '$timeout', '$filter', '$translate', 'DataService', 'AppService', 'CheckStateChangeService',\r\n function ($rootScope, $scope, $stateParams, $element, close, item, $timeout, $filter, $translate, DataService, AppService, CheckStateChangeService) {\r\n\r\n var groupByFilter = $filter('GroupByFilter');\r\n var initialized = false;\r\n\r\n $rootScope.checkForFormChange = true;\r\n CheckStateChangeService.checkFormOnStateChange($scope, 'childForm');\r\n\r\n var loadingKeyPackages = 'packages';\r\n var loadingKeyLocations = 'locations';\r\n\r\n var addLoading = function (key) {\r\n if ($scope.data.loading.indexOf(key) < 0) {\r\n $scope.data.loading.push(key);\r\n }\r\n };\r\n\r\n var removeLoading = function (key) {\r\n var idx = $scope.data.loading.indexOf(key);\r\n if (idx >= 0) {\r\n $scope.data.loading.splice(idx, 1);\r\n }\r\n };\r\n\r\n $scope.data = {\r\n reduceDays: false,\r\n appData: AppService.data,\r\n careConfig: ft.app.care,\r\n item: item,\r\n loading: [],\r\n maxLocations: 3,\r\n currentStep: parseInt($stateParams.step) || 0,\r\n steps: [\r\n {\r\n key: 'packages',\r\n title: $translate.instant('NEW-CONTRACT.STEP-PACKAGES'),\r\n description: 'pp-screen-contract-packages'\r\n },\r\n {\r\n key: 'locations',\r\n title: $translate.instant('NEW-CONTRACT.STEP-LOCATIONS'),\r\n description: 'pp-screen-contract-locations'\r\n },\r\n {\r\n key: 'comments',\r\n title: $translate.instant('NEW-CONTRACT.STEP-COMMENTS'),\r\n description: 'pp-screen-contract-comments'\r\n }\r\n ],\r\n now: new Date(),\r\n registrationId: null,\r\n dateOfBirth: item.child.dateOfBirth,\r\n startdate: null,\r\n registerConfig: null,\r\n mergedPackages: [],\r\n locations: [],\r\n chosenRegisterOption: null,\r\n chosenLocations: [],\r\n chosenPackages: [],\r\n chosenSchool: null,\r\n chosenClass: null,\r\n configQuestions: null,\r\n questions: null,\r\n comments: '',\r\n startdateOpened: false,\r\n dateOptions: {\r\n initDate: moment().add(1, 'day').toDate(),\r\n minDate: moment().add(1, 'day').toDate(),\r\n formatYear: 'yy'\r\n },\r\n formats: ['dd-MM-yyyy', 'dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'],\r\n format: 'dd-MM-yyyy',\r\n startdateValid: true,\r\n chosenRegisterOptionValid: true,\r\n chosenSchoolValid: true,\r\n chosenPackagesValid: true,\r\n chosenLocationsValid: true,\r\n questionsValid: true,\r\n successMessage: '',\r\n errorMessage: '',\r\n saveEnabled: true,\r\n saving: false,\r\n attempts: 0\r\n };\r\n\r\n $scope.$watch('data.reduceDays', function (newVal, oldVal) {\r\n var datePickerDate = item.contract && AppService.data.settings.contractChangeUseCancelDate ?\r\n moment(item.contract.cancelDate).toDate() :\r\n moment().add(1, 'day').toDate();\r\n\r\n if (newVal === false) {\r\n datePickerDate = moment().add(1, 'day').toDate();\r\n }\r\n\r\n $scope.data.startdate = null;\r\n $scope.data.dateOptions.initDate = datePickerDate;\r\n $scope.data.dateOptions.minDate = datePickerDate;\r\n });\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n var data = $scope.data;\r\n\r\n if (data.item.contract) {\r\n var contract = data.item.contract;\r\n\r\n data.chosenRegisterOption = {\r\n id: contract.careType\r\n };\r\n } else {\r\n data.steps.unshift({\r\n key: 'registerOptions',\r\n title: $translate.instant('NEW-CONTRACT.STEP-REGISTER-OPTIONS'),\r\n description: 'pp-screen-contract-registeroptions'\r\n });\r\n }\r\n\r\n $scope.setupStep();\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.changeStartDate = function () {\r\n mergePackages();\r\n };\r\n\r\n $scope.changeTimeslot = function (timeslots, time) {\r\n\r\n var overlapping = time.overlappingTimeslotIds;\r\n var overlapTime;\r\n\r\n if (overlapping && overlapping.length) {\r\n overlapping.forEach(function (overlap) {\r\n\r\n overlapTime = timeslots.find(x => x.timeslotId == overlap);\r\n\r\n if (overlapTime) {\r\n overlapTime.chosen = false;\r\n }\r\n\r\n });\r\n }\r\n\r\n };\r\n\r\n $scope.disableDay = function (date, mode) {\r\n var data = $scope.data;\r\n\r\n var minimal = $scope.getMinimalStartdate();\r\n date.setHours(0, 0, 0, 0);\r\n\r\n if (minimal > date) {\r\n return true;\r\n } else if (mode === 'day' && data.registerConfig.validStartDays.length) {\r\n var possibles = data.registerConfig.validStartDays;\r\n return possibles.indexOf(date.getDate()) < 0;\r\n }\r\n };\r\n\r\n $scope.getMinimalStartdate = function () {\r\n var data = $scope.data;\r\n var start = new Date();\r\n start.setDate(start.getDate() + 1);\r\n start.setHours(0, 0, 0, 0);\r\n\r\n if (data.dateOfBirth && data.dateOfBirth > start) {\r\n start = new Date(data.dateOfBirth);\r\n start.setDate(start.getDate() + 1);\r\n start.setHours(0, 0, 0, 0);\r\n }\r\n\r\n return start;\r\n };\r\n\r\n $scope.open = function (key, $event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n $scope.data[key + 'Opened'] = true;\r\n };\r\n\r\n $scope.previousStep = function (evt) {\r\n evt.target.blur();\r\n\r\n $scope.data.currentStep -= 1;\r\n $scope.setupStep();\r\n };\r\n\r\n $scope.nextStep = function (evt) {\r\n evt.target.blur();\r\n\r\n var data = $scope.data;\r\n\r\n if ($scope.finishStep()) {\r\n\r\n if (data.currentStep == data.steps.length - 1) {\r\n $scope.save();\r\n } else {\r\n data.currentStep += 1;\r\n $scope.setupStep();\r\n\r\n ng.element(evt.currentTarget).closest('.info-overlay-wrapper').scrollTop(0);\r\n }\r\n\r\n }\r\n };\r\n\r\n $scope.setupStep = function () {\r\n var data = $scope.data;\r\n var step = data.steps[data.currentStep];\r\n\r\n switch (step.key) {\r\n case 'registerOptions':\r\n $scope.setupRegisterOptions();\r\n break;\r\n case 'packages':\r\n $scope.setupPackages();\r\n break;\r\n case 'locations':\r\n $scope.setupLocations();\r\n break;\r\n case 'comments':\r\n $scope.setupComments();\r\n break;\r\n }\r\n };\r\n\r\n $scope.finishStep = function () {\r\n var data = $scope.data;\r\n var step = data.steps[data.currentStep];\r\n var result = false;\r\n\r\n switch (step.key) {\r\n case 'registerOptions':\r\n result = $scope.finishRegisterOptions();\r\n break;\r\n case 'packages':\r\n result = $scope.finishPackages();\r\n break;\r\n case 'locations':\r\n result = $scope.finishLocations();\r\n break;\r\n case 'comments':\r\n result = $scope.finishComments();\r\n break;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.setupRegisterOptions = function () {\r\n var data = $scope.data;\r\n var appData = AppService.data;\r\n\r\n data.registerOptions = appData.registerOptions;\r\n data.schools = appData.schools;\r\n };\r\n\r\n $scope.setupPackages = function () {\r\n var data = $scope.data;\r\n\r\n data.packageGroups = null;\r\n data.registerConfig = null;\r\n\r\n addLoading(loadingKeyPackages);\r\n var prm = DataService.getRegisterPackagesAsync(data.chosenRegisterOption.id, data.chosenSchool ? data.chosenSchool.id : null, data.item.contact ? data.item.contract.id : null);\r\n prm.then($scope.handleGetRegisterPackages, $scope.handleGetRegisterPackagesError);\r\n };\r\n\r\n $scope.setupLocations = function () {\r\n\r\n addLoading(loadingKeyLocations);\r\n\r\n var data = $scope.data;\r\n var chosenPackages = data.mergedPackages.filter(x => x.chosen == true).map(function (item) {\r\n return item.id;\r\n });\r\n var schoolId = null;\r\n if (data.chosenSchool) {\r\n schoolId = data.chosenSchool.id;\r\n }\r\n\r\n data.locations = [];\r\n\r\n var prm = DataService.getRegisterLocationsAsync(chosenPackages, schoolId, data.startdate);\r\n prm.then($scope.handleGetRegisterLocations, $scope.handleGetRegisterLocationsError);\r\n\r\n };\r\n\r\n $scope.setupComments = function () {\r\n\r\n var data = $scope.data;\r\n var configQuestions = data.registerConfig.questions;\r\n var chosenPackages = data.chosenPackages;\r\n var i, chosenPackage, question;\r\n var questions = [];\r\n\r\n for (i = 0; i < configQuestions.length; i++) {\r\n\r\n question = configQuestions[i];\r\n\r\n if (!question.packageId) {\r\n questions.push(question);\r\n } else {\r\n\r\n chosenPackage = chosenPackages[question.packageId];\r\n\r\n if (chosenPackage && chosenPackage['chosen']) {\r\n questions.push(question);\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n data.configQuestions = questions;\r\n };\r\n\r\n $scope.finishRegisterOptions = function () {\r\n\r\n var data = $scope.data;\r\n data.chosenRegisterOptionValid = true;\r\n data.chosenSchoolValid = true;\r\n\r\n if (!data.chosenRegisterOption) {\r\n data.chosenRegisterOptionValid = false;\r\n } else if (data.chosenRegisterOption.id == ft.app.care.types.outOfSchool && data.schools.length && !data.chosenSchool) {\r\n data.chosenSchoolValid = false;\r\n }\r\n\r\n if (!data.chosenRegisterOptionValid || !data.chosenSchoolValid) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n };\r\n\r\n $scope.finishPackages = function () {\r\n\r\n var data = $scope.data;\r\n data.startdateValid = true;\r\n data.chosenPackagesValid = true;\r\n\r\n // startdate must be after today, after date of birth (if given) and on a valid start day (if given)\r\n var startdate = data.startdate;\r\n var minimal = $scope.getMinimalStartdate();\r\n var today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n // validate startdate\r\n if (startdate < minimal || startdate < today) {\r\n data.startdateValid = false;\r\n } else if (data.registerConfig.validStartDays.length && data.registerConfig.validStartDays.indexOf(startdate.getDate()) < 0) {\r\n data.startdateValid = false;\r\n }\r\n\r\n if (data.dateOfBirth && data.dateOfBirth > data.startdate) {\r\n data.startdateValid = false;\r\n }\r\n\r\n // validate packages\r\n var i = 0;\r\n var chosen = false;\r\n var chosenPackages, chosenTimeslots;\r\n\r\n chosenPackages = data.mergedPackages.filter(function (pack) {\r\n if (pack.chosen) {\r\n return pack;\r\n }\r\n });\r\n\r\n if (chosenPackages && chosenPackages.length) {\r\n\r\n while (i < chosenPackages.length && !chosen) {\r\n\r\n chosenTimeslots = chosenPackages[i].timeslots.filter(function (time) {\r\n if (time.chosen) {\r\n return time;\r\n }\r\n });\r\n\r\n if (chosenTimeslots && chosenTimeslots.length) {\r\n chosen = true;\r\n }\r\n\r\n i += 1;\r\n }\r\n\r\n }\r\n\r\n if (!chosen) {\r\n data.chosenPackagesValid = false;\r\n }\r\n\r\n if (!data.startdateValid || !data.chosenPackagesValid) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n $scope.finishLocations = function () {\r\n var data = $scope.data;\r\n data.chosenLocationsValid = true;\r\n\r\n var i = 0;\r\n var chosen = false;\r\n var chosenLocationId;\r\n\r\n while (i < data.chosenLocations.length && !chosen) {\r\n\r\n chosenLocationId = data.chosenLocations[i]['id'];\r\n\r\n if (chosenLocationId && data.locations.find(x => x.id == chosenLocationId)) {\r\n chosen = true;\r\n }\r\n\r\n i += 1;\r\n }\r\n\r\n if (!chosen) {\r\n data.chosenLocationsValid = false;\r\n }\r\n\r\n if (!data.chosenLocationsValid) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n $scope.finishComments = function () {\r\n\r\n var valid = true;\r\n var data = $scope.data;\r\n\r\n if (data.item.contract) {\r\n data.questionsValid = valid;\r\n return valid; // only questions when new contract\r\n }\r\n\r\n var configQuestions = data.configQuestions;\r\n var questions = data.questions || {};\r\n var i, chosenPackage, configQuestion, question;\r\n\r\n for (i = 0; i < configQuestions.length; i++) {\r\n\r\n configQuestion = configQuestions[i];\r\n question = questions[configQuestion.questionId];\r\n\r\n if (configQuestion.isRequired && !question) {\r\n valid = false;\r\n }\r\n\r\n }\r\n\r\n data.questionsValid = valid;\r\n return valid;\r\n\r\n };\r\n\r\n $scope.handleGetRegisterPackages = function (results) {\r\n var data = $scope.data;\r\n\r\n data.registerConfig = results;\r\n\r\n mergePackages();\r\n removeLoading(loadingKeyPackages);\r\n };\r\n\r\n $scope.handleGetRegisterPackagesError = function (response) {\r\n };\r\n\r\n $scope.handleGetRegisterLocations = function (results) {\r\n\r\n var data = $scope.data;\r\n data.locations = results || [];\r\n\r\n if (!data.locations.length) {\r\n data.errorMessage = $translate.instant('NEW-CONTRACT.NO-LOCATIONS-AVAILABLE');\r\n return;\r\n }\r\n\r\n if (data.maxLocations > data.locations.length) {\r\n data.maxLocations = data.locations.length;\r\n }\r\n\r\n removeLoading(loadingKeyLocations);\r\n\r\n };\r\n\r\n $scope.handleGetRegisterLocationsError = function (response) {\r\n };\r\n\r\n\r\n $scope.getFilteredLocations = function (idx) {\r\n var data = $scope.data;\r\n\r\n var selected = data.chosenLocations.filter(function (itm) {\r\n return (itm.id);\r\n });\r\n\r\n if (selected.length == data.locations.length) {\r\n return data.locations;\r\n }\r\n\r\n if (data.chosenLocations[idx].id) {\r\n return data.locations;\r\n }\r\n\r\n var mapped = data.chosenLocations.map(function (itm) {\r\n return itm.id;\r\n });\r\n\r\n var selectedLocations = mapped.toString();\r\n var locs = data.locations.filter(function (loc) {\r\n return selectedLocations.indexOf(loc.id) < 0;\r\n });\r\n\r\n return locs;\r\n\r\n };\r\n\r\n $scope.initChosenSchool = function () {\r\n var data = $scope.data;\r\n\r\n if (!data.chosenSchool && data.appData.schools.length) {\r\n var school = null;\r\n\r\n if (data.appData.children && data.appData.currentChild) {\r\n var child = data.appData.children.find(x => x.id == data.appData.currentChild);\r\n school = data.appData.schools.filter(x => child != null && child.school != null && x.id == child.school.id);\r\n }\r\n \r\n if (school != null) {\r\n data.chosenSchool = school[0];\r\n }\r\n else {\r\n data.chosenSchool = data.appData.schools[0];\r\n }\r\n }\r\n };\r\n\r\n $scope.distinctChosenLocations = function (idx) {\r\n var data = $scope.data;\r\n var chosen = data.chosenLocations[idx].id;\r\n var i;\r\n\r\n for (i = data.chosenLocations.length - 1; i >= 0; i--) {\r\n\r\n if (i != idx && data.chosenLocations[i].id && data.chosenLocations[i].id == chosen) {\r\n data.chosenLocations[i].id = null;\r\n }\r\n\r\n }\r\n };\r\n\r\n $scope.showFrequencyColumn = function (pack) {\r\n var data = $scope.data;\r\n var result = false;\r\n var i, time, id;\r\n var chosen = data.chosenPackages[pack.id];\r\n\r\n for (i = 0; i < pack.timeslots.length; i++) {\r\n time = pack.timeslots[i];\r\n id = time.timeslotId;\r\n\r\n if (chosen && chosen[id] && chosen[id]['chosen']) {\r\n result = true;\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.save = function () {\r\n\r\n var data = $scope.data;\r\n var obj = {\r\n 'registrationId': data.registerConfig.registrationId,\r\n 'selectedPackages': $scope.getPackagesForSave(),\r\n 'preferredLocations': $scope.getLocationsForSave(),\r\n 'child': {\r\n 'id': data.item.child\r\n },\r\n 'contacts': $scope.getContactsForSave(),\r\n 'start': moment(data.startdate).format(ft.app.datetime.formats.toAPIDate),\r\n 'remarks': data.comments,\r\n 'careType': data.chosenRegisterOption.id,\r\n 'reduceDays': data.reduceDays\r\n };\r\n\r\n data.saving = true;\r\n var prm;\r\n\r\n if (!data.item.contract) {\r\n obj.answers = $scope.getAnswersForSave();\r\n\r\n obj.school = data.chosenRegisterOption.id == data.careConfig.types.outOfSchool && data.chosenSchool ? {\r\n 'id': data.chosenSchool.id,\r\n 'class': {\r\n 'id': data.chosenClass ? data.chosenClass : null\r\n }\r\n } : null;\r\n\r\n prm = DataService.newContractAsync(obj);\r\n } else {\r\n obj.contractId = data.item.contract.id;\r\n\r\n prm = DataService.editContractAsync(obj);\r\n }\r\n\r\n if (prm) {\r\n prm.then($scope.handleSave, $scope.handleSaveError);\r\n prm.finally(function () {\r\n data.saving = false;\r\n });\r\n }\r\n\r\n };\r\n\r\n $scope.handleSave = function (results) {\r\n var data = $scope.data;\r\n data.saveEnabled = false;\r\n data.attempts = 0;\r\n\r\n $rootScope.checkForFormChange = false; // disable form check before navigation\r\n close({success: true});\r\n };\r\n\r\n $scope.handleSaveError = function (response) {\r\n var data = $scope.data;\r\n data.attempts += 1;\r\n\r\n if (data.attempts > 3) {\r\n data.errorMessage = $translate.instant('NEW-CONTRACT.ERROR-CONTINUES');\r\n } else {\r\n data.errorMessage = $translate.instant('NEW-CONTRACT.ERROR-SAVE-CONTRACT');\r\n }\r\n\r\n if (response && !response.result && response.isReadable) {\r\n data.errorMessage += ' ' + response.message;\r\n }\r\n };\r\n\r\n $scope.getLocationsForSave = function () {\r\n var data = $scope.data;\r\n var result = [];\r\n var i = 0;\r\n\r\n data.chosenLocations.sort(function (a, b) {\r\n return a['preference'] > b['preference'];\r\n });\r\n\r\n for (i = 0; i < data.chosenLocations.length; i++) {\r\n\r\n if (data.chosenLocations[i]['id']) {\r\n result.push({id: data.chosenLocations[i]['id']});\r\n }\r\n\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.getPackagesForSave = function () {\r\n\r\n var data = $scope.data;\r\n var result = [];\r\n\r\n var i = 0;\r\n var resultPackage, chosenPackage;\r\n\r\n var chosenPackages = data.mergedPackages.filter(function (pack) {\r\n if (pack.chosen) {\r\n return pack;\r\n }\r\n });\r\n\r\n if (chosenPackages && chosenPackages.length) {\r\n\r\n chosenPackages.forEach(function (chosenPackage) {\r\n\r\n resultPackage = ng.copy(chosenPackage);\r\n resultPackage.holidayBalance = resultPackage.chosenHolidayBalance;\r\n resultPackage.timeslots = resultPackage.timeslots.filter(function (time) {\r\n if (time.chosen) {\r\n return time;\r\n }\r\n });\r\n\r\n result.push(resultPackage);\r\n\r\n });\r\n\r\n }\r\n\r\n /*\r\n\r\n for (i = 0; i < registerPackages.length; i++) {\r\n registerPackage = registerPackages[i];\r\n\r\n var chosenPackage = chosenPackages[registerPackage.id];\r\n\r\n if (chosenPackage && chosenPackage['chosen']) {\r\n\r\n obj = null;\r\n\r\n for (t = 0; t < registerPackage.timeslots.length; t++) {\r\n time = chosenPackage[registerPackage.timeslots[t].timeslotId];\r\n\r\n if (time && time['chosen']) {\r\n\r\n if (!obj) {\r\n obj = {\r\n id: registerPackage.id,\r\n timeslots: []\r\n }\r\n\r\n if (chosenPackage['holidayBalance'])\r\n obj.holidayBalance = chosenPackage['holidayBalance'];\r\n\r\n if (data.item.contract)\r\n obj.planningId = chosenPackage.planningId;\r\n\r\n result.push(obj);\r\n }\r\n\r\n obj.timeslots.push({\r\n timeslotId: registerPackage.timeslots[t].timeslotId,\r\n frequency: time['frequency'],\r\n extendedHours: time['expanded'] ? true : false\r\n });\r\n\r\n }\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n // */\r\n\r\n return result;\r\n\r\n };\r\n\r\n $scope.getContactsForSave = function () {\r\n var data = $scope.data;\r\n var members = data.appData.members;\r\n var i = 0;\r\n var result = [];\r\n\r\n for (i = 0; i < members.length; i++) {\r\n result.push({\r\n id: members[i].id,\r\n roles: members[i].roles\r\n });\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.getAnswersForSave = function () {\r\n var data = $scope.data;\r\n var i = 0;\r\n var result = [];\r\n\r\n var registerQuestions = data.registerConfig.questions;\r\n var questions = data.questions || [];\r\n var registerQuestion, question;\r\n\r\n if (questions.length == 0) {\r\n return result;\r\n }\r\n\r\n for (i = 0; i < registerQuestions.length; i++) {\r\n registerQuestion = registerQuestions[i];\r\n question = questions[registerQuestion.questionId];\r\n\r\n if (question) {\r\n result.push({\r\n questionId: registerQuestion.questionId,\r\n answer: question\r\n });\r\n }\r\n\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.cancel = function () {\r\n close();\r\n };\r\n\r\n $scope.close = function () {\r\n close({\r\n success: !$scope.data.saveEnabled\r\n });\r\n };\r\n\r\n var mergePackages = function () {\r\n\r\n var regPack;\r\n var data = $scope.data;\r\n var contract = data.item.contract;\r\n\r\n data.mergedPackages = [];\r\n\r\n // setup packages according to what is real\r\n\r\n data.registerConfig.packages.forEach(function (regPackage) {\r\n regPack = ng.copy(regPackage);\r\n\r\n if (data.appData.useHolidayBalance && regPack.holidayBalance && regPack.holidayBalance.length) {\r\n regPack.chosenHolidayBalance = regPack.holidayBalance[0].id;\r\n }\r\n\r\n data.mergedPackages.push(regPack);\r\n });\r\n\r\n // set chosen to false on all other packages (if the user has chosen to go back to step 1)\r\n // not necessary if mergedPackages is always build up\r\n //var ids = data.registerConfig.packages.map(function (item) { return item.id; });\r\n //var key;\r\n //for (key in data.chosenPackages) {\r\n\r\n //\t// package is from other register option\r\n //\tif (ids.indexOf(key) < 0)\r\n //\t\tdata.chosenPackages[key].chosen = false;\r\n\r\n //}\r\n\r\n // setup packages according what is chosen in relation to real\r\n\r\n if (!contract) {\r\n return;\r\n }\r\n\r\n var pack, times, notChosenTimes, slot, idx;\r\n var date, planningStart, planningEnd;\r\n date = new Date(moment(data.startdate).format(ft.app.datetime.formats.toAPIDate));\r\n\r\n contract.plannings.forEach(function (planning) {\r\n\r\n planningStart = new Date(planning.start);\r\n planningEnd = new Date(planning.end);\r\n\r\n if (planningStart <= date && date <= planningEnd) {\r\n\r\n // get current merged package\r\n pack = data.mergedPackages.find(x => x.id == planning.package.id);\r\n\r\n if (!pack && planning.package.label) {\r\n var holidayPack = data.mergedPackages.find(x => x.label && x.label.id === planning.package.label.id);\r\n if (holidayPack) {\r\n return;\r\n }\r\n }\r\n if (!pack) {\r\n\r\n pack = ng.copy(planning.package);\r\n data.mergedPackages.push(pack);\r\n\r\n }\r\n\r\n pack.currentHolidayBalance = data.appData.useHolidayBalance && planning.careType.id == data.careConfig.types.holiday && planning.holidayBalance >= 0 ? planning.holidayBalance : null;\r\n pack.chosenHolidayBalance = ng.copy(pack.currentHolidayBalance);\r\n pack.chosen = true;\r\n\r\n planning.timeslots.forEach(function (timeslot) {\r\n\r\n slot = ng.copy(timeslot);\r\n\r\n slot.chosen = true;\r\n slot.planningId = planning.id;\r\n\r\n times = pack.timeslots.filter(function (t) {\r\n if (t.timeslotId == timeslot.timeslotId) {\r\n return t;\r\n }\r\n });\r\n\r\n if (times && times.length) {\r\n slot = ng.extend(slot, times[0]);\r\n notChosenTimes = times.filter(function (t) {\r\n if (!t.chosen) {\r\n return t;\r\n }\r\n });\r\n\r\n if (notChosenTimes && notChosenTimes.length) {\r\n idx = pack.timeslots.indexOf(notChosenTimes[0]);\r\n pack.timeslots[idx] = slot;\r\n } else {\r\n idx = pack.timeslots.indexOf(times[0]);\r\n pack.timeslots.splice(idx, 0, slot);\r\n }\r\n } else {\r\n pack.timeslots.push(slot);\r\n }\r\n\r\n });\r\n\r\n }\r\n\r\n });\r\n\r\n data.mergedPackages.sort(function (a, b) {\r\n return a.name.toLowerCase() > b.name.toLowerCase();\r\n });\r\n\r\n //var i = 0, t = 0;\r\n //var planning, pack, time, timeslot;\r\n\r\n //for (i = 0; i < contract.plannings.length; i++) {\r\n // planning = contract.plannings[i];\r\n\r\n // pack = data.chosenPackages[planning.package.id] = {};\r\n // pack.chosen = true;\r\n // pack.planningId = planning.id;\r\n\r\n // for (t = 0; t < planning.timeslots.length; t++) {\r\n // time = planning.timeslots[t];\r\n\r\n // timeslot = pack[time.timeslotId] = {};\r\n // timeslot.chosen = true;\r\n // ng.extend(timeslot, time);\r\n // }\r\n //}\r\n\r\n data.item.contract.plannings.forEach(function (planning) {\r\n var item = data.mergedPackages.find(x => x.id == planning.package.id);\r\n if (!item) {\r\n return true;\r\n }\r\n\r\n item.chosen = true;\r\n planning.timeslots.forEach(function (timeslot) {\r\n var otherItem = item.timeslots.find(x => x.timeslotId == timeslot.timeslotId);\r\n if (otherItem) {\r\n otherItem.chosen = true;\r\n }\r\n });\r\n });\r\n\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n","ft.app.controller('contractEndModalController',\r\n ['$scope', '$element', 'close', 'item', '$timeout', '$translate', 'DataService', 'AppService',\r\n function ($scope, $element, close, item, $timeout, $translate, DataService, AppService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.data = {\r\n item: item,\r\n end: false,\r\n endValid: true,\r\n date: moment(item.contract.cancelDate).format(ft.app.datetime.formats.toAPIDate),\r\n now: new Date(),\r\n format: 'dd-MM-yyyy',\r\n dateOpened: false,\r\n dateValid: true,\r\n dateOptions: {\r\n initDate: moment(item.contract.cancelDate).toDate(),\r\n minDate: moment(item.contract.cancelDate).toDate(),\r\n formatYear: 'yy'\r\n },\r\n comments: '',\r\n saving: false,\r\n saveEnabled: true,\r\n attempts: 0,\r\n successMessage: '',\r\n errorMessage: ''\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n var data = $scope.data;\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.save = function () {\r\n var data = $scope.data;\r\n data.successMessage = '';\r\n data.errorMessage = '';\r\n\r\n if (data.end == false) {\r\n data.endValid = false;\r\n }\r\n\r\n if (!data.date) {\r\n data.dateValid = false;\r\n } else {\r\n var date = moment(data.date).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n if (!moment(date).isValid()) {\r\n data.dateValid = false;\r\n } else {\r\n date = new Date(date);\r\n date.setHours(0, 0, 0, 0);\r\n\r\n var cancelDate = new Date(data.item.contract.cancelDate);\r\n cancelDate.setHours(0, 0, 0, 0);\r\n\r\n if (date < cancelDate) {\r\n data.dateValid = false;\r\n }\r\n }\r\n }\r\n\r\n if (!data.endValid || !data.dateValid) {\r\n return;\r\n }\r\n\r\n data.saving = true;\r\n\r\n var prm = DataService.endContractAsync(item.child, item.contract.id, data.comments, data.date);\r\n prm.then($scope.handleSave, $scope.handleSaveError);\r\n prm.finally(function () {\r\n data.saving = false;\r\n });\r\n };\r\n\r\n $scope.handleSave = function (results) {\r\n $scope.data.saveEnabled = false;\r\n $scope.data.attempts = 0;\r\n $scope.data.successMessage = $translate.instant('CONTRACTS-END.END-SAVED');\r\n };\r\n\r\n $scope.handleSaveError = function (response) {\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorMessage = $translate.instant('CONTRACTS-END.ERROR-CONTINUES');\r\n } else {\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('CONTRACTS-END.ERROR-SAVE-END');\r\n }\r\n };\r\n\r\n $scope.open = function ($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n $scope.data.dateOpened = true;\r\n };\r\n\r\n $scope.cancel = function () {\r\n close();\r\n };\r\n\r\n $scope.close = function () {\r\n close({\r\n success: !$scope.data.saveEnabled\r\n });\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n","ft.app.controller('contractModalController',\r\n ['$scope', '$element', 'close', 'item', '$timeout', 'LoginService', 'ModalService', 'AppService',\r\n function ($scope, $element, close, item, $timeout, LoginService, ModalService, AppService) {\r\n\r\n var initialized = false;\r\n var hasSuccess = false;\r\n\r\n $scope.data = {\r\n errorMessage: '',\r\n item: item,\r\n hasActions: false,\r\n states: ft.app.contract.states,\r\n isApprovedContractEditable: AppService.data.settings.isApprovedContractEditable\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n $scope.determineHasActions();\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.isInFuture = function (date) {\r\n\r\n var objDate = new Date(date).setHours(0, 0, 0, 0);\r\n var objNow = new Date().setHours(0, 0, 0, 0);\r\n\r\n return objDate > objNow;\r\n\r\n };\r\n\r\n $scope.determineHasActions = function () {\r\n\r\n var actions = ['activate', 'edit', 'cancel', 'reject', 'end'];\r\n $scope.data.hasActions = false;\r\n\r\n var possible = actions.filter(function (action) {\r\n return $scope.mayShowActionButton(action, true);\r\n });\r\n\r\n $scope.data.hasActions = possible && possible.length > 0;\r\n };\r\n\r\n $scope.mayShowActionButton = function (key, bypass) {\r\n\r\n var result = false;\r\n var config = ft.app.contract;\r\n var contract = item.contract;\r\n\r\n if (!$scope.data.hasActions && !bypass) {\r\n return false;\r\n }\r\n\r\n // if contract is ended or is a received one, freeze\r\n if (contract.status.type == config.states.ended || contract.status.type == config.states.received) {\r\n return false;\r\n }\r\n\r\n switch (key) {\r\n case 'activate':\r\n result = contract.status.type == config.states.offered || contract.status.type == config.states.sign;\r\n break;\r\n case 'edit':\r\n result = (contract.status.type == config.states.approved && $scope.isInFuture(contract.start)) || contract.status.type == config.states.active;\r\n break;\r\n case 'end':\r\n result = (contract.status.type == config.states.approved && $scope.isInFuture(contract.start)) || contract.status.type == config.states.active;\r\n break;\r\n case 'cancel':\r\n result = contract.status.type == config.states.offered;\r\n break;\r\n case 'reject':\r\n result = contract.status.type == config.states.offered;\r\n break;\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n $scope.handleActionButton = function (evt, key) {\r\n\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n\r\n switch (key) {\r\n case 'activate':\r\n $scope.openActivate(evt);\r\n break;\r\n case 'edit':\r\n $scope.openEdit(evt);\r\n break;\r\n case 'end':\r\n $scope.openEnd(evt);\r\n break;\r\n case 'cancel':\r\n $scope.openCancel(evt);\r\n break;\r\n case 'reject':\r\n $scope.openReject(evt);\r\n break;\r\n }\r\n };\r\n\r\n $scope.openActivate = function (evt) {\r\n\r\n var data = $scope.data;\r\n hasSuccess = false;\r\n\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n templateUrl: 'contracts/activate-modal',\r\n controller: 'contractActivateModalController',\r\n inputs: {\r\n item: {\r\n child: item.child,\r\n contract: item.contract\r\n }\r\n }\r\n }).then(function (modal) {\r\n\r\n modal.close.then(function (result) {\r\n close({success: true});\r\n }, function () {\r\n });\r\n\r\n });\r\n\r\n };\r\n\r\n $scope.openEdit = function (evt) {\r\n var data = $scope.data;\r\n hasSuccess = false;\r\n\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n templateUrl: 'contracts/edit-new-modal',\r\n controller: 'contractEditModalController',\r\n inputs: {\r\n item: {\r\n child: item.child,\r\n contract: item.contract\r\n }\r\n }\r\n }).then(function (modal) {\r\n\r\n modal.close.then(function (result) {\r\n close({success: true});\r\n }, function () {\r\n });\r\n\r\n });\r\n };\r\n\r\n $scope.openEnd = function (evt) {\r\n\r\n var data = $scope.data;\r\n hasSuccess = false;\r\n\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n templateUrl: 'contracts/end-modal',\r\n controller: 'contractEndModalController',\r\n inputs: {\r\n item: {\r\n child: item.child,\r\n contract: item.contract\r\n }\r\n }\r\n }).then(function (modal) {\r\n\r\n modal.close.then(function (result) {\r\n close({success: true});\r\n }, function () {\r\n });\r\n\r\n });\r\n\r\n };\r\n\r\n $scope.openCancel = function (evt) {\r\n\r\n var data = $scope.data;\r\n hasSuccess = false;\r\n\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n templateUrl: 'contracts/cancel-modal',\r\n controller: 'contractCancelModalController',\r\n inputs: {\r\n item: {\r\n child: item.child,\r\n contract: item.contract\r\n }\r\n }\r\n }).then(function (modal) {\r\n\r\n modal.close.then(function (result) {\r\n close({success: true});\r\n }, function () {\r\n });\r\n\r\n });\r\n\r\n };\r\n\r\n $scope.openReject = function (evt) {\r\n\r\n var data = $scope.data;\r\n hasSuccess = false;\r\n\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n templateUrl: 'contracts/reject-modal',\r\n controller: 'contractRejectModalController',\r\n inputs: {\r\n item: {\r\n child: item.child,\r\n contract: item.contract\r\n }\r\n }\r\n }).then(function (modal) {\r\n\r\n modal.close.then(function (result) {\r\n close({success: true});\r\n }, function () {\r\n });\r\n\r\n });\r\n\r\n };\r\n\r\n $scope.getDownloadLink = function () {\r\n getDownloadLink();\r\n };\r\n\r\n $scope.getDownloadCurrentLink = function () {\r\n getDownloadCurrentLink();\r\n };\r\n\r\n $scope.resetDownloadLink = function (item) {\r\n var item = $scope.data.item;\r\n item.contract.loading = false;\r\n item.contract.downloadUrl = null;\r\n };\r\n\r\n $scope.resetDownloadCurrentLink = function (item) {\r\n var item = $scope.data.item;\r\n item.contract.loading = false;\r\n item.contract.downloadCurrentUrl = null;\r\n };\r\n\r\n $scope.getDownloadCostLink = function () {\r\n getDownloadCostLink();\r\n };\r\n\r\n $scope.resetDownloadCostLink = function (item) {\r\n var item = $scope.data.item;\r\n item.contract.loading = false;\r\n item.contract.downloadCostUrl = null;\r\n };\r\n\r\n var getDownloadLink = function () {\r\n var item = $scope.data.item.contract;\r\n item.loading = true;\r\n\r\n var prm = LoginService.refreshLoginAsync();\r\n prm.then(handleGetDownloadLink, handleGetDownloadLinkError);\r\n prm.finally(function () {\r\n item.loading = false;\r\n });\r\n };\r\n\r\n var getDownloadCurrentLink = function () {\r\n var item = $scope.data.item.contract;\r\n item.loading = true;\r\n\r\n var prm = LoginService.refreshLoginAsync();\r\n prm.then(handleGetDownloadCurrentLink, handleGetDownloadLinkError);\r\n prm.finally(function () {\r\n item.loading = false;\r\n });\r\n };\r\n\r\n var getDownloadCostLink = function () {\r\n var item = $scope.data.item.contract;\r\n item.loading = true;\r\n\r\n var prm = LoginService.refreshLoginAsync();\r\n prm.then(handleGetDownloadCostLink, handleGetDownloadLinkError);\r\n prm.finally(function () {\r\n item.loading = false;\r\n });\r\n };\r\n\r\n var handleGetDownloadLink = function (results) {\r\n var item = $scope.data.item.contract;\r\n var tokenData = LoginService.getTokenData();\r\n item.downloadUrl = prepareItemUrl(item.url) + 'accessToken=' + encodeURIComponent(tokenData.token.value);\r\n };\r\n\r\n var handleGetDownloadCurrentLink = function (results) {\r\n var item = $scope.data.item.contract;\r\n var tokenData = LoginService.getTokenData();\r\n item.downloadCurrentUrl = prepareItemUrl(item.url) + 'forceGeneration=true&accessToken=' + encodeURIComponent(tokenData.token.value);\r\n };\r\n\r\n var handleGetDownloadCostLink = function (results) {\r\n var item = $scope.data.item.contract;\r\n var tokenData = LoginService.getTokenData();\r\n item.downloadCostUrl = prepareItemUrl(item.costOverviewUrl) + 'accessToken=' + encodeURIComponent(tokenData.token.value);\r\n };\r\n\r\n var handleGetDownloadLinkError = function (response) {\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('DOCUMENTS.ERROR-GET-DOCUMENT-LINK');\r\n };\r\n\r\n var prepareItemUrl = function (url) {\r\n return url + (url.indexOf('?') >= 0 ? '&' : '?');\r\n };\r\n\r\n $scope.close = function () {\r\n close({\r\n success: hasSuccess\r\n });\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n","ft.app.controller('contractRejectModalController',\r\n ['$scope', '$element', 'close', 'item', '$timeout', '$translate', 'DataService', 'AppService',\r\n function ($scope, $element, close, item, $timeout, $translate, DataService, AppService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.data = {\r\n item: item,\r\n reject: false,\r\n comments: '',\r\n saving: false,\r\n saveEnabled: true,\r\n attempts: 0,\r\n successMessage: '',\r\n errorMessage: ''\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n var data = $scope.data;\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.save = function () {\r\n var data = $scope.data;\r\n data.successMessage = '';\r\n data.errorMessage = '';\r\n\r\n if (!data.reject) {\r\n return;\r\n }\r\n\r\n data.saving = true;\r\n var prm = DataService.rejectContractAsync(item.child, item.contract.id, data.comments);\r\n prm.then($scope.handleSave, $scope.handleSaveError);\r\n prm.finally(function () {\r\n data.saving = false;\r\n });\r\n };\r\n\r\n $scope.handleSave = function (results) {\r\n $scope.data.saveEnabled = false;\r\n $scope.data.attempts = 0;\r\n $scope.data.successMessage = $translate.instant('CONTRACTS-REJECT.REJECTION-SAVED');\r\n };\r\n\r\n $scope.handleSaveError = function (response) {\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorMessage = $translate.instant('CONTRACTS-REJECT.ERROR-CONTINUES');\r\n } else {\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('CONTRACTS-REJECT.ERROR-SAVE-REJECTION');\r\n }\r\n };\r\n\r\n $scope.cancel = function () {\r\n close();\r\n };\r\n\r\n $scope.close = function () {\r\n close({\r\n success: !$scope.data.saveEnabled\r\n });\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n\r\n","ft.app.controller('userProfileController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', 'DataService', 'AppService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, DataService, AppService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.appData = AppService.data;\r\n $scope.data = {\r\n user: null\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n $scope.initializeData();\r\n $rootScope.$on(ft.app.events.family.get, $scope.initializeData);\r\n };\r\n\r\n $scope.initializeData = function () {\r\n $scope.data.user = AppService.getUser($stateParams.user);\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n\r\n\r\nft.app.controller('userInfoController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', 'DataService', 'AppService', 'ModalService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, DataService, AppService, ModalService) {\r\n\r\n var initialized = false;\r\n $rootScope.checkForFormChange = true;\r\n\r\n $scope.appData = AppService.data;\r\n\r\n if (!$scope.data) {\r\n $scope.data = {};\r\n }\r\n\r\n $scope.data.success = $stateParams.success;\r\n $scope.data.contactInformation = ft.app.contactInformation;\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.openPasswordChange = function (evt) {\r\n ModalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n templateUrl: 'user/passwordchange',\r\n controller: 'passwordChangeController'\r\n }).then(function (modal) {\r\n });\r\n };\r\n\r\n $scope.switchLanguage = function (lang) {\r\n AppService.switchLanguage(lang);\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n\r\nft.app.controller('passwordChangeController',\r\n ['$scope', '$element', 'close', '$timeout', '$translate', 'DataService', 'CheckStateChangeService',\r\n function ($scope, $element, close, $timeout, $translate, DataService, CheckStateChangeService) {\r\n\r\n var initialized = false;\r\n\r\n CheckStateChangeService.checkFormOnStateChange($scope, 'passwordForm');\r\n\r\n $scope.data = {\r\n isLoading: false,\r\n currentPassword: '',\r\n newPassword: '',\r\n verifyPassword: '',\r\n currentPasswordValid: true,\r\n newPasswordValid: true,\r\n verifyPasswordValid: true,\r\n\r\n errorText: '',\r\n successText: '',\r\n attempts: 0\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.save = function (evt) {\r\n\r\n evt.target.blur();\r\n\r\n var data = $scope.data;\r\n data.errorText = '';\r\n data.currentPasswordValid = true;\r\n data.newPasswordValid = true;\r\n data.verifyPasswordValid = true;\r\n\r\n var cp = data.currentPassword.toString().trim();\r\n var np = data.newPassword.toString().trim();\r\n var vp = data.verifyPassword.toString().trim();\r\n\r\n data.currentPasswordValid = cp;\r\n data.newPasswordValid = np;\r\n data.verifyPasswordValid = vp;\r\n\r\n if (np != vp) {\r\n data.errorText = $translate.instant('CHANGE-PASSWORD.ERROR-NEW-VERIFY-DIFFERENT');\r\n return;\r\n }\r\n\r\n if (!data.currentPasswordValid || !data.newPasswordValid || !data.verifyPasswordValid) {\r\n return;\r\n }\r\n\r\n data.isLoading = true;\r\n var prm = DataService.changePasswordAsync(data.currentPassword, data.newPassword);\r\n prm.then($scope.handleChangePassword, $scope.handleChangePasswordError);\r\n prm.finally(function () {\r\n $scope.data.isLoading = false;\r\n });\r\n\r\n };\r\n\r\n $scope.handleChangePassword = function (results) {\r\n $scope.data.successText = $translate.instant('CHANGE-PASSWORD.SAVED');\r\n };\r\n\r\n $scope.handleChangePasswordError = function (response) {\r\n\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorText = $translate.instant('CHANGE-PASSWORD.ERROR-CONTINUES');\r\n } else {\r\n $scope.data.errorText = $translate.instant('CHANGE-PASSWORD.ERROR-SAVE-PASSWORD');\r\n }\r\n\r\n $scope.data.errorText += response && !response.result && response.isReadable ? ' ' + response.message : '';\r\n\r\n };\r\n\r\n $scope.close = function () {\r\n close({});\r\n };\r\n\r\n $scope.cancel = function () {\r\n close();\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n","ft.app.controller('waitinglistModalController',\r\n ['$scope', '$element', 'close', 'childId', 'items', '$timeout', '$translate', 'DataService', 'AppService',\r\n function ($scope, $element, close, childId, items, $timeout, $translate, DataService, AppService) {\r\n\r\n var initialized = false;\r\n\r\n var waitinglistActions = {\r\n none: 'none',\r\n approved: 'approved',\r\n rejected: 'rejected'\r\n };\r\n\r\n $scope.data = {\r\n items: items,\r\n waitinglistActions: [],\r\n saving: false,\r\n saveEnabled: true,\r\n attempts: 0,\r\n successMessage: '',\r\n errorMessage: ''\r\n };\r\n\r\n\r\n $scope.save = function () {\r\n\r\n var data = $scope.data;\r\n data.successMessage = '';\r\n data.errorMessage = '';\r\n\r\n var approved = data.items.filter(x => x.action == waitinglistActions.approved).map(function (item) {\r\n return item.waitingListItemId;\r\n });\r\n var rejected = data.items.filter(x => x.action == waitinglistActions.rejected).map(function (item) {\r\n return item.waitingListItemId;\r\n });\r\n\r\n if (!approved.length && !rejected.length) {\r\n return;\r\n }\r\n\r\n data.saving = true;\r\n var prm = DataService.submitWaitinglistItemsAsync(childId, approved, rejected);\r\n prm.then($scope.handleSave, $scope.handleSaveError);\r\n prm.finally(function () {\r\n data.saving = false;\r\n });\r\n\r\n };\r\n\r\n $scope.handleSave = function (results) {\r\n $scope.data.saveEnabled = false;\r\n $scope.data.attempts = 0;\r\n $scope.data.successMessage = $translate.instant('REQUESTS.WAITINGLIST-ITEMS-SAVED');\r\n };\r\n\r\n $scope.handleSaveError = function (response) {\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorMessage = $translate.instant('REQUESTS.ERROR-CONTINUES');\r\n } else {\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('REQUESTS.ERROR-SAVE-WAITINGLIST-ITEMS');\r\n }\r\n };\r\n\r\n $scope.cancel = function () {\r\n close();\r\n };\r\n\r\n $scope.close = function () {\r\n close({\r\n success: !$scope.data.saveEnabled\r\n });\r\n };\r\n\r\n var getData = function () {\r\n\r\n var data = $scope.data;\r\n\r\n data.items.forEach(function (item) {\r\n item.action = data.waitinglistActions[0].id;\r\n });\r\n\r\n };\r\n\r\n var initialize = function () {\r\n\r\n var data = $scope.data;\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initializeWaitinglistActions();\r\n getData();\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n var initializeWaitinglistActions = function () {\r\n\r\n var actions = $scope.data.waitinglistActions;\r\n actions.push({id: waitinglistActions.none, name: 'REQUESTS.WAITINIGLIST-ACTIONS-NONE'});\r\n actions.push({id: waitinglistActions.approved, name: 'REQUESTS.WAITINIGLIST-ACTIONS-APPROVED'});\r\n actions.push({id: waitinglistActions.rejected, name: 'REQUESTS.WAITINIGLIST-ACTIONS-REJECTED'});\r\n\r\n };\r\n\r\n $timeout(initialize);\r\n\r\n }\r\n ]);\r\n","ft.app.controller('monthPickerController',\r\n ['$scope', '$element', 'close', 'selectedDate', '$timeout',\r\n function ($scope, $element, close, selectedDate, $timeout) {\r\n\r\n let initialized = false;\r\n const today = new Date();\r\n\r\n $scope.data = {\r\n today: today,\r\n year: selectedDate.year || today.getFullYear(),\r\n selectedMonth: selectedDate.month || today.getMonth(),\r\n months: [\r\n [0, 1, 2],\r\n [3, 4, 5],\r\n [6, 7, 8],\r\n [9, 10, 11]\r\n ]\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n };\r\n\r\n $scope.close = function () {\r\n close({\r\n year: $scope.data.year,\r\n month: $scope.data.selectedMonth\r\n });\r\n };\r\n\r\n $scope.closeWithToday = function () {\r\n close({\r\n year: new Date().getFullYear(),\r\n month: new Date().getMonth()\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n close();\r\n };\r\n\r\n $scope.up = function () {\r\n $scope.data.year++;\r\n };\r\n\r\n $scope.down = function () {\r\n $scope.data.year--;\r\n };\r\n\r\n $scope.isCurrentMonth = function (month) {\r\n\r\n const thisYear = moment().year();\r\n const thisMonth = moment().month();\r\n\r\n return thisYear == $scope.data.year && thisMonth == month;\r\n\r\n };\r\n\r\n $scope.isSelectedMonth = function (month) {\r\n\r\n return $scope.data.selectedMonth == month;\r\n\r\n };\r\n\r\n $scope.selectMonth = function (month) {\r\n $scope.data.selectedMonth = month;\r\n\r\n close({\r\n year: $scope.data.year,\r\n month: $scope.data.selectedMonth\r\n });\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }]);","/*\r\n * isDebug\r\n * Purpose: Show if debug\r\n * \r\n */\r\nft.app.directive('ftScreenContent',\r\n ['LanguageService', '$sce',\r\n function (LanguageService, $sce) {\r\n return {\r\n scope: {\r\n code: '@'\r\n },\r\n link: function (scope, elm, attrs) {\r\n scope.isExpanded = false;\r\n scope.content = null;\r\n\r\n var offCodeChange = scope.$watch('code', function (newValue, oldValue) {\r\n\r\n scope.content = null;\r\n\r\n if (newValue) {\r\n LanguageService.getContentAsync(scope.code).then(function (results) {\r\n scope.content = results[0]; \r\n scope.content.htmlContent = $sce.trustAsHtml(results[0].htmlContent);\r\n }, function () {\r\n });\r\n }\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n if (offCodeChange) {\r\n offCodeChange();\r\n }\r\n });\r\n\r\n },\r\n template: '


'\r\n };\r\n }]);\r\n","ft.app.directive('ftFamilyChildSelection',\r\n function () {\r\n return {\r\n scope: {\r\n children: '=',\r\n handler: '='\r\n },\r\n templateUrl: ft.app.getTemplateUrl('family/childselection')\r\n };\r\n });\r\n\r\nft.app.directive('ftChildWidget', function () {\r\n\r\n return {\r\n templateUrl: ft.app.getTemplateUrl('child/widget'),\r\n scope: {\r\n child: '=',\r\n },\r\n controller: 'childWidgetController',\r\n link: function (scope, elm, attrs) {\r\n }\r\n };\r\n});\r\n\r\nft.app.directive('ftAddress', function () {\r\n\r\n return {\r\n templateUrl: ft.app.getTemplateUrl('family/address'),\r\n scope: {\r\n address: '=',\r\n singleLine: '='\r\n }\r\n };\r\n});\r\n","ft.app.directive('ftFormFieldNumber', function () {\r\n return {\r\n restrict: 'EA',\r\n template: '',\r\n scope: {\r\n inputValue: '=',\r\n inputId: '=',\r\n decimalChar: '=?',\r\n allowNegatives: '=?'\r\n },\r\n link: function (scope) {\r\n\r\n scope.decimalChar = scope.decimalChar || ',';\r\n scope.allowNegatives = scope.allowNegatives || false;\r\n\r\n scope.$watch('inputValue', function (newValue, oldValue) {\r\n var newValue = newValue.replace(/\\./gi, scope.decimalChar);\r\n\r\n var arr = String(newValue).split('');\r\n if (arr.length === 0) {\r\n return;\r\n }\r\n if (arr.length === 1 && (arr[0] == '-' || arr[0] === scope.decimalChar)) {\r\n return;\r\n }\r\n if (arr.length === 2 && newValue === '-' + scope.decimalChar) {\r\n return;\r\n }\r\n\r\n var temp = newValue.replace(/,/gi, '.');\r\n\r\n if (isNaN(temp)) {\r\n scope.inputValue = oldValue;\r\n } else {\r\n scope.inputValue = newValue;\r\n }\r\n });\r\n }\r\n };\r\n});\r\n\r\n// model value 10:00:00 becomes 10:00 for user\r\n// user value 1000 becomes 10:00:00 for model\r\nft.app.directive('ftTime', ['$filter', function ($filter) {\r\n return {\r\n require: '?ngModel',\r\n link: function (scope, elem, attrs, ctrl) {\r\n if (!ctrl) {\r\n return;\r\n }\r\n\r\n var toView = function (a) {\r\n //return $filter('GetTime')(ctrl.$modelValue, true);\r\n return ctrl.$modelValue;\r\n };\r\n\r\n var toModel = function (viewValue) {\r\n\r\n var plainNumber = viewValue.replace(/:/g, '');\r\n var patt = new RegExp(/^(([0-1]?[0-9])|([2][0-3]))([0-5][0-9])$/g);\r\n var res = patt.test(plainNumber);\r\n\r\n if (!res) {\r\n return;\r\n }\r\n\r\n viewValue = plainNumber.replace(patt, '$1:$4');\r\n elem.val(viewValue);\r\n\r\n return viewValue + ':00'; // as we want seconds in the model as well\r\n\r\n };\r\n\r\n ctrl.$formatters.unshift(toView);\r\n ctrl.$parsers.unshift(toModel);\r\n }\r\n };\r\n}]);\r\n","ft.app.directive('ftIsolatedScope', function () {\r\n return {\r\n scope: {},\r\n link: function () {\r\n }\r\n };\r\n});\r\n","/*\r\n * isDebug\r\n * Purpose: Show if debug\r\n * \r\n */\r\nft.app.directive('ftShowOnDebug', function () {\r\n return {\r\n link: function (scope, elm, attrs) {\r\n $(elm).css('display', ft.DEBUG ? 'block' : 'none');\r\n }\r\n };\r\n});\r\n\r\n// ftBindController: bind controller (and view) to element\r\n// usage:
\r\n// result: \r\n/*\r\n *
\r\n *
\r\n *
\r\n */\r\nft.app.directive('ftBindController',\r\n ['$compile', '$parse',\r\n function ($compile, $parse) {\r\n var init = false;\r\n var create = function (element, scope, data, init) {\r\n\r\n var view = ft.app.getTemplateUrl(data.view);\r\n var elm = angular.element('
');\r\n\r\n element.empty(); // remove previous content\r\n $compile(elm)(scope);\r\n element.append(elm);\r\n\r\n };\r\n\r\n return {\r\n scope: false,\r\n compile: function (tElm, tAttrs) {\r\n var initialized = false;\r\n var attrObj = tAttrs.ftBindController;\r\n var attrInit = tAttrs.init;\r\n var fnObj = $parse(attrObj);\r\n\r\n var linkFunction = function (scope, elm, attrs) {\r\n\r\n if (!initialized) {\r\n scope.$watch(attrObj, function (newValue, oldValue) {\r\n\r\n if (newValue != oldValue) {\r\n linkFunction(scope, elm, attrs);\r\n }\r\n\r\n });\r\n }\r\n\r\n var obj = fnObj(scope.$parent);\r\n create(elm, scope, obj, attrInit);\r\n\r\n initialized = true;\r\n\r\n elm.on('$destroy', function () {\r\n scope.$destroy();\r\n });\r\n\r\n };\r\n\r\n return linkFunction;\r\n }\r\n };\r\n\r\n }]);\r\n\r\n// ftBindObject: the purpose of this directive is to reduce the duplication of the object's name\r\n\r\n/* FROM:\r\n *
{{user.name.first}}
\r\n *
{{user.name.last}}
\r\n */\r\n\r\n/* TO:\r\n *
\r\n *
{{first}}
\r\n *
{{last}}
\r\n *
\r\n */\r\n\r\nft.app.directive('ftBindObject',\r\n ['$parse',\r\n function ($parse) {\r\n return {\r\n scope: true,\r\n compile: function (tElm, tAttrs) {\r\n var init = false;\r\n var attr = tAttrs.ftBindObject;\r\n var fn = $parse(attr);\r\n\r\n var linkFunction = function (scope, elm, attrs) {\r\n\r\n if (!init) {\r\n scope.$watch(attr, function (newValue, oldValue) {\r\n\r\n linkFunction(scope, elm, attrs);\r\n\r\n });\r\n }\r\n\r\n var property = fn(scope.$parent);\r\n property = angular.isObject(property) ? property : {};\r\n angular.extend(scope, property);\r\n\r\n init = true;\r\n\r\n };\r\n\r\n return linkFunction;\r\n }\r\n };\r\n }]);\r\n\r\nft.app.directive('ftBackImage', function () {\r\n return {\r\n link: function (scope, elm, attrs) {\r\n attrs.$observe('ftBackImage', function (value) {\r\n\r\n elm.removeClass('default-header text-center');\r\n elm.find('.camera').remove();\r\n\r\n if (value) {\r\n elm.css('background-image', 'url(' + value + ')');\r\n } else {\r\n elm.addClass('default-header text-center');\r\n elm.append('
');\r\n }\r\n });\r\n }\r\n };\r\n});\r\n\r\n// ftEnter: do action when user hits enter-key\r\nft.app.directive('ftEnter', function () {\r\n return function (scope, element, attrs) {\r\n element.bind('keypress', function (event) {\r\n\r\n if (event.which === 13) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n scope.$eval(attrs.ftEnter);\r\n scope.$apply();\r\n }\r\n\r\n });\r\n };\r\n});\r\n\r\nft.app.directive('ftRequiredFieldIndication',\r\n function () {\r\n return {\r\n templateUrl: ft.app.getTemplateUrl('required-field-indication'),\r\n };\r\n });\r\n","ft.app.directive('ftImageUpload', function () {\r\n return {\r\n scope: {\r\n onSave: '='\r\n },\r\n link: function (scope, elm) {\r\n $(elm).html5imageupload({\r\n onSave: scope.onSave\r\n });\r\n }\r\n };\r\n\r\n});\r\n","ft.app.directive('ftMorphModal', ['$rootScope', '$compile', '$parse', '$controller', 'TemplateHandler',\r\n function ($rootScope, $compile, $parse, $controller, TemplateHandler) {\r\n\r\n var $body = $('#wrapper');\r\n var layerManager = ft.ui.managers.zIndexManager;\r\n var standardSizeClass = 'overlay-standard-size';\r\n var openClass = 'overlay-open';\r\n var modalPlaceholderClass = 'modal-placeholder';\r\n var modalClass = 'overlay';\r\n var shadowClass = 'shadow';\r\n var noTransitionClass = 'no-transition';\r\n var modalSizeAttr = 'modalSize';\r\n\r\n return {\r\n restrict: 'A',\r\n scope: true,\r\n link: function (scope, elm, attrs) {\r\n\r\n var settings = scope.$eval(attrs.ftMorphModal);\r\n var max = 1000000;\r\n var id = 'modal-' + ft.getRandom(1, max) + '-' + ft.getRandom(max * 2, max * 3);\r\n\r\n var $elm = $(elm);\r\n var $wrapper = $('
');\r\n var $modal = $('
');\r\n var $shadow = $('
');\r\n\r\n $wrapper.attr('id', id);\r\n $elm.attr('modal', id);\r\n\r\n $wrapper.append($modal);\r\n $wrapper.append($shadow);\r\n $body.append($wrapper);\r\n\r\n $elm.on('click', function () {\r\n\r\n var position = $elm.offset();\r\n\r\n $modal.empty();\r\n TemplateHandler\r\n .get(ft.app.getTemplateUrl(settings.templateUrl))\r\n .then(compile)\r\n .then(function (result) {\r\n $modal.append(result);\r\n $modal.find('.back').on('click', close);\r\n });\r\n\r\n var modalSize;\r\n if (!$modal.data(modalSizeAttr)) {\r\n modalSize = getSizeAndPositionFromCss(settings.style);\r\n modalSize = !modalSize ? getSizeAndPositionFromCss(standardSizeClass) : modalSize;\r\n $modal.data(modalSizeAttr, modalSize);\r\n } else {\r\n modalSize = $modal.data(modalSizeAttr);\r\n }\r\n\r\n $modal.addClass(noTransitionClass);\r\n $modal.css('left', position.left);\r\n $modal.css('right', $body.outerWidth() - (position.left + $elm.outerWidth()));\r\n $modal.css('top', position.top);\r\n $modal.css('width', elm.outerWidth());\r\n $modal.css('height', elm.outerHeight());\r\n $modal.removeClass(noTransitionClass);\r\n\r\n $shadow.css('zIndex', layerManager.index);\r\n $modal.css('zIndex', layerManager.index);\r\n\r\n $wrapper.css('display', 'block');\r\n\r\n setTimeout(function () {\r\n\r\n $elm.addClass(openClass);\r\n $wrapper.addClass(openClass);\r\n\r\n if (!modalSize.top) {\r\n var top = Math.floor((parseInt($body.outerHeight()) - parseInt(modalSize.height)) / 2);\r\n $modal.css('top', top + 'px');\r\n }\r\n\r\n $modal.css(modalSize);\r\n\r\n }, 400);\r\n\r\n });\r\n\r\n $shadow.on('click', function () {\r\n\r\n close();\r\n\r\n });\r\n\r\n // bind the template contents with the current scope and returns the result\r\n var compile = function (results) {\r\n if (settings.controller) {\r\n var inst = $controller(settings.controller, {\r\n $rootScope: $rootScope,\r\n $scope: scope,\r\n closeHandler: close\r\n });\r\n }\r\n\r\n var template = results.data ? results.data : results;\r\n return $compile(template)(scope);\r\n };\r\n\r\n // get properties from css rule for height, width and top\r\n // makes custom sizes possible, but standard is given\r\n var getSizeAndPositionFromCss = function (style) {\r\n\r\n var sheets = document.styleSheets;\r\n\r\n for (var prop in sheets) {\r\n\r\n var sheet = sheets[prop];\r\n\r\n if (sheet && sheet.href && sheet.href.indexOf(ft.app.cssFile)) {\r\n var rules = sheet.cssRules ? sheet.cssRules : sheet.rules;\r\n\r\n for (var i = 0; i < rules.length; i++) {\r\n var rule = rules[i];\r\n\r\n if (rule.selectorText && rule.selectorText.indexOf(style) >= 0) {\r\n return {height: rule.style.height, width: rule.style.width, top: rule.style.top};\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n // mainly closes the modal\r\n var close = function () {\r\n\r\n layerManager.remove($shadow.css('zIndex'));\r\n layerManager.remove($modal.css('zIndex'));\r\n\r\n var position = $elm.offset();\r\n\r\n $elm.removeClass(openClass);\r\n $wrapper.removeClass(openClass);\r\n\r\n $modal.css('top', position.top);\r\n $modal.css('left', position.left);\r\n $modal.css('right', $body.outerWidth() - (position.left + $elm.outerWidth()));\r\n $modal.css('width', elm.outerWidth());\r\n $modal.css('height', elm.outerHeight());\r\n\r\n setTimeout(function () {\r\n $wrapper.css('display', 'none');\r\n }, 800);\r\n };\r\n\r\n }\r\n };\r\n }]);\r\n","// solution for format problem with Angular UI Bootstrap\r\n// PROBLEM:\r\n// when selecting a date in popup, the format will be copied.\r\n// when (in case of a wizard) a rewrite of the field happens, the format will be neclected.\r\nft.app.directive('datepickerPopup',\r\n ['dateFilter', 'datepickerPopupConfig', function (dateFilter, datepickerPopupConfig) {\r\n return {\r\n restrict: 'A',\r\n priority: 1,\r\n require: 'ngModel',\r\n link: function (scope, element, attr, ngModel) {\r\n var dateFormat = attr.datepickerPopup || datepickerPopupConfig.datepickerPopup;\r\n ngModel.$formatters.push(function (value) {\r\n return dateFilter(value, dateFormat);\r\n });\r\n }\r\n };\r\n }]);\r\n","ft.app.directive('ftPlanningBlocks',\r\n function () {\r\n\r\n return {\r\n replace: true,\r\n controller: 'planningBlocklistController',\r\n templateUrl: ft.app.getTemplateUrl('planning/blocklist'),\r\n link: function (scope, elm, attrs) {\r\n\r\n }\r\n };\r\n });\r\n\r\nft.app.directive('ftPlanningStyle',\r\n function () {\r\n return {\r\n link: function (scope, elm, attrs) {\r\n\r\n var planning = ft.app.planning;\r\n var day = scope.$eval(attrs.day);\r\n var block = scope.$eval(attrs.block);\r\n var $elm = $(elm);\r\n\r\n if (block) {\r\n if (block.status == planning.states.requestable) {\r\n elm.addClass('requestable');\r\n } else if (block.status == planning.states.requested) {\r\n elm.addClass('requested');\r\n\r\n if (block.type == planning.types.swap && block.presence == planning.presence.traded) {\r\n elm.addClass('traded');\r\n }\r\n } else if (block.status == planning.states.rejected) {\r\n elm.addClass('rejected');\r\n } else if (block.presence == planning.presence.holiday || block.presence == planning.presence.sick || block.presence == planning.presence.absent || block.type == planning.types.absent || (block.type == planning.types.swap && block.presence == planning.presence.traded)) {\r\n elm.addClass('absent');\r\n } else if (block.status == planning.states.approved && block.type != planning.types.absent) {\r\n elm.addClass('approved');\r\n }\r\n } else if (day) {\r\n if (new Date(day.date).setHours(0, 0, 0, 0) == new Date().setHours(0, 0, 0, 0)) {\r\n elm.addClass('today');\r\n }\r\n\r\n if (day.type == planning.days.closed) {\r\n elm.addClass('closed');\r\n }\r\n\r\n if (day.type == planning.days.holiday) {\r\n elm.addClass('holiday');\r\n }\r\n }\r\n\r\n }\r\n };\r\n });\r\n","ft.app.directive('ftScrollTo', function () {\r\n return {\r\n link: function (scope, elm, attrs) {\r\n\r\n var offDestroy;\r\n\r\n var fncScrollTo = function () {\r\n\r\n var target = attrs.ftScrollTo;\r\n var top = $('#' + target).offset().top - 50;\r\n\r\n $('body').animate({\r\n scrollTop: top\r\n });\r\n };\r\n\r\n var handleDestroy = function () {\r\n elm.off('click');\r\n if (offDestroy) {\r\n offDestroy();\r\n }\r\n };\r\n\r\n elm.on('click', fncScrollTo);\r\n offDestroy = scope.$on('$destroy', handleDestroy);\r\n\r\n }\r\n };\r\n});\r\n\r\n/*\r\n * ftStickyScroll\r\n * Purpose: push elm to sticky scroll plugin\r\n * \r\n */\r\nft.app.directive('ftStickyScroll', function () {\r\n return {\r\n link: function (scope, elm, attrs) {\r\n\r\n var cssName = 'sticked';\r\n var evtName = 'scroll';\r\n var $content = $('#content');\r\n var $elm = $(elm);\r\n var offset = $elm.offset().top - $content.offset().top;\r\n var $pageButton;\r\n var pgRight = 0;\r\n\r\n $content.on(evtName, function () {\r\n\r\n var scrollTop = $content.scrollTop();\r\n\r\n if (!$pageButton) {\r\n var btn = $('.page-button'); // should be rendered now by other directive\r\n\r\n if (btn.length == 1) {\r\n $pageButton = btn;\r\n pgRight = $(window).width() - ($pageButton.offset().left + $pageButton.width());\r\n //pgRight = $pageButton.offset().right - $content.offset().right - parseInt($pageButton.css('right'));\r\n }\r\n }\r\n\r\n if (scrollTop >= offset) {\r\n $content.addClass(cssName);\r\n $elm.css('top', scrollTop);\r\n if ($pageButton) {\r\n $pageButton.css('top', scrollTop - 5);\r\n }\r\n if ($pageButton) {\r\n $pageButton.css('right', pgRight - 42);\r\n }\r\n } else {\r\n if ($pageButton) {\r\n $pageButton.css('top', '');\r\n }\r\n if ($pageButton) {\r\n $pageButton.css('right', '');\r\n }\r\n $elm.css('top', '');\r\n $content.removeClass(cssName);\r\n }\r\n\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n\r\n $content.scrollTop(0);\r\n $content.removeClass(cssName);\r\n $content.off(evtName);\r\n\r\n });\r\n\r\n\r\n //$(elm).scrollToFixed();\r\n\r\n return;\r\n $(elm).sticky({\r\n topSpacing: '0',\r\n className: 'sticked'\r\n });\r\n }\r\n };\r\n});\r\n\r\n","ft.app.directive('ftClick', function () {\r\n return function (scope, element, attrs) {\r\n\r\n element.on('touch click', function (event) {\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n scope.$apply(attrs['ftClick']);\r\n\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n element.off('touch click');\r\n });\r\n\r\n };\r\n});\r\n","/*\r\n * GetPhoneNumber\r\n * Purpose: A filter that returns the first or all phone numbers\r\n */\r\nft.app.filter('GetPhoneNumber', function () {\r\n\r\n return function (info, category, emergency, all) {\r\n\r\n if (!info) {\r\n return;\r\n }\r\n\r\n var items = info.filter(function (item) {\r\n return item.type == ft.app.contactInformation.types.phone && ((item.category && category && item.category == category) || !category) && ((emergency == true && item.isEmergency == true) || !emergency);\r\n });\r\n\r\n if (items && items.length) {\r\n return (all) ? items : items[0];\r\n }\r\n\r\n };\r\n\r\n});\r\n\r\n/*\r\n * GetMobilePhoneNumber\r\n * Purpose: A filter that returns the first or all phone numbers\r\n */\r\nft.app.filter('GetMobilePhoneNumber', function () {\r\n\r\n return function (info, category, emergency, all) {\r\n\r\n if (!info) {\r\n return;\r\n }\r\n\r\n var items = info.filter(function (item) {\r\n return item.type == ft.app.contactInformation.types.mobile && ((item.category && category && item.category == category) || !category) && ((emergency == true && item.isEmergency == true) || !emergency);\r\n });\r\n\r\n if (items && items.length) {\r\n return (all) ? items : items[0];\r\n }\r\n\r\n };\r\n\r\n});\r\n\r\n/*\r\n * GetEmailAddress\r\n * Purpose: A filter that returns the first or all e-mail address\r\n */\r\nft.app.filter('GetEmailAddress', function () {\r\n\r\n return function (info, category, emergency, all) {\r\n\r\n if (!info) {\r\n return;\r\n }\r\n\r\n var items = info.filter(function (item) {\r\n return item.type == ft.app.contactInformation.types.email && ((item.category && category && item.category == category) || !category) && ((emergency == true && item.emergency == true) || !emergency);\r\n });\r\n\r\n if (items && items.length) {\r\n return (all) ? items : items[0];\r\n }\r\n\r\n };\r\n\r\n});\r\n\r\n/*\r\n * GetEmailAddress\r\n * Purpose: A filter that returns the first or all e-mail address\r\n */\r\nft.app.filter('GetAddress', function () {\r\n\r\n return function (info, category, all) {\r\n\r\n if (!info) {\r\n return;\r\n }\r\n\r\n var items = info.filter(function (item) {\r\n return item.type == category;\r\n });\r\n\r\n if (items && items.length) {\r\n return (all) ? items : items[0];\r\n }\r\n\r\n };\r\n\r\n});\r\n","ft.app.filter('GetContractStatusName',\r\n ['$translate',\r\n function ($translate) {\r\n return function (status) {\r\n\r\n var states = ft.app.contract.states;\r\n\r\n switch (status) {\r\n case states.received:\r\n return $translate.instant('CONTRACTS.RECEIVED');\r\n break;\r\n case states.active:\r\n return $translate.instant('CONTRACTS.ACTIVE');\r\n break;\r\n case states.approved:\r\n return $translate.instant('CONTRACTS.APPROVED');\r\n break;\r\n case states.rejected:\r\n return $translate.instant('CONTRACTS.REJECTED');\r\n break;\r\n case states.offered:\r\n return $translate.instant('CONTRACTS.OFFERED');\r\n break;\r\n case states.sign:\r\n return $translate.instant('CONTRACTS.SIGN');\r\n break;\r\n case states.cancelled:\r\n return $translate.instant('CONTRACTS.CANCELLED');\r\n break;\r\n case states.ended:\r\n return $translate.instant('CONTRACTS.ENDED');\r\n break;\r\n }\r\n\r\n };\r\n }]);\r\n","moment.locale(ft.app.datetime.locale);\r\nmoment().isoWeekday(1);\r\n\r\n/*\r\n * GetDayNameOfWeek\r\n * Purpose: Get the name of the day of the week\r\n * Example: 2015-01-28T15:30:50.320Z > \"Th\".\r\n * Usage:\r\n * {{ item.datetime | GetDayNameOfWeek }}\r\n *\r\n */\r\nft.app.filter('GetDayNameOfWeek', function () {\r\n return function (dateString) {\r\n\r\n return moment(dateString).format('dd');\r\n\r\n };\r\n});\r\n\r\n/*\r\n * GetFullDayNameOfWeek\r\n * Purpose: Get the full name of the day of the week\r\n * Example: 2015-01-28T15:30:50.320Z > \"Thursday\".\r\n * Usage:\r\n * {{ item.datetime | GetFullDayNameOfWeek }}\r\n *\r\n */\r\nft.app.filter('GetFullDayNameOfWeek', function () {\r\n return function (dateString) {\r\n\r\n return moment(dateString).format('dddd');\r\n\r\n };\r\n});\r\n\r\n/*\r\n * GetDayNameByIndex\r\n * Purpose: Get the name of the dayname\r\n * Example: 2 > \"Th\".\r\n * Usage:\r\n * {{ an index | GetDayNameOfWeek }}\r\n *\r\n */\r\nft.app.filter('GetDayNameByIndex', function () {\r\n return function (index) {\r\n return moment.weekdaysMin(index);\r\n };\r\n});\r\n\r\n/*\r\n * GetDayOfMonth\r\n * Purpose: Get the day in date\r\n * Example: 2015-01-28T15:30:50.320Z > \"Th\".\r\n * Usage:\r\n * {{ item.datetime | GetDayOfMonth }}\r\n *\r\n */\r\nft.app.filter('GetDayOfMonth', function () {\r\n return function (dateString) {\r\n\r\n return moment(dateString).format('DD');\r\n\r\n };\r\n});\r\n\r\n/*\r\n * GetMonthName\r\n * Purpose: Get the name of the month\r\n * Example: 2015-01-28T15:30:50.320Z > \"Jan\".\r\n * Usage:\r\n * {{ item.datetime | GetMonthName }}\r\n *\r\n */\r\nft.app.filter('GetMonthName', function () {\r\n return function (dateString) {\r\n\r\n return moment(dateString).format('MMM').replace(/\\./, '');\r\n\r\n };\r\n});\r\n\r\n/*\r\n * GetMonthNameByIndex\r\n * Purpose: Get the name of the month by index\r\n * Example: 1 > \"Jan\".\r\n * Usage:\r\n * {{ i | GetMonthName }}\r\n *\r\n */\r\nft.app.filter('GetMonthNameByIndex', function () {\r\n return function (index) {\r\n\r\n // index = 0 (january) will generate a false so ignore 0\r\n if (!index && !(index == 0)) {\r\n return '';\r\n }\r\n\r\n return moment().month(index).format('MMMM');\r\n\r\n };\r\n});\r\n\r\n/*\r\n * GetYear\r\n * Purpose: Get the last 2 digits of the year\r\n * Example: 2015-01-28T15:30:50.320Z > \"15\".\r\n * Usage:\r\n * {{ item.datetime | GetYear }}\r\n *\r\n */\r\nft.app.filter('GetYear', function () {\r\n return function (dateString) {\r\n\r\n return moment(dateString).format('YY');\r\n\r\n };\r\n});\r\n\r\n/*\r\n * GetFullYear\r\n * Purpose: Get the year\r\n * Example: 2015-01-28T15:30:50.320Z > \"2015\".\r\n * Usage:\r\n * {{ item.datetime | GetYear }}\r\n *\r\n */\r\nft.app.filter('GetFullYear', function () {\r\n return function (dateString) {\r\n\r\n return moment(dateString).format('YYYY');\r\n\r\n };\r\n});\r\n\r\n/*\r\n * GetTime\r\n * Purpose: Get the hour and minutes\r\n * Example: 2015-01-28T15:30:50.320Z > \"15:30\".\r\n * Usage:\r\n * {{ item.datetime | GetTime }}\r\n *\r\n */\r\nft.app.filter('GetTime', function () {\r\n return function (dateString, isOnlyTime) {\r\n if (!dateString) {\r\n return '';\r\n }\r\n\r\n var m;\r\n\r\n if (isOnlyTime == true) {\r\n m = moment(dateString, 'HH:mm:ss');\r\n } else {\r\n m = moment(dateString);\r\n }\r\n\r\n //return m.utcOffset(ft.app.datetime.offset).format('HH:mm');\r\n return m.format('HH:mm');\r\n };\r\n});\r\n\r\n/*\r\n * FromNow\r\n * Purpose: Converts datetime values to a readable context aware string.\r\n * Example: 1409652117038 > \"9 minutes ago\".\r\n * Usage:\r\n * {{ item.datetime | FromNow }}\r\n *\r\n */\r\nft.app.filter('FromNow', function () {\r\n return function (dateString) {\r\n\r\n return moment(dateString).fromNow();\r\n\r\n };\r\n});\r\n\r\n/*\r\n * RelativeFormatDate\r\n * Purpose: Formats the date (without time), but today and yesterday is humanized.\r\n * Usage:\r\n * {{ item.date | RelativeFormatDate }}\r\n *\r\n */\r\nft.app.filter('RelativeFormatDate', function () {\r\n return function (dateString) {\r\n\r\n var today = moment(new Date()).format('YYYY-MM-DD'); // make sure to have only year, month and date WITHOUT time\r\n var now = moment(today);\r\n var time = moment(dateString);\r\n var diff = now.diff(time, 'days');\r\n\r\n if (diff == 0) {\r\n return 'vandaag';\r\n } else if (diff == -1) {\r\n return 'morgen';\r\n } else {\r\n return time.format(ft.app.datetime.formats.default);\r\n }\r\n\r\n };\r\n});\r\n\r\n/*\r\n * FormatDate\r\n * Purpose: Formats the date (without time)\r\n * Usage:\r\n * {{ item.datetime | FormatDate }}\r\n *\r\n */\r\nft.app.filter('FormatDate', function () {\r\n return function (dateString) {\r\n return moment(dateString).format(ft.app.datetime.formats.default);\r\n };\r\n});\r\n","/*\r\n * GroupByFilter\r\n * Purpose: A filter that groups the items by given groupBy property\r\n */\r\nft.app.filter('GroupByFilter', function () {\r\n\r\n return function (items, groupBy, fncFormatValue) {\r\n\r\n var arrGroups = [];\r\n\r\n // object used for storing keys and their groups\r\n var objGroups = {};\r\n\r\n for (var i = 0; i < items.length; i++) {\r\n\r\n var item = items[i];\r\n\r\n // make sure it is his own property\r\n if (item.hasOwnProperty(groupBy)) {\r\n var val = fncFormatValue ? fncFormatValue(item[groupBy]) : item[groupBy]; // groupBy = 'Name', val = 'Bart' or other value.\r\n\r\n // make new group if there is none and set title 'Name'\r\n if (!objGroups[val]) {\r\n objGroups[val] = new ft.models.Group({title: val});\r\n }\r\n\r\n // push item\r\n objGroups[val].items.push(item);\r\n\r\n }\r\n\r\n }\r\n\r\n // convert key-object to array so we can loop on binding\r\n // add the all-item if wanted\r\n // { 'prop1' : Group, 'prop2': Group } --> [Group, Group]\r\n for (var prop in objGroups) {\r\n\r\n if (objGroups.hasOwnProperty(prop)) {\r\n arrGroups.push(objGroups[prop]);\r\n }\r\n\r\n }\r\n\r\n return arrGroups;\r\n };\r\n\r\n});\r\n\r\n/*\r\n * MakeRange\r\n * Purpose: A filter that groups the items by given groupBy property\r\n */\r\nft.app.filter('MakeRange', function () {\r\n\r\n return function (input) {\r\n var min, max;\r\n\r\n switch (input.length) {\r\n case 1:\r\n min = 0;\r\n max = parseInt(input[0]) - 1;\r\n break;\r\n case 2:\r\n min = parseInt(input[0]);\r\n max = parseInt(input[1]);\r\n break;\r\n default:\r\n return input;\r\n }\r\n\r\n var result = [];\r\n\r\n for (var i = min; i <= max; i++) {\r\n result.push(i);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n});","ft.app.filter('GetPlanningStatusName',\r\n ['$translate',\r\n function ($translate) {\r\n return function (status) {\r\n\r\n var states = ft.app.planning.states;\r\n\r\n switch (status) {\r\n case states.approved:\r\n return $translate.instant('PLANNING-FILTER.APPROVED');\r\n break;\r\n case states.rejected:\r\n return $translate.instant('PLANNING-FILTER.REJECTED');\r\n break;\r\n case states.requestable:\r\n return $translate.instant('PLANNING-FILTER.REQUESTABLE');\r\n break;\r\n case states.requested:\r\n return $translate.instant('PLANNING-FILTER.REQUESTED');\r\n break;\r\n }\r\n\r\n };\r\n }]);\r\n\r\nft.app.filter('GetPlanningTypeName',\r\n ['$translate',\r\n function ($translate) {\r\n return function (type) {\r\n\r\n var types = ft.app.planning.types;\r\n\r\n switch (type) {\r\n case types.absent:\r\n return $translate.instant('PLANNING-FILTER.ABSENT');\r\n break;\r\n case types.incidental:\r\n return $translate.instant('PLANNING-FILTER.INCIDENTAL');\r\n break;\r\n case types.planning:\r\n return $translate.instant('PLANNING-FILTER.REGULAR');\r\n break;\r\n case types.study:\r\n return $translate.instant('PLANNING-FILTER.STUDY');\r\n break;\r\n case types.swap:\r\n return $translate.instant('PLANNING-FILTER.SWAP');\r\n break;\r\n case types.vacation:\r\n return $translate.instant('PLANNING-FILTER.HOLIDAY');\r\n break;\r\n }\r\n };\r\n }]);\r\n\r\nft.app.filter('GetPlanningPresenceName',\r\n ['$translate',\r\n function ($translate) {\r\n return function (presence) {\r\n\r\n var presences = ft.app.planning.presence;\r\n\r\n switch (presence) {\r\n case presences.absent:\r\n return $translate.instant('PLANNING-FILTER.ABSENT');\r\n break;\r\n case presences.holiday:\r\n return $translate.instant('PLANNING-FILTER.HOLIDAY');\r\n break;\r\n case presences.sick:\r\n return $translate.instant('PLANNING-FILTER.SICK');\r\n break;\r\n case presences.present:\r\n return $translate.instant('PLANNING-FILTER.PRESENT');\r\n break;\r\n }\r\n\r\n };\r\n }]);\r\n","ft.app.filter('urlencode', function () {\r\n return function (input) {\r\n return window.encodeURIComponent(input);\r\n };\r\n});\r\n\r\nft.app.filter('newlines', function () {\r\n return function (text) {\r\n if (!text) {\r\n return;\r\n }\r\n\r\n return text.split(/\\n/g);\r\n };\r\n});","/*\r\n * CheckDefaultProfilePicture\r\n * Purpose: If no picture is present, then default profile picture according to the gender and type (child, not child) is returned\r\n * Usage:\r\n* {{ item.picture.url | CheckDefaultProfilePicture }}\r\n* \r\n*/\r\nft.app.filter('CheckDefaultProfilePicture', function () {\r\n return function (url, gender, type) {\r\n\r\n if (url) {\r\n return url;\r\n }\r\n\r\n if (gender == ft.app.gender.female) {\r\n return type == ft.app.family.types.child ? ft.app.family.images.girl : ft.app.family.images.woman;\r\n } else {\r\n return type == ft.app.family.types.child ? ft.app.family.images.boy : ft.app.family.images.men;\r\n }\r\n\r\n };\r\n});\r\n\r\n/*\r\n * TranslateGender\r\n * Purpose: Translate gender type to a nice string\r\n * Usage:\r\n* {{ item.gender | TranslateGender }}\r\n* \r\n*/\r\nft.app.filter('TranslateGender', function () {\r\n return function (gender, type) {\r\n\r\n if (ft.app.gender.female == gender) {\r\n return type == ft.app.family.types.child ? 'meisje' : 'vrouw';\r\n } else if (ft.app.gender.male == gender) {\r\n return type == ft.app.family.types.child ? 'jongen' : 'man';\r\n } else {\r\n return '';\r\n }\r\n\r\n };\r\n});\r\n\r\nft.app.filter('UserFirstName', function () {\r\n return function (id, users) {\r\n\r\n users = users || [];\r\n var user = users.find(x => x.id == id);\r\n\r\n if (!user) {\r\n return '';\r\n }\r\n return user.name.firstName;\r\n\r\n };\r\n});\r\n","ft.app.service('CheckStateChangeService', ['$rootScope', '$state', '$translate', 'ModalService',\r\n function ($rootScope, $state, $translate, ModalService) {\r\n\r\n var addFormCheck = function ($scope, formName) {\r\n\r\n $rootScope.checkForFormChange = true;\r\n\r\n var removeListener = $rootScope.$on('$stateChangeStart', function (evt, toState, toParams, fromState, fromParams) {\r\n\r\n if (!$scope[formName]) {\r\n return;\r\n }\r\n\r\n if ($scope[formName].$pristine || !$rootScope.checkForFormChange) {\r\n return;\r\n }\r\n\r\n ModalService.showModal({\r\n templateUrl: 'confirm-modal',\r\n controller: 'confirmModalController',\r\n inputs: {\r\n question: $translate.instant('MODAL-CONFIRM.DATA-CHANGED')\r\n }\r\n }).then(function (modal) {\r\n modal.close.then(function (results) {\r\n\r\n if (results.confirmed) {\r\n $rootScope.checkForFormChange = false;\r\n $state.go(toState, toParams);\r\n } else {\r\n return;\r\n }\r\n\r\n });\r\n });\r\n\r\n evt.preventDefault();\r\n\r\n });\r\n\r\n $scope.$on('$destroy', removeListener);\r\n\r\n };\r\n\r\n return {checkFormOnStateChange: addFormCheck};\r\n }]);\r\n","ft.app.service('LanguageService', ['$rootScope', '$q', 'AppService', 'DataService',\r\n function ($rootScope, $q, AppService, DataService) {\r\n\r\n var initialized = false;\r\n var promises = {};\r\n var content = {};\r\n\r\n this.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n $rootScope.$watch(function () {\r\n return AppService.data.currentLanguage;\r\n }, function (newValue, oldValue) {\r\n\r\n if (!content[newValue]) {\r\n content[newValue] = {};\r\n }\r\n\r\n });\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n this.getContentAsync = function (code) {\r\n\r\n if (promises[code]) {\r\n return promises[code];\r\n }\r\n\r\n if (!content[AppService.data.currentLanguage]) {\r\n content[AppService.data.currentLanguage] = {};\r\n }\r\n\r\n if (content[AppService.data.currentLanguage][code]) {\r\n var dfd = $q.defer();\r\n dfd.resolve([content[AppService.data.currentLanguage][code]]);\r\n return dfd.promise;\r\n }\r\n\r\n promises[code] = DataService.getAppContent(AppService.data.currentLanguage, [code]);\r\n promises[code].then(function (results) {\r\n\r\n content[AppService.data.currentLanguage][results[0].code] = results[0];\r\n\r\n return content[AppService.data.currentLanguage][results[0].code];\r\n\r\n }, function () {\r\n return $q.reject(false);\r\n }).finally(function () {\r\n delete promises[code];\r\n });\r\n\r\n return promises[code];\r\n };\r\n\r\n this.initialize();\r\n\r\n }]);\r\n","ft.app.service('LoginService', ['$sessionStorage', '$localStorage', '$cookieStore', '$q', 'RequestService',\r\n function ($sessionStorage, $localStorage, $cookieStore, $q, RequestService) {\r\n\r\n // token data = session token, refresh token and expire date\r\n // session token and expires is always saved in sessionstorage\r\n // refresh token and 'stay logged in' are stored in localstorage\r\n\r\n /*\r\n // First time log in\r\n User supplies username and password to log in. The user also determines if he wants to stay logged in.\r\n Username and password are used to get token data. 'Stay logged in' is stored.\r\n\r\n // Nth time log in (user opens new window, new session)\r\n Session token and expires is deleted from sessionstorage. 'Stay logged in' is questioned to determine to use refreshtoken to get new token data\r\n\r\n // Get data\r\n Use sessiontoken in header to get new data\r\n */\r\n\r\n // for now 'stay logged in' is not implemented due to 'Wet Bescherming Persoonsgegevens', therefore the refresh token is stored in session storage\r\n var storageRefreshToken = $sessionStorage;\r\n var refreshPromise;\r\n\r\n this.initialize = function () {\r\n\r\n // lets see if the user comes from an impersonation\r\n if ($cookieStore.get('impersonate')) {\r\n this.storeTokenData($cookieStore.get('impersonate'));\r\n $cookieStore.remove('impersonate');\r\n }\r\n\r\n };\r\n\r\n this.getStoredUsername = function () {\r\n return $localStorage.username;\r\n };\r\n\r\n this.wantsToStayLoggedIn = function () {\r\n return true; // $localStorage.stayLoggedIn;\r\n };\r\n\r\n this.isLoggedInAsync = function () {\r\n var that = this;\r\n\r\n return that.hasValidTokenAsync().then(\r\n function () {\r\n\r\n return true;\r\n\r\n }.bind(this),\r\n function () {\r\n\r\n // no, there isn't a valid token, try to refresh\r\n\r\n return that.hasRefreshTokenAsync().then(\r\n function () {\r\n\r\n // refresh login\r\n return that.refreshLoginAsync();\r\n\r\n }, function () {\r\n\r\n // there isn't a refresh token, user is not logged in at all\r\n return $q.reject(false);\r\n\r\n });\r\n\r\n }.bind(this));\r\n\r\n };\r\n\r\n this.hasValidTokenAsync = function () {\r\n\r\n // validates if a session token is available and determines if expires is within range\r\n\r\n var dfd = $q.defer();\r\n var token = $sessionStorage.token;\r\n\r\n if (!token) {\r\n dfd.reject(false);\r\n return dfd.promise;\r\n }\r\n\r\n var expiresOn = new Date(token.expires);\r\n var now = new Date();\r\n\r\n if (token.value != '' && expiresOn > now) {\r\n dfd.resolve(true);\r\n } else {\r\n dfd.reject(false);\r\n }\r\n\r\n return dfd.promise;\r\n\r\n };\r\n\r\n this.hasRefreshTokenAsync = function () {\r\n\r\n // validates if a refresh token is available\r\n\r\n var dfd = $q.defer();\r\n var token = storageRefreshToken.refreshToken;\r\n\r\n if (!token) {\r\n dfd.reject(false);\r\n } else {\r\n dfd.resolve(true);\r\n }\r\n\r\n return dfd.promise;\r\n\r\n };\r\n\r\n this.doLoginAsync = function (username, password, stayLoggedIn) {\r\n\r\n // use username and password to retrieve token data through dataservice\r\n $localStorage.stayLoggedIn = stayLoggedIn;\r\n $localStorage.username = username;\r\n\r\n var path = 'account/token';\r\n var b64 = window.btoa(username + ':' + password);\r\n\r\n // set header\r\n var headers = {\r\n 'Authorization': 'Basic ' + b64\r\n };\r\n\r\n return RequestService.requestAsync({\r\n path: path,\r\n headers: headers\r\n }).then(\r\n this.handleDoLogin.bind(this),\r\n this.handleDoLoginError.bind(this)\r\n );\r\n\r\n };\r\n\r\n this.handleDoLogin = function (results) {\r\n ft.app.log('login done');\r\n\r\n // succesful login\r\n this.storeTokenData(results);\r\n return true;\r\n };\r\n\r\n this.handleDoLoginError = function (response) {\r\n ft.app.log('login fail');\r\n\r\n // failed to login \r\n return handleError(response);\r\n\r\n };\r\n\r\n this.refreshLoginAsync = function () {\r\n\r\n if (refreshPromise) {\r\n return refreshPromise;\r\n }\r\n\r\n ft.app.log('refresh token');\r\n\r\n var path = 'account/token';\r\n\r\n // set header\r\n var headers = {\r\n 'Authorization': 'Bearer ' + storageRefreshToken.refreshToken\r\n };\r\n\r\n refreshPromise = RequestService.requestAsync({\r\n path: path,\r\n headers: headers\r\n }).then(\r\n this.handleRefreshLogin.bind(this),\r\n this.handleRefreshLoginError.bind(this)\r\n );\r\n\r\n return refreshPromise;\r\n\r\n };\r\n\r\n this.handleRefreshLogin = function (results) {\r\n\r\n refreshPromise = null;\r\n\r\n // new token data\r\n this.storeTokenData(results);\r\n return true;\r\n\r\n };\r\n\r\n this.handleRefreshLoginError = function (response) {\r\n\r\n refreshPromise = null;\r\n\r\n // failed to get new token data\r\n return handleError(response);\r\n\r\n };\r\n\r\n this.doImpersonateAsync = function (key, id) {\r\n\r\n var method = 'POST';\r\n var path = 'account/impersonate';\r\n var data = {id: id};\r\n\r\n // set header\r\n var headers = {\r\n 'Authorization': 'Bearer ' + key\r\n };\r\n\r\n return RequestService.requestAsync({\r\n path: path,\r\n headers: headers,\r\n method: method,\r\n data: data\r\n }).then(\r\n function (results) {\r\n\r\n $cookieStore.put('impersonate', {\r\n refreshToken: results.refreshToken,\r\n accessToken: results.accessToken,\r\n expires: results.expires\r\n });\r\n\r\n return this.handleDoLogin(results);\r\n\r\n }.bind(this),\r\n function (response) {\r\n\r\n return handleError(response);\r\n\r\n }.bind(this)\r\n );\r\n\r\n };\r\n\r\n this.doLogout = function () {\r\n\r\n $sessionStorage.token = null;\r\n storageRefreshToken.refreshToken = null;\r\n $localStorage.stayLoggedIn = false;\r\n $localStorage.username = null;\r\n\r\n };\r\n\r\n this.storeTokenData = function (data) {\r\n\r\n storageRefreshToken.refreshToken = data.refreshToken;\r\n $sessionStorage.token = {\r\n value: data.accessToken,\r\n expires: data.expires\r\n };\r\n\r\n };\r\n\r\n this.getTokenData = function () {\r\n\r\n return {\r\n refreshToken: storageRefreshToken.refreshToken,\r\n token: $sessionStorage.token\r\n };\r\n\r\n };\r\n\r\n var handleError = function (response) {\r\n\r\n var message = '';\r\n var isReadable = false;\r\n var exceptions = ft.app.exceptions.types;\r\n\r\n if (response.data.exceptionType == exceptions.invalidOperationException ||\r\n response.data.exceptionType == exceptions.providerException ||\r\n response.data.exceptionType == exceptions.unauthorizedAccessException) {\r\n isReadable = true;\r\n message = response.data.exceptionMessage;\r\n }\r\n\r\n // fail\r\n return $q.reject({\r\n result: false,\r\n isReadable: isReadable,\r\n message: message\r\n });\r\n\r\n };\r\n\r\n this.initialize();\r\n\r\n }]);","ft.app.service('ModalService',\r\n ['$rootScope', '$document', '$compile', '$controller', '$q', 'TemplateHandler',\r\n function ($rootScope, $document, $compile, $controller, $q, TemplateHandler) {\r\n\r\n var $body = $('body');\r\n var layerManager = ft.ui.managers.zIndexManager;\r\n var standardSizeClass = 'overlay-standard-size';\r\n var openClass = 'overlay-open';\r\n var modalPlaceholderClass = 'modal-placeholder';\r\n var modalClass = 'overlay';\r\n var shadowClass = 'shadow';\r\n var noTransitionClass = 'no-transition';\r\n var modalSizeAttr = 'modalSize';\r\n var query = 'screen and (max-width: 992px)';\r\n var queryHandler;\r\n\r\n function ModalService() {\r\n\r\n var self = this;\r\n\r\n self.showModal = function (options) {\r\n\r\n var closed = false;\r\n var $content = $('#content');\r\n\r\n var modalController, modalScope, modalElement;\r\n var modalElementTemplate;\r\n var closeDeferred = $q.defer();\r\n\r\n // Create a deferred we'll resolve when the modal is ready.\r\n var deferred = $q.defer();\r\n\r\n // Validate the input parameters.\r\n var controllerName = options.controller;\r\n if (!controllerName) {\r\n deferred.reject('No controller has been specified.');\r\n return deferred.promise;\r\n }\r\n\r\n var max = 1000000;\r\n var id = 'modal-' + ft.getRandom(1, max) + '-' + ft.getRandom(max * 2, max * 3);\r\n\r\n var $elm = $(options.elm || $body);\r\n var $wrapper = $('
');\r\n var $modal = $('
');\r\n var $shadow = $('
');\r\n\r\n $wrapper.attr('id', id);\r\n $elm.attr('modal', id);\r\n\r\n $wrapper.append($shadow);\r\n $wrapper.append($modal);\r\n //$content.append($shadow);\r\n $body.append($wrapper);\r\n\r\n var inputClose = function (result, delay) {\r\n delay = !delay ? 0 : delay;\r\n\r\n // Resolve the 'close' promise.\r\n closeDeferred.promise.then(close);\r\n closeDeferred.resolve(result);\r\n\r\n window.setTimeout(function () {\r\n\r\n // We can now clean up the scope and remove the element from the DOM.\r\n modalScope.$destroy();\r\n $wrapper.remove();\r\n\r\n // Unless we null out all of these objects we seem to suffer\r\n // from memory leaks, if anyone can explain why then I'd \r\n // be very interested to know. \t\t\t\t\t\r\n deferred = null;\r\n closeDeferred = null;\r\n modalElement = null;\r\n modalScope = null;\r\n }, 800);\r\n };\r\n\r\n var compile = function (results) {\r\n\r\n var template = results.data ? results.data : results;\r\n\r\n // Create a new scope for the modal.\r\n modalScope = $rootScope.$new();\r\n\r\n // Create the inputs object to the controller - this will include\r\n // the scope, as well as all inputs provided.\r\n // We will also create a deferred that is resolved with a provided\r\n // close function. The controller can then call 'close(result)'.\r\n // The controller can also provide a delay for closing - this is\r\n // helpful if there are closing animations which must finish first.\r\n\r\n var inputs = {\r\n $scope: modalScope,\r\n close: function (result, delay) {\r\n inputClose(result, delay);\r\n\r\n inputs.close = null;\r\n inputs = null;\r\n }\r\n };\r\n\r\n // If we have provided any inputs, pass them to the controller.\r\n if (options.inputs) {\r\n for (var inputName in options.inputs) {\r\n inputs[inputName] = options.inputs[inputName];\r\n }\r\n }\r\n\r\n // Parse the modal HTML into a DOM element (in template form).\r\n modalElementTemplate = ng.element(template);\r\n\r\n // Compile then link the template element, building the actual element.\r\n // Set the $element on the inputs so that it can be injected if required.\r\n modalElement = $compile(modalElementTemplate)(modalScope);\r\n inputs.$element = modalElement;\r\n\r\n // Create the controller, explicitly specifying the scope to use.\r\n modalController = $controller(controllerName, inputs);\r\n\r\n return modalElement;\r\n };\r\n\r\n // get properties from css rule for height, width and top\r\n // makes custom sizes possible, but standard is given\r\n var getSizeAndPositionFromCss = function (style) {\r\n\r\n var sheets = document.styleSheets;\r\n\r\n for (var prop in sheets) {\r\n\r\n var sheet = sheets[prop];\r\n\r\n if (sheet && sheet.href && sheet.href.indexOf(ft.app.cssFile) >= 0) {\r\n return getCssRules(sheet, style);\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n var getCssRules = function (media, style) {\r\n var obj;\r\n var rules = media.cssRules ? media.cssRules : media.rules;\r\n\r\n for (var i = 0; i < rules.length; i++) {\r\n var rule = rules[i];\r\n\r\n if (rule.type == 1 && rule.selectorText && rule.selectorText.indexOf(style) >= 0) {\r\n\r\n if (!obj) {\r\n obj = {};\r\n }\r\n\r\n ng.extend(obj, {\r\n height: rule.style.height,\r\n width: rule.style.width,\r\n top: rule.style.top\r\n });\r\n } else if (rule.type == 4 && rule.media.length && window.matchMedia(rule.media[0]).matches) {\r\n var res = getCssRules(rule, style);\r\n if (res) {\r\n if (!obj) {\r\n obj = {};\r\n }\r\n\r\n ng.extend(obj, res);\r\n }\r\n }\r\n }\r\n\r\n return obj;\r\n };\r\n\r\n var setModalSize = function () {\r\n\r\n var modalSize;\r\n if (!$modal.data(modalSizeAttr)) {\r\n modalSize = options.style ? getSizeAndPositionFromCss(options.style) : null;\r\n modalSize = modalSize || getSizeAndPositionFromCss(standardSizeClass);\r\n $modal.data(modalSizeAttr, modalSize);\r\n } else {\r\n modalSize = $modal.data(modalSizeAttr);\r\n }\r\n\r\n if (!modalSize.top) {\r\n var top = Math.floor((parseInt($body.outerHeight()) - parseInt(modalSize.height)) / 2);\r\n $modal.css('top', top + 'px');\r\n }\r\n\r\n $modal.css(modalSize);\r\n return modalSize;\r\n };\r\n\r\n // mainly closes the modal\r\n var close = function () {\r\n\r\n closed = true;\r\n\r\n layerManager.remove($shadow.css('zIndex'));\r\n layerManager.remove($modal.css('zIndex'));\r\n\r\n var scrollTop = $body.scrollTop();\r\n var position = $elm.offset();\r\n\r\n //$elm.removeClass(openClass);\r\n $wrapper.removeClass(openClass);\r\n //$shadow.removeClass(openClass);\r\n\r\n $modal.css('top', (position.top - scrollTop) + 'px');\r\n $modal.css('left', position.left + 'px');\r\n $modal.css('right', ($body.outerWidth() - (position.left + $elm.outerWidth())) + 'px');\r\n $modal.css('width', $elm.outerWidth() + 'px');\r\n $modal.css('height', $elm.outerHeight() + 'px');\r\n\r\n //enquire.unregister(query, queryHandler);\r\n\r\n return;\r\n setTimeout(function () {\r\n $wrapper.css('display', 'none');\r\n }, 800);\r\n };\r\n\r\n // Get the actual html of the template.\r\n var url = ft.app.getTemplateUrl(options.templateUrl);\r\n TemplateHandler.get(url)\r\n .then(compile)\r\n .then(function (result) {\r\n\r\n var scrollTop = $body.scrollTop();\r\n var position = $elm.offset();\r\n position.left = parseInt(position.left);\r\n position.top = parseInt(position.top);\r\n\r\n $modal.append(result);\r\n\r\n // We now have a modal object...\r\n var modal = {\r\n controller: modalController,\r\n scope: modalScope,\r\n element: modalElement,\r\n close: closeDeferred.promise\r\n };\r\n\r\n $modal.addClass(noTransitionClass);\r\n $modal.css('left', position.left + 'px');\r\n $modal.css('right', ($body.outerWidth() - (position.left + $elm.outerWidth())) + 'px');\r\n $modal.css('top', (position.top - scrollTop) + 'px');\r\n $modal.css('width', $elm.outerWidth() + 'px');\r\n $modal.css('height', $elm.outerHeight() + 'px');\r\n $modal.removeClass(noTransitionClass);\r\n\r\n $shadow.css('zIndex', layerManager.index);\r\n $modal.css('zIndex', layerManager.index);\r\n\r\n //$wrapper.css('display', 'block');\r\n $shadow.on('click', inputClose);\r\n\r\n setTimeout(function () {\r\n //$elm.addClass(openClass);\r\n $wrapper.addClass(openClass);\r\n //$shadow.addClass(openClass);\r\n\r\n queryHandler = {\r\n match: function () {\r\n // it looks like if this call can be in the method 'setModalSize', but it doesn't\r\n // we want this to have it in cache when reopen window\r\n $modal.data(modalSizeAttr, '');\r\n setModalSize();\r\n },\r\n unmatch: function () {\r\n if (closed) {\r\n return;\r\n }\r\n\r\n $modal.data(modalSizeAttr, '');\r\n setModalSize();\r\n }\r\n };\r\n\r\n //enquire.register(query, queryHandler);\r\n setModalSize();\r\n\r\n }, 400);\r\n\r\n // ...which is passed to the caller via the promise.\r\n deferred.resolve(modal);\r\n\r\n })\r\n .catch(function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n return deferred.promise;\r\n };\r\n\r\n }\r\n\r\n return new ModalService();\r\n\r\n }]);","ft.app.service('RequestService', ['$http', '$q', '$timeout', '$sessionStorage', '$rootScope',\r\n function ($http, $q, $timeout, $sessionStorage, $rootScope) {\r\n\r\n this.requests = 0;\r\n\r\n $rootScope.$on(ft.app.events.requests.add, function () {\r\n\r\n this.requests++;\r\n $rootScope.$broadcast(ft.app.events.requests.active);\r\n\r\n }.bind(this));\r\n\r\n $rootScope.$on(ft.app.events.requests.remove, function () {\r\n\r\n this.requests--;\r\n\r\n // this cannot be true, but better to be sure\r\n if (this.requests < 0) {\r\n this.requests = 0;\r\n }\r\n\r\n if (this.requests == 0) {\r\n $rootScope.$broadcast(ft.app.events.requests.none);\r\n }\r\n\r\n }.bind(this));\r\n\r\n // base function to do a request\r\n this.requestAsync = function (request, useAuthorization) {\r\n\r\n var dfd = $q.defer();\r\n var url = request.url || ft.app.baseApiUrl;\r\n url += request.path;\r\n url = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'rnd=' + ft.getRandom();\r\n var headers = request.headers || {};\r\n\r\n if (useAuthorization) {\r\n headers = ng.extend(headers, {\r\n 'Authorization': 'Bearer ' + $sessionStorage.token.value\r\n });\r\n }\r\n\r\n if (request.method && (request.method == 'POST' || request.method == 'DELETE')) {\r\n headers = ng.extend(headers, {\r\n 'Content-Type': 'application/json'\r\n });\r\n }\r\n\r\n $rootScope.$broadcast(ft.app.events.requests.add);\r\n\r\n $http({\r\n headers: headers,\r\n url: url,\r\n method: request.method || 'GET',\r\n data: request.data || {}\r\n }).then(\r\n function (response) {\r\n // done\r\n dfd.resolve(response.data);\r\n $rootScope.$broadcast(ft.app.events.requests.remove);\r\n },\r\n function (response) {\r\n // fail\r\n dfd.reject(response);\r\n $rootScope.$broadcast(ft.app.events.requests.remove);\r\n });\r\n\r\n return dfd.promise;\r\n\r\n };\r\n\r\n }]);","ft.app.factory('TemplateHandler', ['$http', '$templateCache', function ($http, $templateCache) {\r\n return {\r\n get: function (path) {\r\n return $http.get(path, {cache: $templateCache});\r\n }\r\n };\r\n}]);\r\n","ft.app.config(['uibDatepickerPopupConfig', function (uibDatepickerPopupConfig) {\r\n uibDatepickerPopupConfig.closeText = 'Sluiten';\r\n uibDatepickerPopupConfig.currentText = 'Vandaag';\r\n uibDatepickerPopupConfig.clearText = 'Wis';\r\n}]);","ft.defineNamespace('FortyTwo.dates');\r\n\r\nft.dates.compare = function (a, b) {\r\n\r\n var aDate = new Date(a);\r\n var bDate = new Date(b);\r\n\r\n if (aDate < bDate) {\r\n return -1;\r\n }\r\n if (aDate > bDate) {\r\n return 1;\r\n }\r\n return 0;\r\n\r\n};\r\n\r\nft.dates.isDateInFuture = function (date, includeToday) {\r\n var input = new Date(date).setHours(0, 0, 0, 0);\r\n var today = new Date().setHours(0, 0, 0, 0);\r\n\r\n if (includeToday) {\r\n return input >= today;\r\n } else {\r\n return input > today;\r\n }\r\n};\r\n\r\nDate.getFirstPossible = function (possibles, date) {\r\n\r\n var i;\r\n\r\n var today = date ? new Date(date) : new Date();\r\n today.setHours(0, 0, 0, 0); // only check date, not time\r\n\r\n var result = date ? new Date(date) : new Date();\r\n result.setHours(0, 0, 0, 0); // only check date, not time\r\n\r\n for (i = 0; i < possibles.length; i++) {\r\n result.setDate(possibles[i]);\r\n\r\n // date found where result is later then today\r\n if (today < result) {\r\n return result;\r\n }\r\n\r\n // didn't found a first possible this month, check next month and reset possibles\r\n if (i == possibles.length - 1) {\r\n result.setMonth(result.getMonth() + 1);\r\n i = -1;\r\n }\r\n }\r\n\r\n\r\n};\r\n","ft.defineNamespace('FortyTwo.ui.managers');\r\n\r\nft.ui.managers.zIndexManager = (function () {\r\n\r\n var _start = 1000;\r\n var _stack = [_start];\r\n\r\n var mngr = function () {\r\n };\r\n\r\n mngr.prototype = {\r\n get index() {\r\n\r\n _stack.push(_stack[_stack.length - 1] + 1);\r\n return _stack[_stack.length - 1];\r\n\r\n },\r\n get stack() {\r\n return _stack;\r\n }\r\n };\r\n\r\n mngr.prototype.remove = function (index) {\r\n\r\n for (var i = _stack.length - 1; i > 0; i--) {\r\n if (_stack[i] == index) {\r\n _stack.splice(i, 1);\r\n }\r\n }\r\n\r\n };\r\n\r\n return new mngr();\r\n\r\n})();\r\n","export class NetworkUtils {\r\n public static getTenantFromUrl(url: string): string | null {\r\n const tenantRegex = /(?:(?:groep|backoffice|ouder|vervoer)-)?([a-z-0-9]+)\\.kindplanner.nl/i;\r\n const match = tenantRegex.exec(url);\r\n if (match != null) {\r\n return match[1];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public static createBackOfficeApiUrl(tenant: string): string {\r\n return `https://backoffice-${tenant}.kindplanner.nl/api/`;\r\n }\r\n\r\n public static getQueryParam(param: string): string {\r\n const regex = /([a-z]+)=([a-z0-9:/%.-]+)/ig;\r\n const search = window.location.href;\r\n param = param.toLowerCase();\r\n\r\n let match: RegExpExecArray;\r\n\r\n do {\r\n match = regex.exec(search);\r\n if (match != null) {\r\n const queryParam = match[1]?.toLowerCase();\r\n const queryValue = match[2];\r\n if (queryParam == param) {\r\n return decodeURIComponent(queryValue);\r\n }\r\n }\r\n } while (match != null);\r\n\r\n return null;\r\n }\r\n}\r\n","import { NetworkUtils } from '@js/network-utils';\r\n\r\nft.app = ng.module('parentportal', [\r\n 'ui.router', 'ui.bootstrap', 'ngAnimate', 'ngStorage', 'ngCookies', 'ngSanitize', 'pascalprecht.translate',\r\n 'ng-mfb', 'perfect_scrollbar', 'checklist-model', 'luegg.directives', 'ngBootstrapLightbox'\r\n ]);\r\n\r\nft.app.cssFile = 'main.css';\r\nft.app.baseUrl = '';\r\nft.app.baseTemplateUrl = '/partials/';\r\nft.app.baseApiUrl = ft.app.baseUrl + 'api/';\r\nft.app.mainBackgroundImageUrl = '';\r\n\r\nft.app.secondaryApiUrl = '';\r\n\r\nft.app.datetime = {\r\n zone: 'Europe/Amsterdam',\r\n offset: moment().isDST() ? '+02:00' : '+01:00',\r\n locale: 'nl',\r\n formats: {\r\n default: 'dd. DD MMM',\r\n toAPIDate: 'YYYY-MM-DD',\r\n toAPITime: 'HH:mm'\r\n }\r\n};\r\n\r\nft.app.gender = {\r\n male: 'male',\r\n female: 'female'\r\n};\r\n\r\nft.app.family = {\r\n roles: {\r\n 'responsible': 'responsible',\r\n 'parent': 'parent',\r\n 'fetcher': 'fetcher'\r\n },\r\n types: {\r\n child: 'child',\r\n member: 'parent'\r\n },\r\n images: {\r\n girl: '/assets/girl.png',\r\n boy: '/assets/boy.png',\r\n woman: '/assets/woman.png',\r\n men: '/assets/man.png'\r\n }\r\n\r\n};\r\n\r\nft.app.planning = {\r\n days: {\r\n normal: 'normal',\r\n closed: 'closed',\r\n holiday: 'holiday'\r\n },\r\n states: {\r\n approved: 'approved',\r\n requested: 'requested',\r\n requestable: 'requestable',\r\n rejected: 'rejected'\r\n },\r\n types: {\r\n planning: 'chiPlanning',\r\n absent: 'chiAfwezig',\r\n vacation: 'chiVakantieperiode',\r\n study: 'chiStudiedag',\r\n incidental: 'chiIncidenteleOpvang',\r\n swap: 'chiRuildag',\r\n registration: 'chiRegistration'\r\n },\r\n presence: {\r\n absent: 'absent',\r\n present: 'present',\r\n sick: 'sick',\r\n holiday: 'holiday',\r\n other: 'other',\r\n traded: 'traded'\r\n },\r\n registrations:\r\n {\r\n unknown: 'unknown',\r\n incidental: 'incidental',\r\n swap: 'swapday',\r\n studyday: 'studyday',\r\n beforecontract: 'beforeContract'\r\n }\r\n};\r\n\r\nft.app.messages = {\r\n directions: {\r\n in: 'in',\r\n out: 'out'\r\n }\r\n};\r\n\r\nft.app.contactInformation = {\r\n types: {\r\n phone: 'telephone',\r\n mobile: 'mobile',\r\n email: 'email'\r\n },\r\n categories: {\r\n home: 'home',\r\n work: 'work',\r\n invoice: 'invoice'\r\n }\r\n};\r\n\r\nft.app.activities = {\r\n keys: {\r\n activity: 'activity',\r\n video: 'film',\r\n report: 'report',\r\n photoalbum: 'photoalbum',\r\n own: 'own-cat',\r\n parents: 'parents'\r\n },\r\n types: {\r\n puzzle: 'puzzle',\r\n music: 'music',\r\n gaming: 'gaming',\r\n cooking: 'cooking',\r\n yoga: 'yoga'\r\n },\r\n images: {\r\n puzzle: 'https://tt3securecontent.tik-tik.nl/go/ci_cms/uploads/icons/puzzel_invert.png',\r\n music: 'https://tt3securecontent.tik-tik.nl/go/ci_cms/uploads/icons/muziek_invert.png',\r\n gaming: 'https://tt3securecontent.tik-tik.nl/go/ci_cms/uploads/icons/gamen_invert.png',\r\n cooking: 'https://tt3securecontent.tik-tik.nl/go/ci_cms/uploads/icons/koken_invert.png',\r\n yoga: 'https://tt3securecontent.tik-tik.nl/go/ci_cms/uploads/icons/yoga_invert.png'\r\n }\r\n};\r\n\r\nft.app.media = {\r\n types: {\r\n image: 'image',\r\n video: 'video'\r\n }\r\n};\r\n\r\nft.app.document = {\r\n types: {\r\n annualStatement: 'annualStatement',\r\n invoice: 'invoice',\r\n general: 'document',\r\n contract: 'contract'\r\n }\r\n};\r\n\r\nft.app.contract = {\r\n states: {\r\n active: 'active',\r\n offered: 'offered',\r\n sign: 'sign',\r\n approved: 'approved',\r\n received: 'received',\r\n rejected: 'rejected',\r\n cancelled: 'cancelled',\r\n ended: 'ended'\r\n },\r\n packages: {\r\n stripCard: 'strippenkaart'\r\n }\r\n};\r\n\r\nft.app.care = {\r\n types: {\r\n daycare: 'daycare',\r\n outOfSchool: 'outOfSchoolCare',\r\n playSchool: 'playSchool',\r\n holiday: 'holidayCare'\r\n }\r\n};\r\n\r\nft.app.holidayBalance = {\r\n type: {\r\n requestNew: 'requestNew',\r\n incidental: 'incidental'\r\n }\r\n};\r\n\r\nft.app.settings = {\r\n keys: {\r\n language: 'language'\r\n }\r\n};\r\n\r\nft.app.events = {\r\n requests: {\r\n add: 'add',\r\n remove: 'remove',\r\n active: 'active',\r\n none: 'none'\r\n },\r\n login: {\r\n success: 'login.success'\r\n },\r\n family: {\r\n get: 'family.get'\r\n },\r\n app: {\r\n config: 'config'\r\n }\r\n};\r\n\r\nft.app.exceptions = {\r\n types: {\r\n invalidOperationException: 'System.InvalidOperationException',\r\n providerException: 'System.Configuration.Provider.ProviderException',\r\n unauthorizedAccessException: 'System.UnauthorizedAccessException'\r\n }\r\n};\r\n\r\n/*\r\n * Purpose: encapsulates the console methods and outputs only if DEBUG is true\r\n * Usage:\r\n *\r\n * ft.app.log([string], object|boolean|string|number|array|etc);\r\n * ft.app.log('info', [string], object|boolean|string|number|array|etc);\r\n * ft.app.log('warn', [string], object|boolean|string|number|array|etc);\r\n * ft.app.log('error', [string], object|boolean|string|number|array|etc);\r\n *\r\n */\r\nft.app.log = function () {\r\n\r\n if (!FortyTwo.DEBUG || !arguments.length) {\r\n return;\r\n }\r\n\r\n var fnc = 'log';\r\n var type = arguments[0];\r\n\r\n if (typeof (type) == 'string' && type.search(/^info|warn|error$/i) >= 0) {\r\n [].shift.apply(arguments);\r\n fnc = type;\r\n }\r\n\r\n console[fnc].apply(console, arguments);\r\n\r\n};\r\n\r\nft.app.getTemplateUrl = function (urlPart) {\r\n return ft.app.baseTemplateUrl + urlPart + '.html?v=' + ft.randomNumber;\r\n};\r\n\r\nft.app.config(['$compileProvider', '$stateProvider', 'uibDatepickerConfig', '$sceDelegateProvider', '$translateProvider',\r\n function ($compileProvider, $stateProvider, uibDatepickerConfig, $sceDelegateProvider, $translateProvider) {\r\n\r\n uibDatepickerConfig.startingDay = 1;\r\n\r\n if (!ft.DEBUG) {\r\n $compileProvider.debugInfoEnabled(false);\r\n }\r\n\r\n const tenant = NetworkUtils.getTenantFromUrl(window.location.host);\r\n\r\n if (tenant != null) {\r\n ft.app.baseUrl = `https://backoffice-${tenant}.kindplanner.nl/`;\r\n ft.app.baseApiUrl = ft.app.baseUrl + 'api/';\r\n } else {\r\n let storedUrl = localStorage.getItem('ngStorage-apiUrl');\r\n if (storedUrl) {\r\n ft.app.baseApiUrl = JSON.parse(storedUrl);\r\n }\r\n }\r\n\r\n // api url\r\n const apiParam = NetworkUtils.getQueryParam('api');\r\n if (apiParam != null) {\r\n ft.app.baseApiUrl = apiParam;\r\n localStorage.setItem('ngStorage-apiUrl', JSON.stringify(ft.app.baseApiUrl));\r\n }\r\n\r\n ft.app.mainBackgroundImageUrl = ft.app.baseUrl + 'images/ChildCare_background.jpg';\r\n\r\n $sceDelegateProvider.resourceUrlWhitelist([\r\n // Allow same origin resource loads.\r\n 'self',\r\n // Allow loading from our assets domain. Notice the difference between * and **.\r\n 'http://*.local/**',\r\n 'https://*.local/**',\r\n 'http://*.42windmills.com/**',\r\n 'https://*.scoolsuite.com/**'\r\n ]);\r\n\r\n $translateProvider.useSanitizeValueStrategy('sanitize');\r\n\r\n $translateProvider\r\n .useStaticFilesLoader({\r\n prefix: '/translations/local-',\r\n suffix: '.json'\r\n })\r\n .preferredLanguage('nl');\r\n\r\n var appContent = {\r\n name: 'app',\r\n url: '/app',\r\n abstract: true,\r\n views: {\r\n 'main': {\r\n templateUrl: ft.app.getTemplateUrl('app/content'),\r\n controller: 'appContentController'\r\n }\r\n }\r\n };\r\n\r\n //#region non app content\r\n\r\n //#region login\r\n\r\n var login = {\r\n name: 'login',\r\n url: '/login?lang',\r\n pageTracker: 'login',\r\n views: {\r\n 'main': {\r\n templateUrl: ft.app.getTemplateUrl('app/login'),\r\n controller: 'loginController'\r\n }\r\n }\r\n };\r\n\r\n var gotoapp = {\r\n name: 'gotoapp',\r\n url: '/gotoapp',\r\n pageTracker: 'gotoapp',\r\n views: {\r\n 'main': {\r\n templateUrl: ft.app.getTemplateUrl('app/gotoapp'),\r\n controller: 'gotoappController'\r\n }\r\n }\r\n };\r\n\r\n\r\n //#endregion\r\n\r\n //#region registration\r\n\r\n var registration = {\r\n name: 'registration',\r\n url: '/registration',\r\n abstract: true,\r\n views: {\r\n 'main': {\r\n templateUrl: ft.app.getTemplateUrl('family/registration'),\r\n controller: 'dummyController'\r\n }\r\n }\r\n };\r\n\r\n var introductionRegistration = {\r\n name: 'registration.introduction',\r\n url: '/introduction?lang',\r\n pageTracker: 'registration/introduction',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('family/registration-introduction'),\r\n controller: 'registrationIntroductionController'\r\n }\r\n },\r\n data: {\r\n newRegistration: true\r\n }\r\n };\r\n\r\n var newRegistration = {\r\n name: 'registration.new',\r\n url: '/new?lang',\r\n pageTracker: 'registration/new',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('family/add-child'),\r\n controller: 'familyAddChildController'\r\n }\r\n },\r\n data: {\r\n newRegistration: true\r\n }\r\n };\r\n\r\n //#endregion\r\n\r\n //#region impersonate\r\n\r\n var impersonate = {\r\n name: 'impersonate',\r\n url: '/impersonate?accesskey&id',\r\n pageTracker: 'impersonate',\r\n views: {\r\n 'main': {\r\n templateUrl: ft.app.getTemplateUrl('impersonate/index'),\r\n controller: 'impersonateController'\r\n }\r\n }\r\n };\r\n\r\n //#endregion\r\n\r\n //#region set password\r\n\r\n var setPassword = {\r\n name: 'setPassword',\r\n url: '/setpassword?accesskey&lang&isfromapp',\r\n pageTracker: 'setpassword',\r\n views: {\r\n 'main': {\r\n templateUrl: ft.app.getTemplateUrl('user/setpassword'),\r\n controller: 'setPasswordController'\r\n }\r\n }\r\n };\r\n\r\n //#endregion\r\n\r\n //#region logout\r\n\r\n var logout = {\r\n name: 'logout',\r\n url: '/logout',\r\n pageTracker: 'logout',\r\n views: {\r\n 'main': {\r\n templateUrl: ft.app.getTemplateUrl('abstract'),\r\n controller: 'logoutController'\r\n }\r\n }\r\n };\r\n\r\n //#endregion\r\n\r\n //#endregion\r\n\r\n //#region app\r\n\r\n var start = {\r\n name: 'app.start',\r\n url: '/start',\r\n pageTracker: 'start',\r\n views: {\r\n 'content': {\r\n templateUrl: ft.app.getTemplateUrl('app/dashboard'),\r\n controller: 'appDashboardController'\r\n }\r\n }\r\n };\r\n\r\n var help = {\r\n name: 'app.help',\r\n url: '/help',\r\n pageTracker: 'help',\r\n views: {\r\n 'content': {\r\n templateUrl: ft.app.getTemplateUrl('app/help'),\r\n controller: 'helpDashboardController'\r\n }\r\n }\r\n };\r\n\r\n var documents = {\r\n name: 'app.documents',\r\n url: '/documents',\r\n pageTracker: 'documents',\r\n views: {\r\n 'content': {\r\n templateUrl: ft.app.getTemplateUrl('documents/list'),\r\n controller: 'documentsController'\r\n }\r\n }\r\n };\r\n\r\n var financial = {\r\n name: 'app.financial',\r\n url: '/financial',\r\n pageTracker: 'financial',\r\n views: {\r\n 'content': {\r\n templateUrl: ft.app.getTemplateUrl('financial/overview'),\r\n controller: 'financialOverviewController'\r\n }\r\n }\r\n };\r\n\r\n var parentApp = {\r\n name: 'app.parentApp',\r\n url: '/parent-app',\r\n pageTracker: 'parent-app',\r\n views: {\r\n 'content': {\r\n templateUrl: ft.app.getTemplateUrl('app/parent-app'),\r\n controller: 'loginController'\r\n }\r\n }\r\n };\r\n\r\n //#endregion\r\n\r\n //#region child\r\n\r\n // pageheader\r\n var childProfile = {\r\n name: 'app.child',\r\n url: '/child/{child}',\r\n abstract: true,\r\n views: {\r\n 'content': {\r\n templateUrl: ft.app.getTemplateUrl('child/profile'),\r\n controller: 'childProfileController'\r\n }\r\n }\r\n };\r\n\r\n var childEdit = {\r\n name: 'app.child.edit',\r\n url: '/edit',\r\n pageTracker: 'child/edit',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('child/edit'),\r\n controller: 'childEditController'\r\n }\r\n }\r\n };\r\n\r\n var childPlanningList = {\r\n name: 'app.child.planninglist',\r\n url: '/planning/list?year&month',\r\n pageTracker: 'child/planning/list',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('planning/list'),\r\n controller: 'planningListController'\r\n }\r\n }\r\n };\r\n\r\n var childPlanningItem = {\r\n name: 'app.child.planningitem',\r\n url: '/planning/item/{item}',\r\n pageTracker: 'child/planning/item',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('planning/item'),\r\n controller: 'planningItemController'\r\n }\r\n }\r\n };\r\n\r\n var childMessages = {\r\n name: 'app.child.messages',\r\n url: '/messages',\r\n pageTracker: 'child/messages',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('child/messages'),\r\n controller: 'messagesController'\r\n }\r\n }\r\n };\r\n\r\n var childSpecificMessage = {\r\n name: 'app.child.messagesSpecific',\r\n url: '/messages/{message}',\r\n pageTracker: 'child/messages/message',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('child/messages'),\r\n controller: 'messagesController'\r\n }\r\n }\r\n };\r\n\r\n var childMedialibrary = {\r\n name: 'app.child.medialibrary',\r\n url: '/medialibrary',\r\n pageTracker: 'child/media',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('child/medialibrary'),\r\n controller: 'medialibraryController'\r\n }\r\n }\r\n };\r\n\r\n var childInfo = {\r\n name: 'app.child.info',\r\n url: '/info?success',\r\n pageTracker: 'child/info',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('child/info'),\r\n controller: 'childInfoController'\r\n }\r\n }\r\n };\r\n\r\n var childDocuments = {\r\n name: 'app.child.documents',\r\n url: '/documents',\r\n pageTracker: 'child/documents',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('child/documents'),\r\n controller: 'childDocumentsController'\r\n }\r\n }\r\n };\r\n\r\n var childContracts = {\r\n name: 'app.child.contracts',\r\n url: '/contracts',\r\n pageTracker: 'child/contracts',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('child/contracts'),\r\n controller: 'childContractsController'\r\n }\r\n }\r\n };\r\n\r\n var childActivities = {\r\n name: 'app.child.activities',\r\n url: '/activities',\r\n pageTracker: 'child/activities',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('child/activities'),\r\n controller: 'childActivitiesController'\r\n }\r\n }\r\n };\r\n\r\n var childUploadProfilePicture = {\r\n name: 'app.child.upload-profile-picture',\r\n url: '/uploadprofilepicture',\r\n pageTracker: 'child/uploadpicture',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('family/uploadprofileimage'),\r\n controller: 'familyUploadProfilePictureController'\r\n }\r\n }\r\n };\r\n\r\n var childRequests = {\r\n name: 'app.child.requests',\r\n url: '/requests',\r\n pageTracker: 'child/requests',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('child/requests'),\r\n controller: 'childRequestsController'\r\n }\r\n }\r\n };\r\n\r\n //#endregion\r\n\r\n //#region users\r\n\r\n // page header\r\n var userProfile = {\r\n name: 'app.user',\r\n url: '/user/{user}',\r\n abstract: true,\r\n views: {\r\n 'content': {\r\n templateUrl: ft.app.getTemplateUrl('user/profile'),\r\n controller: 'userProfileController'\r\n }\r\n }\r\n };\r\n\r\n var userInfo = {\r\n name: 'app.user.info',\r\n url: '/info?success',\r\n pageTracker: 'user/info',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('user/info'),\r\n controller: 'userInfoController'\r\n }\r\n }\r\n };\r\n\r\n var userEdit = {\r\n name: 'app.user.edit',\r\n url: '/edit',\r\n pageTracker: 'user/edit',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('family/add-user'),\r\n controller: 'familyAddUserController'\r\n }\r\n }\r\n };\r\n\r\n var userPasswordChange = {\r\n name: 'app.user.passwordchange',\r\n url: '/passwordchange',\r\n pageTracker: 'user/passwordchange',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('user/passwordchange'),\r\n controller: 'userPasswordchangeController'\r\n }\r\n }\r\n };\r\n\r\n var userUploadProfilePicture = {\r\n name: 'app.user.upload-profile-picture',\r\n url: '/uploadprofilepicture',\r\n pageTracker: 'user/uploadpicture',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('family/uploadprofileimage'),\r\n controller: 'familyUploadProfilePictureController'\r\n }\r\n }\r\n };\r\n\r\n //#endregion\r\n\r\n //#region family\r\n\r\n // family is in first release an entry to or child profile or user profile and to add children or users\r\n\r\n var family = {\r\n name: 'app.family',\r\n url: '/family',\r\n abstract: true,\r\n views: {\r\n 'content': {\r\n templateUrl: ft.app.getTemplateUrl('family/overall'),\r\n controller: 'familyController'\r\n }\r\n }\r\n };\r\n\r\n var familyList = {\r\n name: 'app.family.list',\r\n url: '/list?success',\r\n pageTracker: 'family/list',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('family/list'),\r\n controller: 'familyListController'\r\n }\r\n }\r\n };\r\n\r\n var familyAddChild = {\r\n name: 'app.family.add-child',\r\n url: '/add/child?step',\r\n pageTracker: 'child/add',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('family/add-child'),\r\n controller: 'familyAddChildController'\r\n }\r\n }\r\n };\r\n\r\n var familyAddUser = {\r\n name: 'app.family.add-user',\r\n url: '/add/user',\r\n pageTracker: 'user/add',\r\n views: {\r\n '': {\r\n templateUrl: ft.app.getTemplateUrl('family/add-user'),\r\n controller: 'familyAddUserController'\r\n }\r\n }\r\n };\r\n\r\n //#endregion\r\n\r\n //#region locations\r\n\r\n // NOT FOR FIRST RELEASE\r\n\r\n /*\r\n\r\n var locations = {\r\n name: 'locations',\r\n url: '/locations',\r\n views: {\r\n 'main@': {\r\n templateUrl: ft.app.getTemplateUrl('locations/dashboard'),\r\n controller: 'locationsController'\r\n }\r\n }\r\n };\r\n\r\n */\r\n\r\n //#endregion\r\n\r\n // non app content\r\n $stateProvider.state(login);\r\n $stateProvider.state(gotoapp);\r\n $stateProvider.state(registration);\r\n $stateProvider.state(introductionRegistration);\r\n $stateProvider.state(newRegistration);\r\n $stateProvider.state(impersonate);\r\n $stateProvider.state(setPassword);\r\n $stateProvider.state(parentApp);\r\n $stateProvider.state(logout);\r\n\r\n // app\r\n $stateProvider.state(appContent);\r\n $stateProvider.state(start);\r\n $stateProvider.state(help);\r\n $stateProvider.state(documents);\r\n $stateProvider.state(financial);\r\n\r\n // child\r\n $stateProvider.state(childProfile);\r\n $stateProvider.state(childPlanningList);\r\n $stateProvider.state(childPlanningItem);\r\n $stateProvider.state(childMessages);\r\n $stateProvider.state(childSpecificMessage);\r\n $stateProvider.state(childMedialibrary);\r\n $stateProvider.state(childInfo);\r\n $stateProvider.state(childDocuments);\r\n $stateProvider.state(childContracts);\r\n $stateProvider.state(childActivities);\r\n $stateProvider.state(childEdit);\r\n $stateProvider.state(childUploadProfilePicture);\r\n $stateProvider.state(childRequests);\r\n\r\n // user\r\n $stateProvider.state(userProfile);\r\n $stateProvider.state(userInfo);\r\n $stateProvider.state(userPasswordChange);\r\n $stateProvider.state(userEdit);\r\n $stateProvider.state(userUploadProfilePicture);\r\n\r\n // family\r\n $stateProvider.state(family);\r\n $stateProvider.state(familyList);\r\n $stateProvider.state(familyAddChild);\r\n $stateProvider.state(familyAddUser);\r\n\r\n }]); // app config\r\n","export class UrlHelper {\r\n public static isUrlAbsolute(url: string): boolean {\r\n return new RegExp('^(?:[a-z]+:)?//', 'i').test(url);\r\n }\r\n \r\n public static createAbsoluteMediaUrl(mediaServiceUrl: string, relativeUrl: string): string {\r\n\r\n const tenantPart = mediaServiceUrl.lastIndexOf(\"/\");\r\n\r\n mediaServiceUrl = mediaServiceUrl.substring(0, tenantPart);\r\n\r\n return `${mediaServiceUrl}/${relativeUrl}`;\r\n }\r\n}","import {UrlHelper} from '@js/urlHelper';\r\n\r\nft.app.controller('dummyController', function () {\r\n});\r\n\r\nft.app.controller('dummyModalController',\r\n ['$scope', 'close',\r\n function ($scope, close) {\r\n\r\n $scope.close = function () {\r\n close();\r\n };\r\n\r\n }]);\r\n\r\nft.app.controller('appController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$location', '$timeout', 'AppService', 'LoginService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $location, $timeout, AppService, LoginService) {\r\n\r\n var offEventsActive, offEventsClear;\r\n\r\n $scope.isInitialized = false;\r\n $scope.showSplash = true;\r\n $scope.isLoading = false;\r\n $scope.hasConnection = true;\r\n $scope.supported = !ft.browser || ft.browser >= 10; // non IE or IE >= 10\r\n $scope.backgroundImageUrl = ft.app.mainBackgroundImageUrl;\r\n\r\n //#region init\r\n\r\n var initialize = function () {\r\n\r\n if ($scope.isInitialized) {\r\n return;\r\n }\r\n\r\n offEventsActive = $rootScope.$on(ft.app.events.requests.active, handleEventsActive);\r\n offEventsClear = $rootScope.$on(ft.app.events.requests.none, handleEventsClear);\r\n $scope.$on('$destroy', handleDestroy);\r\n\r\n getData();\r\n\r\n $scope.isInitialized = true;\r\n\r\n };\r\n\r\n var initRoute = function () {\r\n\r\n // if logged in and then refresh\r\n // preserve pre-login states, like registration and set password\r\n\r\n if ($state.current.name == '') {\r\n\r\n var url = $location.absUrl();\r\n var qs = null;\r\n\r\n // set url to obj with key > value\r\n if (url.indexOf('?') >= 0) {\r\n\r\n var arr = url.split('?')[1].split('#')[0].split('&');\r\n\r\n qs = arr.reduce(function (obj, part, idx) {\r\n\r\n var key = part.split('=')[0].toLowerCase();\r\n var val = decodeURIComponent(part.split('=')[1]);\r\n\r\n obj[key] = val;\r\n\r\n return obj;\r\n\r\n }, {});\r\n\r\n }\r\n\r\n // determine mode\r\n if (qs && qs.action) {\r\n\r\n switch (qs.action.toLowerCase()) {\r\n case 'registration':\r\n $state.go('registration.new');\r\n break;\r\n case 'impersonate':\r\n window.location.href = $state.href('impersonate', {\r\n accesskey: qs.accesskey,\r\n id: qs.id\r\n }, {reload: true});\r\n break;\r\n case 'setpassword':\r\n window.location.href = $state.href('setPassword', {accesskey: qs.accesskey}, {absolute: true});\r\n break;\r\n default:\r\n $state.go('login');\r\n }\r\n\r\n } else {\r\n\r\n LoginService.isLoggedInAsync().then(\r\n function () {\r\n $state.go('app.start');\r\n },\r\n function () {\r\n // trim ending slash\r\n if (window.location.origin == window.location.href.slice(0, -1)) {\r\n $state.go('login');\r\n }\r\n }\r\n );\r\n\r\n }\r\n\r\n } else if ($state.current.name.indexOf('app.') == 0) {\r\n LoginService.isLoggedInAsync().then(\r\n function () {\r\n },\r\n function () {\r\n $state.go('login');\r\n }\r\n );\r\n }\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n //#region get data\r\n\r\n var getData = function () {\r\n\r\n $scope.isLoading = true;\r\n\r\n var prm = AppService.getConfigAsync();\r\n prm.then(handleGetConfig, handleGetConfigError);\r\n prm.finally(function () {\r\n $scope.isLoading = false;\r\n });\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n //#region handlers\r\n\r\n var handleGetConfig = function (results) {\r\n\r\n $scope.showSplash = false;\r\n initRoute();\r\n\r\n };\r\n\r\n var handleGetConfigError = function (response) {\r\n };\r\n\r\n var handleEventsActive = function () {\r\n $scope.isLoading = true;\r\n };\r\n\r\n var handleEventsClear = function () {\r\n $scope.isLoading = false;\r\n };\r\n\r\n var handleDestroy = function () {\r\n\r\n if (offEventsActive) {\r\n offEventsActive();\r\n }\r\n if (offEventsClear) {\r\n offEventsClear();\r\n }\r\n\r\n };\r\n\r\n //#endregion\r\n\r\n $timeout(initialize);\r\n\r\n }\r\n ]);\r\n\r\nft.app.controller('confirmModalController',\r\n ['$scope', '$element', 'close', 'question', '$timeout',\r\n function ($scope, $element, close, question, $timeout) {\r\n\r\n var initialized = false;\r\n\r\n $scope.data = {\r\n question: question,\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.close = function (confirmed) {\r\n close({\r\n confirmed: confirmed\r\n });\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }]);","export enum AlbumType {\r\n none = 'none',\r\n new = 'new'\r\n}\r\n\r\nexport enum TypeOfAudience {\r\n parentOfChild = 'parentOfChild',\r\n parentsOfAllChildren = 'parentsOfAllChildren',\r\n group = 'group'\r\n}\r\n\r\nexport interface WriteAudienceGroup {\r\n name: string;\r\n audienceType: TypeOfAudience;\r\n audiences: WriteAudience[];\r\n}\r\n\r\nexport interface WriteAudience {\r\n id: string;\r\n name: string;\r\n picture: MediaReference;\r\n isAllAudience: boolean;\r\n checked: boolean | undefined;\r\n}\r\n\r\nexport enum MediaType {\r\n image = 'image',\r\n video = 'video'\r\n}\r\n\r\nexport interface MediaReference {\r\n mediaId: string;\r\n childId: string;\r\n type: MediaType;\r\n poster: string;\r\n url: string;\r\n title: string;\r\n}\r\n\r\nexport interface AlbumsListResponseItem {\r\n id: string;\r\n createdOn: string;\r\n title: string;\r\n description: string;\r\n posterUrl: string;\r\n numberOfMedia: number;\r\n}\r\n\r\nexport interface AlbumsListResponse {\r\n items: AlbumsListResponseItem[];\r\n}\r\n\r\nexport interface MediaListResponse {\r\n media: MediaListItem[];\r\n}\r\n\r\nexport interface MediaListItem {\r\n lastUpdatedUTC: any;\r\n mediaId: string;\r\n albumId: string;\r\n createdOn: string;\r\n modifiedOn: string;\r\n media: MediaReference;\r\n publishedOn: string;\r\n publishedOnUTC: string;\r\n publisher: MediaListItemPublisher;\r\n}\r\n\r\nexport interface MediaListItemPublisher {\r\n publisherId: string;\r\n publisherName: string;\r\n}\r\n\r\nexport interface MediaAlbumResponseItem {\r\n id: string;\r\n createdOn: Date;\r\n title: string;\r\n description: string;\r\n posterUrl: string;\r\n}\r\n\r\nexport interface MediaAlbumsResponse {\r\n items: MediaAlbumResponseItem[];\r\n}\r\n\r\nexport interface SelectionModel {\r\n id: T;\r\n name: string;\r\n}\r\n\r\nexport enum ContactInfoType {\r\n telephone = 'telephone',\r\n email = 'email',\r\n mobile = 'mobile',\r\n}\r\n\r\nexport enum ContactInfoCategory {\r\n home = 'home',\r\n work = 'work',\r\n}\r\n\r\nexport enum AddressType {\r\n home = 'home',\r\n invoice = 'invoice',\r\n visiting = 'visiting',\r\n postal = 'postal',\r\n}\r\n\r\nexport interface ContactInfo {\r\n type: ContactInfoType;\r\n content: string;\r\n category: ContactInfoCategory;\r\n isEmergency: boolean;\r\n}\r\n\r\nexport interface Address {\r\n street: string;\r\n number: string;\r\n extension: string;\r\n zipCode: string;\r\n city: string;\r\n countryId: string;\r\n country: string;\r\n municipalityId: string;\r\n type: AddressType;\r\n}\r\n\r\nexport interface ContactBase {\r\n id: string;\r\n addresses: Address[];\r\n contactInformation: ContactInfo[];\r\n}\r\n\r\nexport interface ContactModel extends ContactBase {\r\n name: string;\r\n}\r\n\r\nexport interface Country {\r\n countryId: string;\r\n name: string;\r\n postcodeFormat: string;\r\n postcodePattern: string;\r\n code: string;\r\n default: boolean;\r\n}\r\n\r\nexport interface SchoolContactModel extends ContactModel {\r\n class: SelectionModel;\r\n}\r\n\r\nexport interface Name {\r\n firstName: string;\r\n middleName: string;\r\n lastName: string;\r\n initials: string;\r\n fullName: string;\r\n}\r\n\r\nexport enum PersonType {\r\n child = 'child',\r\n parent = 'parent',\r\n fetcher = 'fetcher',\r\n}\r\n\r\nexport enum PersonRole {\r\n responsible = 'responsible',\r\n parent = 'parent',\r\n fetcher = 'fetcher',\r\n}\r\n\r\nexport enum Gender {\r\n male = 'male',\r\n female = 'female',\r\n}\r\n\r\nexport interface Mentor {\r\n name: string;\r\n}\r\n\r\nexport interface Insurance {\r\n organization: string;\r\n policyNumber: string;\r\n}\r\n\r\nexport interface PersonModel extends ContactBase {\r\n name: Name;\r\n type: PersonType;\r\n isContact: boolean;\r\n picture: MediaReference;\r\n gender: Gender;\r\n dateOfBirth: Date;\r\n placeOfBirth: string;\r\n doctor: ContactModel;\r\n insurance: Insurance;\r\n school: SchoolContactModel;\r\n isCurrentUser: boolean;\r\n isSick: boolean;\r\n roles: PersonRole[];\r\n hasApprovedContract: boolean;\r\n mentor: Mentor;\r\n ssn: string;\r\n hasSSN: boolean;\r\n hasDoenKids: boolean;\r\n}\r\n\r\nexport interface SchoolModel extends ContactModel {\r\n classes: SelectionModel[];\r\n}\r\n\r\nexport enum RegisterOptionsType {\r\n daycare = 'daycare',\r\n playschool = 'playschool',\r\n outOfSchoolCare = 'outOfSchoolCare'\r\n}\r\n\r\nexport interface KeyValuePair {\r\n key: TKey;\r\n value: TValue;\r\n}\r\n\r\nexport interface AppSettingsModel {\r\n invoicingByDebtor: boolean;\r\n allowSwapDayCustomTime: boolean;\r\n allowIrregularCustomTime: boolean;\r\n contractChangeUseCancelDate: boolean;\r\n telemetryInstrumentationKey: string;\r\n}\r\n\r\n/**\r\n * Timeline implementation\r\n */\r\ninterface BaseTimelineResponse {\r\n start: Date;\r\n end: Date;\r\n}\r\n\r\nexport interface BaseTimelineItem {\r\n title: string;\r\n description: string;\r\n timelineTitle: string;\r\n on: Date;\r\n}\r\n\r\n// Media Timeline\r\nexport interface MediaTimelineAlbumPublisher {\r\n publisherId: string;\r\n publisherName: string;\r\n}\r\n\r\nexport interface MediaTimelineItem extends BaseTimelineItem {\r\n albumId: string;\r\n numberOfMedia: number;\r\n posterUrl: string;\r\n media: MediaReference[];\r\n publisher: MediaTimelineAlbumPublisher;\r\n}\r\n\r\nexport interface MediaTimelineResponse extends BaseTimelineResponse {\r\n albums: MediaTimelineItem[];\r\n}\r\n\r\n/**\r\n * Presence timeline\r\n *\r\n * TODO: This call is old and works different than the others, that's why it's not extending from the base response!!\r\n * RECOMMENDATION: Update the call so it works the same as the others!\r\n */\r\nexport interface PresenceTimelineItem {\r\n date: Date;\r\n state: string;\r\n startTime: string;\r\n endTime: string;\r\n type: string;\r\n childId: string;\r\n}\r\n\r\n// Diary timeline\r\nexport interface DiaryTimelineItem extends BaseTimelineItem {\r\n diaryEntryId: string;\r\n childId: string;\r\n color: string;\r\n icon: string;\r\n}\r\n\r\nexport interface DiaryTimelineResponse extends BaseTimelineResponse {\r\n diaryEntryItems: DiaryTimelineItem[];\r\n}\r\n\r\nexport interface StoryTimelineItem extends BaseTimelineItem {\r\n storyId: string;\r\n childId: string;\r\n}\r\nexport interface StoryTimelineResponse extends BaseTimelineResponse {\r\n storyEntryItems: StoryTimelineItem[];\r\n}\r\n\r\n// Post timeline\r\nexport interface PostSender {\r\n senderId: string;\r\n senderName: string;\r\n senderType: string;\r\n picture: MediaReference;\r\n}\r\n\r\nexport interface PostTimeLineItem extends BaseTimelineItem {\r\n postId: string;\r\n childId: string;\r\n numberOfReplies: number;\r\n regarding: string;\r\n sender: PostSender;\r\n}\r\n\r\nexport interface PostTimeLineResponse extends BaseTimelineResponse {\r\n posts: PostTimeLineItem[];\r\n}\r\n\r\nexport interface StrippenkaartBalanceResponse {\r\n items: StrippenkaartBalanceModel[];\r\n}\r\n\r\nexport interface StrippenkaartBalanceModel {\r\n childId: string;\r\n packageId: string;\r\n packageName: string;\r\n startDate: string;\r\n originalBalance: number;\r\n currentBalance: number;\r\n companyId: string;\r\n}\r\n\r\nexport enum PlanningDayType {\r\n normal,\r\n holiday,\r\n closed\r\n}\r\n\r\nexport enum Pakkettype\r\n{\r\n intern = 'intern',\r\n tijdblokkeuze = 'tijdblokkeuze',\r\n onregelmatigMetTijdblokkeuze = 'onregelmatigMetTijdblokkeuze',\r\n onregelmatigHeleWeek = 'onregelmatigHeleWeek',\r\n strippenkaart = 'strippenkaart',\r\n}\r\n\r\nexport interface PlanningBlock\r\n{\r\n id: string;\r\n packageType: Pakkettype;\r\n type: EntityType;\r\n status: PlanningBlockStatus;\r\n start: string;\r\n end: string;\r\n presence: PlanningBlockPresence;\r\n timeslotId: string;\r\n requestedStart: string;\r\n requestedEnd: string;\r\n description: string;\r\n planningId: string;\r\n}\r\n\r\nexport enum AbsenceType {\r\n absent = 'absent',\r\n sick = 'sick'\r\n}\r\n\r\nexport enum PlanningBlockStatus {\r\n requestable = 'requestable',\r\n requested = 'requested',\r\n approved = 'approved',\r\n rejected = 'rejected',\r\n cancelled = 'cancelled'\r\n}\r\n\r\nexport enum PlanningBlockPresence {\r\n present = 'present',\r\n absent = 'absent',\r\n sick = 'sick',\r\n holiday = 'holiday',\r\n traded = 'traded',\r\n other = 'other'\r\n}\r\n\r\nexport enum EntityType {\r\n chiAanvraag = 'chiAanvraag',\r\n chiAanvraagregel = 'chiAanvraagregel',\r\n chiAcceskey = 'chiAcceskey',\r\n chiActiviteitruimte = 'chiActiviteitruimte',\r\n chiActiviteitsdeelname = 'chiActiviteitsdeelname',\r\n chiActiviteitsplaatsing = 'chiActiviteitsplaatsing',\r\n chiActivity = 'chiActivity',\r\n chiActivityCareType = 'chiActivityCareType',\r\n chiActivityGroup = 'chiActivityGroup',\r\n chiActivityinfo = 'chiActivityinfo',\r\n chiActivityPlanning = 'chiActivityPlanning',\r\n chiActivitytype = 'chiActivitytype',\r\n chiAfhaler = 'chiAfhaler',\r\n chiAfwezig = 'chiAfwezig',\r\n chiAlbum = 'chiAlbum',\r\n chiAntwoord = 'chiAntwoord',\r\n chiAudience = 'chiAudience',\r\n chiAudiencecorrectie = 'chiAudiencecorrectie',\r\n chiBelastingdienstexport = 'chiBelastingdienstexport',\r\n chiBsoopvanglocatie = 'chiBsoopvanglocatie',\r\n chiBV = 'chiBV',\r\n chiCaregiver = 'chiCaregiver',\r\n chiChildlabel = 'chiChildlabel',\r\n chiChildlabeltype = 'chiChildlabeltype',\r\n chiClieopBatch = 'chiClieopBatch',\r\n chiColor = 'chiColor',\r\n chiComment = 'chiComment',\r\n chiContract = 'chiContract',\r\n chiDagactie = 'chiDagactie',\r\n chiDebtornumber = 'chiDebtornumber',\r\n chiDiaryEntry = 'chiDiaryEntry',\r\n chiDiaryEntryType = 'chiDiaryEntryType',\r\n chiDiarySchedule = 'chiDiarySchedule',\r\n chiEventtraceinformation = 'chiEventtraceinformation',\r\n chiFactuurbatch = 'chiFactuurbatch',\r\n chiFactuurexport = 'chiFactuurexport',\r\n chiFactuurregel = 'chiFactuurregel',\r\n chiFactuurrun = 'chiFactuurrun',\r\n chiFamilyfilter = 'chiFamilyfilter',\r\n chiFlexibleholiday = 'chiFlexibleholiday',\r\n chiFlexibleholidaychildren = 'chiFlexibleholidaychildren',\r\n chiGroep = 'chiGroep',\r\n chiGroepDetail = 'chiGroepDetail',\r\n chiGroepnotificatie = 'chiGroepnotificatie',\r\n chiGroepsluitingsdag = 'chiGroepsluitingsdag',\r\n chiGrootboek = 'chiGrootboek',\r\n chiHolidayperpackage = 'chiHolidayperpackage',\r\n chiHolidayspecial = 'chiHolidayspecial',\r\n chiHolidaytype = 'chiHolidaytype',\r\n chiIncassobatch = 'chiIncassobatch',\r\n chiIncidenteleOpvang = 'chiIncidenteleOpvang',\r\n chiIncome = 'chiIncome',\r\n chiIncometable = 'chiIncometable',\r\n chiIncometablerow = 'chiIncometablerow',\r\n chiInstantie = 'chiInstantie',\r\n chiInstantieBetaling = 'chiInstantieBetaling',\r\n chiIprange = 'chiIprange',\r\n chiIteminformation = 'chiIteminformation',\r\n chiKind = 'chiKind',\r\n chiKindafhaler = 'chiKindafhaler',\r\n chiKinddocument = 'chiKinddocument',\r\n chiKostendrager = 'chiKostendrager',\r\n chiKostenplaats = 'chiKostenplaats',\r\n chiKot = 'chiKot',\r\n chiKotline = 'chiKotline',\r\n chiLand = 'chiLand',\r\n chiLayoutcontent = 'chiLayoutcontent',\r\n chiLayoutset = 'chiLayoutset',\r\n chiLeidsterNotitie = 'chiLeidsterNotitie',\r\n chiLocatie = 'chiLocatie',\r\n chiLocatiepakket = 'chiLocatiepakket',\r\n chiLocatiesluitingsdag = 'chiLocatiesluitingsdag',\r\n chiLrkpnummer = 'chiLrkpnummer',\r\n chiMaandfactuur = 'chiMaandfactuur',\r\n chiMailStatistic = 'chiMailStatistic',\r\n chiMedewerker = 'chiMedewerker',\r\n chiMedia = 'chiMedia',\r\n chiMediaAudience = 'chiMediaAudience',\r\n chiMediatimeline = 'chiMediatimeline',\r\n chiMeldingen = 'chiMeldingen',\r\n chiMunicipality = 'chiMunicipality',\r\n chiNewsrelease = 'chiNewsrelease',\r\n chiNewsreleasebv = 'chiNewsreleasebv',\r\n chiNewsreleaselocation = 'chiNewsreleaselocation',\r\n chiNotificationtrigger = 'chiNotificationtrigger',\r\n chiOpeningstijd = 'chiOpeningstijd',\r\n chiOperationalcapacity = 'chiOperationalcapacity',\r\n chiOpvangSoort = 'chiOpvangSoort',\r\n chiOpvangtijd = 'chiOpvangtijd',\r\n chiOpvangtijdlijn = 'chiOpvangtijdlijn',\r\n chiOpvangtijdlijncorrectie = 'chiOpvangtijdlijncorrectie',\r\n chiOrganization = 'chiOrganization',\r\n chiOuder = 'chiOuder',\r\n chiOuderNotificatie = 'chiOuderNotificatie',\r\n chiPakketlabel = 'chiPakketlabel',\r\n chiPersoneelsplanningsync = 'chiPersoneelsplanningsync',\r\n chiPersoonrol = 'chiPersoonrol',\r\n chiPlaatsing = 'chiPlaatsing',\r\n chiPlanbord = 'chiPlanbord',\r\n chiPlanning = 'chiPlanning',\r\n chiPlanningratio = 'chiPlanningratio',\r\n chiPlanningtijd = 'chiPlanningtijd',\r\n chiPlanningtijdblok = 'chiPlanningtijdblok',\r\n chiPlusitem = 'chiPlusitem',\r\n chiPost = 'chiPost',\r\n chiPostAudience = 'chiPostAudience',\r\n chiPostsubscription = 'chiPostsubscription',\r\n chiPresentie = 'chiPresentie',\r\n chiProduct = 'chiProduct',\r\n chiProductAfname = 'chiProductAfname',\r\n chiProductprijs = 'chiProductprijs',\r\n chiPublicatie = 'chiPublicatie',\r\n chiRatio = 'chiRatio',\r\n chiRatiorekenregel = 'chiRatiorekenregel',\r\n chiRealTimeBKR = 'chiRealTimeBKR',\r\n chiRegistration = 'chiRegistration',\r\n chiRegistrationtype = 'chiRegistrationtype',\r\n chiRide = 'chiRide',\r\n chiRideChild = 'chiRideChild',\r\n chiRuildag = 'chiRuildag',\r\n chiSchool = 'chiSchool',\r\n chiSchoolGroup = 'chiSchoolGroup',\r\n chiSchoolGroupCategory = 'chiSchoolGroupCategory',\r\n chiSchoolgroupmembership = 'chiSchoolgroupmembership',\r\n chiSchoolgrouptype = 'chiSchoolgrouptype',\r\n chiSchoolOpeningTime = 'chiSchoolOpeningTime',\r\n chiSchoolregion = 'chiSchoolregion',\r\n chiSchoolterm = 'chiSchoolterm',\r\n chiSchooltime = 'chiSchooltime',\r\n chiSchooltimebyweekday = 'chiSchooltimebyweekday',\r\n chiSchooltimeslot = 'chiSchooltimeslot',\r\n chiSchooltimeslotset = 'chiSchooltimeslotset',\r\n chiSchooltimeslottype = 'chiSchooltimeslottype',\r\n chiSchooltype = 'chiSchooltype',\r\n chiSchoolyear = 'chiSchoolyear',\r\n chiSibling = 'chiSibling',\r\n chiSluitingsdag = 'chiSluitingsdag',\r\n chiSoortDagactie = 'chiSoortDagactie',\r\n chiStrippenkaart = 'chiStrippenkaart',\r\n chiStudiedag = 'chiStudiedag',\r\n chiStudiedagenPakket = 'chiStudiedagenPakket',\r\n chiStudiedagRegistratie = 'chiStudiedagRegistratie',\r\n chiTarief = 'chiTarief',\r\n chiTariefgroep = 'chiTariefgroep',\r\n chiTegoeduren = 'chiTegoeduren',\r\n chiTijdblok = 'chiTijdblok',\r\n chiUitgevoerdeDagactie = 'chiUitgevoerdeDagactie',\r\n chiUsermediafavorite = 'chiUsermediafavorite',\r\n chiVakantieperiode = 'chiVakantieperiode',\r\n chiVehicle = 'chiVehicle',\r\n chiVerbruikteuren = 'chiVerbruikteuren',\r\n chiVgantwoord = 'chiVgantwoord',\r\n chiVraag = 'chiVraag',\r\n chiWachtlijstItem = 'chiWachtlijstItem',\r\n chiWeekregistration = 'chiWeekregistration'\r\n}","import { UrlHelper } from '@js/urlHelper';\r\nimport * as moment from 'moment';\r\nimport { ft, ng } from '@js/definitions';\r\nimport { AppService, IAppData } from '@js/services/FT.app.services.appservice';\r\nimport {\r\n DiaryTimelineResponse, MediaTimelineResponse,\r\n MediaType,\r\n PostTimeLineResponse, PresenceTimelineItem, StoryTimelineItem, StoryTimelineResponse\r\n} from '@js/models';\r\nimport { IScope, IQService, ITimeoutService, IPromise } from 'angular';\r\nimport { DataService } from '../services/FT.app.services.dataservice';\r\nimport { MediaReference } from '../models';\r\n\r\nexport type VideoMediaReference = MediaReference & { videoUrl: string };\r\n\r\nenum TimelineTypes { Presence, Post, Diary, Media, Story }\r\n\r\ninterface Timeline {\r\n date: Date;\r\n itemDate: Date;\r\n childId: string;\r\n type: TimelineTypes;\r\n item: any;\r\n}\r\n\r\ninterface LocalScope extends IScope {\r\n handleGoto: (anchor: any) => void;\r\n handleFilterChanged: () => void;\r\n handleMoreData: () => void;\r\n toggleShowPresenceItems: () => void;\r\n toggleMedia: (timelineItem: any) => void;\r\n toggleComments: (timelineItem: any) => void;\r\n toggleFavorite: (item: any) => void;\r\n saveComment: (item: any) => void;\r\n handleSaveCommentError(reason: any);\r\n findChild: (childId: string) => string;\r\n isLoading: boolean;\r\n appData: IAppData;\r\n hasMoreItems: boolean;\r\n showPresenceInTimeline: boolean;\r\n types: typeof TimelineTypes;\r\n data: {\r\n mediaConfig: any;\r\n activityConfig: any;\r\n groups: any;\r\n childId: string;\r\n items: Timeline[];\r\n messages: {};\r\n valid: {};\r\n errorMessage: string;\r\n };\r\n getStoryDownloadLink: (item: StoryTimelineItem) => void;\r\n storyPdfLinks: string[];\r\n hasStories: boolean;\r\n}\r\n\r\nft.app.controller('appDashboardController',\r\n ['$scope', '$q', '$timeout', '$filter', '$translate', 'DataService', 'AppService', '$sessionStorage', '$location', '$anchorScroll',\r\n function ($scope: LocalScope, $q: IQService, $timeout: ITimeoutService, $filter, $translate, DataService: DataService, AppService: AppService, $sessionStorage, $location, $anchorScroll) {\r\n\r\n var groupByFilter = $filter('GroupByFilter');\r\n var initialized = false;\r\n\r\n var attempts = 0;\r\n var maxAttempts = 4;\r\n var minimalDays = 31;\r\n var maximumDays = 365 * 2;\r\n var amountOfDays = 31;\r\n var start = null;\r\n var end = null;\r\n\r\n $scope.isLoading = false;\r\n $scope.appData = AppService.data;\r\n $scope.hasMoreItems = true;\r\n $scope.showPresenceInTimeline = false;\r\n $scope.types = TimelineTypes;\r\n $scope.storyPdfLinks = [];\r\n $scope.hasStories = false;\r\n\r\n \r\n\r\n $scope.data = {\r\n mediaConfig: ft.app.media.types,\r\n activityConfig: ft.app.activities,\r\n groups: null,\r\n childId: null,\r\n items: [],\r\n messages: {},\r\n valid: {},\r\n errorMessage: ''\r\n };\r\n\r\n var initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n getData();\r\n\r\n };\r\n\r\n $scope.handleGoto = function (anchor) {\r\n\r\n $location.hash(anchor);\r\n $anchorScroll();\r\n\r\n };\r\n\r\n $scope.handleFilterChanged = function () {\r\n attempts = 0;\r\n start = null;\r\n end = null;\r\n $scope.data.items = [];\r\n $scope.data.groups = [];\r\n getData();\r\n };\r\n\r\n $scope.handleMoreData = function () {\r\n getData();\r\n };\r\n\r\n \r\n \r\n\r\n var getData = function () {\r\n\r\n $scope.isLoading = true;\r\n\r\n end = start ? ng.copy(start) : new Date();\r\n if (start) {\r\n end.setDate(end.getDate() - 1);\r\n }\r\n\r\n start = ng.copy(end);\r\n start.setDate(start.getDate() - amountOfDays);\r\n\r\n var mStart = moment(start);\r\n var mEnd = moment(end);\r\n\r\n const childId = $scope.data.childId || null;\r\n\r\n const prmPostTimeline = DataService.getTimelineForPosts(childId, mStart, mEnd);\r\n const prmActivities = DataService.getTimelineForMediaItems(childId, mStart, mEnd);\r\n const prmPresences = DataService.getTimelineForPresences(childId, mStart, mEnd);\r\n const prmDiaries = DataService.getTimelineForDiaries(childId, mStart, mEnd);\r\n let prmStories: IPromise;\r\n if ($scope.hasStories) {\r\n prmStories = DataService.getTimelineForStories(childId, mStart, mEnd);\r\n }\r\n\r\n const prms = $q.all([prmPostTimeline, prmActivities, prmPresences, prmDiaries, prmStories]);\r\n prms.then(handleGetData, handleGetDataError);\r\n prms.finally(function () {\r\n $scope.isLoading = false;\r\n });\r\n\r\n };\r\n\r\n var handleGetData = function (results) {\r\n let data = $scope.data;\r\n\r\n if (!data.groups) {\r\n data.groups = [];\r\n }\r\n\r\n const newItems = new Array();\r\n const postResult = results[0] as PostTimeLineResponse;\r\n const mediaResult = results[1] as MediaTimelineResponse;\r\n const presenceResult = results[2] as PresenceTimelineItem[];\r\n const diaryResult = results[3] as DiaryTimelineResponse;\r\n let storyResult: StoryTimelineResponse;\r\n if (results.length > 4) {\r\n storyResult = results[4] as StoryTimelineResponse;\r\n } \r\n\r\n if (mediaResult && mediaResult.albums.length) {\r\n const albums = mediaResult.albums;\r\n const items: Timeline[] = [];\r\n\r\n for (const album of albums) {\r\n album.posterUrl = createUrl(album.posterUrl);\r\n\r\n (album as any).icon = album.posterUrl;\r\n for (const media of album.media) {\r\n if (media.type == MediaType.video) {\r\n (media as VideoMediaReference).videoUrl = media.url;\r\n media.url = createUrl(media.poster);\r\n } else {\r\n media.url = createUrl(media.url);\r\n }\r\n media.poster = createUrl(media.poster);\r\n }\r\n\r\n let m = moment(album.on);\r\n let date = m.format('YYYY-MM-DD');\r\n\r\n items.push({\r\n date: date as unknown as Date,\r\n itemDate: album.on,\r\n type: TimelineTypes.Media,\r\n item: album,\r\n childId: album.media[0].childId\r\n });\r\n }\r\n\r\n newItems.push(...items);\r\n }\r\n\r\n if (storyResult && storyResult.storyEntryItems.length) {\r\n let storyEntryItems = storyResult.storyEntryItems;\r\n const items: Timeline[] = [];\r\n\r\n for (const storyEntry of storyEntryItems) {\r\n let m = moment(storyEntry.on);\r\n let date = m.format('YYYY-MM-DD');\r\n\r\n items.push({\r\n date: date as unknown as Date,\r\n itemDate: storyEntry.on,\r\n type: TimelineTypes.Story,\r\n item: storyEntry,\r\n childId: storyEntry.childId\r\n });\r\n $scope.getStoryDownloadLink(storyEntry);\r\n }\r\n\r\n newItems.push(...items);\r\n }\r\n\r\n if (diaryResult && diaryResult.diaryEntryItems.length) {\r\n let diaryEntryItems = diaryResult.diaryEntryItems;\r\n const items: Timeline[] = [];\r\n\r\n for (const diaryEntry of diaryEntryItems) {\r\n let m = moment(diaryEntry.on);\r\n let date = m.format('YYYY-MM-DD');\r\n\r\n items.push({\r\n date: date as unknown as Date,\r\n itemDate: diaryEntry.on,\r\n type: TimelineTypes.Diary,\r\n item: diaryEntry,\r\n childId: diaryEntry.childId\r\n });\r\n }\r\n\r\n newItems.push(...items);\r\n }\r\n\r\n if (presenceResult) {\r\n var presences = convertItems(presenceResult, TimelineTypes.Presence, function (item) {\r\n return item.date.split('T')[0] + 'T' + item.startTime;\r\n }, null);\r\n\r\n newItems.push(...presences);\r\n }\r\n\r\n if (postResult && postResult.posts) {\r\n let posts = postResult.posts;\r\n const items = [];\r\n\r\n posts.forEach(function (result) {\r\n var m = moment(result.on);\r\n const date = m.format('YYYY-MM-DD');\r\n\r\n items.push({\r\n date: date,\r\n itemDate: result.on,\r\n type: TimelineTypes.Post,\r\n item: result,\r\n childId: result.childId\r\n });\r\n });\r\n\r\n newItems.push(...items);\r\n }\r\n\r\n // all items\r\n data.items = data.items.concat(newItems);\r\n filterGroups();\r\n };\r\n\r\n var handleGetDataError = function () {\r\n $scope.data.errorMessage = $translate.instant('CHILD-TIMELINE.ERROR-GET-ITEMS');\r\n };\r\n\r\n const convertItems = function (results, type: TimelineTypes, fncFormatDate, dateFormat): Timeline[] {\r\n\r\n const items: Timeline[] = [];\r\n\r\n for (const result of results) {\r\n\r\n const itemDate = fncFormatDate(result);\r\n const m = moment(itemDate);\r\n const date = m.format(dateFormat || 'YYYY-MM-DD');\r\n\r\n const obj = {\r\n date: date as unknown as Date,\r\n itemDate: itemDate,\r\n type: type,\r\n item: result,\r\n childId: result.childId\r\n } as Timeline;\r\n\r\n items.push(obj);\r\n }\r\n\r\n return items;\r\n };\r\n\r\n const groupItems = function (items: Timeline[]) {\r\n if (items == null || items.length === 0) {\r\n return;\r\n }\r\n\r\n var groups = groupByFilter(items, 'date');\r\n\r\n groups.sort((a, b) => ft.dates.compare(b.title, a.title));\r\n\r\n for (const group of groups) {\r\n group.items.sort((a, b) => ft.dates.compare(b.itemDate, a.itemDate));\r\n }\r\n\r\n return groups;\r\n };\r\n\r\n const filterGroups = function () {\r\n if ($scope.showPresenceInTimeline) {\r\n $scope.data.groups = groupItems($scope.data.items);\r\n } else {\r\n $scope.data.groups = groupItems($scope.data.items.filter(x => x.type != TimelineTypes.Presence));\r\n }\r\n };\r\n\r\n $scope.toggleShowPresenceItems = function () {\r\n $scope.showPresenceInTimeline = !$scope.showPresenceInTimeline;\r\n filterGroups();\r\n };\r\n\r\n $scope.toggleMedia = function (timelineItem) {\r\n timelineItem.mediaChecked = !timelineItem.mediaChecked;\r\n };\r\n\r\n $scope.toggleComments = function (timelineItem) {\r\n timelineItem.commentsChecked = !timelineItem.commentsChecked;\r\n };\r\n\r\n $scope.toggleFavorite = function (item) {\r\n\r\n item.isFavorited = !item.isFavorited;\r\n\r\n $scope.isLoading = true;\r\n var prm = DataService.toggleFavoriteAsync(item.key, item.id, AppService.data.currentUser.id);\r\n prm.then(() => {}, () => { item.isFavorited = false; });\r\n prm.finally(function () {\r\n $scope.isLoading = false;\r\n });\r\n };\r\n\r\n $scope.saveComment = function (item) {\r\n var msg = $scope.data.messages[item.id];\r\n\r\n if (!msg) {\r\n $scope.data.valid[item.id] = $translate.instant('CHILD-TIMELINE.COMMENT-REQUIRED');\r\n return;\r\n }\r\n\r\n if ($scope.data.valid[item.id]) {\r\n $scope.data.valid[item.id] = '';\r\n }\r\n\r\n DataService.saveActivityCommentAsync(item.key, item.id, AppService.data.currentUser.id, msg).then(() => {}, $scope.handleSaveCommentError);\r\n\r\n if (!item.comments) {\r\n item.comments = [];\r\n }\r\n\r\n item.comments.push({\r\n 'createdOn': Date.now(),\r\n 'createdBy': {\r\n 'fullName': AppService.data.currentUser.name.fullName,\r\n 'personType': 'parent'\r\n },\r\n 'body': msg\r\n });\r\n\r\n $scope.data.messages[item.id] = '';\r\n };\r\n\r\n $scope.handleSaveCommentError = function (reason: any) {\r\n $scope.data.errorMessage = reason && !reason.result && reason.isReadable ? reason.message : $translate.instant('CHILD-TIMELINE.ERROR-SAVE-COMMENT');\r\n };\r\n\r\n $scope.findChild = (childId: string): string => {\r\n if (childId == null || $scope.appData.children == null || $scope.appData.children.length === 0) {\r\n return null;\r\n }\r\n\r\n const child = $scope.appData.children.find(x => x.id === childId);\r\n\r\n if (child == null) {\r\n return null;\r\n }\r\n\r\n return child.name.firstName;\r\n };\r\n\r\n function createUrl(url: string) {\r\n\r\n const encodedToken = encodeURIComponent($sessionStorage.token.value);\r\n\r\n let absoluteUrl = url;\r\n\r\n if (!UrlHelper.isUrlAbsolute(absoluteUrl)) {\r\n absoluteUrl = UrlHelper.createAbsoluteMediaUrl(AppService.data.services['media'], url);\r\n }\r\n\r\n return `${absoluteUrl}?access_token=${encodedToken}`;\r\n }\r\n\r\n DataService.getFeatures().then(x => {\r\n $scope.hasStories = x.features.some(y => y.code === 'stories');\r\n\r\n if ($scope.hasStories) {\r\n $scope.getStoryDownloadLink = function(item: StoryTimelineItem) {\r\n DataService.getStoryPdf(item.storyId, item.childId, true).then(function(url: string) {\r\n $scope.storyPdfLinks[item.storyId] = url;\r\n });\r\n };\r\n }\r\n $timeout(initialize);\r\n\r\n });\r\n\r\n }\r\n ]);\r\n","import {IAngularStatic, IModule} from 'angular';\r\nimport {IFortyTwoStatic} from '@js/FortyTwoFramework';\r\n\r\nexport const ft: IFortyTwoStatic = window.ft;\r\nexport const ng: IAngularStatic = window.ng;\r\n\r\nexport const app: IModule = window.ft.app;","import * as moment from 'moment';\r\n\r\ninterface Address {\r\n street: string;\r\n number: string;\r\n zipCode: string;\r\n city: string;\r\n countryId: string;\r\n municipalityId?: string;\r\n}\r\n\r\ninterface FullName {\r\n lastName: string;\r\n middleName: string;\r\n firstName: string;\r\n initials: string;\r\n}\r\n\r\ninterface FullNameValidation {\r\n initialsValid: boolean;\r\n firstNameValid: boolean;\r\n lastNameValid: boolean;\r\n}\r\n\r\ninterface AddressValidation {\r\n street: boolean;\r\n zipCode: boolean;\r\n zipCodeFormat: boolean;\r\n city: boolean;\r\n country: boolean;\r\n number: boolean;\r\n}\r\n\r\ninterface ContactValidation extends FullNameValidation {\r\n dateOfBirthValid: boolean;\r\n genderValid: boolean;\r\n addressValid: AddressValidation;\r\n phoneValid?: boolean;\r\n emailValid?: boolean;\r\n}\r\n\r\ninterface ContactInformation {\r\n gender?: 'male' | 'female';\r\n dateOfBirth: Date | string;\r\n phone?: string;\r\n email?: string;\r\n\r\n name: FullName;\r\n address: Address;\r\n}\r\n\r\ninterface PostalCodeFormat {\r\n postcodeFormat?: string;\r\n postcodePattern?: string;\r\n}\r\n\r\ntype Contact = ContactInformation & ContactValidation & { addressValid: PostalCodeFormat };\r\n\r\ninterface RegistrationForm2 {\r\n contact: Contact;\r\n parentOne: Contact;\r\n parentTwo: Contact;\r\n contactSameAsParent: boolean;\r\n fillInSecondParent: boolean;\r\n parentHasSameAddress: boolean;\r\n}\r\n\r\nconst isNullOrWhitespace = (value: string) => (value || '').trim() === '';\r\n\r\nconst validateName = (name: FullName): FullNameValidation => {\r\n return {\r\n initialsValid: !isNullOrWhitespace(name?.initials),\r\n firstNameValid: !isNullOrWhitespace(name?.firstName),\r\n lastNameValid: !isNullOrWhitespace(name?.lastName)\r\n };\r\n};\r\n\r\n\r\nconst validateAddress = (address: Address, postcodePattern: string): AddressValidation => {\r\n return {\r\n street: !isNullOrWhitespace(address?.street),\r\n zipCode: !isNullOrWhitespace(address?.zipCode) || isMatch(address?.zipCode, postcodePattern),\r\n zipCodeFormat: isNullOrWhitespace(address?.zipCode) || isMatch(address?.zipCode, postcodePattern),\r\n city: !isNullOrWhitespace(address?.city),\r\n country: !isNullOrWhitespace(address?.countryId),\r\n number: !isNullOrWhitespace(address?.number)\r\n };\r\n};\r\n\r\nconst isAddressCompletelyValid = (validation: AddressValidation) => validation.street && validation.zipCode && validation.zipCodeFormat && validation.city && validation.country && validation.number;\r\nconst isNameCompletelyValid = (validation: FullNameValidation) => validation.initialsValid && validation.firstNameValid && validation.lastNameValid;\r\nconst isContactCompletelyValid = (validation: ContactValidation, skipPhoneAndEmail: boolean, skipAddress: boolean) => {\r\n\r\n let phoneAndEmailValid = validation.phoneValid && validation.emailValid;\r\n if (skipPhoneAndEmail) {\r\n phoneAndEmailValid = true;\r\n }\r\n\r\n let addressValid = isAddressCompletelyValid(validation.addressValid);\r\n if (skipAddress) {\r\n addressValid = true;\r\n }\r\n\r\n return validation.dateOfBirthValid && validation.genderValid && phoneAndEmailValid && addressValid && isNameCompletelyValid(validation);\r\n};\r\n\r\nconst validateContactInfo = (info: ContactInformation, postcodePattern: string): ContactValidation => {\r\n\r\n const nameValidation = validateName(info.name);\r\n const addressValidation = validateAddress(info.address, postcodePattern);\r\n\r\n const result = {\r\n ...nameValidation,\r\n addressValid: addressValidation,\r\n dateOfBirthValid: true,\r\n genderValid: true,\r\n phoneValid: true,\r\n emailValid: true,\r\n };\r\n\r\n if (info.dateOfBirth == null) {\r\n result.dateOfBirthValid = false;\r\n } else {\r\n const date = moment(info.dateOfBirth);\r\n\r\n if (!date.isValid() || date > moment()) {\r\n result.dateOfBirthValid = false;\r\n }\r\n }\r\n\r\n result.genderValid = !isNullOrWhitespace(info.gender);\r\n result.phoneValid = !isNullOrWhitespace(info.phone);\r\n result.emailValid = !isNullOrWhitespace(info.email);\r\n\r\n return result;\r\n};\r\n\r\nconst addValidationResult = function(contact: Contact, contactValidation: ContactValidation){\r\n return {\r\n ...contact,\r\n ...contactValidation,\r\n addressValid: {\r\n ...contactValidation.addressValid,\r\n postcodePattern: contact.addressValid?.postcodePattern,\r\n postcodeFormat: contact.addressValid?.postcodeFormat\r\n }\r\n };\r\n};\r\n\r\nconst isMatch = function(value: string, pattern: string){\r\n if (pattern == null || pattern === '') {\r\n return true;\r\n }\r\n\r\n if (value == null || value === '') {\r\n return false;\r\n }\r\n\r\n const rx = new RegExp(pattern.trim(), 'g');\r\n return rx.test(value.trim());\r\n};\r\n\r\nexport const validateRegistrationForm2 = (form: RegistrationForm2): boolean => {\r\n\r\n const contactValidation = validateContactInfo(form.contact, form.contact.addressValid?.postcodePattern);\r\n form.contact = addValidationResult(form.contact, contactValidation);\r\n\r\n let isValid = isContactCompletelyValid(form.contact, false, false);\r\n\r\n if (!form.contactSameAsParent) {\r\n const parentOneValidation = validateContactInfo(form.parentOne, form.parentOne.addressValid?.postcodePattern);\r\n form.parentOne = addValidationResult(form.parentOne, parentOneValidation);\r\n isValid = isContactCompletelyValid(form.parentOne, true, false) && isValid;\r\n }\r\n\r\n if (form.fillInSecondParent) {\r\n const parentTwoValidation = validateContactInfo(form.parentTwo, form.parentTwo.addressValid?.postcodePattern);\r\n form.parentTwo = addValidationResult(form.parentTwo, parentTwoValidation);\r\n isValid = isContactCompletelyValid(form.parentTwo, true, form.parentHasSameAddress) && isValid;\r\n }\r\n\r\n return isValid;\r\n};","import { validateRegistrationForm2 } from '@js/registration-form-validator';\r\n\r\nft.app.controller('familyController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', 'DataService', 'AppService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, DataService, AppService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }]);\r\n\r\nft.app.controller('familyListController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', '$translate', 'DataService', 'AppService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, $translate, DataService, AppService) {\r\n\r\n var initialized = false;\r\n\r\n $scope.appData = AppService.data;\r\n $scope.data = {\r\n successMessage: ''\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n if ($stateParams.success && $stateParams.child) {\r\n $scope.data.successMessage = $translate.instant('FAMILY.SAVED-PARENT');\r\n } else if ($stateParams.success && $stateParams.child) {\r\n $scope.data.successMessage = $translate.instant('FAMILY.SAVED-CHILD');\r\n }\r\n\r\n };\r\n\r\n $scope.navigateToUser = function (id) {\r\n $state.go('app.user.info', {user: id});\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);\r\n\r\nft.app.controller('familyAddChildController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', '$filter', '$translate', 'DataService', 'AppService', 'CheckStateChangeService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, $filter, $translate, DataService, AppService, CheckStateChangeService) {\r\n\r\n var groupByFilter = $filter('GroupByFilter');\r\n var initialized = false;\r\n\r\n $scope.$watch('data.contact.address.countryId', (newValue) => {\r\n getPostcodeFormat(newValue, $scope.data.contact.addressValid);\r\n });\r\n\r\n $scope.$watch('data.parentOne.address.countryId', (newValue) => {\r\n getPostcodeFormat(newValue, $scope.data.parentOne.addressValid);\r\n });\r\n\r\n $scope.$watch('data.parentTwo.address.countryId', (newValue) => {\r\n getPostcodeFormat(newValue, $scope.data.parentTwo.addressValid);\r\n });\r\n\r\n $rootScope.checkForFormChange = true;\r\n CheckStateChangeService.checkFormOnStateChange($scope, 'childForm');\r\n\r\n var loadingKeyPackages = 'packages';\r\n var loadingKeyLocations = 'locations';\r\n\r\n var addLoading = function (key) {\r\n if ($scope.data.loading.indexOf(key) < 0) {\r\n $scope.data.loading.push(key);\r\n }\r\n };\r\n\r\n var removeLoading = function (key) {\r\n var idx = $scope.data.loading.indexOf(key);\r\n if (idx >= 0) {\r\n $scope.data.loading.splice(idx, 1);\r\n }\r\n };\r\n\r\n var getPostcodeFormat = function(countryId, addressValid){\r\n if (addressValid == null) {\r\n return;\r\n }\r\n\r\n if (countryId == null || countryId === ''){\r\n addressValid.postcodeFormat = null;\r\n addressValid.postcodePattern = null;\r\n } else {\r\n const country = $scope.data.countries.find(c => c.countryId === countryId);\r\n if (country != null) {\r\n addressValid.postcodeFormat = country.postcodeFormat;\r\n addressValid.postcodePattern = country.postcodePattern;\r\n }\r\n }\r\n };\r\n\r\n $scope.data = {\r\n appData: AppService.data,\r\n careConfig: ft.app.care,\r\n loading: [],\r\n newRegistration: $state.current.data && $state.current.data.newRegistration,\r\n maxLocations: 3,\r\n currentStep: parseInt($stateParams.step) || 0,\r\n steps: [\r\n {\r\n key: 'basics',\r\n title: $translate.instant('NEW-CONTRACT.STEP-CHILD-INFORMATION'),\r\n description: 'pp-screen-contract-basics'\r\n },\r\n {\r\n key: 'registerOptions',\r\n title: $translate.instant('NEW-CONTRACT.STEP-REGISTER-OPTIONS'),\r\n description: 'pp-screen-contract-registeroptions'\r\n },\r\n {\r\n key: 'packages',\r\n title: $translate.instant('NEW-CONTRACT.STEP-PACKAGES'),\r\n description: 'pp-screen-contract-packages'\r\n },\r\n {\r\n key: 'locations',\r\n title: $translate.instant('NEW-CONTRACT.STEP-LOCATIONS'),\r\n description: 'pp-screen-contract-locations'\r\n },\r\n {\r\n key: 'comments',\r\n title: $translate.instant('NEW-CONTRACT.STEP-COMMENTS'),\r\n description: 'pp-screen-contract-comments'\r\n }\r\n ],\r\n now: new Date(),\r\n registrationId: null,\r\n startdate: null,\r\n name: {\r\n lastName: '',\r\n middleName: '',\r\n firstName: ''\r\n },\r\n dateOfBirth: '',\r\n gender: null,\r\n countries: null,\r\n contactSameAsParent: true,\r\n fillInSecondParent: false,\r\n parentHasSameAddress: true,\r\n contact: {\r\n name: {\r\n lastName: '',\r\n middleName: '',\r\n firstName: '',\r\n initials: ''\r\n },\r\n gender: null,\r\n dateOfBirth: '',\r\n phone: '',\r\n email: '',\r\n address: {\r\n street: '',\r\n number: '',\r\n zipCode: '',\r\n city: '',\r\n countryId: '',\r\n municipalityId: ''\r\n },\r\n initialsValid: true,\r\n firstNameValid: true,\r\n lastNameValid: true,\r\n dateOfBirthValid: true,\r\n genderValid: true,\r\n addressValid: {\r\n street: true,\r\n number: true,\r\n zipCode: true,\r\n zipCodeFormat: true,\r\n city: true,\r\n country: true\r\n },\r\n emailValid: true,\r\n phoneValid: true\r\n },\r\n parentOne: {\r\n name: {\r\n lastName: '',\r\n middleName: '',\r\n firstName: '',\r\n initials: ''\r\n },\r\n gender: null,\r\n dateOfBirth: '',\r\n address: {\r\n street: '',\r\n number: '',\r\n zipCode: '',\r\n city: '',\r\n countryId: '',\r\n municipalityId: ''\r\n },\r\n initialsValid: true,\r\n firstNameValid: true,\r\n lastNameValid: true,\r\n dateOfBirthValid: true,\r\n genderValid: true,\r\n addressValid: {\r\n street: true,\r\n number: true,\r\n zipCode: true,\r\n zipCodeFormat: true,\r\n city: true,\r\n country: true\r\n }\r\n },\r\n parentTwo: {\r\n name: {\r\n lastName: '',\r\n middleName: '',\r\n firstName: '',\r\n initials: ''\r\n },\r\n gender: null,\r\n dateOfBirth: '',\r\n email: '',\r\n address: {\r\n street: '',\r\n number: '',\r\n zipCode: '',\r\n city: '',\r\n countryId: '',\r\n municipalityId: ''\r\n },\r\n initialsValid: true,\r\n firstNameValid: true,\r\n lastNameValid: true,\r\n dateOfBirthValid: true,\r\n genderValid: true,\r\n addressValid: {\r\n street: true,\r\n number: true,\r\n zipCode: true,\r\n zipCodeFormat: true,\r\n city: true,\r\n country: true\r\n }\r\n },\r\n registerConfig: null,\r\n locations: [],\r\n chosenRegisterOption: null,\r\n chosenLocations: [],\r\n chosenPackages: [],\r\n chosenSchool: null,\r\n chosenClass: null,\r\n configQuestions: null,\r\n questions: null,\r\n comments: '',\r\n dateOfBirthOpened: false,\r\n startdateOpened: false,\r\n contactDateOfBirthOpened: false,\r\n parentOneDateOfBirthOpened: false,\r\n parentTwoDateOfBirthOpened: false,\r\n dateOptions: {\r\n formatYear: 'yy'\r\n },\r\n formats: ['dd-MM-yyyy', 'd!-MMMM-yyyy', 'yyyy/M!/d!', 'd!.M!.yyyy', 'shortDate'],\r\n format: 'dd-MM-yyyy',\r\n dateOfBirthValid: true,\r\n lastNameValid: true,\r\n firstNameValid: true,\r\n genderValid: true,\r\n emergencyNumber: '',\r\n insuranceOrganizationName: '',\r\n insuranceOrganizationNumber: '',\r\n chosenRegisterOptionValid: true,\r\n chosenSchoolValid: true,\r\n startdateValid: true,\r\n chosenPackagesValid: true,\r\n chosenLocationsValid: true,\r\n questionsValid: true,\r\n successMessage: '',\r\n errorMessage: '',\r\n saveEnabled: true,\r\n saving: false,\r\n attempts: 0,\r\n processingUserData: false,\r\n processingUserDataValid: true\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n if ($state.current.data && $state.current.data.newRegistration) {\r\n $scope.data.steps.splice(1, 0, {\r\n key: 'members',\r\n title: $translate.instant('NEW-CONTRACT.STEP-MEMBERS'),\r\n description: 'pp-screen-contract-members'\r\n });\r\n\r\n if ($stateParams.lang) {\r\n $scope.switchLanguage($stateParams.lang);\r\n }\r\n\r\n } else {\r\n $rootScope.$on(ft.app.events.family.get, $scope.initializeFamily);\r\n }\r\n\r\n $scope.setupStep();\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.initializeFamily = function () {\r\n var data = $scope.data;\r\n var appData = AppService.data;\r\n var responsible = AppService.getResponsibleUser();\r\n\r\n if (!data.name.lastName) {\r\n data.name.lastName = responsible.name.lastName;\r\n }\r\n\r\n if (!data.name.middleName) {\r\n data.name.middleName = responsible.name.middleName;\r\n }\r\n };\r\n\r\n $scope.setLastName = function (target) {\r\n var data = $scope.data;\r\n target.lastName = data.name.lastName;\r\n };\r\n\r\n $scope.changeTimeslot = function (packageId, timeslots, time) {\r\n\r\n var data = $scope.data;\r\n var overlapping = time.overlappingTimeslotIds;\r\n var overlapTime;\r\n\r\n if (overlapping && overlapping.length) {\r\n overlapping.forEach(function (overlap) {\r\n\r\n overlapTime = timeslots.find(x => x.timeslotId == overlap);\r\n\r\n if (overlapTime) {\r\n data.chosenPackages[packageId][overlapTime.timeslotId]['chosen'] = false;\r\n }\r\n\r\n });\r\n }\r\n\r\n };\r\n\r\n $scope.switchLanguage = function (lang) {\r\n AppService.switchLanguage(lang);\r\n };\r\n\r\n $scope.disableDay = function (date, mode) {\r\n var data = $scope.data;\r\n\r\n var minimal = $scope.getMinimalStartdate();\r\n date.setHours(0, 0, 0, 0);\r\n\r\n if (minimal > date) {\r\n return true;\r\n } else if (mode === 'day' && data.registerConfig.validStartDays.length) {\r\n var possibles = data.registerConfig.validStartDays;\r\n return possibles.indexOf(date.getDate()) < 0;\r\n }\r\n };\r\n\r\n $scope.getMinimalStartdate = function () {\r\n var data = $scope.data;\r\n var start = new Date();\r\n start.setDate(start.getDate() + 1);\r\n start.setHours(0, 0, 0, 0);\r\n\r\n if (data.dateOfBirth && data.dateOfBirth > start) {\r\n start = new Date(data.dateOfBirth);\r\n start.setDate(start.getDate() + 1);\r\n start.setHours(0, 0, 0, 0);\r\n }\r\n\r\n return start;\r\n };\r\n\r\n $scope.open = function (key, $event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n $scope.data[key + 'Opened'] = true;\r\n };\r\n\r\n $scope.previousStep = function (evt) {\r\n evt.target.blur();\r\n\r\n $scope.data.currentStep -= 1;\r\n $scope.setupStep();\r\n };\r\n\r\n $scope.nextStep = function (evt) {\r\n evt.target.blur();\r\n\r\n var data = $scope.data;\r\n\r\n if ($scope.finishStep()) {\r\n if (data.currentStep == data.steps.length - 1) {\r\n if (!data.processingUserData) {\r\n data.processingUserDataValid = false;\r\n return;\r\n }\r\n\r\n $scope.save();\r\n } else {\r\n data.currentStep += 1;\r\n\r\n $scope.setupStep();\r\n ng.element(evt.currentTarget).closest('.info-overlay-wrapper').scrollTop(0);\r\n }\r\n }\r\n };\r\n\r\n $scope.setupStep = function () {\r\n var data = $scope.data;\r\n var step = data.steps[data.currentStep];\r\n\r\n switch (step.key) {\r\n case 'basics':\r\n $scope.setupBasics();\r\n break;\r\n case 'members':\r\n $scope.setupMembers();\r\n break;\r\n case 'registerOptions':\r\n $scope.setupRegisterOptions();\r\n break;\r\n case 'packages':\r\n $scope.setupPackages();\r\n break;\r\n case 'locations':\r\n $scope.setupLocations();\r\n break;\r\n case 'comments':\r\n $scope.setupComments();\r\n break;\r\n }\r\n };\r\n\r\n $scope.finishStep = function () {\r\n\r\n var data = $scope.data;\r\n var step = data.steps[data.currentStep];\r\n var result = false;\r\n\r\n switch (step.key) {\r\n case 'basics':\r\n result = $scope.finishBasics();\r\n break;\r\n case 'members':\r\n result = $scope.finishMembers();\r\n break;\r\n case 'registerOptions':\r\n result = $scope.finishRegisterOptions();\r\n break;\r\n case 'packages':\r\n result = $scope.finishPackages();\r\n break;\r\n case 'locations':\r\n result = $scope.finishLocations();\r\n break;\r\n case 'comments':\r\n result = $scope.finishComments();\r\n break;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.setupBasics = function () {\r\n };\r\n\r\n $scope.setupMembers = function () {\r\n $scope.data.countries = $scope.data.appData.countries;\r\n $scope.data.municipalities = $scope.data.appData.municipalities;\r\n };\r\n\r\n $scope.setupRegisterOptions = function () {\r\n var data = $scope.data;\r\n var appData = AppService.data;\r\n\r\n data.registerOptions = appData.registerOptions;\r\n data.schools = appData.schools;\r\n };\r\n\r\n $scope.setupPackages = function () {\r\n var data = $scope.data;\r\n\r\n data.packageGroups = null;\r\n data.registerConfig = null;\r\n\r\n addLoading(loadingKeyPackages);\r\n\r\n var prm = DataService.getRegisterPackagesAsync(data.chosenRegisterOption.id, data.chosenSchool ? data.chosenSchool.id : null);\r\n prm.then($scope.handleGetRegisterPackages, $scope.handleGetRegisterPackagesError);\r\n };\r\n\r\n $scope.setupLocations = function () {\r\n\r\n addLoading(loadingKeyLocations);\r\n\r\n var data = $scope.data;\r\n var chosenPackages = [];\r\n var key, chosenPackage;\r\n\r\n for (key in data.chosenPackages) {\r\n\r\n chosenPackage = data.chosenPackages[key];\r\n\r\n if (chosenPackage.chosen) {\r\n chosenPackages.push(key);\r\n }\r\n\r\n }\r\n\r\n var schoolId = null;\r\n if (data.chosenSchool) {\r\n schoolId = data.chosenSchool.id;\r\n }\r\n\r\n data.errorMessage = '';\r\n data.locations = [];\r\n\r\n var prm = DataService.getRegisterLocationsAsync(chosenPackages, schoolId, data.startdate);\r\n prm.then($scope.handleGetRegisterLocations, $scope.handleGetRegisterLocationsError);\r\n\r\n };\r\n\r\n $scope.setupComments = function () {\r\n\r\n var data = $scope.data;\r\n var configQuestions = data.registerConfig.questions;\r\n var chosenPackages = data.chosenPackages;\r\n var i, chosenPackage, question;\r\n var questions = [];\r\n\r\n for (i = 0; i < configQuestions.length; i++) {\r\n\r\n question = configQuestions[i];\r\n\r\n if (!question.packageId) {\r\n questions.push(question);\r\n } else {\r\n\r\n chosenPackage = chosenPackages[question.packageId];\r\n\r\n if (chosenPackage && chosenPackage['chosen']) {\r\n questions.push(question);\r\n }\r\n\r\n if (!chosenPackage) {\r\n for (var configPackage of data.registerConfig.packages) {\r\n if (configPackage.label && configPackage.label.id === question.packageId) {\r\n chosenPackage = chosenPackages[configPackage.id];\r\n if (chosenPackage && chosenPackage['chosen']) {\r\n questions.push(question);\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n data.configQuestions = questions;\r\n };\r\n\r\n $scope.finishBasics = function () {\r\n\r\n var data = $scope.data;\r\n\r\n data.dateOfBirthValid = true;\r\n data.lastNameValid = true;\r\n data.firstNameValid = true;\r\n data.genderValid = true;\r\n\r\n if (data.dateOfBirth) {\r\n var date = moment(data.dateOfBirth).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n if (!moment(date).isValid()) {\r\n data.dateOfBirthValid = false;\r\n }\r\n } else {\r\n data.dateOfBirthValid = false;\r\n }\r\n\r\n if (!data.name.lastName.trim()) {\r\n data.lastNameValid = false;\r\n }\r\n\r\n if (data.dateOfBirth && !$scope.isDateOfBirthInFuture()) {\r\n\r\n if (!data.name.firstName.trim()) {\r\n data.firstNameValid = false;\r\n }\r\n\r\n if (!data.gender) {\r\n data.genderValid = false;\r\n }\r\n\r\n }\r\n\r\n if (!data.dateOfBirthValid || !data.lastNameValid || !data.firstNameValid || !data.genderValid) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n };\r\n\r\n $scope.finishMembers = function () {\r\n return validateRegistrationForm2($scope.data);\r\n };\r\n\r\n $scope.finishRegisterOptions = function () {\r\n\r\n var data = $scope.data;\r\n data.chosenRegisterOptionValid = true;\r\n data.chosenSchoolValid = true;\r\n\r\n if (!data.chosenRegisterOption) {\r\n data.chosenRegisterOptionValid = false;\r\n } else if (data.chosenRegisterOption.id == ft.app.care.types.outOfSchool && data.schools.length && !data.chosenSchool) {\r\n data.chosenSchoolValid = false;\r\n }\r\n\r\n if (!data.chosenRegisterOptionValid || !data.chosenSchoolValid) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n };\r\n\r\n $scope.finishPackages = function () {\r\n\r\n var data = $scope.data;\r\n data.startdateValid = true;\r\n data.chosenPackagesValid = true;\r\n\r\n // startdate must be after today, after date of birth (if given) and on a valid start day (if given)\r\n var startdate = data.startdate;\r\n var minimal = $scope.getMinimalStartdate();\r\n var today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n // validate startdate\r\n if (startdate < minimal || startdate < today) {\r\n data.startdateValid = false;\r\n } else if (data.registerConfig.validStartDays.length && data.registerConfig.validStartDays.indexOf(startdate.getDate()) < 0) {\r\n data.startdateValid = false;\r\n }\r\n\r\n if (data.dateOfBirth && data.dateOfBirth > data.startdate) {\r\n data.startdateValid = false;\r\n }\r\n\r\n // validate packages\r\n var i = 0, t = 0;\r\n var chosen = false;\r\n var chosenPackages = data.chosenPackages;\r\n var registerPackages = data.registerConfig.packages;\r\n var registerPackage, chosenPackage;\r\n var time;\r\n\r\n while (i < registerPackages.length && !chosen) {\r\n registerPackage = registerPackages[i];\r\n\r\n chosenPackage = chosenPackages[registerPackage.id];\r\n\r\n if (chosenPackage && chosenPackage['chosen']) {\r\n\r\n for (t = 0; t < registerPackage.timeslots.length; t++) {\r\n time = chosenPackage[registerPackage.timeslots[t].timeslotId];\r\n\r\n if (time && time['chosen']) {\r\n chosen = true;\r\n }\r\n }\r\n\r\n }\r\n\r\n i += 1;\r\n }\r\n\r\n if (!chosen) {\r\n data.chosenPackagesValid = false;\r\n }\r\n\r\n if (!data.startdateValid || !data.chosenPackagesValid) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n $scope.finishLocations = function () {\r\n var data = $scope.data;\r\n data.chosenLocationsValid = true;\r\n\r\n var i = 0;\r\n var chosen = false;\r\n var chosenLocationId;\r\n\r\n while (i < data.chosenLocations.length && !chosen) {\r\n\r\n chosenLocationId = data.chosenLocations[i]['id'];\r\n\r\n if (chosenLocationId && data.locations.find(x => x.id == chosenLocationId)) {\r\n chosen = true;\r\n }\r\n\r\n i += 1;\r\n }\r\n\r\n if (!chosen) {\r\n data.chosenLocationsValid = false;\r\n }\r\n\r\n if (!data.chosenLocationsValid) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n $scope.finishComments = function () {\r\n\r\n var valid = true;\r\n var data = $scope.data;\r\n var configQuestions = data.configQuestions;\r\n var questions = data.questions || {};\r\n var i, chosenPackage, configQuestion, question;\r\n\r\n for (i = 0; i < configQuestions.length; i++) {\r\n\r\n configQuestion = configQuestions[i];\r\n question = questions[configQuestion.questionId];\r\n\r\n if (configQuestion.isRequired && !question) {\r\n valid = false;\r\n }\r\n\r\n }\r\n\r\n data.questionsValid = valid;\r\n return valid;\r\n\r\n };\r\n\r\n $scope.handleGetRegisterPackages = function (results) {\r\n var startdate = new Date();\r\n var data = $scope.data;\r\n\r\n data.registerConfig = results;\r\n data.registerConfig.packages.sort(function (a, b) {\r\n return a.name.toLowerCase() > b.name.toLowerCase();\r\n });\r\n\r\n var ids = data.registerConfig.packages.map(function (item) {\r\n return item.id;\r\n });\r\n\r\n // set chosen to false on all other packages (if the user has chosen to go back to step 1)\r\n var key;\r\n for (key in data.chosenPackages) {\r\n\r\n // package is from other register option\r\n if (ids.indexOf(key) < 0) {\r\n data.chosenPackages[key].chosen = false;\r\n }\r\n }\r\n\r\n removeLoading(loadingKeyPackages);\r\n };\r\n\r\n $scope.handleGetRegisterPackagesError = function (response) {\r\n };\r\n\r\n $scope.handleGetRegisterLocations = function (results) {\r\n\r\n var data = $scope.data;\r\n data.locations = results || [];\r\n\r\n if (!data.locations.length) {\r\n data.errorMessage = $translate.instant('NEW-CONTRACT.NO-LOCATIONS-AVAILABLE');\r\n return;\r\n }\r\n\r\n if (data.maxLocations > data.locations.length) {\r\n data.maxLocations = data.locations.length;\r\n }\r\n\r\n removeLoading(loadingKeyLocations);\r\n\r\n };\r\n\r\n $scope.handleGetRegisterLocationsError = function (response) {\r\n };\r\n\r\n $scope.getFilteredLocations = function (idx) {\r\n var data = $scope.data;\r\n\r\n var selected = data.chosenLocations.filter(function (itm) {\r\n return (itm.id);\r\n });\r\n\r\n if (selected.length == data.locations.length) {\r\n return data.locations;\r\n }\r\n\r\n if (data.chosenLocations[idx].id) {\r\n return data.locations;\r\n }\r\n\r\n var mapped = data.chosenLocations.map(function (itm) {\r\n return itm.id;\r\n });\r\n\r\n var selectedLocations = mapped.toString();\r\n var locs = data.locations.filter(function (loc) {\r\n return selectedLocations.indexOf(loc.id) < 0;\r\n });\r\n\r\n return locs;\r\n\r\n };\r\n\r\n $scope.distinctChosenLocations = function (idx) {\r\n var data = $scope.data;\r\n var chosen = data.chosenLocations[idx].id;\r\n var chosenLocationId;\r\n var i;\r\n\r\n for (i = data.chosenLocations.length - 1; i >= 0; i--) {\r\n\r\n chosenLocationId = data.chosenLocations[i].id;\r\n\r\n if (i != idx && chosenLocationId && chosenLocationId == chosen) {\r\n chosenLocationId = null;\r\n }\r\n\r\n }\r\n };\r\n\r\n $scope.initChosenSchool = function () {\r\n\r\n var data = $scope.data;\r\n\r\n if (!data.chosenSchool && data.appData.schools.length) {\r\n data.chosenSchool = data.appData.schools[0];\r\n }\r\n\r\n };\r\n\r\n $scope.isDateOfBirthInFuture = function () {\r\n var data = $scope.data;\r\n\r\n if (data.dateOfBirth) {\r\n return ft.dates.isDateInFuture(data.dateOfBirth);\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n $scope.showFrequencyColumn = function (pack) {\r\n var data = $scope.data;\r\n var result = false;\r\n var i, time, id;\r\n var chosen = data.chosenPackages[pack.id];\r\n\r\n for (i = 0; i < pack.timeslots.length; i++) {\r\n time = pack.timeslots[i];\r\n id = time.timeslotId;\r\n\r\n if (chosen && chosen[id] && chosen[id]['chosen']) {\r\n result = true;\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.save = function () {\r\n\r\n var data = $scope.data;\r\n var obj = {\r\n 'registrationId': data.registerConfig.registrationId,\r\n 'preferredLocations': $scope.getLocationsForSave(),\r\n 'selectedPackages': $scope.getPackagesForSave(),\r\n 'child': {\r\n 'name': data.name,\r\n 'gender': data.gender,\r\n 'dateOfBirth': moment(data.dateOfBirth).format(ft.app.datetime.formats.toAPIDate),\r\n 'placeOfBirth': data.placeOfBirth,\r\n 'school': data.chosenRegisterOption.id == data.careConfig.types.outOfSchool && data.chosenSchool ? {\r\n 'id': data.chosenSchool.id,\r\n 'class': {\r\n 'id': data.chosenClass ? data.chosenClass : null\r\n }\r\n } : null,\r\n 'doctor': {\r\n 'name': data.doctorName,\r\n 'contactInformation': [\r\n {\r\n 'type': ft.app.contactInformation.types.phone,\r\n 'content': data.doctorPhone\r\n }\r\n ]\r\n },\r\n 'insurance': {\r\n 'organization': data.insuranceOrganizationName,\r\n 'policyNumber': data.insuranceOrganizationNumber\r\n },\r\n 'contactInformation': data.emergencyNumber ? [\r\n {\r\n 'content': data.emergencyNumber,\r\n 'isEmergency': true, // altijd true voor noodnummer\r\n 'type': 'telephone'\r\n }\r\n ] : null\r\n },\r\n 'contacts': $scope.getContactsForSave(),\r\n 'start': moment(data.startdate).format(ft.app.datetime.formats.toAPIDate),\r\n 'answers': $scope.getAnswersForSave(),\r\n 'remarks': data.comments,\r\n 'careType': data.chosenRegisterOption.id\r\n };\r\n\r\n data.saving = true;\r\n data.saveEnabled = false;\r\n data.successMessage = '';\r\n data.errorMessage = '';\r\n\r\n var prm;\r\n\r\n if ($state.current.data && $state.current.data.newRegistration) {\r\n prm = DataService.registerChildAsync(obj);\r\n } else {\r\n prm = DataService.registerSiblingAsync(obj);\r\n }\r\n\r\n prm.then($scope.handleSave, $scope.handleSaveError);\r\n prm.finally(function () {\r\n data.saving = false;\r\n });\r\n };\r\n\r\n $scope.handleSave = function (results) {\r\n var data = $scope.data;\r\n\r\n data.saveEnabled = false;\r\n data.attempts = 0;\r\n\r\n $rootScope.checkForFormChange = false; // disable form check before navigation\r\n\r\n if ($state.current.data && $state.current.data.newRegistration) {\r\n data.successMessage = $translate.instant('NEW-CONTRACT.SAVED-REGISTRATION');\r\n } else {\r\n $state.go('app.family.list', {success: true, child: true});\r\n }\r\n };\r\n\r\n $scope.handleSaveError = function (response) {\r\n var data = $scope.data;\r\n\r\n data.saveEnabled = true;\r\n data.attempts += 1;\r\n\r\n if (data.attempts > 3) {\r\n data.errorMessage = $translate.instant('NEW-CONTRACT.ERROR-CONTINUES');\r\n } else {\r\n data.errorMessage = $translate.instant('NEW-CONTRACT.ERROR-SAVE-CONTRACT');\r\n }\r\n\r\n if (response && !response.result && response.isReadable) {\r\n data.errorMessage += ' ' + response.message;\r\n }\r\n };\r\n\r\n $scope.getLocationsForSave = function () {\r\n var data = $scope.data;\r\n var result = [];\r\n var i = 0;\r\n\r\n data.chosenLocations.sort(function (a, b) {\r\n return a['preference'] > b['preference'];\r\n });\r\n\r\n for (i = 0; i < data.chosenLocations.length; i++) {\r\n\r\n if (data.chosenLocations[i]['id']) {\r\n result.push({id: data.chosenLocations[i]['id']});\r\n }\r\n\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.getPackagesForSave = function () {\r\n\r\n var data = $scope.data;\r\n var result = [];\r\n\r\n var i = 0, t = 0;\r\n var chosenPackages = data.chosenPackages;\r\n var registerPackages = data.registerConfig.packages;\r\n var registerPackage, chosenPackage;\r\n var time, obj;\r\n\r\n for (i = 0; i < registerPackages.length; i++) {\r\n registerPackage = registerPackages[i];\r\n\r\n var chosenPackage = chosenPackages[registerPackage.id];\r\n\r\n if (chosenPackage && chosenPackage['chosen']) {\r\n\r\n obj = null;\r\n\r\n for (t = 0; t < registerPackage.timeslots.length; t++) {\r\n time = chosenPackage[registerPackage.timeslots[t].timeslotId];\r\n\r\n if (time && time['chosen']) {\r\n\r\n if (!obj) {\r\n obj = {\r\n id: registerPackage.id,\r\n holidayBalance: chosenPackage['holidayBalance'],\r\n timeslots: []\r\n };\r\n\r\n result.push(obj);\r\n }\r\n\r\n obj.timeslots.push({\r\n timeslotId: registerPackage.timeslots[t].timeslotId,\r\n frequency: time['frequency'],\r\n extendedHours: time['expanded'] ? true : false\r\n });\r\n\r\n }\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n return result;\r\n\r\n };\r\n\r\n $scope.getContactsForSave = function () {\r\n var data = $scope.data;\r\n var result = [];\r\n\r\n if ($state.current.data && $state.current.data.newRegistration) {\r\n\r\n var contactData = data.contact;\r\n var parentOneData = data.parentOne;\r\n var parentTwoData = data.parentTwo;\r\n\r\n contactData.address.type = ft.app.contactInformation.categories.home;\r\n\r\n var contact = {\r\n name: contactData.name,\r\n type: ft.app.family.types.member,\r\n dateOfBirth: moment(contactData.dateOfBirth).format(ft.app.datetime.formats.toAPIDate),\r\n gender: contactData.gender,\r\n contactInformation: [\r\n {\r\n type: ft.app.contactInformation.types.phone,\r\n category: ft.app.contactInformation.categories.home,\r\n content: contactData.phone,\r\n },\r\n {\r\n type: ft.app.contactInformation.types.email,\r\n category: ft.app.contactInformation.categories.home,\r\n content: contactData.email,\r\n }\r\n ],\r\n roles: [ft.app.family.roles.responsible],\r\n addresses: [contactData.address]\r\n };\r\n result.push(contact);\r\n\r\n if (data.contactSameAsParent) {\r\n contact.roles.push(ft.app.family.roles.parent);\r\n } else {\r\n\r\n parentOneData.address.type = ft.app.contactInformation.categories.home;\r\n\r\n var parentOne = {\r\n name: parentOneData.name,\r\n type: ft.app.family.types.member,\r\n dateOfBirth: moment(parentOneData.dateOfBirth).format(ft.app.datetime.formats.toAPIDate),\r\n gender: parentOneData.gender,\r\n roles: [ft.app.family.roles.parent],\r\n addresses: [parentOneData.address]\r\n };\r\n result.push(parentOne);\r\n\r\n }\r\n\r\n if (data.fillInSecondParent) {\r\n\r\n var parentTwo = {\r\n name: parentTwoData.name,\r\n type: ft.app.family.types.member,\r\n dateOfBirth: moment(parentTwoData.dateOfBirth).format(ft.app.datetime.formats.toAPIDate),\r\n gender: parentTwoData.gender,\r\n roles: [ft.app.family.roles.parent]\r\n };\r\n\r\n if (parentTwoData.email)\r\n {\r\n parentTwo.contactInformation = [\r\n {\r\n type: ft.app.contactInformation.types.email,\r\n category: ft.app.contactInformation.categories.home,\r\n content: parentTwoData.email,\r\n }\r\n ];\r\n }\r\n\r\n if (data.parentHasSameAddress && data.contactSameAsParent) {\r\n parentTwo.addresses = [contactData.address];\r\n } else if (data.parentHasSameAddress && !data.contactSameAsParent) {\r\n parentTwo.addresses = [parentOneData.address];\r\n } else {\r\n parentTwoData.address.type = ft.app.contactInformation.categories.home;\r\n parentTwo.addresses = [parentTwoData.address];\r\n }\r\n\r\n result.push(parentTwo);\r\n }\r\n } else {\r\n var members = data.appData.members;\r\n var i = 0;\r\n\r\n for (i = 0; i < members.length; i++) {\r\n result.push({\r\n id: members[i].id,\r\n roles: members[i].roles\r\n });\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $scope.getAnswersForSave = function () {\r\n var data = $scope.data;\r\n var i = 0;\r\n var result = [];\r\n\r\n var registerQuestions = data.registerConfig.questions;\r\n var questions = data.questions || [];\r\n var registerQuestion, question;\r\n\r\n if (questions.length == 0) {\r\n return result;\r\n }\r\n\r\n for (i = 0; i < registerQuestions.length; i++) {\r\n registerQuestion = registerQuestions[i];\r\n question = questions[registerQuestion.questionId];\r\n\r\n if (question) {\r\n result.push({\r\n questionId: registerQuestion.questionId,\r\n answer: question\r\n });\r\n }\r\n\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }]);\r\n\r\nft.app.controller('familyAddUserController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', '$filter', '$translate', 'DataService', 'AppService', 'CheckStateChangeService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, $filter, $translate, DataService, AppService, CheckStateChangeService) {\r\n\r\n var initialized = false;\r\n\r\n var getAddressValid = function(addressValid) {\r\n if (addressValid == null) {\r\n addressValid = { postcodeFormat: null, postcodePattern: null };\r\n }\r\n return addressValid;\r\n };\r\n\r\n var getPostcodeFormat = function(countryId, addressValid) {\r\n if (addressValid == null) {\r\n return;\r\n }\r\n if (countryId == null || countryId === ''){\r\n addressValid.postcodeFormat = null;\r\n addressValid.postcodePattern = null;\r\n }\r\n\r\n const country = $scope.data.countries.find(c => c.countryId === countryId);\r\n if (country != null) {\r\n addressValid.postcodeFormat = country.postcodeFormat;\r\n addressValid.postcodePattern = country.postcodePattern;\r\n }\r\n };\r\n\r\n $scope.$watch('data.postalAddress.countryId', (newValue) => {\r\n getPostcodeFormat(newValue, $scope.data.postalAddressValid);\r\n });\r\n\r\n $scope.$watch('data.invoiceAddress.countryId', (newValue) => {\r\n getPostcodeFormat(newValue, $scope.data.invoiceAddressValid);\r\n });\r\n\r\n var getPhoneNumber = $filter('GetPhoneNumber');\r\n var getMobilePhoneNumber = $filter('GetMobilePhoneNumber');\r\n var getEmailAddress = $filter('GetEmailAddress');\r\n var getAddress = $filter('GetAddress');\r\n\r\n CheckStateChangeService.checkFormOnStateChange($scope, 'userForm');\r\n\r\n if (!$scope.data) {\r\n $scope.data = {};\r\n }\r\n\r\n var postalAddressValid = getAddressValid($scope.data.postalAddressValid);\r\n var invoiceAddressValid = getAddressValid($scope.data.invoiceAddressValid);\r\n\r\n ng.extend($scope.data, {\r\n appData: AppService.data,\r\n isEditMode: ($stateParams.user),\r\n sameAsPostalAddress: false,\r\n name: {\r\n lastName: '',\r\n middleName: '',\r\n firstName: '',\r\n initials: ''\r\n },\r\n ssn: '',\r\n dateOfBirth: '',\r\n gender: '',\r\n email: '',\r\n phone: '',\r\n workphone: '',\r\n mobile: '',\r\n postalAddress: {\r\n street: '',\r\n number: '',\r\n zipCode: '',\r\n city: '',\r\n countryId: '',\r\n country: '',\r\n type: ft.app.contactInformation.categories.home\r\n },\r\n invoiceAddress: {\r\n street: '',\r\n number: '',\r\n zipCode: '',\r\n city: '',\r\n countryId: '',\r\n country: '',\r\n type: ft.app.contactInformation.categories.invoice\r\n },\r\n countries: [],\r\n municipalities: [],\r\n dateOfBirthOpened: false,\r\n dateOptions: {\r\n formatYear: 'yy'\r\n },\r\n formats: ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'],\r\n format: 'dd-MM-yyyy',\r\n saving: false,\r\n errorMessage: '',\r\n successMessage: '',\r\n ssnValid: true,\r\n lastNameValid: true,\r\n firstNameValid: true,\r\n initialsValid: true,\r\n dateOfBirthValid: true,\r\n genderValid: true,\r\n postalAddressValid: {\r\n postcodeFormat: postalAddressValid.postcodeFormat,\r\n postcodePattern: postalAddressValid.postcodePattern,\r\n street: true,\r\n number: true,\r\n zipCode: true,\r\n zipCodeFormat: true,\r\n city: true,\r\n country: true\r\n },\r\n invoiceAddressValid: {\r\n postcodeFormat: invoiceAddressValid.postcodeFormat,\r\n postcodePattern: invoiceAddressValid.postcodePattern,\r\n street: true,\r\n number: true,\r\n zipCode: true,\r\n zipCodeFormat: true,\r\n city: true,\r\n country: true\r\n\r\n },\r\n attempts: 0\r\n });\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n $rootScope.$on(ft.app.events.app.config, function () {\r\n $scope.data.countries = AppService.data.countries;\r\n });\r\n\r\n $rootScope.$on(ft.app.events.family.get, function () {\r\n $scope.initializeData();\r\n });\r\n\r\n $scope.data.countries = AppService.data.countries;\r\n $scope.initializeData();\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.initializeData = function () {\r\n\r\n if ($scope.data.user) {\r\n var data = $scope.data;\r\n var user = data.user;\r\n\r\n data.name = user.name;\r\n data.dateOfBirth = new Date(user.dateOfBirth);\r\n data.placeOfBirth = user.placeOfBirth;\r\n data.gender = user.gender;\r\n data.ssn = user.ssn;\r\n data.remarks = user.remarks;\r\n\r\n var phone = getPhoneNumber(user.contactInformation, ft.app.contactInformation.categories.home);\r\n data.phone = phone ? phone.content : '';\r\n\r\n var workphone = getPhoneNumber(user.contactInformation, ft.app.contactInformation.categories.work);\r\n data.workphone = workphone ? workphone.content : '';\r\n\r\n var mobile = getMobilePhoneNumber(user.contactInformation, ft.app.contactInformation.categories.home);\r\n data.mobile = mobile ? mobile.content : '';\r\n\r\n var email = getEmailAddress(user.contactInformation);\r\n data.email = email ? email.content : '';\r\n\r\n var address = getAddress(user.addresses, ft.app.contactInformation.categories.home);\r\n data.postalAddress = address || null;\r\n\r\n var address = getAddress(user.addresses, ft.app.contactInformation.categories.invoice);\r\n data.invoiceAddress = address || null;\r\n }\r\n\r\n };\r\n\r\n $scope.open = function ($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n $scope.data.dateOfBirthOpened = true;\r\n };\r\n\r\n var isMatch = function(value, pattern){\r\n if (pattern == null || pattern === '') {\r\n return true;\r\n }\r\n if (value == null || value === '') {\r\n return false;\r\n }\r\n const rx = new RegExp(pattern.trim(), 'g');\r\n return rx.test(value.trim());\r\n };\r\n\r\n var validateAddress = function(address, addressValid) {\r\n if (address == null || addressValid == null) {\r\n return;\r\n }\r\n\r\n if (!address.street.trim()) {\r\n addressValid.street = false;\r\n }\r\n\r\n if (!address.number.trim()) {\r\n addressValid.number = false;\r\n }\r\n\r\n if (!address.zipCode.trim() && !isMatch(address.zipCode, addressValid.postcodePattern)) {\r\n addressValid.zipCode = false;\r\n }\r\n if (addressValid.zipCode && !isMatch(address.zipCode, addressValid.postcodePattern)) {\r\n addressValid.zipCodeFormat = false;\r\n }\r\n\r\n if (!address.city.trim()) {\r\n addressValid.city = false;\r\n }\r\n\r\n if (!address.countryId || (address.countryId && !address.countryId.trim())) {\r\n addressValid.country = false;\r\n }\r\n };\r\n\r\n $scope.save = function () {\r\n\r\n var data = $scope.data;\r\n\r\n var postalAddress = data.postalAddress;\r\n var invoiceAddress = data.invoiceAddress;\r\n var postalAddressValid = getAddressValid(data.postalAddressValid);\r\n var invoiceAddressValid = getAddressValid(data.invoiceAddressValid);\r\n\r\n data.errorMessage = '';\r\n data.successMessage = '';\r\n\r\n data.lastNameValid = true;\r\n data.firstNameValid = true;\r\n data.initialsValid = true;\r\n data.dateOfBirthValid = true;\r\n data.genderValid = true;\r\n data.ssnValid = true;\r\n\r\n data.postalAddressValid = {\r\n postcodeFormat: postalAddressValid.postcodeFormat,\r\n postcodePattern: postalAddressValid.postcodePattern,\r\n street: true,\r\n number: true,\r\n zipCode: true,\r\n zipCodeFormat: true,\r\n city: true,\r\n country: true\r\n\r\n };\r\n postalAddressValid = data.postalAddressValid;\r\n\r\n data.invoiceAddressValid = {\r\n postcodeFormat: invoiceAddressValid.postcodeFormat,\r\n postcodePattern: invoiceAddressValid.postcodePattern,\r\n street: true,\r\n number: true,\r\n zipCode: true,\r\n zipCodeFormat: true,\r\n city: true,\r\n country: true\r\n };\r\n invoiceAddressValid = data.invoiceAddressValid;\r\n\r\n if (!data.name.lastName.trim()) {\r\n data.lastNameValid = false;\r\n }\r\n\r\n if (!data.name.firstName.trim() && !data.name.initials.trim()) {\r\n data.firstNameValid = false;\r\n data.initialsValid = false;\r\n }\r\n\r\n if (!data.dateOfBirth) {\r\n data.dateOfBirthValid = false;\r\n } else {\r\n if (!moment(data.dateOfBirth).isValid()) {\r\n data.dateOfBirthValid = false;\r\n }\r\n }\r\n\r\n if (!data.gender) {\r\n data.genderValid = false;\r\n }\r\n\r\n if (data.appData.ssnIsRequiredAndShown && !data.ssn) {\r\n data.ssnValid = false;\r\n }\r\n\r\n //#region postal\r\n\r\n validateAddress(postalAddress, postalAddressValid);\r\n\r\n //#endregion\r\n\r\n //#region invoice\r\n if (!data.sameAsPostalAddress) {\r\n validateAddress(invoiceAddress, invoiceAddressValid);\r\n }\r\n //#endregion\r\n\r\n if (!data.lastNameValid || !data.firstNameValid || !data.initialsValid || !data.dateOfBirthValid || !data.genderValid) {\r\n return;\r\n }\r\n\r\n if (!postalAddressValid.street || !postalAddressValid.number || !postalAddressValid.zipCode || !postalAddressValid.zipCodeFormat || !postalAddressValid.city || !postalAddressValid.country) {\r\n return;\r\n }\r\n\r\n if (data.sameAsPostalAddress) {\r\n ng.copy(data.postalAddress, data.invoiceAddress);\r\n data.invoiceAddress.type = ft.app.contactInformation.categories.invoice;\r\n }\r\n else if (!invoiceAddressValid.street || !invoiceAddressValid.number || !invoiceAddressValid.zipCode || !invoiceAddressValid.zipCodeFormat || !invoiceAddressValid.city || !invoiceAddressValid.country) {\r\n return;\r\n }\r\n\r\n var obj = {\r\n name: data.name,\r\n type: ft.app.family.types.member,\r\n dateOfBirth: moment(data.dateOfBirth).format(ft.app.datetime.formats.toAPIDate),\r\n gender: data.gender,\r\n contactInformation: [\r\n {\r\n type: ft.app.contactInformation.types.phone,\r\n category: ft.app.contactInformation.categories.home,\r\n content: data.phone,\r\n },\r\n {\r\n type: ft.app.contactInformation.types.phone,\r\n category: ft.app.contactInformation.categories.work,\r\n content: data.workphone,\r\n },\r\n {\r\n type: ft.app.contactInformation.types.mobile,\r\n category: ft.app.contactInformation.categories.home,\r\n content: data.mobile,\r\n }\r\n ],\r\n addresses: [\r\n data.postalAddress,\r\n data.invoiceAddress\r\n ],\r\n remarks: data.remarks\r\n };\r\n\r\n if (data.user) {\r\n obj.id = data.user.id;\r\n }\r\n\r\n if (data.appData.ssnIsRequiredAndShown) {\r\n obj.ssn = data.ssn;\r\n }\r\n\r\n if (!data.isEditMode) {\r\n obj.contactInformation.push({\r\n type: ft.app.contactInformation.types.email,\r\n category: ft.app.contactInformation.categories.home,\r\n content: data.email,\r\n });\r\n }\r\n\r\n $scope.data.saving = true;\r\n DataService.saveUserAsync(obj).then($scope.handleSave, $scope.handleSaveError);\r\n };\r\n\r\n $scope.handleSave = function (result) {\r\n\r\n var prm = AppService.getFamilyAsync();\r\n prm.then(function () {\r\n\r\n $scope.data.attempts = 0;\r\n $scope.data.saving = false;\r\n\r\n $rootScope.checkForFormChange = false;\r\n\r\n if ($scope.data.user) {\r\n $state.go('app.user.info', {id: $scope.data.user.id, success: true});\r\n } else {\r\n $state.go('app.family.list', {success: true, parent: true});\r\n }\r\n\r\n }, function () {\r\n });\r\n\r\n };\r\n\r\n $scope.handleSaveError = function (response) {\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorMessage = $translate.instant('PROFILE.ERROR-CONTINUES');\r\n } else {\r\n $scope.data.errorMessage = $translate.instant('PROFILE.ERROR-SAVE-INFO');\r\n }\r\n\r\n if (response && !response.result && response.isReadable) {\r\n $scope.data.errorMessage += ' ' + response.message;\r\n }\r\n\r\n $scope.data.saving = false;\r\n };\r\n\r\n $scope.cancel = function () {\r\n\r\n $state.go('app.user.info', {user: $stateParams.user});\r\n\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }]);\r\n\r\nft.app.controller('familyUploadProfilePictureController',\r\n ['$rootScope', '$scope', '$state', '$stateParams', '$q', '$timeout', '$translate', 'DataService',\r\n function ($rootScope, $scope, $state, $stateParams, $q, $timeout, $translate, DataService) {\r\n\r\n var initialized = false;\r\n\r\n if (!$scope.data) {\r\n $scope.data = {};\r\n }\r\n\r\n $scope.data.errorMessage = '';\r\n $scope.data.successMessage = '';\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n initialized = true;\r\n\r\n };\r\n\r\n $scope.saveImage = function (image) {\r\n\r\n $scope.data.errorMessage = '';\r\n $scope.data.successMessage = '';\r\n\r\n var data = image.data.replace(/^data:image\\/(png|jpg|jpeg);base64,/gi, '');\r\n var user = $stateParams.user || $stateParams.child;\r\n var type = $stateParams.user ? ft.app.family.types.member : ft.app.family.types.child;\r\n\r\n DataService.saveProfilePictureAsync(user, type, data).then(\r\n function (results) {\r\n // done\r\n $scope.data.successMessage = $translate.instant('PROFILE-PICTURE.SAVED');\r\n },\r\n function (response) {\r\n // fail\r\n $scope.data.errorMessage = !response.result && response.isReadable ? response.message : $translate.instant('PROFILE-PICTURE.ERROR-SAVE-PICTURE');\r\n });\r\n\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }]);\r\n","import { ft } from '../definitions';\r\nimport moment from 'moment';\r\nimport { IPromise, IRootScopeService, IScope, ITimeoutService } from 'angular';\r\nimport { IStateParamsService } from 'angular-ui-router';\r\nimport { ngStorage } from 'ngstorage';\r\nimport { MediaListResponse, MediaReference, MediaType } from '@js/models';\r\nimport { UrlHelper } from '@js/urlHelper';\r\nimport { AppService } from '@js/services/FT.app.services.appservice';\r\nimport { DataService } from '../services/FT.app.services.dataservice';\r\nimport { VideoMediaReference } from './FT.app.controllers.dashboard';\r\n\r\ninterface IData {\r\n errorText: string;\r\n isLoading: boolean;\r\n}\r\n\r\ninterface ILocalScope extends IScope {\r\n sendMediaNotification: any;\r\n handleGetMediaError: (response: any) => void;\r\n media: MediaItem[];\r\n images: MediaItem[];\r\n videos: VideoMediaReference[];\r\n canLoadMoreImages: boolean;\r\n\r\n data: IData;\r\n\r\n openLightbox: (mediaItem: MediaItem) => void;\r\n initializeData: () => void;\r\n initialize: () => void;\r\n refreshMedia: () => void;\r\n getMoreMedia: () => void;\r\n}\r\n\r\nexport interface MediaItem {\r\n src: string; // Required for lightbox\r\n albumId: string;\r\n mediaId: string;\r\n thumbUrl: string;\r\n caption: string;\r\n type: MediaType;\r\n media: MediaReference;\r\n createdOn: string;\r\n}\r\n\r\nft.app.controller('medialibraryController',\r\n ['$rootScope', '$scope', '$stateParams', '$timeout', '$translate', 'DataService', 'AppService', '$sessionStorage', 'lightbox',\r\n function (\r\n $rootScope: IRootScopeService, $scope: ILocalScope,\r\n $stateParams: IStateParamsService, $timeout: ITimeoutService,\r\n $translate: angular.translate.ITranslateService, dataService: DataService, AppService: AppService,\r\n $sessionStorage: ngStorage.StorageService, lightbox) {\r\n\r\n let initialized = false;\r\n let lastFetchDateMedia = null;\r\n const token = $sessionStorage.refreshToken;\r\n\r\n const lightboxOptions = {\r\n fitImageInViewPort: true,\r\n showImageNumberLabel: true,\r\n alwaysShowNavOnTouchDevices: false,\r\n wrapAround: false\r\n };\r\n\r\n $scope.media = [];\r\n\r\n $scope.data = {\r\n isLoading: false,\r\n errorText: ''\r\n };\r\n\r\n $scope.initialize = function () {\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n if ($stateParams.child && AppService.data.currentUser) {\r\n $scope.initializeData();\r\n } else {\r\n $rootScope.$on(ft.app.events.family.get, $scope.initializeData);\r\n }\r\n\r\n initialized = true;\r\n };\r\n\r\n $scope.initializeData = function () {\r\n $scope.data.isLoading = true;\r\n\r\n getMediaAsync()\r\n .then(handleGetMediaInitial)\r\n .finally(() => $scope.data.isLoading = false);\r\n };\r\n\r\n $scope.openLightbox = (mediaItem: MediaItem) => {\r\n lightbox.open($scope.images, $scope.images.indexOf(mediaItem), lightboxOptions);\r\n };\r\n\r\n var getMediaAsync = function (): IPromise {\r\n const dateTime = moment().utc().format('YYYY-MM-DDTHH-mm-ss');\r\n if (!lastFetchDateMedia) {\r\n lastFetchDateMedia = dateTime;\r\n return dataService.getMediaUntilAsync(lastFetchDateMedia, $stateParams.child);\r\n }\r\n\r\n const returnValue = dataService.getMediaSinceAsync(lastFetchDateMedia);\r\n lastFetchDateMedia = dateTime;\r\n return returnValue;\r\n };\r\n\r\n var getMoreMediaAsync = function (): IPromise {\r\n let date = moment($scope.media[$scope.media.length -1].createdOn).format('YYYY-MM-DDTHH-mm-ss')|| moment().utc().format('YYYY-MM-DDTHH-mm-ss');\r\n return dataService.getMediaUntilAsync(date, $stateParams.child);\r\n };\r\n $scope.getMoreMedia = function () {\r\n console.log('Im getting more media...');\r\n getMoreMediaAsync().then(handleGetMediaInitial);\r\n };\r\n\r\n $scope.refreshMedia = function () {\r\n console.log('Im refreshing the media...');\r\n getMediaAsync().then(handleGetMediaLater);\r\n };\r\n\r\n var handleGetMediaInitial = function (results: MediaListResponse) {\r\n return handleGetMedia(results, true);\r\n };\r\n\r\n var handleGetMediaLater = function (results: MediaListResponse) {\r\n return handleGetMedia(results, false);\r\n };\r\n\r\n var handleGetMedia = function (results: MediaListResponse, isInitial: boolean) {\r\n let currentItems = $scope.media || [];\r\n let imageLength = $scope?.images?.length || 0;\r\n const newMediaItems = results.media.map(m => ({\r\n albumId: m.albumId,\r\n mediaId: m.mediaId,\r\n src: createUrl(m.media.url),\r\n thumbUrl: createUrl(m.media.poster),\r\n caption: m.media.title,\r\n type: m.media.type,\r\n media: m.media,\r\n createdOn: m.createdOn\r\n }));\r\n\r\n for (const mediaItem of newMediaItems) {\r\n const existingItem = currentItems.find(x => x.mediaId == mediaItem.mediaId);\r\n if (isInitial && !existingItem) {\r\n currentItems.push(mediaItem);\r\n }\r\n else {\r\n currentItems.unshift(mediaItem);\r\n } \r\n }\r\n\r\n $scope.media = currentItems;\r\n\r\n $scope.images = [...$scope.media.filter(m => m.type == MediaType.image)];\r\n $scope.videos = $scope.media.filter(m => m.type == MediaType.video).map(v => {\r\n const media = v.media as VideoMediaReference;\r\n\r\n var newMedia = {...media };\r\n\r\n newMedia.videoUrl = media.url;\r\n newMedia.url = v.thumbUrl;\r\n\r\n return newMedia;\r\n });\r\n $scope.canLoadMoreImages = imageLength != $scope.images.length && $scope.images.length % 100 == 0;\r\n }; \r\n\r\n $scope.handleGetMediaError = function () {\r\n $scope.data.errorText = $translate.instant('CHILD-MEDIA.ERROR-GET-ITEMS');\r\n };\r\n\r\n function createUrl(url: string): string {\r\n\r\n const encodedToken = encodeURIComponent(token);\r\n\r\n let absoluteUrl = url;\r\n\r\n if (!UrlHelper.isUrlAbsolute(absoluteUrl)) {\r\n absoluteUrl = UrlHelper.createAbsoluteMediaUrl(AppService.data.services['media'], url);\r\n }\r\n\r\n return `${absoluteUrl}?access_token=${encodedToken}`;\r\n }\r\n\r\n $timeout($scope.initialize);\r\n\r\n }\r\n ]);","import moment, { Moment, Duration } from 'moment';\r\nimport { ft } from '@js/definitions';\r\nimport { IScope } from 'angular';\r\nimport { Params } from '@js/services/FT.app.services.planningmodalservice';\r\nimport { DataService } from '@js/services/FT.app.services.dataservice';\r\nimport angular from 'angular';\r\nimport { AbsenceType } from '@js/models';\r\n\r\nenum SickEnd {\r\n today = 'today',\r\n tomorrow = 'tomorrow',\r\n unknown = 'unknown',\r\n}\r\n\r\nfunction formatTime(duration: moment.Duration): string {\r\n return moment.utc(duration.as('milliseconds')).format('HH:mm');\r\n}\r\n\r\ninterface FromData {\r\n tillTime: string;\r\n fromTime: string;\r\n till: Date;\r\n from: Date;\r\n attempts: number;\r\n planningConfig: any;\r\n saving: boolean;\r\n comments: string;\r\n\r\n format: string;\r\n minDate: Date;\r\n\r\n fromOpened: boolean;\r\n tillOpened: boolean;\r\n sickEnd: SickEnd;\r\n fromValid: boolean;\r\n tillValid: boolean;\r\n fromTimeValid: boolean;\r\n tillTimeValid: boolean;\r\n\r\n dateOptions: any;\r\n\r\n reason: AbsenceType;\r\n reasons: Array<{ key: AbsenceType; title: string }>;\r\n errorMessage: string;\r\n successMessage: string;\r\n}\r\n\r\ninterface Scope extends IScope {\r\n data: FromData;\r\n cancel: () => void;\r\n save: () => void;\r\n open: (from: boolean, $event: MouseEvent) => void;\r\n isSick: () => boolean;\r\n close: () => void;\r\n canSave: () => boolean;\r\n isValid: (field: string) => boolean;\r\n}\r\n\r\nexport class AbsentModalController {\r\n public static $inject = ['$scope', 'close', 'params', '$translate', 'DataService', 'CheckStateChangeService'];\r\n private $scope: Scope;\r\n private closeDialog: (param?: any) => void;\r\n private params: Params;\r\n private $translate: angular.translate.ITranslateService;\r\n private dataService: DataService;\r\n private checkStateChangeService: any;\r\n\r\n public constructor($scope: Scope, close: () => void, params: Params, $translate: angular.translate.ITranslateService, dataService: DataService, checkStateChangeService) {\r\n this.$scope = $scope;\r\n this.closeDialog = close;\r\n this.params = params;\r\n this.$translate = $translate;\r\n this.dataService = dataService;\r\n this.checkStateChangeService = checkStateChangeService;\r\n\r\n this.$scope.close = this.close.bind(this);\r\n this.$scope.isSick = this.isSick.bind(this);\r\n this.$scope.open = this.open.bind(this);\r\n this.$scope.save = this.save.bind(this);\r\n this.$scope.cancel = this.cancel.bind(this);\r\n this.$scope.canSave = this.canSave.bind(this);\r\n this.$scope.isValid = this.isValid.bind(this);\r\n\r\n this.initialize();\r\n }\r\n\r\n private initialize() {\r\n\r\n this.checkStateChangeService.checkFormOnStateChange(this.$scope, 'absentForm');\r\n\r\n this.$scope.data = {\r\n attempts: 0,\r\n planningConfig: ft.app.planning,\r\n saving: false,\r\n comments: '',\r\n format: 'dd-MM-yyyy',\r\n minDate: new Date(),\r\n from: null,\r\n till: null,\r\n fromTime: null,\r\n tillTime: null,\r\n fromOpened: false,\r\n tillOpened: false,\r\n sickEnd: SickEnd.today,\r\n fromValid: true,\r\n tillValid: true,\r\n fromTimeValid: true,\r\n tillTimeValid: true,\r\n dateOptions: {\r\n formatYear: 'yy'\r\n },\r\n reason: this.params.presence ?? AbsenceType.absent,\r\n reasons: [\r\n { key: AbsenceType.absent, title: this.$translate.instant('PLANNING-ABSENT.ABSENT') },\r\n { key: AbsenceType.sick, title: this.$translate.instant('PLANNING-ABSENT.SICK') }\r\n ],\r\n errorMessage: '',\r\n successMessage: ''\r\n };\r\n\r\n this.$scope.data.from = this.params.from.toDate();\r\n this.$scope.data.till = this.params.till.toDate();\r\n\r\n this.$scope.data.fromTime = formatTime(this.params.fromTime);\r\n this.$scope.data.tillTime = formatTime(this.params.tillTime);\r\n }\r\n\r\n private open(from: boolean, $event: MouseEvent): void {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n if (from) {\r\n this.$scope.data.fromOpened = true;\r\n } else {\r\n this.$scope.data.tillOpened = true;\r\n }\r\n }\r\n\r\n private isSick() {\r\n return this.$scope.data.reason == AbsenceType.sick;\r\n }\r\n\r\n private async save(): Promise {\r\n var data = this.$scope.data;\r\n data.errorMessage = '';\r\n data.successMessage = '';\r\n\r\n const dates: { from?: Moment; till?: Moment } = {};\r\n const validation = this.validate(data, dates);\r\n\r\n data.fromValid = validation['fromDate'] ?? true;\r\n data.tillValid = validation['tillDate'] ?? true;\r\n data.fromTimeValid = validation['fromTime'] ?? true;\r\n data.tillTimeValid = validation['tillTime'] ?? true;\r\n\r\n if (Object.keys(validation).length > 0) {\r\n return;\r\n }\r\n\r\n if (data.reason == AbsenceType.sick) {\r\n if (data.sickEnd === SickEnd.tomorrow) {\r\n dates.till = moment().add(1, 'day').endOf('day');\r\n } else if (data.sickEnd === SickEnd.today) {\r\n dates.till = moment().endOf('day');\r\n } else if (data.sickEnd === SickEnd.unknown) {\r\n dates.till = undefined;\r\n }\r\n }\r\n\r\n data.saving = true;\r\n let response: any;\r\n try {\r\n const format = moment.HTML5_FMT.DATE + ' ' + moment.HTML5_FMT.TIME;\r\n response = await this.dataService.saveAbsentAsync(this.params.childId, dates.from.format(format), dates.till?.format(format), data.reason, data.comments);\r\n\r\n data.attempts = 0;\r\n data.successMessage = this.$translate.instant('PLANNING-ABSENT.SAVED');\r\n } catch (error) {\r\n this.handleSaveError(response);\r\n } finally {\r\n data.saving = false;\r\n this.close();\r\n }\r\n }\r\n\r\n private validateDate(date?: Date): Moment {\r\n if (date == null) {\r\n return null;\r\n }\r\n\r\n const converted = moment(date);\r\n if (!converted.isValid()) {\r\n return null;\r\n }\r\n\r\n return converted;\r\n }\r\n\r\n private validateDuration(time?: string): Duration {\r\n if (time == null) {\r\n return null;\r\n }\r\n\r\n const converted = moment.duration(time);\r\n if (!converted.isValid()) {\r\n return null;\r\n }\r\n\r\n return converted;\r\n }\r\n\r\n private isValid(field: string): boolean {\r\n const validation = this.validate(this.$scope.data);\r\n return validation[field] ?? true;\r\n }\r\n\r\n private validate(data: FromData, dateResults?: { from?: Moment; till?: Moment }): { [key: string]: boolean } {\r\n const result = { };\r\n if (dateResults == null) {\r\n dateResults = {};\r\n }\r\n\r\n if (data.reason === AbsenceType.sick) {\r\n dateResults.from = moment();\r\n\r\n return result;\r\n }\r\n\r\n const fromDate = this.validateDate(data.from);\r\n if (fromDate == null) {\r\n result['fromDate'] = false;\r\n }\r\n\r\n const tillDate = this.validateDate(data.till);\r\n if (tillDate == null || fromDate.isAfter(tillDate)) {\r\n result['tillDate'] = false;\r\n }\r\n\r\n const fromTime = this.validateDuration(data.fromTime);\r\n if (fromTime == null) {\r\n result['fromTime'] = false;\r\n }\r\n\r\n const tillTime = this.validateDuration(data.tillTime);\r\n if (tillTime == null) {\r\n result['tillTime'] = false;\r\n }\r\n\r\n const from = fromDate.clone().startOf('day').add(fromTime);\r\n const till = tillDate.clone().startOf('day').add(tillTime);\r\n\r\n if (from.isSameOrAfter(till)) {\r\n result['tillTime'] = false;\r\n }\r\n\r\n dateResults.from = from;\r\n dateResults.till = till;\r\n\r\n return result;\r\n }\r\n\r\n private handleSaveError(response) {\r\n var data = this.$scope.data;\r\n\r\n data.attempts += 1;\r\n\r\n if (data.attempts > 3) {\r\n data.errorMessage = this.$translate.instant('PLANNING-ABSENT.ERROR-CONTINUES');\r\n } else {\r\n data.errorMessage = this.$translate.instant('PLANNING-ABSENT.ERROR-SAVE-ABSENT');\r\n }\r\n\r\n if (response && !response.result && response.isReadable) {\r\n data.errorMessage += ' ' + response.message;\r\n }\r\n }\r\n\r\n private close() {\r\n if (!this.$scope.data.saving) {\r\n this.canSave() ? this.closeDialog() : this.closeDialog({});\r\n }\r\n }\r\n\r\n private cancel() {\r\n if (!this.$scope.data.saving) {\r\n this.closeDialog();\r\n }\r\n }\r\n\r\n private canSave(): boolean {\r\n if (this.$scope.data.saving) {\r\n return false;\r\n }\r\n\r\n return Object.keys(this.validate(this.$scope.data)).length === 0;\r\n }\r\n}\r\n\r\nft.app.controller('absentModalController', AbsentModalController);","import { ft } from '@js/definitions';\r\nimport moment from 'moment';\r\nimport { IScope, IQService } from 'angular';\r\nimport { AppService, IAppData } from '../../services/FT.app.services.appservice';\r\nimport { DataService } from '../../services/FT.app.services.dataservice';\r\nimport { PersonModel, StrippenkaartBalanceResponse, StrippenkaartBalanceModel, PlanningDayType, PlanningBlock, EntityType } from '@js/models';\r\n\r\ninterface Item {\r\n date: string;\r\n dayType: PlanningDayType;\r\n block: PlanningBlock;\r\n}\r\n\r\ninterface ModalData {\r\n childId: string;\r\n child: PersonModel;\r\n irregularHoursSummaries: any[];\r\n totalCreditHours: number;\r\n useCreditHours: boolean;\r\n creditHoursApplicable: boolean;\r\n isLoading: boolean;\r\n holidayBalanceValid: boolean;\r\n holidayBalance: number;\r\n requestedBalance: number;\r\n stripCardBalanceValid: boolean;\r\n stripCardBalances: StrippenkaartBalanceModel[];\r\n saving: boolean;\r\n useBalanceAs: boolean;\r\n saveEnabled: boolean;\r\n attempts: number;\r\n showHolidayBalance: boolean;\r\n showStripCardBalance: boolean;\r\n cancellation: boolean;\r\n items: Item[];\r\n\r\n errorMessage?: string;\r\n successMessage?: string;\r\n}\r\n\r\ninterface Scope extends IScope {\r\n isLoading: boolean;\r\n data: ModalData;\r\n appData: IAppData;\r\n showIrregularTimeFields: boolean;\r\n initialize: () => void;\r\n validateHolidayBalance();\r\n getIrregularHoursSummary();\r\n resetTimes(block: PlanningBlock);\r\n handleGetIrregularHoursSummary(results: any);\r\n handleGetIrregularHoursSummaryError(response: { result: any; isReadable: any; message: string });\r\n filterStripCardItem(filterStripCardItem: any);\r\n save: () => void;\r\n handleSaveCancellation();\r\n handleSaveCancellationError(response: { result: any; isReadable: any; message: string });\r\n handleSave();\r\n handleSaveError(response: { result: any; isReadable: any; message: string });\r\n close();\r\n saveHolidayBalance: () => void;\r\n handleSaveHolidayBalance();\r\n handleSaveHolidayBalanceError(response: { result: any; isReadable: any; message: string });\r\n saveStripCardBalance: (balance: any) => void;\r\n cancel: () => void;\r\n filterItem: (item: any) => boolean;\r\n filterHolidayItem(item: any);\r\n}\r\n\r\nft.app.controller('requestModalController',\r\n ['$scope', 'close', 'modalData', '$filter', '$timeout', '$q', '$translate', 'AppService', 'DataService',\r\n function ($scope: Scope, close: (result?: any, delay?: number) => void, modalData: ModalData, $filter, $timeout, $q: IQService, $translate, AppService: AppService, DataService: DataService) {\r\n\r\n // modalData consist of child id and boolean for cancellation\r\n // modalData also consist of 1 or more items\r\n\r\n var groupBy = $filter('GroupByFilter');\r\n\r\n var initialized = false;\r\n var holidayBalanceTypes = ft.app.holidayBalance.type;\r\n var startDate;\r\n\r\n $scope.appData = AppService.data;\r\n $scope.data = {\r\n childId: '',\r\n isLoading: false,\r\n attempts: 0,\r\n saveEnabled: true,\r\n saving: false,\r\n child: null,\r\n cancellation: modalData.cancellation,\r\n items: modalData.items,\r\n showHolidayBalance: false,\r\n holidayBalance: null,\r\n requestedBalance: null,\r\n showStripCardBalance: false,\r\n stripCardBalances: null,\r\n useBalanceAs: holidayBalanceTypes.requestNew,\r\n holidayBalanceValid: true,\r\n stripCardBalanceValid: true,\r\n irregularHoursSummaries: [],\r\n creditHoursApplicable: false,\r\n useCreditHours: true,\r\n totalCreditHours: 0\r\n };\r\n\r\n $scope.initialize = function () {\r\n\r\n if (initialized) {\r\n return;\r\n }\r\n\r\n var data = $scope.data;\r\n\r\n data.child = AppService.getUser(modalData.childId);\r\n\r\n if ($scope.appData.useHolidayBalance && hasHolidayRequestables()) {\r\n $scope.validateHolidayBalance();\r\n }\r\n\r\n $scope.getIrregularHoursSummary();\r\n\r\n if (hasStripCardRequestables()) {\r\n getStripCardBalance();\r\n }\r\n\r\n data.items.forEach(function (item) {\r\n $scope.resetTimes(item.block);\r\n });\r\n\r\n $scope.showIrregularTimeFields = AppService.data.showIrregularTimeFields && $scope.data.items.every(x => x.block.type !== EntityType.chiStudiedag);\r\n\r\n initialized = true;\r\n };\r\n\r\n $scope.resetTimes = function (block) {\r\n\r\n block.requestedStart = block.start.substr(0, 5);\r\n block.requestedEnd = block.end.substr(0, 5);\r\n\r\n };\r\n\r\n $scope.getIrregularHoursSummary = function () {\r\n\r\n var data = $scope.data;\r\n var months = groupBy(data.items, 'date', function (val) {\r\n return val.substr(0, 7) + '-01'; // YYYY-mm-01\r\n });\r\n\r\n var firstItem = data.items[0];\r\n var prms = months.map(x => DataService.getIrregularHoursSummaryAsync(data.child.id, x.title,firstItem.block.planningId));\r\n\r\n\r\n prms = $q.all(prms);\r\n prms.then($scope.handleGetIrregularHoursSummary, $scope.handleGetIrregularHoursSummaryError);\r\n };\r\n\r\n $scope.handleGetIrregularHoursSummary = function (results) {\r\n var data = $scope.data;\r\n data.irregularHoursSummaries = results;\r\n\r\n data.irregularHoursSummaries.forEach(function (summary) {\r\n data.totalCreditHours = summary.creditHours;\r\n data.creditHoursApplicable = summary.creditHoursApplicable;\r\n });\r\n };\r\n\r\n $scope.handleGetIrregularHoursSummaryError = function () {\r\n };\r\n\r\n $scope.validateHolidayBalance = function () {\r\n\r\n var itm, requestables = [];\r\n\r\n modalData.items.forEach(function (item) {\r\n\r\n itm = {\r\n requestableId: item.block.id || item.block.planningId,\r\n requestableType: item.block.type,\r\n date: item.date,\r\n start: item.block.start,\r\n end: item.block.end,\r\n timeslotId: item.block.timeslotId\r\n };\r\n\r\n requestables.push(itm);\r\n\r\n });\r\n\r\n if (requestables.length) {\r\n\r\n $scope.isLoading = true;\r\n\r\n var prm = DataService.validateRequestAsync($scope.data.child.id, requestables);\r\n prm.then(handleValidateHolidayBalance, handleValidateHolidayBalanceError);\r\n prm.finally(function () {\r\n $scope.data.isLoading = false;\r\n });\r\n\r\n }\r\n\r\n };\r\n\r\n var handleValidateHolidayBalance = function (result) {\r\n\r\n if (result) {\r\n\r\n if (result.requestables && result.requestables.length) {\r\n getHolidayBalance();\r\n\r\n var denied = result.requestables.find(x => x.validation.isSuccess == false);\r\n\r\n if (denied) {\r\n $scope.data.holidayBalanceValid = false;\r\n startDate = denied.date; // first day of the new holiday balance term\r\n } else {\r\n $scope.data.holidayBalanceValid = true;\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n var handleValidateHolidayBalanceError = function (response) {\r\n\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('PLANNING-REQUEST.ERROR-VALIDATE-HOLIDAY-BALANCE');\r\n\r\n if ($scope.appData.useHolidayBalance) {\r\n $scope.data.holidayBalanceValid = false;\r\n }\r\n\r\n };\r\n\r\n var getHolidayBalance = function () {\r\n\r\n $scope.isLoading = true;\r\n\r\n var date = modalData.items.length ? modalData.items[0].date : new Date();\r\n var mDate = moment(date).format(ft.app.datetime.formats.toAPIDate);\r\n\r\n var prm = DataService.getHolidayBalanceAsync($scope.data.child.id, mDate);\r\n prm.then(handleGetHolidayBalance, handleGetHolidayBalanceError);\r\n prm.finally(function () {\r\n $scope.data.isLoading = false;\r\n });\r\n\r\n };\r\n\r\n var handleGetHolidayBalance = function (result) {\r\n\r\n if (result) {\r\n var availableBalances = result.availableBalances;\r\n $scope.data.holidayBalance = result;\r\n $scope.data.requestedBalance = availableBalances && availableBalances.length ? availableBalances[0].id : null;\r\n }\r\n\r\n };\r\n\r\n var handleGetHolidayBalanceError = function (response) {\r\n\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('PLANNING-REQUEST.ERROR-GET-HOLIDAY-BALANCE');\r\n\r\n };\r\n\r\n var getStripCardBalance = function () {\r\n\r\n $scope.isLoading = true;\r\n\r\n var prm = DataService.getStripCardBalanceAsync($scope.data.child.id);\r\n prm.then(handleGetStripCardBalance, handleGetStripCardBalanceError);\r\n prm.finally(function () {\r\n $scope.data.isLoading = false;\r\n });\r\n\r\n };\r\n\r\n var handleGetStripCardBalance = function (result: StrippenkaartBalanceResponse) {\r\n\r\n var data = $scope.data;\r\n data.stripCardBalanceValid = true;\r\n data.stripCardBalances = result.items;\r\n\r\n if (!data.stripCardBalances || !data.stripCardBalances.length) {\r\n return;\r\n }\r\n\r\n var blocks = data.items.filter($scope.filterStripCardItem).map(function (item) {\r\n return item.block;\r\n });\r\n var block, balances, balance;\r\n var i = 0;\r\n\r\n while (data.stripCardBalanceValid && i < blocks.length) {\r\n\r\n block = blocks[i];\r\n balances = data.stripCardBalances.filter(function (item) {\r\n return item.companyId == block.companyId && item.packageId == block.packageId;\r\n });\r\n\r\n if (balances && balances.length) {\r\n balance = balances[0];\r\n\r\n if (!balance.currentBalance) {\r\n data.stripCardBalanceValid = false;\r\n }\r\n }\r\n\r\n i++;\r\n }\r\n };\r\n\r\n var handleGetStripCardBalanceError = function (response) {\r\n\r\n $scope.data.errorMessage = response && !response.result && response.isReadable ? response.message : $translate.instant('STRIP-CARD.ERROR-GET-BALANCE');\r\n\r\n };\r\n\r\n $scope.save = function () {\r\n\r\n var valid = true;\r\n var data = $scope.data;\r\n data.errorMessage = '';\r\n data.successMessage = '';\r\n\r\n if (data.cancellation) {\r\n\r\n var item = modalData.items[0];\r\n const prm = DataService.cancelRequestAsync(data.child.id, item.block.id || item.block.planningId, item.block.type, item.date, item.block.start, item.block.end, data.useCreditHours);\r\n prm.then($scope.handleSaveCancellation, $scope.handleSaveCancellationError);\r\n prm.finally(function () {\r\n $scope.data.saving = false;\r\n });\r\n\r\n } else {\r\n\r\n var itm, requestables = [];\r\n\r\n modalData.items.forEach(function (item) {\r\n\r\n itm = {\r\n\r\n requestableId: item.block.id || item.block.planningId,\r\n requestableType: item.block.type,\r\n date: item.date,\r\n start: item.block.start,\r\n end: item.block.end,\r\n timeslotId: item.block.timeslotId\r\n\r\n };\r\n\r\n if ($scope.appData.showIrregularTimeFields) {\r\n\r\n if (!item.block.requestedStart || !item.block.requestedEnd) {\r\n valid = false;\r\n } else {\r\n\r\n // check if format is valid and if requestedStart is before requestedEnd\r\n\r\n var regTime = /^(([0-1]?[0-9])|([2][0-3])):([0-5][0-9])(:[0-5][0-9])?$/;\r\n let start = item.block.requestedStart;\r\n let end = item.block.requestedEnd;\r\n\r\n if (!item.block.requestedStart.match(regTime) || !item.block.requestedEnd.match(regTime)) {\r\n valid = false;\r\n } else {\r\n var apiDate = moment(item.date).format(ft.app.datetime.formats.toAPIDate);\r\n start = apiDate + ' ' + item.block.requestedStart;\r\n end = apiDate + ' ' + item.block.requestedEnd;\r\n\r\n if (new Date(start) > new Date(end)) {\r\n valid = false;\r\n }\r\n }\r\n\r\n if (valid) {\r\n itm.requestedStart = item.block.requestedStart;\r\n itm.requestedEnd = item.block.requestedEnd;\r\n }\r\n }\r\n }\r\n\r\n requestables.push(itm);\r\n\r\n });\r\n\r\n if (!valid) {\r\n data.errorMessage = $translate.instant('PLANNING-REQUEST.ERROR-TIMES-ARE-REQUIRED');\r\n return;\r\n }\r\n\r\n var asIncidental;\r\n\r\n if ($scope.appData.useHolidayBalance) {\r\n asIncidental = data.holidayBalance && data.useBalanceAs == holidayBalanceTypes.incidental;\r\n }\r\n\r\n data.saving = true;\r\n var prm = DataService.saveRequestAsync(data.child.id, requestables, asIncidental, data.useCreditHours);\r\n prm.then($scope.handleSave, $scope.handleSaveError);\r\n prm.finally(function () {\r\n data.saving = false;\r\n $scope.close();\r\n });\r\n\r\n }\r\n\r\n };\r\n\r\n $scope.handleSave = function () {\r\n $scope.data.saveEnabled = false;\r\n $scope.data.attempts = 0;\r\n $scope.data.successMessage = $translate.instant('PLANNING-REQUEST.SAVED-REQUEST');\r\n };\r\n\r\n $scope.handleSaveError = function (response) {\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorMessage = $translate.instant('PLANNING-REQUEST.ERROR-CONTINUES-REQUEST');\r\n } else {\r\n $scope.data.errorMessage = $translate.instant('PLANNING-REQUEST.ERROR-SAVE-REQUEST');\r\n }\r\n\r\n if (response && !response.result && response.isReadable) {\r\n $scope.data.errorMessage += ' ' + response.message;\r\n }\r\n };\r\n\r\n $scope.handleSaveCancellation = function () {\r\n $scope.data.saveEnabled = false;\r\n $scope.data.attempts = 0;\r\n $scope.data.successMessage = $translate.instant('PLANNING-REQUEST.SAVED-CANCELLATION');\r\n };\r\n\r\n $scope.handleSaveCancellationError = function (response) {\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorMessage = $translate.instant('PLANNING-REQUEST.ERROR-CONTINUES-CANCELLATION');\r\n } else {\r\n $scope.data.errorMessage = $translate.instant('PLANNING-REQUEST.ERROR-SAVE-CANCELLATION');\r\n }\r\n\r\n if (response && !response.result && response.isReadable) {\r\n $scope.data.errorMessage += ' ' + response.message;\r\n }\r\n };\r\n\r\n $scope.saveHolidayBalance = function () {\r\n\r\n var data = $scope.data;\r\n data.errorMessage = '';\r\n data.successMessage = '';\r\n data.saving = true;\r\n\r\n var prm = DataService.saveHolidayBalanceAsync(data.child.id, startDate, data.requestedBalance);\r\n prm.then($scope.handleSaveHolidayBalance, $scope.handleSaveHolidayBalanceError);\r\n prm.finally(function () {\r\n data.saving = false;\r\n });\r\n\r\n };\r\n\r\n $scope.handleSaveHolidayBalance = function () {\r\n\r\n $scope.data.successMessage = $translate.instant('PLANNING-REQUEST.SAVED-HOLIDAY-BALANCE');\r\n getHolidayBalance();\r\n\r\n };\r\n\r\n $scope.handleSaveHolidayBalanceError = function (response) {\r\n\r\n $scope.data.attempts += 1;\r\n\r\n if ($scope.data.attempts > 3) {\r\n $scope.data.errorMessage = $translate.instant('PLANNING-REQUEST.ERROR-CONTINUES-HOLIDAY-BALANCE');\r\n } else {\r\n $scope.data.errorMessage = $translate.instant('PLANNING-REQUEST.ERROR-SAVE-HOLIDAY-BALANCE');\r\n }\r\n\r\n if (response && !response.result && response.isReadable) {\r\n $scope.data.errorMessage += ' ' + response.message;\r\n }\r\n\r\n };\r\n\r\n $scope.saveStripCardBalance = function (balance) {\r\n\r\n var data = $scope.data;\r\n data.errorMessage = '';\r\n data.successMessage = '';\r\n data.saving = true;\r\n\r\n var prm = DataService.saveStripCardBalanceAsync(data.child.id, balance.companyId, balance.packageId);\r\n prm.then(handleSaveStripCardBalance, handleSaveStripCardBalanceError);\r\n prm.finally(function () {\r\n data.saving = false;\r\n });\r\n\r\n };\r\n\r\n var handleSaveStripCardBalance = function (results) {\r\n\r\n $scope.data.successMessage = $translate.instant('STRIP-CARD.SAVED-BALANCE');\r\n getStripCardBalance();\r\n\r\n };\r\n\r\n var handleSaveStripCardBalanceError = function (response) {\r\n\r\n var data = $scope.data;\r\n\r\n data.attempts += 1;\r\n\r\n if (data.attempts > 3) {\r\n data.errorMessage = $translate.instant('STRIP-CARD.ERROR-CONTINUES-BALANCE');\r\n } else {\r\n data.errorMessage = $translate.instant('STRIP-CARD.ERROR-SAVE-BALANCE');\r\n }\r\n\r\n if (response && !response.result && response.isReadable) {\r\n data.errorMessage += ' ' + response.message;\r\n }\r\n\r\n };\r\n\r\n\r\n $scope.close = function () {\r\n if (!$scope.data.saving) {\r\n ($scope.data.saveEnabled) ? close() : close({});\r\n }\r\n };\r\n\r\n $scope.cancel = function () {\r\n if (!$scope.data.saving) {\r\n close();\r\n }\r\n };\r\n\r\n $scope.filterItem = function (item) {\r\n\r\n // when not everything else\r\n\r\n return !$scope.filterHolidayItem(item) && !$scope.filterStripCardItem(item);\r\n };\r\n\r\n $scope.filterHolidayItem = function (item) {\r\n\r\n // when holiday balance setting is true and item is requestable in a holiday and not a 'strippenkaart' package\r\n\r\n var planningConfig = ft.app.planning;\r\n var packageTypes = ft.app.contract.packages;\r\n\r\n return $scope.appData.useHolidayBalance && item.block.status == planningConfig.states.requestable && item.dayType == planningConfig.days.holiday && item.block.packageType != packageTypes.stripCard;\r\n };\r\n\r\n $scope.filterStripCardItem = function (item) {\r\n\r\n // when is requestable and a 'strippenkaart' package\r\n\r\n var planningConfig = ft.app.planning;\r\n var packageTypes = ft.app.contract.packages;\r\n\r\n return item.block.status == planningConfig.states.requestable && item.block.packageType == packageTypes.stripCard;\r\n };\r\n\r\n var hasHolidayRequestables = function () {\r\n\r\n var planningConfig = ft.app.planning;\r\n $scope.data.showHolidayBalance = false;\r\n\r\n if (modalData.items && modalData.items.length) {\r\n\r\n var i = 0;\r\n var item;\r\n\r\n while ($scope.data.showHolidayBalance == false && i < modalData.items.length) {\r\n\r\n item = modalData.items[i];\r\n\r\n if (item.dayType == planningConfig.days.holiday && item.block.status == planningConfig.states.requestable && item.block.packageType != ft.app.contract.packages.stripCard) {\r\n $scope.data.showHolidayBalance = true;\r\n }\r\n\r\n i++;\r\n }\r\n\r\n }\r\n\r\n return $scope.data.showHolidayBalance;\r\n };\r\n\r\n var hasStripCardRequestables = function () {\r\n\r\n var i = 0;\r\n var data = $scope.data;\r\n\r\n if (!data.items || !data.items.length) {\r\n return;\r\n }\r\n\r\n while (data.showStripCardBalance == false && i < data.items.length) {\r\n\r\n var item = data.items[0];\r\n\r\n if (item.block && item.block.packageType == ft.app.contract.packages.stripCard) {\r\n data.showStripCardBalance = true;\r\n }\r\n\r\n i++;\r\n\r\n }\r\n\r\n return data.showStripCardBalance;\r\n\r\n };\r\n\r\n $timeout($scope.initialize);\r\n\r\n }]);","import { ChildCare } from '@js/data-models';\r\nimport { ft } from '@js/definitions';\r\nimport { AppService } from '@js/services/FT.app.services.appservice';\r\nimport { DataService } from '@js/services/FT.app.services.dataservice';\r\nimport { IScope } from 'angular';\r\nimport moment from 'moment';\r\n\r\ninterface Scope extends IScope {\r\n save: () => void;\r\n sign: () => void;\r\n cancel: () => void;\r\n close: () => void;\r\n data: ScopeData;\r\n}\r\n\r\ninterface ScopeData {\r\n accountNumber: string;\r\n childBorn: boolean;\r\n accountCity: string;\r\n requireDirectDebit: boolean;\r\n directDebitNotPossible: boolean;\r\n payByDirectDebit: boolean;\r\n payByDirectDebitPossible: boolean;\r\n allowChangePayByDirectDebit: boolean;\r\n allowChangeChildSsn: boolean;\r\n allowChangeResponsibleIban: boolean;\r\n successMessage: string;\r\n errorMessage: string;\r\n accountNumberValid: boolean;\r\n accountCityValid: boolean;\r\n nameOnContractValid: boolean;\r\n payByDirectDebitValid: boolean;\r\n iAgreeToTheTermsAndConditionsValid: boolean;\r\n ssnChildValid: boolean;\r\n nameOnContract: any;\r\n iAgreeToTheTermsAndConditions: boolean;\r\n saving: boolean;\r\n ssnChild: any;\r\n saveEnabled: boolean;\r\n inviteUrl: any;\r\n item: Item;\r\n contractants: ContractantState[];\r\n}\r\n\r\ninterface ContractantState extends ChildCare.Definitions.Contracts.ContractantDetails {\r\n ssnValid: boolean;\r\n}\r\n\r\ninterface Item {\r\n child: string;\r\n contract: ChildCare.Definitions.Contracts.ContractModel;\r\n}\r\n\r\ntype Close = (result?: any, delay?: any) => void;\r\n\r\nclass ContractActivateModalController {\r\n public static $inject = ['$scope', 'close', 'item', '$translate', 'DataService', 'AppService'];\r\n\r\n private $scope: Scope;\r\n private item: Item;\r\n private $translate: angular.translate.ITranslateService;\r\n private dataService: DataService;\r\n private appService: AppService;\r\n private data: ScopeData;\r\n private attempts = 0;\r\n\r\n public constructor($scope: Scope, close: Close, item: Item, $translate: angular.translate.ITranslateService, dataService: DataService, appService: AppService) {\r\n this.$scope = $scope;\r\n this.item = item;\r\n this.$translate = $translate;\r\n this.dataService = dataService;\r\n this.appService = appService;\r\n\r\n this.$scope.close = (() => close({ success: !this.data.saveEnabled })).bind(this);\r\n this.$scope.cancel = close;\r\n this.$scope.sign = (() => window.open(this.data.inviteUrl, '_blank')).bind(this);\r\n this.$scope.save = this.save.bind(this);\r\n\r\n this.data = this.$scope.data = {\r\n item: item,\r\n allowChangePayByDirectDebit: false, // show account input-fields when unknown\r\n allowChangeChildSsn: false,\r\n allowChangeResponsibleIban: false,\r\n childBorn: true,\r\n accountNumber: '',\r\n accountCity: '',\r\n nameOnContract: '',\r\n payByDirectDebit: false,\r\n iAgreeToTheTermsAndConditions: false,\r\n accountNumberValid: true,\r\n accountCityValid: true,\r\n nameOnContractValid: true,\r\n payByDirectDebitValid: true,\r\n iAgreeToTheTermsAndConditionsValid: true,\r\n ssnChildValid: true,\r\n requireDirectDebit: this.appService.data.requireDirectDebit,\r\n directDebitNotPossible: this.appService.data.directDebitNotPossible,\r\n saving: false,\r\n saveEnabled: true,\r\n successMessage: '',\r\n errorMessage: '',\r\n ssnChild: '',\r\n inviteUrl: null,\r\n contractants: null,\r\n payByDirectDebitPossible: true\r\n };\r\n\r\n this.initialize();\r\n }\r\n\r\n private initialize(): void {\r\n const { accountNumber, birthDate, accountCity, nameOnContract, payByDirectDebit, allowChangePayByDirectDebit, allowChangeChildSsn, allowChangeResponsibleIban, contractants } = this.item.contract;\r\n\r\n const parsedBirthDate = moment(birthDate);\r\n if (parsedBirthDate.isValid) {\r\n this.data.childBorn = parsedBirthDate.isBefore(moment());\r\n }\r\n\r\n this.data.accountNumber = accountNumber;\r\n this.data.accountCity = accountCity;\r\n this.data.nameOnContract = nameOnContract;\r\n this.data.payByDirectDebit = this.appService.data.requireDirectDebit || payByDirectDebit;\r\n if (this.appService.data.directDebitNotPossible) {\r\n this.data.payByDirectDebit = false;\r\n }\r\n this.data.allowChangePayByDirectDebit = allowChangePayByDirectDebit;\r\n this.data.allowChangeChildSsn = allowChangeChildSsn;\r\n this.data.allowChangeResponsibleIban = allowChangeResponsibleIban;\r\n this.data.contractants = [...contractants.map(x => ({ ...x, ssnValid: true }) as ContractantState)];\r\n }\r\n\r\n private validate(): boolean {\r\n this.data.successMessage = '';\r\n this.data.errorMessage = '';\r\n\r\n this.data.accountNumberValid = true;\r\n this.data.accountCityValid = true;\r\n this.data.nameOnContractValid = true;\r\n this.data.payByDirectDebitValid = !this.data.allowChangePayByDirectDebit || !this.appService.data.requireDirectDebit || this.data.payByDirectDebit\r\n || !this.data.payByDirectDebitPossible;\r\n this.data.iAgreeToTheTermsAndConditionsValid = this.data.iAgreeToTheTermsAndConditions;\r\n this.data.ssnChildValid = !this.data.allowChangeChildSsn || !this.data.childBorn || (this.data.ssnChild != null && this.data.ssnChild.trim() != '');\r\n\r\n let allSsnValid = true;\r\n for (const contractant of this.data.contractants.filter(x => x.allowChangeSSN)) {\r\n contractant.ssnValid = contractant.ssn != null && contractant.ssn.trim() != '';\r\n allSsnValid = allSsnValid && contractant.ssnValid;\r\n }\r\n\r\n if (this.data.allowChangePayByDirectDebit && this.data.payByDirectDebit && this.data.payByDirectDebitPossible) {\r\n if (this.data.allowChangeResponsibleIban) {\r\n if (!this.data.accountNumber.trim()) {\r\n this.data.accountNumberValid = false;\r\n }\r\n\r\n if (!this.data.accountCity.trim()) {\r\n this.data.accountCityValid = false;\r\n }\r\n }\r\n\r\n if (!this.data.nameOnContract.trim()) {\r\n this.data.nameOnContractValid = false;\r\n }\r\n }\r\n\r\n const { accountNumberValid, accountCityValid, nameOnContractValid, payByDirectDebitValid, iAgreeToTheTermsAndConditionsValid, ssnChildValid } = this.data;\r\n const isValid =\r\n accountNumberValid &&\r\n accountCityValid &&\r\n nameOnContractValid &&\r\n payByDirectDebitValid &&\r\n iAgreeToTheTermsAndConditionsValid &&\r\n ssnChildValid &&\r\n allSsnValid;\r\n\r\n return isValid;\r\n }\r\n\r\n private async save(): Promise {\r\n if (!this.validate()) {\r\n return;\r\n }\r\n\r\n this.data.saving = true;\r\n try {\r\n const results = await this.dataService.approveContractAsync(this.item.child, this.item.contract.id, {\r\n accountNumber: this.data.accountNumber,\r\n accountCity: this.data.accountCity,\r\n nameOnContract: this.data.nameOnContract,\r\n payByDirectDebit: this.data.payByDirectDebit && this.data.payByDirectDebitPossible,\r\n iAgreeToTheTermsAndConditions: this.data.iAgreeToTheTermsAndConditions,\r\n ssnChild: this.data.ssnChild,\r\n contractants: this.data.contractants\r\n });\r\n\r\n this.data.saveEnabled = false;\r\n this.attempts = 0;\r\n if (results.isApproved) {\r\n this.data.successMessage = this.$translate.instant('CONTRACTS-ACTIVATE.ACTIVATION-SAVED');\r\n }\r\n else if (results.inviteUrl) {\r\n this.data.successMessage = results.message;\r\n this.data.inviteUrl = results.inviteUrl;\r\n }\r\n else if (results.message) {\r\n this.data.errorMessage = results.message;\r\n }\r\n else {\r\n this.data.successMessage = this.$translate.instant('CONTRACTS-ACTIVATE.ACTIVATION-SAVED');\r\n }\r\n } catch (error) {\r\n this.attempts += 1;\r\n\r\n if (this.attempts > 3) {\r\n this.data.errorMessage = this.$translate.instant('CONTRACTS-ACTIVATE.ERROR-CONTINUES');\r\n } else {\r\n this.data.errorMessage = error && !error.result && error.isReadable ? error.message : this.$translate.instant('CONTRACTS-ACTIVATE.ERROR-SAVE-ACTIVATION');\r\n }\r\n } finally {\r\n this.data.saving = false;\r\n this.$scope.$apply();\r\n }\r\n }\r\n}\r\n\r\nft.app.controller('contractActivateModalController', ContractActivateModalController);","import { ft } from '@js/definitions';\r\nimport { DataService } from '@js/services/FT.app.services.dataservice';\r\nimport { AppService, IAppData } from '@js/services/FT.app.services.appservice';\r\nimport { IStateParamsService, IStateService } from 'angular-ui-router';\r\nimport { IScope } from 'angular';\r\n\r\ninterface Scope extends IScope {\r\n navigateToLogin: () => void;\r\n navigateToForm: () => void;\r\n switchLanguage: (lang: any) => void;\r\n appData: IAppData;\r\n newApplicationForm: boolean;\r\n}\r\n\r\nft.app.controller('registrationIntroductionController',\r\n ['$scope', '$state', '$stateParams', 'AppService', 'DataService',\r\n function ($scope: Scope, $state: IStateService, $stateParams: IStateParamsService, AppService: AppService, dataService: DataService) {\r\n $scope.appData = AppService.data;\r\n $scope.newApplicationForm = false;\r\n\r\n dataService.getFeatures().then(x => {\r\n $scope.newApplicationForm = x.features.some(y => y.code === 'application-form');\r\n });\r\n\r\n $scope.navigateToLogin = function () {\r\n $state.go('login');\r\n };\r\n\r\n $scope.navigateToForm = function () {\r\n if ($scope.newApplicationForm) {\r\n const returnUrl = encodeURIComponent(window.location.origin);\r\n let localeData = AppService.data.currentLanguage.split('-');\r\n const languageCode = localeData[0];\r\n let countryCode = languageCode;\r\n if (localeData.length > 1) {\r\n countryCode = localeData[1];\r\n }\r\n window.location.href = `https://inschrijven.kindplanner.nl/?tenant=${$scope.appData.tenant}&lang=${languageCode}&country=${countryCode}`;\r\n } else {\r\n $state.go('registration.new', $stateParams);\r\n }\r\n };\r\n\r\n $scope.switchLanguage = function (lang) {\r\n AppService.switchLanguage(lang);\r\n };\r\n }]);\r\n","import { ChildCare } from '@js/data-models';\r\nimport { ft } from '@js/definitions';\r\nimport { DataService } from '@js/services/FT.app.services.dataservice';\r\nimport { IScope, ITimeoutService } from 'angular';\r\nimport { IStateParamsService } from 'angular-ui-router';\r\n\r\ntype ChildActivityProgram = ChildCare.Definitions.Activity.ChildActivityProgram;\r\n\r\ninterface Scope extends IScope {\r\n data: {\r\n errorMessage?: string;\r\n items?: ChildActivityProgram[];\r\n hasItems: boolean;\r\n };\r\n isLoading: boolean;\r\n}\r\n\r\nclass ActivitiesController {\r\n public static $inject = ['$scope', '$stateParams', '$timeout', '$translate', 'DataService'];\r\n\r\n private $scope: Scope;\r\n private dataService: DataService;\r\n private childId: string;\r\n private errorMessage: string;\r\n\r\n constructor($scope: Scope, $stateParams: IStateParamsService, $timeout: ITimeoutService, $translate: any, dataService: DataService) {\r\n this.$scope = $scope;\r\n this.dataService = dataService;\r\n\r\n this.childId = $stateParams.child;\r\n this.errorMessage = $translate.instant('CONTRACTS.ERROR-GET-CONTRACTS');\r\n\r\n this.$scope.data = {\r\n items: [],\r\n hasItems: false\r\n };\r\n\r\n $timeout(this.initialize.bind(this));\r\n }\r\n\r\n private async initialize(): Promise {\r\n this.$scope.isLoading = true;\r\n\r\n try {\r\n const results = await this.dataService.getChildActivities(this.childId);\r\n\r\n this.$scope.data.hasItems = results?.programs?.length > 0 ?? false;\r\n this.$scope.data.items = results?.programs ?? [];\r\n } catch (error) {\r\n this.$scope.data.errorMessage = error?.message ?? this.errorMessage;\r\n } finally {\r\n this.$scope.isLoading = false;\r\n this.$scope.$apply();\r\n }\r\n }\r\n}\r\n\r\nft.app.controller('childActivitiesController', ActivitiesController);","import { ChildCare } from '@js/data-models';\r\nimport { ft } from '@js/definitions';\r\nimport { FortyTwoLoginService } from '@js/FortyTwoFramework';\r\nimport { DataService } from '@js/services/FT.app.services.dataservice';\r\nimport { ITimeoutService, IScope } from 'angular';\r\n\r\ntype DocumentsResponse = ChildCare.Definitions.Family.DocumentsResponse & { loading?: boolean; downloadUrl?: string };\r\n\r\ninterface Scope extends IScope {\r\n resetDownloadLink: (item: DocumentsResponse) => void;\r\n getDownloadLink: (item: DocumentsResponse) => void;\r\n errorMessage: any;\r\n items: DocumentsResponse[];\r\n isLoading: boolean;\r\n}\r\n\r\nclass DocumentsController {\r\n public static $inject = ['$scope', '$timeout', '$translate', 'LoginService', 'DataService'];\r\n\r\n private $scope: Scope;\r\n private loginService: FortyTwoLoginService;\r\n private dataService: DataService;\r\n private errorMessage: string;\r\n\r\n constructor($scope: Scope, $timeout: ITimeoutService, $translate: any, loginService: FortyTwoLoginService, dataService: DataService) {\r\n this.$scope = $scope;\r\n this.loginService = loginService;\r\n this.dataService = dataService;\r\n\r\n this.errorMessage = $translate.instant('DOCUMENTS.ERROR-LOADING-DOCUMENTS');\r\n\r\n $timeout(this.initialize.bind(this));\r\n\r\n $scope.getDownloadLink = this.getDownloadLink.bind(this);\r\n $scope.resetDownloadLink = function (item) {\r\n item.loading = false;\r\n item.downloadUrl = null;\r\n };\r\n }\r\n\r\n private async initialize(): Promise {\r\n this.$scope.isLoading = true;\r\n\r\n try {\r\n this.$scope.items = await this.dataService.getDocumentsAsync();\r\n } catch (error) {\r\n this.$scope.errorMessage = error?.message ?? this.errorMessage;\r\n } finally {\r\n this.$scope.isLoading = false;\r\n this.$scope.$apply();\r\n }\r\n }\r\n\r\n private async getDownloadLink(item: DocumentsResponse): Promise {\r\n if (item.loading) {\r\n return;\r\n }\r\n\r\n item.loading = true;\r\n\r\n const prepareItemUrl = url => url + (url.indexOf('?') >= 0 ? '&' : '?');\r\n\r\n try {\r\n await this.loginService.refreshLoginAsync();\r\n const tokenData = this.loginService.getTokenData();\r\n\r\n item.downloadUrl = prepareItemUrl(item.url) + 'accessToken=' + encodeURIComponent(tokenData.token.value);\r\n\r\n } catch (error) {\r\n this.$scope.errorMessage = error?.message ?? this.errorMessage;\r\n } finally {\r\n item.loading = false;\r\n this.$scope.$apply();\r\n }\r\n };\r\n}\r\n\r\nft.app.controller('documentsController', DocumentsController);","import { ChildCare } from '@js/data-models';\r\nimport { ft } from '@js/definitions';\r\nimport { FortyTwoLoginService } from '@js/FortyTwoFramework';\r\nimport { DataService } from '@js/services/FT.app.services.dataservice';\r\nimport { ITimeoutService, IScope } from 'angular';\r\nimport { IStateParamsService } from 'angular-ui-router';\r\n\r\ntype DocumentsResponse = ChildCare.Definitions.Family.DocumentsResponse & { loading?: boolean; downloadUrl?: string };\r\n\r\ninterface Scope extends IScope {\r\n uploaded: boolean;\r\n newDocument: File;\r\n uploadFile: () => void;\r\n resetDownloadLink: (item: DocumentsResponse) => void;\r\n getDownloadLink: (item: DocumentsResponse) => void;\r\n errorMessage: string;\r\n items: DocumentsResponse[];\r\n isLoading: boolean;\r\n}\r\n\r\nclass ChildDocumentsController {\r\n public static $inject = ['$scope', '$timeout', '$translate', 'LoginService', 'DataService', '$stateParams'];\r\n\r\n private $scope: Scope;\r\n private loginService: FortyTwoLoginService;\r\n private dataService: DataService;\r\n private errorMessage: string;\r\n\r\n private childId: string;\r\n\r\n constructor($scope: Scope, $timeout: ITimeoutService, $translate: any, loginService: FortyTwoLoginService, dataService: DataService, $stateParams: IStateParamsService) {\r\n this.$scope = $scope;\r\n this.loginService = loginService;\r\n this.dataService = dataService;\r\n this.childId = $stateParams.child;\r\n\r\n this.errorMessage = $translate.instant('DOCUMENTS.ERROR-LOADING-DOCUMENTS');\r\n\r\n $timeout(this.initialize.bind(this));\r\n\r\n $scope.getDownloadLink = this.getDownloadLink.bind(this);\r\n $scope.uploadFile = this.uploadFile.bind(this);\r\n $scope.resetDownloadLink = function (item) {\r\n item.loading = false;\r\n item.downloadUrl = null;\r\n };\r\n }\r\n\r\n private async initialize(): Promise {\r\n this.$scope.isLoading = true;\r\n\r\n try {\r\n this.$scope.items = await this.dataService.getChildDocumentsAsync(this.childId);\r\n } catch (error) {\r\n this.$scope.errorMessage = error?.message ?? this.errorMessage;\r\n } finally {\r\n this.$scope.isLoading = false;\r\n this.$scope.$apply();\r\n }\r\n }\r\n\r\n private async uploadFile(): Promise {\r\n this.$scope.uploaded = false;\r\n\r\n if (this.$scope.newDocument == null) {\r\n return;\r\n }\r\n\r\n this.$scope.isLoading = true;\r\n\r\n try {\r\n await this.dataService.saveChildDocumentAsync(this.$scope.newDocument, this.childId);\r\n this.$scope.uploaded = true;\r\n this.$scope.newDocument = null;\r\n } catch (error) {\r\n this.$scope.errorMessage = error?.message ?? this.errorMessage;\r\n } finally {\r\n this.$scope.isLoading = false;\r\n this.$scope.$apply();\r\n }\r\n }\r\n\r\n private async getDownloadLink(item: DocumentsResponse): Promise {\r\n if (item.loading) {\r\n return;\r\n }\r\n\r\n item.loading = true;\r\n\r\n const prepareItemUrl = url => url + (url.indexOf('?') >= 0 ? '&' : '?');\r\n\r\n try {\r\n await this.loginService.refreshLoginAsync();\r\n const tokenData = this.loginService.getTokenData();\r\n\r\n item.downloadUrl = prepareItemUrl(item.url) + 'accessToken=' + encodeURIComponent(tokenData.token.value);\r\n\r\n } catch (error) {\r\n this.$scope.errorMessage = error?.message ?? this.errorMessage;\r\n } finally {\r\n item.loading = false;\r\n this.$scope.$apply();\r\n }\r\n };\r\n}\r\n\r\nft.app.controller('childDocumentsController', ChildDocumentsController);","import { ft } from '@js/definitions';\r\nimport { PersonModel } from '@js/models';\r\nimport { AppService } from '@js/services/FT.app.services.appservice';\r\nimport { DataService } from '@js/services/FT.app.services.dataservice';\r\nimport { IQService, IScope } from 'angular';\r\nimport { IStateParamsService } from 'angular-ui-router';\r\n\r\ninterface Scope extends IScope {\r\n openWaitinglist: any;\r\n isLoading: boolean;\r\n data: {\r\n errorMessage: string;\r\n child: PersonModel;\r\n waitinglistItems: any[];\r\n contractRequests: any[];\r\n planningRequests: any[];\r\n hasContractRequests: boolean;\r\n hasPlanningRequests: boolean;\r\n };\r\n}\r\n\r\nclass ChildRequestsController {\r\n public static $inject: string[] = ['$scope', '$stateParams', '$q', '$translate', 'DataService', 'AppService', 'ModalService'];\r\n\r\n private $scope: Scope;\r\n private $stateParams: IStateParamsService;\r\n private $q: IQService;\r\n private $translate: angular.translate.ITranslateService;\r\n private dataService: DataService;\r\n private appService: AppService;\r\n private modalService: any;\r\n\r\n constructor($scope: Scope, $stateParams: IStateParamsService, $q: IQService, $translate: angular.translate.ITranslateService, dataService: DataService, appService: AppService, modalService: any) {\r\n this.$scope = $scope;\r\n this.$stateParams = $stateParams;\r\n this.$q = $q;\r\n this.$translate = $translate;\r\n this.dataService = dataService;\r\n this.appService = appService;\r\n this.modalService = modalService;\r\n\r\n this.$scope.openWaitinglist = this.openWaitinglist.bind(this);\r\n\r\n this.initialize();\r\n }\r\n\r\n private initialize() {\r\n this.$scope.isLoading = false;\r\n this.$scope.data = {\r\n errorMessage: '',\r\n child: this.appService.getUser(this.$stateParams.child),\r\n waitinglistItems: [],\r\n contractRequests: [],\r\n planningRequests: [],\r\n hasContractRequests: true,\r\n hasPlanningRequests: true\r\n };\r\n\r\n this.getData();\r\n }\r\n\r\n private async openWaitinglist(evt: InputEvent): Promise {\r\n const modal = await this.modalService.showModal({\r\n elm: evt.currentTarget || evt.target,\r\n style: 'waiting-modal-settings',\r\n templateUrl: 'requests/waitinglist-modal',\r\n controller: 'waitinglistModalController',\r\n inputs: {\r\n childId: this.$stateParams.child,\r\n items: this.$scope.data.waitinglistItems\r\n }\r\n });\r\n\r\n modal.close.then(() => this.getData());\r\n }\r\n\r\n private async getData(): Promise {\r\n this.$scope.data = { } as Scope['data'];\r\n\r\n this.$scope.data.errorMessage = '';\r\n this.$scope.isLoading = true;\r\n\r\n var child = this.$stateParams.child as string;\r\n\r\n try {\r\n const [requests, waitinglist] = await this.$q.all([\r\n this.dataService.getRequestsAsync(child),\r\n this.dataService.getWaitinglistAsync(child)\r\n ]);\r\n\r\n this.$scope.data.hasContractRequests = requests?.contractRequests?.length > 0;\r\n this.$scope.data.contractRequests = requests?.contractRequests ?? [];\r\n\r\n this.$scope.data.hasPlanningRequests = requests?.planningRequests?.length > 0;\r\n this.$scope.data.planningRequests = requests?.planningRequests ?? [];\r\n\r\n this.$scope.data.waitinglistItems = waitinglist || [];\r\n } catch {\r\n this.$scope.data.errorMessage = this.$translate.instant('REQUESTS.ERROR-GET-REQUESTS');\r\n } finally {\r\n this.$scope.isLoading = false;\r\n }\r\n\r\n this.$scope.$apply();\r\n }\r\n\r\n}\r\n\r\n\r\nft.app.controller('childRequestsController', ChildRequestsController);","import { ChildCare } from '@js/data-models';\r\nimport { ft } from '@js/definitions';\r\nimport { FortyTwoLoginService } from '@js/FortyTwoFramework';\r\nimport { AppService } from '@js/services/FT.app.services.appservice';\r\nimport { DataService } from '@js/services/FT.app.services.dataservice';\r\nimport { IScope } from 'angular';\r\nimport { IStateParamsService, IStateService } from 'angular-ui-router';\r\n\r\n\r\ninterface Scope extends IScope {\r\n switchLanguage(lang: string): void;\r\n gotoRegistration(): void;\r\n sendRegistration(): void;\r\n send(): void;\r\n\r\n isLoading: boolean;\r\n currentYear: number;\r\n appData: any;\r\n whitelabelApp: boolean;\r\n data: {\r\n mode: 'login' | 'remember';\r\n username: string;\r\n usernameRegistration: string;\r\n validUsername: boolean;\r\n validUsernameRegistration: boolean;\r\n password: string;\r\n validPassword: boolean;\r\n stayLoggedIn: boolean;\r\n errorMessage: string;\r\n registrationMessage: string;\r\n form: 'forgot-password' | undefined;\r\n };\r\n}\r\n\r\nclass LoginController {\r\n public static $inject = ['$scope', '$state', '$stateParams', '$translate', 'AppService', 'DataService', 'LoginService'];\r\n\r\n private $scope: Scope;\r\n private $state: IStateService;\r\n private $translate: any;\r\n private appService: AppService;\r\n private dataService: DataService;\r\n private loginService: FortyTwoLoginService;\r\n\r\n constructor($scope: Scope, $state: IStateService, $stateParams: IStateParamsService, $translate: any, appService: AppService, dataService: DataService, loginService: FortyTwoLoginService) {\r\n this.$scope = $scope;\r\n this.$state = $state;\r\n this.$translate = $translate;\r\n this.appService = appService;\r\n this.dataService = dataService;\r\n this.loginService = loginService;\r\n\r\n $scope.isLoading = false;\r\n $scope.currentYear = new Date().getFullYear();\r\n $scope.appData = appService.data;\r\n\r\n $scope.data = {\r\n mode: 'login',\r\n username: loginService.getStoredUsername() || '',\r\n usernameRegistration: '',\r\n validUsername: true,\r\n validUsernameRegistration: true,\r\n password: '',\r\n validPassword: true,\r\n stayLoggedIn: false,\r\n errorMessage: '',\r\n registrationMessage: '',\r\n form: undefined\r\n };\r\n\r\n dataService.getFeatures().then(x => {\r\n $scope.whitelabelApp = x.features.some(y => y.code === 'whitelabel-parentapp');\r\n });\r\n\r\n\r\n if ($stateParams.lang) {\r\n appService.switchLanguage($stateParams.lang);\r\n }\r\n\r\n this.$scope.send = this.send.bind(this);\r\n this.$scope.switchLanguage = this.switchLanguage.bind(this);\r\n this.$scope.gotoRegistration = this.gotoRegistration.bind(this);\r\n this.$scope.sendRegistration = this.sendRegistration.bind(this);\r\n }\r\n\r\n private switchLanguage(lang: string): void {\r\n this.appService.switchLanguage(lang);\r\n }\r\n\r\n private gotoRegistration(): void {\r\n this.$state.go('registration.introduction');\r\n }\r\n\r\n private send(): void {\r\n this.$scope.data.errorMessage = '';\r\n this.$scope.data.validUsername = true;\r\n this.$scope.data.validPassword = true;\r\n\r\n var un = this.$scope.data.username.toString().trim();\r\n var pw = this.$scope.data.password.toString().trim();\r\n\r\n if (!un) {\r\n this.$scope.data.validUsername = (un != '');\r\n }\r\n\r\n if (!pw && this.$scope.data.mode == 'login') {\r\n this.$scope.data.validPassword = (pw != '');\r\n }\r\n\r\n if (!this.$scope.data.validUsername || (!this.$scope.data.validPassword && this.$scope.data.mode == 'login')) {\r\n return;\r\n }\r\n\r\n if (this.$scope.data.mode == 'login') {\r\n this.login();\r\n } else if (this.$scope.data.mode == 'remember') {\r\n this.remember();\r\n }\r\n }\r\n\r\n private async login(): Promise {\r\n\r\n this.$scope.isLoading = true;\r\n\r\n try {\r\n const result = await this.loginService.doLoginAsync(this.$scope.data.username, this.$scope.data.password, this.$scope.data.stayLoggedIn);\r\n if (result) {\r\n this.$state.go('app.start');\r\n } else {\r\n this.$scope.data.errorMessage = this.$translate.instant('LOGIN.ERROR-COMBINATION');\r\n }\r\n } catch (error) {\r\n this.$scope.data.errorMessage = error && !error.result && error.isReadable ? error.message : this.$translate.instant('LOGIN.NOT-POSSIBLE');\r\n } finally {\r\n this.$scope.isLoading = false;\r\n this.$scope.$apply();\r\n }\r\n }\r\n\r\n private async remember(): Promise {\r\n this.$scope.isLoading = true;\r\n\r\n try {\r\n await this.dataService.forgotPasswordAsync(this.$scope.data.username);\r\n this.$scope.data.errorMessage = this.$translate.instant('LOGIN.MAIL-SEND-WITH-INSTRUCTIONS');\r\n } catch (error) {\r\n this.$scope.data.form = 'forgot-password';\r\n this.$scope.data.registrationMessage = error && !error.result && error.isReadable ? error.message : this.$translate.instant('LOGIN.ERROR-HAVE-CORRECT-MAIL');\r\n\r\n } finally {\r\n this.$scope.isLoading = false;\r\n this.$scope.$apply();\r\n }\r\n }\r\n\r\n private async sendRegistration(): Promise {\r\n this.$scope.data.registrationMessage = '';\r\n this.$scope.data.validUsernameRegistration = (this.$scope.data.usernameRegistration.toString().trim() != '');\r\n\r\n if (!this.$scope.data.validUsernameRegistration) {\r\n return;\r\n }\r\n\r\n this.$scope.isLoading = true;\r\n\r\n try {\r\n await this.dataService.registerEmailCheckAsync(this.$scope.data.username);\r\n this.$scope.data.registrationMessage = this.$translate.instant('LOGIN.MAIL-SEND-WITH-INSTRUCTIONS');\r\n } catch (error) {\r\n this.$scope.data.errorMessage = error && !error.result && error.isReadable ? error.message : this.$translate.instant('LOGIN.ERROR-HAVE-CORRECT-MAIL');\r\n } finally {\r\n this.$scope.isLoading = false;\r\n this.$scope.$apply();\r\n }\r\n }\r\n}\r\n\r\nft.app.controller('loginController', LoginController);","import { ChildCare } from '@js/data-models';\r\nimport { ft } from '@js/definitions';\r\nimport { FortyTwoLoginService } from '@js/FortyTwoFramework';\r\nimport { AppService } from '@js/services/FT.app.services.appservice';\r\nimport { DataService } from '@js/services/FT.app.services.dataservice';\r\nimport { IScope } from 'angular';\r\nimport { IStateParamsService, IStateService } from 'angular-ui-router';\r\n\r\n\r\ninterface Scope extends IScope {\r\n switchLanguage(lang: string): void;\r\n\r\n isLoading: boolean;\r\n currentYear: number;\r\n appData: any;\r\n}\r\n\r\nclass GotoAppController {\r\n public static $inject = ['$scope', '$state', '$stateParams', '$translate', 'AppService', 'DataService', 'LoginService'];\r\n\r\n private $scope: Scope;\r\n private $state: IStateService;\r\n private $translate: any;\r\n private appService: AppService;\r\n private dataService: DataService;\r\n private loginService: FortyTwoLoginService;\r\n\r\n constructor($scope: Scope, $state: IStateService, $stateParams: IStateParamsService, $translate: any, appService: AppService, dataService: DataService, loginService: FortyTwoLoginService) {\r\n this.$scope = $scope;\r\n this.$state = $state;\r\n this.$translate = $translate;\r\n this.appService = appService;\r\n this.dataService = dataService;\r\n this.loginService = loginService;\r\n\r\n $scope.isLoading = false;\r\n $scope.currentYear = new Date().getFullYear();\r\n $scope.appData = appService.data;\r\n\r\n if ($stateParams.lang) {\r\n appService.switchLanguage($stateParams.lang);\r\n }\r\n\r\n this.$scope.switchLanguage = this.switchLanguage.bind(this);\r\n }\r\n\r\n private switchLanguage(lang: string): void {\r\n this.appService.switchLanguage(lang);\r\n }\r\n}\r\n\r\nft.app.controller('gotoappController', GotoAppController);","import { ft } from '@js/definitions';\r\nimport { IAugmentedJQuery, IDirective, IScope, IDirectiveFactory } from 'angular';\r\nimport { MediaReference, MediaType } from '@js/models';\r\nimport { AppService } from '@js/services/FT.app.services.appservice';\r\nimport { UrlHelper } from '@js/urlHelper';\r\nimport { ngStorage } from 'ngstorage';\r\nimport { VideoMediaReference } from '@js/controllers/FT.app.controllers.dashboard';\r\n\r\ndeclare global {\r\n interface JQueryStatic {\r\n fancybox: any;\r\n }\r\n}\r\n\r\ninterface IDirectiveScope extends IScope {\r\n media: MediaReference[];\r\n}\r\n\r\nclass LightboxDirective implements IDirective {\r\n\r\n static $inject = ['AppService', '$sessionStorage'];\r\n public scope = {\r\n media: '='\r\n };\r\n\r\n constructor(private appService: AppService, private $sessionStorage: ngStorage.StorageService) {\r\n }\r\n\r\n private linkAction(scope: IDirectiveScope, element: IAugmentedJQuery) {\r\n\r\n window.$.fancybox.defaults.buttons = [\r\n 'slideShow',\r\n 'download',\r\n 'thumbs',\r\n 'close',\r\n 'zoom'\r\n ];\r\n\r\n scope.$watch('media', () => {\r\n this.render(scope, element);\r\n }, true);\r\n }\r\n\r\n private render(scope: IDirectiveScope, element: IAugmentedJQuery) {\r\n\r\n if (!scope.media) {\r\n return;\r\n }\r\n\r\n element.children().remove();\r\n\r\n for (const item of scope.media) {\r\n\r\n const $href = window.$('');\r\n $href.addClass('fancybox');\r\n\r\n $href.attr('data-fancybox', 'images');\r\n\r\n if (item.type == MediaType.image) {\r\n $href.attr('href', item.url);\r\n } else if (item.type == MediaType.video) {\r\n $href.attr('data-src', this.createVideoUrl((item as VideoMediaReference).videoUrl));\r\n $href.attr('data-type', 'iframe');\r\n $href.attr('href', 'javascript:;');\r\n }\r\n\r\n var $img = window.$('');\r\n $img.attr('src', item.url || item.poster);\r\n\r\n $href.append($img);\r\n element.append($href);\r\n }\r\n };\r\n\r\n private createVideoUrl(url: string): string {\r\n if (!UrlHelper.isUrlAbsolute(url)) {\r\n url = UrlHelper.createAbsoluteMediaUrl(this.appService.data.services['media'], url);\r\n }\r\n\r\n return `/component/video-player.html?src=${encodeURIComponent(url)}&access_token=${encodeURIComponent(this.$sessionStorage.refreshToken)}`;\r\n }\r\n\r\n link = this.linkAction.bind(this);\r\n\r\n static factory(): IDirectiveFactory {\r\n\r\n const directive = (appService: AppService, $sessionStorage: ngStorage.StorageService) => {\r\n return new LightboxDirective(appService, $sessionStorage);\r\n };\r\n\r\n directive.$inject = ['AppService', '$sessionStorage'];\r\n return directive;\r\n }\r\n}\r\n\r\nft.app.directive('ftFancybox', LightboxDirective.factory());\r\n","import { ft } from '@js/definitions';\r\nimport { IAttributes, IAugmentedJQuery, IScope } from 'angular';\r\n\r\nft.app.directive('fileModel', [function () {\r\n return {\r\n require: 'ngModel',\r\n restrict: 'A',\r\n link: function ($scope: IScope, element: IAugmentedJQuery, attrs: IAttributes, ngModel) {\r\n element.bind('change', function (event) {\r\n ngModel.$setViewValue((event.target as HTMLInputElement).files[0]);\r\n $scope.$apply();\r\n });\r\n\r\n $scope.$watch(function () {\r\n return ngModel.$viewValue;\r\n }, function (value) {\r\n if (!value) {\r\n element.val('');\r\n }\r\n });\r\n }\r\n };\r\n}]);\r\n","import { ft } from '../definitions';\r\nimport { IPromise, IRootScopeService } from 'angular';\r\nimport { ngStorage } from 'ngstorage';\r\nimport moment from 'moment';\r\nimport { Country, PersonModel, PersonRole, PersonType } from '@js/models';\r\nimport { ChildCare } from '@js/data-models';\r\n\r\ntype AppConfigurationModel = ChildCare.Definitions.Configuration.AppConfigurationModel;\r\n\r\nexport interface MonthAndYear {\r\n month: number;\r\n year: number;\r\n}\r\n\r\nexport interface IAppData extends AppConfigurationModel {\r\n currentChild: string;\r\n family: PersonModel[];\r\n members: PersonModel[];\r\n children: PersonModel[];\r\n currentUser: PersonModel;\r\n currentLanguage: string;\r\n}\r\n\r\nexport class AppService {\r\n\r\n static $inject = ['$rootScope', '$sessionStorage', '$localStorage', '$translate', 'DataService'];\r\n private $rootScope: IRootScopeService;\r\n private $sessionStorage: ngStorage.StorageService;\r\n private $localStorage: WindowLocalStorage;\r\n private $translate;\r\n private DataService;\r\n\r\n public data: IAppData;\r\n static data: any;\r\n\r\n constructor($rootScope: IRootScopeService, $sessionStorage: ngStorage.StorageService, $localStorage: WindowLocalStorage, $translate, DataService) {\r\n this.$rootScope = $rootScope;\r\n this.$sessionStorage = $sessionStorage;\r\n this.$localStorage = $localStorage;\r\n this.$translate = $translate;\r\n this.DataService = DataService;\r\n\r\n this.data = {\r\n currentLanguage: $localStorage[ft.app.settings.keys.language] || ft.app.datetime.locale\r\n } as IAppData;\r\n }\r\n\r\n public getConfigAsync(): IPromise {\r\n\r\n const promise = this.DataService.getAppConfig() as IPromise;\r\n promise.then(config => {\r\n this.data = {\r\n ...this.data,\r\n ...config\r\n };\r\n this.setCurrentCountry();\r\n });\r\n\r\n return promise;\r\n };\r\n\r\n private setCurrentCountry() {\r\n if (!this.data.countries || this.data.countries.length === 0) {\r\n return;\r\n }\r\n let country: Country = null;\r\n if (this.data.countries.length > 1) {\r\n for (let i = 0; i < this.data.countries.length; i++) {\r\n let c = this.data.countries[i];\r\n if (c.default) {\r\n country = c;\r\n break;\r\n }\r\n }\r\n if (country === null) {\r\n country = this.data.countries[0];\r\n }\r\n } else {\r\n country = this.data.countries[0];\r\n }\r\n if (country === null) {\r\n return;\r\n }\r\n\r\n var locale = this.data.currentLanguage.split('-');\r\n\r\n this.data.currentLanguage = locale[0] + '-' + country.code;\r\n\r\n }\r\n\r\n public getFamilyAsync(allChildren?: boolean): IPromise {\r\n const promise = this.DataService.getFamilyAsync(allChildren) as IPromise;\r\n promise.then(persons => {\r\n this.data.family = persons;\r\n this.data.members = persons.filter(item => item.type === PersonType.parent);\r\n this.data.children = persons.filter(item => item.type === PersonType.child);\r\n this.data.currentUser = persons.find(item => item.isCurrentUser);\r\n\r\n this.$rootScope.$broadcast(ft.app.events.family.get);\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n public switchLanguage(lang: string) {\r\n this.data.currentLanguage = lang;\r\n this.$localStorage[ft.app.settings.keys.language] = lang;\r\n\r\n const currentLanguage = lang.split('-')[0];\r\n this.$translate.use(currentLanguage);\r\n moment.locale(currentLanguage);\r\n\r\n if (this.data.currentUser) {\r\n this.DataService.saveLanguageAsync(lang);\r\n }\r\n };\r\n\r\n public getUser(id: string): PersonModel {\r\n return this.data.family.find(item => item.id == id);\r\n };\r\n\r\n public getResponsibleUser(): PersonModel {\r\n return this.data.family.find(item => {\r\n if (item.roles && item.roles.length) {\r\n return item.roles.indexOf(PersonRole.responsible) >= 0;\r\n }\r\n });\r\n };\r\n\r\n public getSelectedMonthAndYear(): MonthAndYear {\r\n\r\n if (this.$sessionStorage.selectedMonth >= 0 || this.$sessionStorage.selectedYear) {\r\n return {\r\n month: this.$sessionStorage.selectedMonth,\r\n year: this.$sessionStorage.selectedYear\r\n };\r\n }\r\n\r\n return;\r\n };\r\n\r\n public setSelectedMonthAndYear(month: number, year: number) {\r\n if (month || month == 0) {\r\n this.$sessionStorage.selectedMonth = month;\r\n }\r\n\r\n if (year) {\r\n this.$sessionStorage.selectedYear = year;\r\n }\r\n };\r\n\r\n public setCurrentChild(id: string) {\r\n this.data.currentChild = this.data.currentChild == id ? null : id;\r\n };\r\n}\r\n\r\nft.app.service('AppService', AppService);\r\n","/* eslint-disable @typescript-eslint/camelcase */\r\nimport { ft, ng } from '../definitions';\r\nimport { IQService, IPromise, IHttpService } from 'angular';\r\nimport { FortyTwoLoginService, IFortyTwoRequestService, FortyTwoRequest } from '@js/FortyTwoFramework';\r\nimport moment, { Moment } from 'moment';\r\nimport angular from 'angular';\r\nimport { ngStorage } from 'ngstorage';\r\nimport { StrippenkaartBalanceResponse } from '@js/models';\r\nimport { ChildCare } from '@js/data-models';\r\n\r\ntype ChildActivitiesResponse = ChildCare.Definitions.Activity.ChildActivitiesResponse;\r\n\r\nexport class DataService {\r\n public static $inject = ['$q', '$sessionStorage', 'RequestService', 'LoginService', '$http'];\r\n\r\n private $q: IQService;\r\n private $sessionStorage: ngStorage.StorageService;\r\n private RequestService: IFortyTwoRequestService;\r\n private LoginService: FortyTwoLoginService;\r\n private $http: IHttpService;\r\n private secondaryApiUrl: string;\r\n\r\n constructor($q: IQService, $sessionStorage: ngStorage.StorageService, RequestService: IFortyTwoRequestService, LoginService: FortyTwoLoginService, $http: IHttpService) {\r\n this.$q = $q;\r\n this.$sessionStorage = $sessionStorage;\r\n this.RequestService = RequestService;\r\n this.LoginService = LoginService;\r\n this.$http = $http;\r\n\r\n this.secondaryApiUrl = '';\r\n }\r\n\r\n public setSecondaryApiUrl(url: string) {\r\n this.secondaryApiUrl = url;\r\n }\r\n\r\n public getMainNavigation() {\r\n var url = '/DummyServiceData/';\r\n var path = 'navigation.json';\r\n\r\n return this.RequestService.requestAsync({\r\n url: url,\r\n path: path\r\n }).then((results) => results, (status) => status);\r\n }\r\n\r\n private doLoggedInRequest(obj) {\r\n return this.LoginService.isLoggedInAsync().then(\r\n () => {\r\n obj.headers = { 'Authorization': 'Bearer ' + this.$sessionStorage.refreshToken };\r\n return this.doRequest(obj, true);\r\n },\r\n () => {\r\n return this.$q.reject(null);\r\n });\r\n }\r\n\r\n public doRequest(request: FortyTwoRequest, loggedIn = false): IPromise {\r\n return this.RequestService.requestAsync(request, loggedIn).then(\r\n (response) => response,\r\n (response) => this.handleError(response)\r\n );\r\n }\r\n\r\n private handleError(response) {\r\n\r\n let message = '';\r\n let isReadable = false;\r\n let exceptions = ft.app.exceptions.types;\r\n\r\n if (response.data != null && response.data.message != null) {\r\n isReadable = true;\r\n message = response.data.message;\r\n }\r\n\r\n if (response.data && (\r\n response.data.exceptionType == exceptions.invalidOperationException ||\r\n response.data.exceptionType == exceptions.providerException ||\r\n response.data.exceptionType == exceptions.unauthorizedAccessException)) {\r\n isReadable = true;\r\n message = response.data.exceptionMessage;\r\n }\r\n\r\n return this.$q.reject({\r\n result: false,\r\n isReadable: isReadable,\r\n message: message\r\n });\r\n }\r\n\r\n public getFamilyAsync(getAllChildren?: boolean): IPromise {\r\n var path = 'parent/contacts';\r\n if (typeof (getAllChildren) !== 'undefined' )\r\n {\r\n path = `parent/contacts?allChildren=${getAllChildren}`;\r\n }\r\n return this.doLoggedInRequest({\r\n path: path,\r\n method: 'GET'\r\n }).then((results) => {\r\n results.forEach((item) => {\r\n if (item.type == ft.app.family.types.child) {\r\n if (item.gender == ft.app.gender.female) {\r\n item.header = {\r\n 'type': 'image',\r\n 'poster': 'https://www.partou.nl/media/ekjrphnhzp8bag7q4z646xj5q-w1920-h400-q100-c',\r\n 'url': 'https://www.partou.nl/media/ekjrphnhzp8bag7q4z646xj5q-w1920-h400-q100-c'\r\n };\r\n } else {\r\n item.header = {\r\n 'type': 'image',\r\n 'poster': 'https://www.partou.nl/media/x27vgjsq2spyfvacs3evg0dxl-w1920-h400-q80-c',\r\n 'url': 'https://www.partou.nl/media/x27vgjsq2spyfvacs3evg0dxl-w1920-h400-q80-c'\r\n };\r\n }\r\n }\r\n\r\n });\r\n\r\n return results;\r\n }, (response) => this.handleError(response));\r\n };\r\n\r\n public getChild(id: string) {\r\n return this.getFamilyAsync().then((results) => {\r\n var children = results.filter((item) => {\r\n\r\n return item.id == id;\r\n\r\n });\r\n\r\n return children[0];\r\n }, (response) => response);\r\n\r\n }\r\n\r\n public registerChildAsync(data: any) {\r\n return this.doRequest({\r\n path: 'register/new',\r\n method: 'POST',\r\n data: data\r\n });\r\n }\r\n\r\n public registerSiblingAsync(data: any): IPromise {\r\n return this.doLoggedInRequest({\r\n path: 'register/sibling',\r\n method: 'POST',\r\n data: data\r\n });\r\n }\r\n\r\n public saveChildAsync(data: any) {\r\n return this.doLoggedInRequest({\r\n path: 'parent/contacts',\r\n method: 'POST',\r\n data: data\r\n });\r\n\r\n }\r\n\r\n public saveUserAsync(data: any) {\r\n return this.doLoggedInRequest({\r\n path: 'parent/contacts',\r\n method: 'POST',\r\n data: data\r\n });\r\n\r\n }\r\n\r\n public saveProfilePictureAsync(userId: string, userType: string, image64) {\r\n return this.doLoggedInRequest({\r\n path: 'parent/profileimage',\r\n method: 'POST',\r\n data: {\r\n id: userId,\r\n type: userType,\r\n content: image64\r\n }\r\n });\r\n\r\n }\r\n\r\n public setPasswordAsync(key: string, password: string) {\r\n return this.doRequest({\r\n path: 'account/setpassword' + (!password ? '?accessKey=' + key : ''),\r\n method: !password ? 'GET' : 'POST',\r\n data: !password ? null : { accessKey: key, password: password }\r\n });\r\n\r\n }\r\n\r\n public saveLanguageAsync(language: string) {\r\n return this.doLoggedInRequest({\r\n path: 'account/setlanguage',\r\n method: 'POST',\r\n data: { languageId: language }\r\n });\r\n\r\n }\r\n\r\n public changePasswordAsync(originalPassword: string, newPassword: string) {\r\n return this.doLoggedInRequest({\r\n path: 'account/changepassword',\r\n method: 'POST',\r\n data: {\r\n currentPassword: originalPassword,\r\n newPassword: newPassword\r\n }\r\n });\r\n\r\n }\r\n\r\n public forgotPasswordAsync(email: string) {\r\n return this.doRequest({\r\n path: `account/reset?userName=${encodeURIComponent(email)}`,\r\n method: 'POST',\r\n data: {\r\n userName: email\r\n }\r\n });\r\n }\r\n\r\n public registerEmailCheckAsync(email: string) {\r\n return this.doRequest({\r\n path: 'register/emailcheck',\r\n method: 'POST',\r\n data: {\r\n userName: email\r\n }\r\n });\r\n }\r\n\r\n public getRegisterLocationsAsync(packageIds: any, schoolId: string, date?: any) {\r\n\r\n const stringDate = date != null ? moment(date).format(ft.app.datetime.formats.toAPIDate) : undefined;\r\n\r\n return this.doRequest({\r\n path: 'register/locations',\r\n method: 'POST',\r\n data: {\r\n tariefgroepIds: packageIds,\r\n schoolId: schoolId,\r\n date: stringDate\r\n }\r\n });\r\n }\r\n\r\n public getRegisterPackagesAsync(type: string, school: string, contract: string) {\r\n return this.doRequest({\r\n path: 'register/options',\r\n method: 'POST',\r\n data: {\r\n type: type,\r\n schoolId: school,\r\n contractId: contract\r\n }\r\n });\r\n }\r\n\r\n public getPlanningAsync(childId: string, year: number, month: number) {\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/planning`,\r\n method: 'POST',\r\n data: {\r\n year: year,\r\n month: month + 1\r\n }\r\n });\r\n }\r\n\r\n public getPossibleTimesForDateAsync(childId: string, date: any, finalOnly: boolean, entityType: number) {\r\n\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/times`,\r\n method: 'POST',\r\n data: {\r\n date: date,\r\n finalOnly: finalOnly,\r\n entityType: entityType\r\n }\r\n });\r\n }\r\n\r\n public validateRequestAsync(childId: string, requestables: any) {\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/request/validate`,\r\n method: 'POST',\r\n data: {\r\n requestables: requestables\r\n }\r\n });\r\n }\r\n\r\n public saveRequestAsync(childId: string, requestables: any, asIncidental: boolean, useCreditHours: boolean) {\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/request`,\r\n method: 'POST',\r\n data: {\r\n requestables: requestables,\r\n registerAsIncidental: asIncidental,\r\n useCreditHours: useCreditHours\r\n }\r\n });\r\n }\r\n\r\n public cancelRequestAsync(childId: string, blockId: string, blockType: string, date: any, start: any, end: any, useCreditHours: boolean) {\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/request`,\r\n method: 'DELETE',\r\n data: {\r\n requestableId: blockId,\r\n requestableType: blockType,\r\n date: date,\r\n start: start,\r\n end: end,\r\n useCreditHours: useCreditHours\r\n }\r\n });\r\n }\r\n\r\n public saveAbsentAsync(childId: string, from: any, till: any, reason: string, comments: string) {\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/absences`,\r\n method: 'POST',\r\n data: {\r\n start: from,\r\n end: till,\r\n description: comments,\r\n type: reason\r\n }\r\n });\r\n }\r\n\r\n public savePresentAsync(childId: string, from: any) {\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/absences`,\r\n method: 'POST',\r\n data: {\r\n type: ft.app.planning.presence.sick,\r\n end: from\r\n }\r\n });\r\n }\r\n\r\n public saveSwapAsync(childId: string, from: any, till: any, fromTimes: any, tillTimes: any, comments: string) {\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/swapday`,\r\n method: 'POST',\r\n data: {\r\n oldDate: from,\r\n newDate: till,\r\n absent: fromTimes,\r\n present: tillTimes,\r\n comments: comments\r\n }\r\n });\r\n }\r\n\r\n public saveIncidentalAsync(childId: string, from: any, times: any, useCreditHours: boolean, comments: string) {\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/incidentalday`,\r\n method: 'POST',\r\n data: {\r\n date: from,\r\n present: times,\r\n comments: comments,\r\n useCreditHours: useCreditHours\r\n }\r\n });\r\n }\r\n\r\n public getIrregularHoursSummaryAsync(childId: string, date: any, planningId: string) {\r\n var url = `child/${childId}/incidentalday/${date}/summary`;\r\n if (planningId) {\r\n url = `child/${childId}/incidentalday/${date}/summary?planningid=${planningId}`;\r\n }\r\n\r\n return this.doLoggedInRequest({\r\n path: url,\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getActivitiesByRangeAsync(childId: string, start: any, end: any) {\r\n\r\n var headers = {\r\n 'Authorization': 'Bearer ' + this.$sessionStorage.refreshToken\r\n };\r\n\r\n var url = this.secondaryApiUrl;\r\n var path = 'activiteitenbydate';\r\n var method = 'POST';\r\n var data = {\r\n child_id: childId,\r\n start: start,\r\n end: end\r\n };\r\n\r\n return this.LoginService.isLoggedInAsync().then(\r\n () => {\r\n\r\n return this.RequestService.requestAsync({\r\n url: url,\r\n path: path,\r\n method: method,\r\n data: data,\r\n headers: headers\r\n }).then((results) => {\r\n\r\n // TODO: don't want this\r\n if (results.forEach) {\r\n results.forEach((item) => {\r\n\r\n var mDate = moment(item.date).format(ft.app.datetime.formats.toAPIDate);\r\n item.date = mDate;\r\n\r\n });\r\n\r\n return results;\r\n } else {\r\n return this.$q.reject(false);\r\n }\r\n\r\n\r\n }, (response) => this.handleError(response));\r\n\r\n }, () => this.$q.reject(false));\r\n\r\n };\r\n\r\n // timeline\r\n public getActivitiesAsync(child: string, parent: string, start, end) {\r\n\r\n var headers = {\r\n 'Authorization': 'Bearer ' + this.$sessionStorage.refreshToken\r\n };\r\n\r\n var url = this.secondaryApiUrl;\r\n var path = 'gettimeline';\r\n var method = 'POST';\r\n var data = {\r\n 'child_id': child,\r\n 'parent_id': parent,\r\n 'start': start,\r\n 'end': end\r\n };\r\n\r\n return this.LoginService.isLoggedInAsync().then(\r\n () => {\r\n\r\n return this.RequestService.requestAsync({\r\n url: url,\r\n path: path,\r\n method: method,\r\n data: data,\r\n headers: headers\r\n }).then((results) => {\r\n\r\n // TODO: Tik-Tik returns or JSON object or string as error message\r\n\r\n if (results && results.forEach) {\r\n results.forEach((item) => {\r\n\r\n if (item.icon) {\r\n item.icon = item.icon.replace(/\\.png/gi, '_invert.png');\r\n }\r\n\r\n if (!item.icon) {\r\n\r\n if (item.key == ft.app.activities.keys.activity) {\r\n\r\n } else if (item.media && item.media.length) {\r\n item.icon = item.media[0].poster;\r\n }\r\n\r\n }\r\n\r\n });\r\n\r\n return results;\r\n } else {\r\n return this.$q.reject(false);\r\n }\r\n\r\n }, (response) => this.handleError(response));\r\n\r\n }, () => this.$q.reject(null));\r\n\r\n }\r\n\r\n public getTimelineForPosts(childId: string, start: moment.Moment, end: moment.Moment) {\r\n return this.doLoggedInRequest({\r\n path: `posts/timeline?start=${start.format(ft.app.datetime.formats.toAPIDate)}&end=${end.format(ft.app.datetime.formats.toAPIDate)}&childId=${childId}`,\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getTimelineForDiaries(childId: string, start: moment.Moment, end: moment.Moment) {\r\n return this.doLoggedInRequest({\r\n path: `diary/timeline?start=${start.format(ft.app.datetime.formats.toAPIDate)}&end=${end.format(ft.app.datetime.formats.toAPIDate)}&childId=${childId}`,\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getTimelineForStories(childId: string, start: moment.Moment, end: moment.Moment) {\r\n return this.doLoggedInRequest({\r\n path: `story/timeline?start=${start.format(ft.app.datetime.formats.toAPIDate)}&end=${end.format(ft.app.datetime.formats.toAPIDate)}&childId=${childId}`,\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getStoryPdf(storyId: string, childId: string, isDownload: boolean) {\r\n return this.doLoggedInRequest({\r\n path: `storypreview/${storyId}?childId=${childId}&isDownload=${isDownload}`,\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getTimelineForMediaItems(childId: string, start: moment.Moment, end: moment.Moment) {\r\n return this.doLoggedInRequest({\r\n path: `media/timeline?start=${start.format(ft.app.datetime.formats.toAPIDate)}&end=${end.format(ft.app.datetime.formats.toAPIDate)}&childId=${childId}`,\r\n method: 'GET'\r\n });\r\n };\r\n\r\n public getTimelineForPresences(childId: string, start: moment.Moment, end: moment.Moment) {\r\n let path = 'presences';\r\n if (childId != null) {\r\n path = 'child/' + childId + '/presences';\r\n }\r\n\r\n return this.doLoggedInRequest({\r\n path: path,\r\n method: 'POST',\r\n data: {\r\n start: start.format(ft.app.datetime.formats.toAPIDate),\r\n end: end.format(ft.app.datetime.formats.toAPIDate)\r\n }\r\n });\r\n }\r\n\r\n public saveActivityCommentAsync(key, item, parent: string, comment: string) {\r\n return this.doLoggedInRequest({\r\n url: this.secondaryApiUrl,\r\n path: 'postitemmessage',\r\n method: 'POST',\r\n data: {\r\n key: key,\r\n item_id: item,\r\n parent_id: parent,\r\n comment: comment\r\n }\r\n });\r\n }\r\n\r\n public toggleFavoriteAsync(key, item, parent) {\r\n return this.doLoggedInRequest({\r\n url: this.secondaryApiUrl,\r\n path: 'faveunfave',\r\n method: 'POST',\r\n data: {\r\n key: key,\r\n item_id: item,\r\n parent_id: parent\r\n }\r\n });\r\n }\r\n\r\n public getEmployeesByRangeAsync(childId: string, start, end) {\r\n\r\n var path = 'groups/employees/' + start + '/' + end;\r\n var method = 'POST';\r\n var data = {\r\n child_id: childId,\r\n start: start,\r\n end: end\r\n };\r\n\r\n return this.LoginService.isLoggedInAsync().then(\r\n () => {\r\n\r\n return this.RequestService.requestAsync({\r\n path: path,\r\n method: method,\r\n data: data\r\n }, true).then((results) => {\r\n\r\n // TODO: Tik-Tik returns or JSON object or string as error message\r\n\r\n if (!ng.isString(results)) {\r\n var key, obj;\r\n var date;\r\n var employees = [];\r\n\r\n for (key in results) {\r\n obj = results[key];\r\n employees.push(obj);\r\n }\r\n\r\n // done\r\n return employees;\r\n } else {\r\n return this.$q.reject(null);\r\n }\r\n\r\n }, (response) => this.handleError(response));\r\n\r\n }, () => this.$q.reject(false));\r\n }\r\n\r\n public getMediaAlbumsAsync() {\r\n return this.doLoggedInRequest({\r\n path: 'media/albums',\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getMediaUntilAsync(dateTime, childId: string) {\r\n var path = 'media/until/' + dateTime + '/100';\r\n if (childId != null)\r\n {\r\n path = path + '?childId=' + childId;\r\n }\r\n return this.doLoggedInRequest({\r\n path: path,\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getMediaSinceAsync(dateTime) {\r\n return this.doLoggedInRequest({\r\n path: 'media/since/' + dateTime,\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public saveConversationAsync(message: any, childrenIds: any, childId: string) {\r\n const obj: FortyTwoRequest = {\r\n path: 'posts/post',\r\n method: 'POST',\r\n data: {\r\n title: message.title,\r\n content: message.content,\r\n audiences: childrenIds,\r\n childId: childId\r\n }\r\n };\r\n\r\n return this.doLoggedInRequest(obj);\r\n }\r\n\r\n public answerToPostAsync(conversation, replyComment, answer) {\r\n return this.doLoggedInRequest({\r\n path: 'posts/post',\r\n method: 'POST',\r\n data: {\r\n postId: conversation.postId,\r\n content: answer,\r\n commentId: replyComment ? replyComment.commentId : null\r\n }\r\n });\r\n }\r\n\r\n public getMessagesAsync(childId, dateTime) {\r\n return this.doLoggedInRequest({\r\n path: 'posts/until/' + childId + '/' + dateTime + '/3',\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getMessagesSinceAsync(childId, dateTime) {\r\n return this.doLoggedInRequest({\r\n path: 'posts/since/' + childId + '/' + dateTime,\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getCommentsForMessage(message) {\r\n return this.doLoggedInRequest({\r\n path: 'posts/post/' + message.postId,\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getMessageAudiencesAsync() {\r\n return this.doLoggedInRequest({\r\n path: 'posts/audiences',\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getDocumentsAsync(): IPromise {\r\n return this.doLoggedInRequest({\r\n path: 'documents',\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getChildDocumentsAsync(child: string): IPromise{\r\n return this.doLoggedInRequest({\r\n path: `child/${child}/documents`,\r\n method: 'GET',\r\n data: {\r\n childId: child\r\n }\r\n });\r\n }\r\n\r\n public getChildActivities(childId: string): IPromise {\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/activities`,\r\n method: 'GET',\r\n data: {\r\n childId: childId\r\n }\r\n });\r\n }\r\n\r\n public getContractsAsync(child: string): IPromise {\r\n return this.doLoggedInRequest({\r\n path: `child/${child}/contracts`,\r\n method: 'GET',\r\n data: {\r\n childId: child\r\n }\r\n });\r\n }\r\n\r\n public newContractAsync(obj: any) {\r\n return this.doLoggedInRequest({\r\n path: 'register/new',\r\n method: 'POST',\r\n data: obj\r\n });\r\n }\r\n\r\n public editContractAsync(obj: any) {\r\n return this.doLoggedInRequest({\r\n path: 'register/change',\r\n method: 'POST',\r\n data: obj\r\n });\r\n }\r\n\r\n public approveContractAsync(child: string, id: string, contract: any) {\r\n return this.doLoggedInRequest({\r\n path: `child/${child}/contract/${id}/approve`,\r\n method: 'POST',\r\n data: contract\r\n });\r\n }\r\n\r\n public cancelContractAsync(child: string, id: string, comments: string) {\r\n return this.doLoggedInRequest({\r\n path: `child/${child}/contract/${id}/cancel`,\r\n method: 'POST',\r\n data: {\r\n remarks: comments\r\n }\r\n });\r\n }\r\n\r\n public rejectContractAsync(child: string, id: string, comments: string) {\r\n return this.doLoggedInRequest({\r\n path: `child/${child}/contract/${id}/reject`,\r\n method: 'POST',\r\n data: {\r\n remarks: comments\r\n }\r\n });\r\n }\r\n\r\n public endContractAsync(child: string, id: string, comments: string, end: any) {\r\n return this.doLoggedInRequest({\r\n path: `child/${child}/contract/${id}/end`,\r\n method: 'POST',\r\n data: {\r\n remarks: comments,\r\n end: end\r\n }\r\n });\r\n }\r\n\r\n public getRequestInformationAsync(childId: string, requestId: string): IPromise {\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/request/${requestId}/information`,\r\n method: 'GET',\r\n });\r\n }\r\n \r\n public getFinancialOverviewAsync() {\r\n return this.doLoggedInRequest({\r\n path: 'financial/overview',\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getWaitinglistAsync(child: string) {\r\n\r\n return this.doLoggedInRequest({\r\n path: `child/${child}/requests`,\r\n method: 'GET',\r\n data: {\r\n childId: child\r\n }\r\n });\r\n }\r\n\r\n public submitWaitinglistItemsAsync(child: string, approved: string[], rejected: string[]) {\r\n return this.doLoggedInRequest({\r\n path: `child/${child}/waitinglistitems`,\r\n method: 'POST',\r\n data: {\r\n approved: approved,\r\n rejected: rejected\r\n }\r\n });\r\n }\r\n\r\n public getRequestsAsync(child: string): IPromise {\r\n return this.doLoggedInRequest({\r\n path: `child/${child}/requests`,\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public getHolidayBalanceAsync(childId: string, date: any) {\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/currentbalance/${date}`,\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public saveHolidayBalanceAsync(childId: string, start: any, requestedBalance: number) {\r\n\r\n return this.doLoggedInRequest({\r\n path: `child/${childId}/currentbalance`,\r\n method: 'POST',\r\n data: {\r\n start: start,\r\n requestedBalance: requestedBalance\r\n }\r\n });\r\n }\r\n\r\n public getStripCardBalanceAsync(childId: string): IPromise {\r\n\r\n return this.doLoggedInRequest({\r\n path: `strippenkaart/${childId}/balance`,\r\n method: 'GET'\r\n });\r\n }\r\n\r\n public saveChildDocumentAsync(file: any, childId: string) {\r\n var path = `child/${childId}/uploaddocument`;\r\n\r\n return this.LoginService.isLoggedInAsync().then(() => {\r\n var fileFormData = new FormData();\r\n fileFormData.append('file', file);\r\n\r\n return this.$http.post(ft.app.baseApiUrl + path, fileFormData, {\r\n transformRequest: angular.identity,\r\n headers: {\r\n 'Authorization': `Bearer ${this.$sessionStorage.token.value}`,\r\n 'Content-Type': undefined\r\n }\r\n\r\n }).catch(reason => this.handleError(reason));\r\n });\r\n }\r\n\r\n public saveStripCardBalanceAsync(childId: string, companyId: string, packageId: string) {\r\n\r\n return this.doLoggedInRequest({\r\n path: `strippenkaart/${childId}/new`,\r\n method: 'POST',\r\n data: {\r\n companyId: companyId,\r\n packageId: packageId\r\n }\r\n });\r\n };\r\n\r\n public getFeatures(): IPromise {\r\n return this.RequestService.requestAsync({ path: 'configuration/features' }).then(\r\n (results) => results,\r\n (response) => this.handleError(response)\r\n );\r\n }\r\n\r\n public getAppConfig() {\r\n return this.RequestService.requestAsync({\r\n path: 'configuration'\r\n }).then((results) => {\r\n return results;\r\n }, (response) => {\r\n return this.handleError(response);\r\n });\r\n }\r\n\r\n public getAppContent(language, codes) {\r\n var method = 'POST';\r\n var path = 'content';\r\n\r\n var data = {\r\n language: language,\r\n codes: codes\r\n };\r\n\r\n return this.RequestService.requestAsync({\r\n path: path,\r\n method: method,\r\n data: data,\r\n }).then((results) => results, (response) => this.handleError(response));\r\n }\r\n\r\n \r\n}\r\n\r\nft.app.service('DataService', DataService);","import { ft } from '@js/definitions';\r\nimport moment, { Moment, Duration } from 'moment';\r\nimport { AbsenceType } from '@js/models';\r\n\r\nexport interface Params {\r\n childId: string;\r\n from: Moment;\r\n till: Moment;\r\n fromTime: Duration;\r\n tillTime: Duration;\r\n presence: AbsenceType;\r\n}\r\n\r\nexport class PlanningModalService {\r\n public static $inject = ['ModalService'];\r\n\r\n private modalService: any;\r\n\r\n public constructor(modalService: any) {\r\n this.modalService = modalService;\r\n }\r\n\r\n private parseDate(date?: string, defaultValue?: Moment): Moment {\r\n if (date == null) {\r\n if (defaultValue == null) {\r\n return moment();\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n return moment(date);\r\n }\r\n\r\n private parseDuration(time?: string, defaultValue?: Duration): Duration {\r\n if (time == null) {\r\n if (defaultValue == null) {\r\n return moment.duration();\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n return moment.duration(time);\r\n }\r\n\r\n public openAbsentModal($event: MouseEvent, childId: string, from?: string, till?: string, fromTime?: string, tillTime?: string, presence?: AbsenceType) {\r\n let parsedFrom = this.parseDate(from);\r\n let parsedTill = this.parseDate(till);\r\n\r\n if (parsedTill.isBefore(parsedFrom)) {\r\n parsedTill = parsedFrom.clone();\r\n }\r\n\r\n let parsedFromTime = this.parseDuration(fromTime, moment.duration('00:00'));\r\n let parsedTillTime = this.parseDuration(tillTime, moment.duration(1, 'day').subtract(1, 'minute'));\r\n\r\n return this.modalService.showModal({\r\n elm: $event.currentTarget || $event.target,\r\n templateUrl: 'planning/absent-modal',\r\n controller: 'absentModalController',\r\n inputs: {\r\n params: {\r\n childId: childId,\r\n from: parsedFrom,\r\n till: parsedTill,\r\n fromTime: parsedFromTime,\r\n tillTime: parsedTillTime,\r\n presence\r\n } as Params\r\n }\r\n });\r\n }\r\n\r\n public openPresentModal($event: MouseEvent, childId: string, from?: string) {\r\n return this.modalService.showModal({\r\n elm: $event.currentTarget || $event.target,\r\n templateUrl: 'planning/present-modal',\r\n controller: 'presentModalController',\r\n inputs: {\r\n item: {\r\n child: childId,\r\n from: from || moment().format(ft.app.datetime.formats.toAPIDate)\r\n }\r\n }\r\n });\r\n };\r\n\r\n public openSwapModal($event: MouseEvent, childId: string, from?: string, till?: string, fromPlanningId?: string, fromTimeslotId?: string) {\r\n if (!from && !till) {\r\n from = moment().format(ft.app.datetime.formats.toAPIDate);\r\n }\r\n\r\n return this.modalService.showModal({\r\n elm: $event.currentTarget || $event.target,\r\n templateUrl: 'planning/swap-modal',\r\n controller: 'swapModalController',\r\n inputs: {\r\n item: {\r\n child: childId,\r\n from: from || null,\r\n till: till || null,\r\n fromPlanningId: fromPlanningId || null,\r\n fromTimeslotId: fromTimeslotId || null\r\n }\r\n }\r\n });\r\n };\r\n\r\n public openIncidentalModal($event: MouseEvent, childId: string, from?: string) {\r\n return this.modalService.showModal({\r\n elm: $event.currentTarget || $event.target,\r\n templateUrl: 'planning/incidental-modal',\r\n controller: 'incidentalModalController',\r\n inputs: {\r\n item: {\r\n child: childId,\r\n from: from\r\n }\r\n }\r\n });\r\n };\r\n\r\n public openRequestModal($event: MouseEvent, childId: string, items, cancellation) {\r\n return this.modalService.showModal({\r\n elm: $event.currentTarget || $event.target,\r\n templateUrl: 'planning/request-modal',\r\n controller: 'requestModalController',\r\n inputs: {\r\n modalData: {\r\n childId: childId,\r\n cancellation: cancellation,\r\n items: items\r\n }\r\n }\r\n });\r\n };\r\n}\r\n\r\nft.app.service('PlanningModalService', PlanningModalService);","console.log(`🚀 Version ${env.buildnumber || ''} build from ${env.commit || ''} and currently running in ${env.mode} mode`);\r\n\r\nimport '@js/update';\r\n\r\nimport '../content/fortytwo/all.less';\r\n\r\nimport './00.FT';\r\nimport './FortyTwoFramework';\r\n\r\nimport './01.FT.app';\r\nimport './02.FT.app.models';\r\n\r\nimport './controllers';\r\nimport './directives';\r\nimport './filters';\r\nimport './services';\r\n\r\nimport './FT.app.factories.templatehandler';\r\nimport './FT.app.config.datepicker';\r\nimport './FT.date';\r\nimport './FT.ui.zIndexManager';\r\n"],"sourceRoot":""}