{"version":3,"sources":["scripts/app-2e8d5e9914.js"],"names":["angular","module","systemConstant","ONLINE_USER_NO","MANAGER_CENTER","constant","statusConstant","PASSED","COMPLETED","INCOMPLETED","INCOMPLETE","FAILED","NOT AVAILABLE","NOT ATTEMPTED","NOT_ENROLLED","UNENROLLED","UNENROLL","EXEMPTION","UNPUBLISHED ASSIGNED","ENROLLMENT APPROVAL PENDING","INCOMPLETED_STATUS","SCO_NON_ATTEMPT","ENROLLMENT_APPROVAL_PENDING","STATUS_NOT_AVAILABLE","COMPLETED_STATUS","UNPUBLISHED_WAITLISTED","ENROLLMENT_WAITLISTED","LEAVE_APPROVAL_PENDING","UNPUBLISHED_ASSIGNED","WAITING_FOR_PROGRAM_PUBLISH","WAITING FOR PROGRAM PUBLISH","SELFENROLLED","ASSIGNED","EXECUTED","NOT_EXECUTED","UNKNOW_STATUS","CANCEL","APPROVED","PUBLIC_STATUS_REJECT","PUBLISH_STATUS_REJECT","WAITING_APPROVAL","NO_APPROVAL","APPROVALED","NOT_YET_APPROVAL","APPROVAL_REJECT","EXEMPTION_SUBMIT","NOT_SUBMIT","SUBMITTED","NOT_PUBLISHED","ENROLLED","NOT_ENROLLMENT","ENROLLMENT_DEADLINE","ATTENDANCE","ABSENCE","ABSENT","REJECTED","LEAVE","LEARNER_ASK_LEAVE","ADMINISTRATOR_REGISTER","PUBLISHED","HAVE NOT EXECUTED ENROLLED ASSIGNMENT","NO_RATING_REQUIRED","FAIL_CHECK_SESSIONQUOTAFULL","FAIL_CHECK_PRIVILEGE","FAIL_CHECK_OUT_OF_QUOTA","WAITLISTED","BLOCKED","NEW","HOT","FEATURED","messageConstant","YOU_HAVE_BEEN_LOGGED_OUT","YOU_HAVE_SUCCESSFULLY_SIGNED_IN","MSG_TAKES_TIME_ACTION","MSG_IS_SURE_ENROLL","MSG_IS_SURE_UN_ENROLL","MSG_IS_SURE_TO_PAY","MSG_NOT_YET_COMPLETED_WHETHER_TO_SEND_OUT","MSG_THERE_ARE_OPTIONS_NOT_FILLED_OUT","MSG_PLEASE_SELECT_AT_LEAST_ONE_STUDENT","MSG_ERROR_NOT_PUBLISH","MSG_ERROR_MESSAGE_CAN_NOT_ENROLL_CAUSE_PASS_RESULT","MSG_ERROR_MESSAGE_CAN_ENROLL_WAITLSTED_RESULT","MSG_IS_CONTINUE","MSG_YOU_HAVE_REQUIRED_SUBJECT_NOT_YET_ANSWERED","MSG_QUESTION_OPTION_EXCEEDS_WORD_LIMIT","MSG_UNABLE_SEND_REFRESH","MSG_PLEASE_RETURN_TO_FILL_IN","MSG_QUESTION_FILL_THIS_TO_THE_END","MSG_ERROR_PLAY_BLOCKING","MSG_YOU_HAVE_COMPLETED_THIS_QUESTIONNAIRE","MSG_YOU_HAVE_COMPLETED_THIS_TEST","MSG_CURRENTLY_NON_VIEWING_TIME","MSG_NEXT_TEST_DATETIME","MSG_CAN_NOT_TAKE_LESSONS","MSG_CAN_NOT_TAKE_TEST_QUESTIONNAIRE","MSG_ARE_YOU_SURE_WANT_TO_REPLACE_YOUR_AVATAR","MSG_ARE_YOU_SURE_WANT_TO_CHANGE_YOUR_PASSWORD","MSG_CAN_NOT_FIND_THE_LATEST_INFORMATION","MSG_DO_YOU_WANT_TO_ADD_MY_FAVORITE","MSG_DO_YOU_WANT_TO_CANCEL_MY_FAVORITE","MSG_PLEASE_ENTER_START_DATE","MSG_PLEASE_ENTER_END_DATE","MSG_PLEASE_SELECT_AT_LEAST_ONE_COURSE","MSG_THE_START_DATE_CAN_NOT_BE_GREATER_THAN_THE_END_DATE","MSG_PLEASE_SELECT_DEPARTMENT_MEMBER","MSG_THE_FORM_HAS_NOT_BEEN_COMPLETED_YET_PLEASE_CONFIRM","MSG_UPDATE_PASSWORD_SUCCESS","MSG_ENROLLMENT_APPROVAL_PENDING","MSG_THIS_ACTION_WILL_RELEVANT_STUDY_REPORT","MSG_ARE_YOU_SURE_WANT_TO_DELETE_DEPUTY_RECORD","MSG_DEPUTY_EFFECTIVE_DATE_CNA_NOT_EMPTY","MSG_DEPUTY_END_DATE_CNA_NOT_EMPTY","MSG_DEPUTY_END_DATE_CNA_NOT_BE_EARLIER_THAN_DEPUTY_EFFECTIVE_DATE","MSG_PLEASE_SETTING_DEPUTY","MSG_SETTING_DEPUTY_SUCCESSFUL","MSG_EDIT_DEPUTY_RECORD_SUCCESSFUL","MSG_NOT_ALLOW_TO_DELETE_OTHER_SETTING","MSG_PLEASE_SELECT_AT_LEAST_ONE_TIME_PERIOD","MSG_PLEASE_FILE_IN_THE_REASON_FOR_REJECT","MSG_ERROR_NEED_FINISH_PREREQUISITE_ITEMS","MSG_SELECT_COURSE_OR_OTHER_NEED","MSG_SORRY_YOU_ONLY_DELETE_COURSES_FORM_SELF_REQUIRED_WHICH_ARE_STILL_OPEN_FOR_ENROLLMENT","MSG_SORRY_YOU_CANNOT_DELETE_COURSES_WHICH_YOU_HAVE_ENROLLED_IN","MSG_SORRY_YOU_ONLY_DELETE_COURSES_FORM_MANAGER_SUGGEST_WHICH_ARE_STILL_OPEN_FOR_ENROLLMENT","MSG_SORRY_YOU_CANNOT_DELETE_COURSES_WHICH_EMPLOYEES_HAVE_ENROLLED_IN","MSG_SORRY_YOU_CAN_ONLY_UPDATE_PLANNED_COMPLETION_DATE_OF_COURSE_FROM_SELF_REQUIRES_AND_MANAGER_SUGGESTION","MSG_SORRY_YOU_CAN_ONLY_UPDATE_PLANNED_COMPLETION_DATE_OF_COURSE_FROM_SELF_REQUIRES","MSG_PLEASE_FILL_IN_THE_REASON","MSG_THE_SETTING_TIME_DOES_NOT_EXIST_PLEASE_RE_ENTER","MSG_TIME_PERIOD_N_PARTIALLY_OVERLAPS_PLEASE_RESET","MSG_SUCCESSFUL_OPERATION","MSG_FAILED_OPERATION","MSG_EXTERNAL_TRAINING_APPLY_SUMMIT_CHECK","MSG_THE_START_DATE_NEED_TO_EARLIER_THAN_THE_END_DATE","MSG_YOUR_ATTENDANCE_RATE_IS_TOO_LOW_TO_FILL_OUT","MSG_ENROLLMENT_WAITING_APPROVAL","MSG_CLASS_TIME_CONFLICT","MSG_TIME_IS_OUT","MSG_ASSIGN_EXCEED_MAX","MSG_CURRENTLY_ON_THE_TEMPORARY_LEARNING_RESOURCES","MSG_ERROR_MESSAGE_ENROLL_CAUSE_PASS_RESULT","MSG_INNERCERT_CANNOT_ENROLL_EXTENDED_SESSION","MSG_RESTORE_LAST_TIME_UNFINISHED_FORM","MSG_COURSE_DATA_FILE_NEED_RE_CHOOSE","MSG_THE_TIME_RANGE_IS_ERROR","MSG_CONFIRM_TO_DELETE","MSG_PLEASE_SELECT_AT_LEAST_ONE_ITEM","MSG_BEFORE_YOU_REGISTER_YOU_MUST_FILL_OUT_THE_REGISTRATION_QUESTIONNAIRE_ARE_YOU_SURE_YOU_WANT_TO_CONTINUE","MSG_YOU_DO_NOT_HAVE_PERMISSION_TO_VIEW_THIS_LEARNING_ACTIVITY","MSG_PLEASE_SELECT_ONE_COURSE","MSG_PLEASE_SELECT_ONE_COURSE_SESSION","MSG_THE_APPLICATION_FORM_WAS_UPDATED_SUCCESSFULLY","MSG_YOU_HAVE_SUCCESSFULLY_ADDED_EXTERNAL_VENDOR","ADDED_EXTERNAL_VENDOR","PICTURE_OVER_MB_PLEASE_RELOAD","httpErrorCodeConstant","102_TITLE","102_CONTENT","400_TITLE","400_CONTENT","401_TITLE","401_CONTENT","402_TITLE","402_CONTENT","403_TITLE","403_CONTENT","404_TITLE","404_CONTENT","405_TITLE","405_CONTENT","406_TITLE","406_CONTENT","407_TITLE","407_CONTENT","408_TITLE","408_CONTENT","409_TITLE","409_CONTENT","410_TITLE","410_CONTENT","411_TITLE","411_CONTENT","412_TITLE","412_CONTENT","413_TITLE","413_CONTENT","414_TITLE","414_CONTENT","415_TITLE","415_CONTENT","416_TITLE","416_CONTENT","417_TITLE","417_CONTENT","418_TITLE","418_CONTENT","421_TITLE","421_CONTENT","422_TITLE","422_CONTENT","423_TITLE","423_CONTENT","424_TITLE","424_CONTENT","425_TITLE","425_CONTENT","426_TITLE","426_CONTENT","449_TITLE","449_CONTENT","451_TITLE","451_CONTENT","500_TITLE","500_CONTENT","501_TITLE","501_CONTENT","502_TITLE","502_CONTENT","503_TITLE","503_CONTENT","504_TITLE","504_CONTENT","505_TITLE","505_CONTENT","506_TITLE","506_CONTENT","507_TITLE","507_CONTENT","509_TITLE","509_CONTENT","510_TITLE","510_CONTENT","formValidationConstant","THIS_IS_REQUIRED","PLEASE_RE_CHECK_NEW_PASSWORD","PLEASE_RE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD","PLEASE_SELECT_AT_LEAST_ONE_ITEM","PLEASE_SELECT_AT_LEAST_ONE_MEMBER","PLEASE_SET_AT_LEAST_ONE_TIME_ZONE","THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM","PLEASE_ENTER_A_VALID_URL","PLEASE_ENTER_A_VALID_DATE","SET_THE_TIME_PART_OF_OVERLAP_PLEASE_RESET","PLEASE_ENTER_A_VALID_AMOUNT_OF_MONEY","PLEASE_ENTER_A_VALID_EMAIL","actionsConstant","FINISH","CLOSE","SUBMIT","ENTER","APPLY","DELETE","SEARCH","FILTERS","SORT","SORT_METHOD","LOGIN","LOGOUT","NEXT_STEP","PREVIOUS_STEP","NEXT","PREV","UN_ENROLL","RETURN","FILL_IN","ENROLL","START_LEARNING","START_SURVEY","START_TEST","SELECT_ALL","SELECT_FILES","REPLACE_FILES","UPLOAD_ALL","DELETE_ALL","DOWNLOAD_FILE","SELECT_QUESTION_NUMBER","RE_TEST_ONCE","OPEN_LINK","ALL_ANNOUNCEMENTS","PLAY_COURSE","FILL_IN_TEST_SURVEY","CHANGE_LOGIN_PASSWORD","REPLACE","READ","RATING","DOWNLOAD","SHOW_AVERAGE_RATING","HIDDEN_AVERAGE_RATING","SUBMIT_RATING","FORM_VIEW","VIEW_REPORT","APPROVAL","APPLY_INFORMATION","APPLY_ENROLLMENT","LOGIN_AGAIN","SELECT","REJECT","RESEND","EXPAND_PROFILE_DETAIL","COLLAPSE_PROFILE_DETAIL","EDIT","VIEW","ADD_PERSONAL_ELECTIVE_ITEM","ADD_MANAGER_SUGGEST_ITEM","UPDATE_ESTIMATED_COMPLETION_DATE","UPDATE","ADD_A_TIME_ZONE","EDIT_A_TIME_ZONE","DELETE_A_TIME_ZONE","ADD_FILE","DELETE_FILE","EXPAND_MORE","COLLAPSE_MORE","SELECT_DEPARTMENT","FORM_EDIT","APPLY_APPROVAL","CONTINUE_ENROLL","NEXT_PAGE","PREVIOUS_PAGE","PRINT","SEND_APPLY","ADD_A_TIME","DELETE_A_TIME","EXCERT_APPLY_BONUS","EXCERT_APPLY_COMPENSATION","ADD","REMOVE","SELECT_CLASS","SELECT_COURSE","ADD_NEW_CLASS","EDIT_CLASS","SET_REPORT_SCORE","ADD_APPLY_MEMBER","GO_BACK","wizardHandler","service","wizards","defaultName","addWizard","name","wizard","removeWizard","nameToUse","factory","directive","restrict","replace","transclude","scope","currentStep","onFinish","hideIndicators","editMode","templateUrl","element","attributes","template","controller","$scope","$element","$log","WizardHandler","$q","canEnterStep","step","defer","canEnter","isUndefined","canenter","context","isFunction","then","response","resolve","promise","canExitStep","stepTo","canExit","getStepNumber","currentStepNumber","canexit","unselectAll","forEach","getEnabledSteps","selected","selectedStep","firstRun","this","$on","steps","stepIdx","idx","res","currStep","stepByTitle","titleToFind","foundStep","wzTitle","$watch","stepTitle","goTo","completed","completedStepsIndex","stepIndex","addStep","push","length","isDefined","$emit","index","thisStep","all","data","filter","disabled","currentStepTitle","currentStepDescription","description","totalStepCount","next","callback","enabledSteps","finish","isNumber","previous","Error","cancel","reset","stepFormWizard","$timeout","link","theme","showNav","height","rtl","wzStep","wzData","require","$attrs","title","$inject","wizardButtonDirective","action","on","e","preventDefault","$apply","$eval","toLowerCase","isUndefinedOrNull","val","SweetAlert","$rootScope","$window","$filter","swal","setDefaults","confirmButtonColor","cancelButtonColor","confirmButtonText","cancelButtonText","closeOnCancel","reverseButtons","self","arg1","arg2","arg3","$evalAsync","check","text","type","successCallBack","errorCallBack","cusConfirmButtonText","cusCancelButtonText","_successCallBack","_errorCallBack","undefined","option","showCancelButton","timeoutAlert","allowOutsideClick","allowEscapeKey","html","success","message","error","warning","info","submitCheck","preConfirmFn","queue","showLoaderOnConfirm","preConfirm","insertErrorQueueStep","isHtmlMsg","insertQueueStep","insertSuccessQueueStep","closeFn","onClose","confirmCallback","trustAsResourceUrl","$sce","ngTargetBlank","attrs","attr","ngMetis","el","$last","metisMenu","toggle","doubleTapToGo","mdPersonChips","$mdTheming","$mdUtil","compile","initOptionalProperties","controllerAs","bindToController","personQuery","placeholder","secondaryPlaceholder","personName","personImage","personEmail","personGroup","personIsGray","persons","requireMatch","highlightFlags","selectedPersons","mdCompareTo","$animate","postLink","ctrls","compareTo","charCountEl","errorsSpacer","ngModelCtrl","containerCtrl","nextTick","querySelector","append","$set","value","equals","$$rawModelValue","parent","enter","leave","$validators","modelValue","themeInfoBox","$observe","count","iconColor","icon","doughnutGauge","gaugeData","gaugeLabels","gaugeSize","gaugeOptions","gaugeColors","gaugeValue","valueSuffix","gaugeTitle","subTitle","MdPersonChipsController","vm","selectedItem","searchText","addChipToSelectedPersons","chip","userId","removeChipToSelectedPersons","splice","prototype","queryPerson","results","$query","filterSelected","bind","filterSelectedPersons","itemName","item","person","indexOf","selectDate","bindings","ngModel","min","max","defaultValue","newVal","toString","hours","minutes","component","MdCompanyChipsController","arrayObjectIndexOf","arr","obj","i","autoCompleteSelected","selectedItemChange","checked","chipIndex","$postLink","mdCompanyChips","mFormat","m","format","tz","moment","isMoment","datePickerUtils","firstDay","createNewDate","year","month","day","hour","minute","utc","Date","UTC","getVisibleMinutes","pushedDate","date","offset","utcOffset","getVisibleWeeks","startYear","startMonth","weeks","add","getDaysOfWeek","getVisibleYears","d","actualOffset","years","days","getVisibleMonths","months","getVisibleHours","isAfter","model","unix","isBefore","isSameYear","isSameMonth","isSameDay","isSameHour","isSameMinutes","isHasDayEvent","dateEvent","setParams","zone","fd","scopeSearch","comparisonFn","target","parentScope","nameArray","split","j","$parent","findFunction","findParam","createMoment","_i","getDate","result","isValid","eventIsForPicker","targetIDs","pickerID","matches","id","RegExp","test","isArray","some","uiDateRange","$compile","dateTimeConfig","getTemplate","extend","minDate","maxDate","randomName","Math","random","substr","start","end","setMax","$broadcast","pickerIDs","setMin","dateChange","pickerRangeID","modelName","newDate","event","timezone","$watchGroup","dates","onSetDate","picker","uiDatePicker","datePickerConfig","after","before","dateEvents","showEventLightbox","prepareViews","views","concat","view","slice","maxView","minView","update","arrowClick","weekdays","prepareViewData","watch","setDate","isSame","clipDate","isNow","inValidRange","parseInt","partial","now","autoclose","autoClose","weekday","ceil","second","watchDirectChanges","callbackOnSetDate","isObject","Object","keys","setView","nextView","closeLightBox","showEvents","isOnlyDay","lightBoxEvents","addClass","$setViewValue","classes","classList","week","isoWeekday","key","params","viewConfig","compareFunc","delta","valid","date1","date2","momentNames","is","prev","updateViews","updateViewData","uiDateTime","$document","$parse","PRISTINE_CLASS","DIRTY_CLASS","body","find","dateFilter","formatter","parser","viewValue","parsed","minValid","maxValid","updateInput","stopPropagation","$pristine","$dirty","removeClass","parentForm","$setDirty","$render","clear","remove","container","showPicker","$digest","shownOnce","dismiss","blur","position","pos","getBoundingClientRect","offsetHeight","css","top","left","display","parentElement","insertBefore","evt","inheritedData","unshift","$formatters","$parsers","validateRequired","$validate","$modelValue","uiDateTimeAppend","focus","dateFns","buildDistanceInWordsLocale","localize","token","options","isString","distanceInWordsLocale","one","other","addSuffix","comparison","lessThanXSeconds","xSeconds","halfAMinute","lessThanXMinutes","xMinutes","aboutXHours","xHours","xDays","aboutXMonths","xMonths","aboutXYears","xYears","overXYears","almostXYears","buildFormatLocale","months3char","monthsFull","weekdays2char","weekdays3char","weekdaysFull","meridiemUppercase","meridiemLowercase","meridiemFull","formatters","MMM","getMonth","MMMM","dd","getDay","ddd","dddd","A","getHours","a","aa","ordinalFormatters","formatterToken","ordinal","formattingTokensRegExp","buildFormattingTokensRegExp","number","rem100","commonFormatterKeys","formattingTokens","sort","reverse","join","parse","dateString","isDate","getTime","additionalDigits","DEFAULT_ADDITIONAL_DIGITS","dateStrings","splitDateString","parseYearResult","parseYear","restDateString","parseDate","timestamp","time","parseTime","parseTimezone","getTimezoneOffset","MILLISECONDS_IN_MINUTE","timeString","array","parseTokenDateTimeDelimeter","parseTokenPlainTime","parseTokenTimezone","exec","parseTokenYYY","parseTokensYYY","parseTokenYYYYY","parseTokensYYYYY","parseTokenYYYY","yearString","parseTokenYY","centuryString","setUTCFullYear","parseTokenMM","parseTokenDDD","dayOfYear","parseTokenMMDD","parseTokenWww","dayOfISOYear","parseTokenWwwD","dayOfWeek","parseTokenHH","parseFloat","MILLISECONDS_IN_HOUR","parseTokenHHMM","parseTokenHHMMSS","seconds","timezoneString","absoluteOffset","parseTokenTimezoneZ","parseTokenTimezoneHH","parseTokenTimezoneHHMM","isoYear","fourthOfJanuaryDay","getUTCDay","diff","setUTCDate","getUTCDate","endOfWeek","dirtyDate","weekStartsOn","setHours","endOfMonth","setFullYear","getFullYear","differenceInDays","dirtyDateLeft","dirtyDateRight","dateLeft","dateRight","sign","compareAsc","difference","abs","differenceInCalendarDays","isLastDayNotFull","addDays","amount","addHours","addISOYears","setISOYear","getISOYear","addMilliseconds","setMilliseconds","getMilliseconds","addMinutes","setMinutes","getMinutes","addMonths","desiredMonth","dateWithDesiredMonth","daysInMonth","getDaysInMonth","setMonth","addQuarters","addSeconds","setSeconds","getSeconds","addWeeks","addYears","closestIndexTo","dirtyDateToCompare","dirtyDatesArray","Array","TypeError","call","minDistance","dateToCompare","timeToCompare","currentDate","distance","closestTo","timeLeft","timeRight","compareDesc","MILLISECONDS_IN_DAY","startOfDayLeft","startOfDay","startOfDayRight","timestampLeft","timestampRight","round","differenceInCalendarISOWeeks","MILLISECONDS_IN_WEEK","startOfISOWeekLeft","startOfISOWeek","startOfISOWeekRight","differenceInCalendarISOYears","differenceInCalendarMonths","yearDiff","monthDiff","differenceInCalendarQuarters","quarterDiff","getQuarter","differenceInCalendarWeeks","startOfWeekLeft","startOfWeek","startOfWeekRight","differenceInCalendarYears","differenceInHours","differenceInMilliseconds","floor","differenceInISOYears","subISOYears","isLastISOYearNotFull","differenceInMinutes","differenceInMonths","isLastMonthNotFull","differenceInQuarters","differenceInSeconds","differenceInWeeks","differenceInYears","isLastYearNotFull","distanceInWordsStrict","MINUTES_IN_DAY","MINUTES_IN_MONTH","MINUTES_IN_YEAR","locale","enLocale","distanceInWords","localizeOptions","unit","mathPartial","partialMethod","distanceInWordsToNow","eachDay","dirtyStartDate","dirtyEndDate","startDate","endDate","endTime","endOfDay","endOfHour","endOfISOWeek","endOfISOYear","fourthOfJanuaryOfNextYear","endOfMinute","endOfQuarter","currentMonth","endOfSecond","endOfToday","endOfTomorrow","endOfYear","endOfYesterday","buildFormatFn","formatStr","formatLocale","match","removeFormattingTokens","output","Function","input","formatTimezone","delimeter","absOffset","addLeadingZeros","targetLength","dayOfMonth","getDaysInYear","isLeapYear","getDayOfYear","startOfYear","monthIndex","lastDayOfMonth","getISODay","getISOWeek","startOfISOYear","getISOWeeksInYear","thisYear","nextYear","valueOf","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","milliseconds","quarter","getYear","argument","isEqual","dirtyLeftDate","dirtyRightDate","isFirstDayOfMonth","isFriday","isFuture","isLastDayOfMonth","isMonday","isPast","dateLeftStartOfDay","dateRightStartOfDay","dateLeftStartOfHour","startOfHour","dateRightStartOfHour","isSameISOWeek","isSameWeek","isSameISOYear","dateLeftStartOfYear","dateRightStartOfYear","isSameMinute","dateLeftStartOfMinute","startOfMinute","dateRightStartOfMinute","isSameQuarter","dateLeftStartOfQuarter","startOfQuarter","dateRightStartOfQuarter","isSameSecond","dateLeftStartOfSecond","startOfSecond","dateRightStartOfSecond","dateLeftStartOfWeek","dateRightStartOfWeek","isSaturday","isSunday","isThisHour","isThisISOWeek","isThisISOYear","isThisMinute","isThisMonth","isThisQuarter","isThisSecond","isThisWeek","isThisYear","isThursday","isToday","isTomorrow","tomorrow","isTuesday","isNaN","isWednesday","isWeekend","isWithinRange","startTime","isYesterday","yesterday","lastDayOfISOWeek","lastDayOfWeek","lastDayOfISOYear","fourthOfJanuary","lastDayOfQuarter","lastDayOfYear","dirtyDates","arguments","map","latestTimestamp","apply","earliestTimestamp","setDay","currentDay","remainder","dayIndex","setDayOfYear","setISODay","setISOWeek","isoWeek","setQuarter","oldQuarter","setYear","startOfMonth","startOfToday","startOfTomorrow","cleanDate","startOfYesterday","subDays","subHours","subMilliseconds","subMinutes","subMonths","subQuarters","subSeconds","subWeeks","subYears","MINUTES_IN_ALMOST_TWO_DAYS","MINUTES_IN_TWO_MONTHS","includeSeconds","nearestMonth","monthsSinceStartOfYear","formatFn","M","MM","Q","D","DD","DDD","DDDD","E","W","WW","YY","YYYY","GG","String","GGGG","H","HH","h","hh","mm","s","ss","S","SS","SSS","Z","ZZ","X","x","calendarUtils","WEEKEND_DAY_NUMBERS","DAYS_IN_WEEK","HOURS_IN_DAY","MINUTES_IN_HOUR","getWeekViewEventSpan","span","begin","totalLength","getWeekViewEventOffset","isEventIsPeriod","_a","periodStart","periodEnd","eventStart","eventEnd","getEventsInPeriod","events","getWeekDay","today","getWeekViewHeader","viewDate","getWeekView","isSort","_b","startOfViewWeek","endOfViewWeek","eventsMapped","startsBeforeWeek","endsAfterWeek","itemA","itemB","startSecondsDiff","eventRows","allocatedEvents","rowSpan_1","otherRowEvents","nextEvent","row","getMonthView","eventsInMonth","events_1","inMonth","badgeTotal","rows","rowOffsets","getDayView","hourSegments","dayStart","dayEnd","eventWidth","segmentHeight","startOfView","endOfView","previousDayEvents","dayViewEvents","allDay","eventA","eventB","startsBeforeDay","endsAfterDay","hourHeightModifier","bottom","overlappingPreviousEvents","previousEvent","previousEventTop","previousEventBottom","dayEvent","width","allDayEvents","getDayViewHourGrid","segmentDuration","startOfViewDay","segments","isStart","calendarTitle","calendarConfig","calendarHelper","formatDate","titleFormats","startOf","$http","$templateRequest","$templateCache","$interpolate","dateFormatter","toDate","adjustEndDateFromStartDiff","oldStart","newStart","oldEnd","diffInSeconds","getRecurringEventPeriod","eventPeriod","recursOn","containerPeriodStart","set","eventIsInPeriod","startsAt","endsAt","filterEventsInPeriod","startPeriod","endPeriod","calendarDate","period","allEvents","endOf","getBadgeTotal","incrementsBadgeTotal","getWeekDayNames","dateFormats","weekDay","getYearView","cellModifier","eventsInPeriod","clone","periodEvents","cell","label","calendarCell","displayAllMonthEvents","weekDayLabel","dayLabel","weekViewStart","originalEvent","eventRow","rowEvent","dayViewStart","dayViewEnd","dayViewSplit","dayViewEventWidth","getWeekViewWithTimes","weekView","newEvents","flattenedEvents","dayEvents","newDayEvents","getDayViewHeight","dayViewStartM","dayViewEndM","hourHeight","loadTemplates","promises","templates","get","deferred","templateContents","startSymbol","endSymbol","put","reject","calendarEventTitle","calendarDateFilter","calendarTruncateEventTitleFilter","yearView","monthView","monthViewTooltip","weekViewTooltip","dayView","dayViewTooltip","calendarTrustAsHtml","trustAsHtml","calendarTruncateEventTitle","string","boxHeight","calendarLimitTo","limitToFilter","version","minor","limit","Number","Infinity","getFromConfig","$stateful","mwlResizable","getUnitsResized","edge","elm","unitsResized","y","originalDimensions","interact","snap","snapGridDimensions","snapGrid","targets","createSnapGrid","resizeEdge","originalDimensionsStyle","resizable","edges","resizeEdges","onstart","offsetWidth","onmove","rect","deltaRect","onResize","onend","transform","onResizeEnd","enabled","unset","mwlElementDimensions","setDimensions","assign","$applyAsync","win","unbind","mwlDynamicDirectiveTemplate","overrides","templateName","warn","contents","mwlDroppable","DROP_ACTIVE_CLASS","dropActiveClass","dropzone","ondragenter","ondragleave","ondropdeactivate","ondrop","relatedTarget","dropData","onDrop","mwlDraggable","translateElement","transformValue","draggable","style","pointerEvents","onDragStart","dx","dy","axis","getComputedStyle","onDrag","onDragEnd","removeAttr","mwlDragSelect","handleMouseEvent","callbackName","enableMouseListeners","onMouseDown","onMouseMove","onMouseUp","disableMouseListeners","off","onDragSelectStart","onDragSelectMove","onDragSelectEnd","isEnabled","mwlDateModifier","onClick","setToToday","increment","decrement","subtract","mwlCollapseFallback","$injector","has","shouldCollapse","allDateFormats","datetime",{"end":{"file":"?","comments_before":[],"nlb":false,"endpos":230296,"endcol":19,"endline":6974,"pos":230285,"col":8,"line":6974,"value":"dateFormats","type":"name","_comments_dumped":true},"start":{"file":"?","comments_before":[],"nlb":false,"endpos":230296,"endcol":19,"endline":6974,"pos":230285,"col":8,"line":6974,"value":"dateFormats","type":"name","_comments_dumped":true},"name":"dateFormats"},"showTimesOnWeekView","isSortEventOnWeekView","i18nStrings","weekNumber","calendar","calendarDayView","calendarHourList","calendarMonthCell","calendarMonthCellEvents","calendarMonthView","calendarSlideBox","calendarWeekView","calendarYearView","colorTypes","primary","secondary","important","inverse","special","room","train","MwlCalendarCtrl","$locale","checkEventIsValid","LOG_PREFIX","refreshCalendar","viewTitle","calendarEventId","shouldUpdate","previousDate","previousView","slideBoxDisabled","changeView","newDay","dateClicked","rawDate","onViewChangeClick","calendarNextView","templatesLoaded","eventsWatched","err","mwlCalendar","cellIsOpen","cellAutoOpenDisabled","customTemplateUrls","onEventClick","onEventTimesChanged","onTimespanClick","onDateRangeSelect","dayViewEventChunkSize","templateScope","weekNumberLabelDisabled","MwlCalendarYearCtrl","toggleCell","openRowIndex","openMonthIndex","monthClicked","monthClickedFirstRun","$event","defaultPrevented","handleEventDrop","newMonthDate","newEnd","calendarEvent","calendarNewEventStart","calendarNewEventEnd","$ctrl","calendarCtrl","mwlCalendarYear","MwlCalendarWeekCtrl","showTimes","dayViewHeight","weekDragged","daysDiff","minuteChunksMoved","minutesDiff","tempStartsAt","eventDropped","weekResized","tempTimeChanged","mwlCalendarWeek","MwlCalendarSlideBoxCtrl","isCollapsed","isOpen","isMonthView","mwlCalendarMonth","isYearView","mwlCalendarSlideBox","MwlCalendarMonthCtrl","openDayIndex","weekDays","monthOffsets","dayClicked","dayClickedFirstRun","highlightEvent","shouldAddClass","highlightClass","backgroundColor","dayContainsEvent","color","newDayDate","draggedFromDate","calendarDraggedFromDate","getWeekNumberLabel","dateRangeSelect","calendarRangeStartDate","calendarRangeEndDate","MwlCalendarHourListCtrl","updateDays","hourGrid","segment","nextSegmentDate","originalLocale","active","mwlCalendarHourList","dayWidth","MwlCalendarDayCtrl","refreshView","nonAllDayEvents","viewWidth","eventDragComplete","eventDragged","eventResizeComplete","eventResized","mwlCalendarDay","TreeTableOrderBy","_fnOrderBy","for_all_descendants","node","fnOrderBy","_len","_nodes","_fnOrder","list","orderBy","_fnMain","treeData","TreeTableFilter","fieldChild","fnBefore","fnAfter","parentPassed","_nodePassed","_childPassed","_filter_index","filter_index","_fnCheck","_regex","_fnProccess","condition","isAnd","for_each_filter","_iO","_keysO","_lenO","_key","field","_callback","conditions","len","passed","_fnAfter","isNodePassed","isChildPassed","isParentPassed","__filtered__","__filtered_visible__","__filtered_index__","showParent","showChild","_fnBefore","beginAnd","_fnBeforeClear","_fnConvert","filters","_iF","_lenF","_keysF","_filter","_state","fnInitFilter","keyChild","fnInitTreeTableViewport","updateDelayed","updateTimeout","isUpdating","isRender","updateAgain","recursivePromise","items","renderTime","viewport","eWindow","setViewport","getViewport","setTemplate","getItems","pointIsInsideBounds","bounds","TreeTableControl","fnSetCollapse","__expanded__","fnSetExpand","_$init","n","tree","selected_node","select_node","__selected__","expand_all_parents","on_select","deselect_node","_target","get_parent","__parent_real__","tree_nodes","for_all_ancestors","child","fn","_parent","collapse_all_parents","reload_data","add_node","new_node","__children__","add_node_root","expand_all","collapse_all","remove_node","__index__","expand_node","collapse_node","get_selected_node","get_first_node","get_children","get_siblings","get_next_sibling","get_prev_sibling","get_first_child","get_closest_ancestor_next_sibling","get_next_node","get_prev_node","get_last_descendant","getLastDescendant","select_parent_node","select_first_node","firstNode","select_next_sibling","select_prev_sibling","select_next_node","select_prev_node","TreeTableTemplate","temp","templatePath","copyPath","movePath","scopes","setMove","path","$id","setCopy","getPath","getCopy","getMove","TreeTablePlugin","_fnget","TreeTableHelper","_$helper","nodrag","targetElm","eventObj","targetTouches","dragInfo","_node","getData","_tree","getScopeTree","getNode","move","drag","drop","getPrevSibling","changed","prop","boundingClientRect","pageYOffset","scrollTop","documentElement","pageXOffset","scrollLeft","positionStarted","offsetX","pageX","offsetY","pageY","startX","lastX","startY","lastY","nowX","nowY","distX","distY","dirAx","dirX","dirY","lastDirX","lastDirY","distAxX","distAxY","positionMoved","firstMoving","newAx","moving","replaceIndent","indent","children","$callbacks","calsIndent","TreeTableConvert","_$initConvert","line2tree","primaryKey","parentKey","parentId","rootIds","_primary","treeObjs","tree2tree","access_child","containKey","_copy","_child","copy","arrayTree2tableTree","fnInitTreeTable","$TreeTableTemplate","$TreeTableClass","$TreeTableHelper","$TreeTablePlugin","$TreeTableViewport","fnController","timeLoadData","tmpTreeData","timeReloadData","check_exist_attr","existAttr","for_each_attrs","exist","generateWatch","nameAttr","valDefault","nameScope","fnNotExist","$safeApply","phase","$root","$$phase","getExpandOn","_firstNode","_keys","expandingProperty","getColDefs","_col_defs","colDefinitions","do_f","root","parent_real","level","visible","_icon","_index_real","_dept","_hashKey","__parent__","isFolderType","expandLevel","__index_real__","__level__","__icon__","__icon_class__","$class","__visible__","__uid__","getHash","__hashKey__","primary_key","__dept__","init_data","oData","_data","_tree_nodes","expandOn","columnDefs","_fnInitOrderBy","_fnInitFilter","filterOptions","_deptTotal","indent_plus","indent_unit","$tree_class","$type","$globals","1","iconExpand","0","iconCollapse","-1","iconLeaf","checkSibling","last_child","getElementChilds","on_click","onSelect","passedExpand","_clone","toggleExpand","fnCallback","expand","_fnGetHash","_fnSetHash","setHash","accept","dropEnabled","skipUnit","skipEdge","droppable","dragEnabled","beforeDrop","changeKey","_this","delayReload","clearInfo","__inited__","deleteScope","_hash","setScope","getScope","enableDrag","enableDrop","placeElm","horizontal","dragDelay","enabledMove","statusMove","enabledHotkey","enabledCollapse","statusElm","dragging","beforeDrag","dragStop","dropped","_nodeAdd","_move","_parentRemove","_parentAdd","isMove","dragStart","dragMove","setDragging","enableMove","enableStatus","enabledStatus","hideStatus","hidden","refreshStatus","statusElmOld","setPositionStatus","z-index","status","targeting","_index","initPlace","dragElm","isTable","document","createElement","_len_down","empty","place","parentNode","hidePlace","showPlace","hiddenChild","nodeScope","_fnGetControl","w","_curW","_typeW","_nameW","_defaultW","_scopeW","_NotW","_AfterW","_BeforeW","_defaultFilterOption","_watches","isHotkey","templateCopy","_url","templateMove","treeClass","trim","$tree","colDefs","_passed","enabledFilter","indentUnit","optCallbacks","lenW","updateLimit","$TreeLimit","fnCompile","tElement","$_Template","_element","ready","checkTreeTable","attrInclude","elemNode","treeInclude","cache","tempDiv","innerHTML","templateNode","promiseCheck","TreeTableNodes","nodes","$nodes_class","TreeTableNode","fnLink","fnWatchNode","oldVal","nodeOf","keyNode","first","parentReal","_childs","hashKey","childsElem","$node_class","enabledDnD","treeTableNode","getScopeNode","objexpr","objprops","keyO","lenO","skipAttr","keepAttr","lenKeep","TreeTableNodeHandle","handle","new_val","compileReplace","replaceWith","UiTreeHelper","nodesData","setNodeAttribute","attrName","getNodeAttribute","treeFactory","mergeSort","comparatorFn","firstHalf","secondHalf","merge","arr1","arr2","left1","left2","shift","findInsertIndex","k","TreeModel","config","childrenPropertyName","modelComparatorFn","addChildToNode","Node","hasComparatorFunction","addChild","insertIndex","parseArgs","args","ctx","strategy","walkStrategies","childCount","isRoot","hasChildren","addChildAtIndex","setIndex","oldIndex","addToPath","getIndex","walk","pre","depthFirstPreOrder","keepGoing","post","depthFirstPostOrder","breadth","processQueue","indexOfChild","uiTree","treeConfig","ctrl","tdElm","$trElm","emptyElmColspan","callbacks","$emptyElm","emptyTreeClass","resetEmptyElement","maxDepth","uiTreeNodes","controllersArr","treeNodeCtrl","treeCtrl","nodesClass","$childNodesScope","$nodeScope","$nodesScope","$treeScope","uiTreeNode","uiTreeHelper","keydownHandler","nodeClass","treeNode","init","collapsed","defaultCollapsed","keyCode","uiTreeHandle","handleClass","$handleScope","uiTreeController","isEmpty","uiTreeNodesController","$nodesMap","initSubNode","subNode","destroySubNode","sourceNode","destIndex","isParent","$parentNodesScope","hasChild","childNodes","depth","outOfDepth","maxSubDepth","uiTreeNodeController","$stateParams","countSubTreeDepth","childNode","childDepth","thisLevelDepth","$parentNodeScope","treeNodesCtrl","$index","isSibling","targetNode","isChild","siblings","childNodesCount","collapse","uiTreeHandleController","progressBarService","ProgressBarService","calculateProgressBar","startValue","remainingTime","endTimeAttr","coutdown","endTimeValue","initialCountdown","displayProgressBar","I18nService","language","fallback","timeHumanizer","lang","supported_languages","humanizeDuration","getSupportedLanguages","humanizer","halfUnit","getTimeUnits","millis","diffFromAlarm","units","ngTableParams","ngTableDefaults","ngTableDefaultGetData","ngTableEventsChannel","isFinite","NgTableParams","baseParameters","baseSettings","parseGroup","group","defaultSort","settings","groupOptions","sortDirection","grp","convertSortToOrderBy","sorting","column","createComparableParams","groupSortDirection","hasGlobalSearchFieldChanges","currentVal","$","previousVal","prevParamsMemento","optimizeFilterDelay","filterDelay","defaultFilterOptions","total","filterDelayThreshold","defaultSettingsFns","runInterceptorPipeline","fetchedData","interceptors","reduce","interceptor","thenFn","when","rejectFn","responseError","reason","getDefaultSettingFns","dataset","getGroups","groupFn","groupField","originalDataOptions","dataOptions","applyPaging","gotData","groups","groupName","$hideRows","isExpanded","orderByFn","getOrderByFn","ks","isNullInstance","errParamsMemento","isCommittedDataset","initialEvents","log","debugMode","debug","filterComparator","filterFilterName","filterFn","filterLayout","defaultGroupOptions","parameters","newParameters","parseParamsFromUrl","lastKey","v","newSettings","originalDataset","hasDatasetChanged","hasOwnProperty","page","fireEvent","publishDatasetChanged","significantFilter","filterValue","groupArray","sortArray","isSortBy","direction","generatePagesArray","currentPage","totalItems","pageSize","maxPage","maxPivotPages","minPage","numPages","pages","current","paginationMaxBlocks","paginationMinBlocks","isDataReloadRequired","hasFilter","hasGroup","hasFilterChanges","previousFilter","url","asString","collectValue","pairs","encodeURIComponent","isSignificantValue","subkey","pname","reload","pData","$loading","oldData","publishAfterReloadData","reloadPages","hasErrorState","currentPages","oldPages","newPages","publishPagesChanged","counts","sortingIndicator","publishAfterCreated","addChangeEvent","eventName","fnName","charAt","toUpperCase","substring","createEventSubscriptionFn","createPublishEventFn","handler","eventSelector","identity","$new","requiredPublisher","publisher","eventArgs","rest","fnArgs","ngTableColumn","buildColumn","defaultScope","columns","extendedCol","create","defaults","createDefaults","prop1","getterSetter","isScopeLike","getterFn","$column","$columns","class","createGetterSetter","groupable","filterData","noop","headerTemplateURL","headerTitle","sortable","show","titleAlt","columnType","minWidth","canHideColumn","hideColumn","priority","initialValue","newValue","object","ngTableFilterConfigProvider","resetConfigs","defaultConfig","setConfig","customConfig","mergeConfig","aliasUrls","ngTableFilterConfig","getTemplateUrl","filterDef","filterKey","getUrlForAlias","aliasName","defaultBaseUrl","defaultExt","publicConfig","defineProperty","enumerable","$get","provider","ngTableDefaultGetDataProvider","getFilterFn","sortingFilterName","applyFilter","filterKeys","parsedFilter","setPath","pagedData","applySort","defaultDataOptions","fData","orderedData","ret","parentPathKeys","ngTable","dataRow","groupRow","tr","hasClass","getAttrValue","setAttrValue","parsedAttribute","expr","localValue","getter","parsedExpr","titleExpr","buildColumns","setupBindingsToInternalScope","loadFilterData","compileDirectiveTemplates","ngTableSorterRow","ngTableSelectFilterDs","ngTableSelectFilterDsController","bindDataSource","getSelectListData","hasEmptyOption","$selectData","isMatch","ngTablePagination","onAfterReloadData","pubParams","ng-include","ngTableGroupRow","ngTableFilterRow","ngTableDynamic","showExpr","parseNgTableDynamicExpr","tableParams","$watchCollection","newCols","exprColumns","controlColumn","resize","ngTableColumnsBinding","linkFn","setter","newColumns","shallowClone","NgTableController","onDataReloadStatusChange","newStatus","currentParams","delayFilter","setupFilterRowBindingsToInternalScope","showFilter","show_filter","hasVisibleFilterColumn","disableFilter","$filterRow","setupGroupRowBindingsToInternalScope","$groupRow","showGroup","showGroupGetter","getVisibleColumns","c","predicate","found","commonInit","bindDataToScope","newDatapage","visibleColumns","$groups","visibleColumnCount","$data","bindPagesToScope","isMyPublisher","onPagesChanged","timer","ms","newParams","oldParams","header","templateHeader","pagination","templatePagination","responsiveRow","templateResponsiveRow","headerTemplate","theadFound","tagName","prepend","paginationTemplate","ng-table-pagination","template-url","buildControlColumns","responsiveCol","clickFn","rowChild","hide","removeChild","responsiveTR","responsiveTrRow","col","parts","tableParamsExpr","tableParamsGetter","paramsModel","NgTableSorterRowController","sortBy","parsedSortable","inverseSort","sortingParams","ctrlKey","metaKey","NgTableResponsiveController","resizeAuto","breakpoint","n_breakpoint","eleWidth","_breakpoints","breakpoints","resizeColumns","minColumns","_minColumns","useTableWidth","columnWidth","breakpointWidth","p_breakpointWidth","_useTableWidth","innerWidth","hideColumnCount","canHideControlColumn","NgTableGroupRowController","getGroupables","getGroupTitle","groupBy","isSelectedGroup","toggleDetail","setGroup","changeSortDirection","newDirection","$selGroup","findGroupColumn","groupKey","groupableCols","groupFns","existingGroupCol","$selGroupTitle","groupedColumn","NgTableFilterRowController","getFilterCellCss","layout","size","getFilterPlaceholderValue","uiPaginationService","lastRegisteredInstance","instances","registerInstance","instanceId","asyncMode","deregisterInstance","isRegistered","getLastInstanceId","setCurrentPageParser","currentPageParser","setFilterOptionParser","filterOptionParser","setSortOption","method","sortOption","getSortOption","setFilterOption","filterOption","getFilterOption","setSearchOption","searchOption","getSearchOption","setContentLayoutTemplate","contentLayoutTemplate","getContentLayoutTemplate","setPaginationsObj","paginationsObj","getPaginationsObj","setCurrentPage","getCurrentPage","setItemsPerPage","itemsPerPage","getItemsPerPage","setCollectionLength","collectionLength","getCollectionLength","setAsyncModeTrue","setAsyncModeFalse","isAsyncMode","paginationTemplateProvider","templateString","headerTemplateString","headerTemplatePath","setHeaderPath","setString","str","setHeaderString","getString","getHeaderPath","getHeaderString","itemsPerPageFilter","uiPaginationConfig","DEFAULT_ID","collection","paginationId","slicedObject","objKeys","uiPaginationHeaderControls","uiPaginationControlsLinkFn","autoHide","paginationSort","sorts","sortKey","sortMethod","paginationFilter","hasSearchBox","hasChangeTemplate","templateType","query","templateInit","templateChange","search","keyword","keywords","list_size","reloadPaginationData","setSort","order","current_page","filter_key","filter_value","setFilter","DDO","onSortChange","elem","uiPaginationControls","goToPage","num","isValidPageNumber","paginationRange","updateRangeValues","onPageChange","generatePagination","last","perPage","setCurrent","range","lower","upper","numberRegex","rawId","maxSize","canSelectOption","directionLinks","boundaryLinks","previousPage","tracker","rowsPerPage","totalPages","halfWay","ellipsesNeeded","pageNumber","calculatePageNumber","openingEllipsesNeeded","closingEllipsesNeeded","btnFinishFn","uiPaginate","uiPaginationCompileFn","tAttrs","uiPaginationLinkFn","repeatExpression","getRepeatExpression","expression","addNgRepeatToElement","removeTemporaryAttributes","compiled","currentPageGetter","makeCurrentPageGetterFn","filterOptionGetter","makeFilterOptionGetterFn","collectionGetter","filterPattern","itemsPerPageFilterRemoved","addNoCompileAttributes","idDefinedInFilter","hasAttribute","eq","nodeType","defaultCurrentPage","defaultFilterOption","terminal","multiElement","uiPaginateNoCompile","mdpTimePickerProvider","mdpTimePicker","$mdDialog","timePicker","clickOutsideToClose","LABEL_CANCEL","LABEL_OK","targetEvent","locals","autoSwitch","multiple","setOKButtonLabel","setCancelButtonLabel","mdpDatePickerProvider","mdpDatePicker","datePicker","displayFormat","DISPLAY_FORMAT","setDisplayFormat","ngMessage","inputContainer","getClosest","toggleClass","mdpTimePicker1","$mdpTimePicker","$transclude","updateInputElement","inputElement","inputContainerCtrl","setHasValue","$isEmpty","updateTime","timeFormat","strValue","messages","onInputElementEvents","$viewVaue","$error","setInvalid","required","originalModel","ev","noFloat","mdpNoFloat","mdpPlaceholder","openOnClick","mdpOpenOnClick","mdpDisabled","mdpTimePicker2","formatValidator","minDateValidator","_minDate","isSameOrAfter","maxDateValidator","_maxDate","isSameOrBefore","filterValidator","mdpDatePicker1","$mdpDatePicker","dateFormat","updateDate","isError","$invalid","mdpDatePicker2","mdpClock","onEvent","mdpCalendar","animElements","oldValue","TimePickerController","$mdMedia","VIEW_HOURS","VIEW_MINUTES","currentView","clockHours","clockMinutes","switchView","setAM","setPM","confirm","DatePickerController","selectingYear","yearItems","currentIndex_","PAGE_SIZE","START","END","getItemAtIndex","getLength","selectYear","animate","showYear","yearTopIndex","showCalendar","animating","ClockController","TYPE_HOURS","TYPE_MINUTES","STEP_DEG","CLOCK_TYPES","getPointerStyle","divider","degrees","-webkit-transform","-ms-transform","setTimeByDeg","deg","setTime","CalendarController","dow","localeData","firstDayOfWeek","weekdaysMin","isDayEnabled","dom","nextMonth","prevMonth","updateDaysInMonth","datePickerDirective","$$mdSvgRegistry","$mdAria","inputDirective","hiddenIcons","mdHideIcons","ariaLabelValue","ariaLabel","mdPlaceholder","calendarButton","mdCalendar","triangleButton","HAS_TRIANGLE_ICON_CLASS","debounceInterval","dateLocale","DatePickerCtrl","controllers","mdDatePickerCtrl","mdInputContainer","mdNoAsterisk","parseAttributeBoolean","configureNgModel","spacer","setHasPlaceholder","INPUT_CONTAINER_CLASS","HAS_CALENDAR_ICON_CLASS","expect","isErrorGetter","$touched","$submitted","parentSubmittedWatcher","isSubmitted","updateErrorState","$mdConstant","$mdDateLocale","$$mdDateUtil","$$rAF","dateUtil","ngInputElement","calendarPane","inputMask","isFocused","isDisabled","setDisabled","isCalendarOpen","openOnFocus","calendarPaneOpenedFrom","calendarPaneId","nextUid","bodyClickHandler","handleBodyClick","windowEventName","IS_MOBILE_REGEX","navigator","userAgent","vendor","opera","windowEventHandler","debounce","closeCalendarPane","windowBlurHandler","handleWindowBlur","ngDateFilter","leftMargin","topMargin","tabindex","detachCalendarPane","mdIsOpen","shouldBeOpen","openCalendarPane","major","$onInit","EXTRA_INPUT_SIZE","INVALID_CLASS","OPEN_CLASS","DEFAULT_DEBOUNCE_INTERVAL","CALENDAR_PANE_HEIGHT","CALENDAR_PANE_WIDTH","installPropertyInterceptors","attachChangeListeners","attachInteractionListeners","parsedValue","onExternalChange","$viewChangeListeners","updateOn","getModelOption","triggerHandler","setModelValue","resizeInputElement","handleInputEvent","keyCodes","KEY_CODE","altKey","DOWN_ARROW","ngDisabled","opt_date","clearErrorState","isValidDate","createDateAtMidnight","$setValidity","$valid","inputString","parsedDate","setDateTimeToMidnight","isValidInput","isDateComplete","isDateEnabled","isDateWithinRange","attachCalendarPane","elementRect","bodyRect","paneTop","paneLeft","viewportTop","viewportLeft","viewportBottom","innerHeight","viewportRight","scale","appendChild","enableScrolling","inputFocusedOnWindowBlur","disableScrollAround","focusCalendar","evalAttr","addEventListener","$setTouched","removeEventListener","getCalendarCtrl","setFocused","isInCalendar","activeElement","cusMdChips","getTemplateByQuery","userTemplate","outerHTML","chipTemplate","chipRemoveSelector","prefixer","buildList","chipRemoveTemplate","chipContentsTemplate","chipInputTemplate","staticChips","mdChipsCtrl","enableChipEdit","mdCloseIcon","mdClose","aria-hidden","onFocus","mdTransformChip","useTransformChipExpression","mdOnAppend","useOnAppendExpression","mdOnAdd","useOnAddExpression","mdOnRemove","useOnRemoveExpression","mdOnSelect","useOnSelectExpression","readonly","autocompleteEl","configureAutocomplete","configureUserInput","compiledStaticChips","getTemplates","chips","processTemplate","MD_CHIPS_TEMPLATE","CHIP_INPUT_TEMPLATE","default","CHIP_DEFAULT_TEMPLATE","CHIP_REMOVE_TEMPLATE","MdChipsCtrl","removable","maxChips","transformChip","onAppend","onAdd","onRemove","deleteHint","deleteButtonLabel","separatorKeys","userInputNgModelCtrl","autocompleteCtrl","userInputElement","selectedChip","mdEnableChipEdit","addOnBlur","mdAddOnBlur","chipBuffer","useTransformChip","useOnAdd","useOnRemove","inputKeydown","getChipBuffer","isDefaultPrevented","BACKSPACE","getCursorPosition","selectAndFocusChipSafe","hasMaxChipsReached","appendChip","resetChipBuffer","selectionStart","selectionEnd","updateChipContents","chipContents","isEditingChip","isRemovable","chipKeydown","removeAndSelectAdjacentChip","LEFT_ARROW","RIGHT_ARROW","ESCAPE","TAB","getPlaceholder","useSecondary","selIndex","getAdjacentChipIndex","removeChip","resetSelectedChip","newChip","transformedChip","$chip","identical","validateModel","useOnSelect","$viewValue","removed","removeChipAndFocusInput","selectChip","focusChip","selectAndFocusChip","onInputFocus","inputHasFocus","onInputBlur","isModelValid","scopeApplyFn","registerSelectedItemWatcher","hasFocus","calendarDirective","tAttr","extraAttrs","_currentView","CalendarCtrl","mdCalendarCtrl","SELECTED_DATE_CLASS","TODAY_CLASS","FOCUSED_DATE_CLASS","nextUniqueId","displayDate","selectedDate","firstRenderableDate","lastRenderableDate","isInitialized","scrollbarWidth","handleKeyElement","boundKeyHandler","handleKeyEvent","FALLBACK_WIDTH","setNgModelValue","setCurrentView","newView","previousFocus","cellId","getDateId","getElementById","rootElement","getActionFromKeyEvent","which","UP_ARROW","PAGE_DOWN","PAGE_UP","HOME","hideVerticalScrollbar","childCtrl","setWidth","scroller","calendarScroller","scrollMask","paddingRight","clientWidth","namespace","updateVirtualRepeat","virtualRepeatResizeListener","TBODY_HEIGHT","CalendarYearCtrl","yearCtrl","initialize","isMonthTransitionInProgress","cellClickHandler","getTimestampFromNode","getYearDistance","attachScopeListeners","getFocusedYearIndex","changeDate","animationPromise","animateDateChange","monthDistance","incrementMonths","getFirstDateOfMonth","clampDate","mdCalendarYearDirective","CalendarYearBodyCtrl","yearBodyCtrl","generateContent","focusAfterAppend","incrementYears","buildCalendarForYear","buildMonthCell","buildBlankCell","firstOfMonth","setAttribute","monthFormatter","isSameMonthAndYear","cellText","shortMonths","isMonthWithinRange","selectionIndicator","textContent","tabIndex","yearBody","createDocumentFragment","firstRow","labelCell","className","secondRow","TBODY_SINGLE_ROW_HEIGHT","CalendarMonthCtrl","monthCtrl","headerClickHandler","getMonthDistance","getSelectedMonthIndex","changeSelectedDate","previousSelectedDate","changeDisplayDate","selectedDateClass","prevDateCell","dateCell","buildWeekHeader","shortDays","th","incrementDays","getLastDateOfMonth","mdCalendarMonthBodyDirective","ARROW_ICON","mdTabsArrow","CalendarMonthBodyCtrl","monthBodyCtrl","arrowIcon","cloneNode","buildCalendarForMonth","buildDateCell","longDateFormatter","buildDateRow","rowNumber","weekNumberFormatter","opt_dateInMonth","firstDayOfMonth","firstDayOfTheWeek","getLocaleDay_","numberOfDaysInMonth","getNumberOfDaysInMonth","monthBody","isFinalMonth","blankCellOffset","monthLabelCell","monthLabelCellContent","monthHeaderFormatter","monthLabelRow","iterationDate","whitespaceRow","cusMdAutocomplete","MdAutocompleteCtrl","inputName","inputMinlength","inputMaxlength","itemsExpr","itemText","noCache","selectOnMatch","matchInsensitive","itemChange","textChange","minLength","delay","autofocus","floatingLabel","autoselect","menuClass","inputId","escapeOptions","dropdownItems","dropdownPosition","clearButton","attribute","attrValue","$normalize","hasNotFound","mdClearButton","getItemTemplate","templateTag","detach","getNoItemsTemplate","getInputElement","mdFloatingLabel","leftover","getClearButton","noItemsTemplate","itemTemplate","$rootElement","$mdLiveAnnouncer","configureWatchers","gatherElements","moveDropdown","focusInputElement","updateModelValidators","inputModelCtrl","positionDropdown","getVerticalOffset","correctHorizontalAlignment","dropdown","elements","scrollContainer","styles","right","MENU_PADDING","hrect","dropdownHeight","MAX_ITEMS","ITEM_HEIGHT","wrap","vrect","bot","INPUT_PADDING","maxWidth","maxHeight","bottomSpace","getViewportTop","pin","wait","isRequired","isReadonly","handleSearchText","debouncedOnResize","cleanup","onWindowResize","main","ul","getWrapTarget","li","getElementsByTagName","getSnapTarget","getAngularElements","handleHiddenChange","oldHidden","reportMessages","ReportType","Count","Selected","enableWrapScroll","disableElementScrollEvents","onListEnter","noBlur","onListLeave","shouldHide","onMouseup","previousSelectedItem","getDisplayValue","handleSelectedItemChange","displayValue","announceItemChange","getItemAsNameVal","announceTextChange","selectedItemWatchers","watcher","cb","unregisterSelectedItemWatcher","previousSearchText","getDefaultIndex","isMinLengthMet","handleQuery","setLoading","doBlur","forceBlur","isSearchable","keydown","loading","updateScroll","select","hasSelection","shouldProcessEscape","clearSelectedItem","hasEscapeOption","clearSearchText","getMinLength","getItemText","shouldShow","hasMatches","notFoundVisible","loadingIsVisible","getCurrentDisplayValue","clearValue","createEvent","initCustomEvent","dispatchEvent","fetchResults","handleAsyncResults","fetchesInProgress","onResultsRetrieved","term","handleResults","itemExpr","isList","isPromise","isPolite","types","politeness","getCountMessage","announce","hgt","clientHeight","scrollTo","isPromiseFetching","textLength","selectItemOnMatch","isMatching","itemParts","listEnter","listLeave","mouseUp","inject","$MD_THEME_CSS","breadcrumbsService","registerListenerOnce","tag","deregisterListenerFn","$registeredListeners","isAOlderThanB","scopeA","scopeB","parseStateRef","ref","state","paramExpr","getExpression","interpolationFunction","expressions","part","exp","deregisterWatchers","labelWatcherArray","deregisterWatch","registerWatchers","viewScope","ncyBreadcrumbLabel","$Breadcrumb","BreadCrumb","$state","sitemapService","$lastViewScope","targetScope","ncyBreadcrumbIgnore","$$parentMenu","menuChain","getSiteMapNodes","stateParams","$$addStateInChain","chain","stateRef","nodeModel","conf","parentParams","force","skip","isCopy","l","ncyBreadcrumb","$$options","includeAbstract","_ncyBreadcrumbLabel","ncyBreadcrumbLink","href","ncyBreadcrumbStateRef","$$breadcrumbParentMenu","getTemplateLast","templateLastUrl","templateLast","getTemplateLastUrl","getStatesChain","_chain","$current","prefixStateName","getLastStep","$getLastViewScope","setOptions","BreadcrumbDirective","$breadcrumb","$$templates","bootstrap2","bootstrap3","labelWatchers","renderBreadcrumb","parseLabel","getMenu","getProjectSideMenu","menuItems","setMenu","BreadcrumbTextDirective","cElement","cAttrs","$attr","ncyBreadcrumbText","separator","ncyBreadcrumbTextSeparator","registerWatchersText","renderLabel","combinedLabels","ncyBreadcrumbChain","BreadcrumbLastDirective","ncyBreadcrumbLast","lastStep","YoutubePlayerEmbed","autoplay","paramsObject","paramsString","querys","MediaJustinLiveStreamPlayer","configure","channel","MediaJustinLiveStreamChatroom","twitchChatChannel","MediaFlashPlayerEmbed","isIEversion","detectIE","src","vars","ua","msie","trident","rv","dsWidgetClock","$interval","clock","gmtOffset","digitalFormat","showDigital","showAnalog","majorsTotal","onlyText","stopTime","o","showGmtInfo","themeClass","gmtInfo","digital","analog","majors","minors","tick","timeText","getGMTbase100","getGMTText","old","f","lpad","rpad","offsetNow","hrs","mins","secs","$stateProvider","decorator","$$permissionState","run","PermTransitionProperties","PermTransitionEvents","PermStateAuthorization","PermStatePermissionMap","$stateTransitionInterceptor","toState","toParams","fromState","fromParams","setTransitionProperties","setStateAuthorizationStatus","$$isAuthorizationFinished","isAuthorizationFinished","handleAuthorizedState","broadcastPermissionAcceptedEvent","transitionOptions","notify","location","go","broadcastStateChangeSuccessEvent","handleUnauthorizedState","rejectedPermission","statePermissionMap","broadcastPermissionDeniedEvent","resolveRedirectState","redirect","areEventsDefaultPrevented","broadcastPermissionStartEvent","transition","authorizeByPermissionMap","$delegate","PermTransitionEventNames","isStateChangePermissionStartDefaultPrevented","permissionStart","permissionAccepted","permissionDenies","PermPermissionMap","StatePermissionMap","toStateObject","toStatePath","areSetStatePermissions","permissionMap","permissions","extendPermissionMap","only","except","redirectTo","authorizeStatePermissionMap","authorizeByStateName","stateName","srefState","resolveExceptStatePermissionMap","exceptPromises","resolveStatePermissionMap","rejectedPermissions","resolveOnlyStatePermissionMap","onlyPromises","resolvedPermissions","privilegesNames","statePrivileges","resolvedStatePrivileges","resolvePropertyValidity","any","PermPermissionStrategies","enableElement","disableElement","showElement","hideElement","PermRoleStore","PermRole","defineRole","roleName","validationFunction","roleStore","defineManyRoles","roleMap","removeRoleDefinition","hasRoleDefinition","getRoleDefinition","getStore","clearStore","PermPermissionStore","PermPermission","definePermission","permissionName","permissionStore","defineManyPermissions","permissionNames","removePermissionDefinition","hasPermissionDefinition","getPermissionDefinition","Role","validateConstructor","annotateValidationFunction","wrapInPromise","preparePermissionEvaluation","permission","validatePermission","validateRole","validationLocals","transitionProperties","validationResult","invoke","Permission","PermissionDirective","sref","onAuthorized","onUnauthorized","isSrefStateDefined","onAuthorizedAccess","onUnauthorizedAccess","PermAuthorization","counter","PermissionMap","normalizeMapProperty","resolveFunctionRedirect","redirectFunction","rejectedPermissionName","redirectState","resolveObjectRedirect","redirectObject","ReferenceError","property","privilegeName","role","authorizePermissionMap","resolveExceptPrivilegeMap","resolveOnlyPermissionMap","resolveAllPermissionMap","allPromises","sunnetPicture","layoutPaths","ext","images","sunnet","serverResource","serverSetting","isNeedContextPath","baseURL","SSLType","serverDomain","SSLPort","contextPath","baseConfig","serverAddress","profilePicture","profile","makePicture","make","course","utilsService","Restangular","_utilsService","findMyGroupMembers","customGETLIST","findMyDescendentMembers","getMembersByFilter","getTipInfo","typeId","getExternalCourses","getExternalCourseSessions","courseId","ngTableColumnValueService","htmlReferences","values","htmlCertReferences","htmlExtCertReferences","htmlTextValue","interpolatedValue","interpolateExpr","momentUtils","DateRange","_byString","interval","hollaback","exclusive","contains","_byRange","div","INTERVALS","constructor","overlaps","intersect","toArray","by","acc","center","ctlService","_CtlService","getManagerGroups","getManagerMembers","getCatalogCourseSearch","getCompanys","getCompanySubjects","getAllCurrency","getInnercertClasses","getInnercerts","getExtcertApplyClasses","getCompensationTestItem","getManageGroups","getManageMembers","getClassifications","classTimeUtils","getRepeatRanges","startDateTime","endDateTime","classTime","dateRanges","_dateRanges","repeatIntervalUnit","buildRepeatRanges","_dateRange","sd","ed","nextIndex","repeatRanges","dateRange","repeatIntervalNumber","getDateTimeRangesByClassTime","dateTimeRanges","startH","startM","endH","endM","isEnableRepeat","includeDays","getClassTimesFormatted","_classTime","isEnableRestTime","rdt1","rest_startH","rest_startM","rdt2","rest_endH","rest_endM","dt","mergeClassTimes","classTimePools","classTimeFormatted","currentClassTimes","currentClassTime","urlIncludesServerPath","suffixes","symbol","stringToNumber","stringSplitToValue","replaceAll","regExp","numberToMonth","monthNumber","monthNames","numberFormat","newNumber","nameRegular","markSplit","mark","htmlEscapedDecode","entities","entitie","hexConvertRgba","colors","opacity","getRgba","hex","r","g","b","newColors","getArrayObjectByKey","durationFormat","duration","asMilliseconds","dateTimeFormat","dateMark","costFormat","cost","arrayToString","dataType","viewCtmsReference","packageId","itemSection","fileName","open","tipInfo","tipType","escapeToClose","displayName","metadata","tipInfos","close","fullscreen","onFinishNgRepeat","externalReferenceServlet","externalId","emptyIframe","content","iframeResize","iframe","classTimeHandle","editorId","checkCurrentClassTime","currentDateTimePull","checkClassTime","vaildObj","dateTime","_dateTime","_startDateTime","_endDateTime","currentDateTime","_checkStartDate","_checkEndDate","conflict","localeDate","_weekdays","repeatIntervalNumbers","repeatIntervalUnits","includeDaysToggle","submit","_checkClassTime","updateEndDateModel","beginningTime","bindCompiledHtml","bindCompiledHtmlController","compileHtml","compiledElements","avatar","avatarUrl","firstName","lineHeight","fontSize","getRandom","uploadRefs","refs","maxCount","isMultiple","fileLength","refsObject","files","_files","fileIndex","replaceFile","selectFile","addFileSelect","removeFileSelect","uploadCourseDataFiles","squareText","showCourseSessionName","sessionId","courseResourceService","getCourse","getCourseSession","session","selectExternalTrainingVendors","isReload","externalTrainingService","getVendors","vendors","vendorType","searchTerm","clearSearchTerm","selectExternalClass","applicantId","selectClass","choiceCourseId","totalStep","choiceSessionId","canExitStep1","isCanNext","canExitStep2","nextStep","updateCurrentStep","previousStep","finishStep","updateModel","selectCurrency","currencys","ngChange","selectCtl","ctlData","defaultSelectFirst","getCtlData","isStatic","datas","selectClassification","classifications","multiDatePickerCtrl","ngRequired","prepareDateModel","multiCheckbox","titleKey","valueKey","memberSelection","displayIcon","buttonType","isMini","ignoreSelf","ngOnChanges","openMemberSelection","$auth","refreshDebounce","lastSearch","pendingSearch","cancelSearch","debounceSearch","getDirectMembers","members","showMembers","member","selectMembers","isDirectMembers","learningType","cachedQuery","selectPersonModel1","querySearch","criteria","delayedQuerySearch","optionsToggle","memberIsChecked","mdSelectTime","formTime","toTime","isArrayIndex","resetSelect","h_exists","checkTime","m_exists","learningReportSetting","settingRule","classTimeObjects","isCreateForm","updateReportSettingDeadLine","isHasDefaultSetting","isNeedReport","isCanEditSetting","minStartDate","maxEndDate","classTimeObject","docReportDeadLine","defaultSetting","docReportMonth","docReportDay","oralReportDeadLine","oralReportMonth","oralReportDay","teachingDeadLine","teachingMonth","teachingDay","watchClassTimeObjects","ngModelDataInit","isNeedDocReport","numOfDocReport","isNeedOralReport","isOralReportNeedGrade","isNeedTeaching","isTeachingNeedGrade","isNeedOther","otherReportWay","isFormOwner","isManagerCanEditSetting","isManager","isLearningAdmin","enrollCosts","form","defaultDisableField","renderCost","_ngModel","costObject","course_cost_currency","defaultCostCurrency","course_cost_amount","course_converting_amount","subsidyType","subsidyPercentage","voucherType","apply_type","payee","remit_title","remit_branch","remit_account","check_title","check_expired_date","check_format1","check_format2","exchangeRate","isCanRenderHtml","getCurrencys","currency","isBasic","currencyId","classTimeDesc","classTimeStr","choiceExternalCourses","displayType","prepareTable","tableCols","prepareTableCols","table","cols","getValue","htmlChoiceValue","choiceExternalCourseSessions","userService","fileProcess","_UserService","getKernelUser","getUserData","getUserProfile","customGET","getUserProfileDetail","getUserProfileDetailById","getUserProfileById","uploadUserAvatar","baseApiPath","fileUpload","changePassword","formData","customPUT","updatePreferLang","testQuestionnaireCenterService","_TestQuestionnaireCenterService","myLearningRecordsService","$httpParamSerializer","_MyLearningRecordsService","getMyTrainingRecords","getSuggestLearningList","updateSuggestLearningList","content-type","deleteSuggestLearningList","customOperation","addSuggestLearningList","customPOST","addViewItems","Content-Type","deleteSuggestLearningTemp","customDELETE","getSuggestLearningTemp","viewItems","incompleteCoursesService","_IncompleteCoursesService","deputyService","_DeputyService","getDeputyRecords","deleteDeputyRecords","getAgents","insertAgent","updateAgent","agentWorkId","getMyManagedGroups","userDetail","isCertificate","userProfile","updateEstimatedCompletionDate","enrollmentIdList","permissionType","ceIds","itemTypes","canUpdate","enrollmentId","itemType","managerService","predictDate","updateMemberSuggestLearningList","suggestLearningSearchDialog","hasTrainingPlanPermission","hasTrainingRoadMapPermission","hasCompetencePermission","hasKnowLedgePermission","hasIdpForCpasPermission","hasApprovalPermission","yearCount","monthCount","managerGroups","groupId","managerMembers","memberId","lmYearBegin","lmMonthBegin","lmYearEnd","lmMonthEnd","sourceType","searchStatus","deputyRecordDialog","agentFullName","agentName","deputyFrom","deputyTo","deputyFromHH","deputyFromMM","deputyToHH","deputyToMM","deputyGroupId","agentId","agentTable","agents","managedGroups","getAgentFullName","canDeletefromType","canDeleteUnenroll","canDeletefromTypeMessage","canDeleteUnenrollMessage","canDelete","sourceInfos","fromType","deleteMemberSuggestLearningList","chooseFormData","chooseList","otherDescription","selectAll","courseSelectAll","tempItemsTable","suggestLearningList","getMemberSuggestLearningTemp","itemId","itemTypeName","checkValue","deleteTemp","deleteMemberSuggestLearningTemp","chooseItemPage","wzBtn","addSuggestLearning","predictDueDate","otherName","addMemberSuggestLearningList","addOther","updateIndex","clearOther","removeOther","getOther","addItemPage","UserController","userDashboardService","includes","userData","userProfiles","getUserToDo","userToDoData","userToDo","getOnlineUserNumber","copyright","getProject","TrainingRecordsSearchDialogController","hasCurriculumPermission","hasCertificationInnerPermission","cpType","passResult","learnerType","userTrainingRecords","myTrainingRecordsTable","isProgram","records","summary","configuration","isShowCredit","credits_index","isClear","htmlCourseType","htmlHistoryCourseTime","htmlHours","htmlProperties","htmlEnrollmentStatus","htmlPassStatus","iframeWindow","formDetailUrl","showPrompt","mySetting","$translate","amMoment","expandProfileDetail","personal","kernelUser","userDetailData","userProfilesDetail","rc","uploader","onAfterAddingFile","upload","clearQueue","onErrorItem","onCompleteAll","deputyRecordsTable","idList","checkboxSelect","passwords","oriPassword","oldPwd","newPassword","newPwd","_rc","use","changeLocale","myCurriculum","htmlActivityName","htmlSourceInfos","defaultFilters","suggestLearningTable","PredictDueDate","userInfo","activityName","myCalendar","calendarService","bigCalendarProcess","calendars","bigCalendars","actions","openPlaceMap","placeMap",2,3,5,"courseType","dateStr","calendarView","minDateEvents","bigCalendarEvents","tomorrowDate","isCanShowTomorrowEvents","updateViewDate","getCalendarEvents","getCalendarWithOneBeforeAndAfter","eventDate","isExpired","baseDate","minCalendarProcess","linkToCourseSessionPage","getEnrollment","enrollment","placeMapUrl","tomorrowEvents","incompleteTestSurveys","defaultCourseType","defaultOrder","hasCourseOnlinetestPermission","hasCourseClassroomtestPermission","hasCourseSurveyPermission","defaultFilterType","defaultFilterValue","dataFilter","filterType","incompleteCoursesDatas","courseCount","incompleteCourses","defaultProgramType","hasCourseOnlinePermission","hasCourseClassroomPermission","hasCourseExternalPermission","trainingRoadMapService","_TrainingRoadMapService","getTrainingRoadMapList","getTrainingRoadMapInfo","trId","trainingRoadMap","$location","$anchorScroll","trainingRoadMapList","trainingRoadMapId","trainingRoadmapId","withUserStatus","trainingRoadMapInfo","trainingRoadmapInfo","userCurrentCondition","titleGroups","activitiesNestList","clickZone","selectZone","hash","trainingPlan","SystemController","defaultMgrUrl","getServerPath","systemInfo","localStorageService","systemInfos","lsKeys","staticPage","decodeURIComponent","AuthStorage","$ocLazyLoad","menuProcess","_menuItems","_menuItem","parseMenuPermission","_children","isMenu","permissionsAll","permissionOption","enabledValidateAll","siteMapNodesMapToMenu","treeModel","projectId","_projectId","_sitemapService","_SitemapLoginService","currentPanelType","menuItem","getNodeTree","getProjectId","pid","fromJson","loginSitemapRequired","loginSitemapPreviewRequired","setSitemapColor","panelType","appendTo","setMaterialColor","getSiteMapColor","load","setSiteMap","siteMapData","project","logoUrl","broswerTitle","bannerRotateSpeed","Context","primaryColor","accentColor","dangerColor","toJson","sidebar","navigationService","isMenuPrepared","scrollBarConfig","updateScrollbar","checkMenu","isActive","routerHelper","modulesRouteConfig","mailLinkRouteConfig","configureStates","absUrl","protocol","host","port","ssoParams","defaultQueryParams","stateChangeStart","to","_redirct","authConfig","enabledSSOQueryParams","isNeedReValidation","SSOQueryParamsKey","param","stateHelperProvider","fixStateName","addSiblings","childState","nextSibling","previousSibling","keepOriginalNames","siblingTraversal","setNestedState","routerHelperProvider","$locationProvider","$urlRouterProvider","RouterHelper","states","otherwisePath","queryParams","stateQueryParams","hasOtherwise","otherwise","getStates","squash","processMenu","processMenuId","process","abstract","mid","loginRequired","loadPlugin","activityType","activityId","cid","catalogId","nodeId","nid","tabSelect","backState","_backState","backStateParams","backStateObject","defaultParams","programId","formType","programEnrollmentId","bulletinId","skipIfLoggedIn","$cookies","companyName","siteMapContext","relationId","surveyId","reportsService","_reportsService","menuNodes","ReportsMenuController","menu","learningReports","lastIndexOf","learningReportsMenu","previousMenu","mainMenu","_ManagerService","getMemberTrainingRecords","getUnAssignableMmembers","UnAssignable","getMemberCurriculum","getMemberCurriculumDetail","getMemberDownloadDetail","getMemberLearningHistory","getCourses","getMembersByFilters","getMemberSuggestLearningList","AssignablePrecheck","Assignable","AssignableExternalCourse","getTestHistory","getExamResult","getExamQuestionsReview","getReportProcess","MemberTrainingRecordsSearchDialogController","groupMembers","initializing","uid","MemberDownloadDetailDialogController","downloadDetails","courseName","sessionName","memberCurriculumSearchDialogController","isQueryAllDate","isListAll","sDate","eDate","selectItem","corsesTable","courses","activity","courseNameList","courseIdList","sCompareDate","eCompareDate","isAdm","MemberCurriculumDetailDialogController","courseSession","enrollmentType","curriculumDetails","memberSuggestLearningList","firstInto","dataLength","memberFinancialCertRecordSearch","memberCurriculum","memberCurriculumTable","curriculm","groupIdList","memberCurriculumDetailDialog","memberDownloadDetailDialog","memberCertRecordsSearch","certZoneService","certTable","isExtCert","certType","getMemberCertRecords","certData","hasCertificationExtPermission","validDateType","companyId","subjectId","certClassId","certId","accessBegin","accessEnd","managerTrainingRecords","managerTrainingPlan","embaMustRead","embaCalendar","mailLinkProcess","CourseObject","linkType","getCourseEnrollment","courseEnrollment","COURSETYPE_ONLINE_TEST","COURSETYPE_CLASSROOM_TEST","COURSETYPE_SURVEY","knowledgeManagementCenterService","_knowledgeManagementCenterService","folderId","getList","limit_level","newDocuments","hotDocuments","setScore","docId","score","scoreInfo","SetScoreController","average","scoreInfos","userScore","readOnly","averageShow","knowledgeDocument","isShowIndex","KnowledgeManagementCenterDatas","menulist","learningResourceBreadcrumb","learningResourceTitle","newDocumentsDatas","hotDocumentsDatas","EMBAUrl","isCWSubCh","isEMBA","lastMenulist","knowledgeDocumentMenu","local","$translateProvider","translations","FILE_SIZE_ERROR","LANGUAGE","LANGUAGE_EN","LANGUAGE_TW","LANGUAGE_CN","LEARNING_DASHBOARD","INCOMPLETE_COURSES","ENROLLMENT","TEST_QUESTIONNAIRE_CENTER","APPROVE_RECORDS","TRAINING_RECORDS","COMMUNITY_DISCUSSION_ZONE","PUBLIC_DISCUSSION_ZONE","CLASSES_DISCUSSION_ZONE","INDEX","MY_CURRICULUM","KNOWLEDGE_MANAGEMENT_CENTER","REPORTS_ZONE","LEARNING_REPORTS","SUPERVISOR_ZONE","DEPARTMENT_DASHBOARD","TRAINING_APPROVE","TRAINING_APPROVE_RECORDS_SEARCH","MEMBER_CURRICULUM","MEMBER_TRAINING_RECORDS","LEARNING_PASSPORT","MY_CALENDAR","MY_SETTING","COURSE_LEARNING_RESOURCE","EXTERNAL_TRAINING_ZONE","EXTERNAL_TRAINING_APPLY","EXTERNAL_TRAINING_APPLY_FORM","EDIT_EXTERNAL_TRAINING_APPLY_FORM","VIEW_EXTERNAL_TRAINING_APPLY_FORM","EXTERNAL_TRAINING_BULLETIN","EXTERNAL_TRAINING_APPLY_RECORDS","COURSES_INFO","PROGRAM_INFO","CERTIFICATE_INFO","PROGRAM_INFO_DETAIL","PREREQUISITE_ITEMS","COURSE_CONTAIN","GET_THE_PROCESS","EXTEND_THE_PROCESS","CERTIFICATE_INFO_DETAIL","LEARNING_IS_TO_WALK_IN_THE_RIGHT_DIRECTION","LEARNING_IS_TO_BREAK_THROUGH_THEIR_OWN","MEMBER_SUGGEST_LEARNING_LIST","SUGGEST_LEARNING_LIST","TRAINING_ROAD_MAP","NEED_GET_PREREQUISITE_ITEMS","TRAINING_PLAN","CERT_ZONE","EXTERNAL_CERT_REGISTER","EXTERNAL_CERT_EXAM_APPLICATION","EXTERNAL_CERT_EXAM_ALLOWANCE_APPLICATION","EXTERNAL_CERT_QUALIFY_REWARD_APPLICATION","EXTERNAL_CERT_APPLICATION_RECORDS_SEARCH","CERT_RECORDS_SEARCH","TRAINING_PROGRAM_PLANNING","YOU_MUST_FIRST_OBTAIN_A_CERTIFIED_SUBJECT","NEWLY_OBTAIN_THIS_CERTIFIED_SUBJECT_CONDITION","EXPIRED_AFTER_REACQUISITION_OF_THIS_CERTIFIED_SUBJECT_CONDITION","SATISFY_OF_ANY_CONDITION_TO_OBTAIN_A_CERTIFICATE","FINANCIAL_CERT_RECORD_APPLICATION","FINANCIAL_CERT_RECORD_SEARCH","MEMBER_FINANCIAL_CERT_RECORD_SEARCH","MEMBER_CERT_RECORDS_SEARCH","COMPETENCY_ZONE","COMPETENCY_EVALUATION_SUPERVISOR_REPORT","DEPARTMENT_DROP_ANALYSIS","MEMBER_DROP_ANALYSIS","COMPANY_COMPETENCY_DEFINITION","CORE_COMPETENCY","MANAGE_COMPETENCY","PROFESSION_COMPETENCY","PERSONAL_EVALUATION_LIST","COMPETENCY_EVALUATION_PERSONAL_REPORT","PERSONAL_DROP_ANALYSIS","PLACEHOLDERS","PLEASE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD","SEARCH_COURSE_RESOURCE","YOU_CAN_SEND_A_MESSAGE_TO_THE_STUDENT_WHO_HAS_BEEN_DESIGNATED_TO_CANCEL_THE_REGISTRATION","YOU_CAN_SEND_A_MESSAGE_TO_THE_STUDENT_WHO_HAS_BEEN_DESIGNATED","CAN_CANCEL_THE_REGISTRATION_OF_STUDENTS","PLEASE_ENTER_THE_STUDENT_NAME","PLEASE_ENTER_THE_NUMBER_OF_DAYS","PLEASE_SELECT_DATE","QUESTION_FILLING","TOTAL_OF_QUESTIONS","THE_PAPER_WILL_BE_PUBLISHED","N_PERSON_LEARNING","N_PERSON_FINISH_COURSE","PLEASE_ENTER_YOUR_OLD_PASSWORD","PLEASE_ENTER_YOUR_NEW_PASSWORD","PLEASE_RECONFIRM_YOUR_NEW_PASSWORD","PLEASE_ENTER_TEXT","SELECT_VENDOR","ENTER_AMOUNT","NT_CONVERSION","REASON_OF_LEAVE","PLEASE_FILL_IN_INTERNAL_LECTURE_SCORE","PLEASE_FILL_IN_OTHER_METHOD_REPORT_SCORE","PLEASE_FILL_IN_ORAL_REPORT_SCORE","WEEK_W_OF_Y","PLEASE_SELECT_TRAINING_BLUEPRINT","FOR_LESS_THAN_N_THE_FOLLOWING_REPORTS_ARE_NOT_REQUIRED","PLEASE_SELECT_A_CATEGORY","SEARCH_FOR_A_VENDORS","PLEASE_ENTER_KEYWORDS","CONVERSION_AMOUNT","PLEASE_ENTER_DEPARTMENT_NAME","SYSTEM","FIELD","APPELLATION","TRACK_QUESTIONNAIRE","SURVEYBANK_GROUP_MATERIAL","TABLE_HEADER_INSTRUCTOR","VENUE","FACILITY","ATTENDANCE_RECORD","ATTENDANCE_RATE","ATTENDANCE_STATISTIC","TOTAL_ITEM","COMPLETE_ITEM","LEARNING_ITEM","LEARNING_HISTORY","DOCUMENT_TITLE","DOWNLOAD_TIME","COURSE_CONTENT","EXEMPTION_REASON","EVER_ENROLLED_COURSE","EVER_ENROLLED_CERTIFICATION","EVER_ENROLLED_INNER_CERTIFICATION","CERTIFICATION_NAME","PROFESSIONAL_KNOWLEDGE","TECHNICAL_OPERATION","WORK_ATTITUDE","COMMUNICATION","DEPUTY_DEPARTMENT","SETTING_DATE","DEPUTY","SETTING_DEPUTY","DEPUTY_EFFECTIVE_DATE","DEPUTY_END_DATE","MY_DEPUTY_SETTING","LIST_OF_UNEXPIRED_COURSE_TO_BE_EXPIRED","DEPARTMENT_MEMBERS_FOR_THE_YEAR","AVERAGE_TRAINING_HOURS","MONTHLY_ACCUMULATED_TRAINING_COSTS","COMPLETION_RATE_OF_DEPARTMENT_MEMBERS","ATTENDANCE_RATE_OF_DEPARTMENT_MEMBERS","CUMULATIVE_TRAINING_COSTS","COMPANY_AVERAGE","DEPARTMENT_EVERYONE_AVERAGE","SEARCH_THIS_AND_SUB_CATEGORIES","EXTERNAL_TRAINING_WEBSITE","TIME","LEAVE_TIME","SELECT_LEAVE_TIME","COURSE_NOT_ATTENDED_REASON","CLASS_HOUR","OTHER_METHOD","INTERNAL_LECTURE","SCORE_TO_BE_APPROVED","ORAL_REPORT","LECTURE_DEADLINE","SUBMIT_DEADLINE","REPORT_DEADLINE","NEED_TO_SUBMIT","UPLOAD_REPORT","NO_REPORT","NEED_TO_COMPLETE_REPORT","CURRENCY","AMOUNT","SYSTEM_CURRENCY","TYPE_OF_SUBSIDY","FULL","SUBSIDY","VOUCHER","TAXABLE_INVOICE","TAX_FREE_INVOICE","RECEIPT","PAYMENT_DATE","HIDDEN_COST_INFORMATION","ENROLLMENT_COST","COURSE_COST","COURSE_DETAIL","FREE_COURSE","PAY_COURSE","COURSE_DESCRIPTION","REMARK","CYCLE_MODE","REPEAT_INTERVAL","WEEK","MONTH","YEAR","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","SUNDAY","JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER","VENDOR","DOMESTIC","ABROAD","MULTIPLE_SELECT","JOIN_REASON","TEACH_DEADLINE","REST_TIME","SETTING_CYCLE_WEEK","TRAINING_NATURE","ASSIGNED_BY_MANAGER","PERSONAL_REQUESTS","TRUE","FALSE","UPLOAD_COURSE_DATA","ENROLLMENT_INFORMATION","ENROLLMENT_WEBSITE","NO_INFORMATION","TRAINING_HOURS_IN_THE_QUARTER","AVERAGE_TRAINING_HOURS_OF_COMPANY","TRAINING_BLUEPRINT_PROGRESS","INCOMPLETE_ITEM","INTERNAL_CERTIFICATION_PROGRESS","PERFORM_LATEST_NEWS","MY_LEARNING_RESUME","LOGIN_PLATFORM","LEARNING_COURSE","FILE_IN_ONLINE_QUESTIONNAIRE","FILE_IN_ONLINE_TEST","FILE_IN_QUESTIONNAIRE","FILE_IN_TEST","LEARNING_KNOWLEDGE_DOCUMENT_CENTER","VIEW_DOCUMENT_CENTER","FORUM_PUBLISHED_ARTICLE","ENROLLMENT_COURSE","CANCEL_COURSE","ONLINE_COURSE_LEARNING_TIME_CURVE","LEARNING_HOURS","SIX_MONTH","DISTRIBUTION_MAP_OF_COURSES_IN_EACH_CATEGORY","TOTAL_OF_ONLINE_COURSE_LEARNING_HOURS","CUMULATIVE_OF_PASSED_COURSES","TOTAL_OF_CERTIFICATION","CUMULATIVE_OF_TRAINING_COSTS_FOR_THE_YEAR","PENDING_APPROVALS","APPROVE_PROCESS","APPROVE_DETAIL","APPROVE_RECORD","APPLY_COSTS","STUDENT_TRAINING_COSTS_HAVE_OCCURRED","DEPARTMENT_TRAINING_COSTS_HAVE_OCCURRED","KEYWORD","DEPARTMENT_NAME","DEPARTMENT_MEMBER","DEPARTMENT_MEMBERS","LEARNING_ACTIVITY","LEARNING_ACTIVITY_STATUS","SEARCH_COURSE_NAME","SELECT_SEARCH_FILTER","PLEASE_RATING","START_DATE","END_DATE","COURSE_START_DATE","AUTHOR","LOCATION","ROOT_DIRECTORY","CLICK_COUNT","DOWNLOAD_COUNT","DOWNLOAD_COUNT_DETAIL","I_WANT","AVERAGE_RATING","SHARE_DATE","HOT_DOCUMENT","TITLE","TYPE","APPLICANT","APPLICANT_DEPARTMENT","APPLY_DATE","ARRIVAL_DATE","APPLY_START_DATE","APPLY_END_DATE","APPROVER","LEARNING_CATEGORY","ENROLLMENT_TIME","COURSE_DATE","HOURS","TIME_OF_HOURS","HOUR","ENROLLMENT_HOURS","PASS_STATUS","COST","TEST_SCORE","LEARNING_REPORT","ENROLLMENT_NUMBER_OF_PEOPLE","DOWNLOAD_NUMBER_OF_PEOPLE","INCOMPLETED_NUMBER_OF_PEOPLE","EXEMPTION_NUMBER_OF_PEOPLE","APPLY_FOR_EXEMPTION","PASSED_NUMBER_OF_PEOPLE","FAILED_NUMBER_OF_PEOPLE","DROP_NUMBER_OF_PEOPLE","LEARNER_SATISFACTION","MANAGER_SATISFACTION","PASSED_COUNT","EXEMPTION_COUNT","TOTAL","ENROLLMENT_STATUS","CURRENT_PROCESS","CHANGE_PASSWORD","TEST_QUESTIONNAIRE","ALL_COURSE","LATEST_COURSE","HOT_COURSE","FEATURED_COURSE","LATEST_NEWS","ONLINE_COURSE_LEADERBOARD","LATEST_DOCUMENT","RELATED_SITES","USERNAME","USER_ACCOUNT","ACCOUNT","NAME","LAST_NAME","PASSWORD","ACTION","ALL","ORDER","PASSED_DATE","SPECIFIC","PROGRAM","COURSE","ONLINE_COURSE","CLASS_ROOM_COURSE","EXTERNAL_TRAINING","INTERNAL_TRAINING","INTERNAL","EXTERNAL","ONLINE_TEST","CLASS_ROOM_TEST","TEST","QUESTIONNAIRE","INTERNAL_LICENSE","EXTERNAL_LICENSE","MY_FAVOURITE","ABOUT_THIS_COURSE","ABOUT_THIS_PROGRAM","ABOUT_THIS_CERTIFICATE","TOTAL_NUMBER_OF_CLASSES","COURSE_NAME","PROGRAM_NAME","COURSE_INFO_DETAIL","COURSE_INFO","SESSION","SESSION_NAME","SESSION_INFO","CLASS_TIME","ENROLL_DEADLINE","TEST_DEADLINE","VIEW_DEADLINE","FILL_IN_DEADLINE","LAST_PLAYER","ENROLLMENT_INFO","REFERENCE_DOCUMENT","REFERENCE_COURSE","COURSE_TYPE","INSTRUCTOR","EVENT_LOCATION","NUMBER_OF_PEOPLE","ENROLL_NUMBER_OF_PEOPLE","ENROLL_TYPE","REMAINING_AMOUNT","NO_UPPER_LIMIT","PENDING_PREDETERMINED_COST","COURSE_ATTRIBUTES","COURSE_INTRODUCTION","PROGRAM_INTRODUCTION","COURSE_OUTLINE","LEARNING_GOAL","UNDERSTANDING","THROUGH_THE_RULES","APPLY_STATUS","SUITABLE_FOR_THE_OBJECT","SUITABLE_FOR_LEVEL","PREPARATORY_KNOWLEDGE","DIFFICULTY","DURATION","PROPERTIES","COURSE_ELECTIVE","COURSE_REQUIRED","IS_WILL_EXPIRE","LAST_LEARNING_DATE","OVERALL_RESULT","ENROLL_MANAGER","ASSIGNABLE_MEMBER_ENROLL","ASSIGNABLE_MEMBER_ALTERNATE","UN_ASSIGNABLE_MEMBER_ENROLL","ASSIGNABLE_STATUS","ASSIGNER","CLASSMATE","FORUM","DESCRIPTION","CREATE_DATE","DATE","BASIC_INFORMATION","OTHER","NOTHING","FULL_NAME","EMPLOYEE_NUMBER","DEPARTMENT","JOB_TITLE","EMAIL","OFFICE_PHONE","ADD_DATE","TOTAL_ENROLLMENT_COUNT","REASON","DUTY_DAY","GRADE_NAME","DUTY_CODE","ADD_LEARNER","COURSE_DEADLINE","DIRECTLY_SPECIFY_DEADLINES","UNLIMITED","LEARNING_CENTER","COURSE_LIST","LEARNING_RESULT","MINIMUM_VIEWING_TIME","VIEWING_TIME","COURSE_TIME","FINISH_TIME","SELECTED","FILES","LIST_ALL_SUBORDINATE_MEMBERS","LIST_MY_GROUP_MEMBERS","YOU_HAVE_SELECTED_MEMBERS","EXECUTION_DATE","DAYS","AFTER_THE_SUCCESSFUL_REGISTRATION","YOU_CAN_SET_A_DURATION_FOR_THE_TRAINEES","STATUS","REPORT","SUBMIT_REPORT","SUBMIT_REPORT_DEADLINE","SUBMITTED_REPORT","UPLOADED_REPORT_LIST","SHOULD_BE_SUBMIT_REPORT","HAS_BEEN_PAID","SERIAL_NUMBER","FILE_NAME","SCORE","POINT","NOT_YET_RATED","GRADE_QUESTIONS","WRONG_QUESTIONS","DATE_OF_PAYMENT","APPROVE_STATUS","COURSE_TITLE","QUESTION_ANALYSIS","LECTURER_RATING_REQUIRED","INTRODUCTION","INSTRUCTOR_NAME","INSTRUCTOR_PROPERTIES","INSTRUCTOR_COMPANY","COMPANY","EDUCATION","EXPERIENCE","CERTIFICATION","EXPERTISE","INSTRUCTOR_PHOTO","INSTRUCTOR_DETAIL","BIRTHDAY","INDUCTION_DATE","ADDRESS","MOBILE_PHONE","HOME_PHONE","MY_PREFERENCE","COURSE_FOLDER_PRESURVEY","COURSE_FOLDER_PRETEST","COURSE_FOLDER_CONTENT","COURSE_FOLDER_POSTSURVEY","COURSE_FOLDER_POSTTEST","COURSE_FOLDER_REFERENCE","COURSE_FOLDER_TEST","COURSE_FOLDER_SURVEY","COURSE_FOLDER","VIEW_FILES","TIME_LEFT","QUESTION_ANSWERED","QUESTION_NOT_ANSWERED","QUESTION_REQUIRED","TEST_TIME","CAN_TEST_NUMBER_OF_TIMES","LAST_TEST_NUMBER_OF_TIMES","NUMBER_OF_TIMES","TO_THE_HIGHEST_SCORE","SELECT_THE_HIGHEST_SCORE_ONCE","STAY_TUNED","RELATED_LINKS","COURSE_LINKS","SUMMARY","VIEW_MY_ANSWERED","PASSING","PROPORTION_OF_PERSONNEL","EXPIRED_ITEMS","LEARNER_DURATION_OF_STUDY","SESSION_CLASS_DEADLINE","DETAILS","CREDITS","TOTAL_CREDITS","PERSONAL_SETTING","PART","ALL_DEPARTMENT","NUMBER_OF","PER_PAGE","BUSINESS_LEAVE","PERSONAL_LEAVE","SICK_LEAVE","TRACKING_OBJECT","TRACKING_DEPARTMENT","TRACKING_PERIOD","SIZE","EXPIRED","UNEXPIRED","A_MONTH","ALL_STAFF","ANY_TIME_ZONE","RELATED_TO_ME","MY_TRAINING","THERE_IS_NO_DATA","PLEASE_AT","SET_THE_CONDITIONS_CONDUCIVE_TO_SEARCH","EVALUATION_STAFF","OTHER_NEED","ADD_ITEM_FORM_STUDY_CATALOG","SPECIFY_APPLICANT","TRAINING_BLUEPRINT","COMPETENCE_RECOMMEND","SELF_DEMANDING","MANAGER_RECOMMEND","ABILITY_RECOMMEND","PERSONAL_DEVELOPMENT","SCORE_PASSING","SCORE_FAILED","LEARNING_STATUS","SOURCE","ESTIMATED_COMPLETION_DATE","ENROLLMENT_DATE","SEARCH_DEPUTY","WATCH_REPORT","CERTIFICATE_NAME","FILL_IN_END_DATE","ANNOUNCEMENT_TIME","DUTY","INDUCTION","YOU_HAVE_ADD_OTHER_REQUIREMENTS","YOU_HAVE_SELECTED_COURSES","VIEW_ITEM","THOUSAND","ENCRYPTION","COURSE_CODE","MINUTE","CLASSIFICATION","RELATED_CERTIFICATE","CERTIFICATE_RECOGNIZED_HOURS","CERTIFICATE_TYPE","REWARD_METHOD","VALIDITY_PERIOD","CERTIFICATE_CODE","PROGRAM_CODE","TEST_CODE","TEST_TYPE","OTHERS","COUNSELOR_DETAIL","LEARNER_DETAIL","SPECIALTY_COURSE_CLASSIFICATION","SETTING_CLASS_TIME","TIME_ZONE","TIME_TABLE","LUNCH_TIME","CYCLE_TIME","INTERVAL","FULL_AMOUNT","CASH","REMITTANCE","CHEQUE","PAYEE","REMITTANCE_INFORMATION","THE_TITLE_OF_THE_COMPANY","BRANCHES","RECEIPT_INFORMATION","THE_TITLE_OF_THE_RECEIPT","RECEIPT_EXPIRE_DATE","RECEIPT_FORMAT","RECEIPT_DELINEATE","ENDORSEMENT_OR_TRANSFERENCE_PROHIBITED","APPLICATION_CONTENT","COURSE_DATA","FILL_IN_OTHER_METHOD","TEST_HISTORY_SEARCH","ANSWER_DATE","TOTAL_COUNT","AVERAGE_SATISFACTION","NUMBER_OF_COURSES_DUE_WITHIN_THIS_WEEK","CUMULATIVE_TRAINING_COSTS_FOR_THE_YEAR","WILL_BE_EXPIRED_COURSES","DOLLARS","THERE_IS_NO_ROADMAP_DATA","THERE_IS_NO_CERTIFICATE_DATA","TODAY_IS_NOT_ANY_SCHEDULE","REQUISITION_NUMBER","TRAINING_NAME","APPLY_THW_WAY","LEARN_TOTAL_TIME","PASS_NUMBER","FAILED_NUMBER","EXEMPTION_NUMBER","TEST_FRACTION","COMMUNITY","CERTIFICATE_INTRODUCTION","COUNSELOR","GENERAL_SESSION","EXTEND_SESSION","SEARCH_SCOPE","SEARCH_SCOPE_ALL","SEARCH_SCOPE_DEPARTMENT","NOTES","CONTACT_PERSON","CONTACT_PERSON_EMAIL","CONTACT_PERSON_PHONE","TOMORROW_TO_REMIND","TOMORROW_IS_NOT_ANY_SCHEDULE","TODAY","DAY","WEEK_OF_YEAR","ITEM","PROGRESS_OF_SUBMIT_REPORT","OCCUPY_WAIT_LIST","REMAIN_WAIT_LIST","DAYS_IN_DURATION","INCLUDE","REFERENCE_MATERIAL","SUBSIDY_COST","SELF_COST","LAST_EXTERNAL_TRAINING_HISTORY","EXTERNAL_TRAINING_APPLY_TIMES_PRE","EXTERNAL_TRAINING_APPLY_TIMES_POST","EXTERNAL_TRAINING_APPLY_COST","TAX_FREE","EXTERNAL_TRAINING_REPORT","EXTERNAL_TRAINING_NO_REPORT_NEED","UN_PAID","ORIGIN","TRAINING_MATERIAL","APPLICANT_INFORMATION","PAY_INFORMATION","VENDOR_RECEIVER_NAME","APPROVAL_PROCESS_RECORDS","EXTERNAL_TRAINING_APPLY_DETAIL","FILLER","COMPANY_DETAIL","DOCUMENT_REPORT","NOT_CREATED","COMPLETION_PERCENTAGE","RECENTLY_COMPLETED_THE_TRAINEES","THERE_IS_NO_SATISFACTION_DATA","FILL_IN_TIME","ORIGINAL_FACTORY_NAME","CERTIFIED_SUBJECT","APPLY_CATEGORY","CERTIFICATE_GET_DATE","CERTIFICATE_DEADLINE","NEW_APPLY","EXTENSION_APPLY","PERMANENT","CERTIFICATE_NUMBER","ONE","TWO","THREE","TEST_DATE","APPLY_REASON","TEST_PLAN","DETAIL_ADDRESS","TEST_COST","ACQUIRE_DATE","VALID_DATE","BONUS","CERT_TYPE","SUBJECT_TO_USER_GRADE","NEVER_EXPIRE","EXCERT_ADD_LICENSE_INFO","SELECT_START_END_DATE","VALID_DATE_START","VALID_DATE_END","APPLICABLE_UNITS","PERCENTAGE_OF_EXAMINATIONS","CONDITION_NUMBER","HAS_BEEN_CERTIFIED_SUBJECTS","PASS_THE_EXAM_PROJECT","EXCERT_RELATED_FORM","APPLY_DATE_START","APPLY_DATE_END","EXCERT_APPLY_TEST_DATE","EXCERT_UNAPPLIED_ITEMS","BONUS_COST","BONUS_APPLY_DATE","EXCERT_APPLY_TEST","TEST_ITEMS","EXCERT_REAL_COMPENSATION","COMPENSATION","EXCERT_REGISTER_APPLY","REGISTER_APPLY_DATE","APPLY_INFO","EXTERNAL_CERT_EXAM_BASE_INFO","CREATE_FROM","EXTERNAL_AUTO_CREATE","EXTERNAL_ADD_COURSE","ASSIGNED_COURSE_CLASS","THE_PAYMENT_N_LEARNING_REPORT","I_WANT_TO_ENROLL","PLAY_THE_COURSE","YOU_MAY_BE_INTERESTED_IN_THE_FOLLOWING_COURSES","AVERAGE_TRAINING_HOURS_IN_EACH_DEPARTMENT","EMPLOYEE_TRAINING_HOURS","AVERAGE_TRAINING_COSTS","CUMULATIVE_TRAINING_COSTS_IN_EACH_DEPARTMENT","EMPLOYEE_CUMULATIVE_TRAINING_COSTS","IN_EACH_DEPARTMENT","CLICK_THE_PATH_AND_EXPAND_THE_DATA","LICENSE","LEARNING_DETAIL_OF_THE_YEAR","TEACHING_HOURS","CERTIFICATE_LIST","IN","OUT","THERE_IS_NO_COURSE_DATA","THERE_IS_NO_COST_DATA","CURRENT_DEPARTMENT","LECTURER_TEACHING_DATA","LECTURER_TEACHING_SATISFACTION","CUMULATIVE_TEACHING_HOURS","LECTURER_TEACHING_INFORMATION","VAT_NUMBER","BANK_NAME","BANK_ACCOUNT","PHONE","FAX","CONTACT_PERSON_DATA","URL","DEPARTMENT_MEMBERS_OF_LEARNING_INFORMATION","NUMBER_OF_TEACHING_SESSIONS","DOLLARS_NT","ACTIONS","MESSAGE","FORM_VALIDATION","ERROR","SERVERS_ERROR","ACCOUNT_OR_PASSWORD_ERROR","ERROR_ORIGIN_INCONSISTENT","CODE","SIGN_IN_USER_TIMEOUT","ERROR_MSG_NOT_ADD_DEPUTY_DUE_TO_OVERLAP","SIGN_IN_USER_LIMIT","C_SIGN_IN_USER_DISABLED","SIGN_IN_USER_NOT_FOUND","NO_COURSES","CLICK_IMG_VIEW_FULL_SIZE","MISSION_INFO","homepageService","_homepageService","getBanners","getLatestPublishedCourses","getLatestNews","getLatestNewsDetail","newsId","getRecommendedCourses","getHotCourse","getWebsites","getComponent","relatedSites","subject","websites","onlineCourseLeaderBoard","hotCourse","latestNews","latestNewsMore","mode","getAllNews","latestnewsTable","getNews","news","toCourseInfo","titleUrl","latestCourse","getLatestCourses","latestCourses","selectedItemId","latestCoursesInfo","showLatestPublishedCourses","courseInfoPage","isCourse","knowledgeManagementCenter","documents","latestDocuments","getContent","showNumber","incompleteCourse","featuredCourse","customizeContent","customizeContentCount","leftComponents","rightComponents","components","titleEN","titleTW","titleCN","prjId","banners","sbannerSpeed","moreAction","linkAction","incompleteCoursesParams","isCanView","showStatus","recommendedCourses","forum","fileProcessService","_FileService","learningReportUpload","isReplace","baseApiFileProcessPath","learningReportUploadAction","actionType","learningReportSetScore","getLearningReportList","getLearningReport","getLearningReportStatus","applyOtherReportApproval","defaultFileProcess","FileUploader","Upload","FileProcessInit","alertMessage","_filters","_headers","webServiceSetting","defaultAuthHeader","defaultAuthToken","getToken","alert","fieldName","requestMethod","isAutoUpload","headers","alias","progress","autoUpload","removeAfterUpload","isHTML5","isUploading","queueLimit","withCredentials","fileFieldName","file","objectKey","arrayKey","fileProcessConfig","$provide","$translatePartialLoaderProvider","addPart","_UserDashboardService","getUserToDoNewCourse","getTrainingHours","getLearningGraph","getPlatformNews","getCoursePassCount","getOnlineCourseHours","getMyLearningHistoryItem","getInCompleteItems","getDistributionMap","getRoadmapProgress","getCertProgress","getCertSum","getAnnualExternalCost","getTrainingCost","getTrainingDetail","departmentDashboardService","_DepartmentDashboardService","getManagerGroup","getGroupTrainingHours","getGroupCost","getGroupMonthCost","getGroupIncompletedCourse","getGroupUserInfo","getGroupAttendance","getGroupCompletion","getGroupTrainingHoursDetail","getGroupUserTrainingHoursDetail","getGroupTrainingCostDetail","getGroupUserTrainingCostDetail","lecturerInfoDialog","lecturerId","instructorService","getTeachingRecord","lecturerInfo","lecturerPagination","learnerTotlaScore","classroomTotalHour","instructorInfo","teachingTimes","averageTrainingHoursDialog","drillId","chartColors","groupTrainingHours","drillFn","subGroupIds","groupTrainingHoursParams","categories","userNames","series","dataObject","isClick","userIds","parentGroupId","isShowGroupUserTrainingHoursDetail","userDrillFn","subGroupNames","groupUserTrainingHoursParams","hasSubGroups","averageTrainingCostDialog","getGroupTrainingCost","groupTrainingCost","groupTrainingCostParams","isShowGroupUserTrainingCostDetail","groupUserTrainingCostParams","yearAccumulatedTrainingCosts","distributionMaps","hasCertificationPermission","hasCoursePermission","pies","categoryName","sum","certCost","externalCost","internalCost","colorOpacity","d3","rgb","darker","trainingRoadMapProgress","roadmapProgress","totalBlock","blockBackground","isMaterialIcon","blockTitle","rateProgressBars","progressTitle","progresses","platformLatestNews","platformNews","onlineCourseCurve","learningGraphDatas","learningGraph","defaultFontFamily","lineChartConfig","chart","fontFamily","credits","responsive","exporting","tooltip","xAxis","lineChart","labels","yAxis","chartFinish","monthCumulativeTrainingCosts","trainingCosts","isGroupMonthCostNoData","learningResume","myLearningHistoryItems","learningDetail","chartConfig","fontWeight","tickInterval","isNoData","learningDashboard","dashboardData","toDoDataNewCourse","trainingHours","learningDashboardBlocks","reloadFn","viewType","positionTwo","isDisplay","calendarParams","getCalendar","dayfago","course-type","inCompleteItems","shownum","trainingCost","coursePassCount","onlineCourseHours","certProgress","learningGraphData","monthName","uppercaseMonthName","minuteofago","groupUserInfo","groupIncompletedCourse","userWillExpireCount","learningDashboardDialog","isMore","incompletedCourseCount","incompletedCourseMore","drillBarChart","chartId","isWatch","stackLabelsFormat","yAxisText","isThousand","getChart","drill","spacingRight","spacingLeft","marginTop","legend","align","verticalAlign","floating","reversed","plotOptions","pointWidth","PointPadding","stacking","cursor","point","click","highcharts","childDrill","addButton","setSize","setHeight","background-color","stackLabels","lineWidth","tickLength","minRange","toFixed","normalState","font-weight","stroke","fill","alignStyle","customButton","renderer","button","destroy","Highcharts","thousandsSep","distributionMap","distribution","departmentDashboard","selectedGroup","isDefault","managerGroup","selectGroup","groupCost","groupMonthCost","totalCost","zoomType","colorByPoint","_monthsShort","crosshair","getOptions","groupAttendance","groupCompletion","cumulativeTrainingCosts","classroomCourseSchedule","classroomCourseIncomplete","certificationProgress","averageTrainingHours","accumulationBlock","testQuestionnaireService","setGroupQuestionTranslate","_testQuestionnaireService","getExamInfo","getExamToken","getQuestions","getQuestionsMenu","getAssessment","putAjaxTestAnswerTime","ajax","examHistoryId","contentType","xhrFields","crossDomain","async","ClientAuthorization","Accept","done","putTestAnswerTime","assessment","putTestAnswer","putTestFinish","putEvaluationSurveyAnswer","answers","getQuestionModel","questionnaireData","questionModelInit","questionsData","questionModel","questionId","qId","studentResponse","optionNumber","optionOtherValue","otherAnswer","qType","selectOptionType","selectedOptionCount","questionType","surveyGroupId","surveyGroupName","instructor","instructorQuestions","raId","updateQuestionStatus","_newModelStatus","completedCount","getAnswers","questions","answersProcess","question","answersData","qResponse","answerInstructor","instructorQuestion","instructorAnswersData","ruId","ruResponse","finishedExam","feedbackStyle","sortNumber","q","groupQuestion","incomplete","unfilled","errorFilled","groupData","groupIndex","putQuestionStatusLog","JSON","stringify","Log","getInstructorDetail","instructorId","$cacheFactory","_service","setCacheData","getCache","getExtCourseFormByCourseSession","getExtCourseFormByBulletin","getExtCourseForm","getExtCourseApplyReasons","getCleanExtCourseForm","submitApplyForm","getExternalTrainingRecords","addVendor","externalTrainingBulletinService","_externalTrainingBulletinService","getBulletinsInfo","_CourseResourceService","getCourseId","setCourseId","getCourseResourceMenuNodes","categoryTreeId","getCourseResourceCatalogMenu","getCourseResource","getProgramEnrollment","getLearningResult","getProgram","getCourseEnrollSessions","getProgramEnrollSessions","getCourseContent","getProgramSession","getCourseSessionLearners","getProgramSessionLearners","getProgramSessionLearnersCompletionRate","getCourseSessionLearnersCompletionRate","getEnrollmentWillExpire","getCourseReference","getSessionEnrollReq","getSessionUnEnrollReq","getPassCourse","getPassExtCert","getPassIntCert","getLeaveInfo","setLeave","setExemption","setSessionUnEnroll","getSessionEnrollPreCheck","setSessionEnroll","setFavorite","route","getLearningHistory","getHotCourses","getFeaturedCourses","displayMinNumber","prefix_num","prefix","unAssignableMembers","_members","enroll","unAssignableMemberTable","users","setSelected","selectedMembers","unassign","enrollmentIds","resetWzBtn","canNext","hasSelected","testHistorySearchDialog","courseContent","testHistoryTable","itemid","exam","testHistory","testHistoryReload","searchPage","viewPage","examResultParams","examhistoryId","examResult","isFavorite","isMyFavorite","sessionEnrolledMembersDialog","sessionData","courseSessionLearnersTable","sessionLearnersData","sessionActionUnEnroll","unEnrollCourseSession","unenrollReason","isNeedApproval","isNeedBackPage","submitFn","unEnrollReq","unEnrollReqData","sessionActionLeave","leaveSession","formValidation","submitError","periodList","reasonIdList","leaves","startHH","startMM","endHH","endMM","leaveForm","leaveTable","leaveDatas","leaveData","hasLeaveRecord","selectAllLeave","sessionActionExemption","exemptionSession","exemption","exemptionType","exemptionId","loadPassedCertification","ext_cert","loadPassedInnerCertification","int_cert","loadPassedCourse","sessionActionEnroll","showEnrollDialog","enrollCourseSession","enrollReqData","isHasPreEnrollSurvey","save","feedbackType","isConfirmHasAlreadyCourse","detail","prerequisites","preItems","preItem","record","objectName","enrollReason","pageView","isStartFillIn","enrollReq","preEnrollSurveyItemId","reasonCheck","$setSubmitted","getTestInfo","examInfo","isOverMaxViewTimes","isNotAccessPeriod","isNotValidReTest","canPlay","isNotFitAttedDance","startExam","questionCurrentPage","questionsPagination","isFinished","statusCode","isForbidEnrollClassAfterPass","programDetailLessonsResultsDialog","learningResult","enrollmentData","reportProcessService","report","programDetailInfoDialog","isPublished","canView","programData","programName","optionsTpl","questionOptions","isOnlyReviewQuestion","isAllowViewScore","isAllowViewCorrectAns","onChange","isValueChange","blurFn","iconFaces","disabledOption","isDisable","checkSelectCount","learningReportListDialog","batchId","canEdit","learningReportListTable","iscourse","learningReport","Promise","learningReportItems","learningReportId","learningReportDialog","program","programIncludeCourse","learningReportTable","LearningReport.SubmitDate","learningHistory","learningHistoryService","attendanceRecords","attendanceRecord","learningHistoryItems","learningHistoryItem","instructorDetail","incompleteDynamicTemplate","incompleteTemplates","externalTrainingBulletinDetailedDialog","bulletinDetailed","externalTrainingApplyFormViewDialog","externalTrainingApplyFormPrintDialog","externalCompanyInsertDialog","isVendorsReload","vendorName","vendorNumber","bankName","bankAccount","classificationId","vendorAddress","vendorTel","vendorFax","contact","fullName","phone","mobilePhone","mail","introduction","vendorComment","receiverName","addContact","removeContact","submitted","VendorName","VendorNumber","VendorAddress","VendorTel","VendorFax","VendorURL","VendorComment","BankName","BankAccount","VendorIntroduction","ReceiverName","ClassificationId","contactCount","vendorId","evaluationSurveyPlayer","relationshipId","isCheckTime","playWindowController","checkPlayWindow","playerWindow","closed","checkTimer","playUrl","detailSessionListDialog","courseTypeTag","programType","isShowText","isShowClass","courseInfoSessionWillExpire","willExpireDatas","courseInfoReference","ngDialog","courseInfoPlayer","playItemId","playDisable","lastLeaningItem","courseDetailInfoDialog","courseData","referenceData","assignableMembers","isExternal","maxAssignableMembers","enrollType","isGray","assignableForm","assignable","executeDate","dueDateType","dueDays","dueDate","isForFree","enrollCost","payingDate","courseConvertingAmount","showMutiMembers","formVerified","value1","value2","assignableProcess","resultState","errorList","userName","arr_memberIds","memberIds","dueType","totalNum","maxEnrollment","TestQuestionnaireController","questionnaireType","$queueFactory","counttt","canExam","canViewResult","testSessionDuration","sessionTime","limitMins","evSurveyInfo","surveyName","targetName","paginationChanged","questionsChanged","questionPanelSelected","selectQuestionPanel","testAgain","timerFinished","pageTime","isFeedbackAllowViewResult","examResultPieChartData","scored","wrong","waitGradeQue","examResultPieChartLabels","examResultPieChartOptions","maintainAspectRatio","cutoutPercentage","questionValue","optionId","optionType","optionValue","onExit","onbeforeunload","onunload","InstructorDetailController","CourseResourceController","reloadParams","courseResourceDatas","courseResourceBreadcrumb","courseResourceTitle","CourseResourceMenuController","CourseReferenceController","referenceDatas","SessionObject","online","classroom","external","online_test","classroom_test","survey","evaluation_survey","innercert","COURSETYPE_ONLINE","COURSETYPE_CLASSROOM","COURSETYPE_EXTERNAL","PROGRAMTYPE_PROGRAM","PROGRAMTYPE_INNERCERT","EVALUATION_SURVEY","testQuestionnaire","loadView","buttonDisabled","buttonDisabledFn","testQuestionnaireRefersh","testQuestionnaireStatus","testQuestionnaireStart","startFn","testQuestionnaireResult","showInCorrect","openImage","imgUrl","examReviewQuestionsDatas","testQuestionnaireForm","isPageFooter","jumpQuestionFinishedExam","evaluationSurvey","statusType","programSessionInfo","isUser","goBack","getProgramData","courseSessionLearnersCompletionRateData","completionRateData","programInfo","menuList","breadcrumbLabel","programDetailLessonsResults","watchData","total_credits","lessonsResultsTable","watchEnrollmentData","programDetailLessonsList","programDetailInfo","programDetailEnrollment","programDetailEnrollmentLearningReport","LearningReportDatas","learningReportData","paid","learningReportFileReplace","appState","reportId","op","_learningReportUploadAction","fileParams","reportid","programDetailContainLessons","sessionType","containLessonsTable","passRule","passRuleSwitch","incompleteInfoListCardCtrl","doughnutOptions","responsiveAnimationDuration","incompleteInfoListCard","externalTrainingRecords","defaultFilter","scopeType","extId","trainingName","instructorName","defaultSorting","externalTrainingRecordsTable","showApproveStatus","workflowId","externalTrainingBulletin","bulletinApplyKnowHow","ExternalTrainingBulletinDatas","openDetailed","externalTrainingBulletinDetailed","basicCurrencyName","currencyName","h_organizationIds","organizationId","externalTrainingApply","toastr","CoreService","getFormInit","formProcess","extCourseForm","joinCourseId","joinCourseSessionId","fromBulletinId","fromBulletinDisableField","fromCourseSessionDisableField","createFromDisplay","defaultFormSetting","hasEnrollCreated","auto_create","applicants","applicantsInfo","applicantsStrArray","applicant","username","timeRule","applyReason","learningReportObject","applyForm","memberids","hasEnroll","otherApplyReason","h_organizationId","project_code","projectCode","trainType","refLink","reflink","note","enrollStart","enrollEnd","objective","prerequesite","audience","outline","backurl","isEditByManager","TimeSpanRefId","timeSpanRefId","category","classification","hasPreviousEnrollRecord","learningReportReason","oralReportReason","teachingReportReason","otherReportReason","materialSubmit","materialReason","reloadFormDataByCaches","updateEnrollCosts","createFormInit","needRequired","courseFiles","classInfo","parseClassTimeObjectsToFormData","classTimeObjectFormData","parseEnrollCosts","enrollCostsFormData","parseLearningReport","_courseFiles","isShowFileInfo","saveToCaches","enqueue","isShowReportLowerBound","submitRptRate","isCanEditForm","applyReasons","wizardForm1","wizardForm2","uploaderForm","resp","crsEnrollResult","refreshAccesstoken","externalTrainingApplyFormView","organizationDatas","applicantInfo","rcKey","detailSessionList","mdDialogClose","htmlSessionName","htmlSessionType","htmlInstructor","htmlCounselor","htmlPeople","htmlAction","htmlEnrollManager","enrollSessionsDataTable","enrollSessions","reloadTable","startLearning","detailSessionLearners","sessionLearnersTable","detailCompletionRate","isShow","courseSessionInfo","getCourseData","courseContentData","canAction","isBlock","courseSearch","chooseCourse","chooseMethod","selectCourse","addCourse","removeCourse","courseResourceCatalogList","isSearchMode","searchData","searchDataParams","hotCourses","featuredParams","featuredCourses","featuredCoursesPagination","courseLearningResourceMenu","courseLearningResourceInfo","courseResourceData","courseInfo","courseDetailRecommendLessons","yearAgo","miniGalleryResponsive","slidesToShow","slidesToScroll","recommendCourses","courseDetailPrerequisiteItems","courseDetailLearningResults","courseSessionId","learningHistoryData","$TreeTableConvert","_courseContentData","presurvey","pretest","posttest","postsurvey","reference","testClassroom","courseResult","courseContentTable","courseContentProperty","titleClass","cellClass","courseContentColDef","fieldGroup","courseResultProperty","courseResultColDef","courseDetailLearningContent","courseDetailInfo","courseDetailHeader","courseDetailEnrollment","courseDetailEnrollmentLearningReport","LearningReportStatus","learningReportStatus","_ExtCertService","_InnerCertService","getExtCertTestCompensateSearch","getExtCertBonusSearch","getExtCertApplyForm","resource","getExtCertApplyRecordSearch","getCertRecords","certificateForm","isReNew","passCheckApplyForm","rootFormId","formId","getExtCertInfo","parseTestTimes","testTimes","_testTimes","externalCertDetailInfoDialog","extCertInfo","prerequisiteItem","newApplyRuleItem","renewApplyRuleItem","extCertApplyFormViewDialog","extCertApplyFormTestEditDialog","testFeeCurrency","testFeeAmount","testFee","calculateTestFee","operation","$formValid","refFiles","extCertApplyFormRegisterEditDialog","acquireDate","expireDate","isForever","licenseId","comment","extCertApplyFormDialog","extCertApplyFormCompensationEditDialog","compFee","registerFormInfo","testFormInfo","compFeeCurrency","compFeeAmount","realCompFee","calculateCompFee","cardinalNumber","pow","compRatio","compensationCost","cardinalNumber2","extCertApplyFormCompensationDialog","extCertApplyFormBonusEditDialog","bonusType","bonusOtherWay","bonusCost","selectedValue","extCertApplyFormBonusDialog","financialCertRecordSearch","financialCertRecordApplication","externalCertRegister","refFile","companys","companySubject","showAllOption","subjects","canReNew","getCanReNew","registerData","externalCertQualifyRewardApplication","externalCertExamApplication","repeat","isDomestic","address","getExchangeRate","addTimeSelect","removeTimeSelect","checkTimeRepeat","testTime","times","externalCertExamAllowanceApplication","htmlUnappliedItems","externalCertApplicationRecordsSearch","htmlRelatedForms","beginDate","extCertApplyFormTestView","extCertApplyFormRegView","extCertApplyFormBonusView","formInfo","certRecordsSearch","certApplyformCompensationView","getCalendarByYearMonthDay","getCalendarByYearMonth","dateProcess","resObj","minCalendars","queueFinish","calendarEvents","watchQueueFinishChanged","approveService","_approveService","getFormsHandleByTodo","getFormsHandleByFinish","getEvetTypes","getFormsApplyBy","getFormsActionStatus","updateFormsActionStatus","formStatusDialog","approveType","ids","actionStatus","oralReportScore","teachingScore","innerTeachingScore","extraReportScore","approveRecordsSearchDialog","evetTypes","eventtype","applydate_from","applydate_end","applicant_keyword","userApproveRecords","userApproveRecordsTable","IssuedDate","managerApprove","selectApprove","approveTable","approve","selectApproveCheckbox","approvalId","openStatus","closeByDocument","trapFocus","managerApproveRecords","managerApproveRecordsTable","approveStatus","treeTableRun","treeTableConfig","hiddenClass","levelThreshold","startTimeAttr","countdownattr","finishCallback","autoStart","maxTimeUnit","secondsS","minutesS","hoursS","daysS","monthsS","yearsS","timeModel","resetTimeout","timeoutId","clearTimeout","calculateTimeUnits","timeUnits","i18nService","secondUnit","minuteUnit","hourUnit","dayUnit","monthUnit","yearUnit","sseconds","mminutes","hhours","ddays","mmonths","yyears","autostart","displayProgressActive","countdown","isRunning","resume","stop","stoppedTime","pause","addCDSeconds","extraSeconds","countdownSeconds","typeTimer","adjustment","setTimeout","timerElement","progressBar","uibPagination","paginationRun","DEFAULT_ContentLayoutTemplate","mdPickersRun","mdpIconsRegistry","svg","mdPickersConfig","$mdIconProvider","getFullUrlPath","hostname","pathname","camelCase","_","letter","parseQueryString","keyValue","joinUrl","baseUrl","joined","normalize","obj1","obj2","store","isStorageAvailable","supported","storageType","setItem","removeItem","getItem","AuthShared","storage","PermissionStore","RoleStore","Shared","tokenName","tokenPrefix","dataTokenName","initToken","getDataToken","clearPermissionStore","setPermissions","Permissions","setSystemModulesPermissions","SystemModulesPermissions","SystemModulesPermission","setRoles","Roles","_Role","setACL","base64Url","base64","ACLData","escape","atob","allData","UserData","getPayload","setToken","data_token","accessToken","access_token","tokenRootData","tokenRoot","tokenPath","removeToken","isAuthenticated","logout","setStorageType","setAuthType","authType","AuthPopup","utils","Popup","popupWindow","stringifiedOptions","stringifyOptions","prepareOptions","UA","windowName","cordova","popup","eventListener","redirectUri","hashParams","qs","pollPopup","redirectUriParser","redirectUriPath","polling","popupWindowPath","screenX","outerWidth","screenY","outerHeight","AuthOauth2","Oauth2","defaultUrlParams","responseType","responseParams","code","clientId","openPopup","authorizationEndpoint","buildQueryString","popupOptions","oauthData","exchangeForToken","exchangeForTokenUrl","keyValuePairs","urlParamsCategories","paramsCategory","paramName","camelizedName","paramValue","scopeDelimiter","scopePrefix","pair","AuthOauth1","Oauth1","serverUrl","popupListener","AuthOauth","shared","Oauth","authenticate","providers","oauthType","unlink","opts","unlinkUrl","AuthLocal","Local","checkServerStatus","checkServerStatusUrl","logoutUrl","login","user","loginUrl","OtherLogin","SSOLogin","NTlmLogin","ssoQueryParams","validateToken","AuthInterceptor","request","skipAuthorization","httpInterceptor","authHeader","authToken","MyErrorHandler","RequireTranslations","$translatePartialLoader","translationKey","refresh","currentLanguage","navigationServiceProvider","staticMenuItems","addStaticItem","_factory","defineMenuItemStates","sidebarMeta","meta","scrollButtons","enable","autoHideScrollbar","advanced","updateOnContentResize","scrollInertia","getMenuItems","subMenu","loginService","_LoginService","checkUserLimit","responseErrorProcess","errorCode","systemInit","clearAll","isSupported","core_cache","RestangularInit","setBaseUrl","getServerConfig","setDefaultHttpFields","addFullRequestInterceptor","httpConfig","setResponseInterceptor","responseData","omit","setErrorInterceptor","responseHandler","serverSettingInit","setProtocol","authInit","defaultTokenPrefix","setHttpInterceptor","setWithCredentials","setTokenRoot","setLoginUrl","baseApiLoginPath","setUnlinkUrl","setTokenName","defaultTokenName","setTokenPrefix","setAuthHeader","setAuthToken","defaultStorageType","serverSettingProvider","defaultServerAddress","defaultServerDomain","defaultContextPath","defaultServerPort","serverPort","defaultSSLType","CAS_ENABLED","CAS_VALIDATE_PATH","defaultApiPath","defaultApiLoginPath","defaultApiFileProcessPath","getProtocol","getAuthConfig","clientConfig","stringToBreadcrumb","translateFilter","lastLabel","_lastLabel","_menuList","themeTopBar","themeMaterialInit","material","themeApplication","applicationService","reposition_topnav","topbarWidth","headerRightWidth","headerLeftWidth","topbarSpace","insertAfter","each","window","scroll","fadeIn","fadeOut","sidebarBehaviour","windowWidth","windowHeight","sidebarMenuHeight","mobileSidebar","themeSidebarHandle","slideUp","sub","slideDown","themeSidebarCollapsed","collapsedSidebar","toggleLayout","pageTitle","listener","ngSpinnerLoader","routeChangeStart","stateChangeError","routeChangeSuccess","hover","mdDatepickerFocusOpen","embedSrc","countTo","refreshInterval","calculate","timoutId","translateCtrl","changeLanguage","langKey","LogoutController","LoginController","cfpLoadingBar","isLoginPage","isPreview","loginSitmap","globals","headWording","en","footWording","tw","cn","defaultRedirct","DefaultLoginPage","errorData","_redirctSearch","complete","ErrorController","isErrorPage","errorTitle","serverStatus","errorContent","IMAGES_ROOT","themeConfig","mainColor","defaultEnabledSSOQueryParams","defaultSSOQueryParamsKey","routerConfig","coreConfig","localStorageServiceProvider","$windowProvider","$httpProvider","$authProvider","RestangularProvider","$breadcrumbsProvider","$ocLazyLoadProvider","tmhDynamicLocaleProvider","ChartJsProvider","cfpLoadingBarProvider","ngDialogProvider","ScrollBarsProvider","setPrefix","html5Mode","includeBar","spinnerTemplate","colours","tooltips","useSanitizeValueStrategy","fallbackLanguage","registerAvailableLanguageKeys","en_*","zh_tw","zh_cn","useLoaderCache","useCookieStorage","forceAsyncReload","preferredLanguage","localeLocationPattern","ocLazyLoadConfig","modules","materialConfig","$mdThemingProvider","$mdDateLocaleProvider","disableTheming","_months","_weekdaysMin","NaN","msgCalendar","msgOpenCalendar","fontSet","backgroundScheduleService","checkConnTouch","connTouchService","connTouchTimer","initBackgroundSchedule","authProvider","auth","oauth","AuthConfig","defineProperties","oauth1","oauth2","runThemeBlock","tmhDynamicLocale","$translatePartialLoaderStructureChanged","$translateChangeEnd","currentDirection","$isMobile","whatToWait","$pageFinishedLoading","closest","hoverTimeout","$self"],"mappings":"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SmX,OAAO8qB,UAAWi2F,EAAY,oCACvC31H,MACEsiG,aACEviG,KAAM,iBAAkB,qBACxB2iG,YACEviB,UAAS,WACP,OACEqX,MAAO,gBACP7hF,QACEjS,KAAM,YAUpB8zF,MAAO,iCACPnwC,QACE8N,IAAK,2BACL34D,SAAU,wDACViB,QAASmX,OAAO8qB,UAAWi2F,EAAY,mCACvC31H,MACEsiG,aACEviG,KAAM,iBAAkB,qBACxB2iG,YACEviB,UAAS,WACP,OACEqX,MAAO,gBACP7hF,QACEjS,KAAM,YAUpB8zF,MAAO,mDACPnwC,QACE9+C,OAAO,iBACP4sD,IAAK,6DACL34D,SAAU,oFACViB,QAASmX,OAAO8qB,QACd+iF,cAAe,eAAgB,SAAUr2D,GACvC,MAAOA,GAAaq2D,gBAErBkT,EAAY,wDAIjBn+B,MAAO,oDACPnwC,QACE9+C,OAAQ,iBACR4sD,IAAK,8DACL34D,SAAU,sFACViB,QAASmX,OAAO8qB,QACd+iF,cAAe,eAAgB,SAAUr2D,GACvC,MAAOA,GAAaq2D,gBAErBkT,EAAY,yDAIjBn+B,MAAO,2CACPnwC,QACE8N,IAAK,gCACL34D,SAAU,gEACViB,QAASmX,OAAO8qB,UAAWi2F,EAAY,6CACvC31H,MACEsiG,aACEE,MAAO,qBACPE,YACEviB,UAAS,WACP,OACEqX,MAAO,gBACP7hF,QACEjS,KAAM,YAUpB8zF,MAAO,iDACPnwC,QACE8N,IAAK,uCACL34D,SAAU,8EACViB,QAASmX,OAAO8qB,UAAWi2F,EAAY,mDACvC31H,MACEsiG,aACEviG,KAAM,wBAAyB,kCAAmC,qBAClE2iG,YACEviB,UAAS,WACP,OACEqX,MAAO,gBACP7hF,QACEjS,KAAM,YAUpB8zF,MAAO,yCACPnwC,QACE8N,IAAK,8BACL34D,SAAU,4DACViB,QAASmX,OAAO8qB,UAAWi2F,EAAY,2CACvC31H,MACEsiG,aACEviG,KAAM,wBAAyB,qBAC/ByiG,MAAO,8BAA+B,6BACtCE,YACEviB,UAAS,WACP,OACEqX,MAAO,gBACP7hF,QACEjS,KAAM,YAUpB8zF,MAAO,8BACPnwC,QACE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O,WACPnwC,QACEyuE,YAAU,EACV3gE,IAAK,aACL5sD,OAAQ,UACR/L,SAAW,sBACXiB,QAASmX,OAAO8qB,UAAWi2F,EAAY,aACvC31H,MACEsiG,aACEE,MAAO,wBAAyB,4BAA6B,+BAC7DE,YACEviB,UAAS,WACP,OACEqX,MAAO,gBACP7hF,QACEjS,KAAM,YAUpB8zF,MAAO,gCACPnwC,QACE8N,IAAK,0BACL34D,SAAU,oDACViB,QAASmX,OAAO8qB,UAAWi2F,EAAY,kCACvC31H,MACEsiG,aACEE,MAAO,6BACPE,YACEviB,UAAS,WACP,OACEqX,MAAO,gBACP7hF,QACEjS,KAAM,YAUpB8zF,MAAO,uCACPnwC,QACE8N,IAAK,kCACL34D,SAAU,oEACViB,QAASmX,OAAO8qB,UAAWi2F,EAAY,yCACvC31H,MACEsiG,aACEE,MAAO,6BACPE,YACEviB,UAAS,WACP,OACEqX,MAAO,gBACP7hF,QACEjS,KAAM,YAUpB8zF,MAAO,gDACPnwC,QACE8N,IAAK,4CACL34D,SAAU,wFACViB,QAASmX,OAAO8qB,UAAWi2F,EAAY,kDACvC31H,MACEsiG,aACEE,MAAO,6BACPE,YACEviB,UAAS,WACP,OACEqX,MAAO,gBACP7hF,QACEjS,KAAM,YAUpB8zF,MAAO,gDACPnwC,QACE8N,IAAK,4CACL34D,SAAU,wFACViB,QAASmX,OAAO8qB,UAAWi2F,EAAY,kDACvC31H,MACEsiG,aACEE,MAAO,6BACPE,YACEviB,UAAS,WACP,OACEqX,MAAO,gBACP7hF,QACEjS,KAAM,YAUpB8zF,MAAO,gDACPnwC,QACE8N,IAAK,4CACL34D,SAAU,wFACViB,QAASmX,OAAO8qB,UAAWi2F,EAAY,kDACvC31H,MACEsiG,aACEE,MAAO,6BACPE,YACEviB,UAAS,WACP,OACEqX,MAAO,gBACP7hF,QACEjS,KAAM,YAUpB8zF,MAAO,6BACPnwC,QACE8N,IAAK;AACL34D,SAAU,8CACViB,QAASmX,OAAO8qB,UAAWi2F,EAAY,+BACvC31H,MACEsiG,aACEE,MAAO,4BAA6B,+BACpCE,YACEviB,UAAS,W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CD,GAAI05L,GAAS3oN,QAAQmW,QAAQiC,KAC7BswM,GAAe5tM,EAAS,WACtB6tM,EAAMF,QAAQ,eAAen3L,YAAY,cACxC,WAKTzb,EAAMwC,IAAI,sBAAsB,WAE9BrY,QAAQmW,QAAQ,cAAcu3E,SAC5Bz+B,UAAW,GACV,MAtHPg5J,EAAcxsM,SACZ,WACA,aACA,KACA,QACA,aACA,cACA,SACA,mBACA,WACA,gBACA,6BAgHFzb,QAAQC,OAAO,eACZu5G,IAAIyuG,MAOT,WACE,YAEAjoN,SACGC,OAAO,gBACN,uBACA,0BACA,qBACA,wBACA,yBACA,sBACA,2BACA,qBACA,uBACA,uBACA,oBACA,8BACA,gCACA,uBACA,qBACA,wBACA,wBACA,+BACA,wBACA,wBACA,uBACA,uCASN,WACE,YAEAD,SACGC,OAAO,QACN,aACA,YACA,YACA,UACA,aACA,SACA,aACA,YACA,cACA,eACA,QACA,WACA,qBACA,UACA,iBACA,aACA,SACA,sBACA,eACA,oBACA,yBACA,gBACA,cACA,mBACA,yBACA,WACA,gBACA,uBACA,WACA,cACA,oBAMND,QAAQC,OAAO,QAAQu5G,KAAK,iBAAkB,SAAS3nE,GAAiBA,EAAekE,IAAI,2CAA2C,yZACtIlE,EAAekE,IAAI,gCAAgC,qoBACnDlE,EAAekE,IAAI,mCAAmC,2MACtDlE,EAAekE,IAAI,8BAA8B,g8BACjDlE,EAAekE,IAAI,8BAA8B,gzEACjDlE,EAAekE,IAAI,+BAA+B,8kGAClDlE,EAAekE,IAAI,gDAAgD,qcACnElE,EAAekE,IAAI,oDAAoD,63DACvElE,EAAekE,IAAI,uEAAuE,kuEAC1FlE,EAAekE,IAAI,yDAAyD;AAC5ElE,EAAekE,IAAI,iDAAiD,oqMACpElE,EAAekE,IAAI,sDAAsD,66JACzElE,EAAekE,IAAI,oEAAoE,+7FACvFlE,EAAekE,IAAI,8DAA8D,4wIACjFlE,EAAekE,IAAI,uDAAuD,o9BAC1ElE,EAAekE,IAAI,kEAAkE,unGACrFlE,EAAekE,IAAI,gEAAgE,2sEACnFlE,EAAekE,IAAI,iEAAiE,wnEACpFlE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","file":"scripts/app-2e8d5e9914.js","sourcesContent":["/**\n * Created by Bruce on 2016/11/18.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.language', []);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var systemConstant = {\n \"ONLINE_USER_NO\": \"線上人數\",\n \"MANAGER_CENTER\": \"管理中心\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('systemConstantZhTW',systemConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var statusConstant = {\n \"PASSED\": \"通過\",\n \"COMPLETED\": \"完成\",\n \"INCOMPLETED\": \"未完成\",\n \"INCOMPLETE\": \"未完成\",\n \"FAILED\": \"未通過\",\n \"NOT AVAILABLE\": \"待修中\",\n \"NOT ATTEMPTED\": \"未曾觀看\",\n \"NOT_ENROLLED\": \"尚未報名\",\n \"UNENROLLED\": \"尚未報名\",\n \"UNENROLL\": \"取消報名\",\n \"EXEMPTION\":\"免修\",\n \"UNPUBLISHED ASSIGNED\": \"等待發佈中\",\n \"ENROLLMENT APPROVAL PENDING\": \"等待簽核中\",\n \"INCOMPLETED_STATUS\":\"未完成\",\n \"SCO_NON_ATTEMPT\":\"未曾觀看\",\n \"ENROLLMENT_APPROVAL_PENDING\": \"等待簽核中\",\n \"STATUS_NOT_AVAILABLE\":\"待修中\",\n \"COMPLETED_STATUS\":\"完成\",\n \"UNPUBLISHED_WAITLISTED\": \"候補中\",\n \"ENROLLMENT_WAITLISTED\":\"候補中\",\n \"LEAVE_APPROVAL_PENDING\": \"請假申請等待簽核中\",\n \"UNPUBLISHED_ASSIGNED\":\"等待發佈中\",\n \"WAITING_FOR_PROGRAM_PUBLISH\": \"等待來源學習活動發佈中\",\n \"WAITING FOR PROGRAM PUBLISH\": \"等待來源學習活動發佈中\",\n \"SELFENROLLED\": \"自行報名\",\n \"ASSIGNED\": \"指定報名\",\n \"EXECUTED\": \"已生效\",\n \"NOT_EXECUTED\": \"尚未生效\",\n \"UNKNOW_STATUS\":\"未知狀態\",\n \"CANCEL\": \"取消\",\n \"APPROVED\": \"已批准\",\n \"PUBLIC_STATUS_REJECT\": \"拒絕\",\n \"PUBLISH_STATUS_REJECT\": \"拒絕\",\n \"WAITING_APPROVAL\": \"簽核中\",\n \"NO_APPROVAL\": \"無須簽核\",\n \"APPROVALED\": \"已核准\",\n \"NOT_YET_APPROVAL\": \"尚未核准\",\n \"APPROVAL_REJECT\": \"簽核拒絕\",\n \"EXEMPTION_SUBMIT\": \"免繳\",\n \"NOT_SUBMIT\": \"未繳\",\n \"SUBMITTED\": \"已繳\",\n \"NOT_PUBLISHED\": \"不公布\",\n \"ENROLLED\": \"已報名\",\n \"NOT_ENROLLMENT\": \"尚未開始報名\",\n \"ENROLLMENT_DEADLINE\": \"報名截止\",\n \"ATTENDANCE\": \"出席\",\n \"ABSENCE\": \"缺席\",\n \"ABSENT\": \"缺席\",\n \"REJECTED\": \"已被拒絕\",\n \"LEAVE\": \"請假\",\n \"LEARNER_ASK_LEAVE\": \"學員自行請假\",\n \"ADMINISTRATOR_REGISTER\": \"管理員登錄\",\n \"PUBLISHED\": \"發佈中\",\n \"HAVE NOT EXECUTED ENROLLED ASSIGNMENT\": \"尚未生效\",\n \"NO_RATING_REQUIRED\": \"無須評分\",\n \"FAIL_CHECK_SESSIONQUOTAFULL\": \"名額已滿\",\n \"FAIL_CHECK_PRIVILEGE\": \"無權限報名\",\n \"FAIL_CHECK_OUT_OF_QUOTA\": \"已額滿\",\n \"WAITLISTED\": \"候補中\",\n \"BLOCKED\": \"擋修中\",\n \"NEW\": \"最新\",\n \"HOT\": \"熱門\",\n \"FEATURED\": \"精選\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('statusConstantZhTW',statusConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var messageConstant = {\n \"YOU_HAVE_BEEN_LOGGED_OUT\":\"您已經成功登出\",\n \"YOU_HAVE_SUCCESSFULLY_SIGNED_IN\":\"您已經成功登入!\",\n \"MSG_TAKES_TIME_ACTION\": \"這個動作需要花上一些時間,我們將在背景作業中處理。變更或許不會在頁面即時呈現。\",\n \"MSG_IS_SURE_ENROLL\": \"確定報名嗎?\",\n \"MSG_IS_SURE_UN_ENROLL\": \"確定取消報名嗎?\",\n \"MSG_IS_SURE_TO_PAY\": \"您確定要繳交?\",\n \"MSG_NOT_YET_COMPLETED_WHETHER_TO_SEND_OUT\": \"尚未完成的題目:{{value}},是否確定送出?\",\n \"MSG_THERE_ARE_OPTIONS_NOT_FILLED_OUT\": \"尚有選項未填寫!\",\n \"MSG_PLEASE_SELECT_AT_LEAST_ONE_STUDENT\": \"請至少選擇一個學員\",\n \"MSG_ERROR_NOT_PUBLISH\": \"此活動尚未發佈或已被刪除\",\n \"MSG_ERROR_MESSAGE_CAN_NOT_ENROLL_CAUSE_PASS_RESULT\": \"您已通過此課程,依照課程設定無法再自行報名其他班次,班次資訊如下:
格式:學習活動班次名稱(上課日期)
\",\n \"MSG_ERROR_MESSAGE_CAN_ENROLL_WAITLSTED_RESULT\": \"候補中\",\n \"MSG_IS_CONTINUE\": \"確定繼續?\",\n \"MSG_YOU_HAVE_REQUIRED_SUBJECT_NOT_YET_ANSWERED\": \"您尚有必填題目:{{value}},尚未作答!!\",\n \"MSG_QUESTION_OPTION_EXCEEDS_WORD_LIMIT\": \"題目:{{value}},選項超出字數限制!!\",\n \"MSG_UNABLE_SEND_REFRESH\": \"如果您無法發送,系統會自動重新整理,請等待一下。\",\n \"MSG_PLEASE_RETURN_TO_FILL_IN\": \"請返回填寫\",\n \"MSG_QUESTION_FILL_THIS_TO_THE_END\": \"填答到此結束,感謝您的回饋填答到此結束,對此問卷請給予回饋\",\n \"MSG_ERROR_PLAY_BLOCKING\": \"請先完成前一資料夾的課程內容或測驗問卷才能繼續\",\n \"MSG_YOU_HAVE_COMPLETED_THIS_QUESTIONNAIRE\": \"你已完成此問卷\",\n \"MSG_YOU_HAVE_COMPLETED_THIS_TEST\": \"你已完成此測驗\",\n \"MSG_CURRENTLY_NON_VIEWING_TIME\": \"目前非觀看時間\",\n \"MSG_NEXT_TEST_DATETIME\": \"下次測驗日期為\",\n \"MSG_CAN_NOT_TAKE_LESSONS\": \"無法進行課程\",\n \"MSG_CAN_NOT_TAKE_TEST_QUESTIONNAIRE\": \"無法進行測驗問卷\",\n \"MSG_ARE_YOU_SURE_WANT_TO_REPLACE_YOUR_AVATAR\": \"確定要將更換個人頭像嗎?\",\n \"MSG_ARE_YOU_SURE_WANT_TO_CHANGE_YOUR_PASSWORD\": \"確定要變更密碼嗎?\",\n \"MSG_CAN_NOT_FIND_THE_LATEST_INFORMATION\": \"無法查到最新資料\",\n \"MSG_DO_YOU_WANT_TO_ADD_MY_FAVORITE\": \"確定要將{{value}}加入我的最愛嗎?\",\n \"MSG_DO_YOU_WANT_TO_CANCEL_MY_FAVORITE\": \"確定要將{{value}}取消我的最愛嗎?\",\n \"MSG_PLEASE_ENTER_START_DATE\": \"請輸入開始日期\",\n \"MSG_PLEASE_ENTER_END_DATE\": \"請輸入結束日期\",\n \"MSG_PLEASE_SELECT_AT_LEAST_ONE_COURSE\": \"請至少選擇一個課程\",\n \"MSG_THE_START_DATE_CAN_NOT_BE_GREATER_THAN_THE_END_DATE\": \"開始日期不能大於結束日期\",\n \"MSG_PLEASE_SELECT_DEPARTMENT_MEMBER\": \"請選擇部門成員\",\n \"MSG_THE_FORM_HAS_NOT_BEEN_COMPLETED_YET_PLEASE_CONFIRM\": \"表單尚未完成,請確認!\",\n \"MSG_UPDATE_PASSWORD_SUCCESS\": \"變更密碼成功\",\n \"MSG_ENROLLMENT_APPROVAL_PENDING\": \"等待簽核中\",\n \"MSG_THIS_ACTION_WILL_RELEVANT_STUDY_REPORT\": \"這個動作會取消所有相關的學習報告\",\n \"MSG_ARE_YOU_SURE_WANT_TO_DELETE_DEPUTY_RECORD\": \"確定要刪除代理人紀錄?\",\n \"MSG_DEPUTY_EFFECTIVE_DATE_CNA_NOT_EMPTY\": \"代理生效日不得為空!\",\n \"MSG_DEPUTY_END_DATE_CNA_NOT_EMPTY\": \"代理結束日不得為空!\",\n \"MSG_DEPUTY_END_DATE_CNA_NOT_BE_EARLIER_THAN_DEPUTY_EFFECTIVE_DATE\": \"代理結束日不能早於代理生效日\",\n \"MSG_PLEASE_SETTING_DEPUTY\": \"請設定代理人\",\n \"MSG_SETTING_DEPUTY_SUCCESSFUL\": \"設定代理人成功\",\n \"MSG_EDIT_DEPUTY_RECORD_SUCCESSFUL\": \"修改代理人紀錄成功\",\n \"MSG_NOT_ALLOW_TO_DELETE_OTHER_SETTING\": \"不允許移除其他人的設定\",\n \"MSG_PLEASE_SELECT_AT_LEAST_ONE_TIME_PERIOD\": \"請至少選擇一個時段\",\n \"MSG_PLEASE_FILE_IN_THE_REASON_FOR_REJECT\": \"請填入不核准的原因\",\n \"MSG_ERROR_NEED_FINISH_PREREQUISITE_ITEMS\": \"請先完成下列先修項目再報名\",\n \"MSG_SELECT_COURSE_OR_OTHER_NEED\": \"請選擇課程或其他需求\",\n \"MSG_SORRY_YOU_ONLY_DELETE_COURSES_FORM_SELF_REQUIRED_WHICH_ARE_STILL_OPEN_FOR_ENROLLMENT\": \"僅能刪除自我要求且尚未報名的建議學習項目\",\n \"MSG_SORRY_YOU_CANNOT_DELETE_COURSES_WHICH_YOU_HAVE_ENROLLED_IN\": \"您已報名的課程,無法直接刪除\",\n \"MSG_SORRY_YOU_ONLY_DELETE_COURSES_FORM_MANAGER_SUGGEST_WHICH_ARE_STILL_OPEN_FOR_ENROLLMENT\": \"僅能刪除主管建議且尚未報名的建議學習項目\",\n \"MSG_SORRY_YOU_CANNOT_DELETE_COURSES_WHICH_EMPLOYEES_HAVE_ENROLLED_IN\": \"同仁已報名的課程,無法直接刪除\",\n \"MSG_SORRY_YOU_CAN_ONLY_UPDATE_PLANNED_COMPLETION_DATE_OF_COURSE_FROM_SELF_REQUIRES_AND_MANAGER_SUGGESTION\": \"僅能針對\\\"自我要求/主管建議\\\"課程調整預定完成日期\",\n \"MSG_SORRY_YOU_CAN_ONLY_UPDATE_PLANNED_COMPLETION_DATE_OF_COURSE_FROM_SELF_REQUIRES\": \"僅能針對\\\"自我要求\\\"課程調整預定完成日期\",\n \"MSG_PLEASE_FILL_IN_THE_REASON\": \"請填寫理由\",\n \"MSG_THE_SETTING_TIME_DOES_NOT_EXIST_PLEASE_RE_ENTER\": \"設定時間不存在,請重新輸入\",\n \"MSG_TIME_PERIOD_N_PARTIALLY_OVERLAPS_PLEASE_RESET\": \"與時段 {{value}} 設定時間部份重疊,請重新設定\",\n \"MSG_SUCCESSFUL_OPERATION\": \"操作成功\",\n \"MSG_FAILED_OPERATION\": \"操作失敗\",\n \"MSG_EXTERNAL_TRAINING_APPLY_SUMMIT_CHECK\": \"送出前請再次確認填入資料是否全部正確!! 確定要送出請按\\\"確定\\\"鈕. 重新編輯請按\\\"取消\\\"鈕.\",\n \"MSG_THE_START_DATE_NEED_TO_EARLIER_THAN_THE_END_DATE\": \"開始時間必須早於結束時間\",\n \"MSG_YOUR_ATTENDANCE_RATE_IS_TOO_LOW_TO_FILL_OUT\": \"您出席率不足,無法進行填寫\",\n \"MSG_ENROLLMENT_WAITING_APPROVAL\": \"報名等待簽核中\",\n \"MSG_CLASS_TIME_CONFLICT\": \"此課程與其他已經報名之課程:
{{value}} 的上課時間重疊,因此不能報名!\",\n \"MSG_TIME_IS_OUT\": \"時間已到!\",\n \"MSG_ASSIGN_EXCEED_MAX\": \"你已經選擇了{{value1}}個學員。但是只有{{value2}}個學員能夠加入此課程/學程,因指定人數超過上限,請重新選擇。\",\n \"MSG_CURRENTLY_ON_THE_TEMPORARY_LEARNING_RESOURCES\": \"目前暫無線上學習資源\",\n \"MSG_ERROR_MESSAGE_ENROLL_CAUSE_PASS_RESULT\": \"您已通過此課程,是否繼續再自行報名其他班次,班次資訊如下:
格式:學習活動班次名稱(上課日期)
\",\n \"MSG_INNERCERT_CANNOT_ENROLL_EXTENDED_SESSION\": \"您無取得過該內部證照, 無法報名展期班次\",\n \"MSG_RESTORE_LAST_TIME_UNFINISHED_FORM\": \"恢復前次未完成填寫表單!!\",\n \"MSG_COURSE_DATA_FILE_NEED_RE_CHOOSE\": \"課程資料檔案需要重新選取!!\",\n \"MSG_THE_TIME_RANGE_IS_ERROR\": \"時間範圍錯誤\",\n \"MSG_CONFIRM_TO_DELETE\": \"確定刪除?\",\n \"MSG_PLEASE_SELECT_AT_LEAST_ONE_ITEM\": \"請至少選擇一個項目\",\n \"MSG_BEFORE_YOU_REGISTER_YOU_MUST_FILL_OUT_THE_REGISTRATION_QUESTIONNAIRE_ARE_YOU_SURE_YOU_WANT_TO_CONTINUE\": \"報名課程前必須先填寫報名問卷。確定要繼續?\",\n \"MSG_YOU_DO_NOT_HAVE_PERMISSION_TO_VIEW_THIS_LEARNING_ACTIVITY\": \"您沒有權限觀看本學習活動\",\n \"MSG_PLEASE_SELECT_ONE_COURSE\": \"請選擇一個課程\",\n \"MSG_PLEASE_SELECT_ONE_COURSE_SESSION\": \"請選擇一個班次\",\n \"MSG_THE_APPLICATION_FORM_WAS_UPDATED_SUCCESSFULLY\": \"申請表單修改成功\",\n \"MSG_YOU_HAVE_SUCCESSFULLY_ADDED_EXTERNAL_VENDOR\": \"您已成功新增外訓廠商\",\n \"ADDED_EXTERNAL_VENDOR\": \"新增外訓廠商\",\n \"PICTURE_OVER_MB_PLEASE_RELOAD\": \"圖片檔案超過{{value}}mb,請重新上傳\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('messageConstantZhTW',messageConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var httpErrorCodeConstant = {\n \"102_TITLE\": \"ERR CONNECTION REFUSED\",\n \"102_CONTENT\": \"未知的錯誤。\",\n\n \"400_TITLE\": \"Bad Request\",\n \"400_CONTENT\": \"由於包含語法錯誤,當前請求無法被伺服器理解。除非進行修改,否則用戶端不應該重複提交這個請求。\",\n\n \"401_TITLE\": \"Unauthorized\",\n \"401_CONTENT\": \"當前請求需要使用者驗證。該響應必須包含一個適用於被請求資源的WWW-Authenticate資訊頭用以詢問使用者資訊。用戶端可以重複提交一個包含恰當的Authorization頭資訊的請求。如果當前請求已經包含了Authorization憑證,那麼401響應代表著伺服器驗證已經拒絕了那些憑證。如果401響應包含了與前一個響應相同的身分驗證詢問,且瀏覽器已經至少嘗試了一次驗證,那麼瀏覽器應當向使用者展示響應中包含的實體資訊,因為這個實體資訊中可能包含了相關診斷資訊。\",\n\n \"402_TITLE\": \"Payment Required\",\n \"402_CONTENT\": \"該狀態碼是為了將來可能的需求而預留的。\",\n\n \"403_TITLE\": \"Forbidden\",\n \"403_CONTENT\": \"伺服器已經理解請求,但是拒絕執行它。與401響應不同的是,身分驗證並不能提供任何幫助,而且這個請求也不應該被重複提交。如果這不是一個HEAD請求,而且伺服器希望能夠講清楚為何請求不能被執行,那麼就應該在實體內描述拒絕的原因。當然伺服器也可以返回一個404響應,假如它不希望讓用戶端獲得任何資訊。\",\n\n \"404_TITLE\": \"Not Found\",\n \"404_CONTENT\": \"請求失敗,請求所希望得到的資源未被在伺服器上發現。沒有資訊能夠告訴使用者這個狀況到底是暫時的還是永久的。假如伺服器知道情況的話,應當使用410狀態碼來告知舊資源因為某些內部的配置機制問題,已經永久的不可用,而且沒有任何可以跳轉的位址。404這個狀態碼被廣泛應用於當伺服器不想揭示到底為何請求被拒絕或者沒有其他適合的響應可用的情況下。\",\n\n \"405_TITLE\": \"Method Not Allowed\",\n \"405_CONTENT\": \"請求行中指定的請求方法不能被用於請求相應的資源。該響應必須返回一個Allow頭資訊用以表示出當前資源能夠接受的請求方法的列表。鑒於PUT,DELETE方法會對伺服器上的資源進行寫操作,因而絕大部分的網頁伺服器都不支援或者在預設配置下不允許上述請求方法,對於此類請求均會返回405錯誤。\",\n\n \"406_TITLE\": \"Not Acceptable\",\n \"406_CONTENT\": \"請求的資源的內容特性無法滿足請求頭中的條件,因而無法生成響應實體。除非這是一個HEAD請求,否則該響應就應當返回一個包含可以讓使用者或者瀏覽器從中選擇最合適的實體特性以及位址列表的實體。實體的格式由Content-Type頭中定義的媒體類型決定。瀏覽器可以根據格式及自身能力自行作出最佳選擇。但是,規範中並沒有定義任何作出此類自動選擇的標準。\",\n\n \"407_TITLE\": \"Proxy Authentication Required\",\n \"407_CONTENT\": \"與401響應類似,只不過用戶端必須在代理伺服器上進行身分驗證。代理伺服器必須返回一個Proxy-Authenticate用以進行身分詢問。用戶端可以返回一個Proxy-Authorization資訊頭用以驗證。\",\n\n \"408_TITLE\": \"Request Timeout\",\n \"408_CONTENT\": \"請求超時。用戶端沒有在伺服器預備等待的時間內完成一個請求的傳送。用戶端可以隨時再次提交這一請求而無需進行任何更改。\",\n\n \"409_TITLE\": \"Conflict\",\n \"409_CONTENT\": \"由於和被請求的資源的當前狀態之間存在衝突,請求無法完成。這個代碼只允許用在這樣的情況下才能被使用:使用者被認為能夠解決衝突,並且會重新提交新的請求。該響應應當包含足夠的資訊以便使用者發現衝突的源頭。衝突通常發生於對PUT請求的處理中。例如,在採用版本檢查的環境下,某次PUT提交的對特定資源的修改請求所附帶的版本資訊與之前的某個(第三方)請求向衝突,那麼此時伺服器就應該返回一個409錯誤,告知使用者請求無法完成。此時,響應實體中很可能會包含兩個衝突版本之間的差異比較,以便使用者重新提交歸併以後的新版本。\",\n\n \"410_TITLE\": \"Gone\",\n \"410_CONTENT\":\"被請求的資源在伺服器上已經不再可用,而且沒有任何已知的轉發位址。這樣的狀況應當被認為是永久性的。如果可能,擁有連結編輯功能的用戶端應當在獲得使用者許可後刪除所有指向這個位址的參照。如果伺服器不知道或者無法確定這個狀況是否是永久的,那麼就應該使用404狀態碼。除非額外說明,否則這個響應是可快取的。\",\n\n \"411_TITLE\": \"Length Required\",\n \"411_CONTENT\":\"伺服器拒絕在沒有定義Content-Length頭的情況下接受請求。在添加了表明請求訊息體長度的有效Content-Length頭之後,用戶端可以再次提交該請求。\",\n\n \"412_TITLE\": \"Precondition Failed\",\n \"412_CONTENT\":\"伺服器在驗證在請求的頭欄位中給出先決條件時,沒能滿足其中的一個或多個。這個狀態碼允許用戶端在取得資源時在請求的元資訊(請求頭欄位資料)中設定先決條件,以此避免該請求方法被應用到其希望的內容以外的資源上。\",\n\n \"413_TITLE\": \"Request Entity Too Large\",\n \"413_CONTENT\":\"伺服器拒絕處理當前請求,因為該請求提交的實體資料大小超過了伺服器願意或者能夠處理的範圍。此種情況下,伺服器可以關閉連線以免用戶端繼續傳送此請求。如果這個狀況是臨時的,伺服器應當返回一個Retry-After的響應頭,以告知用戶端可以在多少時間以後重新嘗試。\",\n\n \"414_TITLE\": \"Request-URI Too Long\",\n \"414_CONTENT\":\"請求的URI長度超過了伺服器能夠解釋的長度,因此伺服器拒絕對該請求提供服務\",\n\n \"415_TITLE\": \"Unsupported Media Type\",\n \"415_CONTENT\":\"對於當前請求的方法和所請求的資源,請求中提交的實體並不是伺服器中所支援的格式,因此請求被拒絕。\",\n\n \"416_TITLE\": \"Requested Range Not Satisfiable\",\n \"416_CONTENT\":\"如果請求中包含了Range請求頭,並且Range中指定的任何資料範圍都與當前資源的可用範圍不重合,同時請求中又沒有定義If-Range請求頭,那麼伺服器就應當返回416狀態碼。假如Range使用的是位元組範圍,那麼這種情況就是指請求指定的所有資料範圍的首位元組位置都超過了當前資源的長度。伺服器也應當在返回416狀態碼的同時,包含一個Content-Range實體頭,用以指明當前資源的長度。這個響應也被禁止使用multipart/byteranges作為其Content-Type。\",\n\n \"417_TITLE\": \"Expectation Failed\",\n \"417_CONTENT\":\"在請求頭Expect中指定的預期內容無法被伺服器滿足,或者這個伺服器是一個代理伺服器,它有明顯的證據證明在當前路由的下一個節點上,Expect的內容無法被滿足。\",\n\n \"418_TITLE\": \"I'm a teapot\",\n \"418_CONTENT\":\"本操作碼是在1998年作為IETF的傳統愚人節笑話, 在RFC 2324 超文字咖啡壺控制協定中定義的,並不需要在真實的HTTP伺服器中定義。當一個控制茶壺的HTCPCP收到BREW或POST指令要求其煮咖啡時應當回傳此錯誤。\",\n\n \"421_TITLE\": \"There are too many connections from your internet address\",\n \"421_CONTENT\":\"從當前用戶端所在的IP位址到伺服器的連線數超過了伺服器許可的最大範圍。通常,這裡的IP位址指的是從伺服器上看到的用戶端位址(比如使用者的閘道器或者代理伺服器位址)。在這種情況下,連線數的計算可能涉及到不止一個終端使用者。\",\n\n \"422_TITLE\": \"Unprocessable Entity\",\n \"422_CONTENT\":\"請求格式正確,但是由於含有語意錯誤,無法響應。\",\n\n \"423_TITLE\": \"Locked\",\n \"423_CONTENT\":\"當前資源被鎖定。\",\n\n \"424_TITLE\": \"Failed Dependency\",\n \"424_CONTENT\":\"由於之前的某個請求發生的錯誤,導致當前請求失敗,例如PROPPATCH。\",\n\n \"425_TITLE\": \"Unordered Collection\",\n \"425_CONTENT\":\"在WebDav Advanced Collections草案中定義,但是未出現在《WebDAV順序集協定》中。\",\n\n \"426_TITLE\": \"Upgrade Required\",\n \"426_CONTENT\":\"用戶端應當切換到TLS/1.0。\",\n\n \"449_TITLE\": \"Retry With\",\n \"449_CONTENT\":\"由微軟擴充功能,代表請求應當在執行完適當的操作後進行重試。\",\n\n \"451_TITLE\": \"Unavailable For Legal Reasons\",\n \"451_CONTENT\":\"由IETF核准,代表該存取因法律的要求而被拒絕。\",\n\n\n \"500_TITLE\": \"Internal Server Error\",\n \"500_CONTENT\":\"伺服器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在伺服器的程式碼出錯時出現。\",\n\n \"501_TITLE\": \"Not Implemented\",\n \"501_CONTENT\":\"伺服器不支援當前請求所需要的某個功能。當伺服器無法識別請求的方法,並且無法支援其對任何資源的請求。\",\n\n \"502_TITLE\": \"Bad Gateway\",\n \"502_CONTENT\":\"作為閘道器或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的響應。\",\n\n \"503_TITLE\": \"Service Unavailable\",\n \"503_CONTENT\":\"由於臨時的伺服器維護或者過載,伺服器當前無法處理請求。這個狀況是臨時的,並且將在一段時間以後取消復原。如果能夠預計延遲時間,那麼響應中可以包含一個Retry-After頭用以標明這個延遲時間。如果沒有給出這個Retry-After資訊,那麼用戶端應當以處理500響應的方式處理它。\",\n\n \"504_TITLE\": \"Gateway Timeout\",\n \"504_CONTENT\":\"作為閘道器或者代理工作的伺服器嘗試執行請求時,未能及時從上游伺服器(URI標識出的伺服器,例如HTTP、FTP、LDAP)或者輔助伺服器(例如DNS)收到響應。注意:某些代理伺服器在DNS查詢超時時會返回400或者500錯誤。\",\n\n \"505_TITLE\": \"HTTP Version Not Supported\",\n \"505_CONTENT\":\"伺服器不支援,或者拒絕支援在請求中使用的HTTP版本。這暗示著伺服器不能或不願使用與用戶端相同的版本。響應中應當包含一個描述了為何版本不被支援以及伺服器支援哪些協定的實體。\",\n\n \"506_TITLE\": \"Variant Also Negotiates\",\n \"506_CONTENT\":\"由《透明內容協商協定》擴充功能,代表伺服器存在內部配置錯誤:被請求的協商變元資源被配置為在透明內容協商中使用自己,因此在一個協商處理中不是一個合適的重點。\",\n\n \"507_TITLE\": \"Insufficient Storage\",\n \"507_CONTENT\":\"伺服器無法儲存完成請求所必須的內容。這個狀況被認為是臨時的。\",\n\n \"509_TITLE\": \"Bandwidth Limit Exceeded\",\n \"509_CONTENT\":\"伺服器達到頻寬限制。這不是一個官方的狀態碼,但是仍被廣泛使用。\",\n\n \"510_TITLE\": \"Not Extended\",\n \"510_CONTENT\":\"取得資源所需要的策略並沒有被滿足。\"\n\n };\n angular\n .module('eHRD.modules.language')\n .constant('httpErrorCodeConstantZhTW',httpErrorCodeConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var formValidationConstant = {\n \"THIS_IS_REQUIRED\": \"必填!\",\n \"PLEASE_RE_CHECK_NEW_PASSWORD\": \"請重新確認新密碼\",\n \"PLEASE_RE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD\": \"請重新輸入您的帳號及密碼\",\n \"PLEASE_SELECT_AT_LEAST_ONE_ITEM\": \"請至少選擇一項\",\n \"PLEASE_SELECT_AT_LEAST_ONE_MEMBER\": \"請至少選擇一個成員\",\n \"PLEASE_SET_AT_LEAST_ONE_TIME_ZONE\": \"請至少設定一個時間區段\",\n \"THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM\": \"尚有表單未填寫完成,請重新確認\",\n \"PLEASE_ENTER_A_VALID_URL\": \"請輸入有效網址. ex: http://example.com\",\n \"PLEASE_ENTER_A_VALID_DATE\": \"請輸入有效日期\",\n \"SET_THE_TIME_PART_OF_OVERLAP_PLEASE_RESET\": \"設定時間部份重疊,請重新設定\",\n \"PLEASE_ENTER_A_VALID_AMOUNT_OF_MONEY\": \"請輸入有效金額\",\n \"PLEASE_ENTER_A_VALID_EMAIL\": \"請輸入有效電子信箱\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('formValidationConstantZhTW',formValidationConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var actionsConstant = {\n \"FINISH\": \"完成\",\n \"CLOSE\": \"關閉\",\n \"SUBMIT\": \"提交\",\n \"ENTER\": \"確定\",\n \"APPLY\": \"套用\",\n \"CANCEL\": \"取消\",\n \"DELETE\": \"刪除\",\n \"SEARCH\": \"搜尋\",\n \"FILTERS\": \"篩選\",\n \"SORT\": \"排序\",\n \"SORT_METHOD\": \"排序方式\",\n \"LOGIN\": \"登入\",\n \"LOGOUT\":\"登出\",\n \"NEXT_STEP\": \"下一步\",\n \"PREVIOUS_STEP\": \"上一步\",\n \"NEXT\": \"下一個\",\n \"PREV\": \"上一個\",\n \"UN_ENROLL\": \"取消報名\",\n \"EXEMPTION\": \"免修\",\n \"LEAVE\": \"請假\",\n \"RETURN\": \"返回\",\n \"FILL_IN\": \"填寫\",\n \"ENROLL\": \"報名\",\n \"START_LEARNING\": \"開始學習\",\n \"START_SURVEY\": \"問卷開始\",\n \"START_TEST\": \"測驗開始\",\n \"SELECT_ALL\": \"全選\",\n \"SELECT_FILES\": \"選擇檔案\",\n \"REPLACE_FILES\": \"取代檔案\",\n \"UPLOAD_ALL\": \"全部上傳\",\n \"DELETE_ALL\": \"全部刪除\",\n \"DOWNLOAD_FILE\": \"下載檔案\",\n \"SELECT_QUESTION_NUMBER\": \"選擇題號\",\n \"RE_TEST_ONCE\": \"再測驗一次\",\n \"OPEN_LINK\": \"開啟連結\",\n \"ALL_ANNOUNCEMENTS\": \"全部公告\",\n \"PLAY_COURSE\": \"播放課程\",\n \"FILL_IN_TEST_SURVEY\": \"受測/填寫問卷\",\n \"CHANGE_LOGIN_PASSWORD\": \"變更登入密碼\",\n \"REPLACE\": \"取代\",\n \"READ\": \"閱讀\",\n \"RATING\": \"評分\",\n \"DOWNLOAD\": \"下載\",\n \"SHOW_AVERAGE_RATING\": \"顯示平均評分\",\n \"HIDDEN_AVERAGE_RATING\": \"隱藏平均評分\",\n \"SUBMIT_RATING\": \"確定評分\",\n \"FORM_VIEW\": \"表單檢視\",\n \"VIEW_REPORT\": \"檢視報告\",\n \"APPROVAL\": \"核准\",\n \"NO_APPROVAL\": \"不核准\",\n \"APPLY_INFORMATION\":\"申請須知\",\n \"APPLY_ENROLLMENT\": \"申請報名\",\n \"LOGIN_AGAIN\": \"重新登入\",\n \"SELECT\": \"選擇\",\n \"REJECT\": \"不核准\",\n \"RESEND\": \"重送\",\n \"EXPAND_PROFILE_DETAIL\": \"展開個人資訊\",\n \"COLLAPSE_PROFILE_DETAIL\": \"收合個人資訊\",\n \"EDIT\": \"編輯\",\n \"VIEW\": \"檢視\",\n \"ADD_PERSONAL_ELECTIVE_ITEM\": \"加入個人選修項目\",\n \"ADD_MANAGER_SUGGEST_ITEM\": \"加入主管建議項目\",\n \"UPDATE_ESTIMATED_COMPLETION_DATE\": \"更新預定完成日\",\n \"UPDATE\": \"更新\",\n \"ADD_A_TIME_ZONE\": \"新增時間區段\",\n \"EDIT_A_TIME_ZONE\": \"編輯時間區段\",\n \"DELETE_A_TIME_ZONE\": \"刪除時間區段\",\n \"ADD_FILE\": \"新增檔案\",\n \"DELETE_FILE\": \"刪除檔案\",\n \"EXPAND_MORE\": \"展開更多\",\n \"COLLAPSE_MORE\": \"收合更多\",\n \"SELECT_DEPARTMENT\": \"選擇部門\",\n \"FORM_EDIT\": \"表單編輯\",\n \"APPLY_APPROVAL\": \"申請簽核\",\n \"CONTINUE_ENROLL\": \"繼續報名\",\n \"NEXT_PAGE\": \"下一頁\",\n \"PREVIOUS_PAGE\": \"上一頁\",\n \"PRINT\": \"列印\",\n \"SEND_APPLY\": \"送出申請\",\n \"ADD_A_TIME\": \"新增時間\",\n \"DELETE_A_TIME\": \"刪除時間\",\n \"EXCERT_APPLY_BONUS\": \"申請外部證照合格獎勵\",\n \"EXCERT_APPLY_COMPENSATION\": \"申請外部證照考試補助\",\n \"ADD\": \"新增\",\n \"REMOVE\": \"移除\",\n \"SELECT_CLASS\": \"選擇班次\",\n \"SELECT_COURSE\": \"選擇課程\",\n \"ADD_NEW_CLASS\": \"建立新班次\",\n \"EDIT_CLASS\": \"修改班次\",\n \"SET_REPORT_SCORE\": \"設定報告分數\",\n \"ADD_APPLY_MEMBER\": \"加入申請學員\", \n \"GO_BACK\": \"返回上一層\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('actionsConstantZhTW',actionsConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var systemConstant = {\n \"ONLINE_USER_NO\": \"线上人数\",\n \"MANAGER_CENTER\": \"管理中心\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('systemConstantZhCN',systemConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var statusConstant = {\n \"PASSED\": \"通过\",\n \"COMPLETED\": \"完成\",\n \"INCOMPLETED\": \"未完成\",\n \"INCOMPLETE\": \"未完成\",\n \"FAILED\": \"未通过\",\n \"NOT AVAILABLE\": \"待修中\",\n \"NOT ATTEMPTED\": \"未曾观看\",\n \"NOT_ENROLLED\": \"尚未报名\",\n \"UNENROLLED\": \"尚未报名\",\n \"UNENROLL\": \"取消报名\",\n \"EXEMPTION\":\"免修\",\n \"UNPUBLISHED ASSIGNED\": \"等待发佈中\",\n \"ENROLLMENT APPROVAL PENDING\": \"等待簽核中\",\n \"INCOMPLETED_STATUS\":\"未完成\",\n \"SCO_NON_ATTEMPT\":\"未曾观看\",\n \"ENROLLMENT_APPROVAL_PENDING\": \"等待簽核中\",\n \"STATUS_NOT_AVAILABLE\":\"待修中\",\n \"COMPLETED_STATUS\":\"完成\",\n \"UNPUBLISHED_WAITLISTED\": \"候补中\",\n \"ENROLLMENT_WAITLISTED\":\"候补中\",\n \"LEAVE_APPROVAL_PENDING\": \"请假申请等待簽核中\",\n \"UNPUBLISHED_ASSIGNED\":\"等待发佈中\",\n \"WAITING_FOR_PROGRAM_PUBLISH\": \"等待来源学习活动发佈中\",\n \"WAITING FOR PROGRAM PUBLISH\": \"等待来源学习活动发佈中\",\n \"SELFENROLLED\": \"自行报名\",\n \"ASSIGNED\": \"指定报名\",\n \"EXECUTED\": \"已生效\",\n \"NOT_EXECUTED\": \"尚未生效\",\n \"UNKNOW_STATUS\":\"未知状态\",\n \"CANCEL\": \"取消\",\n \"APPROVED\": \"已批准\",\n \"PUBLIC_STATUS_REJECT\": \"拒绝\",\n \"PUBLISH_STATUS_REJECT\": \"拒绝\",\n \"WAITING_APPROVAL\": \"簽核中\",\n \"NO_APPROVAL\": \"无须簽核\",\n \"APPROVALED\": \"已核准\",\n \"NOT_YET_APPROVAL\": \"尚未核准\",\n \"APPROVAL_REJECT\": \"簽核拒绝\",\n \"EXEMPTION_SUBMIT\": \"免缴\",\n \"NOT_SUBMIT\": \"未缴\",\n \"SUBMITTED\": \"已缴\",\n \"NOT_PUBLISHED\": \"不公布\",\n \"ENROLLED\": \"已报名\",\n \"NOT_ENROLLMENT\": \"尚未开始报名\",\n \"ENROLLMENT_DEADLINE\": \"报名截止\",\n \"ATTENDANCE\": \"出席\",\n \"ABSENCE\": \"缺席\",\n \"ABSENT\": \"缺席\",\n \"REJECTED\": \"已被拒绝\",\n \"LEAVE\": \"请假\",\n \"LEARNER_ASK_LEAVE\": \"学员自行请假\",\n \"ADMINISTRATOR_REGISTER\": \"管理员登录\",\n \"PUBLISHED\": \"发佈中\",\n \"HAVE NOT EXECUTED ENROLLED ASSIGNMENT\": \"尚未生效\",\n \"NO_RATING_REQUIRED\": \"无须评分\",\n \"FAIL_CHECK_SESSIONQUOTAFULL\": \"名额已满\",\n \"FAIL_CHECK_PRIVILEGE\": \"无权限报名\",\n \"FAIL_CHECK_OUT_OF_QUOTA\": \"已额满\",\n \"WAITLISTED\": \"候补中\",\n \"BLOCKED\": \"挡修中\",\n \"NEW\": \"最新\",\n \"HOT\": \"热门\",\n \"FEATURED\": \"精选\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('statusConstantZhCN',statusConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var messageConstant = {\n \"YOU_HAVE_BEEN_LOGGED_OUT\":\"您已经成功登出\",\n \"YOU_HAVE_SUCCESSFULLY_SIGNED_IN\":\"您已经成功登入!\",\n \"MSG_TAKES_TIME_ACTION\": \"这个动作需要花上一些时间,我们将在背景作业中处理。变更或许不会在页面即时呈现。\",\n \"MSG_IS_SURE_ENROLL\": \"确定报名吗?\",\n \"MSG_IS_SURE_UN_ENROLL\": \"确定取消报名吗?\",\n \"MSG_IS_SURE_TO_PAY\": \"您确定要缴交?\",\n \"MSG_NOT_YET_COMPLETED_WHETHER_TO_SEND_OUT\": \"尚未完成的題目:{{value}},是否確定送出?\",\n \"MSG_THERE_ARE_OPTIONS_NOT_FILLED_OUT\": \"尚有选项未填写!\",\n \"MSG_PLEASE_SELECT_AT_LEAST_ONE_STUDENT\": \"请至少选择一个学员\",\n \"MSG_ERROR_NOT_PUBLISH\": \"此活动尚未发佈或已被删除\",\n \"MSG_ERROR_MESSAGE_CAN_NOT_ENROLL_CAUSE_PASS_RESULT\": \"您已通过此课程,依照课程设定无法再自行报名其他班次,班次资讯如下:
格式:学习活动班次名称(上课日期)
\",\n \"MSG_ERROR_MESSAGE_CAN_ENROLL_WAITLSTED_RESULT\": \"候补中\",\n \"MSG_IS_CONTINUE\": \"确定继续?\",\n \"MSG_YOU_HAVE_REQUIRED_SUBJECT_NOT_YET_ANSWERED\": \"您尚有必填题目:{{value}},尚未作答!!\",\n \"MSG_QUESTION_OPTION_EXCEEDS_WORD_LIMIT\": \"题目:{{value}},选项超出字数限制!!\",\n \"MSG_UNABLE_SEND_REFRESH\": \"如果您无法发送,系统会自动重新整理,请等待一下\",\n \"MSG_PLEASE_RETURN_TO_FILL_IN\": \"请返回填写\",\n \"MSG_QUESTION_FILL_THIS_TO_THE_END\": \"填答到此结束,感谢您的回馈填答到此结束,对此问卷请给予回馈\",\n \"MSG_ERROR_PLAY_BLOCKING\": \"请先完成前一资料夹的课程内容或测验问卷才能继续\",\n \"MSG_YOU_HAVE_COMPLETED_THIS_QUESTIONNAIRE\": \"你已完成此问卷\",\n \"MSG_YOU_HAVE_COMPLETED_THIS_TEST\": \"你已完成此测验\",\n \"MSG_CURRENTLY_NON_VIEWING_TIME\": \"目前非观看时间\",\n \"MSG_NEXT_TEST_DATETIME\": \"下次测验日期为\",\n \"MSG_CAN_NOT_TAKE_LESSONS\": \"无法进行课程\",\n \"MSG_CAN_NOT_TAKE_TEST_QUESTIONNAIRE\": \"无法进行测验问卷\",\n \"MSG_ARE_YOU_SURE_WANT_TO_REPLACE_YOUR_AVATAR\": \"确定要将更换个人头像吗?\",\n \"MSG_ARE_YOU_SURE_WANT_TO_CHANGE_YOUR_PASSWORD\": \"确定要变更密码吗?\",\n \"MSG_CAN_NOT_FIND_THE_LATEST_INFORMATION\": \"无法查到最新资料\",\n \"MSG_DO_YOU_WANT_TO_ADD_MY_FAVORITE\": \"确定要将{{value}}加入我的最爱吗?\",\n \"MSG_DO_YOU_WANT_TO_CANCEL_MY_FAVORITE\": \"确定要将{{value}}取消我的最爱吗?\",\n \"MSG_PLEASE_ENTER_START_DATE\": \"请输入开始日期\",\n \"MSG_PLEASE_ENTER_END_DATE\": \"请输入结束日期\",\n \"MSG_PLEASE_SELECT_AT_LEAST_ONE_COURSE\": \"请至少选择一个课程\",\n \"MSG_THE_START_DATE_CAN_NOT_BE_GREATER_THAN_THE_END_DATE\": \"开始日期不能大于结束日期\",\n \"MSG_PLEASE_SELECT_DEPARTMENT_MEMBER\": \"请选择部门成员\",\n \"MSG_THE_FORM_HAS_NOT_BEEN_COMPLETED_YET_PLEASE_CONFIRM\": \"表单尚未完成,请确认!\",\n \"MSG_UPDATE_PASSWORD_SUCCESS\": \"变更密码成功\",\n \"MSG_ENROLLMENT_APPROVAL_PENDING\": \"等待簽核中\",\n \"MSG_THIS_ACTION_WILL_RELEVANT_STUDY_REPORT\": \"这个动作会取消所有相关的学习报告\",\n \"MSG_ARE_YOU_SURE_WANT_TO_DELETE_DEPUTY_RECORD\": \"确定要删除代理人纪录?\",\n \"MSG_DEPUTY_EFFECTIVE_DATE_CNA_NOT_EMPTY\": \"代理生效日不得为空!\",\n \"MSG_DEPUTY_END_DATE_CNA_NOT_EMPTY\": \"代理结束日不得为空!\",\n \"MSG_DEPUTY_END_DATE_CNA_NOT_BE_EARLIER_THAN_DEPUTY_EFFECTIVE_DATE\": \"代理结束日不能早於代理生效日\",\n \"MSG_PLEASE_SETTING_DEPUTY\": \"请设定代理人\",\n \"MSG_SETTING_DEPUTY_SUCCESSFUL\": \"设定代理人成功\",\n \"MSG_EDIT_DEPUTY_RECORD_SUCCESSFUL\": \"修改代理人纪录成功\",\n \"MSG_NOT_ALLOW_TO_DELETE_OTHER_SETTING\": \"不允许移除其他人的设定\",\n \"MSG_PLEASE_SELECT_AT_LEAST_ONE_TIME_PERIOD\": \"请至少选择一个时段\",\n \"MSG_PLEASE_FILE_IN_THE_REASON_FOR_REJECT\": \"请填入不核准的原因\",\n \"MSG_ERROR_NEED_FINISH_PREREQUISITE_ITEMS\": \"请先完成下列先修项目再报名\",\n \"MSG_SELECT_COURSE_OR_OTHER_NEED\": \"请选择课程或其他需求\",\n \"MSG_SORRY_YOU_ONLY_DELETE_COURSES_FORM_SELF_REQUIRED_WHICH_ARE_STILL_OPEN_FOR_ENROLLMENT\": \"仅能删除自我要求且尚未报名的建议学习项目\",\n \"MSG_SORRY_YOU_CANNOT_DELETE_COURSES_WHICH_YOU_HAVE_ENROLLED_IN\": \"您已报名的课程,无法直接删除\",\n \"MSG_SORRY_YOU_ONLY_DELETE_COURSES_FORM_MANAGER_SUGGEST_WHICH_ARE_STILL_OPEN_FOR_ENROLLMENT\": \"仅能删除主管建议且尚未报名的建议学习项目\",\n \"MSG_SORRY_YOU_CANNOT_DELETE_COURSES_WHICH_EMPLOYEES_HAVE_ENROLLED_IN\": \"同仁已报名的课程,无法直接删除\",\n \"MSG_SORRY_YOU_CAN_ONLY_UPDATE_PLANNED_COMPLETION_DATE_OF_COURSE_FROM_SELF_REQUIRES_AND_MANAGER_SUGGESTION\": \"仅能针对\\\"自我要求/主管建议\\\"课程调整预定完成日期\",\n \"MSG_SORRY_YOU_CAN_ONLY_UPDATE_PLANNED_COMPLETION_DATE_OF_COURSE_FROM_SELF_REQUIRES\": \"仅能针对\\\"自我要求\\\"课程调整预定完成日期\",\n \"MSG_PLEASE_FILL_IN_THE_REASON\": \"请填写理由\",\n \"MSG_THE_SETTING_TIME_DOES_NOT_EXIST_PLEASE_RE_ENTER\": \"设定时间不存在,请重新输入\",\n \"MSG_TIME_PERIOD_N_PARTIALLY_OVERLAPS_PLEASE_RESET\": \"与时段 {{value}} 设定时间部份重叠,请重新设定\",\n \"MSG_SUCCESSFUL_OPERATION\": \"操作成功\",\n \"MSG_FAILED_OPERATION\": \"操作失败\",\n \"MSG_EXTERNAL_TRAINING_APPLY_SUMMIT_CHECK\": \"送出前请再次确认填入资料是否全部正确!! 确定要送出请按\\\"确定\\\"钮. 重新编辑请按\\\"取消\\\"钮.\",\n \"MSG_THE_START_DATE_NEED_TO_EARLIER_THAN_THE_END_DATE\": \"开始时间必须早於结束时间\",\n \"MSG_YOUR_ATTENDANCE_RATE_IS_TOO_LOW_TO_FILL_OUT\": \"您出席率不足,无法进行填写\",\n \"MSG_ENROLLMENT_WAITING_APPROVAL\": \"报名等待簽核中\",\n \"MSG_CLASS_TIME_CONFLICT\": \"此课程与其他已经报名之课程:
{{value}} 的上课时间重叠,因此不能报名!\",\n \"MSG_TIME_IS_OUT\": \"时间已到!\",\n \"MSG_ASSIGN_EXCEED_MAX\": \"你已经选择了{{value1}}个学员。但是只有{{value2}}个学员能够加入此课程/学程,因指定人数超过上限,请重新选择。\",\n \"MSG_CURRENTLY_ON_THE_TEMPORARY_LEARNING_RESOURCES\": \"目前暂无线上学习资源\",\n \"MSG_ERROR_MESSAGE_ENROLL_CAUSE_PASS_RESULT\": \"您已通过此课程,是否继续再自行报名其他班次,班次资讯如下:
格式:学习活动班次名称(上课日期)
\",\n \"MSG_INNERCERT_CANNOT_ENROLL_EXTENDED_SESSION\": \"您无取得过该内部证照, 无法报名展期班次\",\n \"MSG_RESTORE_LAST_TIME_UNFINISHED_FORM\": \"恢复前次未完成填写表单!!\",\n \"MSG_COURSE_DATA_FILE_NEED_RE_CHOOSE\": \"课程资料档案需要重新选取!!\",\n \"MSG_THE_TIME_RANGE_IS_ERROR\": \"时间范围错误\",\n \"MSG_CONFIRM_TO_DELETE\": \"确定删除?\",\n \"MSG_PLEASE_SELECT_AT_LEAST_ONE_ITEM\": \"请至少选择一个项目\",\n \"MSG_BEFORE_YOU_REGISTER_YOU_MUST_FILL_OUT_THE_REGISTRATION_QUESTIONNAIRE_ARE_YOU_SURE_YOU_WANT_TO_CONTINUE\": \"报名课程前必须先填写报名问卷。确定要继续?\",\n \"MSG_YOU_DO_NOT_HAVE_PERMISSION_TO_VIEW_THIS_LEARNING_ACTIVITY\": \"您没有权限观看本学习活动\",\n \"MSG_PLEASE_SELECT_ONE_COURSE\": \"请选择一个课程\",\n \"MSG_PLEASE_SELECT_ONE_COURSE_SESSION\": \"请选择一个班次\",\n \"MSG_THE_APPLICATION_FORM_WAS_UPDATED_SUCCESSFULLY\": \"申请表单修改成功\",\n \"MSG_YOU_HAVE_SUCCESSFULLY_ADDED_EXTERNAL_VENDOR\": \"您已成功新增外训厂商\",\n \"ADDED_EXTERNAL_VENDOR\": \"新增外训厂商\",\n \"PICTURE_OVER_MB_PLEASE_RELOAD\": \"图片档案超过{{value}}mb,请重新上传\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('messageConstantZhCN',messageConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var httpErrorCodeConstant = {\n \"102_TITLE\": \"ERR CONNECTION REFUSED\",\n \"102_CONTENT\": \"未知的错误。\",\n\n \"400_TITLE\": \"Bad Request\",\n \"400_CONTENT\": \"由于包含语法错误,当前请求无法被伺服器理解。除非进行修改,否则用户端不应该重複提交这个请求。\",\n\n \"401_TITLE\": \"Unauthorized\",\n \"401_CONTENT\": \"当前请求需要使用者验证。该响应必须包含一个适用于被请求资源的WWW-Authenticate资讯头用以询问使用者资讯。用户端可以重複提交一个包含恰当的Authorization头资讯的请求。如果当前请求已经包含了Authorization凭证,那麽401响应代表着伺服器验证已经拒绝了那些凭证。如果401响应包含了与前一个响应相同的身分验证询问,且浏览器已经至少尝试了一次验证,那麽浏览器应当向使用者展示响应中包含的实体资讯,因为这个实体资讯中可能包含了相关诊断资讯。\",\n\n \"402_TITLE\": \"Payment Required\",\n \"402_CONTENT\": \"该状态码是为了将来可能的需求而预留的。\",\n\n \"403_TITLE\": \"Forbidden\",\n \"403_CONTENT\": \"伺服器已经理解请求,但是拒绝执行它。与401响应不同的是,身分验证并不能提供任何帮助,而且这个请求也不应该被重複提交。如果这不是一个HEAD请求,而且伺服器希望能够讲清楚为何请求不能被执行,那麽就应该在实体内描述拒绝的原因。当然伺服器也可以返回一个404响应,假如它不希望让用户端获得任何资讯。\",\n\n \"404_TITLE\": \"Not Found\",\n \"404_CONTENT\": \"请求失败,请求所希望得到的资源未被在伺服器上发现。没有资讯能够告诉使用者这个状况到底是暂时的还是永久的。假如伺服器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的位址。404这个状态码被广泛应用于当伺服器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。\",\n\n \"405_TITLE\": \"Method Not Allowed\",\n \"405_CONTENT\": \"请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow头资讯用以表示出当前资源能够接受的请求方法的列表。鉴于PUT,DELETE方法会对伺服器上的资源进行写操作,因而绝大部分的网页伺服器都不支援或者在预设配置下不允许上述请求方法,对于此类请求均会返回405错误。\",\n\n \"406_TITLE\": \"Not Acceptable\",\n \"406_CONTENT\": \"请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。除非这是一个HEAD请求,否则该响应就应当返回一个包含可以让使用者或者浏览器从中选择最合适的实体特性以及位址列表的实体。实体的格式由Content-Type头中定义的媒体类型决定。浏览器可以根据格式及自身能力自行作出最佳选择。但是,规范中并没有定义任何作出此类自动选择的标准。\",\n\n \"407_TITLE\": \"Proxy Authentication Required\",\n \"407_CONTENT\": \"与401响应类似,只不过用户端必须在代理伺服器上进行身分验证。代理伺服器必须返回一个Proxy-Authenticate用以进行身分询问。用户端可以返回一个Proxy-Authorization资讯头用以验证。\",\n\n \"408_TITLE\": \"Request Timeout\",\n \"408_CONTENT\": \"请求超时。用户端没有在伺服器预备等待的时间内完成一个请求的传送。用户端可以随时再次提交这一请求而无需进行任何更改。\",\n\n \"409_TITLE\": \"Conflict\",\n \"409_CONTENT\": \"由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:使用者被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的资讯以便使用者发现冲突的源头。冲突通常发生于对PUT请求的处理中。例如,在採用版本检查的环境下,某次PUT提交的对特定资源的修改请求所附带的版本资讯与之前的某个(第三方)请求向冲突,那麽此时伺服器就应该返回一个409错误,告知使用者请求无法完成。此时,响应实体中很可能会包含两个冲突版本之间的差异比较,以便使用者重新提交归併以后的新版本。\",\n\n \"410_TITLE\": \"Gone\",\n \"410_CONTENT\":\"被请求的资源在伺服器上已经不再可用,而且没有任何已知的转发位址。这样的状况应当被认为是永久性的。如果可能,拥有连结编辑功能的用户端应当在获得使用者许可后删除所有指向这个位址的参照。如果伺服器不知道或者无法确定这个状况是否是永久的,那麽就应该使用404状态码。除非额外说明,否则这个响应是可快取的。\",\n\n \"411_TITLE\": \"Length Required\",\n \"411_CONTENT\":\"伺服器拒绝在没有定义Content-Length头的情况下接受请求。在添加了表明请求讯息体长度的有效Content-Length头之后,用户端可以再次提交该请求。\",\n\n \"412_TITLE\": \"Precondition Failed\",\n \"412_CONTENT\":\"伺服器在验证在请求的头栏位中给出先决条件时,没能满足其中的一个或多个。这个状态码允许用户端在取得资源时在请求的元资讯(请求头栏位资料)中设定先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。\",\n\n \"413_TITLE\": \"Request Entity Too Large\",\n \"413_CONTENT\":\"伺服器拒绝处理当前请求,因为该请求提交的实体资料大小超过了伺服器愿意或者能够处理的范围。此种情况下,伺服器可以关闭连线以免用户端继续传送此请求。如果这个状况是临时的,伺服器应当返回一个Retry-After的响应头,以告知用户端可以在多少时间以后重新尝试。\",\n\n \"414_TITLE\": \"Request-URI Too Long\",\n \"414_CONTENT\":\"请求的URI长度超过了伺服器能够解释的长度,因此伺服器拒绝对该请求提供服务\",\n\n \"415_TITLE\": \"Unsupported Media Type\",\n \"415_CONTENT\":\"对于当前请求的方法和所请求的资源,请求中提交的实体并不是伺服器中所支援的格式,因此请求被拒绝。\",\n\n \"416_TITLE\": \"Requested Range Not Satisfiable\",\n \"416_CONTENT\":\"如果请求中包含了Range请求头,并且Range中指定的任何资料范围都与当前资源的可用范围不重合,同时请求中又没有定义If-Range请求头,那麽伺服器就应当返回416状态码。假如Range使用的是位元组范围,那麽这种情况就是指请求指定的所有资料范围的首位元组位置都超过了当前资源的长度。伺服器也应当在返回416状态码的同时,包含一个Content-Range实体头,用以指明当前资源的长度。这个响应也被禁止使用multipart/byteranges作为其Content-Type。\",\n\n \"417_TITLE\": \"Expectation Failed\",\n \"417_CONTENT\":\"在请求头Expect中指定的预期内容无法被伺服器满足,或者这个伺服器是一个代理伺服器,它有明显的证据证明在当前路由的下一个节点上,Expect的内容无法被满足。\",\n\n \"418_TITLE\": \"I'm a teapot\",\n \"418_CONTENT\":\"本操作码是在1998年作为IETF的传统愚人节笑话, 在RFC 2324 超文字咖啡壶控制协定中定义的,并不需要在真实的HTTP伺服器中定义。当一个控制茶壶的HTCPCP收到BREW或POST指令要求其煮咖啡时应当回传此错误。\",\n\n \"421_TITLE\": \"There are too many connections from your internet address\",\n \"421_CONTENT\":\"从当前用户端所在的IP位址到伺服器的连线数超过了伺服器许可的最大范围。通常,这裡的IP位址指的是从伺服器上看到的用户端位址(比如使用者的闸道器或者代理伺服器位址)。在这种情况下,连线数的计算可能涉及到不止一个终端使用者。\",\n\n \"422_TITLE\": \"Unprocessable Entity\",\n \"422_CONTENT\":\"请求格式正确,但是由于含有语意错误,无法响应。\",\n\n \"423_TITLE\": \"Locked\",\n \"423_CONTENT\":\"当前资源被锁定。\",\n\n \"424_TITLE\": \"Failed Dependency\",\n \"424_CONTENT\":\"由于之前的某个请求发生的错误,导致当前请求失败,例如PROPPATCH。\",\n\n \"425_TITLE\": \"Unordered Collection\",\n \"425_CONTENT\":\"在WebDav Advanced Collections草案中定义,但是未出现在《WebDAV顺序集协定》中。\",\n\n \"426_TITLE\": \"Upgrade Required\",\n \"426_CONTENT\":\"用户端应当切换到TLS/1.0。\",\n\n \"449_TITLE\": \"Retry With\",\n \"449_CONTENT\":\"由微软扩充功能,代表请求应当在执行完适当的操作后进行重试。\",\n\n \"451_TITLE\": \"Unavailable For Legal Reasons\",\n \"451_CONTENT\":\"由IETF核准,代表该存取因法律的要求而被拒绝。\",\n\n\n \"500_TITLE\": \"Internal Server Error\",\n \"500_CONTENT\":\"伺服器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在伺服器的程式码出错时出现。\",\n\n \"501_TITLE\": \"Not Implemented\",\n \"501_CONTENT\":\"伺服器不支援当前请求所需要的某个功能。当伺服器无法识别请求的方法,并且无法支援其对任何资源的请求。\",\n\n \"502_TITLE\": \"Bad Gateway\",\n \"502_CONTENT\":\"作为闸道器或者代理工作的伺服器尝试执行请求时,从上游伺服器接收到无效的响应。\",\n\n \"503_TITLE\": \"Service Unavailable\",\n \"503_CONTENT\":\"由于临时的伺服器维护或者过载,伺服器当前无法处理请求。这个状况是临时的,并且将在一段时间以后取消復原。如果能够预计延迟时间,那麽响应中可以包含一个Retry-After头用以标明这个延迟时间。如果没有给出这个Retry-After资讯,那麽用户端应当以处理500响应的方式处理它。\",\n\n \"504_TITLE\": \"Gateway Timeout\",\n \"504_CONTENT\":\"作为闸道器或者代理工作的伺服器尝试执行请求时,未能及时从上游伺服器(URI标识出的伺服器,例如HTTP、FTP、LDAP)或者辅助伺服器(例如DNS)收到响应。注意:某些代理伺服器在DNS查询超时时会返回400或者500错误。\",\n\n \"505_TITLE\": \"HTTP Version Not Supported\",\n \"505_CONTENT\":\"伺服器不支援,或者拒绝支援在请求中使用的HTTP版本。这暗示着伺服器不能或不愿使用与用户端相同的版本。响应中应当包含一个描述了为何版本不被支援以及伺服器支援哪些协定的实体。\",\n\n \"506_TITLE\": \"Variant Also Negotiates\",\n \"506_CONTENT\":\"由《透明内容协商协定》扩充功能,代表伺服器存在内部配置错误:被请求的协商变元资源被配置为在透明内容协商中使用自己,因此在一个协商处理中不是一个合适的重点。\",\n\n \"507_TITLE\": \"Insufficient Storage\",\n \"507_CONTENT\":\"伺服器无法储存完成请求所必须的内容。这个状况被认为是临时的。\",\n\n \"509_TITLE\": \"Bandwidth Limit Exceeded\",\n \"509_CONTENT\":\"伺服器达到频宽限制。这不是一个官方的状态码,但是仍被广泛使用。\",\n\n \"510_TITLE\": \"Not Extended\",\n \"510_CONTENT\":\"取得资源所需要的策略并没有被满足。\"\n\n };\n angular\n .module('eHRD.modules.language')\n .constant('httpErrorCodeConstantZhCN',httpErrorCodeConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var formValidationConstant = {\n \"THIS_IS_REQUIRED\": \"必填!\",\n \"PLEASE_RE_CHECK_NEW_PASSWORD\": \"请重新确认新密码\",\n \"PLEASE_RE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD\": \"请重新输入您的帐号及密码\",\n \"PLEASE_SELECT_AT_LEAST_ONE_ITEM\": \"请至少选择一项\",\n \"PLEASE_SELECT_AT_LEAST_ONE_MEMBER\": \"请至少选择一个成员\",\n \"PLEASE_SET_AT_LEAST_ONE_TIME_ZONE\": \"请至少设定一个时间区段\",\n \"THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM\": \"尚有表单未填写完成,请重新确认\",\n \"PLEASE_ENTER_A_VALID_URL\": \"请输入有效网址. ex: http://example.com\",\n \"PLEASE_ENTER_A_VALID_DATE\": \"请输入有效日期\",\n \"SET_THE_TIME_PART_OF_OVERLAP_PLEASE_RESET\": \"设定时间部份重叠,请重新设定\",\n \"PLEASE_ENTER_A_VALID_AMOUNT_OF_MONEY\": \"请输入有效金额\",\n \"PLEASE_ENTER_A_VALID_EMAIL\": \"请输入有效电子信箱\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('formValidationConstantZhCN',formValidationConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var actionsConstant = {\n \"FINISH\": \"完成\",\n \"CLOSE\": \"关闭\",\n \"SUBMIT\": \"提交\",\n \"ENTER\": \"确定\",\n \"APPLY\": \"套用\",\n \"CANCEL\": \"取消\",\n \"DELETE\": \"删除\",\n \"SEARCH\": \"搜寻\",\n \"FILTERS\": \"筛选\",\n \"SORT\": \"排序\",\n \"SORT_METHOD\": \"排序方式\",\n \"LOGIN\": \"登入\",\n \"LOGOUT\":\"登出\",\n \"NEXT_STEP\": \"下一步\",\n \"PREVIOUS_STEP\": \"上一步\",\n \"NEXT\": \"下一个\",\n \"PREV\": \"上一个\",\n \"UN_ENROLL\": \"取消报名\",\n \"EXEMPTION\": \"免修\",\n \"LEAVE\": \"请假\",\n \"RETURN\": \"返回\",\n \"FILL_IN\": \"填写\",\n \"ENROLL\": \"报名\",\n \"START_LEARNING\": \"开始学习\",\n \"START_SURVEY\": \"问卷开始\",\n \"START_TEST\": \"测验开始\",\n \"SELECT_ALL\": \"全选\",\n \"SELECT_FILES\": \"选择档案\",\n \"REPLACE_FILES\": \"取代档案\",\n \"UPLOAD_ALL\": \"全部上传\",\n \"DELETE_ALL\": \"全部删除\",\n \"DOWNLOAD_FILE\": \"下载档案\",\n \"SELECT_QUESTION_NUMBER\": \"选择题号\",\n \"RE_TEST_ONCE\": \"再测验一次\",\n \"OPEN_LINK\": \"开启链接\",\n \"ALL_ANNOUNCEMENTS\": \"全部公告\",\n \"PLAY_COURSE\": \"播放课程\",\n \"FILL_IN_TEST_SURVEY\": \"受测/填写问卷\",\n \"CHANGE_LOGIN_PASSWORD\": \"变更登入密码\",\n \"REPLACE\": \"取代\",\n \"READ\": \"阅读\",\n \"RATING\": \"评分\",\n \"DOWNLOAD\": \"下载\",\n \"SHOW_AVERAGE_RATING\": \"显示平均评分\",\n \"HIDDEN_AVERAGE_RATING\": \"隐藏平均评分\",\n \"SUBMIT_RATING\": \"确定评分\",\n \"FORM_VIEW\": \"表单检视\",\n \"VIEW_REPORT\": \"检视报告\",\n \"APPROVAL\": \"核准\",\n \"NO_APPROVAL\": \"不核准\",\n \"APPLY_INFORMATION\":\"申请须知\",\n \"APPLY_ENROLLMENT\": \"申请报名\",\n \"LOGIN_AGAIN\": \"重新登入\",\n \"SELECT\": \"选择\",\n \"REJECT\": \"不核准\",\n \"RESEND\": \"重送\",\n \"EXPAND_PROFILE_DETAIL\": \"展开个人资讯\",\n \"COLLAPSE_PROFILE_DETAIL\": \"收合个人资讯\",\n \"EDIT\": \"编辑\",\n \"VIEW\": \"检视\",\n \"ADD_PERSONAL_ELECTIVE_ITEM\": \"加入个人选修项目\",\n \"ADD_MANAGER_SUGGEST_ITEM\": \"加入主管建议项目\",\n \"UPDATE_ESTIMATED_COMPLETION_DATE\": \"更新预定完成日\",\n \"UPDATE\": \"更新\",\n \"ADD_A_TIME_ZONE\": \"新增时间区段\",\n \"EDIT_A_TIME_ZONE\": \"编辑时间区段\",\n \"DELETE_A_TIME_ZONE\": \"删除时间区段\",\n \"ADD_FILE\": \"新增档案\",\n \"DELETE_FILE\": \"删除档案\",\n \"EXPAND_MORE\": \"展开更多\",\n \"COLLAPSE_MORE\": \"收合更多\",\n \"SELECT_DEPARTMENT\": \"选择部门\",\n \"FORM_EDIT\": \"表单编辑\",\n \"APPLY_APPROVAL\": \"申请簽核\",\n \"CONTINUE_ENROLL\": \"继续报名\",\n \"NEXT_PAGE\": \"下一页\",\n \"PREVIOUS_PAGE\": \"上一页\",\n \"PRINT\": \"列印\",\n \"SEND_APPLY\": \"送出申请\",\n \"ADD_A_TIME\": \"新增时间\",\n \"DELETE_A_TIME\": \"删除时间\",\n \"EXCERT_APPLY_BONUS\": \"申请外部证照合格奖励\",\n \"EXCERT_APPLY_COMPENSATION\": \"申请外部证照考试补助\",\n \"ADD\": \"新增\",\n \"REMOVE\": \"移除\",\n \"SELECT_CLASS\": \"选择班次\",\n \"SELECT_COURSE\": \"选择课程\",\n \"ADD_NEW_CLASS\": \"建立新班次\",\n \"EDIT_CLASS\": \"修改班次\",\n \"SET_REPORT_SCORE\": \"设定报告分数\",\n \"ADD_APPLY_MEMBER\": \"加入申请学员\", \n \"GO_BACK\": \"返回上一层\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('actionsConstantZhCN',actionsConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var systemConstant = {\n \"ONLINE_USER_NO\": \"Online user\",\n \"MANAGER_CENTER\": \"Management center\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('systemConstantEnUS',systemConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var statusConstant = {\n \"PASSED\": \"Pass\",\n \"COMPLETED\": \"Complete\",\n \"INCOMPLETED\": \"Incomplete\",\n \"INCOMPLETE\": \"Incomplete\",\n \"FAILED\": \"Fail\",\n \"NOT AVAILABLE\": \"Incomplete\",\n \"NOT ATTEMPTED\": \"Not yet viewed\",\n \"NOT_ENROLLED\": \"Not enrolled\",\n \"UNENROLLED\": \"Not enrolled\",\n \"UNENROLL\": \"Cancel the enrollment\",\n \"EXEMPTION\":\"Exemption\",\n \"UNPUBLISHED ASSIGNED\": \"Waiting to publish\",\n \"ENROLLMENT APPROVAL PENDING\": \"Waiting\tfor approval\",\n \"INCOMPLETED_STATUS\":\"Incomplete\",\n \"SCO_NON_ATTEMPT\":\"Not yet viewed\",\n \"ENROLLMENT_APPROVAL_PENDING\": \"Waiting for approval\",\n \"STATUS_NOT_AVAILABLE\":\"Incomplete\",\n \"COMPLETED_STATUS\":\"Complete\",\n \"UNPUBLISHED_WAITLISTED\": \"On the waiting list\",\n \"ENROLLMENT_WAITLISTED\":\"On the waiting list\",\n \"LEAVE_APPROVAL_PENDING\": \"The application of ask for leave is waiting for approval.\",\n \"UNPUBLISHED_ASSIGNED\":\"Waiting to publish\",\n \"WAITING_FOR_PROGRAM_PUBLISH\": \"Waiting for the program to be published.\",\n \"WAITING FOR PROGRAM PUBLISH\": \"Waiting for the program to be published.\",\n \"SELFENROLLED\": \"Self-registered\",\n \"ASSIGNED\": \"Assigned\",\n \"EXECUTED\": \"Effective\",\n \"NOT_EXECUTED\": \"Not effective\",\n \"UNKNOW_STATUS\":\"Unknown status\",\n \"CANCEL\": \"Cancel\",\n \"APPROVED\": \"Approved\",\n \"PUBLIC_STATUS_REJECT\": \"Reject\",\n \"PUBLISH_STATUS_REJECT\": \"Reject\",\n \"WAITING_APPROVAL\": \"Waiting for approval\",\n \"NO_APPROVAL\": \"No need to approve\",\n \"APPROVALED\": \"Approved\",\n \"NOT_YET_APPROVAL\": \"Not yet approval\",\n \"APPROVAL_REJECT\": \"Reject\",\n \"EXEMPTION_SUBMIT\": \"Exempt from report\",\n \"NOT_SUBMIT\": \"Not submit\",\n \"SUBMITTED\": \"Submitted\",\n \"NOT_PUBLISHED\": \"Not publish\",\n \"ENROLLED\": \"Enrolled\",\n \"NOT_ENROLLMENT\": \"Not the application time\",\n \"ENROLLMENT_DEADLINE\": \"Over the application deadline\",\n \"ATTENDANCE\": \"Attendance\",\n \"ABSENCE\": \"Absence\",\n \"ABSENT\": \"Absent\",\n \"REJECTED\": \"Rejected\",\n \"LEAVE\": \"Leave\",\n \"LEARNER_ASK_LEAVE\": \"Learner leave on their own\",\n \"ADMINISTRATOR_REGISTER\": \"Administrator register\",\n \"PUBLISHED\": \"published\",\n \"HAVE NOT EXECUTED ENROLLED ASSIGNMENT\": \"Not effective\",\n \"NO_RATING_REQUIRED\": \"No rating required\",\n \"FAIL_CHECK_SESSIONQUOTAFULL\": \"Session is Full\",\n \"FAIL_CHECK_PRIVILEGE\": \"You don't have privilege to enroll\",\n \"FAIL_CHECK_OUT_OF_QUOTA\": \"Full\",\n \"WAITLISTED\": \"Wait list\",\n \"BLOCKED\": \"Blocked\",\n \"NEW\": \"New\",\n \"HOT\": \"Hot\",\n \"FEATURED\": \"Featured\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('statusConstantEnUS',statusConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var messageConstant = {\n \"YOU_HAVE_BEEN_LOGGED_OUT\":\"Logout successfully.\",\n \"YOU_HAVE_SUCCESSFULLY_SIGNED_IN\":\"Login successfully.\",\n \"MSG_TAKES_TIME_ACTION\": \"Since the system will process the requirement in the background, the adjustment may not display immediately.\",\n \"MSG_IS_SURE_ENROLL\": \"Continue to enroll?\",\n \"MSG_IS_SURE_UN_ENROLL\": \"Are your sure to cancel the enrollment?\",\n \"MSG_IS_SURE_TO_PAY\": \"Submit?\",\n \"MSG_NOT_YET_COMPLETED_WHETHER_TO_SEND_OUT\": \"Not yet completed:{{value}}, whether to send out?\",\n \"MSG_THERE_ARE_OPTIONS_NOT_FILLED_OUT\": \"Some items are not filled in!\",\n \"MSG_PLEASE_SELECT_AT_LEAST_ONE_STUDENT\": \"Please select at least one learner.\",\n \"MSG_ERROR_NOT_PUBLISH\": \"The activity is not published or is be deleted.\",\n \"MSG_ERROR_MESSAGE_CAN_NOT_ENROLL_CAUSE_PASS_RESULT\": \"According to the rules, you cannot enroll any other classes because you have passed the course.\",\n\t \"MSG_ERROR_MESSAGE_CAN_ENROLL_WAITLSTED_RESULT\": \"Waitlisted\",\n \"MSG_IS_CONTINUE\": \"Continue?\",\n \"MSG_YOU_HAVE_REQUIRED_SUBJECT_NOT_YET_ANSWERED\": \"Required items:{{value}},are not filled.\",\n \"MSG_QUESTION_OPTION_EXCEEDS_WORD_LIMIT\": \"Item:{{value}},exceeds the character count limit.\",\n \"MSG_UNABLE_SEND_REFRESH\": \"If you can't send it, it will be refreshed automatically, please wait.\",\n \"MSG_PLEASE_RETURN_TO_FILL_IN\": \"Return.\",\n \"MSG_QUESTION_FILL_THIS_TO_THE_END\": \"Thanks for the feedback.\",\n \"MSG_ERROR_PLAY_BLOCKING\": \"Please finish the previous content, test, or questionnaire.\",\n \"MSG_YOU_HAVE_COMPLETED_THIS_QUESTIONNAIRE\": \"Finish the questionnaire.\",\n \"MSG_YOU_HAVE_COMPLETED_THIS_TEST\": \"Finish the test.\",\n \"MSG_CURRENTLY_NON_VIEWING_TIME\": \"Not the allowed viewing time.\",\n \"MSG_NEXT_TEST_DATETIME\": \"The date & time of the next test\",\n \"MSG_CAN_NOT_TAKE_LESSONS\": \"Can't view the content.\",\n \"MSG_CAN_NOT_TAKE_TEST_QUESTIONNAIRE\": \"Can't take the test or questionnaire.\",\n \"MSG_ARE_YOU_SURE_WANT_TO_REPLACE_YOUR_AVATAR\": \"Change the photo?\",\n \"MSG_ARE_YOU_SURE_WANT_TO_CHANGE_YOUR_PASSWORD\": \"Are you sure to change the password?\",\n \"MSG_CAN_NOT_FIND_THE_LATEST_INFORMATION\": \"Can't find out the latest information.\",\n \"MSG_DO_YOU_WANT_TO_ADD_MY_FAVORITE\": \"Put{{value}}in My Favourites?\",\n \"MSG_DO_YOU_WANT_TO_CANCEL_MY_FAVORITE\": \"Remove{{value}}from My Favourites?\",\n \"MSG_PLEASE_ENTER_START_DATE\": \"Input the start date.\",\n \"MSG_PLEASE_ENTER_END_DATE\": \"Input the end date.\",\n \"MSG_PLEASE_SELECT_AT_LEAST_ONE_COURSE\": \"Please select at least one course.\",\n \"MSG_THE_START_DATE_CAN_NOT_BE_GREATER_THAN_THE_END_DATE\": \"The end date can not earlier than start date.\",\n \"MSG_PLEASE_SELECT_DEPARTMENT_MEMBER\": \"Please select the department member.\",\n \"MSG_THE_FORM_HAS_NOT_BEEN_COMPLETED_YET_PLEASE_CONFIRM\": \"Please fill in the form.\",\n \"MSG_UPDATE_PASSWORD_SUCCESS\": \"Change the password successfully.\",\n \"MSG_ENROLLMENT_APPROVAL_PENDING\": \"Waiting for approval.\",\n \"MSG_THIS_ACTION_WILL_RELEVANT_STUDY_REPORT\": \"This action will relevant study report\",\n \"MSG_ARE_YOU_SURE_WANT_TO_DELETE_DEPUTY_RECORD\": \"Are you sure want to delete deputy record?\",\n \"MSG_DEPUTY_EFFECTIVE_DATE_CNA_NOT_EMPTY\": \"Deputy effective date can not empty!\",\n \"MSG_DEPUTY_END_DATE_CNA_NOT_EMPTY\": \"Deputy end date can not empty!\",\n \"MSG_DEPUTY_END_DATE_CNA_NOT_BE_EARLIER_THAN_DEPUTY_EFFECTIVE_DATE\": \"Deputy end date can not be earlier than deputy effective date\",\n \"MSG_PLEASE_SETTING_DEPUTY\": \"Please setting deputy\",\n \"MSG_SETTING_DEPUTY_SUCCESSFUL\": \"Setting deputy successful\",\n \"MSG_EDIT_DEPUTY_RECORD_SUCCESSFUL\": \"Edit deputy record successful\",\n \"MSG_NOT_ALLOW_TO_DELETE_OTHER_SETTING\": \"Can't allow to delete other setting\",\n \"MSG_PLEASE_SELECT_AT_LEAST_ONE_TIME_PERIOD\": \"Please select at least the time period\",\n \"MSG_PLEASE_FILE_IN_THE_REASON_FOR_REJECT\": \"Please fill in the reason for reject\",\n \"MSG_ERROR_NEED_FINISH_PREREQUISITE_ITEMS\": \"Please complete the following prerequisites before applying\",\n \"MSG_SELECT_COURSE_OR_OTHER_NEED\": \"Select course or other requirement\",\n \"MSG_SORRY_YOU_ONLY_DELETE_COURSES_FORM_SELF_REQUIRED_WHICH_ARE_STILL_OPEN_FOR_ENROLLMENT\": \"Sorry,you can only delete courses from Self-Required which are still open for enrollment.\",\n \"MSG_SORRY_YOU_CANNOT_DELETE_COURSES_WHICH_YOU_HAVE_ENROLLED_IN\": \"Sorry,you cannot delete courses which you have enrolled in.\",\n \"MSG_SORRY_YOU_ONLY_DELETE_COURSES_FORM_MANAGER_SUGGEST_WHICH_ARE_STILL_OPEN_FOR_ENROLLMENT\": \"Sorry,you can only delete courses from Manager's suggestions which are still open for enrollment.\",\n \"MSG_SORRY_YOU_CANNOT_DELETE_COURSES_WHICH_EMPLOYEES_HAVE_ENROLLED_IN\": \"Sorry,you cannot delete courses which employees have enrolled in.\",\n \"MSG_SORRY_YOU_CAN_ONLY_UPDATE_PLANNED_COMPLETION_DATE_OF_COURSE_FROM_SELF_REQUIRES_AND_MANAGER_SUGGESTION\": \"Sorry,you can only update planned completion date(s) of courses from Self Requires and Manager's suggestion\",\n \"MSG_SORRY_YOU_CAN_ONLY_UPDATE_PLANNED_COMPLETION_DATE_OF_COURSE_FROM_SELF_REQUIRES\": \"Sorry,you can only update planned completion date(s) of courses from Self Requires\",\n \"MSG_PLEASE_FILL_IN_THE_REASON\": \"Please fill in the reason\",\n \"MSG_THE_SETTING_TIME_DOES_NOT_EXIST_PLEASE_RE_ENTER\": \"The setting time does not exist, please re-enter\",\n \"MSG_TIME_PERIOD_N_PARTIALLY_OVERLAPS_PLEASE_RESET\": \"Time period {{value}} partially overlaps, please reset\",\n \"MSG_SUCCESSFUL_OPERATION\": \"Operation succeeded\",\n \"MSG_FAILED_OPERATION\": \"Operation failed\",\n \"MSG_EXTERNAL_TRAINING_APPLY_SUMMIT_CHECK\": \"Re-confirm data before sending!! To confirm sending please press Ok, and Cancel to edit.\",\n \"MSG_THE_START_DATE_NEED_TO_EARLIER_THAN_THE_END_DATE\": \"The end date can not earlier than start date.\",\n \"MSG_YOUR_ATTENDANCE_RATE_IS_TOO_LOW_TO_FILL_OUT\": \"Your attendance rate is too low to fill out.\",\n \"MSG_ENROLLMENT_WAITING_APPROVAL\": \"Enrollment pending approval\",\n \"MSG_CLASS_TIME_CONFLICT\": \"This class time conflicts with other enrolled courses:
{{value}} and hence can not enroll in this class!\",\n \"MSG_TIME_IS_OUT\": \"Time is out!\",\n \"MSG_ASSIGN_EXCEED_MAX\": \"You have selected{{value1}}learners. But only {{value2}} learners can join in the course/curriculum. Since there is no enough quota. Please re-select.\",\n \"MSG_CURRENTLY_ON_THE_TEMPORARY_LEARNING_RESOURCES\": \"Currently on the temporary learning resources\",\n \"MSG_ERROR_MESSAGE_ENROLL_CAUSE_PASS_RESULT\": \"You have passed this course. Do you want to enroll in other classes? The classes are:
Format: Class name(class time)
\",\n \"MSG_INNERCERT_CANNOT_ENROLL_EXTENDED_SESSION\": \"Cannot enroll in this extended session because you have not yet got this internal certificate.\",\n \"MSG_RESTORE_LAST_TIME_UNFINISHED_FORM\": \"Restore last time unfinished form!!\",\n \"MSG_COURSE_DATA_FILE_NEED_RE_CHOOSE\": \"Course data file need re choose!!\",\n \"MSG_THE_TIME_RANGE_IS_ERROR\": \"The time range is error\",\n \"MSG_CONFIRM_TO_DELETE\": \"Confirm to delete?\",\n \"MSG_PLEASE_SELECT_AT_LEAST_ONE_ITEM\": \"Please select at least one item.\",\n \"MSG_BEFORE_YOU_REGISTER_YOU_MUST_FILL_OUT_THE_REGISTRATION_QUESTIONNAIRE_ARE_YOU_SURE_YOU_WANT_TO_CONTINUE\": \"Before you register, you must fill out the registration questionnaire. Are you sure you want to continue?\",\n \"MSG_YOU_DO_NOT_HAVE_PERMISSION_TO_VIEW_THIS_LEARNING_ACTIVITY\": \"You don't have permission to view this learning activity\",\n \"MSG_PLEASE_SELECT_ONE_COURSE\": \"Please select one course.\",\n \"MSG_PLEASE_SELECT_ONE_COURSE_SESSION\": \"Please select one session\",\n \"MSG_THE_APPLICATION_FORM_WAS_UPDATED_SUCCESSFULLY\": \"The application form was updated successfully\",\n \"MSG_YOU_HAVE_SUCCESSFULLY_ADDED_EXTERNAL_VENDOR\": \"You have successfully added external vendor\",\n \"ADDED_EXTERNAL_VENDOR\": \"Added External vendor\",\n \"PICTURE_OVER_MB_PLEASE_RELOAD\": \"Picture over {{value}}mb, please reload.\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('messageConstantEnUS',messageConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var httpErrorCodeConstant = {\n \"102_TITLE\": \"ERR CONNECTION REFUSED\",\n \"102_CONTENT\": \"未知的錯誤。\",\n\n \"400_TITLE\": \"Bad Request\",\n \"400_CONTENT\": \"由於包含語法錯誤,當前請求無法被伺服器理解。除非進行修改,否則用戶端不應該重複提交這個請求。\",\n\n \"401_TITLE\": \"Unauthorized\",\n \"401_CONTENT\": \"當前請求需要使用者驗證。該響應必須包含一個適用於被請求資源的WWW-Authenticate資訊頭用以詢問使用者資訊。用戶端可以重複提交一個包含恰當的Authorization頭資訊的請求。如果當前請求已經包含了Authorization憑證,那麼401響應代表著伺服器驗證已經拒絕了那些憑證。如果401響應包含了與前一個響應相同的身分驗證詢問,且瀏覽器已經至少嘗試了一次驗證,那麼瀏覽器應當向使用者展示響應中包含的實體資訊,因為這個實體資訊中可能包含了相關診斷資訊。\",\n\n \"402_TITLE\": \"Payment Required\",\n \"402_CONTENT\": \"該狀態碼是為了將來可能的需求而預留的。\",\n\n \"403_TITLE\": \"Forbidden\",\n \"403_CONTENT\": \"伺服器已經理解請求,但是拒絕執行它。與401響應不同的是,身分驗證並不能提供任何幫助,而且這個請求也不應該被重複提交。如果這不是一個HEAD請求,而且伺服器希望能夠講清楚為何請求不能被執行,那麼就應該在實體內描述拒絕的原因。當然伺服器也可以返回一個404響應,假如它不希望讓用戶端獲得任何資訊。\",\n\n \"404_TITLE\": \"Not Found\",\n \"404_CONTENT\": \"請求失敗,請求所希望得到的資源未被在伺服器上發現。沒有資訊能夠告訴使用者這個狀況到底是暫時的還是永久的。假如伺服器知道情況的話,應當使用410狀態碼來告知舊資源因為某些內部的配置機制問題,已經永久的不可用,而且沒有任何可以跳轉的位址。404這個狀態碼被廣泛應用於當伺服器不想揭示到底為何請求被拒絕或者沒有其他適合的響應可用的情況下。\",\n\n \"405_TITLE\": \"Method Not Allowed\",\n \"405_CONTENT\": \"請求行中指定的請求方法不能被用於請求相應的資源。該響應必須返回一個Allow頭資訊用以表示出當前資源能夠接受的請求方法的列表。鑒於PUT,DELETE方法會對伺服器上的資源進行寫操作,因而絕大部分的網頁伺服器都不支援或者在預設配置下不允許上述請求方法,對於此類請求均會返回405錯誤。\",\n\n \"406_TITLE\": \"Not Acceptable\",\n \"406_CONTENT\": \"請求的資源的內容特性無法滿足請求頭中的條件,因而無法生成響應實體。除非這是一個HEAD請求,否則該響應就應當返回一個包含可以讓使用者或者瀏覽器從中選擇最合適的實體特性以及位址列表的實體。實體的格式由Content-Type頭中定義的媒體類型決定。瀏覽器可以根據格式及自身能力自行作出最佳選擇。但是,規範中並沒有定義任何作出此類自動選擇的標準。\",\n\n \"407_TITLE\": \"Proxy Authentication Required\",\n \"407_CONTENT\": \"與401響應類似,只不過用戶端必須在代理伺服器上進行身分驗證。代理伺服器必須返回一個Proxy-Authenticate用以進行身分詢問。用戶端可以返回一個Proxy-Authorization資訊頭用以驗證。\",\n\n \"408_TITLE\": \"Request Timeout\",\n \"408_CONTENT\": \"請求超時。用戶端沒有在伺服器預備等待的時間內完成一個請求的傳送。用戶端可以隨時再次提交這一請求而無需進行任何更改。\",\n\n \"409_TITLE\": \"Conflict\",\n \"409_CONTENT\": \"由於和被請求的資源的當前狀態之間存在衝突,請求無法完成。這個代碼只允許用在這樣的情況下才能被使用:使用者被認為能夠解決衝突,並且會重新提交新的請求。該響應應當包含足夠的資訊以便使用者發現衝突的源頭。衝突通常發生於對PUT請求的處理中。例如,在採用版本檢查的環境下,某次PUT提交的對特定資源的修改請求所附帶的版本資訊與之前的某個(第三方)請求向衝突,那麼此時伺服器就應該返回一個409錯誤,告知使用者請求無法完成。此時,響應實體中很可能會包含兩個衝突版本之間的差異比較,以便使用者重新提交歸併以後的新版本。\",\n\n \"410_TITLE\": \"Gone\",\n \"410_CONTENT\":\"被請求的資源在伺服器上已經不再可用,而且沒有任何已知的轉發位址。這樣的狀況應當被認為是永久性的。如果可能,擁有連結編輯功能的用戶端應當在獲得使用者許可後刪除所有指向這個位址的參照。如果伺服器不知道或者無法確定這個狀況是否是永久的,那麼就應該使用404狀態碼。除非額外說明,否則這個響應是可快取的。\",\n\n \"411_TITLE\": \"Length Required\",\n \"411_CONTENT\":\"伺服器拒絕在沒有定義Content-Length頭的情況下接受請求。在添加了表明請求訊息體長度的有效Content-Length頭之後,用戶端可以再次提交該請求。\",\n\n \"412_TITLE\": \"Precondition Failed\",\n \"412_CONTENT\":\"伺服器在驗證在請求的頭欄位中給出先決條件時,沒能滿足其中的一個或多個。這個狀態碼允許用戶端在取得資源時在請求的元資訊(請求頭欄位資料)中設定先決條件,以此避免該請求方法被應用到其希望的內容以外的資源上。\",\n\n \"413_TITLE\": \"Request Entity Too Large\",\n \"413_CONTENT\":\"伺服器拒絕處理當前請求,因為該請求提交的實體資料大小超過了伺服器願意或者能夠處理的範圍。此種情況下,伺服器可以關閉連線以免用戶端繼續傳送此請求。如果這個狀況是臨時的,伺服器應當返回一個Retry-After的響應頭,以告知用戶端可以在多少時間以後重新嘗試。\",\n\n \"414_TITLE\": \"Request-URI Too Long\",\n \"414_CONTENT\":\"請求的URI長度超過了伺服器能夠解釋的長度,因此伺服器拒絕對該請求提供服務\",\n\n \"415_TITLE\": \"Unsupported Media Type\",\n \"415_CONTENT\":\"對於當前請求的方法和所請求的資源,請求中提交的實體並不是伺服器中所支援的格式,因此請求被拒絕。\",\n\n \"416_TITLE\": \"Requested Range Not Satisfiable\",\n \"416_CONTENT\":\"如果請求中包含了Range請求頭,並且Range中指定的任何資料範圍都與當前資源的可用範圍不重合,同時請求中又沒有定義If-Range請求頭,那麼伺服器就應當返回416狀態碼。假如Range使用的是位元組範圍,那麼這種情況就是指請求指定的所有資料範圍的首位元組位置都超過了當前資源的長度。伺服器也應當在返回416狀態碼的同時,包含一個Content-Range實體頭,用以指明當前資源的長度。這個響應也被禁止使用multipart/byteranges作為其Content-Type。\",\n\n \"417_TITLE\": \"Expectation Failed\",\n \"417_CONTENT\":\"在請求頭Expect中指定的預期內容無法被伺服器滿足,或者這個伺服器是一個代理伺服器,它有明顯的證據證明在當前路由的下一個節點上,Expect的內容無法被滿足。\",\n\n \"418_TITLE\": \"I'm a teapot\",\n \"418_CONTENT\":\"本操作碼是在1998年作為IETF的傳統愚人節笑話, 在RFC 2324 超文字咖啡壺控制協定中定義的,並不需要在真實的HTTP伺服器中定義。當一個控制茶壺的HTCPCP收到BREW或POST指令要求其煮咖啡時應當回傳此錯誤。\",\n\n \"421_TITLE\": \"There are too many connections from your internet address\",\n \"421_CONTENT\":\"從當前用戶端所在的IP位址到伺服器的連線數超過了伺服器許可的最大範圍。通常,這裡的IP位址指的是從伺服器上看到的用戶端位址(比如使用者的閘道器或者代理伺服器位址)。在這種情況下,連線數的計算可能涉及到不止一個終端使用者。\",\n\n \"422_TITLE\": \"Unprocessable Entity\",\n \"422_CONTENT\":\"請求格式正確,但是由於含有語意錯誤,無法響應。\",\n\n \"423_TITLE\": \"Locked\",\n \"423_CONTENT\":\"當前資源被鎖定。\",\n\n \"424_TITLE\": \"Failed Dependency\",\n \"424_CONTENT\":\"由於之前的某個請求發生的錯誤,導致當前請求失敗,例如PROPPATCH。\",\n\n \"425_TITLE\": \"Unordered Collection\",\n \"425_CONTENT\":\"在WebDav Advanced Collections草案中定義,但是未出現在《WebDAV順序集協定》中。\",\n\n \"426_TITLE\": \"Upgrade Required\",\n \"426_CONTENT\":\"用戶端應當切換到TLS/1.0。\",\n\n \"449_TITLE\": \"Retry With\",\n \"449_CONTENT\":\"由微軟擴充功能,代表請求應當在執行完適當的操作後進行重試。\",\n\n \"451_TITLE\": \"Unavailable For Legal Reasons\",\n \"451_CONTENT\":\"由IETF核准,代表該存取因法律的要求而被拒絕。\",\n\n\n \"500_TITLE\": \"Internal Server Error\",\n \"500_CONTENT\":\"伺服器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在伺服器的程式碼出錯時出現。\",\n\n \"501_TITLE\": \"Not Implemented\",\n \"501_CONTENT\":\"伺服器不支援當前請求所需要的某個功能。當伺服器無法識別請求的方法,並且無法支援其對任何資源的請求。\",\n\n \"502_TITLE\": \"Bad Gateway\",\n \"502_CONTENT\":\"作為閘道器或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的響應。\",\n\n \"503_TITLE\": \"Service Unavailable\",\n \"503_CONTENT\":\"由於臨時的伺服器維護或者過載,伺服器當前無法處理請求。這個狀況是臨時的,並且將在一段時間以後取消復原。如果能夠預計延遲時間,那麼響應中可以包含一個Retry-After頭用以標明這個延遲時間。如果沒有給出這個Retry-After資訊,那麼用戶端應當以處理500響應的方式處理它。\",\n\n \"504_TITLE\": \"Gateway Timeout\",\n \"504_CONTENT\":\"作為閘道器或者代理工作的伺服器嘗試執行請求時,未能及時從上游伺服器(URI標識出的伺服器,例如HTTP、FTP、LDAP)或者輔助伺服器(例如DNS)收到響應。注意:某些代理伺服器在DNS查詢超時時會返回400或者500錯誤。\",\n\n \"505_TITLE\": \"HTTP Version Not Supported\",\n \"505_CONTENT\":\"伺服器不支援,或者拒絕支援在請求中使用的HTTP版本。這暗示著伺服器不能或不願使用與用戶端相同的版本。響應中應當包含一個描述了為何版本不被支援以及伺服器支援哪些協定的實體。\",\n\n \"506_TITLE\": \"Variant Also Negotiates\",\n \"506_CONTENT\":\"由《透明內容協商協定》擴充功能,代表伺服器存在內部配置錯誤:被請求的協商變元資源被配置為在透明內容協商中使用自己,因此在一個協商處理中不是一個合適的重點。\",\n\n \"507_TITLE\": \"Insufficient Storage\",\n \"507_CONTENT\":\"伺服器無法儲存完成請求所必須的內容。這個狀況被認為是臨時的。\",\n\n \"509_TITLE\": \"Bandwidth Limit Exceeded\",\n \"509_CONTENT\":\"伺服器達到頻寬限制。這不是一個官方的狀態碼,但是仍被廣泛使用。\",\n\n \"510_TITLE\": \"Not Extended\",\n \"510_CONTENT\":\"取得資源所需要的策略並沒有被滿足。\"\n\n };\n angular\n .module('eHRD.modules.language')\n .constant('httpErrorCodeConstantEnUS',httpErrorCodeConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var formValidationConstant = {\n \"THIS_IS_REQUIRED\": \"Required\",\n \"PLEASE_RE_CHECK_NEW_PASSWORD\": \"Please confirm the new password.\",\n \"PLEASE_RE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD\": \"Please re-enter the account and password.\",\n \"PLEASE_SELECT_AT_LEAST_ONE_ITEM\": \"Please select at least one item\",\n \"PLEASE_SELECT_AT_LEAST_ONE_MEMBER\": \"Please select at least one member\",\n \"PLEASE_SET_AT_LEAST_ONE_TIME_ZONE\": \"Please set at least one time span\",\n \"THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM\": \"There is no form completed, please re-confirm\",\n \"PLEASE_ENTER_A_VALID_URL\": \"Please Enter a valid url. ex:http://example.com\",\n \"PLEASE_ENTER_A_VALID_DATE\": \"Please enter a valid date\",\n \"SET_THE_TIME_PART_OF_OVERLAP_PLEASE_RESET\": \"The setting-time part of overlap, Please Reset\",\n \"PLEASE_ENTER_A_VALID_AMOUNT_OF_MONEY\": \"Please enter a valid amount of money\",\n \"PLEASE_ENTER_A_VALID_EMAIL\": \"Please enter a valid email\"\n\n };\n angular\n .module('eHRD.modules.language')\n .constant('formValidationConstantEnUS',formValidationConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var actionsConstant = {\n \"FINISH\": \"Finish\",\n \"CLOSE\": \"Close\",\n \"SUBMIT\": \"Submit\",\n \"ENTER\": \"Enter\",\n \"APPLY\": \"Apply\",\n \"CANCEL\": \"Cancel\",\n \"DELETE\": \"Delete\",\n \"SEARCH\": \"Search\",\n \"FILTERS\": \"Filter\",\n \"SORT\": \"Sort\",\n \"SORT_METHOD\": \"Sort method\",\n \"LOGIN\": \"Login\",\n \"LOGOUT\":\"Logout\",\n \"NEXT_STEP\": \"Next\",\n \"PREVIOUS_STEP\": \"Back\",\n \"NEXT\": \"Next\",\n \"PREV\": \"Back\",\n \"UN_ENROLL\": \"Cancel the enrollment\",\n \"EXEMPTION\": \"Exemption\",\n \"LEAVE\": \"Ask for leave\",\n \"RETURN\": \"Return\",\n \"FILL_IN\": \"Fill in\",\n \"ENROLL\": \"Enroll\",\n \"START_LEARNING\": \"Start to learn\",\n \"START_SURVEY\": \"Start\",\n \"START_TEST\": \"Start\",\n \"SELECT_ALL\": \"All\",\n \"SELECT_FILES\": \"Select files\",\n \"REPLACE_FILES\": \"Replace files\",\n \"UPLOAD_ALL\": \"Upload\",\n \"DELETE_ALL\": \"Delete\",\n \"DOWNLOAD_FILE\": \"Download\",\n \"SELECT_QUESTION_NUMBER\": \"Select item\",\n \"RE_TEST_ONCE\": \"Retest\",\n \"OPEN_LINK\": \"Open link\",\n \"ALL_ANNOUNCEMENTS\": \"Announce\",\n \"PLAY_COURSE\": \"Play\",\n \"FILL_IN_TEST_SURVEY\": \"Test/Fill in the survey\",\n \"CHANGE_LOGIN_PASSWORD\": \"Change the password\",\n \"REPLACE\": \"Replace\",\n \"READ\": \"Read\",\n \"RATING\": \"Rate\",\n \"DOWNLOAD\": \"Download\",\n \"SHOW_AVERAGE_RATING\": \"Display the average score\",\n \"HIDDEN_AVERAGE_RATING\": \"Hide the average score\",\n \"SUBMIT_RATING\": \"Submit\",\n \"FORM_VIEW\": \"Check\",\n \"VIEW_REPORT\": \"Check the report\",\n \"APPROVAL\": \"Approve\",\n \"NO_APPROVAL\": \"Reject\",\n \"APPLY_INFORMATION\":\"Application guidelines\",\n \"APPLY_ENROLLMENT\": \"Apply for enrollment\",\n \"LOGIN_AGAIN\": \"Login again\",\n \"SELECT\": \"Select\",\n \"REJECT\": \"Reject\",\n \"RESEND\": \"Resend\",\n \"EXPAND_PROFILE_DETAIL\": \"Expand profile detail\",\n \"COLLAPSE_PROFILE_DETAIL\": \"Collapse profile detail\",\n \"EDIT\": \"Edit\",\n \"VIEW\": \"View\",\n \"ADD_PERSONAL_ELECTIVE_ITEM\": \"Add personal elective item\",\n \"ADD_MANAGER_SUGGEST_ITEM\": \"Add manger suggest item\",\n \"UPDATE_ESTIMATED_COMPLETION_DATE\": \"Update estimated completion date\",\n \"UPDATE\": \"Update\",\n \"ADD_A_TIME_ZONE\": \"Add Time Span\",\n \"EDIT_A_TIME_ZONE\": \"Edit Time Span\",\n \"DELETE_A_TIME_ZONE\": \"Delete Time Span\",\n \"ADD_FILE\": \"Add File\",\n \"DELETE_FILE\": \"Delete File\",\n \"EXPAND_MORE\": \"Expand more\",\n \"COLLAPSE_MORE\": \"Collapse more\",\n \"SELECT_DEPARTMENT\": \"Select Dept.\",\n \"FORM_EDIT\": \"Form Edit\",\n \"APPLY_APPROVAL\": \"Apply approval\",\n \"CONTINUE_ENROLL\": \"Continue to enroll\",\n \"NEXT_PAGE\": \"Next Page\",\n \"PREVIOUS_PAGE\": \"Previous Page\",\n \"PRINT\": \"Print\",\n \"SEND_APPLY\": \"Send apply\",\n \"ADD_A_TIME\": \"Add Time\",\n \"DELETE_A_TIME\": \"Delete Time\",\n \"EXCERT_APPLY_BONUS\": \"Apply for external certification reward\",\n \"EXCERT_APPLY_COMPENSATION\": \"Apply for external certificate subsidy\",\n \"ADD\": \"Add\",\n \"REMOVE\": \"Remove\",\n \"SELECT_CLASS\": \"Select Class\",\n \"SELECT_COURSE\": \"Select Course\",\n \"ADD_NEW_CLASS\": \"Add New Class\",\n \"EDIT_CLASS\": \"Edit Class\",\n \"SET_REPORT_SCORE\": \"Set report score\",\n \"ADD_APPLY_MEMBER\": \"Add apply member\",\n \"GO_BACK\": \"go back\"\n };\n angular\n .module('eHRD.modules.language')\n .constant('actionsConstantEnUS',actionsConstant);\n\n})();\n\n/**\n * Created by Bruce on 2016/7/1.\n */\n\n(function () {\n 'use strict';\n angular.module('eHRD.kernel.uiElements.wizard',[]);\n})();\n\n/**\n * Created by Bruce on 2016/7/13.\n */\n(function () {\n 'use strict';\n\n function wizardHandler() {\n var service = {};\n\n var wizards = {};\n\n service.defaultName = \"defaultWizard\";\n\n service.addWizard = function(name, wizard) {\n wizards[name] = wizard;\n };\n\n service.removeWizard = function(name) {\n delete wizards[name];\n };\n\n service.wizard = function(name) {\n var nameToUse = name;\n if (!name) {\n nameToUse = service.defaultName;\n }\n\n return wizards[nameToUse];\n };\n\n return service;\n }\n\n angular.module('eHRD.kernel.uiElements.wizard')\n .factory('WizardHandler', wizardHandler);\n\n})();\n\n/**\n * Created by Bruce on 2016/7/1.\n */\n\n(function () {\n 'use strict';\n\n function wizard() {\n var directive = {\n restrict: 'EA',\n replace: true,\n transclude: true,\n scope: {\n currentStep: '=',\n onFinish: '&',\n hideIndicators: '=',\n editMode: '=',\n name: '@'\n },\n templateUrl: function(element, attributes) {\n return attributes.template || \"app/kernel/ui-elements/wizard/views/wizard.html\";\n },\n\n //controller for wizard directive, treat this just like an angular controller\n controller: ['$scope', '$element', '$log', 'WizardHandler', '$q', function($scope, $element, $log, WizardHandler, $q) {\n //this variable allows directive to load without having to pass any step validation\n var firstRun = true;\n //creating instance of wizard, passing this as second argument allows access to functions attached to this via Service\n WizardHandler.addWizard($scope.name || WizardHandler.defaultName, this);\n\n $scope.$on('$destroy', function() {\n WizardHandler.removeWizard($scope.name || WizardHandler.defaultName);\n });\n\n //steps array where all the scopes of each step are added\n $scope.steps = [];\n\n var stepIdx = function(step) {\n var idx = 0;\n var res = -1;\n angular.forEach($scope.getEnabledSteps(), function(currStep) {\n if (currStep === step) {\n res = idx;\n }\n idx++;\n });\n return res;\n };\n\n var stepByTitle = function(titleToFind) {\n var foundStep = null;\n angular.forEach($scope.getEnabledSteps(), function(step) {\n if (step.wzTitle === titleToFind) {\n foundStep = step;\n }\n });\n return foundStep;\n };\n\n //access to context object for step validation\n $scope.context = {};\n\n //watching changes to currentStep\n $scope.$watch('currentStep', function(step) {\n //checking to make sure currentStep is truthy value\n if (!step) return;\n //setting stepTitle equal to current step title or default title\n var stepTitle = $scope.selectedStep.wzTitle;\n if ($scope.selectedStep && stepTitle !== $scope.currentStep) {\n //invoking goTo() with step title as argument\n $scope.goTo(stepByTitle($scope.currentStep));\n }\n\n });\n\n //watching steps array length and editMode value, if edit module is undefined or null the nothing is done\n //if edit mode is truthy, then all steps are marked as completed\n $scope.$watch('[editMode, steps.length]', function() {\n var editMode = $scope.editMode;\n if (angular.isUndefined(editMode) || (editMode === null)) return;\n\n if (editMode) {\n angular.forEach($scope.getEnabledSteps(), function(step) {\n step.completed = true;\n });\n } else {\n var completedStepsIndex = $scope.currentStepNumber() - 1;\n angular.forEach($scope.getEnabledSteps(), function(step, stepIndex) {\n if(stepIndex >= completedStepsIndex) {\n step.completed = false;\n }\n });\n }\n }, true);\n\n //called each time step directive is loaded\n this.addStep = function(step) {\n //pushing the scope of directive onto step array\n $scope.steps.push(step);\n //if this is first step being pushed then goTo that first step\n if ($scope.getEnabledSteps().length === 1) {\n //goTo first step\n $scope.goTo($scope.getEnabledSteps()[0]);\n }\n };\n\n this.context = $scope.context;\n\n $scope.getStepNumber = function(step) {\n return stepIdx(step) + 1;\n };\n\n $scope.goTo = function(step) {\n //if this is the first time the wizard is loading it bi-passes step validation\n if(firstRun){\n //deselect all steps so you can set fresh below\n unselectAll();\n $scope.selectedStep = step;\n //making sure current step is not undefined\n if (angular.isDefined($scope.currentStep)) {\n $scope.currentStep = step.wzTitle;\n }\n //setting selected step to argument passed into goTo()\n step.selected = true;\n //emit event upwards with data on goTo() invoktion\n $scope.$emit('wizard:stepChanged', {step: step, index: stepIdx(step)});\n //setting variable to false so all other step changes must pass validation\n firstRun = false;\n } else {\n //createing variables to capture current state that goTo() was invoked from and allow booleans\n var thisStep;\n //getting data for step you are transitioning out of\n if($scope.currentStepNumber() > 0){\n thisStep = $scope.currentStepNumber() - 1;\n } else if ($scope.currentStepNumber() === 0){\n thisStep = 0;\n }\n // $log.log('steps[thisStep] Data: ', $scope.getEnabledSteps()[thisStep].canexit);\n $q.all([canExitStep($scope.getEnabledSteps()[thisStep], step), canEnterStep(step)]).then(function(data) {\n if(data[0] && data[1]){\n //deselect all steps so you can set fresh below\n unselectAll();\n\n //$log.log('value for canExit argument: ', $scope.currentStep.canexit);\n $scope.selectedStep = step;\n //making sure current step is not undefined\n if(angular.isDefined($scope.currentStep)){\n $scope.currentStep = step.wzTitle;\n }\n //setting selected step to argument passed into goTo()\n step.selected = true;\n //emit event upwards with data on goTo() invoktion\n $scope.$emit('wizard:stepChanged', {step: step, index: stepIdx(step)});\n //$log.log('current step number: ', $scope.currentStepNumber());\n }\n });\n }\n };\n\n function canEnterStep(step) {\n var defer,\n canEnter;\n //If no validation function is provided, allow the user to enter the step\n if(angular.isUndefined(step.canenter) ){\n return true;\n }\n //If canenter is a boolean value instead of a function, return the value\n if(typeof step.canenter === 'boolean'){\n return step.canenter;\n }\n //Check to see if the canenter function is a promise which needs to be returned\n canEnter = step.canenter($scope.context);\n if(angular.isFunction(canEnter.then)){\n defer = $q.defer();\n canEnter.then(function(response){\n defer.resolve(response);\n });\n return defer.promise;\n } else {\n return canEnter === true;\n }\n }\n\n function canExitStep(step, stepTo) {\n var defer,\n canExit;\n //Exiting the step should be allowed if no validation function was provided or if the user is moving backwards\n if(angular.isUndefined((step.canexit)) || $scope.getStepNumber(stepTo) < $scope.currentStepNumber()){\n return true;\n }\n //If canexit is a boolean value instead of a function, return the value\n if(typeof step.canexit === 'boolean'){\n return step.canexit;\n }\n //Check to see if the canexit function is a promise which needs to be returned\n canExit = step.canexit($scope.context);\n if(angular.isFunction(canExit.then)){\n defer = $q.defer();\n canExit.then(function(response){\n defer.resolve(response);\n });\n return defer.promise;\n } else {\n return canExit === true;\n }\n }\n\n $scope.currentStepNumber = function() {\n //retreive current step number\n return stepIdx($scope.selectedStep) + 1;\n };\n\n $scope.getEnabledSteps = function() {\n return $scope.steps.filter(function(step){\n return step.disabled !== 'true';\n });\n };\n\n //unSelect All Steps\n function unselectAll() {\n //traverse steps array and set each \"selected\" property to false\n angular.forEach($scope.getEnabledSteps(), function (step) {\n step.selected = false;\n });\n //set selectedStep variable to null\n $scope.selectedStep = null;\n }\n\n //ALL METHODS ATTACHED TO this ARE ACCESSIBLE VIA WizardHandler.wizard().methodName()\n\n this.currentStepTitle = function(){\n return $scope.selectedStep.wzTitle;\n };\n\n this.currentStepDescription = function(){\n return $scope.selectedStep.description;\n };\n\n this.currentStep = function(){\n return $scope.selectedStep;\n };\n\n this.totalStepCount = function() {\n return $scope.getEnabledSteps().length;\n }\n\n //Access to enabled steps from outside\n this.getEnabledSteps = function(){\n return $scope.getEnabledSteps();\n };\n\n //Access to current step number from outside\n this.currentStepNumber = function(){\n return $scope.currentStepNumber();\n };\n //method used for next button within step\n this.next = function(callback) {\n var enabledSteps = $scope.getEnabledSteps();\n //setting variable equal to step you were on when next() was invoked\n var index = stepIdx($scope.selectedStep);\n //checking to see if callback is a function\n if(angular.isFunction(callback)){\n if(callback()){\n if (index === enabledSteps.length - 1) {\n this.finish();\n } else {\n //invoking goTo() with step number next in line\n $scope.goTo(enabledSteps[index + 1]);\n }\n } else {\n return;\n }\n }\n if (!callback) {\n //completed property set on scope which is used to add class/remove class from progress bar\n $scope.selectedStep.completed = true;\n }\n //checking to see if this is the last step. If it is next behaves the same as finish()\n if (index === enabledSteps.length - 1) {\n this.finish();\n } else {\n //invoking goTo() with step number next in line\n $scope.goTo(enabledSteps[index + 1]);\n }\n\n };\n\n //used to traverse to any step, step number placed as argument\n this.goTo = function(step) {\n var enabledSteps = $scope.getEnabledSteps();\n var stepTo;\n //checking that step is a Number\n if (angular.isNumber(step)) {\n stepTo = enabledSteps[step];\n } else {\n //finding the step associated with the title entered as goTo argument\n stepTo = stepByTitle(step);\n }\n //going to step\n $scope.goTo(stepTo);\n };\n\n //calls finish() which calls onFinish() which is declared on an attribute and linked to controller via wizard directive.\n this.finish = function() {\n if ($scope.onFinish) {\n $scope.onFinish();\n }\n };\n\n this.previous = function() {\n //getting index of current step\n var index = stepIdx($scope.selectedStep);\n //ensuring you aren't trying to go back from the first step\n if (index === 0) {\n throw new Error(\"Can't go back. It's already in step 0\");\n } else {\n //go back one step from current step\n $scope.goTo($scope.getEnabledSteps()[index - 1]);\n }\n };\n\n //cancel is alias for previous.\n this.cancel = function() {\n //getting index of current step\n var index = stepIdx($scope.selectedStep);\n //ensuring you aren't trying to go back from the first step\n if (index === 0) {\n throw new Error(\"Can't go back. It's already in step 0\");\n } else {\n //go back one step from current step\n $scope.goTo($scope.getEnabledSteps()[0]);\n }\n };\n\n //reset\n this.reset = function(){\n //traverse steps array and set each \"completed\" property to false\n angular.forEach($scope.getEnabledSteps(), function (step) {\n step.completed = false;\n });\n //go to first step\n this.goTo(0);\n };\n }]\n };\n return directive;\n }\n\n\n angular.module('eHRD.kernel.uiElements.wizard')\n .directive('wizard', wizard)\n ;\n})();\n\n/**\n * Created by Bruce on 2016/7/1.\n */\n\n(function () {\n 'use strict';\n function stepFormWizard($timeout) {\n\n function link(scope, element){\n $timeout(function(){\n element.stepFormWizard({\n theme: element.data('style') ? element.data('style') : \"circle\",\n showNav: element.data('nav') ? element.data('nav') : \"top\",\n height: \"auto\",\n rtl: false\n\n });\n },500);\n }\n var directive = {\n restrict: 'EA',\n link :link\n };\n\n return directive;\n }\n\n\n function wzStep() {\n var directive = {\n restrict: 'E',\n replace: true,\n transclude: true,\n scope: {\n wzTitle: '@',\n canenter : '=',\n canexit : '=',\n disabled: '@?wzDisabled',\n description: '@',\n wzData: '='\n },\n require: '^wizard',\n\n templateUrl: function(element, attributes) {\n return attributes.template || \"app/kernel/ui-elements/wizard/views/step.html\";\n },\n\n link: function($scope, $element, $attrs, wizard) {\n $scope.title = $scope.wzTitle;\n wizard.addStep($scope);\n }\n }\n return directive;\n }\n\n\n angular.module('eHRD.kernel.uiElements.wizard')\n .directive('stepFormWizard', stepFormWizard)\n .directive('wzStep', wzStep)\n ;\n})();\n\n/**\n * Created by Bruce on 2016/7/1.\n */\n\n(function () {\n 'use strict';\n\n\n\n function wizardButtonDirective(action) {\n angular.module('eHRD.kernel.uiElements.wizard')\n .directive(action, function() {\n return {\n restrict: 'A',\n replace: false,\n require: '^wizard',\n link: function($scope, $element, $attrs, wizard) {\n\n $element.on(\"click\", function(e) {\n e.preventDefault();\n $scope.$apply(function() {\n $scope.$eval($attrs[action]);\n wizard[action.replace(\"wz\", \"\").toLowerCase()]();\n });\n });\n }\n };\n });\n }\n \n wizardButtonDirective('wzNext');\n wizardButtonDirective('wzPrevious');\n wizardButtonDirective('wzFinish');\n wizardButtonDirective('wzCancel');\n wizardButtonDirective('wzReset');\n})();\n\n/**\n * Created by Bruce on 2016/6/4.\n */\n(function () {\n 'use strict';\n\n angular.isUndefinedOrNull = isUndefinedOrNull;\n\n angular.isDefined = isDefined;\n\n function isUndefinedOrNull(val) {\n return angular.isUndefined(val) || val === null;\n }\n\n function isDefined(val) {\n return !(angular.isUndefined(val) || val === null);\n }\n\n angular.module('eHRD.kernel.uiElements',[\n 'eHRD.kernel.uiElements.breadcrumbs',\n 'eHRD.kernel.uiElements.tree',\n 'eHRD.kernel.uiElements.treeTable',\n 'eHRD.kernel.uiElements.uiTable',\n 'eHRD.kernel.uiElements.pagination',\n 'eHRD.kernel.uiElements.timer',\n 'eHRD.kernel.uiElements.angular-clock',\n 'eHRD.kernel.uiElements.uiDatePicker',\n 'eHRD.kernel.uiElements.uiCalendar',\n 'eHRD.kernel.uiElements.media',\n 'eHRD.kernel.uiElements.wizard'\n ]);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/17.\n */\n\n(function () {\n 'use strict';\n\n SweetAlert.$inject = ['$rootScope', '$window', '$filter'];\n function SweetAlert($rootScope, $window, $filter) {\n\n var swal = $window.swal;\n var setDefaults = function () {\n swal.setDefaults({\n confirmButtonColor: '#3085d6',\n cancelButtonColor: '#d33',\n confirmButtonText: $filter('translate')('ACTIONS.ENTER'),\n cancelButtonText: $filter('translate')('ACTIONS.CANCEL'),\n closeOnCancel: false,\n reverseButtons: true\n });\n };\n\n\n //public methods\n var self = {\n swal: function ( arg1, arg2, arg3 ) {\n setDefaults();\n $rootScope.$evalAsync(function(){\n if( angular.isFunction(arg2)) {\n swal( arg1 ).then(arg2, arg3);\n // swal( arg1 )\n // .then(function(isConfirm){\n // $rootScope.$evalAsync( function(){\n // arg2(isConfirm);\n // });\n // }, arg3 );\n } else {\n swal( arg1, arg2, arg3);\n }\n });\n },\n check: function (title, text, type, successCallBack, errorCallBack, cusConfirmButtonText, cusCancelButtonText) {\n setDefaults();\n var _successCallBack = successCallBack || new function () {};\n var _errorCallBack = errorCallBack || new function () {};\n cusConfirmButtonText = cusConfirmButtonText || undefined;\n cusCancelButtonText = cusCancelButtonText || undefined;\n $rootScope.$evalAsync(function(){\n var option = {\n title: title,\n text: text,\n type: type,\n showCancelButton: true\n };\n if(angular.isDefined(cusConfirmButtonText)) option['confirmButtonText'] = cusConfirmButtonText;\n if(angular.isDefined(cusCancelButtonText)) option['cancelButtonText'] = cusCancelButtonText;\n swal(option).then(_successCallBack, _errorCallBack);\n });\n },\n timeoutAlert: function (successCallBack, errorCallBack) {\n setDefaults();\n var _successCallBack = successCallBack || new function () {};\n var _errorCallBack = errorCallBack || new function () {};\n $rootScope.$evalAsync(function(){\n var option = {\n allowOutsideClick: false,\n allowEscapeKey: false,\n showCancelButton: false,\n html: ' alarm' +\n '

'+ $filter('translate')('MESSAGE.MSG_TIME_IS_OUT') +'

'\n };\n swal(option).then(_successCallBack, _errorCallBack);\n });\n },\n success: function(title, message) {\n setDefaults();\n $rootScope.$evalAsync(function(){\n swal( title, message, 'success' );\n });\n },\n error: function(title, message) {\n setDefaults();\n $rootScope.$evalAsync(function(){\n swal( title, message, 'error' );\n });\n },\n warning: function(title, message) {\n setDefaults();\n $rootScope.$evalAsync(function(){\n swal( title, message, 'warning' );\n });\n },\n info: function(title, message) {\n setDefaults();\n $rootScope.$evalAsync(function(){\n swal( title, message, 'info' );\n });\n },\n\n submitCheck: function (title, message, preConfirmFn) {\n swal.queue([{\n title: title,\n type: 'info',\n text: message,\n confirmButtonColor: '#3085d6',\n cancelButtonColor: '#d33',\n confirmButtonText: $filter('translate')('ACTIONS.ENTER'),\n cancelButtonText: $filter('translate')('ACTIONS.CANCEL'),\n closeOnCancel: true,\n showCancelButton: true,\n reverseButtons: true,\n allowEscapeKey: false,\n allowOutsideClick: false,\n showLoaderOnConfirm: true,\n preConfirm: preConfirmFn\n }]);\n },\n\n insertErrorQueueStep: function (title, message, isHtmlMsg) {\n isHtmlMsg = isHtmlMsg || false;\n var insertQueueStep = {\n title: title,\n type: 'error',\n confirmButtonColor: '#3085d6',\n confirmButtonText: $filter('translate')('ACTIONS.ENTER'),\n allowEscapeKey: false,\n allowOutsideClick: false,\n text: isHtmlMsg ? '' : message,\n html: isHtmlMsg ? message : ''\n };\n\n swal.insertQueueStep(insertQueueStep);\n },\n insertSuccessQueueStep: function (title, message, isHtmlMsg, closeFn) {\n isHtmlMsg = isHtmlMsg || false;\n closeFn = closeFn || undefined;\n var insertQueueStep = {\n title: title,\n type: 'success',\n confirmButtonColor: '#3085d6',\n confirmButtonText: $filter('translate')('ACTIONS.ENTER'),\n allowEscapeKey: false,\n allowOutsideClick: false,\n text: isHtmlMsg ? '' : message,\n html: isHtmlMsg ? message : '',\n onClose: function () {\n if(angular.isFunction(closeFn)){\n closeFn();\n }\n }\n };\n swal.insertQueueStep(insertQueueStep);\n },\n\n confirmCallback: function (type, title, message, successCallBack) {\n setDefaults();\n var _successCallBack = successCallBack || new function () {};\n $rootScope.$evalAsync(function(){\n var option = {\n title: title,\n type: type,\n text: message,\n confirmButtonColor: '#3085d6',\n confirmButtonText: $filter('translate')('ACTIONS.ENTER'),\n allowOutsideClick: false\n };\n swal(option).then(_successCallBack);\n });\n }\n };\n\n return self;\n }\n angular.module('eHRD.kernel.uiElements')\n .factory('SweetAlert', SweetAlert);\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n trustAsResourceUrl.$inject = ['$sce'];\n function trustAsResourceUrl($sce) {\n return function(val) {\n return $sce.trustAsResourceUrl(val);\n };\n }\n angular.module('eHRD.kernel.uiElements')\n .filter('trustAsResourceUrl', trustAsResourceUrl);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/11.\n */\n\n(function () {\n 'use strict';\n\n ngTargetBlank.$inject = [];\n function ngTargetBlank() {\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n if(attrs.ngTargetBlank === \"true\") {\n element.attr(\"target\", \"_blank\");\n }\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements')\n .directive('ngTargetBlank',ngTargetBlank);\n\n})();\n\n/**\n * Created by Bruce on 2016/7/28.\n */\n\n(function () {\n 'use strict';\n\n function ngMetis($timeout){\n\n var directive ={\n restrict: 'A',\n\n link: function(scope, el/*, atts*/) {\n if(scope.$last){\n $timeout(function () {\n angular.element('.metismenu').metisMenu({\n toggle: false,\n doubleTapToGo: false,\n preventDefault: false\n });\n });\n } else{\n el.metisMenu();\n }\n }\n };\n return directive;\n }\n\n angular.module('eHRD.kernel.uiElements')\n .directive('ngMetis',ngMetis);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/7.\n */\n(function () {\n 'use strict';\n\n\n mdPersonChips.$inject = ['$mdTheming', '$mdUtil'];\n function mdPersonChips($mdTheming, $mdUtil) {\n var directive = {\n restrict: 'E',\n templateUrl: 'app/kernel/ui-elements/widgets/views/md-person-chips-template.html',\n controller: 'MdPersonChipsController',\n controllerAs: '$mdPersonChipsCtrl',\n bindToController: true,\n compile: compile,\n scope: {\n personQuery: '&mdPersons',\n placeholder: '@',\n secondaryPlaceholder: '@',\n personName: '@mdPersonName',\n personImage: '@mdPersonImage',\n personEmail: '@mdPersonEmail',\n personGroup: '@mdPersonGroup',\n personIsGray: '@mdPersonIsGray',\n persons: '=ngModel',\n requireMatch: '=?mdRequireMatch',\n highlightFlags: '@?mdHighlightFlags',\n selectedPersons:'=selectedPersons'\n }\n };\n\n return directive;\n\n function compile(element, attr) {\n return function postLink(scope, element/*, attrs, controllers*/) {\n\n $mdUtil.initOptionalProperties(scope, attr);\n $mdTheming(element);\n\n element.attr('tabindex', '-1');\n };\n }\n }\n\n angular.module('eHRD.kernel.uiElements')\n .directive('mdPersonChips',mdPersonChips);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/10.\n */\n(function () {\n 'use strict';\n\n mdCompareTo.$inject = [\"$animate\", \"$mdUtil\"];\n function mdCompareTo($animate, $mdUtil) {\n return {\n restrict: 'A',\n require: ['ngModel', '^mdInputContainer'],\n link: postLink\n };\n\n function postLink(scope, element, attr, ctrls) {\n var compareTo;\n var ngModelCtrl = ctrls[0];\n var containerCtrl = ctrls[1];\n var charCountEl, errorsSpacer;\n// console.log(ngModelCtrl, containerCtrl, attr)\n // Wait until the next tick tos ensure that the input has setup the errors spacer where we will\n // append our counter\n $mdUtil.nextTick(function() {\n errorsSpacer = angular.element(containerCtrl.element[0].querySelector('.md-errors-spacer'));\n charCountEl = angular.element('
');\n\n // Append our character counter inside the errors spacer\n errorsSpacer.append(charCountEl);\n\n // Stop model from trimming. This makes it so whitespace\n // over the maxlength still counts as invalid.\n attr.$set('ngTrim', 'false');\n\n scope.$watch(attr.mdCompareTo, function(value) {\n compareTo = value;\n if (angular.equals(ngModelCtrl.$$rawModelValue,value)) {\n if (!charCountEl.parent().length) {\n $animate.enter(charCountEl, errorsSpacer);\n }\n } else {\n $animate.leave(charCountEl);\n }\n });\n\n ngModelCtrl.$validators['md-compare-to'] = function(modelValue) {\n return (angular.equals(modelValue, compareTo));\n };\n });\n }\n }\n angular.module('eHRD.kernel.uiElements')\n .directive('mdCompareTo',mdCompareTo);\n})();\n\n/**\n * Created by Bruce on 2016/6/4.\n */\n(function () {\n 'use strict';\n\n function themeInfoBox() {\n function link(scope, element, attrs){\n\n attrs.$observe('type', function(val) {\n scope.type = val;\n });\n\n attrs.$observe('title', function(val) {\n scope.title = val;\n });\n\n attrs.$observe('count', function(val) {\n scope.count = val;\n });\n\n attrs.$observe('iconcolor', function(val) {\n scope.iconColor = val;\n });\n\n attrs.$observe('icon', function(val) {\n scope.icon = val;\n });\n\n }\n\n var directive = {\n restrict: 'E',\n templateUrl: 'app/kernel/uiElements/widgets/views/infobox.html',\n link :link\n };\n\n return directive;\n }\n\n angular.module('eHRD.kernel.uiElements')\n .directive('themeInfoBox',themeInfoBox);\n\n})();\n\n/**\n * Created by Bruce on 2016/7/27.\n */\n\n(function () {\n 'use strict';\n\n function doughnutGauge() {\n\n function link($scope, $element, $attrs){\n $attrs.$observe('gaugeValue', function(value) {\n if (value) {\n $scope.gaugeData=[value,100-value];\n }\n });\n $scope.gaugeLabels=[\"Score\",''];\n }\n var directive = {\n restrict: \"E\",\n scope:\n {\n gaugeSize: '@', //size in px\n gaugeOptions: '=',\n gaugeColors: '=',\n gaugeValue: '@', //value displayed 0-100\n valueSuffix: '@', //optional suffix, e.g. '%'\n gaugeTitle: '@', //large title under gauge\n subTitle: '@' //smaller text under title\n },\n link: link,\n templateUrl:'app/kernel/ui-elements/widgets/views/doughnut-gauge.html'\n\n };\n\n return directive;\n }\n\n angular.module('eHRD.kernel.uiElements')\n .directive('doughnutGauge',doughnutGauge);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/7.\n */\n(function () {\n 'use strict';\n\n MdPersonChipsController.$inject = ['$filter'];\n function MdPersonChipsController($filter) {\n var vm = this;\n /** @type {Object} */\n vm.selectedItem = null;\n\n /** @type {string} */\n vm.searchText = '';\n\n vm.addChipToSelectedPersons = function (chip) {\n if(!$filter('getArrayObjectByKey')(vm.selectedPersons,'userId', chip.userId)) vm.selectedPersons.push(chip);\n // if(!$filter('contains')(vm.selectedPersons, chip))vm.selectedPersons.push(chip);\n };\n vm.removeChipToSelectedPersons = function (chip) {\n var index = $filter('arrayObjectIndexOf')(vm.selectedPersons, $filter('getArrayObjectByKey')(vm.selectedPersons, 'userId', chip.userId));\n if($filter('getArrayObjectByKey')(vm.selectedPersons,'userId', chip.userId) && index > -1){\n // var index = vm.selectedPersons.indexOf(chip);\n vm.selectedPersons.splice(index, 1);\n }\n };\n }\n\n MdPersonChipsController.prototype.queryPerson = function(searchText) {\n var results = this.personQuery({'$query': searchText});\n return this.filterSelected ?\n results.filter(angular.bind(this, this.filterSelectedPersons)) : results;\n };\n\n MdPersonChipsController.prototype.itemName = function(item) {\n return item[this.personName];\n };\n\n\n MdPersonChipsController.prototype.filterSelectedPersons = function(person) {\n return this.persons.indexOf(person) == -1;\n };\n\n\n angular.module('eHRD.kernel.uiElements')\n .controller('MdPersonChipsController',MdPersonChipsController);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/30.\n */\n(function () {\n 'use strict';\n\n var selectDate = {\n bindings: {\n type:'@?',\n ngModel: '=ngModel',\n min: '=?min',\n max: '=?max',\n defaultValue: '=?defaultValue'\n },\n templateUrl: 'app/kernel/ui-elements/widgets/views/select-date.html',\n controller: ['$scope', function($scope){\n var vm = this;\n vm.type = angular.isUndefined(this.type) ? null : this.type;\n vm.ngModel = angular.isUndefined(this.ngModel) ? null : this.ngModel;\n vm.min = angular.isUndefined(this.min) ? null : this.min;\n vm.max = angular.isUndefined(this.max) ? null : this.max;\n vm.defaultValue = angular.isUndefined(this.defaultValue) ? null : this.defaultValue;\n $scope.$watch(function(){\n return vm.defaultValue;\n },function (newVal) {\n vm.ngModel = newVal.toString();\n });\n vm.hours = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23];\n vm.minutes = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];\n }]\n };\n\n angular.module('eHRD.kernel.uiElements')\n .component('selectDate', selectDate);\n})();\n\n/**\n * Created by Bruce on 2016/12/16.\n */\n(function () {\n 'use strict';\n\n var mdCompanyChips = {\n bindings: {\n personQuery: '&mdPersons',\n placeholder: '@',\n secondaryPlaceholder: '@',\n personName: '@mdPersonName',\n personImage: '@mdPersonImage',\n personEmail: '@mdPersonEmail',\n personGroup: '@mdPersonGroup',\n personIsGray: '@mdPersonIsGray',\n persons: '=ngModel',\n requireMatch: '=?mdRequireMatch',\n highlightFlags: '@?mdHighlightFlags',\n selectedPersons:'=selectedPersons'\n },\n templateUrl: 'app/kernel/ui-elements/widgets/views/md-company-chips-template.html',\n controller: MdCompanyChipsController,\n controllerAs: '$mdPersonChipsCtrl'\n\n };\n\n MdCompanyChipsController.$inject = [ '$scope', '$element', '$attrs', '$log', '$filter', '$mdTheming', '$mdUtil'];\n function MdCompanyChipsController( $scope, $element, $attrs, $log, $filter, $mdTheming, $mdUtil) {\n var vm = this;\n\n vm.autoCompleteSelected = {};\n\n /** @type {Object} */\n vm.selectedItem = null;\n\n /** @type {string} */\n vm.searchText = '';\n\n vm.addChipToSelectedPersons = function (chip) {\n if(!$filter('getArrayObjectByKey')(vm.selectedPersons,'userId', chip.userId)) vm.selectedPersons.push(chip);\n vm.selectedItemChange(chip);\n };\n vm.removeChipToSelectedPersons = function (chip) {\n if($filter('getArrayObjectByKey')(vm.selectedPersons,'userId', chip.userId)){\n var index = vm.selectedPersons.indexOf(chip);\n vm.selectedPersons.splice(index, 1);\n }\n vm.autoCompleteSelected[chip.userId].checked = false;\n };\n\n vm.selectedItemChange = function (item) {\n if(angular.isDefined(item)){\n var chipIndex = arrayObjectIndexOf(this.persons, item);\n if(vm.autoCompleteSelected[item.userId].checked){\n if( chipIndex === -1) {\n this.persons.push(item);\n vm.autoCompleteSelected[item.userId].checked = true;\n }\n }else{\n if( chipIndex != -1) {\n this.persons.splice(arrayObjectIndexOf(this.persons, item), 1);\n }\n }\n }\n };\n\n function arrayObjectIndexOf(arr, obj){\n for(var i = 0; i < arr.length; i++){\n if(angular.equals(arr[i], obj)){\n return i;\n }\n }\n return -1;\n }\n\n this.$postLink = function() {\n $mdUtil.initOptionalProperties($scope, $attrs);\n $mdTheming($element);\n\n $element.attr('tabindex', '-1');\n };\n }\n\n\n MdCompanyChipsController.prototype.queryPerson = function(searchText) {\n var results = this.personQuery({'$query': searchText});\n return this.filterSelected ?\n results.filter(angular.bind(this, this.filterSelectedPersons)) : results;\n };\n\n MdCompanyChipsController.prototype.itemName = function(item) {\n return item[this.personName];\n };\n\n MdCompanyChipsController.prototype.filterSelectedPersons = function(person) {\n return this.persons.indexOf(person) == -1;\n };\n\n\n angular.module('eHRD.kernel.uiElements')\n .component('mdCompanyChips',mdCompanyChips);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/2.\n * Hack By angular datePicker\n */\n\n(function () {\n 'use strict';\n\n angular.module('eHRD.kernel.uiElements.uiDatePicker',[]);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/2.\n */\n(function () {\n 'use strict';\n\n mFormat.$inject=[];\n function mFormat() {\n return function (m, format, tz) {\n if (!(moment.isMoment(m))) {\n return moment(m).format(format);\n }\n return tz ? moment.tz(m, tz).format(format) : m.format(format);\n };\n }\n angular.module('eHRD.kernel.uiElements.uiDatePicker')\n .filter('mFormat', mFormat);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/2.\n * Hack By angular datePicker\n */\n\n(function () {\n 'use strict';\n\n datePickerUtils.$inject = [];\n function datePickerUtils() {\n var tz, firstDay;\n var createNewDate = function (year, month, day, hour, minute) {\n var utc = Date.UTC(year | 0, month | 0, day | 0, hour | 0, minute | 0);\n return tz ? moment.tz(utc, tz) : moment(utc);\n };\n\n return {\n getVisibleMinutes: function (m, step) {\n var year = m.year(),\n month = m.month(),\n day = m.date(),\n hour = m.hours(), pushedDate,\n offset = m.utcOffset() / 60,\n minutes = [], minute;\n\n for (minute = 0; minute < 60; minute += step) {\n pushedDate = createNewDate(year, month, day, hour - offset, minute);\n minutes.push(pushedDate);\n }\n return minutes;\n },\n getVisibleWeeks: function (m) {\n m = moment(m);\n var startYear = m.year(),\n startMonth = m.month();\n\n //Set date to the first day of the month\n m.date(1);\n\n //Grab day of the week\n var day = m.day();\n\n //Go back the required number of days to arrive at the previous week start\n m.date(firstDay - (day + (firstDay >= day ? 6 : -1)));\n\n var weeks = [];\n\n while (weeks.length < 6) {\n if ((m.year() === startYear && m.month() > startMonth) || (m.year() !== startYear && m.month() === 1)) {\n break;\n }\n if(m.month() === startMonth || moment(m).add(6, 'd').month() === startMonth)\n weeks.push(this.getDaysOfWeek(m));\n m.add(7, 'd');\n }\n return weeks;\n },\n getVisibleYears: function (d) {\n var m = moment(d),\n year = m.year();\n\n m.year(year - (year % 10));\n year = m.year();\n\n var offset = m.utcOffset() / 60,\n years = [],\n pushedDate,\n actualOffset;\n\n for (var i = 0; i < 12; i++) {\n pushedDate = createNewDate(year, 0, 1, 0 - offset);\n actualOffset = pushedDate.utcOffset() / 60;\n if (actualOffset !== offset) {\n pushedDate = createNewDate(year, 0, 1, 0 - actualOffset);\n offset = actualOffset;\n }\n years.push(pushedDate);\n year++;\n }\n return years;\n },\n getDaysOfWeek: function (m) {\n m = m ? m : (tz ? moment.tz(tz).day(firstDay) : moment().day(firstDay));\n\n var year = m.year(),\n month = m.month(),\n day = m.date(),\n days = [],\n pushedDate,\n offset = m.utcOffset() / 60,\n actualOffset;\n\n for (var i = 0; i < 7; i++) {\n pushedDate = createNewDate(year, month, day, 0 - offset, 0, false);\n actualOffset = pushedDate.utcOffset() / 60;\n if (actualOffset !== offset) {\n pushedDate = createNewDate(year, month, day, 0 - actualOffset, 0, false);\n }\n days.push(pushedDate);\n day++;\n }\n return days;\n },\n getVisibleMonths: function (m) {\n var year = m.year(),\n offset = m.utcOffset() / 60,\n months = [],\n pushedDate,\n actualOffset;\n\n for (var month = 0; month < 12; month++) {\n pushedDate = createNewDate(year, month, 1, 0 - offset, 0, false);\n actualOffset = pushedDate.utcOffset() / 60;\n if (actualOffset !== offset) {\n pushedDate = createNewDate(year, month, 1, 0 - actualOffset, 0, false);\n }\n months.push(pushedDate);\n }\n return months;\n },\n getVisibleHours: function (m) {\n var year = m.year(),\n month = m.month(),\n day = m.date(),\n hours = [],\n hour, pushedDate, actualOffset,\n offset = m.utcOffset() / 60;\n\n for (hour = 0; hour < 24; hour++) {\n pushedDate = createNewDate(year, month, day, hour - offset, 0, false);\n actualOffset = pushedDate.utcOffset() / 60;\n if (actualOffset !== offset) {\n pushedDate = createNewDate(year, month, day, hour - actualOffset, 0, false);\n }\n hours.push(pushedDate);\n }\n\n return hours;\n },\n isAfter: function (model, date) {\n return model && model.unix() >= date.unix();\n },\n isBefore: function (model, date) {\n return model.unix() <= date.unix();\n },\n isSameYear: function (model, date) {\n return model && model.year() === date.year();\n },\n isSameMonth: function (model, date) {\n return this.isSameYear(model, date) && model.month() === date.month();\n },\n isSameDay: function (model, date) {\n return this.isSameMonth(model, date) && model.date() === date.date();\n },\n isSameHour: function (model, date) {\n return this.isSameDay(model, date) && model.hours() === date.hours();\n },\n isSameMinutes: function (model, date) {\n return this.isSameHour(model, date) && model.minutes() === date.minutes();\n },\n isHasDayEvent: function (dateEvent, date) {\n return this.isSameMonth(dateEvent, date) && dateEvent.date() === date.date();\n },\n setParams: function (zone, fd) {\n tz = zone;\n firstDay = fd;\n },\n scopeSearch: function (scope, name, comparisonFn) {\n var parentScope = scope,\n nameArray = name.split('.'),\n target, i, j = nameArray.length;\n\n do {\n target = parentScope = parentScope.$parent;\n\n //Loop through provided names.\n for (i = 0; i < j; i++) {\n target = target[nameArray[i]];\n if (!target) {\n continue;\n }\n }\n\n //If we reached the end of the list for this scope,\n //and something was found, trigger the comparison\n //function. If the comparison function is happy, return\n //found result. Otherwise, continue to the next parent scope\n if (target && comparisonFn(target)) {\n return target;\n }\n\n } while (parentScope.$parent);\n\n return false;\n },\n findFunction: function (scope, name) {\n //Search scope ancestors for a matching function.\n return this.scopeSearch(scope, name, function (target) {\n //Property must also be a function\n return angular.isFunction(target);\n });\n },\n findParam: function (scope, name) {\n //Search scope ancestors for a matching parameter.\n return this.scopeSearch(scope, name, function () {\n //As long as the property exists, we're good\n return true;\n });\n },\n createMoment: function (m) {\n if(moment.isMoment(m)){\n if (tz) {\n return moment.tz(new Date(m._i), tz);\n } else {\n //If input is a moment, and we have no TZ info, we need to remove TZ\n //info from the moment, otherwise the newly created moment will take\n //the timezone of the input moment. The easiest way to do that is to\n //take the unix timestamp, and use that to create a new moment.\n //The new moment will use the local timezone of the user machine.\n return moment.unix(m.unix());\n }\n }else{\n return moment(m);\n }\n\n },\n getDate: function (scope, attrs, name) {\n var result = false;\n if (attrs[name]) {\n result = this.createMoment(attrs[name]);\n if (!result.isValid()) {\n result = this.findParam(scope, attrs[name]);\n if (result) {\n result = this.createMoment(result);\n }\n }\n }\n\n return result;\n },\n //Checks if an event targeted at a specific picker, via either a string name, or an array of strings.\n eventIsForPicker: function (targetIDs, pickerID) {\n function matches(id) {\n if (id instanceof RegExp) {\n return id.test(pickerID);\n }\n return id === pickerID;\n }\n\n if (angular.isArray(targetIDs)) {\n return targetIDs.some(matches);\n }\n return matches(targetIDs);\n }\n };\n }\n angular.module('eHRD.kernel.uiElements.uiDatePicker')\n .factory('datePickerUtils', datePickerUtils);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/5.\n */\n(function () {\n 'use strict';\n\n uiDateRange.$inject = ['$compile', 'datePickerUtils', 'dateTimeConfig'];\n function uiDateRange($compile, datePickerUtils, dateTimeConfig) {\n function getTemplate(attrs, id, model, min, max) {\n return dateTimeConfig.template(angular.extend(attrs, {\n ngModel: model,\n minDate: min && moment.isMoment(min) ? min.format() : false,\n maxDate: max && moment.isMoment(max) ? max.format() : false\n }), id);\n }\n\n function randomName() {\n return 'picker' + Math.random().toString().substr(2);\n }\n\n return {\n scope: {\n start: '=',\n end: '='\n },\n link: function (scope, element, attrs) {\n var dateChange = null,\n pickerRangeID = element[0].id,\n pickerIDs = [randomName(), randomName()],\n createMoment = datePickerUtils.createMoment,\n eventIsForPicker = datePickerUtils.eventIsForPicker;\n\n scope.dateChange = function (modelName, newDate) {\n //Notify user if callback exists.\n if (dateChange) {\n dateChange(modelName, newDate);\n }\n };\n\n function setMax(date) {\n scope.$broadcast('pickerUpdate', pickerIDs[0], {\n maxDate: date\n });\n }\n\n function setMin(date) {\n scope.$broadcast('pickerUpdate', pickerIDs[1], {\n minDate: date\n });\n }\n\n if (pickerRangeID) {\n scope.$on('pickerUpdate', function (event, targetIDs, data) {\n if (eventIsForPicker(targetIDs, pickerRangeID)) {\n //If we received an update event, dispatch it to the inner pickers using their IDs.\n scope.$broadcast('pickerUpdate', pickerIDs, data);\n }\n });\n }\n\n datePickerUtils.setParams(attrs.timezone);\n\n scope.start = createMoment(scope.start);\n scope.end = createMoment(scope.end);\n\n scope.$watchGroup(['start', 'end'], function (dates) {\n //Scope data changed, update picker min/max\n setMin(dates[0]);\n setMax(dates[1]);\n });\n\n if (angular.isDefined(attrs.dateChange)) {\n dateChange = datePickerUtils.findFunction(scope, attrs.dateChange);\n }\n\n attrs.onSetDate = 'dateChange';\n\n var template = '
' +\n getTemplate(attrs, pickerIDs[0], 'start', false, scope.end) +\n '' +\n getTemplate(attrs, pickerIDs[1], 'end', scope.start, false) +\n '
';\n\n var picker = $compile(template)(scope);\n element.append(picker);\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiDatePicker')\n .directive('uiDatePicker', uiDateRange);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/2.\n */\n(function () {\n 'use strict';\n\n uiDatePicker.$inject= ['datePickerConfig', 'datePickerUtils'];\n function uiDatePicker(datePickerConfig, datePickerUtils) {\n //noinspection JSUnusedLocalSymbols\n return {\n require: '?ngModel',\n template: '
',\n scope: {\n model: '=datePicker',\n after: '=?',\n before: '=?',\n dateEvents: '=?',\n showEventLightbox: '=?showEventLightbox'\n },\n link: function (scope, element, attrs, ngModel) {\n\n function prepareViews() {\n scope.views = datePickerConfig.views.concat();\n scope.view = attrs.view || datePickerConfig.view;\n\n scope.views = scope.views.slice(\n scope.views.indexOf(attrs.maxView || 'year'),\n scope.views.indexOf(attrs.minView || 'minutes') + 1\n );\n\n if (scope.views.length === 1 || scope.views.indexOf(scope.view) === -1) {\n scope.view = scope.views[0];\n }\n }\n\n function getDate(name) {\n return datePickerUtils.getDate(scope, attrs, name);\n }\n\n var arrowClick = false,\n tz = scope.tz = attrs.timezone,\n createMoment = datePickerUtils.createMoment,\n eventIsForPicker = datePickerUtils.eventIsForPicker,\n step = parseInt(attrs.step || datePickerConfig.step, 10),\n partial = !!attrs.partial,\n minDate = getDate('minDate'),\n maxDate = getDate('maxDate'),\n pickerID = element[0].id,\n now = scope.now = createMoment(),\n selected = scope.date = createMoment(scope.model || now),\n autoclose = attrs.autoClose === 'true',\n // Either gets the 1st day from the attributes, or asks moment.js to give it to us as it is localized.\n firstDay = attrs.firstDay && attrs.firstDay >= 0 && attrs.firstDay <= 6 ? parseInt(attrs.firstDay, 10) : moment().weekday(0).day(),\n setDate,\n prepareViewData,\n isSame,\n clipDate,\n isNow,\n inValidRange;\n\n datePickerUtils.setParams(tz, firstDay);\n\n if (!scope.model) {\n selected.minute(Math.ceil(selected.minute() / step) * step).second(0);\n }\n\n scope.template = attrs.template || datePickerConfig.template;\n\n scope.watchDirectChanges = angular.isDefined(attrs.watchDirectChanges);\n scope.callbackOnSetDate = attrs.dateChange ? datePickerUtils.findFunction(scope, attrs.dateChange) : undefined;\n // scope.showEventLightbox = angular.isDefined(attrs.showEventLightbox) ? attrs.showEventLightbox : undefined;\n\n scope.showEventLightbox = angular.isDefined(scope.showEventLightbox) ? scope.showEventLightbox : false;\n prepareViews();\n\n scope.$watch(function () {\n return scope.dateEvents;\n },function (newVal) {\n if(angular.isDefined(newVal) && angular.isDefined(scope.weeks) && scope.weeks.length > 0){\n\n if(angular.isArray(scope.dateEvents) && scope.dateEvents.length > 0 ){\n prepareViewData();\n }else if(angular.isObject(scope.dateEvents) && Object.keys(scope.dateEvents).length > 0){\n prepareViewData();\n }\n }\n },true);\n\n\n scope.setView = function (nextView) {\n if (scope.views.indexOf(nextView) !== -1) {\n scope.view = nextView;\n }\n };\n\n scope.closeLightBox = function () {\n scope.showEvents = false;\n };\n\n scope.selectDate = function (date, isOnlyDay) {\n isOnlyDay = isOnlyDay || false;\n if (attrs.disabled) {\n return false;\n }\n if (isSame(scope.date, date)) {\n date = scope.date;\n }\n date = clipDate(date);\n if (!date) {\n return false;\n }\n scope.date = date;\n\n var nextView = scope.views[scope.views.indexOf(scope.view) + 1];\n if ((!nextView || partial) || scope.model) {\n setDate(date, isOnlyDay);\n }\n if(isOnlyDay && angular.isDefined(scope.dateEvents[date.format('YYYY-MM-DD')])){\n scope.lightBoxEvents = scope.dateEvents[date.format('YYYY-MM-DD')];\n scope.showEvents = true;\n }\n\n if (nextView) {\n scope.setView(nextView);\n } else if (autoclose) {\n element.addClass('hidden');\n scope.$emit('hidePicker');\n } else {\n prepareViewData();\n }\n };\n\n setDate = function (date, isOnlyDay) {\n isOnlyDay = isOnlyDay || false;\n if (date) {\n scope.model = date;\n if (ngModel) {\n ngModel.$setViewValue(date);\n }\n }\n scope.$emit('setDate', scope.model, scope.view);\n\n //This is duplicated in the new functionality.\n if (scope.callbackOnSetDate) {\n // scope.callbackOnSetDate(attrs.datePicker, scope.date, isOnlyDay);\n scope.callbackOnSetDate(scope.date, isOnlyDay);\n }\n };\n\n function update() {\n var view = scope.view;\n datePickerUtils.setParams(tz, firstDay);\n\n if (scope.model && !arrowClick) {\n scope.date = createMoment(scope.model);\n arrowClick = false;\n }\n\n var date = scope.date;\n switch (view) {\n case 'year':\n scope.years = datePickerUtils.getVisibleYears(date);\n break;\n case 'month':\n scope.months = datePickerUtils.getVisibleMonths(date);\n break;\n case 'date':\n scope.weekdays = scope.weekdays || datePickerUtils.getDaysOfWeek();\n scope.weeks = datePickerUtils.getVisibleWeeks(date);\n break;\n case 'hours':\n scope.hours = datePickerUtils.getVisibleHours(date);\n break;\n case 'minutes':\n scope.minutes = datePickerUtils.getVisibleMinutes(date, step);\n break;\n }\n\n prepareViewData();\n }\n\n function watch() {\n if (scope.view !== 'date') {\n return scope.view;\n }\n return scope.date ? scope.date.month() : null;\n }\n\n scope.$watch(watch, update);\n\n if (scope.watchDirectChanges) {\n scope.$watch('model', function () {\n arrowClick = false;\n update();\n });\n }\n\n prepareViewData = function () {\n var view = scope.view,\n date = scope.date,\n classes = [], classList = '',\n i, j;\n datePickerUtils.setParams(tz, firstDay);\n if (view === 'date') {\n var weeks = scope.weeks, week;\n for (i = 0; i < weeks.length; i++) {\n week = weeks[i];\n classes.push([]);\n for (j = 0; j < week.length; j++) {\n classList = '';\n if(week[j].isoWeekday() === 6 || week[j].isoWeekday() === 7){\n classList += ' pt-mark';\n }\n\n angular.forEach(scope.dateEvents, function (dateEvent, key) {\n if(datePickerUtils.isHasDayEvent(createMoment(angular.isArray(scope.dateEvents) ? dateEvent : key), week[j])){\n classList += ' day-withEvent';\n }\n });\n\n if (datePickerUtils.isSameDay(date, week[j])) {\n classList += ' active';\n }\n if (isNow(week[j], view)) {\n classList += ' now';\n }\n\n //if (week[j].month() !== date.month()) classList += ' disabled';\n if (week[j].month() !== date.month() || !inValidRange(week[j])) {\n classList += ' disable';\n }\n classes[i].push(classList);\n }\n }\n } else {\n var params = datePickerConfig.viewConfig[view],\n dates = scope[params[0]],\n compareFunc = params[1];\n\n for (i = 0; i < dates.length; i++) {\n classList = '';\n if (datePickerUtils[compareFunc](date, dates[i])) {\n classList += 'active';\n }\n if (isNow(dates[i], view)) {\n classList += ' now';\n }\n if (!inValidRange(dates[i])) {\n classList += ' disable';\n }\n classes.push(classList);\n }\n }\n scope.classes = classes;\n };\n\n scope.next = function (delta) {\n var date = moment(scope.date);\n delta = delta || 1;\n switch (scope.view) {\n case 'year':\n /*falls through*/\n case 'month':\n date.year(date.year() + delta);\n break;\n case 'date':\n date.month(date.month() + delta);\n break;\n case 'hours':\n /*falls through*/\n case 'minutes':\n date.hours(date.hours() + delta);\n break;\n }\n date = clipDate(date);\n if (date) {\n scope.date = date;\n arrowClick = true;\n update();\n setDate(date);\n }\n };\n\n inValidRange = function (date) {\n var valid = true;\n if (minDate && minDate.isAfter(date)) {\n valid = isSame(minDate, date);\n }\n if (maxDate && maxDate.isBefore(date)) {\n valid &= isSame(maxDate, date);\n }\n return valid;\n };\n\n isSame = function (date1, date2) {\n return date1.isSame(date2, datePickerConfig.momentNames[scope.view]) ? true : false;\n };\n\n clipDate = function (date) {\n if (minDate && minDate.isAfter(date)) {\n return minDate;\n } else if (maxDate && maxDate.isBefore(date)) {\n return maxDate;\n } else {\n return date;\n }\n };\n\n isNow = function (date, view) {\n var is = true;\n\n switch (view) {\n case 'minutes':\n is &= ~~(now.minutes() / step) === ~~(date.minutes() / step);\n /* falls through */\n case 'hours':\n is &= now.hours() === date.hours();\n /* falls through */\n case 'date':\n is &= now.date() === date.date();\n /* falls through */\n case 'month':\n is &= now.month() === date.month();\n /* falls through */\n case 'year':\n is &= now.year() === date.year();\n }\n return is;\n };\n\n scope.prev = function (delta) {\n return scope.next(-delta || -1);\n };\n\n if (pickerID) {\n scope.$on('pickerUpdate', function (event, pickerIDs, data) {\n if (eventIsForPicker(pickerIDs, pickerID)) {\n var updateViews = false, updateViewData = false;\n\n if (angular.isDefined(data.minDate)) {\n minDate = data.minDate ? data.minDate : false;\n updateViewData = true;\n }\n if (angular.isDefined(data.maxDate)) {\n maxDate = data.maxDate ? data.maxDate : false;\n updateViewData = true;\n }\n\n if (angular.isDefined(data.minView)) {\n attrs.minView = data.minView;\n updateViews = true;\n }\n if (angular.isDefined(data.maxView)) {\n attrs.maxView = data.maxView;\n updateViews = true;\n }\n attrs.view = data.view || attrs.view;\n\n if (updateViews) {\n prepareViews();\n }\n\n if (updateViewData) {\n update();\n }\n }\n });\n }\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiDatePicker')\n .directive('datePicker', uiDatePicker);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/5.\n */\n(function () {\n 'use strict';\n\n uiDateTime.$inject = ['$compile', '$document', '$filter', 'dateTimeConfig', '$parse', 'datePickerUtils'];\n function uiDateTime($compile, $document, $filter, dateTimeConfig, $parse, datePickerUtils) {\n var PRISTINE_CLASS = 'ng-pristine',\n DIRTY_CLASS = 'ng-dirty';\n var body = $document.find('body');\n var dateFilter = $filter('mFormat');\n return {\n require: 'ngModel',\n scope: true,\n link: function (scope, element, attrs, ngModel) {\n var format = attrs.format || dateTimeConfig.format,\n parentForm = element.inheritedData('$formController'),\n views = $parse(attrs.views)(scope) || dateTimeConfig.views.concat(),\n view = attrs.view || views[0],\n index = views.indexOf(view),\n dismiss = attrs.autoClose ? $parse(attrs.autoClose)(scope) : dateTimeConfig.autoClose,\n picker = null,\n pickerID = element[0].id,\n position = attrs.position || dateTimeConfig.position,\n container = null,\n minDate = null,\n minValid = null,\n maxDate = null,\n maxValid = null,\n timezone = attrs.timezone || false,\n eventIsForPicker = datePickerUtils.eventIsForPicker,\n dateChange = null,\n shownOnce = false,\n template;\n\n if (index === -1) {\n views.splice(index, 1);\n }\n\n views.unshift(view);\n\n function formatter(value) {\n if (value) {\n return dateFilter(value, format, timezone);\n }\n }\n\n function parser(viewValue) {\n if (!viewValue) {\n return '';\n }\n var parsed = moment(viewValue, format);\n if (parsed.isValid()) {\n return parsed;\n }\n }\n\n function setMin(date) {\n minDate = date;\n attrs.minDate = date ? date.format() : date;\n minValid = moment.isMoment(date);\n }\n\n function setMax(date) {\n maxDate = date;\n attrs.maxDate = date ? date.format() : date;\n maxValid = moment.isMoment(date);\n }\n\n ngModel.$formatters.push(formatter);\n ngModel.$parsers.unshift(parser);\n\n if (angular.isDefined(attrs.minDate)) {\n setMin(datePickerUtils.findParam(scope, attrs.minDate));\n\n ngModel.$validators.min = function (value) {\n //If we don't have a min / max value, then any value is valid.\n return minValid ? moment.isMoment(value) && (minDate.isSame(value) || minDate.isBefore(value)) : true;\n };\n }\n\n if (angular.isDefined(attrs.maxDate)) {\n setMax(datePickerUtils.findParam(scope, attrs.maxDate));\n\n ngModel.$validators.max = function (value) {\n return maxValid ? moment.isMoment(value) && (maxDate.isSame(value) || maxDate.isAfter(value)) : true;\n };\n }\n\n if (angular.isDefined(attrs.dateChange)) {\n dateChange = datePickerUtils.findFunction(scope, attrs.dateChange);\n }\n\n function getTemplate() {\n template = dateTimeConfig.template(attrs);\n }\n\n\n function updateInput(event) {\n event.stopPropagation();\n if (ngModel.$pristine) {\n ngModel.$dirty = true;\n ngModel.$pristine = false;\n element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS);\n if (parentForm) {\n parentForm.$setDirty();\n }\n ngModel.$render();\n }\n }\n\n function clear() {\n if (picker) {\n picker.remove();\n picker = null;\n }\n if (container) {\n container.remove();\n container = null;\n }\n }\n\n if (pickerID) {\n scope.$on('pickerUpdate', function (event, pickerIDs, data) {\n if (eventIsForPicker(pickerIDs, pickerID)) {\n if (picker) {\n //Need to handle situation where the data changed but the picker is currently open.\n //To handle this, we can create the inner picker with a random ID, then forward\n //any events received to it.\n } else {\n var validateRequired = false;\n if (angular.isDefined(data.minDate)) {\n setMin(data.minDate);\n validateRequired = true;\n }\n if (angular.isDefined(data.maxDate)) {\n setMax(data.maxDate);\n validateRequired = true;\n }\n\n if (angular.isDefined(data.minView)) {\n attrs.minView = data.minView;\n }\n if (angular.isDefined(data.maxView)) {\n attrs.maxView = data.maxView;\n }\n attrs.view = data.view || attrs.view;\n\n if (validateRequired) {\n ngModel.$validate();\n }\n if (angular.isDefined(data.format)) {\n format = attrs.format = data.format || dateTimeConfig.format;\n ngModel.$modelValue = -1; //Triggers formatters. This value will be discarded.\n }\n getTemplate();\n }\n }\n });\n }\n\n function showPicker() {\n if (picker) {\n return;\n }\n // create picker element\n picker = $compile(template)(scope);\n scope.$digest();\n\n //If the picker has already been shown before then we shouldn't be binding to events, as these events are already bound to in this scope.\n if (!shownOnce) {\n scope.$on('setDate', function (event, date, view) {\n updateInput(event);\n if (dateChange) {\n dateChange(attrs.ngModel, date);\n }\n if (dismiss && views[views.length - 1] === view) {\n clear();\n }\n });\n\n scope.$on('hidePicker', function () {\n element[0].blur();\n });\n\n scope.$on('$destroy', clear);\n\n shownOnce = true;\n }\n\n\n // move picker below input element\n\n if (position === 'absolute') {\n var pos = element[0].getBoundingClientRect();\n // Support IE8\n var height = pos.height || element[0].offsetHeight;\n picker.css({top: (pos.top + height) + 'px', left: pos.left + 'px', display: 'block', position: position});\n body.append(picker);\n } else {\n // relative\n container = angular.element('
');\n element[0].parentElement.insertBefore(container[0], element[0]);\n container.append(picker);\n // this approach doesn't work\n // element.before(picker);\n picker.css({top: element[0].offsetHeight + 'px', display: 'block'});\n }\n picker.bind('mousedown', function (evt) {\n evt.preventDefault();\n });\n }\n\n element.bind('focus', showPicker);\n element.bind('blur', clear);\n getTemplate();\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiDatePicker')\n .directive('uiDateTime', uiDateTime);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/5.\n */\n(function () {\n 'use strict';\n\n uiDateTimeAppend.$inject = [];\n function uiDateTimeAppend() {\n return {\n link: function (scope, element) {\n element.bind('click', function () {\n element.find('input')[0].focus();\n });\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiDatePicker')\n .directive('uiDateTimeAppend', uiDateTimeAppend);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/2.\n * Hack By angular datePicker\n */\n\n(function () {\n 'use strict';\n\n var datePickerConfig = {\n template: 'app/kernel/ui-elements/ui-datepicker/views/datepicker.html',\n view: 'month',\n views: ['year', 'month', 'date', 'hours', 'minutes'],\n momentNames: {\n year: 'year',\n month: 'month',\n date: 'day',\n hours: 'hours',\n minutes: 'minutes'\n },\n viewConfig: {\n year: ['years', 'isSameYear'],\n month: ['months', 'isSameMonth'],\n hours: ['hours', 'isSameHour'],\n minutes: ['minutes', 'isSameMinutes']\n },\n step: 5\n };\n\n angular.module('eHRD.kernel.uiElements.uiDatePicker')\n .constant('datePickerConfig', datePickerConfig);\n})();\n\n/**\n * Created by Bruce on 2016/12/2.\n * Hack By angular datePicker\n */\n\n(function () {\n 'use strict';\n\n var dateTimeConfig = {\n template: function (attrs, id) {\n return '' +\n '
';\n },\n format: 'YYYY-MM-DD HH:mm',\n views: ['date', 'year', 'month', 'hours', 'minutes'],\n autoClose: false,\n position: 'relative'\n };\n\n angular.module('eHRD.kernel.uiElements.uiDatePicker')\n .constant('dateTimeConfig', dateTimeConfig);\n})();\n\n/**\n * Created by Bruce on 2016/12/6.\n * Hack By angular bootstrap calendar\n */\n\n(function () {\n 'use strict';\n\n angular.module('eHRD.kernel.uiElements.uiCalendar',[]);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n dateFns.$inject = [];\n function dateFns() {\n var MILLISECONDS_IN_HOUR = 3600000;\n var MILLISECONDS_IN_MINUTE = 60000;\n var DEFAULT_ADDITIONAL_DIGITS = 2;\n var parseTokenDateTimeDelimeter = /[T ]/;\n var parseTokenPlainTime = /:/;\n var parseTokenYY = /^(\\d{2})$/;\n var parseTokensYYY = [\n /^([+-]\\d{2})$/,\n /^([+-]\\d{3})$/,\n /^([+-]\\d{4})$/\n ];\n var parseTokenYYYY = /^(\\d{4})/;\n var parseTokensYYYYY = [\n /^([+-]\\d{4})/,\n /^([+-]\\d{5})/,\n /^([+-]\\d{6})/\n ];\n var parseTokenMM = /^-(\\d{2})$/;\n var parseTokenDDD = /^-?(\\d{3})$/;\n var parseTokenMMDD = /^-?(\\d{2})-?(\\d{2})$/;\n var parseTokenWww = /^-?W(\\d{2})$/;\n var parseTokenWwwD = /^-?W(\\d{2})-?(\\d{1})$/;\n var parseTokenHH = /^(\\d{2}([.,]\\d*)?)$/;\n var parseTokenHHMM = /^(\\d{2}):?(\\d{2}([.,]\\d*)?)$/;\n var parseTokenHHMMSS = /^(\\d{2}):?(\\d{2}):?(\\d{2}([.,]\\d*)?)$/;\n var parseTokenTimezone = /([Z+-].*)$/;\n var parseTokenTimezoneZ = /^(Z)$/;\n var parseTokenTimezoneHH = /^([+-])(\\d{2})$/;\n var parseTokenTimezoneHHMM = /^([+-])(\\d{2}):?(\\d{2})$/;\n\n var enLocale = function () {\n distanceInWords= buildDistanceInWordsLocale;\n format= buildFormatLocale;\n };\n\n function buildDistanceInWordsLocale() {\n var distanceInWordsLocale = {\n lessThanXSeconds: {\n one: 'less than a second',\n other: 'less than {{count}} seconds'\n },\n xSeconds: {\n one: '1 second',\n other: '{{count}} seconds'\n },\n halfAMinute: 'half a minute',\n lessThanXMinutes: {\n one: 'less than a minute',\n other: 'less than {{count}} minutes'\n },\n xMinutes: {\n one: '1 minute',\n other: '{{count}} minutes'\n },\n aboutXHours: {\n one: 'about 1 hour',\n other: 'about {{count}} hours'\n },\n xHours: {\n one: '1 hour',\n other: '{{count}} hours'\n },\n xDays: {\n one: '1 day',\n other: '{{count}} days'\n },\n aboutXMonths: {\n one: 'about 1 month',\n other: 'about {{count}} months'\n },\n xMonths: {\n one: '1 month',\n other: '{{count}} months'\n },\n aboutXYears: {\n one: 'about 1 year',\n other: 'about {{count}} years'\n },\n xYears: {\n one: '1 year',\n other: '{{count}} years'\n },\n overXYears: {\n one: 'over 1 year',\n other: 'over {{count}} years'\n },\n almostXYears: {\n one: 'almost 1 year',\n other: 'almost {{count}} years'\n }\n };\n function localize(token, count, options) {\n options = options || {};\n var result;\n if (angular.isString(distanceInWordsLocale[token])) {\n result = distanceInWordsLocale[token];\n } else if (count === 1) {\n result = distanceInWordsLocale[token].one;\n } else {\n result = distanceInWordsLocale[token].other.replace('{{count}}', count);\n }\n if (options.addSuffix) {\n if (options.comparison > 0) {\n return 'in ' + result;\n } else {\n return result + ' ago';\n }\n }\n return result;\n }\n return { localize: localize };\n }\n function buildFormatLocale() {\n var months3char = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ];\n var monthsFull = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n ];\n var weekdays2char = [\n 'Su',\n 'Mo',\n 'Tu',\n 'We',\n 'Th',\n 'Fr',\n 'Sa'\n ];\n var weekdays3char = [\n 'Sun',\n 'Mon',\n 'Tue',\n 'Wed',\n 'Thu',\n 'Fri',\n 'Sat'\n ];\n var weekdaysFull = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday'\n ];\n var meridiemUppercase = [\n 'AM',\n 'PM'\n ];\n var meridiemLowercase = [\n 'am',\n 'pm'\n ];\n var meridiemFull = [\n 'a.m.',\n 'p.m.'\n ];\n var formatters = {\n 'MMM': function (date) {\n return months3char[date.getMonth()];\n },\n 'MMMM': function (date) {\n return monthsFull[date.getMonth()];\n },\n 'dd': function (date) {\n return weekdays2char[date.getDay()];\n },\n 'ddd': function (date) {\n return weekdays3char[date.getDay()];\n },\n 'dddd': function (date) {\n return weekdaysFull[date.getDay()];\n },\n 'A': function (date) {\n return date.getHours() / 12 >= 1 ? meridiemUppercase[1] : meridiemUppercase[0];\n },\n 'a': function (date) {\n return date.getHours() / 12 >= 1 ? meridiemLowercase[1] : meridiemLowercase[0];\n },\n 'aa': function (date) {\n return date.getHours() / 12 >= 1 ? meridiemFull[1] : meridiemFull[0];\n }\n };\n var ordinalFormatters = [\n 'M',\n 'D',\n 'DDD',\n 'd',\n 'Q',\n 'W'\n ];\n ordinalFormatters.forEach(function (formatterToken) {\n formatters[formatterToken + 'o'] = function (date, formatters) {\n return ordinal(formatters[formatterToken](date));\n };\n });\n return {\n formatters: formatters,\n formattingTokensRegExp: buildFormattingTokensRegExp(formatters)\n };\n }\n function ordinal(number) {\n var rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + 'st';\n case 2:\n return number + 'nd';\n case 3:\n return number + 'rd';\n }\n }\n return number + 'th';\n }\n\n function buildFormattingTokensRegExp(formatters) {\n var commonFormatterKeys = [\n 'M',\n 'MM',\n 'Q',\n 'D',\n 'DD',\n 'DDD',\n 'DDDD',\n 'd',\n 'E',\n 'W',\n 'WW',\n 'YY',\n 'YYYY',\n 'GG',\n 'GGGG',\n 'H',\n 'HH',\n 'h',\n 'hh',\n 'm',\n 'mm',\n 's',\n 'ss',\n 'S',\n 'SS',\n 'SSS',\n 'Z',\n 'ZZ',\n 'X',\n 'x'\n ];\n var formattingTokens = commonFormatterKeys.concat(Object.keys(formatters)).sort().reverse();\n var formattingTokensRegExp = new RegExp('(\\\\[[^\\\\[]*\\\\])|(\\\\\\\\)?' + '(' + formattingTokens.join('|') + '|.)', 'g');\n return formattingTokensRegExp;\n }\n\n function parse(dateString, options) {\n if (isDate(dateString)) {\n return new Date(dateString.getTime());\n } else if (!angular.isString(dateString)) {\n return new Date(dateString);\n }\n options = options || {};\n var additionalDigits = options.additionalDigits;\n if (additionalDigits == null) {\n additionalDigits = DEFAULT_ADDITIONAL_DIGITS;\n }\n var dateStrings = splitDateString(dateString);\n var parseYearResult = parseYear(dateStrings.date, additionalDigits);\n var year = parseYearResult.year;\n var restDateString = parseYearResult.restDateString;\n var date = parseDate(restDateString, year);\n if (date) {\n var timestamp = date.getTime();\n var time = 0;\n var offset;\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n }\n if (dateStrings.timezone) {\n offset = parseTimezone(dateStrings.timezone);\n } else {\n offset = new Date(timestamp + time).getTimezoneOffset();\n offset = new Date(timestamp + time + offset * MILLISECONDS_IN_MINUTE).getTimezoneOffset();\n }\n return new Date(timestamp + time + offset * MILLISECONDS_IN_MINUTE);\n } else {\n return new Date(dateString);\n }\n }\n function splitDateString(dateString) {\n var dateStrings = {};\n var array = dateString.split(parseTokenDateTimeDelimeter);\n var timeString;\n if (parseTokenPlainTime.test(array[0])) {\n dateStrings.date = null;\n timeString = array[0];\n } else {\n dateStrings.date = array[0];\n timeString = array[1];\n }\n if (timeString) {\n var token = parseTokenTimezone.exec(timeString);\n if (token) {\n dateStrings.time = timeString.replace(token[1], '');\n dateStrings.timezone = token[1];\n } else {\n dateStrings.time = timeString;\n }\n }\n return dateStrings;\n }\n function parseYear(dateString, additionalDigits) {\n var parseTokenYYY = parseTokensYYY[additionalDigits];\n var parseTokenYYYYY = parseTokensYYYYY[additionalDigits];\n var token;\n token = parseTokenYYYY.exec(dateString) || parseTokenYYYYY.exec(dateString);\n if (token) {\n var yearString = token[1];\n return {\n year: parseInt(yearString, 10),\n restDateString: dateString.slice(yearString.length)\n };\n }\n token = parseTokenYY.exec(dateString) || parseTokenYYY.exec(dateString);\n if (token) {\n var centuryString = token[1];\n return {\n year: parseInt(centuryString, 10) * 100,\n restDateString: dateString.slice(centuryString.length)\n };\n }\n return { year: null };\n }\n function parseDate(dateString, year) {\n if (year === null) {\n return null;\n }\n var token;\n var date;\n var month;\n var week;\n if (dateString.length === 0) {\n date = new Date(0);\n date.setUTCFullYear(year);\n return date;\n }\n token = parseTokenMM.exec(dateString);\n if (token) {\n date = new Date(0);\n month = parseInt(token[1], 10) - 1;\n date.setUTCFullYear(year, month);\n return date;\n }\n token = parseTokenDDD.exec(dateString);\n if (token) {\n date = new Date(0);\n var dayOfYear = parseInt(token[1], 10);\n date.setUTCFullYear(year, 0, dayOfYear);\n return date;\n }\n token = parseTokenMMDD.exec(dateString);\n if (token) {\n date = new Date(0);\n month = parseInt(token[1], 10) - 1;\n var day = parseInt(token[2], 10);\n date.setUTCFullYear(year, month, day);\n return date;\n }\n token = parseTokenWww.exec(dateString);\n if (token) {\n week = parseInt(token[1], 10) - 1;\n return dayOfISOYear(year, week);\n }\n token = parseTokenWwwD.exec(dateString);\n if (token) {\n week = parseInt(token[1], 10) - 1;\n var dayOfWeek = parseInt(token[2], 10) - 1;\n return dayOfISOYear(year, week, dayOfWeek);\n }\n return null;\n }\n function parseTime(timeString) {\n var token;\n var hours;\n var minutes;\n token = parseTokenHH.exec(timeString);\n if (token) {\n hours = parseFloat(token[1].replace(',', '.'));\n return hours % 24 * MILLISECONDS_IN_HOUR;\n }\n token = parseTokenHHMM.exec(timeString);\n if (token) {\n hours = parseInt(token[1], 10);\n minutes = parseFloat(token[2].replace(',', '.'));\n return hours % 24 * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE;\n }\n token = parseTokenHHMMSS.exec(timeString);\n if (token) {\n hours = parseInt(token[1], 10);\n minutes = parseInt(token[2], 10);\n var seconds = parseFloat(token[3].replace(',', '.'));\n return hours % 24 * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE + seconds * 1000;\n }\n return null;\n }\n function parseTimezone(timezoneString) {\n var token;\n var absoluteOffset;\n token = parseTokenTimezoneZ.exec(timezoneString);\n if (token) {\n return 0;\n }\n token = parseTokenTimezoneHH.exec(timezoneString);\n if (token) {\n absoluteOffset = parseInt(token[2], 10) * 60;\n return token[1] === '+' ? -absoluteOffset : absoluteOffset;\n }\n token = parseTokenTimezoneHHMM.exec(timezoneString);\n if (token) {\n absoluteOffset = parseInt(token[2], 10) * 60 + parseInt(token[3], 10);\n return token[1] === '+' ? -absoluteOffset : absoluteOffset;\n }\n return 0;\n }\n function dayOfISOYear(isoYear, week, day) {\n week = week || 0;\n day = day || 0;\n var date = new Date(0);\n date.setUTCFullYear(isoYear, 0, 4);\n var fourthOfJanuaryDay = date.getUTCDay() || 7;\n var diff = week * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n }\n\n function endOfWeek(dirtyDate, options) {\n var weekStartsOn = options ? options.weekStartsOn || 0 : 0;\n var date = parse(dirtyDate);\n var day = date.getDay();\n var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn);\n date.setDate(date.getDate() + diff);\n date.setHours(23, 59, 59, 999);\n return date;\n }\n\n function endOfMonth(dirtyDate) {\n var date = parse(dirtyDate);\n var month = date.getMonth();\n date.setFullYear(date.getFullYear(), month + 1, 0);\n date.setHours(23, 59, 59, 999);\n return date;\n }\n\n function differenceInDays(dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft);\n var dateRight = parse(dirtyDateRight);\n var sign = compareAsc(dateLeft, dateRight);\n var difference = Math.abs(differenceInCalendarDays(dateLeft, dateRight));\n dateLeft.setDate(dateLeft.getDate() - sign * difference);\n var isLastDayNotFull = compareAsc(dateLeft, dateRight) === -sign;\n return sign * (difference - isLastDayNotFull);\n }\n\n function addDays(dirtyDate, amount) {\n var date = parse(dirtyDate);\n date.setDate(date.getDate() + amount);\n return date;\n }\n\n function addHours(dirtyDate, amount) {\n var date = parse(dirtyDate);\n date.setHours(date.getHours() + amount);\n return date;\n }\n\n function addISOYears(dirtyDate, amount) {\n return setISOYear(dirtyDate, getISOYear(dirtyDate) + amount);\n }\n\n function addMilliseconds(dirtyDate, amount) {\n var date = parse(dirtyDate);\n date.setMilliseconds(date.getMilliseconds() + amount);\n return date;\n }\n\n function addMinutes(dirtyDate, amount) {\n var date = parse(dirtyDate);\n date.setMinutes(date.getMinutes() + amount);\n return date;\n }\n\n function addMonths(dirtyDate, amount) {\n var date = parse(dirtyDate);\n var desiredMonth = date.getMonth() + amount;\n var dateWithDesiredMonth = new Date(0);\n dateWithDesiredMonth.setFullYear(date.getFullYear(), desiredMonth, 1);\n dateWithDesiredMonth.setHours(0, 0, 0, 0);\n var daysInMonth = getDaysInMonth(dateWithDesiredMonth);\n date.setMonth(desiredMonth, Math.min(daysInMonth, date.getDate()));\n return date;\n }\n\n function addQuarters(dirtyDate, amount) {\n var months = amount * 3;\n return addMonths(dirtyDate, months);\n }\n\n function addSeconds(dirtyDate, amount) {\n var date = parse(dirtyDate);\n date.setSeconds(date.getSeconds() + amount);\n return date;\n }\n\n function addWeeks(dirtyDate, amount) {\n var days = amount * 7;\n return addDays(dirtyDate, days);\n }\n\n function addYears(dirtyDate, amount) {\n return addMonths(dirtyDate, amount * 12);\n }\n\n function closestIndexTo(dirtyDateToCompare, dirtyDatesArray) {\n if (!(dirtyDatesArray instanceof Array)) {\n throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array');\n }\n var dateToCompare = parse(dirtyDateToCompare);\n var timeToCompare = dateToCompare.getTime();\n var result;\n var minDistance;\n dirtyDatesArray.forEach(function (dirtyDate, index) {\n var currentDate = parse(dirtyDate);\n var distance = Math.abs(timeToCompare - currentDate.getTime());\n if (angular.isUndefined(result) || distance < minDistance) {\n result = index;\n minDistance = distance;\n }\n });\n return result;\n }\n\n function closestTo(dirtyDateToCompare, dirtyDatesArray) {\n if (!(dirtyDatesArray instanceof Array)) {\n throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array');\n }\n var dateToCompare = parse(dirtyDateToCompare);\n var timeToCompare = dateToCompare.getTime();\n var result;\n var minDistance;\n dirtyDatesArray.forEach(function (dirtyDate) {\n var currentDate = parse(dirtyDate);\n var distance = Math.abs(timeToCompare - currentDate.getTime());\n if (angular.isUndefined(result) || distance < minDistance) {\n result = currentDate;\n minDistance = distance;\n }\n });\n return result;\n }\n\n function compareAsc(dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft);\n var timeLeft = dateLeft.getTime();\n var dateRight = parse(dirtyDateRight);\n var timeRight = dateRight.getTime();\n if (timeLeft < timeRight) {\n return -1;\n } else if (timeLeft > timeRight) {\n return 1;\n } else {\n return 0;\n }\n }\n\n function compareDesc(dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft);\n var timeLeft = dateLeft.getTime();\n var dateRight = parse(dirtyDateRight);\n var timeRight = dateRight.getTime();\n if (timeLeft > timeRight) {\n return -1;\n } else if (timeLeft < timeRight) {\n return 1;\n } else {\n return 0;\n }\n }\n\n\n function differenceInCalendarDays(dirtyDateLeft, dirtyDateRight) {\n var MILLISECONDS_IN_MINUTE = 60000;\n var MILLISECONDS_IN_DAY = 86400000;\n var startOfDayLeft = startOfDay(dirtyDateLeft);\n var startOfDayRight = startOfDay(dirtyDateRight);\n var timestampLeft = startOfDayLeft.getTime() - startOfDayLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE;\n var timestampRight = startOfDayRight.getTime() - startOfDayRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE;\n return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY);\n }\n\n function differenceInCalendarISOWeeks(dirtyDateLeft, dirtyDateRight) {\n var MILLISECONDS_IN_MINUTE = 60000;\n var MILLISECONDS_IN_WEEK = 604800000;\n var startOfISOWeekLeft = startOfISOWeek(dirtyDateLeft);\n var startOfISOWeekRight = startOfISOWeek(dirtyDateRight);\n var timestampLeft = startOfISOWeekLeft.getTime() - startOfISOWeekLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE;\n var timestampRight = startOfISOWeekRight.getTime() - startOfISOWeekRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE;\n return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK);\n }\n\n function differenceInCalendarISOYears(dirtyDateLeft, dirtyDateRight) {\n return getISOYear(dirtyDateLeft) - getISOYear(dirtyDateRight);\n }\n\n function differenceInCalendarMonths(dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft);\n var dateRight = parse(dirtyDateRight);\n var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear();\n var monthDiff = dateLeft.getMonth() - dateRight.getMonth();\n return yearDiff * 12 + monthDiff;\n }\n\n function differenceInCalendarQuarters(dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft);\n var dateRight = parse(dirtyDateRight);\n var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear();\n var quarterDiff = getQuarter(dateLeft) - getQuarter(dateRight);\n return yearDiff * 4 + quarterDiff;\n }\n\n function differenceInCalendarWeeks(dirtyDateLeft, dirtyDateRight, options) {\n var MILLISECONDS_IN_MINUTE = 60000;\n var MILLISECONDS_IN_WEEK = 604800000;\n var startOfWeekLeft = startOfWeek(dirtyDateLeft, options);\n var startOfWeekRight = startOfWeek(dirtyDateRight, options);\n var timestampLeft = startOfWeekLeft.getTime() - startOfWeekLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE;\n var timestampRight = startOfWeekRight.getTime() - startOfWeekRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE;\n return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK);\n }\n\n function differenceInCalendarYears(dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft);\n var dateRight = parse(dirtyDateRight);\n return dateLeft.getFullYear() - dateRight.getFullYear();\n }\n\n function differenceInHours(dirtyDateLeft, dirtyDateRight) {\n var MILLISECONDS_IN_HOUR = 3600000;\n var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_HOUR;\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff);\n }\n\n function differenceInISOYears(dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft);\n var dateRight = parse(dirtyDateRight);\n var sign = compareAsc(dateLeft, dateRight);\n var difference = Math.abs(differenceInCalendarISOYears(dateLeft, dateRight));\n dateLeft = subISOYears(dateLeft, sign * difference);\n var isLastISOYearNotFull = compareAsc(dateLeft, dateRight) === -sign;\n return sign * (difference - isLastISOYearNotFull);\n }\n\n function differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft);\n var dateRight = parse(dirtyDateRight);\n return dateLeft.getTime() - dateRight.getTime();\n }\n\n function differenceInMinutes(dirtyDateLeft, dirtyDateRight) {\n var MILLISECONDS_IN_MINUTE = 60000;\n var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_MINUTE;\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff);\n }\n\n function differenceInMonths(dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft);\n var dateRight = parse(dirtyDateRight);\n var sign = compareAsc(dateLeft, dateRight);\n var difference = Math.abs(differenceInCalendarMonths(dateLeft, dateRight));\n dateLeft.setMonth(dateLeft.getMonth() - sign * difference);\n var isLastMonthNotFull = compareAsc(dateLeft, dateRight) === -sign;\n return sign * (difference - isLastMonthNotFull);\n }\n\n function differenceInQuarters(dirtyDateLeft, dirtyDateRight) {\n var diff = differenceInMonths(dirtyDateLeft, dirtyDateRight) / 3;\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff);\n }\n\n function differenceInSeconds(dirtyDateLeft, dirtyDateRight) {\n var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / 1000;\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff);\n }\n\n function differenceInWeeks(dirtyDateLeft, dirtyDateRight) {\n var diff = differenceInDays(dirtyDateLeft, dirtyDateRight) / 7;\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff);\n }\n\n function differenceInYears(dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft);\n var dateRight = parse(dirtyDateRight);\n var sign = compareAsc(dateLeft, dateRight);\n var difference = Math.abs(differenceInCalendarYears(dateLeft, dateRight));\n dateLeft.setFullYear(dateLeft.getFullYear() - sign * difference);\n var isLastYearNotFull = compareAsc(dateLeft, dateRight) === -sign;\n return sign * (difference - isLastYearNotFull);\n }\n\n var distanceInWords = function (dirtyDateToCompare, dirtyDate, options) {\n var MINUTES_IN_DAY = 1440;\n var MINUTES_IN_ALMOST_TWO_DAYS = 2520;\n var MINUTES_IN_MONTH = 43200;\n var MINUTES_IN_TWO_MONTHS = 86400;\n options = options || {};\n var comparison = compareDesc(dirtyDateToCompare, dirtyDate);\n var locale = options.locale || enLocale;\n var localize = locale.distanceInWords.localize;\n var localizeOptions = {\n addSuffix: options.addSuffix,\n comparison: comparison\n };\n var dateLeft, dateRight;\n if (comparison > 0) {\n dateLeft = parse(dirtyDateToCompare);\n dateRight = parse(dirtyDate);\n } else {\n dateLeft = parse(dirtyDate);\n dateRight = parse(dirtyDateToCompare);\n }\n var seconds = differenceInSeconds(dateRight, dateLeft);\n var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset();\n var minutes = Math.round(seconds / 60) - offset;\n var months;\n if (minutes < 2) {\n if (options.includeSeconds) {\n if (seconds < 5) {\n return localize('lessThanXSeconds', 5, localizeOptions);\n } else if (seconds < 10) {\n return localize('lessThanXSeconds', 10, localizeOptions);\n } else if (seconds < 20) {\n return localize('lessThanXSeconds', 20, localizeOptions);\n } else if (seconds < 40) {\n return localize('halfAMinute', null, localizeOptions);\n } else if (seconds < 60) {\n return localize('lessThanXMinutes', 1, localizeOptions);\n } else {\n return localize('xMinutes', 1, localizeOptions);\n }\n } else {\n if (minutes === 0) {\n return localize('lessThanXMinutes', 1, localizeOptions);\n } else {\n return localize('xMinutes', minutes, localizeOptions);\n }\n }\n } else if (minutes < 45) {\n return localize('xMinutes', minutes, localizeOptions);\n } else if (minutes < 90) {\n return localize('aboutXHours', 1, localizeOptions);\n } else if (minutes < MINUTES_IN_DAY) {\n var hours = Math.round(minutes / 60);\n return localize('aboutXHours', hours, localizeOptions);\n } else if (minutes < MINUTES_IN_ALMOST_TWO_DAYS) {\n return localize('xDays', 1, localizeOptions);\n } else if (minutes < MINUTES_IN_MONTH) {\n var days = Math.round(minutes / MINUTES_IN_DAY);\n return localize('xDays', days, localizeOptions);\n } else if (minutes < MINUTES_IN_TWO_MONTHS) {\n months = Math.round(minutes / MINUTES_IN_MONTH);\n return localize('aboutXMonths', months, localizeOptions);\n }\n months = differenceInMonths(dateRight, dateLeft);\n if (months < 12) {\n var nearestMonth = Math.round(minutes / MINUTES_IN_MONTH);\n return localize('xMonths', nearestMonth, localizeOptions);\n } else {\n var monthsSinceStartOfYear = months % 12;\n var years = Math.floor(months / 12);\n if (monthsSinceStartOfYear < 3) {\n return localize('aboutXYears', years, localizeOptions);\n } else if (monthsSinceStartOfYear < 9) {\n return localize('overXYears', years, localizeOptions);\n } else {\n return localize('almostXYears', years + 1, localizeOptions);\n }\n }\n };\n\n function distanceInWordsStrict(dirtyDateToCompare, dirtyDate, options) {\n var MINUTES_IN_DAY = 1440;\n var MINUTES_IN_MONTH = 43200;\n var MINUTES_IN_YEAR = 525600;\n options = options || {};\n var comparison = compareDesc(dirtyDateToCompare, dirtyDate);\n var locale = options.locale || enLocale;\n var localize = locale.distanceInWords.localize;\n var localizeOptions = {\n addSuffix: options.addSuffix,\n comparison: comparison\n };\n var dateLeft, dateRight;\n if (comparison > 0) {\n dateLeft = parse(dirtyDateToCompare);\n dateRight = parse(dirtyDate);\n } else {\n dateLeft = parse(dirtyDate);\n dateRight = parse(dirtyDateToCompare);\n }\n var unit = options.unit;\n var mathPartial = Math[options.partialMethod || 'floor'];\n var seconds = differenceInSeconds(dateRight, dateLeft);\n var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset();\n var minutes = mathPartial(seconds / 60) - offset;\n var hours, days, months, years;\n if (!unit) {\n if (minutes < 1) {\n unit = 's';\n } else if (minutes < 60) {\n unit = 'm';\n } else if (minutes < MINUTES_IN_DAY) {\n unit = 'h';\n } else if (minutes < MINUTES_IN_MONTH) {\n unit = 'd';\n } else if (minutes < MINUTES_IN_YEAR) {\n unit = 'M';\n } else {\n unit = 'Y';\n }\n }\n if (unit === 's') {\n return localize('xSeconds', seconds, localizeOptions);\n } else if (unit === 'm') {\n return localize('xMinutes', minutes, localizeOptions);\n } else if (unit === 'h') {\n hours = mathPartial(minutes / 60);\n return localize('xHours', hours, localizeOptions);\n } else if (unit === 'd') {\n days = mathPartial(minutes / MINUTES_IN_DAY);\n return localize('xDays', days, localizeOptions);\n } else if (unit === 'M') {\n months = mathPartial(minutes / MINUTES_IN_MONTH);\n return localize('xMonths', months, localizeOptions);\n } else if (unit === 'Y') {\n years = mathPartial(minutes / MINUTES_IN_YEAR);\n return localize('xYears', years, localizeOptions);\n }\n throw new Error('Unknown unit: ' + unit);\n }\n\n function distanceInWordsToNow(dirtyDate, options) {\n return distanceInWords(Date.now(), dirtyDate, options);\n }\n\n function eachDay(dirtyStartDate, dirtyEndDate) {\n var startDate = parse(dirtyStartDate);\n var endDate = parse(dirtyEndDate);\n var endTime = endDate.getTime();\n if (startDate.getTime() > endTime) {\n throw new Error('The first date cannot be after the second date');\n }\n var dates = [];\n var currentDate = startDate;\n currentDate.setHours(0, 0, 0, 0);\n while (currentDate.getTime() <= endTime) {\n dates.push(parse(currentDate));\n currentDate.setDate(currentDate.getDate() + 1);\n }\n return dates;\n }\n\n function endOfDay(dirtyDate) {\n var date = parse(dirtyDate);\n date.setHours(23, 59, 59, 999);\n return date;\n }\n\n function endOfHour(dirtyDate) {\n var date = parse(dirtyDate);\n date.setMinutes(59, 59, 999);\n return date;\n }\n\n function endOfISOWeek(dirtyDate) {\n return endOfWeek(dirtyDate, { weekStartsOn: 1 });\n }\n\n function endOfISOYear(dirtyDate) {\n var year = getISOYear(dirtyDate);\n var fourthOfJanuaryOfNextYear = new Date(0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n var date = startOfISOWeek(fourthOfJanuaryOfNextYear);\n date.setMilliseconds(date.getMilliseconds() - 1);\n return date;\n }\n\n function endOfMinute(dirtyDate) {\n var date = parse(dirtyDate);\n date.setSeconds(59, 999);\n return date;\n }\n\n function endOfQuarter(dirtyDate) {\n var date = parse(dirtyDate);\n var currentMonth = date.getMonth();\n var month = currentMonth - currentMonth % 3 + 3;\n date.setMonth(month, 0);\n date.setHours(23, 59, 59, 999);\n return date;\n }\n\n function endOfSecond(dirtyDate) {\n var date = parse(dirtyDate);\n date.setMilliseconds(999);\n return date;\n }\n\n function endOfToday() {\n return endOfDay(new Date());\n }\n\n function endOfTomorrow() {\n var now = new Date();\n var year = now.getFullYear();\n var month = now.getMonth();\n var day = now.getDate();\n var date = new Date(0);\n date.setFullYear(year, month, day + 1);\n date.setHours(23, 59, 59, 999);\n return date;\n }\n\n function endOfYear(dirtyDate) {\n var date = parse(dirtyDate);\n var year = date.getFullYear();\n date.setFullYear(year + 1, 0, 0);\n date.setHours(23, 59, 59, 999);\n return date;\n }\n\n function endOfYesterday() {\n var now = new Date();\n var year = now.getFullYear();\n var month = now.getMonth();\n var day = now.getDate();\n var date = new Date(0);\n date.setFullYear(year, month, day - 1);\n date.setHours(23, 59, 59, 999);\n return date;\n }\n\n var format = function(dirtyDate, formatStr, options) {\n formatStr = formatStr || 'YYYY-MM-DDTHH:mm:ss.SSSZ';\n options = options || {};\n var locale = options.locale || enLocale;\n var formatLocale = locale.format;\n var date = parse(dirtyDate);\n var formatFn = buildFormatFn(formatStr, formatLocale);\n return formatFn(date);\n };\n\n var formatters = {\n 'M': function (date) {\n return date.getMonth() + 1;\n },\n 'MM': function (date) {\n return addLeadingZeros(date.getMonth() + 1, 2);\n },\n 'Q': function (date) {\n return Math.ceil((date.getMonth() + 1) / 3);\n },\n 'D': function (date) {\n return date.getDate();\n },\n 'DD': function (date) {\n return addLeadingZeros(date.getDate(), 2);\n },\n 'DDD': function (date) {\n return getDayOfYear(date);\n },\n 'DDDD': function (date) {\n return addLeadingZeros(getDayOfYear(date), 3);\n },\n 'd': function (date) {\n return date.getDay();\n },\n 'E': function (date) {\n return date.getDay() || 7;\n },\n 'W': function (date) {\n return getISOWeek(date);\n },\n 'WW': function (date) {\n return addLeadingZeros(getISOWeek(date), 2);\n },\n 'YY': function (date) {\n return addLeadingZeros(date.getFullYear(), 4).substr(2);\n },\n 'YYYY': function (date) {\n return addLeadingZeros(date.getFullYear(), 4);\n },\n 'GG': function (date) {\n return String(getISOYear(date)).substr(2);\n },\n 'GGGG': function (date) {\n return getISOYear(date);\n },\n 'H': function (date) {\n return date.getHours();\n },\n 'HH': function (date) {\n return addLeadingZeros(date.getHours(), 2);\n },\n 'h': function (date) {\n var hours = date.getHours();\n if (hours === 0) {\n return 12;\n } else if (hours > 12) {\n return hours % 12;\n } else {\n return hours;\n }\n },\n 'hh': function (date) {\n return addLeadingZeros(formatters['h'](date), 2);\n },\n 'm': function (date) {\n return date.getMinutes();\n },\n 'mm': function (date) {\n return addLeadingZeros(date.getMinutes(), 2);\n },\n 's': function (date) {\n return date.getSeconds();\n },\n 'ss': function (date) {\n return addLeadingZeros(date.getSeconds(), 2);\n },\n 'S': function (date) {\n return Math.floor(date.getMilliseconds() / 100);\n },\n 'SS': function (date) {\n return Math.floor(date.getMilliseconds() / 10);\n },\n 'SSS': function (date) {\n return date.getMilliseconds();\n },\n 'Z': function (date) {\n return formatTimezone(date.getTimezoneOffset(), ':');\n },\n 'ZZ': function (date) {\n return formatTimezone(date.getTimezoneOffset());\n },\n 'X': function (date) {\n return Math.floor(date.getTime() / 1000);\n },\n 'x': function (date) {\n return date.getTime();\n }\n };\n function buildFormatFn(formatStr, formatLocale) {\n var array = formatStr.match(formatLocale.formattingTokensRegExp);\n var length = array.length;\n var i;\n var formatter;\n for (i = 0; i < length; i++) {\n formatter = formatLocale.formatters[array[i]] || formatters[array[i]];\n if (formatter) {\n array[i] = formatter;\n } else {\n array[i] = removeFormattingTokens(array[i]);\n }\n }\n return function (date) {\n var output = '';\n for (var i = 0; i < length; i++) {\n if (array[i] instanceof Function) {\n output += array[i](date, formatters);\n } else {\n output += array[i];\n }\n }\n return output;\n };\n }\n function removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n }\n function formatTimezone(offset, delimeter) {\n delimeter = delimeter || '';\n var sign = offset > 0 ? '-' : '+';\n var absOffset = Math.abs(offset);\n var hours = Math.floor(absOffset / 60);\n var minutes = absOffset % 60;\n return sign + addLeadingZeros(hours, 2) + delimeter + addLeadingZeros(minutes, 2);\n }\n function addLeadingZeros(number, targetLength) {\n var output = Math.abs(number).toString();\n while (output.length < targetLength) {\n output = '0' + output;\n }\n return output;\n }\n\n function getDate(dirtyDate) {\n var date = parse(dirtyDate);\n var dayOfMonth = date.getDate();\n return dayOfMonth;\n }\n\n function getDay(dirtyDate) {\n var date = parse(dirtyDate);\n var day = date.getDay();\n return day;\n }\n\n function getDaysInYear(dirtyDate) {\n return isLeapYear(dirtyDate) ? 366 : 365;\n }\n\n function getDayOfYear(dirtyDate) {\n var date = parse(dirtyDate);\n var diff = differenceInCalendarDays(date, startOfYear(date));\n var dayOfYear = diff + 1;\n return dayOfYear;\n }\n\n function getDaysInMonth(dirtyDate) {\n var date = parse(dirtyDate);\n var year = date.getFullYear();\n var monthIndex = date.getMonth();\n var lastDayOfMonth = new Date(0);\n lastDayOfMonth.setFullYear(year, monthIndex + 1, 0);\n lastDayOfMonth.setHours(0, 0, 0, 0);\n return lastDayOfMonth.getDate();\n }\n\n function getHours(dirtyDate) {\n var date = parse(dirtyDate);\n var hours = date.getHours();\n return hours;\n }\n\n function getISODay(dirtyDate) {\n var date = parse(dirtyDate);\n var day = date.getDay();\n if (day === 0) {\n day = 7;\n }\n return day;\n }\n\n function getISOWeek(dirtyDate) {\n var MILLISECONDS_IN_WEEK = 604800000;\n var date = parse(dirtyDate);\n var diff = startOfISOWeek(date).getTime() - startOfISOYear(date).getTime();\n return Math.round(diff / MILLISECONDS_IN_WEEK) + 1;\n }\n\n function getISOWeeksInYear(dirtyDate) {\n var MILLISECONDS_IN_WEEK = 604800000;\n var thisYear = startOfISOYear(dirtyDate);\n var nextYear = startOfISOYear(addWeeks(thisYear, 60));\n var diff = nextYear.valueOf() - thisYear.valueOf();\n return Math.round(diff / MILLISECONDS_IN_WEEK);\n }\n\n function getISOYear(dirtyDate) {\n var date = parse(dirtyDate);\n var year = date.getFullYear();\n var fourthOfJanuaryOfNextYear = new Date(0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n var startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n var fourthOfJanuaryOfThisYear = new Date(0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n var startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n if (date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n }\n\n function getMilliseconds(dirtyDate) {\n var date = parse(dirtyDate);\n var milliseconds = date.getMilliseconds();\n return milliseconds;\n }\n\n function getMinutes(dirtyDate) {\n var date = parse(dirtyDate);\n var minutes = date.getMinutes();\n return minutes;\n }\n\n function getMonth(dirtyDate) {\n var date = parse(dirtyDate);\n var month = date.getMonth();\n return month;\n }\n\n function getQuarter(dirtyDate) {\n var date = parse(dirtyDate);\n var quarter = Math.floor(date.getMonth() / 3) + 1;\n return quarter;\n }\n\n function getSeconds(dirtyDate) {\n var date = parse(dirtyDate);\n var seconds = date.getSeconds();\n return seconds;\n }\n\n function getYear(dirtyDate) {\n var date = parse(dirtyDate);\n var year = date.getFullYear();\n return year;\n }\n\n function isAfter(dirtyDateToCompare, dirtyDate) {\n var dateToCompare = parse(dirtyDateToCompare);\n var date = parse(dirtyDate);\n return dateToCompare.getTime() > date.getTime();\n }\n\n function isBefore(dirtyDateToCompare, dirtyDate) {\n var dateToCompare = parse(dirtyDateToCompare);\n var date = parse(dirtyDate);\n return dateToCompare.getTime() < date.getTime();\n }\n\n function isDate(argument) {\n return argument instanceof Date;\n }\n\n function isEqual(dirtyLeftDate, dirtyRightDate) {\n var dateLeft = parse(dirtyLeftDate);\n var dateRight = parse(dirtyRightDate);\n return dateLeft.getTime() === dateRight.getTime();\n }\n\n function isFirstDayOfMonth(dirtyDate) {\n return parse(dirtyDate).getDate() === 1;\n }\n\n function isFriday(dirtyDate) {\n return parse(dirtyDate).getDay() === 5;\n }\n\n function isFuture(dirtyDate) {\n return parse(dirtyDate).getTime() > new Date().getTime();\n }\n\n function isLastDayOfMonth(dirtyDate) {\n var date = parse(dirtyDate);\n return endOfDay(date).getTime() === endOfMonth(date).getTime();\n }\n\n function isLeapYear(dirtyDate) {\n var date = parse(dirtyDate);\n var year = date.getFullYear();\n return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0;\n }\n\n function isMonday(dirtyDate) {\n return parse(dirtyDate).getDay() === 1;\n }\n\n function isPast(dirtyDate) {\n return parse(dirtyDate).getTime() < new Date().getTime();\n }\n\n function isSameDay(dirtyDateLeft, dirtyDateRight) {\n var dateLeftStartOfDay = startOfDay(dirtyDateLeft);\n var dateRightStartOfDay = startOfDay(dirtyDateRight);\n return dateLeftStartOfDay.getTime() === dateRightStartOfDay.getTime();\n }\n\n function isSameHour(dirtyDateLeft, dirtyDateRight) {\n var dateLeftStartOfHour = startOfHour(dirtyDateLeft);\n var dateRightStartOfHour = startOfHour(dirtyDateRight);\n return dateLeftStartOfHour.getTime() === dateRightStartOfHour.getTime();\n }\n\n function isSameISOWeek(dirtyDateLeft, dirtyDateRight) {\n return isSameWeek(dirtyDateLeft, dirtyDateRight, { weekStartsOn: 1 });\n }\n\n function isSameISOYear(dirtyDateLeft, dirtyDateRight) {\n var dateLeftStartOfYear = startOfISOYear(dirtyDateLeft);\n var dateRightStartOfYear = startOfISOYear(dirtyDateRight);\n return dateLeftStartOfYear.getTime() === dateRightStartOfYear.getTime();\n }\n\n function isSameMinute(dirtyDateLeft, dirtyDateRight) {\n var dateLeftStartOfMinute = startOfMinute(dirtyDateLeft);\n var dateRightStartOfMinute = startOfMinute(dirtyDateRight);\n return dateLeftStartOfMinute.getTime() === dateRightStartOfMinute.getTime();\n }\n\n function isSameMonth(dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft);\n var dateRight = parse(dirtyDateRight);\n return dateLeft.getFullYear() === dateRight.getFullYear() && dateLeft.getMonth() === dateRight.getMonth();\n }\n\n function isSameQuarter(dirtyDateLeft, dirtyDateRight) {\n var dateLeftStartOfQuarter = startOfQuarter(dirtyDateLeft);\n var dateRightStartOfQuarter = startOfQuarter(dirtyDateRight);\n return dateLeftStartOfQuarter.getTime() === dateRightStartOfQuarter.getTime();\n }\n\n function isSameSecond(dirtyDateLeft, dirtyDateRight) {\n var dateLeftStartOfSecond = startOfSecond(dirtyDateLeft);\n var dateRightStartOfSecond = startOfSecond(dirtyDateRight);\n return dateLeftStartOfSecond.getTime() === dateRightStartOfSecond.getTime();\n }\n\n function isSameWeek(dirtyDateLeft, dirtyDateRight, options) {\n var dateLeftStartOfWeek = startOfWeek(dirtyDateLeft, options);\n var dateRightStartOfWeek = startOfWeek(dirtyDateRight, options);\n return dateLeftStartOfWeek.getTime() === dateRightStartOfWeek.getTime();\n }\n\n function isSameYear(dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft);\n var dateRight = parse(dirtyDateRight);\n return dateLeft.getFullYear() === dateRight.getFullYear();\n }\n\n function isSaturday(dirtyDate) {\n return parse(dirtyDate).getDay() === 6;\n }\n\n function isSunday(dirtyDate) {\n return parse(dirtyDate).getDay() === 0;\n }\n\n function isThisHour(dirtyDate) {\n return isSameHour(new Date(), dirtyDate);\n }\n\n function isThisISOWeek(dirtyDate) {\n return isSameISOWeek(new Date(), dirtyDate);\n }\n\n function isThisISOYear(dirtyDate) {\n return isSameISOYear(new Date(), dirtyDate);\n }\n\n function isThisMinute(dirtyDate) {\n return isSameMinute(new Date(), dirtyDate);\n }\n\n function isThisMonth(dirtyDate) {\n return isSameMonth(new Date(), dirtyDate);\n }\n\n function isThisQuarter(dirtyDate) {\n return isSameQuarter(new Date(), dirtyDate);\n }\n\n function isThisSecond(dirtyDate) {\n return isSameSecond(new Date(), dirtyDate);\n }\n\n function isThisWeek(dirtyDate, options) {\n return isSameWeek(new Date(), dirtyDate, options);\n }\n\n function isThisYear(dirtyDate) {\n return isSameYear(new Date(), dirtyDate);\n }\n\n function isThursday(dirtyDate) {\n return parse(dirtyDate).getDay() === 4;\n }\n\n function isToday(dirtyDate) {\n return startOfDay(dirtyDate).getTime() === startOfDay(new Date()).getTime();\n }\n\n function isTomorrow(dirtyDate) {\n var tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n return startOfDay(dirtyDate).getTime() === startOfDay(tomorrow).getTime();\n }\n\n function isTuesday(dirtyDate) {\n return parse(dirtyDate).getDay() === 2;\n }\n\n function isValid(date) {\n if (isDate(date)) {\n return !isNaN(date);\n } else {\n throw new TypeError(toString.call(date) + ' is not an instance of Date');\n }\n }\n\n function isWednesday(dirtyDate) {\n return parse(dirtyDate).getDay() === 3;\n }\n\n function isWeekend(dirtyDate) {\n var date = parse(dirtyDate);\n var day = date.getDay();\n return day === 0 || day === 6;\n }\n\n function isWithinRange(dirtyDate, dirtyStartDate, dirtyEndDate) {\n var time = parse(dirtyDate).getTime();\n var startTime = parse(dirtyStartDate).getTime();\n var endTime = parse(dirtyEndDate).getTime();\n if (startTime > endTime) {\n throw new Error('The start of the range cannot be after the end of the range');\n }\n return time >= startTime && time <= endTime;\n }\n\n function isYesterday(dirtyDate) {\n var yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n return startOfDay(dirtyDate).getTime() === startOfDay(yesterday).getTime();\n }\n\n function lastDayOfISOWeek(dirtyDate) {\n return lastDayOfWeek(dirtyDate, { weekStartsOn: 1 });\n }\n\n function lastDayOfISOYear(dirtyDate) {\n var year = getISOYear(dirtyDate);\n var fourthOfJanuary = new Date(0);\n fourthOfJanuary.setFullYear(year + 1, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n var date = startOfISOWeek(fourthOfJanuary);\n date.setDate(date.getDate() - 1);\n return date;\n }\n\n function lastDayOfMonth(dirtyDate) {\n var date = parse(dirtyDate);\n var month = date.getMonth();\n date.setFullYear(date.getFullYear(), month + 1, 0);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n function lastDayOfQuarter(dirtyDate) {\n var date = parse(dirtyDate);\n var currentMonth = date.getMonth();\n var month = currentMonth - currentMonth % 3 + 3;\n date.setMonth(month, 0);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n function lastDayOfWeek(dirtyDate, options) {\n var weekStartsOn = options ? options.weekStartsOn || 0 : 0;\n var date = parse(dirtyDate);\n var day = date.getDay();\n var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn);\n date.setHours(0, 0, 0, 0);\n date.setDate(date.getDate() + diff);\n return date;\n }\n\n function lastDayOfYear(dirtyDate) {\n var date = parse(dirtyDate);\n var year = date.getFullYear();\n date.setFullYear(year + 1, 0, 0);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n function max() {\n var dirtyDates = Array.prototype.slice.call(arguments);\n var dates = dirtyDates.map(function (dirtyDate) {\n return parse(dirtyDate);\n });\n var latestTimestamp = Math.max.apply(null, dates);\n return new Date(latestTimestamp);\n }\n\n function min() {\n var dirtyDates = Array.prototype.slice.call(arguments);\n var dates = dirtyDates.map(function (dirtyDate) {\n return parse(dirtyDate);\n });\n var earliestTimestamp = Math.min.apply(null, dates);\n return new Date(earliestTimestamp);\n }\n\n function setDate(dirtyDate, dayOfMonth) {\n var date = parse(dirtyDate);\n date.setDate(dayOfMonth);\n return date;\n }\n\n function setDay(dirtyDate, day, options) {\n var weekStartsOn = options ? options.weekStartsOn || 0 : 0;\n var date = parse(dirtyDate);\n var currentDay = date.getDay();\n var remainder = day % 7;\n var dayIndex = (remainder + 7) % 7;\n var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay;\n return addDays(date, diff);\n }\n\n function setDayOfYear(dirtyDate, dayOfYear) {\n var date = parse(dirtyDate);\n date.setMonth(0);\n date.setDate(dayOfYear);\n return date;\n }\n\n function setHours(dirtyDate, hours) {\n var date = parse(dirtyDate);\n date.setHours(hours);\n return date;\n }\n\n function setISODay(dirtyDate, day) {\n var date = parse(dirtyDate);\n var currentDay = getISODay(date);\n var diff = day - currentDay;\n return addDays(date, diff);\n }\n\n function setISOWeek(dirtyDate, isoWeek) {\n var date = parse(dirtyDate);\n var diff = getISOWeek(date) - isoWeek;\n date.setDate(date.getDate() - diff * 7);\n return date;\n }\n\n function setISOYear(dirtyDate, isoYear) {\n var date = parse(dirtyDate);\n var diff = differenceInCalendarDays(date, startOfISOYear(date));\n var fourthOfJanuary = new Date(0);\n fourthOfJanuary.setFullYear(isoYear, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n date = startOfISOYear(fourthOfJanuary);\n date.setDate(date.getDate() + diff);\n return date;\n }\n\n function setMilliseconds(dirtyDate, milliseconds) {\n var date = parse(dirtyDate);\n date.setMilliseconds(milliseconds);\n return date;\n }\n\n function setMinutes(dirtyDate, minutes) {\n var date = parse(dirtyDate);\n date.setMinutes(minutes);\n return date;\n }\n\n function setMonth(dirtyDate, month) {\n var date = parse(dirtyDate);\n var year = date.getFullYear();\n var day = date.getDate();\n var dateWithDesiredMonth = new Date(0);\n dateWithDesiredMonth.setFullYear(year, month, 15);\n dateWithDesiredMonth.setHours(0, 0, 0, 0);\n var daysInMonth = getDaysInMonth(dateWithDesiredMonth);\n date.setMonth(month, Math.min(day, daysInMonth));\n return date;\n }\n\n function setQuarter(dirtyDate, quarter) {\n var date = parse(dirtyDate);\n var oldQuarter = Math.floor(date.getMonth() / 3) + 1;\n var diff = quarter - oldQuarter;\n return setMonth(date, date.getMonth() + diff * 3);\n }\n\n function setSeconds(dirtyDate, seconds) {\n var date = parse(dirtyDate);\n date.setSeconds(seconds);\n return date;\n }\n\n function setYear(dirtyDate, year) {\n var date = parse(dirtyDate);\n date.setFullYear(year);\n return date;\n }\n\n function startOfDay(dirtyDate) {\n var date = parse(dirtyDate);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n function startOfHour(dirtyDate) {\n var date = parse(dirtyDate);\n date.setMinutes(0, 0, 0);\n return date;\n }\n\n function startOfISOWeek(dirtyDate) {\n return startOfWeek(dirtyDate, { weekStartsOn: 1 });\n }\n\n function startOfISOYear(dirtyDate) {\n var year = getISOYear(dirtyDate);\n var fourthOfJanuary = new Date(0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n var date = startOfISOWeek(fourthOfJanuary);\n return date;\n }\n\n function startOfMinute(dirtyDate) {\n var date = parse(dirtyDate);\n date.setSeconds(0, 0);\n return date;\n }\n\n function startOfMonth(dirtyDate) {\n var date = parse(dirtyDate);\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n function startOfQuarter(dirtyDate) {\n var date = parse(dirtyDate);\n var currentMonth = date.getMonth();\n var month = currentMonth - currentMonth % 3;\n date.setMonth(month, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n function startOfSecond(dirtyDate) {\n var date = parse(dirtyDate);\n date.setMilliseconds(0);\n return date;\n }\n\n function startOfToday() {\n return startOfDay(new Date());\n }\n\n function startOfTomorrow() {\n var now = new Date();\n var year = now.getFullYear();\n var month = now.getMonth();\n var day = now.getDate();\n var date = new Date(0);\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n function startOfWeek(dirtyDate, options) {\n var weekStartsOn = options ? options.weekStartsOn || 0 : 0;\n var date = parse(dirtyDate);\n var day = date.getDay();\n var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n date.setDate(date.getDate() - diff);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n function startOfYear(dirtyDate) {\n var cleanDate = parse(dirtyDate);\n var date = new Date(0);\n date.setFullYear(cleanDate.getFullYear(), 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n function startOfYesterday() {\n var now = new Date();\n var year = now.getFullYear();\n var month = now.getMonth();\n var day = now.getDate();\n var date = new Date(0);\n date.setFullYear(year, month, day - 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n function subDays(dirtyDate, amount) {\n return addDays(dirtyDate, -amount);\n }\n\n function subHours(dirtyDate, amount) {\n return addHours(dirtyDate, -amount);\n }\n\n function subISOYears(dirtyDate, amount) {\n return addISOYears(dirtyDate, -amount);\n }\n\n function subMilliseconds(dirtyDate, amount) {\n return addMilliseconds(dirtyDate, -amount);\n }\n\n function subMinutes(dirtyDate, amount) {\n return addMinutes(dirtyDate, -amount);\n }\n\n function subMonths(dirtyDate, amount) {\n return addMonths(dirtyDate, -amount);\n }\n\n function subQuarters(dirtyDate, amount) {\n return addQuarters(dirtyDate, -amount);\n }\n\n function subSeconds(dirtyDate, amount) {\n return addSeconds(dirtyDate, -amount);\n }\n\n function subWeeks(dirtyDate, amount) {\n return addWeeks(dirtyDate, -amount);\n }\n\n function subYears(dirtyDate, amount) {\n return addYears(dirtyDate, -amount);\n }\n\n return{\n addDays: addDays,\n addHours: addHours,\n addISOYears: addISOYears,\n addMilliseconds: addMilliseconds,\n addMinutes: addMinutes,\n addMonths: addMonths,\n addQuarters: addQuarters,\n addSeconds: addSeconds,\n addWeeks: addWeeks,\n addYears: addYears,\n closestIndexTo: closestIndexTo,\n closestTo: closestTo,\n compareAsc: compareAsc,\n compareDesc: compareDesc,\n differenceInCalendarDays: differenceInCalendarDays,\n differenceInCalendarISOWeeks: differenceInCalendarISOWeeks,\n differenceInCalendarISOYears: differenceInCalendarISOYears,\n differenceInCalendarMonths: differenceInCalendarMonths,\n differenceInCalendarQuarters: differenceInCalendarQuarters,\n differenceInCalendarWeeks: differenceInCalendarWeeks,\n differenceInCalendarYears: differenceInCalendarYears,\n differenceInDays: differenceInDays,\n differenceInHours: differenceInHours,\n differenceInISOYears: differenceInISOYears,\n differenceInMilliseconds: differenceInMilliseconds,\n differenceInMinutes: differenceInMinutes,\n differenceInMonths: differenceInMonths,\n differenceInQuarters: differenceInQuarters,\n differenceInSeconds: differenceInSeconds,\n differenceInWeeks: differenceInWeeks,\n differenceInYears: differenceInYears,\n distanceInWords: distanceInWords,\n distanceInWordsStrict: distanceInWordsStrict,\n distanceInWordsToNow: distanceInWordsToNow,\n eachDay: eachDay,\n endOfDay: endOfDay,\n endOfHour: endOfHour,\n endOfISOWeek: endOfISOWeek,\n endOfISOYear: endOfISOYear,\n endOfMinute: endOfMinute,\n endOfMonth: endOfMonth,\n endOfQuarter: endOfQuarter,\n endOfSecond: endOfSecond,\n endOfToday: endOfToday,\n endOfTomorrow: endOfTomorrow,\n endOfWeek: endOfWeek,\n endOfYear: endOfYear,\n endOfYesterday: endOfYesterday,\n format: format,\n getDate: getDate,\n getDay: getDay,\n getDayOfYear: getDayOfYear,\n getDaysInMonth: getDaysInMonth,\n getDaysInYear: getDaysInYear,\n getHours: getHours,\n getISODay: getISODay,\n getISOWeek: getISOWeek,\n getISOWeeksInYear: getISOWeeksInYear,\n getISOYear: getISOYear,\n getMilliseconds: getMilliseconds,\n getMinutes: getMinutes,\n getMonth: getMonth,\n getQuarter: getQuarter,\n getSeconds: getSeconds,\n getYear: getYear,\n isAfter: isAfter,\n isBefore: isBefore,\n isDate: isDate,\n isEqual: isEqual,\n isFirstDayOfMonth: isFirstDayOfMonth,\n isFriday: isFriday,\n isFuture: isFuture,\n isLastDayOfMonth: isLastDayOfMonth,\n isLeapYear: isLeapYear,\n isMonday: isMonday,\n isPast: isPast,\n isSameDay: isSameDay,\n isSameHour: isSameHour,\n isSameISOWeek: isSameISOWeek,\n isSameISOYear: isSameISOYear,\n isSameMinute: isSameMinute,\n isSameMonth: isSameMonth,\n isSameQuarter: isSameQuarter,\n isSameSecond: isSameSecond,\n isSameWeek: isSameWeek,\n isSameYear: isSameYear,\n isSaturday: isSaturday,\n isSunday: isSunday,\n isThisHour: isThisHour,\n isThisISOWeek: isThisISOWeek,\n isThisISOYear: isThisISOYear,\n isThisMinute: isThisMinute,\n isThisMonth: isThisMonth,\n isThisQuarter: isThisQuarter,\n isThisSecond: isThisSecond,\n isThisWeek: isThisWeek,\n isThisYear: isThisYear,\n isThursday: isThursday,\n isToday: isToday,\n isTomorrow: isTomorrow,\n isTuesday: isTuesday,\n isValid: isValid,\n isWednesday: isWednesday,\n isWeekend: isWeekend,\n isWithinRange: isWithinRange,\n isYesterday: isYesterday,\n lastDayOfISOWeek: lastDayOfISOWeek,\n lastDayOfISOYear: lastDayOfISOYear,\n lastDayOfMonth: lastDayOfMonth,\n lastDayOfQuarter: lastDayOfQuarter,\n lastDayOfWeek: lastDayOfWeek,\n lastDayOfYear: lastDayOfYear,\n max: max,\n min: min,\n parse: parse,\n setDate: setDate,\n setDay: setDay,\n setDayOfYear: setDayOfYear,\n setHours: setHours,\n setISODay: setISODay,\n setISOWeek: setISOWeek,\n setISOYear: setISOYear,\n setMilliseconds: setMilliseconds,\n setMinutes: setMinutes,\n setMonth: setMonth,\n setQuarter: setQuarter,\n setSeconds: setSeconds,\n setYear: setYear,\n startOfDay: startOfDay,\n startOfHour: startOfHour,\n startOfISOWeek: startOfISOWeek,\n startOfISOYear: startOfISOYear,\n startOfMinute: startOfMinute,\n startOfMonth: startOfMonth,\n startOfQuarter: startOfQuarter,\n startOfSecond: startOfSecond,\n startOfToday: startOfToday,\n startOfTomorrow: startOfTomorrow,\n startOfWeek: startOfWeek,\n startOfYear: startOfYear,\n startOfYesterday: startOfYesterday,\n subDays: subDays,\n subHours: subHours,\n subISOYears: subISOYears,\n subMilliseconds: subMilliseconds,\n subMinutes: subMinutes,\n subMonths: subMonths,\n subQuarters: subQuarters,\n subSeconds: subSeconds,\n subWeeks: subWeeks,\n subYears: subYears\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .factory('dateFns', dateFns);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n\n(function () {\n 'use strict';\n\n calendarUtils.$inject = ['dateFns'];\n function calendarUtils(dateFns) {\n var WEEKEND_DAY_NUMBERS = [0, 6];\n var DAYS_IN_WEEK = 7;\n var HOURS_IN_DAY = 24;\n var MINUTES_IN_HOUR = 60;\n var endOfDay = dateFns.endOfDay;\n var addMinutes = dateFns.addMinutes;\n var differenceInDays = dateFns.differenceInDays;\n var startOfDay = dateFns.startOfDay;\n var isSameDay = dateFns.isSameDay;\n var getDay = dateFns.getDay;\n var startOfWeek = dateFns.startOfWeek;\n var addDays = dateFns.addDays;\n var endOfWeek = dateFns.endOfWeek;\n var differenceInSeconds = dateFns.differenceInSeconds;\n var startOfMonth = dateFns.startOfMonth;\n var endOfMonth = dateFns.endOfMonth;\n var isSameMonth = dateFns.isSameMonth;\n var isSameSecond = dateFns.isSameSecond;\n var setHours = dateFns.setHours;\n var setMinutes = dateFns.setMinutes;\n var startOfMinute = dateFns.startOfMinute;\n var differenceInMinutes = dateFns.differenceInMinutes;\n var addHours = dateFns.addHours;\n\n var getWeekViewEventSpan = function (event, offset, startOfWeek) {\n var span = 1;\n if (event.end) {\n var begin = event.start < startOfWeek ? startOfWeek : event.start;\n span = differenceInDays(addMinutes(endOfDay(event.end), 1), startOfDay(begin));\n if (span > DAYS_IN_WEEK) {\n span = DAYS_IN_WEEK;\n }\n }\n var totalLength = offset + span;\n if (totalLength > DAYS_IN_WEEK) {\n span -= (totalLength - DAYS_IN_WEEK);\n }\n return span;\n };\n var getWeekViewEventOffset = function (event, startOfWeek) {\n var offset = 0;\n if (startOfDay(event.start) > startOfWeek) {\n offset = differenceInDays(startOfDay(event.start), startOfWeek);\n }\n return offset;\n };\n var isEventIsPeriod = function (_a) {\n var event = _a.event, periodStart = _a.periodStart, periodEnd = _a.periodEnd;\n var eventStart = event.start;\n var eventEnd = event.end || event.start;\n if (eventStart > periodStart && eventStart < periodEnd) {\n return true;\n }\n if (eventEnd > periodStart && eventEnd < periodEnd) {\n return true;\n }\n if (eventStart < periodStart && eventEnd > periodEnd) {\n return true;\n }\n if (isSameSecond(eventStart, periodStart) || isSameSecond(eventStart, periodEnd)) {\n return true;\n }\n if (isSameSecond(eventEnd, periodStart) || isSameSecond(eventEnd, periodEnd)) {\n return true;\n }\n return false;\n };\n var getEventsInPeriod = function (_a) {\n var events = _a.events, periodStart = _a.periodStart, periodEnd = _a.periodEnd;\n return events.filter(function (event) { return isEventIsPeriod({ event: event, periodStart: periodStart, periodEnd: periodEnd }); });\n };\n var getWeekDay = function (_a) {\n var date = _a.date;\n var today = startOfDay(new Date());\n return {\n date: date,\n isPast: date < today,\n isToday: isSameDay(date, today),\n isFuture: date > today,\n isWeekend: WEEKEND_DAY_NUMBERS.indexOf(getDay(date)) > -1\n };\n };\n var getWeekViewHeader = function (_a) {\n var viewDate = _a.viewDate, weekStartsOn = _a.weekStartsOn;\n var start = startOfWeek(viewDate, { weekStartsOn: weekStartsOn });\n var days = [];\n for (var i = 0; i < DAYS_IN_WEEK; i++) {\n var date = addDays(start, i);\n days.push(getWeekDay({ date: date }));\n }\n return days;\n };\n var getWeekView = function (_a, isSort) {\n isSort = isSort || false;\n var _b = _a.events, events = _b === void 0 ? [] : _b, viewDate = _a.viewDate, weekStartsOn = _a.weekStartsOn;\n var startOfViewWeek = startOfWeek(viewDate, { weekStartsOn: weekStartsOn });\n var endOfViewWeek = endOfWeek(viewDate, { weekStartsOn: weekStartsOn });\n var eventsMapped = getEventsInPeriod({ events: events, periodStart: startOfViewWeek, periodEnd: endOfViewWeek }).map(function (event) {\n var offset = getWeekViewEventOffset(event, startOfViewWeek);\n var span = getWeekViewEventSpan(event, offset, startOfViewWeek);\n return {\n event: event,\n offset: offset,\n span: span,\n startsBeforeWeek: event.start < startOfViewWeek,\n endsAfterWeek: (event.end || event.start) > endOfViewWeek\n };\n });\n\n if(isSort){\n eventsMapped.sort(function (itemA, itemB) {\n var startSecondsDiff = differenceInSeconds(itemA.event.start, itemB.event.start);\n if (startSecondsDiff === 0) {\n return differenceInSeconds(itemB.event.end || itemB.event.start, itemA.event.end || itemA.event.start);\n }\n return startSecondsDiff;\n })\n }\n\n var eventRows = [];\n var allocatedEvents = [];\n eventsMapped.forEach(function (event, index) {\n if (allocatedEvents.indexOf(event) === -1) {\n allocatedEvents.push(event);\n var rowSpan_1 = event.span + event.offset;\n var otherRowEvents = eventsMapped.slice(index + 1).filter(function (nextEvent) {\n if (nextEvent.offset >= rowSpan_1 &&\n rowSpan_1 + nextEvent.span <= DAYS_IN_WEEK &&\n allocatedEvents.indexOf(nextEvent) === -1) {\n nextEvent.offset -= rowSpan_1;\n rowSpan_1 += nextEvent.span + nextEvent.offset;\n allocatedEvents.push(nextEvent);\n return true;\n }\n });\n eventRows.push({\n row: [\n event\n ].concat(otherRowEvents)\n });\n }\n });\n return eventRows;\n };\n var getMonthView = function (_a) {\n var _b = _a.events, events = _b === void 0 ? [] : _b, viewDate = _a.viewDate, weekStartsOn = _a.weekStartsOn;\n var start = startOfWeek(startOfMonth(viewDate), { weekStartsOn: weekStartsOn });\n var end = endOfWeek(endOfMonth(viewDate), { weekStartsOn: weekStartsOn });\n var eventsInMonth = getEventsInPeriod({\n events: events,\n periodStart: start,\n periodEnd: end\n });\n var days = [];\n var i;\n for (i = 0; i < differenceInDays(end, start) + 1; i++) {\n var date = addDays(start, i);\n var day = getWeekDay({ date: date });\n var events_1 = getEventsInPeriod({\n events: eventsInMonth,\n periodStart: startOfDay(date),\n periodEnd: endOfDay(date)\n });\n day.inMonth = isSameMonth(date, viewDate);\n day.events = events_1;\n day.badgeTotal = events_1.length;\n days.push(day);\n }\n var rows = Math.floor(days.length / 7);\n var rowOffsets = [];\n for (i = 0; i < rows; i++) {\n rowOffsets.push(i * 7);\n }\n return {\n rowOffsets: rowOffsets,\n days: days\n };\n };\n var getDayView = function (_a) {\n var _b = _a.events, events = _b === void 0 ? [] : _b, viewDate = _a.viewDate, hourSegments = _a.hourSegments, dayStart = _a.dayStart, dayEnd = _a.dayEnd, eventWidth = _a.eventWidth, segmentHeight = _a.segmentHeight;\n var startOfView = setMinutes(setHours(startOfDay(viewDate), dayStart.hour), dayStart.minute);\n var endOfView = setMinutes(setHours(startOfMinute(endOfDay(viewDate)), dayEnd.hour), dayEnd.minute);\n var previousDayEvents = [];\n var dayViewEvents = getEventsInPeriod({\n events: events.filter(function (event) { return !event.allDay; }),\n periodStart: startOfView,\n periodEnd: endOfView\n }).sort(function (eventA, eventB) {\n return eventA.start.valueOf() - eventB.start.valueOf();\n }).map(function (event) {\n var eventStart = event.start;\n var eventEnd = event.end || eventStart;\n var startsBeforeDay = eventStart < startOfView;\n var endsAfterDay = eventEnd > endOfView;\n var hourHeightModifier = (hourSegments * segmentHeight) / MINUTES_IN_HOUR;\n var top = 0;\n if (eventStart > startOfView) {\n top += differenceInMinutes(eventStart, startOfView);\n }\n top *= hourHeightModifier;\n var startDate = startsBeforeDay ? startOfView : eventStart;\n var endDate = endsAfterDay ? endOfView : eventEnd;\n var height = differenceInMinutes(endDate, startDate);\n if (!event.end) {\n height = segmentHeight;\n }\n else {\n height *= hourHeightModifier;\n }\n var bottom = top + height;\n var overlappingPreviousEvents = previousDayEvents.filter(function (previousEvent) {\n var previousEventTop = previousEvent.top;\n var previousEventBottom = previousEvent.top + previousEvent.height;\n if (top < previousEventBottom && previousEventBottom < bottom) {\n return true;\n }\n else if (previousEventTop <= top && bottom <= previousEventBottom) {\n return true;\n }\n return false;\n });\n var left = 0;\n while (overlappingPreviousEvents.some(function (previousEvent) { return previousEvent.left === left; })) {\n left += eventWidth;\n }\n var dayEvent = {\n event: event,\n height: height,\n width: eventWidth,\n top: top,\n left: left,\n startsBeforeDay: startsBeforeDay,\n endsAfterDay: endsAfterDay\n };\n if (height > 0) {\n previousDayEvents.push(dayEvent);\n }\n return dayEvent;\n }).filter(function (dayEvent) { return dayEvent.height > 0; });\n var width = Math.max.apply(Math, dayViewEvents.map(function (event) { return event.left + event.width; }));\n var allDayEvents = getEventsInPeriod({\n events: events.filter(function (event) { return event.allDay; }),\n periodStart: startOfDay(startOfView),\n periodEnd: endOfDay(endOfView)\n });\n return {\n events: dayViewEvents,\n width: width,\n allDayEvents: allDayEvents\n };\n };\n var getDayViewHourGrid = function (_a) {\n var viewDate = _a.viewDate, hourSegments = _a.hourSegments, dayStart = _a.dayStart, dayEnd = _a.dayEnd;\n var hours = [];\n var startOfView = setMinutes(setHours(startOfDay(viewDate), dayStart.hour), dayStart.minute);\n var endOfView = setMinutes(setHours(startOfMinute(endOfDay(viewDate)), dayEnd.hour), dayEnd.minute);\n var segmentDuration = MINUTES_IN_HOUR / hourSegments;\n var startOfViewDay = startOfDay(viewDate);\n for (var i = 0; i < HOURS_IN_DAY; i++) {\n var segments = [];\n for (var j = 0; j < hourSegments; j++) {\n var date = addMinutes(addHours(startOfViewDay, i), j * segmentDuration);\n if (date >= startOfView && date < endOfView) {\n segments.push({\n date: date,\n isStart: j === 0\n });\n }\n }\n if (segments.length > 0) {\n hours.push({ segments: segments });\n }\n }\n return hours;\n };\n\n return{\n getMonthView: getMonthView,\n getWeekView: getWeekView,\n getDayView: getDayView,\n getWeekViewEventOffset: getWeekViewEventOffset,\n getWeekViewHeader: getWeekViewHeader,\n getDayViewHourGrid: getDayViewHourGrid\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .factory('calendarUtils', calendarUtils);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n\n(function () {\n 'use strict';\n\n calendarTitle.$inject = ['calendarConfig', 'calendarHelper', '$filter'];\n function calendarTitle(calendarConfig, calendarHelper, $filter) {\n function day(viewDate) {\n return calendarHelper.formatDate(viewDate, calendarConfig.titleFormats.day);\n }\n\n\n function week(viewDate) {\n return $filter('translate')('FIELD.' + calendarConfig.titleFormats.week, {\n week: moment(viewDate).isoWeek(),\n year: moment(viewDate).startOf('week').format('YYYY')\n });\n // return calendarConfig.titleFormats.week\n // .replace('{week}', moment(viewDate).isoWeek())\n // .replace('{year}', moment(viewDate).startOf('week').format('YYYY'))\n // ;\n }\n\n function month(viewDate) {\n return calendarHelper.formatDate(viewDate, calendarConfig.titleFormats.month);\n }\n\n function year(viewDate) {\n return calendarHelper.formatDate(viewDate, calendarConfig.titleFormats.year);\n }\n\n return {\n day: day,\n week: week,\n month: month,\n year: year\n };\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .factory('calendarTitle', calendarTitle);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n\n(function () {\n 'use strict';\n\n calendarHelper.$inject = ['$http', '$q', '$templateRequest', '$templateCache', '$interpolate', 'dateFilter', 'calendarConfig', 'calendarUtils'];\n function calendarHelper($http, $q, $templateRequest, $templateCache, $interpolate, dateFilter, calendarConfig, calendarUtils) {\n\n function formatDate(date, format) {\n if (calendarConfig.dateFormatter === 'angular') {\n return dateFilter(moment(date).toDate(), format);\n } else if (calendarConfig.dateFormatter === 'moment') {\n return moment(date).format(format);\n } else {\n throw new Error('Unknown date formatter: ' + calendarConfig.dateFormatter);\n }\n }\n\n function adjustEndDateFromStartDiff(oldStart, newStart, oldEnd) {\n if (!oldEnd) {\n return oldEnd;\n }\n var diffInSeconds = moment(newStart).diff(moment(oldStart));\n return moment(oldEnd).add(diffInSeconds);\n }\n\n function getRecurringEventPeriod(eventPeriod, recursOn, containerPeriodStart) {\n\n var eventStart = moment(eventPeriod.start);\n var eventEnd = moment(eventPeriod.end);\n var periodStart = moment(containerPeriodStart);\n\n if (recursOn) {\n\n switch (recursOn) {\n case 'year':\n eventStart.set({\n year: periodStart.year()\n });\n break;\n\n case 'month':\n eventStart.set({\n year: periodStart.year(),\n month: periodStart.month()\n });\n break;\n\n default:\n throw new Error('Invalid value (' + recursOn + ') given for recurs on. Can only be year or month.');\n }\n\n eventEnd = adjustEndDateFromStartDiff(eventPeriod.start, eventStart, eventEnd);\n\n }\n\n return {start: eventStart, end: eventEnd};\n\n }\n\n function eventIsInPeriod(event, periodStart, periodEnd) {\n\n periodStart = moment(periodStart);\n periodEnd = moment(periodEnd);\n\n var eventPeriod = getRecurringEventPeriod({start: event.startsAt, end: event.endsAt || event.startsAt}, event.recursOn, periodStart);\n var eventStart = eventPeriod.start;\n var eventEnd = eventPeriod.end;\n\n return (eventStart.isAfter(periodStart) && eventStart.isBefore(periodEnd)) ||\n (eventEnd.isAfter(periodStart) && eventEnd.isBefore(periodEnd)) ||\n (eventStart.isBefore(periodStart) && eventEnd.isAfter(periodEnd)) ||\n eventStart.isSame(periodStart) ||\n eventEnd.isSame(periodEnd);\n\n }\n\n function filterEventsInPeriod(events, startPeriod, endPeriod) {\n return events.filter(function(event) {\n return eventIsInPeriod(event, startPeriod, endPeriod);\n });\n }\n\n function getEventsInPeriod(calendarDate, period, allEvents) {\n var startPeriod = moment(calendarDate).startOf(period);\n var endPeriod = moment(calendarDate).endOf(period);\n return filterEventsInPeriod(allEvents, startPeriod, endPeriod);\n }\n\n function getBadgeTotal(events) {\n return events.filter(function(event) {\n return event.incrementsBadgeTotal !== false;\n }).length;\n }\n\n function getWeekDayNames() {\n var weekdays = [];\n var count = 0;\n while (count < 7) {\n weekdays.push(formatDate(moment().weekday(count++), calendarConfig.dateFormats.weekDay));\n }\n return weekdays;\n }\n\n function getYearView(events, viewDate, cellModifier) {\n\n var view = [];\n var eventsInPeriod = getEventsInPeriod(viewDate, 'year', events);\n var month = moment(viewDate).startOf('year');\n var count = 0;\n while (count < 12) {\n var startPeriod = month.clone();\n var endPeriod = startPeriod.clone().endOf('month');\n var periodEvents = filterEventsInPeriod(eventsInPeriod, startPeriod, endPeriod);\n var cell = {\n label: formatDate(startPeriod, calendarConfig.dateFormats.month),\n isToday: startPeriod.isSame(moment().startOf('month')),\n events: periodEvents,\n date: startPeriod,\n badgeTotal: getBadgeTotal(periodEvents)\n };\n\n cellModifier({calendarCell: cell});\n view.push(cell);\n month.add(1, 'month');\n count++;\n }\n\n return view;\n\n }\n\n function getMonthView(events, viewDate, cellModifier) {\n\n // hack required to work with the calendar-utils api\n events.forEach(function(event) {\n event.start = event.startsAt;\n event.end = event.endsAt;\n });\n\n var view = calendarUtils.getMonthView({\n events: events,\n viewDate: viewDate,\n weekStartsOn: moment().startOf('week').day()\n });\n\n view.days = view.days.map(function(day) {\n day.date = moment(day.date);\n day.label = day.date.date();\n day.badgeTotal = getBadgeTotal(day.events);\n if (!calendarConfig.displayAllMonthEvents && !day.inMonth) {\n day.events = [];\n }\n cellModifier({calendarCell: day});\n return day;\n });\n\n // remove hack\n events.forEach(function(event) {\n delete event.start;\n delete event.end;\n });\n\n return view;\n\n }\n\n function getWeekView(events, viewDate, isSort) {\n isSort = isSort || false;\n var days = calendarUtils.getWeekViewHeader({\n viewDate: viewDate,\n weekStartsOn: moment().startOf('week').day()\n }).map(function(day) {\n day.date = moment(day.date);\n day.weekDayLabel = formatDate(day.date, calendarConfig.dateFormats.weekDay);\n day.dayLabel = formatDate(day.date, calendarConfig.dateFormats.day);\n return day;\n });\n\n var startOfWeek = moment(viewDate).startOf('week');\n var endOfWeek = moment(viewDate).endOf('week');\n\n var eventRows = calendarUtils.getWeekView({\n viewDate: viewDate,\n weekStartsOn: moment().startOf('week').day(),\n events: filterEventsInPeriod(events, startOfWeek, endOfWeek).map(function(event) {\n\n var weekViewStart = moment(startOfWeek).startOf('day');\n\n var eventPeriod = getRecurringEventPeriod({\n start: moment(event.startsAt),\n end: moment(event.endsAt || event.startsAt)\n }, event.recursOn, weekViewStart);\n\n eventPeriod.originalEvent = event;\n\n return eventPeriod;\n\n })\n }, isSort).map(function(eventRow) {\n eventRow.row = eventRow.row.map(function(rowEvent) {\n rowEvent.event = rowEvent.event.originalEvent;\n return rowEvent;\n });\n\n return eventRow;\n\n });\n\n return {days: days, eventRows: eventRows};\n\n }\n\n function getDayView(events, viewDate, dayViewStart, dayViewEnd, dayViewSplit, dayViewEventWidth) {\n\n var dayStart = (dayViewStart || '00:00').split(':');\n var dayEnd = (dayViewEnd || '23:59').split(':');\n\n var view = calendarUtils.getDayView({\n events: events.map(function(event) { // hack required to work with event API\n event.start = event.startsAt;\n event.end = event.endsAt;\n return event;\n }),\n viewDate: viewDate,\n hourSegments: 60 / dayViewSplit,\n dayStart: {\n hour: dayStart[0],\n minute: dayStart[1]\n },\n dayEnd: {\n hour: dayEnd[0],\n minute: dayEnd[1]\n },\n eventWidth: dayViewEventWidth ? +dayViewEventWidth : 150,\n segmentHeight: 30\n });\n\n // remove hack to work with new event API\n events.forEach(function(event) {\n delete event.start;\n delete event.end;\n });\n\n return view;\n\n }\n\n function getWeekViewWithTimes(events, viewDate, dayViewStart, dayViewEnd, dayViewSplit) {\n var weekView = getWeekView(events, viewDate);\n var newEvents = [];\n var flattenedEvents = [];\n weekView.eventRows.forEach(function(row) {\n row.row.forEach(function(eventRow) {\n flattenedEvents.push(eventRow.event);\n });\n });\n weekView.days.forEach(function(day) {\n var dayEvents = flattenedEvents.filter(function(event) {\n return moment(event.startsAt).startOf('day').isSame(moment(day.date).startOf('day'));\n });\n var newDayEvents = getDayView(\n dayEvents,\n day.date,\n dayViewStart,\n dayViewEnd,\n dayViewSplit\n ).events;\n newEvents = newEvents.concat(newDayEvents);\n });\n weekView.eventRows = [{\n row: newEvents.map(function(dayEvent) {\n var event = dayEvent.event;\n return {\n event: event,\n top: dayEvent.top,\n offset: calendarUtils.getWeekViewEventOffset(\n {start: event.startsAt, end: event.endsAt},\n moment(viewDate).startOf('week')\n )\n };\n })\n }];\n return weekView;\n }\n\n function getDayViewHeight(dayViewStart, dayViewEnd, dayViewSplit) {\n var dayViewStartM = moment(dayViewStart || '00:00', 'HH:mm');\n var dayViewEndM = moment(dayViewEnd || '23:59', 'HH:mm');\n var hourHeight = (60 / dayViewSplit) * 30;\n return ((dayViewEndM.diff(dayViewStartM, 'minutes') / 60) * hourHeight) + 3;\n }\n\n function loadTemplates() {\n var promises = [];\n Object.keys(calendarConfig.templates).map(function(key) {\n var templateUrl = calendarConfig.templates[key];\n if(angular.isUndefined($templateCache.get(templateUrl))){\n var deferred = $q.defer();\n $http.get(templateUrl).success(function(data) {\n var templateContents = data\n .replace('{{', $interpolate.startSymbol())\n .replace('}}', $interpolate.endSymbol());\n $templateCache.put(templateUrl, templateContents);\n deferred.resolve({\n templateContents: templateContents,\n templateUrl: templateUrl\n });\n }).error(function() {\n deferred.reject();\n });\n promises.push(deferred.promise);\n }else{\n promises.push($templateRequest(templateUrl));\n }\n });\n\n return $q.all(promises);\n }\n\n return {\n getWeekDayNames: getWeekDayNames,\n getYearView: getYearView,\n getMonthView: getMonthView,\n getWeekView: getWeekView,\n getDayView: getDayView,\n getWeekViewWithTimes: getWeekViewWithTimes,\n getDayViewHeight: getDayViewHeight,\n adjustEndDateFromStartDiff: adjustEndDateFromStartDiff,\n formatDate: formatDate,\n loadTemplates: loadTemplates,\n eventIsInPeriod: eventIsInPeriod //expose for testing only\n };\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .factory('calendarHelper', calendarHelper);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n\n(function () {\n 'use strict';\n\n calendarEventTitle.$inject = ['calendarDateFilter', 'calendarTruncateEventTitleFilter'];\n function calendarEventTitle(calendarDateFilter, calendarTruncateEventTitleFilter) {\n function yearView(event) {\n return event.title + ' (' + calendarDateFilter(event.startsAt, 'datetime', true) + ')';\n }\n\n function monthView(event) {\n return calendarDateFilter(event.startsAt, 'time', true) + ' - ' + calendarDateFilter(event.endsAt, 'time', true) + ' ' + event.title;\n // return event.title + ' (' + calendarDateFilter(event.startsAt, 'time', true) + ')';\n }\n\n function monthViewTooltip(event) {\n return calendarDateFilter(event.startsAt, 'time', true) + ' - ' + event.title;\n }\n\n function weekView(event) {\n return event.title;\n }\n\n function weekViewTooltip(event) {\n return event.title;\n }\n\n function dayView(event) {\n return event.allDay ? event.title : calendarTruncateEventTitleFilter(event.title, 20, event.height);\n }\n\n function dayViewTooltip(event) {\n return event.title;\n }\n\n return {\n yearView: yearView,\n monthView: monthView,\n monthViewTooltip: monthViewTooltip,\n weekView: weekView,\n weekViewTooltip: weekViewTooltip,\n dayView: dayView,\n dayViewTooltip: dayViewTooltip\n };\n\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .factory('calendarEventTitle', calendarEventTitle);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n calendarTrustAsHtml.$inject = ['$sce'];\n function calendarTrustAsHtml($sce) {\n return function(text) {\n return $sce.trustAsHtml(text);\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .filter('calendarTrustAsHtml', calendarTrustAsHtml);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n calendarTruncateEventTitle.$inject = [];\n function calendarTruncateEventTitle() {\n return function(string, length, boxHeight) {\n if (!string) {\n return '';\n }\n\n //Only truncate if if actually needs truncating\n if (string.length >= length && string.length / 20 > boxHeight / 30) {\n return string.substr(0, length) + '...';\n } else {\n return string;\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .filter('calendarTruncateEventTitle', calendarTruncateEventTitle);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n calendarLimitTo.$inject = ['limitToFilter'];\n function calendarLimitTo(limitToFilter) {\n if (angular.version.minor >= 4) { //1.4+ supports the begin attribute\n return limitToFilter;\n }\n\n //Copied from the angular source. Only 1.4 has the begin functionality.\n return function(input, limit, begin) {\n if (Math.abs(Number(limit)) === Infinity) {\n limit = Number(limit);\n } else {\n limit = parseInt(limit);\n }\n if (isNaN(limit)) {\n return input;\n }\n\n if (angular.isNumber(input)) {\n input = input.toString();\n }\n if (!angular.isArray(input) && !angular.isString(input)) {\n return input;\n }\n\n begin = (!begin || isNaN(begin)) ? 0 : parseInt(begin);\n begin = (begin < 0 && begin >= -input.length) ? input.length + begin : begin;\n\n if (limit >= 0) {\n return input.slice(begin, begin + limit);\n } else if (begin === 0) {\n return input.slice(limit, input.length);\n } else {\n return input.slice(Math.max(0, begin + limit), begin);\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .filter('calendarLimitTo', calendarLimitTo);\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n calendarDate.$inject = ['calendarHelper', 'calendarConfig'];\n function calendarDate(calendarHelper, calendarConfig) {\n function calendarDate(date, format, getFromConfig) {\n\n if (getFromConfig === true) {\n format = calendarConfig.dateFormats[format];\n }\n\n return calendarHelper.formatDate(date, format);\n\n }\n\n // This is stateful because the locale can change as well\n // as calendarConfig.dateFormats which would change the value outside of this filter\n calendarDate.$stateful = true;\n\n return calendarDate;\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .filter('calendarDate', calendarDate);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n mwlResizable.$inject = [];\n function mwlResizable() {\n return {\n restrict: 'A',\n controller: ['$element', '$scope', '$parse', '$attrs', '$timeout', function ($element, $scope, $parse, $attrs, $timeout) {\n if (!interact) {\n return;\n }\n\n var snap, snapGridDimensions;\n if ($attrs.snapGrid) {\n snapGridDimensions = $parse($attrs.snapGrid)($scope);\n snap = {\n targets: [\n interact.createSnapGrid(snapGridDimensions)\n ]\n };\n }\n\n var originalDimensions = {};\n var originalDimensionsStyle = {};\n var resizeEdge;\n\n function getUnitsResized(edge, elm) {\n var unitsResized = {};\n unitsResized.edge = edge;\n if (edge === 'start') {\n unitsResized.x = elm.data('x');\n unitsResized.y = elm.data('y');\n } else if (edge === 'end') {\n unitsResized.x = parseFloat(elm.css('width').replace('px', '')) - originalDimensions.width;\n unitsResized.y = parseFloat(elm.css('height').replace('px', '')) - originalDimensions.height;\n }\n return unitsResized;\n }\n\n interact($element[0]).resizable({\n edges: $parse($attrs.resizeEdges)($scope),\n snap: snap,\n onstart: function(event) {\n\n resizeEdge = 'end';\n var elm = angular.element(event.target);\n originalDimensions.height = elm[0].offsetHeight;\n originalDimensions.width = elm[0].offsetWidth;\n originalDimensionsStyle.height = elm.css('height');\n originalDimensionsStyle.width = elm.css('width');\n\n },\n onmove: function(event) {\n\n if (event.rect.width > 0 && event.rect.height > 0) {\n var elm = angular.element(event.target);\n var x = parseFloat(elm.data('x') || 0);\n var y = parseFloat(elm.data('y') || 0);\n\n elm.css({\n width: event.rect.width + 'px',\n height: event.rect.height + 'px'\n });\n\n // translate when resizing from top or left edges\n x += event.deltaRect.left;\n y += event.deltaRect.top;\n\n elm.css('transform', 'translate(' + x + 'px,' + y + 'px)');\n\n elm.data('x', x);\n elm.data('y', y);\n\n if (event.deltaRect.left !== 0 || event.deltaRect.top !== 0) {\n resizeEdge = 'start';\n }\n\n if ($attrs.onResize) {\n $parse($attrs.onResize)($scope, getUnitsResized(resizeEdge, elm));\n $scope.$apply();\n }\n\n }\n\n },\n onend: function(event) {\n\n var elm = angular.element(event.target);\n var unitsResized = getUnitsResized(resizeEdge, elm);\n\n $timeout(function() {\n elm\n .data('x', null)\n .data('y', null)\n .css({\n transform: '',\n width: originalDimensionsStyle.width,\n height: originalDimensionsStyle.height\n });\n });\n\n if ($attrs.onResizeEnd) {\n $parse($attrs.onResizeEnd)($scope, unitsResized);\n $scope.$apply();\n }\n\n }\n });\n\n $scope.$watch($attrs.mwlResizable, function(enabled) {\n interact($element[0]).resizable({\n enabled: enabled\n });\n });\n\n $scope.$on('$destroy', function() {\n interact($element[0]).unset();\n });\n }]\n };\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .directive('mwlResizable', mwlResizable);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n mwlElementDimensions.$inject = [];\n function mwlElementDimensions() {\n return {\n restrict: 'A',\n controller: ['$element', '$scope', '$parse', '$attrs', '$window', function ($element, $scope, $parse, $attrs, $window) {\n function setDimensions() {\n $parse($attrs.mwlElementDimensions).assign($scope, {\n width: $element[0].offsetWidth - 1,\n height: $element[0].offsetHeight\n });\n $scope.$applyAsync();\n }\n\n var win = angular.element($window);\n\n win.bind('resize', setDimensions);\n\n setDimensions();\n\n $scope.$on('$destroy', function() {\n win.unbind('resize', setDimensions);\n });\n }]\n };\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .directive('mwlElementDimensions', mwlElementDimensions);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n mwlDynamicDirectiveTemplate.$inject = [];\n function mwlDynamicDirectiveTemplate() {\n return {\n restrict: 'A',\n controller: ['$http', '$compile', '$scope', '$attrs', '$element', '$templateCache', '$interpolate', '$log', 'calendarConfig', 'calendarHelper',\n function ($http, $compile, $scope, $attrs, $element, $templateCache, $interpolate, $log, calendarConfig, calendarHelper) {\n $scope.$watch($attrs.overrides, function(overrides) {\n\n var templateName = calendarConfig.templates[$attrs.name];\n\n if ( overrides && angular.isObject(overrides) && overrides[$attrs.name] ) {\n if ($templateCache.get(overrides[$attrs.name])) {\n templateName = overrides[$attrs.name];\n } else {\n $log.warn('Bootstrap Calendar', 'The custom template for ' + overrides[$attrs.name] +\n ' was not found in the template cache. Please ensure it is pre-loaded via a script tag ' +\n ' or ' +\n 'via a tool such as https://www.npmjs.com/package/gulp-angular-templatecache');\n }\n }\n\n calendarHelper.loadTemplates().then(function () {\n var template = $templateCache.get(templateName);\n $element.html(template);\n $compile($element.contents())($scope);\n });\n\n });\n }]\n };\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .directive('mwlDynamicDirectiveTemplate', mwlDynamicDirectiveTemplate);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n mwlDroppable.$inject = [];\n function mwlDroppable() {\n\n return {\n restrict: 'A',\n controller: ['$element', '$scope', '$parse', '$attrs', function ($element, $scope, $parse, $attrs) {\n if (!interact) {\n return;\n }\n\n var DROP_ACTIVE_CLASS = $attrs.dropActiveClass || 'drop-active';\n\n interact($element[0]).dropzone({\n ondragenter: function(event) {\n angular.element(event.target).addClass(DROP_ACTIVE_CLASS);\n },\n ondragleave: function(event) {\n angular.element(event.target).removeClass(DROP_ACTIVE_CLASS);\n },\n ondropdeactivate: function(event) {\n angular.element(event.target).removeClass(DROP_ACTIVE_CLASS);\n },\n ondrop: function(event) {\n if (event.relatedTarget.dropData) {\n $parse($attrs.onDrop)($scope, {dropData: event.relatedTarget.dropData});\n $scope.$apply();\n }\n }\n });\n\n $scope.$on('$destroy', function() {\n interact($element[0]).unset();\n });\n }]\n };\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .directive('mwlDroppable', mwlDroppable);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n mwlDraggable.$inject = [];\n function mwlDraggable() {\n return {\n restrict: 'A',\n controller: ['$element', '$scope', '$window', '$parse', '$attrs', '$timeout', function ($element, $scope, $window, $parse, $attrs, $timeout) {\n\n if (!interact) {\n return;\n }\n\n var snap, snapGridDimensions;\n if ($attrs.snapGrid) {\n snapGridDimensions = $parse($attrs.snapGrid)($scope);\n snap = {\n targets: [\n interact.createSnapGrid(snapGridDimensions)\n ]\n };\n }\n\n function translateElement(elm, transformValue) {\n return elm\n .css('-ms-transform', transformValue)\n .css('-webkit-transform', transformValue)\n .css('transform', transformValue);\n }\n\n interact($element[0]).draggable({\n snap: snap,\n onstart: function(event) {\n angular.element(event.target).addClass('dragging-active');\n event.target.dropData = $parse($attrs.dropData)($scope);\n event.target.style.pointerEvents = 'none';\n if ($attrs.onDragStart) {\n $parse($attrs.onDragStart)($scope);\n $scope.$apply();\n }\n },\n onmove: function(event) {\n\n var elm = angular.element(event.target);\n var x = (parseFloat(elm.attr('data-x')) || 0) + (event.dx || 0);\n var y = (parseFloat(elm.attr('data-y')) || 0) + (event.dy || 0);\n\n switch ($parse($attrs.axis)($scope)) {\n case 'x':\n y = 0;\n break;\n\n case 'y':\n x = 0;\n break;\n\n default:\n }\n\n if ($window.getComputedStyle(elm[0]).position === 'static') {\n elm.css('position', 'relative');\n }\n\n translateElement(elm, 'translate(' + x + 'px, ' + y + 'px)')\n .css('z-index', 50)\n .attr('data-x', x)\n .attr('data-y', y);\n\n if ($attrs.onDrag) {\n $parse($attrs.onDrag)($scope, {x: x, y: y});\n $scope.$apply();\n }\n\n },\n onend: function(event) {\n\n var elm = angular.element(event.target);\n var x = elm.attr('data-x');\n var y = elm.attr('data-y');\n\n event.target.style.pointerEvents = 'auto';\n if ($attrs.onDragEnd) {\n $parse($attrs.onDragEnd)($scope, {x: x, y: y});\n $scope.$apply();\n }\n\n $timeout(function() {\n translateElement(elm, '')\n .css('z-index', 'auto')\n .removeAttr('data-x')\n .removeAttr('data-y')\n .removeClass('dragging-active');\n });\n\n }\n });\n\n $scope.$watch($attrs.mwlDraggable, function(enabled) {\n interact($element[0]).draggable({\n enabled: enabled\n });\n });\n\n $scope.$on('$destroy', function() {\n interact($element[0]).unset();\n });\n }]\n };\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .directive('mwlDraggable', mwlDraggable);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n mwlDragSelect.$inject = [];\n function mwlDragSelect() {\n return {\n restrict: 'A',\n controller: ['$scope', '$element', '$parse', '$attrs', function ($scope, $element, $parse, $attrs) {\n function handleMouseEvent(callbackName) {\n return function(event) {\n if (callbackName) {\n $parse(callbackName)($scope);\n $scope.$apply();\n }\n event.preventDefault();\n };\n }\n\n var onMouseDown = handleMouseEvent($attrs.onDragSelectStart);\n var onMouseMove = handleMouseEvent($attrs.onDragSelectMove);\n var onMouseUp = handleMouseEvent($attrs.onDragSelectEnd);\n\n function enableMouseListeners() {\n $element.on('mousedown', onMouseDown);\n $element.on('mousemove', onMouseMove);\n $element.on('mouseup', onMouseUp);\n }\n\n function disableMouseListeners() {\n $element.off('mousedown', onMouseDown);\n $element.off('mousemove', onMouseMove);\n $element.off('mouseup', onMouseUp);\n }\n\n $scope.$watch($attrs.mwlDragSelect, function(isEnabled) {\n if (isEnabled) {\n enableMouseListeners();\n } else {\n disableMouseListeners();\n }\n });\n\n $scope.$on('$destroy', function() {\n disableMouseListeners();\n });\n }]\n };\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .directive('mwlDragSelect', mwlDragSelect);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n mwlDateModifier.$inject = [];\n function mwlDateModifier() {\n return {\n restrict: 'A',\n controller: ['$element', '$attrs', '$scope', 'datePickerUtils', function ($element, $attrs, $scope, datePickerUtils) {\n var vm = this;\n vm.callbackOnSetDate = $attrs.dateChange ? datePickerUtils.findFunction($scope, $attrs.dateChange) : undefined;\n\n function onClick() {\n if (angular.isDefined($attrs.setToToday)) {\n vm.date = new Date();\n } else if (angular.isDefined($attrs.increment)) {\n vm.date = moment(vm.date).add(1, vm.increment).toDate();\n } else if (angular.isDefined($attrs.decrement)) {\n vm.date = moment(vm.date).subtract(1, vm.decrement).toDate();\n }\n $scope.$apply();\n\n //This is duplicated in the new functionality.\n if (vm.callbackOnSetDate) {\n // scope.callbackOnSetDate(attrs.datePicker, scope.date, isOnlyDay);\n vm.callbackOnSetDate(vm.date, false);\n }\n }\n\n $element.bind('click', onClick);\n\n $scope.$on('$destroy', function() {\n $element.unbind('click', onClick);\n });\n }],\n controllerAs: '$ctrl',\n scope: {\n date: '=',\n increment: '=',\n decrement: '='\n },\n bindToController: true\n };\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .directive('mwlDateModifier', mwlDateModifier);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n mwlCollapseFallback.$inject = ['$injector'];\n function mwlCollapseFallback($injector) {\n if ($injector.has('uibCollapseDirective')) {\n return {};\n }\n\n return {\n restrict: 'A',\n controller: ['$scope', '$attrs', '$element', function ($scope, $attrs, $element) {\n $scope.$watch($attrs.mwlCollapseFallback, function(shouldCollapse) {\n if (shouldCollapse) {\n $element.addClass('ng-hide');\n } else {\n $element.removeClass('ng-hide');\n }\n });\n }]\n };\n\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .directive('mwlCollapseFallback', mwlCollapseFallback);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n var calendarConfig = {\n allDateFormats: {\n angular: {\n date: {\n hour: 'ha',\n day: 'd MMM',\n month: 'MMMM',\n weekDay: 'EEEE',\n time: 'HH:mm',\n datetime: 'MMM d, h:mm a'\n },\n title: {\n day: 'EEEE d MMMM, yyyy',\n week: 'WEEK_OF_YEAR', // RC, {week}{year}\n month: 'MMMM yyyy',\n year: 'yyyy'\n }\n },\n moment: {\n date: {\n hour: 'ha',\n day: 'MMMM Do',\n month: 'MMMM',\n weekDay: 'dddd',\n time: 'HH:mm',\n datetime: 'MMM D, h:mm a'\n },\n title: {\n day: 'dddd D MMMM, YYYY',\n week: 'WEEK_OF_YEAR', // RC ,{week}{year}\n // week: 'Week {week} of {year}',\n month: 'MMMM YYYY',\n year: 'YYYY'\n }\n }\n },\n get dateFormats() {\n return this.allDateFormats[this.dateFormatter].date;\n },\n get titleFormats() {\n return this.allDateFormats[this.dateFormatter].title;\n },\n dateFormatter: 'moment', // default angular\n showTimesOnWeekView: false,\n isSortEventOnWeekView: false, // sort week view event\n displayAllMonthEvents: true,\n i18nStrings: {\n weekNumber: 'Week {week}'\n },\n templates: {\n calendar: 'app/kernel/ui-elements/ui-calendar/views/calendar.html',\n calendarDayView: 'app/kernel/ui-elements/ui-calendar/views/calendarDayView.html',\n calendarHourList: 'app/kernel/ui-elements/ui-calendar/views/calendarHourList.html',\n calendarMonthCell: 'app/kernel/ui-elements/ui-calendar/views/calendarMonthCell.html',\n calendarMonthCellEvents: 'app/kernel/ui-elements/ui-calendar/views/calendarMonthCellEvents.html',\n calendarMonthView : 'app/kernel/ui-elements/ui-calendar/views/calendarMonthView.html',\n calendarSlideBox:'app/kernel/ui-elements/ui-calendar/views/calendarSlideBox.html',\n calendarWeekView: 'app/kernel/ui-elements/ui-calendar/views/calendarWeekView.html',\n calendarYearView: 'app/kernel/ui-elements/ui-calendar/views/calendarYearView.html'\n },\n colorTypes: {\n info: {\n primary: '#1e90ff',\n secondary: '#d1e8ff'\n },\n important: {\n primary: '#ad2121',\n secondary: '#fae3e3'\n },\n warning: {\n primary: '#e3bc08',\n secondary: '#fdf1ba'\n },\n inverse: {\n primary: '#1b1b1b',\n secondary: '#c1c1c1'\n },\n special: {\n primary: '#800080',\n secondary: '#ffe6ff'\n },\n success: {\n primary: '#006400',\n secondary: '#caffca'\n },\n\n room: {\n primary: '#4DAEA5',\n secondary: 'rgba(77, 174, 165, 0.55)'\n },\n train: {\n primary: '#E98BAB',\n secondary: 'rgba(233, 139, 171, 0.55)'\n },\n test: {\n primary: '#4ca64f',\n secondary: 'rgba(76, 166, 79, 0.55)'\n }\n }\n };\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .constant('calendarConfig', calendarConfig);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n var LOG_PREFIX = 'Bootstrap calendar:';\n var mwlCalendar = {\n template: '
',\n bindings: {\n events: '=',\n view: '=',\n viewTitle: '=?',\n viewDate: '=',\n cellIsOpen: '=?',\n cellAutoOpenDisabled: '=?',\n slideBoxDisabled: '=?',\n customTemplateUrls: '=?',\n onEventClick: '&',\n onEventTimesChanged: '&',\n onTimespanClick: '&',\n onDateRangeSelect: '&?',\n onViewChangeClick: '&',\n cellModifier: '&',\n dayViewStart: '@',\n dayViewEnd: '@',\n dayViewSplit: '@',\n dayViewEventChunkSize: '@',\n dayViewEventWidth: '@',\n templateScope: '=?',\n weekNumberLabelDisabled: '=?'\n },\n controller: MwlCalendarCtrl\n };\n\n MwlCalendarCtrl.$inject = ['$scope', '$log', '$timeout', '$attrs', '$locale', 'calendarTitle', 'calendarHelper'];\n function MwlCalendarCtrl($scope, $log, $timeout, $attrs, $locale, calendarTitle, calendarHelper) {\n var vm = this;\n if (vm.slideBoxDisabled) {\n $log.warn(LOG_PREFIX, 'The `slide-box-disabled` option is deprecated and will be removed in the next release. ' +\n 'Instead set `cell-auto-open-disabled` to true');\n }\n\n vm.events = vm.events || [];\n\n vm.changeView = function(view, newDay) {\n vm.view = view;\n vm.viewDate = newDay;\n };\n\n vm.dateClicked = function(date) {\n var rawDate = moment(date).toDate();\n\n var nextView = {\n year: 'month',\n month: 'day',\n week: 'day'\n };\n\n if (vm.onViewChangeClick({calendarDate: rawDate, calendarNextView: nextView[vm.view]}) !== false) {\n vm.changeView(nextView[vm.view], rawDate);\n }\n\n };\n\n var previousDate = moment(vm.viewDate);\n var previousView = vm.view;\n\n function checkEventIsValid(event) {\n if (!event.startsAt) {\n $log.warn(LOG_PREFIX, 'Event is missing the startsAt field', event);\n } else if (!angular.isDate(event.startsAt)) {\n $log.warn(LOG_PREFIX, 'Event startsAt should be a javascript date object. Do `new Date(event.startsAt)` to fix it.', event);\n }\n\n if (event.endsAt) {\n if (!angular.isDate(event.endsAt)) {\n $log.warn(LOG_PREFIX, 'Event endsAt should be a javascript date object. Do `new Date(event.endsAt)` to fix it.', event);\n }\n if (moment(event.startsAt).isAfter(moment(event.endsAt))) {\n $log.warn(LOG_PREFIX, 'Event cannot start after it finishes', event);\n }\n }\n }\n\n function refreshCalendar() {\n\n if (calendarTitle[vm.view] && angular.isDefined($attrs.viewTitle)) {\n vm.viewTitle = calendarTitle[vm.view](vm.viewDate);\n }\n\n vm.events.forEach(function(event, index) {\n checkEventIsValid(event);\n event.calendarEventId = index;\n });\n\n //if on-timespan-click=\"calendarDay = calendarDate\" is set then don't update the view as nothing needs to change\n var currentDate = moment(vm.viewDate);\n var shouldUpdate = true;\n if (\n previousDate.clone().startOf(vm.view).isSame(currentDate.clone().startOf(vm.view)) &&\n !previousDate.isSame(currentDate) &&\n vm.view === previousView\n ) {\n shouldUpdate = false;\n }\n previousDate = currentDate;\n previousView = vm.view;\n\n if (shouldUpdate) {\n // a $timeout is required as $broadcast is synchronous so if a new events array is set the calendar won't update\n $timeout(function() {\n $scope.$broadcast('calendar.refreshView');\n });\n }\n }\n\n calendarHelper.loadTemplates().then(function() {\n vm.templatesLoaded = true;\n var eventsWatched = false;\n //Refresh the calendar when any of these variables change.\n $scope.$watchGroup([\n '$ctrl.viewDate',\n '$ctrl.view',\n '$ctrl.cellIsOpen',\n function() {\n return moment.locale() + $locale.id; //Auto update the calendar when the locale changes\n }\n ], function() {\n if (!eventsWatched) {\n eventsWatched = true;\n //need to deep watch events hence why it isn't included in the watch group\n $scope.$watch('$ctrl.events', refreshCalendar, true); //this will call refreshCalendar when the watcher starts (i.e. now)\n } else {\n refreshCalendar();\n }\n });\n\n }).catch(function(err) {\n $log.error('Could not load all calendar templates', err);\n });\n }\n\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .component('mwlCalendar', mwlCalendar);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n var mwlCalendarYear = {\n template: '
',\n require: {\n calendarCtrl: '^mwlCalendar'\n },\n bindings: {\n events: '=',\n viewDate: '=',\n onEventClick: '=',\n onEventTimesChanged: '=',\n cellIsOpen: '=',\n cellAutoOpenDisabled: '=',\n onTimespanClick: '=',\n cellModifier: '=',\n slideBoxDisabled: '=',\n customTemplateUrls: '=?',\n templateScope: '='\n },\n controller: MwlCalendarYearCtrl\n };\n\n MwlCalendarYearCtrl.$inject = ['$scope', 'calendarHelper'];\n function MwlCalendarYearCtrl($scope, calendarHelper) {\n var vm = this;\n vm.openMonthIndex = null;\n\n function toggleCell() {\n vm.openRowIndex = null;\n vm.openMonthIndex = null;\n\n if (vm.cellIsOpen && vm.view) {\n vm.view.forEach(function(month, monthIndex) {\n if (moment(vm.viewDate).startOf('month').isSame(month.date)) {\n vm.openMonthIndex = monthIndex;\n vm.openRowIndex = Math.floor(monthIndex / 4);\n }\n });\n }\n }\n\n $scope.$on('calendar.refreshView', function() {\n vm.view = calendarHelper.getYearView(vm.events, vm.viewDate, vm.cellModifier);\n\n if (vm.cellAutoOpenDisabled) {\n toggleCell();\n } else if (!vm.cellAutoOpenDisabled && vm.cellIsOpen && vm.openMonthIndex === null) {\n //Auto open the calendar to the current day if set\n vm.openMonthIndex = null;\n vm.view.forEach(function(month) {\n if (moment(vm.viewDate).startOf('month').isSame(month.date)) {\n vm.monthClicked(month, true);\n }\n });\n }\n\n });\n\n if (vm.cellAutoOpenDisabled) {\n $scope.$watchGroup([\n '$ctrl.cellIsOpen',\n '$ctrl.viewDate'\n ], toggleCell);\n }\n\n vm.monthClicked = function(month, monthClickedFirstRun, $event) {\n\n if (!monthClickedFirstRun) {\n vm.onTimespanClick({\n calendarDate: month.date.toDate(),\n calendarCell: month,\n $event: $event\n });\n if ($event && $event.defaultPrevented) {\n return;\n }\n }\n\n if (!vm.cellAutoOpenDisabled) {\n vm.openRowIndex = null;\n var monthIndex = vm.view.indexOf(month);\n if (monthIndex === vm.openMonthIndex) { //the month has been clicked and is already open\n vm.openMonthIndex = null; //close the open month\n vm.cellIsOpen = false;\n } else {\n vm.openMonthIndex = monthIndex;\n vm.openRowIndex = Math.floor(monthIndex / 4);\n vm.cellIsOpen = true;\n }\n }\n\n };\n\n vm.handleEventDrop = function(event, newMonthDate) {\n var newStart = moment(event.startsAt)\n .month(moment(newMonthDate).month())\n .year(moment(newMonthDate).year());\n var newEnd = calendarHelper.adjustEndDateFromStartDiff(event.startsAt, newStart, event.endsAt);\n\n vm.onEventTimesChanged({\n calendarEvent: event,\n calendarDate: newMonthDate,\n calendarNewEventStart: newStart.toDate(),\n calendarNewEventEnd: newEnd ? newEnd.toDate() : null\n });\n };\n\n this.$postLink = function() {\n $scope.$ctrl.calendarCtrl = this.calendarCtrl;\n };\n\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .component('mwlCalendarYear', mwlCalendarYear);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n var mwlCalendarWeek = {\n template: '
',\n require: {\n calendarCtrl: '^mwlCalendar'\n },\n bindings: {\n events: '=',\n viewDate: '=',\n onEventClick: '=',\n onEventTimesChanged: '=',\n dayViewStart: '=',\n dayViewEnd: '=',\n dayViewSplit: '=',\n dayViewEventChunkSize: '=',\n onTimespanClick: '=',\n onDateRangeSelect: '=',\n customTemplateUrls: '=?',\n cellModifier: '=',\n templateScope: '='\n },\n controller: MwlCalendarWeekCtrl\n };\n\n MwlCalendarWeekCtrl.$inject = ['$scope', 'calendarHelper', 'calendarConfig', 'calendarEventTitle'];\n function MwlCalendarWeekCtrl($scope, calendarHelper, calendarConfig, calendarEventTitle) {\n var vm = this;\n\n vm.showTimes = calendarConfig.showTimesOnWeekView;\n vm.calendarEventTitle = calendarEventTitle;\n\n $scope.$on('calendar.refreshView', function() {\n vm.dayViewSplit = vm.dayViewSplit || 30;\n vm.dayViewHeight = calendarHelper.getDayViewHeight(\n vm.dayViewStart,\n vm.dayViewEnd,\n vm.dayViewSplit\n );\n if (vm.showTimes) {\n vm.view = calendarHelper.getWeekViewWithTimes(\n vm.events,\n vm.viewDate,\n vm.dayViewStart,\n vm.dayViewEnd,\n vm.dayViewSplit\n );\n } else {\n vm.view = calendarHelper.getWeekView(vm.events, vm.viewDate, calendarConfig.isSortEventOnWeekView);\n }\n });\n\n vm.weekDragged = function(event, daysDiff, minuteChunksMoved) {\n\n var newStart = moment(event.startsAt).add(daysDiff, 'days');\n var newEnd = moment(event.endsAt).add(daysDiff, 'days');\n\n if (minuteChunksMoved) {\n var minutesDiff = minuteChunksMoved * vm.dayViewSplit;\n newStart = newStart.add(minutesDiff, 'minutes');\n newEnd = newEnd.add(minutesDiff, 'minutes');\n }\n\n delete event.tempStartsAt;\n\n vm.onEventTimesChanged({\n calendarEvent: event,\n calendarNewEventStart: newStart.toDate(),\n calendarNewEventEnd: event.endsAt ? newEnd.toDate() : null\n });\n };\n\n vm.eventDropped = function(event, date) {\n var daysDiff = moment(date).diff(moment(event.startsAt), 'days');\n vm.weekDragged(event, daysDiff);\n };\n\n vm.weekResized = function(event, edge, daysDiff) {\n\n var start = moment(event.startsAt);\n var end = moment(event.endsAt);\n if (edge === 'start') {\n start.add(daysDiff, 'days');\n } else {\n end.add(daysDiff, 'days');\n }\n\n vm.onEventTimesChanged({\n calendarEvent: event,\n calendarNewEventStart: start.toDate(),\n calendarNewEventEnd: end.toDate()\n });\n\n };\n\n vm.tempTimeChanged = function(event, minuteChunksMoved) {\n var minutesDiff = minuteChunksMoved * vm.dayViewSplit;\n event.tempStartsAt = moment(event.startsAt).add(minutesDiff, 'minutes').toDate();\n };\n\n this.$postLink = function() {\n $scope.$ctrl.calendarCtrl = this.calendarCtrl;\n };\n\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .component('mwlCalendarWeek', mwlCalendarWeek);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n var mwlCalendarSlideBox = {\n template: '
',\n require: {\n mwlCalendarMonth: '^?mwlCalendarMonth',\n mwlCalendarYear: '^?mwlCalendarYear'\n },\n bindings: {\n isOpen: '=',\n events: '=',\n onEventClick: '=',\n cell: '=',\n customTemplateUrls: '=?',\n templateScope: '='\n },\n controller: MwlCalendarSlideBoxCtrl\n };\n\n MwlCalendarSlideBoxCtrl.$inject = ['$scope', '$timeout', 'calendarConfig', 'calendarEventTitle'];\n function MwlCalendarSlideBoxCtrl($scope, $timeout, calendarConfig, calendarEventTitle) {\n var vm = this;\n vm.calendarConfig = calendarConfig;\n vm.calendarEventTitle = calendarEventTitle;\n\n vm.isCollapsed = true;\n $scope.$watch('$ctrl.isOpen', function(isOpen) {\n //events must be populated first to set the element height before animation will work\n $timeout(function() {\n vm.isCollapsed = !isOpen;\n });\n });\n\n this.$postLink = function() {\n $scope.isMonthView = !!this.mwlCalendarMonth;\n $scope.isYearView = !!this.mwlCalendarYear;\n };\n\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .component('mwlCalendarSlideBox', mwlCalendarSlideBox);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n var mwlCalendarMonth = {\n template: '
',\n require: {\n calendarCtrl: '^mwlCalendar'\n },\n bindings: {\n events: '=',\n viewDate: '=',\n onEventClick: '=',\n onEventTimesChanged: '=',\n onDateRangeSelect: '=',\n cellIsOpen: '=',\n cellAutoOpenDisabled: '=',\n onTimespanClick: '=',\n cellModifier: '=',\n slideBoxDisabled: '=',\n customTemplateUrls: '=?',\n templateScope: '=',\n weekNumberLabelDisabled: '=?'\n },\n controller: MwlCalendarMonthCtrl\n };\n\n MwlCalendarMonthCtrl.$inject = ['$scope', 'calendarHelper', 'calendarConfig', 'calendarEventTitle'];\n function MwlCalendarMonthCtrl($scope, calendarHelper, calendarConfig, calendarEventTitle) {\n var vm = this;\n vm.calendarConfig = calendarConfig;\n vm.calendarEventTitle = calendarEventTitle;\n vm.openRowIndex = null;\n\n function toggleCell() {\n vm.openRowIndex = null;\n vm.openDayIndex = null;\n\n if (vm.cellIsOpen && vm.view) {\n vm.view.forEach(function(day, dayIndex) {\n if (moment(vm.viewDate).startOf('day').isSame(day.date)) {\n vm.openDayIndex = dayIndex;\n vm.openRowIndex = Math.floor(dayIndex / 7);\n }\n });\n }\n }\n\n $scope.$on('calendar.refreshView', function() {\n\n vm.weekDays = calendarHelper.getWeekDayNames();\n\n var monthView = calendarHelper.getMonthView(vm.events, vm.viewDate, vm.cellModifier);\n vm.view = monthView.days;\n vm.monthOffsets = monthView.rowOffsets;\n\n if (vm.cellAutoOpenDisabled) {\n toggleCell();\n } else if (!vm.cellAutoOpenDisabled && vm.cellIsOpen && vm.openRowIndex === null) {\n //Auto open the calendar to the current day if set\n vm.openDayIndex = null;\n vm.view.forEach(function(day) {\n if (day.inMonth && moment(vm.viewDate).startOf('day').isSame(day.date)) {\n vm.dayClicked(day, true);\n }\n });\n }\n\n });\n\n if (vm.cellAutoOpenDisabled) {\n $scope.$watchGroup([\n '$ctrl.cellIsOpen',\n '$ctrl.viewDate'\n ], toggleCell);\n }\n\n vm.dayClicked = function(day, dayClickedFirstRun, $event) {\n\n if (!dayClickedFirstRun) {\n vm.onTimespanClick({\n calendarDate: day.date.toDate(),\n calendarCell: day,\n $event: $event\n });\n if ($event && $event.defaultPrevented) {\n return;\n }\n }\n\n if (!vm.cellAutoOpenDisabled) {\n vm.openRowIndex = null;\n var dayIndex = vm.view.indexOf(day);\n if (dayIndex === vm.openDayIndex) { //the day has been clicked and is already open\n vm.openDayIndex = null; //close the open day\n vm.cellIsOpen = false;\n } else {\n vm.openDayIndex = dayIndex;\n vm.openRowIndex = Math.floor(dayIndex / 7);\n vm.cellIsOpen = true;\n }\n }\n\n };\n\n vm.highlightEvent = function(event, shouldAddClass) {\n\n vm.view.forEach(function(day) {\n delete day.highlightClass;\n delete day.backgroundColor;\n if (shouldAddClass) {\n var dayContainsEvent = day.events.indexOf(event) > -1;\n if (dayContainsEvent) {\n day.backgroundColor = event.color ? event.color.secondary : '';\n }\n }\n });\n\n };\n\n vm.handleEventDrop = function(event, newDayDate, draggedFromDate) {\n\n var newStart = moment(event.startsAt)\n .date(moment(newDayDate).date())\n .month(moment(newDayDate).month())\n .year(moment(newDayDate).year());\n\n var newEnd = calendarHelper.adjustEndDateFromStartDiff(event.startsAt, newStart, event.endsAt);\n\n vm.onEventTimesChanged({\n calendarEvent: event,\n calendarDate: newDayDate,\n calendarNewEventStart: newStart.toDate(),\n calendarNewEventEnd: newEnd ? newEnd.toDate() : null,\n calendarDraggedFromDate: draggedFromDate\n });\n };\n\n vm.getWeekNumberLabel = function(day) {\n var weekNumber = day.date.clone().add(1, 'day').isoWeek();\n if (angular.isFunction(calendarConfig.i18nStrings.weekNumber)) {\n return calendarConfig.i18nStrings.weekNumber({weekNumber: weekNumber});\n } else {\n return calendarConfig.i18nStrings.weekNumber.replace('{week}', weekNumber);\n }\n };\n\n vm.onDragSelectStart = function(day) {\n if (!vm.dateRangeSelect) {\n vm.dateRangeSelect = {\n startDate: day.date,\n endDate: day.date\n };\n }\n };\n\n vm.onDragSelectMove = function(day) {\n if (vm.dateRangeSelect) {\n vm.dateRangeSelect.endDate = day.date;\n }\n };\n\n vm.onDragSelectEnd = function(day) {\n vm.dateRangeSelect.endDate = day.date;\n if (vm.dateRangeSelect.endDate > vm.dateRangeSelect.startDate) {\n vm.onDateRangeSelect({\n calendarRangeStartDate: vm.dateRangeSelect.startDate.clone().startOf('day').toDate(),\n calendarRangeEndDate: vm.dateRangeSelect.endDate.clone().endOf('day').toDate()\n });\n }\n delete vm.dateRangeSelect;\n };\n\n this.$postLink = function() {\n $scope.$ctrl.calendarCtrl = this.calendarCtrl;\n };\n\n }\n\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .component('mwlCalendarMonth', mwlCalendarMonth);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n var mwlCalendarHourList = {\n template: '
',\n bindings: {\n viewDate: '=',\n dayViewStart: '=',\n dayViewEnd: '=',\n dayViewSplit: '=',\n dayWidth: '=?',\n onTimespanClick: '=',\n onDateRangeSelect: '=',\n onEventTimesChanged: '=',\n customTemplateUrls: '=?',\n cellModifier: '=',\n templateScope: '='\n },\n controller: MwlCalendarHourListCtrl\n };\n\n MwlCalendarHourListCtrl.$inject = ['$scope', 'calendarHelper', 'calendarConfig', 'calendarUtils'];\n function MwlCalendarHourListCtrl($scope, calendarHelper, calendarConfig, calendarUtils) {\n var vm = this;\n\n function updateDays() {\n\n vm.dayViewSplit = parseInt(vm.dayViewSplit);\n var dayStart = (vm.dayViewStart || '00:00').split(':');\n var dayEnd = (vm.dayViewEnd || '23:59').split(':');\n vm.hourGrid = calendarUtils.getDayViewHourGrid({\n viewDate: calendarConfig.showTimesOnWeekView ? moment(vm.viewDate).startOf('week').toDate() : moment(vm.viewDate).toDate(),\n hourSegments: 60 / vm.dayViewSplit,\n dayStart: {\n hour: dayStart[0],\n minute: dayStart[1]\n },\n dayEnd: {\n hour: dayEnd[0],\n minute: dayEnd[1]\n }\n });\n\n vm.hourGrid.forEach(function(hour) {\n hour.segments.forEach(function(segment) {\n\n segment.date = moment(segment.date);\n segment.nextSegmentDate = segment.date.clone().add(vm.dayViewSplit, 'minutes');\n\n if (calendarConfig.showTimesOnWeekView) {\n\n segment.days = [];\n\n for (var i = 0; i < 7; i++) {\n var day = {\n date: moment(segment.date).add(i, 'days')\n };\n day.nextSegmentDate = day.date.clone().add(vm.dayViewSplit, 'minutes');\n vm.cellModifier({calendarCell: day});\n segment.days.push(day);\n }\n\n } else {\n vm.cellModifier({calendarCell: segment});\n }\n\n });\n });\n\n }\n\n var originalLocale = moment.locale();\n\n $scope.$on('calendar.refreshView', function() {\n\n if (originalLocale !== moment.locale()) {\n originalLocale = moment.locale();\n updateDays();\n }\n\n });\n\n $scope.$watchGroup([\n '$ctrl.dayViewStart',\n '$ctrl.dayViewEnd',\n '$ctrl.dayViewSplit',\n '$ctrl.viewDate'\n ], function() {\n updateDays();\n });\n\n vm.eventDropped = function(event, date) {\n var newStart = moment(date);\n var newEnd = calendarHelper.adjustEndDateFromStartDiff(event.startsAt, newStart, event.endsAt);\n\n vm.onEventTimesChanged({\n calendarEvent: event,\n calendarDate: date,\n calendarNewEventStart: newStart.toDate(),\n calendarNewEventEnd: newEnd ? newEnd.toDate() : null\n });\n };\n\n vm.onDragSelectStart = function(date, dayIndex) {\n if (!vm.dateRangeSelect) {\n vm.dateRangeSelect = {\n active: true,\n startDate: date,\n endDate: date,\n dayIndex: dayIndex\n };\n }\n };\n\n vm.onDragSelectMove = function(date) {\n if (vm.dateRangeSelect) {\n vm.dateRangeSelect.endDate = date;\n }\n };\n\n vm.onDragSelectEnd = function(date) {\n if (vm.dateRangeSelect) {\n vm.dateRangeSelect.endDate = date;\n if (vm.dateRangeSelect.endDate > vm.dateRangeSelect.startDate) {\n vm.onDateRangeSelect({calendarRangeStartDate: vm.dateRangeSelect.startDate, calendarRangeEndDate: vm.dateRangeSelect.endDate});\n }\n delete vm.dateRangeSelect;\n }\n };\n }\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .component('mwlCalendarHourList', mwlCalendarHourList);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/7.\n */\n(function () {\n 'use strict';\n\n var mwlCalendarDay = {\n template: '
',\n require: '^mwlCalendar',\n bindings:{\n events: '=',\n viewDate: '=',\n onEventClick: '=',\n onEventTimesChanged: '=',\n onTimespanClick: '=',\n onDateRangeSelect: '=',\n dayViewStart: '=',\n dayViewEnd: '=',\n dayViewSplit: '=',\n dayViewEventChunkSize: '=',\n dayViewEventWidth: '=',\n customTemplateUrls: '=?',\n cellModifier: '=',\n templateScope: '='\n },\n controller: MwlCalendarDayCtrl\n };\n\n MwlCalendarDayCtrl.$inject = ['$scope', 'calendarHelper', 'calendarEventTitle'];\n function MwlCalendarDayCtrl($scope, calendarHelper, calendarEventTitle) {\n var vm = this;\n\n vm.calendarEventTitle = calendarEventTitle;\n\n function refreshView() {\n vm.dayViewSplit = vm.dayViewSplit || 30;\n vm.dayViewHeight = calendarHelper.getDayViewHeight(\n vm.dayViewStart,\n vm.dayViewEnd,\n vm.dayViewSplit\n );\n\n var view = calendarHelper.getDayView(\n vm.events,\n vm.viewDate,\n vm.dayViewStart,\n vm.dayViewEnd,\n vm.dayViewSplit,\n vm.dayViewEventWidth\n );\n\n vm.allDayEvents = view.allDayEvents;\n vm.nonAllDayEvents = view.events;\n vm.viewWidth = view.width + 62;\n\n }\n\n $scope.$on('calendar.refreshView', refreshView);\n\n $scope.$watchGroup([\n '$ctrl.dayViewStart',\n '$ctrl.dayViewEnd',\n '$ctrl.dayViewSplit'\n ], refreshView);\n\n vm.eventDragComplete = function(event, minuteChunksMoved) {\n var minutesDiff = minuteChunksMoved * vm.dayViewSplit;\n var newStart = moment(event.startsAt).add(minutesDiff, 'minutes');\n var newEnd = moment(event.endsAt).add(minutesDiff, 'minutes');\n delete event.tempStartsAt;\n\n vm.onEventTimesChanged({\n calendarEvent: event,\n calendarNewEventStart: newStart.toDate(),\n calendarNewEventEnd: event.endsAt ? newEnd.toDate() : null\n });\n };\n\n vm.eventDragged = function(event, minuteChunksMoved) {\n var minutesDiff = minuteChunksMoved * vm.dayViewSplit;\n event.tempStartsAt = moment(event.startsAt).add(minutesDiff, 'minutes').toDate();\n };\n\n vm.eventResizeComplete = function(event, edge, minuteChunksMoved) {\n var minutesDiff = minuteChunksMoved * vm.dayViewSplit;\n var start = moment(event.startsAt);\n var end = moment(event.endsAt);\n if (edge === 'start') {\n start.add(minutesDiff, 'minutes');\n } else {\n end.add(minutesDiff, 'minutes');\n }\n delete event.tempStartsAt;\n\n vm.onEventTimesChanged({\n calendarEvent: event,\n calendarNewEventStart: start.toDate(),\n calendarNewEventEnd: end.toDate()\n });\n };\n\n vm.eventResized = function(event, edge, minuteChunksMoved) {\n var minutesDiff = minuteChunksMoved * vm.dayViewSplit;\n if (edge === 'start') {\n event.tempStartsAt = moment(event.startsAt).add(minutesDiff, 'minutes').toDate();\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiCalendar')\n .component('mwlCalendarDay', mwlCalendarDay);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n angular.module('eHRD.kernel.uiElements.treeTable',[]);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n TreeTableOrderBy.$inject = ['$filter'];\n function TreeTableOrderBy($filter) {\n var _fnOrderBy = $filter('orderBy'),\n for_all_descendants = function for_all_descendants(options, node, name, fnOrderBy) {\n var _i, _len, _nodes;\n\n if (angular.isDefined(node[name])) {\n _nodes = node[name];\n _len = _nodes.length;\n // OrderBy children\n for (_i = 0; _i < _len; _i++) {\n _nodes[_i] = for_all_descendants(options, _nodes[_i], name, fnOrderBy);\n }\n\n node[name] = fnOrderBy(node[name], options);\n }\n return node;\n },\n _fnOrder = function _fnOrder(list, orderBy) {\n return _fnOrderBy(list, orderBy);\n },\n _fnMain = function _fnMain(treeData, orderBy) {\n if (!angular.isArray(treeData)\n || treeData.length === 0\n || !(angular.isArray(orderBy) || angular.isObject(orderBy) || angular.isString(orderBy) || angular.isFunction(orderBy))\n || orderBy.length === 0 && !angular.isFunction(orderBy)) {\n return treeData;\n }\n\n var _i, _len;\n\n for (_i = 0, _len = treeData.length; _i < _len; _i++) {\n treeData[_i] = for_all_descendants(\n orderBy,\n treeData[_i],\n '__children__',\n _fnOrder\n );\n }\n\n return _fnOrder(treeData, orderBy);\n };\n\n return _fnMain;\n }\n\nangular.module('eHRD.kernel.uiElements.treeTable')\n .factory('$TreeTableOrderBy', TreeTableOrderBy);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function() {\n 'use strict';\n\n TreeTableFilter.$inject = ['$filter'];\n function TreeTableFilter($filter) {\n return fnInitFilter;\n\n function for_all_descendants(options, node, fieldChild, fnBefore, fnAfter, parentPassed) {\n if (!angular.isFunction(fnBefore)) {\n return null;\n }\n\n var _i, _len, _nodes,\n _nodePassed = fnBefore(options, node),\n _childPassed = false,\n _filter_index = options.filter_index;\n\n if (angular.isDefined(node[fieldChild])) {\n _nodes = node[fieldChild];\n _len = _nodes.length;\n options.filter_index = 0;\n for (_i = 0; _i < _len; _i++) {\n _childPassed = for_all_descendants(\n options,\n _nodes[_i],\n fieldChild,\n fnBefore,\n fnAfter,\n _nodePassed || parentPassed\n ) || _childPassed;\n }\n\n // restore filter_index of node\n options.filter_index = _filter_index;\n }\n\n if (angular.isFunction(fnAfter)) {\n fnAfter(options, node, _nodePassed === true, _childPassed === true, parentPassed === true);\n }\n\n return _nodePassed || _childPassed;\n }\n\n /**\n * Check data with callback\n * @param {string|object|function|regex} callback\n * @param {*} data\n * @returns {null|boolean}\n * @private\n */\n function _fnCheck(callback, data) {\n if (angular.isUndefinedOrNull(data) || angular.isArray(data)) {\n return null;\n }\n\n if (angular.isFunction(callback)) {\n return callback(data, $filter);\n } else {\n if (typeof callback === 'boolean') {\n data = !!data;\n return data === callback;\n } else if (angular.isDefined(callback)) {\n try {\n var _regex = new RegExp(callback);\n return _regex.test(data);\n } catch (err) {\n if (angular.isString(data)) {\n return data.indexOf(callback) > -1;\n } else {\n return null;\n }\n }\n } else {\n return null;\n }\n }\n }\n\n /**\n * `fnProcess` to call `_fnCheck`. If `condition` is `array` then call `for_each_filter`\n * else will call `_fnCheck`. Specical `condition.field` is `_$` then apply `condition.callback` for all field, if have `field` invaild then `return true`.\n *\n * @param node\n * @param condition\n * @param isAnd\n * @returns {null|boolean}\n * @private\n */\n function _fnProccess(node, condition, isAnd) {\n if (angular.isArray(condition)) {\n return for_each_filter(node, condition, isAnd);\n } else {\n var _key = condition.field,\n _callback = condition.callback,\n _iO, _keysO, _lenO;\n\n if (_key === '_$') {\n _keysO = Object.keys(node);\n _lenO = _keysO.length;\n for (_iO = 0; _iO < _lenO; _iO++) {\n if (_fnCheck(_callback, node[_keysO[_iO]])) {\n return true;\n }\n }\n } else if (angular.isDefined(node[_key])) {\n return _fnCheck(_callback, node[_key]);\n }\n }\n return null;\n }\n\n /**\n *\n * @param {object} node\n * @param {array} conditions Array `conditions`\n * @param {boolean} isAnd check with condition `And`, if `And` then `return false` when all `false`\n * @returns {null|boolean}\n */\n function for_each_filter(node, conditions, isAnd) {\n var i, len = conditions.length || 0,\n passed = false;\n if (len === 0) {\n return null;\n }\n\n for (i = 0; i < len; i++) {\n if (_fnProccess(node, conditions[i], !isAnd)) {\n passed = true;\n // if condition `or` then return;\n if (!isAnd) {\n return true;\n }\n } else {\n\n // if condition `and` and result in fnProccess = false then return;\n if (isAnd) {\n return false;\n }\n }\n }\n\n return passed;\n }\n\n /**\n * Will call _fnAfter to clear data no need\n * @param {object} options\n * @param {object} node\n * @param {boolean} isNodePassed\n * @param {boolean} isChildPassed\n * @param {boolean} isParentPassed\n * @private\n */\n function _fnAfter(options, node, isNodePassed, isChildPassed, isParentPassed) {\n if (isNodePassed === true) {\n node.__filtered__ = true;\n node.__filtered_visible__ = true;\n node.__filtered_index__ = options.filter_index++;\n return; //jmp\n } else if (isChildPassed === true && options.showParent === true ||\n isParentPassed === true && options.showChild === true) {\n node.__filtered__ = false;\n node.__filtered_visible__ = true;\n node.__filtered_index__ = options.filter_index++;\n return; //jmp\n }\n\n // remove attr __filtered__\n delete node.__filtered__;\n delete node.__filtered_visible__;\n delete node.__filtered_index__;\n }\n\n /**\n * `fnBefore` will called when `for_all_descendants` of `node` checking.\n * If `filter` empty then return `true` else result of function `_fnProccess` {@see _fnProccess}\n *\n * @param {object} options\n * @param {object} node\n * @returns {null|boolean}\n * @private\n */\n function _fnBefore(options, node) {\n if (options.filter.length === 0) {\n return true;\n } else {\n return _fnProccess(node, options.filter, options.beginAnd || false);\n }\n }\n\n /**\n * `fnBeforeClear` will called when `for_all_descendants` of `node` checking.\n * Alway false to Clear Filter empty\n *\n * @param {object} options\n * @param {object} node\n * @returns {null|boolean}\n * @private\n */\n function _fnBeforeClear( /*options, node*/ ) {\n return false;\n }\n\n /**\n * `_fnConvert` to convert `filter` `object` to `array` invaild.\n *\n * @param {object|array} filters\n * @returns {array} Instead of `filter` or new array invaild *(converted from filter)*\n * @private\n */\n function _fnConvert(filters) {\n var _iF, _lenF, _keysF,\n _filter,\n _state;\n // convert filter object to array filter\n if (angular.isObject(filters) && !angular.isArray(filters)) {\n _keysF = Object.keys(filters);\n _lenF = _keysF.length;\n _filter = [];\n\n if (_lenF > 0) {\n for (_iF = 0; _iF < _lenF; _iF++) {\n\n if (angular.isString(filters[_keysF[_iF]]) && filters[_keysF[_iF]].length === 0) {\n continue;\n } else if (angular.isArray(filters[_keysF[_iF]])) {\n _state = filters[_keysF[_iF]];\n } else if (angular.isObject(filters[_keysF[_iF]])) {\n _state = _fnConvert(filters[_keysF[_iF]]);\n } else {\n _state = {\n field: _keysF[_iF],\n callback: filters[_keysF[_iF]]\n };\n }\n _filter.push(_state);\n }\n }\n _state = null;\n return _filter;\n } else {\n return filters;\n }\n }\n\n /**\n * `fnInitFilter` function is constructor of service `$TreeTableFilter`.\n * @constructor\n * @param {object|array} treeData\n * @param {object|array} filters\n * @param {object} options\n * @param {string} keyChild\n * @returns {array} Return `treeData` or `treeData` with `filter`\n * @private\n */\n function fnInitFilter(treeData, filters, options, keyChild) {\n if (!angular.isArray(treeData) ||\n treeData.length === 0) {\n return treeData;\n }\n\n var _i, _len,\n _filter;\n\n _filter = _fnConvert(filters);\n if (!(angular.isArray(_filter) || angular.isObject(_filter)) ||\n _filter.length === 0) {\n for (_i = 0, _len = treeData.length; _i < _len; _i++) {\n for_all_descendants(\n options,\n treeData[_i],\n keyChild || '__children__',\n _fnBeforeClear, _fnAfter\n );\n }\n return treeData;\n }\n\n options.filter = _filter;\n options.filter_index = 0;\n for (_i = 0, _len = treeData.length; _i < _len; _i++) {\n for_all_descendants(\n options,\n treeData[_i],\n keyChild || '__children__',\n _fnBefore, _fnAfter\n );\n }\n\n return treeData;\n }\n\n }\n angular.module('eHRD.kernel.uiElements.treeTable')\n .factory('$TreeTableFilter', TreeTableFilter);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function() {\n 'use strict';\n\n fnInitTreeTableViewport.$inject = ['$window', '$document', '$timeout'/*, '$q', '$compile'*/];\n\n function fnInitTreeTableViewport($window, $document, $timeout/*, $q, $compile*/) {\n\n var viewport = null,\n isUpdating = false,\n isRender = false,\n updateAgain = false,\n // viewportRect,\n items = [],\n // nodeTemplate,\n updateTimeout,\n renderTime,\n eWindow = angular.element($window);\n\n eWindow.on('load resize scroll', updateDelayed);\n\n return {\n\n setViewport: function (element) {\n /**\n * @name setViewport\n * @desciption Set the viewport element\n * @param element\n */\n viewport = element;\n },\n\n getViewport: function () {\n /**\n * Return the current viewport\n * @returns {*}\n */\n return viewport;\n },\n\n add: function (scope, element) {\n /**\n * Add listener for event\n * @param element\n * @param callback\n */\n updateDelayed();\n items.push({\n element: element,\n scope: scope\n });\n },\n\n setTemplate: function (/*scope, template*/) {\n // nodeTemplate = template;\n },\n\n getItems: function () {\n /**\n * Get list of items\n * @returns {Array}\n */\n return items;\n },\n\n updateDelayed: updateDelayed,\n\n pointIsInsideBounds: function (x, y, bounds) {\n /**\n * Check if a point is inside specified bounds\n * @param x\n * @param y\n * @param bounds\n * @returns {boolean}\n */\n return x >= bounds.left &&\n y >= bounds.top &&\n x <= bounds.left + bounds.width &&\n y <= bounds.top + bounds.height;\n }\n };\n\n /**\n * trigger an update\n */\n function updateDelayed() {\n $timeout.cancel(updateTimeout);\n updateTimeout = $timeout(function() {\n update();\n }, 0);\n }\n\n function update() {\n // viewportRect = {\n // width: eWindow.prop('offsetWidth') || $document[0].documentElement.clientWidth,\n // height: eWindow.prop('offsetHeight') || $document[0].documentElement.clientHeight,\n // top: $document[0].body.scrollTop || $document[0].documentElement.scrollTop,\n // left: $document[0].body.scrollLeft || $document[0].documentElement.scrollLeft\n // };\n\n if (isUpdating || isRender) {\n updateAgain = true;\n return;\n }\n isUpdating = true;\n\n recursivePromise();\n }\n\n function recursivePromise() {\n if (isRender) {\n return;\n }\n\n var number = number > 0 ? number : items.length;\n // var item;\n\n if (number > 0) {\n // item = items[0];\n\n isRender = true;\n renderTime = $timeout(function() {\n items.splice(0, 1);\n isRender = false;\n number--;\n $timeout.cancel(renderTime);\n recursivePromise();\n }, 0);\n\n } else {\n isUpdating = false;\n if (updateAgain) {\n updateAgain = false;\n update();\n }\n }\n\n }\n }\n\n angular.module('eHRD.kernel.uiElements.treeTable')\n .factory('$TreeTableViewport', fnInitTreeTableViewport);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n TreeTableControl.$inject = [];\n function TreeTableControl() {\n var _target, _parent,\n i, len;\n\n function fnSetCollapse(node) {\n node.__expanded__ = false;\n }\n\n function fnSetExpand(node) {\n node.__expanded__ = true;\n }\n\n function _$init(scope) {\n var n, tree = {\n selected_node: null,\n for_all_descendants: scope.for_all_descendants,\n select_node: function (node) {\n if (!node) {\n if (tree.selected_node) {\n delete tree.selected_node.__selected__;\n }\n tree.selected_node = null;\n return null;\n }\n\n if (node !== tree.selected_node) {\n if (tree.selected_node) {\n delete tree.selected_node.__selected__;\n }\n node.__selected__ = true;\n tree.selected_node = node;\n tree.expand_all_parents(node);\n if (angular.isFunction(tree.on_select)) {\n tree.on_select(node);\n }\n }\n return node;\n },\n deselect_node: function () {\n _target = null;\n if (tree.selected_node) {\n delete tree.selected_node.__selected__;\n _target = tree.selected_node;\n tree.selected_node = null;\n }\n return _target;\n },\n get_parent: function (node) {\n if (node && node.__parent_real__ !== null) {\n return scope.tree_nodes[node.__parent_real__];\n }\n return null;\n },\n for_all_ancestors: function (child, fn) {\n _parent = tree.get_parent(child);\n if (_parent) {\n if (fn(_parent)) {\n return false;\n }\n\n return tree.for_all_ancestors(_parent, fn);\n }\n return true;\n },\n expand_all_parents: function (child) {\n child = child || tree.selected_node;\n if (angular.isObject(child)) {\n tree.for_all_ancestors(\n child, fnSetExpand\n )\n }\n },\n collapse_all_parents: function (child) {\n child = child || tree.selected_node;\n if (angular.isObject(child)) {\n tree.for_all_ancestors(\n child, fnSetCollapse\n )\n }\n },\n\n reload_data: function () {\n return scope.reload_data();\n },\n add_node: function (parent, new_node, index) {\n if (angular.isNumber(index)) {\n if (parent) {\n parent.__children__.push(new_node);\n parent.__expanded__ = true;\n } else {\n scope.treeData.push(new_node);\n }\n } else {\n if (parent) {\n parent.__children__.splice(index, 0, new_node);\n parent.__expanded__ = true;\n } else {\n scope.treeData.splice(index, 0, new_node);\n }\n }\n return new_node;\n },\n add_node_root: function (new_node) {\n tree.add_node(null, new_node);\n return new_node;\n },\n expand_all: function () {\n len = scope.treeData.length;\n for (i = 0; i < len; i++) {\n tree.for_all_descendants(\n scope.treeData[i], fnSetExpand\n );\n }\n },\n collapse_all: function () {\n len = scope.treeData.length;\n for (i = 0; i < len; i++) {\n tree.for_all_descendants(\n scope.treeData[i], fnSetCollapse\n );\n }\n },\n remove_node: function (node) {\n node = node || tree.selected_node;\n if (angular.isObject(node) ) {\n if (node.__parent_real__ !== null) {\n _parent = tree.get_parent(node).__children__;\n } else {\n _parent = scope.treeData;\n }\n\n _parent.splice(node.__index__, 1);\n\n tree.reload_data();\n\n if (tree.selected_node === node) {\n tree.selected_node = null;\n }\n }\n },\n expand_node: function (node) {\n node = node || tree.selected_node;\n if (angular.isObject(node) && node.__expanded__) {\n node.__expanded__ = true;\n return node;\n }\n },\n collapse_node: function (node) {\n node = node || tree.selected_node;\n if (angular.isObject(node)) {\n node.__expanded__ = false;\n return node;\n }\n },\n get_selected_node: function () {\n return tree.selected_node;\n },\n get_first_node: function () {\n len = scope.treeData.length;\n if (len > 0) {\n return scope.treeData[0];\n }\n return null;\n },\n get_children: function (node) {\n return node.__children__;\n },\n get_siblings: function (node) {\n node = node || tree.selected_node;\n if (angular.isObject(node) ) {\n _parent = tree.get_parent(node);\n if (_parent) {\n _target = _parent.__children__;\n } else {\n _target = scope.treeData;\n }\n return _target;\n }\n },\n get_next_sibling: function (node) {\n node = node || tree.selected_node;\n if (angular.isObject(node)) {\n _target = tree.get_siblings(node);\n n = _target.length;\n if (node.__index__ < n) {\n return _target[node.__index__ + 1];\n }\n }\n },\n get_prev_sibling: function (node) {\n node = node || tree.selected_node;\n _target = tree.get_siblings(node);\n if (node.__index__ > 0) {\n return _target[node.__index__ - 1];\n }\n },\n get_first_child: function (node) {\n node = node || tree.selected_node;\n if (angular.isObject(node)) {\n _target = node.__children__;\n if (_target && _target.length > 0) {\n return node.__children__[0];\n }\n }\n return null;\n },\n get_closest_ancestor_next_sibling: function (node) {\n node = node || tree.selected_node;\n _target = tree.get_next_sibling(node);\n if (_target) {\n return _target;\n }\n\n _parent = tree.get_parent(node);\n if(_parent)\n {\n return tree.get_closest_ancestor_next_sibling(_parent);\n }\n\n return null;\n },\n get_next_node: function (node) {\n node = node || tree.selected_node;\n\n if (angular.isObject(node) ) {\n _target = tree.get_first_child(node);\n if (_target) {\n return _target;\n } else {\n return tree.get_closest_ancestor_next_sibling(node);\n }\n }\n },\n get_prev_node: function (node) {\n node = node || tree.selected_node;\n\n if (angular.isObject(node)) {\n _target = tree.get_prev_sibling(node);\n if (_target) {\n return tree.get_last_descendant(_target);\n }\n\n _parent = tree.get_parent(node);\n return _parent;\n }\n },\n get_last_descendant: scope.getLastDescendant,\n select_parent_node: function (node) {\n node = node || tree.selected_node;\n\n if (angular.isObject(node)) {\n _parent = tree.get_parent(node);\n if (_parent) {\n return tree.select_node(_parent);\n }\n }\n },\n select_first_node: function () {\n var firstNode = tree.get_first_node();\n return tree.select_node(firstNode);\n },\n select_next_sibling: function (node) {\n node = node || tree.selected_node;\n\n if (angular.isObject(node)) {\n _target = tree.get_next_sibling(node);\n if (_target) {\n return tree.select_node(_target);\n }\n }\n },\n select_prev_sibling: function (node) {\n node = node || tree.selected_node;\n\n if (angular.isObject(node)) {\n _target = tree.get_prev_sibling(node);\n if (_target) {\n return tree.select_node(_target);\n }\n }\n },\n select_next_node: function (node) {\n node = node || tree.selected_node;\n\n if (angular.isObject(node)) {\n _target = tree.get_next_node(node);\n if (_target) {\n return tree.select_node(_target);\n }\n }\n },\n select_prev_node: function (node) {\n node = node || tree.selected_node;\n\n if (angular.isObject(node)) {\n _target = tree.get_prev_node(node);\n if (_target) {\n return tree.select_node(_target);\n }\n }\n }\n };\n angular.extend(scope.tree, tree);\n return scope.tree;\n }\n\n return _$init;\n }\n angular.module('eHRD.kernel.uiElements.treeTable')\n .factory('$TreeTableControl', TreeTableControl);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n TreeTableTemplate.$inject = ['$templateCache'];\n function TreeTableTemplate($templateCache) {\n var templatePath = 'template/TreeTable/TreeTable.html',\n copyPath = 'template/TreeTable/TreeTableStatusCopy.html',\n movePath = 'template/TreeTable/TreeTableStatusMove.html',\n scopes = {},\n temp,\n _$init = {\n setMove: function (path, scope) {\n if (!scopes[scope.$id]) {\n scopes[scope.$id] = {};\n }\n scopes[scope.$id].movePath = path;\n },\n setCopy: function (path, scope) {\n if (!scopes[scope.$id]) {\n scopes[scope.$id] = {};\n }\n scopes[scope.$id].copyPath = path;\n },\n getPath: function () {\n return templatePath;\n },\n getCopy: function (scope) {\n if (scopes[scope.$id] && scopes[scope.$id].copyPath) {\n temp = $templateCache.get(scopes[scope.$id].copyPath);\n if (temp) {\n return temp;\n }\n }\n return $templateCache.get(copyPath);\n },\n getMove: function (scope) {\n if (scopes[scope.$id] && scopes[scope.$id].movePath) {\n temp = $templateCache.get(scopes[scope.$id].movePath);\n if (temp) {\n return temp;\n }\n }\n return $templateCache.get(movePath);\n }\n };\n\n return _$init;\n }\n angular.module('eHRD.kernel.uiElements.treeTable')\n .factory('$TreeTableTemplate', TreeTableTemplate);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n TreeTablePlugin.$inject = ['$injector'];\n function TreeTablePlugin($injector) {\n var _fnget = function (name) {\n if (angular.isDefined($injector) && $injector.has(name)) {\n return $injector.get(name);\n }\n return null;\n };\n return _fnget;\n }\n\n angular.module('eHRD.kernel.uiElements.treeTable')\n .factory('$TreeTablePlugin', TreeTablePlugin);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n TreeTableHelper.$inject = ['$document', '$window'];\n function TreeTableHelper($document, $window) {\n var _$helper = {\n nodrag: function (targetElm) {\n return angular.isDefined(targetElm.attr('data-nodrag'));\n },\n eventObj: function (e) {\n var obj = e;\n if (angular.isDefined(e.targetTouches) ) {\n obj = e.targetTouches.item(0);\n } else if (angular.isDefined(e.originalEvent) && angular.isDefined(e.originalEvent.targetTouches)) {\n obj = e.originalEvent.targetTouches.item(0);\n }\n return obj;\n },\n dragInfo: function (scope) {\n var _node = scope.getData(),\n _tree = scope.getScopeTree(),\n _parent = scope.getNode(_node.__parent_real__);\n return {\n node: _node,\n parent: _parent,\n move: {\n parent: _parent,\n pos: _node.__index__\n },\n scope: scope,\n target: _tree,\n drag: _tree,\n drop: scope.getPrevSibling(_node),\n changed: false\n };\n },\n height: function (element) {\n return element.prop('scrollHeight');\n },\n width: function (element) {\n return element.prop('scrollWidth');\n },\n offset: function (element) {\n var boundingClientRect = element[0].getBoundingClientRect();\n return {\n width: element.prop('offsetWidth'),\n height: element.prop('offsetHeight'),\n top: boundingClientRect.top + ($window.pageYOffset || $document[0].body.scrollTop || $document[0].documentElement.scrollTop),\n left: boundingClientRect.left + ($window.pageXOffset || $document[0].body.scrollLeft || $document[0].documentElement.scrollLeft)\n };\n },\n positionStarted: function (e, target) {\n var pos = {};\n pos.offsetX = e.pageX - this.offset(target).left;\n pos.offsetY = e.pageY - this.offset(target).top;\n pos.startX = pos.lastX = e.pageX;\n pos.startY = pos.lastY = e.pageY;\n pos.nowX = pos.nowY = pos.distX = pos.distY = pos.dirAx = 0;\n pos.dirX = pos.dirY = pos.lastDirX = pos.lastDirY = pos.distAxX = pos.distAxY = 0;\n return pos;\n },\n positionMoved: function (e, pos, firstMoving) {\n // mouse position last events\n pos.lastX = pos.nowX;\n pos.lastY = pos.nowY;\n // mouse position this events\n pos.nowX = e.pageX;\n pos.nowY = e.pageY;\n // distance mouse moved between events\n pos.distX = pos.nowX - pos.lastX;\n pos.distY = pos.nowY - pos.lastY;\n // direction mouse was moving\n pos.lastDirX = pos.dirX;\n pos.lastDirY = pos.dirY;\n // direction mouse is now moving (on both axis)\n pos.dirX = pos.distX === 0 ? 0 : pos.distX > 0 ? 1 : -1;\n pos.dirY = pos.distY === 0 ? 0 : pos.distY > 0 ? 1 : -1;\n // axis mouse is now moving on\n var newAx = Math.abs(pos.distX) > Math.abs(pos.distY) ? 1 : 0;\n // do nothing on first move\n if (firstMoving) {\n pos.dirAx = newAx;\n pos.moving = true;\n return;\n }\n // calc distance moved on this axis (and direction)\n if (pos.dirAx !== newAx) {\n pos.distAxX = 0;\n pos.distAxY = 0;\n } else {\n pos.distAxX += Math.abs(pos.distX);\n if (pos.dirX !== 0 && pos.dirX !== pos.lastDirX) {\n pos.distAxX = 0;\n }\n pos.distAxY += Math.abs(pos.distY);\n if (pos.dirY !== 0 && pos.dirY !== pos.lastDirY) {\n pos.distAxY = 0;\n }\n }\n pos.dirAx = newAx;\n },\n replaceIndent: function (scope, element, indent, attr) {\n attr = attr || 'left';\n angular.element(element.children()[0]).css(attr, scope.$callbacks.calsIndent(indent));\n }\n };\n return _$helper;\n }\n\n angular.module('eHRD.kernel.uiElements.treeTable')\n .factory('$TreeTableHelper', TreeTableHelper);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n TreeTableConvert.$inject = [];\n function TreeTableConvert() {\n var _$initConvert = {\n line2tree: function (data, primaryKey, parentKey, callback) {\n callback = angular.isFunction(callback) ? callback : function () {\n };\n if (!data || data.length === 0 || !primaryKey || !parentKey) {\n return [];\n }\n var tree = [],\n rootIds = [],\n item = data[0],\n _primary = item[primaryKey],\n treeObjs = {},\n parentId, parent,\n len = data.length,\n i = 0;\n while (i < len) {\n item = data[i++];\n callback(item);\n _primary = item[primaryKey];\n treeObjs[_primary] = item;\n }\n i = 0;\n while (i < len) {\n item = data[i++];\n callback(item);\n _primary = item[primaryKey];\n treeObjs[_primary] = item;\n parentId = item[parentKey];\n if (parentId) {\n parent = treeObjs[parentId];\n if (parent) {\n if (parent.__children__) {\n parent.__children__.push(item);\n } else {\n parent.__children__ = [item];\n }\n }\n } else {\n rootIds.push(_primary);\n }\n }\n len = rootIds.length;\n for (i = 0; i < len; i++) {\n tree.push(treeObjs[rootIds[i]]);\n }\n return tree;\n },\n tree2tree: function access_child(data, containKey, callback) {\n callback = angular.isFunction(callback) ? callback : function () {\n };\n var _tree = [],\n _i,\n _len = data ? data.length : 0,\n _copy, _child;\n for (_i = 0; _i < _len; _i++) {\n _copy = angular.copy(data[_i]);\n callback(_copy);\n if (angular.isArray(_copy[containKey]) && _copy[containKey].length > 0) {\n _child = access_child(_copy[containKey], containKey, callback);\n delete _copy[containKey];\n _copy.__children__ = _child;\n }\n _tree.push(_copy);\n }\n return _tree;\n },\n arrayTree2tableTree: function access_child(data, containKey, callback) {\n callback = angular.isFunction(callback) ? callback : function () {\n };\n var _tree = [],\n _i,\n _len = data ? data.length : 0;\n for (_i = 0; _i < _len; _i++) {\n if(angular.isArray(data[_i]) && data[_i].length >0)\n _tree.push(data[_i][0]);\n }\n return _$initConvert.tree2tree(_tree, containKey, callback);\n }\n };\n\n return _$initConvert;\n }\n angular.module('eHRD.kernel.uiElements.treeTable')\n .factory('$TreeTableConvert', TreeTableConvert);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function() {\n 'use strict';\n\n fnInitTreeTable.$inject = ['$timeout', '$http', '$compile', '$parse', '$window', '$document', '$templateCache',\n '$TreeTableTemplate', '$TreeTableClass', '$TreeTableHelper', '$TreeTablePlugin', '$TreeTableViewport'\n ];\n\n function fnInitTreeTable($timeout, $http, $compile, $parse, $window, $document, $templateCache,\n $TreeTableTemplate, $TreeTableClass, $TreeTableHelper, $TreeTablePlugin, $TreeTableViewport) {\n\n\n fnController.$inject = ['$scope', '$element', '$attrs'];\n\n function fnController($scope, $element, $attrs) {\n $scope.indent = 20;\n $scope.indent_plus = 15;\n $scope.indent_unit = 'px';\n $scope.$tree_class = 'table';\n $scope.primary_key = '__uid__';\n\n $scope.$type = 'TreeTable';\n // $scope.enabledFilter = null;\n $scope.colDefinitions = [];\n $scope.$globals = {};\n $scope.$class = {};\n\n $scope.treeData = [];\n $scope.tree_nodes = [];\n\n $scope.$class = angular.copy($TreeTableClass);\n angular.extend(\n $scope.$class.icon, {\n '1': $attrs.iconExpand || 'glyphicon glyphicon-minus',\n '0': $attrs.iconCollapse || 'glyphicon glyphicon-plus',\n '-1': $attrs.iconLeaf || 'glyphicon glyphicon-file'\n }\n );\n\n $scope.for_all_descendants = function(node, fn, parent, checkSibling) {\n if (angular.isFunction(fn)) {\n var _i, _len, _nodes;\n\n if (fn(node, parent)) {\n // have error or need ignore children\n return false;\n }\n _nodes = node.__children__;\n _len = _nodes ? _nodes.length : 0;\n for (_i = 0; _i < _len; _i++) {\n if (!$scope.for_all_descendants(_nodes[_i], fn, node) && !checkSibling) {\n // skip sibling of node checking\n return false;\n }\n }\n }\n // succeed then continue\n return true;\n };\n\n $scope.getLastDescendant = function(node) {\n var last_child, n;\n if (!node) {\n node = $scope.tree ? $scope.tree.selected_node : false;\n }\n if (node === false) {\n return false;\n }\n n = node.__children__.length;\n if (n === 0) {\n return node;\n } else {\n last_child = node.__children__[n - 1];\n return $scope.getLastDescendant(last_child);\n }\n };\n\n $scope.getElementChilds = function() {\n return angular.element($element[0].querySelector('[tree-table-nodes]'));\n };\n\n $scope.onClick = function(node) {\n if (angular.isDefined($scope.tree) && angular.isFunction($scope.tree.on_click)) {\n // We want to detach from Angular's digest cycle so we can\n // independently measure the time for one cycle.\n $timeout(function() {\n $scope.tree.on_click(node);\n }, 0);\n }\n };\n\n $scope.onSelect = function(node) {\n if (angular.isDefined($scope.tree)) {\n if (node !== $scope.tree.selected_node) {\n $scope.tree.select_node(node);\n }\n\n if (angular.isFunction($scope.tree.on_select)) {\n $timeout(function() {\n $scope.tree.on_select(node);\n }, 0);\n }\n }\n };\n\n var passedExpand, _clone;\n $scope.toggleExpand = function(node, fnCallback) {\n passedExpand = true;\n if (angular.isFunction(fnCallback) && !fnCallback(node)) {\n passedExpand = false;\n } else if (angular.isFunction($scope.$callbacks.expand) && !$scope.$callbacks.expand(node)) {\n passedExpand = false;\n }\n\n if (passedExpand) {\n if (node.__children__.length >= 0 && node.isFolderType===1) {\n node.__expanded__ = !node.__expanded__;\n }\n }\n };\n\n\n var _fnGetHash = function(node) {\n return '#' + node.__parent__ + '#' + node[$scope.primary_key];\n },\n _fnSetHash = function(node) {\n var _hashKey = _fnGetHash(node);\n if (angular.isUndefinedOrNull(node.__hashKey__) || node.__hashKey__ !== _hashKey) {\n node.__hashKey__ = _hashKey;\n }\n return node;\n };\n $scope.getHash = _fnGetHash;\n $scope.$callbacks = {\n getHash: _fnGetHash,\n setHash: _fnSetHash,\n for_all_descendants: $scope.for_all_descendants,\n /*expand: function (node) {\n return true;\n },*/\n accept: function( /*dragInfo, moveTo, isChanged*/ ) {\n return $scope.dropEnabled === true;\n },\n calsIndent: function(level, skipUnit, skipEdge) {\n var unit = 0,\n edge = skipEdge ? 0 : $scope.indent_plus;\n if (!skipUnit) {\n unit = $scope.indent_unit ? $scope.indent_unit : 'px';\n }\n\n if (level - 1 < 1) {\n return edge + unit;\n } else {\n return $scope.indent * (level - 1) + edge + unit;\n }\n },\n droppable: function() {\n return $scope.dropEnabled === true;\n },\n draggable: function() {\n return $scope.dragEnabled === true;\n },\n beforeDrop: function( /*event*/ ) {\n return true;\n },\n changeKey: function(node) {\n var _key = node.__uid__;\n node.__uid__ = Math.random();\n if (node.__selected__) {\n delete node.__selected__;\n }\n\n if ($scope.primary_key !== '__uid__') {\n _key = '' + node[$scope.primary_key];\n _key = _key.replace(/_#.+$/g, '') + '_#' + node.__uid__;\n\n node[$scope.primary_key] = _key;\n }\n // delete(node.__hashKey__);\n },\n clone: function(node /*, _this*/ ) {\n _clone = angular.copy(node);\n this.for_all_descendants(_clone, this.changeKey);\n return _clone;\n },\n remove: function(node, parent, _this, delayReload) {\n var temp = parent.splice(node.__index__, 1)[0];\n if (!delayReload) {\n $scope.reload_data();\n }\n return temp;\n },\n clearInfo: function(node) {\n delete node.__inited__;\n delete node.__visible__;\n\n // always changed after call reload_data\n //delete node.__hashKey__;\n },\n add: function(node, pos, parent /*, _this*/ ) {\n // clearInfo\n this.for_all_descendants(node, this.clearInfo);\n if (parent) {\n if (parent.length > -1) {\n if (pos > -1) {\n parent.splice(pos, 0, node);\n } else {\n // todo If children need load crazy\n parent.push(node);\n }\n } else {\n parent.push(node);\n }\n }\n }\n };\n\n $scope.deleteScope = function(scope, node) {\n var _hash = node.__hashKey__;\n if ($scope.$globals[_hash] && $scope.$globals[_hash] === scope) {\n delete $scope.$globals[_hash];\n }\n };\n\n $scope.setScope = function(scope, node) {\n var _hash = node.__hashKey__;\n if ($scope.$globals[_hash] !== scope) {\n $scope.$globals[_hash] = scope;\n }\n };\n\n $scope.getScope = function(node) {\n if (node) {\n var _hash = node.__hashKey__;\n //var _hash = typeof node === 'string' ? node : node.__hashKey__;\n return $scope.$globals[_hash];\n }\n return $scope;\n };\n\n if ($attrs.enableDrag || $attrs.enableDrop) {\n $scope.placeElm = null;\n // $scope.dragBorder = 30;\n $scope.dragEnabled = null;\n $scope.dropEnabled = null;\n $scope.horizontal = null;\n\n if ($attrs.enableDrag) {\n\n $scope.dragDelay = 0;\n $scope.enabledMove = true;\n $scope.statusMove = true;\n $scope.enabledHotkey = false;\n $scope.enabledCollapse = null;\n $scope.statusElm = null;\n $scope.dragging = null;\n\n angular.extend(\n $scope.$callbacks, {\n beforeDrag: function( /*scopeDrag*/ ) {\n return true;\n },\n dragStop: function(info, passed) {\n if (!info || !info.changed && info.drag.enabledMove || !passed) {\n return null;\n }\n\n info.target.reload_data();\n\n if (info.target !== info.drag && info.drag.enabledMove) {\n info.drag.reload_data();\n }\n },\n dropped: function(info /*, pass*/ ) {\n if (!info) {\n return null;\n }\n\n var _node = info.node,\n _nodeAdd = null,\n _move = info.move,\n _parent = null,\n _parentRemove = info.parent || info.drag.treeData,\n _parentAdd = _move.parent || info.target.treeData,\n isMove = info.drag.enabledMove;\n\n if (!info.changed && isMove) {\n return false;\n }\n\n if (info.target.$callbacks.accept(info, info.move, info.changed)) {\n if (isMove) {\n _parent = _parentRemove;\n if (angular.isDefined(_parent.__children__)) {\n _parent = _parent.__children__;\n }\n\n _nodeAdd = info.drag.$callbacks.remove(\n _node,\n _parent,\n info.drag.$callbacks,\n true // delay reload\n );\n } else {\n _nodeAdd = info.drag.$callbacks.clone(_node, info.drag.$callbacks);\n }\n\n // if node dragging change index in sample node parent\n // and index node decrement\n if (isMove &&\n info.drag === info.target &&\n _parentRemove === _parentAdd &&\n _move.pos >= info.node.__index__) {\n _move.pos--;\n }\n\n _parent = _parentAdd;\n if (_parent.__children__) {\n _parent = _parent.__children__;\n }\n\n info.target.$callbacks.add(\n _nodeAdd,\n _move.pos,\n _parent,\n info.drag.$callbacks\n );\n\n return true;\n }\n\n return false;\n },\n dragStart: function( /*event*/ ) {},\n dragMove: function( /*event*/ ) {}\n }\n );\n\n $scope.setDragging = function(dragInfo) {\n $scope.dragging = dragInfo;\n };\n\n $scope.enableMove = function(val) {\n if (typeof val === 'boolean') {\n $scope.enabledMove = val;\n } else {\n $scope.enabledMove = true;\n }\n };\n\n if ($attrs.enableStatus) {\n $scope.enabledStatus = false;\n\n $scope.hideStatus = function() {\n if ($scope.statusElm) {\n $scope.statusElm.addClass($scope.$class.hidden);\n }\n };\n\n $scope.refreshStatus = function() {\n if (!$scope.dragging) {\n return;\n }\n\n if ($scope.enabledStatus) {\n var statusElmOld = $scope.statusElm;\n if ($scope.enabledMove) {\n $scope.statusElm = angular.element($TreeTableTemplate.getMove($scope));\n } else {\n $scope.statusElm = angular.element($TreeTableTemplate.getCopy($scope));\n }\n\n if (statusElmOld !== $scope.statusElm) {\n if (statusElmOld) {\n $scope.statusElm.attr('class', statusElmOld.attr('class'));\n $scope.statusElm.attr('style', statusElmOld.attr('style'));\n statusElmOld.remove();\n }\n $document.find('body').append($scope.statusElm);\n\n }\n\n $scope.statusElm.removeClass($scope.$class.hidden);\n }\n };\n\n $scope.setPositionStatus = function(e) {\n if ($scope.statusElm) {\n $scope.statusElm.css({\n 'left': e.pageX + 10 + 'px',\n 'top': e.pageY + 15 + 'px',\n 'z-index': 9999\n });\n $scope.statusElm.addClass($scope.$class.status);\n }\n };\n }\n }\n\n $scope.targeting = false;\n\n $scope.getPrevSibling = function(node) {\n if (node && node.__index__ > 0) {\n var _parent, _index = node.__index__ - 1;\n\n if (angular.isDefined(node.__parent_real__)) {\n _parent = $scope.tree_nodes[node.__parent_real__];\n return _parent.__children__[_index];\n }\n return $scope.treeData[_index];\n\n }\n return null;\n };\n\n $scope.getNode = function(index) {\n if (angular.isUndefinedOrNull(index)) {\n return null;\n }\n return $scope.tree_nodes[index];\n };\n\n $scope.initPlace = function(element, dragElm) {\n\n if (!$scope.placeElm) {\n if ($scope.isTable) {\n $scope.placeElm = angular.element($window.document.createElement('tr'));\n var _len_down = $scope.colDefinitions.length;\n $scope.placeElm.append(\n angular.element($window.document.createElement('td'))\n .addClass($scope.$class.empty)\n .addClass('indented')\n .addClass($scope.$class.place)\n );\n while (_len_down-- > 0) {\n $scope.placeElm.append(\n angular.element($window.document.createElement('td'))\n .addClass($scope.$class.empty)\n .addClass($scope.$class.place)\n );\n }\n } else {\n $scope.placeElm = angular.element($window.document.createElement('li'))\n .addClass($scope.$class.empty)\n .addClass($scope.$class.place);\n }\n\n }\n\n if (dragElm) {\n $scope.placeElm.css('height', $TreeTableHelper.height(dragElm) + 'px');\n }\n\n if (element) {\n element[0].parentNode.insertBefore($scope.placeElm[0], element[0]);\n } else {\n $scope.getElementChilds().append($scope.placeElm);\n }\n\n return $scope.placeElm;\n };\n\n $scope.hidePlace = function() {\n if ($scope.placeElm) {\n $scope.placeElm.addClass($scope.$class.hidden);\n }\n };\n\n $scope.showPlace = function() {\n if ($scope.placeElm) {\n $scope.placeElm.removeClass($scope.$class.hidden);\n }\n };\n\n $scope.getScopeTree = function() {\n return $scope;\n };\n\n }\n\n $scope.$safeApply = $safeApply;\n\n\n $scope.hiddenChild = function fnHiddenChild(node, parent) {\n var nodeScope = $scope.getScope(node);\n if (nodeScope) {\n if (parent && parent.__expanded__ && parent.__visible__) {\n nodeScope.$element.removeClass($scope.$class.hidden);\n node.__visible__ = true;\n } else {\n nodeScope.$element.addClass($scope.$class.hidden);\n node.__visible__ = false;\n }\n } else {\n // show node & init scope\n if (parent && parent.__expanded__ && parent.__visible__) {\n node.__visible__ = true;\n } else {\n node.__visible__ = false;\n }\n }\n\n // skip all child hiding... if not expaned\n return node.__expanded__ === false;\n };\n var _fnInitFilter,\n _fnInitOrderBy,\n _fnGetControl,\n _defaultFilterOption = {\n showParent: true,\n showChild: false,\n beginAnd: true\n },\n tree,\n _watches = [\n [\n 'enableDrag', [\n ['boolean', 'enableStatus', null, 'enabledStatus'],\n ['boolean', 'enableMove', null, 'enabledMove'],\n ['number', 'dragDelay', 0, null, 0],\n ['boolean', 'enableCollapse', null, 'enabledCollapse'],\n [\n 'boolean', 'enableHotkey', null, 'enabledHotkey', null,\n function(isHotkey) {\n if (isHotkey) {\n $scope.enabledMove = false;\n } else {\n $scope.enabledMove = $scope.statusMove;\n }\n }\n ]\n ]\n ],\n [\n ['enableDrag', 'enableStatus'],\n [\n [\n 'string', 'templateCopy', $attrs.templateCopy, 'templateCopy', null,\n function(_url) {\n if (_url && $templateCache.get(_url)) {\n $TreeTableTemplate.setCopy(_url, $scope);\n }\n }\n ],\n [\n 'string', 'templateMove', $attrs.templateMove, 'templateMove', null,\n function(_url) {\n if (_url && $templateCache.get(_url)) {\n $TreeTableTemplate.setMove(_url, $scope);\n }\n }\n ]\n ]\n ],\n [\n [\n ['enableDrag', 'enableDrop']\n ],\n [\n ['number', 'dragBorder', 30, 'dragBorder', 30]\n ]\n ],\n [\n '*', [\n ['boolean', 'treeTable', true, 'treeTable', null],\n ['boolean', 'horizontal'],\n [\n 'callback', 'treeClass',\n function(val) {\n switch (typeof val) {\n case 'string':\n $scope.$tree_class = val;\n break;\n case 'object':\n angular.extend($scope.$class, val);\n $scope.$tree_class = $scope.$class.tree;\n break;\n default:\n $scope.$tree_class = $attrs.treeClass;\n break;\n }\n }, 'treeClass',\n function() {\n $scope.$tree_class = $scope.$class.tree + ' table';\n },\n null,\n function() {\n if (/^(\\s+[\\w\\-]+){2,}$/g.test(' ' + $attrs.treeClass)) {\n $scope.$tree_class = $attrs.treeClass.trim();\n return true;\n }\n }\n ],\n [\n ['object', 'string'], 'expandOn', getExpandOn, 'expandingProperty', getExpandOn,\n function(expandOn) {\n if (angular.isUndefinedOrNull(expandOn)) {\n $scope.expandingProperty = $attrs.expandOn;\n }\n }\n ],\n [\n 'object', 'treeControl', angular.isDefined($scope.tree) ? $scope.tree : {},\n 'tree', null,\n function($tree) {\n\n if (!angular.isFunction(_fnGetControl)) {\n _fnGetControl = $TreeTablePlugin('$TreeTableControl');\n }\n\n if (angular.isFunction(_fnGetControl)) {\n tree = angular.extend(\n $tree,\n _fnGetControl($scope)\n );\n }\n }\n ],\n [\n ['array', 'object'], 'columnDefs', getColDefs, 'colDefinitions', getColDefs,\n function(colDefs) {\n if (angular.isUndefinedOrNull(colDefs) || !angular.isArray(colDefs)) {\n $scope.colDefinitions = getColDefs();\n }\n }\n ],\n [\n ['object', 'string', 'array', 'function'], 'orderBy', $attrs.orderBy\n ],\n [\n ['object', 'array'], 'filter', null, 'filter', null,\n function(filters) {\n var _passed = false;\n if (angular.isDefined(filters) && !angular.isArray(filters)) {\n var _keysF = Object.keys(filters),\n _lenF = _keysF.length,\n _iF;\n\n if (_lenF > 0) {\n for (_iF = 0; _iF < _lenF; _iF++) {\n\n if (angular.isString(filters[_keysF[_iF]]) &&\n filters[_keysF[_iF]].length === 0) {\n continue;\n }\n _passed = true;\n break;\n }\n }\n }\n\n $scope.enabledFilter = _passed;\n reload_data();\n }\n ],\n [\n 'object', 'filterOptions', _defaultFilterOption, 'filterOptions',\n _defaultFilterOption,\n function(option) {\n if (angular.isObject(option)) {\n $scope.filterOptions = angular.extend(_defaultFilterOption, option);\n }\n }\n ],\n ['string', 'primaryKey', $attrs.primaryKey, 'primary_key', '__uid__'],\n ['string', 'indentUnit', $attrs.indentUnit, 'indent_unit'],\n ['number', 'indent', 30, null, 30],\n ['number', 'indentPlus', 20, null, 20],\n [\n 'null', 'callbacks',\n function(optCallbacks) {\n angular.forEach(\n optCallbacks,\n function(value, key) {\n if (angular.isFunction(value)) {\n if ($scope.$callbacks[key]) {\n $scope.$callbacks[key] = value;\n }\n }\n }\n );\n return $scope.$callbacks;\n },\n '$callbacks'\n ],\n [\n 'number', 'expandLevel', 9999, 'expandLevel', 9999,\n function() {\n reload_data();\n }\n ],\n ['number', 'treeLimit', 100, '$TreeLimit', 100],\n ['boolean', 'enableDrag', null, 'dragEnabled'],\n ['boolean', 'enableDrop', null, 'dropEnabled']\n ]\n ]\n ],\n w, lenW = _watches.length,\n i, len,\n _curW,\n _typeW, _nameW, _defaultW, _scopeW, _NotW, _AfterW, _BeforeW,\n\n // debounce reload_Data;\n timeReloadData, tmpTreeData;\n\n for (w = 0; w < lenW; w++) {\n // skip if not exist\n if (!check_exist_attr($attrs, _watches[w][0], true)) {\n continue;\n }\n _curW = _watches[w][1];\n for (i = 0, len = _curW.length; i < len; i++) {\n _typeW = _curW[i][0];\n _nameW = _curW[i][1];\n _defaultW = _curW[i][2];\n _scopeW = _curW[i][3];\n _NotW = _curW[i][4];\n _AfterW = _curW[i][5];\n _BeforeW = _curW[i][6];\n generateWatch(_typeW, _nameW, _defaultW, _scopeW, _NotW, _AfterW, _BeforeW);\n }\n }\n\n if ($attrs.treeData) {\n $scope.$watch(\n $attrs.treeData,\n function(val) {\n if (angular.equals(val, $scope.treeData)) {\n return;\n }\n\n tmpTreeData = val;\n if (angular.isUndefinedOrNull(timeReloadData)) {\n timeReloadData = $timeout(timeLoadData, 350);\n }\n }, true\n );\n }\n\n function timeLoadData() {\n $scope.treeData = tmpTreeData;\n reload_data();\n timeReloadData = null;\n }\n\n $scope.updateLimit = function updateLimit() {\n //console.log('Call fn UpdateLimit');\n $scope.$TreeLimit += 50;\n };\n\n $scope.reload_data = reload_data;\n\n function check_exist_attr(attrs, existAttr, isAnd) {\n if (angular.isUndefinedOrNull(existAttr)) {\n return false;\n }\n\n if (existAttr === '*' || angular.isDefined(attrs[existAttr])) {\n return true;\n }\n\n if (angular.isArray(existAttr)) {\n return for_each_attrs(attrs, existAttr, isAnd);\n }\n }\n\n function for_each_attrs(attrs, exist, isAnd) {\n var i, len = exist.length,\n passed = false;\n\n if (len === 0) {\n return null;\n }\n for (i = 0; i < len; i++) {\n if (check_exist_attr(attrs, exist[i], !isAnd)) {\n passed = true;\n if (!isAnd) {\n return true;\n }\n } else {\n if (isAnd) {\n return false;\n }\n }\n }\n\n return passed;\n }\n\n function generateWatch(type, nameAttr, valDefault, nameScope, fnNotExist, fnAfter,\n fnBefore\n ) {\n nameScope = nameScope || nameAttr;\n if (angular.isString(type) || angular.isArray(type)) {\n if (angular.isFunction(fnBefore) && fnBefore()) {\n return; //jmp\n }\n if (angular.isString($attrs[nameAttr])) {\n $scope.$watch(\n $attrs[nameAttr],\n function(val) {\n if (angular.isString(type) && typeof val === type ||\n angular.isArray(type) && type.indexOf(typeof val) > -1\n ) {\n $scope[nameScope] = val;\n } else {\n if (angular.isFunction(valDefault)) {\n $scope[nameScope] = valDefault(val);\n } else {\n $scope[nameScope] = valDefault;\n }\n }\n\n if (angular.isFunction(fnAfter)) {\n fnAfter($scope[nameScope], $scope);\n }\n }, true\n );\n } else {\n\n if (angular.isFunction(fnNotExist)) {\n $scope[nameScope] = fnNotExist();\n } else if (angular.isDefined(fnNotExist)) {\n $scope[nameScope] = fnNotExist;\n }\n }\n }\n }\n\n function $safeApply(fn) {\n var phase = this.$root.$$phase;\n if (phase === '$apply' || phase === '$digest') {\n if (fn && angular.isFunction(fn)) {\n fn();\n }\n } else {\n this.$apply(fn);\n }\n }\n\n function getExpandOn() {\n if ($scope.treeData && $scope.treeData.length) {\n var _firstNode = $scope.treeData[0],\n _keys = Object.keys(_firstNode),\n _regex = new RegExp('^__([a-zA-Z0-9_\\-]*)__$'),\n _len,\n i;\n // Auto get first field with type is string;\n for (i = 0, _len = _keys.length; i < _len; i++) {\n if (angular.isString(_firstNode[_keys[i]]) && !_regex.test(_keys[i])) {\n $scope.expandingProperty = _keys[i];\n return;\n }\n }\n\n // Auto get first\n if (angular.isUndefinedOrNull($scope.expandingProperty)) {\n $scope.expandingProperty = _keys[0];\n }\n\n }\n }\n\n function getColDefs() {\n // Auto get Defs except attribute __level__ ....\n if ($scope.treeData.length) {\n var _col_defs = [],\n _firstNode = $scope.treeData[0],\n _regex = new RegExp('(^__([a-zA-Z0-9_\\-]*)__$|^' + $scope.expandingProperty + '$)'),\n _keys = Object.keys(_firstNode),\n i, _len;\n // Auto get first field with type is string;\n for (i = 0, _len = _keys.length; i < _len; i++) {\n if (angular.isString(_firstNode[_keys[i]]) && !_regex.test(_keys[i])) {\n _col_defs.push({\n field: _keys[i]\n });\n }\n }\n $scope.colDefinitions = _col_defs;\n }\n }\n\n function do_f(root, node, parent, parent_real, level, visible, index) {\n\n if (!angular.isObject(node)) {\n return 0;\n }\n\n var _i, _len, _icon, _index_real, _dept, _hashKey;\n if (!angular.isArray(node.__children__)) {\n node.__children__ = [];\n }\n\n node.__parent_real__ = parent_real;\n node.__parent__ = parent;\n _len = node.__children__.length;\n\n if (angular.isUndefinedOrNull(node.__expanded__) && node.isFolderType===1) { //angular.isUndefinedOrNull(node.__expanded__) && _len > 0\n node.__expanded__ = level < $scope.expandLevel;\n }\n\n if (_len === 0 && node.isFolderType===0) {\n _icon = -1;\n } else {\n if (node.__expanded__) {\n _icon = 1;\n } else {\n _icon = 0;\n }\n }\n\n // Insert item vertically\n _index_real = root.length;\n node.__index__ = index;\n node.__index_real__ = _index_real;\n node.__level__ = level;\n node.__icon__ = _icon;\n node.__icon_class__ = $scope.$class.icon[_icon];\n node.__visible__ = !!visible;\n\n if (angular.isUndefinedOrNull(node.__uid__)) {\n node.__uid__ = '' + Math.random();\n }\n\n _hashKey = $scope.getHash(node);\n\n if (angular.isUndefinedOrNull(node.__hashKey__) || node.__hashKey__ !== _hashKey) {\n node.__hashKey__ = _hashKey;\n }\n\n root.push(node);\n\n // Check node children\n _dept = 1;\n if (_len > 0) {\n for (_i = 0; _i < _len; _i++) {\n _dept += do_f(\n root,\n node.__children__[_i],\n node[$scope.primary_key],\n _index_real,\n level + 1,\n visible && node.__expanded__,\n _i\n );\n }\n }\n\n node.__dept__ = _dept;\n\n return _dept;\n }\n\n function init_data(data) {\n\n // clear memory\n if (angular.isDefined($scope.tree_nodes)) {\n delete $scope.tree_nodes;\n }\n\n $scope.tree_nodes = data;\n return data;\n }\n\n function reload_data(oData) {\n //removeIf(nodebug)\n // console.time('Reload_Data');\n //endRemoveIf(nodebug)\n\n var _data,\n _len,\n _tree_nodes = [];\n if (angular.isDefined(oData)) {\n if (!angular.isArray(oData) || oData.length === 0) {\n return init_data([]);\n } else {\n _data = oData;\n }\n } else if (!angular.isArray($scope.treeData) || $scope.treeData.length === 0) {\n return init_data([]);\n } else {\n _data = $scope.treeData;\n }\n\n if (!$attrs.expandOn) {\n getExpandOn();\n }\n\n if (!$attrs.columnDefs) {\n getColDefs();\n }\n\n if (angular.isDefined($scope.orderBy)) {\n if (!angular.isFunction(_fnInitOrderBy)) {\n _fnInitOrderBy = $TreeTablePlugin('$TreeTableOrderBy');\n }\n\n if (angular.isFunction(_fnInitOrderBy)) {\n _data = _fnInitOrderBy(_data, $scope.orderBy);\n }\n }\n\n if (angular.isDefined($scope.filter)) {\n if (!angular.isFunction(_fnInitFilter)) {\n _fnInitFilter = $TreeTablePlugin('$TreeTableFilter');\n }\n\n if (angular.isFunction(_fnInitFilter)) {\n _data = _fnInitFilter(_data, $scope.filter, $scope.filterOptions);\n }\n }\n\n _len = _data.length;\n if (_len > 0) {\n var _i,\n _deptTotal = 0;\n\n for (_i = 0; _i < _len; _i++) {\n _deptTotal += do_f(_tree_nodes, _data[_i], null, null, 1, true, _i);\n }\n _deptTotal;\n }\n\n init_data(_tree_nodes);\n\n //removeIf(nodebug)\n // console.timeEnd('Reload_Data');\n //endRemoveIf(nodebug)\n return _tree_nodes;\n }\n }\n\n function fnCompile(tElement) {\n\n var $_Template = '',\n _element = tElement.html().trim();\n\n if (_element.length > 0) {\n $_Template = _element;\n tElement.html('');\n }\n\n return function fnPost(scope, element, attrs) {\n\n // if (attrs.enableDrag) {\n //\n // }\n\n // kick out $digest\n element.ready(function() {\n // apply Template\n function checkTreeTable(template, scope) {\n var elemNode = template[0].querySelector('[tree-table-node]'),\n attrInclude;\n\n scope.isTable = null;\n if (elemNode) {\n elemNode = angular.element(elemNode);\n attrInclude = elemNode.attr('ng-include');\n } else {\n return;\n }\n\n if (attrInclude) {\n var treeInclude = $parse(attrInclude)(scope) || attrInclude;\n if (angular.isString(treeInclude)) {\n return $http.get(\n treeInclude, {\n cache: $templateCache\n }\n ).success(\n function(data) {\n data = data.trim();\n //scope.templateNode = data;\n var tempDiv = $document[0].createElement('div');\n tempDiv.innerHTML = data;\n tempDiv = angular.element(tempDiv);\n scope.isTable = !tempDiv[0].querySelector('[tree-table-nodes]');\n }\n );\n }\n } else {\n scope.isTable = !elemNode[0].querySelector('[tree-table-nodes]');\n //scope.templateNode = elemNode.html();\n }\n $TreeTableViewport.setTemplate(scope, scope.templateNode);\n //elemNode.html('');\n }\n\n var promiseCheck;\n if ($_Template.length > 0) {\n promiseCheck = checkTreeTable(angular.element($_Template.trim()), scope);\n if (angular.isObject(promiseCheck)) {\n promiseCheck.then(function() {\n element.append($compile($_Template)(scope));\n });\n } else {\n element.append($compile($_Template)(scope));\n }\n } else {\n $http.get(\n attrs.templateUrl || $TreeTableTemplate.getPath(), {\n cache: $templateCache\n }\n ).success(\n function(data) {\n data = angular.element(data.trim());\n promiseCheck = checkTreeTable(data, scope);\n if (angular.isObject(promiseCheck)) {\n promiseCheck.then(function() {\n element.append($compile(data)(scope));\n });\n } else {\n element.append($compile(data)(scope));\n }\n }\n );\n }\n })\n };\n }\n return {\n restrict: 'E',\n scope: true,\n replace: true,\n controller: fnController,\n compile: fnCompile\n };\n }\n angular.module('eHRD.kernel.uiElements.treeTable')\n .directive('treeTable', fnInitTreeTable);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n TreeTableNodes.$inject = [];\n function TreeTableNodes() {\n return {\n restrict: 'A',\n replace: true,\n link: function (scope, element/*, attrs*/) {\n scope.$type = 'TreeTableNodes';\n\n if (scope.$class.nodes) {\n element.addClass(scope.$class.nodes);\n scope.$nodes_class = scope.$class.nodes;\n } else {\n scope.$nodes_class = '';\n }\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements.treeTable')\n .directive('treeTableNodes', TreeTableNodes);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n TreeTableNode.$inject = ['$TreeTableViewport'/*, '$timeout'*/];\n function TreeTableNode($TreeTableViewport/*, $timeout*/) {\n return {\n restrict: 'A',\n replace: true,\n link: fnLink\n };\n function fnLink(scope, element, attrs) {\n\n scope.$node_class = '';\n\n if (scope.$class.node) {\n element.addClass(scope.$class.node);\n scope.$node_class = scope.$class.node;\n }\n var enabledDnD = typeof scope.dragEnabled === 'boolean' || typeof scope.dropEnabled === 'boolean',\n keyNode = attrs.treeTableNode,\n first = true,\n childsElem;\n //removeIf(nodebug)\n // console.log('Created Node');\n //endRemoveIf(nodebug)\n $TreeTableViewport.add(scope, element);\n\n if (enabledDnD) {\n scope.$type = 'TreeTableNode';\n\n scope.getData = function () {\n return scope[keyNode];\n };\n }\n\n scope.$element = element;\n scope[keyNode].__inited__ = true;\n\n scope.getElementChilds = function () {\n return angular.element(element[0].querySelector('[tree-table-nodes]'));\n };\n\n scope.setScope(scope, scope[keyNode]);\n\n scope.getScopeNode = function () {\n return scope;\n };\n\n var objprops = [],\n objexpr,\n i, keyO = Object.keys(scope[keyNode]),\n lenO = keyO.length,\n hashKey = scope[keyNode].__hashKey__,\n skipAttr = [\n '__visible__',\n '__children__',\n '__level__',\n '__index__',\n '__index_real__',\n\n '__parent__',\n '__parent_real__',\n '__dept__',\n '__icon__',\n '__icon_class__'\n ],\n keepAttr = [\n '__expanded__'\n ],\n lenKeep = keepAttr.length;\n\n // skip __visible__\n for (i = 0; i < lenO + lenKeep; i++) {\n if (i < lenO) {\n if (skipAttr.indexOf(keyO[i]) === -1) {\n objprops.push(keyNode + '.' + keyO[i]);\n }\n } else {\n if (keyO.indexOf(keepAttr[i - lenO]) === -1) {\n objprops.push(keyNode + '.' + keepAttr[i - lenO]);\n }\n }\n }\n\n objexpr = '[' + objprops.join(',') + ']';\n\n scope.$watch(objexpr, fnWatchNode, true);\n\n scope.$on('$destroy', function () {\n scope.deleteScope(scope, scope[keyNode]);\n });\n\n function fnWatchNode(newVal, oldVal, scope) {\n\n //removeIf(nodebug)\n // console.time('Node_Changed');\n //endRemoveIf(nodebug)\n var nodeOf = scope[keyNode],\n _icon;\n\n if (first) {\n _icon = nodeOf.__icon__;\n nodeOf.__icon_class__ = scope.$class.icon[_icon];\n } else {\n\n var parentReal = nodeOf.__parent_real__,\n parentNode = scope.tree_nodes[parentReal] || null,\n _childs = nodeOf.__children__,\n _len = _childs.length,\n _i;\n\n if (!nodeOf.__inited__) {\n nodeOf.__inited__ = true;\n }\n\n if (nodeOf.__hashKey__ !== hashKey) {\n // clear scope in $globals\n scope.deleteScope(scope, nodeOf);\n\n // add new scope into $globals\n scope.setScope(scope, nodeOf);\n hashKey = nodeOf.__hashKey__;\n }\n\n if (parentNode && (!parentNode.__expanded__ || !parentNode.__visible__)) {\n element.addClass(scope.$class.hidden);\n nodeOf.__visible__ = false;\n } else {\n element.removeClass(scope.$class.hidden);\n nodeOf.__visible__ = true;\n }\n\n if (_len === 0 && nodeOf.isFolderType===0) { //_len === 0\n _icon = -1;\n } else {\n if (nodeOf.__expanded__) {\n _icon = 1;\n } else {\n _icon = 0;\n }\n }\n\n nodeOf.__icon__ = _icon;\n nodeOf.__icon_class__ = scope.$class.icon[_icon];\n\n if (scope.isTable) {\n for (_i = 0; _i < _len; _i++) {\n scope.for_all_descendants(_childs[_i], scope.hiddenChild, nodeOf, true);\n }\n } else {\n if (!childsElem) {\n childsElem = scope.getElementChilds();\n }\n\n if (nodeOf.__expanded__) {\n childsElem.removeClass(scope.$class.hidden);\n } else {\n childsElem.addClass(scope.$class.hidden);\n }\n }\n\n }\n\n //removeIf(nodebug)\n // console.timeEnd('Node_Changed');\n //endRemoveIf(nodebug)\n first = false;\n\n }\n }\n }\n angular.module('eHRD.kernel.uiElements.treeTable')\n .directive('treeTableNode', TreeTableNode);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n function TreeTableNodeHandle() {\n return {\n restrict: 'A',\n scope: true,\n link: function (scope, element/*, attrs*/) {\n scope.$type = 'TreeTableNodeHandle';\n if (scope.$class.handle) {\n element.addClass(scope.$class.handle);\n }\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements.treeTable')\n .directive('treeTableNodeHandle', TreeTableNodeHandle);\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n compile.$inject = ['$compile'];\n function compile($compile) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n scope.$watch(\n attrs.compile, function (new_val) {\n if (new_val) {\n if (angular.isFunction(element.empty)) {\n element.empty();\n } else {\n element.html('');\n }\n\n element.append($compile(new_val)(scope));\n }\n }\n );\n }\n };\n }\n\n compileReplace.$inject = ['$compile'];\n function compileReplace($compile) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n scope.$watch(\n attrs.compileReplace, function (new_val) {\n if (new_val) {\n element.replaceWith($compile(new_val)(scope));\n }\n }\n );\n }\n };\n }\n\n\n angular.module('eHRD.kernel.uiElements.treeTable')\n .directive('compile', compile)\n .directive('compileReplace', compileReplace);\n\n\n})();\n\n/**\n * Created by Bruce on 2016/6/17.\n */\n(function () {\n 'use strict';\n\n angular.module('eHRD.kernel.uiElements.tree',[]);\n\n})();\n\n/**\n * Created by Bruce on 2016/6/17.\n */\n(function () {\n 'use strict';\n\n UiTreeHelper.$inject = [/*'$document', '$window', 'treeConfig'*/];\n function UiTreeHelper(/*$document, $window, treeConfig*/) {\n return {\n /**\n * A hashtable used to storage data of nodes\n * @type {Object}\n */\n nodesData: {},\n\n setNodeAttribute: function (scope, attrName, val) {\n if (!scope.$modelValue) {\n return null;\n }\n var data = this.nodesData[scope.$modelValue.hashKey];\n if (!data) {\n data = {};\n this.nodesData[scope.$modelValue.hashKey] = data;\n }\n data[attrName] = val;\n },\n\n getNodeAttribute: function (scope, attrName) {\n if (!scope.$modelValue) {\n return null;\n }\n var data = this.nodesData[scope.$modelValue.hashKey];\n if (data) {\n return data[attrName];\n }\n return null;\n }\n };\n }\n\n\n angular.module('eHRD.kernel.uiElements.tree')\n .factory('uiTreeHelper',UiTreeHelper);\n\n})();\n\n/**\n * Created by Bruce on 2017/5/5.\n */\n(function () {\n 'use strict';\n\n treeFactory.$inject = [];\n function treeFactory() {\n /**\n * Sort an array using the merge sort algorithm.\n *\n * @param {function} comparatorFn The comparator function.\n * @param {array} arr The array to sort.\n * @returns {array} The sorted array.\n */\n function mergeSort(comparatorFn, arr) {\n var len = arr.length, firstHalf, secondHalf;\n if (len >= 2) {\n firstHalf = arr.slice(0, len / 2);\n secondHalf = arr.slice(len / 2, len);\n return merge(comparatorFn, mergeSort(comparatorFn, firstHalf), mergeSort(comparatorFn, secondHalf));\n } else {\n return arr.slice();\n }\n }\n\n /**\n * The merge part of the merge sort algorithm.\n *\n * @param {function} comparatorFn The comparator function.\n * @param {array} arr1 The first sorted array.\n * @param {array} arr2 The second sorted array.\n * @returns {array} The merged and sorted array.\n */\n function merge(comparatorFn, arr1, arr2) {\n var result = [], left1 = arr1.length, left2 = arr2.length;\n while (left1 > 0 && left2 > 0) {\n if (comparatorFn(arr1[0], arr2[0]) <= 0) {\n result.push(arr1.shift());\n left1--;\n } else {\n result.push(arr2.shift());\n left2--;\n }\n }\n if (left1 > 0) {\n result.push.apply(result, arr1);\n } else {\n result.push.apply(result, arr2);\n }\n return result;\n }\n\n /**\n * Find the index to insert an element in array keeping the sort order.\n *\n * @param {function} comparatorFn The comparator function which sorted the array.\n * @param {array} arr The sorted array.\n * @param {object} el The element to insert.\n */\n function findInsertIndex(comparatorFn, arr, el) {\n var i, len;\n for (i = 0, len = arr.length; i < len; i++) {\n if (comparatorFn(arr[i], el) > 0) {\n break;\n }\n }\n return i;\n }\n\n\n\n\n\n var walkStrategies;\n\n walkStrategies = {};\n\n function k(result) {\n return function () {\n return result;\n };\n }\n\n function TreeModel(config) {\n config = config || {};\n this.config = config;\n this.config.childrenPropertyName = config.childrenPropertyName || 'children';\n this.config.modelComparatorFn = config.modelComparatorFn;\n }\n\n function addChildToNode(node, child) {\n child.parent = node;\n node.children.push(child);\n return child;\n }\n\n function Node(config, model) {\n this.config = config;\n this.model = model;\n this.children = [];\n }\n\n TreeModel.prototype.parse = function (model) {\n var i, childCount, node;\n\n if (!(model instanceof Object)) {\n throw new TypeError('Model must be of type object.');\n }\n\n node = new Node(this.config, model);\n if (model[this.config.childrenPropertyName] instanceof Array) {\n if (this.config.modelComparatorFn) {\n model[this.config.childrenPropertyName] = mergeSort(\n this.config.modelComparatorFn,\n model[this.config.childrenPropertyName]);\n }\n for (i = 0, childCount = model[this.config.childrenPropertyName].length; i < childCount; i++) {\n addChildToNode(node, this.parse(model[this.config.childrenPropertyName][i]));\n }\n }\n return node;\n };\n\n function hasComparatorFunction(node) {\n return angular.isFunction(node.config.modelComparatorFn);\n }\n\n Node.prototype.isRoot = function () {\n return angular.isUndefined(this.parent);\n };\n\n Node.prototype.hasChildren = function () {\n return this.children.length > 0;\n };\n\n function addChild(self, child, insertIndex) {\n var index;\n\n if (!(child instanceof Node)) {\n throw new TypeError('Child must be of type Node.');\n }\n\n child.parent = self;\n if (!(self.model[self.config.childrenPropertyName] instanceof Array)) {\n self.model[self.config.childrenPropertyName] = [];\n }\n\n if (hasComparatorFunction(self)) {\n // Find the index to insert the child\n index = findInsertIndex(\n self.config.modelComparatorFn,\n self.model[self.config.childrenPropertyName],\n child.model);\n\n // Add to the model children\n self.model[self.config.childrenPropertyName].splice(index, 0, child.model);\n\n // Add to the node children\n self.children.splice(index, 0, child);\n } else {\n if (angular.isUndefined(insertIndex)) {\n self.model[self.config.childrenPropertyName].push(child.model);\n self.children.push(child);\n } else {\n if (insertIndex < 0 || insertIndex > self.children.length) {\n throw new Error('Invalid index.');\n }\n self.model[self.config.childrenPropertyName].splice(insertIndex, 0, child.model);\n self.children.splice(insertIndex, 0, child);\n }\n }\n return child;\n }\n\n Node.prototype.addChild = function (child) {\n return addChild(this, child);\n };\n\n Node.prototype.addChildAtIndex = function (child, index) {\n if (hasComparatorFunction(this)) {\n throw new Error('Cannot add child at index when using a comparator function.');\n }\n\n return addChild(this, child, index);\n };\n\n Node.prototype.setIndex = function (index) {\n if (hasComparatorFunction(this)) {\n throw new Error('Cannot set node index when using a comparator function.');\n }\n\n if (this.isRoot()) {\n if (index === 0) {\n return this;\n }\n throw new Error('Invalid index.');\n }\n\n if (index < 0 || index >= this.parent.children.length) {\n throw new Error('Invalid index.');\n }\n\n var oldIndex = this.parent.children.indexOf(this);\n\n this.parent.children.splice(index, 0, this.parent.children.splice(oldIndex, 1)[0]);\n\n this.parent.model[this.parent.config.childrenPropertyName]\n .splice(index, 0, this.parent.model[this.parent.config.childrenPropertyName].splice(oldIndex, 1)[0]);\n\n return this;\n };\n\n Node.prototype.getPath = function () {\n var path = [];\n (function addToPath(node) {\n path.unshift(node);\n if (!node.isRoot()) {\n addToPath(node.parent);\n }\n })(this);\n return path;\n };\n\n Node.prototype.getIndex = function () {\n if (this.isRoot()) {\n return 0;\n }\n return this.parent.children.indexOf(this);\n };\n\n /**\n * Parse the arguments of traversal functions. These functions can take one optional\n * first argument which is an options object. If present, this object will be stored\n * in args.options. The only mandatory argument is the callback function which can\n * appear in the first or second position (if an options object is given). This\n * function will be saved to args.fn. The last optional argument is the context on\n * which the callback function will be called. It will be available in args.ctx.\n *\n * @returns Parsed arguments.\n */\n function parseArgs() {\n var args = {};\n if (arguments.length === 1) {\n if (angular.isFunction(arguments[0])) {\n args.fn = arguments[0];\n } else {\n args.options = arguments[0];\n }\n } else if (arguments.length === 2) {\n if (angular.isFunction(arguments[0])) {\n args.fn = arguments[0];\n args.ctx = arguments[1];\n } else {\n args.options = arguments[0];\n args.fn = arguments[1];\n }\n } else {\n args.options = arguments[0];\n args.fn = arguments[1];\n args.ctx = arguments[2];\n }\n args.options = args.options || {};\n if (!args.options.strategy) {\n args.options.strategy = 'pre';\n }\n if (!walkStrategies[args.options.strategy]) {\n throw new Error('Unknown tree walk strategy. Valid strategies are \\'pre\\' [default], \\'post\\' and \\'breadth\\'.');\n }\n return args;\n }\n\n Node.prototype.walk = function () {\n var args;\n args = parseArgs.apply(this, arguments);\n walkStrategies[args.options.strategy].call(this, args.fn, args.ctx);\n };\n\n walkStrategies.pre = function depthFirstPreOrder(callback, context) {\n var i, childCount, keepGoing;\n keepGoing = callback.call(context, this);\n for (i = 0, childCount = this.children.length; i < childCount; i++) {\n if (keepGoing === false) {\n return false;\n }\n keepGoing = depthFirstPreOrder.call(this.children[i], callback, context);\n }\n return keepGoing;\n };\n\n walkStrategies.post = function depthFirstPostOrder(callback, context) {\n var i, childCount, keepGoing;\n for (i = 0, childCount = this.children.length; i < childCount; i++) {\n keepGoing = depthFirstPostOrder.call(this.children[i], callback, context);\n if (keepGoing === false) {\n return false;\n }\n }\n keepGoing = callback.call(context, this);\n return keepGoing;\n };\n\n walkStrategies.breadth = function breadthFirst(callback, context) {\n var queue = [this];\n (function processQueue() {\n var i, childCount, node;\n if (queue.length === 0) {\n return;\n }\n node = queue.shift();\n for (i = 0, childCount = node.children.length; i < childCount; i++) {\n queue.push(node.children[i]);\n }\n if (callback.call(context, node) !== false) {\n processQueue();\n }\n })();\n };\n\n Node.prototype.all = function () {\n var args, all = [];\n args = parseArgs.apply(this, arguments);\n args.fn = args.fn || k(true);\n walkStrategies[args.options.strategy].call(this, function (node) {\n if (args.fn.call(args.ctx, node)) {\n all.push(node);\n }\n }, args.ctx);\n return all;\n };\n\n Node.prototype.first = function () {\n var args, first;\n args = parseArgs.apply(this, arguments);\n args.fn = args.fn || k(true);\n walkStrategies[args.options.strategy].call(this, function (node) {\n if (args.fn.call(args.ctx, node)) {\n first = node;\n return false;\n }\n }, args.ctx);\n return first;\n };\n\n Node.prototype.drop = function () {\n var indexOfChild;\n if (!this.isRoot()) {\n indexOfChild = this.parent.children.indexOf(this);\n this.parent.children.splice(indexOfChild, 1);\n this.parent.model[this.config.childrenPropertyName].splice(indexOfChild, 1);\n this.parent = undefined;\n delete this.parent;\n }\n return this;\n };\n\n return {\n\n mergeSort: mergeSort,\n findInsertIndex: findInsertIndex,\n TreeModel: TreeModel\n\n };\n }\n\n\n angular.module('eHRD.kernel.uiElements.tree')\n .factory('treeFactory',treeFactory);\n\n})();\n\n/**\n * Created by Bruce on 2016/6/17.\n */\n(function () {\n 'use strict';\n\n uiTree.$inject = ['treeConfig', '$window'];\n function uiTree(treeConfig, $window) {\n\n function link(scope, element, attrs, ctrl) {\n var callbacks = {\n\n },\n config = {},\n tdElm,\n $trElm,\n emptyElmColspan;\n\n angular.extend(config, treeConfig);\n if (config.treeClass) {\n element.addClass(config.treeClass);\n }\n\n if (element.prop('tagName').toLowerCase() === 'table') {\n scope.$emptyElm = angular.element($window.document.createElement('tr'));\n $trElm = element.find('tr');\n // If we can find a tr, then we can use its td children as the empty element colspan.\n if ($trElm.length > 0) {\n emptyElmColspan = angular.element($trElm).children().length;\n } else {\n // If not, by setting a huge colspan we make sure it takes full width.\n emptyElmColspan = 1000000;\n }\n tdElm = angular.element($window.document.createElement('td'))\n .attr('colspan', emptyElmColspan);\n scope.$emptyElm.append(tdElm);\n } else {\n scope.$emptyElm = angular.element($window.document.createElement('div'));\n }\n\n if (config.emptyTreeClass) {\n scope.$emptyElm.addClass(config.emptyTreeClass);\n }\n\n scope.$watch('$nodesScope.$modelValue.length', function (val) {\n if (!angular.isNumber(val)) {\n return;\n }\n\n ctrl.resetEmptyElement();\n }, true);\n\n scope.$watch(attrs.maxDepth, function (val) {\n if ((typeof val) == 'number') {\n scope.maxDepth = val;\n }\n });\n\n /**\n * Callback is fired when a user toggles node (but after processing the toggle action)\n * @param sourceNodeScope\n * @param collapsed\n */\n callbacks.toggle = function (/*collapsed, sourceNodeScope*/) {\n\n };\n\n scope.$watch(attrs.uiTree, function (newVal/*, oldVal*/) {\n angular.forEach(newVal, function (value, key) {\n if (callbacks[key]) {\n if (angular.isFunction(typeof value)) {\n callbacks[key] = value;\n }\n }\n });\n scope.$callbacks = callbacks;\n }, true);\n }\n var directive = {\n restrict: 'A',\n scope: true,\n controller: 'uiTreeController',\n controllerAs:'treeRoot',\n link:link\n };\n\n return directive;\n }\n\n\n angular.module('eHRD.kernel.uiElements.tree')\n .directive('uiTree',uiTree)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/6/17.\n */\n(function () {\n 'use strict';\n\n uiTreeNodes.$inject = ['treeConfig'/*, '$window'*/];\n function uiTreeNodes(treeConfig/*, $window*/) {\n\n function link(scope, element, attrs, controllersArr) {\n var config = {},\n ngModel = controllersArr[0],\n treeNodeCtrl = controllersArr[1],\n treeCtrl = controllersArr[2];\n\n angular.extend(config, treeConfig);\n if (config.nodesClass) {\n element.addClass(config.nodesClass);\n }\n\n if (treeNodeCtrl) {\n treeNodeCtrl.scope.$childNodesScope = scope;\n scope.$nodeScope = treeNodeCtrl.scope;\n } else {\n // find the root nodes if there is no parent node and have a parent ui-tree\n treeCtrl.scope.$nodesScope = scope;\n }\n scope.$treeScope = treeCtrl.scope;\n\n if (ngModel) {\n ngModel.$render = function () {\n scope.$modelValue = ngModel.$modelValue;\n };\n }\n\n scope.$watch(function () {\n return attrs.maxDepth;\n }, function (val) {\n if ((typeof val) == 'number') {\n scope.maxDepth = val;\n }\n });\n\n }\n\n var directive = {\n require: ['ngModel', '?^uiTreeNode', '^uiTree'],\n restrict: 'A',\n scope: true,\n controller: 'uiTreeNodesController',\n controllerAs: 'treeNodes',\n link:link\n };\n\n return directive;\n }\n\n\n angular.module('eHRD.kernel.uiElements.tree')\n .directive('uiTreeNodes',uiTreeNodes)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/6/17.\n */\n(function () {\n 'use strict';\n\n uiTreeNode.$inject = ['treeConfig', 'uiTreeHelper', '$window'/*, '$document', '$timeout', '$q'*/];\n function uiTreeNode(treeConfig, uiTreeHelper, $window/*, $document, $timeout, $q*/) {\n\n function link(scope, element, attrs, controllersArr) {\n // todo startPos is unused\n var config = {},\n keydownHandler;\n\n angular.extend(config, treeConfig);\n if (config.nodeClass) {\n element.addClass(config.nodeClass);\n }\n scope.treeNode.init(controllersArr);\n\n scope.collapsed = !!uiTreeHelper.getNodeAttribute(scope, 'collapsed') || treeConfig.defaultCollapsed;\n // scope.sourceOnly = scope.nodropEnabled || scope.$treeScope.nodropEnabled;\n\n scope.$watch(attrs.collapsed, function (val) {\n if ((typeof val) == 'boolean') {\n scope.collapsed = val;\n }\n });\n\n scope.$watch('collapsed', function (val) {\n uiTreeHelper.setNodeAttribute(scope, 'collapsed', val);\n attrs.$set('collapsed', val);\n });\n\n scope.$on('angular-ui-tree:collapse-all', function () {\n scope.collapsed = true;\n });\n\n scope.$on('angular-ui-tree:expand-all', function () {\n scope.collapsed = false;\n });\n\n keydownHandler = function (e) {\n if (e.keyCode == 27) {\n // scope.$$allowNodeDrop = false;\n // dragEnd(e);\n }\n };\n\n angular.element($window.document).bind('keydown', keydownHandler);\n\n //unbind handler that retains scope\n scope.$on('$destroy', function () {\n angular.element($window.document).unbind('keydown', keydownHandler);\n });\n }\n var directive = {\n require: ['^uiTreeNodes', '^uiTree'],\n restrict: 'A',\n controller: 'uiTreeNodeController',\n controllerAs: 'treeNode',\n link:link\n };\n\n return directive;\n }\n\n\n angular.module('eHRD.kernel.uiElements.tree')\n .directive('uiTreeNode',uiTreeNode)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/6/17.\n */\n(function () {\n 'use strict';\n\n\n uiTreeHandle.$inject = ['treeConfig'];\n function uiTreeHandle(treeConfig) {\n function link(scope, element, attrs, treeNodeCtrl) {\n var config = {};\n angular.extend(config, treeConfig);\n if (config.handleClass) {\n element.addClass(config.handleClass);\n }\n // connect with the tree node.\n if (scope != treeNodeCtrl.scope) {\n scope.$nodeScope = treeNodeCtrl.scope;\n treeNodeCtrl.scope.$handleScope = scope;\n }\n }\n var directive = {\n require: '^uiTreeNode',\n restrict: 'A',\n scope: true,\n controller: 'TreeHandleController',\n link:link\n };\n return directive;\n }\n\n angular.module('eHRD.kernel.uiElements.tree')\n .directive('uiTreeHandle', uiTreeHandle);\n\n})();\n\n/**\n * Created by Bruce on 2016/6/17.\n */\n(function () {\n 'use strict';\n\n uiTreeController.$inject = ['$scope','$element'];\n\n function uiTreeController($scope, $element) {\n var vm = this;\n vm.scope = $scope;\n vm.scope.$element = $element;\n vm.scope.$nodesScope = null; // root nodes\n vm.scope.$type = 'uiTree';\n vm.scope.$emptyElm = null;\n vm.scope.$callbacks = null;\n\n vm.scope.maxDepth = 0;\n\n // Check if it's a empty tree\n vm.isEmpty = function () {\n return (vm.scope.$nodesScope && vm.scope.$nodesScope.$modelValue\n && vm.scope.$nodesScope.$modelValue.length === 0);\n }; \n\n\n vm.resetEmptyElement = function () {\n if ((!vm.scope.$nodesScope.$modelValue || vm.scope.$nodesScope.$modelValue.length === 0) /*&&\n $scope.emptyPlaceholderEnabled*/) {\n $element.append(vm.scope.$emptyElm);\n } else {\n vm.scope.$emptyElm.remove();\n }\n };\n\n }\n\n angular.module('eHRD.kernel.uiElements.tree')\n .controller('uiTreeController', uiTreeController)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/6/17.\n */\n(function () {\n 'use strict';\n\n uiTreeNodesController.$inject =['$scope', '$element'];\n function uiTreeNodesController($scope, $element) {\n var vm = this;\n vm.scope = $scope;\n\n vm.scope.$element = $element;\n vm.scope.$modelValue = null;\n vm.scope.$nodeScope = null; // the scope of node which the nodes belongs to\n vm.scope.$treeScope = null;\n vm.scope.$type = 'uiTreeNodes';\n vm.scope.$nodesMap = {};\n\n vm.scope.maxDepth = 0;\n\n vm.initSubNode = function (subNode) {\n if (!subNode.$modelValue) {\n return null;\n }\n vm.scope.$nodesMap[subNode.$modelValue.hashKey] = subNode;\n };\n\n vm.destroySubNode = function (subNode) {\n if (!subNode.$modelValue) {\n return null;\n }\n vm.scope.$nodesMap[subNode.$modelValue.hashKey] = null;\n };\n\n vm.accept = function (sourceNode, destIndex) {\n return vm.scope.$treeScope.$callbacks.accept(sourceNode, $scope, destIndex);\n };\n\n vm.isParent = function (node) {\n return node.$parentNodesScope == $scope;\n };\n\n vm.hasChild = function () {\n return vm.scope.$modelValue.length > 0;\n };\n\n\n\n vm.childNodes = function () {\n var i, nodes = [];\n if (vm.scope.$modelValue) {\n for (i = 0; i < vm.scope.$modelValue.length; i++) {\n nodes.push(vm.scope.$nodesMap[vm.scope.$modelValue[i].hashKey]);\n }\n }\n return nodes;\n };\n\n vm.depth = function () {\n if (vm.scope.$nodeScope) {\n return vm.scope.$nodeScope.depth();\n }\n return 0; // if it has no $nodeScope, it's root\n };\n\n // check if depth limit has reached\n vm.outOfDepth = function (sourceNode) {\n var maxDepth = vm.scope.maxDepth || vm.scope.$treeScope.maxDepth;\n if (maxDepth > 0) {\n return vm.depth() + sourceNode.maxSubDepth() + 1 > maxDepth;\n }\n return false;\n };\n\n }\n\n angular.module('eHRD.kernel.uiElements.tree')\n .controller('uiTreeNodesController', uiTreeNodesController)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/6/17.\n */\n(function () {\n 'use strict';\n\n uiTreeNodeController.$inject = ['$scope', '$element', '$stateParams'];\n function uiTreeNodeController($scope, $element, $stateParams){\n var vm = this;\n vm.scope = $scope;\n\n vm.scope.$element = $element;\n vm.scope.$modelValue = null; // Model value for node;\n vm.scope.$parentNodeScope = null; // uiTreeNode Scope of parent node;\n vm.scope.$childNodesScope = null; // uiTreeNodes Scope of child nodes.\n vm.scope.$parentNodesScope = null; // uiTreeNodes Scope of parent nodes.\n vm.scope.$treeScope = null; // uiTree scope\n vm.scope.$handleScope = null; // it's handle scope\n vm.scope.$type = 'uiTreeNode';\n vm.scope.collapsed = false;\n\n vm.init = function (controllersArr) {\n var treeNodesCtrl = controllersArr[0];\n vm.scope.$treeScope = controllersArr[1] ? controllersArr[1].scope : null;\n // find the scope of it's parent node\n vm.scope.$parentNodeScope = treeNodesCtrl.scope.$nodeScope;\n // modelValue for current node\n vm.scope.$modelValue = treeNodesCtrl.scope.$modelValue[$scope.$index];\n vm.scope.$parentNodesScope = treeNodesCtrl.scope;\n treeNodesCtrl.initSubNode($scope); // init sub nodes\n\n if($stateParams.id === vm.scope.$modelValue.id && $stateParams.id!== ''){\n vm.scope.$element.addClass('active');\n var parentNode = vm.scope.$parentNodeScope;\n while(parentNode!==null){\n parentNode.$element.addClass('active');\n parentNode = parentNode.$parentNodeScope;\n }\n }\n\n $element.on('$destroy', function () {\n treeNodesCtrl.destroySubNode($scope); // destroy sub nodes\n });\n };\n\n vm.index = function () {\n return vm.scope.$parentNodesScope.$modelValue.indexOf(vm.scope.$modelValue);\n };\n\n\n\n vm.isSibling = function (targetNode) {\n return vm.scope.$parentNodesScope == targetNode.$parentNodesScope;\n };\n\n vm.isChild = function (targetNode) {\n var nodes = $scope.childNodes();\n return nodes && nodes.indexOf(targetNode) > -1;\n };\n\n vm.prev = function () {\n var index = vm.index();\n if (index > 0) {\n return vm.siblings()[index - 1];\n }\n return null;\n };\n\n vm.siblings = function () {\n return vm.scope.$parentNodesScope.childNodes();\n };\n\n vm.childNodesCount = function () {\n return vm.childNodes() ? vm.childNodes().length : 0;\n };\n\n vm.hasChild = function () {\n return vm.childNodesCount() > 0;\n };\n\n vm.childNodes = function () {\n return vm.scope.$childNodesScope && vm.scope.$childNodesScope.$modelValue ?\n vm.scope.$childNodesScope.childNodes() :\n null;\n };\n\n\n\n\n\n vm.toggle = function () {\n vm.scope.collapsed = !vm.scope.collapsed;\n vm.scope.$treeScope.$callbacks.toggle(vm.scope.collapsed, vm.scope);\n };\n\n vm.collapse = function () {\n vm.scope.collapsed = true;\n };\n\n vm.expand = function () {\n vm.scope.collapsed = false;\n };\n\n vm.depth = function () {\n var parentNode = vm.scope.$parentNodeScope;\n if (parentNode) {\n return parentNode.depth() + 1;\n }\n return 1;\n };\n\n /**\n * Returns the depth of the deepest subtree under this node\n * @param scope a TreeNodesController scope object\n * @returns Depth of all nodes *beneath* this node. If scope belongs to a leaf node, the\n * result is 0 (it has no subtree).\n */\n function countSubTreeDepth(scope) {\n var thisLevelDepth = 0,\n childNodes = scope.childNodes(),\n childNode,\n childDepth,\n i;\n if (!childNodes || childNodes.length === 0) {\n return 0;\n }\n for (i = childNodes.length - 1; i >= 0 ; i--) {\n childNode = childNodes[i],\n childDepth = 1 + countSubTreeDepth(childNode);\n thisLevelDepth = Math.max(thisLevelDepth, childDepth);\n }\n return thisLevelDepth;\n }\n\n vm.maxSubDepth = function () {\n return vm.scope.$childNodesScope ? countSubTreeDepth(vm.scope.$childNodesScope) : 0;\n };\n\n }\n\n angular.module('eHRD.kernel.uiElements.tree')\n .controller('uiTreeNodeController', uiTreeNodeController)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/6/17.\n */\n(function () {\n 'use strict';\n\n uiTreeHandleController.$inject = ['$scope', '$element'];\n\n function uiTreeHandleController($scope, $element){\n var vm = this;\n\n vm.scope = $scope;\n\n vm.scope.$element = $element;\n vm.scope.$nodeScope = null;\n vm.scope.$type = 'uiTreeHandle';\n\n }\n\n angular.module('eHRD.kernel.uiElements.tree')\n .controller('uiTreeHandleController', uiTreeHandleController)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/9/4.\n */\n\n(function () {\n 'use strict';\n\n angular.module('eHRD.kernel.uiElements.timer',[]);\n})();\n\n/**\n * Created by Bruce on 2016/9/5.\n */\n(function () {\n 'use strict';\n\n function progressBarService() {\n var ProgressBarService = function() {};\n\n /**\n * calculate the remaining time in a progress bar in percentage\n * @param {momentjs} startValue in seconds\n * @param {integer} currentCountdown, where are we in the countdown\n * @param {integer} remainingTime, remaining milliseconds\n * @param {integer} endTime, end time, can be undefined\n * @param {integer} coutdown, original coutdown value, can be undefined\n *\n * joke : https://www.youtube.com/watch?v=gENVB6tjq_M\n * @return {float} 0 --> 100\n */\n ProgressBarService.prototype.calculateProgressBar = function calculateProgressBar(startValue, remainingTime, endTimeAttr, coutdown) {\n var displayProgressBar = 0,\n endTimeValue,\n initialCountdown;\n\n remainingTime = remainingTime / 1000; //seconds\n\n\n if(endTimeAttr !== null){\n endTimeValue = moment(endTimeAttr);\n initialCountdown = endTimeValue.diff(startValue, 'seconds');\n displayProgressBar = remainingTime * 100 / initialCountdown;\n }\n else {\n displayProgressBar = remainingTime * 100 / coutdown;\n }\n\n displayProgressBar = 100 - displayProgressBar; //To have 0 to 100 and not 100 to 0\n displayProgressBar = Math.round(displayProgressBar * 10) / 10; //learn more why : http://stackoverflow.com/questions/588004/is-floating-point-math-broken\n\n if(displayProgressBar > 100){ //security\n displayProgressBar = 100;\n }\n\n return displayProgressBar;\n };\n\n return new ProgressBarService();\n }\n angular.module('eHRD.kernel.uiElements.timer')\n .factory('progressBarService', progressBarService);\n})();\n\n/**\n * Created by Bruce on 2016/9/5.\n */\n(function () {\n 'use strict';\n\n function I18nService() {\n var I18nService = function() {};\n\n I18nService.prototype.language = 'en';\n I18nService.prototype.fallback = 'en';\n I18nService.prototype.timeHumanizer = {};\n\n I18nService.prototype.init = function init(lang, fallback) {\n var supported_languages = humanizeDuration.getSupportedLanguages();\n\n this.fallback = (angular.isDefined(fallback)) ? fallback : 'en';\n if (supported_languages.indexOf(fallback) === -1) {\n this.fallback = 'en';\n }\n\n this.language = lang;\n if (supported_languages.indexOf(lang) === -1) {\n this.language = this.fallback;\n }\n\n //moment init\n moment.locale(this.language); //@TODO maybe to remove, it should be handle by the user's application itself, and not inside the directive\n\n //human duration init, using it because momentjs does not allow accurate time (\n // momentJS: a few moment ago, human duration : 4 seconds ago\n this.timeHumanizer = humanizeDuration.humanizer({\n language: this.language,\n halfUnit:false\n });\n };\n\n /**\n * get time with units from momentJS i18n\n * @param {int} millis\n * @returns {{millis: string, seconds: string, minutes: string, hours: string, days: string, months: string, years: string}}\n */\n I18nService.prototype.getTimeUnits = function getTimeUnits(millis) {\n var diffFromAlarm = Math.round(millis/1000) * 1000; //time in milliseconds, get rid of the last 3 ms value to avoid 2.12 seconds display\n\n var time = {};\n\n if (angular.isDefined(this.timeHumanizer)){\n time = {\n 'millis' : this.timeHumanizer(diffFromAlarm, { units: [\"milliseconds\"] }),\n 'seconds' : this.timeHumanizer(diffFromAlarm, { units: [\"seconds\"] }),\n 'minutes' : this.timeHumanizer(diffFromAlarm, { units: [\"minutes\", \"seconds\"] }) ,\n 'hours' : this.timeHumanizer(diffFromAlarm, { units: [\"hours\", \"minutes\", \"seconds\"] }) ,\n 'days' : this.timeHumanizer(diffFromAlarm, { units: [\"days\", \"hours\", \"minutes\", \"seconds\"] }) ,\n 'months' : this.timeHumanizer(diffFromAlarm, { units: [\"months\", \"days\", \"hours\", \"minutes\", \"seconds\"] }) ,\n 'years' : this.timeHumanizer(diffFromAlarm, { units: [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"] })\n };\n }\n else {\n // console.error('i18nService has not been initialized. You must call i18nService.init(\"en\") for example');\n }\n\n return time;\n };\n\n return I18nService;\n }\n angular.module('eHRD.kernel.uiElements.timer')\n .factory('I18nService', I18nService);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n * Hack By Ng-Table\n */\n\n(function () {\n 'use strict';\n\n angular.module('eHRD.kernel.uiElements.uiTable',[]);\n\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n/**\n * ngTable: Table + Angular JS\n *\n * @author Vitalii Savchuk \n * @url https://github.com/esvit/ng-table/\n * @license New BSD License \n */\n(function () {\n 'use strict';\n\n ngTableParams.$inject = ['$q', '$log', '$filter', 'ngTableDefaults', 'ngTableDefaultGetData', 'ngTableEventsChannel'];\n function ngTableParams($q, $log, $filter, ngTableDefaults, ngTableDefaultGetData, ngTableEventsChannel) {\n var isNumber = function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n };\n var NgTableParams = function(baseParameters, baseSettings) {\n\n // the ngTableController \"needs\" to create a dummy/null instance and it's important to know whether an instance\n // is one of these\n if (typeof baseParameters === \"boolean\"){\n this.isNullInstance = true;\n }\n\n var self = this,\n prevParamsMemento,\n errParamsMemento,\n isCommittedDataset = false,\n initialEvents = [],\n log = function() {\n if (settings.debugMode && $log.debug) {\n $log.debug.apply($log, arguments);\n }\n },\n defaultFilterOptions = {\n filterComparator: undefined, // look for a substring match in case insensitive way\n filterDelay: 500,\n filterDelayThreshold: 10000, // size of dataset array that will trigger the filterDelay being applied\n filterFilterName: undefined, // when defined overrides ngTableDefaultGetDataProvider.filterFilterName\n filterFn: undefined, // when defined overrides the filter function that ngTableDefaultGetData uses\n filterLayout: 'stack' // alternative: 'horizontal'\n },\n defaultGroupOptions = {\n defaultSort: 'asc', // set to 'asc' or 'desc' to apply sorting to groups\n isExpanded: true\n },\n defaultSettingsFns = getDefaultSettingFns();\n\n this.data = [];\n\n /**\n * @ngdoc method\n * @name NgTableParams#parameters\n * @description Set new parameters or get current parameters\n *\n * @param {string} newParameters New parameters\n * @param {string} parseParamsFromUrl Flag if parse parameters like in url\n * @returns {Object} Current parameters or `this`\n */\n this.parameters = function(newParameters, parseParamsFromUrl) {\n parseParamsFromUrl = parseParamsFromUrl || false;\n if (angular.isDefined(newParameters)) {\n for (var key in newParameters) {\n var value = newParameters[key];\n if (parseParamsFromUrl && key.indexOf('[') >= 0) {\n var keys = key.split(/\\[(.*)\\]/).reverse()\n var lastKey = '';\n for (var i = 0, len = keys.length; i < len; i++) {\n var name = keys[i];\n if (name !== '') {\n var v = value;\n value = {};\n value[lastKey = name] = (isNumber(v) ? parseFloat(v) : v);\n }\n }\n if (lastKey === 'sorting') {\n params[lastKey] = {};\n }\n params[lastKey] = angular.extend(params[lastKey] || {}, value[lastKey]);\n } else {\n if (key === 'group'){\n params[key] = parseGroup(newParameters[key]);\n } else {\n params[key] = (isNumber(newParameters[key]) ? parseFloat(newParameters[key]) : newParameters[key]);\n }\n }\n }\n log('ngTable: set parameters', params);\n return this;\n }\n return params;\n };\n\n function parseGroup(group){\n var defaultSort = settings.groupOptions && settings.groupOptions.defaultSort;\n if (angular.isFunction(group)) {\n if (group.sortDirection == null){\n group.sortDirection = defaultSort;\n }\n return group;\n } else if (angular.isString(group)) {\n var grp = {};\n grp[group] = defaultSort;\n return grp;\n } else if (angular.isObject(group)) {\n for (var key in group) {\n if (group[key] == null){\n group[key] = defaultSort;\n }\n }\n return group;\n } else {\n return group;\n }\n }\n\n /**\n * @ngdoc method\n * @name NgTableParams#settings\n * @description Set new settings for table\n *\n * @param {string} newSettings New settings or undefined\n * @returns {Object} Current settings or `this`\n */\n this.settings = function(newSettings) {\n if (angular.isDefined(newSettings)) {\n\n // todo: don't modify newSettings object: this introduces unexpected side effects;\n // instead take a copy of newSettings\n\n if (newSettings.filterOptions){\n newSettings.filterOptions = angular.extend({}, settings.filterOptions, newSettings.filterOptions);\n }\n if (newSettings.groupOptions){\n newSettings.groupOptions = angular.extend({}, settings.groupOptions, newSettings.groupOptions);\n }\n\n if (angular.isArray(newSettings.dataset)) {\n //auto-set the total from passed in dataset\n newSettings.total = newSettings.dataset.length;\n }\n\n var originalDataset = settings.dataset;\n settings = angular.extend(settings, newSettings);\n\n if (angular.isArray(newSettings.dataset)) {\n optimizeFilterDelay();\n }\n\n // note: using != as want null and undefined to be treated the same\n var hasDatasetChanged = newSettings.hasOwnProperty('dataset') && (newSettings.dataset != originalDataset);\n if (hasDatasetChanged) {\n if (isCommittedDataset){\n this.page(1); // reset page as a new dataset has been supplied\n }\n isCommittedDataset = false;\n\n var fireEvent = function () {\n ngTableEventsChannel.publishDatasetChanged(self, newSettings.dataset, originalDataset);\n };\n\n if (initialEvents){\n initialEvents.push(fireEvent);\n } else {\n fireEvent();\n }\n }\n log('ngTable: set settings', settings);\n return this;\n }\n return settings;\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#page\n * @description If parameter page not set return current page else set current page\n *\n * @param {string} page Page number\n * @returns {Object|Number} Current page or `this`\n */\n this.page = function(page) {\n return angular.isDefined(page) ? this.parameters({\n 'page': page\n }) : params.page;\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#total\n * @description If parameter total not set return current quantity else set quantity\n *\n * @param {string} total Total quantity of items\n * @returns {Object|Number} Current page or `this`\n */\n this.total = function(total) {\n return angular.isDefined(total) ? this.settings({\n 'total': total\n }) : settings.total;\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#count\n * @description If parameter count not set return current count per page else set count per page\n *\n * @param {string} count Count per number\n * @returns {Object|Number} Count per page or `this`\n */\n this.count = function(count) {\n // reset to first page because can be blank page\n return angular.isDefined(count) ? this.parameters({\n 'count': count,\n 'page': 1\n }) : params.count;\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#filter\n * @description If 'filter' parameter not set return current filter else set current filter\n *\n * Note: when assigning a new filter, {@link NgTableParams#page page} will be set to 1\n *\n * @param {Object|Boolean} filter 'object': new filter to assign or\n * 'true': to return the current filter minus any insignificant values (null, undefined and empty string); or\n * 'falsey': to return the current filter \"as is\"\n * @returns {Object} Current filter or `this`\n */\n this.filter = function(filter) {\n if (angular.isDefined(filter) && angular.isObject(filter)) {\n return this.parameters({\n 'filter': filter,\n 'page': 1\n });\n } else if (filter === true){\n var keys = Object.keys(params.filter);\n var significantFilter = {};\n for (var i=0; i < keys.length; i++){\n var filterValue = params.filter[keys[i]];\n if (filterValue != null && filterValue !== '') {\n significantFilter[keys[i]] = filterValue;\n }\n }\n return significantFilter;\n } else {\n return params.filter;\n }\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#group\n * @description If 'group' parameter is not set, return current grouping. Otherwise set current group.\n *\n * @param {string|Function|Object} group New group field\n * @param {string} sortDirection Optional direction that the list of groups should be sorted\n * @returns {Object} Current grouping or `this`\n */\n this.group = function(group, sortDirection) {\n if (angular.isUndefined(group)){\n return params.group;\n }\n\n var newParameters = {\n page: 1\n };\n if (angular.isFunction(group) && angular.isDefined(sortDirection)){\n group.sortDirection = sortDirection;\n newParameters.group = group;\n } else if (angular.isDefined(group) && angular.isDefined(sortDirection)) {\n var groupArray = {};\n groupArray[group] = sortDirection;\n newParameters.group = groupArray;\n } else {\n newParameters.group = group;\n }\n this.parameters(newParameters);\n return this;\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#sorting\n * @description If 'sorting' parameter is not set, return current sorting. Otherwise set current sorting.\n *\n * @param {string} sorting New sorting\n * @returns {Object} Current sorting or `this`\n */\n this.sorting = function(sorting) {\n if (arguments.length == 2) {\n var sortArray = {};\n sortArray[sorting] = arguments[1];\n this.parameters({\n 'sorting': sortArray\n });\n return this;\n }\n return angular.isDefined(sorting) ? this.parameters({\n 'sorting': sorting\n }) : params.sorting;\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#isSortBy\n * @description Checks sort field\n *\n * @param {string} field Field name\n * @param {string} direction Optional direction of sorting ('asc' or 'desc')\n * @returns {Array} Return true if field sorted by direction\n */\n this.isSortBy = function(field, direction) {\n if(angular.isDefined(direction)) {\n return angular.isDefined(params.sorting[field]) && params.sorting[field] == direction;\n } else {\n return angular.isDefined(params.sorting[field]);\n }\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#orderBy\n * @description Return object of sorting parameters for angular filter\n *\n * @returns {Array} Array like: [ '-name', '+age' ]\n */\n this.orderBy = function() {\n return convertSortToOrderBy(params.sorting);\n };\n\n function convertSortToOrderBy(sorting){\n var result = [];\n for (var column in sorting) {\n result.push((sorting[column] === \"asc\" ? \"+\" : \"-\") + column);\n }\n return result;\n }\n\n /**\n * @ngdoc method\n * @name NgTableParams#generatePagesArray\n * @description Generate array of pages\n *\n * When no arguments supplied, the current parameter state of this `NgTableParams` instance will be used\n *\n * @param {boolean} currentPage which page must be active\n * @param {boolean} totalItems Total quantity of items\n * @param {boolean} pageSize Quantity of items on page\n * @param {number} maxBlocks Quantity of blocks for pagination\n * @returns {Array} Array of pages\n */\n this.generatePagesArray = function(currentPage, totalItems, pageSize/*, maxBlocks*/) {\n if (!arguments.length){\n currentPage = this.page();\n totalItems = this.total();\n pageSize = this.count();\n }\n\n var maxPage, maxPivotPages, minPage, numPages, pages;\n // maxBlocks = maxBlocks && maxBlocks < 6 ? 6 : maxBlocks;\n\n pages = [];\n numPages = Math.ceil(totalItems / pageSize);\n if (numPages > 1) {\n pages.push({\n type: 'prev',\n number: Math.max(1, currentPage - 1),\n active: currentPage > 1\n });\n pages.push({\n type: 'first',\n number: 1,\n active: currentPage > 1,\n current: currentPage === 1\n });\n maxPivotPages = Math.round((settings.paginationMaxBlocks - settings.paginationMinBlocks) / 2);\n minPage = Math.max(2, currentPage - maxPivotPages);\n maxPage = Math.min(numPages - 1, currentPage + maxPivotPages * 2 - (currentPage - minPage));\n minPage = Math.max(2, minPage - (maxPivotPages * 2 - (maxPage - minPage)));\n var i = minPage;\n while (i <= maxPage) {\n if ((i === minPage && i !== 2) || (i === maxPage && i !== numPages - 1)) {\n pages.push({\n type: 'more',\n active: false\n });\n } else {\n pages.push({\n type: 'page',\n number: i,\n active: currentPage !== i,\n current: currentPage === i\n });\n }\n i++;\n }\n pages.push({\n type: 'last',\n number: numPages,\n active: currentPage !== numPages,\n current: currentPage === numPages\n });\n pages.push({\n type: 'next',\n number: Math.min(numPages, currentPage + 1),\n active: currentPage < numPages\n });\n }\n return pages;\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#isDataReloadRequired\n * @description Return true when a change to this `NgTableParams` instance should require the reload method\n * to be run so as to ensure the data presented to the user reflects the `NgTableParams`\n *\n * Note that this method will return false when the reload method has run but fails. In this case\n * `hasErrorState` will return true.\n */\n this.isDataReloadRequired = function(){\n // note: using != as want to treat null and undefined the same\n return !isCommittedDataset || !angular.equals(createComparableParams(), prevParamsMemento)\n || hasGlobalSearchFieldChanges();\n };\n\n function createComparableParams(){\n var result = {params: params};\n if (angular.isFunction(params.group)){\n result.groupSortDirection = params.group.sortDirection;\n }\n return result\n }\n /**\n * @ngdoc method\n * @name NgTableParams#hasFilter\n * @description Determines if NgTableParams#filter has significant filter value(s)\n * (any value except null, undefined, or empty string)\n * @returns {Boolean} true when NgTableParams#filter has at least one significant field value\n */\n this.hasFilter = function(){\n return Object.keys(this.filter(true)).length > 0;\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#hasGroup\n * @description Determines if at least one group has been set\n * @returns {Boolean}\n */\n this.hasGroup = function(group, sortDirection){\n if (group == null) {\n return angular.isFunction(params.group) || Object.keys(params.group).length > 0\n }\n\n if (angular.isFunction(group)) {\n if (sortDirection == null) {\n return params.group === group;\n } else {\n return params.group === group && group.sortDirection === sortDirection;\n }\n } else {\n if (sortDirection == null) {\n return Object.keys(params.group).indexOf(group) !== -1;\n } else {\n return params.group[group] === sortDirection;\n }\n }\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#hasFilterChanges\n * @description Return true when a change to `NgTableParams.filters`require the reload method\n * to be run so as to ensure the data presented to the user reflects these filters\n */\n this.hasFilterChanges = function(){\n var previousFilter = (prevParamsMemento && prevParamsMemento.params.filter);\n return !angular.equals((params.filter), previousFilter) || hasGlobalSearchFieldChanges();\n };\n\n function hasGlobalSearchFieldChanges(){\n var currentVal = (params.filter && params.filter.$);\n var previousVal =\n (prevParamsMemento && prevParamsMemento.params.filter && prevParamsMemento.params.filter.$);\n return !angular.equals(currentVal, previousVal);\n }\n\n /**\n * @ngdoc method\n * @name NgTableParams#url\n * @description Return groups for table grouping\n *\n * @param {boolean} asString flag indicates return array of string or object\n * @returns {Array} If asString = true will be return array of url string parameters else key-value object\n */\n this.url = function(asString) {\n asString = asString || false;\n var pairs = (asString ? [] : {});\n for (var key in params) {\n if (params.hasOwnProperty(key)) {\n var item = params[key],\n name = encodeURIComponent(key);\n if (angular.isObject(item)) {\n for (var subkey in item) {\n if (isSignificantValue(item[subkey], key)) {\n var pname = name + \"[\" + encodeURIComponent(subkey) + \"]\";\n collectValue(item[subkey], pname);\n }\n }\n } else if (!angular.isFunction(item) && isSignificantValue(item, key)) {\n collectValue(item, name);\n }\n }\n }\n return pairs;\n\n function collectValue(value, key){\n if (asString) {\n pairs.push(key + \"=\" + encodeURIComponent(value));\n } else {\n pairs[key] = encodeURIComponent(value);\n }\n }\n\n function isSignificantValue(value, key){\n return key === \"group\" ? true : angular.isDefined(value) && value !== \"\";\n }\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#reload\n * @description Reload table data\n */\n this.reload = function() {\n var self = this,\n pData = null;\n\n settings.$loading = true;\n\n prevParamsMemento = angular.copy(createComparableParams());\n isCommittedDataset = true;\n\n if (self.hasGroup()) {\n pData = runInterceptorPipeline($q.when(settings.getGroups(self)));\n } else {\n pData = runInterceptorPipeline($q.when(settings.getData(self)));\n }\n\n log('ngTable: reload data');\n\n var oldData = self.data;\n return pData.then(function(data) {\n settings.$loading = false;\n errParamsMemento = null;\n\n self.data = data;\n // note: I think it makes sense to publish this event even when data === oldData\n // subscribers can always set a filter to only receive the event when data !== oldData\n ngTableEventsChannel.publishAfterReloadData(self, data, oldData);\n self.reloadPages();\n\n return data;\n }).catch(function(reason){\n errParamsMemento = prevParamsMemento;\n // \"rethrow\"\n return $q.reject(reason);\n });\n };\n\n /**\n * @ngdoc method\n * @name NgTableParams#hasErrorState\n * @description Return true when an attempt to `reload` the current `parameter` values have resulted in\n * a failure\n *\n * This method will continue to return true until the reload is successfully called or when the\n * `parameter` values have changed\n */\n this.hasErrorState = function(){\n return !!(errParamsMemento && angular.equals(errParamsMemento, createComparableParams()));\n };\n\n function optimizeFilterDelay(){\n // don't debounce by default filter input when working with small synchronous datasets\n if (settings.filterOptions.filterDelay === defaultFilterOptions.filterDelay &&\n settings.total <= settings.filterOptions.filterDelayThreshold &&\n settings.getData === defaultSettingsFns.getData){\n settings.filterOptions.filterDelay = 0;\n }\n }\n\n this.reloadPages = (function() {\n var currentPages;\n return function(){\n var oldPages = currentPages;\n var newPages = self.generatePagesArray(self.page(), self.total(), self.count());\n if (!angular.equals(oldPages, newPages)){\n currentPages = newPages;\n ngTableEventsChannel.publishPagesChanged(this, newPages, oldPages);\n }\n }\n })();\n\n function runInterceptorPipeline(fetchedData){\n var interceptors = settings.interceptors || [];\n\n return interceptors.reduce(function(result, interceptor){\n var thenFn = (interceptor.response && interceptor.response.bind(interceptor)) || $q.when;\n var rejectFn = (interceptor.responseError && interceptor.responseError.bind(interceptor)) || $q.reject;\n return result.then(function(data){\n return thenFn(data, self);\n }, function(reason){\n return rejectFn(reason, self);\n });\n }, fetchedData);\n }\n\n function getDefaultSettingFns(){\n\n return {\n getData: getData,\n getGroups: getGroups\n };\n\n /**\n * @ngdoc method\n * @name settings#getData\n * @description Returns the data to display in the table\n *\n * Called by `NgTableParams` whenever it considers new data is to be loaded\n *\n * @param {Object} params the `NgTableParams` requesting data\n */\n function getData(params) {\n return ngTableDefaultGetData(params.settings().dataset, params);\n }\n\n /**\n * @ngdoc method\n * @name settings#getGroups\n * @description Return groups of data to display in the table\n *\n * Called by `NgTableParams` whenever it considers new data is to be loaded\n * and when a `group` value has been assigned\n *\n * @param {Object} params the `NgTableParams` requesting data\n */\n function getGroups(params) {\n\n var group = params.group();\n var groupFn;\n var sortDirection = undefined;\n if (angular.isFunction(group)) {\n groupFn = group;\n sortDirection = group.sortDirection;\n } else {\n // currently support for only one group implemented\n var groupField = Object.keys(group)[0];\n sortDirection = group[groupField];\n groupFn = function(item){\n return getPath(item, groupField);\n };\n }\n\n var settings = params.settings();\n var originalDataOptions = settings.dataOptions;\n settings.dataOptions = { applyPaging: false };\n var gotData = $q.when(settings.getData(params));\n return gotData.then(function(data) {\n var groups = {};\n angular.forEach(data, function(item) {\n var groupName = groupFn(item);\n groups[groupName] = groups[groupName] || {\n data: [],\n $hideRows: !settings.groupOptions.isExpanded,\n value: groupName\n };\n groups[groupName].data.push(item);\n });\n var result = [];\n for (var i in groups) {\n result.push(groups[i]);\n }\n if (sortDirection) {\n var orderByFn = ngTableDefaultGetData.getOrderByFn();\n var orderBy = convertSortToOrderBy({\n value: sortDirection\n });\n result = orderByFn(result, orderBy);\n }\n\n return ngTableDefaultGetData.applyPaging(result, params);\n }).finally(function(){\n // restore the real options\n settings.dataOptions = originalDataOptions;\n });\n }\n\n function getPath (obj, ks) {\n // origianl source https://github.com/documentcloud/underscore-contrib\n\n if (typeof ks == \"string\") ks = ks.split(\".\");\n\n // If we have reached an undefined property\n // then stop executing and return undefined\n if (angular.isUndefined(obj)) return void 0;\n\n // If the path array has no more elements, we've reached\n // the intended property and return its value\n if (ks.length === 0) return obj;\n\n // If we still have elements in the path array and the current\n // value is null, stop executing and return undefined\n if (obj === null) return void 0;\n\n return getPath(obj[ks[0]], ks.slice(1));\n }\n }\n\n var params = {\n page: 1,\n count: 10,\n filter: {},\n sorting: {},\n group: {}\n };\n angular.extend(params, ngTableDefaults.params);\n\n /**\n * @ngdoc object\n * @name settings\n * @module ngTable\n * @description configuration settings for `NgTableParams`\n */\n var settings = {\n $loading: false,\n dataset: null, //allows data to be set when table is initialized\n total: 0,\n defaultSort: 'desc',\n filterOptions: angular.copy(defaultFilterOptions),\n groupOptions: angular.copy(defaultGroupOptions),\n counts: ngTableDefaults.counts,\n interceptors: [],\n paginationMaxBlocks: 11,\n paginationMinBlocks: 5,\n sortingIndicator: 'span'\n };\n\n this.settings(defaultSettingsFns);\n this.settings(ngTableDefaults.settings);\n this.settings(baseSettings);\n this.parameters(baseParameters, true);\n\n ngTableEventsChannel.publishAfterCreated(this);\n // run events during construction after the initial create event. That way a consumer\n // can subscribe to all events for a table without \"dropping\" an event\n angular.forEach(initialEvents, function(event){\n event();\n });\n initialEvents = null;\n\n return this;\n };\n return NgTableParams;\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .factory('NgTableParams', ngTableParams);\n})();\n\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n /**\n * @ngdoc service\n * @name ngTableEventsChannel\n * @description strongly typed pub/sub for `NgTableParams`\n *\n * Supported events:\n *\n * * afterCreated - raised when a new instance of `NgTableParams` has finished being constructed\n * * afterReloadData - raised when the `reload` event has finished loading new data\n * * datasetChanged - raised when `settings` receives a new data array\n * * pagesChanged - raised when a new pages array has been generated\n */\n ngTableEventsChannel.$inject = ['$rootScope'];\n function ngTableEventsChannel($rootScope){\n var events = {};\n events = addChangeEvent('afterCreated', events);\n events = addChangeEvent('afterReloadData', events);\n events = addChangeEvent('datasetChanged', events);\n events = addChangeEvent('pagesChanged', events);\n return events;\n\n //////////\n\n function addChangeEvent(eventName, target){\n var fnName = eventName.charAt(0).toUpperCase() + eventName.substring(1);\n var event = {};\n event['on' + fnName] = createEventSubscriptionFn(eventName);\n event['publish' + fnName] = createPublishEventFn(eventName);\n return angular.extend(target, event);\n }\n\n function createEventSubscriptionFn(eventName){\n\n return function subscription(handler/*[, eventSelector or $scope][, eventSelector]*/){\n var eventSelector = angular.identity;\n var scope = $rootScope;\n\n if (arguments.length === 2){\n if (angular.isFunction(arguments[1].$new)) {\n scope = arguments[1];\n } else {\n eventSelector = arguments[1]\n }\n } else if (arguments.length > 2){\n scope = arguments[1];\n eventSelector = arguments[2];\n }\n\n // shorthand for subscriber to only receive events from a specific publisher instance\n if (angular.isObject(eventSelector)) {\n var requiredPublisher = eventSelector;\n eventSelector = function(publisher){\n return publisher === requiredPublisher;\n }\n }\n\n return scope.$on('ngTable:' + eventName, function(event, params/*, ...args*/){\n // don't send events published by the internal NgTableParams created by ngTableController\n if (params.isNullInstance) return;\n\n var eventArgs = rest(arguments, 2);\n var fnArgs = [params].concat(eventArgs);\n if (eventSelector.apply(this, fnArgs)){\n handler.apply(this, fnArgs);\n }\n });\n }\n }\n\n function createPublishEventFn(eventName){\n return function publish(/*args*/){\n var fnArgs = ['ngTable:' + eventName].concat(Array.prototype.slice.call(arguments));\n $rootScope.$broadcast.apply($rootScope, fnArgs);\n }\n }\n\n function rest(array, n) {\n return Array.prototype.slice.call(array, n == null ? 1 : n);\n }\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .factory('ngTableEventsChannel', ngTableEventsChannel);\n\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n/**\n * ngTable: Table + Angular JS\n *\n * @author Vitalii Savchuk \n * @url https://github.com/esvit/ng-table/\n * @license New BSD License \n */\n\n(function () {\n 'use strict';\n\n ngTableColumn.$inject = [];\n function ngTableColumn() {\n return {\n buildColumn: buildColumn\n };\n\n //////////////\n\n /**\n * @ngdoc method\n * @name ngTableColumn#buildColumn\n * @description Creates a $column for use within a header template\n *\n * @param {Object} column an existing $column or simple column data object\n * @param {Scope} defaultScope the $scope to supply to the $column getter methods when not supplied by caller\n * @param {Array} columns a reference to the columns array to make available on the context supplied to the\n * $column getter methods\n * @returns {Object} a $column object\n */\n function buildColumn(column, defaultScope, columns){\n // note: we're not modifying the original column object. This helps to avoid unintended side affects\n var extendedCol = Object.create(column);\n var defaults = createDefaults();\n for (var prop in defaults) {\n if (angular.isUndefined(extendedCol[prop])) {\n extendedCol[prop] = defaults[prop];\n }\n if(!angular.isFunction(extendedCol[prop])){\n // wrap raw field values with \"getter\" functions\n // - this is to ensure consistency with how ngTable.compile builds columns\n // - note that the original column object is being \"proxied\"; this is important\n // as it ensure that any changes to the original object will be returned by the \"getter\"\n (function(prop1){\n var getterSetter = function getterSetter(/*[value] || [$scope, locals]*/) {\n if (arguments.length === 1 && !isScopeLike(arguments[0])) {\n getterSetter.assign(null, arguments[0]);\n } else {\n return column[prop1];\n }\n };\n getterSetter.assign = function($scope, value){\n column[prop1] = value;\n };\n extendedCol[prop1] = getterSetter;\n })(prop);\n }\n (function(prop1){\n // satisfy the arguments expected by the function returned by parsedAttribute in the ngTable directive\n var getterFn = extendedCol[prop1];\n extendedCol[prop1] = function () {\n if (arguments.length === 1 && !isScopeLike(arguments[0])){\n getterFn.assign(null, arguments[0]);\n } else {\n var scope = arguments[0] || defaultScope;\n var context = Object.create(scope);\n angular.extend(context, {\n $column: extendedCol,\n $columns: columns\n });\n return getterFn.call(column, context);\n }\n };\n if (getterFn.assign){\n extendedCol[prop1].assign = getterFn.assign;\n }\n })(prop);\n }\n return extendedCol;\n }\n\n function createDefaults(){\n return {\n 'class': createGetterSetter(''),\n filter: createGetterSetter(false),\n groupable: createGetterSetter(false),\n filterData: angular.noop,\n headerTemplateURL: createGetterSetter(false),\n headerTitle: createGetterSetter(''),\n sortable: createGetterSetter(false),\n show: createGetterSetter(true),\n title: createGetterSetter(''),\n titleAlt: createGetterSetter(''),\n columnType: createGetterSetter('string'), // int or string or action, default: String\n width: createGetterSetter(undefined),\n minWidth: createGetterSetter(''),\n canHideColumn: createGetterSetter(true), // all column default can hide\n hideColumn: createGetterSetter(false), // all column default can hide\n priority: createGetterSetter(9999) // default: 1, 2, 3,... 9999\n };\n }\n\n function createGetterSetter(initialValue){\n var value = initialValue;\n var getterSetter = function getterSetter(/*[value] || [$scope, locals]*/){\n if (arguments.length === 1 && !isScopeLike(arguments[0])) {\n getterSetter.assign(null, arguments[0]);\n } else {\n return value;\n }\n };\n getterSetter.assign = function($scope, newValue){\n value = newValue;\n };\n return getterSetter;\n }\n\n function isScopeLike(object){\n return object != null && angular.isFunction(object.$new);\n }\n\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .factory('ngTableColumn', ngTableColumn);\n})();\n\n\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n\n/**\n * ngTable: Table + Angular JS\n *\n * @author Vitalii Savchuk \n * @url https://github.com/esvit/ng-table/\n * @license New BSD License \n */\n(function(){\n 'use strict';\n\n ngTableFilterConfigProvider.$inject = [];\n function ngTableFilterConfigProvider() {\n var config;\n var defaultConfig = {\n defaultBaseUrl: 'app/kernel/ui-elements/table/filters/',\n defaultExt: '.html',\n aliasUrls: {}\n };\n\n this.$get = ngTableFilterConfig;\n this.resetConfigs = resetConfigs;\n this.setConfig = setConfig;\n\n init();\n\n /////////\n\n function init(){\n resetConfigs();\n }\n\n function resetConfigs(){\n config = defaultConfig;\n }\n\n function setConfig(customConfig){\n var mergeConfig = angular.extend({}, config, customConfig);\n mergeConfig.aliasUrls = angular.extend({}, config.aliasUrls, customConfig.aliasUrls);\n config = mergeConfig;\n }\n\n /////////\n\n ngTableFilterConfig.$inject = [];\n\n function ngTableFilterConfig(){\n\n var publicConfig;\n\n var service = {\n config: publicConfig,\n getTemplateUrl: getTemplateUrl,\n getUrlForAlias: getUrlForAlias\n };\n Object.defineProperty(service, \"config\", {\n get: function(){\n return publicConfig = publicConfig || angular.copy(config);\n },\n enumerable: true\n });\n\n return service;\n\n /////////\n\n function getTemplateUrl(filterDef, filterKey){\n if (angular.isObject(filterDef)){\n filterDef = filterDef.id;\n }\n if (filterDef.indexOf('/') !== -1){\n return filterDef;\n }\n\n return service.getUrlForAlias(filterDef, filterKey);\n }\n\n function getUrlForAlias(aliasName/*, filterKey*/){\n return config.aliasUrls[aliasName] || config.defaultBaseUrl + aliasName + config.defaultExt;\n }\n }\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .provider('ngTableFilterConfig', ngTableFilterConfigProvider);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n/**\n * ngTable: Table + Angular JS\n *\n * @author Vitalii Savchuk \n * @url https://github.com/esvit/ng-table/\n * @license New BSD License \n */\n(function () {\n 'use strict';\n\n ngTableDefaultGetDataProvider.$inject = [];\n function ngTableDefaultGetDataProvider() {\n var provider = this;\n provider.$get = ngTableDefaultGetData;\n provider.filterFilterName = 'filter';\n provider.sortingFilterName = 'orderBy';\n\n ///////////\n\n ngTableDefaultGetData.$inject = ['$filter'];\n\n /**\n * @ngdoc service\n * @name ngTableDefaultGetData\n * @description A default implementation of the getData function that will apply the `filter`, `orderBy` and\n * paging values from the `NgTableParams` instance supplied to the data array supplied.\n *\n * The outcome will be to return the resulting array and to assign the total item count after filtering\n * to the `total` of the `NgTableParams` instance supplied\n */\n function ngTableDefaultGetData($filter) {\n\n var defaultDataOptions = {applyFilter: true, applySort: true, applyPaging: true};\n\n getData.applyPaging = applyPaging;\n getData.getFilterFn = getFilterFn;\n getData.getOrderByFn = getOrderByFn;\n\n return getData;\n\n function getFilterFn(params) {\n var filterOptions = params.settings().filterOptions;\n if (angular.isFunction(filterOptions.filterFn)){\n return filterOptions.filterFn;\n } else {\n return $filter(filterOptions.filterFilterName || provider.filterFilterName);\n }\n }\n\n function getOrderByFn (/*params*/){\n return $filter(provider.sortingFilterName);\n }\n\n function applyFilter(data, params) {\n if (!params.hasFilter()) {\n return data;\n }\n\n var filter = params.filter(true);\n var filterKeys = Object.keys(filter);\n var parsedFilter = filterKeys.reduce(function(result, key){\n result = setPath(result, filter[key], key);\n return result;\n }, {});\n var filterFn = getFilterFn(params);\n return filterFn.call(params, data, parsedFilter, params.settings().filterOptions.filterComparator);\n }\n\n function applyPaging(data, params) {\n var pagedData = data.slice((params.page() - 1) * params.count(), params.page() * params.count());\n params.total(data.length); // set total for recalc pagination\n return pagedData;\n }\n\n function applySort(data, params) {\n var orderBy = params.orderBy();\n var orderByFn = getOrderByFn(params);\n return orderBy.length ? orderByFn(data, orderBy) : data;\n }\n\n function getData(data, params) {\n if (data == null){\n return [];\n }\n\n var options = angular.extend({}, defaultDataOptions, params.settings().dataOptions);\n\n var fData = options.applyFilter ? applyFilter(data, params) : data;\n var orderedData = options.applySort ? applySort(fData, params) : fData;\n return options.applyPaging ? applyPaging(orderedData, params) : orderedData;\n }\n\n // Sets the value at any depth in a nested object based on the path\n // note: adapted from: underscore-contrib#setPath\n function setPath(obj, value, path) {\n var keys = path.split('.');\n var ret = obj;\n var lastKey = keys[keys.length -1];\n var target = ret;\n\n var parentPathKeys = keys.slice(0, keys.length -1);\n parentPathKeys.forEach(function(key) {\n if (!target.hasOwnProperty(key)) {\n target[key] = {};\n }\n target = target[key];\n });\n\n target[lastKey] = value;\n return ret;\n }\n }\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .provider('ngTableDefaultGetData', ngTableDefaultGetDataProvider);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n ngTable.$inject = ['$q', '$parse'];\n function ngTable($q, $parse) {\n return {\n restrict: 'A',\n priority: 1001,\n scope: true,\n controller: 'NgTableController',\n controllerAs:'TC',\n compile: function(element) {\n var columns = [],\n i = 0,\n dataRow,\n groupRow,\n rows = [];\n\n angular.forEach(element.find('tr'), function(tr) {\n rows.push(angular.element(tr))\n });\n dataRow = rows.filter(function(tr){\n return !tr.hasClass('ng-table-group');\n })[0];\n groupRow = rows.filter(function(tr){\n return tr.hasClass('ng-table-group');\n })[0];\n\n if (!dataRow) {\n return;\n }\n angular.forEach(dataRow.find('td'), function(item) {\n var el = angular.element(item);\n if (el.attr('ignore-cell') && 'true' === el.attr('ignore-cell')) {\n return;\n }\n\n var getAttrValue = function(attr){\n return el.attr('x-data-' + attr) || el.attr('data-' + attr) || el.attr(attr);\n };\n var setAttrValue = function(attr, value){\n if (el.attr('x-data-' + attr)){\n el.attr('x-data-' + attr, value)\n } else if (el.attr('data' + attr)){\n el.attr('data' + attr, value)\n } else {\n el.attr(attr, value)\n }\n };\n\n var parsedAttribute = function(attr) {\n var expr = getAttrValue(attr);\n if (!expr){\n return undefined;\n }\n\n var localValue;\n var getter = function (context) {\n if (angular.isDefined(localValue)){\n return localValue;\n }\n return $parse(expr)(context);\n };\n getter.assign = function($scope, value){\n var parsedExpr = $parse(expr);\n if (parsedExpr.assign) {\n // we should be writing back to the parent scope as this is where the expression\n // came from\n parsedExpr.assign($scope.$parent, value);\n } else {\n localValue = value;\n }\n };\n return getter;\n };\n var titleExpr = getAttrValue('title-alt') || getAttrValue('title');\n if (titleExpr){\n el.attr('data-title-text', '{{' + titleExpr + '}}'); // this used in responsive table\n }\n // NOTE TO MAINTAINERS: if you add extra fields to a $column be sure to extend ngTableColumn with\n // a corresponding \"safe\" default\n columns.push({\n id: i++,\n title: parsedAttribute('title'),\n titleAlt: parsedAttribute('title-alt'),\n headerTitle: parsedAttribute('header-title'),\n sortable: parsedAttribute('sortable'),\n 'class': parsedAttribute('header-class'),\n filter: parsedAttribute('filter'),\n groupable: parsedAttribute('groupable'),\n headerTemplateURL: parsedAttribute('header'),\n filterData: parsedAttribute('filter-data'),\n show: el.attr(\"ng-if\") ? parsedAttribute('ng-if') : undefined\n });\n\n if (groupRow || el.attr(\"ng-if\")){\n // change ng-if to bind to our column definition which we know will be writable\n // because this will potentially increase the $watch count, only do so if we already have an\n // ng-if or when we definitely need to change visibility of the columns.\n // currently only ngTableGroupRow directive needs to change visibility\n setAttrValue('ng-if', '$columns[' + (columns.length - 1) + '].show(this)');\n }\n });\n return function(scope, element, attrs, controller) {\n scope.$columns = columns = controller.buildColumns(columns);\n\n controller.setupBindingsToInternalScope(attrs.ngTable);\n controller.loadFilterData(columns);\n controller.compileDirectiveTemplates();\n };\n }\n }\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .directive('ngTable', ngTable);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n ngTableSorterRow.$inject = [];\n function ngTableSorterRow() {\n var directive = {\n restrict: 'E',\n replace: true,\n templateUrl: 'app/kernel/ui-elements/table/views/sorterRow.html',\n scope: true,\n controller: 'NgTableSorterRowController',\n controllerAs:'tsrc'\n };\n return directive;\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .directive('ngTableSorterRow', ngTableSorterRow);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n ngTableSelectFilterDs.$inject = [];\n function ngTableSelectFilterDs() {\n var directive = {\n restrict: 'A',\n controller: ngTableSelectFilterDsController\n };\n return directive;\n }\n ngTableSelectFilterDsController.$inject = ['$scope', '$parse', '$attrs', '$q'];\n function ngTableSelectFilterDsController($scope, $parse, $attrs, $q){\n\n var $column = {};\n init();\n\n function init(){\n $column = $parse($attrs.ngTableSelectFilterDs)($scope);\n $scope.$watch(function(){\n return $column.data;\n }, bindDataSource);\n }\n\n function bindDataSource(){\n getSelectListData($column).then(function(data){\n if (data && !hasEmptyOption(data)){\n data.unshift({ id: '', title: ''});\n }\n data = data || [];\n $scope.$selectData = data;\n });\n }\n\n function hasEmptyOption(data) {\n var isMatch;\n for (var i = 0; i < data.length; i++) {\n var item = data[i];\n if (item && item.id === '') {\n isMatch = true;\n break;\n }\n }\n return isMatch;\n }\n\n function getSelectListData($column) {\n var data = angular.isFunction($column.data) ? $column.data() : $column.data;\n return $q.when(data);\n }\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .directive('ngTableSelectFilterDs', ngTableSelectFilterDs);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n ngTablePagination.$inject = ['$compile', 'ngTableEventsChannel','$document'];\n function ngTablePagination($compile, ngTableEventsChannel, $document) {\n return {\n restrict: 'A',\n scope: {\n 'params': '=ngTablePagination',\n 'templateUrl': '='\n },\n replace: false,\n link: function(scope, element/*, attrs*/) {\n\n ngTableEventsChannel.onAfterReloadData(function(pubParams) {\n scope.pages = pubParams.generatePagesArray();\n }, scope, function(pubParams){\n return pubParams === scope.params;\n });\n\n scope.$watch('templateUrl', function(templateUrl) {\n if (angular.isUndefined(templateUrl)) {\n return;\n }\n var template = angular.element($document[0].createElement('div'));\n template.attr({\n 'ng-include': 'templateUrl'\n });\n element.append(template);\n $compile(template)(scope);\n });\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .directive('ngTablePagination', ngTablePagination);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n ngTableGroupRow.$inject = [];\n function ngTableGroupRow() {\n var directive = {\n restrict: 'E',\n replace: true,\n templateUrl: 'app/kernel/ui-elements/table/views/groupRow.html',\n scope: true,\n controller: 'NgTableGroupRowController',\n controllerAs: 'dctrl'\n };\n return directive;\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .directive('ngTableGroupRow', ngTableGroupRow);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n ngTableFilterRow.$inject = [];\n function ngTableFilterRow() {\n var directive = {\n restrict: 'E',\n replace: true,\n templateUrl: 'app/kernel/ui-elements/table/views/filterRow.html',\n scope: true,\n controller: 'NgTableFilterRowController'\n };\n return directive;\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .directive('ngTableFilterRow', ngTableFilterRow);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n ngTableDynamic.$inject = ['$window', '$filter'];\n function ngTableDynamic($window, $filter) {\n return {\n restrict: 'A',\n priority: 1001,\n scope: true,\n controller: 'NgTableResponsiveController',\n compile: function(tElement) {\n var row;\n // IE 8 fix :not(.ng-table-group) selector\n angular.forEach(tElement.find('tr'), function(tr) {\n tr = angular.element(tr);\n if (!tr.hasClass('ng-table-group') && !row) {\n row = tr;\n }\n });\n if (!row) {\n return;\n }\n\n angular.forEach(row.find('td'), function(item) {\n var el = angular.element(item);\n var getAttrValue = function(attr){\n return el.attr('x-data-' + attr) || el.attr('data-' + attr) || el.attr(attr);\n };\n\n // this used in responsive table\n var titleExpr = getAttrValue('title');\n if (!titleExpr){\n el.attr('data-title-text', '{{$columns[$index].titleAlt(this) || $columns[$index].title(this)}}');\n }\n var showExpr = el.attr('ng-if');\n if (!showExpr){\n el.attr('ng-if', '$columns[$index].show(this)');\n }\n });\n return function (scope, element, attrs, controller) {\n var expr = controller.parseNgTableDynamicExpr(attrs.ngTableDynamic);\n controller.setupBindingsToInternalScope(expr.tableParams);\n controller.compileDirectiveTemplates();\n\n scope.$watchCollection(expr.columns, function (newCols/*, oldCols*/) {\n controller.exprColumns = $filter('orderBy')(newCols, 'priority');\n if($filter('where')(newCols, {'classes' : 'control'}).length === 0){\n newCols.push(controller.controlColumn);\n }\n scope.$columns = controller.buildColumns(newCols);\n // set columns sort\n // scope.$columns = $filter('orderBy')(scope.$columns, 'priority()');\n controller.loadFilterData(scope.$columns);\n });\n\n angular.element($window).on('resize', function () {\n controller.resize();\n });\n };\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .directive('ngTableDynamic', ngTableDynamic);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n ngTableColumnsBinding.$inject = ['$parse'];\n function ngTableColumnsBinding($parse) {\n var directive = {\n restrict: 'A',\n require: 'ngTable',\n link: linkFn\n };\n return directive;\n\n function linkFn($scope, $element, $attrs){\n var setter = $parse($attrs.ngTableColumnsBinding).assign;\n if (setter){\n $scope.$watch('$columns', function(newColumns){\n var shallowClone = (newColumns || []).slice(0);\n setter($scope, shallowClone);\n });\n }\n }\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .directive('ngTableColumnsBinding', ngTableColumnsBinding);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n NgTableController.$inject = ['$window', '$scope', 'NgTableParams', '$timeout', '$parse', '$compile', '$attrs', '$element',\n 'ngTableColumn', 'ngTableEventsChannel', '$document', '$templateRequest'];\n function NgTableController($window, $scope, NgTableParams, $timeout, $parse, $compile, $attrs, $element, ngTableColumn, ngTableEventsChannel, $document, $templateRequest) {\n var vm = this;\n vm.scope = $scope;\n // var isFirstTimeLoad = true;\n vm.scope.$filterRow = {};\n vm.scope.$loading = false;\n\n // until such times as the directive uses an isolated scope, we need to ensure that the check for\n // the params field only consults the \"own properties\" of the $scope. This is to avoid seeing the params\n // field on a $scope higher up in the prototype chain\n if (!$scope.hasOwnProperty(\"params\")) {\n vm.scope.params = new NgTableParams(true);\n }\n vm.scope.params.settings().$scope = $scope;\n\n var delayFilter = (function() {\n var timer = 0;\n return function(callback, ms) {\n $timeout.cancel(timer);\n timer = $timeout(callback, ms);\n };\n })();\n\n function onDataReloadStatusChange (newStatus/*, oldStatus*/) {\n if (!newStatus || vm.scope.params.hasErrorState()) {\n return;\n }\n\n vm.scope.params.settings().$scope = $scope;\n\n var currentParams = vm.scope.params;\n var filterOptions = currentParams.settings().filterOptions;\n\n if (currentParams.hasFilterChanges()) {\n var applyFilter = function () {\n currentParams.page(1);\n currentParams.reload();\n };\n if (filterOptions.filterDelay) {\n delayFilter(applyFilter, filterOptions.filterDelay);\n } else {\n applyFilter();\n }\n } else {\n currentParams.reload();\n }\n }\n\n // watch for when a new NgTableParams is bound to the scope\n // CRITICAL: the watch must be for reference and NOT value equality; this is because NgTableParams maintains\n // the current data page as a field. Checking this for value equality would be terrible for performance\n // and potentially cause an error if the items in that array has circular references\n $scope.$watch('params', function(newParams, oldParams){\n if (newParams === oldParams || !newParams) {\n return;\n }\n\n newParams.reload();\n }, false);\n\n $scope.$watch('params.isDataReloadRequired()', onDataReloadStatusChange);\n\n vm.compileDirectiveTemplates = function () {\n if (!$element.hasClass('ng-table')) {\n vm.scope.templates = {\n header: ($attrs.templateHeader ? $attrs.templateHeader : 'app/kernel/ui-elements/table/views/header.html'),\n pagination: ($attrs.templatePagination ? $attrs.templatePagination : 'app/kernel/ui-elements/table/views/pager.html'),\n responsiveRow: ($attrs.templateResponsiveRow ? $attrs.templateResponsiveRow : 'app/kernel/ui-elements/table/views/responsive-row.html')\n };\n $element.addClass('ng-table');\n var headerTemplate = null;\n\n // $element.find('> thead').length === 0 doesn't work on jqlite\n var theadFound = false;\n angular.forEach($element.children(), function(e) {\n if (e.tagName === 'THEAD') {\n theadFound = true;\n }\n });\n if (!theadFound) {\n headerTemplate = angular.element($document[0].createElement('thead')).attr('ng-include', 'templates.header');\n $element.prepend(headerTemplate);\n }\n var paginationTemplate = angular.element($document[0].createElement('div')).attr({\n 'ng-table-pagination': 'params',\n 'template-url': 'templates.pagination'\n });\n $element.after(paginationTemplate);\n if (headerTemplate) {\n $compile(headerTemplate)($scope);\n }\n $compile(paginationTemplate)($scope);\n }\n };\n\n vm.loadFilterData = function ($columns) {\n angular.forEach($columns, function ($column) {\n var result;\n result = $column.filterData($scope);\n if (!result) {\n delete $column.filterData;\n return;\n }\n\n // if we're working with a deferred object or a promise, let's wait for the promise\n /* WARNING: support for returning a $defer is depreciated */\n if ((angular.isObject(result) && (angular.isObject(result.promise) || angular.isFunction(result.then)))) {\n var pData = angular.isFunction(result.then) ? result : result.promise;\n delete $column.filterData;\n return pData.then(function(data) {\n // our deferred can eventually return arrays, functions and objects\n if (!angular.isArray(data) && !angular.isFunction(data) && !angular.isObject(data)) {\n // if none of the above was found - we just want an empty array\n data = [];\n }\n $column.data = data;\n });\n }\n // otherwise, we just return what the user gave us. It could be a function, array, object, whatever\n else {\n return $column.data = result;\n }\n });\n };\n\n vm.buildControlColumns = function (columns) {\n var responsiveCol = {\n classes: 'control',\n canHideColumn: false,\n minWidth: '50',\n clickFn: function ( row, $event ) {\n if(angular.element($event.target.parentNode).next('tr').attr(\"id\") === 'responsive-child'){\n angular.element($event.target.parentNode).removeClass('parent');\n var rowChild = angular.element(angular.element($event.target.parentNode).next('tr'));\n if(rowChild.length > 0){\n rowChild.removeClass('fadeIn').addClass('fadeOut').hide('slow', function () {\n var current = $event.target.parentNode;\n // this.remove(); //IE 11 not support\n // reference: https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove\n // this.parentNode.removeChild(this);\n current.parentNode.removeChild(rowChild[0]);\n });\n }\n }else{\n angular.element($event.target.parentNode).addClass('parent');\n $templateRequest(vm.scope.templates.responsiveRow).then(function(html){\n var responsiveTR = angular.element(html).addClass('animated fadeIn');\n angular.element($event.target.parentNode).after(responsiveTR);\n if (responsiveTR) {\n vm.scope.responsiveTrRow = row;\n $compile(responsiveTR)($scope);\n }\n });\n }\n }\n };\n columns.push(ngTableColumn.buildColumn(responsiveCol, $scope, columns));\n return columns\n };\n\n vm.buildColumns = function (columns) {\n var result = [];\n (columns || []).forEach(function(col){\n result.push(ngTableColumn.buildColumn(col, $scope, result));\n });\n return result\n };\n\n vm.parseNgTableDynamicExpr = function (attr) {\n if (!attr || attr.indexOf(\" with \") > -1) {\n var parts = attr.split(/\\s+with\\s+/);\n return {\n tableParams: parts[0],\n columns: parts[1]\n };\n } else {\n throw new Error('Parse error (expected example: ng-table-dynamic=\\'tableParams with cols\\')');\n }\n };\n\n vm.setupBindingsToInternalScope = function(tableParamsExpr){\n\n // note: this we're setting up watches to simulate angular's isolated scope bindings\n\n // note: is REALLY important to watch for a change to the ngTableParams *reference* rather than\n // $watch for value equivalence. This is because ngTableParams references the current page of data as\n // a field and it's important not to watch this\n var tableParamsGetter = $parse(tableParamsExpr);\n $scope.$watch(tableParamsGetter, (function (params) {\n if (angular.isUndefined(params)) {\n return;\n }\n vm.scope.paramsModel = tableParamsGetter;\n vm.scope.params = params;\n }), false);\n\n setupFilterRowBindingsToInternalScope();\n setupGroupRowBindingsToInternalScope();\n };\n\n function setupFilterRowBindingsToInternalScope(){\n if ($attrs.showFilter) {\n $scope.$parent.$watch($attrs.showFilter, function(value) {\n vm.scope.show_filter = value;\n });\n } else {\n $scope.$watch(hasVisibleFilterColumn, function(value){\n vm.scope.show_filter = value;\n })\n }\n\n if ($attrs.disableFilter) {\n $scope.$parent.$watch($attrs.disableFilter, function(value) {\n vm.scope.$filterRow.disabled = value;\n });\n }\n }\n\n function setupGroupRowBindingsToInternalScope(){\n vm.scope.$groupRow = {};\n if ($attrs.showGroup) {\n var showGroupGetter = $parse($attrs.showGroup);\n $scope.$parent.$watch(showGroupGetter, function(value) {\n vm.scope.$groupRow.show = value;\n });\n if (showGroupGetter.assign){\n // setup two-way databinding thus allowing ngTableGrowRow to assign to the showGroup expression\n $scope.$watch('$groupRow.show', function(value) {\n showGroupGetter.assign($scope.$parent, value);\n });\n }\n } else{\n $scope.$watch('params.hasGroup()', function(newValue) {\n vm.scope.$groupRow.show = newValue;\n });\n }\n }\n\n function getVisibleColumns(){\n return ($scope.$columns || []).filter(function(c){\n return c.show($scope);\n });\n }\n\n function hasVisibleFilterColumn(){\n if (!$scope.$columns) return false;\n\n return some($scope.$columns, function($column){\n return $column.show($scope) && $column.filter($scope);\n });\n }\n\n function some(array, predicate){\n var found = false;\n for (var i = 0; i < array.length; i++) {\n var obj = array[i];\n if (predicate(obj)){\n found = true;\n break;\n }\n }\n return found;\n }\n\n function commonInit(){\n ngTableEventsChannel.onAfterReloadData(bindDataToScope, $scope, isMyPublisher);\n ngTableEventsChannel.onPagesChanged(bindPagesToScope, $scope, isMyPublisher);\n\n function bindDataToScope(params, newDatapage){\n var visibleColumns = getVisibleColumns();\n if (params.hasGroup()) {\n vm.scope.$groups = newDatapage || [];\n vm.scope.$groups.visibleColumnCount = visibleColumns.length;\n } else {\n vm.scope.$data = newDatapage || [];\n vm.scope.$data.visibleColumnCount = visibleColumns.length;\n }\n }\n\n\n function bindPagesToScope(params, newPages){\n vm.scope.pages = newPages\n }\n\n function isMyPublisher(publisher){\n return vm.scope.params === publisher;\n }\n }\n\n commonInit();\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .controller('NgTableController', NgTableController);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n NgTableSorterRowController.$inject = ['$scope'];\n function NgTableSorterRowController($scope) {\n var vm = this;\n vm.sortBy = sortBy;\n\n ///////////\n\n function sortBy($column, event) {\n var parsedSortable = $column.sortable && $column.sortable();\n if (!parsedSortable) {\n return;\n }\n var defaultSort = $scope.params.settings().defaultSort;\n var inverseSort = (defaultSort === 'asc' ? 'desc' : 'asc');\n var sorting = $scope.params.sorting() && $scope.params.sorting()[parsedSortable] && ($scope.params.sorting()[parsedSortable] === defaultSort);\n var sortingParams = (event.ctrlKey || event.metaKey) ? $scope.params.sorting() : {};\n sortingParams[parsedSortable] = (sorting ? inverseSort : defaultSort);\n $scope.params.parameters({\n sorting: sortingParams\n });\n }\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .controller('NgTableSorterRowController', NgTableSorterRowController);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n NgTableResponsiveController.$inject = ['$window', '$scope', 'NgTableParams', '$timeout', '$parse', '$compile', '$attrs', '$element',\n 'ngTableColumn', 'ngTableEventsChannel', '$document', '$templateRequest', '$filter'];\n function NgTableResponsiveController($window, $scope, NgTableParams, $timeout, $parse, $compile, $attrs, $element, ngTableColumn, ngTableEventsChannel, $document, $templateRequest, $filter) {\n var vm = this;\n vm.scope = $scope;\n // var isFirstTimeLoad = true;\n vm.scope.$filterRow = {};\n vm.scope.$loading = false;\n\n var breakpoints = [\n { name: 'desktop', width: Infinity },\n { name: 'tablet-l', width: 1024 },\n { name: 'tablet-p', width: 720 }/*,\n { name: 'mobile-l', width: 480 },\n { name: 'mobile-p', width: 320 }*/\n ];\n\n // until such times as the directive uses an isolated scope, we need to ensure that the check for\n // the params field only consults the \"own properties\" of the $scope. This is to avoid seeing the params\n // field on a $scope higher up in the prototype chain\n if (!$scope.hasOwnProperty(\"params\")) {\n vm.scope.params = new NgTableParams(true);\n }\n vm.scope.params.settings().$scope = $scope;\n\n var delayFilter = (function() {\n var timer = 0;\n return function(callback, ms) {\n $timeout.cancel(timer);\n timer = $timeout(callback, ms);\n };\n })();\n\n function onDataReloadStatusChange (newStatus/*, oldStatus*/) {\n if (!newStatus || vm.scope.params.hasErrorState()) {\n return;\n }\n\n vm.scope.params.settings().$scope = $scope;\n\n var currentParams = vm.scope.params;\n var filterOptions = currentParams.settings().filterOptions;\n\n if (currentParams.hasFilterChanges()) {\n var applyFilter = function () {\n currentParams.page(1);\n currentParams.reload();\n };\n if (filterOptions.filterDelay) {\n delayFilter(applyFilter, filterOptions.filterDelay);\n } else {\n applyFilter();\n }\n } else {\n currentParams.reload();\n }\n }\n\n // watch for when a new NgTableParams is bound to the scope\n // CRITICAL: the watch must be for reference and NOT value equality; this is because NgTableParams maintains\n // the current data page as a field. Checking this for value equality would be terrible for performance\n // and potentially cause an error if the items in that array has circular references\n $scope.$watch('params', function(newParams, oldParams){\n if (newParams === oldParams || !newParams) {\n return;\n }\n\n newParams.reload();\n }, false);\n\n $scope.$watch('params.isDataReloadRequired()', onDataReloadStatusChange);\n\n vm.compileDirectiveTemplates = function () {\n if (!$element.hasClass('ng-table')) {\n vm.scope.templates = {\n header: ($attrs.templateHeader ? $attrs.templateHeader : 'app/kernel/ui-elements/table/views/header.html'),\n pagination: ($attrs.templatePagination ? $attrs.templatePagination : 'app/kernel/ui-elements/table/views/pager.html'),\n responsiveRow: ($attrs.templateResponsiveRow ? $attrs.templateResponsiveRow : 'app/kernel/ui-elements/table/views/responsive-row.html')\n };\n $element.addClass('ng-table');\n var headerTemplate = null;\n\n // $element.find('> thead').length === 0 doesn't work on jqlite\n var theadFound = false;\n angular.forEach($element.children(), function(e) {\n if (e.tagName === 'THEAD') {\n theadFound = true;\n }\n });\n if (!theadFound) {\n headerTemplate = angular.element($document[0].createElement('thead')).attr('ng-include', 'templates.header');\n $element.prepend(headerTemplate);\n }\n var paginationTemplate = angular.element($document[0].createElement('div')).attr({\n 'ng-table-pagination': 'params',\n 'template-url': 'templates.pagination'\n });\n $element.after(paginationTemplate);\n if (headerTemplate) {\n $compile(headerTemplate)($scope);\n }\n $compile(paginationTemplate)($scope);\n }\n };\n\n vm.loadFilterData = function ($columns) {\n angular.forEach($columns, function ($column) {\n var result;\n result = $column.filterData($scope);\n if (!result) {\n delete $column.filterData;\n return;\n }\n\n // if we're working with a deferred object or a promise, let's wait for the promise\n /* WARNING: support for returning a $defer is depreciated */\n if ((angular.isObject(result) && (angular.isObject(result.promise) || angular.isFunction(result.then)))) {\n var pData = angular.isFunction(result.then) ? result : result.promise;\n delete $column.filterData;\n return pData.then(function(data) {\n // our deferred can eventually return arrays, functions and objects\n if (!angular.isArray(data) && !angular.isFunction(data) && !angular.isObject(data)) {\n // if none of the above was found - we just want an empty array\n data = [];\n }\n $column.data = data;\n });\n }\n // otherwise, we just return what the user gave us. It could be a function, array, object, whatever\n else {\n return $column.data = result;\n }\n });\n };\n\n vm.controlColumn = {\n classes: 'control',\n canHideColumn: false,\n minWidth: '50',\n clickFn: function ( row, $event ) {\n if(angular.element($event.target.parentNode).next('tr').attr(\"id\") === 'responsive-child'){\n angular.element($event.target.parentNode).removeClass('parent');\n var rowChild = angular.element(angular.element($event.target.parentNode).next('tr'));\n if(rowChild.length > 0){\n rowChild.removeClass('fadeIn').addClass('fadeOut').hide('slow', function () {\n var current = $event.target.parentNode;\n // this.remove(); //IE 11 not support\n // reference: https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove\n // this.parentNode.removeChild(this);\n current.parentNode.removeChild(rowChild[0]);\n });\n }\n }else{\n angular.element($event.target.parentNode).addClass('parent');\n $templateRequest(vm.scope.templates.responsiveRow).then(function(html){\n var responsiveTR = angular.element(html).addClass('animated fadeIn');\n angular.element($event.target.parentNode).after(responsiveTR);\n if (responsiveTR) {\n vm.scope.row = row;\n $compile(responsiveTR)($scope);\n }\n });\n }\n }\n };\n\n vm.buildControlColumns = function (columns) {\n var responsiveCol = {\n classes: 'control',\n canHideColumn: false,\n minWidth: '50',\n clickFn: function ( row, $event ) {\n if(angular.element($event.target.parentNode).next('tr').attr(\"id\") === 'responsive-child'){\n angular.element($event.target.parentNode).removeClass('parent');\n var rowChild = angular.element(angular.element($event.target.parentNode).next('tr'));\n if(rowChild.length > 0){\n rowChild.removeClass('fadeIn').addClass('fadeOut').hide('slow', function () {\n var current = $event.target.parentNode;\n // this.remove(); //IE 11 not support\n // reference: https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove\n // this.parentNode.removeChild(this);\n current.parentNode.removeChild(rowChild[0]);\n });\n }\n }else{\n angular.element($event.target.parentNode).addClass('parent');\n $templateRequest(vm.scope.templates.responsiveRow).then(function(html){\n var responsiveTR = angular.element(html).addClass('animated fadeIn');\n angular.element($event.target.parentNode).after(responsiveTR);\n if (responsiveTR) {\n vm.scope.row = row;\n $compile(responsiveTR)($scope);\n }\n });\n }\n }\n };\n columns.push(ngTableColumn.buildColumn(responsiveCol, $scope, columns));\n return columns\n };\n\n vm.buildColumns = function (columns) {\n var result = [];\n (columns || []).forEach(function(col){\n result.push(ngTableColumn.buildColumn(col, $scope, result));\n });\n return result\n };\n\n vm.parseNgTableDynamicExpr = function (attr) {\n if (!attr || attr.indexOf(\" with \") > -1) {\n var parts = attr.split(/\\s+with\\s+/);\n return {\n tableParams: parts[0],\n columns: parts[1]\n };\n } else {\n throw new Error('Parse error (expected example: ng-table-dynamic=\\'tableParams with cols\\')');\n }\n };\n\n vm.setupBindingsToInternalScope = function(tableParamsExpr){\n\n // note: this we're setting up watches to simulate angular's isolated scope bindings\n\n // note: is REALLY important to watch for a change to the ngTableParams *reference* rather than\n // $watch for value equivalence. This is because ngTableParams references the current page of data as\n // a field and it's important not to watch this\n var tableParamsGetter = $parse(tableParamsExpr);\n $scope.$watch(tableParamsGetter, (function (params) {\n if (angular.isUndefined(params)) {\n return;\n }\n vm.scope.paramsModel = tableParamsGetter;\n vm.scope.params = params;\n }), false);\n\n setupFilterRowBindingsToInternalScope();\n setupGroupRowBindingsToInternalScope();\n };\n\n function setupFilterRowBindingsToInternalScope(){\n if ($attrs.showFilter) {\n $scope.$parent.$watch($attrs.showFilter, function(value) {\n vm.scope.show_filter = value;\n });\n } else {\n $scope.$watch(hasVisibleFilterColumn, function(value){\n vm.scope.show_filter = value;\n })\n }\n\n if ($attrs.disableFilter) {\n $scope.$parent.$watch($attrs.disableFilter, function(value) {\n vm.scope.$filterRow.disabled = value;\n });\n }\n }\n\n function setupGroupRowBindingsToInternalScope(){\n vm.scope.$groupRow = {};\n if ($attrs.showGroup) {\n var showGroupGetter = $parse($attrs.showGroup);\n $scope.$parent.$watch(showGroupGetter, function(value) {\n vm.scope.$groupRow.show = value;\n });\n if (showGroupGetter.assign){\n // setup two-way databinding thus allowing ngTableGrowRow to assign to the showGroup expression\n $scope.$watch('$groupRow.show', function(value) {\n showGroupGetter.assign($scope.$parent, value);\n });\n }\n } else{\n $scope.$watch('params.hasGroup()', function(newValue) {\n vm.scope.$groupRow.show = newValue;\n });\n }\n }\n\n function getVisibleColumns(){\n return ($scope.$columns || []).filter(function(c){\n return c.show($scope);\n });\n }\n\n function hasVisibleFilterColumn(){\n if (!$scope.$columns) return false;\n\n return some($scope.$columns, function($column){\n return $column.show($scope) && $column.filter($scope);\n });\n }\n\n function some(array, predicate){\n var found = false;\n for (var i = 0; i < array.length; i++) {\n var obj = array[i];\n if (predicate(obj)){\n found = true;\n break;\n }\n }\n return found;\n }\n\n function commonInit(){\n ngTableEventsChannel.onAfterReloadData(bindDataToScope, $scope, isMyPublisher);\n ngTableEventsChannel.onPagesChanged(bindPagesToScope, $scope, isMyPublisher);\n\n function bindDataToScope(params, newDatapage){\n var visibleColumns = getVisibleColumns();\n if (params.hasGroup()) {\n vm.scope.$groups = newDatapage || [];\n vm.scope.$groups.visibleColumnCount = visibleColumns.length;\n } else {\n vm.scope.$data = newDatapage || [];\n vm.scope.$data.visibleColumnCount = visibleColumns.length;\n }\n vm.resize();\n }\n\n vm.resizeAuto = function () {\n vm.breakpoint = ''; vm.n_breakpoint = '';\n vm.eleWidth = $element.width();\n var _breakpoints = breakpoints.slice().reverse();\n angular.forEach(_breakpoints, function (breakpoint, index) {\n if ( vm.eleWidth <= breakpoint.width && vm.breakpoint.length === 0) {\n vm.breakpoint = breakpoint.name;\n vm.n_breakpoint = angular.isDefined(_breakpoints[index - 1]) ?\n _breakpoints[index - 1].name : undefined;\n }\n });\n };\n\n vm.resizeColumns = function () {\n vm.minColumns = 0;\n vm._minColumns = 0;\n vm.useTableWidth = 0;\n // set visibleColumns sort\n // vm.visibleColumns = $filter('orderBy')(getVisibleColumns(), 'priority()');\n vm.visibleColumns = getVisibleColumns();\n switch (vm.breakpoint){\n case 'desktop': // > 1024px\n angular.forEach(vm.visibleColumns, function (column) {\n if(column.columnType() === 'action'){\n column.priority(3);\n }\n if(column.priority() <= 3 ){\n column.canHideColumn(false);\n vm.minColumns += 1;\n if(column.width()){\n vm.useTableWidth += column.width();\n }\n } else if(column.classes === 'control'){\n column.width(50);\n column.canHideColumn(false);\n } else {\n column.canHideColumn( true );\n }\n });\n break;\n case 'tablet-l': // <= 1024px\n angular.forEach(vm.visibleColumns, function (column) {\n if(column.columnType() === 'action'){\n column.priority(2);\n }\n if(column.priority() <= 2 ){\n column.canHideColumn(false);\n vm.minColumns += 1;\n if(column.width()){\n vm.useTableWidth += column.width();\n vm._minColumns += 1;\n }\n } else if(column.classes === 'control'){\n column.width(50);\n column.canHideColumn(false);\n } else {\n column.canHideColumn( true );\n }\n });\n break;\n case 'tablet-p': // 720px\n angular.forEach(vm.visibleColumns, function (column) {\n if(column.columnType() === 'action'){\n column.priority(1);\n }\n if(column.priority() <= 1 ){\n column.canHideColumn(false);\n vm.minColumns += 1;\n } else if(column.classes === 'control'){\n column.width(50);\n column.canHideColumn(false);\n } else {\n column.canHideColumn( true );\n }\n });\n break;\n }\n\n var columnWidth = 0;\n var breakpointWidth = 0;\n var p_breakpointWidth = 0;\n vm.useTableWidth += 50;\n if(angular.isDefined($filter('where')(breakpoints, {name:vm.breakpoint})[0])){\n breakpointWidth = $filter('where')(breakpoints, {name:vm.breakpoint})[0].width;\n var n_breakpoint = $filter('where')(breakpoints, {name:vm.n_breakpoint});\n if(vm.eleWidth <= breakpointWidth && n_breakpoint.length > 0){\n p_breakpointWidth = n_breakpoint[0].width;\n columnWidth = Math.floor((n_breakpoint[0].width - vm.useTableWidth)/(vm.minColumns - vm._minColumns));\n }\n }\n\n var _useTableWidth = 0;\n angular.forEach(vm.visibleColumns, function (column) {\n if(!column.canHideColumn() && column.classes !== 'control'){\n column.minWidth((columnWidth > 0) ? columnWidth : '');\n if( column.width()){\n column.minWidth(column.width());\n _useTableWidth += column.width();\n } else{\n _useTableWidth += (column.minWidth() !== '') ? parseInt(column.minWidth()) : 0;\n }\n }else if(column.classes === 'control'){\n if( column.width()){\n column.minWidth(column.width());\n _useTableWidth += column.width();\n }\n }\n\n if((angular.element($window)[0].innerWidth - 10) <= $filter('where')(breakpoints, {name:'tablet-p'})[0].width) {\n column.minWidth('');\n }\n });\n\n var hideColumnCount = 0;\n if(vm.eleWidth > p_breakpointWidth && p_breakpointWidth > 0){\n angular.forEach(vm.visibleColumns, function (column) {\n if(column.canHideColumn() && (_useTableWidth < vm.eleWidth) &&\n ((_useTableWidth + columnWidth) < vm.eleWidth) &&\n (angular.element($window)[0].innerWidth - 10) > $filter('where')(breakpoints, {name:'tablet-p'})[0].width){\n column.canHideColumn(false);\n column.minWidth(columnWidth);\n _useTableWidth += columnWidth;\n }\n if(column.canHideColumn()){\n hideColumnCount += 1;\n }\n });\n }else {\n angular.forEach(vm.visibleColumns, function (column) {\n if(column.canHideColumn()){\n hideColumnCount += 1;\n }\n });\n }\n\n angular.forEach(vm.visibleColumns, function (column) {\n if(column.classes === 'control'){\n if(hideColumnCount === 0){\n column.canHideColumn( true );\n vm.scope.canHideControlColumn = true;\n }else {\n column.canHideColumn( false );\n vm.scope.canHideControlColumn = false;\n }\n }\n column.hideColumn(column.canHideColumn());\n });\n };\n\n vm.resize = function (){\n vm.resizeAuto();\n vm.resizeColumns();\n };\n\n // vm.scope.$finishColumnRender = function () {\n // vm.resize();\n // };\n\n function bindPagesToScope(params, newPages){\n vm.scope.pages = newPages\n }\n\n function isMyPublisher(publisher){\n return vm.scope.params === publisher;\n }\n }\n\n commonInit();\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .controller('NgTableResponsiveController', NgTableResponsiveController);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n NgTableGroupRowController.$inject = ['$scope'];\n function NgTableGroupRowController($scope) {\n var vm = this;\n vm.scope = $scope;\n var groupFns = [];\n\n init();\n\n function init(){\n vm.scope.getGroupables = getGroupables;\n vm.scope.getGroupTitle = getGroupTitle;\n vm.scope.getVisibleColumns = getVisibleColumns;\n vm.scope.groupBy = groupBy;\n vm.scope.isSelectedGroup = isSelectedGroup;\n vm.scope.toggleDetail = toggleDetail;\n\n $scope.$watch('params.group()', setGroup, true);\n }\n\n function changeSortDirection(){\n var newDirection;\n if ($scope.params.hasGroup($scope.$selGroup, 'asc')) {\n newDirection = 'desc';\n } else if ($scope.params.hasGroup($scope.$selGroup, 'desc')){\n newDirection = '';\n } else {\n newDirection = 'asc';\n }\n $scope.params.group($scope.$selGroup, newDirection);\n }\n\n function findGroupColumn(groupKey) {\n return $scope.$columns.filter(function ($column) {\n return $column.groupable($scope) === groupKey;\n })[0];\n }\n\n function getGroupTitle(group){\n return angular.isFunction(group) ? group.title : group.title($scope);\n }\n\n function getGroupables(){\n var groupableCols = $scope.$columns.filter(function ($column) {\n return $column.groupable($scope);\n });\n return groupFns.concat(groupableCols);\n }\n\n function getVisibleColumns(){\n return $scope.$columns.filter(function($column){\n return $column.show($scope);\n })\n }\n\n function groupBy(group){\n if (isSelectedGroup(group)){\n changeSortDirection();\n } else {\n if (group.groupable){\n $scope.params.group(group.groupable($scope));\n } else{\n $scope.params.group(group);\n }\n }\n }\n\n function isSelectedGroup(group){\n if (group.groupable){\n return group.groupable($scope) === $scope.$selGroup;\n } else {\n return group === $scope.$selGroup;\n }\n }\n\n function setGroup(group){\n var existingGroupCol = findGroupColumn($scope.$selGroup);\n if (existingGroupCol && existingGroupCol.show.assign){\n existingGroupCol.show.assign($scope, true);\n }\n if (angular.isFunction(group)) {\n groupFns = [group];\n vm.scope.$selGroup = group;\n vm.scope.$selGroupTitle = group.title;\n } else {\n // note: currently only one group is implemented\n var groupKey = Object.keys(group || {})[0];\n var groupedColumn = findGroupColumn(groupKey);\n if (groupedColumn) {\n vm.scope.$selGroupTitle = groupedColumn.title($scope);\n vm.scope.$selGroup = groupKey;\n if (groupedColumn.show.assign) {\n groupedColumn.show.assign($scope, false);\n }\n }\n }\n }\n\n function toggleDetail(){\n $scope.params.settings().groupOptions.isExpanded = !$scope.params.settings().groupOptions.isExpanded;\n return $scope.params.reload();\n }\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .controller('NgTableGroupRowController', NgTableGroupRowController);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n NgTableFilterRowController.$inject = ['$scope', 'ngTableFilterConfig'];\n function NgTableFilterRowController($scope, ngTableFilterConfig) {\n var vm = this;\n vm.scope = $scope;\n vm.scope.config = ngTableFilterConfig;\n\n vm.scope.getFilterCellCss = function (filter, layout){\n if (layout !== 'horizontal') {\n return 's12';\n }\n\n var size = Object.keys(filter).length;\n var width = parseInt(12 / size, 10);\n return 's' + width;\n };\n\n vm.scope.getFilterPlaceholderValue = function(filterValue/*, filterName*/){\n if (angular.isObject(filterValue)) {\n return filterValue.placeholder;\n } else {\n return '';\n }\n };\n }\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .controller('NgTableFilterRowController', NgTableFilterRowController);\n})();\n\n/**\n * Created by Bruce on 2016/6/27.\n */\n\n(function () {\n 'use strict';\n angular.module('eHRD.kernel.uiElements.pagination',[]); \n})();\n\n/**\n * Created by Bruce on 2016/6/27.\n */\n\n(function () {\n 'use strict';\n\n function uiPaginationService(){\n var instances = {};\n var lastRegisteredInstance;\n\n return {\n registerInstance : function (instanceId) {\n if (angular.isUndefined(instances[instanceId])) {\n instances[instanceId] = {\n asyncMode: false\n };\n lastRegisteredInstance = instanceId;\n }\n },\n\n deregisterInstance : function(instanceId) {\n delete instances[instanceId];\n },\n\n isRegistered : function(instanceId) {\n return (angular.isDefined(instances[instanceId]));\n },\n\n getLastInstanceId : function() {\n return lastRegisteredInstance;\n },\n\n setCurrentPageParser : function(instanceId, val, scope) {\n instances[instanceId].currentPageParser = val;\n instances[instanceId].context = scope;\n },\n\n setFilterOptionParser : function(instanceId, val, scope) {\n instances[instanceId].filterOptionParser = val;\n instances[instanceId].context = scope;\n },\n\n setSortOption : function (instanceId, key, method) {\n instances[instanceId].sortOption = {};\n instances[instanceId].sortOption.key = key;\n instances[instanceId].sortOption.method = method;\n },\n getSortOption : function (instanceId) {\n return instances[instanceId].sortOption;\n },\n\n setFilterOption : function (instanceId, filterKey, filterValue) {\n instances[instanceId].filterOption = {};\n instances[instanceId].filterOption.filterKey = filterKey;\n instances[instanceId].filterOption.filterValue = filterValue;\n },\n getFilterOption : function (instanceId) {\n return instances[instanceId].filterOption;\n },\n\n setSearchOption : function(instanceId, val) {\n instances[instanceId].searchOption = val;\n },\n\n getSearchOption : function(instanceId) {\n return instances[instanceId].searchOption;\n },\n\n setContentLayoutTemplate : function(instanceId, val) {\n instances[instanceId].contentLayoutTemplate = val;\n },\n\n getContentLayoutTemplate : function(instanceId) {\n return instances[instanceId].contentLayoutTemplate;\n },\n\n setPaginationsObj : function(instanceId, val) {\n instances[instanceId].paginationsObj = val;\n },\n\n getPaginationsObj : function(instanceId) {\n return instances[instanceId].paginationsObj;\n },\n\n setCurrentPage : function(instanceId, val) {\n instances[instanceId].currentPageParser.assign(instances[instanceId].context, val);\n },\n\n getCurrentPage : function(instanceId) {\n var parser = instances[instanceId].currentPageParser;\n return parser ? parser(instances[instanceId].context) : 1;\n },\n\n setItemsPerPage : function(instanceId, val) {\n instances[instanceId].itemsPerPage = val;\n },\n\n getItemsPerPage : function(instanceId) {\n return instances[instanceId].itemsPerPage;\n },\n\n setCollectionLength : function(instanceId, val) {\n instances[instanceId].collectionLength = val;\n },\n\n getCollectionLength : function(instanceId) {\n return instances[instanceId].collectionLength;\n },\n\n setAsyncModeTrue : function(instanceId) {\n instances[instanceId].asyncMode = true;\n },\n\n setAsyncModeFalse : function(instanceId) {\n instances[instanceId].asyncMode = false;\n },\n\n isAsyncMode : function(instanceId) {\n return instances[instanceId].asyncMode;\n }\n };\n\n }\n\n angular.module('eHRD.kernel.uiElements.pagination')\n .factory('uiPaginationService', uiPaginationService);\n})();\n\n/**\n * Created by Bruce on 2016/6/27.\n */\n\n(function () {\n 'use strict';\n\n function paginationTemplateProvider() {\n var templatePath = 'default.pagination.template';\n var headerTemplatePath = 'default.pagination.template';\n var templateString;\n var headerTemplateString;\n\n /**\n * Set a templateUrl to be used by all instances of \n * @param {String} path\n */\n this.setPath = function(path) {\n templatePath = path;\n };\n\n this.setHeaderPath = function(path) {\n headerTemplatePath = path;\n };\n\n /**\n * Set a string of HTML to be used as a template by all instances\n * of . If both a path *and* a string have been set,\n * the string takes precedence.\n * @param {String} str\n */\n this.setString = function(str) {\n templateString = str;\n };\n this.setHeaderString = function(str) {\n headerTemplateString = str;\n };\n\n this.$get = function() {\n return {\n getPath: function() {\n return templatePath;\n },\n getString: function() {\n return templateString;\n },\n\n getHeaderPath: function() {\n return headerTemplatePath;\n },\n getHeaderString: function() {\n return headerTemplateString;\n }\n };\n };\n }\n\n angular.module('eHRD.kernel.uiElements.pagination')\n .provider('paginationTemplate', paginationTemplateProvider);\n})();\n\n/**\n * Created by Bruce on 2016/6/27.\n */\n(function() {\n 'use strict';\n\n itemsPerPageFilter.$inject = ['uiPaginationService', 'uiPaginationConfig'];\n\n function itemsPerPageFilter(uiPaginationService, uiPaginationConfig) {\n var DEFAULT_ID = uiPaginationConfig.DEFAULT_ID;\n\n return function(collection, itemsPerPage, paginationId) {\n if (angular.isUndefined(paginationId)) {\n paginationId = DEFAULT_ID;\n }\n if (!uiPaginationService.isRegistered(paginationId)) {\n throw 'pagination directive: the itemsPerPage id argument (id: ' + paginationId + ') does not match a registered pagination-id.';\n }\n var end;\n var start;\n if (angular.isObject(collection)) {\n itemsPerPage = parseInt(itemsPerPage) || 9999999999;\n if (uiPaginationService.isAsyncMode(paginationId)) {\n start = 0;\n } else {\n start = (uiPaginationService.getCurrentPage(paginationId) - 1) * itemsPerPage;\n }\n end = start + itemsPerPage;\n uiPaginationService.setItemsPerPage(paginationId, itemsPerPage);\n\n if (collection instanceof Array) {\n // the array just needs to be sliced\n return collection.slice(start, end);\n } else {\n // in the case of an object, we need to get an array of keys, slice that, then map back to\n // the original object.\n var slicedObject = {};\n angular.forEach(keys(collection).slice(start, end), function(key) {\n slicedObject[key] = collection[key];\n });\n return slicedObject;\n }\n } else {\n return collection;\n }\n };\n }\n\n /**\n * Shim for the Object.keys() method which does not exist in IE < 9\n * @param obj\n * @returns {Array}\n */\n function keys(obj) {\n if (!Object.keys) {\n var objKeys = [];\n for (var i in obj) {\n if (obj.hasOwnProperty(i)) {\n objKeys.push(i);\n }\n }\n return objKeys;\n } else {\n return Object.keys(obj);\n }\n }\n\n angular.module('eHRD.kernel.uiElements.pagination')\n .filter('itemsPerPage', itemsPerPageFilter);\n})();\n\n/**\n * Created by Bruce on 2016/6/27.\n */\n(function() {\n 'use strict';\n uiPaginationHeaderControls.$inject = ['uiPaginationService', 'paginationTemplate', 'uiPaginationConfig', '$filter'];\n\n function uiPaginationHeaderControls( uiPaginationService, paginationTemplate, uiPaginationConfig, $filter) {\n var DEFAULT_ID = uiPaginationConfig.DEFAULT_ID;\n var DDO = {\n restrict: 'AE',\n scope: {\n onSortChange: '&?',\n reloadPaginationData: '&?',\n paginationId: '=?',\n paginationSort: '=?',\n paginationFilter:'=?',\n sorts: '=?',\n filters:'=?',\n hasSearchBox: '=?',\n hasChangeTemplate: '=?',\n templateType:'@?',\n placeholder:'@?'\n },\n link: uiPaginationControlsLinkFn\n };\n\n // We need to check the paginationTemplate service to see whether a template path or\n // string has been specified, and add the `template` or `templateUrl` property to\n // the DDO as appropriate. The order of priority to decide which template to use is\n // (highest priority first):\n // 1. paginationTemplate.getHeaderString()\n // 2. attrs.templateUrl\n // 3. paginationTemplate.getPath()\n var templateString = paginationTemplate.getHeaderString();\n if (angular.isDefined(templateString)) {\n DDO.template = templateString;\n } else {\n DDO.templateUrl = function(elem, attrs) {\n return attrs.templateUrl || paginationTemplate.getHeaderPath();\n };\n }\n return DDO;\n\n\n function uiPaginationControlsLinkFn(scope, element, attrs) {\n\n // rawId is the un-interpolated value of the pagination-id attribute. This is only important when the corresponding ui-paginate directive has\n // not yet been linked (e.g. if it is inside an ng-if block), and in that case it prevents this controls directive from assuming that there is\n // no corresponding ui-paginate directive and wrongly throwing an exception.\n // var rawId = attrs.paginationId || DEFAULT_ID;\n var paginationId = scope.paginationId || attrs.paginationId || DEFAULT_ID;\n\n // if (!uiPaginationService.isRegistered(paginationId) && !uiPaginationService.isRegistered(rawId)) {\n //\n // }\n\n scope.autoHide = angular.isUndefined(scope.autoHide) ? true : scope.autoHide;\n scope.paginationSort = angular.isUndefined(scope.paginationSort) ? null : scope.paginationSort;\n scope.sorts = angular.isUndefined(scope.sorts) ? null : scope.sorts;\n scope.placeholder = angular.isUndefined(scope.placeholder) ? $filter('translate')('FIELD.SEARCH_THIS_AND_SUB_CATEGORIES') : scope.placeholder;\n\n scope.$watch('paginationSort', function(sortOption, oldVal) {\n if(!angular.equals(sortOption, oldVal)){\n uiPaginationService.setSortOption(paginationId, sortOption.sortKey, sortOption.sortMethod);\n }\n });\n\n scope.paginationFilter = angular.isUndefined(scope.paginationFilter) ? null : scope.paginationFilter;\n scope.filters = angular.isUndefined(scope.filters) ? null : scope.filters;\n\n scope.$watch('paginationFilter', function(filterOption, oldVal) {\n if(!angular.equals(filterOption, oldVal)){\n uiPaginationService.setFilterOption(paginationId, filterOption.filterKey, filterOption.filterValue);\n }\n });\n\n scope.hasSearchBox = angular.isUndefined(scope.hasSearchBox) ? false : scope.hasSearchBox;\n scope.hasChangeTemplate = angular.isUndefined(scope.hasChangeTemplate) ? false : scope.hasChangeTemplate;\n scope.templateType = angular.isUndefined(scope.templateType) ? 'list' : scope.templateType;\n\n scope.query = angular.isUndefined(scope.query) ? null : scope.query;\n\n var templateInit = function(type){\n if(element.parent().parent()[0].tagName === 'SECTION' && element.parent().parent()[0].id==='timeline' && element.parent().parent().hasClass('th-contentList')){\n switch(type){\n case 'card':\n element.parent().parent().addClass('th-card');\n break;\n default:\n element.parent().parent().removeClass('th-card');\n break;\n }\n }\n };\n // template Init\n templateInit(scope.templateType);\n\n /*\n *\n * */\n scope.templateChange = function (type) {\n scope.templateType = type;\n templateInit(type);\n };\n\n scope.search = function () {\n uiPaginationService.setSearchOption(paginationId, scope.query);\n var params = {\n keyword: (uiPaginationService.getSearchOption(paginationId) === null ? '': uiPaginationService.getSearchOption(paginationId).keywords),\n list_size: uiPaginationService.getItemsPerPage(paginationId)\n };\n if (scope.reloadPaginationData) {\n scope.reloadPaginationData({\n params: params\n });\n }\n };\n\n scope.setSort = function (val, order) {\n if (uiPaginationService.isRegistered(paginationId)) {\n if(angular.isUndefinedOrNull(order))\n order='ASC';\n var sortMethod = ((angular.equals(val, scope.paginationSort.sortKey) ? ((scope.paginationSort.sortMethod === 'DESC') ? 'ASC' : 'DESC') : order));\n uiPaginationService.setSortOption(paginationId, val, sortMethod);\n var params = {\n keyword: (uiPaginationService.getSearchOption(paginationId) === null ? '': uiPaginationService.getSearchOption(paginationId).keywords),\n current_page: uiPaginationService.getCurrentPage(paginationId),\n list_size: uiPaginationService.getItemsPerPage(paginationId)\n };\n\n if(angular.isDefined(uiPaginationService.getSortOption(paginationId)) ){\n params.sort = uiPaginationService.getSortOption(paginationId).key;\n params.order = uiPaginationService.getSortOption(paginationId).method;\n }\n if(angular.isDefined(uiPaginationService.getFilterOption(paginationId)) ){\n params.filter_key = uiPaginationService.getFilterOption(paginationId).filterKey;\n params.filter_value = uiPaginationService.getFilterOption(paginationId).filterValue;\n }\n\n if (scope.reloadPaginationData) {\n scope.reloadPaginationData({\n params: params\n });\n }\n }\n };\n\n scope.setFilter = function(key, value){\n if (uiPaginationService.isRegistered(paginationId)) {\n uiPaginationService.setFilterOption(paginationId, key, value);\n var params = {\n keyword: (uiPaginationService.getSearchOption(paginationId) === null ? '': uiPaginationService.getSearchOption(paginationId).keywords),\n filter_key: key,\n filter_value: value,\n list_size: uiPaginationService.getItemsPerPage(paginationId)\n };\n\n if (scope.reloadPaginationData) {\n scope.reloadPaginationData({\n params: params\n });\n }\n }\n };\n\n }\n }\n\n angular.module('eHRD.kernel.uiElements.pagination')\n .directive('uiPaginationHeaderControls', uiPaginationHeaderControls);\n})();\n\n/**\n * Created by Bruce on 2016/6/27.\n */\n(function() {\n 'use strict';\n uiPaginationControls.$inject = ['uiPaginationService', 'paginationTemplate', 'uiPaginationConfig'];\n\n function uiPaginationControls(uiPaginationService, paginationTemplate, uiPaginationConfig) {\n var DEFAULT_ID = uiPaginationConfig.DEFAULT_ID;\n var numberRegex = /^\\d+$/;\n\n var DDO = {\n restrict: 'AE',\n scope: {\n maxSize: '=?',\n onPageChange: '&?',\n paginationId: '=?',\n autoHide: '=?',\n canSelectOption: '=?',\n btnFinishFn: '&?btnFinishFn'\n },\n link: uiPaginationControlsLinkFn\n };\n\n // We need to check the paginationTemplate service to see whether a template path or\n // string has been specified, and add the `template` or `templateUrl` property to\n // the DDO as appropriate. The order of priority to decide which template to use is\n // (highest priority first):\n // 1. paginationTemplate.getString()\n // 2. attrs.templateUrl\n // 3. paginationTemplate.getPath()\n var templateString = paginationTemplate.getString();\n if (angular.isDefined(templateString)) {\n DDO.template = templateString;\n } else {\n DDO.templateUrl = function(elem, attrs) {\n return attrs.templateUrl || paginationTemplate.getPath();\n };\n }\n return DDO;\n\n\n function uiPaginationControlsLinkFn(scope, element, attrs) {\n\n // rawId is the un-interpolated value of the pagination-id attribute. This is only important when the corresponding ui-paginate directive has\n // not yet been linked (e.g. if it is inside an ng-if block), and in that case it prevents this controls directive from assuming that there is\n // no corresponding ui-paginate directive and wrongly throwing an exception.\n var rawId = attrs.paginationId || DEFAULT_ID;\n var paginationId = scope.paginationId || attrs.paginationId || DEFAULT_ID;\n\n if (!uiPaginationService.isRegistered(paginationId) && !uiPaginationService.isRegistered(rawId)) {\n // var idMessage = (paginationId !== DEFAULT_ID) ? ' (id: ' + paginationId + ') ' : ' ';\n // if (window.console) {\n // console.warn('Pagination directive: the pagination controls' + idMessage + 'cannot be used without the corresponding pagination directive, which was not found at link time.');\n // }\n }\n if (!scope.maxSize) {\n scope.maxSize = 9;\n }\n scope.autoHide = angular.isUndefined(scope.autoHide) ? true : scope.autoHide;\n scope.canSelectOption = angular.isUndefined(scope.canSelectOption) ? true : scope.canSelectOption;\n scope.directionLinks = angular.isDefined(attrs.directionLinks) ? scope.$parent.$eval(attrs.directionLinks) : true;\n scope.boundaryLinks = angular.isDefined(attrs.boundaryLinks) ? scope.$parent.$eval(attrs.boundaryLinks) : false;\n\n var paginationRange = Math.max(scope.maxSize, 5);\n\n scope.pages = [];\n scope.units= [\n {'id': 1, 'label': '1'},\n {'id': 5, 'label': '5'},\n {'id': 10, 'label': '10'},\n {'id': 15, 'label': '15'},\n {'id': 20, 'label': '20'},\n {'id': 30, 'label': '30'}\n ];\n scope.pagination = {\n last: 1,\n current: 1,\n perPage:String(scope.units[0].id)\n };\n scope.range = {\n lower: 1,\n upper: 1,\n total: 1\n };\n\n scope.$watch('maxSize', function(val) {\n if (val) {\n paginationRange = Math.max(scope.maxSize, 5);\n generatePagination();\n }\n });\n\n scope.$watch(function() {\n if (uiPaginationService.isRegistered(paginationId)) {\n return (uiPaginationService.getCollectionLength(paginationId) + 1) * uiPaginationService.getItemsPerPage(paginationId);\n }\n }, function(length) {\n if (0 < length) {\n generatePagination();\n }\n });\n\n scope.$watch(function() {\n if (uiPaginationService.isRegistered(paginationId)) {\n return (uiPaginationService.getItemsPerPage(paginationId));\n }\n }, function(current, previous) {\n if (current != previous && angular.isDefined(previous)) {\n goToPage(scope.pagination.current);\n }\n });\n\n scope.$watch(function() {\n if (uiPaginationService.isRegistered(paginationId)) {\n return uiPaginationService.getCurrentPage(paginationId);\n }\n }, function(currentPage, previousPage) {\n if (currentPage != previousPage && angular.isDefined(previousPage)) {\n goToPage(currentPage);\n }\n });\n\n scope.setCurrent = function(num) {\n if (uiPaginationService.isRegistered(paginationId) && isValidPageNumber(num)) {\n num = parseInt(num, 10);\n uiPaginationService.setCurrentPage(paginationId, num);\n }\n };\n\n scope.setItemsPerPage = function (val) {\n if (uiPaginationService.isRegistered(paginationId)) {\n uiPaginationService.setItemsPerPage(paginationId, val);\n var currentPage = uiPaginationService.getCurrentPage(paginationId);\n var maxPage = (scope.pagination.total%val === 0)?scope.pagination.total/val:(scope.pagination.total/val + 1);\n var params = {\n keyword:(uiPaginationService.getSearchOption(paginationId) === null ? '': uiPaginationService.getSearchOption(paginationId).keywords),\n current_page:( maxPage >= currentPage)?currentPage:1,\n list_size:val\n };\n\n if(angular.isDefined(uiPaginationService.getSortOption(paginationId)) ){\n params.sort = uiPaginationService.getSortOption(paginationId).key;\n params.order = uiPaginationService.getSortOption(paginationId).method;\n }\n if(angular.isDefined(uiPaginationService.getFilterOption(paginationId)) ){\n params.filter_key = uiPaginationService.getFilterOption(paginationId).filterKey;\n params.filter_value = uiPaginationService.getFilterOption(paginationId).filterValue;\n }\n if (scope.onPageChange) {\n scope.onPageChange({\n params: params\n });\n }\n }\n };\n\n\n\n /**\n * Custom \"track by\" function which allows for duplicate \"...\" entries on long lists,\n * yet fixes the problem of wrongly-highlighted links which happens when using\n * \"track by $index\" - see https://github.com/michaelbromley/angularUtils/issues/153\n * @param id\n * @param index\n * @returns {string}\n */\n scope.tracker = function(id, index) {\n return id + '_' + index;\n };\n\n function goToPage(num) {\n if (uiPaginationService.isRegistered(paginationId) && isValidPageNumber(num)) {\n // var oldPageNumber = scope.pagination.current;\n\n scope.pages = generatePagesArray(num, uiPaginationService.getCollectionLength(paginationId), uiPaginationService.getItemsPerPage(paginationId), paginationRange);\n scope.pagination.current = num;\n\n updateRangeValues();\n // if a callback has been set, then call it with the page number as the first argument\n // and the previous page number as a second argument\n var params = {\n keyword:(uiPaginationService.getSearchOption(paginationId) === null ? '': uiPaginationService.getSearchOption(paginationId).keywords),\n current_page: num,\n list_size: uiPaginationService.getItemsPerPage(paginationId)\n };\n\n if(angular.isDefined(uiPaginationService.getSortOption(paginationId)) ){\n params.sort = uiPaginationService.getSortOption(paginationId).key;\n params.order = uiPaginationService.getSortOption(paginationId).method;\n }\n if(angular.isDefined(uiPaginationService.getFilterOption(paginationId)) ){\n params.filter_key = uiPaginationService.getFilterOption(paginationId).filterKey;\n params.filter_value = uiPaginationService.getFilterOption(paginationId).filterValue;\n }\n\n // console.log(params)\n if (scope.onPageChange) {\n scope.onPageChange({\n params: params\n });\n }\n }\n }\n\n function generatePagination() {\n if (uiPaginationService.isRegistered(paginationId)) {\n var page = parseInt(uiPaginationService.getCurrentPage(paginationId)) || 1;\n scope.pages = generatePagesArray(page, uiPaginationService.getCollectionLength(paginationId), uiPaginationService.getItemsPerPage(paginationId), paginationRange);\n scope.pagination.current = page;\n scope.pagination.last = scope.pages[scope.pages.length - 1];\n scope.pagination.total = uiPaginationService.getCollectionLength(paginationId);\n\n // Set Defaulat pagination perPage Value\n if(angular.isDefined(uiPaginationService.getItemsPerPage(paginationId))){\n scope.pagination.perPage = String(uiPaginationService.getItemsPerPage(paginationId));\n }\n\n if(angular.isDefined(uiPaginationService.getFilterOption(paginationId))){\n scope.pagination.filters = uiPaginationService.getFilterOption(paginationId);\n }\n\n if (scope.pagination.last < scope.pagination.current) {\n scope.setCurrent(scope.pagination.last);\n } else {\n updateRangeValues();\n }\n }\n }\n\n /**\n * This function updates the values (lower, upper, total) of the `scope.range` object, which can be used in the pagination\n * template to display the current page range, e.g. \"showing 21 - 40 of 144 results\";\n */\n function updateRangeValues() {\n if (uiPaginationService.isRegistered(paginationId)) {\n var currentPage = uiPaginationService.getCurrentPage(paginationId),\n itemsPerPage = uiPaginationService.getItemsPerPage(paginationId),\n totalItems = uiPaginationService.getCollectionLength(paginationId);\n\n scope.range.lower = (currentPage - 1) * itemsPerPage + 1;\n scope.range.upper = Math.min(currentPage * itemsPerPage, totalItems);\n scope.range.total = totalItems;\n }\n }\n\n function isValidPageNumber(num) {\n return (numberRegex.test(num) && (0 < num && num <= scope.pagination.last));\n }\n }\n\n /**\n * Generate an array of page numbers (or the '...' string) which is used in an ng-repeat to generate the\n * links used in pagination\n *\n * @param currentPage\n * @param rowsPerPage\n * @param paginationRange\n * @param collectionLength\n * @returns {Array}\n */\n function generatePagesArray(currentPage, collectionLength, rowsPerPage, paginationRange) {\n var pages = [];\n var totalPages = Math.ceil(collectionLength / rowsPerPage);\n var halfWay = Math.ceil(paginationRange / 2);\n var position;\n\n if (currentPage <= halfWay) {\n position = 'start';\n } else if (totalPages - halfWay < currentPage) {\n position = 'end';\n } else {\n position = 'middle';\n }\n\n var ellipsesNeeded = paginationRange < totalPages;\n var i = 1;\n while (i <= totalPages && i <= paginationRange) {\n var pageNumber = calculatePageNumber(i, currentPage, paginationRange, totalPages);\n\n var openingEllipsesNeeded = (i === 2 && (position === 'middle' || position === 'end'));\n var closingEllipsesNeeded = (i === paginationRange - 1 && (position === 'middle' || position === 'start'));\n if (ellipsesNeeded && (openingEllipsesNeeded || closingEllipsesNeeded)) {\n pages.push('...');\n } else {\n pages.push(pageNumber);\n }\n i++;\n }\n return pages;\n }\n\n /**\n * Given the position in the sequence of pagination links [i], figure out what page number corresponds to that position.\n *\n * @param i\n * @param currentPage\n * @param paginationRange\n * @param totalPages\n * @returns {*}\n */\n function calculatePageNumber(i, currentPage, paginationRange, totalPages) {\n var halfWay = Math.ceil(paginationRange / 2);\n if (i === paginationRange) {\n return totalPages;\n } else if (i === 1) {\n return i;\n } else if (paginationRange < totalPages) {\n if (totalPages - halfWay < currentPage) {\n return totalPages - paginationRange + i;\n } else if (halfWay < currentPage) {\n return currentPage - halfWay + i;\n } else {\n return i;\n }\n } else {\n return i;\n }\n }\n\n }\n\n angular.module('eHRD.kernel.uiElements.pagination')\n .directive('uiPaginationControls', uiPaginationControls);\n})();\n\n/**\n * Created by Bruce on 2016/6/27.\n */\n(function() {\n 'use strict';\n\n uiPaginate.$inject = ['$compile', '$parse', 'uiPaginationService', 'uiPaginationConfig'];\n\n\n function uiPaginate($compile, $parse, uiPaginationService, uiPaginationConfig) {\n var DEFAULT_ID = uiPaginationConfig.DEFAULT_ID;\n return {\n terminal: true,\n multiElement: true,\n priority: 100,\n compile: uiPaginationCompileFn\n };\n\n function uiPaginationCompileFn(tElement, tAttrs) {\n // tElement.addClass('card');\n var expression = tAttrs.uiPaginate;\n // regex taken directly from https://github.com/angular/angular.js/blob/v1.4.x/src/ng/directive/ngRepeat.js#L339\n var match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);\n\n var filterPattern = /\\|\\s*itemsPerPage\\s*:\\s*(.*\\(\\s*\\w*\\)|([^\\)]*?(?=\\s+as\\s+))|[^\\)]*)/;\n if (match[2].match(filterPattern) === null) {\n throw 'pagination directive: the \\'itemsPerPage\\' filter must be set.';\n }\n var itemsPerPageFilterRemoved = match[2].replace(filterPattern, '');\n var collectionGetter = $parse(itemsPerPageFilterRemoved);\n\n addNoCompileAttributes(tElement);\n\n // If any value is specified for paginationId, we register the un-evaluated expression at this stage for the benefit of any\n // ui-pagination-controls directives that may be looking for this ID.\n var rawId = tAttrs.paginationId || DEFAULT_ID;\n uiPaginationService.registerInstance(rawId);\n\n return uiPaginationLinkFn;\n\n\n function uiPaginationLinkFn(scope, element, attrs) {\n // Now that we have access to the `scope` we can interpolate any expression given in the paginationId attribute and\n // potentially register a new ID if it evaluates to a different value than the rawId.\n var paginationId = $parse(attrs.paginationId)(scope) || attrs.paginationId || DEFAULT_ID;\n\n // (TODO: this seems sound, but I'm reverting as many bug reports followed it's introduction in 0.11.0.\n // Needs more investigation.)\n // In case rawId != paginationId we deregister using rawId for the sake of general cleanliness\n // before registering using paginationId\n // uiPaginationService.deregisterInstance(rawId);\n uiPaginationService.registerInstance(paginationId);\n uiPaginationService.setSearchOption(paginationId, null);\n var repeatExpression = getRepeatExpression(expression, paginationId);\n addNgRepeatToElement(element, attrs, repeatExpression);\n\n removeTemporaryAttributes(element)\n\n var compiled = $compile(element);\n\n var currentPageGetter = makeCurrentPageGetterFn(scope, attrs, paginationId);\n var filterOptionGetter = makeFilterOptionGetterFn(scope, attrs, paginationId);\n\n uiPaginationService.setCurrentPageParser(paginationId, currentPageGetter, scope);\n uiPaginationService.setFilterOptionParser(paginationId, filterOptionGetter, scope);\n\n if (angular.isDefined(attrs.totalItems)) {\n uiPaginationService.setAsyncModeTrue(paginationId);\n scope.$watch(function() {\n return $parse(attrs.totalItems)(scope);\n }, function(result) {\n if (0 <= result) {\n uiPaginationService.setCollectionLength(paginationId, result);\n }\n });\n } else {\n uiPaginationService.setAsyncModeFalse(paginationId);\n scope.$watchCollection(function() {\n return collectionGetter(scope);\n }, function(collection) {\n if (collection) {\n var collectionLength = (collection instanceof Array) ? collection.length : Object.keys(collection).length;\n uiPaginationService.setCollectionLength(paginationId, collectionLength);\n }\n });\n }\n\n // Delegate to the link function returned by the new compilation of the ng-repeat\n compiled(scope);\n\n // (TODO: Reverting this due to many bug reports in v 0.11.0. Needs investigation as the\n // principle is sound)\n // When the scope is destroyed, we make sure to remove the reference to it in uiPaginationService\n // so that it can be properly garbage collected\n // scope.$on('$destroy', function destroyDirPagination() {\n // uiPaginationService.deregisterInstance(paginationId);\n // });\n }\n\n }\n\n\n\n /**\n * If a pagination id has been specified, we need to check that it is present as the second argument passed to\n * the itemsPerPage filter. If it is not there, we add it and return the modified expression.\n *\n * @param expression\n * @param paginationId\n * @returns {*}\n */\n function getRepeatExpression(expression, paginationId) {\n var repeatExpression,\n idDefinedInFilter = !!expression.match(/(\\|\\s*itemsPerPage\\s*:[^|]*:[^|]*)/);\n\n if (paginationId !== DEFAULT_ID && !idDefinedInFilter) {\n repeatExpression = expression.replace(/(\\|\\s*itemsPerPage\\s*:\\s*[^|\\s]*)/, \"$1 : '\" + paginationId + \"'\");\n } else {\n repeatExpression = expression;\n }\n\n return repeatExpression;\n }\n\n /**\n * Adds the ng-repeat directive to the element. In the case of multi-element (-start, -end) it adds the\n * appropriate multi-element ng-repeat to the first and last element in the range.\n * @param element\n * @param attrs\n * @param repeatExpression\n */\n function addNgRepeatToElement(element, attrs, repeatExpression) {\n if (element[0].hasAttribute('ui-paginate-start') || element[0].hasAttribute('data-ui-paginate-start')) {\n // using multiElement mode (ui-paginate-start, ui-paginate-end)\n attrs.$set('ngRepeatStart', repeatExpression);\n element.eq(element.length - 1).attr('ng-repeat-end', true);\n } else {\n attrs.$set('ngRepeat', repeatExpression);\n }\n }\n\n /**\n * Adds the ui-paginate-no-compile directive to each element in the tElement range.\n * @param tElement\n */\n function addNoCompileAttributes(tElement) {\n angular.forEach(tElement, function(el) {\n if (el.nodeType === 1) {\n angular.element(el).attr('ui-paginate-no-compile', true);\n }\n });\n }\n\n /**\n * Removes the variations on ui-paginate (data-, -start, -end) and the ui-paginate-no-compile directives.\n * @param element\n */\n function removeTemporaryAttributes(element) {\n angular.forEach(element, function(el) {\n if (el.nodeType === 1) {\n angular.element(el).removeAttr('ui-paginate-no-compile');\n }\n });\n element.eq(0).removeAttr('ui-paginate-start').removeAttr('ui-paginate').removeAttr('data-ui-paginate-start').removeAttr('data-ui-paginate');\n element.eq(element.length - 1).removeAttr('ui-paginate-end').removeAttr('data-ui-paginate-end');\n }\n\n /**\n * Creates a getter function for the current-page attribute, using the expression provided or a default value if\n * no current-page expression was specified.\n *\n * @param scope\n * @param attrs\n * @param paginationId\n * @returns {*}\n */\n function makeCurrentPageGetterFn(scope, attrs, paginationId) {\n var currentPageGetter;\n if (attrs.currentPage) {\n currentPageGetter = $parse(attrs.currentPage);\n } else {\n // If the current-page attribute was not set, we'll make our own.\n // Replace any non-alphanumeric characters which might confuse\n // the $parse service and give unexpected results.\n // See https://github.com/michaelbromley/angularUtils/issues/233\n var defaultCurrentPage = (paginationId + '__currentPage').replace(/\\W/g, '_');\n scope[defaultCurrentPage] = 1;\n currentPageGetter = $parse(defaultCurrentPage);\n }\n return currentPageGetter;\n }\n\n function makeFilterOptionGetterFn(scope, attrs, paginationId) {\n var filterOptionGetter;\n if (attrs.filterOption) {\n filterOptionGetter = $parse(attrs.filterOption);\n } else {\n var defaultFilterOption = (paginationId + '__filterOption').replace(/\\W/g, '_');\n scope[defaultFilterOption] = {};\n filterOptionGetter = $parse(defaultFilterOption);\n }\n return filterOptionGetter;\n\n }\n\n }\n\n angular.module('eHRD.kernel.uiElements.pagination')\n .directive('uiPaginate', uiPaginate);\n})();\n\n/**\n * Created by Bruce on 2016/6/27.\n */\n\n(function () {\n 'use strict';\n function uiPaginateNoCompile() {\n return {\n priority: 5000,\n terminal: true\n };\n }\n\n angular.module('eHRD.kernel.uiElements.pagination')\n .directive('uiPaginateNoCompile', uiPaginateNoCompile);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n \"use strict\";\n\n angular.module(\"mdPickers\", [\n \"ngMaterial\",\n \"ngAnimate\",\n \"ngAria\"\n ]);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n function mdpTimePickerProvider() {\n var LABEL_OK = \"OK\",\n LABEL_CANCEL = \"Cancel\";\n\n this.setOKButtonLabel = function(label) {\n LABEL_OK = label;\n };\n\n this.setCancelButtonLabel = function(label) {\n LABEL_CANCEL = label;\n };\n\n mdpTimePicker.$inject = ['$mdDialog'];\n\n function mdpTimePicker($mdDialog) {\n var timePicker = function(time, options) {\n if (!angular.isDate(time)) time = Date.now();\n if (!angular.isObject(options)) options = {};\n\n return $mdDialog.show({\n controller: 'TimePickerController',\n controllerAs: 'timepicker',\n clickOutsideToClose: true,\n template: '' +\n '' +\n '' +\n '
' +\n '{{ timepicker.time.format(\"h\") }}:' +\n '{{ timepicker.time.format(\"mm\") }}' +\n '
' +\n '
' +\n 'AM' +\n '= 12 }\">PM' +\n '
' +\n '
' +\n '
' +\n '
' +\n '' +\n '' +\n '
' +\n\n '' +\n '' +\n '' + LABEL_CANCEL + '' +\n '' + LABEL_OK + '' +\n '' +\n '
' +\n '
' +\n '
',\n targetEvent: options.targetEvent,\n locals: {\n time: time,\n autoSwitch: options.autoSwitch\n },\n multiple: true\n });\n };\n\n return timePicker;\n }\n\n this.$get = mdpTimePicker;\n }\n angular.module('mdPickers')\n .provider('$mdpTimePicker', mdpTimePickerProvider);\n\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n function mdpDatePickerProvider() {\n var LABEL_OK = \"OK\",\n LABEL_CANCEL = \"Cancel\",\n DISPLAY_FORMAT = \"ddd, MMM DD\";\n\n this.setDisplayFormat = function(format) {\n DISPLAY_FORMAT = format;\n };\n\n this.setOKButtonLabel = function(label) {\n LABEL_OK = label;\n };\n\n this.setCancelButtonLabel = function(label) {\n LABEL_CANCEL = label;\n };\n\n\n mdpDatePicker.$inject = ['$mdDialog'];\n\n function mdpDatePicker($mdDialog) {\n var datePicker = function(currentDate, options) {\n if (!angular.isDate(currentDate)) currentDate = Date.now();\n if (!angular.isObject(options)) options = {};\n\n options.displayFormat = DISPLAY_FORMAT;\n\n return $mdDialog.show({\n controller: 'DatePickerController',\n controllerAs: 'datepicker',\n clickOutsideToClose: true,\n template: '' +\n '' +\n '
' +\n '' +\n '{{ datepicker.date.format(\\'YYYY\\') }}' +\n '{{ datepicker.date.format(datepicker.displayFormat) }} ' +\n '' +\n '
' +\n '
' +\n '
' +\n '' +\n '
' +\n '{{ item }}' +\n '
' +\n '
' +\n '
' +\n '' +\n '' +\n '' +\n '' + LABEL_CANCEL + '' +\n '' + LABEL_OK + '' +\n '' +\n '
' +\n '
' +\n '
',\n targetEvent: options.targetEvent,\n locals: {\n currentDate: currentDate,\n options: options\n },\n multiple: true\n });\n };\n\n return datePicker;\n }\n\n this.$get = mdpDatePicker;\n }\n angular.module('mdPickers')\n .provider('$mdpDatePicker', mdpDatePickerProvider);\n\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n ngMessage.$inject = ['$mdUtil'];\n\n function ngMessage($mdUtil) {\n var directive = {\n restrict: \"EA\",\n priority: 101,\n compile: function(element) {\n var inputContainer = $mdUtil.getClosest(element, \"mdp-time-picker\", true) ||\n $mdUtil.getClosest(element, \"mdp-date-picker\", true);\n\n // If we are not a child of an input container, don't do anything\n if (!inputContainer) return;\n\n // Add our animation class\n element.toggleClass('md-input-message-animation', true);\n\n return {};\n }\n };\n\n return directive;\n }\n angular.module('mdPickers')\n .directive('ngMessage', ngMessage);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n mdpTimePicker1.$inject = [\"$mdpTimePicker\" /*, \"$timeout\"*/ ];\n\n function mdpTimePicker1($mdpTimePicker /*, $timeout*/ ) {\n function link(scope, element, attrs, ngModel, $transclude) {\n var inputElement = angular.element(element[0].querySelector('input')),\n inputContainer = angular.element(element[0].querySelector('md-input-container')),\n inputContainerCtrl = inputContainer.controller(\"mdInputContainer\");\n\n $transclude(function(clone) {\n inputContainer.append(clone);\n });\n\n var messages = angular.element(inputContainer[0].querySelector(\"[ng-messages]\"));\n\n scope.type = scope.timeFormat ? \"text\" : \"time\"\n scope.timeFormat = scope.timeFormat || \"HH:mm\";\n scope.autoSwitch = scope.autoSwitch || false;\n\n scope.$watch(function() {\n return ngModel.$error\n }, function( /*newValue, oldValue*/ ) {\n inputContainerCtrl.setInvalid(!ngModel.$pristine && !!Object.keys(ngModel.$error).length);\n }, true);\n\n // update input element if model has changed\n ngModel.$formatters.unshift(function(value) {\n var time = angular.isDate(value) && moment(value);\n if (time && time.isValid())\n updateInputElement(time.format(scope.timeFormat));\n else\n updateInputElement(null);\n });\n\n ngModel.$validators.format = function(modelValue, viewValue) {\n return !viewValue || angular.isDate(viewValue) || moment(viewValue, scope.timeFormat, true).isValid();\n };\n\n ngModel.$validators.required = function(modelValue, viewValue) {\n return angular.isUndefined(attrs.required) || !ngModel.$isEmpty(modelValue) || !ngModel.$isEmpty(viewValue);\n };\n\n ngModel.$parsers.unshift(function(value) {\n var parsed = moment(value, scope.timeFormat, true);\n if (parsed.isValid()) {\n if (angular.isDate(ngModel.$modelValue)) {\n var originalModel = moment(ngModel.$modelValue);\n originalModel.minutes(parsed.minutes());\n originalModel.hours(parsed.hours());\n originalModel.seconds(parsed.seconds());\n\n parsed = originalModel;\n }\n return parsed.toDate();\n } else\n return null;\n });\n\n // update input element value\n function updateInputElement(value) {\n inputElement[0].value = value;\n inputContainerCtrl.setHasValue(!ngModel.$isEmpty(value));\n }\n\n function updateTime(time) {\n var value = moment(time, angular.isDate(time) ? null : scope.timeFormat, true),\n strValue = value.format(scope.timeFormat);\n\n if (value.isValid()) {\n updateInputElement(strValue);\n ngModel.$setViewValue(strValue);\n } else {\n updateInputElement(time);\n ngModel.$setViewValue(time);\n }\n\n if (!ngModel.$pristine &&\n messages.hasClass(\"md-auto-hide\") &&\n inputContainer.hasClass(\"md-input-invalid\")) messages.removeClass(\"md-auto-hide\");\n\n ngModel.$render();\n }\n\n scope.showPicker = function(ev) {\n $mdpTimePicker(ngModel.$modelValue, {\n targetEvent: ev,\n autoSwitch: scope.autoSwitch\n }).then(function(time) {\n updateTime(time, true);\n });\n };\n\n function onInputElementEvents(event) {\n if (event.target.value !== ngModel.$viewVaue)\n updateTime(event.target.value);\n }\n\n inputElement.on(\"reset input blur\", onInputElementEvents);\n\n scope.$on(\"$destroy\", function() {\n inputElement.off(\"reset input blur\", onInputElementEvents);\n })\n }\n var directive = {\n restrict: 'E',\n require: 'ngModel',\n transclude: true,\n template: function(element, attrs) {\n var noFloat = angular.isDefined(attrs.mdpNoFloat),\n placeholder = angular.isDefined(attrs.mdpPlaceholder) ? attrs.mdpPlaceholder : \"\",\n openOnClick = angular.isDefined(attrs.mdpOpenOnClick) ? true : false;\n\n return '
' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
';\n },\n scope: {\n \"timeFormat\": \"@mdpFormat\",\n \"placeholder\": \"@mdpPlaceholder\",\n \"autoSwitch\": \"=?mdpAutoSwitch\",\n \"disabled\": \"=?mdpDisabled\"\n },\n link: link\n };\n return directive;\n }\n\n\n mdpTimePicker2.$inject = [\"$mdpTimePicker\" /*, \"$timeout\"*/ ];\n\n function mdpTimePicker2($mdpTimePicker /*, $timeout*/ ) {\n function link(scope, element, attrs, ngModel /*, $transclude*/ ) {\n scope.format = scope.format || \"HH:mm\";\n\n function showPicker(ev) {\n $mdpTimePicker(ngModel.$modelValue, {\n targetEvent: ev,\n autoSwitch: scope.autoSwitch\n }).then(function(time) {\n ngModel.$setViewValue(moment(time).format(scope.format));\n ngModel.$render();\n });\n }\n\n element.on(\"click\", showPicker);\n\n scope.$on(\"$destroy\", function() {\n element.off(\"click\", showPicker);\n });\n }\n var directive = {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n \"timeFormat\": \"@mdpFormat\",\n \"autoSwitch\": \"=?mdpAutoSwitch\"\n },\n link: link\n };\n return directive;\n }\n\n angular.module('mdPickers')\n .directive('mdpTimePicker', mdpTimePicker1)\n .directive('mdpTimePicker', mdpTimePicker2);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n function formatValidator(value, format) {\n return !value || angular.isDate(value) || moment(value, format, true).isValid();\n }\n\n function minDateValidator(value, format, _minDate) {\n var minDate = moment(_minDate, \"YYYY-MM-DD\", true);\n var date = angular.isDate(value) ? moment(value) : moment(value, format, true);\n\n return !value ||\n angular.isDate(value) ||\n !minDate.isValid() ||\n date.isSameOrAfter(minDate);\n }\n\n function maxDateValidator(value, format, _maxDate) {\n var maxDate = moment(_maxDate, \"YYYY-MM-DD\", true);\n var date = angular.isDate(value) ? moment(value) : moment(value, format, true);\n\n return !value ||\n angular.isDate(value) ||\n !maxDate.isValid() ||\n date.isSameOrBefore(maxDate);\n }\n\n function filterValidator(value, format, filter) {\n var date = angular.isDate(value) ? moment(value) : moment(value, format, true);\n\n return !value ||\n angular.isDate(value) ||\n !angular.isFunction(filter) ||\n !filter(date);\n }\n\n // function requiredValidator(value, ngModel) {\n // return value\n // }\n\n mdpDatePicker1.$inject = [\"$mdpDatePicker\" /*, \"$timeout\"*/ ];\n\n function mdpDatePicker1($mdpDatePicker /*, $timeout*/ ) {\n\n var directive = {\n restrict: 'E',\n require: 'ngModel',\n transclude: true,\n template: function(element, attrs) {\n var noFloat = angular.isDefined(attrs.mdpNoFloat),\n placeholder = angular.isDefined(attrs.mdpPlaceholder) ? attrs.mdpPlaceholder : \"\",\n openOnClick = angular.isDefined(attrs.mdpOpenOnClick) ? true : false;\n\n return '
' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
';\n },\n scope: {\n \"minDate\": \"=mdpMinDate\",\n \"maxDate\": \"=mdpMaxDate\",\n \"dateFilter\": \"=mdpDateFilter\",\n \"dateFormat\": \"@mdpFormat\",\n \"placeholder\": \"@mdpPlaceholder\",\n \"noFloat\": \"=mdpNoFloat\",\n \"openOnClick\": \"=mdpOpenOnClick\",\n \"disabled\": \"=?mdpDisabled\"\n },\n link: {\n pre: function( /*scope, element, attrs, ngModel, $transclude*/ ) {\n\n },\n post: function(scope, element, attrs, ngModel, $transclude) {\n var inputElement = angular.element(element[0].querySelector('input')),\n inputContainer = angular.element(element[0].querySelector('md-input-container')),\n inputContainerCtrl = inputContainer.controller(\"mdInputContainer\");\n\n $transclude(function(clone) {\n inputContainer.append(clone);\n });\n\n var messages = angular.element(inputContainer[0].querySelector(\"[ng-messages]\"));\n\n scope.type = scope.dateFormat ? \"text\" : \"date\"\n scope.dateFormat = scope.dateFormat || \"YYYY-MM-DD\";\n scope.model = ngModel;\n\n scope.isError = function() {\n return !ngModel.$pristine && !!ngModel.$invalid;\n };\n\n // update input element if model has changed\n ngModel.$formatters.unshift(function(value) {\n var date = angular.isDate(value) && moment(value);\n if (date && date.isValid())\n updateInputElement(date.format(scope.dateFormat));\n else\n updateInputElement(null);\n });\n\n ngModel.$validators.format = function(modelValue, viewValue) {\n return formatValidator(viewValue, scope.dateFormat);\n };\n\n ngModel.$validators.minDate = function(modelValue, viewValue) {\n return minDateValidator(viewValue, scope.dateFormat, scope.minDate);\n };\n\n ngModel.$validators.maxDate = function(modelValue, viewValue) {\n return maxDateValidator(viewValue, scope.dateFormat, scope.maxDate);\n };\n\n ngModel.$validators.filter = function(modelValue, viewValue) {\n return filterValidator(viewValue, scope.dateFormat, scope.dateFilter);\n };\n\n ngModel.$validators.required = function(modelValue, viewValue) {\n return angular.isUndefined(attrs.required) || !ngModel.$isEmpty(modelValue) || !ngModel.$isEmpty(viewValue);\n };\n\n ngModel.$parsers.unshift(function(value) {\n var parsed = moment(value, scope.dateFormat, true);\n if (parsed.isValid()) {\n if (angular.isDate(ngModel.$modelValue)) {\n var originalModel = moment(ngModel.$modelValue);\n originalModel.year(parsed.year());\n originalModel.month(parsed.month());\n originalModel.date(parsed.date());\n\n parsed = originalModel;\n }\n return parsed.toDate();\n } else\n return null;\n });\n\n // update input element value\n function updateInputElement(value) {\n inputElement[0].value = value;\n inputContainerCtrl.setHasValue(!ngModel.$isEmpty(value));\n }\n\n function updateDate(date) {\n var value = moment(date, angular.isDate(date) ? null : scope.dateFormat, true),\n strValue = value.format(scope.dateFormat);\n\n if (value.isValid()) {\n updateInputElement(strValue);\n ngModel.$setViewValue(strValue);\n } else {\n updateInputElement(date);\n ngModel.$setViewValue(date);\n }\n\n if (!ngModel.$pristine &&\n messages.hasClass(\"md-auto-hide\") &&\n inputContainer.hasClass(\"md-input-invalid\")) messages.removeClass(\"md-auto-hide\");\n\n ngModel.$render();\n }\n\n scope.showPicker = function(ev) {\n $mdpDatePicker(ngModel.$modelValue, {\n minDate: scope.minDate,\n maxDate: scope.maxDate,\n dateFilter: scope.dateFilter,\n targetEvent: ev\n }).then(updateDate);\n };\n\n function onInputElementEvents(event) {\n if (event.target.value !== ngModel.$viewVaue)\n updateDate(event.target.value);\n }\n\n inputElement.on(\"reset input blur\", onInputElementEvents);\n\n scope.$on(\"$destroy\", function() {\n inputElement.off(\"reset input blur\", onInputElementEvents);\n });\n }\n }\n };\n\n return directive;\n }\n\n mdpDatePicker2.$inject = [\"$mdpDatePicker\" /*, \"$timeout\"*/ ];\n\n function mdpDatePicker2($mdpDatePicker /*, $timeout*/ ) {\n function link(scope, element, attrs, ngModel /*, $transclude*/ ) {\n scope.dateFormat = scope.dateFormat || \"YYYY-MM-DD\";\n\n ngModel.$validators.format = function(modelValue, viewValue) {\n return formatValidator(viewValue, scope.format);\n };\n\n ngModel.$validators.minDate = function(modelValue, viewValue) {\n return minDateValidator(viewValue, scope.format, scope.minDate);\n };\n\n ngModel.$validators.maxDate = function(modelValue, viewValue) {\n return maxDateValidator(viewValue, scope.format, scope.maxDate);\n };\n\n ngModel.$validators.filter = function(modelValue, viewValue) {\n return filterValidator(viewValue, scope.format, scope.dateFilter);\n };\n\n function showPicker(ev) {\n $mdpDatePicker(ngModel.$modelValue, {\n minDate: scope.minDate,\n maxDate: scope.maxDate,\n dateFilter: scope.dateFilter,\n targetEvent: ev\n }).then(function(time) {\n ngModel.$setViewValue(moment(time).format(scope.format));\n ngModel.$render();\n });\n }\n\n element.on(\"click\", showPicker);\n\n scope.$on(\"$destroy\", function() {\n element.off(\"click\", showPicker);\n });\n }\n\n var directive = {\n restrict: 'A',\n require: 'ngModel',\n scope: {\n \"minDate\": \"@min\",\n \"maxDate\": \"@max\",\n \"dateFilter\": \"=mdpDateFilter\",\n \"dateFormat\": \"@mdpFormat\"\n },\n link: link\n };\n return directive;\n }\n angular.module('mdPickers')\n .directive('mdpDatePicker', mdpDatePicker1)\n .directive('mdpDatePicker', mdpDatePicker2);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n mdpClock.$inject = [\"$animate\", \"$timeout\"];\n\n function mdpClock($animate, $timeout) {\n\n function link(scope, element/*, attrs, ctrl*/) {\n // var pointer = angular.element(element[0].querySelector(\".mdp-pointer\"));\n // var timepickerCtrl = scope.$parent.timepicker;\n\n var onEvent = function(/*event*/) {\n // var containerCoords = event.currentTarget.getClientRects()[0];\n // var x = ((event.currentTarget.offsetWidth / 2) - (event.pageX - containerCoords.left)),\n // y = ((event.pageY - containerCoords.top) - (event.currentTarget.offsetHeight / 2));\n\n // var deg = Math.round((Math.atan2(x, y) * (180 / Math.PI)));\n $timeout(function() {\n // ctrl.setTimeByDeg(deg + 180);\n // if (ctrl.autoSwitch && [\"mouseup\", \"click\"].indexOf(event.type) !== -1 && timepickerCtrl) timepickerCtrl.switchView();\n });\n };\n\n element.on(\"mousedown\", function() {\n element.on(\"mousemove\", onEvent);\n });\n\n element.on(\"mouseup\", function( /*e*/ ) {\n element.off(\"mousemove\");\n });\n\n element.on(\"click\", onEvent);\n scope.$on(\"$destroy\", function() {\n element.off(\"click\", onEvent);\n element.off(\"mousemove\", onEvent);\n });\n }\n var directive = {\n restrict: 'E',\n bindToController: {\n 'type': '@?',\n 'time': '=',\n 'autoSwitch': '=?'\n },\n replace: true,\n template: '
' +\n '
' +\n '' +\n '' +\n '' +\n '' +\n '{{ step }}' +\n '
' +\n '
',\n controller: 'ClockController',\n controllerAs: \"clock\",\n link: link\n };\n\n return directive;\n }\n angular.module('mdPickers')\n .directive('mdpClock', mdpClock);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n mdpCalendar.$inject = ['$animate'];\n\n function mdpCalendar($animate) {\n function link(scope, element, attrs, ctrl) {\n var animElements = [\n element[0].querySelector(\".mdp-calendar-week-days\"),\n element[0].querySelector('.mdp-calendar-days'),\n element[0].querySelector('.mdp-calendar-monthyear')\n ].map(function(a) {\n return angular.element(a);\n });\n\n scope.$watch(function() {\n return ctrl.date.format(\"YYYYMM\")\n }, function(newValue, oldValue) {\n var direction = null;\n\n if (newValue > oldValue)\n direction = \"mdp-animate-next\";\n else if (newValue < oldValue)\n direction = \"mdp-animate-prev\";\n\n if (direction) {\n for (var i in animElements) {\n animElements[i].addClass(direction);\n $animate.removeClass(animElements[i], direction);\n }\n }\n });\n }\n\n var directive = {\n restrict: 'E',\n bindToController: {\n \"date\": \"=\",\n \"minDate\": \"=\",\n \"maxDate\": \"=\",\n \"dateFilter\": \"=\"\n },\n template: '
' +\n '
' +\n '' +\n '
{{ calendar.date.format(\"MMMM YYYY\") }}
' +\n '' +\n '
' +\n '
' +\n '
{{ d }}
' +\n '
' +\n '
' +\n '
' +\n '{{ day.value }}' +\n '
' +\n '
' +\n '
' +\n '
',\n controller: 'CalendarController',\n controllerAs: \"calendar\",\n link: link\n\n };\n\n return directive;\n }\n angular.module('mdPickers')\n .directive('mdpCalendar', mdpCalendar);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n TimePickerController.$inject = ['$scope', '$mdDialog', 'time', 'autoSwitch', '$mdMedia'];\n\n function TimePickerController($scope, $mdDialog, time, autoSwitch, $mdMedia) {\n var vm = this;\n vm.VIEW_HOURS = 1;\n vm.VIEW_MINUTES = 2;\n vm.currentView = vm.VIEW_HOURS;\n vm.time = moment(time);\n vm.autoSwitch = !!autoSwitch;\n\n vm.clockHours = parseInt(vm.time.format(\"h\"));\n vm.clockMinutes = parseInt(vm.time.minutes());\n\n vm.$mdMedia = $mdMedia;\n\n vm.switchView = function() {\n vm.currentView = vm.currentView == vm.VIEW_HOURS ? vm.VIEW_MINUTES : vm.VIEW_HOURS;\n };\n\n vm.setAM = function() {\n if (vm.time.hours() >= 12)\n vm.time.hour(vm.time.hour() - 12);\n };\n\n vm.setPM = function() {\n if (vm.time.hours() < 12)\n vm.time.hour(vm.time.hour() + 12);\n };\n\n vm.cancel = function() {\n $mdDialog.cancel();\n };\n\n vm.confirm = function() {\n $mdDialog.hide(vm.time.toDate());\n };\n }\n angular.module('mdPickers')\n .controller('TimePickerController', TimePickerController);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n DatePickerController.$inject = ['$scope', '$mdDialog', '$mdMedia', '$timeout', 'currentDate', 'options'];\n\n function DatePickerController($scope, $mdDialog, $mdMedia, $timeout, currentDate, options) {\n var vm = this;\n\n vm.date = moment(currentDate);\n vm.minDate = options.minDate && moment(options.minDate).isValid() ? moment(options.minDate) : null;\n vm.maxDate = options.maxDate && moment(options.maxDate).isValid() ? moment(options.maxDate) : null;\n vm.displayFormat = options.displayFormat || \"ddd, MMM DD\";\n vm.dateFilter = angular.isFunction(options.dateFilter) ? options.dateFilter : null;\n vm.selectingYear = false;\n\n // validate min and max date\n if (vm.minDate && vm.maxDate) {\n if (vm.maxDate.isBefore(vm.minDate)) {\n vm.maxDate = moment(vm.minDate).add(1, 'days');\n }\n }\n\n if (vm.date) {\n // check min date\n if (vm.minDate && vm.date.isBefore(vm.minDate)) {\n vm.date = moment(vm.minDate);\n }\n\n // check max date\n if (vm.maxDate && vm.date.isAfter(vm.maxDate)) {\n vm.date = moment(vm.maxDate);\n }\n }\n vm.yearItems = {\n currentIndex_: 0,\n PAGE_SIZE: 5,\n START: (vm.minDate ? vm.minDate.year() : 1900),\n END: (vm.maxDate ? vm.maxDate.year() : 0),\n getItemAtIndex: function(index) {\n if (vm.yearItems.currentIndex_ < index)\n vm.yearItems.currentIndex_ = index;\n\n return vm.yearItems.START + index;\n },\n getLength: function() {\n return Math.min(\n vm.yearItems.currentIndex_ + Math.floor(vm.yearItems.PAGE_SIZE / 2),\n Math.abs(vm.yearItems.START - vm.yearItems.END) + 1\n );\n }\n };\n\n vm.$mdMedia = $mdMedia;\n vm.year = vm.date.year();\n\n vm.selectYear = function(year) {\n vm.date.year(year);\n vm.year = year;\n vm.selectingYear = false;\n vm.animate();\n };\n\n vm.showYear = function() {\n vm.yearTopIndex = (vm.date.year() - vm.yearItems.START) + Math.floor(vm.yearItems.PAGE_SIZE / 2);\n vm.yearItems.currentIndex_ = (vm.date.year() - vm.yearItems.START) + 1;\n vm.selectingYear = true;\n };\n\n vm.showCalendar = function() {\n vm.selectingYear = false;\n };\n\n vm.cancel = function() {\n $mdDialog.cancel();\n };\n\n vm.confirm = function() {\n var date = vm.date;\n\n if (vm.minDate && vm.date.isBefore(vm.minDate)) {\n date = moment(vm.minDate);\n }\n\n if (vm.maxDate && vm.date.isAfter(vm.maxDate)) {\n date = moment(vm.maxDate);\n }\n\n $mdDialog.hide(date.toDate());\n };\n\n vm.animate = function() {\n vm.animating = true;\n $timeout(angular.noop).then(function() {\n vm.animating = false;\n })\n };\n }\n\n angular.module('mdPickers')\n .controller('DatePickerController', DatePickerController);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n ClockController.$inject = [ /*'$scope'*/ ];\n\n function ClockController( /*$scope*/ ) {\n var TYPE_HOURS = \"hours\";\n var TYPE_MINUTES = \"minutes\";\n var vm = this;\n\n vm.STEP_DEG = 360 / 12;\n vm.steps = [];\n\n vm.CLOCK_TYPES = {\n \"hours\": {\n range: 12\n },\n \"minutes\": {\n range: 60\n }\n }\n\n vm.getPointerStyle = function() {\n var divider = 1;\n switch (vm.type) {\n case TYPE_HOURS:\n divider = 12;\n break;\n case TYPE_MINUTES:\n divider = 60;\n break;\n }\n var degrees = Math.round(vm.selected * (360 / divider)) - 180;\n return {\n \"-webkit-transform\": \"rotate(\" + degrees + \"deg)\",\n \"-ms-transform\": \"rotate(\" + degrees + \"deg)\",\n \"transform\": \"rotate(\" + degrees + \"deg)\"\n }\n };\n\n vm.setTimeByDeg = function(deg) {\n deg = deg >= 360 ? 0 : deg;\n var divider = 0;\n switch (vm.type) {\n case TYPE_HOURS:\n divider = 12;\n break;\n case TYPE_MINUTES:\n divider = 60;\n break;\n }\n vm.setTime(\n Math.round(divider / 360 * deg)\n );\n };\n\n vm.setTime = function(time /*, type*/ ) {\n vm.selected = time;\n switch (vm.type) {\n case TYPE_HOURS:\n if (vm.time.format(\"A\") == \"PM\") time += 12;\n vm.time.hours(time);\n break;\n case TYPE_MINUTES:\n if (time > 59) time -= 60;\n vm.time.minutes(time);\n break;\n }\n\n };\n\n vm.init = function() {\n vm.type = vm.type || \"hours\";\n var i;\n switch (vm.type) {\n case TYPE_HOURS:\n for (i = 1; i <= 12; i++)\n vm.steps.push(i);\n vm.selected = vm.time.hours() || 0;\n if (vm.selected > 12) vm.selected -= 12;\n\n break;\n case TYPE_MINUTES:\n for (i = 5; i <= 55; i += 5)\n vm.steps.push(i);\n\n vm.steps.push(0);\n vm.selected = vm.time.minutes() || 0;\n break;\n }\n };\n\n vm.init();\n }\n angular.module('mdPickers')\n .controller('ClockController', ClockController);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n CalendarController.$inject = ['$scope'];\n\n function CalendarController($scope) {\n var vm = this;\n vm.dow = moment.localeData().firstDayOfWeek();\n\n vm.weekDays = [].concat(\n moment.weekdaysMin().slice(\n vm.dow\n ),\n moment.weekdaysMin().slice(\n 0,\n vm.dow\n )\n );\n\n vm.daysInMonth = [];\n\n vm.getDaysInMonth = function() {\n var days = vm.date.daysInMonth(),\n firstDay = moment(vm.date).date(1).day() - vm.dow;\n\n if (firstDay < 0) firstDay = vm.weekDays.length - 1;\n\n\n var arr = [];\n for (var i = 1; i <= (firstDay + days); i++) {\n var day = null;\n if (i > firstDay) {\n day = {\n value: (i - firstDay),\n enabled: vm.isDayEnabled(moment(vm.date).date(i - firstDay).toDate())\n };\n }\n arr.push(day);\n }\n\n return arr;\n };\n\n vm.isDayEnabled = function(day) {\n return (!vm.minDate || vm.minDate <= day) &&\n (!vm.maxDate || vm.maxDate >= day) &&\n (!vm.dateFilter || !vm.dateFilter(day));\n };\n\n vm.selectDate = function(dom) {\n vm.date.date(dom);\n };\n\n vm.nextMonth = function() {\n vm.date.add(1, 'months');\n };\n\n vm.prevMonth = function() {\n vm.date.subtract(1, 'months');\n };\n\n vm.updateDaysInMonth = function() {\n vm.daysInMonth = vm.getDaysInMonth();\n };\n\n $scope.$watch(function() {\n return vm.date.unix()\n }, function(newValue, oldValue) {\n if (newValue && newValue !== oldValue)\n vm.updateDaysInMonth();\n })\n\n vm.updateDaysInMonth();\n }\n angular.module('mdPickers')\n .controller('CalendarController', CalendarController);\n})();\n\n// /**\n// * Created by Bruce on 2017/2/16.\n// */\n// /*!\n// * Angular Material Design\n// * https://github.com/angular/material\n// * @license MIT\n// * v1.1.3-master-0619e30\n// */\n// (function( ){\n// \"use strict\";\n//\n// /**\n// * @ngdoc module\n// * @name material.components.virtualRepeat\n// */\n// VirtualRepeatContainerController['$inject'] = [\"$$rAF\", \"$mdUtil\", \"$mdConstant\", \"$parse\", \"$rootScope\", \"$window\", \"$scope\", \"$element\", \"$attrs\", \"$document\"];\n// VirtualRepeatController['$inject'] = [\"$scope\", \"$element\", \"$attrs\", \"$browser\", \"$document\", \"$rootScope\", \"$$rAF\", \"$mdUtil\"];\n// VirtualRepeatDirective['$inject'] = [\"$parse\"];\n// angular.module('material.components.virtualRepeat', [\n// 'material.core',\n// 'material.components.showHide'\n// ])\n// .directive('mdVirtualRepeatContainer', VirtualRepeatContainerDirective)\n// .directive('mdVirtualRepeat', VirtualRepeatDirective);\n//\n//\n// /**\n// * @ngdoc directive\n// * @name mdVirtualRepeatContainer\n// * @module material.components.virtualRepeat\n// * @restrict E\n// * @description\n// * `md-virtual-repeat-container` provides the scroll container for md-virtual-repeat.\n// *\n// * VirtualRepeat is a limited substitute for ng-repeat that renders only\n// * enough DOM nodes to fill the container and recycling them as the user scrolls.\n// *\n// * Once an element is not visible anymore, the VirtualRepeat recycles it and will reuse it for\n// * another visible item by replacing the previous dataset with the new one.\n// *\n// * ### Common Issues\n// *\n// * - When having one-time bindings inside of the view template, the VirtualRepeat will not properly\n// * update the bindings for new items, since the view will be recycled.\n// *\n// * - Directives inside of a VirtualRepeat will be only compiled (linked) once, because those\n// * are will be recycled items and used for other items.\n// * The VirtualRepeat just updates the scope bindings.\n// *\n// *\n// * ### Notes\n// *\n// * > The VirtualRepeat is a similar implementation to the Android\n// * [RecyclerView](https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html)\n// *\n// * \n// *\n// * > Please also review the VirtualRepeat\n// * documentation for more information.\n// *\n// *\n// * @usage\n// * \n// *\n// * \n// *
Hello {{i}}!
\n// *
\n// *
\n// *\n// * @param {number=} md-top-index Binds the index of the item that is at the top of the scroll\n// * container to $scope. It can both read and set the scroll position.\n// * @param {boolean=} md-orient-horizontal Whether the container should scroll horizontally\n// * (defaults to orientation and scrolling vertically).\n// * @param {boolean=} md-auto-shrink When present, the container will shrink to fit\n// * the number of items when that number is less than its original size.\n// * @param {number=} md-auto-shrink-min Minimum number of items that md-auto-shrink\n// * will shrink to (default: 0).\n// */\n// function VirtualRepeatContainerDirective() {\n// return {\n// controller: VirtualRepeatContainerController,\n// template: virtualRepeatContainerTemplate,\n// compile: function virtualRepeatContainerCompile($element, $attrs) {\n// $element\n// .addClass('md-virtual-repeat-container')\n// .addClass($attrs.hasOwnProperty('mdOrientHorizontal')\n// ? 'md-orient-horizontal'\n// : 'md-orient-vertical');\n// }\n// };\n// }\n//\n//\n// function virtualRepeatContainerTemplate($element) {\n// return '
' +\n// '
' +\n// '
' +\n// $element[0].innerHTML +\n// '
';\n// }\n//\n// /**\n// * Number of additional elements to render above and below the visible area inside\n// * of the virtual repeat container. A higher number results in less flicker when scrolling\n// * very quickly in Safari, but comes with a higher rendering and dirty-checking cost.\n// * @const {number}\n// */\n// var NUM_EXTRA = 3;\n//\n// /** ngInject */\n// function VirtualRepeatContainerController($$rAF, $mdUtil, $mdConstant, $parse, $rootScope, $window, $scope,\n// $element, $attrs, $document) {\n// this.$rootScope = $rootScope;\n// this.$scope = $scope;\n// this.$element = $element;\n// this.$attrs = $attrs;\n// this.$document = $document;\n//\n// /** @type {number} The width or height of the container */\n// this.size = 0;\n// /** @type {number} The scroll width or height of the scroller */\n// this.scrollSize = 0;\n// /** @type {number} The scrollLeft or scrollTop of the scroller */\n// this.scrollOffset = 0;\n// /** @type {boolean} Whether the scroller is oriented horizontally */\n// this.horizontal = this.$attrs.hasOwnProperty('mdOrientHorizontal');\n// /** @type {!VirtualRepeatController} The repeater inside of this container */\n// this.repeater = null;\n// /** @type {boolean} Whether auto-shrink is enabled */\n// this.autoShrink = this.$attrs.hasOwnProperty('mdAutoShrink');\n// /** @type {number} Minimum number of items to auto-shrink to */\n// this.autoShrinkMin = parseInt(this.$attrs.mdAutoShrinkMin, 10) || 0;\n// /** @type {?number} Original container size when shrank */\n// this.originalSize = null;\n// /** @type {number} Amount to offset the total scroll size by. */\n// this.offsetSize = parseInt(this.$attrs.mdOffsetSize, 10) || 0;\n// /** @type {?string} height or width element style on the container prior to auto-shrinking. */\n// this.oldElementSize = null;\n// /** @type {!number} Maximum amount of pixels allowed for a single DOM element */\n// this.maxElementPixels = $mdConstant.ELEMENT_MAX_PIXELS;\n//\n// if (this.$attrs.mdTopIndex) {\n// /** @type {function(angular.Scope): number} Binds to topIndex on Angular scope */\n// this.bindTopIndex = $parse(this.$attrs.mdTopIndex);\n// /** @type {number} The index of the item that is at the top of the scroll container */\n// this.topIndex = this.bindTopIndex(this.$scope);\n//\n// if (angular.isUndefined(this.topIndex)) {\n// this.topIndex = 0;\n// this.bindTopIndex.assign(this.$scope, 0);\n// }\n//\n// this.$scope.$watch(this.bindTopIndex, angular.bind(this, function(newIndex) {\n// if (newIndex !== this.topIndex) {\n// this.scrollToIndex(newIndex);\n// }\n// }));\n// } else {\n// this.topIndex = 0;\n// }\n//\n// this.scroller = $element[0].querySelector('.md-virtual-repeat-scroller');\n// this.sizer = this.scroller.querySelector('.md-virtual-repeat-sizer');\n// this.offsetter = this.scroller.querySelector('.md-virtual-repeat-offsetter');\n//\n// // After the dom stablizes, measure the initial size of the container and\n// // make a best effort at re-measuring as it changes.\n// var boundUpdateSize = angular.bind(this, this.updateSize);\n//\n// $$rAF(angular.bind(this, function() {\n// boundUpdateSize();\n//\n// var debouncedUpdateSize = $mdUtil.debounce(boundUpdateSize, 10, null, false);\n// var jWindow = angular.element($window);\n//\n// // Make one more attempt to get the size if it is 0.\n// // This is not by any means a perfect approach, but there's really no\n// // silver bullet here.\n// if (!this.size) {\n// debouncedUpdateSize();\n// }\n//\n// jWindow.on('resize', debouncedUpdateSize);\n// $scope.$on('$destroy', function() {\n// jWindow.off('resize', debouncedUpdateSize);\n// });\n//\n// $scope.$emit('$md-resize-enable');\n// $scope.$on('$md-resize', boundUpdateSize);\n// }));\n// }\n//\n//\n// /** Called by the md-virtual-repeat inside of the container at startup. */\n// VirtualRepeatContainerController.prototype.register = function(repeaterCtrl) {\n// this.repeater = repeaterCtrl;\n//\n// angular.element(this.scroller)\n// .on('scroll wheel touchmove touchend', angular.bind(this, this.handleScroll_));\n// };\n//\n//\n// /** @return {boolean} Whether the container is configured for horizontal scrolling. */\n// VirtualRepeatContainerController.prototype.isHorizontal = function() {\n// return this.horizontal;\n// };\n//\n//\n// /** @return {number} The size (width or height) of the container. */\n// VirtualRepeatContainerController.prototype.getSize = function() {\n// return this.size;\n// };\n//\n//\n// /**\n// * Resizes the container.\n// * @private\n// * @param {number} size The new size to set.\n// */\n// VirtualRepeatContainerController.prototype.setSize_ = function(size) {\n// var dimension = this.getDimensionName_();\n//\n// this.size = size;\n// this.$element[0].style[dimension] = size + 'px';\n// };\n//\n//\n// VirtualRepeatContainerController.prototype.unsetSize_ = function() {\n// this.$element[0].style[this.getDimensionName_()] = this.oldElementSize;\n// this.oldElementSize = null;\n// };\n//\n//\n// /** Instructs the container to re-measure its size. */\n// VirtualRepeatContainerController.prototype.updateSize = function() {\n// // If the original size is already determined, we can skip the update.\n// if (this.originalSize) return;\n//\n// this.size = this.isHorizontal()\n// ? this.$element[0].clientWidth\n// : this.$element[0].clientHeight;\n//\n// // Recheck the scroll position after updating the size. This resolves\n// // problems that can result if the scroll position was measured while the\n// // element was display: none or detached from the document.\n// this.handleScroll_();\n//\n// this.repeater && this.repeater.containerUpdated();\n// };\n//\n//\n// /** @return {number} The container's scrollHeight or scrollWidth. */\n// VirtualRepeatContainerController.prototype.getScrollSize = function() {\n// return this.scrollSize;\n// };\n//\n//\n// VirtualRepeatContainerController.prototype.getDimensionName_ = function() {\n// return this.isHorizontal() ? 'width' : 'height';\n// };\n//\n//\n// /**\n// * Sets the scroller element to the specified size.\n// * @private\n// * @param {number} size The new size.\n// */\n// VirtualRepeatContainerController.prototype.sizeScroller_ = function(size) {\n// var dimension = this.getDimensionName_();\n// var crossDimension = this.isHorizontal() ? 'height' : 'width';\n//\n// // Clear any existing dimensions.\n// this.sizer.innerHTML = '';\n//\n// // If the size falls within the browser's maximum explicit size for a single element, we can\n// // set the size and be done. Otherwise, we have to create children that add up the the desired\n// // size.\n// if (size < this.maxElementPixels) {\n// this.sizer.style[dimension] = size + 'px';\n// } else {\n// this.sizer.style[dimension] = 'auto';\n// this.sizer.style[crossDimension] = 'auto';\n//\n// // Divide the total size we have to render into N max-size pieces.\n// var numChildren = Math.floor(size / this.maxElementPixels);\n//\n// // Element template to clone for each max-size piece.\n// var sizerChild = this.$document[0].createElement('div');\n// sizerChild.style[dimension] = this.maxElementPixels + 'px';\n// sizerChild.style[crossDimension] = '1px';\n//\n// for (var i = 0; i < numChildren; i++) {\n// this.sizer.appendChild(sizerChild.cloneNode(false));\n// }\n//\n// // Re-use the element template for the remainder.\n// sizerChild.style[dimension] = (size - (numChildren * this.maxElementPixels)) + 'px';\n// this.sizer.appendChild(sizerChild);\n// }\n// };\n//\n//\n// /**\n// * If auto-shrinking is enabled, shrinks or unshrinks as appropriate.\n// * @private\n// * @param {number} size The new size.\n// */\n// VirtualRepeatContainerController.prototype.autoShrink_ = function(size) {\n// var shrinkSize = Math.max(size, this.autoShrinkMin * this.repeater.getItemSize());\n//\n// if (this.autoShrink && shrinkSize !== this.size) {\n// if (this.oldElementSize === null) {\n// this.oldElementSize = this.$element[0].style[this.getDimensionName_()];\n// }\n//\n// var currentSize = this.originalSize || this.size;\n//\n// if (!currentSize || shrinkSize < currentSize) {\n// if (!this.originalSize) {\n// this.originalSize = this.size;\n// }\n//\n// // Now we update the containers size, because shrinking is enabled.\n// this.setSize_(shrinkSize);\n// } else if (this.originalSize !== null) {\n// // Set the size back to our initial size.\n// this.unsetSize_();\n//\n// var _originalSize = this.originalSize;\n// this.originalSize = null;\n//\n// // We determine the repeaters size again, if the original size was zero.\n// // The originalSize needs to be null, to be able to determine the size.\n// if (!_originalSize) this.updateSize();\n//\n// // Apply the original size or the determined size back to the container, because\n// // it has been overwritten before, in the shrink block.\n// this.setSize_(_originalSize || this.size);\n// }\n//\n// this.repeater.containerUpdated();\n// }\n// };\n//\n//\n// /**\n// * Sets the scrollHeight or scrollWidth. Called by the repeater based on\n// * its item count and item size.\n// * @param {number} itemsSize The total size of the items.\n// */\n// VirtualRepeatContainerController.prototype.setScrollSize = function(itemsSize) {\n// var size = itemsSize + this.offsetSize;\n// if (this.scrollSize === size) return;\n//\n// this.sizeScroller_(size);\n// this.autoShrink_(size);\n// this.scrollSize = size;\n// };\n//\n//\n// /** @return {number} The container's current scroll offset. */\n// VirtualRepeatContainerController.prototype.getScrollOffset = function() {\n// return this.scrollOffset;\n// };\n//\n// /**\n// * Scrolls to a given scrollTop position.\n// * @param {number} position\n// */\n// VirtualRepeatContainerController.prototype.scrollTo = function(position) {\n// this.scroller[this.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = position;\n// this.handleScroll_();\n// };\n//\n// /**\n// * Scrolls the item with the given index to the top of the scroll container.\n// * @param {number} index\n// */\n// VirtualRepeatContainerController.prototype.scrollToIndex = function(index) {\n// var itemSize = this.repeater.getItemSize();\n// var itemsLength = this.repeater.itemsLength;\n// if(index > itemsLength) {\n// index = itemsLength - 1;\n// }\n// this.scrollTo(itemSize * index);\n// };\n//\n// VirtualRepeatContainerController.prototype.resetScroll = function() {\n// this.scrollTo(0);\n// };\n//\n//\n// VirtualRepeatContainerController.prototype.handleScroll_ = function() {\n// var ltr = this.$document[0].dir != 'rtl' && this.$document[0].body.dir != 'rtl';\n// if(!ltr && !this.maxSize) {\n// this.scroller.scrollLeft = this.scrollSize;\n// this.maxSize = this.scroller.scrollLeft;\n// }\n// var offset = this.isHorizontal() ?\n// (ltr?this.scroller.scrollLeft : this.maxSize - this.scroller.scrollLeft)\n// : this.scroller.scrollTop;\n// if (offset === this.scrollOffset || offset > this.scrollSize - this.size) return;\n//\n// var itemSize = this.repeater.getItemSize();\n// if (!itemSize) return;\n//\n// var numItems = Math.max(0, Math.floor(offset / itemSize) - NUM_EXTRA);\n//\n// var transform = (this.isHorizontal() ? 'translateX(' : 'translateY(') +\n// (!this.isHorizontal() || ltr ? (numItems * itemSize) : - (numItems * itemSize)) + 'px)';\n//\n// this.scrollOffset = offset;\n// this.offsetter.style.webkitTransform = transform;\n// this.offsetter.style.transform = transform;\n//\n// if (this.bindTopIndex) {\n// var topIndex = Math.floor(offset / itemSize);\n// if (topIndex !== this.topIndex && topIndex < this.repeater.getItemCount()) {\n// this.topIndex = topIndex;\n// this.bindTopIndex.assign(this.$scope, topIndex);\n// if (!this.$rootScope.$$phase) this.$scope.$digest();\n// }\n// }\n//\n// this.repeater.containerUpdated();\n// };\n//\n//\n// /**\n// * @ngdoc directive\n// * @name mdVirtualRepeat\n// * @module material.components.virtualRepeat\n// * @restrict A\n// * @priority 1000\n// * @description\n// * `md-virtual-repeat` specifies an element to repeat using virtual scrolling.\n// *\n// * Virtual repeat is a limited substitute for ng-repeat that renders only\n// * enough DOM nodes to fill the container and recycling them as the user scrolls.\n// *\n// * Arrays, but not objects are supported for iteration.\n// * Track by, as alias, and (key, value) syntax are not supported.\n// *\n// * ### On-Demand Async Item Loading\n// *\n// * When using the `md-on-demand` attribute and loading some asynchronous data, the `getItemAtIndex` function will\n// * mostly return nothing.\n// *\n// * \n// * DynamicItems.prototype.getItemAtIndex = function(index) {\n// * if (this.pages[index]) {\n// * return this.pages[index];\n// * } else {\n// * // This is an asynchronous action and does not return any value.\n// * this.loadPage(index);\n// * }\n// * };\n// * \n// *\n// * This means that the VirtualRepeat will not have any value for the given index.
\n// * After the data loading completed, the user expects the VirtualRepeat to recognize the change.\n// *\n// * To make sure that the VirtualRepeat properly detects any change, you need to run the operation\n// * in another digest.\n// *\n// * \n// * DynamicItems.prototype.loadPage = function(index) {\n// * var self = this;\n// *\n// * // Trigger a new digest by using $timeout\n// * $timeout(function() {\n// * self.pages[index] = Data;\n// * });\n// * };\n// * \n// *\n// * > Note: Please also review the\n// * VirtualRepeatContainer documentation\n// * for more information.\n// *\n// * @usage\n// * \n// * \n// *
Hello {{i}}!
\n// *
\n// *\n// * \n// *
Hello {{i}}!
\n// *
\n// *
\n// *\n// * @param {number=} md-item-size The height or width of the repeated elements (which must be\n// * identical for each element). Optional. Will attempt to read the size from the dom if missing,\n// * but still assumes that all repeated nodes have same height or width.\n// * @param {string=} md-extra-name Evaluates to an additional name to which the current iterated item\n// * can be assigned on the repeated scope (needed for use in `md-autocomplete`).\n// * @param {boolean=} md-on-demand When present, treats the md-virtual-repeat argument as an object\n// * that can fetch rows rather than an array.\n// *\n// * **NOTE:** This object must implement the following interface with two (2) methods:\n// *\n// * - `getItemAtIndex: function(index) [object]` The item at that index or null if it is not yet\n// * loaded (it should start downloading the item in that case).\n// * - `getLength: function() [number]` The data length to which the repeater container\n// * should be sized. Ideally, when the count is known, this method should return it.\n// * Otherwise, return a higher number than the currently loaded items to produce an\n// * infinite-scroll behavior.\n// */\n// function VirtualRepeatDirective($parse) {\n// return {\n// controller: VirtualRepeatController,\n// priority: 1000,\n// require: ['mdVirtualRepeat', '^^mdVirtualRepeatContainer'],\n// restrict: 'A',\n// terminal: true,\n// transclude: 'element',\n// compile: function VirtualRepeatCompile($element, $attrs) {\n// var expression = $attrs.mdVirtualRepeat;\n// var match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)\\s*$/);\n// var repeatName = match[1];\n// var repeatListExpression = $parse(match[2]);\n// var extraName = $attrs.mdExtraName && $parse($attrs.mdExtraName);\n//\n// return function VirtualRepeatLink($scope, $element, $attrs, ctrl, $transclude) {\n// ctrl[0].link_(ctrl[1], $transclude, repeatName, repeatListExpression, extraName);\n// };\n// }\n// };\n// }\n//\n//\n// /** ngInject */\n// function VirtualRepeatController($scope, $element, $attrs, $browser, $document, $rootScope,\n// $$rAF, $mdUtil) {\n// this.$scope = $scope;\n// this.$element = $element;\n// this.$attrs = $attrs;\n// this.$browser = $browser;\n// this.$document = $document;\n// this.$rootScope = $rootScope;\n// this.$$rAF = $$rAF;\n//\n// /** @type {boolean} Whether we are in on-demand mode. */\n// this.onDemand = $mdUtil.parseAttributeBoolean($attrs.mdOnDemand);\n// /** @type {!Function} Backup reference to $browser.$$checkUrlChange */\n// this.browserCheckUrlChange = $browser.$$checkUrlChange;\n// /** @type {number} Most recent starting repeat index (based on scroll offset) */\n// this.newStartIndex = 0;\n// /** @type {number} Most recent ending repeat index (based on scroll offset) */\n// this.newEndIndex = 0;\n// /** @type {number} Most recent end visible index (based on scroll offset) */\n// this.newVisibleEnd = 0;\n// /** @type {number} Previous starting repeat index (based on scroll offset) */\n// this.startIndex = 0;\n// /** @type {number} Previous ending repeat index (based on scroll offset) */\n// this.endIndex = 0;\n// // TODO: measure width/height of first element from dom if not provided.\n// // getComputedStyle?\n// /** @type {?number} Height/width of repeated elements. */\n// this.itemSize = $scope.$eval($attrs.mdItemSize) || null;\n//\n// /** @type {boolean} Whether this is the first time that items are rendered. */\n// this.isFirstRender = true;\n//\n// /**\n// * @private {boolean} Whether the items in the list are already being updated. Used to prevent\n// * nested calls to virtualRepeatUpdate_.\n// */\n// this.isVirtualRepeatUpdating_ = false;\n//\n// /** @type {number} Most recently seen length of items. */\n// this.itemsLength = 0;\n//\n// /**\n// * @type {!Function} Unwatch callback for item size (when md-items-size is\n// * not specified), or angular.noop otherwise.\n// */\n// this.unwatchItemSize_ = angular.noop;\n//\n// /**\n// * Presently rendered blocks by repeat index.\n// * @type {Object} A pool of presently unused blocks. */\n// this.pooledBlocks = [];\n//\n// $scope.$on('$destroy', angular.bind(this, this.cleanupBlocks_));\n// }\n//\n//\n// /**\n// * An object representing a repeated item.\n// * @typedef {{element: !jqLite, new: boolean, scope: !angular.Scope}}\n// */\n// VirtualRepeatController.Block;\n//\n//\n// /**\n// * Called at startup by the md-virtual-repeat postLink function.\n// * @param {!VirtualRepeatContainerController} container The container's controller.\n// * @param {!Function} transclude The repeated element's bound transclude function.\n// * @param {string} repeatName The left hand side of the repeat expression, indicating\n// * the name for each item in the array.\n// * @param {!Function} repeatListExpression A compiled expression based on the right hand side\n// * of the repeat expression. Points to the array to repeat over.\n// * @param {string|undefined} extraName The optional extra repeatName.\n// */\n// VirtualRepeatController.prototype.link_ =\n// function(container, transclude, repeatName, repeatListExpression, extraName) {\n// this.container = container;\n// this.transclude = transclude;\n// this.repeatName = repeatName;\n// this.rawRepeatListExpression = repeatListExpression;\n// this.extraName = extraName;\n// this.sized = false;\n//\n// this.repeatListExpression = angular.bind(this, this.repeatListExpression_);\n//\n// this.container.register(this);\n// };\n//\n//\n// /** @private Cleans up unused blocks. */\n// VirtualRepeatController.prototype.cleanupBlocks_ = function() {\n// angular.forEach(this.pooledBlocks, function cleanupBlock(block) {\n// block.element.remove();\n// });\n// };\n//\n//\n// /** @private Attempts to set itemSize by measuring a repeated element in the dom */\n// VirtualRepeatController.prototype.readItemSize_ = function() {\n// if (this.itemSize) {\n// // itemSize was successfully read in a different asynchronous call.\n// return;\n// }\n//\n// this.items = this.repeatListExpression(this.$scope);\n// this.parentNode = this.$element[0].parentNode;\n// var block = this.getBlock_(0);\n// if (!block.element[0].parentNode) {\n// this.parentNode.appendChild(block.element[0]);\n// }\n//\n// this.itemSize = block.element[0][\n// this.container.isHorizontal() ? 'offsetWidth' : 'offsetHeight'] || null;\n//\n// this.blocks[0] = block;\n// this.poolBlock_(0);\n//\n// if (this.itemSize) {\n// this.containerUpdated();\n// }\n// };\n//\n//\n// /**\n// * Returns the user-specified repeat list, transforming it into an array-like\n// * object in the case of infinite scroll/dynamic load mode.\n// * @param {!angular.Scope} The scope.\n// * @return {!Array|!Object} An array or array-like object for iteration.\n// */\n// VirtualRepeatController.prototype.repeatListExpression_ = function(scope) {\n// var repeatList = this.rawRepeatListExpression(scope);\n//\n// if (this.onDemand && repeatList) {\n// var virtualList = new VirtualRepeatModelArrayLike(repeatList);\n// virtualList.$$includeIndexes(this.newStartIndex, this.newVisibleEnd);\n// return virtualList;\n// } else {\n// return repeatList;\n// }\n// };\n//\n//\n// /**\n// * Called by the container. Informs us that the containers scroll or size has\n// * changed.\n// */\n// VirtualRepeatController.prototype.containerUpdated = function() {\n// // If itemSize is unknown, attempt to measure it.\n// if (!this.itemSize) {\n// // Make sure to clean up watchers if we can (see #8178)\n// if(this.unwatchItemSize_ && this.unwatchItemSize_ !== angular.noop){\n// this.unwatchItemSize_();\n// }\n// this.unwatchItemSize_ = this.$scope.$watchCollection(\n// this.repeatListExpression,\n// angular.bind(this, function(items) {\n// if (items && items.length) {\n// this.readItemSize_();\n// }\n// }));\n// if (!this.$rootScope.$$phase) this.$scope.$digest();\n//\n// return;\n// } else if (!this.sized) {\n// this.items = this.repeatListExpression(this.$scope);\n// }\n//\n// if (!this.sized) {\n// this.unwatchItemSize_();\n// this.sized = true;\n// this.$scope.$watchCollection(this.repeatListExpression,\n// angular.bind(this, function(items, oldItems) {\n// if (!this.isVirtualRepeatUpdating_) {\n// this.virtualRepeatUpdate_(items, oldItems);\n// }\n// }));\n// }\n//\n// this.updateIndexes_();\n//\n// if (this.newStartIndex !== this.startIndex ||\n// this.newEndIndex !== this.endIndex ||\n// this.container.getScrollOffset() > this.container.getScrollSize()) {\n// if (this.items instanceof VirtualRepeatModelArrayLike) {\n// this.items.$$includeIndexes(this.newStartIndex, this.newEndIndex);\n// }\n// this.virtualRepeatUpdate_(this.items, this.items);\n// }\n// };\n//\n//\n// /**\n// * Called by the container. Returns the size of a single repeated item.\n// * @return {?number} Size of a repeated item.\n// */\n// VirtualRepeatController.prototype.getItemSize = function() {\n// return this.itemSize;\n// };\n//\n//\n// /**\n// * Called by the container. Returns the size of a single repeated item.\n// * @return {?number} Size of a repeated item.\n// */\n// VirtualRepeatController.prototype.getItemCount = function() {\n// return this.itemsLength;\n// };\n//\n//\n// /**\n// * Updates the order and visible offset of repeated blocks in response to scrolling\n// * or items updates.\n// * @private\n// */\n// VirtualRepeatController.prototype.virtualRepeatUpdate_ = function(items, oldItems) {\n// this.isVirtualRepeatUpdating_ = true;\n//\n// var itemsLength = items && items.length || 0;\n// var lengthChanged = false;\n//\n// // If the number of items shrank, keep the scroll position.\n// if (this.items && itemsLength < this.items.length && this.container.getScrollOffset() !== 0) {\n// this.items = items;\n// var previousScrollOffset = this.container.getScrollOffset();\n// this.container.resetScroll();\n// this.container.scrollTo(previousScrollOffset);\n// }\n//\n// if (itemsLength !== this.itemsLength) {\n// lengthChanged = true;\n// this.itemsLength = itemsLength;\n// }\n//\n// this.items = items;\n// if (items !== oldItems || lengthChanged) {\n// this.updateIndexes_();\n// }\n//\n// this.parentNode = this.$element[0].parentNode;\n//\n// if (lengthChanged) {\n// this.container.setScrollSize(itemsLength * this.itemSize);\n// }\n//\n// var cleanUpFirstRender = false, firstRenderStartIndex;\n// if (this.isFirstRender) {\n// cleanUpFirstRender = true;\n// this.isFirstRender = false;\n// // var startIndex = this.$attrs.mdStartIndex ?\n// firstRenderStartIndex = this.$attrs.mdStartIndex ?\n// this.$scope.$eval(this.$attrs.mdStartIndex) :\n// this.container.topIndex;\n// // this.container.scrollToIndex(startIndex);\n// this.container.scrollToIndex(firstRenderStartIndex);\n// }\n//\n// // Detach and pool any blocks that are no longer in the viewport.\n// Object.keys(this.blocks).forEach(function(blockIndex) {\n// var index = parseInt(blockIndex, 10);\n// if (index < this.newStartIndex || index >= this.newEndIndex) {\n// this.poolBlock_(index);\n// }\n// }, this);\n//\n// // Add needed blocks.\n// // For performance reasons, temporarily block browser url checks as we digest\n// // the restored block scopes ($$checkUrlChange reads window.location to\n// // check for changes and trigger route change, etc, which we don't need when\n// // trying to scroll at 60fps).\n// this.$browser.$$checkUrlChange = angular.noop;\n//\n// var i, block,\n// newStartBlocks = [],\n// newEndBlocks = [];\n//\n// // Collect blocks at the top.\n// for (i = this.newStartIndex; i < this.newEndIndex && this.blocks[i] == null; i++) {\n// block = this.getBlock_(i);\n// this.updateBlock_(block, i);\n// newStartBlocks.push(block);\n// }\n//\n// // Update blocks that are already rendered.\n// for (; this.blocks[i] != null; i++) {\n// this.updateBlock_(this.blocks[i], i);\n// }\n// var maxIndex = i - 1;\n//\n// // Collect blocks at the end.\n// for (; i < this.newEndIndex; i++) {\n// block = this.getBlock_(i);\n// this.updateBlock_(block, i);\n// newEndBlocks.push(block);\n// }\n//\n// // Attach collected blocks to the document.\n// if (newStartBlocks.length) {\n// this.parentNode.insertBefore(\n// this.domFragmentFromBlocks_(newStartBlocks),\n// this.$element[0].nextSibling);\n// }\n// if (newEndBlocks.length) {\n// this.parentNode.insertBefore(\n// this.domFragmentFromBlocks_(newEndBlocks),\n// this.blocks[maxIndex] && this.blocks[maxIndex].element[0].nextSibling);\n// }\n//\n// // DOM manipulation may have altered scroll, so scroll again\n// if (cleanUpFirstRender) {\n// this.container.scrollToIndex(firstRenderStartIndex);\n// }\n//\n// // Restore $$checkUrlChange.\n// this.$browser.$$checkUrlChange = this.browserCheckUrlChange;\n//\n// this.startIndex = this.newStartIndex;\n// this.endIndex = this.newEndIndex;\n//\n// this.isVirtualRepeatUpdating_ = false;\n// };\n//\n//\n// /**\n// * @param {number} index Where the block is to be in the repeated list.\n// * @return {!VirtualRepeatController.Block} A new or pooled block to place at the specified index.\n// * @private\n// */\n// VirtualRepeatController.prototype.getBlock_ = function(index) {\n// if (this.pooledBlocks.length) {\n// return this.pooledBlocks.pop();\n// }\n//\n// var block;\n// this.transclude(angular.bind(this, function(clone, scope) {\n// block = {\n// element: clone,\n// new: true,\n// scope: scope\n// };\n//\n// this.updateScope_(scope, index);\n// this.parentNode.appendChild(clone[0]);\n// }));\n//\n// return block;\n// };\n//\n//\n// /**\n// * Updates and if not in a digest cycle, digests the specified block's scope to the data\n// * at the specified index.\n// * @param {!VirtualRepeatController.Block} block The block whose scope should be updated.\n// * @param {number} index The index to set.\n// * @private\n// */\n// VirtualRepeatController.prototype.updateBlock_ = function(block, index) {\n// this.blocks[index] = block;\n//\n// if (!block.new &&\n// (block.scope.$index === index && block.scope[this.repeatName] === this.items[index])) {\n// return;\n// }\n// block.new = false;\n//\n// // Update and digest the block's scope.\n// this.updateScope_(block.scope, index);\n//\n// // Perform digest before reattaching the block.\n// // Any resulting synchronous dom mutations should be much faster as a result.\n// // This might break some directives, but I'm going to try it for now.\n// if (!this.$rootScope.$$phase) {\n// block.scope.$digest();\n// }\n// };\n//\n//\n// /**\n// * Updates scope to the data at the specified index.\n// * @param {!angular.Scope} scope The scope which should be updated.\n// * @param {number} index The index to set.\n// * @private\n// */\n// VirtualRepeatController.prototype.updateScope_ = function(scope, index) {\n// scope.$index = index;\n// scope[this.repeatName] = this.items && this.items[index];\n// if (this.extraName) scope[this.extraName(this.$scope)] = this.items[index];\n// };\n//\n//\n// /**\n// * Pools the block at the specified index (Pulls its element out of the dom and stores it).\n// * @param {number} index The index at which the block to pool is stored.\n// * @private\n// */\n// VirtualRepeatController.prototype.poolBlock_ = function(index) {\n// this.pooledBlocks.push(this.blocks[index]);\n// this.parentNode.removeChild(this.blocks[index].element[0]);\n// delete this.blocks[index];\n// };\n//\n//\n// /**\n// * Produces a dom fragment containing the elements from the list of blocks.\n// * @param {!Array} blocks The blocks whose elements\n// * should be added to the document fragment.\n// * @return {DocumentFragment}\n// * @private\n// */\n// VirtualRepeatController.prototype.domFragmentFromBlocks_ = function(blocks) {\n// var fragment = this.$document[0].createDocumentFragment();\n// blocks.forEach(function(block) {\n// fragment.appendChild(block.element[0]);\n// });\n// return fragment;\n// };\n//\n//\n// /**\n// * Updates start and end indexes based on length of repeated items and container size.\n// * @private\n// */\n// VirtualRepeatController.prototype.updateIndexes_ = function() {\n// var itemsLength = this.items ? this.items.length : 0;\n// var containerLength = Math.ceil(this.container.getSize() / this.itemSize);\n//\n// this.newStartIndex = Math.max(0, Math.min(\n// itemsLength - containerLength,\n// Math.floor(this.container.getScrollOffset() / this.itemSize)));\n// this.newVisibleEnd = this.newStartIndex + containerLength + NUM_EXTRA;\n// this.newEndIndex = Math.min(itemsLength, this.newVisibleEnd);\n// this.newStartIndex = Math.max(0, this.newStartIndex - NUM_EXTRA);\n// };\n//\n// /**\n// * This VirtualRepeatModelArrayLike class enforces the interface requirements\n// * for infinite scrolling within a mdVirtualRepeatContainer. An object with this\n// * interface must implement the following interface with two (2) methods:\n// *\n// * getItemAtIndex: function(index) -> item at that index or null if it is not yet\n// * loaded (It should start downloading the item in that case).\n// *\n// * getLength: function() -> number The data legnth to which the repeater container\n// * should be sized. Ideally, when the count is known, this method should return it.\n// * Otherwise, return a higher number than the currently loaded items to produce an\n// * infinite-scroll behavior.\n// *\n// * @usage\n// * \n// * \n// *
\n// * Hello {{i}}!\n// *
\n// *
\n// *
\n// *\n// */\n// function VirtualRepeatModelArrayLike(model) {\n// if (!angular.isFunction(model.getItemAtIndex) ||\n// !angular.isFunction(model.getLength)) {\n// throw Error('When md-on-demand is enabled, the Object passed to md-virtual-repeat must implement ' +\n// 'functions getItemAtIndex() and getLength() ');\n// }\n//\n// this.model = model;\n// }\n//\n//\n// VirtualRepeatModelArrayLike.prototype.$$includeIndexes = function(start, end) {\n// for (var i = start; i < end; i++) {\n// if (!this.hasOwnProperty(i)) {\n// this[i] = this.model.getItemAtIndex(i);\n// }\n// }\n// this.length = this.model.getLength();\n// };\n//\n// })();\n\n/**\n * Created by Bruce on 2017/3/1.\n */\n(function() {\n 'use strict';\n\n // POST RELEASE\n // TODO(jelbourn): Demo that uses moment.js\n // TODO(jelbourn): make sure this plays well with validation and ngMessages.\n // TODO(jelbourn): calendar pane doesn't open up outside of visible viewport.\n // TODO(jelbourn): forward more attributes to the internal input (required, autofocus, etc.)\n // TODO(jelbourn): something better for mobile (calendar panel takes up entire screen?)\n // TODO(jelbourn): input behavior (masking? auto-complete?)\n\n\n angular.module('material.components.datepicker')\n .directive('cusMdDatepicker', datePickerDirective);\n\n /**\n * @ngdoc directive\n * @name mdDatepicker\n * @module material.components.datepicker\n *\n * @param {Date} ng-model The component's model. Expects either a JavaScript Date object or a value that can be parsed into one (e.g. a ISO 8601 string).\n * @param {Object=} ng-model-options Allows tuning of the way in which `ng-model` is being updated. Also allows\n * for a timezone to be specified. Read more at the ngModelOptions docs.\n * @param {expression=} ng-change Expression evaluated when the model value changes.\n * @param {expression=} ng-focus Expression evaluated when the input is focused or the calendar is opened.\n * @param {expression=} ng-blur Expression evaluated when focus is removed from the input or the calendar is closed.\n * @param {boolean=} ng-disabled Whether the datepicker is disabled.\n * @param {boolean=} ng-required Whether a value is required for the datepicker.\n * @param {Date=} md-min-date Expression representing a min date (inclusive).\n * @param {Date=} md-max-date Expression representing a max date (inclusive).\n * @param {(function(Date): boolean)=} md-date-filter Function expecting a date and returning a boolean whether it can be selected or not.\n * @param {String=} md-placeholder The date input placeholder value.\n * @param {String=} md-open-on-focus When present, the calendar will be opened when the input is focused.\n * @param {Boolean=} md-is-open Expression that can be used to open the datepicker's calendar on-demand.\n * @param {String=} md-current-view Default open view of the calendar pane. Can be either \"month\" or \"year\".\n * @param {String=} md-hide-icons Determines which datepicker icons should be hidden. Note that this may cause the\n * datepicker to not align properly with other components. **Use at your own risk.** Possible values are:\n * * `\"all\"` - Hides all icons.\n * * `\"calendar\"` - Only hides the calendar icon.\n * * `\"triangle\"` - Only hides the triangle icon.\n * @param {Object=} md-date-locale Allows for the values from the `$mdDateLocaleProvider` to be\n * ovewritten on a per-element basis (e.g. `msgOpenCalendar` can be overwritten with\n * `md-date-locale=\"{ msgOpenCalendar: 'Open a special calendar' }\"`).\n *\n * @description\n * `` is a component used to select a single date.\n * For information on how to configure internationalization for the date picker,\n * see `$mdDateLocaleProvider`.\n *\n * This component supports [ngMessages](https://docs.angularjs.org/api/ngMessages/directive/ngMessages).\n * Supported attributes are:\n * * `required`: whether a required date is not set.\n * * `mindate`: whether the selected date is before the minimum allowed date.\n * * `maxdate`: whether the selected date is after the maximum allowed date.\n * * `debounceInterval`: ms to delay input processing (since last debounce reset); default value 500ms\n *\n * @usage\n * \n * \n * \n *\n */\n\n datePickerDirective.$inject = [\"$$mdSvgRegistry\", \"$mdUtil\", \"$mdAria\", \"inputDirective\"];\n function datePickerDirective($$mdSvgRegistry, $mdUtil, $mdAria, inputDirective) {\n return {\n template: function(tElement, tAttrs) {\n // Buttons are not in the tab order because users can open the calendar via keyboard\n // interaction on the text input, and multiple tab stops for one component (picker)\n // may be confusing.\n var hiddenIcons = tAttrs.mdHideIcons;\n var ariaLabelValue = tAttrs.ariaLabel || tAttrs.mdPlaceholder;\n\n var calendarButton = (hiddenIcons === 'all' || hiddenIcons === 'calendar') ? '' :\n '' +\n '' +\n '';\n\n var triangleButton = '';\n\n if (hiddenIcons !== 'all' && hiddenIcons !== 'triangle') {\n triangleButton = '' +\n '' +\n '
' +\n '
';\n\n tElement.addClass(HAS_TRIANGLE_ICON_CLASS);\n }\n\n return calendarButton +\n '
' +\n ' ' +\n triangleButton +\n '
' +\n\n // This pane will be detached from here and re-attached to the document body.\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '' +\n '' +\n '
' +\n '
';\n },\n require: ['ngModel', 'cusMdDatepicker', '?^mdInputContainer', '?^form'],\n scope: {\n minDate: '=mdMinDate',\n maxDate: '=mdMaxDate',\n placeholder: '@mdPlaceholder',\n currentView: '@mdCurrentView',\n dateFilter: '=mdDateFilter',\n isOpen: '=?mdIsOpen',\n debounceInterval: '=mdDebounceInterval',\n dateLocale: '=mdDateLocale'\n },\n controller: DatePickerCtrl,\n controllerAs: 'ctrl',\n bindToController: true,\n link: function(scope, element, attr, controllers) {\n var ngModelCtrl = controllers[0];\n var mdDatePickerCtrl = controllers[1];\n var mdInputContainer = controllers[2];\n var parentForm = controllers[3];\n var mdNoAsterisk = $mdUtil.parseAttributeBoolean(attr.mdNoAsterisk);\n\n mdDatePickerCtrl.configureNgModel(ngModelCtrl, mdInputContainer, inputDirective);\n\n if (mdInputContainer) {\n // We need to move the spacer after the datepicker itself,\n // because md-input-container adds it after the\n // md-datepicker-input by default. The spacer gets wrapped in a\n // div, because it floats and gets aligned next to the datepicker.\n // There are easier ways of working around this with CSS (making the\n // datepicker 100% wide, change the `display` etc.), however they\n // break the alignment with any other form controls.\n var spacer = element[0].querySelector('.md-errors-spacer');\n\n if (spacer) {\n element.after(angular.element('
').append(spacer));\n }\n\n mdInputContainer.setHasPlaceholder(attr.mdPlaceholder);\n mdInputContainer.input = element;\n mdInputContainer.element\n .addClass(INPUT_CONTAINER_CLASS)\n .toggleClass(HAS_CALENDAR_ICON_CLASS, attr.mdHideIcons !== 'calendar' && attr.mdHideIcons !== 'all');\n\n if (!mdInputContainer.label) {\n $mdAria.expect(element, 'aria-label', attr.mdPlaceholder);\n } else if(!mdNoAsterisk) {\n attr.$observe('required', function(value) {\n mdInputContainer.label.toggleClass('md-required', !!value);\n });\n }\n\n scope.$watch(mdInputContainer.isErrorGetter || function() {\n return ngModelCtrl.$invalid && (ngModelCtrl.$touched || (parentForm && parentForm.$submitted));\n }, mdInputContainer.setInvalid);\n } else if (parentForm) {\n // If invalid, highlights the input when the parent form is submitted.\n var parentSubmittedWatcher = scope.$watch(function() {\n return parentForm.$submitted;\n }, function(isSubmitted) {\n if (isSubmitted) {\n mdDatePickerCtrl.updateErrorState();\n parentSubmittedWatcher();\n }\n });\n }\n }\n };\n }\n\n /** Additional offset for the input's `size` attribute, which is updated based on its content. */\n var EXTRA_INPUT_SIZE = 3;\n\n /** Class applied to the container if the date is invalid. */\n var INVALID_CLASS = 'md-datepicker-invalid';\n\n /** Class applied to the datepicker when it's open. */\n var OPEN_CLASS = 'md-datepicker-open';\n\n /** Class applied to the md-input-container, if a datepicker is placed inside it */\n var INPUT_CONTAINER_CLASS = '_md-datepicker-floating-label';\n\n /** Class to be applied when the calendar icon is enabled. */\n var HAS_CALENDAR_ICON_CLASS = '_md-datepicker-has-calendar-icon';\n\n /** Class to be applied when the triangle icon is enabled. */\n var HAS_TRIANGLE_ICON_CLASS = '_md-datepicker-has-triangle-icon';\n\n /** Default time in ms to debounce input event by. */\n var DEFAULT_DEBOUNCE_INTERVAL = 500;\n\n /**\n * Height of the calendar pane used to check if the pane is going outside the boundary of\n * the viewport. See calendar.scss for how $md-calendar-height is computed; an extra 20px is\n * also added to space the pane away from the exact edge of the screen.\n *\n * This is computed statically now, but can be changed to be measured if the circumstances\n * of calendar sizing are changed.\n */\n var CALENDAR_PANE_HEIGHT = 368;\n\n /**\n * Width of the calendar pane used to check if the pane is going outside the boundary of\n * the viewport. See calendar.scss for how $md-calendar-width is computed; an extra 20px is\n * also added to space the pane away from the exact edge of the screen.\n *\n * This is computed statically now, but can be changed to be measured if the circumstances\n * of calendar sizing are changed.\n */\n var CALENDAR_PANE_WIDTH = 360;\n\n /** Used for checking whether the current user agent is on iOS or Android. */\n var IS_MOBILE_REGEX = /ipad|iphone|ipod|android/i;\n\n /**\n * Controller for md-datepicker.\n *\n * @ngInject @constructor\n */\n DatePickerCtrl.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$window\", \"$mdConstant\",\n \"$mdTheming\", \"$mdUtil\", \"$mdDateLocale\", \"$$mdDateUtil\", \"$$rAF\", \"$filter\", \"$document\"];\n function DatePickerCtrl($scope, $element, $attrs, $window, $mdConstant,\n $mdTheming, $mdUtil, $mdDateLocale, $$mdDateUtil, $$rAF, $filter, $document) {\n\n /** @final */\n this.$window = $window;\n\n /** @final */\n this.$document = $document;\n\n /** @final */\n this.dateUtil = $$mdDateUtil;\n\n /** @final */\n this.$mdConstant = $mdConstant;\n\n /* @final */\n this.$mdUtil = $mdUtil;\n\n /** @final */\n this.$$rAF = $$rAF;\n\n /** @final */\n this.$mdDateLocale = $mdDateLocale;\n\n /**\n * The root document element. This is used for attaching a top-level click handler to\n * close the calendar panel when a click outside said panel occurs. We use `documentElement`\n * instead of body because, when scrolling is disabled, some browsers consider the body element\n * to be completely off the screen and propagate events directly to the html element.\n * @type {!angular.JQLite}\n */\n this.documentElement = angular.element(this.$document[0].documentElement);\n\n /** @type {!angular.NgModelController} */\n this.ngModelCtrl = null;\n\n /** @type {HTMLInputElement} */\n this.inputElement = $element[0].querySelector('input');\n\n /** @final {!angular.JQLite} */\n this.ngInputElement = angular.element(this.inputElement);\n\n /** @type {HTMLElement} */\n this.inputContainer = $element[0].querySelector('.md-datepicker-input-container');\n\n /** @type {HTMLElement} Floating calendar pane. */\n this.calendarPane = $element[0].querySelector('.md-datepicker-calendar-pane');\n\n /** @type {HTMLElement} Calendar icon button. */\n this.calendarButton = $element[0].querySelector('.md-datepicker-button');\n\n /**\n * Element covering everything but the input in the top of the floating calendar pane.\n * @type {!angular.JQLite}\n */\n this.inputMask = angular.element($element[0].querySelector('.md-datepicker-input-mask-opaque'));\n\n /** @final {!angular.JQLite} */\n this.$element = $element;\n\n /** @final {!angular.Attributes} */\n this.$attrs = $attrs;\n\n /** @final {!angular.Scope} */\n this.$scope = $scope;\n\n /** @type {Date} */\n this.date = null;\n\n /** @type {boolean} */\n this.isFocused = false;\n\n /** @type {boolean} */\n this.isDisabled;\n this.setDisabled($element[0].disabled || angular.isString($attrs.disabled));\n\n /** @type {boolean} Whether the date-picker's calendar pane is open. */\n this.isCalendarOpen = false;\n\n /** @type {boolean} Whether the calendar should open when the input is focused. */\n this.openOnFocus = $attrs.hasOwnProperty('mdOpenOnFocus');\n\n /** @final */\n this.mdInputContainer = null;\n\n /**\n * Element from which the calendar pane was opened. Keep track of this so that we can return\n * focus to it when the pane is closed.\n * @type {HTMLElement}\n */\n this.calendarPaneOpenedFrom = null;\n\n /** @type {String} Unique id for the calendar pane. */\n this.calendarPaneId = 'md-date-pane-' + $mdUtil.nextUid();\n\n /** Pre-bound click handler is saved so that the event listener can be removed. */\n this.bodyClickHandler = angular.bind(this, this.handleBodyClick);\n\n /**\n * Name of the event that will trigger a close. Necessary to sniff the browser, because\n * the resize event doesn't make sense on mobile and can have a negative impact since it\n * triggers whenever the browser zooms in on a focused input.\n */\n this.windowEventName = IS_MOBILE_REGEX.test(\n navigator.userAgent || navigator.vendor || this.$window.opera\n ) ? 'orientationchange' : 'resize';\n\n /** Pre-bound close handler so that the event listener can be removed. */\n this.windowEventHandler = $mdUtil.debounce(angular.bind(this, this.closeCalendarPane), 100);\n\n /** Pre-bound handler for the window blur event. Allows for it to be removed later. */\n this.windowBlurHandler = angular.bind(this, this.handleWindowBlur);\n\n /** The built-in Angular date filter. */\n this.ngDateFilter = $filter('date');\n\n /** @type {Number} Extra margin for the left side of the floating calendar pane. */\n this.leftMargin = 20;\n\n /** @type {Number} Extra margin for the top of the floating calendar. Gets determined on the first open. */\n this.topMargin = null;\n\n // Unless the user specifies so, the datepicker should not be a tab stop.\n // This is necessary because ngAria might add a tabindex to anything with an ng-model\n // (based on whether or not the user has turned that particular feature on/off).\n if ($attrs.tabindex) {\n this.ngInputElement.attr('tabindex', $attrs.tabindex);\n $attrs.$set('tabindex', null);\n } else {\n $attrs.$set('tabindex', '-1');\n }\n\n $attrs.$set('aria-owns', this.calendarPaneId);\n\n $mdTheming($element);\n $mdTheming(angular.element(this.calendarPane));\n\n var self = this;\n\n $scope.$on('$destroy', function() {\n self.detachCalendarPane();\n });\n\n if ($attrs.mdIsOpen) {\n $scope.$watch('ctrl.isOpen', function(shouldBeOpen) {\n if (shouldBeOpen) {\n self.openCalendarPane({\n target: self.inputElement\n });\n } else {\n self.closeCalendarPane();\n }\n });\n }\n\n // For Angular 1.4 and older, where there are no lifecycle hooks but bindings are pre-assigned,\n // manually call the $onInit hook.\n if (angular.version.major === 1 && angular.version.minor <= 4) {\n this.$onInit();\n }\n\n }\n\n /**\n * Angular Lifecycle hook for newer Angular versions.\n * Bindings are not guaranteed to have been assigned in the controller, but they are in the $onInit hook.\n */\n DatePickerCtrl.prototype.$onInit = function() {\n\n /**\n * Holds locale-specific formatters, parsers, labels etc. Allows\n * the user to override specific ones from the $mdDateLocale provider.\n * @type {!Object}\n */\n this.locale = this.dateLocale ? angular.extend({}, this.$mdDateLocale, this.dateLocale) : this.$mdDateLocale;\n\n this.installPropertyInterceptors();\n this.attachChangeListeners();\n this.attachInteractionListeners();\n };\n\n /**\n * Sets up the controller's reference to ngModelController and\n * applies Angular's `input[type=\"date\"]` directive.\n * @param {!angular.NgModelController} ngModelCtrl Instance of the ngModel controller.\n * @param {Object} mdInputContainer Instance of the mdInputContainer controller.\n * @param {Object} inputDirective Config for Angular's `input` directive.\n */\n DatePickerCtrl.prototype.configureNgModel = function(ngModelCtrl, mdInputContainer, inputDirective) {\n this.ngModelCtrl = ngModelCtrl;\n this.mdInputContainer = mdInputContainer;\n\n // The input needs to be [type=\"date\"] in order to be picked up by Angular.\n this.$attrs.$set('type', 'date');\n\n // Invoke the `input` directive link function, adding a stub for the element.\n // This allows us to re-use Angular's logic for setting the timezone via ng-model-options.\n // It works by calling the link function directly which then adds the proper `$parsers` and\n // `$formatters` to the ngModel controller.\n inputDirective[0].link.pre(this.$scope, {\n on: angular.noop,\n val: angular.noop,\n 0: {}\n }, this.$attrs, [ngModelCtrl]);\n\n var self = this;\n\n // Responds to external changes to the model value.\n self.ngModelCtrl.$formatters.push(function(value) {\n var parsedValue = angular.isDefined(value) ? Date.parse(value) : null;\n\n // `parsedValue` is the time since epoch if valid or `NaN` if invalid.\n if (!isNaN(parsedValue) && angular.isNumber(parsedValue)) {\n value = new Date(parsedValue);\n }\n\n if (value && !(value instanceof Date)) {\n throw Error(\n 'The ng-model for md-datepicker must be a Date instance or a value ' +\n 'that can be parsed into a date. Currently the model is of type: ' + typeof value\n );\n }\n\n self.onExternalChange(value);\n\n return value;\n });\n\n // Responds to external error state changes (e.g. ng-required based on another input).\n ngModelCtrl.$viewChangeListeners.unshift(angular.bind(this, this.updateErrorState));\n\n // Forwards any events from the input to the root element. This is necessary to get `updateOn`\n // working for events that don't bubble (e.g. 'blur') since Angular binds the handlers to\n // the ``.\n var updateOn = self.$mdUtil.getModelOption(ngModelCtrl, 'updateOn');\n\n if (updateOn) {\n this.ngInputElement.on(\n updateOn,\n angular.bind(this.$element, this.$element.triggerHandler, updateOn)\n );\n }\n };\n\n /**\n * Attach event listeners for both the text input and the md-calendar.\n * Events are used instead of ng-model so that updates don't infinitely update the other\n * on a change. This should also be more performant than using a $watch.\n */\n DatePickerCtrl.prototype.attachChangeListeners = function() {\n var self = this;\n\n self.$scope.$on('md-calendar-change', function(event, date) {\n self.setModelValue(date);\n self.onExternalChange(date);\n self.closeCalendarPane();\n });\n\n self.ngInputElement.on('input', angular.bind(self, self.resizeInputElement));\n\n var debounceInterval = angular.isDefined(this.debounceInterval) ?\n this.debounceInterval : DEFAULT_DEBOUNCE_INTERVAL;\n self.ngInputElement.on('input', self.$mdUtil.debounce(self.handleInputEvent,\n debounceInterval, self));\n };\n\n /** Attach event listeners for user interaction. */\n DatePickerCtrl.prototype.attachInteractionListeners = function() {\n var self = this;\n var $scope = this.$scope;\n var keyCodes = this.$mdConstant.KEY_CODE;\n\n // Add event listener through angular so that we can triggerHandler in unit tests.\n self.ngInputElement.on('keydown', function(event) {\n if (event.altKey && event.keyCode == keyCodes.DOWN_ARROW) {\n self.openCalendarPane(event);\n $scope.$digest();\n }\n });\n\n if (self.openOnFocus) {\n self.ngInputElement.on('focus', angular.bind(self, self.openCalendarPane));\n angular.element(self.$window).on('blur', self.windowBlurHandler);\n\n $scope.$on('$destroy', function() {\n angular.element(self.$window).off('blur', self.windowBlurHandler);\n });\n }\n\n $scope.$on('md-calendar-close', function() {\n self.closeCalendarPane();\n });\n };\n\n /**\n * Capture properties set to the date-picker and imperitively handle internal changes.\n * This is done to avoid setting up additional $watches.\n */\n DatePickerCtrl.prototype.installPropertyInterceptors = function() {\n var self = this;\n\n if (this.$attrs.ngDisabled) {\n // The expression is to be evaluated against the directive element's scope and not\n // the directive's isolate scope.\n var scope = this.$scope.$parent;\n\n if (scope) {\n scope.$watch(this.$attrs.ngDisabled, function(isDisabled) {\n self.setDisabled(isDisabled);\n });\n }\n }\n\n Object.defineProperty(this, 'placeholder', {\n get: function() { return self.inputElement.placeholder; },\n set: function(value) { self.inputElement.placeholder = value || ''; }\n });\n };\n\n /**\n * Sets whether the date-picker is disabled.\n * @param {boolean} isDisabled\n */\n DatePickerCtrl.prototype.setDisabled = function(isDisabled) {\n this.isDisabled = isDisabled;\n this.inputElement.disabled = isDisabled;\n\n if (this.calendarButton) {\n this.calendarButton.disabled = isDisabled;\n }\n };\n\n /**\n * Sets the custom ngModel.$error flags to be consumed by ngMessages. Flags are:\n * - mindate: whether the selected date is before the minimum date.\n * - maxdate: whether the selected flag is after the maximum date.\n * - filtered: whether the selected date is allowed by the custom filtering function.\n * - valid: whether the entered text input is a valid date\n *\n * The 'required' flag is handled automatically by ngModel.\n *\n * @param {Date=} opt_date Date to check. If not given, defaults to the datepicker's model value.\n */\n DatePickerCtrl.prototype.updateErrorState = function(opt_date) {\n var date = opt_date || this.date;\n\n // Clear any existing errors to get rid of anything that's no longer relevant.\n this.clearErrorState();\n\n if (this.dateUtil.isValidDate(date)) {\n // Force all dates to midnight in order to ignore the time portion.\n date = this.dateUtil.createDateAtMidnight(date);\n\n if (this.dateUtil.isValidDate(this.minDate)) {\n var minDate = this.dateUtil.createDateAtMidnight(this.minDate);\n this.ngModelCtrl.$setValidity('mindate', date >= minDate);\n }\n\n if (this.dateUtil.isValidDate(this.maxDate)) {\n var maxDate = this.dateUtil.createDateAtMidnight(this.maxDate);\n this.ngModelCtrl.$setValidity('maxdate', date <= maxDate);\n }\n\n if (angular.isFunction(this.dateFilter)) {\n this.ngModelCtrl.$setValidity('filtered', this.dateFilter(date));\n }\n } else {\n // The date is seen as \"not a valid date\" if there is *something* set\n // (i.e.., not null or undefined), but that something isn't a valid date.\n this.ngModelCtrl.$setValidity('valid', date == null);\n }\n\n angular.element(this.inputContainer).toggleClass(INVALID_CLASS, !this.ngModelCtrl.$valid);\n };\n\n /** Clears any error flags set by `updateErrorState`. */\n DatePickerCtrl.prototype.clearErrorState = function() {\n this.inputContainer.classList.remove(INVALID_CLASS);\n ['mindate', 'maxdate', 'filtered', 'valid'].forEach(function(field) {\n this.ngModelCtrl.$setValidity(field, true);\n }, this);\n };\n\n /** Resizes the input element based on the size of its content. */\n DatePickerCtrl.prototype.resizeInputElement = function() {\n this.inputElement.size = this.inputElement.value.length + EXTRA_INPUT_SIZE;\n };\n\n /**\n * Sets the model value if the user input is a valid date.\n * Adds an invalid class to the input element if not.\n */\n DatePickerCtrl.prototype.handleInputEvent = function() {\n var inputString = this.inputElement.value;\n var parsedDate = inputString ? this.locale.parseDate(inputString) : null;\n this.dateUtil.setDateTimeToMidnight(parsedDate);\n\n // An input string is valid if it is either empty (representing no date)\n // or if it parses to a valid date that the user is allowed to select.\n var isValidInput = inputString == '' || (\n this.dateUtil.isValidDate(parsedDate) &&\n this.locale.isDateComplete(inputString) &&\n this.isDateEnabled(parsedDate)\n );\n\n // The datepicker's model is only updated when there is a valid input.\n if (isValidInput) {\n this.setModelValue(parsedDate);\n this.date = parsedDate;\n }\n\n this.updateErrorState(parsedDate);\n };\n\n /**\n * Check whether date is in range and enabled\n * @param {Date=} opt_date\n * @return {boolean} Whether the date is enabled.\n */\n DatePickerCtrl.prototype.isDateEnabled = function(opt_date) {\n return this.dateUtil.isDateWithinRange(opt_date, this.minDate, this.maxDate) &&\n (!angular.isFunction(this.dateFilter) || this.dateFilter(opt_date));\n };\n\n /** Position and attach the floating calendar to the document. */\n DatePickerCtrl.prototype.attachCalendarPane = function() {\n var calendarPane = this.calendarPane;\n var body = this.$document[0].body;\n\n calendarPane.style.transform = '';\n this.$element.addClass(OPEN_CLASS);\n this.mdInputContainer && this.mdInputContainer.element.addClass(OPEN_CLASS);\n angular.element(body).addClass('md-datepicker-is-showing');\n\n var elementRect = this.inputContainer.getBoundingClientRect();\n var bodyRect = body.getBoundingClientRect();\n\n if (!this.topMargin || this.topMargin < 0) {\n this.topMargin = (this.inputMask.parent().prop('clientHeight') - this.ngInputElement.prop('clientHeight')) / 2;\n }\n\n // Check to see if the calendar pane would go off the screen. If so, adjust position\n // accordingly to keep it within the viewport.\n var paneTop = elementRect.top - bodyRect.top - this.topMargin;\n var paneLeft = elementRect.left - bodyRect.left - this.leftMargin;\n\n // If ng-material has disabled body scrolling (for example, if a dialog is open),\n // then it's possible that the already-scrolled body has a negative top/left. In this case,\n // we want to treat the \"real\" top as (0 - bodyRect.top). In a normal scrolling situation,\n // though, the top of the viewport should just be the body's scroll position.\n var viewportTop = (bodyRect.top < 0 && this.$document[0].body.scrollTop == 0) ?\n -bodyRect.top :\n this.$document[0].body.scrollTop;\n\n var viewportLeft = (bodyRect.left < 0 && this.$document[0].body.scrollLeft == 0) ?\n -bodyRect.left :\n this.$document[0].body.scrollLeft;\n\n var viewportBottom = viewportTop + this.$window.innerHeight;\n var viewportRight = viewportLeft + this.$window.innerWidth;\n\n // Creates an overlay with a hole the same size as element. We remove a pixel or two\n // on each end to make it overlap slightly. The overlay's background is added in\n // the theme in the form of a box-shadow with a huge spread.\n this.inputMask.css({\n position: 'absolute',\n left: this.leftMargin + 'px',\n top: this.topMargin + 'px',\n width: (elementRect.width - 1) + 'px',\n height: (elementRect.height - 2) + 'px'\n });\n\n // If the right edge of the pane would be off the screen and shifting it left by the\n // difference would not go past the left edge of the screen. If the calendar pane is too\n // big to fit on the screen at all, move it to the left of the screen and scale the entire\n // element down to fit.\n if (paneLeft + CALENDAR_PANE_WIDTH > viewportRight) {\n if (viewportRight - CALENDAR_PANE_WIDTH > 0) {\n paneLeft = viewportRight - CALENDAR_PANE_WIDTH;\n } else {\n paneLeft = viewportLeft;\n var scale = this.$window.innerWidth / CALENDAR_PANE_WIDTH;\n calendarPane.style.transform = 'scale(' + scale + ')';\n }\n\n calendarPane.classList.add('md-datepicker-pos-adjusted');\n }\n\n // If the bottom edge of the pane would be off the screen and shifting it up by the\n // difference would not go past the top edge of the screen.\n if (paneTop + CALENDAR_PANE_HEIGHT > viewportBottom &&\n viewportBottom - CALENDAR_PANE_HEIGHT > viewportTop) {\n paneTop = viewportBottom - CALENDAR_PANE_HEIGHT;\n calendarPane.classList.add('md-datepicker-pos-adjusted');\n }\n\n calendarPane.style.left = paneLeft + 'px';\n calendarPane.style.top = paneTop + 'px';\n this.$document[0].body.appendChild(calendarPane);\n\n // Add CSS class after one frame to trigger open animation.\n this.$$rAF(function() {\n calendarPane.classList.add('md-pane-open');\n });\n };\n\n /** Detach the floating calendar pane from the document. */\n DatePickerCtrl.prototype.detachCalendarPane = function() {\n this.$element.removeClass(OPEN_CLASS);\n this.mdInputContainer && this.mdInputContainer.element.removeClass(OPEN_CLASS);\n angular.element(this.$document[0].body).removeClass('md-datepicker-is-showing');\n this.calendarPane.classList.remove('md-pane-open');\n this.calendarPane.classList.remove('md-datepicker-pos-adjusted');\n\n if (this.isCalendarOpen) {\n this.$mdUtil.enableScrolling();\n }\n\n if (this.calendarPane.parentNode) {\n // Use native DOM removal because we do not want any of the\n // angular state of this element to be disposed.\n this.calendarPane.parentNode.removeChild(this.calendarPane);\n }\n };\n\n /**\n * Open the floating calendar pane.\n * @param {Event} event\n */\n DatePickerCtrl.prototype.openCalendarPane = function(event) {\n if (!this.isCalendarOpen && !this.isDisabled && !this.inputFocusedOnWindowBlur) {\n this.isCalendarOpen = this.isOpen = true;\n this.calendarPaneOpenedFrom = event.target;\n\n // Because the calendar pane is attached directly to the body, it is possible that the\n // rest of the component (input, etc) is in a different scrolling container, such as\n // an md-content. This means that, if the container is scrolled, the pane would remain\n // stationary. To remedy this, we disable scrolling while the calendar pane is open, which\n // also matches the native behavior for things like `\\\n
' + leftover + '
\\\n ';\n } else {\n return '\\\n ';\n }\n }\n\n function getClearButton() {\n return '' +\n '';\n }\n }\n };\n }\n\n var ITEM_HEIGHT = 48,\n MAX_ITEMS = 5,\n MENU_PADDING = 8,\n INPUT_PADDING = 2; // Padding provided by `md-input-container`\n\n MdAutocompleteCtrl.inject = [\"$scope\", \"$element\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$window\", \"$animate\", \"$rootElement\", \"$attrs\", \"$q\", \"$log\", \"$mdLiveAnnouncer\", \"$document\"];\n function MdAutocompleteCtrl($scope, $element, $mdUtil, $mdConstant, $mdTheming, $window,\n $animate, $rootElement, $attrs, $q, $log, $mdLiveAnnouncer, $document) {\n// Internal Variables.\n var ctrl = this,\n itemParts = $scope.itemsExpr.split(/ in /i),\n itemExpr = itemParts[ 1 ],\n elements = null,\n cache = {},\n noBlur = false,\n selectedItemWatchers = [],\n hasFocus = false,\n fetchesInProgress = 0,\n enableWrapScroll = null,\n inputModelCtrl = null,\n debouncedOnResize = $mdUtil.debounce(onWindowResize);\n\n // Public Exported Variables with handlers\n defineProperty('hidden', handleHiddenChange, true);\n\n // Public Exported Variables\n ctrl.scope = $scope;\n ctrl.parent = $scope.$parent;\n ctrl.itemName = itemParts[ 0 ];\n ctrl.matches = [];\n ctrl.loading = false;\n ctrl.hidden = true;\n ctrl.index = null;\n ctrl.id = $mdUtil.nextUid();\n ctrl.isDisabled = null;\n ctrl.isRequired = null;\n ctrl.isReadonly = null;\n ctrl.hasNotFound = false;\n\n // Public Exported Methods\n ctrl.keydown = keydown;\n ctrl.blur = blur;\n ctrl.focus = focus;\n ctrl.clear = clearValue;\n ctrl.select = select;\n ctrl.listEnter = onListEnter;\n ctrl.listLeave = onListLeave;\n ctrl.mouseUp = onMouseup;\n ctrl.getCurrentDisplayValue = getCurrentDisplayValue;\n ctrl.registerSelectedItemWatcher = registerSelectedItemWatcher;\n ctrl.unregisterSelectedItemWatcher = unregisterSelectedItemWatcher;\n ctrl.notFoundVisible = notFoundVisible;\n ctrl.loadingIsVisible = loadingIsVisible;\n ctrl.positionDropdown = positionDropdown;\n\n /**\n * Report types to be used for the $mdLiveAnnouncer\n * @enum {number} Unique flag id.\n */\n var ReportType = {\n Count: 1,\n Selected: 2\n };\n\n return init();\n\n //-- initialization methods\n\n /**\n * Initialize the controller, setup watchers, gather elements\n */\n function init () {\n\n $mdUtil.initOptionalProperties($scope, $attrs, {\n searchText: '',\n selectedItem: null,\n clearButton: false\n });\n\n $mdTheming($element);\n configureWatchers();\n $mdUtil.nextTick(function () {\n\n gatherElements();\n moveDropdown();\n\n // Forward all focus events to the input element when autofocus is enabled\n if ($scope.autofocus) {\n $element.on('focus', focusInputElement);\n }\n });\n }\n\n function updateModelValidators() {\n if (!$scope.requireMatch || !inputModelCtrl) return;\n\n inputModelCtrl.$setValidity('md-require-match', !!$scope.selectedItem || !$scope.searchText);\n }\n\n /**\n * Calculates the dropdown's position and applies the new styles to the menu element\n * @returns {*}\n */\n function positionDropdown () {\n if (!elements) {\n return $mdUtil.nextTick(positionDropdown, false, $scope);\n }\n\n var dropdownHeight = ($scope.dropdownItems || MAX_ITEMS) * ITEM_HEIGHT;\n\n var hrect = elements.wrap.getBoundingClientRect(),\n vrect = elements.snap.getBoundingClientRect(),\n root = elements.root.getBoundingClientRect(),\n top = vrect.bottom - root.top,\n bot = root.bottom - vrect.top,\n left = hrect.left - root.left,\n width = hrect.width,\n offset = getVerticalOffset(),\n position = $scope.dropdownPosition,\n styles;\n\n // Automatically determine dropdown placement based on available space in viewport.\n if (!position) {\n position = (top > bot && root.height - hrect.bottom - MENU_PADDING < dropdownHeight) ? 'top' : 'bottom';\n }\n // Adjust the width to account for the padding provided by `md-input-container`\n if ($attrs.mdFloatingLabel) {\n left += INPUT_PADDING;\n width -= INPUT_PADDING * 2;\n }\n styles = {\n left: left + 'px',\n minWidth: width + 'px',\n maxWidth: Math.max(hrect.right - root.left, root.right - hrect.left) - MENU_PADDING + 'px'\n };\n\n if (position === 'top') {\n styles.top = 'auto';\n styles.bottom = bot + 'px';\n styles.maxHeight = Math.min(dropdownHeight, hrect.top - root.top - MENU_PADDING) + 'px';\n } else {\n var bottomSpace = root.bottom - hrect.bottom - MENU_PADDING + $mdUtil.getViewportTop();\n\n styles.top = (top - offset) + 'px';\n styles.bottom = 'auto';\n styles.maxHeight = Math.min(dropdownHeight, bottomSpace) + 'px';\n }\n\n elements.$.scrollContainer.css(styles);\n $mdUtil.nextTick(correctHorizontalAlignment, false);\n\n /**\n * Calculates the vertical offset for floating label examples to account for ngMessages\n * @returns {number}\n */\n function getVerticalOffset () {\n var offset = 0;\n var inputContainer = $element.find('md-input-container');\n if (inputContainer.length) {\n var input = inputContainer.find('input');\n offset = inputContainer.prop('offsetHeight');\n offset -= input.prop('offsetTop');\n offset -= input.prop('offsetHeight');\n // add in the height left up top for the floating label text\n offset += inputContainer.prop('offsetTop');\n }\n return offset;\n }\n\n /**\n * Makes sure that the menu doesn't go off of the screen on either side.\n */\n function correctHorizontalAlignment () {\n var dropdown = elements.scrollContainer.getBoundingClientRect(),\n styles = {};\n if (dropdown.right > root.right - MENU_PADDING) {\n styles.left = (hrect.right - dropdown.width) + 'px';\n }\n elements.$.scrollContainer.css(styles);\n }\n }\n\n /**\n * Moves the dropdown menu to the body tag in order to avoid z-index and overflow issues.\n */\n function moveDropdown () {\n if (!elements.$.root.length) return;\n $mdTheming(elements.$.scrollContainer);\n elements.$.scrollContainer.detach();\n elements.$.root.append(elements.$.scrollContainer);\n if ($animate.pin) $animate.pin(elements.$.scrollContainer, $rootElement);\n }\n\n /**\n * Sends focus to the input element.\n */\n function focusInputElement () {\n elements.input.focus();\n }\n\n /**\n * Sets up any watchers used by autocomplete\n */\n function configureWatchers () {\n var wait = parseInt($scope.delay, 10) || 0;\n\n $attrs.$observe('disabled', function (value) { ctrl.isDisabled = $mdUtil.parseAttributeBoolean(value, false); });\n $attrs.$observe('required', function (value) { ctrl.isRequired = $mdUtil.parseAttributeBoolean(value, false); });\n $attrs.$observe('readonly', function (value) { ctrl.isReadonly = $mdUtil.parseAttributeBoolean(value, false); });\n\n $scope.$watch('searchText', wait ? $mdUtil.debounce(handleSearchText, wait) : handleSearchText);\n $scope.$watch('selectedItem', selectedItemChange);\n\n angular.element($window).on('resize', debouncedOnResize);\n\n $scope.$on('$destroy', cleanup);\n }\n\n /**\n * Removes any events or leftover elements created by this controller\n */\n function cleanup () {\n if (!ctrl.hidden) {\n $mdUtil.enableScrolling();\n }\n\n angular.element($window).off('resize', debouncedOnResize);\n\n if ( elements ){\n var items = ['ul', 'scroller', 'scrollContainer', 'input'];\n angular.forEach(items, function(key){\n elements.$[key].remove();\n });\n }\n }\n\n /**\n * Event handler to be called whenever the window resizes.\n */\n function onWindowResize() {\n if (!ctrl.hidden) {\n positionDropdown();\n }\n }\n\n /**\n * Gathers all of the elements needed for this controller\n */\n function gatherElements () {\n elements = {\n main: $element[0],\n scrollContainer: $element[0].querySelector('.md-virtual-repeat-container'),\n scroller: $element[0].querySelector('.md-virtual-repeat-scroller'),\n ul: $element.find('ul')[0],\n input: $element.find('input')[0],\n wrap: getWrapTarget(),\n root: $document[0].body\n };\n\n elements.li = elements.ul.getElementsByTagName('li');\n elements.snap = getSnapTarget();\n elements.$ = getAngularElements(elements);\n\n inputModelCtrl = elements.$.input.controller('ngModel');\n }\n\n /**\n * Finds the correct element that will determine the width\n * @returns {*}\n */\n function getWrapTarget() {\n for (var element = $element; element.length; element = element.parent()) {\n if (angular.isDefined(element.attr('md-autocomplete-wrap-override'))) return element[ 0 ];\n }\n return $element.find('md-autocomplete-wrap')[0];\n }\n\n /**\n * Finds the element that the menu will base its position on\n * @returns {*}\n */\n function getSnapTarget () {\n for (var element = $element; element.length; element = element.parent()) {\n if (angular.isDefined(element.attr('md-autocomplete-snap'))) return element[ 0 ];\n }\n return elements.wrap;\n }\n\n /**\n * Gathers angular-wrapped versions of each element\n * @param elements\n * @returns {{}}\n */\n function getAngularElements (elements) {\n var obj = {};\n for (var key in elements) {\n if (elements.hasOwnProperty(key)) obj[ key ] = angular.element(elements[ key ]);\n }\n return obj;\n }\n\n //-- event/change handlers\n\n /**\n * Handles changes to the `hidden` property.\n * @param hidden\n * @param oldHidden\n */\n function handleHiddenChange (hidden, oldHidden) {\n if (!hidden && oldHidden) {\n positionDropdown();\n\n // Report in polite mode, because the screenreader should finish the default description of\n // the input. element.\n reportMessages(true, ReportType.Count | ReportType.Selected);\n\n if (elements) {\n $mdUtil.disableScrollAround(elements.ul);\n enableWrapScroll = disableElementScrollEvents(angular.element(elements.wrap));\n }\n } else if (hidden && !oldHidden) {\n $mdUtil.enableScrolling();\n\n if (enableWrapScroll) {\n enableWrapScroll();\n enableWrapScroll = null;\n }\n }\n }\n\n /**\n * Disables scrolling for a specific element\n */\n function disableElementScrollEvents(element) {\n\n function preventDefault(e) {\n e.preventDefault();\n }\n\n element.on('wheel', preventDefault);\n element.on('touchmove', preventDefault);\n\n return function() {\n element.off('wheel', preventDefault);\n element.off('touchmove', preventDefault);\n };\n }\n\n /**\n * When the user mouses over the dropdown menu, ignore blur events.\n */\n function onListEnter () {\n noBlur = true;\n }\n\n /**\n * When the user's mouse leaves the menu, blur events may hide the menu again.\n */\n function onListLeave () {\n if (!hasFocus && !ctrl.hidden) elements.input.focus();\n noBlur = false;\n ctrl.hidden = shouldHide();\n }\n\n /**\n * When the mouse button is released, send focus back to the input field.\n */\n function onMouseup () {\n elements.input.focus();\n }\n\n /**\n * Handles changes to the selected item.\n * @param selectedItem\n * @param previousSelectedItem\n */\n function selectedItemChange (selectedItem, previousSelectedItem) {\n\n updateModelValidators();\n\n if (selectedItem) {\n getDisplayValue(selectedItem).then(function (val) {\n $scope.searchText = val;\n handleSelectedItemChange(selectedItem, previousSelectedItem);\n });\n } else if (previousSelectedItem && $scope.searchText) {\n getDisplayValue(previousSelectedItem).then(function(displayValue) {\n // Clear the searchText, when the selectedItem is set to null.\n // Do not clear the searchText, when the searchText isn't matching with the previous\n // selected item.\n if (displayValue.toString().toLowerCase() === $scope.searchText.toLowerCase()) {\n $scope.searchText = '';\n }\n });\n }\n\n if (selectedItem !== previousSelectedItem) announceItemChange();\n }\n\n /**\n * Use the user-defined expression to announce changes each time a new item is selected\n */\n function announceItemChange () {\n angular.isFunction($scope.itemChange) && $scope.itemChange(getItemAsNameVal($scope.selectedItem));\n }\n\n /**\n * Use the user-defined expression to announce changes each time the search text is changed\n */\n function announceTextChange () {\n angular.isFunction($scope.textChange) && $scope.textChange();\n }\n\n /**\n * Calls any external watchers listening for the selected item. Used in conjunction with\n * `registerSelectedItemWatcher`.\n * @param selectedItem\n * @param previousSelectedItem\n */\n function handleSelectedItemChange (selectedItem, previousSelectedItem) {\n selectedItemWatchers.forEach(function (watcher) { watcher(selectedItem, previousSelectedItem); });\n }\n\n /**\n * Register a function to be called when the selected item changes.\n * @param cb\n */\n function registerSelectedItemWatcher (cb) {\n if (selectedItemWatchers.indexOf(cb) == -1) {\n selectedItemWatchers.push(cb);\n }\n }\n\n /**\n * Unregister a function previously registered for selected item changes.\n * @param cb\n */\n function unregisterSelectedItemWatcher (cb) {\n var i = selectedItemWatchers.indexOf(cb);\n if (i != -1) {\n selectedItemWatchers.splice(i, 1);\n }\n }\n\n /**\n * Handles changes to the searchText property.\n * @param searchText\n * @param previousSearchText\n */\n function handleSearchText (searchText, previousSearchText) {\n ctrl.index = getDefaultIndex();\n\n // do nothing on init\n if (searchText === previousSearchText) return;\n\n updateModelValidators();\n\n getDisplayValue($scope.selectedItem).then(function (val) {\n // clear selected item if search text no longer matches it\n if (searchText !== val) {\n $scope.selectedItem = null;\n\n\n // trigger change event if available\n if (searchText !== previousSearchText) announceTextChange();\n\n // cancel results if search text is not long enough\n if (!isMinLengthMet()) {\n ctrl.matches = [];\n\n setLoading(false);\n reportMessages(false, ReportType.Count);\n\n } else {\n handleQuery();\n }\n }\n });\n\n }\n\n /**\n * Handles input blur event, determines if the dropdown should hide.\n */\n function blur($event) {\n hasFocus = false;\n\n if (!noBlur) {\n ctrl.hidden = shouldHide();\n evalAttr('ngBlur', { $event: $event });\n }\n }\n\n /**\n * Force blur on input element\n * @param forceBlur\n */\n function doBlur(forceBlur) {\n if (forceBlur) {\n noBlur = false;\n hasFocus = false;\n }\n elements.input.blur();\n }\n\n /**\n * Handles input focus event, determines if the dropdown should show.\n */\n function focus($event) {\n hasFocus = true;\n\n if (isSearchable() && isMinLengthMet()) {\n handleQuery();\n }\n\n ctrl.hidden = shouldHide();\n\n evalAttr('ngFocus', { $event: $event });\n }\n\n /**\n * Handles keyboard input.\n * @param event\n */\n function keydown (event) {\n switch (event.keyCode) {\n case $mdConstant.KEY_CODE.DOWN_ARROW:\n if (ctrl.loading) return;\n event.stopPropagation();\n event.preventDefault();\n ctrl.index = Math.min(ctrl.index + 1, ctrl.matches.length - 1);\n updateScroll();\n reportMessages(false, ReportType.Selected);\n break;\n case $mdConstant.KEY_CODE.UP_ARROW:\n if (ctrl.loading) return;\n event.stopPropagation();\n event.preventDefault();\n ctrl.index = ctrl.index < 0 ? ctrl.matches.length - 1 : Math.max(0, ctrl.index - 1);\n updateScroll();\n reportMessages(false, ReportType.Selected);\n break;\n case $mdConstant.KEY_CODE.TAB:\n // If we hit tab, assume that we've left the list so it will close\n onListLeave();\n\n if (ctrl.hidden || ctrl.loading || ctrl.index < 0 || ctrl.matches.length < 1) return;\n select(ctrl.index);\n break;\n case $mdConstant.KEY_CODE.ENTER:\n if (ctrl.hidden || ctrl.loading || ctrl.index < 0 || ctrl.matches.length < 1) return;\n if (hasSelection()) return;\n event.stopPropagation();\n event.preventDefault();\n select(ctrl.index);\n break;\n case $mdConstant.KEY_CODE.ESCAPE:\n event.preventDefault(); // Prevent browser from always clearing input\n if (!shouldProcessEscape()) return;\n event.stopPropagation();\n\n clearSelectedItem();\n if ($scope.searchText && hasEscapeOption('clear')) {\n clearSearchText();\n }\n\n // Manually hide (needed for mdNotFound support)\n ctrl.hidden = true;\n\n if (hasEscapeOption('blur')) {\n // Force the component to blur if they hit escape\n doBlur(true);\n }\n\n break;\n default:\n }\n }\n\n //-- getters\n\n /**\n * Returns the minimum length needed to display the dropdown.\n * @returns {*}\n */\n function getMinLength () {\n return angular.isNumber($scope.minLength) ? $scope.minLength : 1;\n }\n\n /**\n * Returns the display value for an item.\n * @param item\n * @returns {*}\n */\n function getDisplayValue (item) {\n return $q.when(getItemText(item) || item).then(function(itemText) {\n if (itemText && !angular.isString(itemText)) {\n $log.warn('md-autocomplete: Could not resolve display value to a string. ' +\n 'Please check the `md-item-text` attribute.');\n }\n\n return itemText;\n });\n\n /**\n * Getter function to invoke user-defined expression (in the directive)\n * to convert your object to a single string.\n */\n function getItemText (item) {\n return (item && $scope.itemText) ? $scope.itemText(getItemAsNameVal(item)) : null;\n }\n }\n\n /**\n * Returns the locals object for compiling item templates.\n * @param item\n * @returns {{}}\n */\n function getItemAsNameVal (item) {\n if (!item) return undefined;\n\n var locals = {};\n if (ctrl.itemName) locals[ ctrl.itemName ] = item;\n\n return locals;\n }\n\n /**\n * Returns the default index based on whether or not autoselect is enabled.\n * @returns {number}\n */\n function getDefaultIndex () {\n return $scope.autoselect ? 0 : -1;\n }\n\n /**\n * Sets the loading parameter and updates the hidden state.\n * @param value {boolean} Whether or not the component is currently loading.\n */\n function setLoading(value) {\n if (ctrl.loading != value) {\n ctrl.loading = value;\n }\n\n // Always refresh the hidden variable as something else might have changed\n ctrl.hidden = shouldHide();\n }\n\n /**\n * Determines if the menu should be hidden.\n * @returns {boolean}\n */\n function shouldHide () {\n if (!isSearchable()) return true; // Hide when not able to query\n else return !shouldShow(); // Hide when the dropdown is not able to show.\n }\n\n /**\n * Determines whether the autocomplete is able to query within the current state.\n * @returns {boolean}\n */\n function isSearchable() {\n if (ctrl.loading && !hasMatches()) return false; // No query when query is in progress.\n else if (hasSelection()) return false; // No query if there is already a selection\n else if (!hasFocus) return false; // No query if the input does not have focus\n return true;\n }\n\n /**\n * Determines if the escape keydown should be processed\n * @returns {boolean}\n */\n function shouldProcessEscape() {\n return hasEscapeOption('blur') || !ctrl.hidden || ctrl.loading || hasEscapeOption('clear') && $scope.searchText;\n }\n\n /**\n * Determines if an escape option is set\n * @returns {boolean}\n */\n function hasEscapeOption(option) {\n return !$scope.escapeOptions || $scope.escapeOptions.toLowerCase().indexOf(option) !== -1;\n }\n\n /**\n * Determines if the menu should be shown.\n * @returns {boolean}\n */\n function shouldShow() {\n return (isMinLengthMet() && hasMatches()) || notFoundVisible();\n }\n\n /**\n * Returns true if the search text has matches.\n * @returns {boolean}\n */\n function hasMatches() {\n return ctrl.matches.length ? true : false;\n }\n\n /**\n * Returns true if the autocomplete has a valid selection.\n * @returns {boolean}\n */\n function hasSelection() {\n return ctrl.scope.selectedItem ? true : false;\n }\n\n /**\n * Returns true if the loading indicator is, or should be, visible.\n * @returns {boolean}\n */\n function loadingIsVisible() {\n return ctrl.loading && !hasSelection();\n }\n\n /**\n * Returns the display value of the current item.\n * @returns {*}\n */\n function getCurrentDisplayValue () {\n return getDisplayValue(ctrl.matches[ ctrl.index ]);\n }\n\n /**\n * Determines if the minimum length is met by the search text.\n * @returns {*}\n */\n function isMinLengthMet () {\n return ($scope.searchText || '').length >= getMinLength();\n }\n\n //-- actions\n\n /**\n * Defines a public property with a handler and a default value.\n * @param key\n * @param handler\n * @param value\n */\n function defineProperty (key, handler, value) {\n Object.defineProperty(ctrl, key, {\n get: function () { return value; },\n set: function (newValue) {\n var oldValue = value;\n value = newValue;\n handler(newValue, oldValue);\n }\n });\n }\n\n /**\n * Selects the item at the given index.\n * @param index\n */\n function select (index) {\n //-- force form to update state for validation\n $mdUtil.nextTick(function () {\n getDisplayValue(ctrl.matches[ index ]).then(function (val) {\n var ngModel = elements.$.input.controller('ngModel');\n ngModel.$setViewValue(val);\n ngModel.$render();\n }).finally(function () {\n $scope.selectedItem = ctrl.matches[ index ];\n setLoading(false);\n });\n }, false);\n }\n\n /**\n * Clears the searchText value and selected item.\n */\n function clearValue () {\n clearSelectedItem();\n clearSearchText();\n }\n\n /**\n * Clears the selected item\n */\n function clearSelectedItem () {\n // Reset our variables\n ctrl.index = 0;\n ctrl.matches = [];\n }\n\n /**\n * Clears the searchText value\n */\n function clearSearchText () {\n // Set the loading to true so we don't see flashes of content.\n // The flashing will only occur when an async request is running.\n // So the loading process will stop when the results had been retrieved.\n setLoading(true);\n\n $scope.searchText = '';\n\n // Normally, triggering the change / input event is unnecessary, because the browser detects it properly.\n // But some browsers are not detecting it properly, which means that we have to trigger the event.\n // Using the `input` is not working properly, because for example IE11 is not supporting the `input` event.\n // The `change` event is a good alternative and is supported by all supported browsers.\n var eventObj = $document[0].createEvent('CustomEvent');\n eventObj.initCustomEvent('change', true, true, { value: '' });\n elements.input.dispatchEvent(eventObj);\n\n // For some reason, firing the above event resets the value of $scope.searchText if\n // $scope.searchText has a space character at the end, so we blank it one more time and then\n // focus.\n elements.input.blur();\n $scope.searchText = '';\n elements.input.focus();\n }\n\n /**\n * Fetches the results for the provided search text.\n * @param searchText\n */\n function fetchResults (searchText) {\n var items = $scope.$parent.$eval(itemExpr),\n term = searchText.toLowerCase(),\n isList = angular.isArray(items),\n isPromise = !!items.then; // Every promise should contain a `then` property\n\n if (isList) onResultsRetrieved(items);\n else if (isPromise) handleAsyncResults(items);\n\n function handleAsyncResults(items) {\n if ( !items ) return;\n\n items = $q.when(items);\n fetchesInProgress++;\n setLoading(true);\n\n $mdUtil.nextTick(function () {\n items\n .then(onResultsRetrieved)\n .finally(function(){\n if (--fetchesInProgress === 0) {\n setLoading(false);\n }\n });\n },true, $scope);\n }\n\n function onResultsRetrieved(matches) {\n cache[term] = matches;\n\n // Just cache the results if the request is now outdated.\n // The request becomes outdated, when the new searchText has changed during the result fetching.\n if ((searchText || '') !== ($scope.searchText || '')) {\n return;\n }\n\n handleResults(matches);\n }\n }\n\n\n /**\n * Reports given message types to supported screenreaders.\n * @param {boolean} isPolite Whether the announcement should be polite.\n * @param {!number} types Message flags to be reported to the screenreader.\n */\n function reportMessages(isPolite, types) {\n\n var politeness = isPolite ? 'polite' : 'assertive';\n var messages = [];\n\n if (types & ReportType.Selected && ctrl.index !== -1) {\n messages.push(getCurrentDisplayValue());\n }\n\n if (types & ReportType.Count) {\n messages.push($q.resolve(getCountMessage()));\n }\n\n $q.all(messages).then(function(data) {\n $mdLiveAnnouncer.announce(data.join(' '), politeness);\n });\n\n }\n\n /**\n * Returns the ARIA message for how many results match the current query.\n * @returns {*}\n */\n function getCountMessage () {\n switch (ctrl.matches.length) {\n case 0:\n return 'There are no matches available.';\n case 1:\n return 'There is 1 match available.';\n default:\n return 'There are ' + ctrl.matches.length + ' matches available.';\n }\n }\n\n /**\n * Makes sure that the focused element is within view.\n */\n function updateScroll () {\n if (!elements.li[0]) return;\n var height = elements.li[0].offsetHeight,\n top = height * ctrl.index,\n bot = top + height,\n hgt = elements.scroller.clientHeight,\n scrollTop = elements.scroller.scrollTop;\n if (top < scrollTop) {\n scrollTo(top);\n } else if (bot > scrollTop + hgt) {\n scrollTo(bot - hgt);\n }\n }\n\n function isPromiseFetching() {\n return fetchesInProgress !== 0;\n }\n\n function scrollTo (offset) {\n elements.$.scrollContainer.controller('mdVirtualRepeatContainer').scrollTo(offset);\n }\n\n function notFoundVisible () {\n var textLength = (ctrl.scope.searchText || '').length;\n\n return ctrl.hasNotFound && !hasMatches() && (!ctrl.loading || isPromiseFetching()) && textLength >= getMinLength() && (hasFocus || noBlur) && !hasSelection();\n }\n\n /**\n * Starts the query to gather the results for the current searchText. Attempts to return cached\n * results first, then forwards the process to `fetchResults` if necessary.\n */\n function handleQuery () {\n var searchText = $scope.searchText || '';\n var term = searchText.toLowerCase();\n\n // If caching is enabled and the current searchText is stored in the cache\n if (!$scope.noCache && cache[term]) {\n // The results should be handled as same as a normal un-cached request does.\n handleResults(cache[term]);\n } else {\n fetchResults(searchText);\n }\n\n ctrl.hidden = shouldHide();\n }\n\n /**\n * Handles the retrieved results by showing them in the autocompletes dropdown.\n * @param results Retrieved results\n */\n function handleResults(results) {\n ctrl.matches = results;\n ctrl.hidden = shouldHide();\n\n // If loading is in progress, then we'll end the progress. This is needed for example,\n // when the `clear` button was clicked, because there we always show the loading process, to prevent flashing.\n if (ctrl.loading) setLoading(false);\n\n if ($scope.selectOnMatch) selectItemOnMatch();\n\n positionDropdown();\n reportMessages(true, ReportType.Count);\n }\n\n /**\n * If there is only one matching item and the search text matches its display value exactly,\n * automatically select that item. Note: This function is only called if the user uses the\n * `md-select-on-match` flag.\n */\n function selectItemOnMatch () {\n var searchText = $scope.searchText,\n matches = ctrl.matches,\n item = matches[ 0 ];\n if (matches.length === 1) getDisplayValue(item).then(function (displayValue) {\n var isMatching = searchText == displayValue;\n if ($scope.matchInsensitive && !isMatching) {\n isMatching = searchText.toLowerCase() == displayValue.toLowerCase();\n }\n\n if (isMatching) select(0);\n });\n }\n\n /**\n * Evaluates an attribute expression against the parent scope.\n * @param {String} attr Name of the attribute to be evaluated.\n * @param {Object?} locals Properties to be injected into the evaluation context.\n */\n function evalAttr(attr, locals) {\n if ($attrs[attr]) {\n $scope.$parent.$eval($attrs[attr], locals || {});\n }\n }\n }\n\n angular.module('eHRD.kernel.uiElements.cusMaterial')\n .directive('cusMdAutocomplete', cusMdAutocomplete);\n})();\n\n/**\n * Created by Bruce on 2016/12/19.\n */\n\n(function () {\n 'use strict';\n var $MD_THEME_CSS = \"md-autocomplete.md-THEME_NAME-theme{background:'{{background-A100}}'}md-autocomplete.md-THEME_NAME-theme[disabled]:not([md-floating-label]){background:'{{background-100}}'}md-autocomplete.md-THEME_NAME-theme button md-icon path{fill:'{{background-600}}'}md-autocomplete.md-THEME_NAME-theme button:after{background:'{{background-600-0.3}}'}.md-autocomplete-suggestions-container.md-THEME_NAME-theme{background:'{{background-A100}}'}.md-autocomplete-suggestions-container.md-THEME_NAME-theme li{color:'{{background-900}}'}.md-autocomplete-suggestions-container.md-THEME_NAME-theme li .highlight{color:'{{background-600}}'}.md-autocomplete-suggestions-container.md-THEME_NAME-theme li.selected,.md-autocomplete-suggestions-container.md-THEME_NAME-theme li:hover{background:'{{background-200}}'}cus-md-autocomplete.md-THEME_NAME-theme{background:'{{background-A100}}'}cus-md-autocomplete.md-THEME_NAME-theme[disabled]:not([md-floating-label]){background:'{{background-100}}'}cus-md-autocomplete.md-THEME_NAME-theme button md-icon path{fill:'{{background-600}}'}cus-md-autocomplete.md-THEME_NAME-theme button:after{background:'{{background-600-0.3}}'}.md-autocomplete-suggestions-container.md-THEME_NAME-theme{background:'{{background-A100}}'}.md-autocomplete-suggestions-container.md-THEME_NAME-theme li{color:'{{background-900}}'}.md-autocomplete-suggestions-container.md-THEME_NAME-theme li .highlight{color:'{{background-600}}'}.md-autocomplete-suggestions-container.md-THEME_NAME-theme li:hover,.md-autocomplete-suggestions-container.md-THEME_NAME-theme li.selected{background:'{{background-200}}'}md-backdrop{background-color:'{{background-900-0.0}}'}md-backdrop.md-opaque.md-THEME_NAME-theme{background-color:'{{background-900-1.0}}'}md-bottom-sheet.md-THEME_NAME-theme{background-color:'{{background-50}}';border-top-color:'{{background-300}}'}md-bottom-sheet.md-THEME_NAME-theme.md-list md-list-item{color:'{{foreground-1}}'}md-bottom-sheet.md-THEME_NAME-theme .md-subheader{background-color:'{{background-50}}';color:'{{foreground-1}}'}.md-button.md-THEME_NAME-theme:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme:not([disabled]):hover{background-color:'{{background-500-0.2}}'}.md-button.md-THEME_NAME-theme:not([disabled]).md-icon-button:hover{background-color:transparent}.md-button.md-THEME_NAME-theme.md-fab md-icon{color:'{{accent-contrast}}'}.md-button.md-THEME_NAME-theme.md-primary{color:'{{primary-color}}'}.md-button.md-THEME_NAME-theme.md-primary.md-fab,.md-button.md-THEME_NAME-theme.md-primary.md-raised{color:'{{primary-contrast}}';background-color:'{{primary-color}}'}.md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]) md-icon,.md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]) md-icon{color:'{{primary-contrast}}'}.md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):hover,.md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):hover{background-color:'{{primary-600}}'}.md-button.md-THEME_NAME-theme.md-primary:not([disabled]) md-icon{color:'{{primary-color}}'}.md-button.md-THEME_NAME-theme.md-fab{background-color:'{{accent-color}}';color:'{{accent-contrast}}'}.md-button.md-THEME_NAME-theme.md-fab:not([disabled]) .md-icon{color:'{{accent-contrast}}'}.md-button.md-THEME_NAME-theme.md-fab:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-fab:not([disabled]):hover{background-color:'{{accent-A700}}'}.md-button.md-THEME_NAME-theme.md-raised{color:'{{background-900}}';background-color:'{{background-50}}'}.md-button.md-THEME_NAME-theme.md-raised:not([disabled]) md-icon{color:'{{background-900}}'}.md-button.md-THEME_NAME-theme.md-raised:not([disabled]):hover{background-color:'{{background-50}}'}.md-button.md-THEME_NAME-theme.md-raised:not([disabled]).md-focused{background-color:'{{background-200}}'}.md-button.md-THEME_NAME-theme.md-warn{color:'{{warn-color}}'}.md-button.md-THEME_NAME-theme.md-warn.md-fab,.md-button.md-THEME_NAME-theme.md-warn.md-raised{color:'{{warn-contrast}}';background-color:'{{warn-color}}'}.md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]) md-icon,.md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]) md-icon{color:'{{warn-contrast}}'}.md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):hover,.md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):hover{background-color:'{{warn-600}}'}.md-button.md-THEME_NAME-theme.md-warn:not([disabled]) md-icon{color:'{{warn-color}}'}.md-button.md-THEME_NAME-theme.md-accent{color:'{{accent-color}}'}.md-button.md-THEME_NAME-theme.md-accent.md-fab,.md-button.md-THEME_NAME-theme.md-accent.md-raised{color:'{{accent-contrast}}';background-color:'{{accent-color}}'}.md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]) md-icon,.md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]) md-icon{color:'{{accent-contrast}}'}.md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):hover,.md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]).md-focused,.md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):hover{background-color:'{{accent-A700}}'}.md-button.md-THEME_NAME-theme.md-accent:not([disabled]) md-icon{color:'{{accent-color}}'}.md-button.md-THEME_NAME-theme.md-accent[disabled],.md-button.md-THEME_NAME-theme.md-fab[disabled],.md-button.md-THEME_NAME-theme.md-raised[disabled],.md-button.md-THEME_NAME-theme.md-warn[disabled],.md-button.md-THEME_NAME-theme[disabled]{color:'{{foreground-3}}';cursor:default}.md-button.md-THEME_NAME-theme.md-accent[disabled] md-icon,.md-button.md-THEME_NAME-theme.md-fab[disabled] md-icon,.md-button.md-THEME_NAME-theme.md-raised[disabled] md-icon,.md-button.md-THEME_NAME-theme.md-warn[disabled] md-icon,.md-button.md-THEME_NAME-theme[disabled] md-icon{color:'{{foreground-3}}'}.md-button.md-THEME_NAME-theme.md-fab[disabled],.md-button.md-THEME_NAME-theme.md-raised[disabled]{background-color:'{{foreground-4}}'}.md-button.md-THEME_NAME-theme[disabled]{background-color:transparent}._md a.md-THEME_NAME-theme:not(.md-button).md-primary{color:'{{primary-color}}'}._md a.md-THEME_NAME-theme:not(.md-button).md-primary:hover{color:'{{primary-700}}'}._md a.md-THEME_NAME-theme:not(.md-button).md-accent:hover{color:'{{accent-700}}'}._md a.md-THEME_NAME-theme:not(.md-button).md-accent{color:'{{accent-color}}'}._md a.md-THEME_NAME-theme:not(.md-button).md-accent:hover{color:'{{accent-A700}}'}._md a.md-THEME_NAME-theme:not(.md-button).md-warn{color:'{{warn-color}}'}._md a.md-THEME_NAME-theme:not(.md-button).md-warn:hover{color:'{{warn-700}}'}md-card.md-THEME_NAME-theme{color:'{{foreground-1}}';background-color:'{{background-hue-1}}';border-radius:2px}md-card.md-THEME_NAME-theme .md-card-image{border-radius:2px 2px 0 0}md-card.md-THEME_NAME-theme md-card-header md-card-avatar md-icon{color:'{{background-color}}';background-color:'{{foreground-3}}'}md-card.md-THEME_NAME-theme md-card-header md-card-header-text .md-subhead,md-card.md-THEME_NAME-theme md-card-title md-card-title-text:not(:only-child) .md-subhead{color:'{{foreground-2}}'}md-checkbox.md-THEME_NAME-theme .md-ripple{color:'{{accent-A700}}'}md-checkbox.md-THEME_NAME-theme.md-checked .md-ripple{color:'{{background-600}}'}md-checkbox.md-THEME_NAME-theme.md-checked.md-focused .md-container:before{background-color:'{{accent-color-0.26}}'}md-checkbox.md-THEME_NAME-theme .md-ink-ripple{color:'{{foreground-2}}'}md-checkbox.md-THEME_NAME-theme.md-checked .md-ink-ripple{color:'{{accent-color-0.87}}'}md-checkbox.md-THEME_NAME-theme:not(.md-checked) .md-icon{border-color:'{{foreground-2}}'}md-checkbox.md-THEME_NAME-theme.md-checked .md-icon{background-color:'{{accent-color-0.87}}'}md-checkbox.md-THEME_NAME-theme.md-checked .md-icon:after{border-color:'{{accent-contrast-0.87}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-ripple{color:'{{primary-600}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ripple{color:'{{background-600}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-ink-ripple{color:'{{foreground-2}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ink-ripple{color:'{{primary-color-0.87}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary:not(.md-checked) .md-icon{border-color:'{{foreground-2}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon{background-color:'{{primary-color-0.87}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked.md-focused .md-container:before{background-color:'{{primary-color-0.26}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon:after{border-color:'{{primary-contrast-0.87}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-indeterminate[disabled] .md-container{color:'{{foreground-3}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-ripple{color:'{{warn-600}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-ink-ripple{color:'{{foreground-2}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple{color:'{{warn-color-0.87}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn:not(.md-checked) .md-icon{border-color:'{{foreground-2}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon{background-color:'{{warn-color-0.87}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked.md-focused:not([disabled]) .md-container:before{background-color:'{{warn-color-0.26}}'}md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon:after{border-color:'{{background-200}}'}md-checkbox.md-THEME_NAME-theme[disabled]:not(.md-checked) .md-icon{border-color:'{{foreground-3}}'}md-checkbox.md-THEME_NAME-theme[disabled].md-checked .md-icon{background-color:'{{foreground-3}}'}md-checkbox.md-THEME_NAME-theme[disabled].md-checked .md-icon:after{border-color:'{{background-200}}'}md-checkbox.md-THEME_NAME-theme[disabled] .md-icon:after{border-color:'{{foreground-3}}'}md-checkbox.md-THEME_NAME-theme[disabled] .md-label{color:'{{foreground-3}}'}md-chips.md-THEME_NAME-theme .md-chips{box-shadow:0 1px '{{foreground-4}}'}md-chips.md-THEME_NAME-theme .md-chips.md-focused{box-shadow:0 2px '{{primary-color}}'}md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input{color:'{{foreground-1}}'}md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input:-moz-placeholder,md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input::-moz-placeholder{color:'{{foreground-3}}'}md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input:-ms-input-placeholder{color:'{{foreground-3}}'}md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input::-webkit-input-placeholder{color:'{{foreground-3}}'}md-chips.md-THEME_NAME-theme md-chip{background:'{{background-300}}';color:'{{background-800}}'}md-chips.md-THEME_NAME-theme md-chip md-icon{color:'{{background-700}}'}md-chips.md-THEME_NAME-theme md-chip.md-focused{background:'{{primary-color}}';color:'{{primary-contrast}}'}md-chips.md-THEME_NAME-theme md-chip.md-focused md-icon{color:'{{primary-contrast}}'}md-chips.md-THEME_NAME-theme md-chip._md-chip-editing{background:transparent;color:'{{background-800}}'}md-chips.md-THEME_NAME-theme md-chip-remove .md-button md-icon path{fill:'{{background-500}}'}.md-contact-suggestion span.md-contact-email{color:'{{background-400}}'}cus-md-chips.md-THEME_NAME-theme .md-chips{box-shadow:0 1px '{{foreground-4}}'}cus-md-chips.md-THEME_NAME-theme .md-chips.md-focused{box-shadow:0 2px '{{primary-color}}'}cus-md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input{color:'{{foreground-1}}'}cus-md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input::-webkit-input-placeholder{color:'{{foreground-3}}'}cus-md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input:-moz-placeholder{color:'{{foreground-3}}'}cus-md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input::-moz-placeholder{color:'{{foreground-3}}'}cus-md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input:-ms-input-placeholder{color:'{{foreground-3}}'}md-chips.md-THEME_NAME-theme .md-chips .md-chip-input-container input::-webkit-input-placeholder{color:'{{foreground-3}}'}cus-md-chips.md-THEME_NAME-theme cus-md-chip{background:'{{background-300}}';color:'{{background-800}}'}cus-md-chips.md-THEME_NAME-theme cus-md-chip md-icon{color:'{{background-700}}'}cus-md-chips.md-THEME_NAME-theme cus-md-chip.md-focused{background:'{{primary-color}}';color:'{{primary-contrast}}'}md-chips.md-THEME_NAME-theme md-chip.md-focused md-icon{color:'{{primary-contrast}}'}cus-md-chips.md-THEME_NAME-theme cus-md-chip._md-chip-editing{background:transparent;color:'{{background-800}}'}cus-md-chips.md-THEME_NAME-theme md-chip-remove .md-button md-icon path{fill:'{{background-500}}'}.md-contact-suggestion span.md-contact-email{color:'{{background-400}}'}md-content.md-THEME_NAME-theme{color:'{{foreground-1}}';background-color:'{{background-default}}'}.md-calendar.md-THEME_NAME-theme{background:'{{background-A100}}';color:'{{background-A200-0.87}}'}.md-calendar.md-THEME_NAME-theme tr:last-child td{border-bottom-color:'{{background-200}}'}.md-THEME_NAME-theme .md-calendar-day-header{background:'{{background-300}}';color:'{{background-A200-0.87}}'}.md-THEME_NAME-theme .md-calendar-date.md-calendar-date-today .md-calendar-date-selection-indicator{border:1px solid '{{primary-500}}'}.md-THEME_NAME-theme .md-calendar-date.md-calendar-date-today.md-calendar-date-disabled{color:'{{primary-500-0.6}}'}.md-calendar-date.md-focus .md-THEME_NAME-theme .md-calendar-date-selection-indicator,.md-THEME_NAME-theme .md-calendar-date-selection-indicator:hover{background:'{{background-300}}'}.md-THEME_NAME-theme .md-calendar-date.md-calendar-selected-date .md-calendar-date-selection-indicator,.md-THEME_NAME-theme .md-calendar-date.md-focus.md-calendar-selected-date .md-calendar-date-selection-indicator{background:'{{primary-500}}';color:'{{primary-500-contrast}}';border-color:transparent}.md-THEME_NAME-theme .md-calendar-date-disabled,.md-THEME_NAME-theme .md-calendar-month-label-disabled{color:'{{background-A200-0.435}}'}.md-THEME_NAME-theme .md-datepicker-input{color:'{{foreground-1}}'}.md-THEME_NAME-theme .md-datepicker-input:-moz-placeholder,.md-THEME_NAME-theme .md-datepicker-input::-moz-placeholder{color:'{{foreground-3}}'}.md-THEME_NAME-theme .md-datepicker-input:-ms-input-placeholder{color:'{{foreground-3}}'}.md-THEME_NAME-theme .md-datepicker-input::-webkit-input-placeholder{color:'{{foreground-3}}'}.md-THEME_NAME-theme .md-datepicker-input-container{border-bottom-color:'{{foreground-4}}'}.md-THEME_NAME-theme .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:'{{primary-color}}'}.md-accent .md-THEME_NAME-theme .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:'{{accent-color}}'}.md-THEME_NAME-theme .md-datepicker-input-container.md-datepicker-invalid,.md-warn .md-THEME_NAME-theme .md-datepicker-input-container.md-datepicker-focused{border-bottom-color:'{{warn-A700}}'}.md-THEME_NAME-theme .md-datepicker-calendar-pane{border-color:'{{background-hue-1}}'}.md-THEME_NAME-theme .md-datepicker-triangle-button .md-datepicker-expand-triangle{border-top-color:'{{foreground-3}}'}.md-THEME_NAME-theme .md-datepicker-triangle-button:hover .md-datepicker-expand-triangle{border-top-color:'{{foreground-2}}'}.md-THEME_NAME-theme .md-datepicker-open .md-datepicker-calendar-icon{color:'{{primary-color}}'}.md-accent .md-THEME_NAME-theme .md-datepicker-open .md-datepicker-calendar-icon,.md-THEME_NAME-theme .md-datepicker-open.md-accent .md-datepicker-calendar-icon{color:'{{accent-color}}'}.md-THEME_NAME-theme .md-datepicker-open.md-warn .md-datepicker-calendar-icon,.md-warn .md-THEME_NAME-theme .md-datepicker-open .md-datepicker-calendar-icon{color:'{{warn-A700}}'}.md-THEME_NAME-theme .md-datepicker-calendar{background:'{{background-A100}}'}.md-THEME_NAME-theme .md-datepicker-input-mask-opaque{box-shadow:0 0 0 9999px \\\"{{background-hue-1}}\\\"}.md-THEME_NAME-theme .md-datepicker-open .md-datepicker-input-container{background:\\\"{{background-hue-1}}\\\"}md-dialog.md-THEME_NAME-theme{border-radius:4px;background-color:'{{background-hue-1}}';color:'{{foreground-1}}'}md-dialog.md-THEME_NAME-theme.md-content-overflow .md-actions,md-dialog.md-THEME_NAME-theme.md-content-overflow md-dialog-actions,md-divider.md-THEME_NAME-theme{border-top-color:'{{foreground-4}}'}.layout-gt-lg-row>md-divider.md-THEME_NAME-theme,.layout-gt-md-row>md-divider.md-THEME_NAME-theme,.layout-gt-sm-row>md-divider.md-THEME_NAME-theme,.layout-gt-xs-row>md-divider.md-THEME_NAME-theme,.layout-lg-row>md-divider.md-THEME_NAME-theme,.layout-md-row>md-divider.md-THEME_NAME-theme,.layout-row>md-divider.md-THEME_NAME-theme,.layout-sm-row>md-divider.md-THEME_NAME-theme,.layout-xl-row>md-divider.md-THEME_NAME-theme,.layout-xs-row>md-divider.md-THEME_NAME-theme{border-right-color:'{{foreground-4}}'}md-icon.md-THEME_NAME-theme{color:'{{foreground-2}}'}md-icon.md-THEME_NAME-theme.md-primary{color:'{{primary-color}}'}md-icon.md-THEME_NAME-theme.md-accent{color:'{{accent-color}}'}md-icon.md-THEME_NAME-theme.md-warn{color:'{{warn-color}}'}md-input-container.md-THEME_NAME-theme .md-input{color:'{{foreground-1}}';border-color:'{{foreground-4}}'}md-input-container.md-THEME_NAME-theme .md-input:-moz-placeholder,md-input-container.md-THEME_NAME-theme .md-input::-moz-placeholder{color:'{{foreground-3}}'}md-input-container.md-THEME_NAME-theme .md-input:-ms-input-placeholder{color:'{{foreground-3}}'}md-input-container.md-THEME_NAME-theme .md-input::-webkit-input-placeholder{color:'{{foreground-3}}'}md-input-container.md-THEME_NAME-theme>md-icon{color:'{{foreground-1}}'}md-input-container.md-THEME_NAME-theme .md-placeholder,md-input-container.md-THEME_NAME-theme label{color:'{{foreground-3}}'}md-input-container.md-THEME_NAME-theme label.md-required:after{color:'{{warn-A700}}'}md-input-container.md-THEME_NAME-theme:not(.md-input-focused):not(.md-input-invalid) label.md-required:after{color:'{{foreground-2}}'}md-input-container.md-THEME_NAME-theme .md-input-message-animation,md-input-container.md-THEME_NAME-theme .md-input-messages-animation{color:'{{warn-A700}}'}md-input-container.md-THEME_NAME-theme .md-input-message-animation .md-char-counter,md-input-container.md-THEME_NAME-theme .md-input-messages-animation .md-char-counter{color:'{{foreground-1}}'}md-input-container.md-THEME_NAME-theme.md-input-focused .md-input:-moz-placeholder,md-input-container.md-THEME_NAME-theme.md-input-focused .md-input::-moz-placeholder{color:'{{foreground-2}}'}md-input-container.md-THEME_NAME-theme.md-input-focused .md-input:-ms-input-placeholder{color:'{{foreground-2}}'}md-input-container.md-THEME_NAME-theme.md-input-focused .md-input::-webkit-input-placeholder{color:'{{foreground-2}}'}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-has-value label{color:'{{foreground-2}}'}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused .md-input,md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-resized .md-input{border-color:'{{primary-color}}'}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused label,md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused md-icon{color:'{{primary-color}}'}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent .md-input{border-color:'{{accent-color}}'}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent label,md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent md-icon{color:'{{accent-color}}'}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn .md-input{border-color:'{{warn-A700}}'}md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn label,md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn md-icon{color:'{{warn-A700}}'}md-input-container.md-THEME_NAME-theme.md-input-invalid .md-input{border-color:'{{warn-A700}}'}md-input-container.md-THEME_NAME-theme.md-input-invalid .md-char-counter,md-input-container.md-THEME_NAME-theme.md-input-invalid .md-input-message-animation,md-input-container.md-THEME_NAME-theme.md-input-invalid label{color:'{{warn-A700}}'}[disabled] md-input-container.md-THEME_NAME-theme .md-input,md-input-container.md-THEME_NAME-theme .md-input[disabled]{border-bottom-color:transparent;color:'{{foreground-3}}';background-image:linear-gradient(90deg,\\\"{{foreground-3}}\\\" 0,\\\"{{foreground-3}}\\\" 33%,transparent 0);background-image:-ms-linear-gradient(left,transparent 0,\\\"{{foreground-3}}\\\" 100%)}md-list.md-THEME_NAME-theme md-list-item.md-2-line .md-list-item-text h3,md-list.md-THEME_NAME-theme md-list-item.md-2-line .md-list-item-text h4,md-list.md-THEME_NAME-theme md-list-item.md-3-line .md-list-item-text h3,md-list.md-THEME_NAME-theme md-list-item.md-3-line .md-list-item-text h4{color:'{{foreground-1}}'}md-list.md-THEME_NAME-theme md-list-item.md-2-line .md-list-item-text p,md-list.md-THEME_NAME-theme md-list-item.md-3-line .md-list-item-text p{color:'{{foreground-2}}'}md-list.md-THEME_NAME-theme .md-proxy-focus.md-focused div.md-no-style{background-color:'{{background-100}}'}md-list.md-THEME_NAME-theme md-list-item .md-avatar-icon{background-color:'{{foreground-3}}';color:'{{background-color}}'}md-list.md-THEME_NAME-theme md-list-item>md-icon{color:'{{foreground-2}}'}md-list.md-THEME_NAME-theme md-list-item>md-icon.md-highlight{color:'{{primary-color}}'}md-list.md-THEME_NAME-theme md-list-item>md-icon.md-highlight.md-accent{color:'{{accent-color}}'}md-menu-content.md-THEME_NAME-theme{background-color:'{{background-A100}}'}md-menu-content.md-THEME_NAME-theme md-menu-item{color:'{{background-A200-0.87}}'}md-menu-content.md-THEME_NAME-theme md-menu-item md-icon{color:'{{background-A200-0.54}}'}md-menu-content.md-THEME_NAME-theme md-menu-item .md-button[disabled],md-menu-content.md-THEME_NAME-theme md-menu-item .md-button[disabled] md-icon{color:'{{background-A200-0.25}}'}md-menu-content.md-THEME_NAME-theme md-menu-divider{background-color:'{{background-A200-0.11}}'}md-menu-bar.md-THEME_NAME-theme>button.md-button{color:'{{foreground-2}}';border-radius:2px}md-menu-bar.md-THEME_NAME-theme md-menu.md-open>button,md-menu-bar.md-THEME_NAME-theme md-menu>button:focus{outline:none;background:'{{background-200}}'}md-menu-bar.md-THEME_NAME-theme.md-open:not(.md-keyboard-mode) md-menu:hover>button{background-color:'{{ background-500-0.2}}'}md-menu-bar.md-THEME_NAME-theme:not(.md-keyboard-mode):not(.md-open) md-menu button:focus,md-menu-bar.md-THEME_NAME-theme:not(.md-keyboard-mode):not(.md-open) md-menu button:hover{background:transparent}md-menu-content.md-THEME_NAME-theme .md-menu>.md-button:after{color:'{{background-A200-0.54}}'}md-menu-content.md-THEME_NAME-theme .md-menu.md-open>.md-button{background-color:'{{ background-500-0.2}}'}md-toolbar.md-THEME_NAME-theme.md-menu-toolbar{background-color:'{{background-A100}}';color:'{{background-A200}}'}md-toolbar.md-THEME_NAME-theme.md-menu-toolbar md-toolbar-filler{background-color:'{{primary-color}}';color:'{{background-A100-0.87}}'}md-toolbar.md-THEME_NAME-theme.md-menu-toolbar md-toolbar-filler md-icon{color:'{{background-A100-0.87}}'}md-nav-bar.md-THEME_NAME-theme .md-nav-bar{background-color:transparent;border-color:'{{foreground-4}}'}md-nav-bar.md-THEME_NAME-theme .md-button._md-nav-button.md-unselected{color:'{{foreground-2}}'}md-nav-bar.md-THEME_NAME-theme md-nav-ink-bar{color:'{{accent-color}}';background:'{{accent-color}}'}.md-panel{background-color:'{{background-900-0.0}}'}.md-panel._md-panel-backdrop.md-THEME_NAME-theme{background-color:'{{background-900-1.0}}'}md-progress-circular.md-THEME_NAME-theme path{stroke:'{{primary-color}}'}md-progress-circular.md-THEME_NAME-theme.md-warn path{stroke:'{{warn-color}}'}md-progress-circular.md-THEME_NAME-theme.md-accent path{stroke:'{{accent-color}}'}md-progress-linear.md-THEME_NAME-theme .md-container{background-color:'{{primary-100}}'}md-progress-linear.md-THEME_NAME-theme .md-bar{background-color:'{{primary-color}}'}md-progress-linear.md-THEME_NAME-theme.md-warn .md-container{background-color:'{{warn-100}}'}md-progress-linear.md-THEME_NAME-theme.md-warn .md-bar{background-color:'{{warn-color}}'}md-progress-linear.md-THEME_NAME-theme.md-accent .md-container{background-color:'{{accent-100}}'}md-progress-linear.md-THEME_NAME-theme.md-accent .md-bar{background-color:'{{accent-color}}'}md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-bar1{background-color:'{{warn-100}}'}md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-dashed:before{background:radial-gradient(\\\"{{warn-100}}\\\" 0,\\\"{{warn-100}}\\\" 16%,transparent 42%)}md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-bar1{background-color:'{{accent-100}}'}md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-dashed:before{background:radial-gradient(\\\"{{accent-100}}\\\" 0,\\\"{{accent-100}}\\\" 16%,transparent 42%)}md-radio-button.md-THEME_NAME-theme .md-off{border-color:'{{foreground-2}}'}md-radio-button.md-THEME_NAME-theme .md-on{background-color:'{{accent-color-0.87}}'}md-radio-button.md-THEME_NAME-theme.md-checked .md-off{border-color:'{{accent-color-0.87}}'}md-radio-button.md-THEME_NAME-theme.md-checked .md-ink-ripple{color:'{{accent-color-0.87}}'}md-radio-button.md-THEME_NAME-theme .md-container .md-ripple{color:'{{accent-A700}}'}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-on,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-primary .md-on,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-primary .md-on,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-primary .md-on{background-color:'{{primary-color-0.87}}'}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-off,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-primary.md-checked .md-off,md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-checked .md-off,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-primary .md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-primary.md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-primary .md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-primary .md-checked .md-off{border-color:'{{primary-color-0.87}}'}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ink-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-primary.md-checked .md-ink-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-checked .md-ink-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-primary .md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-primary.md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-primary .md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-primary .md-checked .md-ink-ripple{color:'{{primary-color-0.87}}'}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-container .md-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-primary .md-container .md-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-primary .md-container .md-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-primary .md-container .md-ripple{color:'{{primary-600}}'}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-on,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-warn .md-on,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-warn .md-on,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-warn .md-on{background-color:'{{warn-color-0.87}}'}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-off,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-warn.md-checked .md-off,md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-checked .md-off,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-warn .md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-warn.md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-warn .md-checked .md-off,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-warn .md-checked .md-off{border-color:'{{warn-color-0.87}}'}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-warn.md-checked .md-ink-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-checked .md-ink-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-warn .md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-warn.md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-warn .md-checked .md-ink-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-warn .md-checked .md-ink-ripple{color:'{{warn-color-0.87}}'}md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-container .md-ripple,md-radio-button.md-THEME_NAME-theme:not([disabled]) .md-warn .md-container .md-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]).md-warn .md-container .md-ripple,md-radio-group.md-THEME_NAME-theme:not([disabled]) .md-warn .md-container .md-ripple{color:'{{warn-600}}'}md-radio-button.md-THEME_NAME-theme[disabled],md-radio-group.md-THEME_NAME-theme[disabled]{color:'{{foreground-3}}'}md-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-off,md-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-on,md-radio-group.md-THEME_NAME-theme[disabled] .md-container .md-off,md-radio-group.md-THEME_NAME-theme[disabled] .md-container .md-on{border-color:'{{foreground-3}}'}md-radio-group.md-THEME_NAME-theme .md-checked .md-ink-ripple{color:'{{accent-color-0.26}}'}md-radio-group.md-THEME_NAME-theme .md-checked:not([disabled]).md-primary .md-ink-ripple,md-radio-group.md-THEME_NAME-theme.md-primary .md-checked:not([disabled]) .md-ink-ripple{color:'{{primary-color-0.26}}'}md-radio-group.md-THEME_NAME-theme .md-checked.md-primary .md-ink-ripple{color:'{{warn-color-0.26}}'}md-radio-group.md-THEME_NAME-theme.md-focused:not(:empty) .md-checked .md-container:before{background-color:'{{accent-color-0.26}}'}md-radio-group.md-THEME_NAME-theme.md-focused:not(:empty) .md-checked.md-primary .md-container:before,md-radio-group.md-THEME_NAME-theme.md-focused:not(:empty).md-primary .md-checked .md-container:before{background-color:'{{primary-color-0.26}}'}md-radio-group.md-THEME_NAME-theme.md-focused:not(:empty) .md-checked.md-warn .md-container:before,md-radio-group.md-THEME_NAME-theme.md-focused:not(:empty).md-warn .md-checked .md-container:before{background-color:'{{warn-color-0.26}}'}md-input-container md-select.md-THEME_NAME-theme .md-select-value span:first-child:after{color:'{{warn-A700}}'}md-input-container:not(.md-input-focused):not(.md-input-invalid) md-select.md-THEME_NAME-theme .md-select-value span:first-child:after{color:'{{foreground-3}}'}md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-THEME_NAME-theme .md-select-value,md-input-container.md-input-focused:not(.md-input-has-value) md-select.md-THEME_NAME-theme .md-select-value.md-select-placeholder{color:'{{primary-color}}'}md-input-container.md-input-invalid md-select.md-THEME_NAME-theme .md-select-value{color:'{{warn-A700}}'!important;border-bottom-color:'{{warn-A700}}'!important}md-input-container.md-input-invalid md-select.md-THEME_NAME-theme.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-THEME_NAME-theme[disabled] .md-select-value{border-bottom-color:transparent;background-image:linear-gradient(90deg,\\\"{{foreground-3}}\\\" 0,\\\"{{foreground-3}}\\\" 33%,transparent 0);background-image:-ms-linear-gradient(left,transparent 0,\\\"{{foreground-3}}\\\" 100%)}md-select.md-THEME_NAME-theme .md-select-value{border-bottom-color:'{{foreground-4}}'}md-select.md-THEME_NAME-theme .md-select-value.md-select-placeholder{color:'{{foreground-3}}'}md-select.md-THEME_NAME-theme .md-select-value span:first-child:after{color:'{{warn-A700}}'}md-select.md-THEME_NAME-theme.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-THEME_NAME-theme.ng-invalid.ng-touched .md-select-value{color:'{{warn-A700}}'!important;border-bottom-color:'{{warn-A700}}'!important}md-select.md-THEME_NAME-theme.ng-invalid.ng-touched.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-value{border-bottom-color:'{{primary-color}}';color:'{{ foreground-1 }}'}md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-value.md-select-placeholder{color:'{{ foreground-1 }}'}md-select.md-THEME_NAME-theme:not([disabled]):focus.md-no-underline .md-select-value{border-bottom-color:transparent!important}md-select.md-THEME_NAME-theme:not([disabled]):focus.md-accent .md-select-value{border-bottom-color:'{{accent-color}}'}md-select.md-THEME_NAME-theme:not([disabled]):focus.md-warn .md-select-value{border-bottom-color:'{{warn-color}}'}md-select.md-THEME_NAME-theme .md-select-icon,md-select.md-THEME_NAME-theme[disabled] .md-select-value,md-select.md-THEME_NAME-theme[disabled] .md-select-value.md-select-placeholder{color:'{{foreground-3}}'}md-select.md-THEME_NAME-theme .md-select-icon:hover{color:'{{foreground-2}}'}md-select-menu.md-THEME_NAME-theme md-content{background:'{{background-A100}}'}md-select-menu.md-THEME_NAME-theme md-content md-optgroup{color:'{{background-600-0.87}}'}md-select-menu.md-THEME_NAME-theme md-content md-option{color:'{{background-900-0.87}}'}md-select-menu.md-THEME_NAME-theme md-content md-option[disabled] .md-text{color:'{{background-400-0.87}}'}md-select-menu.md-THEME_NAME-theme md-content md-option:not([disabled]):focus,md-select-menu.md-THEME_NAME-theme md-content md-option:not([disabled]):hover{background:'{{background-200}}'}md-select-menu.md-THEME_NAME-theme md-content md-option[selected]{color:'{{primary-500}}'}md-select-menu.md-THEME_NAME-theme md-content md-option[selected]:focus{color:'{{primary-600}}'}md-select-menu.md-THEME_NAME-theme md-content md-option[selected].md-accent{color:'{{accent-color}}'}md-select-menu.md-THEME_NAME-theme md-content md-option[selected].md-accent:focus{color:'{{accent-A700}}'}.md-checkbox-enabled.md-THEME_NAME-theme .md-ripple{color:'{{primary-600}}'}.md-checkbox-enabled.md-THEME_NAME-theme[selected] .md-ripple{color:'{{background-600}}'}.md-checkbox-enabled.md-THEME_NAME-theme .md-ink-ripple{color:'{{foreground-2}}'}.md-checkbox-enabled.md-THEME_NAME-theme[selected] .md-ink-ripple{color:'{{primary-color-0.87}}'}.md-checkbox-enabled.md-THEME_NAME-theme:not(.md-checked) .md-icon{border-color:'{{foreground-2}}'}.md-checkbox-enabled.md-THEME_NAME-theme[selected] .md-icon{background-color:'{{primary-color-0.87}}'}.md-checkbox-enabled.md-THEME_NAME-theme[selected].md-focused .md-container:before{background-color:'{{primary-color-0.26}}'}.md-checkbox-enabled.md-THEME_NAME-theme[selected] .md-icon:after{border-color:'{{primary-contrast-0.87}}'}.md-checkbox-enabled.md-THEME_NAME-theme .md-indeterminate[disabled] .md-container{color:'{{foreground-3}}'}.md-checkbox-enabled.md-THEME_NAME-theme md-option .md-text{color:'{{background-900-0.87}}'}md-sidenav.md-THEME_NAME-theme,md-sidenav.md-THEME_NAME-theme md-content{background-color:'{{background-hue-1}}'}md-slider.md-THEME_NAME-theme .md-track{background-color:'{{foreground-3}}'}md-slider.md-THEME_NAME-theme .md-track-ticks{color:'{{background-contrast}}'}md-slider.md-THEME_NAME-theme .md-focus-ring{background-color:'{{accent-A200-0.2}}'}md-slider.md-THEME_NAME-theme .md-disabled-thumb{border-color:'{{background-color}}';background-color:'{{background-color}}'}md-slider.md-THEME_NAME-theme.md-min .md-thumb:after{background-color:'{{background-color}}';border-color:'{{foreground-3}}'}md-slider.md-THEME_NAME-theme.md-min .md-focus-ring{background-color:'{{foreground-3-0.38}}'}md-slider.md-THEME_NAME-theme.md-min[md-discrete] .md-thumb:after{background-color:'{{background-contrast}}';border-color:transparent}md-slider.md-THEME_NAME-theme.md-min[md-discrete] .md-sign{background-color:'{{background-400}}'}md-slider.md-THEME_NAME-theme.md-min[md-discrete] .md-sign:after{border-top-color:'{{background-400}}'}md-slider.md-THEME_NAME-theme.md-min[md-discrete][md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:'{{background-400}}'}md-slider.md-THEME_NAME-theme .md-track.md-track-fill{background-color:'{{accent-color}}'}md-slider.md-THEME_NAME-theme .md-thumb:after{border-color:'{{accent-color}}';background-color:'{{accent-color}}'}md-slider.md-THEME_NAME-theme .md-sign{background-color:'{{accent-color}}'}md-slider.md-THEME_NAME-theme .md-sign:after{border-top-color:'{{accent-color}}'}md-slider.md-THEME_NAME-theme[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:'{{accent-color}}'}md-slider.md-THEME_NAME-theme .md-thumb-text{color:'{{accent-contrast}}'}md-slider.md-THEME_NAME-theme.md-warn .md-focus-ring{background-color:'{{warn-200-0.38}}'}md-slider.md-THEME_NAME-theme.md-warn .md-track.md-track-fill{background-color:'{{warn-color}}'}md-slider.md-THEME_NAME-theme.md-warn .md-thumb:after{border-color:'{{warn-color}}';background-color:'{{warn-color}}'}md-slider.md-THEME_NAME-theme.md-warn .md-sign{background-color:'{{warn-color}}'}md-slider.md-THEME_NAME-theme.md-warn .md-sign:after{border-top-color:'{{warn-color}}'}md-slider.md-THEME_NAME-theme.md-warn[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:'{{warn-color}}'}md-slider.md-THEME_NAME-theme.md-warn .md-thumb-text{color:'{{warn-contrast}}'}md-slider.md-THEME_NAME-theme.md-primary .md-focus-ring{background-color:'{{primary-200-0.38}}'}md-slider.md-THEME_NAME-theme.md-primary .md-track.md-track-fill{background-color:'{{primary-color}}'}md-slider.md-THEME_NAME-theme.md-primary .md-thumb:after{border-color:'{{primary-color}}';background-color:'{{primary-color}}'}md-slider.md-THEME_NAME-theme.md-primary .md-sign{background-color:'{{primary-color}}'}md-slider.md-THEME_NAME-theme.md-primary .md-sign:after{border-top-color:'{{primary-color}}'}md-slider.md-THEME_NAME-theme.md-primary[md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:'{{primary-color}}'}md-slider.md-THEME_NAME-theme.md-primary .md-thumb-text{color:'{{primary-contrast}}'}md-slider.md-THEME_NAME-theme[disabled] .md-thumb:after{border-color:transparent}md-slider.md-THEME_NAME-theme[disabled]:not(.md-min) .md-thumb:after,md-slider.md-THEME_NAME-theme[disabled][md-discrete] .md-thumb:after{background-color:'{{foreground-3}}';border-color:transparent}md-slider.md-THEME_NAME-theme[disabled][readonly] .md-sign{background-color:'{{background-400}}'}md-slider.md-THEME_NAME-theme[disabled][readonly] .md-sign:after{border-top-color:'{{background-400}}'}md-slider.md-THEME_NAME-theme[disabled][readonly][md-vertical] .md-sign:after{border-top-color:transparent;border-left-color:'{{background-400}}'}md-slider.md-THEME_NAME-theme[disabled][readonly] .md-disabled-thumb{border-color:transparent;background-color:transparent}md-slider-container[disabled]>:first-child:not(md-slider),md-slider-container[disabled]>:last-child:not(md-slider){color:'{{foreground-3}}'}.md-subheader.md-THEME_NAME-theme{color:'{{ foreground-2-0.23 }}';background-color:'{{background-default}}'}.md-subheader.md-THEME_NAME-theme.md-primary{color:'{{primary-color}}'}.md-subheader.md-THEME_NAME-theme.md-accent{color:'{{accent-color}}'}.md-subheader.md-THEME_NAME-theme.md-warn{color:'{{warn-color}}'}md-switch.md-THEME_NAME-theme .md-ink-ripple{color:'{{background-500}}'}md-switch.md-THEME_NAME-theme .md-thumb{background-color:'{{background-50}}'}md-switch.md-THEME_NAME-theme .md-bar{background-color:'{{background-500}}'}md-switch.md-THEME_NAME-theme.md-checked .md-ink-ripple{color:'{{accent-color}}'}md-switch.md-THEME_NAME-theme.md-checked .md-thumb{background-color:'{{accent-color}}'}md-switch.md-THEME_NAME-theme.md-checked .md-bar{background-color:'{{accent-color-0.5}}'}md-switch.md-THEME_NAME-theme.md-checked.md-focused .md-thumb:before{background-color:'{{accent-color-0.26}}'}md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-ink-ripple{color:'{{primary-color}}'}md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-thumb{background-color:'{{primary-color}}'}md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-bar{background-color:'{{primary-color-0.5}}'}md-switch.md-THEME_NAME-theme.md-checked.md-primary.md-focused .md-thumb:before{background-color:'{{primary-color-0.26}}'}md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-ink-ripple{color:'{{warn-color}}'}md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-thumb{background-color:'{{warn-color}}'}md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-bar{background-color:'{{warn-color-0.5}}'}md-switch.md-THEME_NAME-theme.md-checked.md-warn.md-focused .md-thumb:before{background-color:'{{warn-color-0.26}}'}md-switch.md-THEME_NAME-theme[disabled] .md-thumb{background-color:'{{background-400}}'}md-switch.md-THEME_NAME-theme[disabled] .md-bar{background-color:'{{foreground-4}}'}md-tabs.md-THEME_NAME-theme md-tabs-wrapper{background-color:transparent;border-color:'{{foreground-4}}'}md-tabs.md-THEME_NAME-theme .md-paginator md-icon{color:'{{primary-color}}'}md-tabs.md-THEME_NAME-theme md-ink-bar{color:'{{accent-color}}';background:'{{accent-color}}'}md-tabs.md-THEME_NAME-theme .md-tab{color:'{{foreground-2}}'}md-tabs.md-THEME_NAME-theme .md-tab[disabled],md-tabs.md-THEME_NAME-theme .md-tab[disabled] md-icon{color:'{{foreground-3}}'}md-tabs.md-THEME_NAME-theme .md-tab.md-active,md-tabs.md-THEME_NAME-theme .md-tab.md-active md-icon,md-tabs.md-THEME_NAME-theme .md-tab.md-focused,md-tabs.md-THEME_NAME-theme .md-tab.md-focused md-icon{color:'{{primary-color}}'}md-tabs.md-THEME_NAME-theme .md-tab.md-focused{background:'{{primary-color-0.1}}'}md-tabs.md-THEME_NAME-theme .md-tab .md-ripple-container{color:'{{accent-A100}}'}md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper{background-color:'{{accent-color}}'}md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:'{{accent-A100}}'}md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:'{{accent-contrast}}'}md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:'{{accent-contrast-0.1}}'}md-tabs.md-THEME_NAME-theme.md-accent>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar{color:'{{primary-600-1}}';background:'{{primary-600-1}}'}md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper{background-color:'{{primary-color}}'}md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:'{{primary-100}}'}md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:'{{primary-contrast}}'}md-tabs.md-THEME_NAME-theme.md-primary>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:'{{primary-contrast-0.1}}'}md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper{background-color:'{{warn-color}}'}md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:'{{warn-100}}'}md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:'{{warn-contrast}}'}md-tabs.md-THEME_NAME-theme.md-warn>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:'{{warn-contrast-0.1}}'}md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper{background-color:'{{primary-color}}'}md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:'{{primary-100}}'}md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:'{{primary-contrast}}'}md-toolbar>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:'{{primary-contrast-0.1}}'}md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper{background-color:'{{accent-color}}'}md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:'{{accent-A100}}'}md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:'{{accent-contrast}}'}md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:'{{accent-contrast-0.1}}'}md-toolbar.md-accent>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-ink-bar{color:'{{primary-600-1}}';background:'{{primary-600-1}}'}md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper{background-color:'{{warn-color}}'}md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]),md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]) md-icon{color:'{{warn-100}}'}md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active,md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-active md-icon,md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused,md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused md-icon{color:'{{warn-contrast}}'}md-toolbar.md-warn>md-tabs.md-THEME_NAME-theme>md-tabs-wrapper>md-tabs-canvas>md-pagination-wrapper>md-tab-item:not([disabled]).md-focused{background:'{{warn-contrast-0.1}}'}md-toast.md-THEME_NAME-theme .md-toast-content{background-color:#323232;color:'{{background-50}}'}md-toast.md-THEME_NAME-theme .md-toast-content .md-button{color:'{{background-50}}'}md-toast.md-THEME_NAME-theme .md-toast-content .md-button.md-highlight{color:'{{accent-color}}'}md-toast.md-THEME_NAME-theme .md-toast-content .md-button.md-highlight.md-primary{color:'{{primary-color}}'}md-toast.md-THEME_NAME-theme .md-toast-content .md-button.md-highlight.md-warn{color:'{{warn-color}}'}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar){background-color:'{{primary-color}}';color:'{{primary-contrast}}'}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar) md-icon{color:'{{primary-contrast}}';fill:'{{primary-contrast}}'}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar) .md-button[disabled] md-icon{color:'{{primary-contrast-0.26}}';fill:'{{primary-contrast-0.26}}'}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar).md-accent{background-color:'{{accent-color}}';color:'{{accent-contrast}}'}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar).md-accent .md-ink-ripple{color:'{{accent-contrast}}'}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar).md-accent md-icon{color:'{{accent-contrast}}';fill:'{{accent-contrast}}'}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar).md-accent .md-button[disabled] md-icon{color:'{{accent-contrast-0.26}}';fill:'{{accent-contrast-0.26}}'}md-toolbar.md-THEME_NAME-theme:not(.md-menu-toolbar).md-warn{background-color:'{{warn-color}}';color:'{{warn-contrast}}'}.md-tooltip.md-THEME_NAME-theme{color:'{{background-700-contrast}}'}.md-tooltip.md-THEME_NAME-theme.md-panel{background-color:'{{background-700}}'}body.md-THEME_NAME-theme,html.md-THEME_NAME-theme{color:'{{foreground-1}}';background-color:'{{background-color}}'}\";\n\n angular.module('eHRD.kernel.uiElements.cusMaterial')\n .constant('$MD_THEME_CSS', $MD_THEME_CSS);\n})();\n\n/**\n * Created by Bruce on 2017/5/4.\n */\n(function () {\n 'use strict';\n\n angular.module('eHRD.kernel.uiElements.breadcrumbs',[]);\n\n})();\n\n/**\n * Created by Bruce on 2017/5/4.\n */\n\n(function () {\n 'use strict';\n\n function breadcrumbsService() {\n var $registeredListeners = {};\n\n function registerListenerOnce(tag, $rootScope, event, fn) {\n var deregisterListenerFn = $registeredListeners[tag];\n if ( angular.isDefined(deregisterListenerFn) ) {\n deregisterListenerFn();\n }\n deregisterListenerFn = $rootScope.$on(event, fn);\n $registeredListeners[tag] = deregisterListenerFn;\n }\n function isAOlderThanB(scopeA, scopeB) {\n if(angular.equals(scopeA.length, scopeB.length)) {\n return scopeA > scopeB;\n } else {\n return scopeA.length > scopeB.length;\n }\n }\n\n function parseStateRef(ref) {\n var parsed = ref.replace(/\\n/g, \" \").match(/^([^(]+?)\\s*(\\((.*)\\))?$/);\n if (!parsed || parsed.length !== 4) { throw new Error(\"Invalid state ref '\" + ref + \"'\"); }\n return { state: parsed[1], paramExpr: parsed[3] || null };\n }\n\n var getExpression = function(interpolationFunction) {\n if(interpolationFunction.expressions) {\n return interpolationFunction.expressions;\n } else {\n // Workaround for Angular 1.2.x\n var expressions = [];\n angular.forEach(interpolationFunction.parts, function(part) {\n if(angular.isFunction(part)) {\n expressions.push(part.exp);\n }\n });\n return expressions;\n }\n };\n\n var deregisterWatchers = function(labelWatcherArray) {\n angular.forEach(labelWatcherArray, function(deregisterWatch) {\n deregisterWatch();\n });\n };\n\n var registerWatchers = function(labelWatcherArray, interpolationFunction, viewScope, step) {\n angular.forEach(getExpression(interpolationFunction), function(expression) {\n var watcher = viewScope.$watch(expression, function() {\n step.ncyBreadcrumbLabel = interpolationFunction(viewScope);\n });\n labelWatcherArray.push(watcher);\n });\n };\n\n return{\n registerListenerOnce: registerListenerOnce,\n isAOlderThanB: isAOlderThanB,\n parseStateRef: parseStateRef,\n getExpression: getExpression,\n deregisterWatchers: deregisterWatchers,\n registerWatchers: registerWatchers\n };\n }\n\n angular.module('eHRD.kernel.uiElements.breadcrumbs')\n .factory('breadcrumbsService',breadcrumbsService)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2017/5/4.\n */\n(function () {\n 'use strict';\n\n\n function $Breadcrumb() {\n\n var $$options = {\n prefixStateName: null,\n template: 'bootstrap3',\n templateUrl: null,\n templateLast: 'default',\n templateLastUrl: null,\n includeAbstract : false\n };\n\n this.setOptions = function(options) {\n angular.extend($$options, options);\n };\n\n BreadCrumb.$inject = ['$state', '$stateParams', '$rootScope', 'breadcrumbsService', 'treeFactory', 'sitemapService'];\n function BreadCrumb($state, $stateParams, $rootScope, breadcrumbsService, treeFactory, sitemapService) {\n var $lastViewScope = $rootScope;\n\n // Early catch of $viewContentLoaded event\n breadcrumbsService.registerListenerOnce('$Breadcrumb.$viewContentLoaded', $rootScope, '$viewContentLoaded', function (event) {\n // With nested views, the event occur several times, in \"wrong\" order\n if(!event.targetScope.ncyBreadcrumbIgnore &&\n breadcrumbsService.isAOlderThanB(event.targetScope.$id, $lastViewScope.$id)) {\n $lastViewScope = event.targetScope;\n }\n });\n\n // Get the parent state\n var $$parentMenu = function (state) {\n var menuChain = [];\n\n if( sitemapService.getSiteMapNodes() ) {\n sitemapService.getSiteMapNodes().walk(function (node) {\n if( node.model.type === 'STATIC'){\n if(angular.equals(node.model.stateParams['mid'], $state.params['mid']) ){\n menuChain = node.getPath();\n }\n }else{\n if (node.model.state === state.name){\n if(angular.isDefined(node.model.stateParams) && (angular.isDefined(node.model.stateParams['cid']) || angular.isDefined(node.model.stateParams['courseId']) || angular.isDefined(node.model.stateParams['mid']) ) ) {\n if( (angular.isDefined(node.model.stateParams['cid']) && angular.equals(node.model.stateParams['cid'], $state.params['cid']) ||\n ($state.params['cid'] === \"0\" && node.model.stateParams['cid'] === null) )) {\n menuChain = node.getPath();\n }\n if(angular.isDefined(node.model.stateParams['courseId']) && angular.equals(node.model.stateParams['courseId'], $state.params['courseId'])) menuChain = node.getPath();\n if(angular.equals(node.model.stateParams['mid'], $state.params['mid'])) menuChain = node.getPath();\n }else {\n menuChain = node.getPath();\n }\n }\n }\n });\n }\n return menuChain;\n };\n\n // Add the state in the chain if not already in and if not abstract\n var $$addStateInChain = function(chain, stateRef, nodeModel) {\n var conf,\n parentParams,\n ref = breadcrumbsService.parseStateRef(stateRef),\n force = false,\n skip = false;\n var isCopy = false;\n\n for(var i=0, l=chain.length; i' +\n '
  • ' +\n '{{step.ncyBreadcrumbLabel}}' +\n '{{step.ncyBreadcrumbLabel}}' +\n '/' +\n '
  • ' +\n '',\n bootstrap3: '
      ' +\n '
    1. ' +\n '{{step.ncyBreadcrumbLabel}}' +\n '{{step.ncyBreadcrumbLabel}}' +\n '
    2. ' +\n '
    '\n };\n\n return {\n restrict: 'AE',\n replace: true,\n scope: {},\n template: $breadcrumb.getTemplate($$templates),\n templateUrl: $breadcrumb.getTemplateUrl(),\n link: {\n post: function postLink(scope) {\n var labelWatchers = [];\n\n var renderBreadcrumb = function() {\n breadcrumbsService.deregisterWatchers(labelWatchers);\n labelWatchers = [];\n var viewScope = $breadcrumb.$getLastViewScope();\n scope.steps = $breadcrumb.getStatesChain();\n\n angular.forEach(scope.steps, function (step) {\n if (step.ncyBreadcrumb && step.ncyBreadcrumb.label) {\n var parseLabel = $interpolate(step.ncyBreadcrumb.label);\n step.ncyBreadcrumbLabel = parseLabel(viewScope);\n // Watcher for further viewScope updates\n breadcrumbsService.registerWatchers(labelWatchers, parseLabel, viewScope, step);\n } else {\n step.ncyBreadcrumbLabel = step.name;\n }\n });\n };\n if(sitemapService.getMenu().length === 0 || $state.current.name === 'mySetting') {\n sitemapService.getProjectSideMenu().then(function (menuItems) {\n sitemapService.setMenu(menuItems);\n breadcrumbsService.registerListenerOnce('BreadcrumbDirective.$viewContentLoaded', $rootScope, '$viewContentLoaded', function (event) {\n if(!event.targetScope.ncyBreadcrumbIgnore) {\n renderBreadcrumb();\n }\n });\n // View(s) may be already loaded while the directive's linking\n renderBreadcrumb();\n });\n } else {\n breadcrumbsService.registerListenerOnce('BreadcrumbDirective.$viewContentLoaded', $rootScope, '$viewContentLoaded', function (event) {\n if(!event.targetScope.ncyBreadcrumbIgnore) {\n renderBreadcrumb();\n }\n });\n\n // View(s) may be already loaded while the directive's linking\n renderBreadcrumb();\n }\n }\n }\n };\n }\n\n\n angular.module('eHRD.kernel.uiElements.breadcrumbs')\n .directive('breadcrumb', BreadcrumbDirective);\n\n})();\n\n/**\n * Created by Bruce on 2017/5/4.\n */\n(function () {\n 'use strict';\n\n BreadcrumbTextDirective.$inject = ['$interpolate', '$breadcrumbs', '$rootScope', 'breadcrumbsService'];\n function BreadcrumbTextDirective($interpolate, $breadcrumb, $rootScope, breadcrumbsService) {\n\n return {\n restrict: 'A',\n scope: {},\n template: '{{ncyBreadcrumbChain}}',\n\n compile: function(cElement, cAttrs) {\n // Override the default template if ncyBreadcrumbText has a value\n var template = cElement.attr(cAttrs.$attr.ncyBreadcrumbText);\n if(template) {\n cElement.html(template);\n }\n\n var separator = cElement.attr(cAttrs.$attr.ncyBreadcrumbTextSeparator) || ' / ';\n\n return {\n post: function postLink(scope) {\n var labelWatchers = [];\n\n var registerWatchersText = function(labelWatcherArray, interpolationFunction, viewScope) {\n angular.forEach(breadcrumbsService.getExpression(interpolationFunction), function(expression) {\n var watcher = viewScope.$watch(expression, function(newValue, oldValue) {\n if (newValue !== oldValue) {\n renderLabel();\n }\n });\n labelWatcherArray.push(watcher);\n });\n };\n\n var renderLabel = function() {\n breadcrumbsService.deregisterWatchers(labelWatchers);\n labelWatchers = [];\n\n var viewScope = $breadcrumb.$getLastViewScope();\n var steps = $breadcrumb.getStatesChain();\n var combinedLabels = [];\n angular.forEach(steps, function (step) {\n if (step.ncyBreadcrumb && step.ncyBreadcrumb.label) {\n var parseLabel = $interpolate(step.ncyBreadcrumb.label);\n combinedLabels.push(parseLabel(viewScope));\n // Watcher for further viewScope updates\n registerWatchersText(labelWatchers, parseLabel, viewScope);\n } else {\n combinedLabels.push(step.name);\n }\n });\n\n scope.ncyBreadcrumbChain = combinedLabels.join(separator);\n };\n\n breadcrumbsService.registerListenerOnce('BreadcrumbTextDirective.$viewContentLoaded', $rootScope, '$viewContentLoaded', function (event) {\n if(!event.targetScope.ncyBreadcrumbIgnore) {\n renderLabel();\n }\n });\n\n // View(s) may be already loaded while the directive's linking\n renderLabel();\n }\n };\n\n }\n };\n }\n\n\n angular.module('eHRD.kernel.uiElements.breadcrumbs')\n .directive('breadcrumbText', BreadcrumbTextDirective);\n})();\n\n/**\n * Created by Bruce on 2017/5/4.\n */\n(function () {\n 'use strict';\n\n BreadcrumbLastDirective.$inject = ['$interpolate', '$breadcrumbs', '$rootScope', 'breadcrumbsService'];\n function BreadcrumbLastDirective($interpolate, $breadcrumb, $rootScope, breadcrumbsService) {\n var $$templates = {\n 'default': '{{ncyBreadcrumbLabel}}'\n };\n\n return {\n restrict: 'A',\n scope: {},\n template: $breadcrumb.getTemplateLast($$templates),\n templateUrl: $breadcrumb.getTemplateLastUrl(),\n compile: function(cElement, cAttrs) {\n\n // Override the default template if ncyBreadcrumbLast has a value\n // This should likely be removed in a future version since global\n // templating is now available for ncyBreadcrumbLast\n var template = cElement.attr(cAttrs.$attr.ncyBreadcrumbLast);\n if(template) {\n cElement.html(template);\n }\n\n return {\n post: function postLink(scope) {\n var labelWatchers = [];\n\n var renderLabel = function() {\n breadcrumbsService.deregisterWatchers(labelWatchers);\n labelWatchers = [];\n\n var viewScope = $breadcrumb.$getLastViewScope();\n var lastStep = $breadcrumb.getLastStep();\n if(lastStep) {\n scope.ncyBreadcrumbLink = lastStep.ncyBreadcrumbLink;\n if (lastStep.ncyBreadcrumb && lastStep.ncyBreadcrumb.label) {\n var parseLabel = $interpolate(lastStep.ncyBreadcrumb.label);\n scope.ncyBreadcrumbLabel = parseLabel(viewScope);\n // Watcher for further viewScope updates\n // Tricky last arg: the last step is the entire scope of the directive !\n breadcrumbsService.registerWatchers(labelWatchers, parseLabel, viewScope, scope);\n } else {\n scope.ncyBreadcrumbLabel = lastStep.name;\n }\n }\n };\n\n breadcrumbsService.registerListenerOnce('BreadcrumbLastDirective.$viewContentLoaded', $rootScope, '$viewContentLoaded', function (event) {\n if(!event.targetScope.ncyBreadcrumbIgnore) {\n renderLabel();\n }\n });\n\n // View(s) may be already loaded while the directive's linking\n renderLabel();\n }\n };\n\n }\n };\n }\n\n\n\n\n angular.module('eHRD.kernel.uiElements.breadcrumbs')\n .directive('breadcrumbLast', BreadcrumbLastDirective);\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n angular.module('eHRD.kernel.uiElements.media',[]);\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n YoutubePlayerEmbed.$inject = [];\n function YoutubePlayerEmbed() {\n return {\n scope: {\n autoplay: \"=\",\n start: \"=\",\n end: \"=\",\n params: \"@\",\n v: \"@\"\n },\n restrict: 'E',\n replace: true,\n template: '',\n compile: function(/*elem, attrs, transcludeFn*/) {\n return function link (scope, element, attrs) {\n var\n paramsObject = {},\n paramsString = '';\n\n attrs.$observe('v', function(v) {\n scope.v = v;\n });\n\n // If already setup, then passing variable directly.\n if (attrs.params) {\n scope.querys = attrs.params;\n return;\n }\n\n // Else make querys.\n if (scope.autoplay) {\n paramsObject.autoplay = 1;\n }\n\n if (scope.start) {\n paramsObject.start = scope.start;\n }\n\n if (scope.end) {\n paramsObject.end = scope.end;\n }\n\n angular.forEach(paramsObject, function(value, key) {\n paramsString = paramsString + key + '=' + value + '&';\n });\n\n if ('' !== paramsString) {\n scope.querys = '?' + paramsString;\n }\n };\n }\n };\n }\n angular.module('eHRD.kernel.uiElements.media')\n .value('YoutubePlayerEmbed', YoutubePlayerEmbed)\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n MediaJustinLiveStreamPlayer.$inject = ['configure'];\n function MediaJustinLiveStreamPlayer(configure) {\n configure = configure || {\n type: 'justin'\n };\n\n return {\n restrict: 'E',\n scope: {\n channel: '@'\n },\n template:\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n '',\n replace: true,\n compile: function(/*elem, attrs, transcludeFn*/) {\n return function link (scope, element/*, attrs*/) {\n // Prevent error when the Justin player connect source before scope.channel unready. (e.g. When ng-view)\n scope.$watch('channel', function(/*channel*/) {\n element.append('');\n });\n };\n }\n };\n }\n angular.module('eHRD.kernel.uiElements.media')\n .value('MediaJustinLiveStreamPlayer', MediaJustinLiveStreamPlayer)\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n MediaJustinLiveStreamChatroom.$inject = ['configure'];\n function MediaJustinLiveStreamChatroom(configure) {\n configure = configure || {\n type: 'justin'\n };\n\n return {\n restrict: 'A',\n compile: function(/*elem, attrs, transcludeFn*/) {\n return function link (scope, element, attrs) {\n var channel = attrs.channel ? attrs.channel : attrs.twitchChatChannel;\n element.attr('frameborder', '0');\n element.attr('scrolling', 'no');\n element.attr('src', 'http://' + configure.type + '.tv/chat/embed?channel=' + channel + '&popout_chat=true');\n };\n }\n };\n }\n angular.module('eHRD.kernel.uiElements.media')\n .value('MediaJustinLiveStreamChatroom', MediaJustinLiveStreamChatroom)\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n function MediaFlashPlayerEmbed($window) {\n var isIEversion = detectIE($window);\n var template = function () {\n var html='';\n if(isIEversion){\n html =\n ''+\n ''+\n ''+\n ''+\n ''+\n ''+\n ''\n }else{\n html =\n ''+\n ''+\n ''+\n ''+\n ''\n }\n return html;\n };\n\n return {\n scope: {\n src: \"@\",\n vars: \"@\",\n width:\"@?\",\n height:'@?'\n },\n restrict: 'E',\n replace: true,\n template: template,\n\n compile: function(/*elem, attrs, transcludeFn*/) {\n return function link (scope, element/*, attrs*/) {\n // Prevent error when the flash player connect source before scope.channel unready. (e.g. When ng-view)\n scope.$watch('src', function(src) {\n element.append('');\n });\n scope.$watch('vars', function(vars) {\n element.append('');\n });\n };\n }\n };\n }\n\n /**\n * detect IE\n * returns version of IE or false, if browser is not Internet Explorer\n */\n function detectIE($window) {\n var ua = $window.navigator.userAgent;\n\n // Test values; Uncomment to check result …\n\n // IE 10\n // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';\n\n // IE 11\n // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';\n\n // Edge 12 (Spartan)\n // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';\n\n // Edge 13\n // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586';\n\n var msie = ua.indexOf('MSIE ');\n if (msie > 0) {\n // IE 10 or older => return version number\n return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);\n }\n\n var trident = ua.indexOf('Trident/');\n if (trident > 0) {\n // IE 11 => return version number\n var rv = ua.indexOf('rv:');\n return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);\n }\n\n var edge = ua.indexOf('Edge/');\n if (edge > 0) {\n // Edge (IE 12+) => return version number\n return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\n }\n\n // other browser\n return false;\n }\n\n angular.module('eHRD.kernel.uiElements.media')\n .value('MediaFlashPlayerEmbed', MediaFlashPlayerEmbed)\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n factory.$inject = ['YoutubePlayerEmbed'];\n function factory(YoutubePlayerEmbed) {\n return YoutubePlayerEmbed();\n }\n\n angular.module('eHRD.kernel.uiElements.media')\n .directive('mediaYoutube', factory)\n ;\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n factory.$inject = ['MediaJustinLiveStreamPlayer'];\n function factory(MediaJustinLiveStreamPlayer) {\n return MediaJustinLiveStreamPlayer({\n type: 'twitch'\n });\n }\n\n angular.module('eHRD.kernel.uiElements.media')\n .directive('mediaTwitch', factory)\n ;\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n factory.$inject = ['MediaJustinLiveStreamChatroom'];\n function factory(MediaJustinLiveStreamChatroom) {\n return MediaJustinLiveStreamChatroom({\n type: 'twitch'\n });\n }\n\n angular.module('eHRD.kernel.uiElements.media')\n .directive('mediaTwitchChat', factory)\n ;\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n factory.$inject = ['MediaJustinLiveStreamChatroom'];\n function factory(MediaJustinLiveStreamChatroom) {\n return MediaJustinLiveStreamChatroom({\n type: 'twitch'\n });\n }\n\n angular.module('eHRD.kernel.uiElements.media')\n .directive('mediaTwitchChatChannel', factory)\n ;\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n factory.$inject = ['MediaJustinLiveStreamChatroom'];\n function factory(MediaJustinLiveStreamChatroom) {\n return MediaJustinLiveStreamChatroom({\n type: 'justin'\n });\n }\n\n angular.module('eHRD.kernel.uiElements.media')\n .directive('mediaJustinChat', factory)\n ;\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n factory.$inject = ['MediaJustinLiveStreamChatroom'];\n function factory(MediaJustinLiveStreamChatroom) {\n return MediaJustinLiveStreamChatroom({\n type: 'justin'\n });\n }\n\n angular.module('eHRD.kernel.uiElements.media')\n .directive('mediaJustinChatChannel', factory)\n ;\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n factory.$inject = ['MediaFlashPlayerEmbed','$window'];\n function factory(MediaFlashPlayerEmbed, $window) {\n return MediaFlashPlayerEmbed($window);\n }\n\n angular.module('eHRD.kernel.uiElements.media')\n .directive('mediaFlash', factory)\n ;\n})();\n\n/**\n * Created by Bruce on 2016/9/29.\n */\n(function () {\n 'use strict';\n\n angular.module('eHRD.kernel.uiElements.angular-clock',[]);\n})();\n\n/**\n * Created by Bruce on 2016/9/30.\n */\n(function() {\n 'use strict';\n\n /**\n * Usage pattern\n * \n */\n // var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n // var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\n dsWidgetClock.$inject = ['$interval', '$filter'];\n\n function dsWidgetClock($interval, $filter) {\n return clock($interval, $filter);\n }\n\n function clock($interval, $filter) {\n return {\n restrict: 'EA',\n scope: {\n gmtOffset: '=gmtOffset',\n digitalFormat: '=digitalFormat',\n showDigital: '=showDigital',\n showAnalog: '=showAnalog',\n startTime: '=startTime',\n theme: '=theme',\n majorsTotal: '=majorsTotal',\n onlyText: '=?'\n },\n templateUrl: 'app/kernel/ui-elements/angular-clock/views/clock-template.html',\n link: function(scope, element, attrs) {\n // var format; // date format\n var stopTime; // so that we can cancel the time updates\n var o = {};\n var gmtOffset = scope.gmtOffset;\n var digitalFormat = scope.digitalFormat ? scope.digitalFormat : 'HH:mm:ss';\n o.showDigital = scope.showDigital != null ? scope.showDigital : angular.isDefined(attrs.showDigital) ? true : false;\n o.showAnalog = scope.showAnalog != null ? scope.showAnalog : angular.isDefined(attrs.showAnalog) ? true : false;\n o.showGmtInfo = angular.isDefined(attrs.showGmtInfo) ? true : false;\n o.startTime = parseInt(scope.startTime, 10); // ms\n scope.themeClass = scope.theme ? scope.theme : attrs.theme ? attrs.theme : 'light';\n scope.onlyText = (angular.isUndefined(scope.onlyText) ? false : scope.onlyText);\n\n if (!o.showDigital && !o.showAnalog) {\n o.showAnalog = true;\n o.showDigital = true;\n }\n scope.gmtInfo = false;\n\n scope.date = getDate(o);\n\n scope.digital = o.showDigital ? 'Loading..' : false;\n scope.analog = o.showAnalog;\n scope.majors = attrs.majorsTotal ? new Array(parseInt(attrs.majorsTotal)) : new Array(12);\n scope.minors = new Array(60);\n var date = null;\n var tick = function() {\n if (!isNaN(o.startTime)) {\n o.startTime = o.startTime + 1000;\n }\n date = getDate(o);\n scope.date = date;\n if (o.showDigital) {\n scope.digital = timeText(date, digitalFormat, gmtOffset, $filter);\n }\n };\n\n stopTime = $interval(tick, 1000);\n // watch the expression, and update the UI on change.\n scope.$watch('gmtOffset', function(value/*, old*/) {\n\n gmtOffset = value;\n o.gmtOffset = (gmtOffset != null) ? getGMTbase100(gmtOffset) : false;\n if (o.showGmtInfo && o.gmtOffset !== false) {\n scope.gmtInfo = getGMTText(o.gmtOffset);\n }\n\n tick();\n });\n scope.$watch('digitalFormat', function(value, old) {\n if (value != old) {\n digitalFormat = value;\n }\n });\n scope.$watch('showDigital', function(value, old) {\n if (value != old) {\n o.showDigital = value;\n scope.digital = o.showDigital ? 'Loading..' : false;\n }\n });\n scope.$watch('showAnalog', function(value, old) {\n if (value != old) {\n o.showAnalog = value;\n scope.analog = value;\n }\n });\n scope.$watch('theme', function(value, old) {\n if (value != old) {\n scope.themeClass = value ? value : attrs.theme ? attrs.theme : 'light';\n }\n });\n // listen on DOM destroy (removal) event, and cancel the next UI update\n // to prevent updating time after the DOM element was removed.\n element.on('$destroy', function() {\n $interval.cancel(stopTime);\n stopTime = null;\n });\n\n }\n };\n }\n\n function getGMTbase100(offset) {\n offset = parseFloat(offset);\n var f = offset > 0 ? Math.floor(offset) : Math.ceil(offset),\n s = (offset % 1) / 0.6;\n\n return f + s;\n\n }\n\n // function getGMTbase60(offset) {\n // var f = offset > 0 ? Math.floor(offset) : Math.ceil(offset),\n // s = ((offset > 0 ? offset : offset * -1) % 1) * 60;\n // return f + s;\n // }\n\n function getGMTText(offset) {\n\n var f = offset > 0 ? Math.floor(offset) : Math.ceil(offset),\n s = Math.round(((offset > 0 ? offset : offset * -1) % 1) * 60);\n\n return 'GMT' + (offset === 0 ? '' : ((offset > 0 ? ' +' : ' ') + lpad(f) + '.' + rpad(s).substring(0, 2)));\n\n }\n\n function lpad(num) {\n if (num < 0) {\n return (num > -10 ? '-0' : '-') + (num * -1);\n } else {\n return (num < 10 ? '0' : '') + num;\n }\n\n }\n\n function rpad(num) {\n return num + (num < 10 ? '0' : '');\n }\n // Checkfor offset and get correct time\n function getDate(o) {\n var now = (!isNaN(o.startTime)) ? new Date(o.startTime) : new Date();\n if (o.gmtOffset !== null && o.gmtOffset !== false) {\n /*Use GMT + gmtOffset\n convert to msec\n add local time zone offset\n get UTC time in msec*/\n var utc = now.getTime() + (now.getTimezoneOffset() * 60000);\n // create new Date object for different city\n // using supplied offset\n var offsetNow = new Date(utc + (3600000 * o.gmtOffset));\n return {\n hrs: offsetNow.getHours(),\n mins: offsetNow.getMinutes(),\n secs: offsetNow.getSeconds(),\n date: offsetNow\n };\n } else {\n // Use local time\n return {\n hrs: now.getHours(),\n mins: now.getMinutes(),\n secs: now.getSeconds(),\n date: now\n };\n }\n }\n\n function timeText(d, format, timezone, $filter) {\n return $filter('date')(d.date, format, timezone);\n }\n angular.module('eHRD.kernel.uiElements.angular-clock')\n .directive('dsWidgetClock', dsWidgetClock);\n})();\n\n(function () {\n 'use strict';\n\n /**\n * @namespace permission.ui\n */\n\n /**\n * @param $stateProvider {Object}\n */\n function config($stateProvider) {\n 'ngInject';\n\n $stateProvider.decorator('$state', function (state) {\n /**\n * Property containing full state object definition\n *\n * This decorator is required to access full state object instead of just it's configuration\n * Can be removed when implemented https://github.com/angular-ui/ui-router/issues/13.\n *\n * @returns {Object}\n */\n state.self.$$permissionState = function () {\n return state;\n };\n\n return state;\n });\n }\n\n /**\n * @param $rootScope {Object}\n * @param $state {Object}\n * @param PermTransitionProperties {permission.PermTransitionProperties}\n * @param PermTransitionEvents {permission.ui.PermTransitionEvents}\n * @param PermStateAuthorization {permission.ui.PermStateAuthorization}\n * @param PermStatePermissionMap {permission.ui.PermStatePermissionMap}\n */\n function run($rootScope, $state, PermTransitionProperties, PermTransitionEvents, PermStateAuthorization, PermStatePermissionMap) {\n 'ngInject';\n\n /**\n * State transition interceptor\n */\n var $stateTransitionInterceptor = $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams, options) {\n\n if (!isAuthorizationFinished()) {\n setStateAuthorizationStatus(true);\n setTransitionProperties();\n\n if (!PermTransitionEvents.areEventsDefaultPrevented()) {\n PermTransitionEvents.broadcastPermissionStartEvent();\n\n $state.transition = {};\n event.preventDefault();\n var statePermissionMap = new PermStatePermissionMap(PermTransitionProperties.toState);\n\n PermStateAuthorization\n .authorizeByPermissionMap(statePermissionMap)\n .then(function () {\n handleAuthorizedState();\n })\n .catch(function (rejectedPermission) {\n handleUnauthorizedState(rejectedPermission, statePermissionMap);\n })\n .finally(function () {\n setStateAuthorizationStatus(false);\n });\n } else {\n setStateAuthorizationStatus(false);\n }\n }\n\n /**\n * Updates values of `PermTransitionProperties` holder object\n * @method\n * @private\n */\n function setTransitionProperties() {\n PermTransitionProperties.toState = toState;\n PermTransitionProperties.toParams = toParams;\n PermTransitionProperties.fromState = fromState;\n PermTransitionProperties.fromParams = fromParams;\n PermTransitionProperties.options = options;\n }\n\n /**\n * Sets internal state `$$finishedAuthorization` variable to prevent looping\n * @method\n * @private\n *\n * @param status {boolean} When true authorization has been already preceded\n */\n function setStateAuthorizationStatus(status) {\n angular.extend(toState, {'$$isAuthorizationFinished': status});\n }\n\n /**\n * Checks if state has been already checked for authorization\n * @method\n * @private\n *\n * @returns {boolean}\n */\n function isAuthorizationFinished() {\n return toState.$$isAuthorizationFinished;\n }\n\n /**\n * Handles redirection for authorized access\n * @method\n * @private\n */\n function handleAuthorizedState() {\n PermTransitionEvents.broadcastPermissionAcceptedEvent();\n\n // Overwrite notify option to broadcast it later\n var transitionOptions = angular.extend({}, PermTransitionProperties.options, {notify: false, location: true});\n\n $state\n .go(PermTransitionProperties.toState.name, PermTransitionProperties.toParams, transitionOptions)\n .then(function () {\n PermTransitionEvents.broadcastStateChangeSuccessEvent();\n });\n }\n\n /**\n * Handles redirection for unauthorized access\n * @method\n * @private\n *\n * @param rejectedPermission {String} Rejected access right\n * @param statePermissionMap {permission.ui.PermPermissionMap} State permission map\n */\n function handleUnauthorizedState(rejectedPermission, statePermissionMap) {\n PermTransitionEvents.broadcastPermissionDeniedEvent();\n\n statePermissionMap\n .resolveRedirectState(rejectedPermission)\n .then(function (redirect) {\n $state.go(redirect.state, redirect.params, redirect.options);\n });\n }\n });\n\n $rootScope.$on('$destroy', $stateTransitionInterceptor);\n\n }\n\n angular\n .module('permission.ui', ['permission', 'ui.router'])\n .config(config)\n .run(run);\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Service responsible for managing and emitting events\n * @name permission.ui.PermTransitionEvents\n *\n * @extends permission.PermTransitionEvents\n *\n * @param $delegate {Object} Parent instance being extended\n * @param $rootScope {Object} Top-level angular scope\n * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing transition parameters\n * @param PermTransitionEventNames {permission.ui.PermTransitionEventNames} Constant storing event names\n */\n function PermTransitionEvents($delegate, $rootScope, PermTransitionProperties, PermTransitionEventNames) {\n 'ngInject';\n\n $delegate.areEventsDefaultPrevented = areEventsDefaultPrevented;\n $delegate.broadcastStateChangeSuccessEvent = broadcastStateChangeSuccessEvent;\n $delegate.broadcastPermissionStartEvent = broadcastPermissionStartEvent;\n $delegate.broadcastPermissionAcceptedEvent = broadcastPermissionAcceptedEvent;\n $delegate.broadcastPermissionDeniedEvent = broadcastPermissionDeniedEvent;\n\n /**\n * Checks if state events are not prevented by default\n * @methodOf permission.ui.PermTransitionEvents\n *\n * @returns {boolean}\n */\n function areEventsDefaultPrevented() {\n return isStateChangePermissionStartDefaultPrevented();\n }\n\n /**\n * Broadcasts \"$stateChangePermissionStart\" event from $rootScope\n * @methodOf permission.ui.PermTransitionEvents\n */\n function broadcastPermissionStartEvent() {\n $rootScope.$broadcast(PermTransitionEventNames.permissionStart,\n PermTransitionProperties.toState, PermTransitionProperties.toParams,\n PermTransitionProperties.options);\n }\n\n /**\n * Broadcasts \"$stateChangePermissionAccepted\" event from $rootScope\n * @methodOf permission.ui.PermTransitionEvents\n */\n function broadcastPermissionAcceptedEvent() {\n $rootScope.$broadcast(PermTransitionEventNames.permissionAccepted,\n PermTransitionProperties.toState, PermTransitionProperties.toParams,\n PermTransitionProperties.options);\n }\n\n /**\n * Broadcasts \"$tateChangePermissionDenied\" event from $rootScope\n * @methodOf permission.ui.PermTransitionEvents\n */\n function broadcastPermissionDeniedEvent() {\n $rootScope.$broadcast(PermTransitionEventNames.permissionDenies,\n PermTransitionProperties.toState, PermTransitionProperties.toParams,\n PermTransitionProperties.options);\n }\n\n /**\n * Broadcasts \"$stateChangeSuccess\" event from $rootScope\n * @methodOf permission.ui.PermTransitionEvents\n */\n function broadcastStateChangeSuccessEvent() {\n $rootScope.$broadcast('$stateChangeSuccess',\n PermTransitionProperties.toState, PermTransitionProperties.toParams,\n PermTransitionProperties.fromState, PermTransitionProperties.fromParams);\n }\n\n /**\n * Checks if event $stateChangePermissionStart hasn't been disabled by default\n * @methodOf permission.ui.PermTransitionEvents\n * @private\n *\n * @returns {boolean}\n */\n function isStateChangePermissionStartDefaultPrevented() {\n return $rootScope.$broadcast(PermTransitionEventNames.permissionStart,\n PermTransitionProperties.toState, PermTransitionProperties.toParams,\n PermTransitionProperties.options).defaultPrevented;\n }\n\n return $delegate;\n }\n\n angular\n .module('permission.ui')\n .decorator('PermTransitionEvents', PermTransitionEvents);\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Constant storing event names for ng-route\n * @name permission.ui.PermTransitionEventNames\n *\n * @type {Object.}\n *\n * @property permissionStart {String} Event name called when started checking for permissions\n * @property permissionAccepted {String} Event name called when authorized\n * @property permissionDenies {String} Event name called when unauthorized\n */\n var PermTransitionEventNames = {\n permissionStart: '$stateChangePermissionStart',\n permissionAccepted: '$stateChangePermissionAccepted',\n permissionDenies: '$stateChangePermissionDenied'\n };\n\n angular\n .module('permission.ui')\n .value('PermTransitionEventNames', PermTransitionEventNames);\n\n})();\n\n(function () {\n 'use strict';\n\n /**\n * State Access rights map factory\n * @function\n *\n * @param PermPermissionMap {permission.PermPermissionMap|Function}\n *\n * @return {permission.ui.StatePermissionMap}\n */\n function PermStatePermissionMap(PermPermissionMap) {\n 'ngInject';\n\n StatePermissionMap.prototype = new PermPermissionMap();\n\n /**\n * Constructs map instructing authorization service how to handle authorizing\n * @constructor permission.ui.StatePermissionMap\n * @extends permission.PermPermissionMap\n */\n function StatePermissionMap(state) {\n var toStateObject = state.$$permissionState();\n var toStatePath = toStateObject.path;\n\n angular.forEach(toStatePath, function (state) {\n if (areSetStatePermissions(state)) {\n var permissionMap = new PermPermissionMap(state.data.permissions);\n this.extendPermissionMap(permissionMap);\n }\n }, this);\n }\n\n /**\n * Extends permission map by pushing to it state's permissions\n * @methodOf permission.ui.StatePermissionMap\n *\n * @param permissionMap {permission.PermPermissionMap} Compensated permission map\n */\n StatePermissionMap.prototype.extendPermissionMap = function (permissionMap) {\n if (permissionMap.only.length) {\n this.only = this.only.concat([permissionMap.only]);\n }\n if (permissionMap.except.length) {\n this.except = this.except.concat([permissionMap.except]);\n }\n if (permissionMap.all.length) {\n this.all = this.all.concat([permissionMap.all]);\n }\n this.redirectTo = permissionMap.redirectTo;\n };\n\n\n /**\n * Checks if state has set permissions\n * We check for hasOwnProperty, because ui-router lets the `data` property inherit from its parent\n * @methodOf permission.ui.StatePermissionMap\n * @private\n *\n * @returns {boolean}\n */\n function areSetStatePermissions(state) {\n try {\n return Object.prototype.hasOwnProperty.call(state.data, 'permissions');\n } catch (e) {\n return false;\n }\n }\n\n return StatePermissionMap;\n }\n\n angular\n .module('permission.ui')\n .factory('PermStatePermissionMap', PermStatePermissionMap);\n})();\n\n\n(function () {\n 'use strict';\n\n\n /**\n * @namespace permission\n */\n\n angular.module('permission', []);\n\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Service responsible for handling inheritance-enabled state-based authorization in ui-router\n * @extends permission.PermPermissionMap\n * @name permission.ui.PermStateAuthorization\n *\n * @param $q {Object} Angular promise implementation\n * @param $state {Object} State object\n * @param PermStatePermissionMap {permission.ui.PermStatePermissionMap|Function} Angular promise implementation\n */\n function PermStateAuthorization($q, $state, PermStatePermissionMap) {\n 'ngInject';\n\n /**\n * Handles authorization based on provided state permission map\n * @methodOf permission.ui.PermStateAuthorization\n *\n * @param statePermissionMap\n *\n * @return {promise}\n */\n function authorizeByPermissionMap(statePermissionMap) {\n return authorizeStatePermissionMap(statePermissionMap);\n }\n\n /**\n * Authorizes uses by provided state name\n * @methodOf permission.ui.PermStateAuthorization\n *\n * @param stateName {String}\n * @returns {promise}\n */\n function authorizeByStateName(stateName) {\n var srefState = $state.get(stateName);\n var permissionMap = new PermStatePermissionMap(srefState);\n\n return authorizeByPermissionMap(permissionMap);\n }\n\n /**\n * Checks authorization for complex state inheritance\n * @methodOf permission.ui.PermStateAuthorization\n * @private\n *\n * @param map {permission.ui.StatePermissionMap} State access rights map\n *\n * @returns {promise} $q.promise object\n */\n function authorizeStatePermissionMap(map) {\n var deferred = $q.defer();\n\n resolveExceptStatePermissionMap(deferred, map);\n\n return deferred.promise;\n }\n\n /**\n * Resolves compensated set of \"except\" privileges\n * @methodOf permission.ui.PermStateAuthorization\n * @private\n *\n * @param deferred {Object} Promise defer\n * @param map {permission.ui.StatePermissionMap} State access rights map\n */\n function resolveExceptStatePermissionMap(deferred, map) {\n var exceptPromises = resolveStatePermissionMap(map.except, map);\n\n $q.all(exceptPromises)\n .then(function (rejectedPermissions) {\n deferred.reject(rejectedPermissions[0]);\n })\n .catch(function () {\n resolveOnlyStatePermissionMap(deferred, map);\n });\n }\n\n /**\n * Resolves compensated set of \"only\" privileges\n * @methodOf permission.ui.PermStateAuthorization\n * @private\n *\n * @param deferred {Object} Promise defer\n * @param map {permission.ui.StatePermissionMap} State access rights map\n */\n function resolveOnlyStatePermissionMap(deferred, map) {\n if (!map.only.length) {\n deferred.resolve();\n return;\n }\n var onlyPromises = resolveStatePermissionMap(map.only, map);\n\n $q.all(onlyPromises)\n .then(function (resolvedPermissions) {\n deferred.resolve(resolvedPermissions);\n })\n .catch(function (rejectedPermission) {\n deferred.reject(rejectedPermission);\n });\n }\n\n /**\n * Performs iteration over list of privileges looking for matches\n * @methodOf permission.ui.PermStateAuthorization\n * @private\n *\n * @param privilegesNames {Array} Array of sets of access rights\n * @param map {permission.ui.StatePermissionMap} State access rights map\n *\n * @returns {Array} Promise collection\n */\n function resolveStatePermissionMap(privilegesNames, map) {\n if (!privilegesNames.length) {\n return [$q.reject()];\n }\n\n return privilegesNames.map(function (statePrivileges) {\n var resolvedStatePrivileges = map.resolvePropertyValidity(statePrivileges);\n return $q.any(resolvedStatePrivileges)\n .then(function (resolvedPermissions) {\n if (angular.isArray(resolvedPermissions)) {\n return resolvedPermissions[0];\n }\n return resolvedPermissions;\n });\n });\n }\n\n return{\n authorizeByPermissionMap: authorizeByPermissionMap,\n authorizeByStateName: authorizeByStateName\n };\n }\n\n angular\n .module('permission')\n .factory('PermStateAuthorization', PermStateAuthorization);\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Helper object used for storing ui-router/ng-route transition parameters\n * @name permission.PermTransitionProperties\n *\n * @type {Object.}\n *\n * Transition properties for ui-router:\n * @property toState {Object} Target state object [ui-router]\n * @property toParams {Object} Target state params [ui-router]\n * @property fromState {Object} Source state object [ui-router]\n * @property fromParams {Object} Source state params [ui-router]\n * @property options {Object} Transition options [ui-router]\n *\n * Transition properties for ng-route:\n * @property current {Object} Current state properties [ng-route]\n * @property next {Object} Next state properties [ng-route]\n */\n var PermTransitionProperties = {};\n\n angular\n .module('permission')\n .value('PermTransitionProperties', PermTransitionProperties);\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Interface responsible for managing and emitting events dependent on router implementation\n * @name permission.PermTransitionEvents\n */\n function PermTransitionEvents() {\n 'ngInject';\n\n return{\n broadcastPermissionStartEvent: function () {\n throw new Error('Method broadcastPermissionStartEvent in PermTransitionEvents interface must be implemented');\n },\n broadcastPermissionAcceptedEvent: function () {\n throw new Error('Method broadcastPermissionAcceptedEvent in PermTransitionEvents interface must be implemented');\n },\n broadcastPermissionDeniedEvent: function () {\n throw new Error('Method broadcastPermissionDeniedEvent in PermTransitionEvents interface must be implemented');\n }\n };\n }\n\n angular\n .module('permission')\n .factory('PermTransitionEvents', PermTransitionEvents);\n\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Pre-defined available configurable behaviours of directive `permission`\n * @name permission.PermPermissionStrategies\n * @readonly\n *\n * @example\n *
    \n *
    \n *\n * @property enableElement {Function}\n * @property disableElement {Function}\n * @property showElement {Function}\n * @property hideElement {Function}\n */\n var PermPermissionStrategies = {\n enableElement: function ($element) {\n $element.removeAttr('disabled');\n },\n disableElement: function ($element) {\n $element.attr('disabled', 'disabled');\n },\n showElement: function ($element) {\n $element.removeClass('ng-hide');\n },\n hideElement: function ($element) {\n $element.addClass('ng-hide');\n }\n };\n\n angular\n .module('permission')\n .value('PermPermissionStrategies', PermPermissionStrategies)\n .value('PermissionStrategies', PermPermissionStrategies);\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Role definition storage\n * @name permission.PermRoleStore\n *\n * @param PermRole {permission.PermRole} Role definition constructor\n */\n function PermRoleStore(PermRole) {\n 'ngInject';\n\n var roleStore = {};\n\n /**\n * Allows to add single role definition to the store by providing it's name and validation function\n * @methodOf permission.PermRoleStore\n *\n * @param roleName {String} Name of defined role\n * @param [validationFunction] {Function|Array} Function used to validate if role is valid or set of\n * permission names that has to be owned to have a role\n */\n function defineRole(roleName, validationFunction) {\n roleStore[roleName] = new PermRole(roleName, validationFunction);\n }\n\n /**\n * Allows to define set of roleNames with shared validation function\n * @methodOf permission.PermPermissionStore\n * @throws {TypeError}\n *\n * @param roleMap {String, Function|Array} Map of roles with matching validators\n */\n function defineManyRoles(roleMap) {\n if (!angular.isObject(roleMap)) {\n throw new TypeError('Parameter \"roleNames\" name must be object');\n }\n\n angular.forEach(roleMap, function (validationFunction, roleName) {\n defineRole(roleName, validationFunction);\n });\n }\n\n /**\n * Deletes role from store\n * @method permission.PermRoleStore\n *\n * @param roleName {String} Name of defined permission\n */\n function removeRoleDefinition(roleName) {\n delete roleStore[roleName];\n }\n\n /**\n * Checks if role is defined in store\n * @method permission.PermRoleStore\n *\n * @param roleName {String} Name of role\n * @returns {Boolean}\n */\n function hasRoleDefinition(roleName) {\n return angular.isDefined(roleStore[roleName]);\n }\n\n /**\n * Returns role definition object by it's name\n * @method permission.PermRoleStore\n *\n * @returns {permission.PermRole} PermRole definition object\n */\n function getRoleDefinition(roleName) {\n return roleStore[roleName];\n }\n\n /**\n * Returns all role definitions\n * @method permission.PermRoleStore\n *\n * @returns {Object} Defined roles collection\n */\n function getStore() {\n return roleStore;\n }\n\n /**\n * Removes all role definitions\n * @method permission.PermRoleStore\n */\n function clearStore() {\n roleStore = {};\n }\n\n return{\n defineRole: defineRole,\n defineManyRoles: defineManyRoles,\n getRoleDefinition: getRoleDefinition,\n hasRoleDefinition: hasRoleDefinition,\n removeRoleDefinition: removeRoleDefinition,\n getStore: getStore,\n clearStore: clearStore\n }\n }\n\n angular\n .module('permission')\n .factory('PermRoleStore', PermRoleStore);\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Permission definition storage\n * @name permission.PermPermissionStore\n *\n * @param PermPermission {permission.PermPermission|Function}\n */\n function PermPermissionStore(PermPermission) {\n 'ngInject';\n\n /**\n * @property permissionStore\n *\n * @type {Object}\n */\n var permissionStore = {};\n\n /**\n * Allows to define permission on application configuration\n * @methodOf permission.PermPermissionStore\n *\n * @param permissionName {String} Name of defined permission\n * @param validationFunction {Function} Function used to validate if permission is valid\n */\n function definePermission(permissionName, validationFunction) {\n permissionStore[permissionName] = new PermPermission(permissionName, validationFunction);\n }\n\n /**\n * Allows to define set of permissionNames with shared validation function on application configuration\n * @methodOf permission.PermPermissionStore\n * @throws {TypeError}\n *\n * @param permissionNames {Array} Set of permission names\n * @param validationFunction {Function} Function used to validate if permission is valid\n */\n function defineManyPermissions(permissionNames, validationFunction) {\n if (!angular.isArray(permissionNames)) {\n throw new TypeError('Parameter \"permissionNames\" name must be Array');\n }\n\n angular.forEach(permissionNames, function (permissionName) {\n definePermission(permissionName, validationFunction);\n });\n }\n\n /**\n * Deletes permission\n * @methodOf permission.PermPermissionStore\n *\n * @param permissionName {String} Name of defined permission\n */\n function removePermissionDefinition(permissionName) {\n delete permissionStore[permissionName];\n }\n\n /**\n * Checks if permission exists\n * @methodOf permission.PermPermissionStore\n *\n * @param permissionName {String} Name of defined permission\n * @returns {Boolean}\n */\n function hasPermissionDefinition(permissionName) {\n return angular.isDefined(permissionStore[permissionName]);\n }\n\n /**\n * Returns permission by it's name\n * @methodOf permission.PermPermissionStore\n *\n * @returns {permission.Permission} Permissions definition object\n */\n function getPermissionDefinition(permissionName) {\n return permissionStore[permissionName];\n }\n\n /**\n * Returns all permissions\n * @methodOf permission.PermPermissionStore\n *\n * @returns {Object} Permissions collection\n */\n function getStore() {\n return permissionStore;\n }\n\n /**\n * Removes all permissions\n * @methodOf permission.PermPermissionStore\n */\n function clearStore() {\n permissionStore = {};\n }\n\n return {\n definePermission: definePermission,\n defineManyPermissions: defineManyPermissions,\n removePermissionDefinition: removePermissionDefinition,\n hasPermissionDefinition: hasPermissionDefinition,\n getPermissionDefinition: getPermissionDefinition,\n getStore: getStore,\n clearStore: clearStore\n };\n }\n\n angular\n .module('permission')\n .factory('PermPermissionStore', PermPermissionStore);\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Role definition factory\n * @function\n *\n * @param $q {Object} Angular promise implementation\n * @param $injector {Object} Dependency injection instance\n * @param PermPermissionStore {permission.PermPermissionStore} Permission definition storage\n * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing ui-router transition parameters\n *\n * @return {Role}\n */\n function PermRole($q, $injector, PermPermissionStore, PermTransitionProperties) {\n 'ngInject';\n\n /**\n * Role definition constructor\n * @constructor Role\n *\n * @param roleName {String} Name representing role\n * @param validationFunction {Function|Array} Optional function used to validate if permissions are still\n * valid or list of permission names representing role\n */\n function Role(roleName, validationFunction) {\n validateConstructor(roleName, validationFunction);\n\n this.roleName = roleName;\n this.validationFunction = annotateValidationFunction(validationFunction);\n }\n\n /**\n * Checks if role is still valid\n * @methodOf permission.Role\n *\n * @returns {Promise} $q.promise object\n */\n Role.prototype.validateRole = function () {\n var validationLocals = {\n roleName: this.roleName,\n transitionProperties: PermTransitionProperties\n };\n var validationResult = $injector.invoke(this.validationFunction, null, validationLocals);\n\n if (!angular.isFunction(validationResult.then)) {\n validationResult = wrapInPromise(validationResult, this.roleName);\n }\n\n return validationResult;\n };\n\n /**\n * Converts a value into a promise, if the value is truthy it resolves it, otherwise it rejects it\n * @methodOf permission.Role\n * @private\n *\n * @param result {Boolean} Function to be wrapped into promise\n * @param [roleName] {String} Returned value in promise\n *\n * @return {Promise}\n */\n function wrapInPromise(result, roleName) {\n if (result) {\n return $q.resolve(roleName);\n }\n\n return $q.reject(roleName);\n }\n\n /**\n * Checks if provided permission has accepted parameter types\n * @methodOf permission.Role\n * @private\n *\n * @throws {TypeError}\n *\n * @param roleName {String} Name representing role\n * @param validationFunction {Function|Array} Optional function used to validate if permissions are still\n * valid or list of permission names representing role\n */\n function validateConstructor(roleName, validationFunction) {\n if (!angular.isString(roleName)) {\n throw new TypeError('Parameter \"roleName\" name must be String');\n }\n\n if (!angular.isArray(validationFunction) && !angular.isFunction(validationFunction)) {\n throw new TypeError('Parameter \"validationFunction\" must be array or function');\n }\n }\n\n\n /**\n * Ensures the validation is injectable using explicit annotation.\n * Wraps a non-injectable function for backwards compatibility\n * @methodOf permission.Role\n * @private\n *\n * @param validationFunction {Function|Array} Function to wrap with injectable if needed\n *\n * @return {Function} Explicitly injectable function\n */\n function annotateValidationFunction(validationFunction) {\n // Test if the validation function is just an array of permission names\n if (angular.isArray(validationFunction) && !angular.isFunction(validationFunction[validationFunction.length - 1])) {\n validationFunction = preparePermissionEvaluation(validationFunction);\n } else if (!angular.isArray(validationFunction.$inject || validationFunction)) {\n // The function is not explicitly annotated, so assume using old-style parameters\n // and manually prepare for injection using our known old API parameters\n validationFunction = ['roleName', 'transitionProperties', validationFunction];\n }\n\n return validationFunction;\n }\n\n /**\n * Creates an injectable function that evaluates a set of permissions in place of a role validation function\n * @methodOf permission.Role\n * @private\n *\n * @param permissions {Array} List of permissions to evaluate\n *\n * @return {Function}\n */\n function preparePermissionEvaluation(permissions) {\n return function () {\n var promises = permissions.map(function (permissionName) {\n if (PermPermissionStore.hasPermissionDefinition(permissionName)) {\n var permission = PermPermissionStore.getPermissionDefinition(permissionName);\n\n return permission.validatePermission();\n }\n\n return $q.reject(permissionName);\n });\n\n return $q.all(promises);\n };\n }\n\n return Role;\n }\n\n angular\n .module('permission')\n .factory('PermRole', PermRole);\n\n})();\n\n(function () {\n 'use strict';\n\n /**\n * PermPermission definition factory\n * @function\n *\n * @param $q {Object} Angular promise implementation\n * @param $injector {Object} Dependency injection instance\n * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing ui-router transition parameters\n *\n * @return {Permission}\n */\n function PermPermission($q, $injector, PermTransitionProperties) {\n 'ngInject';\n\n /**\n * PermPermission definition object constructor\n * @constructor Permission\n *\n * @param permissionName {String} Name repressing permission\n * @param validationFunction {Function} Function used to check if permission is valid\n */\n function Permission(permissionName, validationFunction) {\n validateConstructor(permissionName, validationFunction);\n\n this.permissionName = permissionName;\n this.validationFunction = annotateValidationFunction(validationFunction);\n }\n\n /**\n * Checks if permission is still valid\n * @methodOf permission.Permission\n *\n * @returns {Promise}\n */\n Permission.prototype.validatePermission = function () {\n var validationLocals = {\n permissionName: this.permissionName,\n transitionProperties: PermTransitionProperties\n };\n var validationResult = $injector.invoke(this.validationFunction, null, validationLocals);\n\n if (!angular.isFunction(validationResult.then)) {\n validationResult = wrapInPromise(validationResult, this.permissionName);\n }\n\n return validationResult;\n };\n\n /**\n * Converts a value into a promise, if the value is truthy it resolves it, otherwise it rejects it\n * @methodOf permission.Permission\n * @private\n *\n * @param result {Boolean} Function to be wrapped into promise\n * @param permissionName {String} Returned value in promise\n *\n * @return {Promise}\n */\n function wrapInPromise(result, permissionName) {\n if (result) {\n return $q.resolve(permissionName);\n }\n\n return $q.reject(permissionName);\n }\n\n /**\n * Checks if provided permission has accepted parameter types\n * @methodOf permission.Permission\n * @private\n *\n * @throws {TypeError}\n *\n * @param permissionName {String} Name repressing permission\n * @param validationFunction {Function} Function used to check if permission is valid\n */\n function validateConstructor(permissionName, validationFunction) {\n if (!angular.isString(permissionName)) {\n throw new TypeError('Parameter \"permissionName\" name must be String');\n }\n if (!angular.isFunction(validationFunction) && !angular.isArray(validationFunction)) {\n throw new TypeError('Parameter \"validationFunction\" must be Function or an injectable Function using explicit annotation');\n }\n }\n\n /**\n * Ensures the validation is injectable using explicit annotation.\n * Wraps a non-injectable function for backwards compatibility\n * @methodOf permission.Permission\n * @private\n *\n * @param validationFunction {Function} Function to wrap with injectable if needed\n *\n * @return {Function} Explicitly injectable function\n */\n function annotateValidationFunction(validationFunction) {\n if (!angular.isArray(validationFunction.$inject || validationFunction)) {\n // The function is not explicitly annotated, so assume using old-style parameters\n // and manually prepare for injection using our known old API parameters\n validationFunction = ['permissionName', 'transitionProperties', validationFunction];\n }\n\n return validationFunction;\n }\n\n return Permission;\n }\n\n angular\n .module('permission')\n .factory('PermPermission', PermPermission);\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Handles authorization based on provided permissions/roles.\n * @name permission.permissionDirective\n *\n * Directive accepts single or combined attributes `permission-only` and `permission-except` that checks on\n * DOM rendering if permissions/roles are met. Attributes can be passed either as String, Array or variable from\n * parent scope. Directive also will watch for changes if applied and automatically update the view.\n *\n * @example\n *
    \n *
    \n *
    \n *
    \n *
    \n *\n * By default directive will show/hide elements if provided permissions matches.\n * You can override this behaviour by passing `permission-on-authorized` and `permission-on-unauthorized`\n * attributes that will pass to your function `$element` as argument that you can freely manipulate your DOM\n * behaviour.\n *\n * Important! Function should be as references - `vm.disableElement` not `vm.disableElement()` to be able to\n * accept passed $element reference from inside of permissionDirective\n *\n * @example\n *
    \n *
    \n *\n * @param $log {Object} Logging service\n * @param $injector {Object} Injector instance object\n * @param PermPermissionMap {permission.permPermissionMap|Function} Map of state access rights\n * @param PermPermissionStrategies {permission.permPermissionStrategies} Set of pre-defined directive behaviours\n *\n * @returns {{\n * restrict: string,\n * bindToController: {\n * sref: string\n * only: string,\n * except: string,\n * onAuthorized: function,\n * onUnauthorized: function\n * },\n * controllerAs: string,\n * controller: controller\n * }} Directive instance\n */\n function PermissionDirective($log, $injector, PermPermissionMap, PermPermissionStrategies) {\n 'ngInject';\n\n return {\n restrict: 'A',\n bindToController: {\n sref: '=?permissionSref',\n only: '=?permissionOnly',\n except: '=?permissionExcept',\n all: '=?permissionAll',\n onAuthorized: '&?permissionOnAuthorized',\n onUnauthorized: '&?permissionOnUnauthorized'\n },\n controllerAs: 'permission',\n controller: function ($scope, $element) {\n var permission = this;\n\n $scope.$watchGroup(['permission.only', 'permission.except', 'permission.all', 'sref'],\n function () {\n try {\n if (isSrefStateDefined()) {\n var PermStateAuthorization = $injector.get('PermStateAuthorization');\n\n PermStateAuthorization\n .authorizeByStateName(permission.sref)\n .then(function () {\n onAuthorizedAccess();\n })\n .catch(function () {\n onUnauthorizedAccess();\n });\n } else {\n var PermAuthorization = $injector.get('PermAuthorization');\n var permissionMap = new PermPermissionMap({\n only: permission.only,\n except: permission.except,\n all: permission.all\n });\n\n PermAuthorization\n .authorizeByPermissionMap(permissionMap)\n .then(function () {\n onAuthorizedAccess();\n })\n .catch(function () {\n onUnauthorizedAccess();\n });\n }\n } catch (e) {\n onUnauthorizedAccess();\n $log.error(e.message);\n }\n });\n\n /**\n * Returns true when permissions should be checked based on state name\n * @private\n *\n * @returns {boolean}\n */\n function isSrefStateDefined() {\n return $injector.has('$state') && permission.sref;\n }\n\n /**\n * Calls `onAuthorized` function if provided or show element\n * @private\n */\n function onAuthorizedAccess() {\n if (angular.isFunction(permission.onAuthorized)) {\n permission.onAuthorized()($element);\n } else {\n PermPermissionStrategies.showElement($element);\n }\n }\n\n /**\n * Calls `onUnauthorized` function if provided or hide element\n * @private\n */\n function onUnauthorizedAccess() {\n if (angular.isFunction(permission.onUnauthorized)) {\n permission.onUnauthorized()($element);\n } else {\n PermPermissionStrategies.hideElement($element);\n }\n }\n }\n };\n }\n\n angular\n .module('permission')\n .directive('permission', PermissionDirective);\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Extends $q implementation by A+ *any* method\n * @name permission.$q\n *\n * @extends {angular.$q}\n *\n * @param $delegate {Object} Parent instance being extended\n */\n function $q($delegate) {\n 'ngInject';\n\n $delegate.any = any;\n\n /**\n * Implementation of missing $q `any` method that wits for first resolution of provided promise set\n * @methodOf permission.$q\n *\n * @param promises {Array|promise} Single or set of promises\n *\n * @returns {Promise} Returns a single promise that will be rejected with an array/hash of values,\n * each value corresponding to the promise at the same index/key in the `promises` array/hash.\n * If any of the promises is resolved, this resulting promise will be returned\n * with the same resolution value.\n */\n function any(promises) {\n var deferred = $delegate.defer(),\n counter = 0,\n results = angular.isArray(promises) ? [] : {};\n\n angular.forEach(promises, function (promise, key) {\n counter++;\n $delegate\n .when(promise)\n .then(function (value) {\n deferred.resolve(value);\n })\n .catch(function (reason) {\n results[key] = reason;\n if (!(--counter)) {\n deferred.reject(reason);\n }\n });\n });\n\n if (counter === 0) {\n deferred.reject(results);\n }\n\n return deferred.promise;\n }\n\n return $delegate;\n }\n\n angular\n .module('permission')\n .decorator('$q', $q);\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Access rights map factory\n * @name permission.PermPermissionMap\n *\n * @param $q {Object} Angular promise implementation\n * @param $log {Object} Angular logging utility\n * @param $injector {Object} Dependency injection instance\n * @param PermTransitionProperties {permission.PermTransitionProperties} Helper storing ui-router transition parameters\n * @param PermRoleStore {permission.PermRoleStore} Role definition storage\n * @param PermPermissionStore {permission.PermPermissionStore} Permission definition storage\n *\n * @return {permission.PermissionMap}\n */\n function PermPermissionMap($q, $log, $injector, PermTransitionProperties, PermRoleStore, PermPermissionStore) {\n 'ngInject';\n\n /**\n * Constructs map object instructing authorization service how to handle authorizing\n * @constructor permission.PermissionMap\n *\n * @param [permissionMap] {Object} Map of permissions provided to authorization service\n * @param [permissionMap.only] {String|Array|Function} List of exclusive access right names allowed for\n * authorization\n * @param [permissionMap.except] {String|Array|Function} List of exclusive access right names denied for\n * authorization\n * @param [permissionMap.redirectTo] {String|Function|Object|promise} Handling redirection when rejected\n * authorization\n */\n function PermissionMap(permissionMap) {\n // Suppress not defined object errors\n permissionMap = permissionMap || {};\n\n this.only = normalizeMapProperty(permissionMap.only);\n this.except = normalizeMapProperty(permissionMap.except);\n this.all = normalizeMapProperty(permissionMap.all);\n this.redirectTo = permissionMap.redirectTo;\n }\n\n /**\n * Redirects to fallback states when permissions fail\n * @methodOf permission.PermissionMap\n *\n * @param [rejectedPermissionName] {String} Permission name\n *\n * @return {Promise}\n */\n PermissionMap.prototype.resolveRedirectState = function (rejectedPermissionName) {\n if (angular.isFunction(this.redirectTo) || angular.isArray(this.redirectTo)) {\n return resolveFunctionRedirect(this.redirectTo, rejectedPermissionName);\n }\n\n if (angular.isObject(this.redirectTo)) {\n return resolveObjectRedirect(this.redirectTo, rejectedPermissionName);\n }\n\n if (angular.isString(this.redirectTo)) {\n return $q.resolve({\n state: this.redirectTo\n });\n }\n\n // If redirectTo state is not defined stay where you are\n return $q.reject();\n };\n\n /**\n * Resolves weather permissions set for \"only\" or \"except\" property are valid\n * @methodOf permission.PermissionMap\n *\n * @param property {Array} \"only\" or \"except\" map property\n *\n * @return {Array}\n */\n PermissionMap.prototype.resolvePropertyValidity = function (property) {\n\n return property.map(function (privilegeName) {\n if (PermRoleStore.hasRoleDefinition(privilegeName)) {\n var role = PermRoleStore.getRoleDefinition(privilegeName);\n return role.validateRole();\n }\n\n if (PermPermissionStore.hasPermissionDefinition(privilegeName)) {\n var permission = PermPermissionStore.getPermissionDefinition(privilegeName);\n return permission.validatePermission();\n }\n\n $log.warn('Permission or role ' + privilegeName + ' was not defined.');\n return $q.reject(privilegeName);\n });\n };\n\n /**\n * Handles function based redirection for rejected permissions\n * @methodOf permission.PermissionMap\n *\n * @throws {TypeError}\n *\n * @param redirectFunction {Function} Redirection function\n * @param rejectedPermissionName {String} Rejected permission\n *\n * @return {Promise}\n */\n function resolveFunctionRedirect(redirectFunction, rejectedPermissionName) {\n if (!angular.isArray(redirectFunction.$inject || redirectFunction)) {\n redirectFunction = ['rejectedPermission', 'transitionProperties', redirectFunction];\n }\n\n return $q\n .when($injector.invoke(redirectFunction, null, {\n rejectedPermission: rejectedPermissionName,\n transitionProperties: PermTransitionProperties\n }))\n .then(function (redirectState) {\n if (angular.isString(redirectState)) {\n return {\n state: redirectState\n };\n }\n\n if (angular.isObject(redirectState)) {\n return redirectState;\n }\n\n return $q.reject();\n });\n }\n\n /**\n * Handles object based redirection for rejected permissions\n * @methodOf permission.PermissionMap\n *\n * @throws {ReferenceError}\n *\n * @param redirectObject {Object} Redirection function\n * @param permission {String} Rejected permission\n *\n * @return {Promise}\n */\n function resolveObjectRedirect(redirectObject, permission) {\n if (angular.isUndefined(redirectObject['default'])) {\n throw new ReferenceError('When used \"redirectTo\" as object, property \"default\" must be defined');\n }\n\n var redirectState = redirectObject[permission];\n\n if (angular.isUndefined(redirectState)) {\n redirectState = redirectObject['default'];\n }\n\n if (angular.isFunction(redirectState) || angular.isArray(redirectState)) {\n return resolveFunctionRedirect(redirectState, permission);\n }\n\n if (angular.isObject(redirectState)) {\n return $q.resolve(redirectState);\n }\n\n if (angular.isString(redirectState)) {\n return $q.resolve({\n state: redirectState\n });\n }\n }\n\n /**\n * Handles extraction of permission map \"only\" and \"except\" properties and converts them into array objects\n * @methodOf permission.PermissionMap\n * @private\n *\n * @param property {String|Array|Function} PermPermission map property \"only\" or \"except\"\n *\n * @returns {Array} Array of permission \"only\" or \"except\" names\n */\n function normalizeMapProperty(property) {\n if (angular.isString(property)) {\n return [property];\n }\n\n if (angular.isArray(property)) {\n return property;\n }\n\n if (angular.isFunction(property)) {\n return property.call(null, PermTransitionProperties);\n }\n\n return [];\n }\n\n return PermissionMap;\n }\n\n angular\n .module('permission')\n .factory('PermPermissionMap', PermPermissionMap);\n})();\n\n(function () {\n 'use strict';\n\n /**\n * Service responsible for handling view based authorization\n * @name permission.PermAuthorization\n *\n * @param $q {Object} Angular promise implementation\n */\n function PermAuthorization($q) {\n 'ngInject';\n\n /**\n * Handles authorization based on provided permissions map\n * @methodOf permission.PermAuthorization\n *\n * @param map {permission.PermissionMap} Map of permission names\n *\n * @returns {promise} $q.promise object\n */\n function authorizeByPermissionMap(map) {\n return authorizePermissionMap(map);\n }\n\n /**\n * Checks authorization for simple view based access\n * @methodOf permission.PermAuthorization\n * @private\n *\n * @param map {permission.PermissionMap} Access rights map\n *\n * @returns {promise} $q.promise object\n */\n function authorizePermissionMap(map) {\n var deferred = $q.defer();\n resolveExceptPrivilegeMap(deferred, map);\n return deferred.promise;\n }\n\n /**\n * Resolves flat set of \"except\" privileges\n * @methodOf permission.PermAuthorization\n * @private\n *\n * @param deferred {Object} Promise defer\n * @param map {permission.PermissionMap} Access rights map\n *\n * @returns {Promise} $q.promise object\n */\n function resolveExceptPrivilegeMap(deferred, map) {\n var exceptPromises = map.resolvePropertyValidity(map.except);\n\n $q.any(exceptPromises)\n .then(function (rejectedPermissions) {\n deferred.reject(rejectedPermissions);\n })\n .catch(function () {\n // if(map.all.length > 0){\n // resolveAllPermissionMap(deferred, map);\n // }else {\n // resolveOnlyPermissionMap(deferred, map);\n // }\n resolveOnlyPermissionMap(deferred, map);\n });\n }\n\n /**\n * Resolves flat set of \"only\" privileges\n * @methodOf permission.PermAuthorization\n * @private\n *\n * @param deferred {Object} Promise defer\n * @param map {permission.PermissionMap} Access rights map\n */\n function resolveOnlyPermissionMap(deferred, map) {\n if (!map.only.length) {\n // deferred.resolve();\n resolveAllPermissionMap(deferred, map);\n return;\n }\n\n var onlyPromises = map.resolvePropertyValidity(map.only);\n $q.any(onlyPromises)\n .then(function (/*resolvedPermissions*/) {\n resolveAllPermissionMap(deferred, map);\n // deferred.resolve(resolvedPermissions);\n })\n .catch(function (rejectedPermission) {\n deferred.reject(rejectedPermission);\n });\n }\n\n /**\n * Resolves flat set of \"all\" privileges\n * @methodOf permission.PermAuthorization\n * @private\n *\n * @param deferred {Object} Promise defer\n * @param map {permission.PermissionMap} Access rights map\n */\n function resolveAllPermissionMap(deferred, map) {\n if (!map.all.length) {\n deferred.resolve();\n return;\n }\n\n var allPromises = map.resolvePropertyValidity(map.all);\n $q.all(allPromises)\n .then(function (resolvedPermissions) {\n deferred.resolve(resolvedPermissions);\n })\n .catch(function (rejectedPermission) {\n deferred.reject(rejectedPermission);\n });\n }\n\n\n\n return{\n authorizeByPermissionMap: authorizeByPermissionMap\n };\n }\n\n angular\n .module('permission')\n .factory('PermAuthorization', PermAuthorization);\n})();\n\n/**\n * Created by Bruce on 2016/7/21.\n */\n(function () {\n 'use strict';\n\n angular.module('eHRD.shared',[\n 'eHRD.shared.server'\n // 'eHRD.kernel.translate'\n ]);\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular.module('eHRD.shared')\n .filter('sunnetPicture', sunnetPicture);\n\n /** @ngInject */\n function sunnetPicture(layoutPaths) {\n\n return function(input, ext) {\n ext = ext || 'jpg';\n return layoutPaths.images.sunnet + input + '.' + ext;\n };\n }\n\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular.module('eHRD.shared')\n .filter('serverResource', serverResource);\n\n /** @ngInject */\n function serverResource(serverSetting) {\n\n return function(url, isNeedContextPath) {\n isNeedContextPath = isNeedContextPath || false;\n var baseURL = \"\";\n if(serverSetting.SSLType === 1){\n baseURL = [['https', serverSetting.serverDomain].join('://'), serverSetting.SSLPort].join((serverSetting.SSLPort.length > 0) ? ':' : '');\n if(isNeedContextPath){\n baseURL = [baseURL, serverSetting.contextPath].join('/');\n return baseURL + url;\n }else {\n return baseURL + url;\n }\n } else {\n if(isNeedContextPath){\n return serverSetting.baseConfig.baseURL + url;\n }else {\n return serverSetting.baseConfig.serverAddress + url;\n }\n }\n };\n }\n\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular.module('eHRD.shared')\n .filter('profilePicture', profilePicture);\n\n /** @ngInject */\n function profilePicture(layoutPaths) {\n\n return function(input, ext) {\n ext = ext || 'png';\n return layoutPaths.images.profile + input + '.' + ext;\n };\n }\n\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular.module('eHRD.shared')\n .filter('makePicture', makePicture);\n\n /** @ngInject */\n function makePicture(layoutPaths) {\n\n return function(input, ext) {\n ext = ext || 'jpg';\n return layoutPaths.images.make + input + '.' + ext;\n };\n }\n\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular.module('eHRD.shared')\n .filter('coursePicture', profilePicture);\n\n /** @ngInject */\n function profilePicture(layoutPaths) {\n\n return function(input, ext) {\n ext = ext || 'png';\n return layoutPaths.images.course + input + '.' + ext;\n };\n }\n\n})();\n\n/**\n * Created by Bruce on 2016/12/20.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.utils', []);\n\n})();\n\n/**\n * Created by Bruce on 2017/2/9.\n */\n(function () {\n 'use strict';\n\n utilsService.$inject = ['Restangular'];\n function utilsService(Restangular){\n\n /*\n * Build collection api/util\n */\n var _utilsService = Restangular.all('util');\n\n return {\n findMyGroupMembers: function (params) {\n params = params || {};\n /*\n * /api/util/find-my-descendent-members\n * */\n return _utilsService\n .customGETLIST('find-my-group-members', params);\n },\n findMyDescendentMembers: function (params) {\n params = params || {};\n /*\n * /api/util/find-my-descendent-members\n * */\n return _utilsService\n .customGETLIST('find-my-descendent-members', params);\n },\n getMembersByFilter: function (params) {\n params = params || {};\n /*\n * /api/util/select-users?keywords={keywords}\n * */\n return _utilsService\n .customGETLIST('select-users', params);\n },\n getTipInfo: function (typeId, params) {\n /*\n * /api/util/tip-info/{typeId}?{params}\n * typeId = 5, params = {exid}\n * */\n return _utilsService\n .one('tip-info', typeId)\n .customGETLIST(null, params);\n },\n getExternalCourses: function (params) {\n /*\n * /api/util/ext-list-courses?courseCode={courseCode}&courseName={courseName}&keywords={keywords}\n * */\n return _utilsService\n .customGETLIST('ext-list-courses', params);\n },\n getExternalCourseSessions: function (courseId, params) {\n /*\n * /api/util/ext-list-courses/{courseId}/sessions?externalId={externalId}&applicantId={applicantId}\n * */\n return _utilsService\n .one('ext-list-courses', courseId)\n .customGETLIST('sessions', params);\n }\n };\n\n }\n\n angular.module('eHRD.modules.utils')\n .factory('utilsService', utilsService);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/21.\n */\n(function () {\n 'use strict';\n\n ngTableColumnValueService.$inject = [];\n function ngTableColumnValueService(){\n\n /*\n * This Method Need Use bindCompiledHtml Directive\n * */\n function htmlReferences($scope, row) {\n var values = row[this.field];\n var html = \"\";\n angular.forEach(values, function (value, index) {\n html += \"\" +\n \"assignment\" +\n \"\";\n });\n return html;\n }\n\n function htmlCertReferences($scope, row) {\n var values = row[this.field];\n var html = \"\";\n angular.forEach(values, function (value, index) {\n html += \"\" +\n \"assignment\" +\n \"\";\n });\n return html;\n }\n\n function htmlExtCertReferences($scope, row) {\n var values = row[this.field];\n var html = \"\";\n angular.forEach(values, function (value, index) {\n html += \"\" +\n \"assignment\" +\n \"\";\n });\n return html;\n }\n\n\n function htmlTextValue($scope, row) {\n var value = row[this.field];\n var columnType = this.columnType();\n var html = \"
    \" + value + \"
    \";\n return (html);\n }\n\n /*\n * EX: cols ==>\n * interpolateExpr: $interpolate(\"{{ row.age | number:1}}\")\n * */\n function interpolatedValue($scope, row) {\n return this.interpolateExpr({\n row: row,\n $ctrl: $scope\n });\n }\n\n return {\n\n htmlReferences: htmlReferences,\n htmlCertReferences: htmlCertReferences,\n htmlExtCertReferences: htmlExtCertReferences,\n htmlTextValue: htmlTextValue,\n interpolatedValue: interpolatedValue\n\n\n };\n }\n\n angular.module('eHRD.modules.utils')\n .factory('ngTableColumnValueService', ngTableColumnValueService);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/22.\n */\n(function () {\n 'use strict';\n\n momentUtils.$inject = [];\n function momentUtils() {\n\n var INTERVALS = {\n year: true,\n month: true,\n week: true,\n day: true,\n hour: true,\n minute: true,\n second: true\n };\n\n function DateRange(start, end) {\n var parts;\n var s = start;\n var e = end;\n\n if (arguments.length === 1 || angular.isUndefined(end)) {\n if (angular.isObject(start) && start.length === 2) {\n s = start[0];\n e = start[1];\n }\n else if (angular.isString(start)) {\n parts = start.split('/');\n s = parts[0];\n e = parts[1];\n }\n }\n\n this.start = (s === null) ? moment(-8640000000000000) : moment(s);\n this.end = (e === null) ? moment(8640000000000000) : moment(e);\n }\n\n\n /**\n * Constructor for prototype.\n *\n * @type {DateRange}\n */\n DateRange.prototype.constructor = DateRange;\n\n /**\n * Deep clone range.\n *\n * @return {!DateRange}\n */\n DateRange.prototype.clone = function() {\n return range(this.start, this.end);\n };\n\n /**\n * Determine if the current interval contains a given moment/date/range.\n *\n * @param {(Moment|Date|DateRange)} other Date to check\n * @param {!boolean} exclusive True if the to value is exclusive\n *\n * @return {!boolean}\n */\n DateRange.prototype.contains = function(other, exclusive) {\n var start = this.start;\n var end = this.end;\n\n if (other instanceof DateRange) {\n return start <= other.start && (end > other.end || (end.isSame(other.end) && !exclusive));\n }\n else {\n return start <= other && (end > other || (end.isSame(other) && !exclusive));\n }\n };\n\n /**\n * Determine if the current date range overlaps a given date range.\n *\n * @param {!DateRange} range Date range to check\n *\n * @return {!boolean}\n */\n DateRange.prototype.overlaps = function(range) {\n return this.intersect(range) !== null;\n };\n\n /**\n * Determine the intersecting periods from one or more date ranges.\n *\n * @param {!DateRange} other A date range to intersect with this one\n *\n * @return {DateRange} Returns the intersecting date or `null` if the ranges do\n * not intersect\n */\n DateRange.prototype.intersect = function(other) {\n var start = this.start;\n var end = this.end;\n\n if ((start <= other.start) && (other.start < end) && (end < other.end)) {\n return new DateRange(other.start, end);\n }\n else if ((other.start < start) && (start < other.end) && (other.end <= end)) {\n return new DateRange(start, other.end);\n }\n else if ((other.start < start) && (start <= end) && (end < other.end)) {\n return this;\n }\n else if ((start <= other.start) && (other.start <= other.end) && (other.end <= end)) {\n return other;\n }\n\n return null;\n };\n\n /**\n * Merge date ranges if they intersect.\n *\n * @param {!DateRange} other A date range to add to this one\n *\n * @return {DateRange} Returns the new `DateRange` or `null` if they do not\n * overlap\n */\n DateRange.prototype.add = function(other) {\n if (this.overlaps(other)) {\n return new DateRange(moment.min(this.start, other.start), moment.max(this.end, other.end));\n }\n\n return null;\n };\n\n /**\n * Subtract one range from another.\n *\n * @param {!DateRange} other A date range to substract from this one\n *\n * @return {!Array}\n */\n DateRange.prototype.subtract = function(other) {\n var start = this.start;\n var end = this.end;\n\n if (this.intersect(other) === null) {\n return [this];\n }\n else if ((other.start <= start) && (start < end) && (end <= other.end)) {\n return [];\n }\n else if ((other.start <= start) && (start < other.end) && (other.end < end)) {\n return [new DateRange(other.end, end)];\n }\n else if ((start < other.start) && (other.start < end) && (end <= other.end)) {\n return [new DateRange(start, other.start)];\n }\n else if ((start < other.start) && (other.start < other.end) && (other.end < end)) {\n return [new DateRange(start, other.start), new DateRange(other.end, end)];\n }\n else if ((start < other.start) && (other.start < end) && (other.end < end)) {\n return [new DateRange(start, other.start), new DateRange(other.start, end)];\n }\n };\n\n /**\n * Build a n array of dates.\n *\n * @param {(!DateRange|String)} range Date range to be used for iteration or\n * shorthand string (shorthands:\n * http://momentjs.com/docs/#/manipulating/add/)\n * @param {!boolean} exclusive Indicate that the end of the range should not\n * be included in the iter.\n *\n * @return {!Array}\n */\n DateRange.prototype.toArray = function(by, exclusive) {\n var acc = [];\n this.by(by, function(unit) {\n acc.push(unit);\n }, exclusive);\n return acc;\n };\n\n /**\n * Iterate over the date range by a given date range, executing a function\n * for each sub-range.\n *\n * @param {(!DateRange|String)} range Date range to be used for iteration or\n * shorthand string (shorthands:\n * http://momentjs.com/docs/#/manipulating/add/)\n * @param {!DateRange~by} hollaback Callback\n * @param {!boolean} exclusive Indicate that the end of the range should not\n * be included in the iter.\n *\n * @return {DateRange} `this`\n */\n DateRange.prototype.by = function(range, hollaback, exclusive) {\n if (angular.isString(range)) {\n _byString.call(this, range, hollaback, exclusive);\n }\n else {\n _byRange.call(this, range, hollaback, exclusive);\n }\n return this;\n };\n\n\n /**\n * Callback executed for each sub-range.\n *\n * @callback DateRange~by\n *\n * @param {!Moment} current Current moment object for iteration\n */\n\n /**\n * @private\n */\n function _byString(interval, hollaback, exclusive) {\n var current = moment(this.start);\n\n while (this.contains(current, exclusive)) {\n hollaback.call(this, current.clone());\n current.add(1, interval);\n }\n }\n\n /**\n * @private\n */\n function _byRange(interval, hollaback, exclusive) {\n var div = this / interval;\n var l = Math.floor(div);\n\n if (l === Infinity) { return; }\n if (l === div && exclusive) {\n l--;\n }\n\n for (var i = 0; i <= l; i++) {\n hollaback.call(this, moment(this.start.valueOf() + interval.valueOf() * i));\n }\n }\n\n /**\n * Date range formatted as an [ISO8601 Time\n * Interval](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals).\n *\n * @return {!String}\n */\n DateRange.prototype.toString = function() {\n return this.start.format() + '/' + this.end.format();\n };\n\n /**\n * Date range in milliseconds. Allows basic coercion math of date ranges.\n *\n * @return {!number}\n */\n DateRange.prototype.valueOf = function() {\n return this.end - this.start;\n };\n\n /**\n * Center date of the range.\n *\n * @return {!Moment}\n */\n DateRange.prototype.center = function() {\n var center = this.start + this.diff() / 2;\n return moment(center);\n };\n\n /**\n * Date range toDate\n *\n * @return {!Array}\n */\n DateRange.prototype.toDate = function() {\n return [this.start.toDate(), this.end.toDate()];\n };\n\n /**\n * Determine if this date range is the same as another.\n *\n * @param {!DateRange} other Another date range to compare to\n *\n * @return {!boolean}\n */\n DateRange.prototype.isSame = function(other) {\n return this.start.isSame(other.start) && this.end.isSame(other.end);\n };\n\n /**\n * The difference of the end vs start.\n *\n * @param {number} unit Unit of difference, if no unit is passed in\n * milliseconds are returned. E.g.: `\"days\"`, `\"months\"`,\n * etc...\n *\n * @return {!number}\n */\n DateRange.prototype.diff = function(unit) {\n return this.end.diff(this.start, unit);\n };\n\n\n function range(start, end) {\n if (start in INTERVALS) {\n return new DateRange(moment(this).startOf(start), moment(this).endOf(start));\n }\n else {\n return new DateRange(start, end);\n }\n }\n\n range.constructor = DateRange;\n\n return {\n range: range\n };\n }\n\n angular\n .module('eHRD.modules.utils')\n .factory('momentUtils', momentUtils);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/6.\n */\n\n(function () {\n 'use strict';\n\n ctlService.$inject = ['Restangular'];\n function ctlService(Restangular){\n\n var _CtlService = Restangular.all('ctl');\n\n return {\n\n getManagerGroups: function (params) {\n /*\n * api/manager/member-finished-enrollment\n * */\n return _CtlService\n .one('selection-dropdown')\n .customGETLIST('manage-groups', params);\n },\n\n getManagerMembers: function (params) {\n /*\n * api/ctl/selection-dropdown/manage-members?showAllOption={showAllOption}&selectedValue={selectedValue}&groupId={groupId}&filterSelf={filterSelf}\n * */\n return _CtlService\n .one('selection-dropdown')\n .customGETLIST('manage-members', params);\n },\n\n getCatalogCourseSearch: function (params) {\n /*\n * api/ctl/catalog-course-search/Search={Search}&itemType={itemType}&searchScope={searchScope}&isbindtype={isbindtype}&roleID={roleID}&\n isbindtype={isbindtype}&showHistorialCourse={showHistorialCourse}&showUnpublished={showUnpublished}&courseFilterType={courseFilterType}&\n keyword={keyword}¤t_page={current_page}&list_size={list_size}\n * */\n return _CtlService\n .customGETLIST('catalog-course-search', params);\n },\n\n getCompanys: function (params) {\n /*\n * api/ctl/selection-dropdown/companys?showAllOption={showAllOption}&selectedValue={selectedValue}\n * */\n return _CtlService\n .one('selection-dropdown')\n .customGETLIST('companys', params);\n },\n\n getCompanySubjects: function (params) {\n /*\n * api/ctl/selection-dropdown/subjects?companyId=4&showAllOption=false&selectedValue=80\n * */\n return _CtlService\n .one('selection-dropdown')\n .customGETLIST('subjects', params);\n },\n\n getAllCurrency: function (params) {\n /*\n * api/ctl/selection-dropdown/all-currency?showAllOption={showAllOption}&selectedValue={selectedValue}\n * */\n return _CtlService\n .one('selection-dropdown')\n .customGETLIST('all-currency', params);\n },\n\n getInnercertClasses: function (params) {\n /*\n * api/ctl/selection-dropdown/innercert-classes?showAllOption={showAllOption}&selectedValue={selectedValue}\n * */\n return _CtlService\n .one('selection-dropdown')\n .customGETLIST('innercert-classes', params);\n },\n\n getInnercerts: function (params) {\n /*\n * api/ctl/selection-dropdown/innercerts?showAllOption={showAllOption}&selectedValue={selectedValue}\n * &classificationId={classificationId}\n * */\n return _CtlService\n .one('selection-dropdown')\n .customGETLIST('innercerts', params);\n },\n\n getExtcertApplyClasses: function (params) {\n /*\n * api/ctl/selection-dropdown/extcert-apply-classes?showAllOption={showAllOption}&selectedValue={selectedValue}\n * */\n return _CtlService\n .one('selection-dropdown')\n .customGETLIST('extcert-apply-classes', params);\n },\n\n getCompensationTestItem: function (params) {\n /*\n * api/ctl/selection-dropdown/compensation-test-item?showAllOption={showAllOption}&selectedValue={selectedValue}\n * &testApplyFormId={testApplyFormId}\n * */\n return _CtlService\n .one('selection-dropdown')\n .customGETLIST('compensation-test-item', params);\n },\n\n getManageGroups: function (params) {\n /*\n * api/ctl/selection-dropdown/manage-groups?showAllOption={showAllOption}&selectedValue={selectedValue}\n * */\n return _CtlService\n .one('selection-dropdown')\n .customGETLIST('manage-groups', params);\n },\n\n getManageMembers: function (params) {\n /*\n * api/ctl/selection-dropdown/manage-members?showAllOption={showAllOption}&selectedValue={selectedValue}\n * &groupId={groupId}&filterSelf={filterSelf}\n * */\n return _CtlService\n .one('selection-dropdown')\n .customGETLIST('manage-members', params);\n },\n\n getClassifications: function (params) {\n /*\n * api/ctl/selection-dropdown/classifications?type={type}&showAllOption={showAllOption}&&selectedValue={selectedValue}\n * */\n return _CtlService\n .one('selection-dropdown')\n .customGETLIST('classifications', params);\n }\n\n\n };\n\n }\n\n\n angular.module('eHRD.modules.utils')\n .factory('ctlService', ctlService);\n})();\n\n/**\n * Created by Bruce on 2016/12/29.\n */\n(function () {\n 'use strict';\n\n classTimeUtils.$inject = ['momentUtils'];\n function classTimeUtils(momentUtils) {\n\n function getRepeatRanges(startDateTime, endDateTime, classTime) {\n var dateRanges = [];\n var _dateRanges = [];\n switch (classTime.repeatIntervalUnit){\n case 'week':\n _dateRanges = [];\n dateRanges = [];\n _dateRanges = buildRepeatRanges(momentUtils.range(startDateTime, endDateTime).toArray('weeks'), classTime);\n angular.forEach(_dateRanges, function (_dateRange) {\n var sd = _dateRange.toDate();\n var ed = moment(sd).add(1, 'weeks').add(-1, 'days');\n if(ed > endDateTime) ed = moment(endDateTime);\n dateRanges = dateRanges.concat(momentUtils.range(sd, ed.toDate()).toArray('days'));\n });\n break;\n case 'month':\n _dateRanges = [];\n dateRanges = [];\n _dateRanges = buildRepeatRanges(momentUtils.range(startDateTime, endDateTime).toArray('months'), classTime);\n angular.forEach(_dateRanges, function (_dateRange) {\n var sd = _dateRange.toDate();\n var ed = moment(sd).add(1, 'months').add(-1, 'days');\n if(ed > endDateTime) ed = moment(endDateTime);\n dateRanges = dateRanges.concat(moment.range(sd, ed.toDate()).toArray('days'));\n });\n break;\n case 'year':\n _dateRanges = [];\n dateRanges = [];\n _dateRanges = buildRepeatRanges(momentUtils.range(startDateTime, endDateTime).toArray('years'), classTime);\n angular.forEach(_dateRanges, function (_dateRange) {\n var sd = _dateRange.toDate();\n var ed = moment(sd).add(1, 'years').add(-1, 'days');\n if(ed > endDateTime) ed = moment(endDateTime);\n dateRanges = dateRanges.concat(momentUtils.range(sd, ed.toDate()).toArray('days'));\n });\n break;\n }\n\n return dateRanges;\n }\n function buildRepeatRanges(dateRanges, classTime){\n var nextIndex = 0, repeatRanges = [];\n angular.forEach(dateRanges, function (dateRange, index) {\n if(angular.equals(nextIndex, index)) {\n repeatRanges.push(dateRange);\n nextIndex += (parseInt(classTime.repeatIntervalNumber));\n }\n });\n return repeatRanges;\n }\n\n\n function getDateTimeRangesByClassTime(classTime) {\n // courseTimeDesc format ===> 2016/12/31 每1週 00:00-23:00 休息時間12:00-13:00\n // classTime Format ==> 2016/12/31_0:0-12:0,2016/12/31_13:0-23:0\n /*\n * SPEC\n * 1. 未設定休息時間,日期起迄為 (上課開始日期 + 上課開始時間) 到 (上課結束日期 + 上課結束時間)\n * 2. 有設定休息時間,上課時間會變為,a. 上課開始時間 到 休息開始時間; b. 休息結束時間 到 上課結束時間,\n * 日期起迄為\n * (1). (上課開始日期 + 上課開始時間) 到 (上課結束日期 + 休息開始時間)\n * (2). (上課開始日期 + 休息結束時間) 到 (上課結束日期 + 上課結束時間)\n * 3. 承1.或2.,計算出日期時間區段,排除未包含的工作日(包含日,預設星期日到星期六)\n * 4. 如有開啟循環模式 承(1.或2.) 和3.,\n * */\n var dateTimeRanges = [];\n var startDateTime = moment(classTime.startDate).set({\n 'hour' : classTime.startH,\n 'minute' : classTime.startM,\n 'second' : \"0\"\n }).toDate();\n var endDateTime = moment(classTime.endDate).set({\n 'hour' : classTime.endH,\n 'minute' : classTime.endM,\n 'second' : \"0\"\n }).toDate();\n\n var dateRanges = momentUtils.range(startDateTime, endDateTime).toArray('days');\n if(classTime.isEnableRepeat){\n dateRanges = getRepeatRanges(startDateTime, endDateTime, classTime);\n }\n\n angular.forEach(dateRanges, function (dateRange) {\n if(classTime.includeDays.indexOf(dateRange.day()) > -1) {\n dateTimeRanges.push(dateRange);\n }\n });\n\n return dateTimeRanges;\n }\n\n function getClassTimesFormatted(classTime) {\n var _classTime = [];\n var startDateTime = moment(classTime.startDate).set({\n 'hour' : classTime.startH,\n 'minute' : classTime.startM,\n 'second' : \"0\"\n }).toDate();\n var endDateTime = moment(classTime.endDate).set({\n 'hour' : classTime.endH,\n 'minute' : classTime.endM,\n 'second' : \"0\"\n }).toDate();\n var dateRanges = momentUtils.range(startDateTime, endDateTime).toArray('days');\n if(classTime.isEnableRepeat){\n dateRanges = getRepeatRanges(startDateTime, endDateTime, classTime);\n }\n\n angular.forEach(dateRanges, function (dateRange) {\n if(classTime.includeDays.indexOf(dateRange.day()) > -1) {\n var sd = dateRange.format(\"YYYY/MM/DD\");\n if(classTime.isEnableRestTime){\n var rdt1 = sd + '_' + classTime.startH + ':' + classTime.startM + '-' + + classTime.rest_startH + ':' + classTime.rest_startM;\n _classTime.push(rdt1);\n var rdt2 = sd + '_' + classTime.rest_endH + ':' + classTime.rest_endM + '-' + + classTime.endH + ':' + classTime.endM;\n _classTime.push(rdt2);\n }else {\n var dt = sd + '_' + classTime.startH + ':' + classTime.startM + '-' + + classTime.endH + ':' + classTime.endM;\n _classTime.push(dt);\n }\n }\n });\n return _classTime;\n }\n\n function mergeClassTimes(classTimePools) {\n var classTimeFormatted = [];\n angular.forEach(classTimePools, function (_classTime) {\n var currentClassTimes = getClassTimesFormatted(_classTime);\n angular.forEach(currentClassTimes, function (currentClassTime) {\n if(classTimeFormatted.indexOf(currentClassTime) === -1){\n classTimeFormatted.push(currentClassTime);\n }\n })\n });\n return classTimeFormatted;\n }\n return{\n getDateTimeRangesByClassTime: getDateTimeRangesByClassTime,\n\n getClassTimesFormatted: getClassTimesFormatted,\n\n mergeClassTimes: mergeClassTimes\n };\n }\n\n angular\n .module('eHRD.modules.utils')\n .factory('classTimeUtils', classTimeUtils);\n})();\n\n/**\n * Created by Bruce on 2017/3/1.\n */\n(function () {\n 'use strict';\n\n urlIncludesServerPath.$inject = ['$sce', 'serverSetting'];\n function urlIncludesServerPath($sce, serverSetting) {\n return function(url) {\n url = url || '';\n return $sce.trustAsHtml((url.contains('http') ? url : (serverSetting.baseConfig.serverAddress + url)));\n };\n }\n\n angular.module('eHRD.modules.utils')\n .filter('urlIncludesServerPath', urlIncludesServerPath);\n\n})();\n\n/**\n * Created by Bruce on 2017/2/20.\n */\n\n(function () {\n 'use strict';\n\n trustAsHtml.$inject = ['$sce'];\n function trustAsHtml($sce) {\n return function(text) {\n return $sce.trustAsHtml(text);\n };\n }\n\n angular.module('eHRD.modules.utils')\n .filter('trustAsHtml', trustAsHtml);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/24.\n * Set suffixes after val\n * (1)$filter('suffixes')(100, '%')\n * => 100 %\n * (2) {{ 100 | suffixes: '%'}}\n * => 100 %\n * @param val (String, int)\n * @param suffixes (String)\n */\n(function () {\n 'use strict';\n\n suffixes.$inject = [];\n function suffixes() {\n return function(val, symbol) {\n symbol = symbol || '';\n return val + ' ' + symbol;\n };\n }\n\n angular.module('eHRD.modules.utils')\n .filter('suffixes', suffixes);\n\n})();\n\n/**\n * Created by Bruce on 2017/2/20.\n */\n(function () {\n 'use strict';\n\n stringToNumber.$inject = [];\n function stringToNumber() {\n return function(val) {\n return parseInt(val);\n };\n }\n\n angular.module('eHRD.modules.utils')\n .filter('stringToNumber', stringToNumber);\n\n})();\n\n/**\n * Created by Bruce on 2017/2/20.\n */\n(function () {\n 'use strict';\n\n stringSplitToValue.$inject = [];\n function stringSplitToValue() {\n return function(str, split, index) {\n str = str || '';\n return angular.isDefined(str.split(split)[index]) ? str.split(split)[index] : null;\n };\n }\n\n angular.module('eHRD.modules.utils')\n .filter('stringSplitToValue', stringSplitToValue);\n\n})();\n\n/**\n * Created by Alan on 2017/1/12.\n * String replace using a regex expression\n * (1)'Hello Word' |replaceAll:'Word':'Alan' => Hello Alan\n * (2)'123' |replaceAll:'(.{2})':'$1.' => 12.3\n * @param string\n * @param oldValue Replaced by old value\n * @param newValue Replace the new value\n */\n(function () {\n 'use strict';\n\n replaceAll.inject = [];\n function replaceAll() {\n return function (string, oldValue, newValue) {\n var regExp= new RegExp(oldValue, \"g\");\n return (angular.isDefined(string))?string.replace(regExp, newValue):string;\n }\n }\n\n angular.module('eHRD.modules.utils')\n .filter('replaceAll', replaceAll)\n})();\n\n/**\n * Created by Bruce on 2016/9/22.\n */\n(function () {\n 'use strict';\n\n numberToMonth.inject = [];\n function numberToMonth() {\n return function (monthNumber) {\n var monthNames = [ 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December' ];\n return monthNames[monthNumber - 1];\n }\n }\n\n angular.module('eHRD.modules.utils')\n .filter('numberToMonth', numberToMonth)\n})();\n\n/**\n * Created by Alan on 2017/2/8.\n * Number format conversion\n * (1)16.4 |nameRegular:'floor' => 16\n * (2)16.4 |nameRegular:'round' => 16\n * (3)16.4 |nameRegular:'ceil' => 17\n * @param number\n * @param method Conversion method\n */\n(function () {\n 'use strict';\n\n numberFormat.inject = [];\n function numberFormat() {\n return function (number, method) {\n var newNumber;\n switch(method) {\n case 'floor':\n newNumber = Math.floor(number);\n break;\n case 'round':\n newNumber = Math.round(number);\n break;\n case 'ceil':\n newNumber = Math.ceil(number);\n break;\n case 'abs':\n newNumber = Math.abs(number);\n break;\n }\n return newNumber;\n }\n }\n\n angular.module('eHRD.modules.utils')\n .filter('numberFormat', numberFormat)\n})();\n\n/**\n * Created by Alan on 2017/1/19.\n * Avatar English and Chinese name judgment\n * (1)'大寶' |nameRegular => 大寶\n * (2)'Alan' |nameRegular => A\n * @param name\n */\n(function () {\n 'use strict';\n\n nameRegular.inject = ['$filter'];\n function nameRegular($filter) {\n return function (name) {\n var regExp = /^[\\d|\\u4e00-\\u9fa5]$/;\n if (!regExp.test(name[0]))\n return $filter('uppercase')(name[0]);\n else\n return name.substr(0, 2);\n }\n }\n\n angular.module('eHRD.modules.utils')\n .filter('nameRegular', nameRegular)\n})();\n\n/**\n * Created by Alan on 2016/11/3.\n * Insert a mark between strings and use foreach or ng-repeat\n * (1)\n * {{instructor.instructorName | markSplit:$index:' / '}}\n * \n * => 小寶 / 中寶 / 大寶\n * @param data Array or Object\n * @param index Data index\n * @param mark String between the mark\n */\n(function () {\n 'use strict';\n\n markSplit.inject = [];\n function markSplit() {\n return function (data,index,mark) {\n data=(index===0)?data:mark+data;\n return data;\n }\n }\n\n angular.module('eHRD.modules.utils')\n .filter('markSplit', markSplit)\n})();\n\n/**\n * Created by Bruce on 2017/3/28.\n * Html Escaped Decode\n * String = <  >\n * (1)$filter('html-escaped-decode')(String)\n * => < >\n * (2) {{ String | htmlEscapedDecode}}\n * => < >\n * @param val (String)\n */\n(function () {\n 'use strict';\n\n htmlEscapedDecode.$inject = [];\n function htmlEscapedDecode() {\n return function(input) {\n var entities = [\n ['amp', '&'],\n ['apos', '\\''],\n ['#x27', '\\''],\n ['#x2F', '/'],\n ['#39', '\\''],\n ['#47', '/'],\n ['lt', '<'],\n ['gt', '>'],\n ['nbsp', ' '],\n ['quot', '\"'],\n ['#160', ' ']\n ];\n\n if(angular.isString(input)){\n angular.forEach(entities, function (entitie) {\n input = input.replace(new RegExp('&'+entitie[0]+';', 'g'), entitie[1]);\n })\n }\n return input;\n };\n }\n\n angular.module('eHRD.modules.utils')\n .filter('htmlEscapedDecode', htmlEscapedDecode);\n\n})();\n\n/**\n * Created by Alan on 2017/6/20.\n */\n(function () {\n 'use strict';\n\n hexConvertRgba.$inject = [];\n function hexConvertRgba() {\n return function (colors, opacity) {\n var newColors;\n opacity = angular.isUndefinedOrNull(opacity)?1:opacity;\n if(angular.isArray(colors)) {\n newColors = [];\n angular.forEach(colors, function(color){\n newColors.push(getRgba(color));\n });\n }else {\n newColors = getRgba(colors);\n }\n\n function getRgba(color) {\n var hex = color.replace('#','');\n var r = parseInt(hex.substring(0,2), 16);\n var g = parseInt(hex.substring(2,4), 16);\n var b = parseInt(hex.substring(4,6), 16);\n return 'rgba(' + r + ',' + g + ',' + b + ',' + opacity + ')';\n }\n\n return newColors;\n };\n\n }\n\n angular\n .module('eHRD.modules.utils')\n .filter('hexConvertRgba', hexConvertRgba);\n})();\n\n/**\n * Created by Bruce on 2016/9/11.\n */\n\n(function () {\n 'use strict';\n\n function getArrayObjectByKey() {\n return function(data, key, value) {\n var i=0, len=data.length;\n for (; i 03:01:00\n * @param duration Minute\n * @param format Time format\n */\n(function () {\n 'use strict';\n\n durationFormat.inject = [];\n function durationFormat() {\n return function (duration, format) {\n return moment.utc(moment.duration(duration*60000).asMilliseconds()).format(format);\n }\n }\n\n angular.module('eHRD.modules.utils')\n .filter('durationFormat', durationFormat)\n})();\n\n/**\r\n * Created by Alan on 2016/12/1.\r\n * Custom date and time format\r\n * (1)$filter('dateTimeFormat')(new Date('2017/3/9'), 2, 55, '/') => 2017/03/09 2:55\r\n * (2)$filter('dateTimeFormat')(new Date('2017/3/9'), 20, 55, '-') => 2017-03-09 20:55\r\n * @param data Any Date Format\r\n * @param hour Hour\r\n * @param minute Minute\r\n * @param dateMark Date between the mark\r\n */\r\n(function () {\r\n 'use strict';\r\n\r\n dateTimeFormat.inject = [];\r\n function dateTimeFormat() {\r\n return function (data, hour, minute, dateMark) {\r\n\r\n var year = \"\" + data.getFullYear();\r\n var month = \"\" + (data.getMonth() + 1);\r\n var day = \"\" + data.getDate();\r\n\r\n if (month.length == 1) {\r\n month = \"0\" + month;\r\n }\r\n if (day.length == 1){\r\n day = \"0\" + day;\r\n }\r\n if (hour.length == 1){\r\n hour = \"0\" + hour;\r\n }\r\n if (minute.length == 1){\r\n minute = \"0\" + minute;\r\n }\r\n return year + dateMark + month + dateMark + day + \" \" + hour + \":\" + minute ;\r\n }\r\n }\r\n\r\n angular.module('eHRD.modules.utils')\r\n .filter('dateTimeFormat', dateTimeFormat)\r\n})();\r\n\n/**\n * Created by Alan on 2017/2/10.\n * Number conversion to thousands format\n * (1)'1234' |costFormat => 1234\n * (2)'12345' |costFormat => 12.3K\n * (3)'123456' |costFormat => 123K\n * @param cost To convert the formatted number\n */\n(function () {\n 'use strict';\n\n costFormat.inject = ['$filter'];\n function costFormat($filter) {\n return function (cost) {\n cost = (angular.isUndefined(cost))?'0':cost.toString();\n if(cost.length === 5) {\n cost = $filter('replaceAll')(cost.slice(0,-2), '(.{2})', '$1.') + 'K';\n }\n else if(cost.length > 5) {\n cost = $filter('number')(cost.slice(0, -3)) + 'K';\n }\n return cost;\n }\n }\n\n angular.module('eHRD.modules.utils')\n .filter('costFormat', costFormat)\n})();\n\n/**\n * Created by Alan on 2016/11/3.\n * Array is converted and the mark are inserted between the arrays\n * (1)$filter('arrayToString')(['apple', 'banana', 'cookie'], ' and ', 'array')\n * => ['apple and', 'banana and', 'cookie']\n * (2)$filter('arrayToString')(['apple', 'banana', 'cookie'], ' and ')\n * => apple and banana and cookie\n * @param array\n * @param mark Array and array between the mark\n * @param dataType Return data format\n */\n(function () {\n 'use strict';\n\n arrayToString.inject = [];\n function arrayToString() {\n return function (array, mark, dataType) {\n var data=\"\";\n angular.forEach(array, function(value, key) {\n array[key] = (array.length-1!==key) ?value + mark :value;\n });\n switch(dataType) {\n case 'array':\n data = array;\n break;\n default:\n data = array.join('');\n break;\n }\n\n return data;\n }\n }\n\n angular.module('eHRD.modules.utils')\n .filter('arrayToString', arrayToString)\n})();\n\n/**\n * Created by Bruce on 2016/12/29.\n */\n(function () {\n 'use strict';\n\n arrayObjectIndexOf.$inject = [];\n function arrayObjectIndexOf() {\n return function (arr, obj) {\n for(var i = 0; i < arr.length; i++){\n if(angular.equals(arr[i], obj)){\n return i;\n }\n }\n return -1;\n };\n }\n\n angular\n .module('eHRD.modules.utils')\n .filter('arrayObjectIndexOf', arrayObjectIndexOf);\n})();\n\n/**\n * Created by Bruce on 2017/2/17.\n */\n(function () {\n 'use strict';\n\n viewCtmsReference.$inject = ['$window', 'serverSetting'];\n function viewCtmsReference($window, serverSetting) {\n var directive = {\n restrict: 'A',\n scope: {\n packageId: '=?packageId',\n itemSection: '=?itemSection',\n fileName: '=?fileName'\n },\n link: function (scope, element) {\n scope.packageId = angular.isDefined(scope.packageId) ? scope.packageId : undefined;\n scope.itemSection = angular.isDefined(scope.itemSection) ? scope.itemSection : 'CTMSReference';\n scope.fileName = angular.isDefined(scope.fileName) ? scope.fileName : undefined;\n\n element.bind('click', function() {\n var url = serverSetting.baseConfig.baseURL;\n if(angular.isDefined(scope.packageId) && angular.isDefined(scope.fileName) && angular.isDefined(scope.itemSection)){\n url += ('/servlet/openFile?packageId=' + scope.packageId + '&itemSection='+ scope.itemSection +'&fileName=' + scope.fileName);\n $window.open(url, '_blank')\n }\n });\n }\n };\n return directive;\n }\n\n angular\n .module('eHRD.modules.utils')\n .directive('viewCtmsReference', viewCtmsReference);\n})();\n\n/**\n * Created by Bruce on 2017/2/9.\n */\n(function () {\n 'use strict';\n\n tipInfo.$inject = ['$mdDialog'];\n function tipInfo($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n tipType: '@?tipType',\n params: '=?params'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/utils/views/tip-info-dialog.html',\n targetEvent: ev,\n clickOutsideToClose: true,\n escapeToClose: true,\n controller: ['$scope', 'utilsService', 'tipType', 'params', function ($scope, utilsService, tipType, params) {\n var vm = this;\n vm.tipType = tipType;\n utilsService.getTipInfo(tipType, params).then(function (data) {\n vm.displayName = data.metadata.displayName;\n vm.tipInfos = data;\n });\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n controllerAs: '$ctrl',\n bindToController: true,\n fullscreen: true,\n multiple: true,\n locals: {\n tipType: scope.tipType,\n params: scope.params\n }\n }).then(function() {}, function() {});\n });\n }\n };\n return directive;\n }\n\n angular\n .module('eHRD.modules.utils')\n .directive('tipInfo', tipInfo);\n})();\n\n/**\n * Created by Bruce on 2017/3/7.\n */\n(function () {\n 'use strict';\n\n onFinishNgRepeat.$inject = ['$timeout'];\n function onFinishNgRepeat($timeout) {\n var directive = {\n restrict: 'A',\n link: function (scope, element, attr) {\n if (scope.$last === true) {\n $timeout(function () {\n scope.$evalAsync(attr.onFinishNgRepeat);\n });\n }\n }\n };\n return directive;\n }\n\n angular\n .module('eHRD.modules.utils')\n .directive('onFinishNgRepeat', onFinishNgRepeat);\n})();\n\n/**\n * Created by Bruce on 2017/2/20.\n */\n(function () {\n 'use strict';\n\n externalReferenceServlet.$inject = ['$window', 'serverSetting'];\n function externalReferenceServlet($window, serverSetting) {\n var directive = {\n restrict: 'A',\n scope: {\n externalId: '=?externalId',\n num: '=?num'\n },\n link: function (scope, element) {\n scope.externalId = angular.isDefined(scope.externalId) ? scope.externalId : undefined;\n scope.num = angular.isDefined(scope.num) ? scope.num : undefined;\n\n element.bind('click', function() {\n var url = serverSetting.baseConfig.baseURL;\n if(angular.isDefined(scope.externalId) && angular.isDefined(scope.num)){\n url += ('/servlet/ExternalRefServlet?externalId=' + scope.externalId + '&num='+ scope.num);\n $window.open(url, '_blank')\n }\n });\n }\n };\n return directive;\n }\n\n angular\n .module('eHRD.modules.utils')\n .directive('externalReferenceServlet', externalReferenceServlet);\n})();\n\n/**\n * Created by Alan on 2017/5/17.\n */\n(function () {\n 'use strict';\n\n emptyIframe.$inject = ['$window'];\n function emptyIframe($window) {\n var directive = {\n restrict: 'EA',\n scope: {\n content: '='\n },\n template:'',\n link: function (scope, element) {\n var iframe = element.find('iframe');\n iframe.ready(function(){\n iframe.contents().find('body').append(scope.content);\n iframe.contents().find('body').css('font-family', '\"Microsoft JhengHei\", RobotoDraft, Roboto, Helvetica Neue, Helvetica, Arial, sans-serif');\n iframe.contents().find('body').css('font-weight', 'normal');\n iframeResize();\n });\n angular.element($window).on('resize', function () {\n iframeResize();\n });\n\n function iframeResize() {\n iframe.css('height', '100%');\n iframe.css('height', iframe.contents().find(\"html\").height() + 'px');\n }\n }\n };\n return directive;\n }\n\n angular\n .module('eHRD.modules.utils')\n .directive('emptyIframe', emptyIframe);\n})();\n\n/**\n * Created by Bruce on 2016/12/27.\n */\n(function () {\n 'use strict';\n\n classTimeHandle.$inject = ['$mdDialog', 'momentUtils'];\n function classTimeHandle($mdDialog, momentUtils) {\n var directive = {\n restrict: 'A',\n scope: {\n classTimePools: '=',\n editorId: '=?'\n },\n link: function (scope, element, attr) {\n element.bind('click', function(ev) {\n if(attr.classTimeHandle !== 'delete'){\n $mdDialog.show({\n templateUrl: 'app/modules/utils/views/class-time-dialog.html',\n targetEvent: ev,\n clickOutsideToClose: true,\n escapeToClose: true,\n controller: ['$scope', '$filter', 'SweetAlert', 'momentUtils', 'classTimeUtils',\n 'classTimePools', 'editorId',\n function ($scope, $filter, SweetAlert, momentUtils, classTimeUtils,\n classTimePools, editorId) {\n\n var vm = this;\n var currentDateTimePull = [];\n var localeDate = moment.localeData();\n vm.classTimePools = classTimePools;\n vm.weekDays = localeDate._weekdays;\n vm.repeatIntervalNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n vm.repeatIntervalUnits = ['week', 'month', 'year'];\n\n if( editorId > -1){\n vm.classTime = angular.copy(vm.classTimePools[editorId], vm.classTime);\n }else{\n vm.classTime = {\n startDate: new Date(),\n endDate: new Date(),\n startH: 0,\n startM: 0,\n endH: 23,\n endM: 11, // eq 55 min\n isEnableRestTime: false,\n rest_startH: 12,\n rest_startM: 0,\n rest_endH: 13,\n rest_endM: 0,\n isEnableRepeat: false,\n repeatIntervalNumber: 1,\n repeatIntervalUnit: 'week',\n includeDays: []\n };\n angular.forEach(vm.weekDays, function (weekDay, index) {\n vm.classTime.includeDays.push(index);\n });\n }\n\n vm.includeDaysToggle = function(item) {\n var idx = vm.classTime.includeDays.indexOf(item);\n if (idx > -1) {\n vm.classTime.includeDays.splice(idx, 1);\n }else {\n vm.classTime.includeDays.push(item);\n }\n };\n\n function checkCurrentClassTime() {\n currentDateTimePull = classTimeUtils.getDateTimeRangesByClassTime(vm.classTime);\n return (currentDateTimePull.length > 0);\n }\n function checkClassTime() {\n var vaildObj = {\n classTime: true\n };\n var dateTime = [];\n\n angular.forEach(vm.classTimePools, function (classTime, index) {\n if(vaildObj.classTime && (editorId!==index)){\n dateTime = dateTime.concat(classTimeUtils.getDateTimeRangesByClassTime(classTime));\n angular.forEach(dateTime, function (_dateTime) {\n if(vaildObj.classTime){\n if(classTime.includeDays.indexOf(_dateTime.day()) > -1) {\n var _startDateTime = _dateTime.set({\n 'hour' : classTime.startH,\n 'minute' : classTime.startM,\n 'second' : \"0\"\n }).toDate();\n _startDateTime = new Date(_startDateTime);\n var _endDateTime = _dateTime.set({\n 'hour' : classTime.endH,\n 'minute' : classTime.endM,\n 'second' : \"0\"\n }).toDate();\n _endDateTime = new Date(_endDateTime);\n\n var range = momentUtils.range(_startDateTime, _endDateTime);\n angular.forEach(currentDateTimePull, function (currentDateTime) {\n if(vaildObj.classTime){\n var _checkStartDate = currentDateTime.set({\n 'hour' : vm.classTime.startH,\n 'minute' : vm.classTime.startM,\n 'second' : \"0\"\n }).toDate();\n _checkStartDate = new Date(_checkStartDate);\n var _checkEndDate = currentDateTime.set({\n 'hour' : vm.classTime.endH,\n 'minute' : vm.classTime.endM,\n 'second' : \"0\"\n }).toDate();\n _checkEndDate = new Date(_checkEndDate);\n if(momentUtils.range(_checkStartDate, _checkEndDate).overlaps(range)) {\n vaildObj.classTime = false;\n vaildObj.conflict = (parseInt(index) + 1);\n }\n }\n });\n }\n }\n });\n }\n });\n return vaildObj;\n }\n\n vm.submit = function () {\n // 檢查當前時間是否符合規則\n if(checkCurrentClassTime()){\n // 比對已設定時間,是否有衝突\n var _checkClassTime = checkClassTime();\n if(_checkClassTime.classTime){\n if(editorId > -1){\n vm.classTimePools[editorId] = vm.classTime;\n }else {\n vm.classTimePools.push(vm.classTime);\n // mergeClassTime();\n }\n $mdDialog.hide(vm.classTimePools);\n }else {\n SweetAlert.error($filter('translate')('MESSAGE.MSG_TIME_PERIOD_N_PARTIALLY_OVERLAPS_PLEASE_RESET', {value: _checkClassTime.conflict}), '');\n }\n }else{\n SweetAlert.warning($filter('translate')('MESSAGE.MSG_THE_SETTING_TIME_DOES_NOT_EXIST_PLEASE_RE_ENTER'), '');\n }\n };\n\n vm.updateEndDateModel = function () {\n var beginningTime = moment(vm.classTime.startDate);\n var endTime = moment(vm.classTime.endDate);\n if(!beginningTime.isBefore(endTime)){\n vm.classTime.endDate = vm.classTime.startDate;\n }\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n controllerAs: '$ctrl',\n bindToController: true,\n fullscreen: true,\n locals: {\n classTimePools: angular.isDefined(scope.classTimePools) ? scope.classTimePools : [],\n editorId: angular.isDefined(scope.editorId) ? scope.editorId : -1\n }\n }).then(function() {}, function() {});\n }\n });\n }\n };\n return directive;\n }\n\n angular\n .module('eHRD.modules.utils')\n .directive('classTimeHandle', classTimeHandle);\n})();\n\n/**\n * Created by Bruce on 2017/3/21.\n */\n(function () {\n 'use strict';\n\n bindCompiledHtml.$inject = [];\n function bindCompiledHtml() {\n var directive = {\n restrict: 'A',\n controller: bindCompiledHtmlController\n };\n return directive;\n }\n\n bindCompiledHtmlController.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$compile\"];\n function bindCompiledHtmlController($scope, $element, $attrs, $compile){\n $scope.$watch($attrs.bindCompiledHtml, compileHtml);\n\n function compileHtml(html){\n // debugger;\n var compiledElements = $compile(html)($scope);\n $element.append(compiledElements);\n }\n }\n\n angular\n .module('eHRD.modules.utils')\n .directive('bindCompiledHtml', bindCompiledHtml);\n})();\n\n/**\n * Created by Alan on 2017/4/12.\n */\n(function () {\n 'use strict';\n\n avatar.$inject = [];\n function avatar() {\n var directive = {\n restrict: 'AE',\n scope: {\n avatarUrl: '=',\n firstName: '=',\n lineHeight:'@?',\n fontSize: '@?'\n },\n replace: true,\n templateUrl: 'app/modules/utils/views/avatar.html',\n controller: ['$scope', function ($scope) {\n $scope.getRandom = function () {\n var colors = ['#9bba42', '#ef562d', '#936cae', '#a97b50', '#fb8c00', '#5587a2', '#d13076'];\n return colors[Math.floor((Math.random() * 7))];\n };\n }]\n };\n return directive;\n }\n\n angular\n .module('eHRD.modules.utils')\n .directive('avatar', avatar);\n})();\n\n/**\n * Created by Bruce on 2017/03/24.\n */\n(function () {\n 'use strict';\n\n var uploadRefs = {\n bindings: {\n ngModel: '=ngModel',\n refs: '=?refs',\n maxCount: '@?maxCount',\n isMultiple: '=?isMultiple',\n ngDisabled: '=?ngDisabled'\n },\n templateUrl: 'app/modules/utils/views/upload-refs.html',\n controller: ['$scope', function ($scope) {\n var vm = this;\n vm.ngModel = angular.isDefined(this.ngModel) ? this.ngModel : {};\n vm.maxCount = angular.isDefined(this.maxCount) ? this.maxCount: -1;\n vm.isMultiple = angular.isDefined(this.isMultiple) ? this.isMultiple: false;\n vm.refs = angular.isDefined(this.refs) ? this.refs : [];\n\n $scope.$watch(function () {\n return vm.refs;\n },function (newVal) {\n var fileLength = 0;\n vm.refsObject = {};\n if(angular.isDefined(newVal) && vm.refs.length > 0){\n angular.forEach(vm.refs, function (ref) {\n if(ref.packageId > 0){\n vm.refsObject[(parseInt(ref.index) - 1)] = ref;\n fileLength = ref.index;\n }\n });\n }\n\n vm.files = [];\n vm._files = {};\n if(fileLength === 0){\n vm.files = [0];\n vm.ngModel[0] = undefined;\n }else{\n var fileIndex = 0;\n while(fileLength > 0){\n vm.files.push(fileIndex);\n vm._files[fileIndex] = undefined;\n fileIndex ++;\n fileLength --;\n }\n }\n }, true);\n\n vm.replaceFile = function (index, files) {\n if(files.length === 0){\n vm._files[index] = undefined;\n }else {\n vm._files[index] = files[0];\n }\n vm.ngModel = vm._files;\n };\n\n vm.selectFile = function (index, files) {\n if(files.length === 0){\n vm._files[index] = undefined;\n }else {\n vm._files[index] = files[0];\n }\n vm.ngModel = vm._files;\n };\n\n vm.addFileSelect = function (index) {\n vm.files.push(vm.files.length);\n vm.ngModel[(index+1)] = '';\n };\n\n vm.removeFileSelect = function (index) {\n vm.files.splice(index, 1);\n vm.refsObject[index] = null;\n vm.ngModel[index] = '';\n };\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('uploadRefs', uploadRefs);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/29.\n */\n(function () {\n 'use strict';\n\n var uploadCourseDataFiles = {\n bindings: {\n ngModel: '=ngModel',\n refs: '=?refs',\n externalId: '=?externalId',\n maxCount: '@?maxCount',\n isMultiple: '=?isMultiple',\n ngDisabled: '=?ngDisabled'\n },\n templateUrl: 'app/modules/utils/views/upload-course-data-files.html',\n controller: ['$scope', function ($scope) {\n var vm = this;\n vm.ngModel = angular.isDefined(this.ngModel) ? this.ngModel : {};\n vm.maxCount = angular.isDefined(this.maxCount) ? this.maxCount: -1;\n vm.isMultiple = angular.isDefined(this.isMultiple) ? this.isMultiple: false;\n vm.refs = angular.isDefined(this.refs) ? this.refs : [];\n\n $scope.$watch(function () {\n return vm.refs;\n },function (newVal) {\n var fileLength = 0;\n vm.refsObject = {};\n if(angular.isDefined(newVal) && vm.refs.length > 0){\n angular.forEach(vm.refs, function (ref, idx, array) {\n vm.refsObject[(parseInt(ref.num) - 1)] = ref;\n if(angular.equals(idx, (array.length-1))){\n fileLength = ref.num;\n }\n });\n }\n\n vm.files = [];\n vm._files = {};\n if(fileLength === 0){\n vm.files = [0];\n vm.ngModel[0] = undefined;\n }else{\n var fileIndex = 0;\n while(fileLength > 0){\n vm.files.push(fileIndex);\n vm._files[fileIndex] = undefined;\n fileIndex ++;\n fileLength --;\n }\n }\n }, true);\n\n vm.replaceFile = function (index, files) {\n if(files.length === 0){\n vm._files[index] = undefined;\n }else {\n vm._files[index] = files[0];\n }\n vm.ngModel = vm._files;\n };\n\n vm.selectFile = function (index, files) {\n if(files.length === 0){\n vm._files[index] = undefined;\n }else {\n vm._files[index] = files[0];\n }\n vm.ngModel = vm._files;\n };\n\n vm.addFileSelect = function (index) {\n vm.files.push(vm.files.length);\n vm.ngModel[(index+1)] = undefined;\n };\n\n vm.removeFileSelect = function (index) {\n vm.files.splice(index, 1);\n delete vm.ngModel[index];\n };\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('uploadCourseDataFiles', uploadCourseDataFiles);\n\n})();\n\n/**\n * Created by Alan on 2017/6/30.\n */\n(function () {\n 'use strict';\n\n var squareText = {\n bindings: {\n width: '@?',\n height: '@?',\n color: '@?',\n fontSize: '@?',\n text: '@?'\n },\n templateUrl: 'app/modules/utils/views/square-text.html',\n controller: [function () {\n var vm = this;\n vm.width = angular.isUndefinedOrNull(vm.width)?38:this.width;\n vm.height = angular.isUndefinedOrNull(vm.height)?38:this.height;\n vm.color = angular.isUndefinedOrNull(vm.color)?'#F08917':this.color;\n vm.fontSize = angular.isUndefinedOrNull(vm.fontSize)?20:this.fontSize;\n vm.text = angular.isUndefinedOrNull(vm.text)?'':this.text;\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('squareText', squareText);\n\n})();\n\n/**\n * Created by Bruce on 2017/4/7.\n */\n(function () {\n 'use strict';\n\n var showCourseSessionName = {\n bindings: {\n courseId: '=?courseId',\n sessionId: '=?sessionId'\n },\n template: '{{$ctrl.course.courseName}} / {{$ctrl.session.sessionName}}',\n controller: ['$filter', '$scope', 'courseResourceService', function ( $filter, $scope, courseResourceService) {\n var vm = this;\n vm.courseId = angular.isUndefined(this.courseId) ? undefined : this.courseId;\n vm.sessionId = angular.isUndefined(this.sessionId) ? undefined : this.sessionId;\n\n $scope.$watch(function () {\n return vm.courseId;\n }, function (newVal) {\n if(angular.isDefined(newVal)){\n courseResourceService.getCourse(vm.courseId, {}).then(function (course) {\n vm.course = course;\n });\n }\n });\n\n $scope.$watch(function () {\n return vm.sessionId;\n }, function (newVal) {\n if(angular.isDefined(newVal)){\n if(vm.sessionId !== '-1'){\n courseResourceService.getCourseSession(vm.sessionId, {}).then(function (session) {\n vm.session = session;\n });\n }else{\n vm.session = {};\n vm.session['sessionName'] = $filter('translate')('ACTIONS.ADD_NEW_CLASS');\n }\n }\n });\n\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('showCourseSessionName', showCourseSessionName);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/29.\n */\n(function () {\n 'use strict';\n\n var selectExternalTrainingVendors = {\n bindings: {\n ngModel: '=ngModel',\n name: '@?name',\n required: '=?ngRequired',\n ngDisabled: '=?ngDisabled',\n onlyText: '=?onlyText',\n isReload: '=?'\n },\n templateUrl: 'app/modules/utils/views/select-external-training-vendors.html',\n controller: ['$scope', '$element', 'externalTrainingService', function ($scope, $element, externalTrainingService) {\n var vm = this;\n vm.ngModel = angular.isDefined(this.ngModel) ? this.ngModel : [];\n vm.isReload = false;\n vm.vendorType = 2;\n\n var params = {\n keyword: '',\n list_size: 50,\n current_page: 1\n };\n getVendors(params);\n\n $scope.$watch(function () {\n return vm.searchTerm;\n },function (newVal) {\n params.keyword = newVal;\n getVendors(params);\n });\n\n //reload\n $scope.$watch(function () {\n return vm.isReload;\n },function (newVal) {\n if(newVal) {\n getVendors(params);\n vm.isReload = false;\n }\n });\n\n vm.clearSearchTerm = function() {\n vm.searchTerm = '';\n };\n\n function getVendors(params) {\n externalTrainingService.getVendors(params).then(function (vendors) {\n vm.vendors = vendors;\n });\n }\n\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('selectExternalTrainingVendors', selectExternalTrainingVendors);\n\n})();\n\n/**\n * Created by Bruce on 2017/4/6.\n */\n(function () {\n 'use strict';\n\n var selectExternalClass = {\n bindings: {\n ngModel: '=?ngModel',\n externalId: '=?externalId',\n applicantId: '=?applicantId',\n ngDisabled: '=?ngDisabled'\n },\n template: '{{ ( $ctrl.ngModel ? \"ACTIONS.EDIT_CLASS\" : \"ACTIONS.SELECT_CLASS\") | translate }}',\n controller: ['$filter', '$scope', '$document', '$mdDialog', 'WizardHandler', 'SweetAlert', function ($filter, $scope, $document, $mdDialog, WizardHandler, SweetAlert) {\n var vm = this;\n vm.ngModel = angular.isUndefined(this.ngModel) ? undefined : this.ngModel;\n vm.externalId = angular.isUndefined(this.externalId) ? undefined : this.externalId;\n vm.applicantId = angular.isUndefined(this.applicantId) ? undefined : this.applicantId;\n vm.ngDisabled = angular.isUndefined(this.ngDisabled) ? false : this.ngDisabled;\n\n this.$onInit = function () {\n vm.selectClass = function (ev) {\n $mdDialog.show({\n controller: [ '$scope', 'externalId', 'applicantId', 'ngModel', function ($scope, externalId, applicantId, ngModel) {\n var vm = this;\n vm.externalId = externalId;\n vm.applicantId = applicantId;\n vm.ngModel = ngModel;\n vm.choiceCourseId = undefined;\n vm.currentStep = 1; vm.totalStep = 2;\n\n $scope.$watch(function () {\n return vm.ngModel;\n },function (newVal) {\n if(angular.isDefined(newVal)){\n vm.choiceCourseId = angular.isDefined(vm.ngModel['courseId']) ? vm.ngModel['courseId'] : undefined;\n vm.choiceSessionId = angular.isDefined(vm.ngModel['sessionId']) ? vm.ngModel['sessionId'] : undefined;\n }\n });\n\n vm.canExitStep1 = function () {\n var isCanNext = false;\n isCanNext = (angular.isDefined(vm.choiceCourseId) && vm.choiceCourseId > 0);\n if(!isCanNext) SweetAlert.error(\"\", $filter('translate')('MESSAGE.MSG_PLEASE_SELECT_ONE_COURSE'));\n return isCanNext;\n };\n\n vm.canExitStep2 = function () {\n var isCanNext = false;\n isCanNext = (angular.isDefined(vm.choiceSessionId));\n if(!isCanNext) SweetAlert.error(\"\", $filter('translate')('MESSAGE.MSG_PLEASE_SELECT_ONE_COURSE_SESSION'));\n return isCanNext;\n };\n\n vm.nextStep = function () {\n WizardHandler.wizard('selectExternalClass').next();\n vm.updateCurrentStep('next');\n };\n\n vm.previousStep = function() {\n WizardHandler.wizard('selectExternalClass').previous();\n vm.updateCurrentStep('previous');\n };\n\n vm.finishStep = function () {\n if(vm.canExitStep2()){\n WizardHandler.wizard('selectExternalClass').finish();\n }\n };\n\n vm.updateModel = function () {\n $mdDialog.hide({courseId: vm.choiceCourseId, sessionId: vm.choiceSessionId});\n };\n\n vm.updateCurrentStep = function(type) {\n switch (type) {\n case 'next':\n if (vm.canExitStep1()) {\n vm.currentStep = WizardHandler.wizard('selectExternalClass').currentStepNumber() + 1;\n }\n break;\n case 'previous':\n vm.currentStep = WizardHandler.wizard('selectExternalClass').currentStepNumber() - 1;\n break;\n }\n };\n\n vm.cancel = function() {\n $mdDialog.cancel();\n };\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n templateUrl: 'app/modules/utils/views/select-external-class.html',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose: true,\n locals: {\n externalId: vm.externalId,\n applicantId: vm.applicantId,\n ngModel: vm.ngModel\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function(data) {\n vm.ngModel = data;\n });\n };\n };\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('selectExternalClass', selectExternalClass);\n\n})();\n\n/**\n * Created by Bruce on 2017/1/10.\n */\n(function () {\n 'use strict';\n\n var selectCurrency = {\n bindings: {\n ngModel: '=ngModel',\n currencys: '=currencys',\n ngDisabled: '=?ngDisabled',\n ngChange: '&?ngChange'\n },\n templateUrl: 'app/modules/utils/views/select-currency.html',\n controller: ['$scope', function ($scope) {\n var vm = this;\n vm.selectCurrency = -1;\n vm.ngModel = angular.isDefined(this.ngModel) ? this.ngModel : undefined;\n vm.currencys = angular.isDefined(this.currencys) ? this.currencys : [];\n vm.ngChange = angular.isDefined(this.ngChange) ? this.ngChange : undefined;\n // currency.isBasic\n $scope.$watch(function () {\n return vm.ngModel;\n }, function () {\n if(angular.isDefined(vm.ngChange) && angular.isFunction(vm.ngChange)){\n vm.ngChange();\n }\n });\n\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('selectCurrency', selectCurrency);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/21.\n */\n\n/*\n* Basic Params:\n* params = {\n* showAllOption: false\n* selectedValue: ''\n* }\n* */\n(function () {\n 'use strict';\n\n var selectCtl = {\n bindings: {\n ctlData: '=?ctlData',\n ngModel: '=?ngModel',\n ngChange: '&?ngChange',\n type: '@?type',\n params: '=?params',\n ngDisabled: '=?ngDisabled',\n onlyText: '=?onlyText',\n defaultSelectFirst: '=?defaultSelectFirst'\n },\n templateUrl: 'app/modules/utils/views/select-ctl.html',\n controller: [ '$q', '$filter', '$scope', 'ctlService', function ($q, $filter, $scope, ctlService) {\n var vm = this;\n var params;\n vm.ctlData = angular.isDefined(this.ctlData) ? this.ctlData : undefined;\n vm.ngModel = angular.isDefined(this.ngModel) ? this.ngModel : '';\n vm.ngChange = angular.isDefined(this.ngChange) ? this.ngChange : undefined;\n vm.type = angular.isDefined(this.type) ? this.type : undefined;\n vm.params = angular.isDefined(this.params) ? this.params : {};\n vm.isStatic = false;\n vm.defaultSelectFirst = angular.isDefined(this.defaultSelectFirst) ? this.defaultSelectFirst : false;\n\n $scope.$watch(function () {\n return vm.params;\n }, function (newVal) {\n if(angular.isDefined(newVal)){\n params = angular.copy(newVal);\n getCtlData();\n }\n });\n\n function getCtlData() {\n if(angular.isDefined(vm.type)){\n var defer = $q.defer();\n var ctlData;\n switch (vm.type){\n /*\n * select dropdowns component, base on server side data\n * */\n case 'innercert-classes':\n ctlData = ctlService.getInnercertClasses(params);\n break;\n case 'innercerts':\n ctlData = ctlService.getInnercerts(params);\n break;\n case 'companys':\n ctlData = ctlService.getCompanys(params);\n break;\n case 'subjects':\n ctlData = ctlService.getCompanySubjects(params);\n break;\n case 'extcert-apply-classes':\n ctlData = ctlService.getExtcertApplyClasses(params);\n break;\n case 'compensation-test-item':\n ctlData = ctlService.getCompensationTestItem(params);\n break;\n case 'all-currency':\n ctlData = ctlService.getAllCurrency(params);\n break;\n case 'manage-groups':\n ctlData = ctlService.getManageGroups(params);\n break;\n case 'manage-members':\n ctlData = ctlService.getManageMembers(params);\n break;\n case 'classifications':\n ctlData = ctlService.getClassifications(params);\n break;\n\n /*\n * static select dropdowns component\n * */\n case 'static-approve-status':\n vm.isStatic = true;\n ctlData = defer.promise;\n var data = [{\n value: \"\",\n name: $filter('translate')('FIELD.ALL'),\n selected: 0\n },{\n value: \"1\",\n name: $filter('translate')('STATUS.APPROVALED'),\n selected: 0\n },{\n value: \"2\",\n name: $filter('translate')('STATUS.WAITING_APPROVAL'),\n selected: 0\n },{\n value: \"3\",\n name: $filter('translate')('STATUS.REJECTED'),\n selected: 0\n },{\n value: \"4\",\n name: $filter('translate')('STATUS.CANCEL'),\n selected: 0\n }];\n defer.resolve(data);\n break;\n }\n\n ctlData.then(function (datas) {\n vm.datas = vm.ctlData = datas;\n if(vm.isStatic){\n angular.forEach(vm.datas, function (data) {\n if(angular.equals(data.value, params['selectedValue'])){\n data.selected = 1;\n }\n });\n }\n\n // if((!vm.isStatic) && ((params['selectedValue'] !== '') && $filter('where')(datas, { 'value': params['selectedValue']}).length === 0 )){\n // params['selectedValue'] = '';\n // getCtlData();\n // }\n\n if(vm.defaultSelectFirst && $filter('where')(datas, { 'value': params['selectedValue']}).length === 0){\n angular.forEach(vm.datas, function (data) {\n if(data.selected === 1) data.selected = 0;\n });\n if(vm.datas.length > 0) vm.datas[0].selected = 1;\n }\n });\n }\n }\n\n $scope.$watch(function () {\n return vm.ngModel;\n }, function () {\n if(angular.isDefined(vm.ngChange) && angular.isFunction(vm.ngChange)){\n vm.ngChange();\n }\n });\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('selectCtl', selectCtl);\n\n})();\n\n/**\n * Created by Bruce on 2017/1/15.\n */\n(function () {\n 'use strict';\n\n var selectClassification = {\n bindings: {\n ngModel: '=?ngModel',\n type: '@?type',\n ngDisabled: '=?ngDisabled',\n onlyText: '=?onlyText'\n },\n templateUrl: 'app/modules/utils/views/select-classification.html',\n controller: [ '$scope', 'courseResourceService', function ($scope, courseResourceService) {\n var vm = this;\n vm.type = angular.isDefined(this.type) ? this.type : undefined;\n $scope.$watch(function () {\n return vm.type;\n },function (newVal) {\n if(angular.isDefined(newVal)){\n courseResourceService.getClassifications(vm.type).then(function (classifications) {\n vm.classifications = classifications;\n });\n }\n });\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('selectClassification', selectClassification);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/28.\n *\n * * Multi date picker control Component\n * (1) \n * @param ngModel => bind Model, the model is array date string, ex: ['1990/01/01', ....]\n * this watch will hacker new Model to moment array, ex: [moment('1990/01/01').toDate(), ...]\n * @param ngChange\n * @param maxCount\n * @param ngRequired\n */\n(function () {\n 'use strict';\n\n var multiDatePickerCtrl = {\n bindings: {\n ngModel: '=?ngModel',\n ngChange: '&?ngChange',\n maxCount: '@?maxCount',\n ngRequired: '=?ngRequired'\n },\n templateUrl: 'app/modules/utils/views/multi-date-picker-ctrl.html',\n controller: [ '$q', '$filter', '$scope', function ($q, $filter, $scope) {\n var vm = this;\n\n vm.ngModel = angular.isDefined(this.ngModel) ? this.ngModel : undefined;\n vm.ngChange = angular.isDefined(this.ngChange) ? this.ngChange : undefined;\n vm.maxCount = angular.isDefined(this.maxCount) ? this.maxCount: -1;\n vm.ngRequired = angular.isDefined(this.ngRequired) ? this.ngRequired : false;\n\n vm.add = function () {\n vm.ngModel.push(undefined);\n };\n\n vm.remove = function (index) {\n vm.ngModel.splice(index, 1);\n };\n\n function prepareDateModel() {\n angular.forEach(vm.ngModel, function (date, index) {\n vm.ngModel[index] = moment(new Date(date)).toDate();\n })\n }\n\n $scope.$watch(function () {\n return vm.ngModel;\n }, function (newVal) {\n if(angular.isDefined(newVal)){\n prepareDateModel();\n }\n });\n\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('multiDatePickerCtrl', multiDatePickerCtrl);\n\n})();\n\n/**\n * Created by Bruce on 2017/1/12.\n */\n(function () {\n 'use strict';\n\n var multiCheckbox = {\n bindings: {\n ngModel: '=ngModel',\n datas: '=datas',\n titleKey: '@titleKey',\n valueKey: '@valueKey',\n ngDisabled: '=?ngDisabled'\n },\n templateUrl: 'app/modules/utils/views/multi-checkbox.html',\n controller: [ function () {\n var vm = this;\n vm.ngModel = angular.isDefined(this.ngModel) ? this.ngModel : [];\n vm.toggle = function(item) {\n var idx = vm.ngModel.indexOf(item);\n if (idx > -1) {\n vm.ngModel.splice(idx, 1);\n }else {\n vm.ngModel.push(item);\n }\n };\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('multiCheckbox', multiCheckbox);\n})();\n\n/**\n * Created by Bruce on 2017/6/1.\n */\n(function () {\n 'use strict';\n\n var memberSelection = {\n bindings: {\n ngModel: '=?ngModel', // [{ \"userId\": 1, \"fullName\": \"Administrator Chen\" }]\n ngDisabled: '=?ngDisabled',\n display: '=?display',\n displayIcon: '@?displayIcon',\n buttonType: '@?buttonType', // FAB, Flat, Raised,\n isMini: '=?isMini',\n ignoreSelf: '=?ignoreSelf',\n ngOnChanges: '&?ngOnChanges'\n },\n template: '' +\n '{{$ctrl.displayIcon}}' +\n '{{$ctrl.display}}' +\n '',\n controller: [ '$scope', '$mdDialog', '$document', function ($scope, $mdDialog, $document) {\n var vm = this;\n vm.ngModel = angular.isDefined(this.ngModel) ? this.ngModel : [];\n vm.ignoreSelf = angular.isDefined(this.ignoreSelf) ? this.ignoreSelf : false;\n\n vm.openMemberSelection = function (ev) {\n $mdDialog.show({\n parent: angular.element($document[0].body),\n templateUrl: 'app/modules/utils/views/member-selection-dialog.html',\n controller: [ 'SweetAlert', '$q', '$timeout', '$filter', '$auth', 'ngModel', 'ignoreSelf', 'utilsService', function (SweetAlert, $q, $timeout, $filter, $auth, ngModel, ignoreSelf, utilsService) {\n var vm = this;\n\n vm.items = [];\n for (var i = 0; i < 1000; i++) {\n vm.items.push({\n 'title': 'repeat item - ' + (i+1),\n 'selected': false,\n 'index': i\n });\n }\n\n\n\n vm.ngModel = ngModel;\n vm.selectMembers = [];\n vm.isDirectMembers = false;\n vm.filters = {};\n vm.filters.learningType = false;\n vm.filters.selectedPersons = [];\n vm.ignoreSelf = ignoreSelf;\n\n /*\n * Start: search model-1 for select person\n * */\n var cachedQuery, lastSearch;\n var pendingSearch, cancelSearch = angular.noop;\n vm.selectPersonModel1 = [];\n\n if(vm.ngModel.length > 0 ){\n vm.selectPersonModel1 = angular.copy(vm.ngModel);\n vm.selectMembers = angular.copy(vm.ngModel);\n }\n\n vm.querySearch = function(criteria) {\n cachedQuery = cachedQuery || criteria;\n return utilsService.getMembersByFilter({'keywords': cachedQuery}).then(function (members) {\n if( vm.ignoreSelf ){\n // vm.selectMembers.push($filter('getArrayObjectByKey')(members, 'userId', $auth.getUserData().id))\n }\n angular.forEach(vm.selectMembers, function(data) {\n if($filter('getArrayObjectByKey')(members, 'userId', data.userId)){\n var index = $filter('arrayObjectIndexOf')(members, $filter('getArrayObjectByKey')(members, 'userId', data.userId));\n if(index > -1) members.splice(index, 1);\n }\n });\n return members;\n });\n };\n\n vm.delayedQuerySearch = function(criteria) {\n cachedQuery = criteria;\n if (!pendingSearch || !debounceSearch()) {\n cancelSearch();\n return pendingSearch = $q(function(resolve, reject) {\n cancelSearch = reject;\n $timeout(function() {\n resolve(vm.querySearch());\n refreshDebounce();\n }, Math.random() * 10, true)\n });\n }\n return pendingSearch;\n };\n\n function refreshDebounce() {\n lastSearch = 0;\n pendingSearch = null;\n cancelSearch = angular.noop;\n }\n\n // Debounce if querying faster than 300ms\n function debounceSearch() {\n var now = new Date().getMilliseconds();\n lastSearch = lastSearch || now;\n return ((now - lastSearch) < 300);\n }\n /*\n * End: search model-1 for select person\n * */\n\n /*\n * Start: search model-2 for select person\n * */\n vm.optionsToggle = function(member) {\n if (!$filter('getArrayObjectByKey')(vm.selectMembers, 'userId', member.userId)) {\n vm.selectMembers.push(member);\n vm.selectPersonModel1.push(member);\n } else {\n // Bind selectMembers Model\n angular.forEach(vm.selectMembers, function(data, idx) {\n if (angular.equals(data.userId, member.userId)) vm.selectMembers.splice(idx, 1);\n });\n // Bind selectPersonModel1 Model\n angular.forEach(vm.selectPersonModel1, function(data, idx) {\n if (angular.equals(data.userId, member.userId)) vm.selectPersonModel1.splice(idx, 1);\n });\n }\n };\n\n vm.memberIsChecked = function (member) {\n return ($filter('getArrayObjectByKey')(vm.selectMembers, 'userId', member.userId)) ? true : false;\n };\n\n $scope.$watch(function() {\n return vm.isDirectMembers;\n }, function(newVal) {\n if (newVal) {\n getDirectMembers()\n }\n }, true);\n\n $scope.$watch(function() {\n return vm.selectMembers;\n }, function(newVal, oldVal) {\n if (!angular.equals(newVal, oldVal)) {\n getDirectMembers()\n }\n }, true);\n\n function getDirectMembers() {\n utilsService.findMyGroupMembers().then(function(members) {\n vm.members = members;\n vm.filters.showMembers = {};\n angular.forEach(members, function(member) {\n if ($filter('getArrayObjectByKey')(vm.selectMembers, 'userId', member.userId)) vm.filters.showMembers[member.userId] = true;\n if (!$filter('getArrayObjectByKey')(vm.selectMembers, 'userId', member.userId)) vm.filters.showMembers[member.userId] = false;\n // // if (member.isGray) vm.filters.showMembers[member.userId] = member.isGray;\n });\n });\n }\n /*\n * End: search model-2 for select person\n * */\n\n vm.submit = function () {\n if(vm.selectMembers.length > 0){\n $mdDialog.hide(vm.selectMembers);\n } else {\n SweetAlert.error('', $filter('translate')('FORM_VALIDATION.PLEASE_SELECT_AT_LEAST_ONE_MEMBER'));\n }\n\n };\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n locals: {\n ngModel: vm.ngModel,\n ignoreSelf: vm.ignoreSelf\n },\n clickOutsideToClose:true,\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function (selectMembers) {\n vm.ngModel = selectMembers;\n if(angular.isFunction(vm.ngOnChanges)) vm.ngOnChanges();\n }, function() {});\n }\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('memberSelection', memberSelection);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/22.\n */\n(function () {\n 'use strict';\n\n var mdSelectTime = {\n bindings: {\n type:'@?',\n ngModel: '=ngModel',\n formTime: '@?formTime',\n toTime: '@?toTime',\n isArrayIndex: '@?isArrayIndex'\n },\n templateUrl: 'app/modules/utils/views/md-time-select.html',\n controller: ['$scope', function($scope){\n var vm = this;\n vm.type = angular.isUndefined(this.type) ? null : this.type;\n vm.ngModel = angular.isUndefined(this.ngModel) ? null : this.ngModel;\n vm.formTime = angular.isUndefined(this.formTime) ? null : this.formTime;\n vm.toTime = angular.isUndefined(this.toTime) ? null : this.toTime;\n vm.isArrayIndex = angular.isUndefined(this.isArrayIndex) ? false : this.isArrayIndex;\n\n vm.hours = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23];\n vm.minutes = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];\n\n switch (vm.type){\n case 'minute':\n if(!vm.isArrayIndex){\n vm.ngModel = vm.minutes.indexOf(vm.ngModel);\n }\n break;\n case 'hours':\n vm.ngModel = vm.hours.indexOf(vm.ngModel);\n break;\n }\n\n vm.min = 0;\n\n $scope.$watch(function(){\n return vm.formTime;\n },function (newVal) {\n if(!angular.isUndefinedOrNull(newVal)) {\n resetSelect();\n }\n });\n $scope.$watch(function(){\n return vm.toTime;\n },function (newVal) {\n if(!angular.isUndefinedOrNull(newVal)) {\n resetSelect();\n }\n });\n\n function resetSelect() {\n var beginningTime = moment(vm.formTime, 'h:mm');\n var endTime = moment(vm.toTime, 'h:mm');\n switch (vm.type){\n case 'hours':\n var h_exists = false;\n angular.forEach(vm.hours, function (hour, index) {\n endTime.set({\n 'hour' : (vm.isArrayIndex) ? index : hour\n });\n if(!h_exists){\n if(checkTime(beginningTime, endTime)) {\n h_exists = true;\n vm.min = hour;\n }\n }\n });\n break;\n case 'minute':\n var m_exists = false;\n angular.forEach(vm.minutes, function (minute, index) {\n if(!m_exists){\n endTime.set({\n 'minute' : (vm.isArrayIndex) ? index : minute\n });\n if(checkTime(beginningTime, endTime)) {\n m_exists = true;\n vm.min = minute;\n if(vm.isArrayIndex){\n if(vm.ngModel < index) vm.ngModel = index;\n }else {\n if(vm.ngModel < minute) vm.ngModel = minute;\n }\n }\n }\n });\n break;\n }\n }\n\n function checkTime(beginningTime, endTime) {\n return beginningTime.isBefore(endTime);\n }\n }]\n };\n\n angular.module('eHRD.modules.utils')\n .component('mdSelectTime', mdSelectTime);\n})();\n\n/**\n * Created by Bruce on 2017/1/12.\n */\n(function () {\n 'use strict';\n\n var learningReportSetting = {\n bindings: {\n ngModel: '=?ngModel',\n settingRule: '=?settingRule',\n classTimeObjects: '=?classTimeObjects',\n ngDisabled: '=?ngDisabled',\n isCreateForm: '=?isCreateForm'\n },\n templateUrl: 'app/modules/utils/views/learning-report-setting.html',\n controller: [ '$scope', function ($scope) {\n var vm = this;\n vm.ngModel = angular.isDefined(this.ngModel) ? this.ngModel : {};\n vm.settingRule = angular.isDefined(this.settingRule) ? this.settingRule : undefined;\n vm.classTimeObjects = angular.isDefined(this.classTimeObjects) ? this.classTimeObjects : undefined;\n vm.isCreateForm = angular.isDefined(this.isCreateForm) ? this.isCreateForm : false;\n\n\n vm.isCanEditSetting = false;\n $scope.$watch(function () {\n return vm.settingRule;\n },function (newVal) {\n if(angular.isDefined(newVal)){\n vm.isCanEditSetting = (vm.settingRule.isCanEditSetting && vm.settingRule.isFormOwner) ||\n (vm.settingRule.isManagerCanEditSetting && vm.settingRule.isManager && (!vm.settingRule.isFormOwner)) ||\n (vm.settingRule.isLearningAdmin && !vm.isCreateForm) ;\n ngModelDataInit();\n }\n },true);\n\n var watchClassTimeObjects = $scope.$watch(function () {\n return vm.classTimeObjects;\n }, updateReportSettingDeadLine, true);\n\n function updateReportSettingDeadLine(newVal) {\n if(angular.isDefined(newVal) && vm.classTimeObjects.length > 0){\n if(vm.settingRule.isHasDefaultSetting && vm.settingRule.isNeedReport){\n if(!vm.settingRule.isCanEditSetting){\n var minStartDate = undefined;\n var maxEndDate = undefined;\n angular.forEach(vm.classTimeObjects, function (classTimeObject, index) {\n if(index === 0){\n minStartDate = classTimeObject.startDate;\n maxEndDate = classTimeObject.endDate;\n }else{\n if(classTimeObject.startDate < minStartDate){\n minStartDate = classTimeObject.startDate;\n }\n if(classTimeObject.endDate > maxEndDate){\n maxEndDate = classTimeObject.endDate;\n }\n }\n });\n\n if(angular.isDefined(maxEndDate) && angular.isDefined(maxEndDate)){\n var docReportDeadLine = moment(maxEndDate)\n .add(vm.settingRule.defaultSetting.docReportMonth, 'months')\n .add(vm.settingRule.defaultSetting.docReportDay, 'days');\n var oralReportDeadLine = moment(maxEndDate)\n .add(vm.settingRule.defaultSetting.oralReportMonth, 'months')\n .add(vm.settingRule.defaultSetting.oralReportDay, 'days');\n var teachingDeadLine = moment(maxEndDate)\n .add(vm.settingRule.defaultSetting.teachingMonth, 'months')\n .add(vm.settingRule.defaultSetting.teachingDay, 'days');\n\n vm.ngModel['docReportDeadLine'] = docReportDeadLine.toDate();\n vm.ngModel['oralReportDeadLine'] = oralReportDeadLine.toDate();\n vm.ngModel['teachingDeadLine'] = teachingDeadLine.toDate();\n\n }\n\n }\n }\n watchClassTimeObjects(); // clear $watch classTimeObjects function\n }\n }\n\n function ngModelDataInit() {\n if(angular.isDefined(vm.settingRule.data) && Object.keys(vm.settingRule.data).length > 0){\n // Edit\n vm.ngModel = {\n isNeedReport: vm.settingRule.data.isNeedReport,\n isNeedDocReport: vm.settingRule.data.isNeedDocReport,\n numOfDocReport: vm.settingRule.data.numOfDocReport,\n docReportDeadLine: moment(vm.settingRule.data.docReportDeadLine).isValid()?new Date(vm.settingRule.data.docReportDeadLine):null ,\n isNeedOralReport: vm.settingRule.data.isNeedOralReport,\n oralReportDeadLine: moment(vm.settingRule.data.oralReportDeadLine).isValid()?new Date(vm.settingRule.data.oralReportDeadLine):null ,\n isOralReportNeedGrade: vm.settingRule.data.isOralReportNeedGrade,\n isNeedTeaching: vm.settingRule.data.isNeedTeaching,\n teachingDeadLine: moment(vm.settingRule.data.teachingDeadLine).isValid()?new Date(vm.settingRule.data.teachingDeadLine):null ,\n isTeachingNeedGrade: vm.settingRule.data.isTeachingNeedGrade,\n isNeedOther: vm.settingRule.data.isNeedOther,\n otherReportWay: vm.settingRule.data.otherReportWay\n };\n\n }else {\n // Add\n vm.ngModel['isNeedReport'] = (vm.settingRule.isHasDefaultSetting && vm.settingRule.isNeedReport);\n vm.ngModel['isNeedDocReport'] = vm.settingRule.defaultSetting.isNeedDocReport;\n vm.ngModel['numOfDocReport'] = vm.settingRule.defaultSetting.numOfDocReport;\n vm.ngModel['isNeedOralReport'] = vm.settingRule.defaultSetting.isNeedOralReport;\n vm.ngModel['isOralReportNeedGrade'] = vm.settingRule.defaultSetting.isOralReportNeedGrade;\n vm.ngModel['isNeedTeaching'] = vm.settingRule.defaultSetting.isNeedTeaching;\n vm.ngModel['isTeachingNeedGrade'] = vm.settingRule.defaultSetting.isTeachingNeedGrade;\n vm.ngModel['isNeedOther'] = vm.settingRule.defaultSetting.isNeedOther;\n vm.ngModel['otherReportWay'] = vm.settingRule.defaultSetting.otherReportWay;\n vm.ngModel['docReportDeadLine'] = angular.isDefined(vm.ngModel['docReportDeadLine']) ? vm.ngModel['docReportDeadLine'] : undefined;\n vm.ngModel['oralReportDeadLine'] = angular.isDefined(vm.ngModel['oralReportDeadLine']) ? vm.ngModel['oralReportDeadLine'] : undefined;\n vm.ngModel['teachingDeadLine'] = angular.isDefined(vm.ngModel['teachingDeadLine']) ? vm.ngModel['teachingDeadLine'] : undefined;\n }\n }\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('learningReportSetting', learningReportSetting);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/30.\n */\n(function () {\n 'use strict';\n\n var enrollCosts = {\n bindings: {\n ngModel: '=?ngModel',\n form: '=?',\n ngDisabled: '=?ngDisabled',\n defaultDisableField: '=?defaultDisableField'\n },\n templateUrl: 'app/modules/utils/views/enroll-costs.html',\n controller: [ '$scope', '$filter', 'externalTrainingService', function ($scope, $filter, externalTrainingService) {\n var vm = this;\n vm.isCanRenderHtml = false;\n vm.ngModel = angular.isDefined(this.ngModel) ? this.ngModel : {};\n vm.form = angular.isUndefinedOrNull(this.form)?null:this.form;\n vm.defaultCostCurrency = -1;\n\n\n externalTrainingService.getCurrencys().then(function (currencys) {\n vm.currencys = currencys;\n angular.forEach(currencys, function (currency) {\n if(currency.isBasic){\n vm.defaultCostCurrency = currency.currencyId;\n }\n });\n\n $scope.$watch(function () {\n return vm.ngModel;\n },function (newVal) {\n if(angular.isDefined(newVal)){\n renderCost();\n }\n },true);\n });\n\n function renderCost() {\n angular.forEach(vm.ngModel, function (_ngModel, key) {\n if(Object.keys(_ngModel.costObject).length === 0){\n vm.ngModel[key].costObject = {\n course_cost_currency: (vm.defaultCostCurrency > -1) ? vm.defaultCostCurrency : '',\n course_cost_amount: 0,\n course_converting_amount: '',\n subsidyType: '1',\n subsidyPercentage: '',\n voucherType: '1',\n apply_type: '0',\n payee: '',\n remit_title: '',\n remit_branch: '',\n remit_account: '',\n check_title: '',\n check_expired_date: undefined,\n check_format1: false,\n check_format2: false\n };\n }else {\n if(angular.isDefined(_ngModel.costObject['apply_type']) && _ngModel.costObject['apply_type'].length === 0){\n _ngModel.costObject['apply_type'] = '0';\n }\n if(angular.isUndefined(_ngModel.costObject['check_expired_date'])){\n vm.ngModel[key].costObject['check_expired_date'] = undefined;\n }else{\n var check_expired_date = moment(_ngModel.costObject['check_expired_date']);\n vm.ngModel[key].costObject['check_expired_date'] = check_expired_date.isValid() ? check_expired_date.toDate() : undefined;\n }\n }\n\n if(angular.isDefined(_ngModel.costObject.course_cost_currency) && _ngModel.costObject.course_cost_currency !== ''){\n var exchangeRate = angular.isDefined($filter('filterBy')(vm.currencys, ['currencyId'], _ngModel.costObject.course_cost_currency)) ? $filter('filterBy')(vm.currencys, ['currencyId'], _ngModel.costObject.course_cost_currency)[0].exchangeRate: 1;\n vm.ngModel[key].costObject.course_converting_amount = $filter('number')(_ngModel.costObject.course_cost_amount * exchangeRate, 2);\n }\n });\n vm.isCanRenderHtml = true;\n }\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('enrollCosts', enrollCosts);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/20.\n */\n(function () {\n 'use strict';\n\n var classTime = {\n bindings: {\n classTime: '=?ngModel', // Array ex.2017/10/01 0:0-23:11,2017/10/02 0:0-23:11,2017/10/03 0:0-23:11,2017/10/05 0:0-1:0\n classTimeDesc: '=?', // String ex. 2017/10/01 ~ 2017/10/03 Per 2 Month 00:00-23:55 2017/10/05 00:00-01:00\n classTimeObjects: '=?', // Array Object ex. [{}]\n name: '@?name',\n required: '=?ngRequired',\n ngDisabled: '=?ngDisabled'\n },\n templateUrl: 'app/modules/utils/views/class-time.html',\n controller: ['$scope', 'classTimeUtils', function ($scope, classTimeUtils) {\n var vm = this;\n this.$onInit = function () {\n vm.classTime = angular.isDefined(this.classTime) ? this.classTime : [];\n vm.classTimeStr = '';\n vm.classTimeDesc = angular.isDefined(this.classTimeDesc) ? this.classTimeDesc : '';\n vm.classTimeObjects = angular.isDefined(this.classTimeObjects) ? this.classTimeObjects : [];\n var localeDate = moment.localeData();\n vm.weekDays = localeDate._weekdays;\n\n $scope.$watch(function () {\n return vm.classTimeObjects;\n },function (newVal) {\n vm.classTime = classTimeUtils.mergeClassTimes(newVal);\n }, true);\n\n $scope.$watch(function () {\n return vm.classTime;\n },function (newVal) {\n if(angular.isDefined(newVal) && angular.isArray(newVal)){\n vm.classTimeStr = (vm.classTime.length > 0 ? vm.classTime.toString() : '');\n }\n }, true);\n };\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('classTime', classTime);\n\n})();\n\n/**\n * Created by Bruce on 2017/04/06.\n */\n(function () {\n 'use strict';\n\n var choiceExternalCourses = {\n bindings: {\n ngModel: '=?ngModel',\n params: '@?params',\n displayType: '@?displayType'\n },\n templateUrl: 'app/modules/utils/views/choice-external-courses.html',\n controller: ['$interpolate', '$filter', '$scope', 'utilsService', 'NgTableParams', 'ngTableColumnValueService', function ($interpolate, $filter, $scope, utilsService, NgTableParams, ngTableColumnValueService) {\n var vm = this;\n vm.ngModel = angular.isUndefined(this.ngModel) ? undefined : this.ngModel;\n vm.params = angular.isUndefined(this.params) ? {} : this.params;\n vm.displayType = angular.isUndefined(this.displayType) ? 'table' : this.displayType;\n\n\n this.$onInit = function () {\n switch (vm.displayType){\n case 'table':\n prepareTable();\n break;\n case 'list':\n utilsService.getExternalCourses(vm.params).then(function (datas) {\n vm.datas = datas;\n });\n break;\n }\n };\n\n function prepareTable() {\n vm.tableCols = prepareTableCols();\n vm.table = new NgTableParams({\n sorting: {},\n filter: {}\n },{\n counts: [],\n getData: function (tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = value;\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n\n return utilsService.getExternalCourses({}).then(function (data) {\n return data;\n });\n }\n });\n }\n\n function prepareTableCols() {\n var cols = [{\n field: 'choice',\n title: '',\n getValue: htmlChoiceValue,\n priority: 1,\n width: 5\n }, {\n field: 'courseName',\n title: $filter('translate')('FIELD.COURSE_NAME'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1\n }];\n\n return cols;\n }\n\n function htmlChoiceValue() {\n return '';\n }\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('choiceExternalCourses', choiceExternalCourses);\n\n})();\n\n/**\n * Created by Bruce on 2017/04/06.\n */\n(function () {\n 'use strict';\n\n var choiceExternalCourseSessions = {\n bindings: {\n courseId: '=?courseId',\n ngModel: '=?ngModel',\n params: '=?params',\n displayType: '@?displayType'\n },\n templateUrl: 'app/modules/utils/views/choice-external-course-sessions.html',\n controller: ['$interpolate', '$filter', '$scope', 'utilsService', 'NgTableParams', 'ngTableColumnValueService', function ($interpolate, $filter, $scope, utilsService, NgTableParams, ngTableColumnValueService) {\n var vm = this;\n vm.courseId = angular.isUndefined(this.courseId) ? undefined : this.courseId;\n vm.ngModel = angular.isUndefined(this.ngModel) ? undefined : this.ngModel;\n vm.params = angular.isUndefined(this.params) ? {} : this.params;\n vm.displayType = angular.isUndefined(this.displayType) ? 'table' : this.displayType;\n\n $scope.$watch(function () {\n return vm.courseId;\n }, function (newVal) {\n if(angular.isDefined(newVal)){\n switch (vm.displayType){\n case 'table':\n prepareTable();\n break;\n case 'list':\n utilsService.getExternalCourseSessions(vm.courseId, vm.params).then(function (datas) {\n vm.datas = datas;\n });\n break;\n }\n }\n });\n\n function prepareTable() {\n vm.tableCols = prepareTableCols();\n vm.table = new NgTableParams({\n sorting: {},\n filter: {}\n },{\n counts: [],\n getData: function (tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = value;\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n\n return utilsService.getExternalCourseSessions(vm.courseId, vm.params).then(function (data) {\n return data;\n });\n }\n });\n }\n\n function prepareTableCols() {\n var cols = [{\n field: 'choice',\n title: '',\n getValue: htmlChoiceValue,\n priority: 1,\n width: 5\n }, {\n field: 'sessionName',\n title: $filter('translate')('FIELD.SESSION_NAME'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1\n }];\n\n return cols;\n }\n\n function htmlChoiceValue() {\n return '';\n }\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('choiceExternalCourseSessions', choiceExternalCourseSessions);\n\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.user', []);\n\n})();\n\n/**\n * Created by Bruce on 2016/9/22.\n */\n(function () {\n 'use strict';\n\n userService.$inject = ['Restangular', 'serverSetting', 'fileProcess', '$auth', '$filter'];\n function userService(Restangular, serverSetting, fileProcess, $auth, $filter) {\n var _UserService = Restangular.all('personal');\n\n return {\n\n getKernelUser: function () {\n return $auth.getUserData();\n },\n\n getUserProfile: function () {\n /*\n * api/personal/info\n * */\n return _UserService\n .customGET('info');\n },\n\n getUserProfileDetail: function () {\n /*\n * api/personal/info\n * */\n return _UserService\n .customGET('info-detail');\n },\n\n getUserProfileDetailById: function (userId) {\n /*\n * api/personal/info\n * */\n return _UserService\n .one(userId.toString())\n .customGET('info-detail');\n },\n\n getUserProfileById: function (userId) {\n /*\n * api/personal/{UserId}/info\n * */\n return _UserService\n .one(userId.toString())\n .customGET('info');\n },\n\n uploadUserAvatar: function (userId) {\n /*\n * api/personal/{userId}/avatar\n * File name uploadAvatar\n * */\n var url = serverSetting.baseConfig.baseApiPath + '/personal/' + userId + '/avatar';\n\n return new fileProcess.fileUpload(url, [], 'uploadAvatar', 'PUT', false, 10*1024*1024, $filter('translate')('MESSAGE.PICTURE_OVER_MB_PLEASE_RELOAD', {value: 10}));\n },\n\n changePassword: function (formData, params) {\n /*\n * api/personal/{userId}/change-password\n * formData.oriPassword & formData.newPassword\n * */\n return _UserService\n .customPUT(formData, 'change-password', params);\n },\n\n updatePreferLang: function (userId, formData, params) {\n /*\n * api/personal/{userId}/preferlang\n * formData.rcId\n * */\n return _UserService\n .one(userId.toString())\n .customPUT(formData, 'preferlang', params);\n }\n\n\n\n };\n\n }\n\n angular.module('eHRD.modules.user')\n .factory('userService', userService);\n})();\n\n/**\n * Created by Bruce on 2016/9/22.\n */\n(function () {\n 'use strict';\n\n testQuestionnaireCenterService.$inject = ['Restangular'];\n function testQuestionnaireCenterService(Restangular){\n\n var _TestQuestionnaireCenterService = Restangular.all('my-learning-record');\n\n return {\n /*\n * Get list of incompleteCourses\n */\n list: function(params) {\n /*\n * api/my-learning-record/test-survey-courses/courselist\n * ?course_type:{ courseType }&program_type:{ programType } &sort:{ sort }&order:{ order }¤t_page:{ currentPage }&list_size:{ listSize }\n */\n return _TestQuestionnaireCenterService\n // .one('incomplete', null)\n .customGETLIST('test-survey-courses', params);\n }\n };\n\n }\n\n\n angular.module('eHRD.modules.user')\n .factory('testQuestionnaireCenterService', testQuestionnaireCenterService);\n})();\n\n/**\n * Created by Bruce on 2016/10/20.\n */\n\n(function () {\n 'use strict';\n\n myLearningRecordsService.$inject = ['Restangular', '$httpParamSerializer'];\n function myLearningRecordsService(Restangular, $httpParamSerializer){\n\n var _MyLearningRecordsService = Restangular.all('my-learning-record');\n\n return {\n getMyTrainingRecords: function (params) {\n /*\n * api/my-learning-record/my-finished-enrollment\n * */\n return _MyLearningRecordsService\n .customGETLIST('my-finished-enrollment', params);\n },\n\n getSuggestLearningList: function (params) {\n /*\n * api/my-learning-record/recommen-learning-map\n * */\n return _MyLearningRecordsService\n .customGETLIST('recommen-learning-map', params);\n },\n\n updateSuggestLearningList: function (formData, params) {\n /*\n * api/my-learning-record/recommen-learning-map/update\n * */\n return _MyLearningRecordsService\n .one('recommen-learning-map')\n .customPUT($httpParamSerializer(formData), 'update', params, {\"content-type\": \"application/x-www-form-urlencoded\"});\n },\n\n deleteSuggestLearningList: function (formData, params) {\n /*\n * api/my-learning-record/recommen-learning-map/delete\n * */\n return _MyLearningRecordsService\n .one('recommen-learning-map')\n .customOperation('remove', 'delete', params, {\"content-type\": \"application/x-www-form-urlencoded\"},$httpParamSerializer(formData));\n },\n\n addSuggestLearningList: function (formData, params) {\n /*\n * api/my-learning-record/recommen-learning-map/add-view-item\n * */\n return _MyLearningRecordsService\n .one('recommen-learning-map')\n .customPOST({\"addViewItems\": formData}, 'add-view-item', params, {'Content-Type': 'application/json'});\n },\n\n deleteSuggestLearningTemp: function (params) {\n /*\n * api/my-learning-record/recommen-learning-map/delete-temp\n * */\n return _MyLearningRecordsService\n .one('recommen-learning-map')\n .customDELETE('delete-temp', params);\n },\n\n getSuggestLearningTemp: function (formData, params) {\n /*\n * api/my-learning-record/recommen-learning-map/view-temp-items\n * */\n return _MyLearningRecordsService\n .one('recommen-learning-map')\n .customPOST({\"viewItems\": formData}, 'view-temp-items', params, {'Content-Type': 'application/json'});\n }\n\n };\n\n }\n\n\n angular.module('eHRD.modules.user')\n .factory('myLearningRecordsService', myLearningRecordsService);\n})();\n\n/**\n * Created by Bruce on 2016/5/24.\n */\n(function () {\n 'use strict';\n\n incompleteCoursesService.$inject = ['Restangular'];\n function incompleteCoursesService(Restangular){\n\n var _IncompleteCoursesService = Restangular.all('my-learning-record');\n\n return {\n /*\n * Get list of incompleteCourses\n */\n list: function(params) {\n /*\n * api/my-learning- record/incomplete/courselist\n * ?course_type:{ courseType }&program_type:{ programType } &sort:{ sort }&order:{ order }¤t_page:{ currentPage }&list_size:{ listSize }\n */\n return _IncompleteCoursesService\n // .one('incomplete', null)\n .customGETLIST('incompletecourses', params);\n },\n\n /*\n * Show specific incompleteCourses by Id\n */\n show: function(id) {\n // GET /api/incompleteCourses/:id\n return _IncompleteCoursesService.get(id);\n }\n };\n\n }\n\n\n angular.module('eHRD.modules.user')\n .factory('incompleteCoursesService', incompleteCoursesService);\n})();\n\n/**\n * Created by Alan on 2016/11/30.\n */\n(function () {\n 'use strict';\n\n deputyService.$inject = ['Restangular'];\n function deputyService(Restangular) {\n /*\n * Build collection api/deputy\n */\n var _DeputyService = Restangular.all('deputy');\n\n return {\n\n getDeputyRecords: function (params) {\n /*\n * api/deputy/records\n * */\n return _DeputyService\n .customGETLIST('records', params);\n },\n\n deleteDeputyRecords: function (params) {\n /*\n * api/deputy/records?idList={idList}\n * */\n return _DeputyService\n .one('records')\n .remove(params);\n },\n\n getAgents: function (params) {\n /*\n * api/deputy/agents?keyword={keyword}¤t_page={current_page}&list_size={list_size}\n * */\n return _DeputyService\n .customGETLIST('agents',params);\n },\n\n insertAgent: function (formData, params) {\n /*\n * api/deputy/record?groupId={groupId}&deputyFrom={deputyFrom}&deputyTo={deputyTo}&agentId={agentId}\n * */\n return _DeputyService\n .customPOST(formData, 'record', params);\n },\n\n updateAgent: function (agentWorkId, params) {\n /*\n * api/deputy/record/{agentWorkId}?groupId={groupId}&deputyFrom={deputyFrom}&deputyTo={deputyTo}&agentId={agentId}\n * */\n return _DeputyService\n .one('record', agentWorkId)\n .put(params);\n },\n\n getMyManagedGroups: function () {\n /*\n * GET api/deputy/my-managed-groups\n * */\n return _DeputyService\n .customGET('my-managed-groups');\n }\n\n };\n\n }\n\n angular.module('eHRD.modules.user')\n .factory('deputyService', deputyService);\n})();\n\n/**\n * Created by Alan on 2016/1/10.\n */\n\n(function () {\n 'use strict';\n\n userDetail.$inject = ['$mdDialog'];\n function userDetail($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n userId: '=',\n isCertificate: '@?' // 0 or 1\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/user/views/user-detail.html',\n controller: ['userService', '$mdDialog', 'userId', 'isCertificate',\n function (userService, $mdDialog, userId, isCertificate) {\n var vm = this;\n vm.isCertificate = angular.isUndefined(isCertificate)?'0':isCertificate;\n userService.getUserProfileDetailById(userId).then(function(userProfile){\n vm.userProfile = userProfile;\n });\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals:{\n userId: scope.userId,\n isCertificate: scope.isCertificate\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.user')\n .directive('userDetail', userDetail);\n\n})();\n\n/**\n * Created by Alan on 2016/12/7.\n */\n\n(function () {\n 'use strict';\n\n updateEstimatedCompletionDate.$inject = ['$mdDialog', '$filter', 'SweetAlert'];\n function updateEstimatedCompletionDate($mdDialog, $filter, SweetAlert) {\n var directive = {\n restrict: 'A',\n scope: {\n table: '=?',\n enrollmentIdList: '=?',\n permissionType: '@?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n var ceIds =\"\";\n var itemTypes =\"\";\n var canUpdate=true;\n angular.forEach(scope.enrollmentIdList, function(enrollmentId, key) {\n if(enrollmentId.value) {\n if(enrollmentId.canUpdate===1) {\n ceIds += (ceIds==='')? key: \",\" + key;\n itemTypes += (itemTypes==='')? enrollmentId.itemType: \",\" + enrollmentId.itemType;\n }\n else {\n canUpdate = false;\n }\n }\n });\n if($filter('filter')(scope.enrollmentIdList, {value: true}).length === 0){\n SweetAlert.error('', $filter('translate')('MESSAGE.MSG_PLEASE_SELECT_AT_LEAST_ONE_ITEM'));\n }\n else if(canUpdate){\n $mdDialog.show({\n templateUrl: 'app/modules/user/views/update-estimated-completion-date.html',\n controller: ['myLearningRecordsService', 'managerService', '$mdDialog', 'table', 'permissionType',\n function (myLearningRecordsService, managerService, $mdDialog, table, permissionType) {\n var vm = this;\n vm.form ={\n predictDate: new Date()\n };\n\n vm.submit = function (form) {\n if(ceIds!=='') {\n var formData ={\n ceIds: ceIds,\n itemTypes: itemTypes,\n predictDate: moment(form.predictDate).format(\"YYYY/MM/DD\")\n };\n if(permissionType==='manager'){\n managerService.updateMemberSuggestLearningList(formData, {}).then(function () {\n table.reload();\n });\n }\n else{\n myLearningRecordsService.updateSuggestLearningList(formData, {}).then(function () {\n table.reload();\n });\n }\n\n }\n $mdDialog.cancel();\n };\n\n vm.close = function () {\n $mdDialog.cancel();\n };\n }],\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose: true,\n locals: {\n table: scope.table,\n permissionType: scope.permissionType\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n }\n else\n {\n if(scope.permissionType==='manager'){\n SweetAlert.error('', $filter('translate')('MESSAGE.MSG_SORRY_YOU_CAN_ONLY_UPDATE_PLANNED_COMPLETION_DATE_OF_COURSE_FROM_SELF_REQUIRES_AND_MANAGER_SUGGESTION'));\n }\n else{\n SweetAlert.error('', $filter('translate')('MESSAGE.MSG_SORRY_YOU_CAN_ONLY_UPDATE_PLANNED_COMPLETION_DATE_OF_COURSE_FROM_SELF_REQUIRES'));\n }\n\n }\n\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.user')\n .directive('updateEstimatedCompletionDate', updateEstimatedCompletionDate);\n\n})();\n\n/**\n * Created by Alan on 2016/12/6.\n */\n\n(function () {\n 'use strict';\n\n suggestLearningSearchDialog.$inject = ['$mdDialog'];\n function suggestLearningSearchDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n table: '=?',\n permissionType: '@?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/user/views/suggest-learning-search-dialog.html',\n controller: ['PermPermissionStore', '$scope', 'NgTableParams', 'ctlService', '$mdDialog', 'filters', 'permissionType', 'SweetAlert', '$filter',\n function (PermPermissionStore, $scope, NgTableParams, ctlService, $mdDialog, filters, permissionType, SweetAlert, $filter) {\n var vm = this;\n var permission = null;\n permission = PermPermissionStore.getPermissionDefinition('Modules.training_plan');\n vm.hasTrainingPlanPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.training_roadmap');\n vm.hasTrainingRoadMapPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.competence');\n vm.hasCompetencePermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.ksa');\n vm.hasKnowLedgePermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.idp_for_cpas61');\n vm.hasIdpForCpasPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.idp_for_cpas61');\n vm.hasIdpForCpasPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.approval');\n vm.hasApprovalPermission = angular.isDefined(permission);\n vm.year = [];\n vm.month = [];\n var yearCount;\n var monthCount;\n for (yearCount = new Date().getFullYear()-10; yearCount <= new Date().getFullYear()+10; yearCount++) {\n vm.year.push(yearCount);\n }\n for (monthCount = 0; monthCount <= 11; monthCount++) {\n vm.month.push(monthCount);\n }\n vm.permissionType = permissionType;\n\n if(vm.permissionType==='manager') {\n ctlService.getManagerGroups({}).then(function (managerGroups) {\n vm.managerGroups = managerGroups;\n vm.filters.groupId = (angular.isDefined(filters.groupId))?filters.groupId:vm.managerGroups[0].value;\n });\n\n $scope.$watch('$ctrl.filters.groupId', function(newValue, oldValue) {\n var params = {\n groupId: vm.filters.groupId\n };\n ctlService.getManagerMembers(params).then(function (managerMembers) {\n vm.managerMembers = managerMembers;\n if(angular.isDefined(vm.managerMembers[0])){\n if(angular.isUndefined(oldValue)){\n vm.filters.memberId = (angular.isDefined(filters.memberId))?filters.memberId:vm.managerMembers[0].value;\n }else {\n vm.filters.memberId = vm.managerMembers[0].value;\n }\n }\n });\n });\n }\n\n vm.filters = {\n lmYearBegin: (angular.isDefined(filters.lmYearBegin))?filters.lmYearBegin:new Date().getFullYear(),\n lmMonthBegin: (angular.isDefined(filters.lmMonthBegin))?filters.lmMonthBegin:0,\n lmYearEnd: (angular.isDefined(filters.lmYearEnd))?filters.lmYearEnd:new Date().getFullYear(),\n lmMonthEnd: (angular.isDefined(filters.lmMonthEnd))?filters.lmMonthEnd:11,\n sourceType: (angular.isDefined(filters.sourceType))?filters.sourceType:-101,\n searchStatus: (angular.isDefined(filters.searchStatus))?filters.searchStatus:'All'\n };\n\n vm.submit = function(filters) {\n if( (filters.lmYearBegin > filters.lmYearEnd) || (filters.lmYearBegin === filters.lmYearEnd && filters.lmMonthBegin > filters.lmMonthEnd)) {\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_THE_START_DATE_NEED_TO_EARLIER_THAN_THE_END_DATE'));\n }\n else {\n $mdDialog.hide(filters);\n }\n\n };\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n filters : scope.table.filter(),\n permissionType: scope.permissionType\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function(filters) {\n scope.table.filter(filters);\n scope.table.reload();\n }, function() { }\n );\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.user')\n .directive('suggestLearningSearchDialog', suggestLearningSearchDialog);\n\n})();\n\n/**\n * Created by Alan on 2016/12/1.\n */\n\n(function () {\n 'use strict';\n\n deputyRecordDialog.$inject = ['$mdDialog'];\n function deputyRecordDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n table: '=?',\n data: '=?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/user/views/deputy-record-dialog.html',\n controller: ['$scope', 'NgTableParams', 'deputyService', '$mdDialog', '$filter', 'SweetAlert', 'table', 'data',\n function ($scope, NgTableParams, deputyService, $mdDialog, $filter, SweetAlert, table, data) {\n var vm = this;\n var formTime;\n var toTime;\n vm.keyword ='';\n\n if(angular.isDefined(data)){\n vm.agentFullName = data.agentName;\n formTime = data.deputyFrom.split(\" \")[1].split(\":\");\n toTime = data.deputyTo.split(\" \")[1].split(\":\");\n vm.deputyFromHH = parseInt(formTime[0]);\n vm.deputyFromMM = parseInt(formTime[1]);\n vm.deputyToHH = parseInt(toTime[0]);\n vm.deputyToMM = parseInt(toTime[1]);\n }\n else {\n vm.deputyFromHH = 0;\n vm.deputyFromMM = 0;\n vm.deputyToHH = 0;\n vm.deputyToMM = 0;\n }\n vm.form = {\n groupId: (angular.isDefined(data))?data.deputyGroupId:-1,\n deputyFrom: (angular.isDefined(data))?new Date(data.deputyFrom):new Date(),\n deputyTo: (angular.isDefined(data))?new Date(data.deputyTo):new Date(),\n agentId: (angular.isDefined(data))?data.agentId:\"\"\n };\n\n vm.agentTable = new NgTableParams({}, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n var params = {};\n params.keyword = vm.keyword;\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n return deputyService.getAgents(params).then(function (agents) {\n tableParams.total(agents.metadata.pagination.total);\n return agents;\n });\n }\n });\n $scope.$watch('$ctrl.keyword', function(keyword) {\n vm.keyword = keyword;\n vm.agentTable.reload();\n });\n\n deputyService.getMyManagedGroups().then(function (managedGroups) {\n vm.managedGroups = managedGroups;\n });\n vm.getAgentFullName = function(agentFullName){\n vm.agentFullName =agentFullName;\n };\n vm.submit = function(form) {\n var check = 1;\n var deputyFrom = new Date($filter('dateTimeFormat')(form.deputyFrom, vm.deputyFromHH, vm.deputyFromMM, '/'));\n var deputyTo = new Date($filter('dateTimeFormat')(form.deputyTo, vm.deputyToHH, vm.deputyToMM, '/'));\n if(form.deputyFrom===''){\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_DEPUTY_EFFECTIVE_DATE_CNA_NOT_EMPTY'));\n check = 0;\n }\n else if(form.deputyTo===''){\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_DEPUTY_END_DATE_CNA_NOT_EMPTY'));\n check = 0;\n }\n else if(deputyFrom >= deputyTo){\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_DEPUTY_END_DATE_CNA_NOT_BE_EARLIER_THAN_DEPUTY_EFFECTIVE_DATE'));\n check = 0;\n }\n else if(form.agentId===''){\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_PLEASE_SETTING_DEPUTY'));\n check = 0;\n }\n var params ={\n groupId: form.groupId,\n deputyFrom: $filter('dateTimeFormat')(form.deputyFrom, vm.deputyFromHH, vm.deputyFromMM, '/'),\n deputyTo: $filter('dateTimeFormat')(form.deputyTo, vm.deputyToHH, vm.deputyToMM, '/'),\n agentId: form.agentId\n };\n if(check === 1){\n if(angular.isDefined(data)){\n deputyService.updateAgent(data.agentWorkId, params).then(function (result) {\n if(result.status === 0){\n SweetAlert.success('', $filter('translate')('MESSAGE.MSG_EDIT_DEPUTY_RECORD_SUCCESSFUL'));\n table.reload();\n $mdDialog.cancel();\n }else {\n SweetAlert.error('', $filter('translate')( 'ERROR.' + result.message));\n }\n });\n }\n else{\n deputyService.insertAgent(\"\", params).then(function (result) {\n if(result.status === 0){\n SweetAlert.success('', $filter('translate')('MESSAGE.MSG_SETTING_DEPUTY_SUCCESSFUL'));\n table.reload();\n $mdDialog.cancel();\n }else {\n SweetAlert.error('', $filter('translate')( 'ERROR.' + result.message));\n }\n });\n }\n }\n };\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n table: scope.table,\n data: scope.data\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.user')\n .directive('deputyRecordDialog', deputyRecordDialog);\n\n})();\n\n/**\n * Created by Alan on 2017/2/24.\n */\n\n(function () {\n 'use strict';\n\n deleteSuggestLearningList.$inject = ['myLearningRecordsService', 'managerService', '$filter', 'SweetAlert'];\n function deleteSuggestLearningList(myLearningRecordsService, managerService, $filter, SweetAlert) {\n var directive = {\n restrict: 'A',\n scope: {\n table: '=?',\n enrollmentIdList: '=?',\n permissionType: '@?'\n },\n link: function (scope, element) {\n element.bind('click', function() {\n var ceIds =\"\";\n var itemTypes =\"\";\n var canDeletefromType = true;\n var canDeleteUnenroll = true;\n var canDeletefromTypeMessage = \"\";\n var canDeleteUnenrollMessage = \"\";\n angular.forEach(scope.enrollmentIdList, function(enrollmentId, key) {\n if(enrollmentId.value) {\n if(enrollmentId.canDelete===1) {\n ceIds += (ceIds==='')? key: \",\" + key;\n itemTypes += (itemTypes==='')? enrollmentId.itemType: \",\" + enrollmentId.itemType;\n }\n else {\n if(enrollmentId.sourceInfos[0].fromType!=='Self' && scope.permissionType !== 'manager') {\n canDeletefromType = false;\n canDeletefromTypeMessage = $filter('translate')('MESSAGE.MSG_SORRY_YOU_ONLY_DELETE_COURSES_FORM_SELF_REQUIRED_WHICH_ARE_STILL_OPEN_FOR_ENROLLMENT');\n }\n else if(enrollmentId.sourceInfos[0].fromType!=='Manager' && scope.permissionType === 'manager') {\n canDeletefromType = false;\n canDeletefromTypeMessage = $filter('translate')('MESSAGE.MSG_SORRY_YOU_ONLY_DELETE_COURSES_FORM_MANAGER_SUGGEST_WHICH_ARE_STILL_OPEN_FOR_ENROLLMENT');\n }\n\n if(enrollmentId.sourceInfos[0].fromType==='Self' && enrollmentId.status!=='Unenroll'){\n canDeleteUnenroll = false;\n canDeleteUnenrollMessage = $filter('translate')('MESSAGE.MSG_SORRY_YOU_CANNOT_DELETE_COURSES_WHICH_YOU_HAVE_ENROLLED_IN');\n }\n else if(enrollmentId.sourceInfos[0].fromType==='Manager' && enrollmentId.status!=='Unenroll'){\n canDeleteUnenroll = false;\n canDeleteUnenrollMessage = $filter('translate')('MESSAGE.MSG_SORRY_YOU_CANNOT_DELETE_COURSES_WHICH_EMPLOYEES_HAVE_ENROLLED_IN');\n }\n }\n }\n });\n\n if($filter('filter')(scope.enrollmentIdList, {value: true}).length === 0) {\n SweetAlert.error('', $filter('translate')('MESSAGE.MSG_PLEASE_SELECT_AT_LEAST_ONE_ITEM'));\n }\n else if(canDeletefromType!==false && canDeleteUnenroll === false) {\n SweetAlert.error('', canDeletefromTypeMessage +'
    ' + canDeleteUnenrollMessage );\n }\n else if(canDeletefromType === false) {\n SweetAlert.error('', canDeletefromTypeMessage);\n }\n else if(canDeleteUnenroll===false) {\n SweetAlert.error('', canDeleteUnenrollMessage);\n }\n else\n {\n SweetAlert.check($filter('translate')('MESSAGE.MSG_CONFIRM_TO_DELETE'), '', 'warning', function() {\n var formData ={\n ceIds: ceIds,\n itemTypes: itemTypes\n };\n\n if(scope.permissionType === 'manager') {\n managerService.deleteMemberSuggestLearningList(formData, {}).then(function () {\n scope.table.reload();\n });\n }\n else {\n myLearningRecordsService.deleteSuggestLearningList(formData, {}).then(function () {\n scope.table.reload();\n });\n }\n });\n\n }\n\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.user')\n .directive('deleteSuggestLearningList', deleteSuggestLearningList);\n\n})();\n\n/**\n * Created by Alan on 2016/12/8.\n */\n\n(function () {\n 'use strict';\n\n addSuggestLearningList.$inject = ['$mdDialog'];\n function addSuggestLearningList($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n table: '=?',\n permissionType: '@?',\n userId: '=?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/user/views/add-suggest-learning-list.html',\n controller: ['$scope', 'NgTableParams', 'ctlService', 'managerService', 'myLearningRecordsService', '$mdDialog', 'table', 'permissionType', 'userId', 'WizardHandler', '$filter', 'SweetAlert',\n function ($scope, NgTableParams, ctlService, managerService, myLearningRecordsService, $mdDialog, table, permissionType, userId, WizardHandler, $filter, SweetAlert) {\n var vm = this;\n var chooseFormData = [];\n vm.permissionType = permissionType;\n vm.temp = [];\n vm.chooseList = [];\n vm.chooseList.other = [];\n vm.other = {\n itemName: '',\n otherDescription: '',\n update: 0\n };\n vm.selectAll = false;\n vm.courseSelectAll = false;\n vm.tempItemsTable = new NgTableParams({}, {\n counts: [],\n getData: function() {\n var params = {\n userId: userId\n };\n vm.suggestLearningList = [];\n if(vm.permissionType==='manager'){\n managerService.getMemberSuggestLearningTemp(chooseFormData, params).then(function (suggestLearningList) {\n angular.forEach(suggestLearningList, function(value, key) {\n var itemName =(value.itemType===99)?vm.chooseList.other[key].itemName:value.itemName;\n var otherDescription =(value.itemType===99)?vm.chooseList.other[key].otherDescription:'';\n vm.suggestLearningList.push({\n itemType: value.itemType,\n itemId: value.itemId,\n itemTypeName: value.itemTypeName,\n itemName: itemName,\n otherDescription: otherDescription,\n status: value.status,\n disabled: value.disabled\n });\n if(value.disabled===1) {\n vm.temp[value.itemType + \"_\" + value.itemId].checkValue = false;\n }\n });\n });\n }\n else{\n myLearningRecordsService.getSuggestLearningTemp(chooseFormData).then(function (suggestLearningList) {\n angular.forEach(suggestLearningList, function(value, key) {\n var itemName =(value.itemType===99)?vm.chooseList.other[key].itemName:value.itemName;\n var otherDescription =(value.itemType===99)?vm.chooseList.other[key].otherDescription:'';\n vm.suggestLearningList.push({\n itemType: value.itemType,\n itemId: value.itemId,\n itemTypeName: value.itemTypeName,\n itemName: itemName,\n otherDescription: otherDescription,\n status: value.status,\n disabled: value.disabled\n });\n if(value.disabled===1) {\n vm.temp[value.itemType + \"_\" + value.itemId].checkValue = false;\n }\n });\n });\n }\n\n\n return vm.suggestLearningList ;\n }\n });\n\n vm.deleteTemp = function () {\n var params = {\n userId: userId\n };\n if(vm.permissionType==='manager') {\n managerService.deleteMemberSuggestLearningTemp(params).then(function () {});\n }\n else\n myLearningRecordsService.deleteSuggestLearningTemp().then(function () {});\n };\n\n vm.chooseItemPage = function () {\n vm.wzBtn ={\n next:true,\n previous: false,\n finish: false\n };\n return true;\n };\n\n vm.chooseItemPage();\n vm.deleteTemp();\n\n vm.addSuggestLearning = function () {\n var formData = [];\n var params = {\n userId: userId\n };\n angular.forEach(vm.suggestLearningList, function(value, key) {\n var predictDueDate =(value.itemType===99)?vm.chooseList.other[key].predictDueDate:vm.temp[value.itemType + \"_\" + value.itemId].predictDueDate;\n var checkValue =(value.itemType===99)?vm.chooseList.other[key].checkValue:vm.temp[value.itemType + \"_\" + value.itemId].checkValue;\n if(checkValue===true){\n formData.push({\n itemType: value.itemType,\n itemId: value.itemId,\n otherName: value.itemName,\n otherDescription: value.otherDescription,\n predictDueDate: (angular.isDate(predictDueDate))?moment(predictDueDate).format(\"YYYY/MM/DD\"):\"\"\n });\n }\n });\n if(formData.length > 0){\n if(vm.permissionType==='manager'){\n managerService.addMemberSuggestLearningList(formData, params).then(function () {\n table.reload();\n $mdDialog.cancel();\n });\n }\n else\n myLearningRecordsService.addSuggestLearningList(formData).then(function () {\n table.reload();\n $mdDialog.cancel();\n });\n }\n };\n\n // watch for check all checkbox\n $scope.$watch(function() {\n return vm.selectAll;\n }, function(value) {\n angular.forEach(vm.suggestLearningList, function(suggestLearningList, key) {\n if(suggestLearningList.disabled===0){\n if(suggestLearningList.itemType===99)\n vm.chooseList.other[key].checkValue = value;\n else\n vm.temp[suggestLearningList.itemType + \"_\" + suggestLearningList.itemId].checkValue = value;\n }\n });\n });\n\n vm.addOther = function (other) {\n if(angular.isUndefined(vm.other.updateIndex)) {\n vm.chooseList.other.push({\n itemType: 99,\n itemId: 0,\n itemTypeName: '',\n itemName: other.itemName,\n otherDescription: other.otherDescription,\n status: '',\n predictDueDate: null,\n checkValue: true\n });\n }\n else {\n vm.chooseList.other[vm.other.updateIndex].itemName = other.itemName;\n vm.chooseList.other[vm.other.updateIndex].otherDescription = other.otherDescription;\n }\n vm.clearOther();\n };\n\n vm.removeOther = function (index) {\n vm.chooseList.other.splice(index, 1);\n if(vm.other.update===1)\n vm.clearOther();\n };\n\n vm.getOther = function (index) {\n vm.other = {\n itemName: vm.chooseList.other[index].itemName,\n otherDescription: vm.chooseList.other[index].otherDescription,\n update: 1,\n updateIndex: index\n };\n };\n\n vm.clearOther = function () {\n vm.other = {\n itemName: '',\n otherDescription: '',\n update: 0\n };\n };\n\n vm.addItemPage = function () {\n vm.wzBtn ={\n next:false,\n previous: true,\n finish: true\n };\n return true;\n };\n\n vm.nextStep = function () {\n chooseFormData = [];\n\n angular.forEach(vm.chooseList.other, function(value) {\n chooseFormData.push({\n itemType: value.itemType,\n itemId: value.itemId\n });\n });\n\n angular.forEach(vm.chooseList, function(value) {\n chooseFormData.push({\n itemType: value.itemType,\n itemId: value.itemId\n });\n if(angular.isUndefinedOrNull(vm.temp[value.itemType + \"_\" + value.itemId])) {\n vm.temp[value.itemType + \"_\" + value.itemId] = {\n checkValue: true,\n predictDueDate: null\n }\n }\n });\n\n if(chooseFormData.length > 0){\n vm.tempItemsTable.reload();\n WizardHandler.wizard('suggestLearning').next();\n }\n else {\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_SELECT_COURSE_OR_OTHER_NEED'));\n }\n };\n\n vm.previousStep = function () {\n WizardHandler.wizard('suggestLearning').previous();\n };\n\n vm.finishStep = function () {\n WizardHandler.wizard('suggestLearning').finish();\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n }],\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n table : scope.table,\n permissionType: scope.permissionType,\n userId: scope.userId\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function(filters) {\n scope.table.filter(filters);\n scope.table.reload();\n }, function() { }\n );\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.user')\n .directive('addSuggestLearningList', addSuggestLearningList);\n\n})();\n\n/**\n * Created by Bruce on 2016/9/22.\n */\n(function() {\n 'use strict';\n\n UserController.$inject = ['$scope', '$state', 'userService', 'userDashboardService', 'sitemapService'];\n\n function UserController($scope, $state, userService, userDashboardService, sitemapService) {\n var vm = this;\n $scope.$on('$stateChangeSuccess',function () {\n if(!($state.includes('login')) && !($state.includes('logout'))\n && !($state.includes('error')) && !($state.includes('modules.error'))){\n userService.getUserProfile().then(function (userData) {\n vm.userProfiles = userData;\n });\n userDashboardService.getUserToDo().then(function(userToDoData) {\n vm.userToDo = userToDoData;\n });\n sitemapService.getOnlineUserNumber().then(function(result){\n vm.number = result.number;\n });\n }\n vm.copyright = sitemapService.getProject('copyright');\n });\n }\n\n angular.module('eHRD.modules.user')\n .controller('UserController', UserController);\n})();\n\n/**\n * Created by Bruce on 2016/10/21.\n */\n(function() {\n 'use strict';\n\n TrainingRecordsSearchDialogController.$inject = ['$mdDialog','filters', 'PermPermissionStore'];\n\n function TrainingRecordsSearchDialogController($mdDialog, filters, PermPermissionStore) {\n var vm = this;\n var permission = null;\n permission = PermPermissionStore.getPermissionDefinition('Modules.curriculum');\n vm.hasCurriculumPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.certification.inner');\n vm.hasCertificationInnerPermission = angular.isDefined(permission);\n\n vm.filters = {\n keyword: angular.isDefined(filters.keyword) ? filters.keyword : '',\n cpType: angular.isDefined(filters.cpType) ? filters.cpType : 1,\n passResult: angular.isDefined(filters.passResult) ? filters.passResult : -1,\n learnerType: angular.isDefined(filters.learnerType) ? filters.learnerType : -1\n };\n\n vm.cancel = function() {\n $mdDialog.hide({});\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n vm.submit = function(filters) {\n $mdDialog.hide(filters);\n };\n }\n\n angular.module('eHRD.modules.user')\n .controller('TrainingRecordsSearchDialogController', TrainingRecordsSearchDialogController);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function() {\n 'use strict';\n\n var userTrainingRecords = {\n bindings: {},\n templateUrl: 'app/modules/user/views/training-records.html',\n controller: ['$scope', '$filter', '$interpolate', 'PermPermissionStore', 'ngTableColumnValueService', 'NgTableParams', '$mdDialog', '$document', 'myLearningRecordsService', 'userService', '$window',\n function($scope, $filter, $interpolate, PermPermissionStore, ngTableColumnValueService, NgTableParams, $mdDialog, $document, myLearningRecordsService, userService, $window) {\n var vm = this;\n var permission = null;\n permission = PermPermissionStore.getPermissionDefinition('Modules.curriculum');\n vm.hasCurriculumPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.certification.inner');\n vm.hasCertificationInnerPermission = angular.isDefined(permission);\n vm.cpType = 1;\n vm.filter = {};\n\n function prepareTable() {\n vm.tableCols = prepareTableCols();\n\n vm.myTrainingRecordsTable = new NgTableParams({\n filter: vm.filter,\n sorting: {}\n }, {\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function(value, key) {\n params.sort = key;\n params.order = ((value === 'desc') ? 0 : 1);\n });\n\n angular.forEach(tableParams.filter(), function(value, key) {\n params[key] = value;\n });\n\n params.currentPage = tableParams.url().page;\n params.perPage = tableParams.url().count;\n if (angular.isUndefinedOrNull(params.cpType)) params.cpType = 1;\n if (angular.isDefined(params.cpType) && params.cpType === 1) vm.isProgram = false;\n if (angular.isDefined(params.cpType) && params.cpType === 2) vm.isProgram = true;\n\n return myLearningRecordsService.getMyTrainingRecords(params).then(function(records) {\n vm.summary = records.metadata.summary;\n vm.configuration = records.metadata.configuration;\n if(vm.configuration.isShowCredit === 1 && angular.isDefined($filter('where')(vm.tableCols, {field: 'credits'}).length > 0)){\n var credits_index = vm.tableCols.indexOf($filter('where')(vm.tableCols, {field: 'credits'})[0]);\n vm.tableCols[credits_index].show = true;\n }\n tableParams.total(records.metadata.pagination.total);\n return records;\n });\n }\n });\n\n vm.setFilter = function(filters, isClear) {\n if (isClear) {\n filters = {};\n }\n vm.cpType = filters.cpType;\n vm.filter = filters;\n vm.myTrainingRecordsTable.filter(filters);\n vm.myTrainingRecordsTable.sorting({});\n vm.myTrainingRecordsTable.reload();\n };\n }\n\n function prepareTableCols() {\n var cols = [];\n switch (vm.cpType) {\n case 1:\n cols = [{\n field: 'courseName',\n title: $filter('translate')('FIELD.APPELLATION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: '110',\n priority: 1\n }, {\n field: 'sessionName',\n title: $filter('translate')('FIELD.SESSION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 3\n },{\n field: 'credits',\n title: $filter('translate')('FIELD.CREDITS'),\n sortable: '151',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.credits}}
    \"),\n width: 50,\n show: false,\n priority: 2\n }, {\n field: 'courseType',\n title: $filter('translate')('FIELD.TYPE'),\n sortable: '49',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlCourseType()),\n priority: 3\n }, {\n field: 'history_course_time',\n title: $filter('translate')('FIELD.ENROLLMENT_TIME'),\n sortable: 'history_course_time',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlHistoryCourseTime()),\n width: 100,\n priority: 2\n }, {\n field: 'HOURS',\n title: $filter('translate')('FIELD.HOURS'),\n sortable: '59',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlHours()),\n width: 50,\n priority: 3\n }, {\n field: 'PersonalCost',\n title: $filter('translate')('FIELD.COST'),\n sortable: '56',\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 3\n }, {\n field: 'PROPERTIES',\n title: $filter('translate')('FIELD.PROPERTIES'),\n sortable: '140',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlProperties()),\n width: 50,\n priority: 2\n }, {\n field: 'enrollmentHours',\n title: $filter('translate')('FIELD.ENROLLMENT_HOURS'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.totalTime}}
    \"),\n priority: 2\n }, {\n field: 'TEST_FRACTION',\n title: $filter('translate')('FIELD.TEST_FRACTION'),\n sortable: '64',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.score}}
    {{ 'STATUS.NOT_PUBLISHED' | translate}}
    \"),\n width: 50,\n priority: 3\n }, {\n field: 'ENROLLMENT_STATUS',\n title: $filter('translate')('FIELD.ENROLLMENT_STATUS'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlEnrollmentStatus()),\n width: 100,\n priority: 1\n }, {\n field: 'PASS_STATUS',\n title: $filter('translate')('FIELD.PASS_STATUS'),\n sortable: '46',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlPassStatus()),\n priority: 1\n }, {\n field: 'COMMUNITY',\n title: $filter('translate')('FIELD.COMMUNITY'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    \"),\n priority: 1\n }];\n\n break;\n case 2:\n cols = [{\n field: 'programName',\n title: $filter('translate')('FIELD.APPELLATION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: '111',\n priority: 1\n }, {\n field: 'sessionName',\n title: $filter('translate')('FIELD.SESSION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 3\n }, {\n field: 'credits',\n title: $filter('translate')('FIELD.CREDITS'),\n sortable: '151',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.credits}}
    \"),\n width: 50,\n show: false,\n priority: 2\n }, {\n field: 'programAccessTime',\n title: $filter('translate')('FIELD.CLASS_TIME'),\n sortable: 'Dynamic_ProgramAccessDate',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    \"),\n priority: 1\n }, {\n field: 'includeCourse',\n title: $filter('translate')('COURSE_CONTAIN'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    '\\\">
    \"),\n priority: 3\n }, {\n field: 'enrollmentHours',\n title: $filter('translate')('FIELD.LEARN_TOTAL_TIME'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.totalTime}}
    \"),\n priority: 1\n }, {\n field: 'passCount',\n title: $filter('translate')('FIELD.PASS_NUMBER'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.passCount}}
    \"),\n priority: 2\n }, {\n field: 'failedCount',\n title: $filter('translate')('FIELD.FAILED_NUMBER'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.failedCount}}
    \"),\n priority: 3\n }, {\n field: 'exemptionCount',\n title: $filter('translate')('FIELD.EXEMPTION_NUMBER'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.exemptionCount}}
    \"),\n priority: 3\n }, {\n field: 'ENROLLMENT_STATUS',\n title: $filter('translate')('FIELD.ENROLLMENT_STATUS'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlEnrollmentStatus()),\n width: 100,\n priority: 1\n }, {\n field: 'PASS_STATUS',\n title: $filter('translate')('FIELD.PASS_STATUS'),\n sortable: '46',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlPassStatus()),\n priority: 1\n }, {\n field: 'SCORE',\n title: $filter('translate')('FIELD.SCORE'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.score}}
    \"),\n priority: 3\n }, {\n field: 'COMMUNITY',\n title: $filter('translate')('FIELD.COMMUNITY'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    \"),\n priority: 1\n }];\n break;\n }\n return cols;\n }\n\n function htmlCourseType() {\n var html = '
    ';\n html += '{{ \"FIELD.ONLINE_COURSE\" | translate}}';\n html += '{{ \"FIELD.CLASS_ROOM_COURSE\" | translate}}';\n html += '{{ \"FIELD.EXTERNAL_TRAINING\" | translate}}';\n html += '{{ \"FIELD.ONLINE_TEST\" | translate}}';\n html += '{{ \"FIELD.CLASS_ROOM_TEST\" | translate}}';\n html += '{{ \"FIELD.QUESTIONNAIRE\" | translate}}';\n html += '{{row.courseType}}';\n html += '
    ';\n return html;\n }\n\n function htmlHistoryCourseTime() {\n var html = '
    '\n + '
    ';\n return html;\n }\n\n function htmlHours() {\n var html = '
    ';\n html += '{{(row.studyHour === 0) ? \"\" : row.studyHour}}';\n html += '';\n html += '{{(row.studyHour + (row.studyMin/60)) | number:2}}';\n html += '';\n html += '
    ';\n return html;\n }\n\n function htmlProperties() {\n var html = '
    {{ \"FIELD.COURSE_ELECTIVE\" | translate}}
    ';\n html += '
    {{ \"FIELD.COURSE_REQUIRED\" | translate}}
    ';\n return html;\n }\n\n function htmlEnrollmentStatus() {\n var html = '';\n html += '{{ \\'STATUS.\\' + row.status | uppercase | translate}}';\n html += '{{ \\'STATUS.\\' + row.status | uppercase | translate}}';\n return html;\n }\n\n function htmlPassStatus() {\n var html = '
    ';\n html += 'N/A';\n html += '{{ \\'STATUS.EXEMPTION\\' | translate }}';\n html += '{{ \\'STATUS.PASSED\\' | translate }}';\n html += '{{ \\'STATUS.FAILED\\' | translate }}';\n html += '
    ';\n return html;\n }\n\n $scope.$watch(function() {\n return vm.cpType;\n }, function() {\n prepareTable();\n });\n\n userService.getUserProfile().then(function(userData) {\n vm.userProfiles = userData;\n });\n\n vm.iframeWindow = function(formDetailUrl) {\n $window.open(formDetailUrl, 'player', 'width=' + $window.innerWidth / 2 + ',height=' + $window.innerHeight / 2 + ',location=no, scrollbars=yes, resizable=yes');\n };\n\n vm.showPrompt = function(ev) {\n // Appending dialog to document.body to cover sidenav in docs app\n $mdDialog.show({\n controller: 'TrainingRecordsSearchDialogController',\n controllerAs: 'TRSDC',\n templateUrl: 'app/modules/user/views/training-records-search-dialog.html',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose: true,\n locals: {\n filters: vm.myTrainingRecordsTable.filter()\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function(filters) {\n vm.setFilter(filters, false);\n }, function() {});\n };\n }\n ]\n };\n\n angular.module('eHRD.modules.user')\n .component('userTrainingRecords', userTrainingRecords);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var mySetting = {\n bindings: {},\n templateUrl: 'app/modules/user/views/my-setting.html',\n controller: ['sitemapService', '$state', '$scope', 'NgTableParams', 'userService', 'deputyService', 'SweetAlert', '$translate', '$filter', 'amMoment',\n function( sitemapService, $state, $scope, NgTableParams, userService, deputyService, SweetAlert, $translate, $filter, amMoment ){\n\n var vm = this;\n vm.expandProfileDetail = false;\n vm.personal = {};\n vm.agentWorkId = {\n selectAll: false,\n selected: []\n };\n\n\n vm.getData = function () {\n vm.kernelUser = userService.getKernelUser();\n userService.getUserProfileDetail().then(function (userDetailData) {\n vm.userProfilesDetail = userDetailData;\n vm.personal.rc = userDetailData.lang;\n var uploader = $scope.uploader = userService.uploadUserAvatar(userDetailData.userId);\n uploader.onAfterAddingFile = function (item) {\n SweetAlert.check('', $filter('translate')('MESSAGE.MSG_ARE_YOU_SURE_WANT_TO_REPLACE_YOUR_AVATAR'), 'warning', function () {\n item.upload();\n },function () {\n uploader.clearQueue();\n });\n };\n uploader.onErrorItem = function(/*fileItem, response, status, headers*/) { };\n uploader.onCompleteAll = function () {\n vm.getData();\n $state.reload();\n };\n });\n };\n\n vm.deputyRecordsTable = new NgTableParams({}, {\n counts: [],\n getData: function(tableParams) {\n var params = {};\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n return deputyService.getDeputyRecords(params).then(function (records) {\n vm.records = records;\n tableParams.total(records.metadata.pagination.total);\n return records;\n });\n }\n });\n\n vm.deleteDeputyRecords = function(){\n var idList=\"\";\n angular.forEach(vm.agentWorkId.selected, function(agentWorkId,key) {\n if(agentWorkId.value) {\n idList += (idList==='')?key:\",\"+key;\n }\n });\n if(idList!==''){\n var params = {\n idList:idList\n };\n SweetAlert.check('', $filter('translate')('MESSAGE.MSG_ARE_YOU_SURE_WANT_TO_DELETE_DEPUTY_RECORD'), 'warning', function () {\n deputyService.deleteDeputyRecords(params).then(function (res) {\n if(res.status === 0){\n vm.deputyRecordsTable.reload();\n }else if(res.status === -2){\n SweetAlert.error('', $filter('translate')( 'ERROR.MSG_NOT_ALLOW_TO_DELETE_OTHER_SETTING'));\n }\n });\n });\n }\n\n };\n\n // watch for check all checkbox\n $scope.$watch(function() {\n return vm.agentWorkId.selectAll;\n }, function(value) {\n angular.forEach(vm.records, function(records) {\n vm.agentWorkId.selected[records.agentWorkId] = {\n value:value\n };\n });\n });\n\n vm.checkboxSelect = function(agentWorkId,value){\n vm.agentWorkId.selected[agentWorkId] = {\n value:value\n };\n };\n\n vm.changePassword = function (passwords) {\n SweetAlert.check('', $filter('translate')('MESSAGE.MSG_ARE_YOU_SURE_WANT_TO_CHANGE_YOUR_PASSWORD'), 'warning', function () {\n userService.changePassword({'oriPassword': passwords.oldPwd,'newPassword': passwords.newPwd}, {}).then(function (res) {\n if(res.status === 1){\n SweetAlert.success('', $filter('translate')('MESSAGE.MSG_UPDATE_PASSWORD_SUCCESS'));\n }else {\n SweetAlert.error('', $filter('translate')( 'ERROR.' + res.message));\n }\n });\n });\n };\n\n vm.updatePreferLang = function (formData) {\n\n userService.updatePreferLang(vm.userProfilesDetail.userId, formData, {}).then(function (res) {\n if(res.status === 1){\n //vm.getData();\n var _rc = '';\n switch (formData){\n case 1:\n _rc = 'en_us';\n break;\n case 2:\n _rc = 'zh_tw';\n break;\n case 3:\n _rc = 'zh_cn';\n break;\n }\n $translate.use(_rc);\n amMoment.changeLocale($translate.use());\n\n $state.go('mySetting', {}, {reload: true});\n }\n });\n };\n\n vm.getData();\n }]\n };\n\n angular.module('eHRD.modules.user')\n .component('mySetting', mySetting);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var myCurriculum = {\n bindings: {},\n templateUrl: 'app/modules/user/views/my-curriculum.html',\n controller: ['PermPermissionStore', 'NgTableParams', 'myLearningRecordsService', '$scope', '$filter', 'ngTableColumnValueService', '$interpolate',\n function( PermPermissionStore, NgTableParams, myLearningRecordsService, $scope, $filter, ngTableColumnValueService, $interpolate){\n var vm = this;\n var permission = null;\n permission = PermPermissionStore.getPermissionDefinition('Modules.curriculum');\n vm.hasCurriculumPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.certification.inner');\n vm.hasCertificationInnerPermission = angular.isDefined(permission);\n var defaultFilters = {\n sourceType: -101,\n searchStatus: 'All',\n lmYearBegin: new Date().getFullYear(),\n lmMonthBegin: 0,\n lmYearEnd: new Date().getFullYear(),\n lmMonthEnd: 11\n };\n vm.enrollmentId = {\n selectAll: false,\n selected: []\n };\n\n\n vm.tableCols = prepareTableCols();\n vm.suggestLearningTable = new NgTableParams({ sorting: { 'PredictDueDate': \"desc\" } }, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n var params = {};\n //clear checkbox\n vm.enrollmentId = {\n selectAll: false,\n selected: []\n };\n\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc') ? \"ASC\" : \"DESC\");\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n return myLearningRecordsService.getSuggestLearningList(params).then(function (suggestLearningList) {\n vm.suggestLearningList = suggestLearningList;\n vm.userInfo = suggestLearningList.metadata.userInfo;\n tableParams.total(suggestLearningList.metadata.pagination.total);\n return suggestLearningList;\n });\n }\n });\n\n vm.suggestLearningTable.filter(defaultFilters);\n\n\n function prepareTableCols() {\n var cols = [\n {\n field: 'checkbox',\n title: '',\n headerTemplateURL: 'headerCheckbox.html',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\" \"\n ),\n priority: 1,\n width: 5\n },\n {\n field: 'predictDueDate',\n title: $filter('translate')('FIELD.ESTIMATED_COMPLETION_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: 'PredictDueDate',\n priority: 2,\n width: 110\n },\n {\n field: 'finishDate',\n title: $filter('translate')('FIELD.FINISH_TIME'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: 'ResultModifiedDate',\n priority: 1,\n width: 80\n },\n {\n field: 'activityName',\n title: $filter('translate')('FIELD.LEARNING_ACTIVITY'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlActivityName()),\n sortable: 'ActivityName',\n priority: 1\n },\n {\n field: 'sessionName',\n title: $filter('translate')('FIELD.SESSION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 3\n },\n {\n field: 'itemName',\n title: $filter('translate')('FIELD.TYPE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: 'ItemType',\n priority: 3,\n width: 50\n },\n {\n field: 'sourceName',\n title: $filter('translate')('FIELD.SOURCE'),\n getValue: htmlSourceInfos,\n sortable: 'Source',\n priority: 2\n },\n {\n field: 'properties',\n title: $filter('translate')('FIELD.PROPERTIES'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"\" +\n \"
    N/A
    \" +\n \"
    {{ 'FIELD.COURSE_ELECTIVE' |translate }}
    \" +\n \"
    {{ 'FIELD.COURSE_REQUIRED' |translate }}
    \"\n ),\n sortable: 'LearnerType',\n priority: 2\n },\n {\n field: 'enrollName',\n title: $filter('translate')('FIELD.ENROLL_TYPE') +'(' + $filter('translate')('FIELD.SPECIFY_APPLICANT') + ')',\n headerTemplateURL: 'enrollTypeHeader.html',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate('
    {{row.enrollName}}
    ' +\n '({{row.assignerFullName}})
    '\n ),\n sortable: 'EnrollType',\n priority: 3\n },\n {\n field: 'enrollmentStatus',\n title: $filter('translate')('FIELD.ENROLLMENT_STATUS'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlEnrollmentStatus()),\n priority: 1,\n width: 100\n },\n {\n field: 'leanerStatusName',\n title: $filter('translate')('FIELD.LEARNING_STATUS'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1\n }\n ];\n\n\n return cols;\n }\n\n\n // watch for check all checkbox\n $scope.$watch(function() {\n return vm.enrollmentId.selectAll;\n }, function(value) {\n angular.forEach(vm.suggestLearningList, function(suggestLearningList) {\n vm.checkboxSelect(suggestLearningList, value);\n });\n });\n\n //checkbox select\n vm.checkboxSelect = function(suggestLearningList, value){\n vm.enrollmentId.selected[suggestLearningList.enrollmentId] = {\n value: value,\n itemType: suggestLearningList.itemType,\n canDelete: suggestLearningList.canDelete,\n canUpdate: suggestLearningList.canUpdate,\n activityName: suggestLearningList.activityName,\n sourceInfos: suggestLearningList.sourceInfos,\n status: suggestLearningList.status\n };\n };\n\n\n function htmlSourceInfos() {\n return '
    {{sourceInfo.sourceName}}
    ';\n }\n\n function htmlEnrollmentStatus() {\n var html = '';\n html += ' {{row.statusName}}';\n html += ' N/A ';\n html += ' {{row.leanerStatusName}} ';\n return html;\n }\n\n function htmlActivityName() {\n var html = \"
    \";\n html += \"{{row.activityName}}\";\n html += \"{{row.activityName}}\";\n html += \"{{row.activityName}}\";\n html += \"{{row.activityName}}\";\n html += \"
    \";\n return html;\n }\n }]\n };\n\n angular.module('eHRD.modules.user')\n .component('myCurriculum', myCurriculum);\n})();\n\n/**\n * Created by Bruce on 2016/12/1.\n */\n(function () {\n 'use strict';\n\n var myCalendar = {\n bindings: {},\n templateUrl: 'app/modules/user/views/my-calendar.html',\n controller: [ '$state', '$q', '$scope', 'dateFns', 'calendarConfig', 'calendarService', '$mdDialog', 'courseResourceService', function( $state, $q, $scope, dateFns, calendarConfig, calendarService, $mdDialog, courseResourceService){\n var vm = this;\n vm.calendarView = 'month';\n vm.minDateEvents = [];\n vm.bigCalendarEvents = [];\n vm.viewDate = moment(new Date());\n vm.cellIsOpen = true;\n var tomorrowDate = moment(new Date()).add(1, 'days');\n\n $scope.$watch(function () {\n return vm.viewDate;\n }, function (newVal) {\n if(moment.isMoment(newVal)){\n vm.isCanShowTomorrowEvents = dateFns.isSameDay(vm.viewDate, moment(new Date()));\n }else {\n vm.viewDate = moment(newVal);\n }\n }, true);\n\n vm.updateViewDate = function (calendarDate) {\n vm.viewDate = moment(new Date(calendarDate));\n vm.getCalendarEvents(vm.viewDate, false);\n };\n\n vm.getCalendarEvents = function (date, isOnlyDay) {\n isOnlyDay = isOnlyDay || false;\n if(!isOnlyDay){\n getCalendarWithOneBeforeAndAfter(date);\n }\n calendarService.getCalendarEvents(date, true).then(function (data) {\n angular.forEach(data, function (event, index) {\n var eventDate = moment(new Date(event.dateStr)).set({\n 'hour' : event.endTime.split(':')[0],\n 'minute' : event.endTime.split(':')[1],\n 'second' : \"0\"\n });\n if(eventDate.isBefore(moment(new Date()))){\n data[index].isExpired = true;\n }\n });\n vm.dateEvents = data;\n });\n };\n\n var getCalendarWithOneBeforeAndAfter = function (baseDate) {\n if(!moment.isMoment(baseDate)) baseDate = moment(baseDate);\n vm.bigCalendarEvents = []; vm.minDateEvents = [];\n calendarService.getCalendarWithOneBeforeAndAfter(baseDate).then(function (data) {\n vm.bigCalendarEvents = vm.bigCalendarEvents.concat(bigCalendarProcess(data));\n vm.minDateEvents = calendarService.minCalendarProcess(data);\n });\n };\n\n function bigCalendarProcess(calendars) {\n var bigCalendars = [];\n var actions = [{\n label: '',\n onClick: function(args, $event) {\n vm.openPlaceMap(args.calendarEvent.placeMap, $event);\n }\n }];\n angular.forEach(calendars, function (calendar) {\n bigCalendars.push({\n title: calendar.eventName + '   ' + calendar.place,\n color: {2: calendarConfig.colorTypes.room, 3: calendarConfig.colorTypes.train, 5: calendarConfig.colorTypes.test}[calendar.courseType],\n startsAt: moment(new Date(calendar.dateStr)).set({\n 'hour' : calendar.startTime.split(':')[0],\n 'minute' : calendar.startTime.split(':')[1],\n 'second' : \"0\"\n }).toDate() ,\n endsAt: moment(new Date(calendar.dateStr)).set({\n 'hour' : calendar.endTime.split(':')[0],\n 'minute' : calendar.endTime.split(':')[1],\n 'second' : \"0\"\n }).toDate() ,\n draggable: false,\n resizable: false,\n placeMap: calendar.placeMap,\n actions: (calendar.placeMap !== null) ? actions : [],\n courseId: calendar.courseId,\n sessionId: calendar.sessionId,\n courseType: calendar.courseType\n });\n });\n return bigCalendars;\n }\n\n vm.linkToCourseSessionPage = function (event) {\n event = event || undefined;\n if(angular.isDefined(event) && angular.isDefined(event.sessionId)){\n courseResourceService.getEnrollment(event.sessionId, false).then(function (enrollment) {\n $state.go('learningPassport.incompleteCourses.courseInfo', {'enrollmentId': enrollment.enrollmentId});\n });\n }\n };\n\n vm.openPlaceMap = function (placeMapUrl, ev) {\n $mdDialog.show({\n template: '' +\n '
    ' +\n '' +\n '
    ',\n clickOutsideToClose: true,\n escapeToClose: true,\n controller: ['placeMapUrl', function (placeMapUrl) {\n var vm = this;\n vm.placeMapUrl = placeMapUrl;\n }],\n controllerAs: '$ctrl',\n bindToController: true,\n fullscreen: true,\n targetEvent: ev,\n locals: {\n placeMapUrl: placeMapUrl\n }\n });\n };\n\n vm.getCalendarEvents(vm.viewDate, true);\n getCalendarWithOneBeforeAndAfter(vm.viewDate);\n calendarService.getCalendarEvents(tomorrowDate, true).then(function (data) {\n vm.tomorrowEvents = data;\n angular.forEach(calendarService.minCalendarProcess(data), function (eventDate) {\n if(vm.minDateEvents.indexOf(eventDate) < 0){\n vm.minDateEvents.push(eventDate)\n }\n });\n });\n }]\n };\n\n angular.module('eHRD.modules.user')\n .component('myCalendar', myCalendar);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var incompleteTestSurveys = {\n bindings: {},\n templateUrl: 'app/modules/user/views/incomplete-test-surveys.html',\n controller: ['PermPermissionStore', 'testQuestionnaireCenterService', function( PermPermissionStore, testQuestionnaireCenterService ){\n\n var vm = this;\n var permission = null;\n var defaultCourseType =[];\n var defaultSort = 'ExpireEnd';\n var defaultOrder = 'ASC';\n permission = PermPermissionStore.getPermissionDefinition('Modules.course.onlinetest');\n vm.hasCourseOnlinetestPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.course.classroomtest');\n vm.hasCourseClassroomtestPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.course.survey');\n vm.hasCourseSurveyPermission = angular.isDefined(permission);\n\n if(vm.hasCourseOnlinetestPermission) defaultCourseType.push(4);\n if(vm.hasCourseClassroomtestPermission) defaultCourseType.push(5);\n if(vm.hasCourseSurveyPermission) defaultCourseType.push(6);\n defaultCourseType.push(9);\n var params = {};\n vm.defaultFilterType = 'courseType';\n vm.defaultFilterValue = defaultCourseType.toString();\n params.filter_key = vm.defaultFilterType;\n params.filter_value = vm.defaultFilterValue;\n params.sort = defaultSort;\n params.order = defaultOrder;\n vm.dataFilter = function(filterType, filterValue) {\n params = {};\n if (angular.isDefined(filterType) && angular.isDefined(filterValue)) {\n switch (filterType) {\n case 'courseType':\n params.filter_key = filterType;\n params.filter_value = filterValue;\n break;\n }\n }else{\n params.filter_key = vm.defaultFilterType;\n params.filter_value = vm.defaultFilterValue;\n }\n params.sort = defaultSort;\n params.order = defaultOrder;\n params.list_size = vm.pagination.perPage;\n vm.getData(params);\n };\n\n vm.getData = function(params) {\n vm.params = params;\n testQuestionnaireCenterService.list(params).then(function(data) {\n vm.incompleteCoursesDatas = data;\n vm.courseCount = vm.incompleteCoursesDatas.metadata.courseCount;\n vm.pagination = vm.incompleteCoursesDatas.metadata.pagination;\n angular.element(\"html, body\").animate({\n scrollTop: 0\n }, 10);\n });\n };\n vm.params = params;\n vm.getData(params);\n }]\n };\n\n angular.module('eHRD.modules.user')\n .component('incompleteTestSurveys', incompleteTestSurveys);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var incompleteCourses = {\n bindings: {},\n templateUrl: 'app/modules/user/views/incomplete-courses.html',\n controller: ['PermPermissionStore', 'incompleteCoursesService', function( PermPermissionStore, incompleteCoursesService ){\n\n var vm = this;\n var permission = null;\n var defaultCourseType =[];var defaultProgramType=[];\n permission = PermPermissionStore.getPermissionDefinition('Modules.course.online');\n vm.hasCourseOnlinePermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.course.classroom');\n vm.hasCourseClassroomPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.course.external');\n vm.hasCourseExternalPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.curriculum');\n vm.hasCurriculumPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.certification.inner');\n vm.hasCertificationInnerPermission = angular.isDefined(permission);\n\n if(vm.hasCourseOnlinePermission) defaultCourseType.push(1);\n if(vm.hasCourseClassroomPermission) defaultCourseType.push(2);\n if(vm.hasCourseExternalPermission) defaultCourseType.push(3);\n\n if(vm.hasCurriculumPermission) defaultProgramType.push(0);\n if(vm.hasCertificationInnerPermission) defaultProgramType.push(1);\n\n var params = {};\n if(defaultCourseType.length > 0 && defaultProgramType.length > 0) {\n vm.defaultFilterType = 'courseType;programType';\n vm.defaultFilterValue = defaultCourseType.toString() + ';' + defaultProgramType.toString();\n }else if(defaultCourseType.length > 0 && defaultProgramType.length === 0){\n vm.defaultFilterType = 'courseType';\n vm.defaultFilterValue = defaultCourseType.toString();\n }else if(defaultCourseType.length === 0 && defaultProgramType.length > 0){\n vm.defaultFilterType = 'programType';\n vm.defaultFilterValue = defaultProgramType.toString();\n }\n\n var defaultSort = 'ExpireEnd';\n var defaultOrder = 'ASC';\n params.filter_key = vm.defaultFilterType;\n params.filter_value = vm.defaultFilterValue;\n if(vm.hasCourseOnlinePermission && (!vm.hasCourseClassroomPermission &&\n !vm.hasCourseExternalPermission && !vm.hasCurriculumPermission && !vm.hasCertificationInnerPermission)){\n params.sort = 'ExpireEnd';\n }else {\n params.sort = defaultSort;\n }\n params.order = defaultOrder;\n\n vm.dataFilter = function(filterType, filterValue) {\n params = {};\n if (angular.isDefined(filterType) && angular.isDefined(filterValue)) {\n switch (filterType) {\n case 'courseType':\n params.filter_key = filterType;\n params.filter_value = filterValue;\n params.sort = defaultSort;\n break;\n case 'programType':\n params.filter_key = filterType;\n params.filter_value = filterValue;\n params.sort = defaultSort;\n break;\n }\n }else{\n params.filter_key = vm.defaultFilterType;\n params.filter_value = vm.defaultFilterValue;\n params.sort = defaultSort;\n }\n params.order = defaultOrder;\n params.list_size = vm.pagination.perPage;\n vm.getData(params);\n };\n\n vm.getData = function(params) {\n vm.params = params;\n incompleteCoursesService.list(params).then(function(data) {\n vm.incompleteCoursesDatas = data;\n vm.courseCount = vm.incompleteCoursesDatas.metadata.courseCount;\n vm.pagination = vm.incompleteCoursesDatas.metadata.pagination;\n angular.element(\"html, body\").animate({\n scrollTop: 0\n }, 10);\n });\n };\n vm.params = params;\n vm.getData(params);\n }]\n };\n\n angular.module('eHRD.modules.user')\n .component('incompleteCourses', incompleteCourses);\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.manager', []);\n\n})();\n\n/**\n * Created by Alan on 2016/12/19.\n */\n\n(function () {\n 'use strict';\n\n trainingRoadMapService.$inject = ['Restangular'];\n function trainingRoadMapService(Restangular){\n\n var _TrainingRoadMapService = Restangular.all('trainingroadmap');\n\n return {\n getTrainingRoadMapList: function () {\n /*\n * api/trainingroadmap/visible\n * */\n return _TrainingRoadMapService\n .customGETLIST('visible');\n },\n\n getTrainingRoadMapInfo: function (trId, params) {\n /*\n * api/trainingroadmap/{trId}\n * */\n return _TrainingRoadMapService\n .customGET(trId, params);\n }\n\n };\n\n }\n\n\n angular.module('eHRD.modules.manager')\n .factory('trainingRoadMapService', trainingRoadMapService);\n})();\n\n/**\n * Created by Bruce on 2016/12/15.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.trainingRoadMap', []);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/15.\n */\n(function () {\n 'use strict';\n\n var trainingRoadMap = {\n bindings: {},\n templateUrl: 'app/modules/training-road-map/views/training-road-map.html',\n controller: [ 'trainingRoadMapService', '$scope', '$location', '$anchorScroll',\n function(trainingRoadMapService, $scope, $location, $anchorScroll){\n var vm = this;\n trainingRoadMapService.getTrainingRoadMapList().then(function (trainingRoadMapList) {\n vm.trainingRoadMapList = trainingRoadMapList;\n vm.trainingRoadMapId = vm.trainingRoadMapList[0].trainingRoadmapId;\n\n $scope.$watch('$ctrl.trainingRoadMapId', function(trainingRoadMapId) {\n var params = {\n withUserStatus: true\n };\n trainingRoadMapService.getTrainingRoadMapInfo(trainingRoadMapId, params).then(function (data) {\n vm.trainingRoadMapInfo = data.trainingRoadmapInfo;\n vm.userCurrentCondition = data.userCurrentCondition;\n vm.titleGroups = data.activitiesNestList.titleGroups;\n });\n });\n });\n\n vm.clickZone = function(zone) {\n vm.selectZone = zone;\n $location.hash(zone);\n $anchorScroll();\n }\n\n }]\n };\n\n angular.module('eHRD.modules.trainingRoadMap')\n .component('trainingRoadMap', trainingRoadMap);\n})();\n\n/**\n * Created by Bruce on 2017/1/18.\n */\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.training',[]);\n\n})();\n\n/**\n * Created by Bruce on 2017/1/18.\n */\n(function () {\n 'use strict';\n\n var trainingPlan = {\n bindings: {},\n templateUrl: 'app/modules/training/views/training-plan.html',\n controller: ['serverSetting', function (serverSetting) {\n var vm = this;\n vm.url = serverSetting.baseConfig.baseURL + '/training-plan-overview.do';\n }]\n };\n\n angular\n .module('eHRD.modules.training')\n .component('trainingPlan' , trainingPlan);\n\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.system', []);\n\n})();\n\n/**\n * Created by Bruce on 2016/9/22.\n */\n(function() {\n 'use strict';\n\n SystemController.$inject = ['serverSetting'];\n\n function SystemController(serverSetting) {\n var vm = this;\n vm.defaultMgrUrl = serverSetting.getServerPath();\n }\n\n angular.module('eHRD.modules.system')\n .controller('SystemController', SystemController);\n})();\n\n/**\n * Created by Bruce on 2017/5/18.\n */\n(function () {\n 'use strict';\n\n var systemInfo = {\n bindings: {},\n templateUrl: 'app/modules/system/views/system-info.html',\n controller: [ 'localStorageService', function (localStorageService) {\n var vm = this;\n vm.systemInfos = {};\n var lsKeys = localStorageService.keys().reverse();\n angular.forEach(lsKeys, function (key) {\n vm.systemInfos[key] = angular.isUndefinedOrNull(localStorageService.get(key)) ? \"Null\" : localStorageService.get(key);\n });\n }]\n };\n\n angular\n .module('eHRD.modules.system')\n .component('systemInfo', systemInfo);\n\n})();\n\n/**\n * Created by Bruce on 2017/5/4.\n */\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.staticPage', []);\n\n})();\n\n/**\n * Created by Bruce on 2017/5/4.\n */\n(function() {\n 'use strict';\n\n var staticPage = {\n bindings: {},\n templateUrl: 'app/modules/static-page/views/static-page.html',\n controller: [ '$stateParams', function($stateParams) {\n var vm = this;\n vm.url = decodeURIComponent($stateParams['url']);\n }\n ]\n };\n\n angular.module('eHRD.modules.staticPage')\n .component('staticPage', staticPage);\n})();\n\n/**\n * Created by Bruce on 2017/5/8.\n */\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.sitemap', []);\n\n})();\n\n/**\n * Created by Bruce on 2017/5/8.\n */\n(function () {\n 'use strict';\n\n sitemapService.$inject = ['treeFactory', 'Restangular', 'AuthStorage', '$q', 'serverSetting', '$ocLazyLoad'];\n function sitemapService(treeFactory, Restangular, AuthStorage, $q, serverSetting, $ocLazyLoad){\n /*\n * Build collection api/approval\n */\n var _sitemapService = Restangular.all('sitemap');\n var _SitemapLoginService = Restangular.all('sitemap-login');\n\n\n var treeModel = new treeFactory.TreeModel();\n var menuItems = [];\n\n var currentPanelType = '';\n\n function menuProcess(_menuItems) {\n angular.forEach(_menuItems, function (_menuItem, index) {\n parseMenuPermission(_menuItems, _menuItem, index);\n if(_menuItem.children.length > 0){\n _menuItems[index]._children = _menuItem.children.filter(function(item) {\n return item.isMenu;\n });\n menuProcess(_menuItems[index]._children);\n }\n });\n }\n\n function parseMenuPermission(_menuItems, _menuItem, index) {\n _menuItems[index].permissionsAll = [];\n _menuItems[index].permissions = [];\n\n // Server API is ready menu module parse\n // angular.forEach(_menuItem.moduleOption.modules, function (module) {\n // if(_menuItem.moduleOption.enabledValidateAll){\n // _menuItems[index].permissionsAll.push('Modules.' + module);\n // }else{\n // _menuItems[index].permissions.push('Modules.' + module);\n // }\n // });\n angular.forEach(_menuItem.permissionOption.permissions, function (permission) {\n if(_menuItem.permissionOption.enabledValidateAll){\n _menuItems[index].permissionsAll.push(permission);\n }else{\n _menuItems[index].permissions.push(permission);\n }\n });\n }\n\n function siteMapNodesMapToMenu() {\n var _menuItems = angular.copy(menuItems).filter(function(item) {\n return item.isMenu ;\n });\n menuProcess(_menuItems);\n return _menuItems;\n }\n\n function getSiteMapNodes() {\n if( menuItems.length > 0) {\n return treeModel.parse({\n children: menuItems\n });\n } else {\n return null;\n }\n\n }\n\n function getProjectSideMenu(projectId) {\n var _projectId = projectId || this.getProject('projectId');\n return _sitemapService\n .one(\"project-info\")\n .customGET('side_menu',{projectId: _projectId});\n }\n\n return {\n\n setMenu: function (menuItem) {\n menuItems = menuItem;\n },\n\n getMenu: function () {\n return siteMapNodesMapToMenu();\n },\n\n getNodeTree: function (node) {\n return treeModel.parse(node);\n },\n\n getProjectSideMenu: getProjectSideMenu,\n\n siteMapNodesMapToMenu: siteMapNodesMapToMenu,\n\n getSiteMapNodes: getSiteMapNodes,\n\n getProjectId: function (pid) {\n /*\n * api/sitemap//project-info\n * */\n if(angular.isUndefinedOrNull(pid) || pid==='')\n return _sitemapService.customGET('project-info');\n else\n return _sitemapService.one(\"project-info\").customGET('review',{projectId:pid});\n },\n\n getProject: function (name) {\n return angular.fromJson(AuthStorage.get(\"projectData\"))[name];\n },\n\n loginSitemapRequired: function(params) {\n /*\n * api/sitemap-login/info?companyName={companyName}\n * */\n var deferred = $q.defer();\n _SitemapLoginService.customGET('info', params).then(function(data){\n deferred.resolve(data);\n });\n\n return deferred.promise;\n },\n\n loginSitemapPreviewRequired: function(params) {\n /*\n * api/sitemap-login/info/review?projectId={projectId}\n * */\n var deferred = $q.defer();\n _SitemapLoginService.one('info').customGET('review', params).then(function(data){\n deferred.resolve(data);\n });\n\n return deferred.promise;\n },\n\n getOnlineUserNumber: function (params) {\n /*\n * api/ctl/online-user-number\n * */\n return _SitemapLoginService\n .customGET('online-user-number', params);\n },\n\n setSitemapColor: function (projectId, panelType) {\n // angular.element('body').removeClass(\"cl-sunnet\");\n // angular.element('body').removeClass(\"cus-color\");\n // angular.element('body').addClass((panelType===0) ? \"cl-sunnet\" : \"cus-color\");\n if(angular.element(\"link#color\").length===0) {\n angular.element('')\n .appendTo(angular.element(\"head\"));\n }\n else {\n angular.element(\"link#color\").attr(\"href\", serverSetting.baseConfig.baseURL + \"/theme_v86/theme_\" + projectId + \"/cus-colors.css?panelType=\" + panelType);\n }\n },\n\n setMaterialColor: function (panelType) {\n if (currentPanelType !== panelType) {\n if (currentPanelType) {\n angular.element('link[href*=\"'+ this.getSiteMapColor(currentPanelType) +'.css\"]').remove();\n }\n $ocLazyLoad.load([this.getSiteMapColor(panelType)], {cache: false});\n currentPanelType = panelType;\n }\n },\n\n getSiteMapColor: function (panelType) {\n\n var color = \"redTheme\";\n switch (panelType){\n case 0:\n color = \"default\";\n break;\n case 1:\n color = \"redTheme\";\n break;\n case 2:\n color = \"pinkTheme\";\n break;\n case 3:\n color = \"blueTheme\";\n break;\n case 4:\n color = \"tealTheme\";\n break;\n case 5:\n color = \"greenTheme\";\n break;\n case 6:\n color = \"orangeTheme\";\n break;\n case 7:\n color = \"blackTheme\";\n break;\n case 8:\n color = \"purpleTheme\";\n break;\n }\n return color;\n },\n\n setSiteMap: function(siteMapData) {\n var project= {\n projectId: siteMapData.projectId,\n logoUrl: siteMapData.logoUrl,\n copyright: siteMapData.copyright,\n broswerTitle: siteMapData.broswerTitle,\n bannerRotateSpeed: siteMapData.bannerRotateSpeed,\n Context: siteMapData.Context,\n primaryColor: siteMapData.primaryColor,\n accentColor: siteMapData.accentColor,\n dangerColor: siteMapData.dangerColor,\n panelType: siteMapData.panelType\n };\n this.setSitemapColor(siteMapData.projectId, siteMapData.panelType);\n this.setMaterialColor(siteMapData.panelType);\n AuthStorage.set(\"projectData\", angular.toJson(project));\n }\n };\n\n }\n\n\n angular.module('eHRD.modules.sitemap')\n .factory('sitemapService', sitemapService);\n})();\n\n/**\n * Created by Bruce on 2017/5/8.\n */\n(function () {\n 'use strict';\n\n var sidebar = {\n bindings: {},\n templateUrl: 'app/modules/sitemap/views/sidebar.html',\n controller: ['$state', '$stateParams', 'navigationService', 'sitemapService', function ($state, $stateParams, navigationService, sitemapService) {\n var vm = this;\n vm.$state = $state;\n vm.$stateParams = $stateParams;\n vm.isMenuPrepared = true;\n sitemapService.getProjectSideMenu().then(function (_menuItems) {\n vm.isMenuPrepared = true;\n sitemapService.setMenu(_menuItems);\n vm.menuItems = sitemapService.getMenu();\n });\n\n vm.scrollBarConfig = navigationService.scrollBarConfig;\n vm.updateScrollbar = navigationService.updateScrollbar;\n\n vm.checkMenu = function (item) {\n var isActive = false;\n if(vm.isMenuPrepared){\n sitemapService.getNodeTree(item).walk(function (node) {\n if( node.model.state === $state.current.name){\n if( node.model.type === 'STATIC'){\n if(angular.equals(node.model.stateParams['mid'], $stateParams['mid'])) isActive = true;\n } else {\n if(angular.isDefined(node.model.stateParams) && (angular.isDefined(node.model.stateParams['id']) || angular.isDefined(node.model.stateParams['courseId']) || angular.isDefined(node.model.stateParams['mid']) )) {\n if(angular.isDefined(node.model.stateParams['mid']) && angular.equals(node.model.stateParams['mid'], $stateParams['mid'])) isActive = true;\n if(angular.isDefined(node.model.stateParams['id']) && angular.equals(node.model.stateParams['id'], $stateParams['id'])) isActive = true;\n if(angular.isDefined(node.model.stateParams['courseId']) && angular.equals(node.model.stateParams['courseId'], $stateParams['courseId'])) isActive = true;\n }else {\n isActive = true;\n }\n\n }\n }\n });\n }\n\n return isActive;\n };\n\n vm.logoUrl = sitemapService.getProject('logoUrl');\n }]\n };\n\n angular\n .module('eHRD.modules.sitemap')\n .component('sidebar', sidebar);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/25.\n */\n\n(function () {\n 'use strict';\n\n routerHelper.$inject = ['$rootScope', '$location', '$log', '$auth', 'serverSetting', 'routerHelper', 'modulesRouteConfig', 'mailLinkRouteConfig'];\n function routerHelper($rootScope, $location, $log, $auth, serverSetting, routerHelper, modulesRouteConfig, mailLinkRouteConfig) {\n routerHelper.configureStates(modulesRouteConfig);\n routerHelper.configureStates(mailLinkRouteConfig);\n\n $log.info($location.absUrl().replace($location.protocol() + '://' + $location.host() + ':' + $location.port(), '').replace($location.url(),'').replace('/', '').replace('#', ''))\n var ssoParams = routerHelper.defaultQueryParams();\n var stateChangeStart = $rootScope.$on('$stateChangeStart', function (ev, to, toParams){\n $auth._redirct = $location.path();\n if(serverSetting.authConfig.enabledSSOQueryParams){\n var isNeedReValidation = false;\n angular.forEach(serverSetting.authConfig.SSOQueryParamsKey, function (param) {\n if(angular.isDefined(toParams[param]) && !angular.equals(toParams[param], ssoParams[param])) isNeedReValidation = true;\n if(angular.isDefined(toParams[param]) && toParams[param].length > 0) {\n ssoParams[param] = toParams[param];\n }else{\n ssoParams[param] = undefined;\n }\n });\n\n if(isNeedReValidation){\n // $auth.logout().then(function () {\n // $auth.skipIfLoggedIn();\n // });\n }\n angular.extend(toParams, ssoParams);\n }\n });\n $rootScope.$on('$destroy', stateChangeStart);\n }\n\n angular\n .module('eHRD.modules.routing',[])\n .run(routerHelper);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/15.\n */\n\n(function () {\n 'use strict';\n\n stateHelperProvider.$inject = ['$stateProvider'];\n /* @ngInject */\n function stateHelperProvider($stateProvider) {\n var self = this;\n\n /**\n * Recursively sets the states using $stateProvider.state.\n * Child states are defined via a `children` property.\n *\n * 1. Recursively calls itself for all descendant states, by traversing the `children` properties.\n * 2. Converts all the state names to dot notation, of the form `grandfather.father.state`.\n * 3. Sets `parent` property of the descendant states.\n *\n * @param {Object} state - A regular ui.router state object.\n * @param {Array} [state.children] - An optional array of child states.\n * @deprecated {Boolean} keepOriginalNames - An optional flag that prevents conversion\n * of names to dot notation if true. (use options.keepOriginalNames instead)\n * @param {Object} [options] - An optional options object.\n * @param {Boolean} [options.keepOriginalNames=false] An optional flag that\n * prevents conversion of names to dot notation if true.\n * @param {Boolean} [options.siblingTraversal=false] An optional flag that\n * adds `nextSibling` and `previousSibling` properties when enabled\n */\n this.state = function(state){\n var args = Array.prototype.slice.apply(arguments);\n var options = {\n keepOriginalNames: false,\n siblingTraversal: false\n };\n\n if (typeof args[1] === 'boolean') {\n options.keepOriginalNames = args[1];\n }\n else if (angular.isObject(args[1])) {\n angular.extend(options, args[1]);\n }\n\n if (!options.keepOriginalNames) {\n fixStateName(state);\n }\n\n $stateProvider.state(state);\n\n if(state.children && state.children.length){\n state.children.forEach(function(childState){\n childState.parent = state;\n self.state(childState, options);\n });\n\n if (options.siblingTraversal) {\n addSiblings(state);\n }\n }\n\n return self;\n };\n\n this.setNestedState = this.state;\n\n self.$get = angular.noop;\n\n /**\n * Converts the name of a state to dot notation, of the form `grandfather.father.state`.\n * @param state\n */\n function fixStateName(state){\n if(state.parent){\n state.name = (angular.isObject(state.parent) ? state.parent.name : state.parent) + '.' + state.name;\n }\n }\n\n function addSiblings(state) {\n state.children.forEach(function (childState, idx, array) {\n if (array[idx + 1]) {\n childState.nextSibling = array[idx + 1].name;\n }\n if (array[idx - 1]) {\n childState.previousSibling = array[idx - 1].name;\n }\n });\n }\n }\n\n angular.module('eHRD.modules.routing')\n .provider('stateHelper', stateHelperProvider);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/15.\n */\n\n(function () {\n 'use strict';\n\n routerHelperProvider.$inject = ['$locationProvider', '$stateProvider', '$urlRouterProvider'];\n /* @ngInject */\n function routerHelperProvider($locationProvider, $stateProvider, $urlRouterProvider) {\n\n this.$get = RouterHelper;\n\n // $locationProvider.html5Mode(true);\n\n RouterHelper.$inject = ['serverSetting', '$state'];\n function RouterHelper( serverSetting, $state) {\n var hasOtherwise = false;\n var queryParams = '';\n var stateQueryParams = {};\n angular.forEach(serverSetting.authConfig.SSOQueryParamsKey, function (param, index) {\n stateQueryParams[param] = {\n value: null, squash: true\n };\n queryParams+=param;\n if((index+1) !== serverSetting.authConfig.SSOQueryParamsKey.length) queryParams+='&';\n });\n\n return {\n configureStates: configureStates,\n getStates: getStates,\n defaultQueryParams: defaultQueryParams\n };\n\n function configureStates(states, otherwisePath) {\n\n if(serverSetting.authConfig.enabledSSOQueryParams){\n states.forEach(function(state) {\n if(!state.config.abstract && angular.isDefined(state.config.url)){\n state.config.url = state.config.url.concat('?' + queryParams.toString());\n if(angular.isUndefined(state.config.params)) state.config.params = stateQueryParams;\n }\n $stateProvider.state(state.state, state.config);\n });\n }else{\n states.forEach(function(state) {\n $stateProvider.state(state.state, state.config);\n });\n }\n\n if (otherwisePath && !hasOtherwise) {\n hasOtherwise = true;\n $urlRouterProvider.otherwise(otherwisePath);\n }\n }\n\n function getStates() {\n return $state.get();\n }\n\n function defaultQueryParams() {\n if(serverSetting.authConfig.enabledSSOQueryParams){\n var ssoParams = {};\n angular.forEach(serverSetting.authConfig.SSOQueryParamsKey, function (param) {\n ssoParams[param] = undefined;\n });\n return ssoParams;\n }else{\n return null;\n }\n }\n }\n }\n\n angular.module('eHRD.modules.routing')\n .provider('routerHelper', routerHelperProvider);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/14.\n */\n\n(function () {\n 'use strict';\n var processMenu = function (state) {\n return {\n processMenuId: ['$q', 'sitemapService', '$stateParams', function ($q, sitemapService, $stateParams) {\n var deferred = $q.defer();\n\n var process = function () {\n switch (state){\n case 'courseResourceCatalog': case 'courseResourceCatalog.CourseInfo': case 'courseResourceCatalog.CourseInfo.SessionInfo':\n case 'courseResourceCatalog.CourseInfo.applyFormCreateByCourseSession':\n case 'courseResourceCatalog.ProgramInfo': case 'courseResourceCatalog.ProgramInfo.SessionInfo':\n sitemapService.getSiteMapNodes().walk(function (node) {\n if(node.model.state === 'courseResourceCatalog' && angular.isUndefinedOrNull($stateParams['mid'])){\n if(node.model.stateParams['cid'] === null || node.model.stateParams['cid'] === \"0\") {\n $stateParams['mid'] = node.model.stateParams['mid'];\n }\n }\n });\n break;\n default:\n sitemapService.getSiteMapNodes().walk(function (node) {\n if( node.model.type !== 'STATIC'){\n if(node.model.state === state){\n $stateParams['mid'] = node.model.stateParams['mid'];\n }\n }\n });\n break;\n }\n deferred.resolve();\n };\n if(sitemapService.getMenu().length > 0) {\n process();\n }else {\n sitemapService.getProjectSideMenu().then(function (menuItems) {\n sitemapService.setMenu(menuItems);\n deferred.resolve();\n });\n }\n return deferred.promise;\n }]\n };\n };\n\n var modulesRouteConfig = [\n {\n state: 'modules',\n config: {\n abstract: true,\n url:'?:pid&:mid',\n params:{\n pid:null,\n mid: null\n },\n templateUrl: \"app/shared/views/content.html\",\n controller: 'UserController',\n controllerAs:'UC',\n resolve: {\n loginRequired: ['$auth', '$stateParams', function ($auth, $stateParams) {\n return $auth.loginRequired($stateParams.pid);\n }],\n loadPlugin: ['$ocLazyLoad', function ($ocLazyLoad) {\n return $ocLazyLoad.load([\n 'theme-plugins'\n ]);\n }]\n }\n }\n },\n\n {\n state: 'modules.error',\n config: {\n url: '/error/page/:type',\n templateUrl: \"app/shared/views/error-page.html\"\n }\n },\n\n {\n state: 'page',\n config: {\n url: \"/static-page?:url\",\n parent: \"modules\",\n template: '',\n resolve: Object.assign({}, processMenu('page')),\n params: {\n url: null\n }\n }\n },\n\n // new solution for Site Map\n\n {\n state: 'learningActivity',\n config: {\n parent: \"modules\",\n url: '/learningActivity/:activityType/:activityId',\n template: '' +\n '',\n resolve: {\n activityType: [ '$stateParams', function ($stateParams) {\n return $stateParams.activityType;\n }],\n activityId: [ '$stateParams', function ($stateParams) {\n return $stateParams.activityId;\n }]\n }\n }\n },\n {\n state: 'knowledgeDocumentCatalog',\n config: {\n parent: \"modules\",\n url: '/knowledgeDocumentCatalog/:cid?:nid',\n template: '',\n params: {\n cid: '0'\n },\n resolve: {\n catalogId: [ '$stateParams', function ($stateParams) {\n return $stateParams.cid;\n }],\n nodeId: [ '$stateParams', function ($stateParams) {\n return $stateParams.nid;\n }]\n }\n }\n },\n\n // new solution for Site Map\n {\n state: 'courseResourceCatalog',\n config: {\n parent: \"modules\",\n url: '/courseResourceCatalog/:cid?:nid',\n template: '',\n params: {\n tabSelect: null,\n cid: '0'\n },\n resolve: Object.assign({\n catalogId: [ '$stateParams', function ($stateParams) {\n return (angular.isDefined($stateParams.cid) && $stateParams.cid.length > 0)? $stateParams.cid : 0;\n }],\n nodeId: [ '$stateParams', function ($stateParams) {\n return $stateParams.nid;\n }],\n tabSelect: ['$stateParams', function ($stateParams) {\n return $stateParams.tabSelect;\n }]\n }, processMenu('courseResourceCatalog'))\n }\n },\n {\n state: 'courseResourceCatalog.CourseInfo',\n config: {\n parent: \"modules\",\n url: \"/courseResourceCatalog/:cid/course-info/:courseId?:nid\",\n template: '',\n params: {\n backState: 'courseResourceCatalog'\n },\n resolve: Object.assign({\n state: ['$state', function ($state) {\n return $state;\n }],\n catalogId: [ '$stateParams', function ($stateParams) {\n return $stateParams.cid;\n }],\n nodeId: [ '$stateParams', function ($stateParams) {\n return $stateParams.nid;\n }],\n courseId: [ '$stateParams', function ($stateParams) {\n return $stateParams.courseId;\n }]\n }, processMenu('courseResourceCatalog.CourseInfo'))\n }\n },\n {\n state: 'courseResourceCatalog.CourseInfo.applyFormCreateByCourseSession',\n config: {\n url: \"/session/:sessionId/create-external-training-form\",\n template: '',\n params: {\n _backState: 'courseResourceCatalog.CourseInfo',\n backStateParams: null\n },\n resolve: Object.assign({\n backStateObject: ['$stateParams', function ($stateParams) {\n return {\n state: $stateParams._backState,\n params: {\n defaultParams: $stateParams.backStateParams\n }\n };\n }],\n courseId: ['$stateParams', function ($stateParams) {\n return $stateParams.courseId;\n }],\n sessionId: ['$stateParams', function ($stateParams) {\n return $stateParams.sessionId;\n }],\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('courseResourceCatalog.CourseInfo.applyFormCreateByCourseSession'))\n }\n },\n {\n state: 'courseResourceCatalog.CourseInfo.SessionInfo',\n config: {\n parent: \"modules\",\n url: \"/courseResourceCatalog/:cid/course-info/:courseId/session-info/:enrollmentId?:nid\",\n template: '',\n params: {\n backState: 'courseResourceCatalog.CourseInfo'\n },\n resolve: Object.assign({\n catalogId: ['$stateParams', function( $stateParams ){\n return $stateParams.cid;\n }],\n courseId: ['$stateParams', function( $stateParams ){\n return $stateParams.courseId;\n }],\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }],\n nodeId: [ '$stateParams', function ($stateParams) {\n return $stateParams.nid;\n }],\n backState: ['$stateParams', function( $stateParams ){\n return $stateParams.backState;\n }]\n }, processMenu('courseResourceCatalog.CourseInfo.SessionInfo'))\n }\n },\n\n {\n state: 'courseResourceCatalog.ProgramInfo',\n config: {\n parent: \"modules\",\n url: \"/courseResourceCatalog/:cid/program-info/:programId?:nid\",\n template: '',\n params: {\n backState: 'courseResourceCatalog'\n },\n resolve: Object.assign({\n catalogId: [ '$stateParams', function ($stateParams) {\n return $stateParams.cid;\n }],\n nodeId: [ '$stateParams', function ($stateParams) {\n return $stateParams.nid;\n }],\n programId: [ '$stateParams', function ($stateParams) {\n return $stateParams.programId;\n }]\n }, processMenu('courseResourceCatalog.ProgramInfo'))\n }\n },\n\n {\n state: 'courseResourceCatalog.ProgramInfo.SessionInfo',\n config: {\n parent: \"modules\",\n url: \"/courseResourceCatalog/:cid/program-info/:programId/session-info/:enrollmentId?:nid\",\n template: '',\n params: {\n backState: 'courseResourceCatalog.ProgramInfo'\n },\n resolve: Object.assign({\n catalogId: ['$stateParams', function( $stateParams ){\n return $stateParams.cid;\n }],\n programId: ['$stateParams', function( $stateParams ){\n return $stateParams.programId;\n }],\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }],\n nodeId: [ '$stateParams', function ($stateParams) {\n return $stateParams.nid;\n }],\n backState: ['$stateParams', function( $stateParams ){\n return $stateParams.backState;\n }]\n }, processMenu('courseResourceCatalog.ProgramInfo.SessionInfo'))\n }\n },\n\n\n\n {\n state: 'supervisorZone',\n config: {\n abstract: true,\n url: \"/supervisor-zone\",\n parent: \"modules\",\n template : '',\n resolve: Object.assign({}, processMenu('supervisorZone')),\n data: {\n permissions: {\n only: ['Manager_Privilege', 'Deputy_Privilege', 'Approval_Privilege'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'supervisorZone.departmentDashboard',\n config: {\n url: \"/department-dashboard\",\n template: '',\n resolve: Object.assign({}, processMenu('supervisorZone.departmentDashboard')),\n data: {\n permissions: {\n only: ['Manager_Privilege'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'supervisorZone.approve',\n config: {\n url: \"/approve\",\n template: '',\n params: {\n defaultParams: null\n },\n resolve: Object.assign({\n defaultParams: ['$stateParams', function ($stateParams) {\n return $stateParams.defaultParams;\n }]\n }, processMenu('supervisorZone.approve')),\n data: {\n permissions: {\n only:['Manager_Privilege', 'Approval_Privilege'],\n all: ['Modules.approval'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'supervisorZone.approveExternalTrainingApplyRecordsFormEdit',\n config: {\n url: \"/approve/external-training-apply/edit/:externalId\",\n template: '',\n params: {\n backState: 'supervisorZone.approve',\n backStateParams: null\n },\n resolve: Object.assign({\n backStateObject: ['$stateParams', function ($stateParams) {\n return {\n state: $stateParams.backState,\n params: {\n defaultParams: $stateParams.backStateParams\n }\n };\n }],\n formType: [ '$stateParams', function ($stateParams) {\n return $stateParams.formType\n }],\n externalId: [ '$stateParams', function ($stateParams) {\n return $stateParams.externalId\n }],\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('supervisorZone.approveExternalTrainingApplyRecordsFormEdit'))\n }\n },\n {\n state: 'supervisorZone.approveExternalTrainingApplyRecordsFormView',\n config: {\n url: \"/approve/external-training-apply/view/:externalId\",\n template: '',\n params: {\n backState: 'supervisorZone.approve',\n backStateParams: null\n },\n resolve: Object.assign({\n backStateObject: ['$stateParams', function ($stateParams) {\n return {\n state: $stateParams.backState,\n params: {\n defaultParams: $stateParams.backStateParams\n }\n };\n }],\n formType: [ '$stateParams', function ($stateParams) {\n return $stateParams.formType\n }],\n externalId: [ '$stateParams', function ($stateParams) {\n return $stateParams.externalId\n }],\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('supervisorZone.approveExternalTrainingApplyRecordsFormView'))\n }\n },\n\n\n {\n state: 'supervisorZone.approveRecords',\n config: {\n url: \"/approve-records\",\n template: '',\n params: {\n defaultParams: null\n },\n resolve: Object.assign({\n defaultParams: ['$stateParams', function ($stateParams) {\n return $stateParams.defaultParams;\n }]\n }, processMenu('supervisorZone.approveRecords')),\n data: {\n permissions: {\n only:['Manager_Privilege', 'Approval_Privilege'],\n all: ['Modules.approval'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'supervisorZone.approveRecordsExternalTrainingApplyRecordsFormEdit',\n config: {\n url: \"/approve-records/external-training-apply/edit/:externalId\",\n template: '',\n params: {\n backState: 'supervisorZone.approveRecords',\n backStateParams: null\n },\n resolve: Object.assign({\n backStateObject: ['$stateParams', function ($stateParams) {\n return {\n state: $stateParams.backState,\n params: {\n defaultParams: $stateParams.backStateParams\n }\n };\n }],\n formType: [ '$stateParams', function ($stateParams) {\n return $stateParams.formType\n }],\n externalId: [ '$stateParams', function ($stateParams) {\n return $stateParams.externalId\n }],\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('supervisorZone.approveRecordsExternalTrainingApplyRecordsFormEdit'))\n }\n },\n {\n state: 'supervisorZone.approveRecordsExternalTrainingApplyRecordsFormView',\n config: {\n url: \"/approve-records/external-training-apply/view/:externalId\",\n template: '',\n params: {\n backState: 'supervisorZone.approveRecords',\n backStateParams: null\n },\n resolve: Object.assign({\n backStateObject: ['$stateParams', function ($stateParams) {\n return {\n state: $stateParams.backState,\n params: {\n defaultParams: $stateParams.backStateParams\n }\n };\n }],\n formType: [ '$stateParams', function ($stateParams) {\n return $stateParams.formType\n }],\n externalId: [ '$stateParams', function ($stateParams) {\n return $stateParams.externalId\n }],\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('supervisorZone.approveRecordsExternalTrainingApplyRecordsFormView'))\n }\n },\n\n {\n state: 'supervisorZone.trainingPlan',\n config: {\n url: \"/training-plan\",\n template: '',\n resolve: Object.assign({}, processMenu('supervisorZone.trainingPlan')),\n data: {\n permissions: {\n only: ['Deputy_Privilege', 'Manager_Privilege'],\n all: ['Modules.training_plan'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'supervisorZone.memberCurriculum',\n config: {\n url: \"/member-curriculum\",\n template: '',\n resolve: Object.assign({}, processMenu('supervisorZone.memberCurriculum')),\n data: {\n permissions: {\n all: ['Modules.course', 'Manager_Privilege'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'supervisorZone.trainingRecords',\n config: {\n url: \"/member-training-records\",\n template: '',\n resolve: Object.assign({}, processMenu('supervisorZone.trainingRecords')),\n data: {\n permissions: {\n all: ['Modules.course', 'Manager_Privilege'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'supervisorZone.trainingRecords.courseSessionInfo',\n config: {\n parent:'supervisorZone',\n url: \"/member-training-records/course-session-info/:enrollmentId\",\n template: '',\n resolve: Object.assign({\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }]\n }, processMenu('supervisorZone.trainingRecords.courseSessionInfo'))\n }\n },\n {\n state: 'supervisorZone.trainingRecords.programSessionInfo',\n config: {\n parent: \"supervisorZone\",\n url: \"/member-training-records/program-session-info/:enrollmentId\",\n template: '',\n resolve: Object.assign({\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }]\n }, processMenu('supervisorZone.trainingRecords.programSessionInfo'))\n }\n },\n {\n state: 'supervisorZone.memberSuggestLearningList',\n config: {\n url: \"/member-suggest-learning-list\",\n template: '',\n resolve: Object.assign({}, processMenu('supervisorZone.memberSuggestLearningList')),\n data: {\n permissions: {\n only: ['Manager_Privilege'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'supervisorZone.memberFinancialCertRecordSearch',\n config: {\n url: \"/member-financial-cert-record-search\",\n template: '',\n resolve: Object.assign({}, processMenu('supervisorZone.memberFinancialCertRecordSearch')),\n data: {\n permissions: {\n all: ['Modules.certification', 'Modules.certification.financial', 'Manager_Privilege'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'supervisorZone.memberCertRecordsSearch',\n config: {\n url: \"/member-cert-records-search\",\n template: '',\n resolve: Object.assign({}, processMenu('supervisorZone.memberCertRecordsSearch')),\n data: {\n permissions: {\n all: ['Modules.certification', 'Manager_Privilege'],\n only: ['Modules.certification.inner', 'Modules.certification.ext'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'supervisorZone.embaCalendar',\n config: {\n url: \"/emba-calendar\",\n template: '',\n resolve: Object.assign({}, processMenu('supervisorZone.embaCalendar')),\n data: {\n permissions: {\n all: ['Modules.EMBA', 'Manager_Privilege'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'supervisorZone.embaMustRead',\n config: {\n url: \"/emba-must-read\",\n template: '',\n resolve: Object.assign({}, processMenu('supervisorZone.embaMustRead')),\n data: {\n permissions: {\n all: ['Modules.EMBA', 'Manager_Privilege'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'learningPassport',\n config: {\n abstract: true,\n url: \"/learning-passport\",\n parent: \"modules\",\n template : '',\n resolve: Object.assign({}, processMenu('learningPassport')),\n data: {\n permissions: {\n only: ['Modules.core'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'learningPassport.learningDashboard',\n config: {\n url: \"/learning-dashboard\",\n parent: \"learningPassport\",\n template: '',\n resolve: Object.assign({}, processMenu('learningPassport.learningDashboard'))\n }\n },\n {\n state: 'learningPassport.incompleteCourses',\n config: {\n url: \"/incomplete-courses\",\n template: '',\n resolve: Object.assign({}, processMenu('learningPassport.incompleteCourses')),\n data: {\n permissions: {\n only: ['Modules.course.online','Modules.course.classroom','Modules.course.external'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'learningPassport.incompleteCourses.courseInfo',\n config: {\n parent: \"learningPassport\",\n url: \"/incomplete-courses/course-info/:enrollmentId\",\n template: '',\n params: {\n tabSelect: 'learningCenter'\n },\n resolve: Object.assign({\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }],\n tabSelect: ['$stateParams', function( $stateParams ){\n return $stateParams.tabSelect;\n }]\n }, processMenu('learningPassport.incompleteCourses.courseInfo'))\n }\n },\n {\n state: 'learningPassport.incompleteCourses.programInfo',\n config: {\n parent: \"learningPassport\",\n url: \"/incomplete-courses/program-info/:enrollmentId\",\n template: '',\n resolve: Object.assign({\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }]\n }, processMenu('learningPassport.incompleteCourses.programInfo'))\n }\n },\n {\n state: 'learningPassport.incompleteCourses.certificationInfo',\n config: {\n parent: \"learningPassport\",\n url: \"/incomplete-courses/certification-info/:enrollmentId\",\n template: '',\n resolve: Object.assign({\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }]\n }, processMenu('learningPassport.incompleteCourses.certificationInfo'))\n }\n },\n {\n state: 'learningPassport.incompleteCourses.programInfo.courseInfo',\n config: {\n parent: \"learningPassport\",\n url: \"/incomplete-courses/program/:programEnrollmentId/course-info/:enrollmentId\",\n template: '',\n params: {\n tabSelect:null,\n backState: 'learningPassport.incompleteCourses.programInfo'\n },\n resolve: Object.assign({\n backState: ['$stateParams', function( $stateParams ){\n return $stateParams.backState;\n }],\n programEnrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.programEnrollmentId;\n }],\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }],\n tabSelect: ['$stateParams', function( $stateParams ){\n return $stateParams.tabSelect;\n }]\n }, processMenu('learningPassport.incompleteCourses.programInfo.courseInfo'))\n }\n },\n {\n state: 'learningPassport.testQuestionnaireCenter',\n config: {\n url: \"/test-questionnaire-center\",\n template: '',\n resolve: Object.assign({}, processMenu('learningPassport.testQuestionnaireCenter')),\n data: {\n permissions: {\n only: ['Modules.course.onlinetest','Modules.course.classroomtest','Modules.course.survey'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'learningPassport.testQuestionnaireCenter.courseInfo',\n config: {\n parent: \"learningPassport\",\n url: \"/incomplete-test-questionnaire/course-info/:enrollmentId\",\n template: '',\n resolve: Object.assign({\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }]\n }, processMenu('learningPassport.testQuestionnaireCenter.courseInfo'))\n }\n },\n {\n state: 'learningPassport.myCurriculum',\n config: {\n url: \"/my-curriculum\",\n template: '',\n resolve: Object.assign({}, processMenu('learningPassport.myCurriculum'))\n }\n },\n {\n state: 'learningPassport.myCurriculum.courseSessionInfo',\n config: {\n parent: \"learningPassport\",\n url: \"/course-learning-resource/course-session-info/:enrollmentId\",\n template: '',\n resolve: Object.assign({\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }]\n }, processMenu('learningPassport.myCurriculum.courseSessionInfo'))\n }\n },\n {\n state: 'learningPassport.myCurriculum.programSessionInfo',\n config: {\n parent: \"learningPassport\",\n url: \"/course-learning-resource/program-session-info/:enrollmentId\",\n template: '',\n resolve: Object.assign({\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }]\n }, processMenu('learningPassport.myCurriculum.programSessionInfo'))\n }\n },\n {\n state: 'learningPassport.approveRecords',\n config: {\n url: \"/approve-records\",\n template: '',\n params: {\n defaultParams: null\n },\n resolve: Object.assign({\n defaultParams: ['$stateParams', function ($stateParams) {\n return $stateParams.defaultParams;\n }]\n }, processMenu('learningPassport.approveRecords')),\n data: {\n permissions: {\n only: ['Modules.approval'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n\n {\n state: 'learningPassport.approveRecordsExternalTrainingApplyRecordsFormEdit',\n config: {\n url: \"/approve-records/external-training-apply/edit/:externalId\",\n template: '',\n params: {\n backState: 'learningPassport.approveRecords',\n backStateParams: null\n },\n resolve: Object.assign({\n backStateObject: ['$stateParams', function ($stateParams) {\n return {\n state: $stateParams.backState,\n params: {\n defaultParams: $stateParams.backStateParams\n }\n };\n }],\n formType: [ '$stateParams', function ($stateParams) {\n return $stateParams.formType\n }],\n externalId: [ '$stateParams', function ($stateParams) {\n return $stateParams.externalId\n }],\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('learningPassport.approveRecordsExternalTrainingApplyRecordsFormEdit'))\n }\n },\n {\n state: 'learningPassport.approveRecordsExternalTrainingApplyRecordsFormReSubmit',\n config: {\n url: \"/approve-records/external-training-apply/re-submit/:externalId\",\n template: '',\n params: {\n backState: 'learningPassport.approveRecords',\n backStateParams: null\n },\n resolve: Object.assign({\n backStateObject: ['$stateParams', function ($stateParams) {\n return {\n state: $stateParams.backState,\n params: {\n defaultParams: $stateParams.backStateParams\n }\n };\n }],\n formType: [ '$stateParams', function ($stateParams) {\n return $stateParams.formType\n }],\n externalId: [ '$stateParams', function ($stateParams) {\n return $stateParams.externalId\n }],\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('learningPassport.approveRecordsExternalTrainingApplyRecordsFormReSubmit'))\n }\n },\n {\n state: 'learningPassport.approveRecordsExternalTrainingApplyRecordsFormView',\n config: {\n url: \"/approve-records/external-training-apply/view/:externalId\",\n template: '',\n params: {\n backState: 'learningPassport.approveRecords',\n backStateParams: null\n },\n resolve: Object.assign({\n backStateObject: ['$stateParams', function ($stateParams) {\n return {\n state: $stateParams.backState,\n params: {\n defaultParams: $stateParams.backStateParams\n }\n };\n }],\n formType: [ '$stateParams', function ($stateParams) {\n return $stateParams.formType\n }],\n externalId: [ '$stateParams', function ($stateParams) {\n return $stateParams.externalId\n }],\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('learningPassport.approveRecordsExternalTrainingApplyRecordsFormView'))\n }\n },\n\n\n {\n state: 'learningPassport.trainingRecords',\n config: {\n url: \"/training-records\",\n template: '',\n resolve: Object.assign({}, processMenu('learningPassport.trainingRecords'))\n }\n },\n {\n state: 'learningPassport.trainingRecords.courseSessionInfo',\n config: {\n parent: \"learningPassport\",\n url: \"/course-learning-resource/course-session-info/:enrollmentId\",\n template: '',\n params: {\n backState: 'learningPassport.trainingRecords'\n },\n resolve: Object.assign({\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }]\n }, processMenu('learningPassport.trainingRecords.courseSessionInfo'))\n }\n },\n {\n state: 'learningPassport.trainingRecords.programSessionInfo',\n config: {\n parent: \"learningPassport\",\n url: \"/course-learning-resource/program-session-info/:enrollmentId\",\n template: '',\n resolve: Object.assign({\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }]\n }, processMenu('learningPassport.trainingRecords.programSessionInfo')),\n params: {\n backState: 'learningPassport.trainingRecords'\n }\n }\n },\n {\n state: 'learningPassport.trainingRoadMap',\n config: {\n url: '/training-road-map',\n template: '',\n resolve: Object.assign({}, processMenu('learningPassport.trainingRoadMap')),\n data: {\n permissions: {\n only: ['Modules.training_roadmap'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'learningPassport.trainingPlan',\n config: {\n url: \"/training-plan\",\n parent: \"learningPassport\",\n template: '',\n resolve: Object.assign({}, processMenu('learningPassport.trainingPlan')),\n data: {\n permissions: {\n only: ['Modules.training_plan'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n\n {\n state: 'myCalendar',\n config: {\n url: \"/my-calendar\",\n parent: \"modules\",\n template : ''\n // resolve: Object.assign({}, processMenu('myCalendar'))\n }\n },\n {\n state: 'mySetting',\n config: {\n url: \"/my-setting\",\n parent: \"modules\",\n template : ''\n // resolve: Object.assign({}, processMenu('mySetting'))\n }\n },\n\n {\n state: 'reportsZone',\n config: {\n parent: \"modules\",\n url: \"/reports\",\n template: '',\n resolve: Object.assign({}, processMenu('reportsZone')),\n params: {\n id:'',\n url: ''\n },\n data: {\n permissions: {\n only: ['Modules.report'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'communityDiscussionZone',\n config: {\n abstract: true,\n url: \"/community-discussion-zone\",\n parent: \"modules\",\n template : '',\n resolve: Object.assign({}, processMenu('communityDiscussionZone'))\n }\n },\n {\n state: 'communityDiscussionZone.publicDiscussionZone',\n config: {\n url: \"/public-discussion-zone\",\n template: '',\n resolve: Object.assign({}, processMenu('communityDiscussionZone.publicDiscussionZone')),\n params: {\n url: 'mvnforum/index'\n }\n }\n },\n {\n state: 'communityDiscussionZone.classesDiscussionZone',\n config: {\n url: \"/classes-discussion-zone\",\n template: '',\n resolve: Object.assign({}, processMenu('communityDiscussionZone.classesDiscussionZone')),\n params: {\n url: 'mvnforum/listcourseforums'\n }\n }\n },\n\n {\n state: 'externalTrainingZone',\n config: {\n abstract: true,\n url: \"/external-training-zone\",\n parent: \"modules\",\n template : '',\n resolve: Object.assign({}, processMenu('externalTrainingZone')),\n data: {\n permissions: {\n only: ['Modules.course.external'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n\n {\n state: 'externalTrainingZone.externalTrainingApplyFormCreate',\n config: {\n url: \"/external-training-form/create\",\n template: '',\n resolve: Object.assign({\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('externalTrainingZone.externalTrainingApplyFormCreate'))\n }\n },\n\n {\n state: 'externalTrainingZone.externalTrainingBulletin',\n config: {\n url: \"/external-training-bulletin\",\n template: '',\n params: {\n defaultParams: null\n },\n resolve: Object.assign({\n defaultParams: ['$stateParams', function ($stateParams) {\n return $stateParams.defaultParams;\n }]\n }, processMenu('externalTrainingZone.externalTrainingBulletin'))\n }\n },\n {\n state: 'externalTrainingZone.externalTrainingBulletinApplyFormCreateByBulletin',\n config: {\n url: \"/external-training-bulletin/:bulletinId/create-external-training-form\",\n template: '',\n params: {\n backState: 'externalTrainingZone.externalTrainingBulletin',\n backStateParams: null\n },\n resolve: Object.assign({\n backStateObject: ['$stateParams', function ($stateParams) {\n return {\n state: $stateParams.backState,\n params: {\n defaultParams: $stateParams.backStateParams\n }\n };\n }],\n bulletinId: ['$stateParams', function ($stateParams) {\n return $stateParams.bulletinId;\n }],\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('externalTrainingZone.externalTrainingBulletinApplyFormCreateByBulletin'))\n }\n },\n {\n state: 'externalTrainingZone.externalTrainingBulletinApplyFormCreateByCourseSession',\n config: {\n url: \"/external-training-bulletin/course/:courseId/session/:sessionId/create-external-training-form\",\n template: '',\n params: {\n backState: 'externalTrainingZone.externalTrainingBulletin',\n backStateParams: null\n },\n resolve: Object.assign({\n backStateObject: ['$stateParams', function ($stateParams) {\n return {\n state: $stateParams.backState,\n params: {\n defaultParams: $stateParams.backStateParams\n }\n };\n }],\n courseId: ['$stateParams', function ($stateParams) {\n return $stateParams.courseId;\n }],\n sessionId: ['$stateParams', function ($stateParams) {\n return $stateParams.sessionId;\n }],\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('externalTrainingZone.externalTrainingBulletinApplyFormCreateByCourseSession'))\n }\n },\n\n\n {\n state: 'externalTrainingZone.externalTrainingApplyRecords',\n config: {\n url: \"/external-training-apply-records\",\n template: '',\n params: {\n defaultParams: null\n },\n resolve: Object.assign({\n defaultParams: ['$stateParams', function ($stateParams) {\n return $stateParams.defaultParams;\n }]\n }, processMenu('externalTrainingZone.externalTrainingApplyRecords'))\n }\n },\n\n {\n state: 'externalTrainingZone.externalTrainingApplyRecordsFormEdit',\n config: {\n url: \"/external-training-apply-records/edit/:externalId\",\n template: '',\n params: {\n backState: 'externalTrainingZone.externalTrainingApplyRecords',\n backStateParams: null\n },\n resolve: Object.assign({\n backStateObject: ['$stateParams', function ($stateParams) {\n return {\n state: $stateParams.backState,\n params: {\n defaultParams: $stateParams.backStateParams\n }\n };\n }],\n formType: [ '$stateParams', function ($stateParams) {\n return $stateParams.formType\n }],\n externalId: [ '$stateParams', function ($stateParams) {\n return $stateParams.externalId\n }],\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('externalTrainingZone.externalTrainingApplyRecordsFormEdit'))\n }\n },\n {\n state: 'externalTrainingZone.externalTrainingApplyRecordsFormView',\n config: {\n url: \"/external-training-apply-records/view/:externalId\",\n template: '',\n params: {\n backState: 'externalTrainingZone.externalTrainingApplyRecords',\n backStateParams: null\n },\n resolve: Object.assign({\n backStateObject: ['$stateParams', function ($stateParams) {\n return {\n state: $stateParams.backState,\n params: {\n defaultParams: $stateParams.backStateParams\n }\n };\n }],\n formType: [ '$stateParams', function ($stateParams) {\n return $stateParams.formType\n }],\n externalId: [ '$stateParams', function ($stateParams) {\n return $stateParams.externalId\n }],\n loadPlugin: ['$ocLazyLoad', function( $ocLazyLoad ){\n return $ocLazyLoad.load(['stepFormWizard']);\n }]\n }, processMenu('externalTrainingZone.externalTrainingApplyRecordsFormView'))\n }\n },\n\n {\n state: 'certZone',\n config: {\n abstract: true,\n url: \"/cert-zone\",\n parent: \"modules\",\n template : '',\n resolve: Object.assign({}, processMenu('certZone')),\n data: {\n permissions: {\n only: ['Modules.certification', 'Modules.certification.ext', 'Modules.certification.inner'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'certZone.externalCertRegister',\n config: {\n url: \"/external-cert-register\",\n template: '',\n resolve: Object.assign({}, processMenu('certZone.externalCertRegister')),\n data: {\n permissions: {\n only: ['Modules.certification.ext'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'certZone.externalCertExamApplication',\n config: {\n url: \"/external-cert-exam-application\",\n template: '',\n resolve: Object.assign({}, processMenu('certZone.externalCertExamApplication')),\n data: {\n permissions: {\n only: ['Modules.certification.ext'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'certZone.externalCertExamAllowanceApplication',\n config: {\n url: \"/external-cert-exam-allowance-application\",\n template: '',\n resolve: Object.assign({}, processMenu('certZone.externalCertExamAllowanceApplication')),\n data: {\n permissions: {\n only: ['Modules.certification.ext'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'certZone.externalCertQualifyRewardApplication',\n config: {\n url: \"/external-cert-qualify-reward-application\",\n template: '',\n resolve: Object.assign({}, processMenu('certZone.externalCertQualifyRewardApplication')),\n data: {\n permissions: {\n only: ['Modules.certification.ext'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'certZone.externalCertApplicationRecordsSearch',\n config: {\n url: \"/external-cert-application-records-search\",\n template: '',\n resolve: Object.assign({}, processMenu('certZone.externalCertApplicationRecordsSearch')),\n data: {\n permissions: {\n only: ['Modules.certification.ext'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'certZone.certRecordsSearch',\n config: {\n url: \"/cert-records-search\",\n template: '',\n resolve: Object.assign({}, processMenu('certZone.certRecordsSearch')),\n data: {\n permissions: {\n only: ['Modules.certification.ext', 'Modules.certification.inner'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'certZone.financialCertRecordApplication',\n config: {\n url: \"/financial-cert-record-application\",\n template: '',\n resolve: Object.assign({}, processMenu('certZone.financialCertRecordApplication')),\n data: {\n permissions: {\n only: ['Modules.certification.financial'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n {\n state: 'certZone.financialCertRecordSearch',\n config: {\n url: \"/financial-cert-record-search\",\n template: '',\n resolve: Object.assign({}, processMenu('certZone.financialCertRecordSearch')),\n data: {\n permissions: {\n only: ['Modules.certification.financial'],\n redirectTo: {\n default: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: ''\n }\n };\n }\n }\n }\n }\n }\n },\n\n {\n state: 'error',\n config: {\n url: '/error/:id',\n templateUrl: \"app/shared/views/error.html\",\n controller: 'ErrorController',\n controllerAs: 'vm',\n resolve: Object.assign({}, processMenu('error'))\n }\n },\n {\n state: 'login',\n config: {\n url: '/login?:pid&:siteMapContext',\n templateUrl: \"app/shared/views/login.html\",\n controller: 'LoginController',\n controllerAs: 'vm',\n resolve: {\n loadPlugin: ['$ocLazyLoad', function ($ocLazyLoad) {\n return $ocLazyLoad.load([\n 'theme-plugins'\n ]);\n }],\n skipIfLoggedIn: ['$auth', '$stateParams', function ($auth, $stateParams) {\n if(angular.isUndefinedOrNull($stateParams.pid) || $stateParams.pid==='')\n return $auth.skipIfLoggedIn();\n }],\n loginSitemapRequired:['sitemapService', '$cookies', '$stateParams', function(sitemapService, $cookies, $stateParams){\n if(angular.isUndefinedOrNull($stateParams.pid) || $stateParams.pid==='') {\n var companyName = (angular.isUndefinedOrNull($cookies.get('Company')) || $cookies.get('Company')==='')?$stateParams.siteMapContext:$cookies.get('Company');\n return sitemapService.loginSitemapRequired({ companyName: companyName});\n }\n else\n return sitemapService.loginSitemapPreviewRequired({projectId: $stateParams.pid});\n }]\n }\n }\n },\n {\n state: 'logout',\n config: {\n url: '/logout',\n template: null,\n // resolve: Object.assign({}, processMenu('logout')),\n controller: 'LogoutController',\n controllerAs: 'vm'\n }\n },\n {\n state: 'index',\n config: {\n url: \"/\",\n parent: \"modules\",\n template : '',\n resolve: Object.assign({}, processMenu('index')),\n data: {\n permissions: {\n only: ['Modules.core'],\n redirectTo: function(/*rejectedPermission, transitionProperties*/){\n return {\n state: 'modules.error',\n params: {\n type: 'one'\n }\n };\n }\n }\n }\n }\n },\n\n {\n state: 'testQuestionnaire',\n config: {\n url: \"/test-questionnaire/item-id/:itemId/session-id/:sessionId\",\n template: '',\n resolve: Object.assign({\n loginRequired: ['$auth', function ($auth) {\n return $auth.loginRequired();\n }],\n loadPlugin: ['$ocLazyLoad', function ($ocLazyLoad) {\n return $ocLazyLoad.load([\n 'theme-plugins'\n ]);\n }],\n itemId: ['$stateParams', function ($stateParams) {\n return $stateParams.itemId;\n }],\n sessionId: ['$stateParams', function ($stateParams) {\n return $stateParams.sessionId;\n }]\n }, processMenu('testQuestionnaire'))\n }\n },\n\n {\n state: 'evaluationSurvey',\n config: {\n url: \"/evaluation-survey/relation-id/:relationId/survey-id/:surveyId\",\n template: '',\n resolve: Object.assign({\n loginRequired: ['$auth', function ($auth) {\n return $auth.loginRequired();\n }],\n loadPlugin: ['$ocLazyLoad', function ($ocLazyLoad) {\n return $ocLazyLoad.load([\n 'theme-plugins'\n ]);\n }],\n relationId: ['$stateParams', function ($stateParams) {\n return $stateParams.relationId;\n }],\n surveyId: ['$stateParams', function ($stateParams) {\n return $stateParams.surveyId;\n }]\n }, processMenu('evaluationSurvey'))\n }\n },\n\n {\n state: 'courseInfo',\n config: {\n url: \"/incomplete-courses/course-info/:enrollmentId\",\n template: '',\n params: {\n tabSelect:null\n },\n resolve: Object.assign({\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }],\n tabSelect: ['$stateParams', function( $stateParams ){\n return $stateParams.tabSelect;\n }]\n }, processMenu('courseInfo'))\n }\n },\n {\n state: 'programInfo',\n config: {\n url: \"/incomplete-courses/program-info/:enrollmentId\",\n template: '',\n resolve: Object.assign({\n enrollmentId: ['$stateParams', function( $stateParams ){\n return $stateParams.enrollmentId;\n }]\n }, processMenu('programInfo'))\n }\n },\n {\n state: 'learningDashboardDialog',\n config: {\n url: \"/learning-passport/learning-dashboard/dialog?:pid\",\n template: '',\n resolve: Object.assign({\n loadPlugin: ['$ocLazyLoad', function ($ocLazyLoad) {\n return $ocLazyLoad.load([\n 'theme-plugins'\n ]);\n }]\n }, processMenu('learningDashboardDialog'))\n }\n },\n {\n state: 'systemInfo',\n config: {\n url: '/system-info',\n template: ''\n // resolve: Object.assign({}, processMenu('systemInfo'))\n }\n }\n ];\n\n angular.module('eHRD.modules.routing')\n .constant('modulesRouteConfig', modulesRouteConfig);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/14.\n */\n\n(function () {\n 'use strict';\n\n var mailLinkRouteConfig = [\n {\n state: 'mailLink',\n config: {\n url: \"/mail-link/link-type/:linkType\",\n template : '',\n title: 'MAIL_LINK',\n resolve: {\n loginRequired: ['$auth', '$stateParams', function ($auth, $stateParams) {\n return $auth.loginRequired($stateParams.pid);\n }]\n }\n }\n },\n {\n state: 'mailLink.course',\n config: {\n url: \"/course/:courseId\",\n template : '',\n title: 'MAIL_LINK'\n }\n },\n {\n state: 'mailLink.course.session',\n config: {\n url: \"/session/:sessionId\",\n template : '',\n title: 'MAIL_LINK'\n }\n },\n {\n state: 'mailLink.course.session.user',\n config: {\n url: \"/user/:userId\",\n template : '',\n title: 'MAIL_LINK'\n }\n },\n {\n state: 'mailLink.program',\n config: {\n url: \"/program/:programId\",\n template : '',\n title: 'MAIL_LINK'\n }\n },\n {\n state: 'mailLink.program.session',\n config: {\n url: \"/session/:sessionId\",\n template: '',\n title: 'MAIL_LINK'\n }\n },\n {\n state: 'mailLink.program.session.user',\n config: {\n url: \"/user/:userId\",\n template : '',\n title: 'MAIL_LINK'\n }\n }\n ];\n\n angular.module('eHRD.modules.routing')\n .constant('mailLinkRouteConfig', mailLinkRouteConfig);\n\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.reports', []);\n\n})();\n\n/**\n * Created by Bruce on 2016/5/18.\n */\n\n(function () {\n 'use strict';\n\n reportsService.$inject = ['Restangular'];\n function reportsService( Restangular) {\n\n /*\n * Build collection\n *api/learning-resource/folder/{ folderId }/userlist\n * ? keyword={ keyword }&sort={ sort }&order={ order }¤t_page={ currentPage }&list_size={ listSize }\n */\n var _reportsService = Restangular.all('report');\n\n return{\n\n menuNodes: function () {\n // GET /api/report/nodes\n return _reportsService\n .customGETLIST('nodes');\n }\n };\n\n }\n\n angular.module('eHRD.modules.reports')\n .factory('reportsService',reportsService)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/6/22.\n */\n(function () {\n 'use strict';\n\n ReportsMenuController.$inject = ['reportsService'];\n function ReportsMenuController(reportsService) {\n var vm = this;\n reportsService.menuNodes().then(function (data) {\n vm.menu = data;\n });\n\n\n }\n\n angular\n .module('eHRD.modules.reports')\n .controller('ReportsMenuController', ReportsMenuController)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var learningReports = {\n bindings: {},\n templateUrl: 'app/modules/reports/views/learning-reports.html',\n controller: ['$stateParams', 'serverSetting', function( $stateParams, serverSetting ){\n var vm = this;\n if($stateParams.url.length > 0){\n if ( ($stateParams.url.lastIndexOf('http://', 0) === 0) || ($stateParams.url.lastIndexOf('https://', 0) === 0) )\n vm.url = $stateParams.url;\n else\n vm.url = serverSetting.baseConfig.baseURL + '/' + $stateParams.url;\n }\n }]\n };\n\n angular.module('eHRD.modules.reports')\n .component('learningReports', learningReports);\n})();\n\n/**\n * Created by Bruce on 2017/7/31.\n */\n\n(function() {\n 'use strict';\n\n var learningReportsMenu = {\n bindings: {\n catalogId: '=?catalogId',\n nodeId: '=?nodeId'\n },\n templateUrl: 'app/modules/reports/views/learning-reports-menu.html',\n controller: [ 'reportsService', '$state', '$filter', 'serverSetting', 'sitemapService', function( reportsService, $state, $filter, serverSetting, sitemapService) {\n var vm = this;\n vm.previousMenu = undefined;\n vm.mainMenu = undefined;\n\n vm.process = function() {\n sitemapService.getSiteMapNodes().walk(function (node) {\n if(angular.isDefined(node.model.stateParams) && angular.isDefined(node.model.stateParams['mid']) && (node.model.stateParams['mid'] === $state.params['mid'])){\n vm.mainMenu = node.model;\n if ((node.getPath().length -2) > 0) {\n vm.previousMenu = node.getPath()[(node.getPath().length -2)];\n }\n }\n });\n\n if(!vm.previousMenu) {\n sitemapService.getSiteMapNodes().walk(function (node) {\n if(node.model.state === 'index') {\n vm.previousMenu = node;\n }\n });\n }\n };\n\n if(sitemapService.getMenu().length > 0) {\n vm.process();\n } else {\n sitemapService.getProjectSideMenu().then(function (menuItems) {\n sitemapService.setMenu(menuItems);\n vm.process();\n });\n }\n\n reportsService.menuNodes().then(function (data) {\n vm.menu = data;\n });\n }]\n };\n\n angular.module('eHRD.modules.reports')\n .component('learningReportsMenu', learningReportsMenu);\n})();\n\n/**\n * Created by Bruce on 2016/10/20.\n */\n\n(function () {\n 'use strict';\n\n managerService.$inject = ['Restangular', '$httpParamSerializer'];\n function managerService(Restangular, $httpParamSerializer){\n\n var _ManagerService = Restangular.all('manager');\n\n return {\n getMemberTrainingRecords: function (params) {\n /*\n * api/manager/member-finished-enrollment\n * */\n return _ManagerService\n .customGETLIST('member-finished-enrollment', params);\n },\n getUnAssignableMmembers: function(isProgram, sessionId, params){\n /*\n * type: course\n * api/manager/unassignable-course/{sessionId}/members\n * type: program\n * api/manager/unassignable-program/{sessionId}/members\n * */\n if(isProgram){\n return _ManagerService\n .one('unassignable-program', sessionId)\n .customGETLIST('members', params);\n }else {\n return _ManagerService\n .one('unassignable-course', sessionId)\n .customGETLIST('members', params);\n }\n },\n UnAssignable: function (isProgram, sessionId, params) {\n /*\n * type: course\n * api/manager/unassign-course/{sessionId}\n * type: program\n * api/manager/unassign-program/{sessionId}\n * */\n if(isProgram){\n return _ManagerService\n .one('unassign-program', sessionId)\n .put(params);\n }else{\n return _ManagerService\n .one('unassign-course', sessionId)\n .put(params);\n }\n },\n\n getMemberCurriculum: function (formData) {\n /*\n * POST api/manager/member-course\n * */\n return _ManagerService\n .customPOST($httpParamSerializer(formData), 'member-course', [], {\"content-type\": \"application/x-www-form-urlencoded\"});\n },\n\n getMemberCurriculumDetail: function (params) {\n /*\n * GET api/manager/member-course-detail\n * */\n return _ManagerService\n .customGETLIST('member-course-detail', params);\n },\n\n getMemberDownloadDetail: function (params) {\n /*\n * GET api/manager/member-download-detail\n * */\n return _ManagerService\n .customGETLIST('member-download-detail', params);\n },\n\n getMemberLearningHistory: function (enrollmentId) {\n /*\n * GET api/manager/member-learning-history/{enrollmentId}\n * */\n return _ManagerService\n .one('member-learning-history', enrollmentId)\n .get();\n },\n\n getCourses: function (params) {\n /*\n * GET api/manager/category-activity\n * */\n return _ManagerService\n .customGETLIST('category-activity', params);\n },\n\n getDirectMembers: function (sessionId, params, isProgram) {\n /*\n * GET api/manager/assignable-course/{sessionId}/direct-members\n * GET api/manager/assignable-program/{sessionId}/direct-members\n * */\n isProgram = isProgram || false;\n if(isProgram){\n return _ManagerService\n .one('assignable-program', sessionId)\n .customGETLIST('direct-members', params);\n }else{\n return _ManagerService\n .one('assignable-course', sessionId)\n .customGETLIST('direct-members', params);\n }\n },\n\n getMembersByFilters: function (sessionId, params, isProgram) {\n /*\n * GET api/manager/assignable-course/{sessionId}/members\n * GET api/manager/assignable-program/{sessionId}/members\n * */\n isProgram = isProgram || false;\n if(isProgram){\n return _ManagerService\n .one('assignable-program', sessionId)\n .customGETLIST('members', params);\n }else{\n return _ManagerService\n .one('assignable-course', sessionId)\n .customGETLIST('members', params);\n }\n\n },\n\n getMemberSuggestLearningList: function (params) {\n /*\n * GET api/manager/recommen-learning-map?lmYearBegin={lmYearBegin}&lmMonthBegin={lmMonthBegin}&lmYearEnd={lmYearEnd}&lmMonthEnd={lmMonthEnd}&\n sourceType={sourceType}&memberId={memberId}&searchStatus={searchStatus}&sort={sort}&order={order}¤t_page={current_page}&list_size={list_size}\n * */\n return _ManagerService\n .customGETLIST('recommen-learning-map',params);\n },\n\n updateMemberSuggestLearningList: function (formData, params) {\n /*\n * api/manager/recommen-learning-map/update\n * */\n return _ManagerService\n .one('recommen-learning-map')\n .customPUT($httpParamSerializer(formData), 'update', params, {\"content-type\": \"application/x-www-form-urlencoded\"});\n },\n\n deleteMemberSuggestLearningList: function (formData, params) {\n /*\n * api/manager/recommen-learning-map/delete\n * */\n return _ManagerService\n .one('recommen-learning-map')\n .customOperation('remove', 'delete', params, {\"content-type\": \"application/x-www-form-urlencoded\"}, $httpParamSerializer(formData));\n },\n\n addMemberSuggestLearningList: function (formData, params) {\n /*\n * api/manager/recommen-learning-map/add-view-item?userId={userId}\n * */\n return _ManagerService\n .one('recommen-learning-map')\n .customPOST({\"addViewItems\": formData}, 'add-view-item', params, {'Content-Type': 'application/json'});\n },\n\n deleteMemberSuggestLearningTemp: function (params) {\n /*\n * api/manager/recommen-learning-map/delete-temp?userId={userId}\n * */\n return _ManagerService\n .one('recommen-learning-map')\n .customDELETE('delete-temp', params);\n },\n\n getMemberSuggestLearningTemp: function (formData, params) {\n /*\n * api/manager/recommen-learning-map/view-temp-items\n * */\n return _ManagerService\n .one('recommen-learning-map')\n .customPOST({\"viewItems\": formData}, 'view-temp-items', params, {'Content-Type': 'application/json'});\n },\n\n AssignablePrecheck: function (isProgram, sessionId, params) {\n /*\n * type: course\n * api/manager/assign-course-precheck/{sessionId}?memberIds={memberIds}&enrollType={enrollType}\n * type: program\n * api/manager/assign-program-precheck/{sessionId}?memberIds={memberIds}&enrollType={enrollType}\n * */\n if(isProgram){\n return _ManagerService\n .one('assign-program-precheck', sessionId)\n .customGET(null, params);\n }else {\n return _ManagerService\n .one('assign-course-precheck', sessionId)\n .customGET(null, params);\n }\n },\n\n Assignable: function (isProgram, sessionId, params) {\n /*\n * type: course\n * api/manager/assign-course/{sessionId}\n * type: program\n * api/manager/assign-program/{sessionId}\n * */\n if(isProgram){\n return _ManagerService\n .one('assign-program', sessionId)\n .put(params);\n }else{\n return _ManagerService\n .one('assign-course', sessionId)\n .put(params);\n }\n },\n\n AssignableExternalCourse: function (sessionId, params) {\n /*\n * type: course\n * api/manager/assign-ext-course/{sessionId}\n * */\n return _ManagerService\n .one('assign-ext-course', sessionId)\n .put(params);\n },\n\n getTestHistory: function (sessionId, params) {\n /*\n * api/manager/exam/{sessionId}/exam-history?itemid={itemId}&startDate={startDate}&endDate={endDate}&userId={userId}\n * */\n return _ManagerService\n .one('exam', sessionId)\n .customGETLIST('exam-history', params);\n },\n\n getExamResult: function (sessionId, params) {\n /*\n * api/manager/exam/{sessionId}/result-info?itemid={itemId}&examhistoryId={examHistoryId}&userId={userId}\n * */\n return _ManagerService\n .one('exam', sessionId)\n .customGET('result-info', params);\n },\n\n getExamQuestionsReview: function (sessionId, params) {\n /*\n * api/manager/exam/{sessionId}/review-response?itemid={itemId}&examhistoryId={examHistoryId}&show-incorrect={showInCorrect}&userId={userId}\n * */\n return _ManagerService\n .one('exam', sessionId)\n .customGETLIST('review-response', params);\n },\n\n getReportProcess: function (enrollmentId, params) {\n /*\n * api/manager/member-learning-history/{enrollmentId}/report-process?isCourse={isCourse}\n * */\n return _ManagerService\n .one('member-learning-history', enrollmentId)\n .customGET('report-process', params);\n }\n\n\n };\n\n }\n\n\n angular.module('eHRD.modules.manager')\n .factory('managerService', managerService);\n})();\n\n/**\n * Created by Bruce on 2016/10/21.\n */\n(function() {\n 'use strict';\n\n MemberTrainingRecordsSearchDialogController.$inject = ['$scope', '$mdDialog','filters', 'PermPermissionStore', 'groups', 'groupMembers', 'userProfiles', 'SweetAlert', '$filter'];\n\n function MemberTrainingRecordsSearchDialogController($scope, $mdDialog, filters, PermPermissionStore, groups, groupMembers, userProfiles, SweetAlert, $filter) {\n var vm = this;\n var initializing = true;\n var permission = null;\n permission = PermPermissionStore.getPermissionDefinition('Modules.curriculum');\n vm.hasCurriculumPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.certification.inner');\n vm.hasCertificationInnerPermission = angular.isDefined(permission);\n\n vm.groups = groups;\n vm.groupMembers = groupMembers;\n vm.filters = {\n keyword: angular.isDefined(filters.keyword) ? filters.keyword : '',\n cpType: angular.isDefined(filters.cpType) ? filters.cpType : 1,\n passResult: angular.isDefined(filters.passResult) ? filters.passResult : -1,\n learnerType: angular.isDefined(filters.learnerType) ? filters.learnerType : -1,\n groupId: angular.isDefined(filters.groupId) ? filters.groupId : ( groups.length>0 ? groups[0].groupId : -1),\n memberId: userProfiles.uid\n };\n\n $scope.$watch('MTRSDC.filters.groupId', function() {\n if(initializing)\n initializing=false;\n else\n vm.filters.memberId=\"\";\n });\n\n vm.cancel = function() {\n $mdDialog.hide({});\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n vm.submit = function(filters) {\n if(vm.filters.memberId===\"\")\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_PLEASE_SELECT_DEPARTMENT_MEMBER'));\n else\n $mdDialog.hide(filters);\n };\n }\n\n angular.module('eHRD.modules.manager')\n .controller('MemberTrainingRecordsSearchDialogController', MemberTrainingRecordsSearchDialogController);\n})();\n\n/**\n * Created by Alan on 2016/11/24.\n */\n(function() {\n 'use strict';\n\n MemberDownloadDetailDialogController.$inject = ['managerService','params','$mdDialog'];\n\n function MemberDownloadDetailDialogController(managerService,params,$mdDialog) {\n var vm = this;\n\n managerService.getMemberDownloadDetail(params).then(function (downloadDetails) {\n vm.downloadDetails = downloadDetails;\n vm.courseName = downloadDetails.metadata.courseName;\n vm.sessionName = downloadDetails.metadata.sessionName;\n });\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }\n\n angular.module('eHRD.modules.manager')\n .controller('MemberDownloadDetailDialogController', MemberDownloadDetailDialogController);\n})();\n\n/**\n * Created by Alan on 2016/11/2.\n */\n(function() {\n 'use strict';\n\n memberCurriculumSearchDialogController.$inject = ['$scope','$mdDialog', 'NgTableParams', 'managerService', 'SweetAlert', 'filters', '$filter'];\n\n function memberCurriculumSearchDialogController($scope,$mdDialog, NgTableParams, managerService, SweetAlert, filters, $filter) {\n var vm = this;\n\n vm.isQueryAllDate = filters.isQueryAllDate;\n vm.isListAll = filters.isListAll;\n vm.keyword = filters.keyword;\n vm.sDate = filters.sDate;\n vm.eDate = filters.eDate;\n vm.page = filters.page;\n vm.count = filters.count;\n vm.id = {\n selectAll: false,\n selected: angular.isDefined(filters.selectItem)?filters.selectItem:[]\n };\n\n\n vm.corsesTable = new NgTableParams({}, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n var params = {};\n params.keyword = vm.keyword;\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n return managerService.getCourses(params).then(function (courses) {\n tableParams.total(courses.metadata.pagination.total);\n vm.courses = courses;\n vm.id.selectAll = false;\n return courses;\n });\n }\n });\n vm.corsesTable.count(vm.count);\n vm.corsesTable.page(vm.page);\n\n // watch for check all checkbox\n $scope.$watch(function() {\n return vm.id.selectAll;\n }, function(value) {\n angular.forEach(vm.courses, function(courses) {\n vm.id.selected[courses.activity.id] = {\n value:value,\n id:courses.activity.id,\n courseName:courses.activity.name\n };\n });\n\n });\n\n vm.checkboxSelect = function(id,value,courseName){\n vm.id.selected[id] = {\n value:value,\n id:id,\n courseName:courseName\n };\n };\n\n $scope.$watch('MCSDC.keyword', function() {\n vm.corsesTable.reload();\n });\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n vm.submit = function() {\n var courseNameList=\"\";\n var courseIdList=\"\";\n angular.forEach(vm.id.selected, function(courses) {\n if(courses.value) {\n courseNameList +=(courseNameList==='')?courses.courseName:\",\"+courses.courseName;\n courseIdList +=(courseIdList==='')?courses.id:\",\"+courses.id;\n }\n });\n\n var close = true;\n if(vm.isQueryAllDate===0){\n if(angular.isUndefined(vm.eDate)){\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_PLEASE_ENTER_END_DATE'));\n close=false;\n }\n if(angular.isUndefined(vm.sDate)){\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_PLEASE_ENTER_START_DATE'));\n close=false;\n }\n }\n if(vm.isListAll===0){\n if(vm.courseIdList===''){\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_PLEASE_SELECT_AT_LEAST_ONE_COURSE'));\n close=false;\n }\n }\n var sCompareDate = new Date(vm.sDate);\n var eCompareDate = new Date(vm.eDate);\n if (eCompareDate < sCompareDate) {\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_THE_START_DATE_CAN_NOT_BE_GREATER_THAN_THE_END_DATE'));\n close=false;\n }\n if(close===true){\n vm.filters = {\n page:vm.corsesTable.page(),\n count:vm.corsesTable.count(),\n selectItem:vm.id.selected,\n keyword:vm.keyword,\n isAdm:0,\n isListAll:vm.isListAll,\n courseIdList:courseIdList,\n isQueryAllDate:vm.isQueryAllDate,\n sDate:vm.sDate,\n eDate:vm.eDate\n };\n $mdDialog.hide(vm.filters);\n }\n\n };\n }\n\n angular.module('eHRD.modules.manager')\n .controller('memberCurriculumSearchDialogController', memberCurriculumSearchDialogController);\n})();\n\n/**\n * Created by Bruce on 2016/10/21.\n */\n(function() {\n 'use strict';\n\n MemberCurriculumDetailDialogController.$inject = ['managerService','params','course','$mdDialog'];\n\n function MemberCurriculumDetailDialogController(managerService,params,course,$mdDialog) {\n var vm = this;\n vm.courseName = course.courseName;\n vm.courseSession = course.courseSession;\n vm.courseType = course.courseType;\n vm.enrollmentType = params.type;\n managerService.getMemberCurriculumDetail(params).then(function (curriculumDetails) {\n vm.curriculumDetails = curriculumDetails;\n });\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }\n\n angular.module('eHRD.modules.manager')\n .controller('MemberCurriculumDetailDialogController', MemberCurriculumDetailDialogController);\n})();\n\n/**\n * Created by Alan on 2016/12/5.\n */\n(function () {\n 'use strict';\n\n var memberSuggestLearningList = {\n bindings: {},\n templateUrl: 'app/modules/manager/views/member-suggest-learning-list.html',\n controller: ['PermPermissionStore', '$scope', 'NgTableParams', 'managerService', '$filter', 'ngTableColumnValueService', '$interpolate',\n function(PermPermissionStore, $scope, NgTableParams, managerService, $filter, ngTableColumnValueService, $interpolate){\n var vm = this;\n var permission = null;\n vm.firstInto = true;\n permission = PermPermissionStore.getPermissionDefinition('Modules.curriculum');\n vm.hasCurriculumPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.certification.inner');\n vm.hasCertificationInnerPermission = angular.isDefined(permission);\n vm.enrollmentId = {\n selectAll: false,\n selected: []\n };\n vm.tableCols = prepareTableCols();\n vm.suggestLearningTable = new NgTableParams({ sorting: { 'PredictDueDate': \"asc\" } }, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n vm.firstInto = false;\n var params = {};\n //clear checkbox\n vm.enrollmentId = {\n selectAll: false,\n selected: []\n };\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc') ? \"ASC\" : \"DESC\");\n });\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n return managerService.getMemberSuggestLearningList(params).then(function (memberSuggestLearningList) {\n vm.memberSuggestLearningList = memberSuggestLearningList;\n vm.userInfo = memberSuggestLearningList.metadata.userInfo;\n vm.dataLength = memberSuggestLearningList.length;\n tableParams.total(memberSuggestLearningList.metadata.pagination.total);\n return memberSuggestLearningList;\n });\n }\n });\n\n function prepareTableCols() {\n var cols = [];\n cols = [\n {\n field: 'checkbox',\n title: '',\n headerTemplateURL: 'headerCheckbox.html',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\" \"\n ),\n priority: 1,\n width: 5\n },\n {\n field: 'predictDueDate',\n title: $filter('translate')('FIELD.ESTIMATED_COMPLETION_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: 'PredictDueDate',\n priority: 2,\n width: 110\n },\n {\n field: 'finishDate',\n title: $filter('translate')('FIELD.FINISH_TIME'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: 'ResultModifiedDate',\n priority: 1,\n width: 80\n },\n {\n field: 'activityName',\n title: $filter('translate')('FIELD.LEARNING_ACTIVITY'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlActivityName()),\n sortable: 'ActivityName',\n priority: 1\n },\n {\n field: 'sessionName',\n title: $filter('translate')('FIELD.SESSION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 3\n },\n {\n field: 'itemName',\n title: $filter('translate')('FIELD.TYPE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: 'ItemType',\n priority: 3,\n width: 50\n },\n {\n field: 'sourceName',\n title: $filter('translate')('FIELD.SOURCE'),\n getValue: htmlSourceInfos,\n sortable: 'Source',\n priority: 2\n },\n {\n field: 'properties',\n title: $filter('translate')('FIELD.PROPERTIES'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"\" +\n \"
    N/A
    \" +\n \"
    {{ 'FIELD.COURSE_ELECTIVE' |translate }}
    \" +\n \"
    {{ 'FIELD.COURSE_REQUIRED' |translate }}
    \"\n ),\n sortable: 'LearnerType',\n priority: 2\n },\n {\n field: 'enrollName',\n title: $filter('translate')('FIELD.ENROLL_TYPE') +'(' + $filter('translate')('FIELD.SPECIFY_APPLICANT') + ')',\n headerTemplateURL: 'enrollTypeHeader.html',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate('
    {{row.enrollName}}
    ' +\n '({{row.assignerFullName}})
    '\n ),\n sortable: 'EnrollType',\n priority: 3\n },\n {\n field: 'enrollmentStatus',\n title: $filter('translate')('FIELD.ENROLLMENT_STATUS'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlEnrollmentStatus()),\n priority: 1,\n width: 100\n },\n {\n field: 'leanerStatusName',\n title: $filter('translate')('FIELD.LEARNING_STATUS'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1\n }\n ];\n\n\n return cols;\n }\n\n // watch for check all checkbox\n $scope.$watch(function() {\n return vm.enrollmentId.selectAll;\n }, function(value) {\n angular.forEach(vm.memberSuggestLearningList, function(suggestLearningList) {\n vm.checkboxSelect(suggestLearningList, value);\n });\n });\n\n //checkbox select\n vm.checkboxSelect = function(suggestLearningList, value){\n vm.enrollmentId.selected[suggestLearningList.enrollmentId] = {\n value: value,\n itemType: suggestLearningList.itemType,\n canDelete: suggestLearningList.canDelete,\n canUpdate: suggestLearningList.canUpdate,\n activityName: suggestLearningList.activityName,\n sourceInfos: suggestLearningList.sourceInfos,\n status: suggestLearningList.status\n };\n };\n\n function htmlSourceInfos() {\n return '
    {{sourceInfo.sourceName}}
    ';\n }\n\n function htmlEnrollmentStatus() {\n var html = '';\n html += ' {{row.statusName}}';\n html += ' N/A ';\n html += ' {{row.leanerStatusName}} ';\n return html;\n }\n\n function htmlActivityName() {\n var html = \"
    \";\n html += \"{{row.activityName}}\";\n html += \"{{row.activityName}}\";\n html += \"{{row.activityName}}\";\n html += \"{{row.activityName}}\";\n html += \"
    \";\n return html;\n }\n }]\n };\n\n angular.module('eHRD.modules.manager')\n .component('memberSuggestLearningList', memberSuggestLearningList);\n})();\n\n/**\n * Created by Alan on 2017/5/10.\n */\n(function () {\n 'use strict';\n\n var memberFinancialCertRecordSearch = {\n bindings: {},\n templateUrl: 'app/modules/manager/views/member-financial-cert-record-search.html',\n controller: ['serverSetting', function (serverSetting) {\n var vm = this;\n vm.url = serverSetting.baseConfig.baseURL + '/fc-query-application-default.do?isManager=true';\n }]\n };\n\n angular\n .module('eHRD.modules.manager')\n .component('memberFinancialCertRecordSearch' , memberFinancialCertRecordSearch);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var memberCurriculum = {\n bindings: {},\n templateUrl: 'app/modules/manager/views/member-curriculum.html',\n controller: ['NgTableParams','$mdDialog', '$document', 'managerService', 'PermPermissionStore', function( NgTableParams, $mdDialog, $document, managerService, PermPermissionStore ){\n var vm = this;\n var permission = null;\n permission = PermPermissionStore.getPermissionDefinition('Modules.course.classroom');\n vm.hasCourseClassroomPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.approval');\n vm.hasApprovalPermission = angular.isDefined(permission);\n vm.filters = {\n isAdm:0,\n isListAll:1,\n isQueryAllDate:1,\n sDate:new Date(),\n eDate:new Date()\n };\n vm.memberCurriculumTable = new NgTableParams({}, {\n counts: [],\n getData: function(tableParams) {\n var params = {};\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n return managerService.getMemberCurriculum(params).then(function (curriculm) {\n vm.dataLength = curriculm.length;\n vm.groupIdList = curriculm.groupIdList;\n return curriculm;\n });\n }\n });\n vm.memberCurriculumTable.filter(vm.filters);\n vm.memberCurriculumDetailDialog = function(courseId,sessionId,courseName,courseSession,courseType,type,ev){\n var params = {\n courseId:courseId,\n sessionId:sessionId,\n type:type\n };\n var course={\n courseName:courseName,\n courseSession:courseSession,\n courseType:courseType\n };\n $mdDialog.show({\n controller: 'MemberCurriculumDetailDialogController',\n controllerAs:'MCDDC',\n templateUrl: 'app/modules/manager/views/member-curriculum-detail-dialog.html',\n parent: angular.element($document[0].body),\n clickOutsideToClose:true,\n targetEvent: ev,\n locals:{\n params:params,\n course:course\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n };\n\n vm.memberDownloadDetailDialog = function(sessionId, groupIdList,ev){\n var params = {\n sessionId:sessionId,\n groupIdList:groupIdList\n };\n $mdDialog.show({\n controller: 'MemberDownloadDetailDialogController',\n controllerAs:'MDDDC',\n templateUrl: 'app/modules/manager/views/member-download-detail-dialog.html',\n parent: angular.element($document[0].body),\n clickOutsideToClose:true,\n targetEvent: ev,\n locals:{\n params:params\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n };\n\n vm.setFilter = function (filters, isClear) {\n if(isClear){\n filters = {};\n }\n // angular.extend(vm.myTrainingRecordsTable.filter(), filters);\n vm.memberCurriculumTable.filter(filters);\n\n };\n\n vm.showPrompt = function(ev) {\n // Appending dialog to document.body to cover sidenav in docs app\n $mdDialog.show({\n controller: 'memberCurriculumSearchDialogController',\n controllerAs:'MCSDC',\n templateUrl: 'app/modules/manager/views/member-curriculum-search-dialog.html',\n parent: angular.element($document[0].body),\n clickOutsideToClose:true,\n targetEvent: ev,\n locals:{\n filters:vm.filters\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function(filters) {\n vm.filters = filters;\n vm.setFilter(filters, false);\n }, function() { });\n };\n }]\n };\n\n angular.module('eHRD.modules.manager')\n .component('memberCurriculum', memberCurriculum);\n})();\n\n/**\n * Created by Bruce on 2017/5/15.\n */\n(function () {\n 'use strict';\n\n var memberCertRecordsSearch = {\n bindings: {},\n templateUrl: 'app/modules/manager/views/member-cert-records-search.html',\n controller: ['PermPermissionStore', '$interpolate', '$scope', '$filter', 'NgTableParams', 'ngTableColumnValueService', '$mdDialog', '$document', 'certZoneService', '$auth', function (PermPermissionStore, $interpolate, $scope, $filter, NgTableParams, ngTableColumnValueService, $mdDialog, $document, certZoneService, $auth) {\n var vm = this;\n var permission = null;\n permission = PermPermissionStore.getPermissionDefinition('Modules.certification.inner');\n vm.hasCertificationInnerPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.certification.ext');\n vm.hasCertificationExtPermission = angular.isDefined(permission);\n vm.certType = ( (vm.hasCertificationInnerPermission) ? 'inner' : ((vm.hasCertificationExtPermission) ? 'ext': '')); // inner or ext\n\n vm.filter = {\n certType: vm.certType,\n validDateType: 0,\n memberId: $auth.getUserData().id\n };\n\n function prepareTable() {\n vm.tableCols = prepareTableCols();\n vm.certTable = new NgTableParams({\n // sorting: {},\n filter: vm.filter\n }, {\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = value;\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n var isExtCert = (vm.certType === 'ext');\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n\n if(angular.isDefined(params['accessBegin'])) params['accessBegin'] = moment(params['accessBegin']).format('YYYY/MM/DD');\n if(angular.isDefined(params['accessEnd'])) params['accessEnd'] = moment(params['accessEnd']).format('YYYY/MM/DD');\n return certZoneService.getMemberCertRecords(isExtCert, params).then(function (certData) {\n vm.configuration = certData.metadata.configuration;\n if((vm.configuration.isShowCredit === 1) && angular.isDefined($filter('where')(vm.tableCols, {field: 'credits'}).length > 0)) {\n var credits_index = vm.tableCols.indexOf($filter('where')(vm.tableCols, {field: 'credits'})[0]);\n vm.tableCols[credits_index].show = true;\n }\n tableParams.total(certData.metadata.pagination.total);\n return certData;\n });\n }\n });\n\n vm.setFilter = function (filters, isClear) {\n if(isClear){\n filters = {};\n }\n vm.certType = angular.isDefined(filters.certType) ? filters.certType : '';\n vm.filter = filters;\n vm.certTable.filter(filters);\n vm.certTable.sorting({});\n vm.certTable.reload();\n };\n }\n\n function prepareTableCols() {\n var cols = [];\n switch (vm.certType){\n case 'inner':\n cols = [{\n field: 'classificationName',\n title: $filter('translate')('FIELD.CERTIFICATE_TYPE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: 'ClassificationName',\n priority: 1\n },{\n field: 'programName',\n sortable: 'Programs.ProgramName',\n title: $filter('translate')('FIELD.CERTIFICATION_NAME'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"{{row.programName}}\"),\n priority: 1\n },{\n field: 'credits',\n title: $filter('translate')('FIELD.CREDITS'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1,\n columnType: 'number',\n show: false\n },{\n field: 'acquireDate',\n sortable: 'Cert_SubjectToUser.AcquireDate',\n title: $filter('translate')('FIELD.ACQUIRE_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1,\n columnType: 'date',\n width: 100\n },{\n field: 'validDate',\n sortable: 'Cert_SubjectToUser.ExpireDate',\n title: $filter('translate')('FIELD.VALID_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1,\n columnType: 'date',\n width: 100\n },{\n field: 'score',\n title: $filter('translate')('FIELD.SCORE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n columnType: 'number',\n width: 50,\n priority: 2\n },{\n field: 'status',\n sortable: 'Cert_SubjectToUser.Status',\n title: $filter('translate')('FIELD.STATUS'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 3\n },{\n field: 'bonus',\n title: $filter('translate')('FIELD.BONUS'),\n getValue: ngTableColumnValueService.htmlTextValue,\n columnType: 'number',\n priority: 2\n },{\n field: 'references',\n title: $filter('translate')('FIELD.REFERENCE_MATERIAL'),\n getValue: ngTableColumnValueService.htmlReferences,\n priority: 2\n }];\n break;\n case 'ext':\n cols = [{\n field: 'companyName',\n sortable: 'Cert_Company.CompanyId',\n title: $filter('translate')('FIELD.ORIGINAL_FACTORY_NAME'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1,\n width: 200\n },{\n field: 'subjectName',\n sortable: 'Cert_Subject.SubjectId',\n title: $filter('translate')('FIELD.CERTIFIED_SUBJECT'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"{{row.subjectName}}\"),\n priority: 1,\n width: 200\n },{\n field: 'credits',\n title: $filter('translate')('FIELD.CREDITS'),\n getValue: ngTableColumnValueService.htmlTextValue,\n show: false,\n priority: 1\n },{\n field: 'acquireDate',\n sortable: 'Cert_SubjectToUser.AcquireDate',\n title: $filter('translate')('FIELD.ACQUIRE_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1,\n width: 100\n },{\n field: 'validDate',\n sortable: 'Cert_SubjectToUser.ExpireDate',\n title: $filter('translate')('FIELD.VALID_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1,\n width: 100\n },{\n field: 'subjectToUserCode',\n title: $filter('translate')('FIELD.CERTIFICATE_NUMBER'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 2\n },{\n field: 'grade',\n title: $filter('translate')('FIELD.SUBJECT_TO_USER_GRADE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 2\n },{\n field: 'bonus',\n title: $filter('translate')('FIELD.BONUS'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 2\n },{\n field: 'relatedRefs',\n title: $filter('translate')('FIELD.REFERENCE_DOCUMENT'),\n getValue: ngTableColumnValueService.htmlReferences,\n priority: 2\n }];\n break;\n }\n\n\n return cols;\n }\n\n $scope.$watch(function () {\n return vm.certType\n }, function () {\n prepareTable();\n });\n\n\n vm.showPrompt = function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/manager/views/member-cert-records-search-dialog.html',\n controller: ['$mdDialog', 'filters', function ($mdDialog, filters) {\n var vm = this;\n\n vm.filters = {\n groupId: angular.isDefined(filters.groupId) ? filters.groupId : '',\n memberId: angular.isDefined(filters.memberId) ? filters.memberId : '',\n companyId: angular.isDefined(filters.companyId) ? filters.companyId : '',\n subjectId: angular.isDefined(filters.subjectId) ? filters.subjectId : '',\n certClassId: angular.isDefined(filters.certClassId) ? filters.certClassId : '',\n certId: angular.isDefined(filters.certId) ? filters.certId : '',\n certType: angular.isDefined(filters.certType) ? filters.certType : '' ,\n validDateType: angular.isDefined(filters.validDateType) ? filters.validDateType : 0,\n accessBegin: angular.isDefined(filters.accessBegin) ? filters.accessBegin : undefined,\n accessEnd: angular.isDefined(filters.accessEnd) ? filters.accessEnd : undefined\n };\n\n vm.updateEndDateModel = function () {\n var beginningTime = moment(vm.filters.accessBegin);\n var endTime = moment(vm.filters.accessEnd);\n if(!beginningTime.isBefore(endTime)){\n vm.filters.accessEnd = vm.filters.accessBegin;\n }\n };\n\n vm.cancel = function() {\n $mdDialog.cancel();\n };\n vm.close = function() {\n $mdDialog.cancel();\n };\n vm.submit = function(filters) {\n $mdDialog.hide(filters);\n };\n }],\n controllerAs:'$ctrl',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n filters : vm.certTable.filter()\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function(filters) {\n vm.setFilter(filters, false);\n }, function() { });\n };\n }]\n };\n\n angular\n .module('eHRD.modules.manager')\n .component('memberCertRecordsSearch' , memberCertRecordsSearch);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var managerTrainingRecords = {\n bindings: {},\n templateUrl: 'app/modules/manager/views/manager-training-records.html',\n controller: ['$scope', '$filter', '$interpolate', 'PermPermissionStore', 'ngTableColumnValueService', 'NgTableParams','$mdDialog', '$document', 'managerService', 'userService', function( $scope, $filter, $interpolate, PermPermissionStore, ngTableColumnValueService, NgTableParams, $mdDialog, $document, managerService, userService ){\n var vm = this;\n var permission = null;\n permission = PermPermissionStore.getPermissionDefinition('Modules.curriculum');\n vm.hasCurriculumPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.certification.inner');\n vm.hasCertificationInnerPermission = angular.isDefined(permission);\n vm.kernelUser = userService.getKernelUser();\n\n vm.filter = { };\n vm.cpType = 1;\n\n function prepareTable() {\n vm.tableCols = prepareTableCols();\n vm.myTrainingRecordsTable = new NgTableParams({\n filter: vm.filter,\n sorting: {}\n }, {\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc') ? 0 : 1);\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.currentPage = tableParams.url().page;\n params.perPage = tableParams.url().count;\n\n return managerService.getMemberTrainingRecords(params).then(function (records) {\n vm.groups = records.metadata.groups;\n vm.groupMembers = records.metadata.groupMembers;\n vm.summary = records.metadata.summary;\n tableParams.total(records.metadata.pagination.total);\n\n if(angular.isDefined(tableParams.filter().memberId) && tableParams.filter().memberId!= -1){\n userService.getUserProfileById(tableParams.filter().memberId).then(function (userData) {\n vm.userProfiles = userData;\n });\n }else{\n userService.getUserProfile().then(function (userData) {\n vm.userProfiles = userData;\n });\n }\n return records;\n });\n }\n });\n\n vm.setFilter = function (filters, isClear) {\n if(isClear){\n filters = {};\n }\n vm.cpType = filters.cpType;\n vm.filter = filters;\n vm.myTrainingRecordsTable.filter(filters);\n vm.myTrainingRecordsTable.sorting({});\n vm.myTrainingRecordsTable.reload();\n };\n }\n function prepareTableCols() {\n var cols = [];\n switch (vm.cpType){\n case 1:\n cols = [{\n field: 'courseName',\n title: $filter('translate')('FIELD.APPELLATION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: '110',\n priority: 1\n },{\n field: 'sessionName',\n title: $filter('translate')('FIELD.SESSION') + '/' + $filter('translate')('FIELD.SESSION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 3\n },{\n field: 'credits',\n title: $filter('translate')('FIELD.CREDITS'),\n sortable: '151',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.credits}}
    \"),\n width: 50,\n priority: 2\n },{\n field: 'courseType',\n title: $filter('translate')('FIELD.TYPE'),\n sortable: '49',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlCourseType()),\n priority: 3\n },{\n field: 'history_course_time',\n title: $filter('translate')('FIELD.ENROLLMENT_TIME'),\n sortable: 'history_course_time',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlHistoryCourseTime()),\n width: 100,\n priority: 2\n },{\n field: 'HOURS',\n title: $filter('translate')('FIELD.HOURS'),\n sortable: '59',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlHours()),\n width: 50,\n priority: 3\n },{\n field: 'PersonalCost',\n title: $filter('translate')('FIELD.COST'),\n sortable: '56',\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 3\n },{\n field: 'PROPERTIES',\n title: $filter('translate')('FIELD.PROPERTIES'),\n sortable: '140',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlProperties()),\n width: 50,\n priority: 2\n },{\n field: 'enrollType',\n title: $filter('translate')('FIELD.ENROLL_TYPE'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{ 'STATUS.' + row.enrollType | uppercase | translate}}
    \"),\n priority: 3\n },{\n field: 'enrollmentHours',\n title: $filter('translate')('FIELD.ENROLLMENT_HOURS') ,\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.totalTime}}
    \"),\n priority: 2\n },{\n field: 'TEST_FRACTION',\n title: $filter('translate')('FIELD.TEST_FRACTION'),\n sortable: '64',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.score}}
    {{ 'STATUS.NOT_PUBLISHED' | translate}}
    \"),\n width: 50,\n priority: 3\n },{\n field: 'ENROLLMENT_STATUS',\n title: $filter('translate')('FIELD.ENROLLMENT_STATUS'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlEnrollmentStatus()),\n width: 100,\n priority: 1\n },{\n field: 'PASS_STATUS',\n title: $filter('translate')('FIELD.PASS_STATUS'),\n sortable: '46',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlPassStatus()),\n priority: 1\n }];\n\n break;\n case 2:\n cols = [{\n field: 'programName',\n title: $filter('translate')('FIELD.APPELLATION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: '111',\n priority: 1\n },{\n field: 'sessionName',\n title: $filter('translate')('FIELD.SESSION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 3\n },{\n field: 'credits',\n title: $filter('translate')('FIELD.CREDITS'),\n sortable: '151',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.credits}}
    \"),\n width: 50,\n priority: 2\n },{\n field: 'programAccessTime',\n title: $filter('translate')('FIELD.CLASS_TIME'),\n sortable: 'Dynamic_ProgramAccessDate',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    \"),\n priority: 1\n },{\n field: 'includeCourse',\n title: $filter('translate')('COURSE_CONTAIN'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    '\\\">
    \"),\n priority: 3\n },{\n field: 'PROPERTIES',\n title: $filter('translate')('FIELD.PROPERTIES'),\n sortable: '140',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlProperties()),\n width: 50,\n priority: 2\n },{\n field: 'enrollType',\n title: $filter('translate')('FIELD.ENROLL_TYPE'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{ 'STATUS.' + row.enrollType | uppercase | translate}}
    \"),\n priority: 3\n },{\n field: 'enrollmentHours',\n title: $filter('translate')('FIELD.LEARN_TOTAL_TIME'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.totalTime}}
    \"),\n priority: 1\n },{\n field: 'passCount',\n title: $filter('translate')('FIELD.PASS_NUMBER'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.passCount}}
    \"),\n priority: 2\n },{\n field: 'failedCount',\n title: $filter('translate')('FIELD.FAILED_NUMBER'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.failedCount}}
    \"),\n priority: 3\n },{\n field: 'exemptionCount',\n title: $filter('translate')('FIELD.EXEMPTION_NUMBER'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.exemptionCount}}
    \"),\n priority: 3\n },{\n field: 'ENROLLMENT_STATUS',\n title: $filter('translate')('FIELD.ENROLLMENT_STATUS'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlEnrollmentStatus()),\n width: 100,\n priority: 1\n },{\n field: 'PASS_STATUS',\n title: $filter('translate')('FIELD.PASS_STATUS'),\n sortable: '46',\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlPassStatus()),\n priority: 1\n }];\n break;\n }\n return cols;\n }\n\n function htmlCourseType() {\n var html = '
    ';\n html += '{{ \"FIELD.ONLINE_COURSE\" | translate}}';\n html += '{{ \"FIELD.CLASS_ROOM_COURSE\" | translate}}';\n html += '{{ \"FIELD.EXTERNAL_TRAINING\" | translate}}';\n html += '{{ \"FIELD.ONLINE_TEST\" | translate}}';\n html += '{{ \"FIELD.CLASS_ROOM_TEST\" | translate}}';\n html += '{{ \"FIELD.QUESTIONNAIRE\" | translate}}';\n html += '{{row.courseType}}';\n html += '
    ';\n return html;\n }\n\n function htmlHistoryCourseTime() {\n var html = '
    ';\n html += '';\n html += '
    ';\n html += '
    ';\n html += '';\n html += '
    ';\n return html;\n }\n\n function htmlHours() {\n var html = '
    ';\n html += '{{(row.studyHour === 0) ? \"\" : row.studyHour}}';\n html += '';\n html += '{{(row.studyHour + (row.studyMin/60)) | number:2}}';\n html += '';\n html += '
    ';\n return html;\n }\n\n function htmlProperties() {\n var html = '
    {{ \"FIELD.COURSE_ELECTIVE\" | translate}}
    ';\n html += '
    {{ \"FIELD.COURSE_REQUIRED\" | translate}}
    ';\n return html;\n }\n\n function htmlEnrollmentStatus() {\n var html = '';\n html += '{{ \\'STATUS.\\' + row.status | uppercase | translate}}';\n html += '{{ \\'STATUS.\\' + row.status | uppercase | translate}}';\n return html;\n }\n\n function htmlPassStatus() {\n var html = '
    ';\n html += 'N/A';\n html += '{{ \\'STATUS.EXEMPTION\\' | translate }}';\n html += '{{ \\'STATUS.PASSED\\' | translate }}';\n html += '{{ \\'STATUS.FAILED\\' | translate }}';\n html += '
    ';\n return html;\n }\n\n\n $scope.$watch(function () {\n return vm.cpType;\n }, function () {\n prepareTable();\n });\n\n vm.showPrompt = function(ev) {\n // Appending dialog to document.body to cover sidenav in docs app\n $mdDialog.show({\n controller: 'MemberTrainingRecordsSearchDialogController',\n controllerAs:'MTRSDC',\n templateUrl: 'app/modules/manager/views/member-training-records-search-dialog.html',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n filters : vm.myTrainingRecordsTable.filter(),\n groups: vm.groups,\n groupMembers: vm.groupMembers,\n userProfiles: vm.userProfiles\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function(filters) {\n vm.setFilter(filters, false);\n }, function() { }\n );\n };\n }]\n };\n\n angular.module('eHRD.modules.manager')\n .component('managerTrainingRecords', managerTrainingRecords);\n})();\n\n/**\n * Created by Bruce on 2017/1/23.\n */\n(function () {\n 'use strict';\n\n var managerTrainingPlan = {\n bindings: {},\n templateUrl: 'app/modules/manager/views/manager-training-plan.html',\n controller: ['serverSetting', function (serverSetting) {\n var vm = this;\n vm.url = serverSetting.baseConfig.baseURL + '/home-tp-manager-right.do';\n }]\n };\n\n angular\n .module('eHRD.modules.manager')\n .component('managerTrainingPlan' , managerTrainingPlan);\n\n})();\n\n/**\n * Created by Alan on 2017/8/8.\n */\n(function () {\n 'use strict';\n\n var embaMustRead = {\n bindings: {},\n templateUrl: 'app/modules/manager/views/emba-must-read.html',\n controller: ['serverSetting', function (serverSetting) {\n var vm = this;\n vm.url = serverSetting.baseConfig.baseURL + '/emba-manager-mmustread.do';\n }]\n };\n\n angular\n .module('eHRD.modules.manager')\n .component('embaMustRead' , embaMustRead);\n\n})();\n\n/**\n * Created by Alan on 2017/8/8.\n */\n(function () {\n 'use strict';\n\n var embaCalendar = {\n bindings: {},\n templateUrl: 'app/modules/manager/views/emba-calendar.html',\n controller: ['serverSetting', function (serverSetting) {\n var vm = this;\n vm.url = serverSetting.baseConfig.baseURL + '/emba-manager-mcalendar.do';\n }]\n };\n\n angular\n .module('eHRD.modules.manager')\n .component('embaCalendar' , embaCalendar);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/25.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.mailLink',[]);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var mailLinkProcess = {\n bindings: {},\n controller: ['$state', '$stateParams', 'courseResourceService', 'CourseObject', 'userService',\n function( $state, $stateParams, courseResourceService, CourseObject, userService){\n var isProgram = false;\n if(angular.isDefined($stateParams.linkType)){\n if(angular.isDefined($stateParams.programId)) isProgram = true;\n switch ($stateParams.linkType){\n case '912':\n if(isProgram){\n $state.go('courseResourceCatalog.ProgramInfo', {cid: 0,programId: $stateParams.programId});\n }else {\n $state.go('courseResourceCatalog.CourseInfo', {cid: 0,courseId: $stateParams.courseId});\n }\n break;\n case '913':\n if(angular.isDefined($stateParams.sessionId)){\n courseResourceService.getEnrollment($stateParams.sessionId, isProgram).then(function (data) {\n if(isProgram){\n $state.go('learningPassport.incompleteCourses.programInfo', {enrollmentId: data.enrollmentId});\n }else {\n courseResourceService.getCourseEnrollment(data.enrollmentId,{}).then(function (courseEnrollment) {\n switch (courseEnrollment.courseType){\n case CourseObject.COURSETYPE_ONLINE_TEST: case CourseObject.COURSETYPE_CLASSROOM_TEST: case CourseObject.COURSETYPE_SURVEY:\n $state.go('learningPassport.testQuestionnaireCenter.courseInfo', {enrollmentId: courseEnrollment.enrollmentId});\n break;\n default:\n $state.go('learningPassport.incompleteCourses.courseInfo', {enrollmentId: courseEnrollment.enrollmentId});\n break;\n }\n });\n }\n });\n }\n break;\n case '914':\n var userId = (parseInt($stateParams.userId)<=0)?userService.getKernelUser().id:parseInt($stateParams.userId);\n courseResourceService.getEnrollment($stateParams.sessionId, isProgram, userId).then(function (data) {\n if(isProgram){\n if(userService.getKernelUser().id === userId) {\n $state.go('learningPassport.incompleteCourses.programInfo', {enrollmentId: data.enrollmentId});\n }else {\n $state.go('programInfo', {enrollmentId: data.enrollmentId});\n }\n }else {\n courseResourceService.getCourseEnrollment(data.enrollmentId,{}).then(function (courseEnrollment) {\n if(userService.getKernelUser().id === userId) {\n switch (courseEnrollment.courseType) {\n case CourseObject.COURSETYPE_ONLINE_TEST:\n case CourseObject.COURSETYPE_CLASSROOM_TEST:\n case CourseObject.COURSETYPE_SURVEY:\n $state.go('learningPassport.testQuestionnaireCenter.courseInfo', {enrollmentId: courseEnrollment.enrollmentId});\n break;\n default:\n $state.go('learningPassport.incompleteCourses.courseInfo', {enrollmentId: courseEnrollment.enrollmentId});\n break;\n }\n }\n else {\n $state.go('courseInfo', {enrollmentId: courseEnrollment.enrollmentId});\n }\n });\n }\n });\n break;\n }\n }\n\n }]\n };\n\n angular.module('eHRD.modules.mailLink')\n .component('mailLinkProcess', mailLinkProcess);\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.learningResource', []);\n\n})();\n\n/**\n * Created by Bruce on 2016/5/18.\n */\n\n(function () {\n 'use strict';\n\n function knowledgeManagementCenterService( Restangular) {\n\n /*\n * Build collection\n * api/learning-resource/folder/{ folderId }/userlist\n * ? keyword={ keyword }&sort={ sort }&order={ order }¤t_page={ currentPage }&list_size={ listSize }\n */\n var _knowledgeManagementCenterService = Restangular.all('learning-resource');\n\n return{\n /*\n * Get list of samples\n */\n list: function (folderId, params) {\n /*\n * GET /api/learning-resource/folder/{ folderId }/userlist\n * ? keyword={ keyword }&sort={ sort }&order={ order }¤t_page={ currentPage }&list_size={ listSize }\n * */\n return _knowledgeManagementCenterService\n .one('folder', ( angular.isDefined(folderId) ? folderId : 'null' ))\n .getList('documents', params);\n },\n\n menuNodes: function (folderId) {\n // GET /api/sample\n return _knowledgeManagementCenterService\n .one('folder', ( angular.isDefined(folderId) ? folderId : 0 ))\n .getList('nodes',{limit_level:99});\n },\n\n newDocuments: function (params) {\n return _knowledgeManagementCenterService\n .one('folder', null)\n .getList('new-documents', params);\n },\n\n hotDocuments: function (params) {\n return _knowledgeManagementCenterService\n .one('folder', null)\n .getList('hot-documents', params);\n },\n\n setScore: function (docId,score) {\n // POST /api/learning-resource/document/{docId}/score/{score}\n return _knowledgeManagementCenterService\n .one('document',docId )\n .one('score',score )\n .put();\n },\n\n scoreInfo: function (docId) {\n //GET /api/learning-resource/document/{ docId }/info\n return _knowledgeManagementCenterService\n .one('document',docId)\n .customGET('info');\n }\n };\n\n }\n\n angular.module('eHRD.modules.learningResource')\n .factory('knowledgeManagementCenterService',knowledgeManagementCenterService)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.courseResource', []);\n\n})();\n\n/**\n * Created by alan on 2016/10/26.\n */\n(function () {\n 'use strict';\n\n setScore.$inject = ['$mdDialog'];\n function setScore($mdDialog) {\n\n var directive ={\n restrict: 'EA',\n scope: {\n reload:'&?',\n docId:'=',\n title:'='\n },\n link:function(scope,element){\n element.on('click', function (ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/learning-resource/views/set-score.html',\n controller:'SetScoreController',\n controllerAs:'SSC',\n clickOutsideToClose:true,\n targetEvent: ev,\n locals:{\n reload:scope.reload,\n docId:scope.docId,\n title:scope.title\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n })\n }\n };\n return directive;\n }\n\n\n angular.module('eHRD.modules.courseResource')\n .directive('setScore', setScore);\n})();\n\n/**\r\n * Created by alan on 2016/10/26.\r\n */\r\n(function () {\r\n 'use strict';\r\n SetScoreController.$inject=['knowledgeManagementCenterService','$mdDialog','reload','docId','title'];\r\n function SetScoreController(knowledgeManagementCenterService,$mdDialog,reload,docId,title) {\r\n var vm = this;\r\n vm.reload = reload;\r\n vm.docId = docId;\r\n vm.title = title;\r\n vm.average=false;\r\n vm.setScore = function (docId,score) {\r\n knowledgeManagementCenterService.setScore(docId,score).then(function () {\r\n vm.reload();\r\n $mdDialog.cancel();\r\n });\r\n }\r\n vm.getData = function () {\r\n knowledgeManagementCenterService.scoreInfo(vm.docId).then(function (scoreInfos) {\r\n vm.scoreInfos=scoreInfos;\r\n if(vm.scoreInfos.userScore==='')\r\n vm.readOnly=false;\r\n else\r\n vm.readOnly=true;\r\n });\r\n }\r\n\r\n vm.getData();\r\n\r\n vm.cancel = function () {\r\n $mdDialog.cancel();\r\n }\r\n vm.averageShow = function(){\r\n vm.average = (vm.average===true)?false:true;\r\n }\r\n\r\n }\r\n\r\n\r\n angular\r\n .module('eHRD.modules.learningResource')\r\n .controller('SetScoreController', SetScoreController)\r\n ;\r\n\r\n})();\n/**\n * Created by Bruce on 2017/7/31.\n */\n\n(function() {\n 'use strict';\n\n var knowledgeDocument = {\n bindings: {\n catalogId: '=?catalogId',\n nodeId: '=?nodeId'\n },\n templateUrl: 'app/modules/learning-resource/views/knowledge-document-list.html',\n controller: [ 'sitemapService', 'knowledgeManagementCenterService', '$state', '$stateParams', '$filter', 'serverSetting', function(sitemapService, knowledgeManagementCenterService, $state, $stateParams, $filter, serverSetting) {\n var vm = this;\n vm.isShowIndex = false;\n vm.catalogId = angular.isDefined(this.catalogId) ? parseInt(this.catalogId) : 0;\n vm.nodeId = angular.isDefined(this.nodeId) ? this.nodeId : undefined;\n if(vm.catalogId === 0 && angular.isUndefinedOrNull(vm.nodeId)) vm.isShowIndex = true;\n /**\n * Define initial value\n */\n var params = {};\n if(vm.isShowIndex){\n params = {keyword:\"\"};\n vm.getData = function (params) {\n vm.params = params;\n if(angular.isUndefined(vm.params.keyword))\n vm.params.keyword='';\n if(vm.params.keyword!=='') {\n vm.sorts = [\n {key : 'ModifiedDate', name:'FIELD.DATE'},\n {key : 'LearningResourceEntries.avgScore', name:'ACTIONS.RATING'},\n {key : 'LearningResourceEntries.clickCount', name:'FIELD.CLICK_COUNT'},\n {key : 'LearningResourceEntries.Title', name:'FIELD.TITLE'}\n ];\n knowledgeManagementCenterService.list( 0, params).then(function(data) {\n vm.KnowledgeManagementCenterDatas = data;\n vm.menulist = vm.KnowledgeManagementCenterDatas.metadata.menulist;\n vm.pagination = vm.KnowledgeManagementCenterDatas.metadata.pagination;\n sitemapService.getSiteMapNodes().walk(function (node) {\n if(angular.isDefined(node.model.stateParams) && angular.isDefined(node.model.stateParams['mid']) && (node.model.stateParams['mid'] === $state.params['mid'])){\n if(vm.menulist.length > 0 && parseInt(vm.menulist[0].id) === parseInt(node.model.stateParams['cid'])){\n vm.menulist[0].title = node.model.title;\n }\n }\n else {\n if(angular.isUndefinedOrNull(vm.mainMenu) && node.model.state === 'courseResourceCatalog') {\n if(node.model.stateParams['cid'] === null || node.model.stateParams['cid'] === vm.catalogId){\n if(vm.menulist.length > 0 && vm.menulist[0].id === node.model.stateParams['cid']){\n vm.menulist[0].title = node.model.title;\n }\n }\n }\n }\n });\n vm.learningResourceBreadcrumb = $filter('stringToBreadcrumb')(vm.menulist, 'sitemap-breadcrumb');\n $state.current._ncyBreadcrumbLabel = vm.learningResourceBreadcrumb;\n vm.learningResourceTitle = $filter('stringToBreadcrumb')(vm.menulist, 'text');\n });\n }\n else{\n var size = 4;\n vm.sorts = [];\n knowledgeManagementCenterService.newDocuments({'size': size}).then(function(data){\n vm.newDocumentsDatas = data;\n angular.element(\"html, body\").animate({\n scrollTop: 0\n },200);\n });\n knowledgeManagementCenterService.hotDocuments( {'size': size}).then(function(data){\n vm.hotDocumentsDatas = data;\n angular.element(\"html, body\").animate({\n scrollTop: 0\n },200);\n });\n }\n };\n }else {\n vm.getData = function (params) {\n var folderId = (angular.isDefined(vm.nodeId)? vm.nodeId : vm.catalogId);\n vm.params = params;\n vm.url = serverSetting.baseConfig.baseURL + '/learning-resource-doc-folder.do';\n vm.EMBAUrl = serverSetting.baseConfig.baseURL + '/learning-resource-doc-list-search-result.do';\n if(angular.isUndefined(vm.params.keyword))\n vm.params.keyword='';\n vm.menulist = [];\n knowledgeManagementCenterService.list( folderId, params).then(function(data){\n vm.KnowledgeManagementCenterDatas = data;\n vm.pagination = vm.KnowledgeManagementCenterDatas.metadata.pagination;\n if(parseInt(vm.catalogId) === 0) {\n sitemapService.getSiteMapNodes().walk(function (node) {\n if (node.model.state === $state.current.name){\n if(angular.equals(node.model.stateParams['mid'], $state.params['mid'])) {\n vm.menulist.push({\n id: node.getPath()[node.getPath().length - 1].model.stateParams['cid'],\n isCWSubCh: 0,\n isEMBA: 0,\n title: node.getPath()[node.getPath().length - 1].model.title\n });\n }\n }\n });\n }\n\n vm.menulist = vm.menulist.concat(vm.KnowledgeManagementCenterDatas.metadata.menulist);\n vm.lastMenulist = vm.KnowledgeManagementCenterDatas.metadata.menulist[vm.KnowledgeManagementCenterDatas.metadata.menulist.length-1];\n sitemapService.getSiteMapNodes().walk(function (node) {\n if(angular.isDefined(node.model.stateParams) && angular.isDefined(node.model.stateParams['mid']) && (node.model.stateParams['mid'] === $state.params['mid'])){\n if(vm.menulist.length > 0 && parseInt(vm.menulist[0].id) === parseInt(node.model.stateParams['cid'])){\n vm.menulist[0].title = node.model.title;\n }\n }\n else {\n if(angular.isUndefinedOrNull(vm.mainMenu) && node.model.state === 'courseResourceCatalog') {\n if(node.model.stateParams['cid'] === null || node.model.stateParams['cid'] === vm.catalogId){\n if(vm.menulist.length > 0 && vm.menulist[0].id === node.model.stateParams['cid']){\n vm.menulist[0].title = node.model.title;\n }\n }\n }\n }\n });\n vm.learningResourceBreadcrumb = $filter('stringToBreadcrumb')(vm.menulist, 'sitemap-breadcrumb');\n $state.current._ncyBreadcrumbLabel = vm.learningResourceBreadcrumb;\n vm.learningResourceTitle = $filter('stringToBreadcrumb')(vm.menulist, 'text');\n\n angular.element(\"html, body\").animate({\n scrollTop: 0\n },200);\n });\n };\n }\n\n vm.getData(params);\n\n }]\n };\n\n angular.module('eHRD.modules.learningResource')\n .component('knowledgeDocument', knowledgeDocument);\n})();\n\n/**\n * Created by Bruce on 2017/7/31.\n */\n\n(function() {\n 'use strict';\n\n var knowledgeDocumentMenu = {\n bindings: {\n catalogId: '=?catalogId',\n nodeId: '=?nodeId'\n },\n templateUrl: 'app/modules/learning-resource/views/knowledge-document-menu.html',\n controller: [ 'knowledgeManagementCenterService', '$state', '$filter', 'serverSetting', 'sitemapService', function(knowledgeManagementCenterService, $state, $filter, serverSetting, sitemapService) {\n var vm = this;\n vm.catalogId = angular.isDefined(this.catalogId) ? this.catalogId : 0;\n vm.previousMenu = undefined;\n vm.mainMenu = undefined;\n\n vm.process = function() {\n sitemapService.getSiteMapNodes().walk(function (node) {\n if(angular.isDefined(node.model.stateParams) && angular.isDefined(node.model.stateParams['mid']) && (node.model.stateParams['mid'] === $state.params['mid'])){\n vm.mainMenu = node.model;\n if ((node.getPath().length -2) > 0 && angular.isDefined(node.getPath()[(node.getPath().length -2)].model.stateParams) &&\n angular.isDefined(node.getPath()[(node.getPath().length -2)].model.stateParams['url']) &&\n node.getPath()[(node.getPath().length -2)].model.stateParams['url'].length > 0) {\n vm.previousMenu = node.getPath()[(node.getPath().length -2)];\n }\n }else {\n if(angular.isUndefinedOrNull(vm.mainMenu) && node.model.state === 'knowledgeDocumentCatalog') {\n if(node.model.stateParams['cid'] === null || node.model.stateParams['cid'] === vm.catalogId){\n vm.mainMenu = node.model;\n if ((node.getPath().length -2) > 0 && angular.isDefined(node.getPath()[(node.getPath().length -2)].model.stateParams) &&\n angular.isDefined(node.getPath()[(node.getPath().length -2)].model.stateParams['url']) &&\n node.getPath()[(node.getPath().length -2)].model.stateParams['url'].length > 0) {\n vm.previousMenu = node.getPath()[(node.getPath().length -2)];\n }\n }\n\n }\n }\n });\n\n if(!vm.previousMenu) {\n sitemapService.getSiteMapNodes().walk(function (node) {\n if(node.model.state === 'index') {\n vm.previousMenu = node;\n }\n });\n }\n };\n\n if(sitemapService.getMenu().length > 0) {\n vm.process();\n } else {\n sitemapService.getProjectSideMenu().then(function (menuItems) {\n sitemapService.setMenu(menuItems);\n vm.process();\n });\n }\n\n\n knowledgeManagementCenterService.menuNodes(vm.catalogId).then(function (data) {\n vm.menu = data;\n });\n\n }]\n };\n\n angular.module('eHRD.modules.learningResource')\n .component('knowledgeDocumentMenu', knowledgeDocumentMenu);\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n local.$inject = ['$translateProvider', 'systemConstantZhTW', 'messageConstantZhTW', 'httpErrorCodeConstantZhTW', 'formValidationConstantZhTW', 'actionsConstantZhTW', 'statusConstantZhTW'];\n function local($translateProvider, systemConstant, messageConstant, httpErrorCodeConstant, formValidationConstant, actionsConstant, statusConstant) {\n $translateProvider.translations('zh-tw', {\n \"FILE_SIZE_ERROR\": \"檔案大小超過500MB無法上傳\",\n\n \"LANGUAGE\":\"語系\",\n \"LANGUAGE_EN\":\"英文\",\n \"LANGUAGE_TW\":\"繁體中文\",\n \"LANGUAGE_CN\":\"簡體中文\",\n \"LEARNING_DASHBOARD\": \"學習儀表板\",\n \"INCOMPLETE_COURSES\": \"待修課程\",\n \"ENROLLMENT\": \"待修課程\",\n \"TEST_QUESTIONNAIRE_CENTER\": \"測驗問卷中心\",\n \"APPROVE_RECORDS\": \"簽核紀錄查詢\",\n \"TRAINING_RECORDS\": \"訓練紀錄查詢\",\n \"COMMUNITY_DISCUSSION_ZONE\":\"社群討論區\",\n \"PUBLIC_DISCUSSION_ZONE\": \"公共討論區\",\n \"CLASSES_DISCUSSION_ZONE\": \"班次討論區\",\n \"INDEX\": \"首頁\",\n \"MY_CURRICULUM\": \"我的課表\",\n \"KNOWLEDGE_MANAGEMENT_CENTER\": \"知識管理中心\",\n \"REPORTS_ZONE\":\"報表專區\",\n \"LEARNING_REPORTS\":\"學習報表\",\n \"SUPERVISOR_ZONE\":\"主管專區\",\n \"DEPARTMENT_DASHBOARD\": \"部門儀表板\",\n \"TRAINING_APPROVE\": \"訓練待簽表單簽核\",\n \"TRAINING_APPROVE_RECORDS_SEARCH\": \"訓練簽核紀錄查詢\",\n \"MEMBER_CURRICULUM\": \"成員課表查詢\",\n \"MEMBER_TRAINING_RECORDS\": \"成員修課紀錄查詢\",\n \"LEARNING_PASSPORT\": \"我的學習護照\",\n \"MY_CALENDAR\": \"我的行事曆\",\n \"MY_SETTING\": \"我的設定\",\n \"COURSE_LEARNING_RESOURCE\": \"課程與學習資源\",\n \"EXTERNAL_TRAINING_ZONE\": \"外訓專區\",\n \"EXTERNAL_TRAINING_APPLY\": \"外訓申請\",\n \"EXTERNAL_TRAINING_APPLY_FORM\": \"外訓申請表單\",\n \"EDIT_EXTERNAL_TRAINING_APPLY_FORM\": \"編輯外訓申請表單\",\n \"VIEW_EXTERNAL_TRAINING_APPLY_FORM\": \"檢視外訓申請表單\",\n \"EXTERNAL_TRAINING_BULLETIN\": \"外訓公佈欄\",\n \"EXTERNAL_TRAINING_APPLY_RECORDS\": \"外訓申請紀錄\",\n \"COURSES_INFO\": \"課程資訊\",\n \"PROGRAM_INFO\": \"學程資訊\",\n \"CERTIFICATE_INFO\": \"證照資訊\",\n \"PROGRAM_INFO_DETAIL\": \"學程資料明細\",\n \"PREREQUISITE_ITEMS\": \"先修項目\",\n \"COURSE_CONTAIN\": \"包含課程\",\n \"GET_THE_PROCESS\": \"取得流程\",\n \"EXTEND_THE_PROCESS\": \"展期流程\",\n \"CERTIFICATE_INFO_DETAIL\": \"證照資料明細\",\n \"LEARNING_IS_TO_WALK_IN_THE_RIGHT_DIRECTION\": \"學習是為了走對方向\",\n \"LEARNING_IS_TO_BREAK_THROUGH_THEIR_OWN\": \"學習是為了突破自己\",\n \"MEMBER_SUGGEST_LEARNING_LIST\": \"成員建議學習項目查詢\",\n \"SUGGEST_LEARNING_LIST\": \"建議學習項目\",\n \"TRAINING_ROAD_MAP\": \"訓練藍圖\",\n \"NEED_GET_PREREQUISITE_ITEMS\": \"必須先取得證照\",\n \"TRAINING_PLAN\": \"訓練計畫\",\n \"CERT_ZONE\":\"證照專區\",\n \"EXTERNAL_CERT_REGISTER\": \"外部證照登錄\",\n \"EXTERNAL_CERT_EXAM_APPLICATION\": \"外部證照考試申請\",\n \"EXTERNAL_CERT_EXAM_ALLOWANCE_APPLICATION\": \"外部證照考試補助申請\",\n \"EXTERNAL_CERT_QUALIFY_REWARD_APPLICATION\": \"外部證照合格獎勵申請\",\n \"EXTERNAL_CERT_APPLICATION_RECORDS_SEARCH\": \"外部證照申請紀錄查詢\",\n \"CERT_RECORDS_SEARCH\": \"證照紀錄查詢\",\n \"TRAINING_PROGRAM_PLANNING\": \"訓練計畫規劃\",\n \"YOU_MUST_FIRST_OBTAIN_A_CERTIFIED_SUBJECT\": \"必須先取得認證科目\",\n \"NEWLY_OBTAIN_THIS_CERTIFIED_SUBJECT_CONDITION\": \"新取得此認證科目條件\",\n \"EXPIRED_AFTER_REACQUISITION_OF_THIS_CERTIFIED_SUBJECT_CONDITION\": \"過期後重新取得此認證科目條件\",\n \"SATISFY_OF_ANY_CONDITION_TO_OBTAIN_A_CERTIFICATE\": \"滿足以下任一條件即可取得證照\",\n \"FINANCIAL_CERT_RECORD_APPLICATION\": \"金融證照記錄申請\",\n \"FINANCIAL_CERT_RECORD_SEARCH\": \"金融證照記錄查詢\",\n \"MEMBER_FINANCIAL_CERT_RECORD_SEARCH\": \"成員金融證照記錄查詢\",\n \"MEMBER_CERT_RECORDS_SEARCH\": \"成員證照記錄查詢\",\n \"COMPETENCY_ZONE\": \"職能專區\",\n \"COMPETENCY_EVALUATION_SUPERVISOR_REPORT\": \"職能評鑑主管報表\",\n \"DEPARTMENT_DROP_ANALYSIS\": \"部門落差分析\",\n \"MEMBER_DROP_ANALYSIS\": \"人員落差分析\",\n \"COMPANY_COMPETENCY_DEFINITION\": \"全公司職能定義\",\n \"CORE_COMPETENCY\": \"核心職能\",\n \"MANAGE_COMPETENCY\": \"管理職能\",\n \"PROFESSION_COMPETENCY\": \"專業職能\",\n \"PERSONAL_EVALUATION_LIST\": \"個人評鑑清單\",\n \"COMPETENCY_EVALUATION_PERSONAL_REPORT\": \"職能評鑑個人報表\",\n \"PERSONAL_DROP_ANALYSIS\": \"個人落差分析\",\n \"PLACEHOLDERS\": {\n \"PLEASE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD\":\"請輸入您的帳號及密碼\",\n \"SEARCH_COURSE_RESOURCE\": \"搜尋課程與學習資源\",\n \"YOU_CAN_SEND_A_MESSAGE_TO_THE_STUDENT_WHO_HAS_BEEN_DESIGNATED_TO_CANCEL_THE_REGISTRATION\": \"你可以送出訊息給被指定取消報名的學員。\",\n \"YOU_CAN_SEND_A_MESSAGE_TO_THE_STUDENT_WHO_HAS_BEEN_DESIGNATED\": \"你可以送出訊息給被指定的學員。\",\n \"CAN_CANCEL_THE_REGISTRATION_OF_STUDENTS\": \"可取消報名的學員\",\n \"PLEASE_ENTER_THE_STUDENT_NAME\": \"請輸入學員姓名\",\n \"PLEASE_ENTER_THE_NUMBER_OF_DAYS\": \"請輸入天數\",\n \"PLEASE_SELECT_DATE\": \"請選擇日期\",\n \"QUESTION_FILLING\": \"填充\",\n \"TOTAL_OF_QUESTIONS\": \"題數 : 總共 {{value}} 題\",\n \"THE_PAPER_WILL_BE_PUBLISHED\": \"試卷將於,{{value}},後公佈(請至修課摘要頁查詢)\",\n \"N_PERSON_LEARNING\": \"{{value}} 人學習\",\n \"N_PERSON_FINISH_COURSE\": \"{{value}} 人完成課程\",\n \"PLEASE_ENTER_YOUR_OLD_PASSWORD\": \"請輸入您的舊密碼\",\n \"PLEASE_ENTER_YOUR_NEW_PASSWORD\": \"請輸入您的新密碼\",\n \"PLEASE_RECONFIRM_YOUR_NEW_PASSWORD\": \"請再次輸入新密碼\",\n \"PLEASE_ENTER_TEXT\": \"請輸入文字\",\n \"SELECT_VENDOR\": \"選擇主辦單位\",\n \"ENTER_AMOUNT\": \"輸入金額\",\n \"NT_CONVERSION\": \"台幣換算金額\",\n \"REASON_OF_LEAVE\": \"請假原因\",\n \"PLEASE_FILL_IN_INTERNAL_LECTURE_SCORE\": \"請填寫內部講授分數\",\n \"PLEASE_FILL_IN_OTHER_METHOD_REPORT_SCORE\": \"請填寫其他方式報告分數\",\n \"PLEASE_FILL_IN_ORAL_REPORT_SCORE\": \"請填寫口頭報告分數\",\n \"WEEK_W_OF_Y\": \"{{year}}年第{{week}}週 \",\n \"PLEASE_SELECT_TRAINING_BLUEPRINT\": \"請選擇訓練藍圖\",\n \"FOR_LESS_THAN_N_THE_FOLLOWING_REPORTS_ARE_NOT_REQUIRED\": \"低於 {{value}} 元則無需下列報告\",\n \"PLEASE_SELECT_A_CATEGORY\": \"請選擇類別\",\n \"SEARCH_FOR_A_VENDORS\": \"查詢單位\",\n \"PLEASE_ENTER_KEYWORDS\": \"請輸入關鍵字\",\n \"CONVERSION_AMOUNT\": \"換算金額\",\n \"PLEASE_ENTER_DEPARTMENT_NAME\": \"請輸入部門名稱\"\n },\n\n \"SYSTEM\": systemConstant,\n\n \"FIELD\": {\n \"APPELLATION\": \"名稱\",\n \"TRACK_QUESTIONNAIRE\": \"追蹤問卷\",\n \"SURVEYBANK_GROUP_MATERIAL\": \"教材\",\n \"TABLE_HEADER_INSTRUCTOR\": \"講師\",\n \"VENUE\": \"場地\",\n \"FACILITY\": \"設備\",\n \"ATTENDANCE_RECORD\": \"出缺席記錄\",\n \"ATTENDANCE_RATE\": \"出席率\",\n \"ATTENDANCE_STATISTIC\": \"出席狀況\",\n \"TOTAL_ITEM\": \"總共{{value}}項\",\n \"COMPLETE_ITEM\": \"完成{{value}}項\",\n \"LEARNING_ITEM\": \"學習項目\",\n \"LEARNING_HISTORY\": \"學習歷程\",\n \"DOCUMENT_TITLE\": \"文件標題\",\n \"DOWNLOAD_TIME\": \"下載時間\",\n \"COURSE_CONTENT\": \"課程內容\",\n \"EXEMPTION_REASON\": \"免修原因 \",\n \"EVER_ENROLLED_COURSE\": \"已修過相關課程\",\n \"EVER_ENROLLED_CERTIFICATION\": \"已領有相關外部證照\",\n \"EVER_ENROLLED_INNER_CERTIFICATION\": \"已領有相關內部證照\",\n \"CERTIFICATION_NAME\": \"證照名稱\",\n \"PROFESSIONAL_KNOWLEDGE\": \"專業知識\",\n \"TECHNICAL_OPERATION\": \"技術操作\",\n \"WORK_ATTITUDE\": \"工作態度\",\n \"COMMUNICATION\": \"人際溝通\",\n \"DEPUTY_DEPARTMENT\": \"被代理的部門\",\n \"SETTING_DATE\":\"設定日期\",\n \"DEPUTY\": \"代理人\",\n \"SETTING_DEPUTY\": \"設定簽核代理人\",\n \"DEPUTY_EFFECTIVE_DATE\":\"代理生效日\",\n \"DEPUTY_END_DATE\":\"代理結束日\",\n \"MY_DEPUTY_SETTING\": \"簽核代理人設定\",\n \"LIST_OF_UNEXPIRED_COURSE_TO_BE_EXPIRED\": \"即將到期課程未完訓名單\",\n \"DEPARTMENT_MEMBERS_FOR_THE_YEAR\": \"當年度轄下部門\",\n \"AVERAGE_TRAINING_HOURS\": \"平均訓練時數\",\n \"MONTHLY_ACCUMULATED_TRAINING_COSTS\": \"各月份累積訓練費用\",\n \"COMPLETION_RATE_OF_DEPARTMENT_MEMBERS\": \"轄下同仁完訓率\",\n \"ATTENDANCE_RATE_OF_DEPARTMENT_MEMBERS\": \"轄下同仁出席率\",\n \"CUMULATIVE_TRAINING_COSTS\": \"累積訓練費用\",\n \"COMPANY_AVERAGE\": \"公司平均\",\n \"DEPARTMENT_EVERYONE_AVERAGE\": \"部門每人平均\",\n \"SEARCH_THIS_AND_SUB_CATEGORIES\": \"搜尋本目錄及子目錄\",\n \"EXTERNAL_TRAINING_WEBSITE\": \"外訓課程網址\",\n \"TIME\": \"時間\",\n \"LEAVE_TIME\": \"請假時間\",\n \"SELECT_LEAVE_TIME\": \"選擇請假時間\",\n \"COURSE_NOT_ATTENDED_REASON\": \"未出席原因\",\n \"CLASS_HOUR\": \"上課時數\",\n \"OTHER_METHOD\": \"其他方式\",\n \"INTERNAL_LECTURE\":\"內部講授\",\n \"SCORE_TO_BE_APPROVED\": \"需簽核評分\",\n \"ORAL_REPORT\":\"口頭報告\",\n \"LECTURE_DEADLINE\":\"講授期限\",\n \"SUBMIT_DEADLINE\":\"繳交期限\",\n \"REPORT_DEADLINE\":\"報告期限\",\n \"NEED_TO_SUBMIT\":\"需繳交\",\n \"UPLOAD_REPORT\":\"上傳報告\",\n \"NO_REPORT\":\"無需報告\",\n \"NEED_TO_COMPLETE_REPORT\":\"須完成下列報告\",\n \"CURRENCY\": \"貨幣\",\n \"AMOUNT\": \"金額\",\n \"SYSTEM_CURRENCY\": \"系統幣別\",\n \"TYPE_OF_SUBSIDY\": \"補助方式\",\n \"FULL\": \"全額\",\n \"SUBSIDY\": \"補助\",\n \"VOUCHER\": \"憑證\",\n \"TAXABLE_INVOICE\": \"應稅發票\",\n \"TAX_FREE_INVOICE\": \"未稅發票\",\n \"RECEIPT\": \"收據\",\n \"PAYMENT_DATE\": \"預定付款日期\",\n \"HIDDEN_COST_INFORMATION\": \"隱藏費用資訊\",\n \"SELECT_VENDOR\": \"選擇主辦單位\",\n \"ENROLLMENT_COST\": \"報名費用\",\n \"COURSE_COST\": \"課程費用\",\n \"COURSE_DETAIL\": \"課程詳細資訊\",\n \"FREE_COURSE\": \"免費課程\",\n \"PAY_COURSE\": \"付費課程\",\n \"KNOWLEDGE_MANAGEMENT_CENTER\": \"知識管理中心\",\n \"COURSE_DESCRIPTION\":\"課程說明\",\n \"REMARK\": \"備註\",\n \"CYCLE_MODE\": \"循環模式\",\n \"REPEAT_INTERVAL\": \"重複間隔\",\n \"WEEK\": \"週\",\n \"MONTH\": \"月\",\n \"YEAR\": \"年\",\n \"MONDAY\": \"星期一\",\n \"TUESDAY\": \"星期二\",\n \"WEDNESDAY\": \"星期三\",\n \"THURSDAY\": \"星期四\",\n \"FRIDAY\": \"星期五\",\n \"SATURDAY\": \"星期六\",\n \"SUNDAY\": \"星期日\",\n \"JANUARY\": \"一月\",\n \"FEBRUARY\": \"二月\",\n \"MARCH\": \"三月\",\n \"APRIL\": \"四月\",\n \"MAY\": \"五月\",\n \"JUNE\": \"六月\",\n \"JULY\": \"七月\",\n \"AUGUST\": \"八月\",\n \"SEPTEMBER\": \"九月\",\n \"OCTOBER\": \"十月\",\n \"NOVEMBER\": \"十一月\",\n \"DECEMBER\": \"十二月\",\n \"VENDOR\": \"主辦單位\",\n \"DOMESTIC\": \"國內\",\n \"ABROAD\": \"國外\",\n \"MULTIPLE_SELECT\": \"可複選\",\n \"JOIN_REASON\": \"參加理由\",\n \"TEACH_DEADLINE\": \"講授期限\",\n \"REST_TIME\": \"休息時間\",\n \"SETTING_CYCLE_WEEK\": \"設定循環週期\",\n \"TRAINING_NATURE\": \"訓練性質\",\n \"ASSIGNED_BY_MANAGER\": \"主管指派\",\n \"PERSONAL_REQUESTS\": \"個人需求\",\n \"TRUE\": \"是\",\n \"FALSE\": \"否\",\n \"UPLOAD_COURSE_DATA\": \"上傳課程資料\",\n \"ENROLLMENT_INFORMATION\": \"報名資訊\",\n \"ENROLLMENT_WEBSITE\": \"報名網址\",\n \"NO_INFORMATION\": \"暫無資料\",\n \"TRAINING_HOURS_IN_THE_QUARTER\": \"第{{value}}季累計訓練時數(通過)\",\n \"AVERAGE_TRAINING_HOURS_OF_COMPANY\": \"全公司平均訓練時數(通過)\",\n \"TRAINING_BLUEPRINT_PROGRESS\": \"訓練藍圖進度\",\n \"INCOMPLETE_ITEM\": \"未完成項目\",\n \"INTERNAL_CERTIFICATION_PROGRESS\": \"內部證照取得進度\",\n \"PERFORM_LATEST_NEWS\": \"平台最新動態\",\n \"MY_LEARNING_RESUME\": \"我的學習履歷\",\n \"LOGIN_PLATFORM\": \"登入平台\",\n \"LEARNING_COURSE\": \"閱讀課程\",\n \"FILE_IN_ONLINE_QUESTIONNAIRE\": \"填寫問卷\",\n \"FILE_IN_ONLINE_TEST\": \"填寫測驗\",\n \"FILE_IN_QUESTIONNAIRE\": \"填寫問卷\",\n \"FILE_IN_TEST\": \"填寫測驗\",\n \"LEARNING_KNOWLEDGE_DOCUMENT_CENTER\": \"點閱知識文件中心\",\n \"VIEW_DOCUMENT_CENTER\": \"瀏覽文件中心\",\n \"FORUM_PUBLISHED_ARTICLE\": \"討論區發表文章\",\n \"ENROLLMENT_COURSE\": \"報名課程\",\n \"CANCEL_COURSE\": \"取消報名\",\n \"ONLINE_COURSE_LEARNING_TIME_CURVE\": \"線上課程學習時數曲線圖\",\n \"LEARNING_HOURS\": \"學習時數\",\n \"SIX_MONTH\": \"近六個月\",\n \"DISTRIBUTION_MAP_OF_COURSES_IN_EACH_CATEGORY\": \"各類別課程修課分布圖\",\n \"TOTAL_OF_ONLINE_COURSE_LEARNING_HOURS\": \"線上課程累計閱讀時數\",\n \"CUMULATIVE_OF_PASSED_COURSES\": \"累計通過課程數\",\n \"TOTAL_OF_CERTIFICATION\": \"取得證照總數\",\n \"CUMULATIVE_OF_TRAINING_COSTS_FOR_THE_YEAR\": \"當年度外訓費用累計\",\n \"PENDING_APPROVALS\": \"待簽表單\",\n \"APPROVE_PROCESS\": \"簽核流程\",\n \"APPROVE_DETAIL\": \"簽核詳細資訊\",\n \"APPROVE_RECORD\": \"簽核紀錄\",\n \"APPLY_COSTS\": \"本次申請費用\",\n \"STUDENT_TRAINING_COSTS_HAVE_OCCURRED\": \"已發生學生訓練費用\",\n \"DEPARTMENT_TRAINING_COSTS_HAVE_OCCURRED\": \"已發生部門訓練費用\",\n \"KEYWORD\": \"關鍵字\",\n \"DEPARTMENT_NAME\": \"部門名稱\",\n \"DEPARTMENT_MEMBER\": \"部門成員\",\n \"DEPARTMENT_MEMBERS\": \"轄下同仁\",\n \"LEARNING_ACTIVITY\": \"學習活動\",\n \"LEARNING_ACTIVITY_STATUS\": \"學習活動狀態\",\n \"SEARCH_COURSE_NAME\": \"搜尋課程名稱\",\n \"SELECT_SEARCH_FILTER\": \"選擇搜尋條件\",\n \"PLEASE_RATING\": \"請評分\",\n \"START_DATE\": \"開始日期\",\n \"END_DATE\": \"結束日期\",\n \"COURSE_START_DATE\": \"上課開始日期\",\n \"AUTHOR\": \"作者\",\n \"LOCATION\": \"位置\",\n \"ROOT_DIRECTORY\": \"總目錄\",\n \"CLICK_COUNT\": \"點閱次數\",\n \"DOWNLOAD_COUNT\": \"下載次數\",\n \"DOWNLOAD_COUNT_DETAIL\": \"下載次數明細\",\n \"I_WANT\": \"我要\",\n \"AVERAGE_RATING\": \"平均評分\",\n \"SHARE_DATE\": \"分享日期\",\n \"HOT_DOCUMENT\": \"熱門文件\",\n \"TITLE\": \"標題\",\n \"TYPE\": \"類型\",\n \"APPLICANT\": \"申請人\",\n \"APPLICANT_DEPARTMENT\": \"申請人部門\",\n \"APPLY_DATE\": \"申請日期\",\n \"ARRIVAL_DATE\": \"送達日期\",\n \"APPLY_START_DATE\" :\"申請開始日期\",\n \"APPLY_END_DATE\" :\"申請結束日期\",\n \"APPROVER\" :\"簽核人\",\n \"LEARNING_CATEGORY\": \"學習目錄\",\n \"ENROLLMENT_TIME\": \"修課時間\",\n \"COURSE_DATE\": \"上課日期\",\n \"HOURS\": \"時數\",\n \"TIME_OF_HOURS\": \"時數(小時)\",\n \"HOUR\": \"小時\",\n \"ENROLLMENT_HOURS\": \"修課時數\",\n \"PASS_STATUS\": \"通過狀態\",\n \"COST\": \"費用\",\n \"TEST_SCORE\": \"測驗成績\",\n \"LEARNING_REPORT\": \"學習報告\",\n \"ENROLLMENT_NUMBER_OF_PEOPLE\": \"修課人數\",\n \"DOWNLOAD_NUMBER_OF_PEOPLE\": \"下載人數\",\n \"INCOMPLETED_NUMBER_OF_PEOPLE\": \"未完成人數\",\n \"EXEMPTION_NUMBER_OF_PEOPLE\": \"免修人數\",\n \"EXEMPTION\": \"免修\",\n \"APPLY_FOR_EXEMPTION\": \"免修申請\",\n \"PASSED_NUMBER_OF_PEOPLE\": \"通過人數\",\n \"FAILED_NUMBER_OF_PEOPLE\": \"未通過人數\",\n \"DROP_NUMBER_OF_PEOPLE\": \"退選人數\",\n \"LEARNER_SATISFACTION\":\"學員總體滿意度\",\n \"MANAGER_SATISFACTION\":\"管理員總體滿意度\",\n \"PASSED_COUNT\": \"通過數\",\n \"EXEMPTION_COUNT\": \"免修數\",\n \"TOTAL\": \"總數\",\n \"ENROLLMENT_STATUS\": \"修課狀態\",\n \"CURRENT_PROCESS\": \"目前流程\",\n \"CHANGE_PASSWORD\": \"變更密碼\",\n \"TEST_QUESTIONNAIRE\": \"測驗問卷\",\n \"ALL_COURSE\": \"全部課程\",\n \"LATEST_COURSE\": \"最新課程\",\n \"HOT_COURSE\": \"熱門課程\",\n \"FEATURED_COURSE\": \"精選課程\",\n \"LATEST_NEWS\": \"最新公告\",\n \"ONLINE_COURSE_LEADERBOARD\": \"線上課程排行榜\",\n \"LATEST_DOCUMENT\": \"最新文件\",\n \"RELATED_SITES\": \"相關網站\",\n \"USERNAME\": \"使用者名稱\",\n \"USER_ACCOUNT\": \"使用者帳號\",\n \"ACCOUNT\": \"帳號\",\n \"NAME\": \"名字\",\n \"LAST_NAME\": \"姓氏\",\n \"PASSWORD\":\"密碼\",\n \"ACTION\": \"動作\",\n \"ALL\": \"全部\",\n \"ORDER\": \"順序\",\n \"PASSED_DATE\": \"通過日期\",\n \"SPECIFIC\": \"特定\",\n \"PROGRAM\": \"學程\",\n \"COURSE\": \"課程\",\n \"ONLINE_COURSE\": \"線上課程\",\n \"CLASS_ROOM_COURSE\": \"教室課程\",\n \"EXTERNAL_TRAINING\": \"外訓\",\n \"INTERNAL_TRAINING\": \"內訓\",\n \"INTERNAL\": \"內部\",\n \"EXTERNAL\": \"外部\",\n \"ONLINE_TEST\": \"線上測驗\",\n \"CLASS_ROOM_TEST\": \"教室測驗\",\n \"TEST\": \"測驗\",\n \"QUESTIONNAIRE\": \"問卷\",\n \"INTERNAL_LICENSE\": \"內部證照\",\n \"EXTERNAL_LICENSE\": \"外部證照\",\n \"MY_FAVOURITE\": \"我的最愛\",\n \"ABOUT_THIS_COURSE\": \"關於本課程\",\n \"ABOUT_THIS_PROGRAM\": \"關於本學程\",\n \"ABOUT_THIS_CERTIFICATE\": \"關於本證照\",\n \"TOTAL_NUMBER_OF_CLASSES\": \"累計上課人數\",\n \"COURSE_NAME\": \"課程名稱\",\n \"PROGRAM_NAME\": \"學程名稱\",\n \"COURSE_INFO_DETAIL\": \"課程資料明細\",\n \"COURSE_INFO\": \"課程資訊\",\n \"SESSION\": \"班次\",\n \"SESSION_NAME\": \"班次名稱\",\n \"SESSION_INFO\": \"班次資訊\",\n \"CLASS_TIME\": \"上課時間\",\n \"ENROLL_DEADLINE\": \"報名期限\",\n \"TEST_DEADLINE\": \"測驗期限\",\n \"VIEW_DEADLINE\": \"觀看期限\",\n \"FILL_IN_DEADLINE\": \"填寫期限\",\n \"LAST_PLAYER\": \"上次播放至\",\n \"ENROLLMENT_INFO\": \"修課資訊\",\n \"REFERENCE_DOCUMENT\": \"參考文件\",\n \"REFERENCE_COURSE\": \"參考課程\",\n \"COURSE_TYPE\": \"課程類型\",\n \"INSTRUCTOR\": \"講師\",\n \"EVENT_LOCATION\": \"活動地點\",\n \"NUMBER_OF_PEOPLE\": \"人數\",\n \"ENROLL_NUMBER_OF_PEOPLE\": \"報名人數\",\n \"ENROLL_TYPE\": \"報名方式\",\n \"REMAINING_AMOUNT\" : \"尚餘名額\",\n \"NO_UPPER_LIMIT\": \"沒有上限\",\n \"PENDING_PREDETERMINED_COST\": \"預估每人費用\",\n \"COURSE_ATTRIBUTES\": \"課程屬性\",\n \"COURSE_INTRODUCTION\": \"課程簡介\",\n \"PROGRAM_INTRODUCTION\": \"學程簡介\",\n \"COURSE_OUTLINE\": \"課程大綱\",\n \"LEARNING_GOAL\": \"學習目標\",\n \"UNDERSTANDING\": \"了解\",\n \"THROUGH_THE_RULES\": \"通過規則\",\n \"APPLY_STATUS\": \"申請狀態\",\n \"SUITABLE_FOR_THE_OBJECT\": \"適合對象\",\n \"SUITABLE_FOR_LEVEL\": \"適合層級\",\n \"PREPARATORY_KNOWLEDGE\": \"預備知識\",\n \"DIFFICULTY\": \"難度\",\n \"DURATION\": \"長度\",\n \"PROPERTIES\": \"必選修\",\n \"COURSE_ELECTIVE\": \"選修\",\n \"COURSE_REQUIRED\": \"必修\",\n \"IS_WILL_EXPIRE\": \"即將到期\",\n \"LAST_LEARNING_DATE\": \"最後學習日\",\n \"OVERALL_RESULT\": \"總成績\",\n \"ENROLL_MANAGER\": \"報名管理\",\n \"ASSIGNABLE_MEMBER_ENROLL\": \"指定成員報名\",\n \"ASSIGNABLE_MEMBER_ALTERNATE\": \"指定成員候補\",\n \"UN_ASSIGNABLE_MEMBER_ENROLL\": \"取消成員報名\",\n \"ASSIGNABLE_STATUS\": \"指定的狀態\",\n \"ASSIGNER\": \"指定者\",\n \"CLASSMATE\": \"同班同學\",\n \"FORUM\": \"討論區\",\n \"DESCRIPTION\": \"說明\",\n \"CREATE_DATE\": \"建立日期\",\n \"DATE\": \"日期\",\n \"BASIC_INFORMATION\": \"基本資料\",\n \"OTHER\": \"其他\",\n \"NOTHING\": \"無\",\n \"FULL_NAME\": \"姓名\",\n \"EMPLOYEE_NUMBER\": \"員工編號\",\n \"DEPARTMENT\": \"部門\",\n \"JOB_TITLE\": \"職稱\",\n \"EMAIL\": \"電子郵件\",\n \"OFFICE_PHONE\": \"辦公室電話\",\n \"ADD_DATE\": \"新增日期\",\n \"TOTAL_ENROLLMENT_COUNT\": \"總修課數\",\n \"REASON\": \"理由\",\n \"DUTY_DAY\": \"到職日\",\n \"GRADE_NAME\": \"職等\",\n \"DUTY_CODE\": \"職務代碼\",\n \"ADD_LEARNER\": \"新增學員\",\n \"SELFENROLLED\": \"自行報名\",\n \"ASSIGNED\": \"指定報名\",\n \"COURSE_DEADLINE\": \"課程到期日\",\n \"DIRECTLY_SPECIFY_DEADLINES\": \"直接指定期限\",\n \"UNLIMITED\": \"無限制\",\n \"LEARNING_CENTER\": \"學習中心\",\n \"COURSE_LIST\": \"課程清單\",\n \"LEARNING_RESULT\": \"學習成果\",\n \"MINIMUM_VIEWING_TIME\": \"最低觀看時間\",\n \"VIEWING_TIME\": \"觀看時間\",\n \"COURSE_TIME\": \"課程時間\",\n \"FINISH_TIME\": \"完成時間\",\n \"SELECTED\": \"已選擇\",\n \"FILES\": \"檔案\",\n \"LIST_ALL_SUBORDINATE_MEMBERS\": \"列出所有直屬部屬\",\n \"LIST_MY_GROUP_MEMBERS\": \"列出同部門同仁\",\n \"YOU_HAVE_SELECTED_MEMBERS\": \"您已選擇以下指定人員\",\n \"EXECUTION_DATE\": \"指定報名生效日\",\n \"DAYS\": \"天\",\n \"AFTER_THE_SUCCESSFUL_REGISTRATION\": \"報名成功後\",\n \"YOU_CAN_SET_A_DURATION_FOR_THE_TRAINEES\": \"您可以針對學員設定修習期限\",\n \"STATUS\": \"狀態\",\n \"REPORT\": \"報告\",\n \"SUBMIT_REPORT\": \"繳交報告\",\n \"SUBMIT_REPORT_DEADLINE\": \"繳交報告期限\",\n \"SUBMITTED_REPORT\": \"已繳交報告\",\n \"UPLOADED_REPORT_LIST\": \"已繳交報告清單\",\n \"SHOULD_BE_SUBMIT_REPORT\": \"應繳\",\n \"HAS_BEEN_PAID\": \"已繳\",\n \"SERIAL_NUMBER\": \"序號\",\n \"FILE_NAME\": \"檔案名稱\",\n \"SCORE\": \"分數\",\n \"POINT\": \"分\",\n \"NOT_YET_RATED\": \"尚未評分\",\n \"GRADE_QUESTIONS\": \"答對\",\n \"WRONG_QUESTIONS\": \"答錯\",\n \"DATE_OF_PAYMENT\": \"繳交日期\",\n \"APPROVE_STATUS\": \"簽核狀態\",\n \"COURSE_TITLE\": \"課程標題\",\n \"QUESTION_ANALYSIS\": \"解析\",\n \"LECTURER_RATING_REQUIRED\": \"需講師評分\",\n \"INTRODUCTION\": \"簡介\",\n \"INSTRUCTOR_NAME\": \"講師姓名\",\n \"INSTRUCTOR_PROPERTIES\": \"講師屬性\",\n \"INSTRUCTOR_COMPANY\": \"講師廠商\",\n \"COMPANY\": \"公司\",\n \"EDUCATION\": \"學歷\",\n \"EXPERIENCE\": \"經歷\",\n \"CERTIFICATION\": \"認證資格\",\n \"EXPERTISE\": \"專長\",\n \"INSTRUCTOR_PHOTO\": \"講師照片\",\n \"INSTRUCTOR_DETAIL\": \"講師明細\",\n \"BIRTHDAY\": \"生日\",\n \"INDUCTION_DATE\": \"到任日\",\n \"ADDRESS\": \"地址\",\n \"MOBILE_PHONE\": \"行動電話\",\n \"HOME_PHONE\": \"住家電話\",\n \"MY_PREFERENCE\": \"喜好設定\",\n \"COURSE_FOLDER_PRESURVEY\": \"報名問卷\",\n \"COURSE_FOLDER_PRETEST\": \"課前測驗\",\n \"COURSE_FOLDER_CONTENT\": \"課程內容\",\n \"COURSE_FOLDER_POSTSURVEY\": \"課後問卷\",\n \"COURSE_FOLDER_POSTTEST\": \"課後測驗\",\n \"COURSE_FOLDER_REFERENCE\": \"參考文件\",\n \"COURSE_FOLDER_TEST\": \"測驗\",\n \"COURSE_FOLDER_SURVEY\": \"問卷\",\n \"COURSE_FOLDER\": \"課程目錄\",\n \"VIEW_FILES\": \"觀看檔案\",\n \"TIME_LEFT\": \"剩餘時間\",\n \"QUESTION_ANSWERED\": \"已答題\",\n \"QUESTION_NOT_ANSWERED\": \"未答題\",\n \"QUESTION_REQUIRED\": \"必填題\",\n \"TEST_TIME\": \"測驗時間\",\n \"CAN_TEST_NUMBER_OF_TIMES\": \"可測驗之次數\",\n \"LAST_TEST_NUMBER_OF_TIMES\": \"剩餘測驗次數\",\n \"NUMBER_OF_TIMES\": \"次\",\n \"TO_THE_HIGHEST_SCORE\": \"以最高分為主\",\n \"SELECT_THE_HIGHEST_SCORE_ONCE\": \"選最高分一次\",\n \"STAY_TUNED\": \"敬請期待\",\n \"RELATED_LINKS\": \"相關連結\",\n \"COURSE_LINKS\": \"課程連結\",\n \"SUMMARY\": \"摘要\",\n \"ALL_ANNOUNCEMENTS\": \"全部公告\",\n \"VIEW_MY_ANSWERED\": \"檢視我的答案\",\n \"PASSING\": \"通過\",\n \"PROPORTION_OF_PERSONNEL\": \"人員比例\",\n \"EXPIRED_ITEMS\": \"到期項目\",\n \"LEARNER_DURATION_OF_STUDY\": \"學員修習期限\",\n \"SESSION_CLASS_DEADLINE\": \"班次上課期限\",\n \"DETAILS\": \"詳細資料\",\n \"CREDITS\": \"學分\",\n \"TOTAL_CREDITS\": \"總學分\",\n \"PERSONAL_SETTING\": \"個人設定\",\n \"PART\": \"份\",\n \"ALL_DEPARTMENT\": \"所有部門\",\n \"NUMBER_OF\": \"筆\",\n \"PER_PAGE\": \"每頁\",\n \"BUSINESS_LEAVE\": \"公務出差\",\n \"PERSONAL_LEAVE\": \"私事請假\",\n \"SICK_LEAVE\": \"病假\",\n \"TRACKING_OBJECT\": \"追蹤對象\",\n \"TRACKING_DEPARTMENT\": \"追蹤部門\",\n \"TRACKING_PERIOD\": \"追蹤期別\",\n \"SIZE\": \"大小\",\n \"EXPIRED\": \"已滿\",\n \"UNEXPIRED\": \"未滿\",\n \"A_MONTH\": \"個月\",\n \"ALL_STAFF\": \"所有人員\",\n \"ANY_TIME_ZONE\": \"時間區段不限\",\n \"RELATED_TO_ME\": \"與部門相關\",\n \"MY_TRAINING\":\"我的藍圖\",\n \"THERE_IS_NO_DATA\": \"目前尚無資料\",\n \"PLEASE_AT\": \"請在\",\n \"SET_THE_CONDITIONS_CONDUCIVE_TO_SEARCH\": \"設定條件,利於進行搜尋\",\n \"EVALUATION_STAFF\": \"評鑑對象\",\n \"OTHER_NEED\": \"其他需求\",\n \"ADD_ITEM_FORM_STUDY_CATALOG\": \"從學習目錄加入項目\",\n \"SPECIFY_APPLICANT\": \"指定報名者\",\n \"TRAINING_PLAN\": \"訓練計劃\",\n \"TRAINING_BLUEPRINT\": \"訓練藍圖\",\n \"COMPETENCE_RECOMMEND\": \"職能建議\",\n \"SELF_DEMANDING\": \"自我要求\",\n \"MANAGER_RECOMMEND\": \"主管建議\",\n \"ABILITY_RECOMMEND\": \"能力建議\",\n \"PERSONAL_DEVELOPMENT\": \"個人發展\",\n \"SCORE_PASSING\": \"及格\",\n \"SCORE_FAILED\": \"不及格\",\n \"LEARNING_STATUS\": \"學員狀態\",\n \"SOURCE\": \"來源\",\n \"ESTIMATED_COMPLETION_DATE\": \"預定完成日期\",\n \"ENROLLMENT_DATE\": \"報名日期\",\n \"SEARCH_DEPUTY\": \"搜尋代理人\",\n \"WATCH_REPORT\": \"觀看報告\",\n \"CERTIFICATE_NAME\": \"證照名稱\",\n \"FILL_IN_END_DATE\": \"填寫結束日\",\n \"ANNOUNCEMENT_TIME\": \"公告時間\",\n \"DUTY\": \"到職\",\n \"INDUCTION\": \"到任\",\n \"YOU_HAVE_ADD_OTHER_REQUIREMENTS\": \"您已加入以下其他需求\",\n \"YOU_HAVE_SELECTED_COURSES\": \"您已選擇以下指定課程\",\n \"VIEW_ITEM\": \"檢視項目\",\n \"THOUSAND\": \"仟元\",\n \"ENCRYPTION\": \"加密\",\n \"COURSE_CODE\": \"課程代碼\",\n \"MINUTE\": \"分鐘\",\n \"CLASSIFICATION\": \"類別\",\n \"RELATED_CERTIFICATE\": \"關聯證照\",\n \"CERTIFICATE_RECOGNIZED_HOURS\": \"證照認列時數\",\n \"CERTIFICATE_TYPE\": \"證照類別\",\n \"REWARD_METHOD\": \"獎勵方式\",\n \"VALIDITY_PERIOD\": \"有效期限\",\n \"CERTIFICATE_CODE\": \"證照代碼\",\n \"PROGRAM_CODE\": \"學程代碼\",\n \"TEST_CODE\": \"測驗代碼\",\n \"TEST_TYPE\": \"測驗類型\",\n \"OTHERS\": \"其他\",\n \"COUNSELOR_DETAIL\": \"輔導員明細\",\n \"LEARNER_DETAIL\": \"學員明細\",\n \"SPECIALTY_COURSE_CLASSIFICATION\": \"專長課程類別\",\n \"SETTING_CLASS_TIME\": \"設定上課時間\",\n \"TIME_ZONE\": \"時間區段\",\n \"TIME_TABLE\": \"時間表\",\n \"LUNCH_TIME\": \"午休時間\",\n \"CYCLE_TIME\": \"循環週期\",\n \"INTERVAL\": \"間隔\",\n \"FULL_AMOUNT\": \"全額\",\n \"CASH\": \"現金\",\n \"REMITTANCE\": \"匯款\",\n \"CHEQUE\": \"支票\",\n \"PAYEE\": \"受款人\",\n \"REMITTANCE_INFORMATION\": \"匯款資料\",\n \"THE_TITLE_OF_THE_COMPANY\": \"抬頭\",\n \"BRANCHES\": \"分行\",\n \"RECEIPT_INFORMATION\": \"票據資料\",\n \"THE_TITLE_OF_THE_RECEIPT\": \"票據抬頭\",\n \"RECEIPT_EXPIRE_DATE\": \"票據到期日\",\n \"RECEIPT_FORMAT\": \"票據格式\",\n \"RECEIPT_DELINEATE\": \"票據劃線\",\n \"ENDORSEMENT_OR_TRANSFERENCE_PROHIBITED\": \"註明禁止背書轉讓\",\n \"APPLICATION_CONTENT\": \"請款內容\",\n \"COURSE_DATA\": \"課程資料\",\n \"FILL_IN_OTHER_METHOD\": \"填寫其他方式\",\n \"TEST_HISTORY_SEARCH\": \"測驗歷史查詢\",\n \"ANSWER_DATE\":\"作答日期\",\n \"TOTAL_COUNT\": \"總共{{value}}次\",\n \"AVERAGE_SATISFACTION\": \"平均滿意度\",\n \"NUMBER_OF_COURSES_DUE_WITHIN_THIS_WEEK\": \"一週內即將到期課程數\",\n \"CUMULATIVE_TRAINING_COSTS_FOR_THE_YEAR\": \"當年度累計訓練費用\",\n \"WILL_BE_EXPIRED_COURSES\": \"個將到期課程\",\n \"DOLLARS\": \"元\",\n \"THERE_IS_NO_ROADMAP_DATA\": \"尚無藍圖資料\",\n \"THERE_IS_NO_CERTIFICATE_DATA\": \"尚無證照資料\",\n \"TODAY_IS_NOT_ANY_SCHEDULE\": \"今天沒有任何行程\",\n \"REQUISITION_NUMBER\": \"申請單編號\",\n \"TRAINING_NAME\": \"訓練名稱\",\n \"APPLY_THW_WAY\": \"申請方式\",\n \"LEARN_TOTAL_TIME\": \"修習總時數\",\n \"PASS_NUMBER\": \"通過個數\",\n \"FAILED_NUMBER\": \"未通過個數\",\n \"EXEMPTION_NUMBER\": \"免修個數\",\n \"TEST_FRACTION\": \"測驗分數\",\n \"COMMUNITY\": \"社群\",\n \"CERTIFICATE_INTRODUCTION\": \"證照簡介\",\n \"COUNSELOR\": \"輔導員\",\n \"LANGUAGE\": \"語言\",\n \"GENERAL_SESSION\": \"一般班次\",\n \"EXTEND_SESSION\": \"展期班次\",\n \"SEARCH_SCOPE\": \"搜尋範圍\",\n \"SEARCH_SCOPE_ALL\": \"所有的\",\n \"SEARCH_SCOPE_DEPARTMENT\": \"轄下的\",\n \"NOTES\": \"附註\",\n \"CONTACT_PERSON\": \"聯絡人\",\n \"CONTACT_PERSON_EMAIL\": \"聯絡人電子信箱\",\n \"CONTACT_PERSON_PHONE\": \"聯絡人電話\",\n \"TOMORROW_TO_REMIND\": \"明日提醒\",\n \"TOMORROW_IS_NOT_ANY_SCHEDULE\": \"明日沒有任何行程\",\n \"TODAY\": \"今日\",\n \"DAY\": \"日\",\n \"WEEK_OF_YEAR\": \"{{year}} 年 第 {{week}} 週\",\n \"ITEM\": \"項目\",\n \"PROGRESS_OF_SUBMIT_REPORT\": \"繳交進度\",\n \"OCCUPY_WAIT_LIST\": \"目前候補\",\n \"REMAIN_WAIT_LIST\": \"尚餘候補\",\n \"DAYS_IN_DURATION\": \"區間內的\",\n \"INCLUDE\": \"包含\",\n \"REFERENCE_MATERIAL\": \"參考資料\",\n \"SUBSIDY_COST\": \"補助費用\",\n \"SELF_COST\": \"自費\",\n \"LAST_EXTERNAL_TRAINING_HISTORY\": \"前次外訓紀錄\",\n \"EXTERNAL_TRAINING_APPLY_TIMES_PRE\": \"該員本年度已被核准\",\n \"EXTERNAL_TRAINING_APPLY_TIMES_POST\": \"次外訓申請\",\n \"EXTERNAL_TRAINING_APPLY_COST\": \"累計外訓金額\",\n \"TAX_FREE\": \"未稅\",\n \"EXTERNAL_TRAINING_REPORT\": \"心得報告\",\n \"EXTERNAL_TRAINING_NO_REPORT_NEED\": \"無須繳交\",\n \"UN_PAID\": \"未繳\",\n \"ORIGIN\": \"原因\",\n \"TRAINING_MATERIAL\": \"訓練教材\",\n \"APPLICANT_INFORMATION\": \"申請人資訊\",\n \"PAY_INFORMATION\": \"付費資訊\",\n \"VENDOR_RECEIVER_NAME\": \"廠商收件人\",\n \"APPROVAL_PROCESS_RECORDS\": \"簽核流程記錄\",\n \"EXTERNAL_TRAINING_APPLY_DETAIL\": \"外訓申請明細\",\n \"FILLER\": \"填表人\",\n \"COMPANY_DETAIL\": \"廠商明細\",\n \"DOCUMENT_REPORT\": \"文件報告\",\n \"NOT_CREATED\": \"尚未建立\",\n \"COMPLETION_PERCENTAGE\": \"完成比例\",\n \"RECENTLY_COMPLETED_THE_TRAINEES\": \"最近完成學員\",\n \"THERE_IS_NO_SATISFACTION_DATA\": \"尚無滿意度資料\",\n \"FILL_IN_TIME\": \"填寫時間\",\n \"ORIGINAL_FACTORY_NAME\": \"原廠名稱\",\n \"CERTIFIED_SUBJECT\": \"認證科目\",\n \"APPLY_CATEGORY\": \"申請類別\",\n \"CERTIFICATE_GET_DATE\": \"證照取得日期\",\n \"CERTIFICATE_DEADLINE\": \"證照到期日\",\n \"NEW_APPLY\": \"新申請\",\n \"EXTENSION_APPLY\": \"展期申請\",\n \"PERMANENT\": \"永久有效\",\n \"CERTIFICATE_NUMBER\": \"證照編號\",\n \"ONE\": \"一\",\n \"TWO\": \"二\",\n \"THREE\": \"三\",\n \"TEST_DATE\": \"考試日期\",\n \"APPLY_REASON\": \"申請理由\",\n \"TEST_PLAN\": \"考試地點\",\n \"DETAIL_ADDRESS\": \"詳細地址\",\n \"TEST_COST\": \"考試費用\",\n \"ACQUIRE_DATE\": \"取得日期\",\n \"VALID_DATE\": \"有效日期\",\n \"BONUS\": \"獎勵\",\n \"CERT_TYPE\": \"證照種類\",\n \"SUBJECT_TO_USER_GRADE\": \"成績\",\n \"NEVER_EXPIRE\": \"永遠有效\",\n \"EXCERT_ADD_LICENSE_INFO\": \"補登資料\",\n \"SELECT_START_END_DATE\": \"選擇起迄日期\",\n \"VALID_DATE_START\": \"有效日期起\",\n \"VALID_DATE_END\": \"有效日期訖\",\n \"APPLICABLE_UNITS\": \"適用單位\",\n \"PERCENTAGE_OF_EXAMINATIONS\": \"考試補助比例\",\n \"CONDITION_NUMBER\": \"條件序號\",\n \"HAS_BEEN_CERTIFIED_SUBJECTS\": \"已取得認證科目\",\n \"PASS_THE_EXAM_PROJECT\": \"通過考試項目\",\n \"EXCERT_RELATED_FORM\": \"相關申請表單\",\n \"APPLY_DATE_START\": \"申請日期起\",\n \"APPLY_DATE_END\": \"申請日期訖\",\n \"EXCERT_APPLY_TEST_DATE\": \"考試申請日期\",\n \"EXCERT_UNAPPLIED_ITEMS\": \"未申請項目\",\n \"BONUS_COST\": \"獎金\",\n \"BONUS_APPLY_DATE\": \"獎勵申請日期\",\n \"EXCERT_APPLY_TEST\": \"考試申請\",\n \"TEST_ITEMS\": \"考試項目\",\n \"EXCERT_REAL_COMPENSATION\": \"實際補助金額\",\n \"COMPENSATION\": \"補助\",\n \"EXCERT_REGISTER_APPLY\": \"登錄申請\",\n \"REGISTER_APPLY_DATE\": \"登錄申請日期\",\n \"APPLY_INFO\": \"申請資訊\",\n \"EXTERNAL_CERT_EXAM_BASE_INFO\": \"外部證照考試基本資料\",\n \"CREATE_FROM\": \"課程來源(簽核通過後)\",\n \"EXTERNAL_AUTO_CREATE\": \"自動產生外訓課程\",\n \"EXTERNAL_ADD_COURSE\": \"將學員加入指定班次\",\n \"ASSIGNED_COURSE_CLASS\": \"已指定班次\",\n \"THE_PAYMENT_N_LEARNING_REPORT\": \"本次繳交 {{value}} 份學習報告\",\n \"I_WANT_TO_ENROLL\":\"我要報名\",\n \"PLAY_THE_COURSE\":\"播放課程\",\n \"YOU_MAY_BE_INTERESTED_IN_THE_FOLLOWING_COURSES\": \"您也許對下列課程也有興趣\",\n \"AVERAGE_TRAINING_HOURS_IN_EACH_DEPARTMENT\": \"轄下各部門平均訓練時數\",\n \"EMPLOYEE_TRAINING_HOURS\": \"同仁訓練時數\",\n \"AVERAGE_TRAINING_COSTS\": \"平均訓練費用\",\n \"CUMULATIVE_TRAINING_COSTS_IN_EACH_DEPARTMENT\": \"轄下各部門累積訓練費用\",\n \"EMPLOYEE_CUMULATIVE_TRAINING_COSTS\": \"同仁累積訓練費用\",\n \"IN_EACH_DEPARTMENT\": \"轄下部門\",\n \"CLICK_THE_PATH_AND_EXPAND_THE_DATA\": \"可點擊色塊並展開資料\",\n \"LICENSE\": \"證照\",\n \"LEARNING_DETAIL_OF_THE_YEAR\": \"當年度修課明細\",\n \"TEACHING_HOURS\": \"授課時數\",\n \"CERTIFICATE_LIST\": \"證照列表\",\n \"IN\": \"內\",\n \"OUT\": \"外\",\n \"THERE_IS_NO_COURSE_DATA\": \"尚無課程資料\",\n \"THERE_IS_NO_COST_DATA\": \"尚無費用資料\",\n \"CURRENT_DEPARTMENT\": \"目前所在部門\",\n \"LECTURER_TEACHING_DATA\": \"講師授課資料\",\n \"LECTURER_TEACHING_SATISFACTION\": \"講師授課滿意度\",\n \"CUMULATIVE_TEACHING_HOURS\": \"累積授課時數\",\n \"LECTURER_TEACHING_INFORMATION\": \"授課課程資訊\",\n \"VAT_NUMBER\": \"統一編號\",\n \"BANK_NAME\": \"銀行名稱\",\n \"BANK_ACCOUNT\": \"銀行帳號\",\n \"PHONE\": \"電話\",\n \"FAX\": \"傳真\",\n \"CONTACT_PERSON_DATA\": \"聯絡人資料\",\n \"URL\": \"網址\",\n \"DEPARTMENT_MEMBERS_OF_LEARNING_INFORMATION\": \"轄下同仁學習資訊\",\n \"NUMBER_OF_TEACHING_SESSIONS\": \"授課次數\",\n \"DOLLARS_NT\": \"(元)(幣別:新台幣)\"\n },\n\n \"ACTIONS\": actionsConstant,\n\n \"STATUS\": statusConstant,\n\n \"MESSAGE\": messageConstant,\n\n \"FORM_VALIDATION\": formValidationConstant,\n\n \"ERROR\": {\n \"SERVERS_ERROR\": \"伺服器錯誤,請聯絡管理員!\",\n \"ACCOUNT_OR_PASSWORD_ERROR\": \"帳號或密碼錯誤!\",\n \"ERROR_ORIGIN_INCONSISTENT\": \"與原密碼不符\",\n \"CODE\": httpErrorCodeConstant,\n \"SIGN_IN_USER_TIMEOUT\": \"因閒置過久,系統將您自動登出,或您已從別的瀏覽器登入此帳號。請重新輸入您的帳號及密碼\",\n \"ERROR_MSG_NOT_ADD_DEPUTY_DUE_TO_OVERLAP\": \"由於職代時間與之前的職代記錄時間有所重疊且該部門已被設職代,因此無法再設定職代!\",\n \"SIGN_IN_USER_LIMIT\": \"系統使用人數已達上限,請稍後再登入\",\n \"C_SIGN_IN_USER_DISABLED\": \"您的帳號已停用,請洽管理員\",\n \"SIGN_IN_USER_NOT_FOUND\": \"您於該系統尚未建立帳號\"\n },\n \"NO_COURSES\": \"無任何課程\",\n \"CLICK_IMG_VIEW_FULL_SIZE\": \"點擊圖片可檢視全圖\"\n });\n }\n angular\n .module('eHRD.modules.language')\n .config(local);\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n local.$inject = ['$translateProvider', 'systemConstantZhCN', 'messageConstantZhCN', 'httpErrorCodeConstantZhCN', 'formValidationConstantZhCN', 'actionsConstantZhCN', 'statusConstantZhCN'];\n function local($translateProvider, systemConstant, messageConstant, httpErrorCodeConstant, formValidationConstant, actionsConstant, statusConstant) {\n $translateProvider.translations('zh-cn', {\n \"FILE_SIZE_ERROR\": \"档案大小超过500MB无法上传\",\n\n \"LANGUAGE\":\"语系\",\n \"LANGUAGE_EN\":\"英文\",\n \"LANGUAGE_TW\":\"繁体中文\",\n \"LANGUAGE_CN\":\"简体中文\",\n \"LEARNING_DASHBOARD\": \"学习仪表板\",\n \"INCOMPLETE_COURSES\": \"待修课程\",\n \"ENROLLMENT\": \"待修课程\",\n \"TEST_QUESTIONNAIRE_CENTER\": \"测验问卷中心\",\n \"APPROVE_RECORDS\": \"簽核纪录查询\",\n \"TRAINING_RECORDS\": \"训练纪录查询\",\n \"COMMUNITY_DISCUSSION_ZONE\":\"社群讨论区\",\n \"PUBLIC_DISCUSSION_ZONE\": \"公共讨论区\",\n \"CLASSES_DISCUSSION_ZONE\": \"班次讨论区\",\n \"INDEX\": \"首页\",\n \"MY_CURRICULUM\": \"我的课表\",\n \"KNOWLEDGE_MANAGEMENT_CENTER\": \"知识管理中心\",\n \"REPORTS_ZONE\":\"报表专区\",\n \"LEARNING_REPORTS\":\"学习报表\",\n \"SUPERVISOR_ZONE\":\"主管专区\",\n \"DEPARTMENT_DASHBOARD\": \"部门仪表板\",\n \"TRAINING_APPROVE\": \"训练待簽表单簽核\",\n \"TRAINING_APPROVE_RECORDS_SEARCH\": \"训练簽核纪录查询\",\n \"MEMBER_CURRICULUM\": \"成员课表查询\",\n \"MEMBER_TRAINING_RECORDS\": \"成员修课纪录查询\",\n \"LEARNING_PASSPORT\": \"我的学习护照\",\n \"MY_CALENDAR\": \"我的行事历\",\n \"MY_SETTING\": \"我的设定\",\n \"COURSE_LEARNING_RESOURCE\": \"课程与学习资源\",\n \"EXTERNAL_TRAINING_ZONE\": \"外训专区\",\n \"EXTERNAL_TRAINING_APPLY\": \"外训申请\",\n \"EXTERNAL_TRAINING_APPLY_FORM\": \"外训申请表单\",\n \"EDIT_EXTERNAL_TRAINING_APPLY_FORM\": \"编辑外训申请表单\",\n \"VIEW_EXTERNAL_TRAINING_APPLY_FORM\": \"检视外训申请表单\",\n \"EXTERNAL_TRAINING_BULLETIN\": \"外训公布栏\",\n \"EXTERNAL_TRAINING_APPLY_RECORDS\": \"外训申请纪录\",\n \"COURSES_INFO\": \"课程资讯\",\n \"PROGRAM_INFO\": \"学程资讯\",\n \"CERTIFICATE_INFO\": \"证照资讯\",\n \"PROGRAM_INFO_DETAIL\": \"学程资料明细\",\n \"PREREQUISITE_ITEMS\": \"先修项目\",\n \"COURSE_CONTAIN\": \"包含课程\",\n \"GET_THE_PROCESS\": \"取得流程\",\n \"EXTEND_THE_PROCESS\": \"展期流程\",\n \"CERTIFICATE_INFO_DETAIL\": \"证照资料明细\",\n \"LEARNING_IS_TO_WALK_IN_THE_RIGHT_DIRECTION\": \"学习是为了走对方向\",\n \"LEARNING_IS_TO_BREAK_THROUGH_THEIR_OWN\": \"学习是为了突破自己\",\n \"MEMBER_SUGGEST_LEARNING_LIST\": \"成员建议学习项目查询\",\n \"SUGGEST_LEARNING_LIST\": \"建议学习项目\",\n \"TRAINING_ROAD_MAP\": \"训练蓝图\",\n \"NEED_GET_PREREQUISITE_ITEMS\": \"必须先取得证照\",\n \"TRAINING_PLAN\": \"训练计画\",\n \"CERT_ZONE\":\"证照专区\",\n \"EXTERNAL_CERT_REGISTER\": \"外部证照登录\",\n \"EXTERNAL_CERT_EXAM_APPLICATION\": \"外部证照考试申请\",\n \"EXTERNAL_CERT_EXAM_ALLOWANCE_APPLICATION\": \"外部证照考试补助申请\",\n \"EXTERNAL_CERT_QUALIFY_REWARD_APPLICATION\": \"外部证照合格奖励申请\",\n \"EXTERNAL_CERT_APPLICATION_RECORDS_SEARCH\": \"外部证照申请纪录查询\",\n \"CERT_RECORDS_SEARCH\": \"证照纪录查询\",\n \"TRAINING_PROGRAM_PLANNING\": \"训练计画规划\",\n \"YOU_MUST_FIRST_OBTAIN_A_CERTIFIED_SUBJECT\": \"必须先取得认证科目\",\n \"NEWLY_OBTAIN_THIS_CERTIFIED_SUBJECT_CONDITION\": \"新取得此认证科目条件\",\n \"EXPIRED_AFTER_REACQUISITION_OF_THIS_CERTIFIED_SUBJECT_CONDITION\": \"过期后重新取得此认证科目条件\",\n \"SATISFY_OF_ANY_CONDITION_TO_OBTAIN_A_CERTIFICATE\": \"满足以下任一条件即可取得证照\",\n \"FINANCIAL_CERT_RECORD_APPLICATION\": \"金融证照记录申请\",\n \"FINANCIAL_CERT_RECORD_SEARCH\": \"金融证照记录查询\",\n \"MEMBER_FINANCIAL_CERT_RECORD_SEARCH\": \"成员金融证照记录查询\",\n \"MEMBER_CERT_RECORDS_SEARCH\": \"成员证照记录查询\",\n \"COMPETENCY_ZONE\": \"职能专区\",\n \"COMPETENCY_EVALUATION_SUPERVISOR_REPORT\": \"职能评鉴主管报表\",\n \"DEPARTMENT_DROP_ANALYSIS\": \"部门落差分析\",\n \"MEMBER_DROP_ANALYSIS\": \"人员落差分析\",\n \"COMPANY_COMPETENCY_DEFINITION\": \"全公司职能定义\",\n \"CORE_COMPETENCY\": \"核心职能\",\n \"MANAGE_COMPETENCY\": \"管理职能\",\n \"PROFESSION_COMPETENCY\": \"专业职能\",\n \"PERSONAL_EVALUATION_LIST\": \"个人评鉴清单\",\n \"COMPETENCY_EVALUATION_PERSONAL_REPORT\": \"职能评鉴个人报表\",\n \"PERSONAL_DROP_ANALYSIS\": \"个人落差分析\",\n \"PLACEHOLDERS\": {\n \"PLEASE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD\":\"请输入您的帐号及密码\",\n \"SEARCH_COURSE_RESOURCE\": \"搜寻课程与学习资源\",\n \"YOU_CAN_SEND_A_MESSAGE_TO_THE_STUDENT_WHO_HAS_BEEN_DESIGNATED_TO_CANCEL_THE_REGISTRATION\": \"你可以送出讯息给被指定取消报名的学员。\",\n \"YOU_CAN_SEND_A_MESSAGE_TO_THE_STUDENT_WHO_HAS_BEEN_DESIGNATED\": \"你可以送出讯息给被指定的学员。\",\n \"CAN_CANCEL_THE_REGISTRATION_OF_STUDENTS\": \"可取消报名的学员\",\n \"PLEASE_ENTER_THE_STUDENT_NAME\": \"请输入学员姓名\",\n \"PLEASE_ENTER_THE_NUMBER_OF_DAYS\": \"请输入天数\",\n \"PLEASE_SELECT_DATE\": \"请选择日期\",\n \"QUESTION_FILLING\": \"填充\",\n \"TOTAL_OF_QUESTIONS\": \"题数 : 总共 {{value}} 题\",\n \"THE_PAPER_WILL_BE_PUBLISHED\": \"试卷将于,{{value}},后公布(请至修课摘要页查询)\",\n \"N_PERSON_LEARNING\": \"{{value}} 人学习\",\n \"N_PERSON_FINISH_COURSE\": \"{{value}} 人完成课程\",\n \"PLEASE_ENTER_YOUR_OLD_PASSWORD\": \"请输入您的旧密码\",\n \"PLEASE_ENTER_YOUR_NEW_PASSWORD\": \"请输入您的新密码\",\n \"PLEASE_RECONFIRM_YOUR_NEW_PASSWORD\": \"请再次输入新密码\",\n \"PLEASE_ENTER_TEXT\": \"请输入文字\",\n \"SELECT_VENDOR\": \"选择主办单位\",\n \"ENTER_AMOUNT\": \"输入金额\",\n \"NT_CONVERSION\": \"台币换算金额\",\n \"REASON_OF_LEAVE\": \"请假原因\",\n \"PLEASE_FILL_IN_INTERNAL_LECTURE_SCORE\": \"请填写内部讲授分数\",\n \"PLEASE_FILL_IN_OTHER_METHOD_REPORT_SCORE\": \"请填写其他方式报告分数\",\n \"PLEASE_FILL_IN_ORAL_REPORT_SCORE\": \"请填写口头报告分数\",\n \"WEEK_W_OF_Y\": \"{{year}}年第{{week}}周 \",\n \"PLEASE_SELECT_TRAINING_BLUEPRINT\": \"请选择训练蓝图\",\n \"FOR_LESS_THAN_N_THE_FOLLOWING_REPORTS_ARE_NOT_REQUIRED\": \"低于 {{value}} 元则无需下列报告\",\n \"PLEASE_SELECT_A_CATEGORY\": \"请选择类別\",\n \"SEARCH_FOR_A_VENDORS\": \"查询单位\",\n \"PLEASE_ENTER_KEYWORDS\": \"请输入关键字\",\n \"CONVERSION_AMOUNT\": \"换算金额\",\n \"PLEASE_ENTER_DEPARTMENT_NAME\": \"请输入部门名称\"\n },\n\n \"SYSTEM\": systemConstant,\n\n \"FIELD\": {\n \"APPELLATION\": \"名称\",\n \"TRACK_QUESTIONNAIRE\": \"追踪问卷\",\n \"SURVEYBANK_GROUP_MATERIAL\": \"教材\",\n \"TABLE_HEADER_INSTRUCTOR\": \"讲师\",\n \"VENUE\": \"场地\",\n \"FACILITY\": \"设备\",\n \"ATTENDANCE_RECORD\": \"出缺席记录\",\n \"ATTENDANCE_RATE\": \"出席率\",\n \"ATTENDANCE_STATISTIC\": \"出席状况\",\n \"TOTAL_ITEM\": \"总共{{value}}项\",\n \"COMPLETE_ITEM\": \"完成{{value}}项\",\n \"LEARNING_ITEM\": \"学习项目\",\n \"LEARNING_HISTORY\": \"学习历程\",\n \"DOCUMENT_TITLE\": \"文件标题\",\n \"DOWNLOAD_TIME\": \"下载时间\",\n \"COURSE_CONTENT\": \"课程内容\",\n \"EXEMPTION_REASON\": \"免修原因 \",\n \"EVER_ENROLLED_COURSE\": \"已修过相关课程\",\n \"EVER_ENROLLED_CERTIFICATION\": \"已领有相关外部证照\",\n \"EVER_ENROLLED_INNER_CERTIFICATION\": \"已领有相关内部证照\",\n \"CERTIFICATION_NAME\": \"证照名称\",\n \"PROFESSIONAL_KNOWLEDGE\": \"专业知识\",\n \"TECHNICAL_OPERATION\": \"技术操作\",\n \"WORK_ATTITUDE\": \"工作态度\",\n \"COMMUNICATION\": \"人际沟通\",\n \"DEPUTY_DEPARTMENT\": \"被代理的部门\",\n \"SETTING_DATE\":\"设定日期\",\n \"DEPUTY\": \"代理人\",\n \"SETTING_DEPUTY\": \"设定簽核代理人\",\n \"DEPUTY_EFFECTIVE_DATE\":\"代理生效日\",\n \"DEPUTY_END_DATE\":\"代理结束日\",\n \"MY_DEPUTY_SETTING\": \"簽核代理人设定\",\n \"LIST_OF_UNEXPIRED_COURSE_TO_BE_EXPIRED\": \"即将到期课程未完训名单\",\n \"DEPARTMENT_MEMBERS_FOR_THE_YEAR\": \"当年度辖下部门\",\n \"AVERAGE_TRAINING_HOURS\": \"平均训练时数\",\n \"MONTHLY_ACCUMULATED_TRAINING_COSTS\": \"各月份累积训练费用\",\n \"COMPLETION_RATE_OF_DEPARTMENT_MEMBERS\": \"辖下同仁完训率\",\n \"ATTENDANCE_RATE_OF_DEPARTMENT_MEMBERS\": \"辖下同仁出席率\",\n \"CUMULATIVE_TRAINING_COSTS\": \"累积训练费用\",\n \"COMPANY_AVERAGE\": \"公司平均\",\n \"DEPARTMENT_EVERYONE_AVERAGE\": \"部门每人平均\",\n \"SEARCH_THIS_AND_SUB_CATEGORIES\": \"搜寻本目录及子目录\",\n \"EXTERNAL_TRAINING_WEBSITE\": \"外训课程网址\",\n \"TIME\": \"时间\",\n \"LEAVE_TIME\": \"请假时间\",\n \"SELECT_LEAVE_TIME\": \"选择请假时间\",\n \"COURSE_NOT_ATTENDED_REASON\": \"未出席原因\",\n \"CLASS_HOUR\": \"上课时数\",\n \"OTHER_METHOD\": \"其他方式\",\n \"INTERNAL_LECTURE\":\"内部讲授\",\n \"SCORE_TO_BE_APPROVED\": \"需簽核评分\",\n \"ORAL_REPORT\":\"口头报告\",\n \"LECTURE_DEADLINE\":\"讲授期限\",\n \"SUBMIT_DEADLINE\":\"缴交期限\",\n \"REPORT_DEADLINE\":\"报告期限\",\n \"NEED_TO_SUBMIT\":\"需缴交\",\n \"UPLOAD_REPORT\":\"上传报告\",\n \"NO_REPORT\":\"无需报告\",\n \"NEED_TO_COMPLETE_REPORT\":\"须完成下列报告\",\n \"CURRENCY\": \"货币\",\n \"AMOUNT\": \"金额\",\n \"SYSTEM_CURRENCY\": \"系统币別\",\n \"TYPE_OF_SUBSIDY\": \"补助方式\",\n \"FULL\": \"全额\",\n \"SUBSIDY\": \"补助\",\n \"VOUCHER\": \"凭证\",\n \"TAXABLE_INVOICE\": \"应稅发票\",\n \"TAX_FREE_INVOICE\": \"未稅发票\",\n \"RECEIPT\": \"收据\",\n \"PAYMENT_DATE\": \"预定付款日期\",\n \"HIDDEN_COST_INFORMATION\": \"隐藏费用资讯\",\n \"SELECT_VENDOR\": \"选择主办单位\",\n \"ENROLLMENT_COST\": \"报名费用\",\n \"COURSE_COST\": \"课程费用\",\n \"COURSE_DETAIL\": \"课程详细资讯\",\n \"FREE_COURSE\": \"免费课程\",\n \"PAY_COURSE\": \"付费课程\",\n \"KNOWLEDGE_MANAGEMENT_CENTER\": \"知识管理中心\",\n \"COURSE_DESCRIPTION\":\"课程说明\",\n \"REMARK\": \"备注\",\n \"CYCLE_MODE\": \"循环模式\",\n \"REPEAT_INTERVAL\": \"重复间隔\",\n \"WEEK\": \"周\",\n \"MONTH\": \"月\",\n \"YEAR\": \"年\",\n \"MONDAY\": \"星期一\",\n \"TUESDAY\": \"星期二\",\n \"WEDNESDAY\": \"星期三\",\n \"THURSDAY\": \"星期四\",\n \"FRIDAY\": \"星期五\",\n \"SATURDAY\": \"星期六\",\n \"SUNDAY\": \"星期日\",\n \"JANUARY\": \"一月\",\n \"FEBRUARY\": \"二月\",\n \"MARCH\": \"三月\",\n \"APRIL\": \"四月\",\n \"MAY\": \"五月\",\n \"JUNE\": \"六月\",\n \"JULY\": \"七月\",\n \"AUGUST\": \"八月\",\n \"SEPTEMBER\": \"九月\",\n \"OCTOBER\": \"十月\",\n \"NOVEMBER\": \"十一月\",\n \"DECEMBER\": \"十二月\",\n \"VENDOR\": \"主办单位\",\n \"DOMESTIC\": \"国内\",\n \"ABROAD\": \"国外\",\n \"MULTIPLE_SELECT\": \"可复选\",\n \"JOIN_REASON\": \"参加理由\",\n \"TEACH_DEADLINE\": \"讲授期限\",\n \"REST_TIME\": \"休息时间\",\n \"SETTING_CYCLE_WEEK\": \"设定循环周期\",\n \"TRAINING_NATURE\": \"训练性质\",\n \"ASSIGNED_BY_MANAGER\": \"主管指派\",\n \"PERSONAL_REQUESTS\": \"个人需求\",\n \"TRUE\": \"是\",\n \"FALSE\": \"否\",\n \"UPLOAD_COURSE_DATA\": \"上传课程资料\",\n \"ENROLLMENT_INFORMATION\": \"报名资讯\",\n \"ENROLLMENT_WEBSITE\": \"报名网址\",\n \"NO_INFORMATION\": \"暂无资料\",\n \"TRAINING_HOURS_IN_THE_QUARTER\": \"第{{value}}季累计训练时数(通过)\",\n \"AVERAGE_TRAINING_HOURS_OF_COMPANY\": \"全公司平均训练时数(通过)\",\n \"TRAINING_BLUEPRINT_PROGRESS\": \"训练蓝图进度\",\n \"INCOMPLETE_ITEM\": \"未完成项目\",\n \"INTERNAL_CERTIFICATION_PROGRESS\": \"内部证照取得进度\",\n \"PERFORM_LATEST_NEWS\": \"平台最新动态\",\n \"MY_LEARNING_RESUME\": \"我的学习履历\",\n \"LOGIN_PLATFORM\": \"登入平台\",\n \"LEARNING_COURSE\": \"阅读课程\",\n \"FILE_IN_ONLINE_QUESTIONNAIRE\": \"填写问卷\",\n \"FILE_IN_ONLINE_TEST\": \"填写测验\",\n \"FILE_IN_QUESTIONNAIRE\": \"填写问卷\",\n \"FILE_IN_TEST\": \"填写测验\",\n \"LEARNING_KNOWLEDGE_DOCUMENT_CENTER\": \"点阅知识文件中心\",\n \"VIEW_DOCUMENT_CENTER\": \"浏览文件中心\",\n \"FORUM_PUBLISHED_ARTICLE\": \"讨论区发表文章\",\n \"ENROLLMENT_COURSE\": \"报名课程\",\n \"CANCEL_COURSE\": \"取消报名\",\n \"ONLINE_COURSE_LEARNING_TIME_CURVE\": \"线上课程学习时数曲线图\",\n \"LEARNING_HOURS\": \"学习时数\",\n \"SIX_MONTH\": \"近六个月\",\n \"DISTRIBUTION_MAP_OF_COURSES_IN_EACH_CATEGORY\": \"各类別课程修课分布图\",\n \"TOTAL_OF_ONLINE_COURSE_LEARNING_HOURS\": \"线上课程累计阅读时数\",\n \"CUMULATIVE_OF_PASSED_COURSES\": \"累计通过课程数\",\n \"TOTAL_OF_CERTIFICATION\": \"取得证照总数\",\n \"CUMULATIVE_OF_TRAINING_COSTS_FOR_THE_YEAR\": \"当年度外训费用累计\",\n \"PENDING_APPROVALS\": \"待簽表单\",\n \"APPROVE_PROCESS\": \"簽核流程\",\n \"APPROVE_DETAIL\": \"簽核详细资讯\",\n \"APPROVE_RECORD\": \"簽核纪录\",\n \"APPLY_COSTS\": \"本次申请费用\",\n \"STUDENT_TRAINING_COSTS_HAVE_OCCURRED\": \"已发生学生训练费用\",\n \"DEPARTMENT_TRAINING_COSTS_HAVE_OCCURRED\": \"已发生部门训练费用\",\n \"KEYWORD\": \"关键字\",\n \"DEPARTMENT_NAME\": \"部门名称\",\n \"DEPARTMENT_MEMBER\": \"部门成员\",\n \"DEPARTMENT_MEMBERS\": \"辖下同仁\",\n \"LEARNING_ACTIVITY\": \"学习活动\",\n \"LEARNING_ACTIVITY_STATUS\": \"学习活动状态\",\n \"SEARCH_COURSE_NAME\": \"搜寻课程名称\",\n \"SELECT_SEARCH_FILTER\": \"选择搜寻条件\",\n \"PLEASE_RATING\": \"请评分\",\n \"START_DATE\": \"开始日期\",\n \"END_DATE\": \"结束日期\",\n \"COURSE_START_DATE\": \"上课开始日期\",\n \"AUTHOR\": \"作者\",\n \"LOCATION\": \"位置\",\n \"ROOT_DIRECTORY\": \"总目录\",\n \"CLICK_COUNT\": \"点阅次数\",\n \"DOWNLOAD_COUNT\": \"下载次数\",\n \"DOWNLOAD_COUNT_DETAIL\": \"下载次数明细\",\n \"I_WANT\": \"我要\",\n \"AVERAGE_RATING\": \"平均评分\",\n \"SHARE_DATE\": \"分享日期\",\n \"HOT_DOCUMENT\": \"热门文件\",\n \"TITLE\": \"标题\",\n \"TYPE\": \"类型\",\n \"APPLICANT\": \"申请人\",\n \"APPLICANT_DEPARTMENT\": \"申请人部门\",\n \"APPLY_DATE\": \"申请日期\",\n \"ARRIVAL_DATE\": \"送达日期\",\n \"APPLY_START_DATE\" :\"申请开始日期\",\n \"APPLY_END_DATE\" :\"申请结束日期\",\n \"APPROVER\" :\"簽核人\",\n \"LEARNING_CATEGORY\": \"学习目录\",\n \"ENROLLMENT_TIME\": \"修课时间\",\n \"COURSE_DATE\": \"上课日期\",\n \"HOURS\": \"时数\",\n \"TIME_OF_HOURS\": \"时数(小时)\",\n \"HOUR\": \"小时\",\n \"ENROLLMENT_HOURS\": \"修课时数\",\n \"PASS_STATUS\": \"通过状态\",\n \"COST\": \"费用\",\n \"TEST_SCORE\": \"测验成绩\",\n \"LEARNING_REPORT\": \"学习报告\",\n \"ENROLLMENT_NUMBER_OF_PEOPLE\": \"修课人数\",\n \"DOWNLOAD_NUMBER_OF_PEOPLE\": \"下载人数\",\n \"INCOMPLETED_NUMBER_OF_PEOPLE\": \"未完成人数\",\n \"EXEMPTION_NUMBER_OF_PEOPLE\": \"免修人数\",\n \"EXEMPTION\": \"免修\",\n \"APPLY_FOR_EXEMPTION\": \"免修申请\",\n \"PASSED_NUMBER_OF_PEOPLE\": \"通过人数\",\n \"FAILED_NUMBER_OF_PEOPLE\": \"未通过人数\",\n \"DROP_NUMBER_OF_PEOPLE\": \"退选人数\",\n \"LEARNER_SATISFACTION\":\"学员总体满意度\",\n \"MANAGER_SATISFACTION\":\"管理员总体满意度\",\n \"PASSED_COUNT\": \"通过数\",\n \"EXEMPTION_COUNT\": \"免修数\",\n \"TOTAL\": \"总数\",\n \"ENROLLMENT_STATUS\": \"修课状态\",\n \"CURRENT_PROCESS\": \"目前流程\",\n \"CHANGE_PASSWORD\": \"变更密码\",\n \"TEST_QUESTIONNAIRE\": \"测验问卷\",\n \"ALL_COURSE\": \"全部课程\",\n \"LATEST_COURSE\": \"最新课程\",\n \"HOT_COURSE\": \"热门课程\",\n \"FEATURED_COURSE\": \"精选课程\",\n \"LATEST_NEWS\": \"最新公告\",\n \"ONLINE_COURSE_LEADERBOARD\": \"线上课程排行榜\",\n \"LATEST_DOCUMENT\": \"最新文件\",\n \"RELATED_SITES\": \"相关网站\",\n \"USERNAME\": \"使用者名称\",\n \"USER_ACCOUNT\": \"使用者帐号\",\n \"ACCOUNT\": \"帐号\",\n \"NAME\": \"名字\",\n \"LAST_NAME\": \"姓氏\",\n \"PASSWORD\":\"密码\",\n \"ACTION\": \"动作\",\n \"ALL\": \"全部\",\n \"ORDER\": \"顺序\",\n \"PASSED_DATE\": \"通过日期\",\n \"SPECIFIC\": \"特定\",\n \"PROGRAM\": \"学程\",\n \"COURSE\": \"课程\",\n \"ONLINE_COURSE\": \"线上课程\",\n \"CLASS_ROOM_COURSE\": \"教室课程\",\n \"EXTERNAL_TRAINING\": \"外训\",\n \"INTERNAL_TRAINING\": \"内训\",\n \"INTERNAL\": \"内部\",\n \"EXTERNAL\": \"外部\",\n \"ONLINE_TEST\": \"线上测验\",\n \"CLASS_ROOM_TEST\": \"教室测验\",\n \"TEST\": \"测验\",\n \"QUESTIONNAIRE\": \"问卷\",\n \"INTERNAL_LICENSE\": \"内部证照\",\n \"EXTERNAL_LICENSE\": \"外部证照\",\n \"MY_FAVOURITE\": \"我的最爱\",\n \"ABOUT_THIS_COURSE\": \"关于本课程\",\n \"ABOUT_THIS_PROGRAM\": \"关于本学程\",\n \"ABOUT_THIS_CERTIFICATE\": \"关于本证照\",\n \"TOTAL_NUMBER_OF_CLASSES\": \"累计上课人数\",\n \"COURSE_NAME\": \"课程名称\",\n \"PROGRAM_NAME\": \"学程名称\",\n \"COURSE_INFO_DETAIL\": \"课程资料明细\",\n \"COURSE_INFO\": \"课程资讯\",\n \"SESSION\": \"班次\",\n \"SESSION_NAME\": \"班次名称\",\n \"SESSION_INFO\": \"班次资讯\",\n \"CLASS_TIME\": \"上课时间\",\n \"ENROLL_DEADLINE\": \"报名期限\",\n \"TEST_DEADLINE\": \"测验期限\",\n \"VIEW_DEADLINE\": \"观看期限\",\n \"FILL_IN_DEADLINE\": \"填写期限\",\n \"LAST_PLAYER\": \"上次播放至\",\n \"ENROLLMENT_INFO\": \"修课资讯\",\n \"REFERENCE_DOCUMENT\": \"参考文件\",\n \"REFERENCE_COURSE\": \"参考课程\",\n \"COURSE_TYPE\": \"课程类型\",\n \"INSTRUCTOR\": \"讲师\",\n \"EVENT_LOCATION\": \"活动地点\",\n \"NUMBER_OF_PEOPLE\": \"人数\",\n \"ENROLL_NUMBER_OF_PEOPLE\": \"报名人数\",\n \"ENROLL_TYPE\": \"报名方式\",\n \"REMAINING_AMOUNT\" : \"尚余名额\",\n \"NO_UPPER_LIMIT\": \"没有上限\",\n \"PENDING_PREDETERMINED_COST\": \"预估每人费用\",\n \"COURSE_ATTRIBUTES\": \"课程属性\",\n \"COURSE_INTRODUCTION\": \"课程简介\",\n \"PROGRAM_INTRODUCTION\": \"学程简介\",\n \"COURSE_OUTLINE\": \"课程大纲\",\n \"LEARNING_GOAL\": \"学习目标\",\n \"UNDERSTANDING\": \"了解\",\n \"THROUGH_THE_RULES\": \"通过规则\",\n \"APPLY_STATUS\": \"申请状态\",\n \"SUITABLE_FOR_THE_OBJECT\": \"适合对象\",\n \"SUITABLE_FOR_LEVEL\": \"适合层级\",\n \"PREPARATORY_KNOWLEDGE\": \"预备知识\",\n \"DIFFICULTY\": \"难度\",\n \"DURATION\": \"长度\",\n \"PROPERTIES\": \"必选修\",\n \"COURSE_ELECTIVE\": \"选修\",\n \"COURSE_REQUIRED\": \"必修\",\n \"IS_WILL_EXPIRE\": \"即将到期\",\n \"LAST_LEARNING_DATE\": \"最后学习日\",\n \"OVERALL_RESULT\": \"总成绩\",\n \"ENROLL_MANAGER\": \"报名管理\",\n \"ASSIGNABLE_MEMBER_ENROLL\": \"指定成员报名\",\n \"ASSIGNABLE_MEMBER_ALTERNATE\": \"指定成员候补\",\n \"UN_ASSIGNABLE_MEMBER_ENROLL\": \"取消成员报名\",\n \"ASSIGNABLE_STATUS\": \"指定的状态\",\n \"ASSIGNER\": \"指定者\",\n \"CLASSMATE\": \"同班同学\",\n \"FORUM\": \"讨论区\",\n \"DESCRIPTION\": \"说明\",\n \"CREATE_DATE\": \"建立日期\",\n \"DATE\": \"日期\",\n \"BASIC_INFORMATION\": \"基本资料\",\n \"OTHER\": \"其他\",\n \"NOTHING\": \"无\",\n \"FULL_NAME\": \"姓名\",\n \"EMPLOYEE_NUMBER\": \"员工编号\",\n \"DEPARTMENT\": \"部门\",\n \"JOB_TITLE\": \"职称\",\n \"EMAIL\": \"电子邮件\",\n \"OFFICE_PHONE\": \"办公室电话\",\n \"ADD_DATE\": \"新增日期\",\n \"TOTAL_ENROLLMENT_COUNT\": \"总修课数\",\n \"REASON\": \"理由\",\n \"DUTY_DAY\": \"到职日\",\n \"GRADE_NAME\": \"职等\",\n \"DUTY_CODE\": \"职务代码\",\n \"ADD_LEARNER\": \"新增学员\",\n \"SELFENROLLED\": \"自行报名\",\n \"ASSIGNED\": \"指定报名\",\n \"COURSE_DEADLINE\": \"课程到期日\",\n \"DIRECTLY_SPECIFY_DEADLINES\": \"直接指定期限\",\n \"UNLIMITED\": \"无限制\",\n \"LEARNING_CENTER\": \"学习中心\",\n \"COURSE_LIST\": \"课程清单\",\n \"LEARNING_RESULT\": \"学习成果\",\n \"MINIMUM_VIEWING_TIME\": \"最低观看时间\",\n \"VIEWING_TIME\": \"观看时间\",\n \"COURSE_TIME\": \"课程时间\",\n \"FINISH_TIME\": \"完成时间\",\n \"SELECTED\": \"已选择\",\n \"FILES\": \"档案\",\n \"LIST_ALL_SUBORDINATE_MEMBERS\": \"列出所有直属部属\",\n \"LIST_MY_GROUP_MEMBERS\": \"列出同部门同仁\",\n \"YOU_HAVE_SELECTED_MEMBERS\": \"您已选择以下指定人员\",\n \"EXECUTION_DATE\": \"指定报名生效日\",\n \"DAYS\": \"天\",\n \"AFTER_THE_SUCCESSFUL_REGISTRATION\": \"报名成功后\",\n \"YOU_CAN_SET_A_DURATION_FOR_THE_TRAINEES\": \"您可以针对学员设定修习期限\",\n \"STATUS\": \"状态\",\n \"REPORT\": \"报告\",\n \"SUBMIT_REPORT\": \"缴交报告\",\n \"SUBMIT_REPORT_DEADLINE\": \"缴交报告期限\",\n \"SUBMITTED_REPORT\": \"已缴交报告\",\n \"UPLOADED_REPORT_LIST\": \"已缴交报告清单\",\n \"SHOULD_BE_SUBMIT_REPORT\": \"应缴\",\n \"HAS_BEEN_PAID\": \"已缴\",\n \"SERIAL_NUMBER\": \"序号\",\n \"FILE_NAME\": \"档案名称\",\n \"SCORE\": \"分数\",\n \"POINT\": \"分\",\n \"NOT_YET_RATED\": \"尚未评分\",\n \"GRADE_QUESTIONS\": \"答对\",\n \"WRONG_QUESTIONS\": \"答错\",\n \"DATE_OF_PAYMENT\": \"缴交日期\",\n \"APPROVE_STATUS\": \"簽核状态\",\n \"COURSE_TITLE\": \"课程标题\",\n \"QUESTION_ANALYSIS\": \"解析\",\n \"LECTURER_RATING_REQUIRED\": \"需讲师评分\",\n \"INTRODUCTION\": \"简介\",\n \"INSTRUCTOR_NAME\": \"讲师姓名\",\n \"INSTRUCTOR_PROPERTIES\": \"讲师属性\",\n \"INSTRUCTOR_COMPANY\": \"讲师厂商\",\n \"COMPANY\": \"公司\",\n \"EDUCATION\": \"学历\",\n \"EXPERIENCE\": \"经历\",\n \"CERTIFICATION\": \"认证资格\",\n \"EXPERTISE\": \"专长\",\n \"INSTRUCTOR_PHOTO\": \"讲师照片\",\n \"INSTRUCTOR_DETAIL\": \"讲师明细\",\n \"BIRTHDAY\": \"生日\",\n \"INDUCTION_DATE\": \"到任日\",\n \"ADDRESS\": \"地址\",\n \"MOBILE_PHONE\": \"行动电话\",\n \"HOME_PHONE\": \"住家电话\",\n \"MY_PREFERENCE\": \"喜好设定\",\n \"COURSE_FOLDER_PRESURVEY\": \"报名问卷\",\n \"COURSE_FOLDER_PRETEST\": \"课前测验\",\n \"COURSE_FOLDER_CONTENT\": \"课程内容\",\n \"COURSE_FOLDER_POSTSURVEY\": \"课后问卷\",\n \"COURSE_FOLDER_POSTTEST\": \"课后测验\",\n \"COURSE_FOLDER_REFERENCE\": \"参考文件\",\n \"COURSE_FOLDER_TEST\": \"测验\",\n \"COURSE_FOLDER_SURVEY\": \"问卷\",\n \"COURSE_FOLDER\": \"课程目录\",\n \"VIEW_FILES\": \"观看档案\",\n \"TIME_LEFT\": \"剩余时间\",\n \"QUESTION_ANSWERED\": \"已答题\",\n \"QUESTION_NOT_ANSWERED\": \"未答题\",\n \"QUESTION_REQUIRED\": \"必填题\",\n \"TEST_TIME\": \"测验时间\",\n \"CAN_TEST_NUMBER_OF_TIMES\": \"可测验之次数\",\n \"LAST_TEST_NUMBER_OF_TIMES\": \"剩余测验次数\",\n \"NUMBER_OF_TIMES\": \"次\",\n \"TO_THE_HIGHEST_SCORE\": \"以最高分为主\",\n \"SELECT_THE_HIGHEST_SCORE_ONCE\": \"选最高分一次\",\n \"STAY_TUNED\": \"敬请期待\",\n \"RELATED_LINKS\": \"相关链接\",\n \"COURSE_LINKS\": \"课程链接\",\n \"SUMMARY\": \"摘要\",\n \"ALL_ANNOUNCEMENTS\": \"全部公告\",\n \"VIEW_MY_ANSWERED\": \"检视我的答案\",\n \"PASSING\": \"通过\",\n \"PROPORTION_OF_PERSONNEL\": \"人员比例\",\n \"EXPIRED_ITEMS\": \"到期项目\",\n \"LEARNER_DURATION_OF_STUDY\": \"学员修习期限\",\n \"SESSION_CLASS_DEADLINE\": \"班次上课期限\",\n \"DETAILS\": \"详细资料\",\n \"CREDITS\": \"学分\",\n \"TOTAL_CREDITS\": \"总学分\",\n \"PERSONAL_SETTING\": \"个人设定\",\n \"PART\": \"份\",\n \"ALL_DEPARTMENT\": \"所有部门\",\n \"NUMBER_OF\": \"笔\",\n \"PER_PAGE\": \"每页\",\n \"BUSINESS_LEAVE\": \"公务出差\",\n \"PERSONAL_LEAVE\": \"私事请假\",\n \"SICK_LEAVE\": \"病假\",\n \"TRACKING_OBJECT\": \"追踪对象\",\n \"TRACKING_DEPARTMENT\": \"追踪部门\",\n \"TRACKING_PERIOD\": \"追踪期別\",\n \"SIZE\": \"大小\",\n \"EXPIRED\": \"已满\",\n \"UNEXPIRED\": \"未满\",\n \"A_MONTH\": \"个月\",\n \"ALL_STAFF\": \"所有人员\",\n \"ANY_TIME_ZONE\": \"时间区段不限\",\n \"RELATED_TO_ME\": \"与部门相关\",\n \"MY_TRAINING\":\"我的蓝图\",\n \"THERE_IS_NO_DATA\": \"目前尚无资料\",\n \"PLEASE_AT\": \"请在\",\n \"SET_THE_CONDITIONS_CONDUCIVE_TO_SEARCH\": \"设定条件,利于进行搜寻\",\n \"EVALUATION_STAFF\": \"评鉴对象\",\n \"OTHER_NEED\": \"其他需求\",\n \"ADD_ITEM_FORM_STUDY_CATALOG\": \"从学习目录加入项目\",\n \"SPECIFY_APPLICANT\": \"指定报名者\",\n \"TRAINING_PLAN\": \"训练计划\",\n \"TRAINING_BLUEPRINT\": \"训练蓝图\",\n \"COMPETENCE_RECOMMEND\": \"职能建议\",\n \"SELF_DEMANDING\": \"自我要求\",\n \"MANAGER_RECOMMEND\": \"主管建议\",\n \"ABILITY_RECOMMEND\": \"能力建议\",\n \"PERSONAL_DEVELOPMENT\": \"个人发展\",\n \"SCORE_PASSING\": \"及格\",\n \"SCORE_FAILED\": \"不及格\",\n \"LEARNING_STATUS\": \"学员状态\",\n \"SOURCE\": \"来源\",\n \"ESTIMATED_COMPLETION_DATE\": \"预定完成日期\",\n \"ENROLLMENT_DATE\": \"报名日期\",\n \"SEARCH_DEPUTY\": \"搜寻代理人\",\n \"WATCH_REPORT\": \"观看报告\",\n \"CERTIFICATE_NAME\": \"证照名称\",\n \"FILL_IN_END_DATE\": \"填写结束日\",\n \"ANNOUNCEMENT_TIME\": \"公告时间\",\n \"DUTY\": \"到职\",\n \"INDUCTION\": \"到任\",\n \"YOU_HAVE_ADD_OTHER_REQUIREMENTS\": \"您已加入以下其他需求\",\n \"YOU_HAVE_SELECTED_COURSES\": \"您已选择以下指定课程\",\n \"VIEW_ITEM\": \"检视项目\",\n \"THOUSAND\": \"仟元\",\n \"ENCRYPTION\": \"加密\",\n \"COURSE_CODE\": \"课程代码\",\n \"MINUTE\": \"分钟\",\n \"CLASSIFICATION\": \"类別\",\n \"RELATED_CERTIFICATE\": \"关联证照\",\n \"CERTIFICATE_RECOGNIZED_HOURS\": \"证照认列时数\",\n \"CERTIFICATE_TYPE\": \"证照类別\",\n \"REWARD_METHOD\": \"奖励方式\",\n \"VALIDITY_PERIOD\": \"有效期限\",\n \"CERTIFICATE_CODE\": \"证照代码\",\n \"PROGRAM_CODE\": \"学程代码\",\n \"TEST_CODE\": \"测验代码\",\n \"TEST_TYPE\": \"测验类型\",\n \"OTHERS\": \"其他\",\n \"COUNSELOR_DETAIL\": \"辅导员明细\",\n \"LEARNER_DETAIL\": \"学员明细\",\n \"SPECIALTY_COURSE_CLASSIFICATION\": \"专长课程类別\",\n \"SETTING_CLASS_TIME\": \"设定上课时间\",\n \"TIME_ZONE\": \"时间区段\",\n \"TIME_TABLE\": \"时间表\",\n \"LUNCH_TIME\": \"午休时间\",\n \"CYCLE_TIME\": \"循环周期\",\n \"INTERVAL\": \"间隔\",\n \"FULL_AMOUNT\": \"全额\",\n \"CASH\": \"现金\",\n \"REMITTANCE\": \"汇款\",\n \"CHEQUE\": \"支票\",\n \"PAYEE\": \"受款人\",\n \"REMITTANCE_INFORMATION\": \"汇款资料\",\n \"THE_TITLE_OF_THE_COMPANY\": \"抬头\",\n \"BRANCHES\": \"分行\",\n \"RECEIPT_INFORMATION\": \"票据资料\",\n \"THE_TITLE_OF_THE_RECEIPT\": \"票据抬头\",\n \"RECEIPT_EXPIRE_DATE\": \"票据到期日\",\n \"RECEIPT_FORMAT\": \"票据格式\",\n \"RECEIPT_DELINEATE\": \"票据划线\",\n \"ENDORSEMENT_OR_TRANSFERENCE_PROHIBITED\": \"注明禁止背书转让\",\n \"APPLICATION_CONTENT\": \"请款内容\",\n \"COURSE_DATA\": \"课程资料\",\n \"FILL_IN_OTHER_METHOD\": \"填写其他方式\",\n \"TEST_HISTORY_SEARCH\": \"测验历史查询\",\n \"ANSWER_DATE\":\"作答日期\",\n \"TOTAL_COUNT\": \"总共{{value}}次\",\n \"AVERAGE_SATISFACTION\": \"平均满意度\",\n \"NUMBER_OF_COURSES_DUE_WITHIN_THIS_WEEK\": \"一周内即将到期课程数\",\n \"CUMULATIVE_TRAINING_COSTS_FOR_THE_YEAR\": \"当年度累计训练费用\",\n \"WILL_BE_EXPIRED_COURSES\": \"个将到期课程\",\n \"DOLLARS\": \"元\",\n \"THERE_IS_NO_ROADMAP_DATA\": \"尚无蓝图资料\",\n \"THERE_IS_NO_CERTIFICATE_DATA\": \"尚无证照资料\",\n \"TODAY_IS_NOT_ANY_SCHEDULE\": \"今天没有任何行程\",\n \"REQUISITION_NUMBER\": \"申请单编号\",\n \"TRAINING_NAME\": \"训练名称\",\n \"APPLY_THW_WAY\": \"申请方式\",\n \"LEARN_TOTAL_TIME\": \"修习总时数\",\n \"PASS_NUMBER\": \"通过个数\",\n \"FAILED_NUMBER\": \"未通过个数\",\n \"EXEMPTION_NUMBER\": \"免修个数\",\n \"TEST_FRACTION\": \"测验分数\",\n \"COMMUNITY\": \"社群\",\n \"CERTIFICATE_INTRODUCTION\": \"证照简介\",\n \"COUNSELOR\": \"辅导员\",\n \"LANGUAGE\": \"语言\",\n \"GENERAL_SESSION\": \"一般班次\",\n \"EXTEND_SESSION\": \"展期班次\",\n \"SEARCH_SCOPE\": \"搜寻范围\",\n \"SEARCH_SCOPE_ALL\": \"所有的\",\n \"SEARCH_SCOPE_DEPARTMENT\": \"辖下的\",\n \"NOTES\": \"附注\",\n \"CONTACT_PERSON\": \"联络人\",\n \"CONTACT_PERSON_EMAIL\": \"联络人电子信箱\",\n \"CONTACT_PERSON_PHONE\": \"联络人电话\",\n \"TOMORROW_TO_REMIND\": \"明日提醒\",\n \"TOMORROW_IS_NOT_ANY_SCHEDULE\": \"明日没有任何行程\",\n \"TODAY\": \"今日\",\n \"DAY\": \"日\",\n \"WEEK_OF_YEAR\": \"{{year}} 年 第 {{week}} 周\",\n \"ITEM\": \"项目\",\n \"PROGRESS_OF_SUBMIT_REPORT\": \"缴交进度\",\n \"OCCUPY_WAIT_LIST\": \"目前候补\",\n \"REMAIN_WAIT_LIST\": \"尚余候补\",\n \"DAYS_IN_DURATION\": \"区间内的\",\n \"INCLUDE\": \"包含\",\n \"REFERENCE_MATERIAL\": \"参考资料\",\n \"SUBSIDY_COST\": \"补助费用\",\n \"SELF_COST\": \"自费\",\n \"LAST_EXTERNAL_TRAINING_HISTORY\": \"前次外训纪录\",\n \"EXTERNAL_TRAINING_APPLY_TIMES_PRE\": \"该员本年度已被核准\",\n \"EXTERNAL_TRAINING_APPLY_TIMES_POST\": \"次外训申请\",\n \"EXTERNAL_TRAINING_APPLY_COST\": \"累计外训金额\",\n \"TAX_FREE\": \"未稅\",\n \"EXTERNAL_TRAINING_REPORT\": \"心得报告\",\n \"EXTERNAL_TRAINING_NO_REPORT_NEED\": \"无须缴交\",\n \"UN_PAID\": \"未缴\",\n \"ORIGIN\": \"原因\",\n \"TRAINING_MATERIAL\": \"训练教材\",\n \"APPLICANT_INFORMATION\": \"申请人资讯\",\n \"PAY_INFORMATION\": \"付费资讯\",\n \"VENDOR_RECEIVER_NAME\": \"厂商收件人\",\n \"APPROVAL_PROCESS_RECORDS\": \"簽核流程记录\",\n \"EXTERNAL_TRAINING_APPLY_DETAIL\": \"外训申请明细\",\n \"FILLER\": \"填表人\",\n \"COMPANY_DETAIL\": \"厂商明细\",\n \"DOCUMENT_REPORT\": \"文件报告\",\n \"NOT_CREATED\": \"尚未建立\",\n \"COMPLETION_PERCENTAGE\": \"完成比例\",\n \"RECENTLY_COMPLETED_THE_TRAINEES\": \"最近完成学员\",\n \"THERE_IS_NO_SATISFACTION_DATA\": \"尚无满意度资料\",\n \"FILL_IN_TIME\": \"填写时间\",\n \"ORIGINAL_FACTORY_NAME\": \"原厂名称\",\n \"CERTIFIED_SUBJECT\": \"认证科目\",\n \"APPLY_CATEGORY\": \"申请类別\",\n \"CERTIFICATE_GET_DATE\": \"证照取得日期\",\n \"CERTIFICATE_DEADLINE\": \"证照到期日\",\n \"NEW_APPLY\": \"新申请\",\n \"EXTENSION_APPLY\": \"展期申请\",\n \"PERMANENT\": \"永久有效\",\n \"CERTIFICATE_NUMBER\": \"证照编号\",\n \"ONE\": \"一\",\n \"TWO\": \"二\",\n \"THREE\": \"三\",\n \"TEST_DATE\": \"考试日期\",\n \"APPLY_REASON\": \"申请理由\",\n \"TEST_PLAN\": \"考试地点\",\n \"DETAIL_ADDRESS\": \"详细地址\",\n \"TEST_COST\": \"考试费用\",\n \"ACQUIRE_DATE\": \"取得日期\",\n \"VALID_DATE\": \"有效日期\",\n \"BONUS\": \"奖励\",\n \"CERT_TYPE\": \"证照种类\",\n \"SUBJECT_TO_USER_GRADE\": \"成绩\",\n \"NEVER_EXPIRE\": \"永远有效\",\n \"EXCERT_ADD_LICENSE_INFO\": \"补登资料\",\n \"SELECT_START_END_DATE\": \"选择起迄日期\",\n \"VALID_DATE_START\": \"有效日期起\",\n \"VALID_DATE_END\": \"有效日期讫\",\n \"APPLICABLE_UNITS\": \"适用单位\",\n \"PERCENTAGE_OF_EXAMINATIONS\": \"考试补助比例\",\n \"CONDITION_NUMBER\": \"条件序号\",\n \"HAS_BEEN_CERTIFIED_SUBJECTS\": \"已取得认证科目\",\n \"PASS_THE_EXAM_PROJECT\": \"通过考试项目\",\n \"EXCERT_RELATED_FORM\": \"相关申请表单\",\n \"APPLY_DATE_START\": \"申请日期起\",\n \"APPLY_DATE_END\": \"申请日期讫\",\n \"EXCERT_APPLY_TEST_DATE\": \"考试申请日期\",\n \"EXCERT_UNAPPLIED_ITEMS\": \"未申请项目\",\n \"BONUS_COST\": \"奖金\",\n \"BONUS_APPLY_DATE\": \"奖励申请日期\",\n \"EXCERT_APPLY_TEST\": \"考试申请\",\n \"TEST_ITEMS\": \"考试项目\",\n \"EXCERT_REAL_COMPENSATION\": \"实际补助金额\",\n \"COMPENSATION\": \"补助\",\n \"EXCERT_REGISTER_APPLY\": \"登录申请\",\n \"REGISTER_APPLY_DATE\": \"登录申请日期\",\n \"APPLY_INFO\": \"申请资讯\",\n \"EXTERNAL_CERT_EXAM_BASE_INFO\": \"外部证照考试基本资料\",\n \"CREATE_FROM\": \"课程来源(簽核通过后)\",\n \"EXTERNAL_AUTO_CREATE\": \"自动产生外训课程\",\n \"EXTERNAL_ADD_COURSE\": \"将学员加入指定班次\",\n \"ASSIGNED_COURSE_CLASS\": \"已指定班次\",\n \"THE_PAYMENT_N_LEARNING_REPORT\": \"本次缴交 {{value}} 份学习报告\",\n \"I_WANT_TO_ENROLL\":\"我要报名\",\n \"PLAY_THE_COURSE\":\"播放课程\",\n \"YOU_MAY_BE_INTERESTED_IN_THE_FOLLOWING_COURSES\": \"您也许对下列课程也有兴趣\",\n \"AVERAGE_TRAINING_HOURS_IN_EACH_DEPARTMENT\": \"辖下各部门平均训练时数\",\n \"EMPLOYEE_TRAINING_HOURS\": \"同仁训练时数\",\n \"AVERAGE_TRAINING_COSTS\": \"平均训练费用\",\n \"CUMULATIVE_TRAINING_COSTS_IN_EACH_DEPARTMENT\": \"辖下各部门累积训练费用\",\n \"EMPLOYEE_CUMULATIVE_TRAINING_COSTS\": \"同仁累积训练费用\",\n \"IN_EACH_DEPARTMENT\":\"辖下部门\",\n \"CLICK_THE_PATH_AND_EXPAND_THE_DATA\":\"可点击色块并展开资料\",\n \"LICENSE\": \"证照\",\n \"LEARNING_DETAIL_OF_THE_YEAR\":\"当年度修课明细\",\n \"TEACHING_HOURS\":\"授课时数\",\n \"CERTIFICATE_LIST\": \"证照列表\",\n \"IN\": \"内\",\n \"OUT\": \"外\",\n \"THERE_IS_NO_COURSE_DATA\": \"尚无课程资料\",\n \"THERE_IS_NO_COST_DATA\": \"尚无费用资料\",\n \"CURRENT_DEPARTMENT\": \"目前所在部门\",\n \"LECTURER_TEACHING_DATA\": \"讲师授课资料\",\n \"LECTURER_TEACHING_SATISFACTION\": \"讲师授课满意度\",\n \"CUMULATIVE_TEACHING_HOURS\": \"累积授课时数\",\n \"LECTURER_TEACHING_INFORMATION\": \"授课课程资讯\",\n \"VAT_NUMBER\": \"统一编号\",\n \"BANK_NAME\": \"银行名称\",\n \"BANK_ACCOUNT\": \"银行帐号\",\n \"PHONE\": \"电话\",\n \"FAX\": \"传真\",\n \"CONTACT_PERSON_DATA\": \"联络人资料\",\n \"URL\": \"网址\",\n \"DEPARTMENT_MEMBERS_OF_LEARNING_INFORMATION\": \"辖下同仁學習資訊\",\n \"NUMBER_OF_TEACHING_SESSIONS\": \"授课次数\",\n \"DOLLARS_NT\": \"(元)(币别:新台币)\"\n },\n\n \"ACTIONS\": actionsConstant,\n\n \"STATUS\": statusConstant,\n\n \"MESSAGE\": messageConstant,\n\n \"FORM_VALIDATION\": formValidationConstant,\n\n \"ERROR\": {\n \"SERVERS_ERROR\": \"伺服器错误,请联络管理员!\",\n \"ACCOUNT_OR_PASSWORD_ERROR\": \"帐号或密码错误!\",\n \"ERROR_ORIGIN_INCONSISTENT\": \"与原密码不符\",\n \"CODE\": httpErrorCodeConstant,\n \"SIGN_IN_USER_TIMEOUT\": \"因閒置过久,系统将您自动登出,或您已从別的浏览器登入此帐号。请重新输入您的帐号及密码\",\n \"ERROR_MSG_NOT_ADD_DEPUTY_DUE_TO_OVERLAP\": \"由于职代时间与之前的职代记录时间有所重叠且该部门已被设职代,因此无法再设定职代!\",\n \"SIGN_IN_USER_LIMIT\": \"系统使用人数已达上限,请稍后再登入\",\n \"C_SIGN_IN_USER_DISABLED\": \"您的帐号已停用,请洽管理员\",\n \"SIGN_IN_USER_NOT_FOUND\": \"您于该系统尚未建立帐号\"\n },\n \"MISSION_INFO\": \"任务资讯\",\n \"CLICK_IMG_VIEW_FULL_SIZE\": \"点击图片可检视全图\"\n });\n }\n angular\n .module('eHRD.modules.language')\n .config(local);\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n local.$inject = ['$translateProvider', 'systemConstantEnUS', 'messageConstantEnUS', 'httpErrorCodeConstantEnUS', 'formValidationConstantEnUS', 'actionsConstantEnUS', 'statusConstantEnUS'];\n function local($translateProvider, systemConstant, messageConstant, httpErrorCodeConstant, formValidationConstant, actionsConstant, statusConstant) {\n $translateProvider.translations('en-us', {\n \"FILE_SIZE_ERROR\": \"File size exceeds 500MB can not be uploaded\",\n\n \"LANGUAGE\":\"language\",\n \"LANGUAGE_EN\":\"English\",\n \"LANGUAGE_TW\":\"Traditional Chinese\",\n \"LANGUAGE_CN\":\"Simplified Chinese\",\n \"LEARNING_DASHBOARD\": \"Learning Dashboard\",\n \"INCOMPLETE_COURSES\": \"Incomplete Courses\",\n \"ENROLLMENT\": \"Enrollment\",\n \"TEST_QUESTIONNAIRE_CENTER\": \"Test and Questionnaire Center\",\n \"APPROVE_RECORDS\": \"Training Approval History\",\n \"TRAINING_RECORDS\": \"Learning Records\",\n \"COMMUNITY_DISCUSSION_ZONE\":\"Community Forum\",\n \"PUBLIC_DISCUSSION_ZONE\": \"Public Forum\",\n \"CLASSES_DISCUSSION_ZONE\": \"Class Forum\",\n \"INDEX\": \"Home\",\n \"MY_CURRICULUM\": \"My Curriculum\",\n \"KNOWLEDGE_MANAGEMENT_CENTER\": \"Knowledge Center \",\n \"REPORTS_ZONE\":\"Reports\",\n \"LEARNING_REPORTS\":\"Learning Reports\",\n \"SUPERVISOR_ZONE\":\"Manager Tools\",\n \"DEPARTMENT_DASHBOARD\": \"Department Dashboard\",\n \"TRAINING_APPROVE\": \"Pending Training Approvals\",\n \"TRAINING_APPROVE_RECORDS_SEARCH\": \" Training Approval History\",\n \"MEMBER_CURRICULUM\": \"Members' Curriculum\",\n \"MEMBER_TRAINING_RECORDS\": \"Members' Learning History\",\n \"LEARNING_PASSPORT\": \"My Learning Passport\",\n \"MY_CALENDAR\": \"My Calendar\",\n \"MY_SETTING\": \"Personal Setting\",\n \"COURSE_LEARNING_RESOURCE\": \"Learning Resources\",\n \"EXTERNAL_TRAINING_ZONE\": \"External Training\",\n \"EXTERNAL_TRAINING_APPLY\": \"External Training Application\",\n \"EXTERNAL_TRAINING_APPLY_FORM\": \"External Training Apply Form\",\n \"EDIT_EXTERNAL_TRAINING_APPLY_FORM\": \"Edit External Training Apply Form\",\n \"VIEW_EXTERNAL_TRAINING_APPLY_FORM\": \"View External Training Apply Form\",\n \"EXTERNAL_TRAINING_BULLETIN\": \"External Training Bulletin\",\n \"EXTERNAL_TRAINING_APPLY_RECORDS\": \"External Training Application Records\",\n \"COURSES_INFO\": \"Course Info\",\n \"PROGRAM_INFO\": \"Curriculum Info\",\n \"CERTIFICATE_INFO\": \"Certificate Info\",\n \"PROGRAM_INFO_DETAIL\": \"Deatiled Curriculum Info\",\n \"PREREQUISITE_ITEMS\": \"Prerequisites\",\n \"COURSE_CONTAIN\": \"Including courses\",\n \"GET_THE_PROCESS\": \"Get the process\",\n \"EXTEND_THE_PROCESS\": \"Extend the process\",\n \"CERTIFICATE_INFO_DETAIL\": \"Certificate info detail\",\n \"LEARNING_IS_TO_WALK_IN_THE_RIGHT_DIRECTION\": \"Learning to walk in the right direction\",\n \"LEARNING_IS_TO_BREAK_THROUGH_THEIR_OWN\": \"Learning to break through yourself\",\n \"MEMBER_SUGGEST_LEARNING_LIST\": \"Members Suggested Learning\",\n \"SUGGEST_LEARNING_LIST\": \"Suggested Learning\",\n \"TRAINING_ROAD_MAP\": \"Training Roadmap\",\n \"NEED_GET_PREREQUISITE_ITEMS\": \"You must first obtain a license\",\n \"TRAINING_PLAN\": \"Training Plan\",\n \"CERT_ZONE\":\"Cert Zone\",\n \"EXTERNAL_CERT_REGISTER\": \"External Certificate Registration\",\n \"EXTERNAL_CERT_EXAM_APPLICATION\": \"External Certificate Exam Application\",\n \"EXTERNAL_CERT_EXAM_ALLOWANCE_APPLICATION\": \"External Certificate Exam Subsidy Application\",\n \"EXTERNAL_CERT_QUALIFY_REWARD_APPLICATION\": \"External Certificate Reward Application\",\n \"EXTERNAL_CERT_APPLICATION_RECORDS_SEARCH\": \"External Certificate Application Record\",\n \"CERT_RECORDS_SEARCH\": \"Certificate History\",\n \"TRAINING_PROGRAM_PLANNING\": \"Training Program Planning\",\n \"YOU_MUST_FIRST_OBTAIN_A_CERTIFIED_SUBJECT\": \"You must first obtain a certified subject\",\n \"NEWLY_OBTAIN_THIS_CERTIFIED_SUBJECT_CONDITION\": \"Newly obtain this certified subject condition\",\n \"EXPIRED_AFTER_REACQUISITION_OF_THIS_CERTIFIED_SUBJECT_CONDITION\": \"Expired after reacquisition of this certified subject condition\",\n \"SATISFY_OF_ANY_CONDITION_TO_OBTAIN_A_CERTIFICATE\": \"Satisfy of any condition to obtain a certificate\",\n \"FINANCIAL_CERT_RECORD_APPLICATION\": \"Financial Certificate Record Application\",\n \"FINANCIAL_CERT_RECORD_SEARCH\": \"Financial Certificate Record\",\n \"MEMBER_FINANCIAL_CERT_RECORD_SEARCH\": \"Members Financial Certificate Record\",\n \"MEMBER_CERT_RECORDS_SEARCH\": \"Members Certificate Records\",\n \"COMPETENCY_ZONE\": \"Competence Zone\",\n \"COMPETENCY_EVALUATION_SUPERVISOR_REPORT\": \"Competence Evaluation Supervisor Report\",\n \"DEPARTMENT_DROP_ANALYSIS\": \"Department Drop Analysis\",\n \"MEMBER_DROP_ANALYSIS\": \"Member Drop Analysis\",\n \"COMPANY_COMPETENCY_DEFINITION\": \"Company Competence Definition\",\n \"CORE_COMPETENCY\": \"Core Competence\",\n \"MANAGE_COMPETENCY\": \"Manage Competence\",\n \"PROFESSION_COMPETENCY\": \"profession Competence\",\n \"PERSONAL_EVALUATION_LIST\": \"Personal Evaluation List\",\n \"COMPETENCY_EVALUATION_PERSONAL_REPORT\": \"Competence Evaluation Personal Report\",\n \"PERSONAL_DROP_ANALYSIS\": \"Personal Drop Analysis\",\n \"PLACEHOLDERS\": {\n \"PLEASE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD\":\"Please enter your account and password.\",\n \"SEARCH_COURSE_RESOURCE\": \"Search the Learning Resources.\",\n \"YOU_CAN_SEND_A_MESSAGE_TO_THE_STUDENT_WHO_HAS_BEEN_DESIGNATED_TO_CANCEL_THE_REGISTRATION\": \"Send information to learners who have been cancelled the registration.\",\n \"YOU_CAN_SEND_A_MESSAGE_TO_THE_STUDENT_WHO_HAS_BEEN_DESIGNATED\": \"Send information to the designated learners.\",\n \"CAN_CANCEL_THE_REGISTRATION_OF_STUDENTS\": \"Cancel the learners' registration.\",\n \"PLEASE_ENTER_THE_STUDENT_NAME\": \"Please enter the learner's name\",\n \"PLEASE_ENTER_THE_NUMBER_OF_DAYS\": \"Please enter the days\",\n \"PLEASE_SELECT_DATE\": \"Please select the date.\",\n \"QUESTION_FILLING\": \"fill-in-the-blank\",\n \"TOTAL_OF_QUESTIONS\": \"Questions: Total {{value}}\",\n \"THE_PAPER_WILL_BE_PUBLISHED\": \"Test result will be announced in{{value}}(Please check it in the Course Summary)\",\n \"N_PERSON_LEARNING\": \"{{value}} learners enrolled in this course.\",\n \"N_PERSON_FINISH_COURSE\": \"{{value}} learners completed this course.\",\n \"PLEASE_ENTER_YOUR_OLD_PASSWORD\": \"Please enter the old password.\",\n \"PLEASE_ENTER_YOUR_NEW_PASSWORD\": \"Please enter the new password.\",\n \"PLEASE_RECONFIRM_YOUR_NEW_PASSWORD\": \"Please enter the new password again.\",\n \"PLEASE_ENTER_TEXT\": \"Please enter the text.\",\n \"SELECT_VENDOR\": \"Please select the vendor.\",\n \"ENTER_AMOUNT\": \"Please enter the cost.\",\n \"NT_CONVERSION\": \"NT Conversions\",\n \"REASON_OF_LEAVE\": \"Reason of leave\",\n \"PLEASE_FILL_IN_INTERNAL_LECTURE_SCORE\": \"Please fill in internal lecture score\",\n \"PLEASE_FILL_IN_OTHER_METHOD_REPORT_SCORE\": \"Please fill in other method report score\",\n \"PLEASE_FILL_IN_ORAL_REPORT_SCORE\": \"Please fill in oral report score\",\n \"WEEK_W_OF_Y\": \"{{year}} year the {{week}} week \",\n \"PLEASE_SELECT_TRAINING_BLUEPRINT\": \"Please select training roadmap\",\n \"FOR_LESS_THAN_N_THE_FOLLOWING_REPORTS_ARE_NOT_REQUIRED\": \"Less then {{value}} the following reports are not required\",\n \"PLEASE_SELECT_A_CATEGORY\": \"Please select a category\",\n \"SEARCH_FOR_A_VENDORS\": \"Search for a vendors\",\n \"PLEASE_ENTER_KEYWORDS\": \"Please enter the keywords\",\n \"CONVERSION_AMOUNT\": \"Conversion amount\",\n \"PLEASE_ENTER_DEPARTMENT_NAME\": \"Please enter department name\"\n },\n\n \"SYSTEM\": systemConstant,\n\n \"FIELD\": {\n \"APPELLATION\": \"Title\",\n \"TRACK_QUESTIONNAIRE\": \"Follow-up Questionnaire\",\n \"SURVEYBANK_GROUP_MATERIAL\": \"Materials\",\n \"TABLE_HEADER_INSTRUCTOR\": \"Instructors\",\n \"VENUE\": \"Venue\",\n \"FACILITY\": \"FACILITY\",\n \"ATTENDANCE_RECORD\": \"Attendance Records\",\n \"ATTENDANCE_RATE\": \"Attendance Rate\",\n \"ATTENDANCE_STATISTIC\": \"Attendance status\",\n \"TOTAL_ITEM\": \"Total {{value}}\",\n \"COMPLETE_ITEM\": \"Complete {{value}}\",\n \"LEARNING_ITEM\": \"Learning Items\",\n \"LEARNING_HISTORY\": \"Learning History\",\n \"DOCUMENT_TITLE\": \"Document Title\",\n \"DOWNLOAD_TIME\": \"Download Time\",\n \"COURSE_CONTENT\": \"Content\",\n \"EXEMPTION_REASON\": \"Reason of Exemption\",\n \"EVER_ENROLLED_COURSE\": \"Have enrolled the related courses.\",\n \"EVER_ENROLLED_CERTIFICATION\": \"Have the external certificate.\",\n \"EVER_ENROLLED_INNER_CERTIFICATION\": \"Have the internal certificate.\",\n \"CERTIFICATION_NAME\": \"Certificate name\",\n \"PROFESSIONAL_KNOWLEDGE\": \"Professional knowledge\",\n \"TECHNICAL_OPERATION\": \"Technical operation\",\n \"WORK_ATTITUDE\": \"Work attitude\",\n \"COMMUNICATION\": \"Communication\",\n \"DEPUTY_DEPARTMENT\": \"Deputy Department\",\n \"SETTING_DATE\":\"Set Date\",\n \"DEPUTY\": \"Deputy\",\n \"SETTING_DEPUTY\": \"Set Deputy\",\n \"DEPUTY_EFFECTIVE_DATE\":\"Deputy Effective Date\",\n \"DEPUTY_END_DATE\":\"Deputy End Date\",\n \"MY_DEPUTY_SETTING\": \"Set Deputy\",\n \"LIST_OF_UNEXPIRED_COURSE_TO_BE_EXPIRED\": \"List of incomplete learners of expired course.\",\n \"DEPARTMENT_MEMBERS_FOR_THE_YEAR\": \"Department members\",\n \"AVERAGE_TRAINING_HOURS\": \"Avg. Training hours\",\n \"MONTHLY_ACCUMULATED_TRAINING_COSTS\": \"Monthly Accumulated Train cost\",\n \"COMPLETION_RATE_OF_DEPARTMENT_MEMBERS\": \"Completion percentage of department members\",\n \"ATTENDANCE_RATE_OF_DEPARTMENT_MEMBERS\": \"Attendance percentage of department members\",\n \"CUMULATIVE_TRAINING_COSTS\": \"Accd. Train cost\",\n \"COMPANY_AVERAGE\": \"Co. Avg.\",\n \"DEPARTMENT_EVERYONE_AVERAGE\": \"Dept. Avg.\",\n \"SEARCH_THIS_AND_SUB_CATEGORIES\": \"Search this and sub-categories\",\n \"EXTERNAL_TRAINING_WEBSITE\": \"Web URL for external training\",\n \"TIME\": \"Time\",\n \"LEAVE_TIME\": \"Ask-for-leave Time\",\n \"SELECT_LEAVE_TIME\": \"Select Ask-for-leave Time\",\n \"COURSE_NOT_ATTENDED_REASON\": \"Reasons for Absence\",\n \"CLASS_HOUR\": \"Class Hour\",\n \"OTHER_METHOD\": \"Other methods\",\n \"INTERNAL_LECTURE\":\"Internal teaching\",\n \"SCORE_TO_BE_APPROVED\": \"Score to be approved\",\n \"ORAL_REPORT\":\"Oral report\",\n \"LECTURE_DEADLINE\":\"Teaching deadline\",\n \"SUBMIT_DEADLINE\":\"Submission deadline\",\n \"REPORT_DEADLINE\":\"Report deadline\",\n \"NEED_TO_SUBMIT\":\"Need to submit\",\n \"UPLOAD_REPORT\":\"Upload report\",\n \"NO_REPORT\":\"No report\",\n \"NEED_TO_COMPLETE_REPORT\":\"Following reports need to be completed\",\n \"CURRENCY\": \"Currency\",\n \"AMOUNT\": \"Amount\",\n \"SYSTEM_CURRENCY\": \"System Currency\",\n \"TYPE_OF_SUBSIDY\": \"Type of Subsidy\",\n \"FULL\": \"Full\",\n \"SUBSIDY\": \"Subsidy\",\n \"VOUCHER\": \"Voucher\",\n \"TAXABLE_INVOICE\": \"Taxable invoice\",\n \"TAX_FREE_INVOICE\": \"Tax-free invoice\",\n \"RECEIPT\": \"Receipt \",\n \"PAYMENT_DATE\": \"Payment Date\",\n \"HIDDEN_COST_INFORMATION\": \"Hide Detailed Cost Info\",\n \"SELECT_VENDOR\": \"Select Vendor\",\n \"ENROLLMENT_COST\": \"Enrollment Cost\",\n \"COURSE_COST\": \"Course Cost\",\n \"COURSE_DETAIL\": \"Detailed Course Info\",\n \"FREE_COURSE\": \"Free Course\",\n \"PAY_COURSE\": \"Pay Course\",\n \"KNOWLEDGE_MANAGEMENT_CENTER\": \"Internal Teaching\",\n \"COURSE_DESCRIPTION\":\"Course Description\",\n \"REMARK\": \"Note\",\n \"CYCLE_MODE\": \"Repeat\",\n \"REPEAT_INTERVAL\": \"Repeat Interval\",\n \"WEEK\": \"Week\",\n \"MONTH\": \"Month\",\n \"YEAR\": \"Year\",\n \"MONDAY\": \"Monday\",\n \"TUESDAY\": \"Tuesday\",\n \"WEDNESDAY\": \"Wednesday\",\n \"THURSDAY\": \"Thursday\",\n \"FRIDAY\": \"Friday\",\n \"SATURDAY\": \"Saturday\",\n \"SUNDAY\": \"Sunday\",\n \"JANUARY\": \"January\",\n \"FEBRUARY\": \"February\",\n \"MARCH\": \"March\",\n \"APRIL\": \"April\",\n \"MAY\": \"May\",\n \"JUNE\": \"June\",\n \"JULY\": \"July\",\n \"AUGUST\": \"August\",\n \"SEPTEMBER\": \"September\",\n \"OCTOBER\": \"October\",\n \"NOVEMBER\": \"November\",\n \"DECEMBER\": \"December\",\n \"VENDOR\": \"Domestic/Abroad\",\n \"DOMESTIC\": \"Domestic\",\n \"ABROAD\": \"Abroad\",\n \"MULTIPLE_SELECT\": \"Multiple Answers\",\n \"JOIN_REASON\": \"Purpose\",\n \"TEACH_DEADLINE\": \"Teaching deadline\",\n \"REST_TIME\": \"Rest time\",\n \"SETTING_CYCLE_WEEK\": \"Repeat\",\n \"TRAINING_NATURE\": \"Training Nature\",\n \"ASSIGNED_BY_MANAGER\": \"Assigned by Manager\",\n \"PERSONAL_REQUESTS\": \"Personal Requests\",\n \"TRUE\": \"Yes\",\n \"FALSE\": \"No\",\n \"UPLOAD_COURSE_DATA\": \"Upload Course Data\",\n \"ENROLLMENT_INFORMATION\": \"Enrollment Info\",\n \"ENROLLMENT_WEBSITE\": \"URL for Enrollment\",\n \"NO_INFORMATION\": \"No data\",\n \"TRAINING_HOURS_IN_THE_QUARTER\": \"Accumulated training hours in the quarter(pass):\",\n \"AVERAGE_TRAINING_HOURS_OF_COMPANY\": \"Average training hours of company(pass)\",\n \"TRAINING_BLUEPRINT_PROGRESS\": \"Progress of training roadmap\",\n \"INCOMPLETE_ITEM\": \"Incomplete items\",\n \"INTERNAL_CERTIFICATION_PROGRESS\": \"Progress of internal certificate\",\n \"PERFORM_LATEST_NEWS\": \"Latest news\",\n \"MY_LEARNING_RESUME\": \"My Learning Resume\",\n \"LOGIN_PLATFORM\": \"Login\",\n \"LEARNING_COURSE\": \"Learning\",\n \"FILE_IN_ONLINE_QUESTIONNAIRE\": \"Fill in the questionnaire.\",\n \"FILE_IN_ONLINE_TEST\": \"Fill in the test.\",\n \"FILE_IN_QUESTIONNAIRE\": \"Fill in the questionnaire.\",\n \"FILE_IN_TEST\": \"Fill in the test.\",\n \"LEARNING_KNOWLEDGE_DOCUMENT_CENTER\": \"Use the knowledge center.\",\n \"VIEW_DOCUMENT_CENTER\": \"Use the document center.\",\n \"FORUM_PUBLISHED_ARTICLE\": \"Post a article in the forum.\",\n \"ENROLLMENT_COURSE\": \"Enroll\",\n \"CANCEL_COURSE\": \"Cancel\",\n \"ONLINE_COURSE_LEARNING_TIME_CURVE\": \"Curve of online course learning hours\",\n \"LEARNING_HOURS\": \"Learning hours\",\n \"SIX_MONTH\": \"Within six months\",\n \"DISTRIBUTION_MAP_OF_COURSES_IN_EACH_CATEGORY\": \"Course learning distribution by category\",\n \"TOTAL_OF_ONLINE_COURSE_LEARNING_HOURS\": \"Accumulated online course learning hours\",\n \"CUMULATIVE_OF_PASSED_COURSES\": \"Accumulated passed courses\",\n \"TOTAL_OF_CERTIFICATION\": \"Total certificates\",\n \"CUMULATIVE_OF_TRAINING_COSTS_FOR_THE_YEAR\": \"Accumulated external training cost of this year\",\n \"PENDING_APPROVALS\": \"Pending Approvals\",\n \"APPROVE_PROCESS\": \"Approval process\",\n \"APPROVE_DETAIL\": \"Details\",\n \"APPROVE_RECORD\": \"Approval records\",\n \"APPLY_COSTS\": \"Application Cost\",\n \"STUDENT_TRAINING_COSTS_HAVE_OCCURRED\": \"Members' Training Expenses\",\n \"DEPARTMENT_TRAINING_COSTS_HAVE_OCCURRED\": \"Department Training Expenses\",\n \"KEYWORD\": \"Keyword\",\n \"DEPARTMENT_NAME\": \"Department\",\n \"DEPARTMENT_MEMBER\": \"Department member\",\n \"DEPARTMENT_MEMBERS\": \"Dept. Member\",\n \"LEARNING_ACTIVITY\": \"LEarning activity\",\n \"LEARNING_ACTIVITY_STATUS\": \"Learning activity status\",\n \"SEARCH_COURSE_NAME\": \"Search course\",\n \"SELECT_SEARCH_FILTER\": \"Conditional search\",\n \"PLEASE_RATING\": \"Please rate\",\n \"START_DATE\": \"Start date\",\n \"END_DATE\": \"End date\",\n \"COURSE_START_DATE\": \"Class start date\",\n \"AUTHOR\": \"Author\",\n \"LOCATION\": \"Location\",\n \"ROOT_DIRECTORY\": \"Root Category\",\n \"CLICK_COUNT\": \"Click Count\",\n \"DOWNLOAD_COUNT\": \" Download Count\",\n \"DOWNLOAD_COUNT_DETAIL\": \" Download Count Details\",\n \"I_WANT\": \"I want\",\n \"AVERAGE_RATING\": \"Average score\",\n \"SHARE_DATE\": \"Sharing date\",\n \"HOT_DOCUMENT\": \"Hot document\",\n \"TITLE\": \"Title\",\n \"TYPE\": \"Type\",\n \"APPLICANT\": \"Applicant\",\n \"APPLICANT_DEPARTMENT\": \"Applicant's Department\",\n \"APPLY_DATE\": \"Applied Date\",\n \"ARRIVAL_DATE\": \"Arrival Date\",\n \"APPLY_START_DATE\" :\"Application Start Date\",\n \"APPLY_END_DATE\" :\"Application End Date\",\n \"APPROVER\" :\"Approver\",\n \"LEARNING_CATEGORY\": \"Learning Category\",\n \"ENROLLMENT_TIME\": \"Class time\",\n \"COURSE_DATE\": \"Class time\",\n \"HOURS\": \"Hours\",\n \"TIME_OF_HOURS\": \"Hours\",\n \"HOUR\": \"Hours\",\n \"ENROLLMENT_HOURS\": \"Total Learning Hours\",\n \"PASS_STATUS\": \"Passing Status\",\n \"COST\": \"Cost\",\n \"TEST_SCORE\": \"Test Score\",\n \"LEARNING_REPORT\": \"Learning Report\",\n \"ENROLLMENT_NUMBER_OF_PEOPLE\": \"Total learners\",\n \"DOWNLOAD_NUMBER_OF_PEOPLE\": \"Download learners\",\n \"INCOMPLETED_NUMBER_OF_PEOPLE\": \"Incomplete learners\",\n \"EXEMPTION_NUMBER_OF_PEOPLE\": \"Exempted learners\",\n \"EXEMPTION\": \"Exemption\",\n \"APPLY_FOR_EXEMPTION\": \"Application of exemption\",\n \"PASSED_NUMBER_OF_PEOPLE\": \"Passed learners\",\n \"FAILED_NUMBER_OF_PEOPLE\": \"Failed learners\",\n \"DROP_NUMBER_OF_PEOPLE\": \"Drop learners\",\n \"LEARNER_SATISFACTION\":\"Learners' total satisfaction\",\n \"MANAGER_SATISFACTION\":\"Course administrators' total satisfaction\",\n \"PASSED_COUNT\": \"Pass rate\",\n \"EXEMPTION_COUNT\": \"Exemption rate\",\n \"TOTAL\": \"Total\",\n \"ENROLLMENT_STATUS\": \"Learning Status\",\n \"CURRENT_PROCESS\": \"Current process\",\n \"CHANGE_PASSWORD\": \"Change the password\",\n \"TEST_QUESTIONNAIRE\": \"Test and Survey\",\n \"ALL_COURSE\": \"All Courses\",\n \"LATEST_COURSE\": \"Latest Courses\",\n \"HOT_COURSE\": \"Hot Courses\",\n \"FEATURED_COURSE\": \"Featured Courses\",\n \"LATEST_NEWS\": \"Latest News\",\n \"ONLINE_COURSE_LEADERBOARD\": \"Ranking of online course\",\n \"LATEST_DOCUMENT\": \"Latest Document\",\n \"RELATED_SITES\": \"Related Wedsites\",\n \"USERNAME\": \"Username\",\n \"USER_ACCOUNT\": \"User Account\",\n \"ACCOUNT\": \"Account\",\n \"NAME\": \"First Name\",\n \"LAST_NAME\": \"Last Name\",\n \"PASSWORD\":\"Password\",\n \"ACTION\": \"Action\",\n \"ALL\": \"All\",\n \"ORDER\": \"Order\",\n \"PASSED_DATE\": \"Passed Date\",\n \"SPECIFIC\": \"Specific\",\n \"PROGRAM\": \"Curriculum\",\n \"COURSE\": \"Course\",\n \"ONLINE_COURSE\": \"Online Course\",\n \"CLASS_ROOM_COURSE\": \"Classroom Course\",\n \"EXTERNAL_TRAINING\": \"External Training\",\n \"INTERNAL_TRAINING\": \"Internal Training\",\n \"INTERNAL\": \"Internal\",\n \"EXTERNAL\": \"External\",\n \"ONLINE_TEST\": \"Online Test\",\n \"CLASS_ROOM_TEST\": \"Classroom Test\",\n \"TEST\": \"Test\",\n \"QUESTIONNAIRE\": \"Questionnaire\",\n \"INTERNAL_LICENSE\": \"Internal Certificate\",\n \"EXTERNAL_LICENSE\": \"External Certificate\",\n \"MY_FAVOURITE\": \"My favourites\",\n \"ABOUT_THIS_COURSE\": \"About Course\",\n \"ABOUT_THIS_PROGRAM\": \"About Curriculum\",\n \"ABOUT_THIS_CERTIFICATE\": \"About Certificate\",\n \"TOTAL_NUMBER_OF_CLASSES\": \"Accumulated learners\",\n \"COURSE_NAME\": \"Course Name\",\n \"PROGRAM_NAME\": \"Curriculum Name\",\n \"COURSE_INFO_DETAIL\": \"Course Details\",\n \"COURSE_INFO\": \"Course Info\",\n \"SESSION\": \"Class\",\n \"SESSION_NAME\": \"Class Name\",\n \"SESSION_INFO\": \"Class Info\",\n \"CLASS_TIME\": \"Class Time\",\n \"ENROLL_DEADLINE\": \"Enrollment Deadline\",\n \"TEST_DEADLINE\": \"Test Deadline\",\n \"VIEW_DEADLINE\": \"Access Period\",\n \"FILL_IN_DEADLINE\": \"Test Period \",\n \"LAST_PLAYER\": \"Last Play\",\n \"ENROLLMENT_INFO\": \"Course Info\",\n \"REFERENCE_DOCUMENT\": \"References\",\n \"REFERENCE_COURSE\": \"References\",\n \"COURSE_TYPE\": \"Course Type\",\n \"INSTRUCTOR\": \"Lecturer\",\n \"EVENT_LOCATION\": \"Location\",\n \"NUMBER_OF_PEOPLE\": \"Learners\",\n \"ENROLL_NUMBER_OF_PEOPLE\": \"Total Enrollments\",\n \"ENROLL_TYPE\": \"Enrollment Type\",\n \"REMAINING_AMOUNT\" : \"Available Places\",\n \"NO_UPPER_LIMIT\": \"No limit\",\n \"PENDING_PREDETERMINED_COST\": \"Estimated cost of each learner\",\n \"COURSE_ATTRIBUTES\": \"Course Attributes\",\n \"COURSE_INTRODUCTION\": \"Course Introduction\",\n \"PROGRAM_INTRODUCTION\": \"Curriculum Introduction\",\n \"COURSE_OUTLINE\": \"Course Outline\",\n \"LEARNING_GOAL\": \"Learning Objectives\",\n \"UNDERSTANDING\": \"Understand\",\n \"THROUGH_THE_RULES\": \"Passing Rule\",\n \"APPLY_STATUS\": \"Apply Status\",\n \"SUITABLE_FOR_THE_OBJECT\": \"Target Audience\",\n \"SUITABLE_FOR_LEVEL\": \"Target Level\",\n \"PREPARATORY_KNOWLEDGE\": \"Prerequisite Knowledge\",\n \"DIFFICULTY\": \"Difficulty Level\",\n \"DURATION\": \"Length\",\n \"PROPERTIES\": \"Required or Elective\",\n \"COURSE_ELECTIVE\": \"Elective\",\n \"COURSE_REQUIRED\": \"Required\",\n \"IS_WILL_EXPIRE\": \" will expire\",\n \"LAST_LEARNING_DATE\": \"Last Learning Date\",\n \"OVERALL_RESULT\": \"Final score\",\n \"ENROLL_MANAGER\": \"Enrollment Management\",\n \"ASSIGNABLE_MEMBER_ENROLL\": \"Assign Member\",\n \"ASSIGNABLE_MEMBER_ALTERNATE\": \"Assign Member on the waining list\",\n \"UN_ASSIGNABLE_MEMBER_ENROLL\": \"Cancel Member\",\n \"ASSIGNABLE_STATUS\": \"Assigned Status\",\n \"ASSIGNER\": \"Assigned By\",\n \"CLASSMATE\": \"Classmate\",\n \"FORUM\": \"Forum\",\n \"DESCRIPTION\": \"Description\",\n \"CREATE_DATE\": \"Creation Date\",\n \"DATE\": \"Date\",\n \"BASIC_INFORMATION\": \"Basic Info\",\n \"OTHER\": \"Others\",\n \"NOTHING\": \"None\",\n \"FULL_NAME\": \"Full Name\",\n \"EMPLOYEE_NUMBER\": \"Employee No.\",\n \"DEPARTMENT\": \"Department\",\n \"JOB_TITLE\": \"Title\",\n \"EMAIL\": \"E-mail\",\n \"OFFICE_PHONE\": \"Office Phone\",\n \"ADD_DATE\": \"Add Date\",\n \"TOTAL_ENROLLMENT_COUNT\": \"Courses\",\n \"REASON\": \"Reason\",\n \"DUTY_DAY\": \"Date Attended\",\n \"GRADE_NAME\": \"Grade\",\n \"DUTY_CODE\": \"Job Code\",\n \"ADD_LEARNER\": \"Add Learners\",\n \"SELFENROLLED\": \"Self-enrolled\",\n \"ASSIGNED\": \"Assigned\",\n \"COURSE_DEADLINE\": \"Course Deadline\",\n \"DIRECTLY_SPECIFY_DEADLINES\": \"Set the due date directly\",\n \"UNLIMITED\": \"Unlimited\",\n \"LEARNING_CENTER\": \"LEarning Center\",\n \"COURSE_LIST\": \"Course List\",\n \"LEARNING_RESULT\": \"Learning Outcome\",\n \"MINIMUM_VIEWING_TIME\": \"Minimum View Time\",\n \"VIEWING_TIME\": \"View Time\",\n \"COURSE_TIME\": \"Course Time\",\n \"FINISH_TIME\": \"Complete Time\",\n \"SELECTED\": \"Selected\",\n \"FILES\": \"Files\",\n \"LIST_ALL_SUBORDINATE_MEMBERS\": \"List all the direct members.\",\n \"LIST_MY_GROUP_MEMBERS\": \"List my group members.\",\n \"YOU_HAVE_SELECTED_MEMBERS\": \"You have select the members\",\n \"EXECUTION_DATE\": \"Enrollment Effective Date\",\n \"DAYS\": \"Days\",\n \"AFTER_THE_SUCCESSFUL_REGISTRATION\": \"After the successful registration\",\n \"YOU_CAN_SET_A_DURATION_FOR_THE_TRAINEES\": \"you can set the due date of each learner\",\n \"STATUS\": \"Status\",\n \"REPORT\": \"Report\",\n \"SUBMIT_REPORT\": \"Reports list\",\n \"SUBMIT_REPORT_DEADLINE\": \"Submit Report Deadline\",\n \"SUBMITTED_REPORT\": \"Submitted Report\",\n \"UPLOADED_REPORT_LIST\": \"List of submitted reports\",\n \"SHOULD_BE_SUBMIT_REPORT\": \"Must be submitted\",\n \"HAS_BEEN_PAID\": \"Submitted\",\n \"SERIAL_NUMBER\": \"No.\",\n \"FILE_NAME\": \"File name\",\n \"SCORE\": \"Score\",\n \"POINT\": \"points\",\n \"NOT_YET_RATED\": \"Not yet rated\",\n \"GRADE_QUESTIONS\": \"Right answer\",\n \"WRONG_QUESTIONS\": \"Wrong answer\",\n \"DATE_OF_PAYMENT\": \"Submitted Date\",\n \"APPROVE_STATUS\": \"Approve Status\",\n \"COURSE_TITLE\": \"Course Title\",\n \"QUESTION_ANALYSIS\": \"Analyze\",\n \"LECTURER_RATING_REQUIRED\": \"Require instructors to correct papers\",\n \"INTRODUCTION\": \"Introduction\",\n \"INSTRUCTOR_NAME\": \"Instructor Name\",\n \"INSTRUCTOR_PROPERTIES\": \"Instructor Attributes\",\n \"INSTRUCTOR_COMPANY\": \"Instructor Vendor\",\n \"COMPANY\": \"Company\",\n \"EDUCATION\": \"Academic Background\",\n \"EXPERIENCE\": \"Work Experience\",\n \"CERTIFICATION\": \"Certificate\",\n \"EXPERTISE\": \"Expertise\",\n \"INSTRUCTOR_PHOTO\": \"Instructor Photo\",\n \"INSTRUCTOR_DETAIL\": \"Instructor Details\",\n \"BIRTHDAY\": \"Birthday\",\n \"INDUCTION_DATE\": \"Onboard Date\",\n \"ADDRESS\": \"Address\",\n \"MOBILE_PHONE\": \"Mobile Phone\",\n \"HOME_PHONE\": \"Home Phone\",\n \"MY_PREFERENCE\": \"My Preference\",\n \"COURSE_FOLDER_PRESURVEY\": \"Enroll in survey\",\n \"COURSE_FOLDER_PRETEST\": \"Pre-class test\",\n \"COURSE_FOLDER_CONTENT\": \"Course content\",\n \"COURSE_FOLDER_POSTSURVEY\": \"After class survey\",\n \"COURSE_FOLDER_POSTTEST\": \"After class test\",\n \"COURSE_FOLDER_REFERENCE\": \"References\",\n \"COURSE_FOLDER_TEST\": \"Test\",\n \"COURSE_FOLDER_SURVEY\": \"Questionnaire\",\n \"COURSE_FOLDER\": \"Course Category\",\n \"VIEW_FILES\": \"View File\",\n \"TIME_LEFT\": \"Time Left\",\n \"QUESTION_ANSWERED\": \"Answered Questions\",\n \"QUESTION_NOT_ANSWERED\": \"Incomplete Questions\",\n \"QUESTION_REQUIRED\": \"Mandatory\",\n \"TEST_TIME\": \"Test time limit\",\n \"CAN_TEST_NUMBER_OF_TIMES\": \"Maximum number of times this test can be taken\",\n \"LAST_TEST_NUMBER_OF_TIMES\": \"Remaining number of times this test can be taken\",\n \"NUMBER_OF_TIMES\": \"Number of times\",\n \"TO_THE_HIGHEST_SCORE\": \"One highest score\",\n \"SELECT_THE_HIGHEST_SCORE_ONCE\": \"One highest score\",\n \"STAY_TUNED\": \"Stay Tuned\",\n \"RELATED_LINKS\": \"Related Links\",\n \"COURSE_LINKS\": \"Course Links\",\n \"SUMMARY\": \"Summary\",\n \"ALL_ANNOUNCEMENTS\": \"All Announce\",\n \"VIEW_MY_ANSWERED\": \"Review My Response\",\n \"PASSING\": \"Pass\",\n \"PROPORTION_OF_PERSONNEL\": \"Personal Ratios\",\n \"EXPIRED_ITEMS\": \"Expired\",\n \"LEARNER_DURATION_OF_STUDY\": \"Due date\",\n \"SESSION_CLASS_DEADLINE\": \"Due date\",\n \"DETAILS\": \"Details\",\n \"CREDITS\": \"Credits\",\n \"TOTAL_CREDITS\": \"Total Credits\",\n \"PERSONAL_SETTING\": \"Personal Setting\",\n \"PART\": \"report(s)\",\n \"ALL_DEPARTMENT\": \"All departments\",\n \"NUMBER_OF\": \"Number of records\",\n \"PER_PAGE\": \"Per page\",\n \"BUSINESS_LEAVE\": \"Business trips\",\n \"PERSONAL_LEAVE\": \"Personal leave\",\n \"SICK_LEAVE\": \"Sick leave\",\n \"TRACKING_OBJECT\": \"Tracking staff\",\n \"TRACKING_DEPARTMENT\": \"Tracking department\",\n \"TRACKING_PERIOD\": \"Tracking period\",\n \"SIZE\": \"Size\",\n \"EXPIRED\": \"Expired\",\n \"UNEXPIRED\": \"Unexpired\",\n \"A_MONTH\": \"month(s)\",\n \"ALL_STAFF\": \"All staff\",\n \"ANY_TIME_ZONE\": \"Any time zone\",\n \"RELATED_TO_ME\": \"Related\",\n \"MY_TRAINING\": \"Mine\",\n \"THERE_IS_NO_DATA\": \"There is no data available.\",\n \"PLEASE_AT\": \"Please click\",\n \"SET_THE_CONDITIONS_CONDUCIVE_TO_SEARCH\": \"to check your settings.\",\n \"EVALUATION_STAFF\": \"Evaluation staff\",\n \"OTHER_NEED\": \"Other requirement\",\n \"ADD_ITEM_FORM_STUDY_CATALOG\": \"Add item form study catalog\",\n \"SPECIFY_APPLICANT\": \"specify applicant\",\n \"TRAINING_PLAN\": \"Training roadmap planning\",\n \"TRAINING_BLUEPRINT\": \"Training roadmap\",\n \"COMPETENCE_RECOMMEND\": \"Competence recommend\",\n \"SELF_DEMANDING\": \"Self demanding\",\n \"MANAGER_RECOMMEND\": \"Manager recommend\",\n \"ABILITY_RECOMMEND\": \"Ability recommend\",\n \"PERSONAL_DEVELOPMENT\": \"Personal development\",\n \"SCORE_PASSING\": \"Pass\",\n \"SCORE_FAILED\": \"Fail\",\n \"LEARNING_STATUS\": \"Learning status\",\n \"SOURCE\": \"Source\",\n \"ESTIMATED_COMPLETION_DATE\": \"Estimated completion date\",\n \"ENROLLMENT_DATE\": \"Enrollment date\",\n \"SEARCH_DEPUTY\": \"Search deputy\",\n \"WATCH_REPORT\": \"Study report\",\n \"CERTIFICATE_NAME\": \"Certificate name\",\n \"FILL_IN_END_DATE\": \"Last day for filling in\",\n \"ANNOUNCEMENT_TIME\": \"Announcement time\",\n \"DUTY\": \"Duty\",\n \"INDUCTION\": \"Induction\",\n \"YOU_HAVE_ADD_OTHER_REQUIREMENTS\": \"You have added the following other requirements\",\n \"YOU_HAVE_SELECTED_COURSES\": \"You have selected the following Specifies courses\",\n \"VIEW_ITEM\": \"View item\",\n \"THOUSAND\": \"Thousand\",\n \"ENCRYPTION\": \"Encryption\",\n \"COURSE_CODE\": \"Course code\",\n \"MINUTE\": \"Minutes\",\n \"CLASSIFICATION\": \"Classification\",\n \"RELATED_CERTIFICATE\": \"Related Certificate\",\n \"CERTIFICATE_RECOGNIZED_HOURS\": \"Certificate recognized hours\",\n \"CERTIFICATE_TYPE\": \"Certificate type\",\n \"REWARD_METHOD\": \"Reward method\",\n \"VALIDITY_PERIOD\": \"Validity period\",\n \"CERTIFICATE_CODE\": \"Certificate code\",\n \"PROGRAM_CODE\": \"Program code\",\n \"TEST_CODE\": \"Test code\",\n \"TEST_TYPE\": \"Test type\",\n \"OTHERS\": \"Other\",\n \"COUNSELOR_DETAIL\": \"Counselor detail\",\n \"LEARNER_DETAIL\": \"Learner detail\",\n \"SPECIALTY_COURSE_CLASSIFICATION\": \"Specialty course classification\",\n \"SETTING_CLASS_TIME\": \"Setting class time\",\n \"TIME_ZONE\": \"Time-span\",\n \"TIME_TABLE\": \"Time table\",\n \"LUNCH_TIME\": \"Lunch Time\",\n \"CYCLE_TIME\": \"Cycle Time\",\n \"INTERVAL\": \"Interval\",\n \"FULL_AMOUNT\": \"Full\",\n \"CASH\": \"Cash\",\n \"REMITTANCE\": \"Remittance\",\n \"CHEQUE\": \"Check\",\n \"PAYEE\": \"Payee\",\n \"REMITTANCE_INFORMATION\": \"Remit Info\",\n \"THE_TITLE_OF_THE_COMPANY\": \"Title\",\n \"BRANCHES\": \"Branch\",\n \"RECEIPT_INFORMATION\": \"Check Info\",\n \"THE_TITLE_OF_THE_RECEIPT\": \"Check title\",\n \"RECEIPT_EXPIRE_DATE\": \"Check expiration date\",\n \"RECEIPT_FORMAT\": \"Check format\",\n \"RECEIPT_DELINEATE\": \"Across Check\",\n \"ENDORSEMENT_OR_TRANSFERENCE_PROHIBITED\": \"Endorsement or transference prohibited\",\n \"APPLICATION_CONTENT\": \"Application Content\",\n \"COURSE_DATA\": \"Course data\",\n \"FILL_IN_OTHER_METHOD\": \"Please fill in other report score\",\n \"TEST_HISTORY_SEARCH\": \"Test history search\",\n \"ANSWER_DATE\":\"Answer date\",\n \"TOTAL_COUNT\": \"Total {{value}}\",\n \"AVERAGE_SATISFACTION\": \"Satisfaction\",\n \"NUMBER_OF_COURSES_DUE_WITHIN_THIS_WEEK\": \"Number of courses due within this week\",\n \"CUMULATIVE_TRAINING_COSTS_FOR_THE_YEAR\": \"Cumulative training costs for the year\",\n \"WILL_BE_EXPIRED_COURSES\": \"course(s)\",\n \"DOLLARS\": \"Dollars\",\n \"THERE_IS_NO_ROADMAP_DATA\": \"There is no roadmap data\",\n \"THERE_IS_NO_CERTIFICATE_DATA\": \"There is no certificate data\",\n \"REQUISITION_NUMBER\": \"Application Form Number\",\n \"TRAINING_NAME\": \"Training Name\",\n \"APPLY_THW_WAY\": \"Application Type\",\n \"TODAY_IS_NOT_ANY_SCHEDULE\": \"There is no classroom course today\",\n \"LEARN_TOTAL_TIME\": \"Learning total time\",\n \"PASS_NUMBER\": \"Pass count\",\n \"FAILED_NUMBER\": \"Failed count\",\n \"EXEMPTION_NUMBER\": \"Exemption count\",\n \"TEST_FRACTION\": \"Test score\",\n \"COMMUNITY\": \"Community\",\n \"CERTIFICATE_INTRODUCTION\": \"Certificate introduction\",\n \"COUNSELOR\": \"Counselor\",\n \"LANGUAGE\": \"Language\",\n \"GENERAL_SESSION\": \"General class\",\n \"EXTEND_SESSION\": \"Extend class\",\n \"SEARCH_SCOPE\": \"Search Scope\",\n \"SEARCH_SCOPE_ALL\": \"All\",\n \"SEARCH_SCOPE_DEPARTMENT\": \"Department\",\n \"NOTES\": \"Note\",\n \"CONTACT_PERSON\": \"Contact person\",\n \"CONTACT_PERSON_EMAIL\": \"Contact person email\",\n \"CONTACT_PERSON_PHONE\": \"Contact person phone\",\n \"TOMORROW_TO_REMIND\": \"Tomorrow to remind\",\n \"TOMORROW_IS_NOT_ANY_SCHEDULE\": \"Tomorrow is not any schedule\",\n \"TODAY\": \"Today\",\n \"DAY\": \"Day\",\n \"WEEK_OF_YEAR\": \"Week {{week}} of {{year}}\",\n \"ITEM\": \"Item\",\n \"PROGRESS_OF_SUBMIT_REPORT\": \"Progress of submit report\",\n \"OCCUPY_WAIT_LIST\": \"Occupied Waitlist\",\n \"REMAIN_WAIT_LIST\": \"Remained Waitlist\",\n \"DAYS_IN_DURATION\": \"Days in duration\",\n \"INCLUDE\": \"Include\",\n \"REFERENCE_MATERIAL\": \"Reference Material\",\n \"SUBSIDY_COST\": \"Subsidy cost\",\n \"SELF_COST\": \"Self cost\",\n \"LAST_EXTERNAL_TRAINING_HISTORY\": \"Last External Training History\",\n \"EXTERNAL_TRAINING_APPLY_TIMES_PRE\": \"external training applications have been approved\",\n \"EXTERNAL_TRAINING_APPLY_TIMES_POST\": \"for the learner this year\",\n \"EXTERNAL_TRAINING_APPLY_COST\": \"Accrued external training cost\",\n \"TAX_FREE\": \"Tax Free\",\n \"EXTERNAL_TRAINING_REPORT\": \"Learning Report\",\n \"EXTERNAL_TRAINING_NO_REPORT_NEED\": \"No need to submit\",\n \"UN_PAID\": \"Not submitted\",\n \"ORIGIN\": \"Origin\",\n \"TRAINING_MATERIAL\": \"Training Textbook\",\n \"APPLICANT_INFORMATION\": \"Applicant(s) Information\",\n \"PAY_INFORMATION\": \"Payment Information\",\n \"VENDOR_RECEIVER_NAME\": \"Vendor Receiver\",\n \"APPROVAL_PROCESS_RECORDS\": \"Approval Process Record(s)\",\n \"EXTERNAL_TRAINING_APPLY_DETAIL\": \"External Training Application Detail\",\n \"FILLER\": \"Applicant\",\n \"COMPANY_DETAIL\": \"Company Detail\",\n \"DOCUMENT_REPORT\": \"Document Report\",\n \"NOT_CREATED\": \"Not Created\",\n \"COMPLETION_PERCENTAGE\": \"Completion Percentage\",\n \"RECENTLY_COMPLETED_THE_TRAINEES\": \"Recently Completed The Trainees\",\n \"THERE_IS_NO_SATISFACTION_DATA\": \"Satisfaction: No data\",\n \"FILL_IN_TIME\": \"Fill in time\",\n \"ORIGINAL_FACTORY_NAME\": \"Original factory name\",\n \"CERTIFIED_SUBJECT\": \"Certified subject\",\n \"APPLY_CATEGORY\": \"Apply category\",\n \"CERTIFICATE_GET_DATE\": \"Certificate get date\",\n \"CERTIFICATE_DEADLINE\": \"Certificate deadline\",\n \"NEW_APPLY\": \"New apply\",\n \"EXTENSION_APPLY\": \"Extension apply\",\n \"PERMANENT\": \"Permanent\",\n \"CERTIFICATE_NUMBER\": \"Certificate number\",\n \"ONE\": \"One\",\n \"TWO\": \"Two\",\n \"THREE\": \"Three\",\n \"TEST_DATE\": \"Test date\",\n \"APPLY_REASON\": \"Apply reason\",\n \"TEST_PLAN\": \"Test plan\",\n \"DETAIL_ADDRESS\": \"Address\",\n \"TEST_COST\": \"Test cost\",\n \"ACQUIRE_DATE\": \"Issued date\",\n \"VALID_DATE\": \"Valid date\",\n \"BONUS\": \"Reward\",\n \"CERT_TYPE\": \"Certificate Type\",\n \"SUBJECT_TO_USER_GRADE\": \"Performance\",\n \"NEVER_EXPIRE\": \"Always available\",\n \"EXCERT_ADD_LICENSE_INFO\": \"Data entry\",\n \"SELECT_START_END_DATE\": \"Select start end date\",\n \"VALID_DATE_START\": \"Valid date start\",\n \"VALID_DATE_END\": \"Valid date end\",\n \"APPLICABLE_UNITS\": \"Applicable units\",\n \"PERCENTAGE_OF_EXAMINATIONS\": \"Percentage of examinations\",\n \"CONDITION_NUMBER\": \"Condition number\",\n \"HAS_BEEN_CERTIFIED_SUBJECTS\": \"Has been certified subjects\",\n \"PASS_THE_EXAM_PROJECT\": \"Pass the exam project\",\n \"EXCERT_RELATED_FORM\": \"Related application forms\",\n \"APPLY_DATE_START\": \"Date applied start\",\n \"APPLY_DATE_END\": \"Date applied end\",\n \"EXCERT_APPLY_TEST_DATE\": \"Test application date\",\n \"EXCERT_UNAPPLIED_ITEMS\": \"Items not applied for\",\n \"BONUS_COST\": \"Bonus\",\n \"BONUS_APPLY_DATE\": \"Reward application date\",\n \"EXCERT_APPLY_TEST\": \"Test application\",\n \"TEST_ITEMS\": \"Test item\",\n \"EXCERT_REAL_COMPENSATION\": \"Actual subsidy\",\n \"COMPENSATION\": \"Subsidy\",\n \"EXCERT_REGISTER_APPLY\": \"Registration application\",\n \"REGISTER_APPLY_DATE\": \"Registration application date\",\n \"APPLY_INFO\": \"Apply Information\",\n \"EXTERNAL_CERT_EXAM_BASE_INFO\": \"External cert exam base information\",\n \"CREATE_FROM\": \"Course source (After approval)\",\n \"EXTERNAL_AUTO_CREATE\": \"Create external course automatically\",\n \"EXTERNAL_ADD_COURSE\": \"Add learner to the specified class\",\n \"ASSIGNED_COURSE_CLASS\": \"Assigned course class\",\n \"THE_PAYMENT_N_LEARNING_REPORT\": \"This time submit {{value}} set of learning reports\",\n \"I_WANT_TO_ENROLL\":\"I want to enroll\",\n \"PLAY_THE_COURSE\":\"Play\",\n \"YOU_MAY_BE_INTERESTED_IN_THE_FOLLOWING_COURSES\": \"You may be interested in the following courses\",\n \"AVERAGE_TRAINING_HOURS_IN_EACH_DEPARTMENT\": \"Average training hours in each department\",\n \"EMPLOYEE_TRAINING_HOURS\": \"Employee training hours\",\n \"AVERAGE_TRAINING_COSTS\": \"Average training costs\",\n \"CUMULATIVE_TRAINING_COSTS_IN_EACH_DEPARTMENT\": \"Cumulative training costs in each department\",\n \"EMPLOYEE_CUMULATIVE_TRAINING_COSTS\": \"Employee cumulative training costs\",\n \"IN_EACH_DEPARTMENT\": \"In each department\",\n \"CLICK_THE_PATH_AND_EXPAND_THE_DATA\": \"Click the path and expand the data\",\n \"LICENSE\": \"Certification\",\n \"LEARNING_DETAIL_OF_THE_YEAR\": \"Learning detail of the year\",\n \"TEACHING_HOURS\": \"Teaching hour(s)\",\n \"CERTIFICATE_LIST\": \"Certificate list\",\n \"IN\": \"IN\",\n \"OUT\": \"EX\",\n \"THERE_IS_NO_COURSE_DATA\": \"There is no course data\",\n \"THERE_IS_NO_COST_DATA\": \"There is no cost data\",\n \"CURRENT_DEPARTMENT\": \"Current department\",\n \"LECTURER_TEACHING_DATA\": \"Lecturer teaching data\",\n \"LECTURER_TEACHING_SATISFACTION\": \"Lecturer teaching satisfaction\",\n \"CUMULATIVE_TEACHING_HOURS\": \"Cumulative teaching hours\",\n \"LECTURER_TEACHING_INFORMATION\": \"Lecturer teaching information\",\n \"VAT_NUMBER\": \"VAT number\",\n \"BANK_NAME\": \"Bank name\",\n \"BANK_ACCOUNT\": \"Bank account\",\n \"PHONE\": \"Phone\",\n \"FAX\": \"Fax\",\n \"CONTACT_PERSON_DATA\": \"Contact person data\",\n \"URL\": \"URL\",\n \"DEPARTMENT_MEMBERS_OF_LEARNING_INFORMATION\": \"Department members of learning information\",\n \"NUMBER_OF_TEACHING_SESSIONS\": \"Number of teaching sessions\",\n \"DOLLARS_NT\": \" (dollars)(Currency:NT)\"\n },\n\n \"ACTIONS\": actionsConstant,\n\n \"STATUS\": statusConstant,\n\n \"MESSAGE\": messageConstant,\n\n \"FORM_VALIDATION\": formValidationConstant,\n\n \"ERROR\": {\n \"SERVERS_ERROR\": \"Server error. Please contact the system administrator.\",\n \"ACCOUNT_OR_PASSWORD_ERROR\": \"Wrong account or password!\",\n \"ERROR_ORIGIN_INCONSISTENT\": \"Not match the original password.\",\n \"CODE\": httpErrorCodeConstant,\n \"SIGN_IN_USER_TIMEOUT\": \"System timed out, or you logged in from other browsers. Please enter your account and password again\",\n \"ERROR_MSG_NOT_ADD_DEPUTY_DUE_TO_OVERLAP\": \"As the staff time and the previous generation of record time overlap and the sector has been set on behalf of the staff, it can not set the staff generation!\",\n \"SIGN_IN_USER_LIMIT\": \"The number of concurrent users has reached the limit. Please sign in later\",\n \"C_SIGN_IN_USER_DISABLED\": \"This account was disabled, please contact administrator\",\n \"SIGN_IN_USER_NOT_FOUND\": \"This account cannot be found in the system\"\n },\n \"NO_COURSES\": \"No courses\",\n \"CLICK_IMG_VIEW_FULL_SIZE\": \"Click on the image to view the full image\"\n });\n }\n angular\n .module('eHRD.modules.language')\n .config(local);\n})();\n\n/**\n * Created by Bruce on 2016/5/27.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.index', []);\n\n})();\n\n/**\n * Created by Bruce on 2016/5/18.\n */\n\n(function () {\n 'use strict';\n\n function homepageService($rootScope, Restangular) {\n\n /*\n * Build collection /homepage\n */\n var _homepageService = Restangular.all('homepage');\n\n\n return{\n\n getBanners: function (params) {\n /*\n * api/homepage/banners\n * */\n return _homepageService\n .customGETLIST('banners', params);\n },\n\n getLatestPublishedCourses: function () {\n /*\n * api/homepage/latest-published-courses\n * */\n return _homepageService\n .customGETLIST('latest-published-courses');\n },\n\n getLatestNews: function (params) {\n /*\n * api/homepage/latest-news\n * */\n return _homepageService\n .customGETLIST('latest-news',params);\n },\n\n getLatestNewsDetail: function (newsId) {\n /*\n * api/homepage/latest-news/{newsId}\n * */\n return _homepageService\n .one('latest-news', newsId)\n .get();\n },\n\n getRecommendedCourses: function () {\n /*\n * api/homepage/recommendedcourses\n * */\n return _homepageService\n .customGETLIST('recommendedcourses');\n },\n\n getHotCourse: function () {\n /*\n * api/homepage/hot-courses\n * */\n return _homepageService\n .customGETLIST('hot-courses');\n },\n getWebsites: function (params) {\n /*\n * api/homepage/websites\n * */\n return _homepageService\n .customGETLIST('websites', params);\n },\n getComponent: function (params) {\n /*\n * api/homepage/websites\n * */\n return _homepageService\n .customGETLIST('component',params);\n }\n\n };\n\n }\n\n angular.module('eHRD.modules.index')\n .factory('homepageService',homepageService)\n ;\n\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var relatedSites = {\n bindings: {\n subject: '=',\n size: '@'\n },\n templateUrl: 'app/modules/index/views/related-sites.html',\n controller: ['homepageService', 'sitemapService',\n function(homepageService, sitemapService) {\n var vm = this;\n vm.subject = this.subject;\n var projectId = sitemapService.getProject('projectId');\n homepageService.getWebsites({size:this.size, projectId: projectId}).then(function(websites) {\n vm.websites = websites;\n });\n }\n ]\n };\n\n angular.module('eHRD.modules.index')\n .component('relatedSites', relatedSites);\n})();\n\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var onlineCourseLeaderBoard = {\n bindings: {\n subject: '='\n },\n templateUrl: 'app/modules/index/views/online-course-leader-board.html',\n controller: ['homepageService',\n function(homepageService) {\n var vm = this;\n vm.subject = this.subject;\n homepageService.getHotCourse().then(function(course) {\n vm.hotCourse = course;\n });\n }\n ]\n };\n\n angular.module('eHRD.modules.index')\n .component('onlineCourseLeaderBoard', onlineCourseLeaderBoard);\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var latestNews = {\n bindings: {\n subject: '=',\n size: '@'\n },\n templateUrl: 'app/modules/index/views/latest-news.html',\n controller: ['$mdDialog', 'homepageService', 'sitemapService',\n function($mdDialog, homepageService, sitemapService) {\n var vm = this;\n vm.subject = this.subject;\n var projectId = sitemapService.getProject('projectId');\n homepageService.getLatestNews({size: this.size, projectId: projectId}).then(function(latestNews) {\n vm.latestNews = latestNews;\n });\n\n vm.latestNewsMore = function(mode, newsId, event) {\n $mdDialog.show({\n templateUrl: 'app/modules/index/views/latest-news-more-dialog.html',\n controller: ['homepageService', 'mode', 'newsId', '$mdDialog', 'NgTableParams', '$state',\n function (homepageService, mode, newsId, $mdDialog, NgTableParams, $state) {\n var vm = this;\n vm.mode = mode;\n\n vm.getAllNews = function(){\n vm.mode=1;\n vm.latestnewsTable = new NgTableParams({}, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n var params = {};\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n params.projectId = projectId;\n return homepageService.getLatestNews(params).then(function (latestNews) {\n tableParams.total(latestNews.metadata.pagination.total);\n return latestNews;\n });\n }\n });\n };\n\n vm.getNews = function(newsId){\n vm.mode=0;\n homepageService.getLatestNewsDetail(newsId).then(function (news) {\n vm.news =news;\n });\n\n };\n\n if(vm.mode===1)\n vm.getAllNews();\n else\n vm.getNews(newsId);\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n vm.toCourseInfo = function(titleUrl) {\n var courseType = titleUrl.split('_')[0];\n var courseId = titleUrl.split('_')[1];\n if(courseType!=='64' && courseType!=='128')\n $state.go('courseResourceCatalog.CourseInfo', {cid: 0, courseId:courseId, backState: 'courseResourceCatalog'});\n else\n $state.go('courseResourceCatalog.ProgramInfo', {cid: 0, programId:courseId, backState: 'courseResourceCatalog'});\n }\n\n }],\n controllerAs:'$ctrl',\n clickOutsideToClose: true,\n targetEvent: event,\n locals: {\n mode: mode,\n newsId: newsId\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n };\n\n }\n ]\n };\n\n angular.module('eHRD.modules.index')\n .component('latestNews', latestNews);\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var latestCourse = {\n bindings: {\n subject: '='\n },\n templateUrl: 'app/modules/index/views/latest-course.html',\n controller: ['$state', '$filter', 'courseResourceService',\n function($state, $filter, courseResourceService) {\n var vm = this;\n vm.subject = this.subject;\n courseResourceService.getLatestCourses().then(function(latestCourses) {\n vm.selectedItemId = (latestCourses.length > 0 ? latestCourses[0].itemId : -1);\n vm.latestCoursesInfo = (latestCourses.length > 0 ? latestCourses[0] : null);\n vm.latestCourses = latestCourses;\n });\n\n vm.showLatestPublishedCourses = function (itemId) {\n vm.latestCoursesInfo = $filter('filterBy')(vm.latestCourses, ['itemId'], itemId)[0];\n };\n vm.courseInfoPage = function(itemId, isCourse) {\n (isCourse) ?\n $state.go('courseResourceCatalog.CourseInfo', {\n cid: 0,\n courseId: itemId\n }): $state.go('courseResourceCatalog.ProgramInfo', {\n cid: 0,\n programId: itemId\n });\n };\n }\n ]\n };\n\n angular.module('eHRD.modules.index')\n .component('latestCourse', latestCourse);\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var knowledgeManagementCenter = {\n bindings: {\n subject: '='\n },\n templateUrl: 'app/modules/index/views/knowledge-management-center.html',\n controller: ['knowledgeManagementCenterService',\n function(knowledgeManagementCenterService) {\n var vm = this;\n vm.subject = this.subject;\n knowledgeManagementCenterService.newDocuments({\n 'size': 3\n }).then(function(documents) {\n vm.latestDocuments = documents;\n });\n\n }\n ]\n };\n\n angular.module('eHRD.modules.index')\n .component('knowledgeManagementCenter', knowledgeManagementCenter);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function() {\n 'use strict';\n\n var index = {\n bindings: {},\n templateUrl: 'app/modules/index/views/index.html',\n controller: ['homepageService', 'calendarService', 'courseResourceService', '$state', '$filter', '$translate', 'sitemapService',\n function(homepageService, calendarService, courseResourceService, $state, $filter, $translate, sitemapService) {\n var vm = this;\n vm.leftComponents = [];\n vm.rightComponents = [];\n vm.customizeContent = [];\n var customizeContentCount = 0;\n var projectId = sitemapService.getProject('projectId');\n homepageService.getComponent({projectId:projectId}).then(function(components) {\n vm.components = $filter('orderBy')(components, 'orderNum');\n angular.forEach(vm.components, function(component){\n var subject = \"\";\n switch ($translate.use()){\n case 'en-us':\n subject = component.titleEN;\n break;\n case 'zh-tw':\n subject = component.titleTW;\n break;\n case 'zh-cn':\n subject = component.titleCN;\n break;\n }\n\n component['content'] = getContent(component, subject, component.showNumber);\n switch(component.location) {\n case 1:\n vm.leftComponents.push(component);\n break;\n case 2:\n vm.rightComponents.push(component);\n break;\n }\n });\n });\n\n function getContent(component, subject, showNumber) {\n var content = \"\";\n switch(component.type) {\n case 1:\n vm.latestCourse = subject;\n content = '';\n break;\n case 2:\n vm.incompleteCourse = subject;\n content = '';\n break;\n case 3:\n vm.featuredCourse = subject;\n content = '';\n break;\n case 4:\n vm.knowledgeManagementCenter = subject;\n content = '';\n break;\n case 5:\n vm.latestNews = subject;\n content = '';\n break;\n case 6:\n content = '
    ' +\n '
    ';\n break;\n case 7:\n vm.onlineCourseLeaderBoard = subject;\n content = '';\n break;\n case 8:\n vm.relatedSites = subject;\n content = '';\n break;\n case 10:\n vm.customizeContent[customizeContentCount] = component.customizeContent;\n content = '
    ' + subject + '
    ';\n customizeContentCount++;\n break;\n }\n return content;\n }\n\n homepageService.getBanners({prjId: projectId}).then(function(banners) {\n vm.banners = banners;\n vm.sbannerSpeed = 5000;\n switch(sitemapService.getProject('bannerRotateSpeed')) {\n case 1:\n vm.sbannerSpeed = 3000;\n break;\n case 2:\n vm.sbannerSpeed = 5000;\n break;\n case 3:\n vm.sbannerSpeed = 7000;\n break;\n case 4:\n vm.sbannerSpeed = -1;\n break;\n }\n });\n\n vm.minDateEvents = [];\n vm.viewDate = moment(new Date());\n\n vm.getCalendarEvents = function(date, isOnlyDay) {\n isOnlyDay = isOnlyDay || false;\n if (!isOnlyDay) {\n getCalendarWithOneBeforeAndAfter(date);\n }\n calendarService.getCalendarEvents(date, true).then(function(data) {\n angular.forEach(data, function(event, index) {\n var eventDate = moment(new Date(event.dateStr)).set({\n 'hour': event.endTime.split(':')[0],\n 'minute': event.endTime.split(':')[1],\n 'second': \"0\"\n });\n if (eventDate.isBefore(moment(new Date()))) {\n data[index].isExpired = true;\n }\n });\n vm.dateEvents = data;\n });\n };\n\n var getCalendarWithOneBeforeAndAfter = function(baseDate) {\n if (!moment.isMoment(baseDate)) baseDate = moment(baseDate);\n vm.minDateEvents = [];\n var moreAction = function () {\n $state.go('myCalendar');\n };\n var linkAction = function (event) {\n event = event || undefined;\n if(angular.isDefined(event) && angular.isDefined(event.sessionId)){\n courseResourceService.getEnrollment(event.sessionId, false).then(function (enrollment) {\n $state.go('learningPassport.incompleteCourses.courseInfo', {'enrollmentId': enrollment.enrollmentId});\n });\n }\n };\n calendarService.getCalendarWithOneBeforeAndAfter(baseDate).then(function(data) {\n vm.minDateEvents = calendarService.minCalendarProcess(data, true, moreAction, linkAction);\n });\n };\n getCalendarWithOneBeforeAndAfter(vm.viewDate);\n }\n ]\n };\n\n angular.module('eHRD.modules.index')\n .component('index', index);\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var incompleteCourse = {\n bindings: {\n subject: '='\n },\n templateUrl: 'app/modules/index/views/incomplete-course.html',\n controller: ['SweetAlert', '$filter', 'incompleteCoursesService',\n function(SweetAlert, $filter, incompleteCoursesService) {\n var vm = this;\n vm.subject = this.subject;\n var incompleteCoursesParams = {\n filter_key: 'courseType;programType',\n filter_value: '1,2,3;0,1',\n sort: 'EnrolledDate',\n order: 'DESC',\n current_page: 1,\n list_size: 3\n };\n\n incompleteCoursesService.list(incompleteCoursesParams).then(function(data) {\n vm.incompleteCoursesDatas = data;\n });\n\n vm.isCanView = function(status) {\n return (status === 'incompleted_status' || status === 'status_not_available' || status === 'sco_non_attempt');\n };\n\n vm.showStatus = function(courseType, status) {\n switch (courseType) {\n default: SweetAlert.error($filter('translate')('MESSAGE.MSG_CAN_NOT_TAKE_LESSONS'), $filter('translate')('STATUS.' + status.toUpperCase()));\n break;\n case 4:\n case 5:\n case 6:\n SweetAlert.error($filter('translate')('MESSAGE.MSG_CAN_NOT_TAKE_TEST_QUESTIONNAIRE'), $filter('translate')('STATUS.' + status.toUpperCase()));\n break;\n }\n };\n\n }\n ]\n };\n\n angular.module('eHRD.modules.index')\n .component('incompleteCourse', incompleteCourse);\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var featuredCourse = {\n bindings: {\n subject: '='\n },\n templateUrl: 'app/modules/index/views/featured-course.html',\n controller: ['homepageService',\n function(homepageService) {\n var vm = this;\n vm.subject = this.subject;\n homepageService.getRecommendedCourses().then(function(recommendedCourses) {\n vm.recommendedCourses = recommendedCourses;\n });\n\n }\n ]\n };\n\n angular.module('eHRD.modules.index')\n .component('featuredCourse', featuredCourse);\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.forum', []);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var forum = {\n bindings: {},\n templateUrl: 'app/modules/forum/views/forum.html',\n controller: ['$stateParams', 'serverSetting', function( $stateParams, serverSetting ){\n var vm = this;\n if($stateParams.url.length > 0){\n vm.url = serverSetting.baseConfig.baseURL + '/' + $stateParams.url;\n }\n }]\n };\n\n angular.module('eHRD.modules.forum')\n .component('forum', forum);\n})();\n\n/**\n * Created by Bruce on 2016/10/6.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.fileProcess',[\n 'angularFileUpload',\n 'ngFileUpload'\n ]);\n\n})();\n\n/**\n * Created by Bruce on 2016/10/6.\n */\n\n(function () {\n 'use strict';\n\n fileProcessService.$inject = ['Restangular', 'serverSetting', 'fileProcess'];\n function fileProcessService(Restangular, serverSetting, fileProcess){\n\n /*\n * Build collection api/file\n */\n var _FileService = Restangular.all('file');\n\n return{\n\n learningReportUpload: function (enrollmentId, formData, isReplace) {\n /*\n * api/file/learning-report/{enrollmentId}/upload\n * */\n\n var url = serverSetting.baseConfig.baseApiFileProcessPath + 'learning-report/' + enrollmentId + '/upload';\n return new fileProcess.fileUpload(url, formData, 'File_Report', 'POST', (angular.isDefined(isReplace) ? isReplace : false));\n },\n\n learningReportUploadAction: function (enrollmentId, actionType, params) {\n /* PUT\n * api/file/learning-report/{enrollmentId}/action/{actionType}?reportid={reportId}&iscourse={isCourse}\n * */\n return _FileService\n .one('learning-report', enrollmentId)\n .one('action', actionType)\n .put(params);\n },\n\n learningReportSetScore: function (enrollmentId, data, params) {\n /* PUT\n * api/file/learning-report/86/set-report-score?iscourse={isCourse}&batchId={batchId}\n * */\n return _FileService\n .one('learning-report', enrollmentId)\n .customPUT(data, 'set-report-score', params, {});\n },\n\n getLearningReportList: function(enrollmentId, params){\n /* GET\n * api/file/learning-report/{enrollmentId}/flies?iscourse={isCourse}\n * */\n\n return _FileService\n .one('learning-report', enrollmentId)\n .customGETLIST('flies', params);\n\n },\n\n getLearningReport: function(params){\n /* GET\n * api/file/learning-report/session/files?courseId={courseId}&programId={programId}\n * */\n\n return _FileService\n .one('learning-report')\n .one('session')\n .customGETLIST('files', params);\n\n },\n\n getLearningReportStatus: function(enrollmentId, params){\n /* GET\n * api/file/learning-report/{enrollmentId}/status\n * */\n\n return _FileService\n .one('learning-report', enrollmentId)\n .customGET('status', params);\n\n },\n\n applyOtherReportApproval: function (enrollmentId, itemType, params) {\n /* PUT\n * api/file/learning-report/{enrollmentId}/itemType/{itemType}\n * */\n return _FileService\n .one('learning-report', enrollmentId)\n .one('itemType', itemType)\n .put(params);\n },\n\n getReportProcess: function (enrollmentId, params) {\n /*\n * api/file/learning-history/{enrollmentId}/report-process?isCourse={isCourse}\n * */\n return _FileService\n .one('learning-history', enrollmentId)\n .customGET('report-process', params);\n }\n\n };\n }\n\n angular\n .module('eHRD.modules.fileProcess')\n .factory('fileProcessService', fileProcessService);\n\n})();\n\n/**\n * Created by Bruce on 2016/10/6.\n */\n\n(function () {\n 'use strict';\n\n fileProcess.$inject = [];\n function fileProcess(){\n var provider = this;\n provider.$get = defaultFileProcess;\n\n defaultFileProcess.$inject = ['$auth', 'FileUploader', 'Upload', 'serverSetting', '$filter'];\n function defaultFileProcess($auth, FileUploader, Upload, serverSetting, $filter) {\n var _headers = {};\n var _filters = [];\n\n function FileProcessInit(maxSize, alertMessage) {\n _filters = [];\n maxSize = maxSize || 524288000;\n _headers[serverSetting.webServiceSetting.defaultAuthHeader] = serverSetting.webServiceSetting.defaultAuthToken + ' ' + $auth.getToken();\n _filters.push(\n { name: 'sizeFilter',\n fn: function(item) {\n alertMessage = alertMessage || item.name + ' : ' + $filter('translate')('FILE_SIZE_ERROR');\n if(item.size > maxSize){\n alert(alertMessage);\n }\n return item.size <= maxSize;\n }\n });\n }\n return {\n /**\n * Creates Default fileUpload Process\n * @url {String}\n * @formData [{Object}]\n * @fieldName {String} Default value is file\n * @requestMethod {String} Default value is POST\n * @isAutoUpload {String} Default value is False\n */\n fileUpload: function (url, formData, fieldName ,requestMethod, isAutoUpload, maxSize, alertMessage) {\n new FileProcessInit(maxSize, alertMessage);\n formData = formData || [];\n fieldName = fieldName || 'file';\n requestMethod = requestMethod || 'POST';\n isAutoUpload = isAutoUpload || false;\n url = serverSetting.baseConfig.baseURL + url;\n\n return new FileUploader({\n url: url,\n headers: _headers, //Headers to be sent along with the files. HTML5 browsers only.\n alias: fieldName, // Name of the field which will contain the file, default is file\n formData: formData, // Data to be sent along with the files\n queue: [], // Items to be uploaded\n progress: 1, // Upload queue progress percentage. Read only.\n filters: _filters, // Filters to be applied to the files before adding them to the queue. If the filter returns true the file will be added to the queue\n autoUpload: isAutoUpload, // Automatically upload files after adding them to the queue\n method: requestMethod, // It's a request method. By default POST. HTML5 browsers only.\n removeAfterUpload: true, // Remove files from the queue after uploading\n isHTML5: true, // true if uploader is html5-uploader. Read only.\n isUploading: true, // true if an upload is in progress. Read only.\n queueLimit: 5, // maximum count of files\n withCredentials: true // enable CORS. HTML5 browsers only.\n });\n },\n\n upload: function (url, formData, fileFieldName, files ,requestMethod) {\n new FileProcessInit();\n formData = formData || {};\n fileFieldName = fileFieldName || 'file';\n files = files || {};\n requestMethod = requestMethod || 'POST';\n url = serverSetting.baseConfig.baseURL + url;\n angular.forEach(files, function (file, index) {\n var _index = parseInt(index) + 1;\n formData[fileFieldName+_index] = angular.isUndefined(file) ? '' : file;\n });\n // if(files.length > 0){\n // formData[fileFieldName] = files;\n // }\n\n return new Upload.upload({\n url: url,\n data: formData,\n objectKey: 'k',\n arrayKey: '[i]',\n method: requestMethod,\n headers: _headers, // only for html5\n withCredentials: true\n });\n }\n };\n }\n }\n\n angular\n .module('eHRD.modules.fileProcess')\n .provider('fileProcess', fileProcess);\n\n})();\n\n/**\n * Created by Bruce on 2016/10/6.\n */\n\n(function () {\n 'use strict';\n\n fileProcessConfig.$inject = ['$provide', '$translatePartialLoaderProvider'];\n function fileProcessConfig($provide, $translatePartialLoaderProvider) {\n\n $translatePartialLoaderProvider.addPart('modules/file-process');\n\n $provide.decorator('FileUploader', ['$delegate', function(FileUploader) {\n // $delegate is FileUploader\n // add new method\n // FileUploader.prototype.yourMethod = function() {/*code*/};\n // override default over class (\"nv-file-over\")\n // FileUploader.FileOver.prototype.overClass = 'your-class-name';\n\n return FileUploader;\n }])\n }\n angular\n .module('eHRD.modules.fileProcess')\n .config(fileProcessConfig);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/24.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.dashboard', []);\n\n})();\n\n/**\n * Created by Bruce on 2016/9/22.\n */\n(function () {\n 'use strict';\n\n userDashboardService.$inject = ['Restangular'];\n function userDashboardService(Restangular) {\n var _UserDashboardService = Restangular.all('dashboard');\n\n return {\n\n getUserToDo: function () {\n /*\n * api/dashboard/learner/todo\n * */\n return _UserDashboardService\n .one('learner')\n .customGET('todo');\n },\n getUserToDoNewCourse : function () {\n /*\n * api/dashboard/learner/todo-new-course\n * */\n return _UserDashboardService\n .one('learner')\n .customGET('todo-new-course');\n },\n getTrainingHours: function () {\n /*\n * api/dashboard/learner/training-hours\n * */\n return _UserDashboardService\n .one('learner')\n .customGET('training-hours');\n },\n\n getLearningGraph: function (params) {\n /*\n * api/dashboard/learner/learning-graph\n * */\n return _UserDashboardService\n .one('learner')\n .customGET('learning-graph', params);\n },\n\n getPlatformNews: function (params) {\n /*\n * api/dashboard/learner/latest-news?minuteofago={ minuteOfAgo }&shownum={ showNum }\n * */\n return _UserDashboardService\n .one('learner')\n .customGET('latest-news', params);\n },\n\n getCoursePassCount: function (params) {\n /*\n * api/dashboard/learner/course-pass-count\n * */\n return _UserDashboardService\n .one('learner')\n .customGET('course-pass-count', params);\n },\n\n getOnlineCourseHours: function (params) {\n /*\n * api/dashboard/onlinecourse-hours\n * */\n return _UserDashboardService\n .one('learner')\n .customGET('onlinecourse-hours', params);\n },\n\n getMyLearningHistoryItem: function (params) {\n /*\n * api/dashboard/learner/my-learning-history?shownum={shownum}\n * */\n return _UserDashboardService\n .one('learner')\n .customGETLIST('my-learning-history', params);\n },\n\n getInCompleteItems: function (params) {\n /*\n * api/dashboard/learner/incomplete-items?dayfago={dayOfAgo}&course-type={courseType}\n * */\n return _UserDashboardService\n .one('learner')\n .customGETLIST('incomplete-items', params);\n },\n\n getDistributionMap: function (params) {\n /*\n * api/dashboard/learner/distribution-map\n * */\n return _UserDashboardService\n .one('learner')\n .customGET('distribution-map', params);\n },\n\n getRoadmapProgress: function (params) {\n /*\n * api/dashboard/learner/roadmap-progress\n * */\n return _UserDashboardService\n .one('learner')\n .customGET('roadmap-progress', params);\n },\n\n getCertProgress: function (params) {\n /*\n * api/dashboard/learner/cert-progress\n * */\n return _UserDashboardService\n .one('learner')\n .customGET('cert-progress', params);\n },\n\n getCertSum: function (params) {\n /*\n * api/dashboard/learner/cert-sum\n * */\n return _UserDashboardService\n .one('learner')\n .customGET('cert-sum', params);\n },\n\n getAnnualExternalCost: function (params) {\n /*\n * api/dashboard/learner/annual-external-cost\n * */\n return _UserDashboardService\n .one('learner')\n .customGET('annual-external-cost', params);\n },\n\n getComponent:function(params){\n /*\n * api/dashboard/learner/component\n * */\n\n return _UserDashboardService\n .one('learner')\n .customGETLIST('component', params);\n },\n\n getTrainingCost:function(params){\n /*\n * api/dashboard/learner/training-cost\n * */\n\n return _UserDashboardService\n .one('learner')\n .customGET('training-cost', params);\n },\n\n getTrainingDetail:function(params){\n /*\n * api/dashboard/learner/training-detail\n * */\n\n return _UserDashboardService\n .one('learner')\n .customGET('training-detail', params);\n }\n\n\n };\n\n }\n\n angular.module('eHRD.modules.dashboard')\n .factory('userDashboardService', userDashboardService);\n})();\n\n/**\n * Created by Alan on 2016/12/23.\n */\n(function () {\n 'use strict';\n\n departmentDashboardService.$inject = ['Restangular'];\n function departmentDashboardService(Restangular) {\n var _DepartmentDashboardService = Restangular.all('dashboard');\n\n return {\n\n getManagerGroup: function (params) {\n /*\n * api/dashboard/manager/manager-group\n * */\n return _DepartmentDashboardService\n .one('manager')\n .customGETLIST('manager-group', params);\n },\n\n getGroupTrainingHours: function (params) {\n /*\n * api/dashboard/manager/group-training-hours?groupId={groupId}\n * */\n return _DepartmentDashboardService\n .one('manager')\n .customGET('group-training-hours', params);\n },\n\n getGroupCost: function (params) {\n /*\n * api/dashboard/manager/group-cost?groupId={groupId}&year={year}\n * */\n return _DepartmentDashboardService\n .one('manager')\n .customGET('group-cost', params);\n },\n\n getGroupMonthCost: function (params) {\n /*\n * api/dashboard/manager/group-month-cost?groupId={groupId}&year={year}\n * */\n return _DepartmentDashboardService\n .one('manager')\n .customGET('group-month-cost', params);\n },\n\n getGroupIncompletedCourse: function (params) {\n /*\n * api/dashboard/manager/group-incompleted-course?groupId={groupId}\n * */\n return _DepartmentDashboardService\n .one('manager')\n .customGET('group-incompleted-course', params);\n },\n\n getGroupUserInfo: function (params) {\n /*\n * api/dashboard/manager/group-user-info?groupId={groupId}\n * */\n return _DepartmentDashboardService\n .one('manager')\n .customGET('group-user-info', params);\n },\n\n getGroupAttendance: function (params) {\n /*\n * api/dashboard/manager/group-attendance?groupId={groupId}&year={year}\n * */\n return _DepartmentDashboardService\n .one('manager')\n .customGET('group-attendance', params);\n },\n\n getGroupCompletion: function (params) {\n /*\n * api/dashboard/manager/group-completion?groupId={groupId}&year={year}\n * */\n return _DepartmentDashboardService\n .one('manager')\n .customGET('group-completion', params);\n },\n\n getGroupTrainingHoursDetail: function (params) {\n /*\n * api/dashboard/manager/group-training-hours-detail?groupId={groupId}\n * */\n\n return _DepartmentDashboardService\n .one('manager')\n .customGET('group-training-hours-detail', params);\n },\n\n getGroupUserTrainingHoursDetail: function (params) {\n /*\n * api/dashboard/manager/group-user-training-hours-detail?groupId={ groupId }\n * */\n\n return _DepartmentDashboardService\n .one('manager')\n .customGET('group-user-training-hours-detail', params);\n },\n\n getGroupTrainingCostDetail: function (params) {\n /*\n * api/dashboard/manager/group-training-cost-detail?groupId={groupId}\n * */\n\n return _DepartmentDashboardService\n .one('manager')\n .customGET('group-training-cost-detail', params);\n },\n\n getGroupUserTrainingCostDetail: function (params) {\n /*\n * api/dashboard/manager/group-user-training-cost-detail?groupId={ groupId }\n * */\n\n return _DepartmentDashboardService\n .one('manager')\n .customGET('group-user-training-cost-detail', params);\n }\n };\n\n }\n\n angular.module('eHRD.modules.dashboard')\n .factory('departmentDashboardService', departmentDashboardService);\n})();\n\n/**\n * Created by Alan on 2017/7/6.\n */\n\n(function () {\n 'use strict';\n\n lecturerInfoDialog.$inject = ['$mdDialog'];\n function lecturerInfoDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n lecturerId: '='\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/dashboard/views/manager/lecturer-info-dialog.html',\n controller: ['$mdDialog', 'instructorService', 'lecturerId',\n function ($mdDialog, instructorService, lecturerId) {\n var vm = this;\n vm.getData = function(params) {\n instructorService.getTeachingRecord(lecturerId, params).then(function(lecturerInfo) {\n vm.lecturerInfo = lecturerInfo;\n vm.lecturerPagination = lecturerInfo.metadata.pagination;\n vm.learnerTotlaScore = lecturerInfo.metadata.learnerTotlaScore;\n vm.classroomTotalHour = lecturerInfo.metadata.classroomTotalHour;\n vm.instructorInfo = lecturerInfo.metadata.instructorInfo;\n vm.teachingTimes = lecturerInfo.metadata.teachingTimes;\n });\n };\n\n vm.getData();\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n }],\n multiple: true,\n targetEvent: ev,\n controllerAs: '$ctrl',\n clickOutsideToClose:true,\n locals : {\n lecturerId: scope.lecturerId\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.dashboard')\n .directive('lecturerInfoDialog', lecturerInfoDialog);\n\n})();\n\n/**\n * Created by Alan on 2017/6/8.\n */\n\n(function () {\n 'use strict';\n\n averageTrainingHoursDialog.$inject = ['$mdDialog'];\n function averageTrainingHoursDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n groupId: '='\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/dashboard/views/manager/average-training-hours-dialog.html',\n controller: ['$mdDialog', 'departmentDashboardService', 'groupId', '$q',\n function ($mdDialog, departmentDashboardService, groupId, $q) {\n var vm = this;\n vm.drillId = groupId;\n vm.chartColors = ['#83ccc5','#0277bd','#f48fb1'];\n vm.getGroupTrainingHours = function(id){\n departmentDashboardService.getGroupTrainingHours({groupId: id }).then(function(groupTrainingHours){\n vm.groupTrainingHours = groupTrainingHours;\n });\n };\n\n vm.drillFn = function(id) {\n var defer = $q.defer();\n departmentDashboardService.getGroupTrainingHoursDetail({groupId: id}).then(function(data){\n vm.getGroupTrainingHours(id);\n\n vm.groupName = data.groupName;\n if(data.subGroupIds.length === 0) {\n departmentDashboardService.getGroupUserTrainingHoursDetail({groupId: id}).then(function(data){\n vm.groupTrainingHoursParams = {\n categories: data.userNames,\n series: data.dataObject,\n isClick: false,\n subGroupIds: data.userIds,\n parentGroupId: vm.parentGroupId\n };\n vm.isShowGroupUserTrainingHoursDetail = false;\n defer.resolve(vm.groupTrainingHoursParams);\n });\n }\n else {\n vm.userDrillFn(id);\n vm.parentGroupId = data.groupId;\n vm.groupTrainingHoursParams = {\n categories: data.subGroupNames,\n series: data.dataObject,\n isClick: true,\n subGroupIds: data.subGroupIds,\n parentGroupId: data.parentGroupId\n };\n vm.isShowGroupUserTrainingHoursDetail = true;\n defer.resolve(vm.groupTrainingHoursParams);\n }\n });\n\n return defer.promise;\n };\n\n vm.userDrillFn = function(id) {\n departmentDashboardService.getGroupUserTrainingHoursDetail({groupId: id}).then(function(data){\n vm.groupUserTrainingHoursParams = {\n categories: data.userNames,\n series: data.dataObject,\n hasSubGroups: [],\n subGroupIds: data.userIds\n };\n });\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n }],\n multiple: true,\n targetEvent: ev,\n controllerAs: '$ctrl',\n clickOutsideToClose:true,\n locals : {\n groupId: scope.groupId\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.dashboard')\n .directive('averageTrainingHoursDialog', averageTrainingHoursDialog);\n\n})();\n\n/**\n * Created by Alan on 2017/6/8.\n */\n\n(function () {\n 'use strict';\n\n averageTrainingCostDialog.$inject = ['$mdDialog'];\n function averageTrainingCostDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n groupId: '='\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/dashboard/views/manager/average-training-cost-dialog.html',\n controller: ['$mdDialog', 'departmentDashboardService', 'groupId', '$q',\n function ($mdDialog, departmentDashboardService, groupId, $q) {\n var vm = this;\n vm.drillId = groupId;\n vm.chartColors = ['#fca333','#f474b1','#81bbde'];\n vm.getGroupTrainingCost = function(id){\n departmentDashboardService.getGroupCost({groupId: id }).then(function(groupTrainingCost){\n vm.groupTrainingCost = groupTrainingCost;\n });\n };\n\n vm.drillFn = function(id) {\n var defer = $q.defer();\n departmentDashboardService.getGroupTrainingCostDetail({groupId: id}).then(function(data){\n vm.getGroupTrainingCost(id);\n\n vm.groupName = data.groupName;\n if(data.subGroupIds.length === 0) {\n departmentDashboardService.getGroupUserTrainingCostDetail({groupId: id}).then(function(data){\n vm.groupTrainingCostParams = {\n categories: data.userNames,\n series: data.dataObject,\n isClick: false,\n subGroupIds: data.userIds,\n parentGroupId: vm.parentGroupId\n };\n vm.isShowGroupUserTrainingCostDetail = false;\n defer.resolve(vm.groupTrainingCostParams);\n });\n }\n else {\n vm.userDrillFn(id);\n vm.parentGroupId = data.groupId;\n vm.groupTrainingCostParams = {\n categories: data.subGroupNames,\n series: data.dataObject,\n isClick: true,\n subGroupIds: data.subGroupIds,\n parentGroupId: data.parentGroupId\n };\n vm.isShowGroupUserTrainingCostDetail = true;\n defer.resolve(vm.groupTrainingCostParams);\n }\n });\n\n return defer.promise;\n };\n\n vm.userDrillFn = function(id) {\n departmentDashboardService.getGroupUserTrainingCostDetail({groupId: id}).then(function(data){\n vm.groupUserTrainingCostParams = {\n categories: data.userNames,\n series: data.dataObject,\n hasSubGroups: [],\n subGroupIds: data.userIds\n };\n });\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n }],\n multiple: true,\n targetEvent: ev,\n controllerAs: '$ctrl',\n clickOutsideToClose:true,\n locals : {\n groupId: scope.groupId\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.dashboard')\n .directive('averageTrainingCostDialog', averageTrainingCostDialog);\n\n})();\n\n/**\n * Created by Alan on 2017/6/29.\n */\n(function() {\n 'use strict';\n\n var yearAccumulatedTrainingCosts = {\n bindings: {\n distributionMaps: '='\n },\n templateUrl: 'app/modules/dashboard/views/learning/year-accumulated-training-costs.html',\n controller: ['$timeout', '$scope', '$filter', 'PermPermissionStore', function($timeout, $scope, $filter, PermPermissionStore) {\n var vm = this;\n var permission = null;\n permission = PermPermissionStore.getPermissionDefinition('Modules.certification');\n vm.hasCertificationPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.curriculum');\n vm.hasCurriculumPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.course');\n vm.hasCoursePermission = angular.isDefined(permission);\n\n vm.distributionMaps = this.distributionMaps;\n $scope.$watch(function(){\n return vm.distributionMaps;\n },function (newVal) {\n if(!angular.isUndefinedOrNull(newVal)) {\n $timeout(function() {\n vm.pies = [];\n if(vm.hasCertificationPermission) {\n vm.pies.push({\n categoryName: $filter('translate')('FIELD.LICENSE'),\n sum: vm.distributionMaps.certCost\n });\n }\n\n if(vm.hasCoursePermission) {\n vm.pies.push({\n categoryName: $filter('translate')('FIELD.EXTERNAL_TRAINING') + $filter('translate')('FIELD.COURSE'),\n sum: vm.distributionMaps.externalCost\n });\n }\n\n if(vm.hasCurriculumPermission) {\n vm.pies.push({\n categoryName: $filter('translate')('FIELD.INTERNAL_TRAINING') + $filter('translate')('FIELD.COURSE'),\n sum: vm.distributionMaps.internalCost\n });\n }\n\n }, 1000);\n }\n });\n\n vm.colorOpacity = function(color) {\n var c = d3.rgb(color).darker(0.1);\n return 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + '0.5' + ')';\n }\n }]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('yearAccumulatedTrainingCosts', yearAccumulatedTrainingCosts);\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var trainingRoadMapProgress = {\n bindings: {\n roadmapProgress: '='\n },\n templateUrl: 'app/modules/dashboard/views/learning/training-road-map-progress.html',\n controller: [function() {\n var vm = this;\n vm.roadmapProgress = this.roadmapProgress;\n }\n ]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('trainingRoadMapProgress', trainingRoadMapProgress);\n})();\n\n/**\n * Created by Alan on 2017/6/29.\n */\n(function() {\n 'use strict';\n\n var totalBlock = {\n bindings: {\n blockBackground: '@',\n isMaterialIcon: '=',\n icon: '@',\n count: '=',\n blockTitle: '@'\n },\n templateUrl: 'app/modules/dashboard/views/learning/total-block.html',\n controller: [function() {\n var vm = this;\n vm.blockBackground = this.blockBackground;\n vm.isMaterialIcon = this.isMaterialIcon;\n vm.icon = this.icon;\n vm.count = this.count;\n vm.blockTitle = this.blockTitle;\n }]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('totalBlock', totalBlock);\n})();\n\n/**\n * Created by Alan on 2017/6/1.\n */\n(function () {\n 'use strict';\n\n var rateProgressBars = {\n bindings: {\n progressTitle: '@',\n progresses: '=',\n valueKey: '@'\n },\n templateUrl: 'app/modules/dashboard/views/manager/rate-progress-bars.html',\n controller: [function () {\n var vm = this;\n vm.progressTitle = this.progressTitle;\n vm.progresses = this.progresses;\n vm.valueKey = this.valueKey;\n }]\n };\n\n angular\n .module('eHRD.modules.utils')\n .component('rateProgressBars', rateProgressBars);\n\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var platformLatestNews = {\n bindings: {\n platformNews: '='\n },\n templateUrl: 'app/modules/dashboard/views/learning/platform-latest-news.html',\n controller: [function() {\n var vm = this;\n vm.platformNews = this.platformNews;\n }\n ]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('platformLatestNews', platformLatestNews);\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var onlineCourseCurve = {\n bindings: {\n learningGraphDatas: '=',\n learningGraph: '='\n },\n templateUrl: 'app/modules/dashboard/views/learning/online-course-curve.html',\n controller: ['userDashboardService', 'defaultFontFamily', '$filter', '$timeout', '$scope',\n function(userDashboardService, defaultFontFamily, $filter, $timeout, $scope) {\n var vm = this;\n vm.learningGraphDatas = this.learningGraphDatas;\n vm.learningGraph = this.learningGraph;\n\n $scope.$watch(function(){\n return vm.learningGraphDatas;\n },function (newVal) {\n if(!angular.isUndefinedOrNull(newVal)) {\n $timeout(function() {\n vm.lineChartConfig = {\n options: {\n chart: {\n type: 'areaspline',\n style: {\n fontFamily: defaultFontFamily\n }\n },\n credits: false,\n responsive: true,\n exporting: {\n enabled: false\n },\n tooltip: {\n valueSuffix: $filter('translate')(\"FIELD.HOUR\")\n }\n },\n series: [{\n name: $filter('translate')(\"FIELD.LEARNING_HOURS\"),\n data: vm.learningGraphDatas\n }],\n title: {\n text: ''\n },\n xAxis: {\n categories: vm.learningGraph.lineChart.labels\n },\n yAxis: {\n title: {\n text: $filter('translate')(\"FIELD.TIME_OF_HOURS\")\n }\n },\n\n size: {\n height: \"265\"\n },\n loading: false\n };\n vm.chartFinish = true;\n }, 1000);\n }\n });\n\n\n // vm.dashboardData.learningGraph.lineChart.data = [];\n // vm.dashboardData.learningGraph.lineChart.series = ['學習時數'];\n // vm.dashboardData.learningGraph.lineChart.datasetOverride = [{\n // yAxisID: 'y-axis-1'\n // }];\n // vm.dashboardData.learningGraph.lineChart.options = {\n // scales: {\n // yAxes: [{\n // id: 'y-axis-1',\n // type: 'linear',\n // display: true,\n // position: 'left'\n // }]\n // }\n // };\n //\n // var learningGraphDatas = [];\n // angular.forEach(learningGraph, function(learningGraphData) {\n // var monthName = $filter('numberToMonth')(learningGraphData.month);\n // vm.dashboardData.learningGraph.lineChart.labels.push($filter('translate')(monthName));\n // learningGraphDatas.push(learningGraphData.hours)\n // });\n // vm.dashboardData.learningGraph.lineChart.data.push(learningGraphDatas);\n }\n ]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('onlineCourseCurve', onlineCourseCurve);\n})();\n\n/**\n *Created by Alan on 2017/6/1.\n */\n(function() {\n 'use strict';\n\n var monthCumulativeTrainingCosts = {\n bindings: {\n trainingCosts: '=',\n isGroupMonthCostNoData: '='\n },\n templateUrl: 'app/modules/dashboard/views/manager/month-cumulative-training-costs.html',\n controller: [\n function() {\n var vm = this;\n vm.trainingCosts = this.trainingCosts;\n vm.isGroupMonthCostNoData = this.isGroupMonthCostNoData;\n }\n ]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('monthCumulativeTrainingCosts', monthCumulativeTrainingCosts);\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var learningResume = {\n bindings: {\n myLearningHistoryItems: '=',\n isManager: '=?'\n },\n templateUrl: 'app/modules/dashboard/views/learning/learning-resume.html',\n controller: [function() {\n var vm = this;\n vm.myLearningHistoryItems = this.myLearningHistoryItems;\n vm.isManager = angular.isUndefinedOrNull(this.isManager)?false:this.isManager;\n }]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('learningResume', learningResume);\n})();\n\n/**\n * Created by Alan on 2017/6/29.\n */\n(function() {\n 'use strict';\n\n var learningDetail = {\n bindings: {\n categories: '=',\n series: '='\n },\n templateUrl: 'app/modules/dashboard/views/learning/learning-detail.html',\n controller: ['defaultFontFamily', '$timeout', '$scope', function(defaultFontFamily, $timeout, $scope) {\n var vm = this;\n vm.categories = this.categories;\n vm.series = this.series;\n $scope.$watch(function(){\n return vm.categories;\n },function (newVal) {\n if(!angular.isUndefinedOrNull(newVal)) {\n $timeout(function() {\n vm.chartConfig = {\n options: {\n chart: {\n type: 'column',\n style: {\n fontFamily: defaultFontFamily\n }\n },\n colors: ['#7EB9DC', '#FCA333' ,'#5CB65F','red'],\n credits: false,\n responsive: true,\n exporting: {\n enabled: false\n }\n },\n title: {\n text: ''\n },\n xAxis: {\n labels: {\n style: {\n fontSize:'15px',\n fontWeight: 'bold'\n }\n },\n categories: vm.categories\n },\n yAxis: {\n tickInterval: 1,\n title: {\n text: ''\n }\n },\n series: vm.series,\n size: {\n height: \"280\"\n },\n loading: false\n };\n vm.isNoData = true;\n angular.forEach(vm.series, function(series){\n angular.forEach(series.data, function(data){\n if(data > 0)\n vm.isNoData = false;\n });\n });\n vm.chartFinish = true;\n }, 0);\n }\n });\n }]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('learningDetail', learningDetail);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var learningDashboard = {\n bindings: {},\n templateUrl: 'app/modules/dashboard/views/learning-dashboard.html',\n controller: [ 'PermPermissionStore', 'userDashboardService', '$filter', 'calendarService', 'defaultFontFamily', 'courseResourceService',\n function( PermPermissionStore, userDashboardService, $filter, calendarService, defaultFontFamily, courseResourceService ){\n var vm = this;\n vm.dashboardData = {};\n vm.today = new Date();\n\n vm.getData = function(){\n userDashboardService.getUserToDo().then(function(userToDoData) {\n vm.dashboardData.userToDo = userToDoData;\n });\n\n courseResourceService.getLatestCourses().then(function(latestCourses) {\n vm.dashboardData.toDoDataNewCourse = latestCourses.length;\n });\n\n userDashboardService.getTrainingHours().then(function(trainingHours) {\n vm.dashboardData.trainingHours = trainingHours;\n });\n };\n\n vm.getData();\n\n }]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('learningDashboard', learningDashboard);\n})();\n\n/**\n * Created by Alan on 2017/7/3.\n */\n(function () {\n 'use strict';\n\n var learningDashboardBlocks = {\n bindings: {\n userId: '=?',\n reloadFn: '&?',\n isManager: '=?'\n },\n templateUrl: 'app/modules/dashboard/views/learning-dashboard-blocks.html',\n controller: [ 'userDashboardService', 'calendarService', 'userService', 'sitemapService', '$filter',\n function( userDashboardService, calendarService, userService, sitemapService, $filter ){\n var vm = this;\n vm.dashboardData = {};\n vm.isManager = angular.isUndefinedOrNull(this.isManager)?false:this.isManager;\n var userId = angular.isUndefinedOrNull(this.userId)?userService.getKernelUser().userId:this.userId;\n vm.getData = function(){\n if(angular.isFunction(this.reloadFn)) {\n this.reloadFn();\n }\n var projectId = sitemapService.getProject('projectId');\n userDashboardService.getComponent({projectId:projectId, viewType:(vm.isManager)?1:0}).then(function(components) {\n vm.components = $filter('orderBy')(components, 'orderNum');\n angular.forEach(vm.components, function(component){\n vm.position = \"th-board col-xs-12 col-sm-6 col-lg-4\";\n vm.positionTwo = \"th-board col-xs-12 col-sm-12 col-lg-8\";\n if(component.isDisplay===1) {\n switch(component.type) {\n case 0:\n var calendarParams = {\n courseType: 2,\n userId: userId\n };\n calendarService.getCalendar(moment().format('YYYY'), moment().format('MM'), moment().format('DD'), calendarParams).then(function (calendar) {\n vm.calendar = calendar;\n });\n component.content = '';\n break;\n case 1:\n userDashboardService.getInCompleteItems({'dayfago':90, 'course-type':'2', userId: userId}).then(function (inCompleteItems) {\n vm.inCompleteItems = inCompleteItems;\n });\n component.content = '';\n break;\n case 2:\n userDashboardService.getMyLearningHistoryItem({shownum:4, userId: userId}).then(function (myLearningHistoryItems) {\n vm.myLearningHistoryItems = myLearningHistoryItems;\n });\n component.content = '';\n break;\n case 3:\n userDashboardService.getTrainingDetail({userId: userId}).then(function(learningDetail){\n vm.learningDetail = learningDetail;\n });\n component.content = '';\n break;\n case 4:\n userDashboardService.getTrainingCost({userId: userId}).then(function (trainingCost) {\n vm.trainingCost= trainingCost;\n });\n component.content = '';\n break;\n case 5:\n userDashboardService.getCoursePassCount({userId: userId}).then(function (coursePassCount) {\n vm.coursePassCount = coursePassCount;\n });\n userDashboardService.getOnlineCourseHours({userId: userId}).then(function (onlineCourseHours) {\n vm.onlineCourseHours = onlineCourseHours;\n });\n component.content = ' ';\n break;\n case 6:\n userDashboardService.getRoadmapProgress({userId: userId}).then(function (roadmapProgress) {\n vm.roadmapProgress = roadmapProgress;\n });\n component.content = '';\n break;\n case 7:\n userDashboardService.getCertProgress({userId: userId}).then(function (certProgress) {\n vm.certProgress = certProgress;\n });\n component.content = '';\n break;\n case 8:\n userDashboardService.getLearningGraph({userId: userId}).then(function(learningGraph) {\n vm.learningGraph = learningGraph;\n vm.learningGraph.lineChart = {};\n vm.learningGraph.lineChart.labels = [];\n vm.learningGraphDatas = [];\n angular.forEach(learningGraph, function (learningGraphData) {\n var monthName = $filter('numberToMonth')(learningGraphData.month);\n var uppercaseMonthName = $filter('uppercase')(monthName);\n vm.learningGraph.lineChart.labels.push($filter('translate')(\"FIELD.\" + uppercaseMonthName));\n vm.learningGraphDatas.push(learningGraphData.hours)\n });\n });\n component.content = '';\n break;\n case 9:\n userDashboardService.getDistributionMap({userId: userId}).then(function (distributionMaps) {\n vm.distributionMaps= distributionMaps;\n });\n component.content = '';\n break;\n case 10:\n userDashboardService.getPlatformNews({minuteofago:1440, shownum:5, userId: userId}).then(function (platformNews) {\n vm.platformNews = platformNews;\n });\n component.content = '';\n break;\n }\n }\n\n });\n });\n };\n\n vm.getData();\n\n }]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('learningDashboardBlocks', learningDashboardBlocks);\n})();\n\n/**\n * Created by Alan on 2017/6/1.\n */\n(function() {\n 'use strict';\n\n var groupUserInfo = {\n bindings: {\n groupUserInfo: '=',\n groupIncompletedCourse: '='\n },\n templateUrl: 'app/modules/dashboard/views/manager/group-user-info.html',\n controller: ['$filter', '$mdDialog',\n function($filter, $mdDialog) {\n var vm = this;\n vm.groupUserInfo = this.groupUserInfo;\n vm.groupIncompletedCourse = this.groupIncompletedCourse;\n vm.userWillExpireCount = function (userId) {\n return $filter('filter')(vm.groupIncompletedCourse, {userId: userId}, true).length;\n };\n\n vm.learningDashboardDialog = function(event, groupUserInfo) {\n $mdDialog.show({\n templateUrl: 'app/modules/dashboard/views/learning-dashboard-dialog.html',\n controller: ['$mdDialog', 'groupUserInfo',\n function ($mdDialog, groupUserInfo) {\n var vm = this;\n vm.groupUserInfo = groupUserInfo;\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n }],\n controllerAs:'$ctrl',\n clickOutsideToClose: true,\n targetEvent: event,\n locals: {\n groupUserInfo: groupUserInfo\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n };\n }]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('groupUserInfo', groupUserInfo);\n})();\n\n/**\n * Created by Alan on 2017/6/1.\n */\n(function() {\n 'use strict';\n\n var groupIncompletedCourse = {\n bindings: {\n groupIncompletedCourse: '='\n },\n templateUrl: 'app/modules/dashboard/views/manager/group-incompleted-course.html',\n controller: [\n function() {\n var vm = this;\n vm.isMore = 1;\n vm.incompletedCourseCount = 7;\n vm.groupIncompletedCourse = this.groupIncompletedCourse;\n\n vm.incompletedCourseMore = function(isMore) {\n vm.isMore = (isMore===1)?0:1;\n vm.incompletedCourseCount = (isMore===1)?vm.groupIncompletedCourse.length:7;\n };\n }\n ]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('groupIncompletedCourse', groupIncompletedCourse);\n})();\n\n/**\n * Created by Alan on 2017/6/8.\n */\n(function() {\n 'use strict';\n\n var drillBarChart = {\n bindings: {\n chartId: '@',\n drillFn: '&?', //return params: categories, series, isClick, subGroupIds, parentGroupId\n drillId: '=',\n params: '=?',\n isWatch: '=?', //boolean\n colors: '=', //array\n stackLabelsFormat: '@?',\n yAxisText: '=?',\n isThousand: '=?'\n },\n templateUrl: 'app/modules/dashboard/views/manager/drill-bar-chart.html',\n controller: ['$scope', '$mdDialog', '$filter', 'departmentDashboardService', 'defaultFontFamily',\n function($scope, $mdDialog, $filter, departmentDashboardService, defaultFontFamily) {\n Highcharts.setOptions({\n lang: {\n thousandsSep: ','\n }\n });\n var vm = this;\n vm.params = this.params;\n vm.chartId = this.chartId;\n vm.drillId = this.drillId;\n vm.drillFn = this.drillFn;\n vm.isWatch = angular.isUndefinedOrNull(this.isWatch)?false:this.isWatch;\n vm.isNoData = 1;\n vm.colors = this.colors;\n vm.stackLabels = angular.isUndefinedOrNull(this.stackLabels)?'':this.stackLabels;\n vm.yAxisText = angular.isUndefinedOrNull(this.yAxisText)?'':this.yAxisText;\n vm.isThousand = angular.isUndefinedOrNull(this.isThousand)?false:this.isThousand;\n\n if(vm.isWatch) {\n vm.count = 0;\n $scope.$watch(function(){\n return vm.params;\n }, function(data, oldVal) {\n if (!angular.equals(data, oldVal) && !angular.isUndefinedOrNull(data)) {\n if(vm.isNoData === 1) {\n getChart(data);\n }\n else {\n var chart = angular.element('#' + vm.chartId).highcharts();\n vm.drill = data;\n chart.xAxis[0].categories = vm.drill.categories;\n angular.forEach(vm.drill.series, function(value, key) {\n chart.series[key].update(value);\n });\n chart.setSize(null, setHeight());\n }\n\n }\n });\n }\n else {\n vm.drillFn({id: vm.drillId}).then(function (data) {\n getChart(data);\n });\n }\n\n function getChart(data){\n vm.drill = data;\n vm.isNoData = 0;\n vm.chartConfig = {\n options: {\n chart: {\n type: 'bar',\n spacingRight: 100,\n spacingLeft: 100,\n marginTop: 80,\n style: {\n fontFamily: defaultFontFamily\n }\n },\n colors: $filter('hexConvertRgba')(vm.colors, (vm.drill.isClick)?1:0.5),\n credits: false,\n responsive: true,\n exporting: {\n enabled: false\n },\n legend: {\n align: 'right',\n verticalAlign: 'top',\n floating: true,\n backgroundColor: '#FFFFFF',\n reversed: true\n },\n plotOptions: {\n series: {\n pointWidth: 15,\n PointPadding:20,\n stacking: 'normal',\n cursor: 'pointer',\n point: {\n events: {\n click: function (e) {\n if(vm.drill.isClick) {\n var chart = angular.element('#' + vm.chartId).highcharts();\n var id = vm.drill.subGroupIds[e.point.index];\n vm.drillFn({id: id}).then(function (childDrill) {\n vm.drill = childDrill;\n chart.xAxis[0].categories = vm.drill.categories;\n angular.forEach(vm.drill.series, function(value, key) {\n value.color = $filter('hexConvertRgba')(vm.colors[key], (vm.drill.isClick)?1:0.5);\n chart.series[key].update(value);\n });\n addButton(childDrill.parentGroupId);\n\n chart.setSize(null, setHeight());\n });\n }\n }\n }\n },\n style: {\n 'background-color':'green',\n opacity:0.1\n }\n }\n },\n tooltip: {\n valueSuffix: vm.stackLabels\n }\n },\n title: {\n text: ''\n },\n xAxis: {\n categories: vm.drill.categories,\n labels: {\n style:{\n fontSize: '15px',\n fontWeight: 'bold'\n },\n y:6\n },\n lineWidth: 0,\n tickLength: 0\n },\n yAxis: {\n min: 0,\n minRange: 1,\n title: {\n text: vm.yAxisText,\n align: \"high\",\n x: 50,\n y: 0,\n style:{\n fontSize: '15px',\n fontWeight: 'bold'\n }\n },\n labels: {\n style:{\n fontSize: '15px',\n fontWeight: 'bold'\n },\n formatter: function() {\n if (this.value.toFixed(0) >= 1000000000000) {\n return this.value.toFixed(0) / 1000000000000 + 'T';\n }\n else if (this.value.toFixed(0) >= 1000000000) {\n return this.value.toFixed(0) / 1000000000 + 'G';\n }\n else if (this.value.toFixed(0) >= 1000000) {\n return this.value.toFixed(0) / 1000000 + 'M';\n }\n else if (this.value.toFixed(0) >= 1000) {\n return this.value.toFixed(0) / 1000 + 'K';\n }\n else {\n return this.value;\n }\n }\n },\n stackLabels: {\n enabled: true,\n format: vm.stackLabelsFormat\n }\n },\n series: vm.drill.series,\n size:{\n height: setHeight()\n },\n loading: false\n };\n }\n\n function addButton(parentGroupId) {\n var normalState = {};\n normalState.style = {color:'rgba(77, 174, 165, 0.7)', 'font-weight': 900};\n normalState.stroke = 'rgba(77, 174, 165, 0.7)';\n normalState.fill = 'white';\n\n var alignStyle = {\n align: 'right',\n x: -100,\n y: 40\n };\n var chart = angular.element('#' + vm.chartId).highcharts();\n var customButton = chart.renderer.button('↩' + $filter('translate')('ACTIONS.GO_BACK'), 500, null, function(){\n vm.drillFn({id: parentGroupId}).then(function (childDrill) {\n vm.drill = childDrill;\n chart.xAxis[0].categories = vm.drill.categories;\n angular.forEach(vm.drill.series, function(value, key) {\n value.color = $filter('hexConvertRgba')(vm.colors[key], (vm.drill.isClick)?1:0.5);\n chart.series[key].update(value);\n });\n customButton.destroy();\n chart.setSize(null, setHeight());\n });\n }, normalState).add().align(alignStyle, false, null);\n\n }\n\n function setHeight() {\n return 120 + vm.drill.categories.length * 50;\n }\n\n }\n ]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('drillBarChart', drillBarChart);\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var distributionMap = {\n bindings: {\n distributionMaps: '='\n },\n templateUrl: 'app/modules/dashboard/views/learning/distribution-map.html',\n controller: ['$timeout', '$scope', function($timeout, $scope) {\n var vm = this;\n vm.distributionMaps = this.distributionMaps;\n $scope.$watch(function(){\n return vm.distributionMaps;\n },function (newVal) {\n if(!angular.isUndefinedOrNull(newVal)) {\n $timeout(function() {\n vm.distribution = vm.distributionMaps;\n }, 1000);\n }\n });\n\n vm.colorOpacity = function(color) {\n var c = d3.rgb(color).darker(0.1);\n return 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + '0.5' + ')';\n }\n }]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('distributionMap', distributionMap);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var departmentDashboard = {\n bindings: {},\n templateUrl: 'app/modules/dashboard/views/department-dashboard.html',\n controller: [ '$scope', 'userDashboardService', 'departmentDashboardService', '$filter', 'defaultFontFamily', '$q',\n function( $scope, userDashboardService, departmentDashboardService, $filter, defaultFontFamily, $q){\n var vm = this;\n vm.selectedGroup = null;\n var localeDate = moment.localeData();\n vm.dashboardData = {};\n userDashboardService.getUserToDo().then(function(userToDoData) {\n vm.dashboardData.userToDo = userToDoData;\n });\n vm.getManagerGroup = function(isDefault, keyword) {\n var deferred = $q.defer();\n departmentDashboardService.getManagerGroup({keyword: keyword}).then(function(managerGroup) {\n vm.managerGroup = managerGroup;\n if(isDefault) {\n vm.selectGroup($filter('filter')(vm.managerGroup, {'isDefault': 1}, true)[0]);\n }\n else\n deferred.resolve( vm.managerGroup );\n });\n return deferred.promise;\n };\n\n vm.getManagerGroup(true);\n\n vm.selectGroup = function(group) {\n if(angular.isObject(group)) {\n var params = {\n groupId: group.groupId\n };\n vm.groupId = group.groupId;\n vm.selectedGroup = group.groupName;\n departmentDashboardService.getGroupTrainingHours(params).then(function (groupTrainingHours) {\n vm.groupTrainingHours = groupTrainingHours;\n });\n\n departmentDashboardService.getGroupCost(params).then(function (groupCost) {\n vm.groupCost = groupCost;\n });\n\n departmentDashboardService.getGroupMonthCost(params).then(function (groupMonthCost) {\n vm.groupMonthCost = groupMonthCost;\n vm.isGroupMonthCostNoData = ($filter('filter')(vm.groupMonthCost, {totalCost:-1}, true).length < 12)?0:1;\n vm.trainingCosts = {\n options: {\n chart: {\n zoomType: 'xy',\n style: {\n fontFamily: defaultFontFamily\n }\n },\n exporting: {\n enabled: false\n },\n credits: false,\n responsive: true,\n legend: {\n enabled: false\n },\n tooltip: {\n formatter: function() {\n return '\\u25CF' + this.x + ' ' + this.y + '';\n }\n }\n },\n series: [{\n type: 'column',\n yAxis: 0,\n colorByPoint: false,\n data: []\n }],\n title: {\n text: ''\n },\n xAxis: [{\n categories: localeDate._monthsShort,\n crosshair: true\n }],\n yAxis: [{ // Primary yAxis\n min: 0,\n minRange: 1,\n labels: {\n formatter: function(){\n return this.value;\n },\n style: {\n color: Highcharts.getOptions().colors[1]\n }\n },\n title: {\n text: '(' + $filter('translate')(\"FIELD.DOLLARS\") + ')',\n style: {\n color: Highcharts.getOptions().colors[1]\n }\n }\n }],\n size: {\n height: \"150\"\n },\n loading: false\n };\n angular.forEach(groupMonthCost, function(groupMonthCost) {\n vm.trainingCosts.series[0].data.push((groupMonthCost.totalCost===-1)?0:groupMonthCost.totalCost);\n if(groupMonthCost.totalCost>=1000) {\n vm.trainingCosts.yAxis[0].labels.formatter = function(){\n return this.value.toString().slice(0,-3);\n };\n vm.trainingCosts.yAxis[0].title.text = '(' + $filter('translate')(\"FIELD.THOUSAND\") + ')';\n }\n\n });\n });\n\n departmentDashboardService.getGroupIncompletedCourse(params).then(function (groupIncompletedCourse) {\n vm.groupIncompletedCourse = groupIncompletedCourse;\n });\n\n departmentDashboardService.getGroupUserInfo(params).then(function (groupUserInfo) {\n vm.groupUserInfo = groupUserInfo;\n });\n\n departmentDashboardService.getGroupAttendance(params).then(function (groupAttendance) {\n vm.groupAttendance = groupAttendance;\n });\n\n departmentDashboardService.getGroupCompletion(params).then(function (groupCompletion) {\n vm.groupCompletion = groupCompletion;\n });\n }\n }\n\n\n }]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('departmentDashboard', departmentDashboard);\n})();\n\n/**\n * Created by Alan on 2017/6/1.\n */\n(function() {\n 'use strict';\n\n var cumulativeTrainingCosts = {\n bindings: {\n groupCost: '='\n },\n templateUrl: 'app/modules/dashboard/views/manager/cumulative-training-costs.html',\n controller: [\n function() {\n var vm = this;\n vm.groupCost = this.groupCost;\n }\n ]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('cumulativeTrainingCosts', cumulativeTrainingCosts);\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var classroomCourseSchedule = {\n bindings: {\n calendar: '=',\n isManager: '=?'\n },\n templateUrl: 'app/modules/dashboard/views/learning/classroom-course-schedule.html',\n controller: [function() {\n var vm = this;\n vm.calendar = this.calendar;\n vm.isManager = angular.isUndefinedOrNull(this.isManager)?false:this.isManager;\n }\n ]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('classroomCourseSchedule', classroomCourseSchedule);\n})();\n\n/**\n * Created by Alan on 2017/4/26.\n */\n(function() {\n 'use strict';\n\n var classroomCourseIncomplete = {\n bindings: {\n inCompleteItems: '=',\n reloadFn: '&?',\n isManager: '=?'\n },\n templateUrl: 'app/modules/dashboard/views/learning/classroom-course-incomplete.html',\n controller: [\n function() {\n var vm = this;\n vm.inCompleteItems = this.inCompleteItems;\n vm.reloadFn = angular.isFunction(this.reloadFn)?this.reloadFn:null;\n vm.isManager = angular.isUndefinedOrNull(this.isManager)?false:this.isManager;\n }\n ]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('classroomCourseIncomplete', classroomCourseIncomplete);\n})();\n\n/**\n * Created by Alan on 2017/6/30.\n */\n(function() {\n 'use strict';\n\n var certificationProgress = {\n bindings: {\n certProgress: '=',\n isManager: '=?'\n },\n templateUrl: 'app/modules/dashboard/views/learning/certification-progress.html',\n controller: ['PermPermissionStore', function(PermPermissionStore) {\n var vm = this;\n\n vm.hasCertificationInnerPermission = angular.isDefined(PermPermissionStore.getPermissionDefinition('Modules.certification.inner'));\n vm.hasCertificationExtPermission = angular.isDefined(PermPermissionStore.getPermissionDefinition('Modules.certification.ext'));\n vm.certProgress = this.certProgress;\n vm.isManager = angular.isUndefinedOrNull(this.isManager)?false:this.isManager;\n }\n ]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('certificationProgress', certificationProgress);\n})();\n\n/**\n * Created by Alan on 2017/6/1.\n */\n(function() {\n 'use strict';\n\n var averageTrainingHours = {\n bindings: {\n groupTrainingHours: '='\n },\n templateUrl: 'app/modules/dashboard/views/manager/average-training-hours.html',\n controller: [\n function() {\n var vm = this;\n vm.groupTrainingHours = this.groupTrainingHours;\n }\n ]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('averageTrainingHours', averageTrainingHours);\n})();\n\n/**\n * Created by Alan on 2017/6/29.\n */\n(function() {\n 'use strict';\n\n var accumulationBlock = {\n bindings: {\n onlineCourseHours: '=?',\n coursePassCount: '=?',\n isManager: '=?'\n },\n templateUrl: 'app/modules/dashboard/views/learning/accumulation-block.html',\n controller: ['PermPermissionStore', function(PermPermissionStore) {\n var vm = this;\n vm.onlineCourseHours = this.onlineCourseHours;\n vm.coursePassCount = this.coursePassCount;\n vm.isManager = angular.isUndefinedOrNull(this.isManager)?false:this.isManager;\n\n vm.hasCourseOnlinePermission = angular.isDefined(PermPermissionStore.getPermissionDefinition('Modules.course.online'));\n vm.hasCoursePermission = angular.isDefined(PermPermissionStore.getPermissionDefinition('Modules.course'));\n\n }]\n };\n\n angular.module('eHRD.modules.dashboard')\n .component('accumulationBlock', accumulationBlock);\n})();\n\n/**\n * Created by Bruce on 2016/8/27.\n */\n\n(function () {\n 'use strict';\n testQuestionnaireService.$inject = ['Restangular', '$filter', 'SweetAlert', '$q', 'serverSetting', '$auth', 'AuthStorage', '$window', '$timeout'];\n function testQuestionnaireService(Restangular, $filter, SweetAlert, $q, serverSetting, $auth, AuthStorage, $window, $timeout){\n\n /*\n * Build collection api/feedback\n */\n var _testQuestionnaireService = Restangular.all('feedback');\n\n function setGroupQuestionTranslate (string) {\n var result = string;\n if(string === 'surveybank_group_material' ||\n string === 'table_header_instructor' ||\n string === 'venue' ||\n string === 'facility'){\n result = $filter('translate')(\"FIELD.\" + $filter('uppercase')(string))\n }\n return result;\n }\n\n return {\n getExamInfo: function (sessionId, params) {\n /*\n * api/feedback/exam/{sessionId}/info?itemid={itemId}\n * */\n return _testQuestionnaireService\n .one('exam', sessionId)\n .customGET('info', params);\n },\n getExamResult: function (sessionId, params) {\n /*\n * api/feedback/exam/{sessionId}/result-info?itemid={itemId}&examhistoryId={examHistoryId}\n * */\n return _testQuestionnaireService\n .one('exam', sessionId)\n .customGET('result-info', params);\n },\n getExamQuestionsReview: function (sessionId, params) {\n /*\n * api/feedback/exam/{sessionId}/review-response?itemid={itemId}&examhistoryId={examHistoryId}&show-incorrect={showInCorrect}\n * */\n return _testQuestionnaireService\n .one('exam', sessionId)\n .customGETLIST('review-response', params);\n },\n\n getExamToken: function (sessionId, params) {\n /*\n * api/feedback/assessment/{sessionId}/redirect?itemid={itemId}\n * */\n return _testQuestionnaireService\n .one('assessment', sessionId)\n .customGET('redirect', params);\n },\n\n getQuestions: function (sessionId, params) {\n /* questionnaireType != evaluationSurvey\n * api/feedback/exam/{sessionId}/questions?itemid={itemId}&examhistoryId={examHistoryId}\n *\n * questionnaireType = evaluationSurvey\n * api/feedback/ev-survey/questions?relationId={relationId}&surveyId={surveyId}\n * */\n if(angular.isDefined(sessionId)){\n return _testQuestionnaireService\n .one('exam', sessionId)\n .customGETLIST('questions', params);\n }\n else{\n return _testQuestionnaireService\n .one('ev-survey')\n .customGETLIST('questions', params);\n }\n },\n getQuestionsMenu: function (sessionId, params) {\n /*\n * api/feedback/exam/{sessionId}/menu-questions?itemid={itemId}&examhistoryId={examHistoryId}\n * */\n return _testQuestionnaireService\n .one('exam', sessionId)\n .customGETLIST('menu-questions', params);\n },\n\n getAssessment: function (sessionId) {\n /*\n * api/feedback/assessment/{sessionId}\n * */\n return _testQuestionnaireService\n .one('assessment', sessionId);\n },\n\n putAjaxTestAnswerTime: function (params, data) {\n /*\n * api/feedback/assessment/{sessionId}/session-time?itemid={itemId}&examhistoryId={examHistoryId}\n * */\n $.ajax({\n url: serverSetting.baseConfig.baseURL + '/api/feedback/assessment/'+ params.sessionId + '/session-time?itemid=' + params.itemId + '&examhistoryId=' + params.examHistoryId,\n type:'PUT',\n data: angular.toJson(data),\n contentType:'application/json',\n dataType: 'json',\n xhrFields: {\n withCredentials: true\n },\n crossDomain: true,\n async:false,\n headers: {\n 'ClientAuthorization': serverSetting.webServiceSetting.defaultAuthToken + ' ' + $auth.getToken(),\n \"Content-Type\": \"application/json;charset=UTF-8\",\n \"Accept\":\"application/json, text/plain, */*\"\n },\n cache: true\n }).done(function() { });\n\n },\n\n // getAssessment2: function (sessionId) {\n // var deferred = $q.defer(); // 声明延后执行,表示要去监控后面的执行\n // _testQuestionnaireService.one('assessment', sessionId).get().then(function (data) {\n // deferred.resolve(data);\n // }, function (message) {\n // deferred.reject(message);\n // });\n // return deferred.promise; // 返回承诺,这里并不是最终数据,而是访问最终数据的API\n // },\n\n // jqueryAjaxTest: function (sessionId) {\n // $.ajax({\n // url: baseConfig.baseURL + '/api/feedback/assessment/'+sessionId,\n // xhrFields: {\n // withCredentials: true\n // },\n // async:false,\n // headers: {\n // 'Authorization':'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiZGF0YSI6eyJpZCI6MSwidXNlcm5hbWUiOiJBZG1pbmlzdHJhdG9yIENUTVMiLCJhY2NvdW50IjoiYWRtIiwiUGVybWlzc2lvbnMiOlsiVXNlcnNfTWFuYWdlbWVudCIsIlJvbGVzX01hbmFnZW1lbnQiXSwiUm9sZXMiOlt7IlVzZXIiOlsiVXNlcnNfTWFuYWdlbWVudCIsIlJvbGVzX01hbmFnZW1lbnQiXX1dLCJyYyI6InpoX3R3In0sImV4cCI6MTQ3Mzc1MTY0NiwiaWF0IjoxNDczMTQ2ODQ2fQ.OKWAR_NvjzYgd-BQ7cHhXeUrBYYa_fCgUGdyXUH54OM',\n // 'Accept':'application/json, text/plain, */*'\n // },\n // accepts: {\n // Accept: 'application/json'\n // },\n // contentType:'application/x-www-form-urlencoded; charset=UTF-8'\n //\n // }).done(function(data) { });\n // },\n\n putTestAnswerTime: function (assessment, data, params) {\n /*\n * api/feedback/assessment/{sessionId}/session-time?itemid={itemId}&examhistoryId={examHistoryId}\n * */\n return assessment.customPOST(data, \"session-time\", params, {});\n },\n\n putTestAnswer: function (assessment, data, params) {\n /*\n * api/feedback/assessment/{sessionId}/interaction?itemid={itemId}&examhistoryId={examHistoryId}\n * */\n return assessment.customPOST(data, \"interaction\", params, {});\n },\n putTestFinish: function (assessment, params) {\n /*\n *api/feedback/assessment/{sessionId}/complete?itemid={itemId}&examhistoryId={examHistoryId}\n * */\n return assessment.customPOST({}, \"complete\", params, {});\n },\n\n putEvaluationSurveyAnswer: function (formData, params) {\n /*\n *api/feedback/ev-survey/answers?relationId={ relationId }&surveyId={ surveyId }\n * */\n return _testQuestionnaireService\n .one('ev-survey')\n .customPUT({\"answers\": formData}, \"answers\", params, {'Content-Type': 'application/json'});\n },\n\n getTestHistory: function (sessionId, params) {\n /*\n * api/feedback/exam/{sessionId}/exam-history?itemid={itemId}&startDate={startDate}&endDate={endDate}\n * */\n return _testQuestionnaireService\n .one('exam', sessionId)\n .customGETLIST('exam-history', params);\n },\n\n getQuestionModel: function (questionnaireData) {\n var questionModel = {};\n angular.forEach(questionnaireData, function (questionsData) {\n questionModel[questionsData.questionId] = questionModelInit(questionsData);\n questionModel[questionsData.questionId].instructor = {};\n angular.forEach(questionsData.instructorQuestions, function (instructor) {\n questionModel[questionsData.questionId].instructor[instructor.raId] = questionModelInit(instructor);\n questionModel[questionsData.questionId].instructor[instructor.raId].raId = instructor.raId;\n });\n });\n return questionModel;\n function questionModelInit (questionsData) {\n var questionModel={};\n questionModel[questionsData.questionId] = {};\n questionModel[questionsData.questionId].index = questionsData.index;\n questionModel[questionsData.questionId].qId = questionsData.questionId;\n questionModel[questionsData.questionId].completed = (questionsData.studentResponse.length>0);\n questionModel[questionsData.questionId].isRequired = questionsData.isRequired;\n questionModel[questionsData.questionId].optionNumber = questionsData.studentResponse;\n questionModel[questionsData.questionId].optionOtherValue = questionsData.otherAnswer;\n questionModel[questionsData.questionId].qType = 'choice';\n questionModel[questionsData.questionId].selectOptionType = questionsData.selectOptionType;\n questionModel[questionsData.questionId].selectedOptionCount = questionsData.selectedOptionCount;\n questionModel[questionsData.questionId].questionType = questionsData.questionType;\n questionModel[questionsData.questionId].surveyGroupId = questionsData.surveyGroupId;\n questionModel[questionsData.questionId].surveyGroupName = questionsData.surveyGroupName;\n\n switch (questionsData.questionType){\n case 3: case 7:\n questionModel[questionsData.questionId].qType = 'fill-in';\n break;\n case 2:\n questionModel[questionsData.questionId].optionNumber = [];\n if(questionsData.studentResponse.length > 0){\n angular.forEach(questionsData.studentResponse.split(','), function (value) {\n if(value.length > 0){\n questionModel[questionsData.questionId].optionNumber.push(parseInt(value));\n }\n });\n }\n break;\n }\n return questionModel[questionsData.questionId];\n }\n },\n\n updateQuestionStatus: function (questionModel, questionId) {\n if(Object.keys(questionModel[questionId].instructor).length > 0){\n var completedCount = 0;\n angular.forEach(questionModel[questionId].instructor, function (instructorQuestions) {\n questionModel[questionId].instructor[instructorQuestions.raId].completed = _newModelStatus(questionId, instructorQuestions.optionNumber, instructorQuestions.selectOptionType);\n if(questionModel[questionId].instructor[instructorQuestions.raId].completed) completedCount+=1;\n });\n\n questionModel[questionId].completed = completedCount === Object.keys(questionModel[questionId].instructor).length;\n\n }else {\n questionModel[questionId].completed = _newModelStatus(questionId, questionModel[questionId].optionNumber, questionModel[questionId].selectOptionType);\n }\n return questionModel;\n function _newModelStatus(questionId,optionNumber, selectOptionType) {\n if(angular.isNumber(optionNumber) && optionNumber > 0){\n return true;\n }else if(angular.isArray(optionNumber) && optionNumber.length > 0){\n switch (selectOptionType){\n case 2:\n return (!(optionNumber.length < questionModel[questionId].selectedOptionCount));\n default:\n return true;\n }\n }else if(angular.isString(optionNumber) && optionNumber.length > 0){\n return true;\n }else{\n return false;\n }\n }\n },\n\n getAnswers: function(questionModel, questions, questionId) {\n if(angular.isDefined(questionId)){\n var question = questionModel[questionId];\n return answersProcess(questions, question);\n }else{\n var answers = [];\n angular.forEach(questionModel, function (question) {\n answers.push(answersProcess(questions, question)[0]) ;\n });\n return answers;\n }\n function answersProcess(questions, question) {\n var answers = [];\n var answersData = {};\n answersData.qId = question.qId;\n answersData.qType = question.qType;\n if(!(angular.isDefined(question.optionOtherValue) && question.optionOtherValue.length > 0)){\n answersData.qResponse = (angular.isArray(question.optionNumber) ? question.optionNumber.toString() : question.optionNumber);\n questions[question.index-1].studentResponse = answersData.qResponse;\n }else{\n answersData.qResponse = (angular.isArray(question.optionNumber) ? question.optionNumber.toString() : question.optionNumber);\n answersData.qResponse += ',clOtherAnswer=' + question.optionOtherValue;\n questions[question.index-1].studentResponse = answersData.qResponse;\n }\n\n answersData.answerInstructor = [];\n if(angular.isDefined(question.instructor)){\n angular.forEach(question.instructor, function (instructorQuestion, key) {\n var instructorAnswersData = {};\n instructorAnswersData.qId = instructorQuestion.qId;\n instructorAnswersData.ruId = instructorQuestion.raId;\n if(!(angular.isDefined(instructorQuestion.optionOtherValue) && instructorQuestion.optionOtherValue.length > 0)){\n instructorAnswersData.ruResponse = (angular.isArray(instructorQuestion.optionNumber) ? instructorQuestion.optionNumber.toString() : instructorQuestion.optionNumber);\n $filter('getArrayObjectByKey')(questions[question.index-1].instructorQuestions,'raId', key).studentResponse = instructorAnswersData.ruResponse;\n }else{\n instructorAnswersData.ruResponse = (angular.isArray(instructorQuestion.optionNumber) ? instructorQuestion.optionNumber.toString() : instructorQuestion.optionNumber);\n instructorAnswersData.ruResponse += ',clOtherAnswer=' + instructorQuestion.optionOtherValue;\n $filter('getArrayObjectByKey')(questions[question.index-1].instructorQuestions,'raId', key).studentResponse = instructorAnswersData.ruResponse;\n }\n\n answersData.answerInstructor.push(instructorAnswersData)\n });\n }\n answers.push(answersData);\n return answers;\n }\n },\n\n finishedExam: function (questionModel, feedbackStyle) {\n var q = $q.defer();\n var groupQuestion= [];\n var incomplete = [];\n var unfilled = [];\n var errorFilled = [];\n\n if(feedbackStyle===4) {\n angular.forEach($filter('groupBy')(questionModel, 'surveyGroupId'), function (groupData) {\n groupQuestion.push({\n index: groupData[0].index,\n surveyGroupName: groupData[0].surveyGroupName,\n incomplete:[],\n errorFilled:[]\n });\n angular.forEach(groupData, function (group, groupIndex) {\n var index = groupQuestion.length - 1;\n if (angular.isUndefined(group.optionOtherValue)) {\n groupQuestion[index].errorFilled.push(groupIndex + 1);\n errorFilled.push(groupIndex);\n }\n if (angular.isUndefined(group.optionNumber)) {\n groupQuestion[index].errorFilled.push(groupIndex + 1);\n errorFilled.push(groupIndex);\n }\n if (group.isRequired > 0 && !group.completed && angular.isDefined(group.optionNumber)) {\n groupQuestion[index].incomplete.push(groupIndex + 1);\n incomplete.push(groupIndex);\n }\n });\n });\n groupQuestion = $filter('orderBy')(groupQuestion, 'index');\n }\n else {\n angular.forEach(questionModel, function (data) {\n if (angular.isUndefined(data.optionOtherValue))\n errorFilled.push(data.index);\n\n if (angular.isUndefined(data.optionNumber))\n errorFilled.push(data.index);\n\n if (data.isRequired > 0 && !data.completed && angular.isDefined(data.optionNumber))\n incomplete.push(data.index);\n\n if (!data.completed)\n unfilled.push(data.index);\n });\n }\n\n\n var title, text, value=\"\";\n if(errorFilled.length > 0){\n if(feedbackStyle === 4) {\n angular.forEach($filter('groupBy')(questionModel, 'surveyGroupId'), function (group) {\n if(group.errorFilled.length > 0) {\n value += \"
    \" + setGroupQuestionTranslate(group.surveyGroupName) + \":\" + group.errorFilled.toString();\n }\n });\n }\n else {\n value = errorFilled.sort(sortNumber).toString();\n }\n title = $filter('translate')('MESSAGE.MSG_QUESTION_OPTION_EXCEEDS_WORD_LIMIT' , {'value': value});\n text = $filter('translate')('MESSAGE.MSG_PLEASE_RETURN_TO_FILL_IN');\n SweetAlert.error(title, text);\n if (feedbackStyle != 4) {\n this.putQuestionStatusLog(JSON.stringify(questionModel)).then(function (data) {\n if (data) {\n title = $filter('translate')('MESSAGE.MSG_UNABLE_SEND_REFRESH');\n text = $filter('translate')('MESSAGE.MSG_PLEASE_RETURN_TO_FILL_IN');\n SweetAlert.error(title, '');\n AuthStorage.set(\"testQuestionnaireRefersh\", true);\n $timeout(function () {\n $window.location.reload();\n }, 3000);\n }\n });\n }\n } else if(incomplete.length > 0){\n if(feedbackStyle === 4) {\n angular.forEach(groupQuestion, function (group) {\n if(group.incomplete.length > 0) {\n value += \"
    \" + setGroupQuestionTranslate(group.surveyGroupName) + \":\" + group.incomplete.toString();\n }\n });\n }\n else {\n value = incomplete.sort(sortNumber).toString();\n }\n title = $filter('translate')('MESSAGE.MSG_YOU_HAVE_REQUIRED_SUBJECT_NOT_YET_ANSWERED' , {'value': value});\n text = $filter('translate')('MESSAGE.MSG_PLEASE_RETURN_TO_FILL_IN');\n SweetAlert.error(title, text);\n\n } else if(unfilled.length > 0){\n value = unfilled.sort(sortNumber).toString();\n SweetAlert.check($filter('translate')('MESSAGE.MSG_NOT_YET_COMPLETED_WHETHER_TO_SEND_OUT', {'value': value}), '', 'question', function() {\n q.resolve();\n });\n }\n else{\n SweetAlert.check($filter('translate')('MESSAGE.MSG_IS_SURE_TO_PAY'), '', 'question', function() {\n q.resolve();\n });\n }\n return q.promise;\n\n function sortNumber(a,b)\n {\n return a - b\n }\n },\n\n putQuestionStatusLog: function (log) {\n /*\n *api/feedback/ev-survey/test-log?log=log\n * */\n var params = {\n Log: log\n };\n\n return _testQuestionnaireService\n .one('ev-survey')\n //.customGET('test-log', params)\n .customPOST(params, \"test-log\", {}, {'Content-Type': 'application/json'});\n },\n\n setGroupQuestionTranslate: setGroupQuestionTranslate\n\n };\n\n }\n\n angular.module('eHRD.modules.courseResource')\n .factory('testQuestionnaireService', testQuestionnaireService);\n\n})();\n\n/**\n * Created by Alan on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n function instructorService(Restangular){\n\n return {\n getInstructorDetail: function (instructorId) {\n /*\n * api/instructor/{instructorId}/info\n * */\n return Restangular\n .one('instructor', instructorId)\n .customGET('info');\n },\n\n getTeachingRecord: function (instructorId, params) {\n /*\n * api/instructor/{instructorId}/teaching-record\n * */\n return Restangular\n .one('instructor', instructorId)\n .customGETLIST('teaching-record', params);\n }\n\n\n };\n\n }\n\n angular.module('eHRD.modules.courseResource')\n .factory('instructorService', instructorService);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/20.\n */\n(function () {\n 'use strict';\n\n externalTrainingService.$inject = ['Restangular', 'serverSetting', 'fileProcess', '$cacheFactory'];\n function externalTrainingService(Restangular, serverSetting, fileProcess, $cacheFactory){\n\n /*\n * Build collection api/external-training\n */\n var _service = Restangular.all('external-training');\n var cache = $cacheFactory('externalTraining');\n return {\n setCacheData: function (key, value) {\n cache.put(key, value)\n },\n getCache: function () {\n return cache;\n },\n\n getExtCourseFormByCourseSession: function (courseId, sessionId) {\n /*\n * api/external-training/ext-course/{courseId}/session/{sessionId}\n * */\n return _service\n .one('ext-course', courseId)\n .one('session', sessionId)\n .customGET();\n },\n getExtCourseFormByBulletin: function (bulletinId) {\n /*\n * api/external-training/bulletin/{bulletinId}\n * */\n return _service\n .one('bulletin', bulletinId)\n .customGET();\n },\n getExtCourseForm: function (externalId) {\n /*\n * api/external-training/ext-course-form/{externalId}\n * */\n return _service\n .one('ext-course-form', externalId)\n .customGET();\n },\n getExtCourseApplyReasons: function ( ) {\n /*\n * api/external-training/ext-course-apply-reason\n * */\n return _service\n .customGETLIST('ext-course-apply-reason');\n },\n getCleanExtCourseForm: function () {\n /*\n * api/external-training/clean-ext-course-form\n * */\n return _service\n .customGET('clean-ext-course-form');\n },\n\n getCurrencys: function () {\n /*\n * api/external-training/currency\n * */\n return _service\n .customGETLIST('currency');\n },\n getVendors: function (params) {\n /*\n * api/external-training/vendor?keyword={keyword}&list_size={10}¤t_page={1}\n * */\n return _service\n .customGETLIST('vendor', params);\n\n },\n\n submitApplyForm: function (formData, fileFieldName, files, formType) {\n formType = formType || 'create';\n /*\n * api/external-training/ext-course (Create Form for default and from bulletin)\n * api/external-training/ext-course-from-catalog (Create Form for Course Session)\n * api/external-training/update-ext-course/{externalId} (Edit Form)\n * api/external-training/resend-ext-course/{externalId} (re-submit Form )\n * */\n var url = serverSetting.baseConfig.baseApiPath + '/external-training/ext-course';\n switch (formType){\n case 'create': case 'createByBulletin':\n url = serverSetting.baseConfig.baseApiPath + '/external-training/ext-course';\n break;\n case 'createByCourseSession':\n url = serverSetting.baseConfig.baseApiPath + '/external-training/ext-course-from-catalog';\n break;\n case 'edit':\n url = serverSetting.baseConfig.baseApiPath + '/external-training/update-ext-course/' + formData.externalId;\n break;\n case 'reSubmit':\n url = serverSetting.baseConfig.baseApiPath + '/external-training/resend-ext-course/' + formData.externalId;\n break;\n }\n return new fileProcess.upload(url, formData, fileFieldName, files , 'POST');\n },\n\n getExternalTrainingRecords: function (params) {\n /*\n * api/external-training/ext-form\n * */\n return _service\n .customGETLIST('ext-form', params);\n },\n\n addVendor: function (formData, fileFieldName, files) {\n /*\n * api/instruresource/add-vendor\n * */\n var url = serverSetting.baseConfig.baseApiPath + '/instruresource/add-vendor';\n return new fileProcess.upload(url, formData, fileFieldName, files , 'POST');\n }\n\n };\n\n }\n\n angular.module('eHRD.modules.courseResource')\n .factory('externalTrainingService', externalTrainingService);\n\n})();\n\n/**\n * Created by Bruce on 2016/5/18.\n */\n\n(function () {\n 'use strict';\n\n function externalTrainingBulletinService(Restangular) {\n\n /*\n * Build collection api/external-training-bulletin/userlist?keyword={ keyword }&sort={ sort }\n * &order={ order }¤t_page={ currentPage }&list_size={ listSize }\n */\n var _externalTrainingBulletinService = Restangular.all('external-training-bulletin');\n\n return{\n\n list: function (params) {\n /*\n * GET /api/external-training- bulletin/userlist?keyword={ keyword }&sort={ sort }\n * &order={ order }¤t_page={ currentPage }&list_size={ listSize }\n */\n return _externalTrainingBulletinService\n .customGETLIST('bulletins', params);\n\n },\n\n getBulletinsInfo: function (bulletinId, courseId, sessionId) {\n /*\n * api/external-training-bulletin/bulletins-info?bulletinId=3&courseId={courseId}&sessionId={sessionId}\n * */\n bulletinId = bulletinId || undefined;\n courseId = courseId || undefined;\n sessionId = sessionId || undefined;\n var params = {};\n if(angular.isDefined(bulletinId)) params['bulletinId'] = bulletinId;\n if(angular.isDefined(courseId)) params['courseId'] = courseId;\n if(angular.isDefined(sessionId)) params['sessionId'] = sessionId;\n\n return _externalTrainingBulletinService\n .customGET('bulletins-info', params);\n }\n\n };\n\n }\n\n angular.module('eHRD.modules.courseResource')\n .factory('externalTrainingBulletinService',externalTrainingBulletinService)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/8/15.\n */\n\n(function () {\n 'use strict';\n\n courseResourceService.$inject = ['Restangular', '$auth'];\n function courseResourceService(Restangular, $auth){\n\n /*\n * Build collection api/course-resource\n */\n var _CourseResourceService = Restangular.all('course-resource');\n var courseId;\n\n return {\n getCourseId: function () {\n return courseId;\n },\n setCourseId: function(value) {\n courseId = value;\n },\n\n getClassifications: function (typeId) {\n /*\n * /api/course-resource/classification/type/typeId\n * */\n return _CourseResourceService\n .one('classification', null)\n .one('type', typeId)\n .customGETLIST();\n },\n\n getEnrollment: function ( sessionId, isProgram, userId) {\n /*\n * api/course-resource/session/{sessionId}/course-enrollmentId\n * */\n userId = userId || $auth.getUserData().id;\n isProgram = isProgram || false;\n return _CourseResourceService\n .one('session', sessionId)\n .customGET((isProgram ? 'program-enrollmentId': 'course-enrollmentId'), {userId: userId});\n },\n\n getCourseResourceMenuNodes: function (categoryTreeId) {\n /*\n * api/course-resource/catalog-info/{categoryTreeId}/nodes\n * */\n return _CourseResourceService\n .one('catalog-info', ( angular.isDefined(categoryTreeId) ? categoryTreeId : 0 ))\n .customGETLIST('nodes');\n },\n\n getCourseResourceCatalogMenu: function (categoryTreeId) {\n /*\n * api/course-resource/catalog-info/{categoryTreeId}/catalog-menu\n * */\n return _CourseResourceService\n .one('catalog-info', categoryTreeId)\n .customGETLIST('catalog-menu');\n },\n\n getCourseResource: function (categoryTreeId, params) {\n /*\n * api/course-resource/catalog-info/{categoryTreeId}/infos?keyword={keyword}&objecttype={objecttype}&onlyfavorite={onlyFavorite}\n * &sort:{ sort }&order:{ order }¤t_page:{ currentPage }&list_size:{ listSize }\n * */\n return _CourseResourceService\n .one('catalog-info', categoryTreeId)\n .customGETLIST('infos', params);\n },\n\n\n getProgramEnrollment: function(enrollmentId, params) {\n /*\n * api/course-resource/program-enrollment/{enrollmentId}\n */\n return _CourseResourceService\n .one('program-enrollment', enrollmentId)\n .get(params);\n },\n getCourseEnrollment: function(enrollmentId, params) {\n /*\n * api/course-resource/course-enrollment/{enrollmentId}\n */\n return _CourseResourceService\n .one('course-enrollment', enrollmentId)\n .get(params);\n },\n\n getLearningResult: function (enrollmentId, isProgram) {\n /*\n * isProgram: true api/course-resource/program-enrollment/{enrollmentId}/result\n * isProgram: false api/course-resource/course-enrollment/{enrollmentId}/result\n */\n isProgram = isProgram || false;\n return _CourseResourceService\n .one((isProgram ? 'program-enrollment': 'course-enrollment'), enrollmentId)\n .customGET('result');\n },\n getProgram: function (programId, params) {\n /*\n * api/course-resource/program/{programId}\n */\n return _CourseResourceService\n .one('program', programId)\n .get(params);\n },\n getCourse: function (courseId, params) {\n /*\n * api/course-resource/course/{courseId}\n */\n return _CourseResourceService\n .one('course', courseId)\n .get(params);\n },\n getCourseEnrollSessions: function (courseId, params) {\n /*\n * api/course-resource/course/{ courseId }/enroll-sessions\n */\n return _CourseResourceService\n .one('course', courseId)\n .customGETLIST('enroll-sessions', params);\n },\n getProgramEnrollSessions: function (programId , params) {\n /*\n * api/course-resource/program/{ programId }/enroll-sessions\n */\n return _CourseResourceService\n .one('program', programId )\n .customGETLIST('enroll-sessions', params);\n },\n getCourseContent: function (courseId) {\n /*\n * api/course-resource/course/{courseId}/content\n */\n return _CourseResourceService\n .one('course', courseId)\n .customGET('content');\n },\n\n getProgramSession: function (sessionId, params) {\n /*\n * api/course-resource/program-session/{sessionId}\n */\n return _CourseResourceService\n .one('program-session', sessionId)\n .get(params);\n },\n getCourseSession: function (sessionId, params) {\n /*\n * api/course-resource/course-session/{sessionId}\n */\n return _CourseResourceService\n .one('course-session', sessionId)\n .get(params);\n },\n getCourseSessionLearners: function (sessionId, params) {\n /*\n * api/course-resource/course-session/{sessionId}/learners\n */\n return _CourseResourceService\n .one('course-session', sessionId)\n .customGETLIST('learners', params);\n },\n getProgramSessionLearners: function (sessionId, params) {\n /*\n * api/course-resource/program-session/{sessionId}/learners\n */\n return _CourseResourceService\n .one('program-session', sessionId)\n .customGETLIST('learners', params);\n },\n getProgramSessionLearnersCompletionRate: function(sessionId, params){\n /*\n * api/course-resource/program-session/{sessionId}/learners-completion-rate\n */\n return _CourseResourceService\n .one('program-session', sessionId)\n .customGET('learners-completion-rate', params);\n },\n getCourseSessionLearnersCompletionRate: function(sessionId, params){\n /*\n * api/course-resource/course-session/{sessionId}/learners-completion-rate\n */\n return _CourseResourceService\n .one('course-session', sessionId)\n .customGET('learners-completion-rate', params);\n },\n getEnrollmentWillExpire: function (enrollmentId, params, isCourse) {\n /*\n * api/course-resource/course-enrollment/{enrollmentId}/will-expired-items\n * */\n if(isCourse){\n return _CourseResourceService\n .one('course-enrollment', enrollmentId)\n .customGETLIST('will-expired-items', params);\n }else {\n return _CourseResourceService\n .one('program-enrollment', enrollmentId)\n .customGETLIST('will-expired-items', params);\n }\n\n },\n\n getCourseReference: function (courseId, params) {\n /*\n * api/course-resource/course/{ courseId }/reference\n * */\n return _CourseResourceService\n .one('course', courseId)\n .customGETLIST('reference', params);\n },\n\n getSessionEnrollReq: function (sessionId, params, isProgram) {\n /*\n * api/course-resource/course-session/{sessionId}/enroll-req\n * */\n isProgram = isProgram || false;\n if(isProgram){\n return _CourseResourceService\n .one('program-session', sessionId)\n .customGET('enroll-req', params);\n }else {\n return _CourseResourceService\n .one('course-session', sessionId)\n .customGET('enroll-req', params);\n }\n },\n\n getSessionUnEnrollReq: function (enrollmentId, params, isProgram) {\n /*\n * api/course-resource/program-enrollment/{enrollmentId}/unenroll-req\n * api/course-resource/course-enrollment/{enrollmentId}/unenroll-req\n * */\n isProgram = isProgram || false;\n if(isProgram){\n return _CourseResourceService\n .one('program-enrollment', enrollmentId)\n .customGET('unenroll-req', params);\n }else{\n return _CourseResourceService\n .one('course-enrollment', enrollmentId)\n .customGET('unenroll-req', params);\n }\n },\n\n getPassCourse: function () {\n /*\n * api/course-resource/exemption-reason/pass-course\n * */\n return _CourseResourceService\n .one('exemption-reason', null)\n .customGET('pass-course');\n },\n getPassExtCert: function () {\n /*\n * api/course-resource/exemption-reason/pass-ext-cert\n * */\n return _CourseResourceService\n .one('exemption-reason', null)\n .customGET('pass-ext-cert');\n },\n getPassIntCert: function () {\n /*\n * api/course-resource/exemption-reason/pass-int-cert\n * */\n return _CourseResourceService\n .one('exemption-reason', null)\n .customGET('pass-int-cert');\n },\n\n getLeaveInfo: function (enrollmentId, params) {\n /*\n * api/course-resource/course-enrollment/{enrollmentId}/leave-info\n * */\n return _CourseResourceService\n .one('course-enrollment', enrollmentId)\n .customGETLIST('leave-info', params);\n },\n\n setLeave: function (enrollmentId, params) {\n /*\n * api/course-resource/course-enrollment/{enrollmentId}/\n * apply-leave?reason={reason}&periodList={periods}&reasonIdList={reasonIds}\n * */\n return _CourseResourceService\n .one('course-enrollment', enrollmentId)\n .customPUT({}, \"apply-leave\", params, {});\n },\n\n setExemption: function (enrollmentId, params, isProgram) {\n /*\n * api/course-resource/course-enrollment/{{enrollmentId}}/exempt\n * ?reason={{reason}}&exemptionType={{exemptionType}}&exemptionId={{exemptionId}}\n *\n * api/course-resource/program-enrollment/{enrollmentId}/exempt\n * ?reason={{reason}}&exemptionType={{exemptionType}}&exemptionId={{exemptionId}}\n * */\n isProgram = isProgram || false;\n if(isProgram){\n return _CourseResourceService\n .one('program-enrollment', enrollmentId)\n .customPUT({}, \"exempt\", params, {});\n }else{\n return _CourseResourceService\n .one('course-enrollment', enrollmentId)\n .customPUT({}, \"exempt\", params, {});\n }\n\n },\n\n setSessionUnEnroll: function (enrollmentId, params, isProgram) {\n /*\n * api/course-resource/course-enrollment/{enrollmentId}/unenroll-course?unenrollReason={unenrollReason}\n * api/course-resource/program-enrollment/{enrollmentId}/program-course?unenrollReason={unenrollReason}\n * */\n isProgram = isProgram || false;\n if(isProgram){\n return _CourseResourceService\n .one('program-enrollment', enrollmentId)\n .customPUT({}, \"unenroll-program\", params, {});\n }else{\n return _CourseResourceService\n .one('course-enrollment', enrollmentId)\n .customPUT({}, \"unenroll-course\", params, {});\n }\n },\n\n getSessionEnrollPreCheck: function (isProgram, sessionId, params) {\n /*\n * api/course-resource/course-session/{sessionId}/enroll-course-check\n * api/course-resource/program-session/{sessionId}/enroll-program-check\n * */\n if(isProgram){\n return _CourseResourceService\n .one('program-session', sessionId)\n .customGET('enroll-program-check', params);\n }else {\n return _CourseResourceService\n .one('course-session', sessionId)\n .customGET('enroll-course-check', params);\n }\n },\n\n setSessionEnroll: function (sessionId, params, isProgram) {\n /*\n * api/course-resource/course-session/{sessionId}/enroll-course\n * api/course-resource/program-session/{sessionId}/enroll-program\n * */\n if(isProgram){\n return _CourseResourceService\n .one('program-session', sessionId)\n .customPUT({}, \"enroll-program\", params, {});\n }else{\n return _CourseResourceService\n .one('course-session', sessionId)\n .customPUT({}, \"enroll-course\", params, {});\n }\n },\n\n setFavorite: function (courseId,courseType, params) {\n /* {courseType}=0\n * api/course-resource/favorite-program/{courseId}?isMyFavorite={isMyFavorite}\n * {courseType}!=0\n * api/course-resource/favorite-course/{courseId}?isMyFavorite={isMyFavorite}\n * */\n var route=(courseType===0)?\"favorite-program\":\"favorite-course\";\n\n return _CourseResourceService\n .one(route, courseId)\n .put(params, {});\n\n },\n\n getLearningHistory: function (enrollmentId, params) {\n /*\n * api/course-resource/course-enrollment/{enrollmentId}/learning-history\n * */\n return _CourseResourceService\n .one('course-enrollment', enrollmentId)\n .customGET('learning-history', params);\n\n },\n\n getLatestCourses: function (params) {\n /*\n * api/course-resource/catalog-info/0/latest-courses\n * */\n return _CourseResourceService\n .one('catalog-info', 0)\n .customGETLIST('latest-courses', params);\n\n },\n\n getHotCourses: function (params) {\n /*\n * api/course-resource/catalog-info/0/hot-courses\n * */\n return _CourseResourceService\n .one('catalog-info', 0)\n .customGETLIST('hot-courses', params);\n\n },\n\n getFeaturedCourses: function (params) {\n /*\n * api/course-resource/catalog-info/0/recommended-courses?current_page={current_page}&list_size={list_size}\n * */\n return _CourseResourceService\n .one('catalog-info', 0)\n .customGETLIST('featured-courses', params);\n\n },\n\n getRecommendedCourses: function (params) {\n /*\n * api/course-resource/catalog-info/0/category-recommended-courses?yearAgo={yearAgo}&size={size}&itemType={itemType}&itemId={itemId}&sessionId={sessionId}\n * */\n return _CourseResourceService\n .one('catalog-info', 0)\n .customGETLIST('recommended-courses', params);\n\n }\n };\n\n }\n\n angular.module('eHRD.modules.courseResource')\n .factory('courseResourceService', courseResourceService);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/30.\n */\n(function () {\n 'use strict';\n\n displayMinNumber.inject = [];\n function displayMinNumber() {\n return function (number, displayMinNumber) {\n if(Math.floor(number).toString().length < displayMinNumber){\n var prefix_num = displayMinNumber - Math.floor(number).toString().length;\n var prefix = '';\n while (prefix_num > 0){\n prefix = prefix + '0';\n prefix_num -- ;\n }\n return prefix + number;\n }else{\n return number;\n }\n }\n }\n\n angular.module('eHRD.modules.courseResource')\n .filter('displayMinNumber', displayMinNumber)\n})();\n\n/**\n * Created by Bruce on 2016/11/1.\n */\n(function () {\n 'use strict';\n\n unAssignableMembers.$inject = ['$mdDialog', '$document'];\n function unAssignableMembers($mdDialog, $document) {\n var directive = {\n restrict: 'A',\n scope: {\n isProgram:'=?',\n sessionId: '=',\n sessionName:'=',\n reloadFn:'&'\n },\n\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n controller: ['$scope', '$filter', 'NgTableParams','$mdDialog', 'SweetAlert', 'managerService', 'isProgram', 'sessionId', 'sessionName', 'WizardHandler',\n function ($scope, $filter, NgTableParams, $mdDialog, SweetAlert, managerService, isProgram, sessionId, sessionName, WizardHandler) {\n var vm = this;\n $scope.close = function() {\n $mdDialog.cancel();\n };\n vm.wzBtn ={\n next:true,\n previous: false,\n finish: false\n };\n var _members = {};\n vm.sessionName = sessionName;\n\n vm.enroll = {\n reason: ''\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n vm.unAssignableMemberTable = new NgTableParams({}, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc') ? 0 : 1);\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n\n return managerService.getUnAssignableMmembers(isProgram, sessionId, params).then(function (members) {\n tableParams.total(members.metadata.pagination.total);\n vm.members = members;\n\n vm.users = {\n selectAll: false,\n selected: {}\n };\n\n // watch for check all checkbox\n $scope.$watch(function() {\n return vm.users.selectAll;\n }, function(value) {\n angular.forEach(vm.members, function(member) {\n vm.users.selected[member.enrollmentId] = value;\n });\n });\n\n vm.nextStep = function () {\n WizardHandler.wizard('unassign').next();\n vm.setSelected();\n };\n\n vm.previousStep = function () {\n WizardHandler.wizard('unassign').previous();\n };\n\n vm.finishStep = function () {\n WizardHandler.wizard('unassign').finish();\n };\n\n vm.setSelected = function () {\n vm.selectedMembers = [];\n angular.forEach(vm.users.selected,function (val, key) {\n if(val){\n vm.selectedMembers.push($filter('where')(members, {'enrollmentId': key})[0]);\n }\n });\n };\n\n vm.unassign = function (enroll) {\n var enrollmentIds = '';\n angular.forEach(vm.users.selected,function (val, key) {\n if(val){\n if(enrollmentIds.length > 0) enrollmentIds += ',' + key;\n else enrollmentIds += key;\n }\n });\n\n var params = {\n enrollmentIds: enrollmentIds,\n reason: (angular.isDefined(enroll.reason)? enroll.reason: '')\n };\n managerService.UnAssignable(isProgram, sessionId,params).then(function (data) {\n if(data){\n SweetAlert.success('', $filter('translate')('MESSAGE.MSG_TAKES_TIME_ACTION'));\n $mdDialog.hide();\n }else{\n SweetAlert.error('', '');\n }\n });\n };\n\n vm.resetWzBtn = function () {\n vm.wzBtn ={\n next:true,\n previous: false,\n finish: false\n };\n return true;\n };\n vm.canNext = function () {\n var hasSelected = false;\n if(Object.keys(vm.users.selected).length === 0){\n hasSelected = false;\n }else {\n angular.forEach(vm.users.selected,function (val) {\n if(val){\n hasSelected = true;\n }\n });\n }\n if(!hasSelected) SweetAlert.error( \"\", $filter('translate')('MESSAGE.MSG_PLEASE_SELECT_AT_LEAST_ONE_STUDENT'));\n\n if(hasSelected){\n vm.wzBtn ={\n next:false,\n previous: true,\n finish: true\n };\n }\n return hasSelected;\n };\n\n angular.forEach(members, function (member) {\n _members[member.userId] = member;\n });\n\n return members;\n });\n }\n });\n }],\n multiple: true,\n controllerAs: '$ctrl',\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/unassignable-members.html',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n isProgram: scope.isProgram,\n sessionId: scope.sessionId,\n sessionName: scope.sessionName\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function() {\n if(angular.isFunction(scope.reloadFn)) scope.reloadFn();\n }, function() { }\n );\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('unAssignableMembers', unAssignableMembers);\n\n})();\n\n/**\n * Created by Alan on 2017/1/17.\n */\n\n(function () {\n 'use strict';\n\n testHistorySearchDialog.$inject = ['$mdDialog'];\n function testHistorySearchDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n sessionId: '=?',\n itemId: '=?',\n courseContent: '=?',\n userId: '=?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/test-history-search-dialog.html',\n controller: ['$filter', 'SweetAlert', 'NgTableParams','testQuestionnaireService', 'managerService', '$mdDialog', 'WizardHandler', 'sessionId', 'itemId', 'userId', 'courseContent',\n function ($filter, SweetAlert, NgTableParams,testQuestionnaireService, managerService, $mdDialog, WizardHandler, sessionId, itemId, userId, courseContent) {\n var vm = this;\n vm.userId = (angular.isUndefined(userId))?null:userId;\n vm.sessionId = sessionId;\n vm.itemId = itemId;\n vm.courseContent = courseContent;\n vm.testHistoryTable = new NgTableParams({}, {\n counts: [],\n getData: function() {\n vm.examHistoryId = '';\n var params = {\n itemid: itemId,\n startDate: (angular.isUndefinedOrNull(vm.startDate))?'':moment(vm.startDate).format(\"YYYY/MM/DD\"),\n endDate: (angular.isUndefinedOrNull(vm.endDate))?'':moment(vm.endDate).format(\"YYYY/MM/DD\")\n };\n var getTestHistory;\n if(vm.userId===null){\n getTestHistory = testQuestionnaireService.getTestHistory(sessionId, params);\n }\n else {\n params.userId = vm.userId;\n getTestHistory = managerService.getTestHistory(sessionId, params);\n }\n\n testQuestionnaireService.getExamInfo(vm.sessionId, {itemid: vm.itemId}).then(function (exam) {\n vm.exam = exam;\n });\n return getTestHistory.then(function (testHistory) {\n vm.testHistory = testHistory;\n return testHistory;\n });\n }\n });\n vm.testHistoryReload = function() {\n if(vm.startDate > vm.endDate) {\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_THE_START_DATE_NEED_TO_EARLIER_THAN_THE_END_DATE'));\n }\n else {\n vm.testHistoryTable.reload();\n }\n\n };\n vm.searchPage = function () {\n vm.wzBtn ={\n next:false,\n previous: true,\n finish: true\n };\n return true;\n };\n\n vm.viewPage = function () {\n vm.wzBtn ={\n next:true,\n previous: false,\n finish: false\n };\n return true;\n };\n vm.viewPage();\n vm.nextStep = function () {\n WizardHandler.wizard('testHistorySearch').next();\n };\n\n vm.previousStep = function () {\n WizardHandler.wizard('testHistorySearch').previous();\n };\n\n vm.finishStep = function () {\n WizardHandler.wizard('testHistorySearch').finish();\n };\n\n vm.updateEndDateModel = function () {\n var beginningTime = moment(vm.startDate);\n var endTime = moment(vm.endDate);\n if(!beginningTime.isBefore(endTime)){\n vm.endDate = vm.startDate;\n }\n };\n\n vm.getExamResult = function() {\n vm.examResultParams = {\n itemid: vm.itemId,\n examhistoryId: vm.examHistoryId,\n userId: angular.isUndefinedOrNull(vm.userId)?null:vm.userId\n };\n var getExamResult = (angular.isUndefinedOrNull(vm.userId))\n ?testQuestionnaireService.getExamResult(vm.sessionId, vm.examResultParams)\n :managerService.getExamResult(vm.sessionId, vm.examResultParams);\n\n getExamResult.then(function (examResult) {\n vm.examResult = examResult;\n });\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n sessionId : scope.sessionId,\n itemId: scope.itemId,\n courseContent: scope.courseContent,\n userId: scope.userId\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('testHistorySearchDialog', testHistorySearchDialog);\n\n})();\n\n/**\n * Created by alan on 2016/10/26.\n */\n(function () {\n 'use strict';\n\n setFavorite.$inject = ['courseResourceService', 'SweetAlert', '$filter'];\n function setFavorite(courseResourceService, SweetAlert, $filter) {\n\n var directive ={\n restrict: 'EA',\n scope: {\n courseId:'=',\n courseName:'=',\n courseType:'=',\n isFavorite:'=',\n reload:'&?'\n },\n link:function(scope,element){\n element.on('click', function () {\n var check;\n check=(scope.isFavorite===false)?\"MSG_DO_YOU_WANT_TO_ADD_MY_FAVORITE\":\"MSG_DO_YOU_WANT_TO_CANCEL_MY_FAVORITE\";\n SweetAlert.check('', $filter('translate')('MESSAGE.' + check, {value: scope.courseName}), 'warning', function() {\n scope.isFavorite=(scope.isFavorite===false)?true:false;\n var params={\n isMyFavorite:scope.isFavorite\n };\n courseResourceService.setFavorite(scope.courseId,scope.courseType,params).then(function () {\n scope.reload();\n });\n });\n\n })\n }\n };\n return directive;\n }\n\n\n angular.module('eHRD.modules.courseResource')\n .directive('setFavorite', setFavorite);\n})();\n\n/**\n * Created by Bruce on 2016/11/15.\n */\n(function() {\n 'use strict';\n\n sessionEnrolledMembersDialog.$inject = ['$document', '$mdDialog'];\n function sessionEnrolledMembersDialog($document, $mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n sessionId: '=?',\n isProgram: '=?',\n reloadFn: '&?'\n },\n link: function(scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/session-enrolled-members-dialog.html',\n controller: ['$scope', '$mdDialog', 'NgTableParams', 'courseResourceService', 'sessionId' , 'isProgram' ,\n function($scope, $mdDialog, NgTableParams, courseResourceService, sessionId , isProgram ) {\n\n if(isProgram){\n courseResourceService.getProgramSession(sessionId, {}).then(function(sessionData) {\n $scope.sessionData = sessionData;\n });\n }else {\n courseResourceService.getCourseSession(sessionId, {}).then(function(sessionData) {\n $scope.sessionData = sessionData;\n });\n }\n\n\n $scope.courseSessionLearnersTable = new NgTableParams({}, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc') ? 0 : 1);\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n\n if(isProgram){\n return courseResourceService.getProgramSessionLearners(sessionId, params).then(function (sessionLearnersData) {\n tableParams.total(sessionLearnersData.metadata.pagination.total);\n return sessionLearnersData;\n });\n }else{\n return courseResourceService.getCourseSessionLearners(sessionId, params).then(function (sessionLearnersData) {\n tableParams.total(sessionLearnersData.metadata.pagination.total);\n return sessionLearnersData;\n });\n }\n }\n });\n $scope.close = function() {\n $mdDialog.cancel();\n };\n }\n ],\n multiple: true,\n controllerAs: 'SEMDC',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose: true,\n locals: {\n sessionId: scope.sessionId,\n isProgram: scope.isProgram\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function() {\n if (angular.isDefined(scope.reloadFn)) scope.reloadFn();\n }, function() {\n if (angular.isDefined(scope.reloadFn)) scope.reloadFn();\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('sessionEnrolledMembersDialog', sessionEnrolledMembersDialog);\n})();\n\n/**\n * Created by Bruce on 2016/11/30.\n */\n(function () {\n 'use strict';\n\n sessionActionUnEnroll.$inject = ['$mdDialog', '$document'];\n function sessionActionUnEnroll($mdDialog, $document) {\n var directive = {\n restrict: 'A',\n scope: {\n enrollmentId: '=?',\n isProgram: '=?',\n reloadFn:'&?'\n },\n\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/session-action-un-enroll-dialog.html',\n controller: ['$scope', 'NgTableParams', '$filter', '$mdDialog', '$state', 'courseResourceService', 'enrollmentId', 'isProgram', 'SweetAlert',\n function ($scope, NgTableParams, $filter, $mdDialog, $state, courseResourceService, enrollmentId, isProgram, SweetAlert) {\n var vm = this;\n var isNeedBackPage = (\n $state.includes('learningPassport.incompleteCourses.courseInfo') ||\n $state.includes('learningPassport.incompleteCourses.programInfo') ||\n $state.includes('learningPassport.incompleteCourses.programInfo.courseInfo') ||\n $state.includes('learningPassport.testQuestionnaireCenter.courseInfo') ||\n $state.includes('courseResourceCatalog.CourseInfo.SessionInfo') ||\n $state.includes('courseResourceCatalog.ProgramInfo.SessionInfo') ||\n $state.includes('learningPassport.incompleteCourses.certificationInfo')\n );\n\n $scope.close = function() {\n $mdDialog.cancel();\n };\n vm.scope = $scope;\n vm.submitFn = null;\n\n courseResourceService.getSessionUnEnrollReq(enrollmentId, {}, isProgram).then(function (unEnrollReq) {\n vm.unEnrollReqData = unEnrollReq;\n });\n vm.submitFn = unEnrollCourseSession;\n\n function unEnrollCourseSession () {\n var params = {};\n if(angular.isDefined(vm.enroll.reason)) params.unenrollReason = vm.enroll.reason;\n courseResourceService.setSessionUnEnroll(enrollmentId, params, isProgram).then(function (res) {\n if(res.status === 0){\n if(!res.isNeedApproval){\n if(isNeedBackPage){\n $mdDialog.cancel();\n if($state.current.name === 'learningPassport.incompleteCourses.programInfo.courseInfo')\n $state.go('learningPassport.incompleteCourses.programInfo', {enrollmentId: $state.params.programEnrollmentId});\n else if (angular.isUndefinedOrNull($state.params.backState))\n $state.go('learningPassport.incompleteCourses');\n else\n $state.go($state.params.backState, $state.params);\n }else {\n $mdDialog.hide();\n }\n }else {\n SweetAlert.warning('',$filter('translate')('MESSAGE.MSG_ENROLLMENT_APPROVAL_PENDING'));\n $mdDialog.hide();\n }\n }\n });\n }\n\n\n }],\n multiple: true,\n controllerAs: '$ctrl',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n enrollmentId: scope.enrollmentId,\n isProgram: angular.isUndefinedOrNull(scope.isProgram) ? false : scope.isProgram\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function() {\n if(angular.isDefined(scope.reloadFn)) scope.reloadFn();\n }\n );\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('sessionActionUnEnroll', sessionActionUnEnroll);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/30.\n */\n(function () {\n 'use strict';\n\n sessionActionLeave.$inject = ['$mdDialog', '$document'];\n function sessionActionLeave($mdDialog, $document) {\n var directive = {\n restrict: 'A',\n scope: {\n enrollmentId: '=?',\n reloadFn:'&?'\n },\n\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/session-action-leave-dialog.html',\n controller: ['$scope', 'NgTableParams', '$filter', '$mdDialog', '$state', 'courseResourceService', 'enrollmentId', 'WizardHandler', 'SweetAlert',\n function ($scope, NgTableParams, $filter, $mdDialog, $state, courseResourceService, enrollmentId, WizardHandler, SweetAlert) {\n var vm = this;\n vm.leaveForm = null;\n $scope.close = function() {\n $mdDialog.cancel();\n };\n\n vm.scope = $scope;\n vm.submitFn = null;\n vm.leaveTable = new NgTableParams({}, {\n counts: [],\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc') ? 0 : 1);\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n\n return courseResourceService.getLeaveInfo(enrollmentId, {}).then(function (leaveDatas) {\n vm.leaves = {};\n angular.forEach(leaveDatas, function (leaveData) {\n vm.leaves[leaveData.id] = {};\n\n if(!leaveData.hasLeaveRecord){\n vm.leaves[leaveData.id].reason = \"2\";\n vm.leaves[leaveData.id].selected = false;\n }\n });\n\n // watch for check all checkbox\n $scope.$watch(function() {\n return vm.selectAllLeave;\n }, function(value) {\n if(angular.isDefined(value)){\n angular.forEach(leaveDatas, function (leaveData) {\n if(!leaveData.hasLeaveRecord){\n vm.leaves[leaveData.id].selected = value;\n }\n });\n }\n });\n return leaveDatas;\n });\n }\n });\n\n vm.submitFn = leaveSession;\n function leaveSession() {\n if(vm.formValidation()){\n vm.submitError = false;\n var params = {};\n params.reason = vm.reason;\n params.periodList = '';\n params.reasonIdList = '';\n var periodList = [], reasonIdList = [];\n angular.forEach(vm.leaves, function (leave, index) {\n if(angular.isDefined(leave.selected) && leave.selected){\n var period = '';\n period += index + '_' + $filter('displayMinNumber')(leave.startHH, 2) +\n $filter('displayMinNumber')(leave.startMM, 2) + '_' +\n $filter('displayMinNumber')(leave.endHH, 2) +\n $filter('displayMinNumber')(leave.endMM, 2);\n periodList.push(period);\n reasonIdList.push(leave.reason);\n }\n });\n params.periodList = periodList.toString();\n params.reasonIdList = reasonIdList.toString();\n\n courseResourceService.setLeave(enrollmentId, params).then(function (res) {\n if(res.status === 0){\n if(!res.isNeedApproval){\n $mdDialog.hide();\n }else {\n SweetAlert.warning('',$filter('translate')('MESSAGE.MSG_ENROLLMENT_APPROVAL_PENDING'));\n $mdDialog.hide();\n }\n }\n });\n }else{\n vm.submitError = true;\n SweetAlert.error( \"\", $filter('translate')('MESSAGE.MSG_PLEASE_FILL_IN_THE_REASON'));\n }\n }\n\n vm.formValidation = function () {\n if(angular.isDefined(vm.leaveForm) && vm.leaveForm.$valid) {\n return vm.leaveForm.$valid;\n }else{\n return false;\n }\n };\n\n vm.wzBtn ={\n next:true,\n previous: false,\n finish: false\n };\n\n vm.resetWzBtn = function () {\n vm.wzBtn ={\n next:true,\n previous: false,\n finish: false\n };\n return true;\n };\n\n vm.canNext = function () {\n var hasSelected = false;\n var checkTime = true;\n angular.forEach(vm.leaves,function (leave) {\n if(angular.isDefined(leave.selected) && leave.selected){\n hasSelected = true;\n if((parseInt(leave.startHH) > parseInt(leave.endHH)) || (parseInt(leave.startHH) === parseInt(leave.endHH) && parseInt(leave.startMM) >= parseInt(leave.endMM) ))\n checkTime = false;\n }\n });\n\n if(!hasSelected) SweetAlert.error( \"\", $filter('translate')('MESSAGE.MSG_PLEASE_SELECT_AT_LEAST_ONE_TIME_PERIOD'));\n if(hasSelected && !checkTime) SweetAlert.error( \"\", $filter('translate')('MESSAGE.MSG_THE_TIME_RANGE_IS_ERROR'));\n\n if(hasSelected && checkTime){\n vm.wzBtn ={\n next:false,\n previous: true,\n finish: true\n };\n }\n return (hasSelected && checkTime);\n };\n\n vm.nextStep = function () {\n WizardHandler.wizard('leave').next();\n };\n\n vm.previousStep = function () {\n WizardHandler.wizard('leave').previous();\n };\n\n vm.finishStep = function () {\n WizardHandler.wizard('leave').finish();\n };\n }],\n controllerAs: '$ctrl',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n enrollmentId: scope.enrollmentId\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function() {\n if(angular.isDefined(scope.reloadFn)) scope.reloadFn();\n }\n );\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('sessionActionLeave', sessionActionLeave);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/30.\n */\n(function () {\n 'use strict';\n\n sessionActionExemption.$inject = ['$mdDialog', '$document'];\n function sessionActionExemption($mdDialog, $document) {\n var directive = {\n restrict: 'A',\n scope: {\n enrollmentId: '=?',\n isProgram: '=?',\n reloadFn:'&?'\n },\n\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/session-action-exemption-dialog.html',\n controller: ['$scope', 'NgTableParams', '$filter', '$mdDialog', '$state', 'courseResourceService', 'enrollmentId', 'isProgram', 'SweetAlert',\n function ($scope, NgTableParams, $filter, $mdDialog, $state, courseResourceService, enrollmentId, isProgram, SweetAlert) {\n var vm = this;\n $scope.close = function() {\n $mdDialog.cancel();\n };\n\n vm.scope = $scope;\n vm.submitFn = null;\n\n vm.exemption = {\n reason:'',\n exemptionType: 1,\n exemptionId: 0\n };\n\n vm.loadPassedCertification = function() {\n courseResourceService.getPassExtCert().then(function (ext_cert) {\n return vm.ext_cert = ext_cert;\n });\n };\n vm.loadPassedInnerCertification = function () {\n courseResourceService.getPassIntCert().then(function (int_cert) {\n return vm.int_cert = int_cert;\n });\n };\n vm.loadPassedCourse = function () {\n courseResourceService.getPassCourse().then(function (course) {\n return vm.course = course;\n });\n };\n\n vm.submitFn = exemptionSession;\n\n function exemptionSession() {\n var params = {\n reason: vm.exemption.reason,\n exemptionType: vm.exemption.exemptionType,\n exemptionId: (vm.exemption.exemptionType === 3 ? 0 : vm.exemption.exemptionId)\n };\n\n courseResourceService.setExemption(enrollmentId, params, isProgram).then(function (res) {\n if(res.status === 0){\n if(!res.isNeedApproval){\n $state.go('learningPassport.incompleteCourses');\n $mdDialog.cancel();\n }else {\n SweetAlert.warning('',$filter('translate')('MESSAGE.MSG_ENROLLMENT_APPROVAL_PENDING'));\n $mdDialog.hide();\n }\n }\n });\n }\n\n }],\n controllerAs: '$ctrl',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n enrollmentId: scope.enrollmentId,\n isProgram: angular.isUndefinedOrNull(scope.isProgram) ? false : scope.isProgram\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function() {\n if(angular.isDefined(scope.reloadFn)) scope.reloadFn();\n }\n );\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('sessionActionExemption', sessionActionExemption);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/30.\n */\n(function () {\n 'use strict';\n\n sessionActionEnroll.$inject = ['$mdDialog', '$document', 'courseResourceService', 'SweetAlert', '$filter'];\n function sessionActionEnroll($mdDialog, $document, courseResourceService, SweetAlert, $filter) {\n var directive = {\n restrict: 'A',\n scope: {\n sessionId: '=?',\n isProgram: '=?',\n reloadFn:'&?'\n },\n\n link: function (scope, element) {\n element.bind('click', function(ev) {\n if(angular.isDefined(scope.isProgram) && angular.isDefined(scope.sessionId)){\n courseResourceService.getSessionEnrollPreCheck(scope.isProgram, scope.sessionId, {}).then(function (res) {\n switch (res.statusCode){\n case 'OK':\n showEnrollDialog();\n break;\n case 'FAIL_CHECK_NOT_PUBLISH':\n SweetAlert.warning('',$filter('translate')('MESSAGE.MSG_ERROR_NOT_PUBLISH'));\n break;\n case 'FAIL_CHECK_SESSIONQUOTAFULL': case 'FAIL_CKECK_PRIVILEGE': case 'FAIL_CHECK_OUT_OF_QUOTA':\n SweetAlert.warning('',$filter('translate')('STATUS.' + res.statusCode));\n break;\n case 'FAIL_CHECK_PREREQUESTED':\n var prerequisites = [];\n angular.forEach(res.preItems, function (preItem) {\n angular.forEach(preItem.records, function (record) {\n prerequisites.push(record.objectName)\n });\n });\n SweetAlert.warning($filter('translate')('MESSAGE.MSG_ERROR_NEED_FINISH_PREREQUISITE_ITEMS'), $filter('arrayToString')(prerequisites, '
    '));\n break;\n case 'FAIL_CHECK_OTHERCLASSPASSED':\n if(res.isForbidEnrollClassAfterPass){\n SweetAlert.warning($filter('translate')('MESSAGE.MSG_ERROR_MESSAGE_CAN_NOT_ENROLL_CAUSE_PASS_RESULT'),\n res.detail);\n }else{\n SweetAlert.check($filter('translate')('MESSAGE.MSG_ERROR_MESSAGE_ENROLL_CAUSE_PASS_RESULT'), res.detail, 'warning', function() {\n showEnrollDialog();\n }, null, $filter('translate')('ACTIONS.CONTINUE_ENROLL'));\n }\n break;\n case 'FAIL_CKECK_CONFLICTCLASSTIME':\n SweetAlert.warning($filter('translate')('MESSAGE.MSG_CLASS_TIME_CONFLICT', { 'value': res.detail}),'');\n break;\n case 'FAIL_CHECK_INNERCERTEXTEND':\n SweetAlert.warning($filter('translate')('MESSAGE.MSG_INNERCERT_CANNOT_ENROLL_EXTENDED_SESSION'),\n res.detail);\n break;\n }\n });\n }\n\n function showEnrollDialog() {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/session-action-enroll-dialog.html',\n controller: ['$scope', 'NgTableParams', '$filter', '$mdDialog', '$state', 'courseResourceService', 'sessionId', 'isProgram', 'SweetAlert', 'testQuestionnaireService', '$location', '$anchorScroll', 'WizardHandler',\n function ($scope, NgTableParams, $filter, $mdDialog, $state, courseResourceService, sessionId, isProgram, SweetAlert, testQuestionnaireService, $location, $anchorScroll, WizardHandler) {\n var vm = this;\n $scope.close = function() {\n $mdDialog.cancel();\n };\n vm.scope = $scope;\n vm.submitFn = null;\n vm.sessionId = sessionId;\n vm.pageView = 'reason';\n vm.isStartFillIn = false;\n\n courseResourceService.getSessionEnrollReq(sessionId, {}, isProgram).then(function (enrollReq) {\n vm.enrollReqData = enrollReq;\n vm.itemId = enrollReq.preEnrollSurveyItemId;\n });\n vm.submitFn = enrollCourseSession;\n\n function enrollCourseSession() {\n var params = {};\n if(angular.isDefined(vm.enroll.reason)) params.enrollReason = vm.enroll.reason;\n params.isConfirmHasAlreadyCourse = false;\n\n setSessionEnroll(params);\n\n function setSessionEnroll(params) {\n courseResourceService.setSessionEnroll(sessionId, params, isProgram).then(function (res) {\n switch (res.status){\n case -1:\n SweetAlert.warning('',$filter('translate')('MESSAGE.MSG_ERROR_NOT_PUBLISH'));\n break;\n case 6:\n SweetAlert.warning('',$filter('translate')('MESSAGE.MSG_ERROR_MESSAGE_CAN_ENROLL_WAITLSTED_RESULT'));\n if(vm.enrollReqData.isHasPreEnrollSurvey)\n save(testQuestionnaireService.getAnswers(vm.questionModel, vm.questionnaireData), vm.exam.feedbackType, true);\n $mdDialog.hide();\n break;\n case 3:\n SweetAlert.warning('',$filter('translate')('STATUS.FAIL_CHECK_PRIVILEGE'));\n break;\n case 2:\n params.isConfirmHasAlreadyCourse = true;\n setSessionEnroll(params);\n break;\n case 0:case 4:case 5:case 8:\n params.isConfirmHasAlreadyCourse = true;\n SweetAlert.check($filter('translate')('MESSAGE.MSG_ERROR_MESSAGE_CAN_NOT_ENROLL_CAUSE_PASS_RESULT'), res.detail, 'warning',\n function() {\n setSessionEnroll(params);\n });\n break;\n case 1:\n var prerequisites = [];\n angular.forEach(res.preItems, function (preItem) {\n angular.forEach(preItem.records, function (record) {\n prerequisites.push(record.objectName)\n });\n });\n\n SweetAlert.warning($filter('translate')('MESSAGE.MSG_ERROR_NEED_FINISH_PREREQUISITE_ITEMS'), $filter('arrayToString')(prerequisites, '
    '));\n break;\n case 7:\n if(res.isNeedApproval){\n SweetAlert.warning('',$filter('translate')('MESSAGE.MSG_ENROLLMENT_APPROVAL_PENDING'));\n }\n $mdDialog.hide();\n if(vm.enrollReqData.isHasPreEnrollSurvey)\n save(testQuestionnaireService.getAnswers(vm.questionModel, vm.questionnaireData), vm.exam.feedbackType, true);\n break;\n }\n\n });\n }\n }\n\n\n vm.reasonCheck = function () {\n vm.form.$setSubmitted();\n if(!vm.form.$valid) {\n return false;\n }\n else {\n if(!vm.isStartFillIn) {\n SweetAlert.check('', $filter('translate')('MESSAGE.MSG_BEFORE_YOU_REGISTER_YOU_MUST_FILL_OUT_THE_REGISTRATION_QUESTIONNAIRE_ARE_YOU_SURE_YOU_WANT_TO_CONTINUE'), 'warning', function() {\n vm.getTestInfo(vm.sessionId, vm.itemId);\n },function(){\n $scope.close();\n });\n }else {\n vm.pageView='form';\n }\n return true;\n }\n\n };\n\n vm.nextStep = function () {\n WizardHandler.wizard('sessionActionEnroll').next();\n };\n\n vm.previousStep = function () {\n WizardHandler.wizard('sessionActionEnroll').previous();\n vm.pageView ='reason';\n };\n\n //questionnaire\n vm.getTestInfo = function(sessionId, itemId) {\n testQuestionnaireService.getExamInfo(sessionId, {itemid: itemId}).then(function (examInfo) {\n vm.exam = examInfo;\n if(examInfo.isOverMaxViewTimes > 0 || examInfo.isNotAccessPeriod > 0 || examInfo.isNotValidReTest > 0 || examInfo.canPlay === 0 || examInfo.isNotFitAttedDance === 1){\n vm.pageView = 'status';\n } else{\n vm.pageView = 'start';\n }\n });\n };\n\n vm.startExam = function () {\n testQuestionnaireService.getExamToken(vm.sessionId, {itemid:vm.itemId}).then(function (data) {\n vm.examHistoryId = data.examhistoryId;\n var params = {\n itemid: vm.itemId,\n examhistoryId: vm.examHistoryId\n };\n getQuestions(vm.sessionId, params);\n vm.isStartFillIn = true;\n vm.questionCurrentPage = 1;\n });\n };\n\n var getQuestions = function(sessionId, params) {\n testQuestionnaireService.getQuestions(vm.sessionId, params).then(function (questionnaireData) {\n vm.questionnaireData = questionnaireData;\n vm.questionsPagination = questionnaireData.metadata.pagination;\n vm.questionModel = testQuestionnaireService.getQuestionModel(questionnaireData);\n vm.pageView = 'form';\n });\n };\n\n vm.finishedExam = function () {\n testQuestionnaireService.finishedExam(vm.questionModel).then(function(){\n vm.submitFn();\n });\n };\n\n var save = function (answers, feedbackType, isFinished) {\n\n var assessment = testQuestionnaireService.getAssessment(sessionId);\n assessment.get().then(function () {\n\n testQuestionnaireService.putTestAnswer(assessment, {answers: answers}, {itemid:vm.itemId, examhistoryId: vm.examHistoryId}).then(function (response) {\n\n if(response.status === 1 && isFinished){\n testQuestionnaireService.putTestFinish(assessment, {itemid:vm.itemId, examhistoryId: vm.examHistoryId}).then(function () {\n });\n }\n });\n });\n\n };\n\n }],\n multiple: true,\n controllerAs: '$ctrl',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n sessionId: scope.sessionId,\n isProgram: angular.isUndefinedOrNull(scope.isProgram) ? false : scope.isProgram\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function() {\n if(angular.isDefined(scope.reloadFn)) scope.reloadFn();\n }\n );\n }\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('sessionActionEnroll', sessionActionEnroll);\n\n})();\n\n/**\n * Created by Alan on 2016/12/20.\n */\n\n(function () {\n 'use strict';\n\n programDetailLessonsResultsDialog.$inject = ['$mdDialog'];\n function programDetailLessonsResultsDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n enrollmentId: '=?',\n isManager: '=?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/program-detail-lessons-results-dialog.html',\n controller: ['courseResourceService', '$mdDialog', 'enrollmentId', 'managerService', 'fileProcessService',\n function (courseResourceService, $mdDialog, enrollmentId, managerService, fileProcessService) {\n var vm = this;\n vm.isManager = angular.isUndefinedOrNull(this.isManager) ? false : this.isManager;\n\n courseResourceService.getLearningResult(enrollmentId, true).then(function (learningResult) {\n vm.learningResult = learningResult;\n });\n\n courseResourceService.getProgramEnrollment(enrollmentId, {}).then(function (enrollmentData) {\n vm.enrollmentData = enrollmentData;\n });\n\n var reportProcessService = (vm.isManager)? managerService.getReportProcess(enrollmentId, {isCourse: false}) : fileProcessService.getReportProcess(enrollmentId, {isCourse: false});\n reportProcessService.then(function (report) {\n vm.report = report;\n });\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n }],\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n enrollmentId: scope.enrollmentId\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('programDetailLessonsResultsDialog', programDetailLessonsResultsDialog);\n\n})();\n\n/**\n * Created by Alan on 2016/12/20.\n */\n\n(function () {\n 'use strict';\n\n programDetailInfoDialog.$inject = ['$mdDialog', 'SweetAlert', '$filter'];\n function programDetailInfoDialog($mdDialog ,SweetAlert, $filter) {\n var directive = {\n restrict: 'A',\n scope: {\n programId: '=?',\n isPublished: '=?',\n canView: '=?'\n },\n link: function (scope, element) {\n element.bind('click', function (ev) {\n if(scope.isPublished===0)\n SweetAlert.warning('', $filter('translate')('MESSAGE.MSG_ERROR_NOT_PUBLISH'));\n else if(scope.canView===0)\n SweetAlert.warning('', $filter('translate')('MESSAGE.MSG_YOU_DO_NOT_HAVE_PERMISSION_TO_VIEW_THIS_LEARNING_ACTIVITY'));\n else {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/program-detail-info-dialog.html',\n controller: ['courseResourceService', '$mdDialog', 'programId',\n function (courseResourceService, $mdDialog, programId) {\n var vm = this;\n courseResourceService.getProgram(programId, null).then(function (programData) {\n vm.programData = programData;\n vm.programData.courseName = vm.programData.programName;\n });\n\n vm.close = function () {\n $mdDialog.cancel();\n };\n\n }],\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose: true,\n locals: {\n programId: scope.programId\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n }\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('programDetailInfoDialog', programDetailInfoDialog);\n\n})();\n\n/**\n * Created by Bruce on 2016/6/4.\n */\n(function () {\n 'use strict';\n\n optionsTpl.$inject = [];\n function optionsTpl() {\n\n var directive ={\n restrict: 'EA',\n require: 'ngModel',\n scope: {\n raId: \"=\",\n questionId: \"=\",\n questionModel:\"=ngModel\",\n questionType:\"=\",\n questionOptions: \"=\",\n feedbackStyle: \"=\",\n feedbackType: \"=\",\n studentResponse: \"=\",\n otherAnswer: \"=\",\n isOnlyReviewQuestion: \"=?\",\n isAllowViewScore: \"=?\",\n isAllowViewCorrectAns: \"=?\",\n selectOptionType:\"=?\",\n selectedOptionCount: \"=?\",\n onChange: \"&?\"\n },\n templateUrl:'app/modules/course-resource/views/test-questionnaire/options-tpl.html',\n link : function(scope){\n scope.isValueChange = false;\n scope.$watch('questionModel', function(newValue, oldValue) {\n if (!(angular.equals(oldValue.optionNumber, newValue.optionNumber)) || !(angular.equals(oldValue.optionOtherValue, newValue.optionOtherValue))){\n if(scope.onChange && scope.questionType!==3 ){\n scope.onChange();\n }else {\n scope.isValueChange = true\n }\n }\n },true);\n\n scope.blurFn = function() {\n if(scope.isValueChange)\n scope.onChange();\n scope.isValueChange = false;\n }\n },\n controller: ['$scope', function ($scope) {\n $scope.isOnlyReviewQuestion = angular.isUndefined($scope.isOnlyReviewQuestion) ? false : $scope.isOnlyReviewQuestion;\n $scope.isAllowViewScore = angular.isUndefined($scope.isAllowViewScore) ? false : $scope.isAllowViewScore;\n $scope.isAllowViewCorrectAns = angular.isUndefined($scope.isAllowViewCorrectAns) ? false : $scope.isAllowViewCorrectAns;\n\n\n if($scope.feedbackStyle === 4){\n $scope.iconFaces=[];\n switch ($scope.questionOptions.length){// 01 Bad -> 10 Good\n case 1:case 2:case 3:case 4:case 5:\n $scope.iconFaces=['01','06','08','09','10'];\n break;\n case 6:\n $scope.iconFaces=['01','05','06','08','09','10'];\n break;\n case 7:\n $scope.iconFaces=['01','05','06','07','08','09','10'];\n break;\n case 8:\n $scope.iconFaces=['01','04','05','06','07','08','09','10'];\n break;\n case 9:\n $scope.iconFaces=['01','02','04','05','06','07','08','09','10'];\n break;\n case 10:\n $scope.iconFaces=['01','02','03','04','05','06','07','08','09','10'];\n break;\n default:\n break;\n }\n }\n\n if(angular.isUndefined($scope.$parent.questionModel)) $scope.$parent.questionModel={};\n if(angular.isUndefined($scope.questionModel)) $scope.questionModel={};\n\n if($scope.raId > 0) $scope.questionModel.raId = $scope.raId;\n if($scope.otherAnswer.length > 0) $scope.questionModel.optionOtherValue = $scope.otherAnswer;\n\n $scope.disabledOption = function (newVal, oldVal, type) {\n switch (type){\n case 'radio':\n if(newVal != oldVal) {\n $scope.questionModel.optionOtherValue = '';\n }\n return (newVal != oldVal);\n case 'checkbox':\n var isDisable = true;\n if(angular.isDefined(newVal)) {\n if(!newVal.includes(oldVal)) $scope.questionModel.optionOtherValue = '';\n if (newVal.includes(oldVal)) isDisable = false;\n }\n return isDisable;\n }\n };\n\n $scope.checkSelectCount = function (option) {\n if(angular.isUndefined($scope.questionModel.optionNumber)) $scope.questionModel.optionNumber=[];\n if($scope.selectOptionType === 1 && ($scope.questionModel.optionNumber.length === parseInt($scope.selectedOptionCount))\n ){\n return (true && !($scope.questionModel.optionNumber.indexOf(option.optionNumber) > -1));\n }else{\n return (false && !($scope.questionModel.optionNumber.indexOf(option.optionNumber) > -1));\n }\n };\n\n $scope.optionsToggle = function (item, type) {\n\n switch (type){\n case 'checkbox':\n if(angular.isUndefined($scope.questionModel.optionNumber)) $scope.questionModel.optionNumber=[];\n var idx = $scope.questionModel.optionNumber.indexOf(item.optionNumber);\n if (idx > -1) {\n $scope.questionModel.optionNumber.splice(idx, 1);\n }\n else {\n $scope.questionModel.optionNumber.push(item.optionNumber);\n }\n break;\n default:\n $scope.questionModel.optionNumber = item.optionNumber;\n break;\n }\n };\n }]\n };\n return directive;\n }\n\n\n angular.module('eHRD.modules.courseResource')\n .directive('optionsTpl', optionsTpl);\n})();\n\n/**\n * Created by Blan on 2017/05/22.\n */\n(function() {\n 'use strict';\n\n learningReportListDialog.$inject = ['$mdDialog'];\n function learningReportListDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n mode: '@?',\n batchId: '=?',\n enrollmentId: '=?',\n activityName: '=?', //courseName or programName\n isProgram: '=?',\n canEdit: '=?'\n },\n link: function(scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/learning-report-list-dialog.html',\n controller: ['SweetAlert', '$interpolate', '$scope', '$filter', '$mdDialog', 'NgTableParams', 'ngTableColumnValueService', 'fileProcessService', 'courseResourceService', 'mode', 'batchId', 'enrollmentId', 'isProgram', 'activityName', 'canEdit',\n function(SweetAlert, $interpolate, $scope, $filter, $mdDialog, NgTableParams, ngTableColumnValueService, fileProcessService, courseResourceService, mode, batchId, enrollmentId, isProgram, activityName, canEdit ) {\n var vm = this;\n vm.canEdit = canEdit;\n vm.isProgram = isProgram;\n vm.activityName = activityName;\n prepareTable();\n function prepareTable() {\n vm.tableCols = prepareTableCols();\n vm.learningReportListTable = new NgTableParams({}, {\n counts: [],\n getData: function() {\n var params = {};\n switch (mode){\n case 'workflow':\n params.mode = mode;\n params.batchId = batchId;\n break;\n }\n if(vm.isProgram) params.iscourse=0;\n return fileProcessService.getLearningReportList(enrollmentId, params).then(function(learningReport){\n vm.learningReport = learningReport;\n angular.forEach(vm.learningReport, function (val, key) {\n vm.learningReport[key].$index = key;\n });\n return learningReport ;\n });\n }\n });\n }\n\n function prepareTableCols() {\n return [{\n field: 'index',\n title: '#',\n getValue: ngTableColumnValueService.htmlTextValue,\n width: 50,\n priority: 1\n },{\n field: 'fileName',\n title: $filter('translate')('FIELD.FILE_NAME'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"\"),\n priority: 1\n },{\n field: 'submitDate',\n title: $filter('translate')('FIELD.DATE_OF_PAYMENT'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1\n },{\n field: 'fileSize',\n columnType: 'number',\n title: $filter('translate')('FIELD.SIZE'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"
    {{row.fileSize | suffixes: 'byte'}}
    \"),\n priority: 1\n },{\n field: 'score',\n title: $filter('translate')('FIELD.SCORE'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"\"\n ),\n priority: 1\n }];\n }\n\n vm.submit = function () {\n var params = {};\n params.iscourse = (vm.isProgram) ? 0 : 1;\n params.batchId = batchId;\n var data = [];\n angular.forEach(vm.learningReport, function (learningReport) {\n data.push({\n learningReportId: learningReport.learningReportId,\n score: learningReport.score\n })\n });\n\n function preConfirm() {\n return new Promise(function (resolve) {\n fileProcessService.learningReportSetScore(enrollmentId, { learningReportItems: data }, params).then(function (res) {\n if(res.status === 1) {\n SweetAlert.insertSuccessQueueStep('',$filter('translate')('MESSAGE.MSG_SUCCESSFUL_OPERATION'), false, $mdDialog.cancel());\n }else if(res.status === 0){\n SweetAlert.insertErrorQueueStep('',$filter('translate')('MESSAGE.MSG_FAILED_OPERATION') , false);\n }\n resolve();\n });\n });\n }\n\n SweetAlert.submitCheck('',$filter('translate')('MESSAGE.MSG_IS_CONTINUE'), preConfirm);\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }\n ],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose: true,\n locals: {\n mode: angular.isDefined(scope.mode) ? scope.mode : '',\n batchId: angular.isDefined(scope.batchId) ? scope.batchId : -1,\n enrollmentId: scope.enrollmentId,\n activityName: scope.activityName,\n isProgram: scope.isProgram,\n canEdit: angular.isDefined(scope.canEdit) ? scope.canEdit : false\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('learningReportListDialog', learningReportListDialog);\n})();\n\n/**\n * Created by Alan on 2016/12/27.\n */\n(function() {\n 'use strict';\n\n learningReportDialog.$inject = ['$mdDialog'];\n function learningReportDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n courseId: '=?',\n programId: '=?',\n activityName: '=?', //courseName or programName\n isProgram: '=?'\n },\n link: function(scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/learning-report-dialog.html',\n controller: ['$scope', '$mdDialog', 'NgTableParams', 'fileProcessService', 'courseResourceService', 'courseId', 'programId', 'isProgram', 'activityName',\n function($scope, $mdDialog, NgTableParams, fileProcessService, courseResourceService, courseId, programId, isProgram, activityName ) {\n var vm = this;\n vm.isProgram = isProgram;\n vm.activityName = activityName;\n\n if(vm.isProgram===1) {\n courseResourceService.getProgram(programId).then(function(program){\n vm.program = program;\n vm.programIncludeCourse = 0;\n $scope.$watch('$ctrl.programIncludeCourse', function(programIncludeCourse) {\n courseId = programIncludeCourse;\n vm.learningReportTable.reload();\n });\n });\n }\n vm.learningReportTable = new NgTableParams({ sorting: { 'LearningReport.SubmitDate': \"desc\" } }, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n var params = {};\n\n if(vm.isProgram===1) {\n params.programId = programId;\n params.courseId = courseId;\n }\n else {\n params.courseId = courseId;\n }\n\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc') ? \"DESC\" : \"ASC\");\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n return fileProcessService.getLearningReport(params).then(function(learningReport){\n tableParams.total(learningReport.metadata.pagination.total);\n return learningReport ;\n });\n }\n });\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }\n ],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose: true,\n locals: {\n courseId: scope.courseId,\n programId: scope.programId,\n activityName: scope.activityName,\n isProgram: scope.isProgram\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('learningReportDialog', learningReportDialog);\n})();\n\n/**\n * Created by Alan on 2016/11/25.\n */\n\n(function () {\n 'use strict';\n\n learningHistory.$inject = ['$mdDialog'];\n function learningHistory($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n enrollmentId: '=?',\n sessionId: '=?',\n isManager: '=?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/learning-history-dialog.html',\n controller: ['managerService', 'enrollmentId', 'sessionId', '$mdDialog', 'courseResourceService', 'fileProcessService',\n function (managerService, enrollmentId, sessionId, $mdDialog, courseResourceService, fileProcessService) {\n var vm = this;\n vm.sessionId = sessionId;\n vm.isManager = angular.isUndefinedOrNull(this.isManager) ? false : this.isManager;\n var learningHistoryService = (vm.isManager)? managerService.getMemberLearningHistory(enrollmentId) : courseResourceService.getLearningHistory(enrollmentId);\n learningHistoryService.then(function (learningHistory) {\n vm.learningHistory = learningHistory;\n vm.attendanceRecords = learningHistory.attendanceRecord;\n vm.learningHistoryItems = learningHistory.learningHistoryItem;\n });\n\n var reportProcessService = (vm.isManager)? managerService.getReportProcess(enrollmentId, {}) : fileProcessService.getReportProcess(enrollmentId, {});\n reportProcessService.then(function (report) {\n vm.report = report;\n });\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n enrollmentId: scope.enrollmentId,\n sessionId: scope.sessionId\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.manager')\n .directive('learningHistory', learningHistory);\n\n})();\n\n/**\n * Created by Alan on 2016/11/14.\n */\n(function () {\n 'use strict';\n\n instructorDetail.$inject = ['$mdDialog'];\n function instructorDetail($mdDialog) {\n\n var directive ={\n restrict: 'EA',\n scope: {\n instructorId:'='\n },\n link:function(scope,element){\n element.on('click', function (ev) {\n $mdDialog.show({\n multiple: true,\n templateUrl: 'app/modules/course-resource/views/instructor-detail.html',\n controller:'InstructorDetailController',\n controllerAs:'IDC',\n clickOutsideToClose:true,\n targetEvent: ev,\n locals:{\n instructorId:scope.instructorId\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n })\n }\n };\n return directive;\n }\n\n\n angular.module('eHRD.modules.courseResource')\n .directive('instructorDetail', instructorDetail);\n})();\n\n/**\n * Created by Bruce on 2016/12/8.\n */\n\n(function () {\n 'use strict';\n\n incompleteDynamicTemplate.$inject = [];\n function incompleteDynamicTemplate() {\n return {\n restrict: 'A',\n controller: ['$http', '$templateCache', '$interpolate', '$compile', '$scope', '$attrs', '$element', 'incompleteTemplates',\n function ($http, $templateCache, $interpolate, $compile, $scope, $attrs, $element, incompleteTemplates) {\n $scope.$watch($attrs.name, function(name) {\n var templateName = incompleteTemplates[name];\n if(angular.isUndefined($templateCache.get(templateName))){\n $http.get(templateName).then(function(response) {\n var templateContents = response.data\n .replace('{{', $interpolate.startSymbol())\n .replace('}}', $interpolate.endSymbol());\n $templateCache.put(templateName, templateContents);\n var template = $templateCache.get(templateName);\n $element.html(template);\n $compile($element.contents())($scope);\n });\n }else{\n var template = $templateCache.get(templateName);\n $element.html(template);\n $compile($element.contents())($scope);\n }\n\n });\n\n }]\n };\n }\n angular.module('eHRD.modules.courseResource')\n .directive('incompleteDynamicTemplate', incompleteDynamicTemplate);\n\n})();\n\n/**\n * Created by Bruce on 2017/2/3.\n */\n(function () {\n 'use strict';\n\n externalTrainingBulletinDetailedDialog.$inject = ['$mdDialog', '$document'];\n function externalTrainingBulletinDetailedDialog($mdDialog, $document) {\n var directive = {\n restrict: 'A',\n scope: {\n bulletinId: '=?',\n courseId: '=?',\n sessionId: '=?',\n isCourse: '=?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n parent: angular.element($document[0].body),\n templateUrl: 'app/modules/course-resource/views/external/external-training-bulletin-detailed-dialog.html',\n controller: ['externalTrainingService', '$mdDialog', 'isCourse', 'bulletinId', 'courseId', 'sessionId',\n function (externalTrainingService, $mdDialog, isCourse, bulletinId, courseId, sessionId) {\n var vm = this;\n if(angular.isDefined(isCourse) && isCourse){\n externalTrainingService.getExtCourseFormByCourseSession(courseId, sessionId).then(function (data) {\n vm.bulletinDetailed = data;\n });\n }else{\n externalTrainingService.getExtCourseFormByBulletin(bulletinId).then(function (data) {\n vm.bulletinDetailed = data;\n });\n }\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n }],\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n bulletinId: scope.bulletinId,\n courseId: scope.courseId,\n sessionId: scope.sessionId,\n isCourse: scope.isCourse\n },\n multiple: true,\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('externalTrainingBulletinDetailedDialog', externalTrainingBulletinDetailedDialog);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/1.\n */\n(function () {\n 'use strict';\n\n externalTrainingApplyFormViewDialog.$inject = ['$document', '$mdDialog'];\n function externalTrainingApplyFormViewDialog($document, $mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n formData : '=?',\n externalId: '=?externalId'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n parent: angular.element($document[0].body),\n template:\n '' +\n '' +\n '
    ' +\n '

    {{ \\'EXTERNAL_TRAINING_APPLY_FORM\\' | translate}}/{{ \\'FIELD.REQUISITION_NUMBER\\' | translate }}:{{$ctrl.formData.externalId}}

    ' +\n '' +\n '' +\n '{{ \\'ACTIONS.PRINT\\' | translate}}' +\n 'print' +\n '' +\n '' +\n '{{ \\'ACTIONS.CLOSE\\' | translate}}' +\n 'close' +\n '' +\n '
    ' +\n '
    ' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
    ',\n controller: [ 'userService', 'externalTrainingService', 'externalId', function (userService, externalTrainingService, externalId) {\n var vm = this;\n vm.externalId = angular.isDefined(externalId) ? externalId : undefined;\n\n if(angular.isDefined(vm.externalId)){\n externalTrainingService.getExtCourseForm(vm.externalId).then(function (formData) {\n vm.formData = formData;\n });\n }\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n locals:{\n formData: scope.formData,\n externalId: scope.externalId\n },\n clickOutsideToClose:true,\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('externalTrainingApplyFormViewDialog', externalTrainingApplyFormViewDialog);\n\n})();\n\n/**\n * Created by Bruce on 2017/2/21.\n */\n(function () {\n 'use strict';\n\n externalTrainingApplyFormPrintDialog.$inject = ['$window', 'serverSetting'];\n function externalTrainingApplyFormPrintDialog($window, serverSetting) {\n var directive = {\n restrict: 'A',\n scope: {\n formData : '=?'\n },\n link: function (scope, element) {\n element.bind('click', function() {\n if(angular.isDefined(scope.formData) && scope.formData.externalId > 0){\n var url = serverSetting.baseConfig.baseURL + '/home-external-print-form.do?id=' + scope.formData.externalId;\n $window.open(url, 'print', 'width=' + $window.innerWidth + ',height=' + $window.innerHeight + ',location=no');\n }\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('externalTrainingApplyFormPrintDialog', externalTrainingApplyFormPrintDialog);\n\n})();\n\n/**\n * Created by Alan on 2017/7/12.\n */\n(function () {\n 'use strict';\n\n externalCompanyInsertDialog.$inject = ['$mdDialog'];\n function externalCompanyInsertDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n isVendorsReload: '=?',\n addVendor: '=?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/external/external-company-insert-dialog.html',\n controller: ['$mdDialog', 'externalTrainingService', '$timeout', 'SweetAlert', '$filter', 'addVendor',\n function ($mdDialog, externalTrainingService, $timeout, SweetAlert, $filter, addVendor) {\n var vm = this;\n vm.form = \"\";\n vm.formData = {\n vendorName: '',\n vendorNumber: '',\n bankName: '',\n bankAccount: '',\n classificationId: '',\n vendorAddress: '',\n vendorTel: '',\n vendorFax: '',\n contact: [\n {\n fullName: '',\n phone: '',\n mobilePhone: '',\n mail: ''\n }\n ],\n introduction: '',\n url: '',\n vendorComment: '',\n receiverName: ''\n };\n\n vm.addContact = function() {\n vm.formData.contact.push({\n fullName: '',\n phone: '',\n mobilePhone: '',\n mail: ''\n });\n };\n\n vm.removeContact = function(contact) {\n vm.formData.contact.splice(vm.formData.contact.indexOf(contact), 1);\n };\n\n vm.submit = function(files) {\n vm.submitted = true;\n vm.form.$setSubmitted();\n $timeout(function() {\n if(vm.form.$valid) {\n var formData = {\n VendorName: vm.formData.vendorName,\n VendorNumber: vm.formData.vendorNumber,\n VendorAddress: vm.formData.vendorAddress,\n VendorTel: vm.formData.vendorTel,\n VendorFax: vm.formData.vendorFax,\n VendorURL: vm.formData.url,\n VendorComment: vm.formData.vendorComment,\n BankName: vm.formData.bankName,\n BankAccount: vm.formData.bankAccount,\n VendorIntroduction: vm.formData.introduction,\n ReceiverName: vm.formData.receiverName,\n ClassificationId: vm.formData.classificationId\n };\n var contactCount = 1;\n angular.forEach(vm.formData.contact, function(contact){\n if(contact.fullName!=='' || contact.phone!=='' || contact.mobilePhone!=='' || contact.mail!=='') {\n formData['personName_' + contactCount] = contact.fullName;\n formData['personPhone_' + contactCount] = contact.phone;\n formData['personMPhone_' + contactCount] = contact.mobilePhone;\n formData['personEmail_' + contactCount] = contact.mail;\n contactCount++;\n }\n });\n externalTrainingService.addVendor(formData, 'ref', files).then(function(result){\n if(angular.isDefined(addVendor))\n addVendor.push(result.data.data.vendorId);\n SweetAlert.confirmCallback('success', $filter('translate')('MESSAGE.MSG_YOU_HAVE_SUCCESSFULLY_ADDED_EXTERNAL_VENDOR'), '', function(){\n $mdDialog.cancel();\n });\n });\n }\n });\n\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n }],\n multiple: true,\n controllerAs: '$ctrl',\n clickOutsideToClose:true,\n targetEvent: ev,\n locals : {\n addVendor: scope.addVendor\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(null, function() {\n if(angular.isDefined(scope.isVendorsReload)) scope.isVendorsReload = true;\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('externalCompanyInsertDialog', externalCompanyInsertDialog);\n\n})();\n\n/**\n * Created by Bruce on 2016/12/13.\n */\n(function () {\n 'use strict';\n\n evaluationSurveyPlayer.$inject = [ '$window', '$interval', '$state'];\n function evaluationSurveyPlayer( $window, $interval, $state) {\n var directive = {\n restrict: 'A',\n scope: {\n enrollmentId:'=?',\n relationshipId: '=?',\n surveyId: '=?',\n isCheckTime:'@?',\n reloadFn:'&?'\n },\n link: function (scope, element) {\n scope.enrollmentId = angular.isUndefined(scope.enrollmentId) ? null : scope.enrollmentId;\n scope.isCheckTime = angular.isUndefined(scope.isCheckTime) ? false : scope.isCheckTime;\n\n element.bind('click', function() {\n var relationshipId = scope.relationshipId,\n surveyId = scope.surveyId;\n if(!angular.isUndefinedOrNull(scope.enrollmentId)){\n playWindowController(relationshipId, surveyId);\n }\n });\n\n\n function playWindowController(relationshipId, surveyId) {\n //var playUrl = serverSetting.baseConfig.baseURL + '/ev-survey-play.do?relationId='+ relationshipId +'&surveyId=' + surveyId + '&playMode=start&preview=false&targetName=Administrator%20CTMS';\n var playUrl = $state.href('evaluationSurvey', {relationId: relationshipId, surveyId: surveyId});\n var playerWindow = $window.open(playUrl, 'player', 'width=' + $window.innerWidth + ',height=' + $window.innerHeight + ',location=no, scrollbars=yes, resizable=yes');\n\n var checkTimer = $interval(checkPlayWindow, 500);\n\n function checkPlayWindow() {\n if(playerWindow.closed) {\n if(angular.isDefined(scope.reloadFn) && angular.isFunction(scope.reloadFn)) scope.reloadFn();\n $interval.cancel(checkTimer);\n }\n }\n }\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('evaluationSurveyPlayer', evaluationSurveyPlayer);\n\n})();\n\n/**\n * Created by Alan on 2016/2/6.\n */\n\n(function () {\n 'use strict';\n\n detailSessionListDialog.$inject = ['$mdDialog'];\n function detailSessionListDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n courseId: '=',\n isProgram: '=',\n reloadFn:'&?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/detail-session-list-dialog.html',\n controller: ['courseResourceService', '$mdDialog', 'courseId', 'isProgram',\n function (courseResourceService, $mdDialog, courseId, isProgram) {\n var vm = this;\n vm.courseId = courseId;\n vm.isProgram = isProgram;\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n courseId: scope.courseId,\n isProgram: scope.isProgram\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(null, function() {\n if(angular.isDefined(scope.reloadFn)) scope.reloadFn();\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('detailSessionListDialog', detailSessionListDialog);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/19.\n */\n\n(function () {\n 'use strict';\n\n courseTypeTag.$inject = [];\n function courseTypeTag() {\n var directive = {\n restrict: 'EA',\n templateUrl:'app/modules/course-resource/views/course-session-info-template/course-type-tag.html',\n scope: {\n courseType: '=?',\n isProgram: '=?',\n programType: '=?',\n isShowText:'=?',\n isShowClass: '=?'\n },\n controller: ['$scope', function ($scope) {\n $scope.courseType = angular.isDefined($scope.courseType) ? $scope.courseType : null;\n $scope.isProgram = angular.isDefined($scope.isProgram) ? $scope.isProgram : null;\n $scope.programType = angular.isDefined($scope.programType) ? $scope.programType : 0;\n $scope.isShowText = angular.isDefined($scope.isShowText) ? $scope.isShowText : true;\n $scope.isShowClass = angular.isDefined($scope.isShowClass) ? $scope.isShowClass : false;\n }]\n };\n return directive;\n }\n\nangular.module('eHRD.modules.courseResource')\n .directive('courseTypeTag', courseTypeTag);\n\n})();\n\n/**\n * Created by Bruce on 2016/10/26.\n */\n(function () {\n 'use strict';\n\n courseInfoSessionWillExpire.$inject = ['$mdDialog'];\n function courseInfoSessionWillExpire($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n enrollmentId: '=',\n courseType: '=',\n isCourse: '='\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/will-expire-list.html',\n controller: ['courseResourceService', '$mdDialog', 'enrollmentId', 'courseType', 'isCourse',\n function (courseResourceService, $mdDialog, enrollmentId, courseType, isCourse) {\n var vm = this;\n vm.courseType = courseType;\n courseResourceService.getEnrollmentWillExpire(enrollmentId, {}, isCourse).then(function (willExpireDatas) {\n vm.willExpireDatas = willExpireDatas;\n });\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n enrollmentId: scope.enrollmentId,\n courseType: scope.courseType,\n isCourse: scope.isCourse\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('courseInfoSessionWillExpire', courseInfoSessionWillExpire);\n\n})();\n\n/**\n * Created by Bruce on 2016/10/26.\n */\n(function () {\n 'use strict';\n\n courseInfoReference.$inject = ['ngDialog', 'courseResourceService'];\n function courseInfoReference(ngDialog, courseResourceService) {\n var directive = {\n restrict: 'A',\n scope: {\n courseId: '='\n },\n link: function (scope, element) {\n element.bind('click', function() {\n courseResourceService.setCourseId(scope.courseId);\n ngDialog.open({\n template: 'app/modules/course-resource/views/reference-list.html',\n className: 'ngdialog-theme-default',\n width: '70%',\n controller: 'CourseReferenceController',\n controllerAs: 'CRC'\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('courseInfoReference', courseInfoReference);\n\n})();\n\n/**\n * Created by Bruce on 2016/10/26.\n */\n(function () {\n 'use strict';\n\n courseInfoPlayer.$inject = [ '$window', 'serverSetting', '$interval', 'courseResourceService'];\n function courseInfoPlayer( $window, serverSetting, $interval, courseResourceService) {\n var directive = {\n restrict: 'A',\n scope: {\n playItemId: '=?',\n sessionId: '=?',\n courseId: '=?',\n enrollmentId:'=?',\n isCheckTime:'@?',\n reloadFn:'&?',\n playDisable: '=?'\n },\n link: function (scope, element) {\n if(angular.isDefined(scope.playDisable) && scope.playDisable) {\n return;\n }\n\n element.addClass('tree-label');\n\n scope.enrollmentId = angular.isUndefined(scope.enrollmentId) ? null : scope.enrollmentId;\n scope.isCheckTime = angular.isUndefined(scope.isCheckTime) ? false : scope.isCheckTime;\n element.bind('click', function() {\n var playItemId = scope.playItemId,\n sessionId = scope.sessionId,\n courseId = scope.courseId;\n if(!angular.isUndefinedOrNull(scope.enrollmentId)){\n courseResourceService.getCourseEnrollment(scope.enrollmentId, {}).then(function (enrollmentData) {\n playItemId = enrollmentData.lastLeaningItem.itemId;\n sessionId = enrollmentData.sessionId;\n playWindowController(playItemId, sessionId, courseId);\n });\n }else{\n playWindowController(playItemId, sessionId, courseId);\n }\n });\n\n function playWindowController(playItemId, sessionId, courseId) {\n var playUrl = serverSetting.baseConfig.baseURL + '/play-index-home.do?itemid='+ playItemId +'&TCMSCLASSID=' + sessionId;\n if(scope.isCheckTime && angular.isDefined(courseId)){\n playUrl = serverSetting.baseConfig.baseURL + '/play-check-time.do?courseId=' + courseId+ '&sessionId=' + sessionId + '&itemId=' + playItemId;\n }\n\n var playerWindow = $window.open(playUrl, 'player', 'width=' + $window.innerWidth + ',height=' + $window.innerHeight + ',location=no, scrollbars=yes, resizable=yes');\n\n var checkTimer = $interval(checkPlayWindow, 500);\n\n function checkPlayWindow() {\n if(playerWindow.closed) {\n if(angular.isDefined(scope.reloadFn) && angular.isFunction(scope.reloadFn)) scope.reloadFn();\n $interval.cancel(checkTimer);\n }\n }\n }\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('courseInfoPlayer', courseInfoPlayer);\n\n})();\n\n/**\n * Created by Alan on 2016/12/20.\n */\n\n(function () {\n 'use strict';\n\n courseDetailInfoDialog.$inject = ['$mdDialog', 'SweetAlert', '$filter'];\n function courseDetailInfoDialog($mdDialog, SweetAlert, $filter) {\n var directive = {\n restrict: 'A',\n scope: {\n courseId: '=?',\n isPublished: '=?',\n canView: '=?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n if(scope.isPublished===0)\n SweetAlert.warning('', $filter('translate')('MESSAGE.MSG_ERROR_NOT_PUBLISH'));\n else if(scope.canView===0)\n SweetAlert.warning('', $filter('translate')('MESSAGE.MSG_YOU_DO_NOT_HAVE_PERMISSION_TO_VIEW_THIS_LEARNING_ACTIVITY'));\n else {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/course-detail-info-dialog.html',\n controller: ['courseResourceService', '$mdDialog', 'courseId',\n function (courseResourceService, $mdDialog, courseId) {\n var vm = this;\n\n courseResourceService.getCourse(courseId, null).then(function (courseData) {\n vm.courseData = courseData;\n });\n\n courseResourceService.getCourseReference(courseId, {}).then(function (referenceData) {\n vm.referenceData = referenceData;\n });\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n }],\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n courseId: scope.courseId,\n isCourse: scope.isCourse\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n }\n });\n\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('courseDetailInfoDialog', courseDetailInfoDialog);\n\n})();\n\n/**\n * Created by Bruce on 2016/11/1.\n */\n(function() {\n 'use strict';\n\n assignableMembers.$inject = ['$mdDialog', '$document', '$filter'];\n\n function assignableMembers($mdDialog, $document, $filter) {\n var directive = {\n restrict: 'A',\n scope: {\n isProgram: '=?',\n sessionId: '=',\n courseId: '=?',\n sessionName: '=',\n isExternal: '=',\n reloadFn: '&?',\n maxAssignableMembers: '=?maxAssignableMembers',\n enrollType: '@?enrollType' // learner, wait\n },\n\n link: function(scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n controller: ['$scope', '$q', 'WizardHandler', '$timeout', '$mdDialog', 'sessionName', 'courseId', 'sessionId', 'isProgram', 'isExternal', 'maxAssignableMembers', 'enrollType', 'managerService', 'externalTrainingService', 'SweetAlert',\n function($scope, $q, WizardHandler, $timeout, $mdDialog, sessionName, courseId, sessionId, isProgram, isExternal, maxAssignableMembers, enrollType, managerService, externalTrainingService, SweetAlert) {\n var vm = this;\n vm.isExternal = isExternal;\n\n /*\n * Start: Default assignableForm setting\n * */\n vm.assignableForm = null;\n vm.assignable = {\n learnerType: 0,\n executeDate: new Date(),\n dueDateType: 0,\n dueDays: null,\n dueDate: null,\n message: ''\n };\n\n if(isExternal){\n externalTrainingService.getCurrencys().then(function (currencys) {\n vm.currencys = currencys;\n angular.forEach(currencys, function (currency) {\n if(currency.isBasic){\n vm.defaultCostCurrency = currency.currencyId;\n }\n });\n\n externalTrainingService.getExtCourseFormByCourseSession(courseId, sessionId).then(function (data) {\n vm.assignable['isForFree'] = data.isForFree;\n vm.assignable['course_cost_currency'] = data.enrollCost.course_cost_currency;\n vm.assignable['course_cost_amount'] = data.enrollCost.course_cost_amount;\n vm.assignable['course_converting_amount'] = data.enrollCost.course_converting_amount;\n vm.assignable['subsidyType'] = data.enrollCost.subsidyType;\n vm.assignable['subsidyPercentage'] = data.enrollCost.subsidyPercentage;\n vm.assignable['voucherType'] = data.enrollCost.voucherType;\n vm.assignable['payingDate'] = data.payingDate === \"\" ? new Date() : new Date(data.payingDate);\n\n vm.courseConvertingAmount = function () {\n var exchangeRate = angular.isDefined($filter('filterBy')(vm.currencys, ['currencyId'], vm.assignable['course_cost_currency'])) ? $filter('filterBy')(vm.currencys, ['currencyId'], vm.assignable['course_cost_currency'])[0].exchangeRate: 1;\n vm.assignable['course_converting_amount'] = $filter('number')(vm.assignable['course_cost_amount'] * exchangeRate, 2);\n }\n });\n });\n\n }\n /*\n * End: Default assignableForm setting\n * */\n\n\n vm.selectedPersons = [];\n vm.isDirectMembers = false;\n vm.filters = {};\n vm.filters.learningType = false;\n vm.filters.selectedPersons = [];\n\n /*\n * Start: search model-1 for select person\n * */\n var cachedQuery, lastSearch;\n var pendingSearch, cancelSearch = angular.noop;\n vm.selectPersonModel1 = [];\n\n vm.querySearch = function(criteria) {\n cachedQuery = cachedQuery || criteria;\n return managerService.getMembersByFilters(sessionId, {\n 'keyword': cachedQuery\n }, isProgram).then(function(members) {\n vm.showMutiMembers = [];\n angular.forEach(members, function(member) {\n if (!member.isGray) vm.showMutiMembers.push(member);\n });\n return vm.showMutiMembers;\n });\n };\n\n vm.delayedQuerySearch = function(criteria) {\n cachedQuery = criteria;\n if (!pendingSearch || !debounceSearch()) {\n cancelSearch();\n return pendingSearch = $q(function(resolve, reject) {\n cancelSearch = reject;\n $timeout(function() {\n resolve(vm.querySearch());\n refreshDebounce();\n }, Math.random() * 500, true)\n });\n }\n return pendingSearch;\n };\n\n function refreshDebounce() {\n lastSearch = 0;\n pendingSearch = null;\n cancelSearch = angular.noop;\n }\n\n // Debounce if querying faster than 300ms\n function debounceSearch() {\n var now = new Date().getMilliseconds();\n lastSearch = lastSearch || now;\n return ((now - lastSearch) < 300);\n }\n /*\n * End: search model-1 for select person\n * */\n\n /*\n * Start: search model-2 for select person\n * */\n vm.optionsToggle = function(member) {\n\n if (!$filter('getArrayObjectByKey')(vm.selectedPersons, 'userId', member.userId)) {\n vm.selectedPersons.push(member);\n vm.selectPersonModel1.push(member);\n } else {\n // Bind selectedPersons Model\n angular.forEach(vm.selectedPersons, function(data, idx) {\n if (angular.equals(data.userId, member.userId)) vm.selectedPersons.splice(idx, 1);\n });\n // Bind selectPersonModel1 Model\n angular.forEach(vm.selectPersonModel1, function(data, idx) {\n if (angular.equals(data.userId, member.userId)) vm.selectPersonModel1.splice(idx, 1);\n });\n }\n };\n\n $scope.$watch(function() {\n return vm.isDirectMembers;\n }, function(newVal) {\n if (newVal) {\n getDirectMembers()\n }\n }, true);\n\n $scope.$watch(function() {\n return vm.selectedPersons;\n }, function(newVal, oldVal) {\n if (!angular.equals(newVal, oldVal)) {\n getDirectMembers()\n }\n }, true);\n\n function getDirectMembers() {\n managerService.getDirectMembers(sessionId, {}, isProgram).then(function(members) {\n vm.members = members;\n vm.filters.showMembers = {};\n angular.forEach(members, function(member) {\n if ($filter('getArrayObjectByKey')(vm.selectedPersons, 'userId', member.userId)) vm.filters.showMembers[member.userId] = true;\n if (!$filter('getArrayObjectByKey')(vm.selectedPersons, 'userId', member.userId)) vm.filters.showMembers[member.userId] = false;\n if (member.isGray) vm.filters.showMembers[member.userId] = member.isGray;\n });\n });\n }\n /*\n * End: search model-2 for select person\n * */\n\n /*\n * Start: wizard step Controller\n * */\n vm.currentStep = 0;\n vm.formVerified = false;\n\n vm.wzBtn = {\n next: true,\n previous: false,\n finish: false\n };\n\n vm.canNext = function() {\n var isCanNext = false;\n if (vm.selectedPersons.length > 0) isCanNext = true;\n if (!isCanNext) SweetAlert.error(\"\", $filter('translate')('MESSAGE.MSG_PLEASE_SELECT_AT_LEAST_ONE_STUDENT'));\n if(maxAssignableMembers> 0 && vm.selectedPersons.length > maxAssignableMembers) {\n isCanNext = false;\n SweetAlert.error(\"\", $filter('translate')('MESSAGE.MSG_ASSIGN_EXCEED_MAX', {'value1': vm.selectedPersons.length, 'value2': maxAssignableMembers}));\n }\n return isCanNext;\n };\n\n vm.formValidation = function() {\n if (angular.isDefined(vm.assignableForm) && vm.assignableForm.$valid) return vm.assignableForm.$valid;\n else return false;\n };\n\n vm.assignableMembers = function() {\n if (angular.isDefined(vm.assignableForm) && vm.assignableForm.$valid) {\n var arr_memberIds = [];\n angular.forEach(vm.selectedPersons, function(member) {\n arr_memberIds.push(member.userId);\n });\n\n var params = {\n memberIds: arr_memberIds.toString(),\n message: vm.assignable.message,\n learnerType: vm.assignable.learnerType,\n executeDate: vm.assignable.executeDate,\n dueType: vm.assignable.dueDateType\n };\n if (vm.assignable.dueDateType === '1') params.dueDays = vm.assignable.dueDays;\n if (vm.assignable.dueDateType === '2') params.dueDate = moment(vm.assignable.dueDate).format(\"YYYY/MM/DD\");\n\n if(isExternal){\n params['isForFree'] = (vm.assignable['isForFree'] === 1) ? true : false;\n params['courseConvertingAmount'] = vm.assignable['course_converting_amount'].replace(/,/g , '') ;\n params['courseCostAmount'] = vm.assignable['course_cost_amount'];\n params['courseCostCurrency'] = vm.assignable['course_cost_currency'];\n params['subsidyType'] = vm.assignable['subsidyType'];\n params['subsidyPercentage'] = vm.assignable['subsidyPercentage'];\n params['payingDate'] = moment(vm.assignable['payingDate']).format(\"YYYY/MM/DD\") ;\n params['voucherType'] = vm.assignable['voucherType'];\n\n managerService.AssignableExternalCourse(sessionId, params).then(assignableProcess);\n }else {\n managerService.AssignablePrecheck(isProgram, sessionId, {memberIds: arr_memberIds.toString(), enrollType: enrollType}).then(function (res) {\n switch (res.statusCode){\n case 'OK':\n managerService.Assignable(isProgram, sessionId, params).then(assignableProcess);\n break;\n case 'OUT_OF_QUOTA':\n SweetAlert.error(\"\", $filter('translate')('MESSAGE.MSG_ASSIGN_EXCEED_MAX', {'value1': res.totalNum, 'value2': res.maxEnrollment}));\n break;\n }\n });\n }\n } else {\n vm.assignableForm.$setSubmitted();\n SweetAlert.error('', $filter('translate')('MESSAGE.MSG_THERE_ARE_OPTIONS_NOT_FILLED_OUT'));\n }\n\n function assignableProcess(res) {\n if (res.resultState === 0) {\n if (res.errorList.length > 0) {\n SweetAlert.warning('', $filter('translate')('MESSAGE.MSG_TAKES_TIME_ACTION') + res.errorList);\n } else {\n SweetAlert.success('', $filter('translate')('MESSAGE.MSG_TAKES_TIME_ACTION'));\n }\n } else if (res.resultState === 1) {\n if (res.preItems.length > 0) {\n var prerequisites = [];\n angular.forEach(res.preItems, function(preItem) {\n var userName = preItem.userName;\n angular.forEach(preItem.records, function(record) {\n prerequisites.push(userName + '/' + record.objectName)\n });\n });\n\n SweetAlert.warning($filter('translate')('MESSAGE.MSG_ERROR_NEED_FINISH_PREREQUISITE_ITEMS'), $filter('arrayToString')(prerequisites, '
    '));\n } else {\n SweetAlert.success('', $filter('translate')('MESSAGE.MSG_TAKES_TIME_ACTION'));\n }\n }\n $mdDialog.hide();\n }\n };\n\n vm.nextStep = function() {\n WizardHandler.wizard('assignable').next();\n vm.updateCurrentStep('next')\n };\n\n vm.previousStep = function() {\n WizardHandler.wizard('assignable').previous();\n vm.updateCurrentStep('previous');\n };\n\n vm.finishStep = function() {\n WizardHandler.wizard('assignable').finish();\n };\n\n vm.updateCurrentStep = function(type) {\n if (vm.canNext()) {\n switch (type) {\n case 'next':\n vm.currentStep = WizardHandler.wizard('assignable').currentStepNumber() + 1;\n break;\n case 'previous':\n vm.currentStep = WizardHandler.wizard('assignable').currentStepNumber() - 1;\n break;\n }\n }\n };\n\n $scope.$watch(function() {\n return vm.currentStep;\n }, function(newVal, oldVal) {\n if (!angular.equals(newVal, oldVal) && angular.isDefined(newVal)) {\n switch (newVal) {\n case 1:\n vm.wzBtn = {\n next: true,\n previous: false,\n finish: false\n };\n break;\n case 2:\n vm.wzBtn = {\n next: false,\n previous: true,\n finish: true\n };\n break;\n }\n }\n }, true);\n /*\n * END: wizard step Controller\n * */\n\n\n $scope.sessionName = sessionName;\n $scope.close = function() {\n $mdDialog.cancel();\n };\n\n }\n ],\n multiple: true,\n controllerAs: '$ctrl',\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/assignable-members.html',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose: true,\n locals: {\n isProgram: scope.isProgram,\n sessionId: scope.sessionId,\n courseId: scope.courseId,\n isExternal: scope.isExternal,\n sessionName: scope.sessionName,\n maxAssignableMembers: scope.maxAssignableMembers,\n enrollType: angular.isDefined(scope.enrollType) ? scope.enrollType : 'learner'\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function() {\n if (angular.isFunction(scope.reloadFn)) scope.reloadFn();\n }, function() {});\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.courseResource')\n .directive('assignableMembers', assignableMembers);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/27.\n */\n(function () {\n 'use strict';\n\n TestQuestionnaireController.$inject = ['questionnaireType', '$scope', '$state','$window', 'SweetAlert', 'testQuestionnaireService', '$queueFactory','$q','$timeout','$location', '$anchorScroll', '$filter'];\n function TestQuestionnaireController(questionnaireType, $scope, $state, $window, SweetAlert, testQuestionnaireService, $queueFactory,$q, $timeout,$location, $anchorScroll, $filter) {\n var vm = this;\n var sessionId,itemId ;\n var relationId,surveyId ; //evaluationSurvey\n vm.questionnaireType = questionnaireType;\n vm.timer; vm.pageView = '';vm.counttt = 0;\n $scope.$on('$stateChangeSuccess',function () {\n sessionId = $state.params.sessionId; itemId = $state.params.itemId;\n relationId = $state.params.relationId; surveyId = $state.params.surveyId; //evaluationSurvey\n vm.sessionId =sessionId;\n vm.itemId = itemId;\n vm.examHistoryId = '';\n vm.canExam = false;\n vm.canViewResult = false;\n if(questionnaireType==='testQuestionnaire') {\n testQuestionnaireService.getExamInfo(sessionId, {itemid: itemId}).then(function (examInfo) {\n vm.exam = examInfo;\n switch(examInfo.feedbackStyle){\n // case 3: case 4 :\n // if(examInfo.isOverMaxViewTimes > 0 || examInfo.canPlay === 0 ) vm.pageView = 'status';\n // else vm.pageView = 'start';\n // break;\n default:\n if(examInfo.isOverMaxViewTimes > 0 || examInfo.isNotAccessPeriod > 0 || examInfo.isNotValidReTest > 0 || examInfo.canPlay === 0 || examInfo.isNotFitAttedDance === 1){\n vm.pageView = 'status';\n } else{\n vm.pageView = 'start';\n }\n break;\n }\n });\n }\n else { //evaluationSurvey\n vm.pageView = 'start';\n var params = {\n relationId: relationId,\n surveyId: surveyId\n };\n getQuestions('', params);\n }\n });\n\n vm.startExam = function () {\n if(questionnaireType==='testQuestionnaire') {\n if (vm.exam.testSessionDuration === 0) vm.exam.sessionTime = 0;\n vm.timer = vm.exam.limitMins * 60 - vm.exam.testSessionDuration;\n\n testQuestionnaireService.getExamToken(sessionId, {itemid:itemId}).then(function (data) {\n vm.examHistoryId = data.examhistoryId;\n var params = {\n itemid: itemId,\n examhistoryId: vm.examHistoryId\n };\n getQuestions(sessionId, params);\n });\n }\n else{ //evaluationSurvey\n vm.pageView = 'form';\n }\n };\n\n var getQuestions = function(sessionId, params) {\n var pagination;\n testQuestionnaireService.getQuestions(sessionId, params, questionnaireType).then(function (questionnaireData) {\n vm.questionModel = {};\n vm.questions = questionnaireData;\n if(questionnaireType==='testQuestionnaire'){\n vm.pageView = 'form';\n pagination = questionnaireData.metadata.pagination;\n }\n else{ //evaluationSurvey\n var evSurveyInfo = questionnaireData.metadata.evSurveyInfo;\n vm.exam = {\n name: evSurveyInfo.surveyName,\n description: evSurveyInfo.description,\n targetName: evSurveyInfo.targetName,\n feedbackStyle: 3,\n feedbackType: 1,\n isOverMaxViewTimes: 1,\n isNotFitAttedDance: 0\n };\n pagination = {\n currentPage: 1,\n perPage: questionnaireData.metadata.evSurveyInfo.pageSize,\n total: questionnaireData.length\n };\n }\n vm.questionsPagination = pagination;\n vm.questionCurrentPage = 1;\n\n vm.questionModel = testQuestionnaireService.getQuestionModel(questionnaireData);\n\n });\n };\n\n vm.paginationChanged = function (params, type, index) {\n save(getAnswers(), vm.exam.feedbackType, false);\n switch (type){\n case 'index':\n vm.questionCurrentPage = Math.ceil(index/vm.questionsPagination.perPage);\n if(angular.isDefined(index)){\n $location.hash('question-'+ index);\n $anchorScroll();\n }\n break;\n }\n };\n\n vm.questionsChanged = function (questionId) {\n save(getAnswers(questionId), vm.exam.feedbackType, false);\n testQuestionnaireService.updateQuestionStatus(vm.questionModel, questionId);\n };\n\n var getAnswers = function (questionId) {\n questionId = angular.isUndefinedOrNull(questionId)?null:questionId;\n return testQuestionnaireService.getAnswers(vm.questionModel, vm.questions, questionId);\n };\n\n vm.questionPanelSelected = false;\n vm.selectQuestionPanel = function () {\n vm.questionPanelSelected = (!vm.questionPanelSelected);\n };\n\n vm.finishedExam = function () {\n testQuestionnaireService.finishedExam(vm.questionModel).then(function(){\n save(getAnswers(), vm.exam.feedbackType, true);\n });\n };\n\n vm.testAgain = function () {\n vm.pageView = '';\n testQuestionnaireService.getExamInfo(sessionId, {itemid: itemId}).then(function (examInfo) {\n vm.exam = examInfo;\n switch(examInfo.feedbackStyle){\n case 3: case 4 :\n if(examInfo.isOverMaxViewTimes > 0) vm.pageView = 'status';\n else vm.pageView = 'start';\n break;\n default:\n if(examInfo.isOverMaxViewTimes > 0 || examInfo.isNotAccessPeriod > 0 || examInfo.isNotValidReTest > 0 || examInfo.isNotFitAttedDance === 1){\n vm.pageView = 'status';\n } else{\n vm.pageView = 'start';\n }\n break;\n }\n });\n };\n\n vm.timerFinished = function () {\n SweetAlert.timeoutAlert(function() {\n vm.pageView = '';\n save(getAnswers(), vm.exam.feedbackType, true);\n }\n );\n };\n\n\n var save = function (answers, feedbackType, isFinished) {\n if(questionnaireType==='testQuestionnaire'){\n vm.exam.sessionTime = parseInt(vm.exam.sessionTime) + parseInt(vm.sessionTime.seconds);\n vm.timer = parseInt(vm.exam.limitMins * 60) - parseInt(vm.exam.sessionTime);\n $scope.$broadcast('timer-set-countdown', vm.timer);\n\n var assessment = testQuestionnaireService.getAssessment(sessionId);\n assessment.get().then(function () {\n testQuestionnaireService.putTestAnswerTime( assessment,\n {sessionTime: vm.exam.sessionTime, pageTime: vm.sessionTime.seconds},\n {itemid: itemId, examhistoryId: vm.examHistoryId});\n\n testQuestionnaireService.putTestAnswer(assessment, {answers: answers}, {itemid:itemId, examhistoryId: vm.examHistoryId}).then(function (response) {\n\n if(response.status === 1 && isFinished){\n testQuestionnaireService.putTestFinish(assessment, {itemid:itemId, examhistoryId: vm.examHistoryId}).then(function (response) {\n\n if(response.status === 1) {\n testQuestionnaireService.getExamInfo(sessionId, {itemid: itemId}).then(function (examInfo) {\n vm.exam = examInfo;\n if(vm.exam.feedbackType === 2){\n testQuestionnaireService.getExamResult(sessionId, {itemid:itemId, examhistoryId: vm.examHistoryId}).then(function (examResult) {\n vm.pageView = ( (examResult.isFeedbackAllowViewResult > 0) ? 'result' : 'status' );\n vm.examResult = examResult;\n vm.examResultPieChartData = [examResult.scored, examResult.wrong, examResult.waitGradeQue];\n vm.examResultPieChartLabels = [\n $filter('translate')('FIELD.GRADE_QUESTIONS'),\n $filter('translate')('FIELD.WRONG_QUESTIONS'),\n $filter('translate')('FIELD.NOT_YET_RATED')\n ];\n vm.examResultPieChartOptions = {\n responsive: false,\n maintainAspectRatio: true,\n cutoutPercentage: 0\n };\n });\n }else{\n vm.pageView = 'status';\n }\n });\n\n }\n });\n }\n });\n $scope.$broadcast('timer-start');\n });\n }\n else if(questionnaireType==='evaluationSurvey' && isFinished){\n var params = {\n relationId: relationId,\n surveyId: surveyId\n };\n var formData = [];\n var count = 0;\n angular.forEach(vm.questionModel, function(questionValue) {\n formData.push({\n questionId: questionValue.qId,\n questionType: questionValue.questionType,\n options: []\n });\n if(questionValue.questionType===3) {\n formData[count].options.push({\n optionId: vm.questions[count].questionOptions[0].optionId,\n optionType: vm.questions[count].questionOptions[0].optionType,\n text: questionValue.optionNumber\n });\n }\n else if(questionValue.questionType===5) {\n formData[count].options.push({\n optionId: vm.questions[count].questionOptions[questionValue.optionNumber-1].optionId,\n optionType: vm.questions[count].questionOptions[questionValue.optionNumber-1].optionType,\n text: ''\n });\n }\n else {\n angular.forEach(questionValue.optionNumber, function(optionValue) {\n formData[count].options.push({\n optionId: vm.questions[count].questionOptions[parseInt(optionValue-1)].optionId,\n optionType: vm.questions[count].questionOptions[parseInt(optionValue-1)].optionType,\n text: ''\n });\n if(vm.questions[count].questionOptions[parseInt(optionValue-1)].optionType===2){\n formData[count].options.text = questionValue.optionOtherValue;\n }\n });\n }\n\n count++;\n });\n\n testQuestionnaireService.putEvaluationSurveyAnswer(formData, params).then(function () {\n vm.pageView = 'status';\n\n });\n }\n };\n\n // listener Exam Form if Exit window or reload window call update function\n var onExit = function (/*event*/) {\n // save test function ,but you need use jquery ajax functions with sync setting\n // testQuestionnaireService.getAssessment2(sessionId)\n };\n $window.onbeforeunload = $window.onunload = onExit;\n\n }\n\n angular.module('eHRD.modules.courseResource')\n .controller('TestQuestionnaireController', TestQuestionnaireController);\n})();\n\n/**\r\n * Created by Alan on 2016/11/14.\r\n */\r\n(function() {\r\n 'use strict';\r\n\r\n InstructorDetailController.$inject = ['$mdDialog', 'instructorService', 'instructorId'];\r\n function InstructorDetailController($mdDialog, instructorService, instructorId) {\r\n var vm = this;\r\n\r\n instructorService.getInstructorDetail(instructorId).then(function (instructorDetail) {\r\n vm.instructorDetail = instructorDetail;\r\n });\r\n\r\n vm.close = function() {\r\n $mdDialog.cancel();\r\n };\r\n\r\n }\r\n\r\n angular\r\n .module('eHRD.modules.courseResource')\r\n .controller('InstructorDetailController', InstructorDetailController);\r\n\r\n})();\r\n\n/**\n * Created by Bruce on 2016/6/22.\n */\n(function () {\n 'use strict';\n\n CourseResourceController.$inject = ['$state', '$stateParams', 'courseResourceService', '$filter'];\n function CourseResourceController($state, $stateParams, courseResourceService, $filter) {\n var vm = this;\n var params = {};\n vm.getData = function(params) {\n vm.reloadParams=params;\n vm.categoryTreeId = ( angular.isUndefined($stateParams.id) ? 0 :$stateParams.id);\n courseResourceService.getCourseResource(vm.categoryTreeId, params).then(function (data) {\n vm.courseResourceDatas = data;\n vm.menulist = vm.courseResourceDatas.metadata.menulist;\n vm.pagination = vm.courseResourceDatas.metadata.pagination;\n vm.courseResourceBreadcrumb = $filter('stringToBreadcrumb')(vm.menulist, 'breadcrumb');\n $state.current._ncyBreadcrumbLabel = vm.courseResourceBreadcrumb;\n\n vm.courseResourceTitle = $filter('stringToBreadcrumb')(vm.menulist, 'text');\n\n angular.element(\"html, body\").animate({\n scrollTop: 0\n }, 10);\n });\n };\n\n vm.getData(params);\n\n }\n\n angular\n .module('eHRD.modules.courseResource')\n .controller('CourseResourceController', CourseResourceController)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/6/22.\n */\n(function () {\n 'use strict';\n\n CourseResourceMenuController.$inject = ['courseResourceService'];\n function CourseResourceMenuController(courseResourceService) {\n var vm = this;\n\n courseResourceService.getCourseResourceMenuNodes().then(function (data) {\n vm.menu = data;\n });\n\n }\n\n angular\n .module('eHRD.modules.courseResource')\n .controller('CourseResourceMenuController', CourseResourceMenuController)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/10/13.\n */\n\n(function () {\n 'use strict';\n\n CourseReferenceController.$inject = ['courseResourceService'];\n function CourseReferenceController( courseResourceService ) {\n var vm = this;\n courseResourceService.getCourseReference(courseResourceService.getCourseId(), {}).then(function (referenceDatas) {\n vm.referenceDatas = referenceDatas;\n });\n\n }\n\n angular.module('eHRD.modules.courseResource')\n .controller('CourseReferenceController', CourseReferenceController);\n\n})();\n\n/**\n * Created by Alan on 2017/4/19.\n */\n(function () {\n 'use strict';\n\n var SessionObject = {\n COURSE: 1,\n PROGRAM: 2\n };\n angular.module('eHRD.modules.courseResource')\n .constant('SessionObject',SessionObject);\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var questionType = {\n\n };\n angular.module('eHRD.modules.courseResource')\n .constant('questionType',questionType);\n})();\n\n/**\n * Created by Bruce on 2016/12/08.\n */\n(function () {\n 'use strict';\n\n var incompleteTemplates = {\n\n online: 'app/modules/course-resource/views/single-info-template/incomplete-course-type-online.html',\n classroom: 'app/modules/course-resource/views/single-info-template/incomplete-course-type-classroom.html',\n external: 'app/modules/course-resource/views/single-info-template/incomplete-course-type-external.html',\n online_test: 'app/modules/course-resource/views/single-info-template/incomplete-course-type-online-test.html',\n classroom_test: 'app/modules/course-resource/views/single-info-template/incomplete-course-type-classroom-test.html',\n survey: 'app/modules/course-resource/views/single-info-template/incomplete-course-type-survey.html',\n evaluation_survey: 'app/modules/course-resource/views/single-info-template/incomplete-evaluation-survey.html',\n program: 'app/modules/course-resource/views/single-info-template/incomplete-program-type-program.html',\n innercert: 'app/modules/course-resource/views/single-info-template/incomplete-program-type-innercert.html'\n\n };\n angular.module('eHRD.modules.courseResource')\n .constant('incompleteTemplates',incompleteTemplates);\n})();\n\n/**\n * Created by Bruce on 2016/11/18.\n */\n(function () {\n 'use strict';\n\n var CourseObject = {\n COURSETYPE_ONLINE: 1,\n COURSETYPE_CLASSROOM: 2,\n COURSETYPE_EXTERNAL: 3,\n COURSETYPE_ONLINE_TEST: 4,\n COURSETYPE_CLASSROOM_TEST: 5,\n COURSETYPE_SURVEY: 6,\n PROGRAMTYPE_PROGRAM: 0,\n PROGRAMTYPE_INNERCERT: 1,\n EVALUATION_SURVEY: 9\n };\n angular.module('eHRD.modules.courseResource')\n .constant('CourseObject',CourseObject);\n})();\n\n/**\n * Created by Alan on 2017/4/13.\n */\n(function () {\n 'use strict';\n\n var testQuestionnaire = {\n bindings: {\n sessionId: '=?',\n itemId: '=?',\n userId: '=?',\n questionnaireType: '=?'\n },\n templateUrl: 'app/modules/course-resource/views/test-questionnaire/test-questionnaire-component.html',\n controller: ['testQuestionnaireService', '$window', 'sitemapService', 'AuthStorage', function (testQuestionnaireService, $window,sitemapService ,AuthStorage) {\n var vm = this;\n vm.sessionId = angular.isUndefinedOrNull(this.sessionId)?null:this.sessionId;\n vm.itemId = angular.isUndefinedOrNull(this.itemId)?null:this.itemId;\n vm.questionnaireType = angular.isUndefinedOrNull(this.questionnaireType)?'testQuestionnaire':this.questionnaireType;\n vm.examHistoryId = '';\n vm.canExam = false;\n vm.canViewResult = false;\n vm.loadView = false;\n vm.buttonDisabled = false;\n\n\n //enter start or status\n testQuestionnaireService.getExamInfo(vm.sessionId, {itemid: vm.itemId}).then(function (examInfo) {\n vm.exam = examInfo;\n if(examInfo.isOverMaxViewTimes > 0 || examInfo.isNotAccessPeriod > 0 || examInfo.isNotValidReTest > 0 || examInfo.canPlay === 0 || examInfo.isNotFitAttedDance === 1){\n vm.pageView = 'status';\n } else{\n vm.pageView = 'start';\n }\n });\n\n vm.startExam = function () {\n vm.loadView = true;\n vm.buttonDisabled = true;\n testQuestionnaireService.getExamToken(vm.sessionId, {itemid:vm.itemId}).then(function (data) {\n vm.examHistoryId = data.examhistoryId;\n getQuestions();\n });\n };\n\n var getQuestions = function() {\n vm.params = {\n itemid: vm.itemId,\n examhistoryId: vm.examHistoryId\n };\n testQuestionnaireService.getQuestions(vm.sessionId, vm.params).then(function (questionnaireData) {\n vm.questionnaireData = questionnaireData;\n vm.questionsPagination = questionnaireData.metadata.pagination;\n vm.questionModel = testQuestionnaireService.getQuestionModel(questionnaireData);\n vm.pageView = 'form';\n });\n vm.loadView = false;\n };\n\n\n\n vm.testAgain = function () {\n testQuestionnaireService.getExamInfo(vm.sessionId, {itemid: vm.itemId}).then(function (examInfo) {\n vm.exam = examInfo;\n switch(examInfo.feedbackStyle){\n case 3: case 4 :\n vm.pageView = (examInfo.isOverMaxViewTimes > 0)?'status':'start';\n break;\n default:\n if(examInfo.isOverMaxViewTimes > 0 || examInfo.isNotAccessPeriod > 0 || examInfo.isNotValidReTest > 0 || examInfo.isNotFitAttedDance === 1){\n vm.pageView = 'status';\n } else{\n vm.pageView = 'start';\n }\n break;\n }\n });\n };\n\t \n\t vm.buttonDisabledFn = function() { \n\t\tvm.buttonDisabled = false; \n }; \n\n var testQuestionnaireRefersh = angular.isUndefined(AuthStorage.get(\"testQuestionnaireRefersh\")) ? false : AuthStorage.get(\"testQuestionnaireRefersh\");\n if (testQuestionnaireRefersh) {\n vm.startExam();\n }\n\n\n\n $window.onbeforeunload = $window.onunload;\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('testQuestionnaire', testQuestionnaire);\n})();\n\n/**\n * Created by Alan on 2017/4/13.\n */\n(function () {\n 'use strict';\n\n var testQuestionnaireStatus = {\n bindings: {\n exam: '=',\n examResult: '='\n },\n templateUrl: 'app/modules/course-resource/views/test-questionnaire/test-questionnaire-status-component.html',\n controller: [function () {\n var vm = this;\n vm.exam = this.exam;\n vm.examResult = this.examResult;\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('testQuestionnaireStatus', testQuestionnaireStatus);\n})();\n\n/**\n * Created by Alan on 2017/4/13.\n */\n(function () {\n 'use strict';\n\n var testQuestionnaireStart = {\n bindings: {\n exam: '=',\n startFn: '&',\n questionnaireType: '@?',\n buttonDisabled: '='\n },\n templateUrl: 'app/modules/course-resource/views/test-questionnaire/test-questionnaire-start-component.html',\n controller: [function () {\n var vm = this;\n vm.exam = this.exam;\n vm.startFn = this.startFn;\n vm.questionnaireType = angular.isUndefinedOrNull(this.questionnaireType)?'testQuestionnaire':this.questionnaireType;\n vm.buttonDisabled = angular.isUndefinedOrNull(this.buttonDisabled) ? false :this.buttonDisabled;\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('testQuestionnaireStart', testQuestionnaireStart);\n})();\n\n/**\n * Created by Alan on 2017/4/13.\n */\n(function () {\n 'use strict';\n\n var testQuestionnaireResult = {\n bindings: {\n sessionId: '=',\n exam: '=',\n examResult: '=',\n params: '=', // itemid(=), examhistoryId(=), userId(?)\n testAgain: '&?'\n },\n templateUrl: 'app/modules/course-resource/views/test-questionnaire/test-questionnaire-result-component.html',\n controller: ['testQuestionnaireService', 'managerService', '$scope', '$location', '$anchorScroll', '$filter',\n function (testQuestionnaireService, managerService, $scope,$location, $anchorScroll, $filter) {\n var vm = this;\n vm.sessionId = this.sessionId;\n vm.exam = this.exam;\n vm.params = this.params;\n vm.isFunction = 0;\n //test again function\n if(angular.isFunction(this.testAgain)) {\n vm.isFunction = 1;\n }\n vm.showInCorrect = -1;\n vm.examResultPieChartLabels = [\n $filter('translate')('FIELD.GRADE_QUESTIONS'),\n $filter('translate')('FIELD.WRONG_QUESTIONS'),\n $filter('translate')('FIELD.NOT_YET_RATED')\n ];\n vm.examResultPieChartOptions = {\n responsive: false,\n maintainAspectRatio: true,\n cutoutPercentage: 0\n };\n $scope.$on('$viewContentLoaded',function () {\n $location.hash('result');\n $anchorScroll();\n });\n\n $scope.$watch(function() {\n return vm.examResult;\n }, function() {\n if(angular.isDefined(vm.examResult)) {\n vm.examResultPieChartData = [vm.examResult.scored, vm.examResult.wrong, vm.examResult.waitGradeQue];\n vm.getExamQuestionsReview(vm.params, -1);\n }\n });\n\n vm.openImage = function(imgUrl) {\n $window.open(imgUrl, 'QImag', 'width=' + $window.innerWidth*2/3 + ',height=' + $window.innerHeight*2/3 + ',location=no, scrollbars=yes, resizable=yes');\n };\n\n vm.getExamQuestionsReview = function(params, showInCorrect) {\n vm.showInCorrect = showInCorrect;\n params['show-incorrect'] = showInCorrect;\n var getExamQuestionsReview = (angular.isUndefinedOrNull(params.userId))\n ?testQuestionnaireService.getExamQuestionsReview(vm.sessionId, params)\n :managerService.getExamQuestionsReview(vm.sessionId, params);\n\n getExamQuestionsReview.then(function (examReviewQuestionsDatas) {\n vm.examReviewQuestionsDatas = (showInCorrect===-1)?[]:examReviewQuestionsDatas;\n vm.questionModel = testQuestionnaireService.getQuestionModel(examReviewQuestionsDatas);\n });\n };\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('testQuestionnaireResult', testQuestionnaireResult);\n})();\n\n/**\n * Created by Alan on 2017/4/13.\n */\n(function () {\n 'use strict';\n\n var testQuestionnaireForm = {\n bindings: {\n exam: '=',\n relationId: '=?', //evaluationSurvey\n surveyId: '=?', //evaluationSurvey\n sessionId: '=?',\n itemId: '=?',\n examHistoryId: '=?',\n questionModel: '=',\n questionnaireData: '=',\n questionsPagination: '=',\n questionCurrentPage: '=?',\n questionnaireType: '@?',\n pageView: '=?',\n isPageFooter: '=?',\n examResult: '=?',\n buttonDisabledFn: '&?'\n },\n templateUrl: 'app/modules/course-resource/views/test-questionnaire/test-questionnaire-form-component.html',\n controller: ['$scope', 'testQuestionnaireService', '$location', '$anchorScroll', 'SweetAlert', '$window', 'AuthStorage',\n function ($scope, testQuestionnaireService, $location, $anchorScroll, SweetAlert, $window, AuthStorage) {\n var vm = this;\n vm.exam = this.exam;\n vm.questionModel = this.questionModel;\n vm.questions = this.questionnaireData;\n vm.questionsPagination = this.questionsPagination;\n vm.relationId = angular.isUndefinedOrNull(this.relationId)?null:this.relationId;//evaluationSurvey\n vm.surveyId = angular.isUndefinedOrNull(this.surveyId)?null:this.surveyId;//evaluationSurvey\n vm.sessionId = angular.isUndefinedOrNull(this.sessionId)?null:this.sessionId;\n vm.itemId = angular.isUndefinedOrNull(this.itemId)?null:this.itemId;\n vm.examHistoryId = angular.isUndefinedOrNull(this.examHistoryId)?null:this.examHistoryId;\n vm.questionnaireType = angular.isUndefinedOrNull(this.questionnaireType)?'testQuestionnaire':this.questionnaireType;\n vm.isPageFooter = angular.isUndefinedOrNull(this.isPageFooter)?true:this.isPageFooter;\n vm.examResult = angular.isUndefinedOrNull(this.examResult)?true:this.examResult;\n vm.pageView = this.pageView;\n vm.questionCurrentPage = 1;\n vm.buttonDisabledFn = angular.isUndefined(this.buttonDisabledFn) ? null : this.buttonDisabledFn;\n if(angular.isFunction(vm.buttonDisabledFn)) {\n vm.buttonDisabledFn();\n }\n //timer\n if (vm.exam.testSessionDuration === 0)\n vm.exam.sessionTime = 0;\n vm.timer = vm.exam.limitMins * 60 - vm.exam.testSessionDuration;\n\n\n vm.questionPanelSelected = false;\n vm.selectQuestionPanel = function () {\n vm.questionPanelSelected = (!vm.questionPanelSelected);\n };\n\n // refersh test questionnaire\n var testQuestionnaireRefersh = angular.isUndefined(AuthStorage.get(\"testQuestionnaireRefersh\")) ? false : AuthStorage.get(\"testQuestionnaireRefersh\");\n if (testQuestionnaireRefersh) {\n jumpQuestionFinishedExam(vm.questions.length);\n }\n function jumpQuestionFinishedExam (index) {\n vm.questionCurrentPage = Math.ceil(index/vm.questionsPagination.perPage);\n if(angular.isDefined(index)){\n $location.hash('question-'+ index);\n $anchorScroll();\n AuthStorage.remove(\"testQuestionnaireRefersh\");\n testQuestionnaireService.finishedExam(vm.questionModel, vm.exam.feedbackStyle).then(function(){\n if(vm.questionnaireType==='testQuestionnaire')\n save(getAnswers(), vm.exam.feedbackType, true);\n else\n evaluationSurvey();\n });\n }\n }\n\n vm.paginationChanged = function (params, type, index) {\n switch (type){\n case 'index':\n vm.questionCurrentPage = Math.ceil(index/vm.questionsPagination.perPage);\n if(angular.isDefined(index)){\n $location.hash('question-'+ index);\n $anchorScroll();\n }\n break;\n case 'pagination':\n if(vm.questionnaireType==='testQuestionnaire')\n save(getAnswers(), vm.exam.feedbackType, false);\n break;\n }\n };\n\n vm.questionsChanged = function (questionId) {\n if(vm.questionnaireType==='testQuestionnaire')\n save(getAnswers(questionId), vm.exam.feedbackType, false);\n testQuestionnaireService.updateQuestionStatus(vm.questionModel, questionId);\n };\n\n var getAnswers = function (questionId) {\n questionId = angular.isUndefinedOrNull(questionId)?null:questionId;\n return testQuestionnaireService.getAnswers(vm.questionModel, vm.questions, questionId);\n };\n\n vm.finishedExam = function () {\n testQuestionnaireService.finishedExam(vm.questionModel, vm.exam.feedbackStyle).then(function(){\n if(vm.questionnaireType==='testQuestionnaire')\n save(getAnswers(), vm.exam.feedbackType, true);\n else\n evaluationSurvey();\n });\n };\n\n vm.timerFinished = function () {\n SweetAlert.timeoutAlert(function() {\n if(vm.questionnaireType==='testQuestionnaire')\n save(getAnswers(), vm.exam.feedbackType, true);\n });\n };\n\n var save = function (answers, feedbackType, isFinished) {\n vm.exam.sessionTime = parseInt(vm.exam.sessionTime) + parseInt(vm.sessionTime.seconds);\n vm.timer = vm.timer - parseInt(vm.sessionTime.seconds);\n $scope.$broadcast('timer-set-countdown', vm.timer);\n\n var assessment = testQuestionnaireService.getAssessment(vm.sessionId);\n assessment.get().then(function () {\n testQuestionnaireService.putTestAnswerTime( assessment,\n {sessionTime: vm.exam.sessionTime, pageTime: vm.sessionTime.seconds},\n {itemid: vm.itemId, examhistoryId: vm.examHistoryId});\n\n testQuestionnaireService.putTestAnswer(assessment, {answers: answers}, {itemid: vm.itemId, examhistoryId: vm.examHistoryId}).then(function (response) {\n if(response.status === 1 && isFinished){\n testQuestionnaireService.putTestFinish(assessment, {itemid: vm.itemId, examhistoryId: vm.examHistoryId}).then(function (response) {\n\n if(response.status === 1) {\n testQuestionnaireService.getExamInfo(vm.sessionId, {itemid: vm.itemId}).then(function (examInfo) {\n vm.exam = examInfo;\n if(vm.exam.feedbackType === 2){\n testQuestionnaireService.getExamResult(vm.sessionId, {itemid: vm.itemId, examhistoryId: vm.examHistoryId}).then(function (examResult) {\n vm.pageView = ( (examResult.isFeedbackAllowViewResult > 0) ? 'result' : 'status' );\n vm.examResult = examResult;\n });\n }else{\n vm.pageView = 'status';\n }\n });\n\n }\n });\n } else {\n $scope.$broadcast('timer-start');\n }\n });\n });\n };\n\n function evaluationSurvey() {\n var params = {\n relationId: vm.relationId,\n surveyId: vm.surveyId\n };\n var formData = [];\n var count = 0;\n angular.forEach(vm.questionModel, function(questionValue) {\n formData.push({\n questionId: questionValue.qId,\n questionType: questionValue.questionType,\n options: []\n });\n if(questionValue.questionType===3) {\n formData[count].options.push({\n optionId: vm.questions[count].questionOptions[0].optionId,\n optionType: vm.questions[count].questionOptions[0].optionType,\n text: questionValue.optionNumber\n });\n }\n else if(questionValue.questionType===5) {\n formData[count].options.push({\n optionId: vm.questions[count].questionOptions[questionValue.optionNumber-1].optionId,\n optionType: vm.questions[count].questionOptions[questionValue.optionNumber-1].optionType,\n text: ''\n });\n }\n else {\n angular.forEach(questionValue.optionNumber, function(optionValue) {\n formData[count].options.push({\n optionId: vm.questions[count].questionOptions[parseInt(optionValue-1)].optionId,\n optionType: vm.questions[count].questionOptions[parseInt(optionValue-1)].optionType,\n text: ''\n });\n if(vm.questions[count].questionOptions[parseInt(optionValue-1)].optionType===2){\n formData[count].options.text = questionValue.optionOtherValue;\n }\n });\n }\n\n count++;\n });\n\n testQuestionnaireService.putEvaluationSurveyAnswer(formData, params).then(function () {\n vm.pageView = 'status';\n\n });\n }\n\n var onExit = function (/*event*/) {\n var params ={\n sessionId: vm.sessionId,\n itemId: vm.itemId,\n examHistoryId: vm.examHistoryId\n };\n var data = {\n pageTime: vm.sessionTime.seconds,\n sessionTime: parseInt(vm.exam.sessionTime) + parseInt(vm.sessionTime.seconds)\n };\n testQuestionnaireService.putAjaxTestAnswerTime(params, data);\n };\n\n $window.onbeforeunload = onExit;\n\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('testQuestionnaireForm', testQuestionnaireForm);\n})();\n\n/**\n * Created by Bruce on 2017/1/17.\n */\n(function () {\n 'use strict';\n\n var showStatus = {\n bindings: {\n status: '=?status',\n statusType: '@?statusType'\n },\n template: '{{ \"STATUS.\"+$ctrl.status | translate}}',\n controller:['$scope', '$filter', function ($scope, $filter) {\n var vm = this;\n vm.status = angular.isDefined(this.status) ? this.status : undefined;\n vm.statusType = angular.isDefined(this.statusType) ? this.statusType : undefined;\n\n if(angular.isDefined(vm.statusType)){\n switch (vm.statusType){\n case 'enroll':\n vm.status = $filter('uppercase')(vm.status);\n break;\n case 'externalTrainingRecordsApprove':\n switch (vm.status){\n case 0:\n vm.status = $filter('uppercase')('NO_APPROVAL');\n break;\n case 1:\n vm.status = $filter('uppercase')('APPROVALED');\n break;\n case 2:\n vm.status = $filter('uppercase')('NOT_YET_APPROVAL');\n break;\n case 3:\n vm.status = $filter('uppercase')('REJECTED');\n break;\n case 4:\n vm.status = $filter('uppercase')('CANCEL');\n break;\n }\n break;\n }\n }\n\n // $scope.$watch(function () {\n // return vm.status;\n // },function (newVal) {\n // if(angular.isDefined(newVal)){\n //\n // }\n // },true);\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('showStatus', showStatus);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var programSessionInfo = {\n bindings: {\n catalogId: '=?',\n programId: '=?',\n backState: '=?',\n enrollmentId: '=?',\n nodeId: '=?',\n isUser: '=?' //mail link use\n },\n templateUrl: 'app/modules/course-resource/views/program-session-info.html',\n controller: ['$filter', '$stateParams', 'courseResourceService', 'SessionObject', function( $filter, $stateParams, courseResourceService, SessionObject ){\n var vm = this;\n vm.SessionObject = SessionObject;\n var catalogId = angular.isDefined(this.catalogId) ? this.catalogId: null;\n var programId = angular.isDefined(this.programId) ? this.programId: null;\n var nodeId = angular.isDefined(this.nodeId) ? this.nodeId: null;\n var backState = angular.isDefined(this.backState) ? this.backState: null;\n vm.enrollmentId = angular.isDefined(this.enrollmentId) ? this.enrollmentId: null;\n vm.isUser = angular.isDefined(this.isUser) ? this.isUser: null;\n\n if(!angular.isUndefinedOrNull(catalogId) && !angular.isUndefinedOrNull(programId)){\n if(angular.isDefined(backState)){\n vm.goBack={\n title: $filter('translate')('FIELD.COURSE_INFO'),\n state: backState,\n stateParams:{\n cid: catalogId, programId: programId, nid: nodeId\n }\n };\n }\n }\n\n var params = {};\n vm.getProgramData = function () {\n courseResourceService.getProgramEnrollment(vm.enrollmentId, params).then(function (enrollmentData) {\n vm.enrollmentData = enrollmentData;\n courseResourceService.getProgram(enrollmentData.programId, params).then(function (programData) {\n vm.programData = programData;\n });\n courseResourceService.getProgramSessionLearnersCompletionRate(enrollmentData.sessionId,{}).then(function (courseSessionLearnersCompletionRateData) {\n vm.completionRateData = courseSessionLearnersCompletionRateData;\n });\n\n courseResourceService.getLearningResult(enrollmentData.enrollmentId, true).then(function (learningResult) {\n vm.learningResult = learningResult;\n });\n\n courseResourceService.getProgramSession(enrollmentData.sessionId, params).then(function (sessionData) {\n vm.sessionData = sessionData;\n });\n });\n };\n vm.getProgramData();\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('programSessionInfo', programSessionInfo);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var programInfo = {\n bindings: {\n catalogId: '=?catalogId',\n programId: '=?programId',\n nodeId: '=?nodeId'\n },\n templateUrl: 'app/modules/course-resource/views/program-info.html',\n controller: ['$state', '$filter', '$stateParams', 'courseResourceService', 'sitemapService', function( $state, $filter, $stateParams, courseResourceService, sitemapService ){\n var vm = this;\n var programId = angular.isDefined(this.programId) ? this.programId : undefined;\n\n var params = {};\n vm.getProgramData = function () {\n courseResourceService.getProgram(programId, params).then(function (programData) {\n vm.programData = programData;\n vm.catalogId = angular.isDefined($stateParams.catalogId) ? $stateParams.catalogId : angular.isDefined($stateParams.cid) ? $stateParams.cid : undefined;\n if(angular.isDefined(vm.catalogId)){\n courseResourceService.getCourseResourceCatalogMenu(vm.catalogId).then(function (menuList) {\n var breadcrumbLabel = vm.programData.programName;\n\n sitemapService.getSiteMapNodes().walk(function (node) {\n if(angular.isDefined(node.model.stateParams) && angular.isDefined(node.model.stateParams['mid']) && (node.model.stateParams['mid'] === $state.params['mid'])){\n if(menuList.length > 0 && parseInt(menuList[0].id) === parseInt(node.model.stateParams['cid'])){\n menuList[0].title = node.model.title;\n }\n } else {\n if(angular.isUndefinedOrNull(vm.mainMenu) && node.model.state === 'courseResourceCatalog') {\n if(node.model.stateParams['cid'] === null || node.model.stateParams['cid'] === vm.catalogId){\n if(menuList.length > 0 && menuList[0].id === node.model.stateParams['cid']){\n menuList[0].title = node.model.title;\n }\n }\n }\n }\n });\n vm.courseResourceBreadcrumb = $filter('stringToBreadcrumb')(menuList, 'sitemap-breadcrumb', breadcrumbLabel);\n $state.current._ncyBreadcrumbLabel = vm.courseResourceBreadcrumb;\n });\n\n if(angular.isDefined($stateParams.backState)){\n vm.goBack={\n title: $filter('translate')('FIELD.COURSE_FOLDER'),\n state:$stateParams.backState,\n stateParams:{cid: vm.catalogId, nid: vm.nodeId}\n };\n }\n }\n });\n\n };\n\n if(angular.isDefined(programId)){\n vm.getProgramData();\n }\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('programInfo', programInfo);\n})();\n\n/**\n * Created by Bruce on 2016/10/24.\n */\n(function () {\n 'use strict';\n\n var programDetailLessonsResults = {\n bindings: {\n enrollmentData: '=',\n data: '=',\n reloadFn: '&?'\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/program-detail-lessons-results.html',\n controller: ['$scope', 'NgTableParams', function($scope, NgTableParams){\n var vm = this;\n vm.data = angular.isUndefined(this.data) ? null : this.data;\n vm.enrollmentData = angular.isUndefined(this.enrollmentData) ? null : this.enrollmentData;\n var watchData = $scope.$watch(function () {\n return vm.data;\n },function (newVal) {\n if(!angular.isUndefinedOrNull(newVal)){\n vm.total_credits = 0;\n angular.forEach(vm.data, function (data) {\n vm.total_credits += data.credits;\n });\n\n vm.lessonsResultsTable = new NgTableParams({}, {\n counts: [],\n getData: function(tableParams) {\n tableParams.total(vm.data.length);\n return vm.data;\n }\n });\n watchData();\n }\n });\n\n var watchEnrollmentData = $scope.$watch(function () {\n return vm.enrollmentData;\n },function (newVal) {\n if(!angular.isUndefinedOrNull(newVal)){\n vm.enrollmentData = newVal;\n watchEnrollmentData();\n }\n });\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('programDetailLessonsResults', programDetailLessonsResults);\n})();\n\n/**\n * Created by Bruce on 2016/10/24.\n */\n(function () {\n 'use strict';\n\n var programDetailLessonsList = {\n bindings: {\n data: '=',\n reloadFn: '&?',\n enrollmentId: '=?'\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/program-detail-lessons-list.html',\n controller: [function(){\n var vm = this;\n vm.data = angular.isUndefined(this.data) ? null : this.data;\n vm.enrollmentId = angular.isUndefined(this.enrollmentId) ? null : this.enrollmentId;\n\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('programDetailLessonsList', programDetailLessonsList);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var programDetailInfo = {\n bindings: {\n data: '='\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/program-detail-info.html',\n controller: [function( ){\n var vm = this;\n vm.data = angular.isUndefined(this.data) ? null : this.data;\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('programDetailInfo', programDetailInfo);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var programDetailEnrollment = {\n bindings: {\n data: '=',\n sessionData: '=',\n enrollmentData: '=',\n reloadFn:'&?'\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/program-detail-enrollment.html',\n controller: [function(){\n var vm = this;\n vm.data = angular.isUndefined(this.data) ? null : this.data;\n vm.sessionData = angular.isUndefined(this.sessionData) ? null : this.sessionData;\n vm.enrollmentData = angular.isUndefined(this.enrollmentData) ? null : this.enrollmentData;\n vm.reloadFn = angular.isUndefined(this.reloadFn) ? null : this.reloadFn;\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('programDetailEnrollment', programDetailEnrollment);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var programDetailEnrollmentLearningReport = {\n bindings: {\n enrollmentData: '=',\n sessionData: '='\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/program-detail-enrollment-learning-report.html',\n controller: ['$scope', '$filter', 'SweetAlert', 'fileProcessService', 'CourseObject', function( $scope, $filter, SweetAlert, fileProcessService, CourseObject ){\n var vm = this;\n vm.CourseObject = CourseObject;\n vm.enrollmentData = angular.isUndefined(this.enrollmentData) ? null : this.enrollmentData;\n vm.sessionData = angular.isUndefined(this.sessionData) ? null : this.sessionData;\n var formData = [\n {'isCourse': 2},\n {'packageId':vm.enrollmentData.enrollmentId},\n {'enrollmentId': vm.enrollmentData.enrollmentId}\n ];\n var uploader = $scope.uploader = fileProcessService.learningReportUpload(vm.enrollmentData.enrollmentId, formData);\n\n uploader.onErrorItem = function(/*fileItem, response, status, headers*/) {\n\n };\n uploader.onCompleteAll = function () {\n vm.learningReportUploadAction('confirm-temp', 2);\n };\n\n vm.getLearningReportList = function () {\n fileProcessService.getLearningReportList(vm.enrollmentData.enrollmentId, {iscourse: 2}).then(function (LearningReportDatas) {\n vm.learningReportData = LearningReportDatas;\n vm.learningReportData.paid = 0;\n vm.learningReportFileReplace = {};\n angular.forEach(LearningReportDatas, function (data) {\n if(data.appState === 1){\n vm.learningReportData.paid += 1;\n\n var formData = [\n {'isCourse': 2},\n {'packageId':vm.enrollmentData.enrollmentId},\n {'enrollmentId': vm.enrollmentData.enrollmentId},\n {'reportId': data.learningReportId},\n {'op': 'replace'}\n ];\n vm.learningReportFileReplace[data.learningReportId] = fileProcessService.learningReportUpload(vm.enrollmentData.enrollmentId, formData, true);\n\n vm.learningReportFileReplace[data.learningReportId].onCompleteAll = function () {\n vm.getLearningReportList();\n };\n }\n });\n });\n };\n\n vm.getLearningReportList();\n\n vm.learningReportUploadAction = function (actionType, isCourse, reportId) {\n var fileParams = {};\n fileParams.iscourse = (angular.isDefined(isCourse) ? isCourse : 2);\n fileParams.reportid = (angular.isDefined(reportId) ? reportId : 0);\n\n switch(actionType){\n case 'cancelrow':\n\n var text = $filter('translate')('MESSAGE.MSG_THIS_ACTION_WILL_RELEVANT_STUDY_REPORT') + ','\n + $filter('translate')('MESSAGE.MSG_IS_CONTINUE');\n\n SweetAlert.check('', text, 'warning', function() {\n _learningReportUploadAction();\n });\n\n break;\n default:\n _learningReportUploadAction();\n break;\n\n }\n function _learningReportUploadAction(){\n fileProcessService.learningReportUploadAction(vm.enrollmentData.enrollmentId, actionType, fileParams).then(function () {\n vm.getLearningReportList();\n });\n }\n };\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('programDetailEnrollmentLearningReport', programDetailEnrollmentLearningReport);\n})();\n\n/**\n * Created by Bruce on 2016/11/21.\n */\n(function () {\n 'use strict';\n\n var programDetailContainLessons = {\n bindings: {\n data: '=',\n sessionType: '='\n },\n templateUrl:'app/modules/course-resource/views/course-session-info-template/program-detail-contain-lessons.html',\n controller: ['$scope', 'NgTableParams', '$filter', function( $scope, NgTableParams, $filter) {\n var vm = this;\n vm.data = angular.isUndefined(this.data) ? null : this.data;\n $scope.$watch(function () {\n return vm.data;\n }, function (newVal) {\n if(!angular.isUndefinedOrNull(newVal)){\n vm.filterData = $filter('filter')(newVal, {sessionType: vm.sessionType}, true);\n vm.containLessonsTable = new NgTableParams({}, {\n counts: [],\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc') ? 0 : 1);\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n return vm.filterData;\n }\n });\n }\n });\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('programDetailContainLessons', programDetailContainLessons);\n})();\n\n/**\n * Created by Alan on 2017/9/4.\n */\n(function () {\n 'use strict';\n\n var passRule = {\n bindings: {\n enrollmentData: '='\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/pass-rule.html',\n controller: [function(){\n var vm = this;\n vm.passRuleSwitch = 0;\n vm.enrollmentData = this.enrollmentData;\n vm.passRule = function() {\n vm.passRuleSwitch = (vm.passRuleSwitch===0)?1:0;\n }\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('passRule', passRule);\n})();\n\n/**\n * Created by Bruce on 2016/12/08.\n */\n(function () {\n 'use strict';\n\n var incompleteInfoListCard = {\n template: '
    ',\n bindings: {\n courseData: '=?',\n reloadFn: '&?'\n },\n controller: incompleteInfoListCardCtrl\n };\n\n incompleteInfoListCardCtrl.$inject = ['CourseObject', '$scope', '$filter', 'SweetAlert'];\n function incompleteInfoListCardCtrl(CourseObject, $scope, $filter, SweetAlert) {\n var vm = this;\n vm.courseData = this.courseData;\n\n\n $scope.$watch(function () {\n return vm.courseData;\n },function () {\n vm.isCanView = (\n vm.courseData.status === 'incompleted_status' ||\n vm.courseData.status === 'status_not_available' ||\n vm.courseData.status === 'sco_non_attempt');\n\n switch (vm.courseData.courseType){\n case CourseObject.COURSETYPE_ONLINE:\n vm.templateType = 'online';\n break;\n case CourseObject.COURSETYPE_CLASSROOM:\n vm.templateType = 'classroom';\n break;\n case CourseObject.COURSETYPE_EXTERNAL:\n vm.templateType = 'external';\n break;\n case CourseObject.COURSETYPE_ONLINE_TEST:\n vm.templateType = 'online_test';\n break;\n case CourseObject.COURSETYPE_CLASSROOM_TEST:\n vm.templateType = 'classroom_test';\n break;\n case CourseObject.COURSETYPE_SURVEY:\n vm.templateType = 'survey';\n break;\n case CourseObject.EVALUATION_SURVEY:\n vm.templateType = 'evaluation_survey';\n break;\n default:\n if(vm.courseData.programType === CourseObject.PROGRAMTYPE_PROGRAM) vm.templateType = 'program';\n if(vm.courseData.programType === CourseObject.PROGRAMTYPE_INNERCERT) vm.templateType = 'innercert';\n break;\n }\n });\n\n vm.showStatus = function (status) {\n switch (vm.courseData.courseType){\n default:\n SweetAlert.error($filter('translate')( 'MESSAGE.MSG_CAN_NOT_TAKE_LESSONS'), $filter('translate')( 'STATUS.' + status.toUpperCase()));\n break;\n case 4: case 5: case 6:\n SweetAlert.error($filter('translate')( 'MESSAGE.MSG_CAN_NOT_TAKE_TEST_QUESTIONNAIRE'), $filter('translate')( 'STATUS.' + status.toUpperCase()));\n break;\n }\n\n };\n\n vm.doughnutOptions = {\n responsive: false,\n responsiveAnimationDuration: 500,\n maintainAspectRatio: true,\n cutoutPercentage: 75,\n legend: {\n display: false\n }\n };\n }\n\n angular.module('eHRD.modules.courseResource')\n .component('incompleteInfoListCard', incompleteInfoListCard);\n\n})();\n\n/**\n * Created by Bruce on 2017/1/17.\n */\n(function () {\n 'use strict';\n\n var externalTrainingRecords = {\n bindings: {\n defaultParams: '=?defaultParams'\n },\n templateUrl: 'app/modules/course-resource/views/external/external-training-records.html',\n controller: ['PermPermissionStore', '$scope', '$mdDialog', '$window','$document', 'serverSetting', 'NgTableParams', 'externalTrainingService',\n function (PermPermissionStore, $scope, $mdDialog, $window, $document, serverSetting, NgTableParams, externalTrainingService) {\n var vm = this;\n vm.defaultParams = angular.isDefined(this.defaultParams) ? this.defaultParams : null;\n var permission = null;\n permission = PermPermissionStore.getPermissionDefinition('Manage_Learning_affairs_daily_operations');\n vm.isLearningAdmin = angular.isDefined(permission);\n\n var defaultFilter = {};\n if(angular.isDefined(vm.defaultParams)){\n if(angular.isDefined(vm.defaultParams.scopeType)) defaultFilter['scopeType'] = vm.defaultParams.scopeType;\n if(angular.isDefined(vm.defaultParams.extId)) defaultFilter['extId'] = vm.defaultParams.extId;\n if(angular.isDefined(vm.defaultParams.trainingName)) defaultFilter['trainingName'] = vm.defaultParams.trainingName;\n if(angular.isDefined(vm.defaultParams.instructorName)) defaultFilter['instructorName'] = vm.defaultParams.instructorName;\n if(angular.isDefined(vm.defaultParams.startDate)) defaultFilter['startDate'] = vm.defaultParams.startDate;\n if(angular.isDefined(vm.defaultParams.endDate)) defaultFilter['endDate'] = vm.defaultParams.endDate;\n }\n\n if(angular.isDefined(vm.defaultParams)){\n var defaultSorting = {};\n if(angular.isDefined(vm.defaultParams.sort) && angular.isDefined(vm.defaultParams.order)){\n defaultSorting[vm.defaultParams.sort] = (vm.defaultParams.order === 0 ) ? \"desc\" : \"asc\";\n }\n }\n vm.externalTrainingRecordsTable = new NgTableParams({\n count: angular.isDefined(vm.defaultParams) ? vm.defaultParams.list_size: 10,\n page: angular.isDefined(vm.defaultParams) ? vm.defaultParams.current_page: 1,\n sorting: defaultSorting || { 0: \"desc\" },\n filter: defaultFilter\n },{\n counts: [1,5,10,15],\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc') ? 0 : 1);\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n vm.backStateParams = params;\n return externalTrainingService.getExternalTrainingRecords(params).then(function (externalTrainingRecords) {\n tableParams.total(externalTrainingRecords.metadata.pagination.total);\n return externalTrainingRecords;\n });\n }\n });\n\n vm.setFilter = function (filters, isClear) {\n if(isClear){\n filters = {};\n }\n vm.externalTrainingRecordsTable.filter(filters);\n vm.externalTrainingRecordsTable.reload();\n };\n\n vm.showPrompt = function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/course-resource/views/external/external-training-records-search-dialog.html',\n controller: [ '$mdDialog', 'filters', 'PermPermissionStore', function ($mdDialog, filters, PermPermissionStore) {\n var vm = this;\n vm.filters = {\n scopeType: angular.isDefined(PermPermissionStore.getPermissionDefinition('Manage_All_External_Event')) ? 'all' : angular.isDefined(filters.scopeType) ? filters.scopeType : 'department',\n extId: angular.isDefined(filters.extId) ? filters.extId : '',\n trainingName: angular.isDefined(filters.trainingName) ? filters.trainingName : '',\n instructorName: angular.isDefined(filters.instructorName) ? filters.instructorName : '',\n startDate: angular.isDefined(filters.startDate) ? filters.startDate : undefined,\n endDate: angular.isDefined(filters.endDate) ? filters.endDate : undefined\n };\n\n vm.cancel = function() {\n $mdDialog.hide({});\n };\n vm.close = function() {\n $mdDialog.cancel();\n };\n vm.submit = function(filters) {\n $mdDialog.hide(filters);\n };\n\n vm.updateEndDateModel = function () {\n var beginningTime = moment(vm.filters.startDate);\n var endTime = moment(vm.filters.endDate);\n if(!beginningTime.isBefore(endTime)){\n vm.filters.endDate = vm.filters.startDate;\n }\n };\n }],\n controllerAs:'$ctrl',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n filters : vm.externalTrainingRecordsTable.filter()\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function(filters) {\n vm.setFilter(filters, false);\n }, function() { }\n );\n };\n\n\n // vm.openEditDialog = function (externalId) {\n // $scope.externalId = externalId;\n // $mdDialog.show({\n // template: '',\n // scope: $scope,\n // preserveScope: true,\n // clickOutsideToClose: true\n // });\n // };\n\n vm.showApproveStatus = function (workflowId) {\n var url = serverSetting.baseConfig.baseURL + '/apv_status.do?isFromInbox=1&id='+ workflowId;\n $window.open(url, 'player', 'width=' + $window.innerWidth + ',height=' + $window.innerHeight + ',location=no, scrollbars=yes');\n };\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('externalTrainingRecords', externalTrainingRecords);\n})();\n\n/**\n * Created by Bruce on 2017/1/25.\n */\n(function () {\n 'use strict';\n\n var externalTrainingBulletin = {\n bindings: {\n defaultParams: '=?defaultParams'\n },\n templateUrl: 'app/modules/course-resource/views/external/external-training-bulletin.html',\n controller: ['$scope', 'externalTrainingBulletinService', 'courseResourceService', 'ngDialog',\n function ($scope, externalTrainingBulletinService, courseResourceService, ngDialog) {\n var vm = this;\n var params = {};\n vm.defaultParams = angular.isDefined(this.defaultParams) ? this.defaultParams : null;\n if(angular.isDefined(vm.defaultParams)){\n params = vm.defaultParams;\n }\n\n vm.getData = function (params) {\n vm.backStateParams = params;\n externalTrainingBulletinService.list(params).then(function(data){\n vm.bulletinApplyKnowHow = data.metadata.bulletinApplyKnowHow;\n vm.ExternalTrainingBulletinDatas = data;\n vm.pagination = vm.ExternalTrainingBulletinDatas.metadata.pagination;\n\n angular.element(\"html, body\").animate({\n scrollTop: 0\n },200);\n });\n };\n\n vm.getData(params);\n\n\n vm.openDetailed = function () {\n ngDialog.open({\n template: 'app/modules/course-resource/views/external/external-training-bulletin-detailed.html',\n className: 'ngdialog-theme-default',\n scope: $scope\n });\n };\n\n courseResourceService.getClassifications(11).then(function (classifications) {\n vm.classifications = classifications;\n });\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('externalTrainingBulletin', externalTrainingBulletin);\n})();\n\n/**\n * Created by Bruce on 2017/2/3.\n */\n(function () {\n 'use strict';\n\n var externalTrainingBulletinDetailed = {\n bindings: {\n bulletinId: '=?',\n courseId: '=?',\n sessionId: '=?',\n data: '=?data'\n },\n templateUrl: 'app/modules/course-resource/views/external/external-training-bulletin-detailed.html',\n controller: ['$scope', 'externalTrainingService', function( $scope, externalTrainingService ){\n var vm = this;\n vm.bulletinId = angular.isDefined(this.bulletinId) ? this.bulletinId : undefined;\n vm.courseId = angular.isDefined(this.courseId) ? this.bulletinId : undefined;\n vm.sessionId = angular.isDefined(this.sessionId) ? this.bulletinId : undefined;\n vm.data = angular.isDefined(this.data) ? this.data : undefined;\n\n $scope.$watch(function () {\n return vm.data;\n }, function (newVal) {\n if(angular.isDefined(newVal)){\n externalTrainingService.getCurrencys().then(function (currencys) {\n vm.currencys = currencys;\n angular.forEach(currencys, function (currency) {\n if(currency.isBasic){\n vm.defaultCostCurrency = currency.currencyId;\n vm.basicCurrencyName = currency.currencyName;\n }\n });\n });\n vm.h_organizationIds = vm.data.organizationId.split(',').filter(function (value) {\n return value.length > 0\n }).map(function(item) {\n return parseInt(item, 10);\n });\n }\n }, true);\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('externalTrainingBulletinDetailed', externalTrainingBulletinDetailed);\n})();\n\n/**\n * Created by Bruce on 2016/12/20.\n */\n(function () {\n 'use strict';\n\n var externalTrainingApply = {\n bindings: {\n formType: '@?type',\n externalId: '=?externalId',\n bulletinId: '=?bulletinId',\n courseId: '=?courseId',\n sessionId: '=?sessionId',\n backStateObject: '=?backStateObject'\n },\n templateUrl: 'app/modules/course-resource/views/external/external-training-apply.html',\n controller: [ 'toastr', 'CoreService', '$cacheFactory', '$filter', '$q', '$auth', '$scope', 'Upload', '$queueFactory', 'externalTrainingService', 'SweetAlert', '$state', function( toastr, CoreService, $cacheFactory, $filter, $q, $auth, $scope, Upload, $queueFactory, externalTrainingService, SweetAlert, $state){\n var vm = this;\n vm.$state = $state;\n var cache = externalTrainingService.getCache();\n\n vm.formType = angular.isDefined(this.formType) ? this.formType : undefined;\n vm.externalId = angular.isDefined(this.externalId) ? this.externalId : undefined;\n vm.bulletinId = angular.isDefined(this.bulletinId) ? this.bulletinId : undefined;\n vm.courseId = angular.isDefined(this.courseId) ? this.courseId : undefined;\n vm.sessionId = angular.isDefined(this.sessionId) ? this.sessionId : undefined;\n\n var queue = $queueFactory(1);\n queue.enqueue(function(){\n return externalTrainingService.getCleanExtCourseForm().then(function (defaultFormSetting) {\n vm.defaultFormSetting = defaultFormSetting;\n vm.applyForm = {};\n vm.learningReportObject = {\n isManager: vm.defaultFormSetting.isManager, // 是否為主管\n isLearningAdmin: vm.defaultFormSetting.isLearningAdmin, // 是否為管理員\n isCanEditSetting: vm.defaultFormSetting.isCanEditSetting, // 是否能編輯(學習報告設定)\n isHasDefaultSetting: vm.defaultFormSetting.isHasDefaultSetting, // 表單是否開啟預設設定 False: 由學員自行決定是否繳交報告, True: 帶入設定規則\n isShowReportLowerBound: vm.defaultFormSetting.isShowReportLowerBound, // 低於N無需繳交報告\n submitRptRate: vm.defaultFormSetting.submitRptRate, // 低於N值\n isNeedReport: vm.defaultFormSetting.classInfo.isNeedReport, // 是否需要繳交報告\n defaultSetting: {\n numOfDocReport: vm.defaultFormSetting.classInfo.numOfDocReport,\n isNeedDocReport: vm.defaultFormSetting.classInfo.isNeedDocReport,\n docReportMonth: vm.defaultFormSetting.classInfo.docReportMonth,\n docReportDay: vm.defaultFormSetting.classInfo.docReportDay,\n isNeedOralReport: vm.defaultFormSetting.classInfo.isNeedOralReport,\n isOralReportNeedGrade: vm.defaultFormSetting.classInfo.isOralReportNeedGrade,\n oralReportMonth: vm.defaultFormSetting.classInfo.oralReportMonth,\n oralReportDay: vm.defaultFormSetting.classInfo.oralReportDay,\n isNeedTeaching: vm.defaultFormSetting.classInfo.isNeedTeaching,\n teachingMonth: vm.defaultFormSetting.classInfo.teachingMonth,\n teachingDay: vm.defaultFormSetting.classInfo.teachingDay,\n isTeachingNeedGrade: vm.defaultFormSetting.classInfo.isTeachingNeedGrade,\n isNeedOther: vm.defaultFormSetting.classInfo.isNeedOther,\n otherReportWay: vm.defaultFormSetting.classInfo.otherReportWay\n }\n };\n\n switch (vm.formType){\n case 'create':\n vm.isCanEditForm = true;\n vm.isCreateForm = true;\n createFormInit();\n break;\n case 'createByCourseSession': case 'createByBulletin':\n vm.isCanEditForm = true;\n vm.isCreateForm = true;\n getFormInit();\n break;\n case 'edit': case 'reSubmit':\n vm.isCanEditForm = true;\n getFormInit();\n break;\n case 'view':\n vm.isCanEditForm = false;\n getFormInit();\n break;\n }\n });\n });\n\n\n function getFormInit() {\n if(angular.isDefined(vm.courseId) && angular.isDefined(vm.sessionId)){\n externalTrainingService.getExtCourseFormByCourseSession(vm.courseId, vm.sessionId).then(formProcess);\n } else if(angular.isDefined(vm.externalId)){\n externalTrainingService.getExtCourseForm(vm.externalId).then(formProcess);\n } else if(angular.isDefined(vm.bulletinId)){\n externalTrainingService.getExtCourseFormByBulletin(vm.bulletinId).then(formProcess);\n }\n }\n\n function formProcess(extCourseForm) {\n vm.extCourseForm = extCourseForm;\n vm.defaultDisableField = (parseInt(extCourseForm.joinCourseId) > 0 || parseInt(extCourseForm.joinCourseSessionId) > 0 || parseInt(extCourseForm.fromBulletinId) > 0);\n vm.fromBulletinDisableField = (parseInt(extCourseForm.fromBulletinId) > 0);\n vm.fromCourseSessionDisableField = (parseInt(extCourseForm.joinCourseId) > 0 || parseInt(extCourseForm.joinCourseSessionId) > 0);\n vm.createFromDisplay = (vm.formType === 'edit') && vm.defaultFormSetting.isLearningAdmin && (!extCourseForm.hasEnrollCreated);\n\n if(vm.createFromDisplay && extCourseForm.auto_create === 0){\n vm.selectExternalClass = {};\n vm.selectExternalClass['courseId'] = extCourseForm.joinCourseId;\n vm.selectExternalClass['sessionId'] = extCourseForm.joinCourseSessionId;\n }\n\n vm.applicants = extCourseForm.applicantsInfo;\n vm.applicantsStrArray = [];\n vm.enrollCosts = {};\n if(vm.applicants.length === 0){\n var applicant = {\n userId: $auth.getUserData().id,\n fullName: $auth.getUserData().username\n };\n vm.applicants.push(applicant);\n }\n\n angular.forEach(vm.applicants, function (applicant) {\n vm.applicantsStrArray.push(applicant.userId);\n vm.enrollCosts[applicant.userId] = {\n fullName: applicant.fullName,\n costObject: extCourseForm.enrollCost\n };\n });\n vm.classTimeObjects = [];\n angular.forEach(extCourseForm.timeRule, function (timeRule) {\n var classTimeObjects = timeRule;\n classTimeObjects['startDate'] = new Date(timeRule.startDate);\n classTimeObjects['endDate'] = new Date(timeRule.endDate);\n vm.classTimeObjects.push(classTimeObjects);\n });\n\n vm.h_organizationIds = extCourseForm.organizationId.split(',').filter(function (value) {\n return value.length > 0\n }).map(function(item) {\n return parseInt(item, 10);\n });\n vm.applyReason = extCourseForm.applyReason.split(',').filter(function (value) {\n return value.length > 0\n }).map(function(item) {\n return parseInt(item, 10);\n });\n\n vm.learningReportObject['isFormOwner'] = $filter('filter')(extCourseForm.applicantsInfo, { userId: $auth.getUserData().id }, true).length > 0; // 是否為自己表單, true: 是; false: 他人表單\n vm.learningReportObject['isManagerCanEditSetting'] = extCourseForm.isManagerCanEditSetting; // 主管是否可編輯表單\n\n if(!vm.isCreateForm){\n vm.learningReportObject['data'] = {\n isNeedReport: extCourseForm.learningReport.isNeedReport,\n isNeedDocReport: extCourseForm.learningReport.isNeedDocReport,\n numOfDocReport: extCourseForm.learningReport.numOfDocReport,\n docReportDeadLine: new Date(extCourseForm.learningReport.docReportDeadLine),\n isNeedOralReport: extCourseForm.learningReport.isNeedOralReport,\n oralReportDeadLine: new Date(extCourseForm.learningReport.oralReportDeadLine) ,\n isOralReportNeedGrade: extCourseForm.learningReport.isOralReportNeedGrade,\n isNeedTeaching: extCourseForm.learningReport.isNeedTeaching,\n teachingDeadLine: new Date(extCourseForm.learningReport.teachingDeadLine) ,\n isTeachingNeedGrade: extCourseForm.learningReport.isTeachingNeedGrade,\n isNeedOther: extCourseForm.learningReport.isNeedOther,\n otherReportWay: extCourseForm.learningReport.otherReportWay\n };\n }\n\n vm.refs = extCourseForm.refs;\n\n vm.applyForm = {\n memberids: (extCourseForm.applicants.length === 0) ? vm.applicantsStrArray.toString(): extCourseForm.applicants,\n externalId: (extCourseForm.externalId === \"\" || extCourseForm.externalId === -1) ? \"\" : extCourseForm.externalId,\n extId: (extCourseForm.externalId === \"\" || extCourseForm.externalId === -1) ? 0 : extCourseForm.externalId,\n courseName: extCourseForm.courseName,\n hasEnroll: (extCourseForm.hasEnroll === -1) ? undefined : extCourseForm.hasEnroll,\n reason: extCourseForm.reason,\n applyReason: extCourseForm.applyReason,\n otherApplyReason: extCourseForm.otherApplyReason,\n type: extCourseForm.type,\n h_organizationId: extCourseForm.organizationId,\n classTime: '',\n location: extCourseForm.location,\n project_code: extCourseForm.projectCode,\n isForFree: extCourseForm.isForFree.toString(),\n payingDate: extCourseForm.payingDate === \"\" ? undefined : new Date(extCourseForm.payingDate),\n trainType: extCourseForm.trainType.toString(),\n refLink: extCourseForm.reflink,\n note: extCourseForm.note,\n enrollStart: extCourseForm.enrollStart === \"\" ? undefined : new Date(extCourseForm.enrollStart),\n enrollEnd: extCourseForm.enrollEnd === \"\" ? undefined : new Date(extCourseForm.enrollEnd),\n instructor: extCourseForm.instructor,\n summary: extCourseForm.description,\n objective: extCourseForm.objective,\n prerequesite: extCourseForm.prerequesite,\n audience: extCourseForm.audience,\n outline: extCourseForm.outline,\n backurl: null,\n isEditByManager: false,\n TimeSpanRefId: extCourseForm.timeSpanRefId,\n category: extCourseForm.classification,\n auto_create: extCourseForm.auto_create,\n joinCourseId: extCourseForm.joinCourseId,\n joinCourseSessionId: extCourseForm.joinCourseSessionId,\n fromBulletinId: extCourseForm.fromBulletinId,\n };\n\n if(extCourseForm.hasPreviousEnrollRecord === 1){\n vm.applyForm['learningReportReason'] = extCourseForm.learningReportReason;\n vm.applyForm['oralReportReason'] = extCourseForm.oralReportReason;\n vm.applyForm['teachingReportReason'] = extCourseForm.teachingReportReason;\n vm.applyForm['otherReportReason'] = extCourseForm.otherReportReason;\n vm.applyForm['materialSubmit'] = extCourseForm.materialSubmit;\n vm.applyForm['materialReason'] = extCourseForm.materialReason;\n }\n\n if(angular.isDefined($cacheFactory.get('coreCache'))\n && $cacheFactory.get('coreCache').get('rememberScope')){\n reloadFormDataByCaches()\n }\n }\n\n function updateEnrollCosts() {\n angular.forEach(vm.enrollCosts, function (enrollCost, key) {\n if(!$filter('getArrayObjectByKey')(vm.applicants, 'userId', key)) delete vm.enrollCosts[key];\n });\n var memberids = [];\n angular.forEach(vm.applicants, function (applicant) {\n memberids.push(applicant.userId);\n if(angular.isUndefinedOrNull(vm.enrollCosts[applicant.userId])) {\n vm.enrollCosts[applicant.userId] = {\n fullName: applicant.fullName,\n costObject: {}\n };\n }\n });\n vm.applyForm.memberids = memberids.toString();\n }\n\n function createFormInit() {\n vm.learningReportObject['isFormOwner'] = true;\n vm.needRequired = false;\n vm.applicants = [{\n userId: $auth.getUserData().id,\n fullName: $auth.getUserData().username\n }];\n vm.enrollCosts = {};\n angular.forEach(vm.applicants, function (applicant) {\n vm.enrollCosts[applicant.userId] = {\n fullName: applicant.fullName,\n costObject: {}\n };\n });\n vm.courseFiles = {};\n var memberids = [];\n angular.forEach(vm.applicants, function (applicant) {\n memberids.push(applicant.userId);\n });\n\n $scope.$watch(function () {\n return vm.applicants;\n },function (newVal) {\n if( angular.isDefined(newVal)){\n updateEnrollCosts();\n }\n },true);\n\n vm.applyForm = {\n memberids: memberids.toString(),\n externalId: '',\n extId: 0,\n courseName: '',\n hasEnroll: '',\n reason: '',\n applyReason: '',\n otherApplyReason: '',\n type: 0,\n h_organizationId: '',\n classTime: '',\n location: '',\n project_code: '',\n isForFree: '0',\n payingDate: undefined,\n trainType: '1',\n isNeedReport: (vm.defaultFormSetting.classInfo.isNeedReport ? '1' : '0'),\n isNeedDocReport: '',\n numOfDocReport: '',\n docReportDeadLine: undefined,\n isNeedOralReport: '',\n oralReportDeadLine: undefined,\n isOralReportNeedGrade: '',\n isNeedTeaching: '',\n teachingDeadLine: undefined,\n isTeachingNeedGrade: '',\n isNeedOther: '',\n otherReportWay: '',\n refLink: '',\n note: '',\n enrollStart: undefined,\n enrollEnd: undefined,\n instructor: '',\n summary: '',\n objective: '',\n prerequesite: '',\n audience: '',\n outline: '',\n backurl: null,\n isEditByManager: false,\n TimeSpanRefId: 0\n };\n\n if(angular.isDefined($cacheFactory.get('coreCache'))\n && $cacheFactory.get('coreCache').get('rememberScope')){\n reloadFormDataByCaches();\n }\n }\n\n queue.enqueue(function(){\n return externalTrainingService.getExtCourseApplyReasons().then(function (applyReasons) {\n vm.applyReasons = applyReasons;\n });\n });\n\n $scope.$watch(function () {\n return vm.applyReason;\n },function (newVal) {\n if(angular.isDefined(newVal) && angular.isArray(newVal) && angular.isDefined(vm.applyForm)){\n vm.applyForm['applyReason'] = vm.applyReason.length > 0 ? vm.applyReason.toString() : '';\n }\n },true);\n\n vm.canExitStep1 = function () {\n vm.needRequired = true;\n if(vm.formType !== 'view'){\n vm.wizardForm1.$setSubmitted();\n if(!vm.wizardForm1.$valid){\n SweetAlert.error('', $filter('translate')('FORM_VALIDATION.THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM'));\n }\n }\n\n return (vm.formType === 'view') ? true : vm.wizardForm1.$valid;\n };\n\n vm.canExitStep2 = function () {\n if(vm.formType !== 'view') {\n vm.wizardForm2.$setSubmitted();\n if (!vm.wizardForm2.$valid) {\n SweetAlert.error('', $filter('translate')('FORM_VALIDATION.THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM'));\n }\n }\n return (vm.formType === 'view') ? true : vm.wizardForm2.$valid;\n };\n\n function parseClassTimeObjectsToFormData() {\n var classTimeObjectFormData = {};\n classTimeObjectFormData['timeSpanCount'] = vm.classTimeObjects.length;\n classTimeObjectFormData['classTime'] = (vm.classTime.length > 0 ? vm.classTime.toString() : '');\n\n angular.forEach(vm.classTimeObjects, function (classTimeObject, index) {\n classTimeObjectFormData['startDate' + index] = moment(classTimeObject.startDate).format('YYYY/MM/DD');\n classTimeObjectFormData['endDate' + index] = moment(classTimeObject.endDate).format('YYYY/MM/DD');\n classTimeObjectFormData['startH' + index] = classTimeObject.startH;\n classTimeObjectFormData['startM' + index] = classTimeObject.startM;\n classTimeObjectFormData['endH' + index] = classTimeObject.endH;\n classTimeObjectFormData['endM' + index] = classTimeObject.endM;\n classTimeObjectFormData['isEnableRestTime' + index] = (classTimeObject.isEnableRestTime ? 1 : 0);\n classTimeObjectFormData['rest_startH' + index] = classTimeObject.rest_startH;\n classTimeObjectFormData['rest_startM' + index] = classTimeObject.rest_startM;\n classTimeObjectFormData['rest_endH' + index] = classTimeObject.rest_endH;\n classTimeObjectFormData['rest_endM' + index] = classTimeObject.rest_endM;\n classTimeObjectFormData['isEnableRepeat' + index] = (classTimeObject.isEnableRepeat ? 1 : 0);\n classTimeObjectFormData['repeatIntervalNumber' + index] = classTimeObject.repeatIntervalNumber;\n classTimeObjectFormData['repeatIntervalUnit' + index] = classTimeObject.repeatIntervalUnit;\n\n classTimeObjectFormData['includeDay' + index + '_0'] = (classTimeObject.includeDays.indexOf(0) > -1 ? 1 : '');\n classTimeObjectFormData['includeDay' + index + '_1'] = (classTimeObject.includeDays.indexOf(1) > -1 ? 1 : '');\n classTimeObjectFormData['includeDay' + index + '_2'] = (classTimeObject.includeDays.indexOf(2) > -1 ? 1 : '');\n classTimeObjectFormData['includeDay' + index + '_3'] = (classTimeObject.includeDays.indexOf(3) > -1 ? 1 : '');\n classTimeObjectFormData['includeDay' + index + '_4'] = (classTimeObject.includeDays.indexOf(4) > -1 ? 1 : '');\n classTimeObjectFormData['includeDay' + index + '_5'] = (classTimeObject.includeDays.indexOf(5) > -1 ? 1 : '');\n classTimeObjectFormData['includeDay' + index + '_6'] = (classTimeObject.includeDays.indexOf(6) > -1 ? 1 : '');\n });\n return classTimeObjectFormData;\n }\n\n function parseEnrollCosts() {\n var enrollCostsFormData = {};\n angular.forEach(vm.enrollCosts, function (enrollCost, index) {\n enrollCostsFormData['course_cost_currency_' + index] = enrollCost.costObject.course_cost_currency;\n enrollCostsFormData['course_cost_amount_' + index] = enrollCost.costObject.course_cost_amount;\n enrollCostsFormData['course_converting_amount_' + index] = enrollCost.costObject.course_converting_amount.replace(/,/g , '');\n enrollCostsFormData['subsidyType_' + index] = enrollCost.costObject.subsidyType;\n enrollCostsFormData['subsidyPercentage_' + index] = enrollCost.costObject.subsidyPercentage;\n enrollCostsFormData['voucherType_' + index] = enrollCost.costObject.voucherType;\n enrollCostsFormData['apply_type_' + index] = enrollCost.costObject.apply_type;\n enrollCostsFormData['payee_' + index] = enrollCost.costObject.payee;\n enrollCostsFormData['remit_title_' + index] = enrollCost.costObject.remit_title;\n enrollCostsFormData['remit_branch_' + index] = enrollCost.costObject.remit_branch;\n enrollCostsFormData['remit_account_' + index] = enrollCost.costObject.remit_account;\n enrollCostsFormData['check_title_' + index] = enrollCost.costObject.check_title;\n enrollCostsFormData['check_expired_date_' + index] = (enrollCost.costObject.check_expired_date);\n enrollCostsFormData['check_format1_' + index] = enrollCost.costObject.check_format1;\n enrollCostsFormData['check_format2_' + index] = enrollCost.costObject.check_format2;\n });\n return enrollCostsFormData;\n }\n\n function parseLearningReport() {\n var learningReportObject = {};\n learningReportObject['isNeedReport'] = vm.learningReport.isNeedReport ? 1 : 0;\n learningReportObject['isNeedDocReport'] = vm.learningReport.isNeedDocReport ? 1 : 0;\n learningReportObject['numOfDocReport'] = vm.learningReport.numOfDocReport;\n learningReportObject['docReportDeadLine'] = moment(vm.learningReport.docReportDeadLine).format('YYYY/MM/DD');\n learningReportObject['isNeedOralReport'] = vm.learningReport.isNeedOralReport ? 1 : 0;\n learningReportObject['oralReportDeadLine'] = moment(vm.learningReport.oralReportDeadLine).format('YYYY/MM/DD');\n learningReportObject['isOralReportNeedGrade'] = vm.learningReport.isOralReportNeedGrade ? 1 : 0;\n learningReportObject['isNeedTeaching'] = vm.learningReport.isNeedTeaching ? 1 : 0;\n learningReportObject['teachingDeadLine'] = moment(vm.learningReport.teachingDeadLine).format('YYYY/MM/DD');\n learningReportObject['isTeachingNeedGrade'] = vm.learningReport.isTeachingNeedGrade ? 1 : 0;\n learningReportObject['isNeedOther'] = vm.learningReport.isNeedOther ? 1 : 0;\n learningReportObject['otherReportWay'] = vm.learningReport.otherReportWay;\n return learningReportObject;\n }\n\n vm.submitApplyForm = function () {\n vm.applyForm['h_organizationId'] = (vm.h_organizationIds.length > 0 ? vm.h_organizationIds.toString() : '');\n if(vm.formType === 'edit' && vm.applyForm['auto_create'] === 0 && angular.isDefined(vm.selectExternalClass)){\n vm.applyForm['joinCourseId'] = vm.selectExternalClass.courseId;\n vm.applyForm['joinCourseSessionId'] = vm.selectExternalClass.sessionId;\n }\n\n vm.applyForm = angular.extend(vm.applyForm, parseClassTimeObjectsToFormData());\n vm.applyForm = angular.extend(vm.applyForm, parseEnrollCosts());\n vm.applyForm = angular.extend(vm.applyForm, parseLearningReport());\n saveToCaches();\n function preConfirm() {\n return new Promise(function (resolve) {\n var uploaderForm = externalTrainingService.submitApplyForm(vm.applyForm, 'ref', vm.courseFiles, vm.formType);\n uploaderForm.then(function(resp) {\n var res = resp.data;\n switch (res.data.result){\n case 'MSG_TAKES_TIME_ACTION_WITH_SOMETHING_ERROR':\n SweetAlert.insertErrorQueueStep('',res.data.description, true);\n break;\n case 'external_apply_success':\n case 'SUCCESS_MSG_UPDATE_USER_PREFERENCE':\n SweetAlert.insertSuccessQueueStep('', $filter('translate')('MESSAGE.MSG_SUCCESSFUL_OPERATION'), false, function () {\n if(angular.isDefined(vm.backStateObject)){\n $state.go(vm.backStateObject.state,vm.backStateObject.params);\n }else{\n $state.go('externalTrainingZone.externalTrainingApplyRecords');\n }\n });\n break;\n case 'doEnroll':\n if(res.data.crsEnrollResult.status === 7){\n var message = '';\n if(res.data.crsEnrollResult.isNeedApproval){\n message = $filter('translate')('MESSAGE.MSG_' + res.data.crsEnrollResult.detail.toUpperCase());\n }else{\n message = $filter('translate')('MESSAGE.MSG_SUCCESSFUL_OPERATION');\n }\n\n SweetAlert.insertSuccessQueueStep('', message, false, function () {\n if(angular.isDefined(vm.backStateObject)){\n $state.go(vm.backStateObject.state,vm.backStateObject.params);\n }else{\n $state.go('externalTrainingZone.externalTrainingApplyRecords');\n }\n });\n }else if(res.data.crsEnrollResult.status === 5){\n SweetAlert.insertErrorQueueStep('',$filter('translate')('MESSAGE.MSG_CLASS_TIME_CONFLICT',{value: res.data.crsEnrollResult.detail}) , true);\n }else{\n SweetAlert.insertErrorQueueStep('',res.data.crsEnrollResult.detail, true);\n }\n break;\n }\n resolve();\n }, function () {\n $cacheFactory.get('coreCache').put('rememberScope', true);\n CoreService.refreshAccesstoken();\n });\n })\n }\n SweetAlert.submitCheck('',$filter('translate')('MESSAGE.MSG_EXTERNAL_TRAINING_APPLY_SUMMIT_CHECK'), preConfirm);\n };\n\n $scope.$watch(function () {\n return [\n vm.applyForm,\n vm.applyReason,\n vm.h_organizationIds,\n vm.classTimeObjects,\n vm.classTime,\n vm.enrollCosts,\n vm.learningReport,\n vm.learningReportObject\n ];\n }, function () {\n saveToCaches();\n }, true);\n $scope.$watchCollection(function () {\n return vm.courseFiles;\n }, function () {\n saveToCaches();\n });\n\n function reloadFormDataByCaches() {\n if( angular.equals(cache.get('formType'), vm.formType) &&\n angular.equals(cache.get('externalId'), vm.externalId) &&\n angular.equals(cache.get('bulletinId'), vm.bulletinId) &&\n angular.equals(cache.get('courseId'), vm.courseId) &&\n angular.equals(cache.get('sessionId'), vm.sessionId) ){\n\n toastr.info($filter('translate')('MESSAGE.MSG_RESTORE_LAST_TIME_UNFINISHED_FORM'));\n\n vm.applyForm = cache.get('applyForm');\n vm.applyReason = cache.get('applyReason');\n vm.h_organizationIds = cache.get('h_organizationIds');\n vm.classTimeObjects = cache.get('classTimeObjects');\n vm.classTime = cache.get('classTime');\n vm.enrollCosts = cache.get('enrollCosts');\n vm.learningReport = cache.get('learningReport');\n vm.learningReportObject = cache.get('learningReportObject');\n vm._courseFiles = cache.get('courseFiles');\n\n var isShowFileInfo = false;\n angular.forEach(vm._courseFiles, function (file) {\n if(angular.isDefined(file)){\n isShowFileInfo = true;\n }\n });\n if(isShowFileInfo) toastr.info($filter('translate')('MESSAGE.MSG_COURSE_DATA_FILE_NEED_RE_CHOOSE'));\n }\n $cacheFactory.get('coreCache').put('rememberScope', false);\n }\n\n function saveToCaches() {\n if(!(angular.isDefined($cacheFactory.get('coreCache'))\n && $cacheFactory.get('coreCache').get('rememberScope'))){\n externalTrainingService.setCacheData(\"applyForm\", vm.applyForm);\n externalTrainingService.setCacheData(\"applyReason\", vm.applyReason);\n externalTrainingService.setCacheData(\"h_organizationIds\", vm.h_organizationIds);\n externalTrainingService.setCacheData(\"classTimeObjects\", vm.classTimeObjects);\n externalTrainingService.setCacheData(\"classTime\", vm.classTime);\n externalTrainingService.setCacheData(\"enrollCosts\", vm.enrollCosts);\n externalTrainingService.setCacheData(\"learningReport\", vm.learningReport);\n externalTrainingService.setCacheData(\"learningReportObject\", vm.learningReportObject);\n externalTrainingService.setCacheData(\"courseFiles\", vm.courseFiles);\n\n externalTrainingService.setCacheData(\"formType\", vm.formType);\n externalTrainingService.setCacheData(\"externalId\", vm.externalId);\n externalTrainingService.setCacheData(\"bulletinId\", vm.bulletinId);\n externalTrainingService.setCacheData(\"courseId\", vm.courseId);\n externalTrainingService.setCacheData(\"sessionId\", vm.sessionId);\n }\n }\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('externalTrainingApply', externalTrainingApply);\n})();\n\n/**\n * Created by Bruce on 2017/2/21.\n */\n(function () {\n 'use strict';\n\n var externalTrainingApplyFormView = {\n bindings: {\n data: '=?data'\n },\n templateUrl: 'app/modules/course-resource/views/external/external-training-apply-form-view.html',\n controller: ['$filter', '$scope', 'userService', 'externalTrainingService', 'courseResourceService', 'utilsService', function( $filter, $scope, userService, externalTrainingService, courseResourceService, utilsService ){\n var vm = this;\n vm.data = angular.isUndefined(this.data) ? undefined : this.data;\n vm.currencys = [];vm.classifications = [];vm.organizationDatas = {};\n var watchData = $scope.$watch(function () {\n return vm.data;\n }, function () {\n if(angular.isDefined(vm.data) ){\n if( vm.data.applicantsInfo.length > 0) {\n userService.getUserProfileDetailById(vm.data.applicantsInfo[0].userId).then(function (applicantInfo) {\n vm.applicantInfo = applicantInfo;\n });\n }\n externalTrainingService.getExtCourseApplyReasons().then(function (applyReasons) {\n vm.applyReasons = applyReasons;\n vm.applyReason = vm.data.applyReason.split(',').filter(function (value) {\n return value.length > 0\n }).map(function(item) {\n return parseInt(item, 10);\n });\n });\n externalTrainingService.getCurrencys().then(function (currencys) {\n vm.currencys = currencys;\n angular.forEach(currencys, function (currency) {\n if(currency.isBasic){\n vm.defaultCostCurrency = currency.currencyId;\n }\n });\n });\n courseResourceService.getClassifications(11).then(function (classifications) {\n vm.classifications = classifications;\n });\n\n vm.h_organizationIds = vm.data.organizationId.split(',').filter(function (value) {\n return value.length > 0\n }).map(function(item) {\n return parseInt(item, 10);\n });\n angular.forEach(vm.h_organizationIds, function (organizationId) {\n utilsService.getTipInfo(26, {'vendorType': 2, 'vendorId': organizationId}).then(function (data) {\n vm.organizationDatas[organizationId] = $filter('where')(data, {'rcKey': 'vendor_name'})[0].data;\n });\n });\n watchData();\n }\n });\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('externalTrainingApplyFormView', externalTrainingApplyFormView);\n})();\n\n/**\n * Created by Alan on 2017/1/17.\n */\n(function () {\n 'use strict';\n\n var evaluationSurvey = {\n bindings: {\n relationId: '=?',\n surveyId: '=?'\n },\n templateUrl: 'app/modules/course-resource/views/test-questionnaire/evaluation-survey.html',\n controller: ['testQuestionnaireService', '$window', 'sitemapService', function (testQuestionnaireService, $window) {\n var vm = this;\n vm.relationId = angular.isUndefinedOrNull(this.relationId)?null:this.relationId;//evaluationSurvey\n vm.surveyId = angular.isUndefinedOrNull(this.surveyId)?null:this.surveyId; //evaluationSurvey\n vm.canExam = false;\n vm.canViewResult = false;\n\n vm.pageView = 'start';\n\n var params = {\n relationId: vm.relationId,\n surveyId: vm.surveyId\n };\n testQuestionnaireService.getQuestions(null, params).then(function (questionnaireData) {\n var evSurveyInfo = questionnaireData.metadata.evSurveyInfo;\n vm.questionnaireData = questionnaireData;\n vm.exam = {\n name: evSurveyInfo.surveyName,\n description: evSurveyInfo.description,\n targetName: evSurveyInfo.targetName,\n feedbackStyle: 3,\n feedbackType: 1,\n isOverMaxViewTimes: 1,\n isNotFitAttedDance: 0\n };\n vm.questionsPagination = {\n currentPage: 1,\n perPage: questionnaireData.metadata.evSurveyInfo.pageSize,\n total: questionnaireData.length\n };\n vm.questionModel = testQuestionnaireService.getQuestionModel(questionnaireData);\n });\n\n vm.startExam = function () {\n vm.pageView = 'form';\n };\n\n $window.onbeforeunload = $window.onunload;\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('evaluationSurvey', evaluationSurvey);\n})();\n\n/**\n * Created by Bruce on 2016/10/24.\n */\n(function () {\n 'use strict';\n\n var detailSessionList = {\n bindings: {\n courseId: '=?',\n isProgram: '=?',\n mdDialogClose: '&?'\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/detail-session-list.html',\n controller: [ '$scope', 'NgTableParams','$state', '$stateParams', 'courseResourceService', 'CourseObject', 'SweetAlert', '$filter', 'ngTableColumnValueService', '$interpolate', 'PermPermissionStore',\n function( $scope, NgTableParams, $state, $stateParams, courseResourceService, CourseObject, SweetAlert, $filter, ngTableColumnValueService, $interpolate, PermPermissionStore ){\n var vm = this;\n var permission = PermPermissionStore.getPermissionDefinition('Modules.course.onlinetest');\n vm.courseId = angular.isUndefined(this.courseId) ? null : this.courseId;\n vm.isProgram = angular.isUndefined(this.isProgram) ? false : this.isProgram;\n vm.catalogId = angular.isUndefined($stateParams.cid) ? 0 : $stateParams.cid;\n vm.nodeId = angular.isUndefined($stateParams.nid) ? undefined : $stateParams.nid;\n vm.mdDialogClose = angular.isUndefined(this.mdDialogClose) ? null : this.mdDialogClose;\n vm.CourseObject = CourseObject;\n\n vm.reloadTable = function () {\n vm.enrollSessionsDataTable.reload();\n };\n\n vm.startLearning = function(catalogId, courseId, enrollmentId, status) {\n if(status!=='Waitlisted'){\n (!vm.isProgram)\n ? $state.go('courseResourceCatalog.CourseInfo.SessionInfo', {\n cid: parseInt(vm.catalogId),\n courseId: courseId,\n enrollmentId: enrollmentId,\n nid: parseInt(catalogId)\n })\n : $state.go('courseResourceCatalog.ProgramInfo.SessionInfo', {\n cid: parseInt(vm.catalogId),\n programId: courseId,\n enrollmentId: enrollmentId,\n nid: parseInt(catalogId)\n });\n if(angular.isFunction(vm.mdDialogClose)) {\n vm.mdDialogClose();\n }\n }\n else {\n SweetAlert.error($filter('translate')( 'MESSAGE.MSG_CAN_NOT_TAKE_LESSONS'), $filter('translate')( 'STATUS.ENROLLMENT_WAITLISTED'));\n }\n\n };\n\n $scope.$watch(function(){\n return vm.courseId;\n }, function(newVal){\n if(!angular.isUndefinedOrNull(newVal)){\n prepareTable();\n }\n });\n\n function prepareTableCols() {\n return [\n {\n field: 'sessionName',\n title: $filter('translate')('FIELD.SESSION'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlSessionName()),\n width: 20,\n priority: 1\n },\n {\n field: 'sessionType',\n title: $filter('translate')('FIELD.TYPE'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlSessionType()),\n show: (vm.programType===1),\n width: 5,\n priority: 1\n },\n {\n field: 'classTime',\n title: $filter('translate')('FIELD.CLASS_TIME'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate('
    \\'\">
    '),\n width: 10,\n priority: 1\n },\n {\n field: 'deadline',\n title: $filter('translate')('FIELD.ENROLL_DEADLINE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n width: 5,\n priority: 3\n },\n {\n field: 'instructor',\n title: $filter('translate')('FIELD.INSTRUCTOR'),\n getValue: htmlInstructor,\n show: (vm.programType!==1),\n width: 10,\n priority: 2\n },\n {\n field: 'counselor',\n title: $filter('translate')('FIELD.COUNSELOR'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlCounselor()),\n show: (vm.programType===1),\n width: 10,\n priority: 2\n },\n {\n field: 'venue',\n title: $filter('translate')('FIELD.EVENT_LOCATION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n show: (!vm.isProgram),\n width: 10,\n priority: 2\n },\n {\n field: 'people',\n title: $filter('translate')('FIELD.NUMBER_OF_PEOPLE'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlPeople()),\n width: 5,\n priority: 3\n },\n {\n field: 'action',\n title: $filter('translate')('FIELD.ACTION'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlAction()),\n width: '50px',\n priority: 1\n },\n {\n field: 'enrollManager',\n title: $filter('translate')('FIELD.ENROLL_MANAGER'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlEnrollManager()),\n width: '50px',\n show: (permission),\n priority: 1\n }\n ];\n }\n\n function prepareTable() {\n vm.tableCols = prepareTableCols();\n vm.enrollSessionsDataTable = new NgTableParams({}, {\n counts: [],\n getData: function(tableParams) {\n vm.backStateParams = {\n catalogId: vm.catalogId,\n courseId: vm.courseId\n };\n if(!vm.isProgram){\n return courseResourceService.getCourseEnrollSessions(vm.courseId, {}).then(function (enrollSessions) {\n tableParams.total(enrollSessions.length);\n return enrollSessions;\n });\n }else{\n return courseResourceService.getProgramEnrollSessions(vm.courseId, {}).then(function (enrollSessions) {\n tableParams.total(enrollSessions.length);\n vm.programType = enrollSessions[0].programType;\n return enrollSessions;\n });\n }\n }\n });\n }\n\n function htmlSessionName() {\n var html = '';\n html += '{{row.sessionName}}';\n html += '';\n html += '';\n html += '{{row.sessionName}}';\n html += '';\n html += '';\n html += '{{row.sessionName}}';\n html += '';\n html += '';\n html += '{{row.sessionName}}';\n html += '';\n html += '';\n html += '{{row.sessionName}}';\n html += '';\n return html;\n }\n\n function htmlSessionType() {\n var html = '
    ';\n html += '{{ \\'FIELD.GENERAL_SESSION\\' | translate}}';\n html += '
    ';\n html += '
    ';\n html += '{{ \\'FIELD.EXTEND_SESSION\\' | translate}}';\n html += '
    ';\n return html;\n }\n\n function htmlInstructor() {\n var html = '';\n html += '';\n html += '
    ';\n html += '{{instructor.instructorName | markSplit:$index:\\' / \\'}}';\n html += '
    ';\n return html;\n }\n\n function htmlCounselor() {\n var html = '';\n html += '';\n return html;\n }\n\n function htmlPeople() {\n var html = '';\n html += '
    ';\n html += '{{ \\'FIELD.ENROLL_NUMBER_OF_PEOPLE\\' | translate}}:';\n html += '';\n html += ' {{row.enrolledPeople}}';\n html += '';\n html += '{{row.enrolledPeople}}';\n html += '{{row.enrolledPeople}}';\n html += ' ; {{ \\'FIELD.REMAINING_AMOUNT\\' | translate}}:';\n html += ' {{ \\'FIELD.NO_UPPER_LIMIT\\' | translate}}';\n html += ' {{row.availableQuota}}';\n html += '';\n html += ' ; {{ \\'FIELD.OCCUPY_WAIT_LIST\\' | translate}}: {{row.occupyQuota}}';\n html += ' ; {{ \\'FIELD.REMAIN_WAIT_LIST\\' | translate}}: {{row.remainQuota}}';\n html += '
    ';\n return html;\n }\n\n function htmlAction() {\n var html = '';\n html += '
    ';\n html += '

    {{row.actionMessage}}

    ';\n html += '

    ';\n html += '';\n html += 'play_circle_filled';\n html += '';\n html += '

    ';\n html += '

    ';\n html += '';\n html += 'person_add';\n html += '{{ \\'ACTIONS.ENROLL\\' | translate}}';\n html += '';\n html += '';\n html += 'person_add';\n html += '{{ \\'ACTIONS.ENROLL\\' | translate}}';\n html += '';\n html += '

    ';\n html += '

    ';\n html += '';\n html += '{{row.actionMessage}}';\n html += '';\n html += '

    ';\n html += '

    ';\n html += '';\n html += 'play_circle_filled';\n html += '{{ \\'ACTIONS.START_LEARNING\\' | translate}}';\n html += '';\n html += '

    ';\n html += '
    ';\n return html;\n }\n\n function htmlEnrollManager() {\n var html = '';\n html += '';\n return html;\n }\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('detailSessionList', detailSessionList);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var detailSessionLearners = {\n bindings: {\n sessionId: '=',\n isProgram: '@?',\n reload:'='\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/detail-session-learners.html',\n controller: ['$scope', 'NgTableParams', 'courseResourceService', function( $scope, NgTableParams, courseResourceService ){\n var vm = this;\n vm.sessionId = angular.isUndefined(this.sessionId) ? null : this.sessionId;\n vm.isProgram = angular.isUndefined(this.isProgram) ? false : this.isProgram;\n vm.reload = angular.isUndefined(this.reload) ? false : this.reload;\n $scope.$watch(function(){\n return vm.reload;\n }, function(newVal, oldVal){\n if(!angular.equals(newVal, oldVal) && !angular.isUndefinedOrNull(newVal) && newVal){\n vm.sessionLearnersTable = new NgTableParams({}, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc') ? 0 : 1);\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n\n if(vm.isProgram){\n return courseResourceService.getProgramSessionLearners(vm.sessionId, params).then(function (sessionLearnersData) {\n tableParams.total(sessionLearnersData.metadata.pagination.total);\n return sessionLearnersData;\n });\n }else{\n return courseResourceService.getCourseSessionLearners(vm.sessionId, params).then(function (sessionLearnersData) {\n tableParams.total(sessionLearnersData.metadata.pagination.total);\n return sessionLearnersData;\n });\n }\n }\n });\n }\n });\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('detailSessionLearners', detailSessionLearners);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var detailCompletionRate = {\n bindings: {\n data: '=',\n isShow: '='\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/detail-completion-rate.html',\n controller: [function( ){\n var vm = this;\n vm.data = angular.isUndefined(this.data) ? null : this.data;\n vm.isShow = angular.isUndefined(this.isShow) ? false : this.isShow;\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('detailCompletionRate', detailCompletionRate);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var courseSessionInfo = {\n bindings: {\n catalogId: '=?',\n courseId: '=?',\n programEnrollmentId: '=?',\n backState: '=?',\n enrollmentId: '=?',\n nodeId: '=?',\n tabSelect: '=?',\n isUser: '=?' //mail link use\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info.html',\n controller: ['$filter', 'courseResourceService', function( $filter, courseResourceService ){\n var vm = this;\n var params;\n var catalogId = angular.isDefined(this.catalogId) ? this.catalogId: null;\n var courseId = angular.isDefined(this.courseId) ? this.courseId: null;\n var nodeId = angular.isDefined(this.nodeId) ? this.nodeId: null;\n var programEnrollmentId = angular.isDefined(this.programEnrollmentId) ? this.programEnrollmentId: null;\n var backState = angular.isDefined(this.backState) ? this.backState: null;\n var enrollmentId = angular.isDefined(this.enrollmentId) ? this.enrollmentId: null;\n vm.tabSelect = angular.isDefined(this.tabSelect) ? this.tabSelect: null;\n vm.isUser = angular.isDefined(this.isUser) ? this.isUser: null;\n if(angular.isDefined(backState)) {\n if(!angular.isUndefinedOrNull(catalogId) && !angular.isUndefinedOrNull(courseId)){\n vm.goBack={\n title: $filter('translate')('FIELD.COURSE_INFO'),\n state:backState,\n stateParams:{\n cid: catalogId, courseId: courseId, nid: nodeId\n }\n };\n }\n else if(!angular.isUndefinedOrNull(programEnrollmentId)) {\n courseResourceService.getProgramEnrollment(programEnrollmentId, {}).then(function (programData) {\n vm.goBack={\n title: (programData.programType===0)?$filter('translate')('PROGRAM_INFO'):$filter('translate')('CERTIFICATE_INFO'),\n state: (programData.programType===0)?'learningPassport.incompleteCourses.programInfo':'learningPassport.incompleteCourses.certificationInfo',\n stateParams:{enrollmentId: programEnrollmentId}\n };\n });\n }\n }\n\n params = {};\n vm.getCourseData = function () {\n courseResourceService.getCourseEnrollment(enrollmentId, params).then(function (enrollmentData) {\n vm.enrollmentData = enrollmentData;\n courseResourceService.getCourse(enrollmentData.courseId, params).then(function (courseData) {\n vm.courseData = courseData;\n });\n\n courseResourceService.getCourseSessionLearnersCompletionRate(enrollmentData.sessionId,{}).then(function (courseSessionLearnersCompletionRateData) {\n vm.completionRateData = courseSessionLearnersCompletionRateData;\n });\n\n courseResourceService.getLearningResult(enrollmentData.enrollmentId).then(function (courseContentData) {\n vm.courseContentData = courseContentData;\n });\n\n courseResourceService.getCourseSession(enrollmentData.sessionId, params).then(function (sessionData) {\n vm.sessionData = sessionData;\n if(angular.isUndefinedOrNull(vm.tabSelect)) {\n vm.tabSelect = (vm.sessionData.canAction===0 || vm.enrollmentData.isBlock===1)?\"learningResult\":\"learningCenter\";\n }\n });\n\n courseResourceService.getLearningHistory(enrollmentData.enrollmentId).then(function (learningHistory) {\n vm.attendanceRecords = learningHistory.attendanceRecord;\n vm.learningHistory = learningHistory;\n });\n\n });\n };\n vm.getCourseData();\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseSessionInfo', courseSessionInfo);\n})();\n\n/**\n * Created by Alan on 2017/5/2.\n */\n(function () {\n 'use strict';\n\n var courseSearch = {\n bindings: {\n params: '=?', //api: api/ctl/catalog-course-search\n chooseCourse: '=', //object\n chooseMethod: '@?' //checkbox or radio\n },\n templateUrl: 'app/modules/course-resource/views/course-search.html',\n controller: ['$scope', 'ctlService', 'NgTableParams', '$filter', function($scope, ctlService, NgTableParams, $filter){\n var vm = this;\n vm.params = angular.isUndefinedOrNull(this.params)?[]:this.params;\n vm.chooseCourse = this.chooseCourse;\n vm.chooseMethod = angular.isUndefinedOrNull(this.chooseMethod)?'checkbox':this.chooseMethod;\n\n vm.corsesTable = new NgTableParams({}, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n vm.params.keyword = vm.keyword;\n vm.params.current_page = tableParams.url().page;\n vm.params.list_size = tableParams.url().count;\n return ctlService.getCatalogCourseSearch(vm.params).then(function (courses) {\n tableParams.total(courses.metadata.pagination.total);\n vm.courses = courses;\n vm.courseSelectAll = false;\n return courses;\n });\n }\n });\n\n $scope.$watch('$ctrl.keyword', function() {\n vm.corsesTable.page(1);\n vm.corsesTable.reload();\n });\n\n vm.selectCourse = function () {\n angular.forEach(vm.courses, function(course) {\n if(vm.courseSelectAll) {\n (($filter('arrayObjectIndexOf')(vm.chooseCourse, course)) === -1)?vm.addCourse(course):\"\";\n }\n else {\n (($filter('arrayObjectIndexOf')(vm.chooseCourse, course)) > -1)?vm.removeCourse(course):\"\";\n }\n });\n };\n\n vm.addCourse = function (course) {\n vm.chooseCourse.push(course);\n };\n\n vm.removeCourse = function (course) {\n vm.chooseCourse.splice($filter('arrayObjectIndexOf')(vm.chooseCourse, course), 1);\n };\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseSearch', courseSearch);\n})();\n\n/**\n * Created by Bruce on 2017/08/03.\n */\n(function () {\n 'use strict';\n\n var courseResourceCatalogList = {\n bindings: {\n catalogId: '=?catalogId',\n nodeId: '=?nodeId'\n },\n templateUrl: 'app/modules/course-resource/views/course-resource-catalog-list.html',\n controller: [ 'sitemapService', '$state', '$stateParams', 'courseResourceService', '$filter', function( sitemapService, $state, $stateParams, courseResourceService, $filter ){\n var vm = this;\n vm.isShowIndex = false;\n vm.catalogId = (angular.isDefined(this.catalogId) && this.catalogId.length > 0) ? parseInt(this.catalogId) : 0;\n vm.nodeId = angular.isDefined(this.nodeId) ? this.nodeId : undefined;\n\n if(vm.catalogId === 0 && angular.isUndefinedOrNull(vm.nodeId)) vm.isShowIndex = true;\n\n var params = {};\n if(vm.isShowIndex) {\n vm.tabSelect = (angular.isUndefinedOrNull(this.tabSelect))?'latestCourse':this.tabSelect;\n vm.isSearchMode = false;\n vm.filter = [];\n vm.pagination = {\n perPage: 10\n };\n vm.searchData = function(params) {\n if(params.keyword!=='' && angular.isDefined(params.keyword)) {\n vm.searchDataParams=params;\n courseResourceService.getCourseResource(0, params).then(function (data) {\n vm.isSearchMode = true;\n vm.courseResourceDatas = data;\n vm.menulist = data.metadata.menulist;\n vm.pagination = data.metadata.pagination;\n vm.filter = [\n {key : 'courseType', value:'2', name:'FIELD.CLASS_ROOM_COURSE', permissions:['Modules.course.classroom']},\n {key : 'courseType', value:'1', name:'FIELD.ONLINE_COURSE', permissions:['Modules.course.online']},\n {key : 'programType', value:'0', name:'FIELD.PROGRAM', permissions:['Modules.curriculum']},\n {key : 'courseType', value:'3', name:'FIELD.EXTERNAL_TRAINING', permissions:['Modules.course.external']},\n {key : 'courseType', value:'4', name:'FIELD.ONLINE_TEST', permissions:['Modules.course.onlinetest']},\n {key : 'courseType', value:'5', name:'FIELD.CLASS_ROOM_TEST', permissions:['Modules.course.classroomtest']},\n {key : 'programType', value:'1', name:'FIELD.INTERNAL_LICENSE', permissions:['Modules.certification.inner']},\n {key : 'onlyFavorite', value:'1', name:'FIELD.MY_FAVOURITE', permissions:['Modules.course.online','Modules.course.classroom','Modules.course.external','Modules.curriculum']}\n ]\n });\n }\n else {\n vm.isSearchMode = false;\n vm.filter = [];\n }\n };\n\n vm.getLatestCourses = function() {\n vm.tabSelect = 'latestCourse';\n courseResourceService.getLatestCourses().then(function(latestCourses) {\n vm.latestCourses = latestCourses;\n });\n };\n\n vm.getHotCourse = function() {\n vm.tabSelect = 'hotCourse';\n courseResourceService.getHotCourses().then(function(hotCourses) {\n vm.hotCourses = hotCourses;\n });\n };\n\n vm.getFeaturedCourses = function(params) {\n vm.featuredParams = params;\n vm.tabSelect = 'featuredCourse';\n courseResourceService.getFeaturedCourses(params).then(function(featuredCourses) {\n vm.featuredCourses = featuredCourses;\n vm.featuredCoursesPagination = featuredCourses.metadata.pagination;\n });\n };\n } else {\n vm.getData = function(params) {\n vm.reloadParams=params;\n vm.categoryTreeId = (angular.isDefined(vm.nodeId)? vm.nodeId : vm.catalogId);\n vm.menulist = [];\n courseResourceService.getCourseResource(vm.categoryTreeId, params).then(function (data) {\n vm.courseResourceDatas = data;\n vm.pagination = vm.courseResourceDatas.metadata.pagination;\n\n if(parseInt(vm.catalogId) === 0) {\n sitemapService.getSiteMapNodes().walk(function (node) {\n if (node.model.state === $state.current.name){\n if(angular.equals(node.model.stateParams['mid'], $state.params['mid'])) {\n vm.menulist.push({\n id: angular.isUndefinedOrNull(node.getPath()[node.getPath().length - 1].model.stateParams['cid']) ? 0 : node.getPath()[node.getPath().length - 1].model.stateParams['cid'],\n title: node.getPath()[node.getPath().length - 1].model.title\n });\n }\n }\n });\n }\n vm.menulist = vm.menulist.concat(vm.courseResourceDatas.metadata.menulist);\n vm.lastMenulist = vm.courseResourceDatas.metadata.menulist[vm.menulist.length-1];\n\n sitemapService.getSiteMapNodes().walk(function (node) {\n if(angular.isDefined(node.model.stateParams) && angular.isDefined(node.model.stateParams['mid']) && (node.model.stateParams['mid'] === $state.params['mid'])){\n if(vm.menulist.length > 0 && parseInt(vm.menulist[0].id) === parseInt(node.model.stateParams['cid'])){\n vm.menulist[0].title = node.model.title;\n }\n } else {\n if(angular.isUndefinedOrNull(vm.mainMenu) && node.model.state === 'courseResourceCatalog') {\n if(node.model.stateParams['cid'] === null || node.model.stateParams['cid'] === vm.catalogId){\n if(vm.menulist.length > 0 && vm.menulist[0].id === node.model.stateParams['cid']){\n vm.menulist[0].title = node.model.title;\n }\n }\n }\n }\n });\n\n vm.courseResourceBreadcrumb = $filter('stringToBreadcrumb')(vm.menulist, 'sitemap-breadcrumb');\n $state.current._ncyBreadcrumbLabel = vm.courseResourceBreadcrumb;\n\n vm.courseResourceTitle = $filter('stringToBreadcrumb')(vm.menulist, 'text');\n\n angular.element(\"html, body\").animate({\n scrollTop: 0\n }, 10);\n });\n };\n vm.getData(params);\n }\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseResourceCatalogList', courseResourceCatalogList);\n})();\n\n/**\n * Created by Bruce on 2017/7/31.\n */\n\n(function() {\n 'use strict';\n\n var courseLearningResourceMenu = {\n bindings: {\n catalogId: '=?catalogId',\n nodeId: '=?nodeId'\n },\n templateUrl: 'app/modules/course-resource/views/course-learning-resource-menu.html',\n controller: [ 'courseResourceService', '$state', '$filter', 'serverSetting', 'sitemapService', function( courseResourceService, $state, $filter, serverSetting, sitemapService) {\n var vm = this;\n vm.catalogId = (angular.isDefined(this.catalogId) && this.catalogId.length > 0) ? this.catalogId : 0;\n vm.previousMenu = undefined;\n vm.mainMenu = undefined;\n\n vm.process = function() {\n sitemapService.getSiteMapNodes().walk(function (node) {\n if(angular.isDefined(node.model.stateParams) && angular.isDefined(node.model.stateParams['mid']) && (node.model.stateParams['mid'] === $state.params['mid'])){\n vm.mainMenu = node.model;\n if ((node.getPath().length -2) > 0 && angular.isDefined(node.getPath()[(node.getPath().length -2)].model.stateParams) &&\n angular.isDefined(node.getPath()[(node.getPath().length -2)].model.stateParams['url']) &&\n node.getPath()[(node.getPath().length -2)].model.stateParams['url'].length > 0) {\n vm.previousMenu = node.getPath()[(node.getPath().length -2)];\n }\n } else {\n if(angular.isUndefinedOrNull(vm.mainMenu) && node.model.state === 'courseResourceCatalog') {\n if(node.model.stateParams['cid'] === null || node.model.stateParams['cid'] === vm.catalogId){\n vm.mainMenu = node.model;\n if ((node.getPath().length -2) > 0 && angular.isDefined(node.getPath()[(node.getPath().length -2)].model.stateParams) &&\n angular.isDefined(node.getPath()[(node.getPath().length -2)].model.stateParams['url']) &&\n node.getPath()[(node.getPath().length -2)].model.stateParams['url'].length > 0) {\n vm.previousMenu = node.getPath()[(node.getPath().length -2)];\n }\n }\n }\n }\n });\n\n if(!vm.previousMenu) {\n sitemapService.getSiteMapNodes().walk(function (node) {\n if(node.model.state === 'index') {\n vm.previousMenu = node;\n }\n });\n }\n };\n\n if(sitemapService.getMenu().length > 0) {\n vm.process();\n } else {\n sitemapService.getProjectSideMenu().then(function (menuItems) {\n sitemapService.setMenu(menuItems);\n vm.process();\n });\n }\n\n courseResourceService.getCourseResourceMenuNodes(vm.catalogId).then(function (data) {\n vm.menu = data;\n });\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseLearningResourceMenu', courseLearningResourceMenu);\n})();\n\n/**\n * Created by Bruce on 2016/11/24.\n */\n(function () {\n 'use strict';\n\n var courseLearningResourceInfo = {\n bindings: {\n courseResourceData: '=',\n reloadFn: '&?'\n },\n templateUrl: 'app/modules/course-resource/views/single-info-template/course-learning-resource-info.html',\n controller: [ function(){\n var vm = this;\n vm.courseResourceData = this.courseResourceData;\n vm.reloadFn = (angular.isFunction(this.reloadFn))?this.reloadFn:null;\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseLearningResourceInfo', courseLearningResourceInfo);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var courseInfo = {\n bindings: {\n catalogId: '=?catalogId',\n courseId: '=?courseId',\n nodeId: '=?nodeId'\n },\n templateUrl: 'app/modules/course-resource/views/course-info.html',\n controller: ['$state','$scope', '$filter', '$stateParams', 'courseResourceService', 'sitemapService', function( $state, $scope, $filter, $stateParams, courseResourceService, sitemapService ){\n var vm = this;\n var courseId = angular.isDefined(this.courseId) ? this.courseId : undefined;\n var params = {};\n\n vm.getCourseData = function () {\n courseResourceService.getCourse(courseId, params).then(function (courseData) {\n vm.courseData = courseData;\n vm.catalogId = angular.isDefined($stateParams.catalogId) ? $stateParams.catalogId : angular.isDefined($stateParams.cid) ? $stateParams.cid : undefined;\n if(angular.isDefined(vm.catalogId)){\n courseResourceService.getCourseResourceCatalogMenu(vm.catalogId).then(function (menuList) {\n var breadcrumbLabel = vm.courseData.courseName;\n\n sitemapService.getSiteMapNodes().walk(function (node) {\n if(angular.isDefined(node.model.stateParams) && angular.isDefined(node.model.stateParams['mid']) && (node.model.stateParams['mid'] === $state.params['mid'])){\n if(menuList.length > 0 && parseInt(menuList[0].id) === parseInt(node.model.stateParams['cid'])){\n menuList[0].title = node.model.title;\n }\n } else {\n if(angular.isUndefinedOrNull(vm.mainMenu) && node.model.state === 'courseResourceCatalog') {\n if(node.model.stateParams['cid'] === null || node.model.stateParams['cid'] === vm.catalogId){\n if(menuList.length > 0 && menuList[0].id === node.model.stateParams['cid']){\n menuList[0].title = node.model.title;\n }\n }\n }\n }\n });\n\n vm.courseResourceBreadcrumb = $filter('stringToBreadcrumb')(menuList, 'sitemap-breadcrumb', breadcrumbLabel);\n $state.current._ncyBreadcrumbLabel = vm.courseResourceBreadcrumb;\n });\n if(angular.isDefined($stateParams.backState)){\n vm.goBack={\n title: $filter('translate')('FIELD.COURSE_FOLDER'),\n state:$stateParams.backState,\n stateParams:{cid: vm.catalogId, nid: vm.nodeId}\n };\n }\n }\n });\n\n courseResourceService.getCourseReference(courseId, {}).then(function (referenceData) {\n vm.referenceData = referenceData;\n });\n\n courseResourceService.getCourseEnrollSessions(courseId, params).then(function (enrollSessions) {\n vm.enrollSessions = enrollSessions;\n });\n\n };\n\n if(angular.isDefined(courseId)){\n vm.getCourseData();\n }\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseInfo', courseInfo);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var courseDetailRecommendLessons = {\n bindings: {\n yearAgo: '=?',\n size: '=?',\n itemType: '=?', //course = 1, program = 2\n itemId: '=', //courseId or programId\n sessionId: '=',\n catalogId: '=?'\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/course-detail-recommend-lessons.html',\n controller: [ '$scope', 'courseResourceService', 'SessionObject', function($scope, courseResourceService, SessionObject){\n\n var vm = this;\n var yearAgo = angular.isUndefinedOrNull(this.yearAgo)?1:this.yearAgo;\n var size = angular.isUndefinedOrNull(this.size)?12:this.size;\n vm.itemType = angular.isUndefinedOrNull(this.itemType)?SessionObject.COURSE:this.itemType;\n vm.itemId = this.itemId;\n vm.sessionId = this.sessionId;\n vm.SessionObject = SessionObject;\n\n vm.catalogId = angular.isDefined(this.catalogId) ? this.catalogId : 0;\n\n vm.miniGalleryResponsive = [\n {\n breakpoint: 1800,\n settings: {\n slidesToShow: 5,\n slidesToScroll: 5\n }\n },\n {\n breakpoint: 1440,\n settings: {\n slidesToShow: 4,\n slidesToScroll: 4\n }\n },\n {\n breakpoint: 1080,\n settings: {\n slidesToShow: 3,\n slidesToScroll: 3\n }\n },\n {\n breakpoint: 720,\n settings: {\n slidesToShow: 2,\n slidesToScroll: 2\n }\n },\n {\n breakpoint: 360,\n settings: {\n slidesToShow: 1,\n slidesToScroll: 1\n }\n }\n ];\n\n $scope.$watch(function(){\n return vm.itemId;\n }, function(){\n if(!angular.isUndefinedOrNull(vm.itemId)) {\n var params = {\n yearAgo: yearAgo,\n size: size,\n itemType: vm.itemType,\n itemId: vm.itemId,\n sessionId: vm.sessionId\n };\n courseResourceService.getRecommendedCourses(params).then(function (recommendCourses) {\n vm.recommendCourses = recommendCourses;\n });\n }\n });\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseDetailRecommendLessons', courseDetailRecommendLessons);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var courseDetailPrerequisiteItems = {\n bindings: {\n data: '=',\n programType: '=?',\n courseType: '=?'\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/course-detail-prerequisite-items.html',\n controller: [function( ){\n var vm = this;\n vm.programType = angular.isUndefined(this.programType) ? null : this.programType;\n vm.courseType = angular.isUndefined(this.courseType) ? null : this.courseType;\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseDetailPrerequisiteItems', courseDetailPrerequisiteItems);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var courseDetailLearningResults = {\n bindings: {\n courseContentData: '=?',\n enrollmentData: '=?',\n courseSessionId:'=?',\n isProgram:'@?',\n reloadFn:'&?',\n learningHistoryData: '=?'\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/course-detail-learning-results.html',\n controller: ['$scope', '$filter', '$TreeTableConvert', 'CourseObject', function( $scope, $filter, $TreeTableConvert, CourseObject ){\n var vm = this;\n vm.courseContentData = angular.isUndefined(this.courseContentData) ? null : this.courseContentData;\n vm.enrollmentData = angular.isUndefined(this.enrollmentData) ? null : this.enrollmentData;\n vm.courseSessionId = angular.isUndefined(this.courseSessionId) ? null : this.courseSessionId;\n vm.isProgram = angular.isUndefined(this.isProgram) ? false : this.isProgram;\n vm.reloadFn = angular.isUndefined(this.reloadFn) ? null : this.reloadFn;\n vm.learningHistoryData = angular.isUndefined(this.learningHistoryData) ? null : this.learningHistoryData;\n $scope.$watch(function(){\n return vm.courseContentData;\n }, function(newVal, oldVal){\n if(!angular.equals(newVal, oldVal) && angular.isDefined(newVal)){\n var _courseContentData = [];\n var presurvey = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.presurvey.length > 0) ? ((vm.courseContentData.presurvey[0]['items'].length > 0) ? vm.courseContentData.presurvey : []) : []);\n var pretest = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.pretest.length > 0) ? ((vm.courseContentData.pretest[0]['items'].length > 0) ? vm.courseContentData.pretest : []) : []);\n var posttest = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.posttest.length > 0) ? ((vm.courseContentData.posttest[0]['items'].length > 0) ? vm.courseContentData.posttest : []) : []);\n var content = vm.courseContentData.content;\n var postsurvey = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.postsurvey.length > 0) ? ((vm.courseContentData.postsurvey[0]['items'].length > 0) ? vm.courseContentData.postsurvey : []) : []);\n var reference = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.reference.length > 0) ? ((vm.courseContentData.reference[0]['items'].length > 0) ? vm.courseContentData.reference : []) : []);\n var test = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.test.length > 0) ? ((vm.courseContentData.test[0]['isFolderType']===1) ?\n ((vm.courseContentData.test[0]['items'].length > 0) ? vm.courseContentData.test : []) : vm.courseContentData.test) : []);\n var testClassroom = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.testClassroom.length > 0) ? vm.courseContentData.testClassroom : []);\n var survey = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.survey.length > 0) ? ((vm.courseContentData.survey[0]['isFolderType']===1) ?\n ((vm.courseContentData.survey[0]['items'].length > 0) ? vm.courseContentData.survey : []) : vm.courseContentData.survey) : []);\n\n switch (vm.enrollmentData.courseType){\n default :\n _courseContentData = [presurvey, pretest, content, posttest, postsurvey, reference, test, testClassroom, survey];\n break;\n case CourseObject.COURSETYPE_ONLINE_TEST:\n _courseContentData = [presurvey, pretest, content, posttest, postsurvey, test, reference, testClassroom, survey];\n break;\n case CourseObject.COURSETYPE_SURVEY:\n _courseContentData = [presurvey, pretest, content, posttest, postsurvey, test, testClassroom, survey, reference];\n break;\n }\n\n vm.courseResult = $TreeTableConvert.arrayTree2tableTree(angular.copy(_courseContentData), 'items');\n\n vm.courseContentTable = {\n courseContentProperty:{\n field: 'title',\n titleClass: 'col-xs-9',\n cellClass: 'col-xs-9',\n displayName: $filter('translate')('FIELD.COURSE_TITLE')\n },\n courseContentColDef:[\n {\n field: 'showLength',\n titleClass: 'col-xs-1',\n cellClass: 'col-xs-1',\n displayName: $filter('translate')('FIELD.COURSE_TIME')\n },\n {\n field: 'lessonStatus',\n fieldGroup:'SCODataInfo',\n titleClass: 'col-xs-1',\n cellClass: 'col-xs-1 appear',\n displayName: $filter('translate')('FIELD.STATUS')\n }\n ],\n courseResultProperty:{\n field: 'title',\n titleClass: 'col-xs-7',\n cellClass: 'col-xs-7',\n displayName: $filter('translate')('FIELD.COURSE_TITLE')\n },\n courseResultColDef:[\n {\n field: 'totalTime',\n fieldGroup:'SCODataInfo',\n titleClass: 'col-xs-1',\n cellClass: 'col-xs-1',\n displayName: $filter('translate')('FIELD.VIEWING_TIME')\n },\n {\n field: 'accessDate',\n fieldGroup:'SCODataInfo',\n titleClass: 'col-xs-2',\n cellClass: 'col-xs-2',\n displayName: $filter('translate')('FIELD.FINISH_TIME')\n },\n {\n field: 'scoreRaw',\n fieldGroup:'SCODataInfo',\n titleClass: 'col-xs-1',\n cellClass: 'col-xs-1 appear',\n displayName: $filter('translate')('FIELD.SCORE')\n },\n {\n field: 'lessonStatus',\n fieldGroup:'SCODataInfo',\n titleClass: 'col-xs-1',\n cellClass: 'col-xs-1 appear',\n displayName: $filter('translate')('FIELD.STATUS')\n }\n ]\n };\n }\n });\n\n $scope.$watch(function(){\n return vm.learningHistoryData;\n }, function(newVal, oldVal){\n if(!angular.equals(newVal, oldVal) && angular.isDefined(newVal)){\n vm.attendanceRecords = newVal.attendanceRecord;\n vm.learningHistoryData = newVal;\n }\n });\n\n\n\n\n\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseDetailLearningResults', courseDetailLearningResults);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var courseDetailLearningContent = {\n bindings: {\n courseContentData: '=',\n enrollmentData: '=?',\n courseSessionId:'=?',\n isProgram:'@?',\n reloadFn:'&?'\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/course-detail-learning-content.html',\n controller: [ '$scope', '$filter', '$TreeTableConvert', 'CourseObject', function( $scope, $filter, $TreeTableConvert, CourseObject ){\n var vm = this;\n vm.courseContentData = angular.isUndefined(this.courseContentData) ? null : this.courseContentData;\n vm.enrollmentData = angular.isUndefined(this.enrollmentData) ? null : this.enrollmentData;\n vm.courseSessionId = angular.isUndefined(this.courseSessionId) ? null : this.courseSessionId;\n vm.isProgram = angular.isUndefined(this.isProgram) ? false : this.isProgram;\n vm.reloadFn = angular.isUndefined(this.reloadFn) ? null : this.reloadFn;\n $scope.$watch(function(){\n return vm.courseContentData;\n }, function(newVal, oldVal){\n if(!angular.equals(newVal, oldVal) && angular.isDefined(newVal)){\n var _courseContentData = [];\n var presurvey = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.presurvey.length > 0) ? ((vm.courseContentData.presurvey[0]['items'].length > 0) ? vm.courseContentData.presurvey : []) : []);\n var pretest = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.pretest.length > 0) ? ((vm.courseContentData.pretest[0]['items'].length > 0) ? vm.courseContentData.pretest : []) : []);\n var content = vm.courseContentData.content;\n var posttest = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.posttest.length > 0) ? ((vm.courseContentData.posttest[0]['items'].length > 0) ? vm.courseContentData.posttest : []) : []);\n var postsurvey = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.postsurvey.length > 0) ? ((vm.courseContentData.postsurvey[0]['items'].length > 0) ? vm.courseContentData.postsurvey : []) : []);\n var reference = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.reference.length > 0) ? ((vm.courseContentData.reference[0]['items'].length > 0) ? vm.courseContentData.reference : []) : []);\n var test = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.test.length > 0) ? ((vm.courseContentData.test[0]['isFolderType']===1) ?\n ((vm.courseContentData.test[0]['items'].length > 0) ? vm.courseContentData.test : []) : vm.courseContentData.test) : []);\n var testClassroom = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.testClassroom.length > 0) ? vm.courseContentData.testClassroom : []);\n var survey = (vm.enrollmentData.courseType === CourseObject.COURSETYPE_EXTERNAL) ? [] :\n ((vm.courseContentData.survey.length > 0) ? ((vm.courseContentData.survey[0]['isFolderType']===1) ?\n ((vm.courseContentData.survey[0]['items'].length > 0) ? vm.courseContentData.survey : []) : vm.courseContentData.survey) : []);\n\n switch (vm.enrollmentData.courseType){\n default :\n _courseContentData = [presurvey, pretest, content, posttest, postsurvey, reference, test, testClassroom, survey];\n break;\n case CourseObject.COURSETYPE_ONLINE_TEST:\n _courseContentData = [presurvey, pretest, content, posttest, postsurvey, test, reference, testClassroom, survey];\n break;\n case CourseObject.COURSETYPE_SURVEY:\n _courseContentData = [presurvey, pretest, content, posttest, postsurvey, test, testClassroom, survey, reference];\n break;\n }\n\n vm.courseContent = $TreeTableConvert.arrayTree2tableTree(angular.copy(_courseContentData), 'items');\n\n vm.courseContentTable = {\n courseContentProperty:{\n field: 'title',\n titleClass: 'col-xs-9',\n cellClass: 'col-xs-9',\n displayName: $filter('translate')('FIELD.COURSE_TITLE')\n },\n courseContentColDef:[\n {\n field: 'showLength',\n titleClass: 'col-xs-1',\n cellClass: 'col-xs-1',\n displayName: $filter('translate')('FIELD.COURSE_TIME')\n },\n {\n field: 'lessonStatus',\n fieldGroup:'SCODataInfo',\n titleClass: 'col-xs-1',\n cellClass: 'col-xs-1 appear',\n displayName: $filter('translate')('FIELD.STATUS')\n }\n ],\n courseResultProperty:{\n field: 'title',\n titleClass: 'col-xs-7',\n cellClass: 'col-xs-7',\n displayName: $filter('translate')('FIELD.COURSE_TITLE')\n },\n courseResultColDef:[\n {\n field: 'accessDate',\n fieldGroup:'SCODataInfo',\n titleClass: 'col-xs-2',\n cellClass: 'col-xs-2',\n displayName: $filter('translate')('FIELD.FINISH_TIME')\n },\n {\n field: 'scoreRaw',\n fieldGroup:'SCODataInfo',\n titleClass: 'col-xs-1',\n cellClass: 'col-xs-1 appear',\n displayName: $filter('translate')('FIELD.SCORE')\n },\n {\n field: 'lessonStatus',\n fieldGroup:'SCODataInfo',\n titleClass: 'col-xs-1',\n cellClass: 'col-xs-1 appear',\n displayName: $filter('translate')('FIELD.STATUS')\n }\n ]\n };\n }\n });\n\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseDetailLearningContent', courseDetailLearningContent);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var courseDetailInfo = {\n bindings: {\n data: '=',\n referenceData: '=?' // Non-external courses\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/course-detail-info.html',\n controller: [function(){\n var vm = this;\n vm.data = angular.isUndefined(this.data) ? null : this.data;\n vm.referenceData = angular.isUndefinedOrNull(this.referenceData) ? [] : this.referenceData;\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseDetailInfo', courseDetailInfo);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var courseDetailHeader = {\n bindings: {\n data: '=',\n enrollmentData: '=?',\n isProgram: '@?',\n goBack:'=?',\n reloadFn:'&?',\n isUser: '=?' //mail link use\n },\n templateUrl:'app/modules/course-resource/views/course-session-info-template/course-detail-header.html',\n controller: ['$scope', 'ngDialog', 'PermPermissionStore', function( $scope, ngDialog, PermPermissionStore ){\n var vm = this;\n var permission = null;\n permission = PermPermissionStore.getPermissionDefinition('Modules.course.classroom');\n vm.hasCourseClassroomPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.approval');\n vm.hasApprovalPermission = angular.isDefined(permission);\n\n vm.data = angular.isUndefined(this.data) ? null : this.data;\n vm.isProgram = angular.isUndefined(this.isProgram) ? false : this.isProgram;\n vm.enrollmentData = angular.isUndefined(this.enrollmentData) ? null : this.enrollmentData;\n vm.goBack = angular.isUndefined(this.goBack) ? null : this.goBack;\n vm.reloadFn = angular.isUndefined(this.reloadFn) ? null : this.reloadFn;\n vm.isUser = angular.isUndefined(this.isUser) ? null: this.isUser;\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseDetailHeader', courseDetailHeader);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var courseDetailEnrollment = {\n bindings: {\n data: '=',\n sessionData: '=',\n enrollmentData: '=',\n isProgram: '@?',\n reloadFn:'&?'\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/course-detail-enrollment.html',\n controller: [function(){\n var vm = this;\n vm.passRuleSwitch = 0;\n vm.data = angular.isUndefined(this.data) ? null : this.data;\n vm.sessionData = angular.isUndefined(this.sessionData) ? null : this.sessionData;\n vm.enrollmentData = angular.isUndefined(this.enrollmentData) ? null : this.enrollmentData;\n vm.isProgram = angular.isUndefined(this.isProgram) ? null : this.isProgram;\n vm.reloadFn = angular.isUndefined(this.reloadFn) ? null : this.reloadFn;\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseDetailEnrollment', courseDetailEnrollment);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var courseDetailEnrollmentLearningReport = {\n bindings: {\n enrollmentData: '=',\n sessionData: '='\n },\n templateUrl: 'app/modules/course-resource/views/course-session-info-template/course-detail-enrollment-learning-report.html',\n controller: ['$scope', '$filter', 'SweetAlert', 'fileProcessService', 'CourseObject', function( $scope, $filter, SweetAlert, fileProcessService, CourseObject ){\n var vm = this;\n vm.CourseObject = CourseObject;\n vm.enrollmentData = angular.isUndefined(this.enrollmentData) ? null : this.enrollmentData;\n vm.sessionData = angular.isUndefined(this.sessionData) ? null : this.sessionData;\n var formData = [\n {'isCourse': 1},\n {'packageId':vm.enrollmentData.enrollmentId},\n {'enrollmentId': vm.enrollmentData.enrollmentId}\n ];\n var uploader = $scope.uploader = fileProcessService.learningReportUpload(vm.enrollmentData.enrollmentId, formData);\n\n uploader.onErrorItem = function(/*fileItem, response, status, headers*/) {\n\n };\n uploader.onCompleteAll = function () {\n vm.learningReportUploadAction('confirm-temp', 1);\n };\n\n vm.applyOtherReportApproval = function (itemType) {\n fileProcessService.applyOtherReportApproval(vm.enrollmentData.enrollmentId, itemType, {}).then(function () {\n vm.getLearningReportList();\n });\n };\n\n vm.getLearningReportList = function () {\n fileProcessService.getLearningReportStatus(vm.enrollmentData.enrollmentId, {}).then(function (LearningReportStatus) {\n vm.learningReportStatus = LearningReportStatus;\n });\n fileProcessService.getLearningReportList(vm.enrollmentData.enrollmentId, {}).then(function (LearningReportDatas) {\n vm.learningReportData = LearningReportDatas;\n vm.learningReportData.paid = 0;\n vm.learningReportFileReplace = {};\n angular.forEach(LearningReportDatas, function (data) {\n if(data.appState === 1){\n vm.learningReportData.paid += 1;\n\n var formData = [\n {'isCourse': 1},\n {'packageId':vm.enrollmentData.enrollmentId},\n {'enrollmentId': vm.enrollmentData.enrollmentId},\n {'reportId': data.learningReportId},\n {'op': 'replace'}\n ];\n vm.learningReportFileReplace[data.learningReportId] = fileProcessService.learningReportUpload(vm.enrollmentData.enrollmentId, formData, true);\n\n vm.learningReportFileReplace[data.learningReportId].onCompleteAll = function () {\n vm.getLearningReportList();\n };\n }\n });\n });\n };\n\n vm.getLearningReportList();\n\n vm.learningReportUploadAction = function (actionType, isCourse, reportId) {\n var fileParams = {};\n fileParams.iscourse = (angular.isDefined(isCourse) ? isCourse : 0);\n fileParams.reportid = (angular.isDefined(reportId) ? reportId : 0);\n\n switch(actionType){\n case 'cancelrow':\n\n var text = $filter('translate')('MESSAGE.MSG_THIS_ACTION_WILL_RELEVANT_STUDY_REPORT') + ','\n + $filter('translate')('MESSAGE.MSG_IS_CONTINUE');\n\n SweetAlert.check('', text, 'warning', function() {\n _learningReportUploadAction();\n });\n\n break;\n default:\n _learningReportUploadAction();\n break;\n\n }\n function _learningReportUploadAction(){\n fileProcessService.learningReportUploadAction(vm.enrollmentData.enrollmentId, actionType, fileParams).then(function () {\n vm.getLearningReportList();\n });\n }\n };\n\n }]\n };\n\n angular.module('eHRD.modules.courseResource')\n .component('courseDetailEnrollmentLearningReport', courseDetailEnrollmentLearningReport);\n})();\n\n/**\n * Created by Bruce on 2017/1/18.\n */\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.certZone',[]);\n\n})();\n\n/**\n * Created by Alan on 2017/3/14.\n */\n(function () {\n 'use strict';\n\n certZoneService.$inject = ['serverSetting', 'Restangular', 'fileProcess'];\n function certZoneService(serverSetting, Restangular, fileProcess) {\n var _ExtCertService = Restangular.all('extcert');\n var _InnerCertService = Restangular.all('innercert');\n\n return {\n\n getExtCertTestCompensateSearch: function (params) {\n params = params || {};\n /*\n * api/extcert/user/compensate-search?current_page={current_page}&list_size={list_size}\n * */\n return _ExtCertService\n .one('user', null)\n .customGETLIST('compensate-search', params);\n },\n getExtCertBonusSearch: function (params) {\n params = params || {};\n /*\n * api/extcert/user/bonus-search?current_page={current_page}&list_size={list_size}\n * */\n return _ExtCertService\n .one('user', null)\n .customGETLIST('bonus-search', params);\n },\n getExtCertApplyForm: function (formType, params) {\n params = params || {};\n /*\n * formType = 1: api/extcert/test-form-info?formId={formId}\n * formType = 2: api/extcert/register-form-info?formId={formId}\n * formType = 3: api/extcert/compensation-form-info?formId={formId}\n * formType = 4: api/extcert/bonus-form-info?formId={formId}\n * */\n var resource = undefined;\n switch (formType){\n case 1:\n resource = 'test-form-info';\n break;\n case 2:\n resource = 'register-form-info';\n break;\n case 3:\n resource = 'compensation-form-info';\n break;\n case 4:\n resource = 'bonus-form-info';\n break;\n }\n return _ExtCertService\n .customGET(resource, params);\n },\n\n getExtCertApplyRecordSearch: function (params) {\n /*\n * api/extcert/user/apply-record-search\n * */\n return _ExtCertService\n .one('user', null)\n .customGETLIST('apply-record-search', params);\n },\n\n getMemberCertRecords: function (isExtCert, params) {\n isExtCert = isExtCert || false;\n /*\n * api/innercert/manager/record-search\n * api/extcert/manager/record-search\n * */\n if(isExtCert){\n return _ExtCertService\n .one('manager', null)\n .customGETLIST('record-search', params);\n }else {\n return _InnerCertService\n .one('manager', null)\n .customGETLIST('record-search', params);\n }\n },\n\n getCertRecords: function (isExtCert, params) {\n isExtCert = isExtCert || false;\n /*\n * api/innercert/user/record-search\n * api/extcert/user/record-search\n * */\n if(isExtCert){\n return _ExtCertService\n .one('user', null)\n .customGETLIST('record-search', params);\n }else {\n return _InnerCertService\n .one('user', null)\n .customGETLIST('record-search', params);\n }\n },\n\n certificateForm: function (params, formData, fileFieldName, files, formType) {\n /*\n * api/extcert/apply-register?subjectId={subjectId}&isReNew={isReNew}&passCheckApplyForm={passCheckApplyForm}\n * api/extcert/apply-test?subjectId={subjectId}&isReNew={isReNew}&passCheckApplyForm={passCheckApplyForm}\n *\n * apply-compensation: api/extcert/apply-compensation?rootFormId={rootFormId}\n * */\n var url = serverSetting.baseConfig.baseApiPath;\n switch (formType){\n case 'register':\n url += '/extcert/apply-register?subjectId=' + params.subjectId + \"&isReNew=\" + params.isReNew + \"&passCheckApplyForm=\" + params.passCheckApplyForm;\n break;\n case 'test':\n url += '/extcert/apply-test?subjectId=' + params.subjectId + \"&isReNew=\" + params.isReNew + \"&passCheckApplyForm=\" + params.passCheckApplyForm;\n break;\n case 'apply-compensation':\n url += '/extcert/apply-compensation?rootFormId=' + params.rootFormId;\n break;\n case 'apply-test-bonus':\n url += '/extcert/apply-test-bonus?rootFormId=' + params.rootFormId;\n break;\n case 'apply-register-bonus':\n url += '/extcert/apply-register-bonus?rootFormId=' + params.rootFormId;\n break;\n case 'update-test-bonus':\n url += '/extcert/update-test-bonus?formId=' + params.formId;\n break;\n case 'update-register-bonus':\n url += '/extcert/update-register-bonus?formId=' + params.formId;\n break;\n case 'update-compensation':\n url += '/extcert/update-compensation?formId=' + params.formId;\n break;\n case 'update-test':\n url += '/extcert/update-test?formId=' + params.formId;\n break;\n case 'update-register':\n url += '/extcert/update-register?formId=' + params.formId;\n break;\n }\n return new fileProcess.upload(url, formData, fileFieldName, files , 'POST');\n },\n\n getExtCertInfo: function (params) {\n /*\n * api/extcert/info?subjectId={subjectId}\n * */\n return _ExtCertService\n .customGET('info', params);\n },\n\n parseTestTimes: function (testTimes, dateFormat) {\n dateFormat = dateFormat || 'YYYY/MM/DD';\n testTimes = testTimes || [];\n var _testTimes = '';\n angular.forEach(testTimes, function (val) {\n _testTimes += moment(val).format(dateFormat) + ' 0:0-0:0,';\n });\n return _testTimes;\n }\n\n };\n\n }\n\n angular.module('eHRD.modules.certZone')\n .factory('certZoneService', certZoneService);\n})();\n\n/**\n * Created by Alan on 2017/3/24.\n */\n\n(function () {\n 'use strict';\n\n externalCertDetailInfoDialog.$inject = ['$mdDialog', 'SweetAlert', '$filter', 'NgTableParams'];\n function externalCertDetailInfoDialog($mdDialog, SweetAlert, $filter, NgTableParams) {\n var directive = {\n restrict: 'A',\n scope: {\n subjectId: '=?',\n isPublished: '=?',\n canView: '=?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n if(scope.isPublished===0)\n SweetAlert.warning('', $filter('translate')('MESSAGE.MSG_ERROR_NOT_PUBLISH'));\n else if(scope.canView===0)\n SweetAlert.warning('', $filter('translate')('MESSAGE.MSG_YOU_DO_NOT_HAVE_PERMISSION_TO_VIEW_THIS_LEARNING_ACTIVITY'));\n else {\n $mdDialog.show({\n templateUrl: 'app/modules/cert-zone/views/external-cert-detail-info-dialog.html',\n controller: ['certZoneService', '$mdDialog', 'subjectId',\n function (certZoneService, $mdDialog, subjectId) {\n var vm = this;\n var params = {\n subjectId: subjectId\n };\n\n certZoneService.getExtCertInfo(params).then(function (extCertInfo) {\n vm.extCertInfo = extCertInfo;\n vm.prerequisiteItem = extCertInfo.prerequisiteItem;\n vm.newApplyRuleItem = new NgTableParams({}, {\n counts: [],\n getData: function() {\n return extCertInfo.newApplyRuleItem;\n }\n });\n vm.renewApplyRuleItem = new NgTableParams({}, {\n counts: [],\n getData: function() {\n return extCertInfo.renewApplyRuleItem;\n }\n });\n });\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n\n }],\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n subjectId: scope.subjectId\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n }\n });\n\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.certZone')\n .directive('externalCertDetailInfoDialog', externalCertDetailInfoDialog);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/23.\n */\n(function () {\n 'use strict';\n\n extCertApplyFormViewDialog.$inject = ['$document', '$mdDialog'];\n function extCertApplyFormViewDialog($document, $mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n formType: '=?formType',\n formId: '=?formId',\n formData : '=?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n parent: angular.element($document[0].body),\n template:\n '' +\n '' +\n '
    ' +\n '

    {{ \\'EXTERNAL_CERT_EXAM_APPLICATION\\' | translate}}

    ' +\n '

    {{ \\'EXTERNAL_CERT_REGISTER\\' | translate}}

    ' +\n '

    {{ \\'EXTERNAL_CERT_EXAM_ALLOWANCE_APPLICATION\\' | translate}}

    ' +\n '

    {{ \\'EXTERNAL_CERT_QUALIFY_REWARD_APPLICATION\\' | translate}}

    ' +\n '' +\n '' +\n '{{ \\'ACTIONS.CLOSE\\' | translate}}' +\n 'close' +\n '' +\n '
    ' +\n '
    ' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
    ',\n controller: [ 'userService', 'certZoneService', 'formType', 'formId', function (userService, certZoneService, formType, formId) {\n var vm = this;\n vm.formType = angular.isDefined(formType) ? formType : undefined;\n vm.formId = angular.isDefined(formId) ? formId : undefined;\n\n if(angular.isDefined(vm.formType) && angular.isDefined(vm.formId)){\n certZoneService.getExtCertApplyForm(vm.formType, {formId: vm.formId}).then(function (formData) {\n vm.formData = formData;\n });\n }\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n locals:{\n formType: scope.formType,\n formId: scope.formId,\n formData: scope.formData\n },\n clickOutsideToClose:true,\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.certZone')\n .directive('extCertApplyFormViewDialog', extCertApplyFormViewDialog);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/23.\n */\n(function () {\n 'use strict';\n\n extCertApplyFormTestEditDialog.$inject = ['$document', '$mdDialog'];\n function extCertApplyFormTestEditDialog($document, $mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n formType: '=?formType',\n formId: '=?formId',\n formData : '=?',\n reloadFn: '&?reloadFn'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n parent: angular.element($document[0].body),\n templateUrl: 'app/modules/cert-zone/views/apply-form/test-edit-dialog.html',\n controller: [ '$filter', 'SweetAlert', 'CoreService', 'userService', 'certZoneService', 'formId', function ($filter, SweetAlert, CoreService, userService, certZoneService, formId) {\n var vm = this;\n vm.form = {};\n vm.currencys = undefined;\n vm.formId = angular.isDefined(formId) ? formId : undefined;\n vm.formType = 1;\n if(angular.isDefined(vm.formType) && angular.isDefined(vm.formId)){\n certZoneService.getExtCertApplyForm(vm.formType, {formId: vm.formId}).then(function (data) {\n vm.data = data;\n\n vm.form['testFeeCurrency'] = vm.data.testFeeCurrency;\n vm.form['testFeeAmount'] = vm.data.testFeeAmount;\n vm.form['testFee'] = vm.data.testFee;\n\n if( angular.isDefined(vm.data.userId)) {\n userService.getUserProfileDetailById(vm.data.userId).then(function (applicantInfo) {\n vm.applicantInfo = applicantInfo;\n });\n }\n\n });\n }\n\n vm.calculateTestFee = function () {\n if(angular.isDefined(vm.data)){\n if( angular.isDefined(vm.form.testFeeCurrency) && angular.isDefined(vm.currencys)){\n var currency = $filter('where')(vm.currencys, { value: vm.form.testFeeCurrency});\n if( currency.length > 0 ){\n vm.form.testFee = (parseInt(vm.form.testFeeAmount) * currency[0].operation);\n vm.form.testFee = $filter('number')(vm.form.testFee, 2);\n }\n }\n }\n };\n\n vm.submitApplyForm = function ($formValid) {\n\n function preConfirm() {\n return new Promise(function (resolve) {\n vm.form['testTimes'] = certZoneService.parseTestTimes( vm.data.testTimes );\n vm.form['testFee'] = $filter('replaceAll')(vm.form['testFee'], ',', '');\n angular.forEach(vm.refFiles, function (ref, key) {\n if(ref==='') {\n vm.form['del_' + (parseInt(key)+1)] = 1;\n }\n });\n var uploaderForm = certZoneService.certificateForm({formId: vm.formId}, vm.form, 'ref_', vm.refFiles, 'update-test');\n uploaderForm.then(function(resp) {\n var res = resp.data;\n switch (res.data.status){\n default:\n SweetAlert.insertSuccessQueueStep('', $filter('translate')('MESSAGE.MSG_THE_APPLICATION_FORM_WAS_UPDATED_SUCCESSFULLY'), false, $mdDialog.hide());\n break;\n }\n resolve();\n }, function () {\n CoreService.refreshAccesstoken();\n });\n });\n }\n if($formValid){\n SweetAlert.submitCheck('',$filter('translate')('MESSAGE.MSG_IS_CONTINUE'), preConfirm);\n }else{\n SweetAlert.error('', $filter('translate')('FORM_VALIDATION.THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM'));\n }\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n locals:{\n formType: scope.formType,\n formId: scope.formId,\n formData: scope.formData\n },\n clickOutsideToClose:true,\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function () {\n if (angular.isFunction(scope.reloadFn)) scope.reloadFn();\n }, function() {});\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.certZone')\n .directive('extCertApplyFormTestEditDialog', extCertApplyFormTestEditDialog);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/23.\n */\n(function () {\n 'use strict';\n\n extCertApplyFormRegisterEditDialog.$inject = ['$document', '$mdDialog'];\n function extCertApplyFormRegisterEditDialog($document, $mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n formType: '=?formType',\n formId: '=?formId',\n formData : '=?',\n reloadFn: '&?reloadFn'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n parent: angular.element($document[0].body),\n templateUrl: 'app/modules/cert-zone/views/apply-form/register-edit-dialog.html',\n controller: [ '$filter', 'SweetAlert', 'CoreService', 'userService', 'certZoneService', 'formId', function ($filter, SweetAlert, CoreService, userService, certZoneService, formId) {\n var vm = this;\n vm.form = {};\n vm.currencys = undefined;\n vm.formId = angular.isDefined(formId) ? formId : undefined;\n vm.formType = 2;\n if(angular.isDefined(vm.formType) && angular.isDefined(vm.formId)){\n certZoneService.getExtCertApplyForm(vm.formType, {formId: vm.formId}).then(function (data) {\n vm.data = data;\n\n\n vm.form['acquireDate'] = (angular.isDefined(vm.data.acquireDate) && vm.data.acquireDate !== '') ? moment(vm.data.acquireDate).toDate() : undefined;\n vm.form['expireDate'] = (angular.isDefined(vm.data.expireDate) && vm.data.expireDate !== '') ? moment(vm.data.expireDate).toDate() : undefined;\n vm.form['isForever'] = angular.isDefined(vm.data.isForever) ? vm.data.isForever : 0;\n\n vm.form['licenseId'] = vm.data.licenseId;\n vm.form['comment'] = vm.data.comment;\n\n\n if( angular.isDefined(vm.data.userId)) {\n userService.getUserProfileDetailById(vm.data.userId).then(function (applicantInfo) {\n vm.applicantInfo = applicantInfo;\n });\n }\n\n });\n }\n\n vm.submitApplyForm = function ($formValid) {\n\n function preConfirm() {\n return new Promise(function (resolve) {\n var formData = {};\n formData['licenseId'] = vm.form.licenseId;\n formData['acquireDate'] = (angular.isDefined(vm.form.acquireDate) && vm.form.acquireDate !== '') ? moment(vm.form.acquireDate).format('YYYY/MM/DD') : '';\n formData['expireDate'] = (angular.isDefined(vm.form.expireDate) && vm.form.expireDate !== '') ? moment(vm.form.expireDate).format('YYYY/MM/DD') : '';\n formData['isForever'] = vm.form.isForever;\n formData['comment'] = vm.form.comment;\n angular.forEach(vm.refFiles, function (ref, key) {\n if(ref==='') {\n formData['del_' + (parseInt(key)+1)] = 1;\n }\n });\n var uploaderForm = certZoneService.certificateForm({formId: vm.formId}, formData, 'ref_', vm.refFiles, 'update-register');\n uploaderForm.then(function(resp) {\n var res = resp.data;\n switch (res.data.status){\n default:\n SweetAlert.insertSuccessQueueStep('', $filter('translate')('MESSAGE.MSG_THE_APPLICATION_FORM_WAS_UPDATED_SUCCESSFULLY'), false, $mdDialog.hide());\n break;\n }\n resolve();\n }, function () {\n CoreService.refreshAccesstoken();\n });\n });\n }\n if($formValid){\n SweetAlert.submitCheck('',$filter('translate')('MESSAGE.MSG_IS_CONTINUE'), preConfirm);\n }else{\n SweetAlert.error('', $filter('translate')('FORM_VALIDATION.THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM'));\n }\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n locals:{\n formType: scope.formType,\n formId: scope.formId,\n formData: scope.formData\n },\n clickOutsideToClose:true,\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function () {\n if (angular.isFunction(scope.reloadFn)) scope.reloadFn();\n }, function() {});\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.certZone')\n .directive('extCertApplyFormRegisterEditDialog', extCertApplyFormRegisterEditDialog);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/23.\n */\n(function () {\n 'use strict';\n\n extCertApplyFormDialog.$inject = ['$document', '$mdDialog', '$compile'];\n function extCertApplyFormDialog($document, $mdDialog, $compile) {\n var directive = {\n restrict: 'EA',\n scope: {\n formType: '=?formType',\n formId: '=?formId',\n formData : '=?',\n reloadFn: '&?reloadFn'\n },\n link: function (scope,element/*, attrs*/) {\n scope.$watch(function () {\n return scope.formType;\n },function (newVal) {\n if(angular.isDefined(newVal)){\n switch(newVal){\n case 1:\n element.html(\"{{ 'ACTIONS.FORM_EDIT' | translate}}\");\n break;\n case 2:\n element.html(\"{{ 'ACTIONS.FORM_EDIT' | translate}}\");\n break;\n case 3:\n element.html(\"{{ 'ACTIONS.FORM_EDIT' | translate}}\");\n break;\n case 4:\n element.html(\"{{ 'ACTIONS.FORM_EDIT' | translate}}\");\n break;\n }\n }\n $compile(element.contents())(scope);\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.certZone')\n .directive('extCertApplyFormDialog', extCertApplyFormDialog);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/23.\n */\n(function () {\n 'use strict';\n\n extCertApplyFormCompensationEditDialog.$inject = ['$document', '$mdDialog'];\n function extCertApplyFormCompensationEditDialog($document, $mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n formType: '=?formType',\n formId: '=?formId',\n formData : '=?',\n reloadFn: '&?reloadFn'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n parent: angular.element($document[0].body),\n templateUrl: 'app/modules/cert-zone/views/apply-form/compensation-edit-dialog.html',\n controller: [ '$filter', 'SweetAlert', 'CoreService', 'userService', 'certZoneService', 'formId', function ($filter, SweetAlert, CoreService, userService, certZoneService, formId) {\n var vm = this;\n vm.form = {\n compFee: ''\n };\n vm.currencys = undefined;\n vm.formId = angular.isDefined(formId) ? formId : undefined;\n vm.formType = 3;\n if(angular.isDefined(vm.formType) && angular.isDefined(vm.formId)){\n certZoneService.getExtCertApplyForm(vm.formType, {formId: vm.formId}).then(function (data) {\n vm.data = data;\n if(data.registerFormInfo !== null) vm.data.formData = data.registerFormInfo;\n if(data.testFormInfo !== null) vm.data.formData = data.testFormInfo;\n\n vm.form['compFeeCurrency'] = vm.data.compFeeCurrency;\n vm.form['compFeeAmount'] = vm.data.compFeeAmount;\n vm.form['compFee'] = vm.data.compFee;\n vm.form['realCompFee'] = vm.data.realCompFee;\n\n if( angular.isDefined(vm.data.formData.userId)) {\n userService.getUserProfileDetailById(vm.data.formData.userId).then(function (applicantInfo) {\n vm.applicantInfo = applicantInfo;\n });\n }\n\n });\n }\n\n vm.calculateCompFee = function () {\n if(angular.isDefined(vm.data)){\n if( angular.isDefined(vm.form.compFeeCurrency) && angular.isDefined(vm.currencys)){\n var currency = $filter('where')(vm.currencys, { value: vm.form.compFeeCurrency});\n if( currency.length > 0 ){\n var cardinalNumber = 1;\n if( angular.isDefined(currency[0].operation.split(\".\")[1])){\n cardinalNumber = Math.pow(10, currency[0].operation.split(\".\")[1].toString().length);\n }\n vm.form.compFee = ((parseFloat(vm.form.compFeeAmount) * parseFloat(currency[0].operation * cardinalNumber)) / cardinalNumber);\n }\n }\n\n if(vm.data.compRatio === -1){\n if(vm.form.compFee >= 0){\n if (vm.form.compFee < vm.data.compensationCost) {\n vm.form.realCompFee = vm.form.compFee;\n vm.form.realCompFee = $filter('number')(vm.form.realCompFee, 2);\n }else {\n vm.form.realCompFee = vm.data.compensationCost;\n vm.form.realCompFee = $filter('number')(vm.form.realCompFee, 2);\n }\n }\n } else{\n var cardinalNumber2 = Math.pow(10, vm.form.compFee.toString().length);\n vm.form.realCompFee = (parseFloat(vm.form.compFee * cardinalNumber2) * (parseFloat(vm.data.compRatio) / 100) / cardinalNumber2);\n vm.form.realCompFee = $filter('number')(vm.form.realCompFee, 2);\n }\n vm.form.compFee = $filter('number')(vm.form.compFee, 2);\n }\n };\n\n vm.submitApplyForm = function ($formValid) {\n\n function preConfirm() {\n return new Promise(function (resolve) {\n angular.forEach(vm.refFiles, function (ref, key) {\n if(ref==='') {\n vm.form['del_' + (parseInt(key)+1)] = 1;\n }\n });\n vm.form.realCompFee = $filter('replaceAll')(vm.form.realCompFee, ',', '');\n vm.form.compFee = $filter('replaceAll')(vm.form.compFee, ',', '');\n var uploaderForm = certZoneService.certificateForm({formId: vm.formId}, vm.form, 'ref_', vm.refFiles, 'update-compensation');\n uploaderForm.then(function(resp) {\n var res = resp.data;\n switch (res.data.status){\n default:\n SweetAlert.insertSuccessQueueStep('', $filter('translate')('MESSAGE.MSG_THE_APPLICATION_FORM_WAS_UPDATED_SUCCESSFULLY'), false, $mdDialog.hide());\n break;\n }\n resolve();\n }, function () {\n CoreService.refreshAccesstoken();\n });\n });\n }\n if($formValid){\n SweetAlert.submitCheck('',$filter('translate')('MESSAGE.MSG_IS_CONTINUE'), preConfirm);\n }else{\n SweetAlert.error('', $filter('translate')('FORM_VALIDATION.THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM'));\n }\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n locals:{\n formType: scope.formType,\n formId: scope.formId,\n formData: scope.formData\n },\n clickOutsideToClose:true,\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function () {\n if (angular.isFunction(scope.reloadFn)) scope.reloadFn();\n }, function() {});\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.certZone')\n .directive('extCertApplyFormCompensationEditDialog', extCertApplyFormCompensationEditDialog);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/23.\n */\n(function () {\n 'use strict';\n\n extCertApplyFormCompensationDialog.$inject = ['$document', '$mdDialog'];\n function extCertApplyFormCompensationDialog($document, $mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n formType: '=?formType',\n formId: '=?formId',\n formData : '=?',\n reloadFn: '&?reloadFn'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n parent: angular.element($document[0].body),\n templateUrl: 'app/modules/cert-zone/views/apply-form/compensation-dialog.html',\n controller: [ '$filter', 'SweetAlert', 'CoreService', 'userService', 'certZoneService', 'formId', 'formType', function ($filter, SweetAlert, CoreService, userService, certZoneService, formId, formType) {\n var vm = this;\n vm.form = {};\n vm.currencys = undefined;\n vm.formId = angular.isDefined(formId) ? formId : undefined;\n vm.formType = angular.isDefined(formType) ? formType : undefined;\n if(angular.isDefined(vm.formType) && angular.isDefined(vm.formId)){\n certZoneService.getExtCertApplyForm(vm.formType, {formId: vm.formId}).then(function (formData) {\n vm.formData = formData;\n });\n }\n\n vm.calculateCompFee = function () {\n if(angular.isDefined(vm.formData)){\n if( angular.isDefined(vm.form.compFeeCurrency) && angular.isDefined(vm.currencys)){\n var currency = $filter('where')(vm.currencys, { value: vm.form.compFeeCurrency});\n if( currency.length > 0 ){\n var cardinalNumber = 1;\n if( angular.isDefined(currency[0].operation.split(\".\")[1])){\n cardinalNumber = Math.pow(10, currency[0].operation.split(\".\")[1].toString().length);\n }\n\n vm.form.compFee = ((parseFloat(vm.form.compFeeAmount) * parseFloat(currency[0].operation * cardinalNumber)) / cardinalNumber);\n }\n }\n if(vm.formData.compRatio === -1){\n if(vm.form.compFee >= 0){\n if (vm.form.compFee < vm.formData.compensationCost) {\n vm.form.realCompFee = vm.form.compFee;\n vm.form.realCompFee = $filter('number')(vm.form.realCompFee, 2);\n }else {\n vm.form.realCompFee = vm.formData.compensationCost;\n vm.form.realCompFee = $filter('number')(vm.form.realCompFee, 2);\n }\n }\n } else{\n var cardinalNumber2 = Math.pow(10, vm.form.compFee.toString().length);\n vm.form.realCompFee = (parseFloat(vm.form.compFee * cardinalNumber2) * (parseFloat(vm.formData.compRatio) / 100) / cardinalNumber2);\n vm.form.realCompFee = $filter('number')(vm.form.realCompFee, 2);\n }\n vm.form.compFee = $filter('number')(vm.form.compFee, 2);\n }\n };\n\n vm.submitApplyForm = function ($formValid) {\n\n function preConfirm() {\n return new Promise(function (resolve) {\n vm.form.compFee = $filter('replaceAll')(vm.form.compFee, ',', '');\n vm.form.realCompFee = $filter('replaceAll')(vm.form.realCompFee, ',', '');\n var uploaderForm = certZoneService.certificateForm({rootFormId: vm.formId}, vm.form, 'ref_', vm.refFiles, 'apply-compensation');\n uploaderForm.then(function(resp) {\n var res = resp.data;\n switch (res.data.status){\n default:\n SweetAlert.insertSuccessQueueStep('',res.data.message, false, $mdDialog.hide());\n break;\n }\n resolve();\n }, function () {\n CoreService.refreshAccesstoken();\n });\n });\n }\n if($formValid){\n SweetAlert.submitCheck('',$filter('translate')('MESSAGE.MSG_IS_CONTINUE'), preConfirm);\n }else{\n SweetAlert.error('', $filter('translate')('FORM_VALIDATION.THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM'));\n }\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n locals:{\n formType: scope.formType,\n formId: scope.formId,\n formData: scope.formData\n },\n clickOutsideToClose:true,\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function () {\n if (angular.isFunction(scope.reloadFn)) scope.reloadFn();\n }, function() {});\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.certZone')\n .directive('extCertApplyFormCompensationDialog', extCertApplyFormCompensationDialog);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/23.\n */\n(function () {\n 'use strict';\n\n extCertApplyFormBonusEditDialog.$inject = ['$document', '$mdDialog'];\n function extCertApplyFormBonusEditDialog($document, $mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n formType: '=?formType',\n formId: '=?formId',\n formData : '=?',\n reloadFn: '&?reloadFn'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n parent: angular.element($document[0].body),\n templateUrl: 'app/modules/cert-zone/views/apply-form/bonus-edit-dialog.html',\n controller: [ '$filter', 'SweetAlert', 'CoreService', 'ctlService', 'userService', 'certZoneService', 'formId', function ($filter, SweetAlert, CoreService, ctlService, userService, certZoneService, formId) {\n var vm = this;\n vm.form = {};\n vm.currencys = undefined;\n vm.formId = angular.isDefined(formId) ? formId : undefined;\n vm.formType = 4;\n if(angular.isDefined(vm.formType) && angular.isDefined(vm.formId)){\n certZoneService.getExtCertApplyForm(vm.formType, {formId: vm.formId}).then(function (data) {\n vm.data = data;\n if(data.registerFormInfo !== null) vm.data.formData = data.registerFormInfo;\n if(data.testFormInfo !== null) vm.data.formData = data.testFormInfo;\n\n if( angular.isDefined(vm.data.formData.userId)) {\n userService.getUserProfileDetailById(vm.data.formData.userId).then(function (applicantInfo) {\n vm.applicantInfo = applicantInfo;\n });\n }\n\n if(vm.data.formData.type === 1) {\n vm.form['acquireDate'] = (angular.isDefined(vm.data.acquireDate) && vm.data.acquireDate !== '') ? moment(vm.data.acquireDate).toDate() : undefined;\n vm.form['expireDate'] = (angular.isDefined(vm.data.expireDate) && vm.data.expireDate !== '') ? moment(vm.data.expireDate).toDate() : undefined;\n vm.form['isForever'] = angular.isDefined(vm.data.isForever) ? vm.data.isForever : 0;\n }\n vm.form['licenseId'] = vm.data.licenseId;\n\n vm.form['bonusType'] = angular.isDefined(vm.data.bonusType) ? vm.data.bonusType : '0';\n vm.form['bonusOtherWay'] = angular.isDefined(vm.data.bonusOtherWay) ? vm.data.bonusOtherWay : '0';\n vm.form['bonusCost'] = angular.isDefined(vm.data.bonusCost) ? vm.data.bonusCost : '0';\n });\n }\n\n ctlService.getAllCurrency({selectedValue: 0}).then(function (currencys) {\n var currency = $filter('where')(currencys, {selected: 1});\n if(currency.length > 0){\n vm.currency = currency[0];\n }\n });\n\n\n vm.submitApplyForm = function ($formValid) {\n function preConfirm() {\n return new Promise(function (resolve) {\n var formType = '';\n var formData = {\n bonusType: vm.form.bonusType,\n bonusOtherWay: vm.form.bonusOtherWay,\n bonusCost: vm.form.bonusCost,\n licenseId: vm.form.licenseId\n };\n if(vm.data.formData.type === 1) {\n formType = 'update-test-bonus';\n formData['acquireDate'] = (angular.isDefined(vm.form.acquireDate) && vm.form.acquireDate !== '') ? moment(vm.form.acquireDate).format('YYYY/MM/DD') : '';\n formData['expireDate'] = (angular.isDefined(vm.form.expireDate) && vm.form.expireDate !== '') ? moment(vm.form.expireDate).format('YYYY/MM/DD') : '';\n formData['isForever'] = vm.form.isForever;\n }\n if(vm.data.formData.type === 2) formType = 'update-register-bonus';\n\n if(formType !== ''){\n angular.forEach(vm.refFiles, function (ref, key) {\n if(ref==='') {\n formData['del_' + (parseInt(key)+1)] = 1;\n }\n });\n var uploaderForm = certZoneService.certificateForm({formId: vm.formId}, formData, 'ref_', vm.refFiles, formType);\n uploaderForm.then(function(resp) {\n var res = resp.data;\n switch (res.data.status){\n default:\n SweetAlert.insertSuccessQueueStep('', $filter('translate')('MESSAGE.MSG_THE_APPLICATION_FORM_WAS_UPDATED_SUCCESSFULLY'), false, $mdDialog.hide());\n break;\n }\n resolve();\n }, function () {\n CoreService.refreshAccesstoken();\n });\n }\n });\n }\n if($formValid){\n SweetAlert.submitCheck('',$filter('translate')('MESSAGE.MSG_IS_CONTINUE'), preConfirm);\n }else{\n SweetAlert.error('', $filter('translate')('FORM_VALIDATION.THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM'));\n }\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n locals:{\n formType: scope.formType,\n formId: scope.formId,\n formData: scope.formData\n },\n clickOutsideToClose:true,\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function () {\n if (angular.isFunction(scope.reloadFn)) scope.reloadFn();\n }, function() {});\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.certZone')\n .directive('extCertApplyFormBonusEditDialog', extCertApplyFormBonusEditDialog);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/23.\n */\n(function () {\n 'use strict';\n\n extCertApplyFormBonusDialog.$inject = ['$document', '$mdDialog'];\n function extCertApplyFormBonusDialog($document, $mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n formType: '=?formType',\n formId: '=?formId',\n formData : '=?',\n reloadFn: '&?reloadFn'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n parent: angular.element($document[0].body),\n templateUrl: 'app/modules/cert-zone/views/apply-form/bonus-dialog.html',\n controller: [ '$filter', 'SweetAlert', 'CoreService', 'ctlService', 'userService', 'certZoneService', 'formId', 'formType', function ($filter, SweetAlert, CoreService, ctlService, userService, certZoneService, formId, formType) {\n var vm = this;\n vm.form = {};\n vm.currencys = undefined;\n vm.formId = angular.isDefined(formId) ? formId : undefined;\n vm.formType = angular.isDefined(formType) ? formType : undefined;\n if(angular.isDefined(vm.formType) && angular.isDefined(vm.formId)){\n certZoneService.getExtCertApplyForm(vm.formType, {formId: vm.formId}).then(function (formData) {\n vm.formData = formData;\n if(vm.formType === 1) {\n vm.form = {\n licenseId: vm.formData.licenseId,\n acquireDate: (angular.isDefined(vm.formData.acquireDate) && vm.formData.acquireDate !== '') ? vm.formData.acquireDate : undefined,\n expireDate: (angular.isDefined(vm.formData.expireDate) && vm.formData.expireDate !== '') ? vm.formData.expireDate : undefined\n };\n }\n vm.form.bonusType = angular.isDefined(formData.bonusType) ? formData.bonusType : '0';\n vm.form.bonusOtherWay = angular.isDefined(formData.bonusOtherWay) ? formData.bonusOtherWay : '0';\n vm.form.bonusCost = angular.isDefined(formData.bonusCost) ? formData.bonusCost : '0';\n vm.form.isForever = angular.isDefined(formData.isForever) ? formData.isForever : 0;\n });\n }\n\n ctlService.getAllCurrency({selectedValue: 0}).then(function (currencys) {\n var currency = $filter('where')(currencys, {selected: 1});\n if(currency.length > 0){\n vm.currency = currency[0];\n }\n });\n\n\n vm.submitApplyForm = function ($formValid) {\n function preConfirm() {\n return new Promise(function (resolve) {\n var formType = '';\n var formData = {\n bonusType: vm.form.bonusType,\n bonusOtherWay: vm.form.bonusOtherWay,\n bonusCost: vm.form.bonusCost,\n licenseId: vm.form.licenseId\n };\n if(vm.formType === 1) {\n formType = 'apply-test-bonus';\n formData['licenseId'] = vm.form.licenseId;\n formData['acquireDate'] = (angular.isDefined(vm.form.acquireDate) && vm.form.acquireDate !== '') ? moment(vm.form.acquireDate).format('YYYY/MM/DD') : '';\n formData['isForever'] = vm.form.isForever;\n if(vm.form.isForever === 0){\n formData['expireDate'] = (angular.isDefined(vm.form.expireDate) && vm.form.expireDate !== '') ? moment(vm.form.expireDate).format('YYYY/MM/DD') : '';\n }\n }\n if(vm.formType === 2) formType = 'apply-register-bonus';\n\n if(formType !== ''){\n var uploaderForm = certZoneService.certificateForm({rootFormId: vm.formId}, formData, 'ref_', vm.refFiles, formType);\n uploaderForm.then(function(resp) {\n var res = resp.data;\n switch (res.data.status){\n default:\n SweetAlert.insertSuccessQueueStep('',res.data.message, false, $mdDialog.hide());\n break;\n }\n resolve();\n }, function () {\n CoreService.refreshAccesstoken();\n });\n }\n });\n }\n if($formValid){\n SweetAlert.submitCheck('',$filter('translate')('MESSAGE.MSG_IS_CONTINUE'), preConfirm);\n }else{\n SweetAlert.error('', $filter('translate')('FORM_VALIDATION.THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM'));\n }\n };\n\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n multiple: true,\n controllerAs: '$ctrl',\n targetEvent: ev,\n locals:{\n formType: scope.formType,\n formId: scope.formId,\n formData: scope.formData\n },\n clickOutsideToClose:true,\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function () {\n if (angular.isFunction(scope.reloadFn)) scope.reloadFn();\n }, function() {});\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.certZone')\n .directive('extCertApplyFormBonusDialog', extCertApplyFormBonusDialog);\n\n})();\n\n/**\n * Created by Alan on 2017/5/10.\n */\n(function () {\n 'use strict';\n\n var financialCertRecordSearch = {\n bindings: {},\n templateUrl: 'app/modules/cert-zone/views/financial-cert-record-search.html',\n controller: ['serverSetting', function (serverSetting) {\n var vm = this;\n vm.url = serverSetting.baseConfig.baseURL + '/fc-query-application-default.do?isManager=false';\n }]\n };\n\n angular\n .module('eHRD.modules.certZone')\n .component('financialCertRecordSearch' , financialCertRecordSearch);\n\n})();\n\n/**\n * Created by Alan on 2017/5/10.\n */\n(function () {\n 'use strict';\n\n var financialCertRecordApplication = {\n bindings: {},\n templateUrl: 'app/modules/cert-zone/views/financial-cert-record-application.html',\n controller: ['serverSetting', function (serverSetting) {\n var vm = this;\n vm.url = serverSetting.baseConfig.baseURL + '/fc-application-default.do';\n }]\n };\n\n angular\n .module('eHRD.modules.certZone')\n .component('financialCertRecordApplication' , financialCertRecordApplication);\n\n})();\n\n/**\n * Created by Bruce on 2017/1/18.\n */\n(function () {\n 'use strict';\n\n var externalCertRegister = {\n bindings: {},\n templateUrl: 'app/modules/cert-zone/views/external-cert-register.html',\n controller: ['ctlService', 'certZoneService', '$filter', 'SweetAlert', '$state', '$timeout',\n function (ctlService, certZoneService, $filter, SweetAlert, $state, $timeout) {\n var vm = this;\n vm.certificateForm=\"\";\n vm.params ={\n subjectId: '',\n isReNew: '',\n passCheckApplyForm: false\n };\n vm.formData = {\n acquireDate: null,\n isForever: 1,\n expireDate: null,\n licenseId: '',\n comment: ''\n };\n vm.refFile =[];\n vm.required = false;\n ctlService.getCompanys({}).then(function (companys) {\n vm.companys = companys;\n vm.companyId = vm.companys[0].value;\n vm.companySubject(vm.companyId);\n });\n\n vm.companySubject = function(companyId) {\n var params = {\n companyId: companyId,\n showAllOption: false\n };\n ctlService.getCompanySubjects(params).then(function (subjects) {\n vm.subjects = subjects;\n vm.canReNew = (vm.subjects.length === 0)?\"0\":vm.subjects[0].operation;\n vm.params.subjectId = (vm.subjects.length === 0)?\"\":vm.subjects[0].value;\n vm.params.isReNew = 0;\n });\n };\n\n vm.getCanReNew = function(subjectId){\n vm.canReNew = $filter('filter')(vm.subjects,{'value': subjectId}, true)[0].operation;\n };\n\n vm.selectFile = function (index, files) {\n if(files.length === 0){\n vm.refFile[index] = undefined;\n }else {\n vm.refFile[index] = files[0];\n }\n };\n\n vm.finish = function(formData) {\n vm.required = true;\n vm.certificateForm.$setSubmitted();\n $timeout(function() {\n if(!vm.certificateForm.$valid) {\n SweetAlert.error('', $filter('translate')('FORM_VALIDATION.THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM'));\n }\n else {\n var registerData = {\n acquireDate: moment(formData.acquireDate).format('YYYY/MM/DD'),\n isForever: formData.isForever,\n expireDate: moment(formData.expireDate).format('YYYY/MM/DD'),\n licenseId: formData.licenseId,\n comment: formData.comment\n };\n certZoneService.certificateForm(vm.params, registerData, 'ref_', vm.refFile, 'register').then(function(result) {\n var info = result.data.data;\n if(info.status===1 || info.status===2) {\n SweetAlert.confirmCallback('success', '', info.message, function(){\n $state.go('certZone.externalCertRegister', {}, {reload: true});\n });\n }\n else if(info.status===-1){\n SweetAlert.error('', info.message);\n }\n else if(info.status===-2){\n SweetAlert.check('', info.message, 'warning', function(){\n vm.params.passCheckApplyForm = true;\n vm.finish(vm.formData);\n });\n }\n\n\n });\n }\n }, 200);\n\n\n }\n }]\n };\n\n angular\n .module('eHRD.modules.certZone')\n .component('externalCertRegister' , externalCertRegister);\n\n})();\n\n/**\n * Created by Bruce on 2017/1/18.\n */\n(function () {\n 'use strict';\n\n var externalCertQualifyRewardApplication = {\n bindings: {},\n templateUrl: 'app/modules/cert-zone/views/external-cert-qualify-reward-application.html',\n controller: ['$compile', '$interpolate', '$scope', '$filter', 'NgTableParams', 'ngTableColumnValueService', '$mdDialog', '$document', 'certZoneService', function ($compile, $interpolate, $scope, $filter, NgTableParams, ngTableColumnValueService, $mdDialog, $document, certZoneService) {\n var vm = this;\n prepareTable();\n function prepareTable() {\n vm.tableCols = prepareTableCols();\n vm.certTable = new NgTableParams({\n filter: vm.filter || {}\n }, {\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = value;\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n return certZoneService.getExtCertBonusSearch(params).then(function (datas) {\n tableParams.total(datas.metadata.pagination.total);\n return datas;\n });\n }\n });\n vm.reloadTable = function(){\n if(angular.isDefined(vm.certTable)){\n vm.certTable.reload();\n }\n };\n }\n function prepareTableCols() {\n var cols = [{\n field: 'classification',\n title: $filter('translate')('FIELD.CLASSIFICATION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1\n },{\n field: 'companyName',\n title: $filter('translate')('FIELD.ORIGINAL_FACTORY_NAME'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 2\n },{\n field: 'subjectName',\n title: $filter('translate')('FIELD.CERTIFIED_SUBJECT'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"{{row.subjectName}}\"),\n priority: 1\n },{\n field: 'applyDate',\n title: $filter('translate')('FIELD.EXCERT_APPLY_TEST_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1\n },{\n field: 'relatedRefs',\n title: $filter('translate')('FIELD.REFERENCE_DOCUMENT'),\n getValue: ngTableColumnValueService.htmlReferences,\n priority: 2\n },{\n field: 'action',\n title: $filter('translate')('FIELD.ACTION'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlAction()),\n priority: 1\n }];\n return cols;\n }\n\n function htmlAction() {\n var html = \"\";\n return html;\n }\n }]\n };\n\n angular\n .module('eHRD.modules.certZone')\n .component('externalCertQualifyRewardApplication' , externalCertQualifyRewardApplication);\n\n})();\n\n/**\n * Created by Bruce on 2017/1/18.\n */\n(function () {\n 'use strict';\n\n var externalCertExamApplication = {\n bindings: {},\n templateUrl: 'app/modules/cert-zone/views/external-cert-exam-application.html',\n controller: ['ctlService', 'certZoneService', '$filter', 'SweetAlert', '$state', '$timeout',\n function (ctlService, certZoneService, $filter, SweetAlert, $state, $timeout) {\n var vm = this;\n\n vm.getData = function() {\n vm.params ={\n subjectId: '',\n isReNew: '',\n passCheckApplyForm: false\n };\n vm.testTimes = [{\n value: '',\n time:'',\n repeat: false\n }];\n vm.formData = {\n isForever: 1,\n reason: null,\n licenseId: '',\n comment: '',\n isDomestic: 0,\n address: '',\n testFeeCurrency: '',\n testFeeAmount: 0,\n testFee: '0'\n };\n vm.refFile =[];\n vm.required = false;\n\n ctlService.getCompanys({showAllOption: false}).then(function (companys) {\n vm.companys = companys;\n vm.companyId = vm.companys[0].value;\n vm.companySubject(vm.companyId);\n });\n\n ctlService.getAllCurrency({}).then(function (currencys) {\n vm.currencys = currencys;\n vm.formData.testFeeCurrency = vm.currencys[0].value;\n });\n };\n\n vm.getData();\n\n\n vm.companySubject = function(companyId) {\n var params = {\n companyId: companyId,\n showAllOption: false\n };\n ctlService.getCompanySubjects(params).then(function (subjects) {\n vm.subjects = subjects;\n vm.canReNew = (vm.subjects.length === 0)?\"0\":vm.subjects[0].operation;\n vm.params.subjectId = (vm.subjects.length === 0)?\"\":vm.subjects[0].value;\n vm.params.isReNew = 0;\n });\n };\n\n vm.getCanReNew = function(subjectId){\n vm.canReNew = $filter('filter')(vm.subjects,{'value': subjectId}, true)[0].operation;\n };\n\n vm.getExchangeRate = function(){\n vm.exchangeRate = $filter('filter')(vm.currencys,{'value': vm.formData.testFeeCurrency}, true)[0].operation;\n var cardinalNumber = 1;\n if( angular.isDefined(vm.exchangeRate.split(\".\")[1])){\n cardinalNumber = Math.pow(10, vm.exchangeRate.split(\".\")[1].toString().length);\n }\n if(vm.formData.testFeeAmount!==''){\n vm.formData.testFee = ((vm.exchangeRate * cardinalNumber) * vm.formData.testFeeAmount) / cardinalNumber;\n vm.formData.testFee = $filter('number')(vm.formData.testFee, 2);\n }\n\n };\n\n vm.selectFile = function (index, files) {\n if(files.length === 0){\n vm.refFile[index] = undefined;\n }else {\n vm.refFile[index] = files[0];\n }\n };\n\n vm.addTimeSelect = function(){\n vm.testTimes.push({\n value: '',\n time:'',\n repeat: false\n });\n };\n\n vm.removeTimeSelect = function (index) {\n vm.testTimes.splice(index, 1);\n vm.checkTimeRepeat();\n };\n\n vm.checkTimeRepeat = function(testTime, index) {\n if(angular.isDefined(index))\n vm.testTimes[index].time = $filter('date')(testTime, 'yyyy/MM/dd');\n angular.forEach(vm.testTimes, function (time) {\n time.repeat = ($filter('filter')(vm.testTimes,{time: time.time, value: '!'}, true).length > 1);\n });\n };\n\n vm.finish = function(formData) {\n vm.required = true;\n vm.certificateForm.$setSubmitted();\n var times = $filter('filter')(vm.testTimes,{repeat: false}, true);\n $timeout(function() {\n if(!vm.certificateForm.$valid || vm.testTimes.length !== times.length) {\n SweetAlert.error('', $filter('translate')('FORM_VALIDATION.THERE_IS_NO_FORM_COMPLETED_PLEASE_RE_CONFIRM'));\n }\n else {\n var testTimes=\"\";\n angular.forEach(times, function (time) {\n testTimes += time.time + '_0:0-0:0,';\n });\n var registerData = {\n testTimes: testTimes,\n isForever: formData.isForever,\n reason: formData.reason,\n licenseId: formData.licenseId,\n comment: formData.comment,\n isDomestic: formData.isDomestic,\n address: formData.address,\n testFeeCurrency: formData.testFeeCurrency,\n testFeeAmount: formData.testFeeAmount,\n testFee: $filter('replaceAll')(formData.testFee, ',', '')\n };\n certZoneService.certificateForm(vm.params, registerData, 'ref_', vm.refFile, 'test').then(function(result) {\n var info = result.data.data;\n if(info.status===1 || info.status===2) {\n SweetAlert.confirmCallback('success', '', info.message, function(){\n $state.go('certZone.externalCertExamApplication', {}, {reload: true});\n });\n }\n else if(info.status===-1){\n SweetAlert.error('', info.message);\n }\n else if(info.status===-2){\n SweetAlert.check('', info.message, 'warning', function(){\n vm.params.passCheckApplyForm = true;\n vm.finish(vm.formData);\n });\n }\n\n\n });\n }\n }, 0);\n\n\n }\n }]\n };\n\n angular\n .module('eHRD.modules.certZone')\n .component('externalCertExamApplication' , externalCertExamApplication);\n\n})();\n\n/**\n * Created by Bruce on 2017/1/18.\n */\n(function () {\n 'use strict';\n\n var externalCertExamAllowanceApplication = {\n bindings: {},\n templateUrl: 'app/modules/cert-zone/views/external-cert-exam-allowance-application.html',\n controller: ['$compile', '$interpolate', '$scope', '$filter', 'NgTableParams', 'ngTableColumnValueService', '$mdDialog', '$document', 'certZoneService', function ($compile, $interpolate, $scope, $filter, NgTableParams, ngTableColumnValueService, $mdDialog, $document, certZoneService) {\n var vm = this;\n prepareTable();\n function prepareTable() {\n vm.tableCols = prepareTableCols();\n vm.certTable = new NgTableParams({\n filter: vm.filter || {}\n }, {\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = value;\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n return certZoneService.getExtCertTestCompensateSearch(params).then(function (datas) {\n tableParams.total(datas.metadata.pagination.total);\n return datas;\n });\n }\n });\n\n vm.reloadTable = function(){\n if(angular.isDefined(vm.certTable)){\n vm.certTable.reload();\n }\n };\n }\n function prepareTableCols() {\n var cols = [{\n field: 'classification',\n title: $filter('translate')('FIELD.CLASSIFICATION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1\n },{\n field: 'companyName',\n title: $filter('translate')('FIELD.ORIGINAL_FACTORY_NAME'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 2\n },{\n field: 'subjectName',\n title: $filter('translate')('FIELD.CERTIFIED_SUBJECT'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"{{row.subjectName}}\"),\n priority: 1\n },{\n field: 'unappliedItems',\n title: $filter('translate')('FIELD.EXCERT_UNAPPLIED_ITEMS'),\n getValue: htmlUnappliedItems,\n priority: 2\n },{\n field: 'applyDate',\n title: $filter('translate')('FIELD.EXCERT_APPLY_TEST_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1\n },{\n field: 'relatedRefs',\n title: $filter('translate')('FIELD.REFERENCE_DOCUMENT'),\n getValue: ngTableColumnValueService.htmlReferences,\n priority: 2\n },{\n field: 'action',\n title: $filter('translate')('FIELD.ACTION'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlAction()),\n priority: 1\n }];\n return cols;\n }\n\n function htmlAction() {\n var html = \"\";\n return html;\n }\n\n function htmlUnappliedItems() {\n return '
    {{unappliedItem}}
    ';\n }\n\n }]\n };\n\n angular\n .module('eHRD.modules.certZone')\n .component('externalCertExamAllowanceApplication' , externalCertExamAllowanceApplication);\n\n})();\n\n/**\n * Created by Bruce on 2017/1/18.\n */\n(function () {\n 'use strict';\n\n var externalCertApplicationRecordsSearch = {\n bindings: {},\n templateUrl: 'app/modules/cert-zone/views/external-cert-application-records-search.html',\n controller: ['$window', '$compile', '$interpolate', '$scope', '$filter', 'NgTableParams', 'ngTableColumnValueService', '$mdDialog', '$document', 'certZoneService', function ($window, $compile, $interpolate, $scope, $filter, NgTableParams, ngTableColumnValueService, $mdDialog, $document, certZoneService) {\n var vm = this;\n prepareTable();\n function prepareTable() {\n vm.tableCols = prepareTableCols();\n vm.certTable = new NgTableParams({\n filter: vm.filter || {}\n }, {\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = value;\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n\n if(angular.isDefined(params['beginDate'])) params['beginDate'] = moment(params['beginDate']).format('YYYY/MM/DD');\n if(angular.isDefined(params['endDate'])) params['endDate'] = moment(params['endDate']).format('YYYY/MM/DD');\n return certZoneService.getExtCertApplyRecordSearch(params).then(function (datas) {\n tableParams.total(datas.metadata.pagination.total);\n return datas;\n });\n }\n });\n\n vm.reloadTable = function () {\n vm.certTable.reload();\n };\n\n vm.setFilter = function (filters, isClear) {\n if(isClear){\n filters = {};\n }\n vm.filter = filters;\n vm.certTable.filter(filters);\n vm.certTable.sorting({});\n vm.certTable.reload();\n };\n }\n function prepareTableCols() {\n var cols = [{\n field: 'classification',\n title: $filter('translate')('FIELD.CLASSIFICATION'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: 'Cert_ApplyFormCommon.Type',\n priority: 1\n },{\n field: 'companyName',\n title: $filter('translate')('FIELD.ORIGINAL_FACTORY_NAME'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: 'CompanyName',\n priority: 1\n },{\n field: 'subjectName',\n title: $filter('translate')('FIELD.CERTIFIED_SUBJECT'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"{{row.subjectName}}\"),\n sortable: 'SubjectName',\n priority: 1\n },{\n field: 'applyDate',\n title: $filter('translate')('FIELD.APPLY_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: 'ApplyDate',\n priority: 1\n },{\n field: 'approvalStatus',\n title: $filter('translate')('FIELD.STATUS'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"{{ row.approvalStatus }}{{ row.approvalStatus }}\"),\n priority: 1\n },{\n field: 'relatedRefs',\n title: $filter('translate')('FIELD.REFERENCE_DOCUMENT'),\n getValue: ngTableColumnValueService.htmlReferences,\n priority: 2\n },{\n field: 'relatedForms',\n title: $filter('translate')('FIELD.EXCERT_RELATED_FORM'),\n getValue: htmlRelatedForms,\n priority: 2,\n width: 100\n },{\n field: 'action',\n title: $filter('translate')('FIELD.ACTION'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(htmlAction()),\n priority: 1\n }];\n return cols;\n }\n\n function htmlAction() {\n var html = \"
    \";\n html += \"{{ 'ACTIONS.FORM_VIEW' | translate}}\";\n html += \"
    {{ 'ACTIONS.FORM_EDIT' | translate}}
    \";\n html += \"{{ 'ACTIONS.CANCEL' | translate}}\";\n html += \"
    \";\n return html;\n }\n\n function htmlRelatedForms() {\n return '';\n }\n\n vm.iframeWindow = function(formDetailUrl){\n $window.open(formDetailUrl, 'player', 'width=' + $window.innerWidth / 2 + ',height=' + $window.innerHeight / 2 + ',location=no, scrollbars=yes, resizable=yes');\n };\n\n vm.showPrompt = function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/cert-zone/views/external-cert-application-records-search-dialog.html',\n controller: ['$mdDialog', 'filters', function ($mdDialog, filters) {\n var vm = this;\n vm.filters = {\n formType: angular.isDefined(filters.formType) ? filters.formType : '',\n companyId: angular.isDefined(filters.companyId) ? filters.companyId : '',\n subjectId: angular.isDefined(filters.subjectId) ? filters.subjectId : '',\n status: angular.isDefined(filters.status) ? filters.status : '',\n beginDate: angular.isDefined(filters.beginDate) ? filters.beginDate : undefined,\n endDate: angular.isDefined(filters.endDate) ? filters.endDate : undefined\n };\n\n vm.updateEndDateModel = function () {\n var beginningTime = moment(vm.filters.beginDate);\n var endTime = moment(vm.filters.endDate);\n if(!beginningTime.isBefore(endTime)){\n vm.filters.endDate = vm.filters.beginDate;\n }\n };\n\n vm.cancel = function() {\n $mdDialog.cancel();\n };\n vm.close = function() {\n $mdDialog.cancel();\n };\n vm.submit = function(filters) {\n $mdDialog.hide(filters);\n };\n }],\n controllerAs:'$ctrl',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n filters : vm.certTable.filter()\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function(filters) {\n vm.setFilter(filters, false);\n }, function() { });\n };\n }]\n };\n\n angular\n .module('eHRD.modules.certZone')\n .component('externalCertApplicationRecordsSearch' , externalCertApplicationRecordsSearch);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/23.\n */\n(function () {\n 'use strict';\n\n var extCertApplyFormTestView = {\n bindings: {\n data: '=?data'\n },\n templateUrl: 'app/modules/cert-zone/views/ext-cert-apply-form-test-view.html',\n controller: ['$filter', '$scope', 'userService', 'ctlService', function( $filter, $scope, userService, ctlService ){\n var vm = this;\n vm.data = angular.isUndefined(this.data) ? undefined : this.data;\n var watchData = $scope.$watch(function () {\n return vm.data;\n }, function () {\n if(angular.isDefined(vm.data) ){\n if( angular.isDefined(vm.data.userId)) {\n userService.getUserProfileDetailById(vm.data.userId).then(function (applicantInfo) {\n vm.applicantInfo = applicantInfo;\n });\n ctlService.getAllCurrency({selectedValue: 0}).then(function (currencys) {\n var currency = $filter('where')(currencys, {selected: 1});\n if(currency.length > 0){\n vm.currency = currency[0];\n }\n });\n }\n watchData();\n }\n });\n\n }]\n };\n\n angular.module('eHRD.modules.certZone')\n .component('extCertApplyFormTestView', extCertApplyFormTestView);\n})();\n\n/**\n * Created by Bruce on 2017/3/23.\n */\n(function () {\n 'use strict';\n\n var extCertApplyFormRegView = {\n bindings: {\n data: '=?data'\n },\n templateUrl: 'app/modules/cert-zone/views/ext-cert-apply-form-reg-view.html',\n controller: ['$filter', '$scope', 'userService', function( $filter, $scope, userService ){\n var vm = this;\n vm.data = angular.isUndefined(this.data) ? undefined : this.data;\n var watchData = $scope.$watch(function () {\n return vm.data;\n }, function () {\n if(angular.isDefined(vm.data) ){\n if( angular.isDefined(vm.data.userId)) {\n userService.getUserProfileDetailById(vm.data.userId).then(function (applicantInfo) {\n vm.applicantInfo = applicantInfo;\n });\n }\n watchData();\n }\n });\n\n }]\n };\n\n angular.module('eHRD.modules.certZone')\n .component('extCertApplyFormRegView', extCertApplyFormRegView);\n})();\n\n/**\n * Created by Bruce on 2017/3/23.\n */\n(function () {\n 'use strict';\n\n var extCertApplyFormBonusView = {\n bindings: {\n data: '=?data'\n },\n templateUrl: 'app/modules/cert-zone/views/ext-cert-apply-form-bonus-view.html',\n controller: ['$filter', '$scope', 'userService', 'ctlService', function( $filter, $scope, userService, ctlService ){\n var vm = this;\n vm.data = angular.isUndefined(this.data) ? undefined : this.data;\n var watchData = $scope.$watch(function () {\n return vm.data;\n }, function () {\n if(angular.isDefined(vm.data) ){\n if(angular.isDefined(vm.data.registerFormInfo) && vm.data.registerFormInfo !== null) vm.data.formInfo = vm.data.registerFormInfo;\n if(angular.isDefined(vm.data.testFormInfo) && vm.data.testFormInfo !== null) vm.data.formInfo = vm.data.testFormInfo;\n if( angular.isDefined(vm.data.formInfo.userId)) {\n userService.getUserProfileDetailById(vm.data.formInfo.userId).then(function (applicantInfo) {\n vm.applicantInfo = applicantInfo;\n });\n }\n\n ctlService.getAllCurrency({selectedValue: 0}).then(function (currencys) {\n var currency = $filter('where')(currencys, {selected: 1});\n if(currency.length > 0){\n vm.currency = currency[0];\n }\n });\n watchData();\n }\n });\n\n }]\n };\n\n angular.module('eHRD.modules.certZone')\n .component('extCertApplyFormBonusView', extCertApplyFormBonusView);\n})();\n\n/**\n * Created by Bruce on 2017/1/18.\n */\n(function () {\n 'use strict';\n\n var certRecordsSearch = {\n bindings: {},\n templateUrl: 'app/modules/cert-zone/views/cert-records-search.html',\n controller: ['PermPermissionStore', '$interpolate', '$scope', '$filter', 'NgTableParams', 'ngTableColumnValueService', '$mdDialog', '$document', 'certZoneService', function (PermPermissionStore, $interpolate, $scope, $filter, NgTableParams, ngTableColumnValueService, $mdDialog, $document, certZoneService) {\n var vm = this;\n var permission = null;\n permission = PermPermissionStore.getPermissionDefinition('Modules.certification.inner');\n vm.hasCertificationInnerPermission = angular.isDefined(permission);\n permission = PermPermissionStore.getPermissionDefinition('Modules.certification.ext');\n vm.hasCertificationExtPermission = angular.isDefined(permission);\n vm.certType = ( (vm.hasCertificationInnerPermission) ? 'inner' : ((vm.hasCertificationExtPermission) ? 'ext': '')); // inner or ext\n\n\n vm.filter = {\n certType: vm.certType,\n validDateType: 0\n };\n\n function prepareTable() {\n vm.tableCols = prepareTableCols();\n vm.certTable = new NgTableParams({\n // sorting: {},\n filter: vm.filter\n }, {\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = value;\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n var isExtCert = (vm.certType === 'ext');\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n\n if(angular.isDefined(params['accessBegin'])) params['accessBegin'] = moment(params['accessBegin']).format('YYYY/MM/DD');\n if(angular.isDefined(params['accessEnd'])) params['accessEnd'] = moment(params['accessEnd']).format('YYYY/MM/DD');\n return certZoneService.getCertRecords(isExtCert, params).then(function (certData) {\n tableParams.total(certData.metadata.pagination.total);\n return certData;\n });\n }\n });\n\n vm.setFilter = function (filters, isClear) {\n if(isClear){\n filters = {};\n }\n vm.certType = angular.isDefined(filters.certType) ? filters.certType : '';\n vm.filter = filters;\n vm.certTable.filter(filters);\n vm.certTable.sorting({});\n vm.certTable.reload();\n };\n }\n\n function prepareTableCols() {\n var cols = [];\n switch (vm.certType){\n case 'inner':\n cols = [{\n field: 'classificationName',\n title: $filter('translate')('FIELD.CERTIFICATE_TYPE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n sortable: 'ClassificationName',\n priority: 1\n },{\n field: 'programName',\n sortable: 'Programs.ProgramName',\n title: $filter('translate')('FIELD.CERTIFICATION_NAME'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"{{row.programName}}\"),\n priority: 1\n },{\n field: 'credits',\n title: $filter('translate')('FIELD.CREDITS'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1,\n columnType: 'number',\n show: false\n },{\n field: 'acquireDate',\n sortable: 'Cert_SubjectToUser.AcquireDate',\n title: $filter('translate')('FIELD.ACQUIRE_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1,\n columnType: 'date',\n width: 100\n },{\n field: 'validDate',\n sortable: 'Cert_SubjectToUser.ExpireDate',\n title: $filter('translate')('FIELD.VALID_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1,\n columnType: 'date',\n width: 100\n },{\n field: 'score',\n title: $filter('translate')('FIELD.SCORE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n columnType: 'number',\n width: 50,\n priority: 2\n },{\n field: 'status',\n sortable: 'Cert_SubjectToUser.Status',\n title: $filter('translate')('FIELD.STATUS'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 3\n },{\n field: 'bonus',\n title: $filter('translate')('FIELD.BONUS'),\n getValue: ngTableColumnValueService.htmlTextValue,\n columnType: 'number',\n priority: 2\n },{\n field: 'references',\n title: $filter('translate')('FIELD.REFERENCE_MATERIAL'),\n getValue: ngTableColumnValueService.htmlReferences,\n priority: 2\n }];\n break;\n case 'ext':\n cols = [{\n field: 'companyName',\n sortable: 'Cert_Company.CompanyId',\n title: $filter('translate')('FIELD.ORIGINAL_FACTORY_NAME'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1,\n width: 200\n },{\n field: 'subjectName',\n sortable: 'Cert_Subject.SubjectId',\n title: $filter('translate')('FIELD.CERTIFIED_SUBJECT'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"{{row.subjectName}}\"),\n priority: 1,\n width: 200\n },{\n field: 'credits',\n title: $filter('translate')('FIELD.CREDITS'),\n getValue: ngTableColumnValueService.htmlTextValue,\n show: false,\n priority: 1\n },{\n field: 'acquireDate',\n sortable: 'Cert_SubjectToUser.AcquireDate',\n title: $filter('translate')('FIELD.ACQUIRE_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1,\n width: 100\n },{\n field: 'validDate',\n sortable: 'Cert_SubjectToUser.ExpireDate',\n title: $filter('translate')('FIELD.VALID_DATE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 1,\n width: 100\n },{\n field: 'subjectToUserCode',\n title: $filter('translate')('FIELD.CERTIFICATE_NUMBER'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 2\n },{\n field: 'grade',\n title: $filter('translate')('FIELD.SUBJECT_TO_USER_GRADE'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 2\n },{\n field: 'bonus',\n title: $filter('translate')('FIELD.BONUS'),\n getValue: ngTableColumnValueService.htmlTextValue,\n priority: 2\n },{\n field: 'relatedRefs',\n title: $filter('translate')('FIELD.REFERENCE_DOCUMENT'),\n getValue: ngTableColumnValueService.htmlReferences,\n priority: 2\n },{\n field: 'action',\n title: $filter('translate')('FIELD.ACTION'),\n getValue: ngTableColumnValueService.interpolatedValue,\n interpolateExpr: $interpolate(\"{{ 'FIELD.EXCERT_ADD_LICENSE_INFO' | translate}}{{row.subjectId}}\"),\n priority: 1\n }];\n break;\n }\n\n\n return cols;\n }\n\n $scope.$watch(function () {\n return vm.certType\n }, function () {\n prepareTable();\n });\n\n\n vm.showPrompt = function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/cert-zone/views/cert-records-search-dialog.html',\n controller: ['$mdDialog', 'filters', function ($mdDialog, filters) {\n var vm = this;\n vm.filters = {\n companyId: angular.isDefined(filters.companyId) ? filters.companyId : '',\n subjectId: angular.isDefined(filters.subjectId) ? filters.subjectId : '',\n certClassId: angular.isDefined(filters.certClassId) ? filters.certClassId : '',\n certId: angular.isDefined(filters.certId) ? filters.certId : '',\n certType: angular.isDefined(filters.certType) ? filters.certType : '' ,\n validDateType: angular.isDefined(filters.validDateType) ? filters.validDateType : 0,\n accessBegin: angular.isDefined(filters.accessBegin) ? filters.accessBegin : undefined,\n accessEnd: angular.isDefined(filters.accessEnd) ? filters.accessEnd : undefined\n };\n\n vm.updateEndDateModel = function () {\n var beginningTime = moment(vm.filters.accessBegin);\n var endTime = moment(vm.filters.accessEnd);\n if(!beginningTime.isBefore(endTime)){\n vm.filters.accessEnd = vm.filters.accessBegin;\n }\n };\n\n vm.cancel = function() {\n $mdDialog.cancel();\n };\n vm.close = function() {\n $mdDialog.cancel();\n };\n vm.submit = function(filters) {\n $mdDialog.hide(filters);\n };\n }],\n controllerAs:'$ctrl',\n parent: angular.element($document[0].body),\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n filters : vm.certTable.filter()\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function(filters) {\n vm.setFilter(filters, false);\n }, function() { });\n };\n }]\n };\n\n angular\n .module('eHRD.modules.certZone')\n .component('certRecordsSearch' , certRecordsSearch);\n\n})();\n\n/**\n * Created by Bruce on 2017/3/23.\n */\n(function () {\n 'use strict';\n\n var certApplyformCompensationView = {\n bindings: {\n data: '=?data'\n },\n templateUrl: 'app/modules/cert-zone/views/cert-applyform-compensation-view.html',\n controller: ['$filter', '$scope', 'userService', function( $filter, $scope, userService ){\n var vm = this;\n vm.data = angular.isUndefined(this.data) ? undefined : this.data;\n var watchData = $scope.$watch(function () {\n return vm.data;\n }, function () {\n if(angular.isDefined(vm.data) ){\n if(angular.isDefined(vm.data.registerFormInfo) && vm.data.registerFormInfo !== null) vm.data.formInfo = vm.data.registerFormInfo;\n if(angular.isDefined(vm.data.testFormInfo) && vm.data.testFormInfo !== null) vm.data.formInfo = vm.data.testFormInfo;\n if( angular.isDefined(vm.data.formInfo.userId)) {\n userService.getUserProfileDetailById(vm.data.formInfo.userId).then(function (applicantInfo) {\n vm.applicantInfo = applicantInfo;\n });\n }\n watchData();\n }\n });\n\n }]\n };\n\n angular.module('eHRD.modules.certZone')\n .component('certApplyformCompensationView', certApplyformCompensationView);\n})();\n\n/**\n * Created by Alan on 2017/1/19.\n */\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.calendar',[]);\n\n})();\n\n/**\n * Created by Alan on 2017/1/19.\n */\n(function() {\n 'use strict';\n\n calendarService.$inject = [ '$rootScope', '$q', '$queueFactory', 'Restangular'];\n\n function calendarService( $rootScope, $q, $queueFactory, Restangular) {\n\n /*\n * Build collection api/calendar\n */\n var _service = Restangular.all('calendar');\n\n function getCalendarByYearMonthDay(year, month, day, params) {\n /*\n * api/calendar/{{yyyy}}/{{mm}}/{{dd}}?userId={userId}&rangeBefore={rangeBefore}&rangeAfter={rangeAfter}&courseType={courseType}\n * */\n return _service\n .one(year, month)\n .customGETLIST(day, params);\n }\n\n function getCalendarByYearMonth(year, month, params) {\n /*\n * api/calendar/{{yyyy}}/{{mm}}/{{dd}}?userId={userId}&rangeBefore={rangeBefore}&rangeAfter={rangeAfter}&courseType={courseType}\n * */\n return _service\n .one(year, null)\n .customGETLIST(month, params);\n }\n\n function getCalendarEvents(date, isOnlyDay) {\n isOnlyDay = isOnlyDay || false;\n var year, month, day;\n if(!moment.isMoment(date)){\n date = moment(date);\n }\n year = date.format('YYYY');\n month = date.format('M');\n day = date.format('D');\n\n var defer = $q.defer();\n if(!isOnlyDay){\n getCalendarByYearMonth(year, month, {}).then(dateProcess);\n }else {\n getCalendarByYearMonthDay(year, month, day, {}).then(dateProcess);\n }\n\n function dateProcess(data) {\n defer.resolve(data);\n }\n return defer.promise;\n }\n\n function minCalendarProcess(calendars, resObj, moreAction, linkAction) {\n resObj = resObj || false;\n moreAction = moreAction || undefined;\n linkAction = linkAction || undefined;\n var minCalendars;\n if(resObj){\n minCalendars = {};\n angular.forEach(calendars, function (calendar) {\n if(angular.isUndefined(minCalendars[calendar.dateStr])){\n minCalendars[calendar.dateStr] = [];\n }\n if(angular.isFunction(moreAction)){\n calendar.moreAction = moreAction;\n }\n if(angular.isFunction(linkAction)){\n calendar.linkAction = linkAction;\n }\n minCalendars[calendar.dateStr].push(calendar);\n });\n }else {\n minCalendars = [];\n angular.forEach(calendars, function (calendar) {\n minCalendars.push(calendar.dateStr);\n });\n }\n\n return minCalendars;\n }\n\n\n return {\n getCalendar: getCalendarByYearMonthDay,\n getCalendarByYearMonth: getCalendarByYearMonth,\n\n getCalendarEvents: getCalendarEvents,\n\n getCalendarWithOneBeforeAndAfter: function (baseDate) {\n if(!moment.isMoment(baseDate)) baseDate = moment(baseDate);\n var queueFinish = false;\n var queue = $queueFactory(1);\n var calendarEvents = [];\n queue.enqueue(function(){\n return getCalendarEvents(moment(baseDate.toDate()).add(-1, 'months')).then(function (data) {\n calendarEvents = calendarEvents.concat(data);\n });\n });\n queue.enqueue(function(){\n return getCalendarEvents(moment(baseDate.toDate())).then(function (data) {\n calendarEvents = calendarEvents.concat(data);\n });\n });\n queue.enqueue(function(){\n return getCalendarEvents(moment(baseDate.toDate()).add(1, 'months')).then(function (data) {\n calendarEvents = calendarEvents.concat(data);\n });\n });\n\n queue.enqueue(function(){\n queueFinish = true;\n });\n\n\n var defer = $q.defer();\n var watchQueueFinishChanged = $rootScope.$watch(function() {\n return queueFinish;\n }, function watchCallback(newValue) {\n if(angular.isDefined(newValue) && queueFinish){\n defer.resolve(calendarEvents);\n }\n });\n\n defer.promise.then(function () {\n $rootScope.$on('$destroy', watchQueueFinishChanged);\n });\n\n return defer.promise;\n },\n\n minCalendarProcess: minCalendarProcess\n };\n\n }\n\n angular.module('eHRD.modules.calendar')\n .factory('calendarService', calendarService);\n\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.approve', []);\n\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n\n(function () {\n 'use strict';\n approveService.$inject = ['Restangular', '$httpParamSerializer'];\n function approveService(Restangular, $httpParamSerializer){\n\n /*\n * Build collection api/approval\n */\n var _approveService = Restangular.all('approval');\n\n return {\n getFormsHandleByTodo: function (params) {\n /*\n * api/approval/forms-handleby-todo\n * */\n return _approveService\n .customGETLIST('forms-handleby-todo', params);\n },\n\n getFormsHandleByFinish: function (params) {\n /*\n * api/approval/forms-handleby-finish?status={status}&eventtype={eventtype}&applydate_from={from}&applydate_end={end}&applicant_keyword={applicant}\n * */\n return _approveService\n .customGETLIST('forms-handleby-finish', params);\n },\n\n getEvetTypes: function () {\n /*\n * api/approval/evet-types\n * */\n return _approveService\n .customGET('evet-types');\n },\n\n getFormsApplyBy: function (params) {\n /*\n * api/approval/forms-applyby? status={status}&eventtype={eventtype}&applydate_from={applydate_from}&applydate_end={applydate_end}applicant_keyword={applicant_keyword}&sort={sort}&order={order}¤t_page={currentPage}&list_size={listSize}\n * */\n return _approveService\n .customGETLIST('forms-applyby', params);\n },\n\n getFormsActionStatus: function (params) {\n /*\n * api/approval/forms-action-status?ids={ids}&type={type}\n * */\n return _approveService\n .customGET('forms-action-status', params);\n },\n\n updateFormsActionStatus: function (formData,params) {\n /*\n * api/approval/forms-application\n * */\n return _approveService\n .customPUT($httpParamSerializer(formData), 'forms-application', params, {\"content-type\": \"application/x-www-form-urlencoded\"});\n }\n\n\n\n };\n\n }\n\n angular.module('eHRD.modules.approve')\n .factory('approveService', approveService);\n\n})();\n\n/**\n * Created by Alan on 2016/12/1.\n */\n\n(function () {\n 'use strict';\n\n formStatusDialog.$inject = ['$mdDialog'];\n function formStatusDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n workflowId: '=?',\n approveType: '@?',\n table: '=?',\n clear: '&?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/approve/views/form-status-dialog.html',\n controller: ['approveService', '$mdDialog', 'workflowId', 'approveType', 'table', 'clear', 'SweetAlert', '$filter',\n function (approveService, $mdDialog, workflowId, approveType, table, clear, SweetAlert, $filter) {\n var vm = this;\n vm.approveType = approveType;\n vm.reason='';\n var params={\n ids: workflowId,\n approveType: approveType\n };\n approveService.getFormsActionStatus(params).then(function (actionStatus) {\n vm.actionStatus = actionStatus;\n });\n vm.submit = function() {\n var form={\n \"ids\": workflowId,\n \"type\": approveType,\n \"reason\": vm.reason,\n \"oralReportScore\": vm.actionStatus.oralReportScore,\n \"teachingScore\": vm.actionStatus.innerTeachingScore,\n \"extraReportScore\": vm.actionStatus.extraReportScore\n };\n if(approveType==='reject' && vm.reason===''){\n SweetAlert.error('', $filter('translate')( \"MESSAGE.MSG_PLEASE_FILE_IN_THE_REASON_FOR_REJECT\"));\n }\n else{\n approveService.updateFormsActionStatus(form, \"\").then(function (result) {\n if(result.status === 1){\n if(angular.isFunction(clear)){\n clear();\n }\n table.reload();\n $mdDialog.cancel();\n }else{\n SweetAlert.error('', result.message);\n }\n });\n }\n\n };\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n workflowId: scope.workflowId,\n approveType: scope.approveType,\n table: scope.table,\n clear: scope.clear\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n });\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.approve')\n .directive('formStatusDialog', formStatusDialog);\n\n})();\n\n/**\n * Created by Alan on 2016/11/30.\n */\n\n(function () {\n 'use strict';\n\n approveRecordsSearchDialog.$inject = ['$mdDialog'];\n function approveRecordsSearchDialog($mdDialog) {\n var directive = {\n restrict: 'A',\n scope: {\n filter: '&',\n table: '=',\n permissionType: '@?'\n },\n link: function (scope, element) {\n element.bind('click', function(ev) {\n $mdDialog.show({\n templateUrl: 'app/modules/approve/views/manager-approve-records-search-dialog.html',\n controller: ['approveService', '$mdDialog', 'filters', 'permissionType', 'SweetAlert', '$filter',\n function (approveService, $mdDialog, filters, permissionType, SweetAlert, $filter) {\n var vm = this;\n vm.permissionType = permissionType;\n approveService.getEvetTypes().then(function (evetTypes) {\n vm.evetTypes = evetTypes;\n });\n vm.filters = {\n status: angular.isDefined(filters.status) ? filters.status : 0,\n eventtype: angular.isDefined(filters.eventtype) ? filters.eventtype : 0,\n applydate_from: (angular.isDefined(filters.applydate_from) && filters.applydate_from!==\"\") ? new Date(filters.applydate_from): \"\",\n applydate_end: (angular.isDefined(filters.applydate_end) && filters.applydate_end!==\"\") ? new Date(filters.applydate_end) : \"\",\n applicant_keyword: angular.isDefined(filters.applicant_keyword) ? filters.applicant_keyword : \"\"\n };\n\n vm.updateEndDateModel = function () {\n var beginningTime = moment(vm.startDate);\n var endTime = moment(vm.endDate);\n if(!beginningTime.isBefore(endTime)){\n vm.endDate = vm.startDate;\n }\n };\n\n vm.submit = function(filters) {\n\n if (filters.applydate_end < filters.applydate_from && filters.applydate_from!='' && filters.applydate_end!='') {\n SweetAlert.error('',$filter('translate')('MESSAGE.MSG_THE_START_DATE_CAN_NOT_BE_GREATER_THAN_THE_END_DATE'));\n }\n else {\n $mdDialog.hide(filters);\n }\n\n };\n vm.close = function() {\n $mdDialog.cancel();\n };\n }],\n controllerAs: '$ctrl',\n targetEvent: ev,\n clickOutsideToClose:true,\n locals : {\n filters : scope.table.filter(),\n permissionType: scope.permissionType\n },\n fullscreen: true // Only for -xs, -sm breakpoints.\n }).then(function(filters) {\n filters.applydate_from = angular.isDate(filters.applydate_from)?moment(filters.applydate_from).format(\"YYYY/MM/DD\"):\"\";\n filters.applydate_end = angular.isDate(filters.applydate_end)?moment(filters.applydate_end).format(\"YYYY/MM/DD\"):\"\";\n scope.table.filter(filters);\n scope.table.reload();\n }, function() { }\n );\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.modules.approve')\n .directive('approveRecordsSearchDialog', approveRecordsSearchDialog);\n\n})();\n\n// /**\n// * Created by Bruce on 2016/9/12.\n// */\n//\n// (function () {\n// 'use strict';\n//\n// ApproveController.$inject = ['$scope', 'NgTableParams', 'approveService', 'ngDialog', 'SweetAlert'];\n// function ApproveController($scope, NgTableParams, approveService, ngDialog, SweetAlert) {\n//\n//\n// }\n//\n// angular.module('eHRD.modules.approve')\n// .controller('ApproveController', ApproveController);\n//\n// })();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var userApproveRecords = {\n bindings: {\n defaultParams: '=?defaultParams'\n },\n templateUrl: 'app/modules/approve/views/user-approve-records.html',\n controller: [ 'NgTableParams', 'approveService', '$window', '$filter', function( NgTableParams, approveService, $window, $filter ){\n var vm = this;\n vm.defaultParams = angular.isDefined(this.defaultParams) ? this.defaultParams : null;\n\n var defaultFilter = {};\n if(angular.isDefined(vm.defaultParams)){\n if(angular.isDefined(vm.defaultParams.status)) defaultFilter['status'] = vm.defaultParams.status;\n if(angular.isDefined(vm.defaultParams.eventtype)) defaultFilter['eventtype'] = vm.defaultParams.eventtype;\n if(angular.isDefined(vm.defaultParams.applydate_from)) defaultFilter['applydate_from'] = vm.defaultParams.applydate_from;\n if(angular.isDefined(vm.defaultParams.applydate_end)) defaultFilter['applydate_end'] = vm.defaultParams.applydate_end;\n if(angular.isDefined(vm.defaultParams.applicant_keyword)) defaultFilter['applicant_keyword'] = vm.defaultParams.applicant_keyword;\n }\n\n if(angular.isDefined(vm.defaultParams)){\n var defaultSorting = {};\n if(angular.isDefined(vm.defaultParams.sort) && angular.isDefined(vm.defaultParams.order)){\n defaultSorting[vm.defaultParams.sort] = vm.defaultParams.order;\n }\n }\n vm.userApproveRecordsTable = new NgTableParams({\n count: angular.isDefined(vm.defaultParams) ? vm.defaultParams.list_size: 10,\n page: angular.isDefined(vm.defaultParams) ? vm.defaultParams.current_page: 1,\n sorting: defaultSorting || { IssuedDate: \"desc\" },\n filter: defaultFilter\n }, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc' || $filter('uppercase')(value) === 'DESC') ? \"DESC\" : \"ASC\");\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n vm.backStateParams = params;\n return approveService.getFormsApplyBy(params).then(function (records) {\n tableParams.total(records.metadata.pagination.total);\n return records;\n });\n }\n });\n\n vm.iframeWindow = function(formDetailUrl){\n $window.open(formDetailUrl, 'player', 'width=' + $window.innerWidth / 2 + ',height=' + $window.innerHeight / 2 + ',location=no, scrollbars=yes, resizable=yes');\n };\n }]\n };\n\n angular.module('eHRD.modules.approve')\n .component('userApproveRecords', userApproveRecords);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var managerApprove = {\n bindings: {\n defaultParams: '=?defaultParams'\n },\n templateUrl: 'app/modules/approve/views/manager-approve.html',\n controller: [ '$scope', 'NgTableParams', 'approveService', 'ngDialog', 'SweetAlert', '$window', '$filter',\n function( $scope, NgTableParams, approveService, ngDialog, SweetAlert, $window, $filter ){\n var vm = this;\n vm.selectApprove = [];\n vm.selectAll = false;\n\n if(angular.isDefined(vm.defaultParams)){\n var defaultSorting = {};\n if(angular.isDefined(vm.defaultParams.sort) && angular.isDefined(vm.defaultParams.order)){\n defaultSorting[vm.defaultParams.sort] = vm.defaultParams.order;\n }\n }\n\n vm.approveTable = new NgTableParams({\n count: angular.isDefined(vm.defaultParams) ? vm.defaultParams.list_size: 10,\n page: angular.isDefined(vm.defaultParams) ? vm.defaultParams.current_page: 1,\n sorting: defaultSorting || { IssuedDate: \"desc\" }\n }, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc' || $filter('uppercase')(value) === 'DESC') ? \"DESC\" : \"ASC\");\n });\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n vm.backStateParams = params;\n return approveService.getFormsHandleByTodo(params).then(function (approve) {\n vm.approve = approve;\n // params.count(data.metadata.pagination.perPage);\n tableParams.total(approve.metadata.pagination.total);\n return approve;\n });\n }\n });\n\n // watch for check all checkbox\n $scope.$watch(function() {\n return vm.selectAll;\n }, function(value) {\n angular.forEach(vm.approve, function(approve) {\n vm.selectApproveCheckbox(approve, value);\n });\n });\n\n vm.selectApproveCheckbox = function(approve, selectAll) {\n if($filter('arrayObjectIndexOf')(vm.selectApprove, approve) === -1 && selectAll!==false)\n vm.selectApprove.push(approve);\n else if($filter('arrayObjectIndexOf')(vm.selectApprove, approve) > -1 && angular.isUndefined(selectAll) ){\n vm.selectApprove.splice($filter('arrayObjectIndexOf')(vm.selectApprove, approve), 1);\n }\n else if(selectAll===false)\n vm.selectApprove.splice($filter('arrayObjectIndexOf')(vm.selectApprove, approve), 1);\n };\n\n vm.idList = function(){\n var idList=\"\";\n angular.forEach(vm.selectApprove, function(approve) {\n idList += (idList==='')?approve.approvalId:\",\" + approve.approvalId;\n });\n return idList;\n };\n\n vm.clear = function(){\n vm.selectAll = false;\n vm.selectApprove = [];\n };\n\n vm.openStatus = function(/*row*/){\n // console.log(row);\n ngDialog.open({\n template: 'app/modules/approve/views/approve-status.html',\n className: 'ngdialog-theme-default',\n width: '70%',\n height: 400,\n closeByDocument: false,\n trapFocus: false,\n scope: $scope\n });\n };\n\n vm.iframeWindow = function(formDetailUrl){\n $window.open(formDetailUrl, 'player', 'width=' + $window.innerWidth / 2 + ',height=' + $window.innerHeight / 2 + ',location=no, scrollbars=yes, resizable=yes');\n };\n\n }]\n };\n\n angular.module('eHRD.modules.approve')\n .component('managerApprove', managerApprove);\n})();\n\n/**\n * Created by Bruce on 2016/11/22.\n */\n(function () {\n 'use strict';\n\n var managerApproveRecords = {\n bindings: {\n defaultParams: '=?defaultParams'\n },\n templateUrl: 'app/modules/approve/views/manager-approve-records.html',\n controller: [ 'NgTableParams', 'approveService', '$window', function( NgTableParams, approveService, $window ){\n var vm = this;\n var defaultFilter = {};\n if(angular.isDefined(vm.defaultParams)){\n if(angular.isDefined(vm.defaultParams.status)) defaultFilter['status'] = vm.defaultParams.status;\n if(angular.isDefined(vm.defaultParams.eventtype)) defaultFilter['eventtype'] = vm.defaultParams.eventtype;\n if(angular.isDefined(vm.defaultParams.applydate_from)) defaultFilter['applydate_from'] = vm.defaultParams.applydate_from;\n if(angular.isDefined(vm.defaultParams.applydate_end)) defaultFilter['applydate_end'] = vm.defaultParams.applydate_end;\n if(angular.isDefined(vm.defaultParams.applicant_keyword)) defaultFilter['applicant_keyword'] = vm.defaultParams.applicant_keyword;\n }\n\n if(angular.isDefined(vm.defaultParams)){\n var defaultSorting = {};\n if(angular.isDefined(vm.defaultParams.sort) && angular.isDefined(vm.defaultParams.order)){\n defaultSorting[vm.defaultParams.sort] = vm.defaultParams.order;\n }\n }\n\n vm.managerApproveRecordsTable = new NgTableParams({\n count: angular.isDefined(vm.defaultParams) ? vm.defaultParams.list_size: 10,\n page: angular.isDefined(vm.defaultParams) ? vm.defaultParams.current_page: 1,\n sorting: defaultSorting || { IssuedDate: \"desc\" },\n filter: defaultFilter\n }, {\n counts: [1,5,10,15],\n getData: function(tableParams) {\n var params = {};\n angular.forEach(tableParams.sorting(), function (value, key) {\n params.sort = key;\n params.order = ((value === 'desc') ? \"DESC\" : \"ASC\");\n });\n\n angular.forEach(tableParams.filter(), function (value, key) {\n params[key] = value;\n });\n\n params.current_page = tableParams.url().page;\n params.list_size = tableParams.url().count;\n vm.backStateParams = params;\n return approveService.getFormsHandleByFinish(params).then(function (records) {\n tableParams.total(records.metadata.pagination.total);\n return records;\n });\n }\n });\n\n vm.iframeWindow = function(formDetailUrl){\n $window.open(formDetailUrl, 'player', 'width=' + $window.innerWidth / 2 + ',height=' + $window.innerHeight / 2 + ',location=no, scrollbars=yes, resizable=yes');\n };\n }]\n };\n\n angular.module('eHRD.modules.approve')\n .component('managerApproveRecords', managerApproveRecords);\n})();\n\n/**\n * Created by Bruce on 2017/1/23.\n */\n(function () {\n 'use strict';\n\n var approveStatus = {\n bindings: {\n workflowId: '=?workflowId'\n },\n templateUrl: 'app/modules/approve/views/approve-status.html',\n controller: [ '$scope', 'serverSetting',\n function( $scope, serverSetting){\n var vm = this;\n vm.url = serverSetting.baseConfig.baseURL + '/apv_status.do?isFromInbox=1&id='+ this.workflowId;\n }]\n };\n\n angular.module('eHRD.modules.approve')\n .component('approveStatus', approveStatus);\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n treeTableRun.$inject = ['$templateCache'];\n function treeTableRun($templateCache) {\n $templateCache.put(\n 'template/TreeTable/TreeTable.html',\n ['',\n ' ',\n ' ',\n ' ',\n ' ',\n ' ',\n ' ',\n ' ',\n ' ',\n ' ',\n ' ',\n ' ',\n '
    ',\n ' {{expandingProperty.displayName || expandingProperty.field || expandingProperty}}',\n ' <\\/th>',\n ' ',\n ' {{col.displayName || col.field}}',\n '
    ',\n ' ',\n ' ',\n ' ',\n ' {{node[expandingProperty.field] || node[expandingProperty]}}',\n ' ',\n ' {{node[col.field]}}',\n '
    '].join('\\n')\n );\n\n $templateCache.put(\n 'template/TreeTable/TreeTableStatusCopy.html',\n ''\n );\n\n $templateCache.put(\n 'template/TreeTable/TreeTableStatusMove.html',\n ''\n );\n }\n\n angular.module('eHRD.kernel.uiElements.treeTable')\n .run(treeTableRun);\n\n})();\n\n/**\n * Created by Bruce on 2016/8/22.\n */\n(function () {\n 'use strict';\n\n var treeTableConfig = {\n tree: 'tree-table',\n empty: 'tree-table-empty',\n hidden: 'tree-table-hidden',\n node: 'tree-table-node',\n nodes: 'tree-table-nodes',\n handle: 'tree-table-handle',\n place: 'tree-table-placeholder',\n drag: 'tree-table-drag',\n status: 'tree-table-status',\n icon: {\n '1': 'glyphicon glyphicon-minus',\n '0': 'glyphicon glyphicon-plus',\n '-1': 'glyphicon glyphicon-file'\n }\n };\n\n angular.module('eHRD.kernel.uiElements.treeTable')\n .constant('$TreeTableClass', treeTableConfig);\n\n})();\n\n/**\n * Created by Bruce on 2016/6/17.\n */\n(function () {\n 'use strict';\n\n var treeConfig = {\n treeClass: '',//angular-ui-tree\n emptyTreeClass: 'angular-ui-tree-empty',//angular-ui-tree-empty\n hiddenClass: '',//angular-ui-tree-hidden\n nodesClass: '',//angular-ui-tree-nodes\n nodeClass: '', // angular-ui-tree-node nav-parent\n handleClass: '',//angular-ui-tree-handle\n // placeholderClass: 'angular-ui-tree-placeholder',\n levelThreshold: 30,\n defaultCollapsed: true\n };\n\n angular.module('eHRD.kernel.uiElements.tree')\n .constant('treeConfig', treeConfig);\n\n})();\n\n/**\n * Created by Bruce on 2016/9/4.\n */\n\n(function () {\n 'use strict';\n\n timer.$inject = ['$compile'];\n function timer($compile) {\n return {\n restrict: 'EA',\n replace: false,\n require: 'ngModel',\n scope: {\n interval: '=interval',\n startTimeAttr: '=startTime',\n endTimeAttr: '=endTime',\n countdownattr: '=countdown',\n finishCallback: '&finishCallback',\n autoStart: '&autoStart',\n language: '@?',\n fallback: '@?',\n maxTimeUnit: '=',\n seconds: '=?',\n minutes: '=?',\n hours: '=?',\n days: '=?',\n months: '=?',\n years: '=?',\n secondsS: '=?',\n minutesS: '=?',\n hoursS: '=?',\n daysS: '=?',\n monthsS: '=?',\n yearsS: '=?',\n timeModel: '=ngModel'\n },\n link: function (scope, element, attrs, ngModel) {\n scope.$watch('timeModel', function(newVal) {\n ngModel.$setViewValue(newVal);\n });\n },\n controller: ['$scope', '$element', '$attrs', '$timeout', 'I18nService', '$interpolate', 'progressBarService', function ($scope, $element, $attrs, $timeout, I18nService, $interpolate, progressBarService) {\n\n // Checking for trim function since IE8 doesn't have it\n // If not a function, create tirm with RegEx to mimic native trim\n if (angular.isFunction(String.prototype.trim)) {\n String.prototype.trim = function () {\n return this.replace(/^\\s+|\\s+$/g, '');\n };\n }\n\n //angular 1.2 doesn't support attributes ending in \"-start\", so we're\n //supporting both \"autostart\" and \"auto-start\" as a solution for\n //backward and forward compatibility.\n $scope.autoStart = $attrs.autoStart || $attrs.autostart;\n\n\n $scope.language = $scope.language || 'en';\n $scope.fallback = $scope.fallback || 'en';\n\n //allow to change the language of the directive while already launched\n $scope.$watch('language', function(newVal/*, oldVal*/) {\n if(angular.isDefined(newVal)) {\n i18nService.init(newVal, $scope.fallback);\n }\n });\n\n //init momentJS i18n, default english\n var i18nService = new I18nService();\n i18nService.init($scope.language, $scope.fallback);\n\n //progress bar\n $scope.displayProgressBar = 0;\n $scope.displayProgressActive = 'active'; //Bootstrap active effect for progress bar\n\n if ($element.html().trim().length === 0) {\n $element.append($compile('' + $interpolate.startSymbol() + 'millis' + $interpolate.endSymbol() + '')($scope));\n } else {\n $element.append($compile($element.contents())($scope));\n }\n\n $scope.startTime = null;\n $scope.endTime = null;\n $scope.timeoutId = null;\n $scope.countdown = angular.isNumber($scope.countdownattr) && parseInt($scope.countdownattr, 10) >= 0 ? parseInt($scope.countdownattr, 10) : undefined;\n $scope.isRunning = false;\n\n $scope.$on('timer-start', function () {\n $scope.start();\n });\n\n $scope.$on('timer-resume', function () {\n $scope.resume();\n });\n\n $scope.$on('timer-stop', function () {\n $scope.stop();\n });\n\n $scope.$on('timer-clear', function () {\n $scope.clear();\n });\n\n $scope.$on('timer-reset', function () {\n $scope.reset();\n });\n\n $scope.$on('timer-set-countdown', function (e, countdown) {\n $scope.countdown = countdown;\n });\n\n function resetTimeout() {\n if ($scope.timeoutId) {\n clearTimeout($scope.timeoutId);\n }\n }\n\n $scope.$watch('startTimeAttr', function(newValue, oldValue) {\n if (newValue !== oldValue && $scope.isRunning) {\n $scope.start();\n }\n });\n\n $scope.$watch('endTimeAttr', function(newValue, oldValue) {\n if (newValue !== oldValue && $scope.isRunning) {\n $scope.start();\n }\n });\n\n $scope.start = $element[0].start = function () {\n $scope.startTime = $scope.startTimeAttr ? moment($scope.startTimeAttr) : moment();\n $scope.endTime = $scope.endTimeAttr ? moment($scope.endTimeAttr) : null;\n if (!angular.isNumber($scope.countdown)) {\n $scope.countdown = angular.isNumber($scope.countdownattr) && parseInt($scope.countdownattr, 10) > 0 ? parseInt($scope.countdownattr, 10) : undefined;\n }\n resetTimeout();\n tick();\n $scope.isRunning = true;\n };\n\n $scope.resume = $element[0].resume = function () {\n resetTimeout();\n if ($scope.countdownattr) {\n $scope.countdown += 1;\n }\n $scope.startTime = moment().diff((moment($scope.stoppedTime).diff(moment($scope.startTime))));\n tick();\n $scope.isRunning = true;\n };\n\n $scope.stop = $scope.pause = $element[0].stop = $element[0].pause = function () {\n var timeoutId = $scope.timeoutId;\n $scope.clear();\n $scope.$emit('timer-stopped', {timeoutId: timeoutId, millis: $scope.millis, seconds: $scope.seconds, minutes: $scope.minutes, hours: $scope.hours, days: $scope.days});\n };\n\n $scope.clear = $element[0].clear = function () {\n // same as stop but without the event being triggered\n $scope.stoppedTime = moment();\n resetTimeout();\n $scope.timeoutId = null;\n $scope.isRunning = false;\n };\n\n $scope.reset = $element[0].reset = function () {\n $scope.startTime = $scope.startTimeAttr ? moment($scope.startTimeAttr) : moment();\n $scope.endTime = $scope.endTimeAttr ? moment($scope.endTimeAttr) : null;\n $scope.countdown = angular.isNumber($scope.countdownattr) && parseInt($scope.countdownattr, 10) > 0 ? parseInt($scope.countdownattr, 10) : undefined;\n resetTimeout();\n tick();\n $scope.isRunning = false;\n $scope.clear();\n };\n\n $element.bind('$destroy', function () {\n resetTimeout();\n $scope.isRunning = false;\n });\n\n\n function calculateTimeUnits() {\n var timeUnits = {}; //will contains time with units\n\n if (angular.isDefined($attrs.startTime) ){\n $scope.millis = moment().diff(moment($scope.startTimeAttr));\n }\n\n timeUnits = i18nService.getTimeUnits($scope.millis);\n\n // compute time values based on maxTimeUnit specification\n if (!$scope.maxTimeUnit || $scope.maxTimeUnit === 'day') {\n $scope.seconds = Math.floor(($scope.millis / 1000) % 60);\n $scope.minutes = Math.floor((($scope.millis / (60000)) % 60));\n $scope.hours = Math.floor((($scope.millis / (3600000)) % 24));\n $scope.days = Math.floor((($scope.millis / (3600000)) / 24));\n $scope.months = 0;\n $scope.years = 0;\n } else if ($scope.maxTimeUnit === 'second') {\n $scope.seconds = Math.floor($scope.millis / 1000);\n $scope.minutes = 0;\n $scope.hours = 0;\n $scope.days = 0;\n $scope.months = 0;\n $scope.years = 0;\n } else if ($scope.maxTimeUnit === 'minute') {\n $scope.seconds = Math.floor(($scope.millis / 1000) % 60);\n $scope.minutes = Math.floor($scope.millis / 60000);\n $scope.hours = 0;\n $scope.days = 0;\n $scope.months = 0;\n $scope.years = 0;\n } else if ($scope.maxTimeUnit === 'hour') {\n $scope.seconds = Math.floor(($scope.millis / 1000) % 60);\n $scope.minutes = Math.floor((($scope.millis / (60000)) % 60));\n $scope.hours = Math.floor($scope.millis / 3600000);\n $scope.days = 0;\n $scope.months = 0;\n $scope.years = 0;\n } else if ($scope.maxTimeUnit === 'month') {\n $scope.seconds = Math.floor(($scope.millis / 1000) % 60);\n $scope.minutes = Math.floor((($scope.millis / (60000)) % 60));\n $scope.hours = Math.floor((($scope.millis / (3600000)) % 24));\n $scope.days = Math.floor((($scope.millis / (3600000)) / 24) % 30);\n $scope.months = Math.floor((($scope.millis / (3600000)) / 24) / 30);\n $scope.years = 0;\n } else if ($scope.maxTimeUnit === 'year') {\n $scope.seconds = Math.floor(($scope.millis / 1000) % 60);\n $scope.minutes = Math.floor((($scope.millis / (60000)) % 60));\n $scope.hours = Math.floor((($scope.millis / (3600000)) % 24));\n $scope.days = Math.floor((($scope.millis / (3600000)) / 24) % 30);\n $scope.months = Math.floor((($scope.millis / (3600000)) / 24 / 30) % 12);\n $scope.years = Math.floor(($scope.millis / (3600000)) / 24 / 365);\n }\n // plural - singular unit decision (old syntax, for backwards compatibility and English only, could be deprecated!)\n $scope.secondsS = ($scope.seconds === 1) ? '' : 's';\n $scope.minutesS = ($scope.minutes === 1) ? '' : 's';\n $scope.hoursS = ($scope.hours === 1) ? '' : 's';\n $scope.daysS = ($scope.days === 1)? '' : 's';\n $scope.monthsS = ($scope.months === 1)? '' : 's';\n $scope.yearsS = ($scope.years === 1)? '' : 's';\n\n\n // new plural-singular unit decision functions (for custom units and multilingual support)\n $scope.secondUnit = timeUnits.seconds;\n $scope.minuteUnit = timeUnits.minutes;\n $scope.hourUnit = timeUnits.hours;\n $scope.dayUnit = timeUnits.days;\n $scope.monthUnit = timeUnits.months;\n $scope.yearUnit = timeUnits.years;\n\n //add leading zero if number is smaller than 10\n $scope.sseconds = $scope.seconds < 10 ? '0' + $scope.seconds : $scope.seconds;\n $scope.mminutes = $scope.minutes < 10 ? '0' + $scope.minutes : $scope.minutes;\n $scope.hhours = $scope.hours < 10 ? '0' + $scope.hours : $scope.hours;\n $scope.ddays = $scope.days < 10 ? '0' + $scope.days : $scope.days;\n $scope.mmonths = $scope.months < 10 ? '0' + $scope.months : $scope.months;\n $scope.yyears = $scope.years < 10 ? '0' + $scope.years : $scope.years;\n\n if(angular.isDefined($scope.timeModel)) {\n $scope.timeModel={\n seconds : $scope.sseconds\n };\n }\n\n\n }\n\n //determine initial values of time units and add AddSeconds functionality\n if ($scope.countdownattr) {\n $scope.millis = $scope.countdownattr * 1000;\n\n $scope.addCDSeconds = $element[0].addCDSeconds = function (extraSeconds) {\n $scope.countdown += extraSeconds;\n $scope.$digest();\n if (!$scope.isRunning) {\n $scope.start();\n }\n };\n\n $scope.$on('timer-add-cd-seconds', function (e, extraSeconds) {\n $timeout(function () {\n $scope.addCDSeconds(extraSeconds);\n });\n });\n\n $scope.$on('timer-set-countdown-seconds', function (e, countdownSeconds) {\n if (!$scope.isRunning) {\n $scope.clear();\n }\n\n $scope.countdown = countdownSeconds;\n $scope.millis = countdownSeconds * 1000;\n calculateTimeUnits();\n });\n } else {\n $scope.millis = 0;\n }\n calculateTimeUnits();\n\n var tick = function tick() {\n var typeTimer = null; // countdown or endTimeAttr\n $scope.millis = moment().diff($scope.startTime);\n var adjustment = $scope.millis % 1000;\n\n if ($scope.endTimeAttr) {\n typeTimer = $scope.endTimeAttr;\n $scope.millis = moment($scope.endTime).diff(moment());\n adjustment = $scope.interval - $scope.millis % 1000;\n }\n\n if ($scope.countdownattr) {\n typeTimer = $scope.countdownattr;\n $scope.millis = $scope.countdown * 1000;\n }\n\n if ($scope.millis < 0) {\n $scope.stop();\n $scope.millis = 0;\n calculateTimeUnits();\n if($scope.finishCallback) {\n $scope.$eval($scope.finishCallback);\n }\n return;\n }\n calculateTimeUnits();\n\n //We are not using $timeout for a reason. Please read here - https://github.com/siddii/angular-timer/pull/5\n $scope.timeoutId = setTimeout(function () {\n tick();\n $scope.$digest();\n }, $scope.interval - adjustment);\n\n $scope.$emit('timer-tick', {timeoutId: $scope.timeoutId, millis: $scope.millis, timerElement: $element[0]});\n\n if ($scope.countdown > 0) {\n $scope.countdown--;\n }\n else if ($scope.countdown <= 0) {\n $scope.stop();\n if($scope.finishCallback) {\n $scope.$eval($scope.finishCallback);\n }\n }\n\n if(typeTimer !== null){\n //calculate progress bar\n $scope.progressBar = progressBarService.calculateProgressBar($scope.startTime, $scope.millis, $scope.endTime, $scope.countdownattr);\n\n if($scope.progressBar === 100){\n $scope.displayProgressActive = ''; //No more Bootstrap active effect\n }\n }\n };\n\n if (angular.isUndefined($scope.autoStart) || $scope.autoStart === true) {\n $scope.start();\n }\n }]\n };\n }\n\n angular.module('eHRD.kernel.uiElements.timer')\n .directive('timer', timer);\n})();\n\n/**\n * Created by Bruce on 2016/9/13.\n */\n(function () {\n 'use strict';\n\n angular.module('eHRD.kernel.uiElements.uiTable')\n .value('ngTableDefaults', {\n counts: [1,5,10,15],\n params: {},\n settings: {}\n });\n\n})();\n\n/**\n * Created by Bruce on 2016/6/22.\n */\n\n(function () {\n 'use strict';\n uibPagination.$inject = ['$templateCache'];\n\n function uibPagination($templateCache) {\n $templateCache.put(\"uib/template/pagination/pagination.html\",\n \"
      \\n\" +\n \"
    • \\n\" +\n \"
    • \\n\" +\n \"
    • {{page.text}}
    • \\n\" +\n \"
    • \\n\" +\n \"
    • \\n\" +\n \"
    \" +\n \"\");\n }\n angular.module(\"uib/template/pagination/pagination.html\").run(uibPagination);\n})();\n\n/**\n * Created by Bruce on 2016/6/27.\n */\n\n(function () {\n 'use strict';\n\n paginationRun.$inject = ['$templateCache'];\n function paginationRun($templateCache) {\n $templateCache.put('default.pagination.template',\n '');\n }\n angular.module('eHRD.kernel.uiElements.pagination')\n .run(paginationRun);\n})();\n\n/**\n * Created by Bruce on 2016/6/27.\n */\n\n(function () {\n 'use strict';\n\n var uiPaginationConfig = {\n DEFAULT_ID: '__default',\n DEFAULT_ContentLayoutTemplate:'card'\n }\n angular.module('eHRD.kernel.uiElements.pagination')\n .constant('uiPaginationConfig', uiPaginationConfig);\n})();\n\n/**\n * Created by Bruce on 2016/6/27.\n */\n\n(function () {\n 'use strict';\n\n function uiPaginationConfig(paginationTemplateProvider) {\n paginationTemplateProvider.setHeaderPath('app/kernel/ui-elements/pagination/views/ui-pagination-header.tpl.html');\n paginationTemplateProvider.setPath('app/kernel/ui-elements/pagination/views/ui-pagination.tpl.html');\n }\n\n angular.module('eHRD.kernel.uiElements.pagination')\n .config(uiPaginationConfig);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n mdPickersRun.$inject = [\"$templateCache\", \"mdpIconsRegistry\"];\n\n function mdPickersRun($templateCache, mdpIconsRegistry) {\n angular.forEach(mdpIconsRegistry, function(icon /*, index*/ ) {\n $templateCache.put(icon.url, icon.svg);\n });\n }\n\n angular.module('mdPickers')\n .run(mdPickersRun);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n var mdpIconsRegistry = [{\n id: 'mdp-chevron-left',\n url: 'mdp-chevron-left.svg',\n svg: ''\n }, {\n id: 'mdp-chevron-right',\n url: 'mdp-chevron-right.svg',\n svg: ''\n }, {\n id: 'mdp-access-time',\n url: 'mdp-access-time.svg',\n svg: ''\n }, {\n id: 'mdp-event',\n url: 'mdp-event.svg',\n svg: ''\n }];\n\n angular.module('mdPickers')\n .constant(\"mdpIconsRegistry\", mdpIconsRegistry);\n})();\n\n/**\n * Created by Bruce on 2016/7/11.\n */\n(function() {\n 'use strict';\n\n mdPickersConfig.$inject = [\"$mdIconProvider\", \"mdpIconsRegistry\"];\n\n function mdPickersConfig($mdIconProvider, mdpIconsRegistry) {\n angular.forEach(mdpIconsRegistry, function(icon /*, index*/ ) {\n $mdIconProvider.icon(icon.id, icon.url);\n });\n }\n\n angular.module('mdPickers')\n .config(mdPickersConfig);\n})();\n\n/**\n * Created by Bruce on 2016/11/14.\n */\n\n(function () {\n 'use strict';\n\n config.$inject = [];\n function config() {\n // console.log()\n // if (!-[1,]) {\n // document.createElement('twitch');\n // document.createElement('justin');\n // document.createElement('flash');\n // document.createElement('youtube');\n // }\n }\n angular.module('eHRD.kernel.uiElements.media')\n .config(config);\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n angular.module('eHRD.kernel.auth',[\n 'permission',\n 'permission.ui'\n ]);\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n angular.module('eHRD.kernel.auth')\n\n .factory('AuthUtils', function() {\n\n this.getFullUrlPath = function(location) {\n return location.protocol + '//' + location.hostname +\n (location.port ? ':' + location.port : '') + location.pathname;\n };\n\n this.camelCase = function(name) {\n return name.replace(/([\\:\\-\\_]+(.))/g, function(_, separator, letter, offset) {\n return offset ? letter.toUpperCase() : letter;\n });\n };\n\n this.parseQueryString = function(keyValue) {\n var obj = {}, key, value;\n angular.forEach((keyValue || '').split('&'), function(keyValue) {\n if (keyValue) {\n value = keyValue.split('=');\n key = decodeURIComponent(value[0]);\n obj[key] = angular.isDefined(value[1]) ? decodeURIComponent(value[1]) : true;\n }\n });\n return obj;\n };\n\n this.joinUrl = function(baseUrl, url) {\n if (/^(?:[a-z]+:)?\\/\\//i.test(url)) {\n return url;\n }\n\n var joined = [baseUrl, url].join('/');\n\n var normalize = function(str) {\n return str\n .replace(/[\\/]+/g, '/')\n .replace(/\\/\\?/g, '?')\n .replace(/\\/\\#/g, '#')\n .replace(/\\:\\//g, '://');\n };\n\n return normalize(joined);\n };\n\n this.merge = function(obj1, obj2) {\n var result = {};\n for (var i in obj1) {\n if (obj1.hasOwnProperty(i)) {\n if ((i in obj2) && (angular.isObject(obj1[i])) && (i !== null)) {\n result[i] = this.merge(obj1[i], obj2[i]);\n } else {\n result[i] = obj1[i];\n }\n }\n }\n for (i in obj2) {\n if (obj2.hasOwnProperty(i)) {\n if (i in result) {\n continue;\n }\n result[i] = obj2[i];\n }\n\n }\n return result;\n };\n\n return this;\n })\n\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n AuthStorage.$inject=[\n '$window', '$log', 'AuthConfig'\n ];\n\n function AuthStorage($window, $log, config){\n var store = {};\n\n // Check if localStorage or sessionStorage is available or enabled\n var isStorageAvailable = (function() {\n try {\n var supported = config.storageType in $window && $window[config.storageType] !== null;\n\n if (supported) {\n var key = Math.random().toString(36).substring(7);\n $window[config.storageType].setItem(key, '');\n $window[config.storageType].removeItem(key);\n }\n\n return supported;\n } catch (e) {\n return false;\n }\n })();\n\n if (!isStorageAvailable) {\n $log.warn(config.storageType + ' is not available.');\n }\n\n return {\n get: function(key) {\n return isStorageAvailable ? $window[config.storageType].getItem(key) : store[key];\n },\n set: function(key, value) {\n return isStorageAvailable ? $window[config.storageType].setItem(key, value) : store[key] = value;\n },\n remove: function(key) {\n return isStorageAvailable ? $window[config.storageType].removeItem(key): delete store[key];\n }\n };\n }\n\n angular.module('eHRD.kernel.auth')\n\n .factory('AuthStorage', AuthStorage)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n AuthShared.$inject=[\n '$q',\n '$window',\n '$location',\n '$log',\n 'AuthConfig',\n 'AuthStorage',\n 'PermPermissionStore',\n 'PermRoleStore'\n ];\n\n function AuthShared($q, $window, $location, $log, config, storage, PermissionStore, RoleStore){\n var Shared = {};\n var tokenName = config.tokenPrefix ? [config.tokenPrefix, config.tokenName].join('_') : config.tokenName;\n var dataTokenName = config.tokenPrefix + '_data';\n\n Shared.initToken = function (tokenPrefix) {\n tokenName = [tokenPrefix, config.tokenName].join('_');\n dataTokenName = tokenPrefix + '_data';\n };\n\n Shared.getToken = function() {\n return storage.get(tokenName);\n };\n Shared.getDataToken = function() {\n return storage.get(dataTokenName);\n };\n\n Shared.clearPermissionStore = function (){\n PermissionStore.clearStore();\n };\n Shared.setPermissions = function (Permissions) {\n this.clearPermissionStore();\n angular.forEach(Permissions, function(Permission) {\n PermissionStore\n .definePermission(Permission, function () {\n return true;\n });\n });\n };\n Shared.setSystemModulesPermissions = function (SystemModulesPermissions) {\n angular.forEach(SystemModulesPermissions, function(SystemModulesPermission) {\n PermissionStore\n .definePermission('Modules.' + SystemModulesPermission, function () {\n return true;\n });\n });\n };\n\n Shared.setRoles = function (Roles) {\n angular.forEach(Roles, function(Role) {\n angular.forEach(Role, function(Permissions, _Role) {\n switch (_Role){\n case 'MgrUser':\n if(Permissions.length > 0) RoleStore.defineRole(_Role, Permissions);\n break;\n default:\n RoleStore.defineRole(_Role, Permissions);\n break;\n }\n\n });\n });\n };\n\n Shared.setACL = function (token) {\n if (token && token.split('.').length === 3) {\n try {\n var base64Url = token.split('.')[1];\n var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n var ACLData = angular.fromJson(decodeURIComponent(escape($window.atob(base64)))).data;\n this.setPermissions(ACLData.Permissions);\n this.setSystemModulesPermissions(ACLData.SystemModulesPermission);\n this.setRoles(ACLData.Roles);\n } catch(e) {\n return undefined;\n }\n }\n };\n\n Shared.getUserData = function () {\n var allData ;\n var UserData;\n if( angular.isDefined(this.getPayload() ) ){\n allData = this.getPayload().data;\n UserData = allData;\n }else {\n UserData = undefined;\n }\n return UserData;\n };\n\n Shared.getPayload = function() {\n var token = storage.get(dataTokenName);\n\n if (token && token.split('.').length === 3) {\n try {\n var base64Url = token.split('.')[1];\n var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n return angular.fromJson(decodeURIComponent(escape($window.atob(base64))));\n } catch(e) {\n return undefined;\n }\n }\n };\n\n Shared.setToken = function(response) {\n if (!response) {\n return $log.warn('Can\\'t set token without passing a value');\n }\n\n var accessToken = response && response.access_token;\n var token, data_token;\n\n\n if (accessToken) {\n if (angular.isObject(accessToken) && angular.isObject(accessToken.data)) {\n response = accessToken;\n } else if (angular.isString(accessToken)) {\n token = accessToken;\n }\n }\n\n if (!token && response) {\n var tokenRootData = config.tokenRoot && config.tokenRoot.split('.').reduce(function(o, x) { return o[x]; }, response.data);\n token = tokenRootData ? tokenRootData[config.tokenName] : response.data && response.data[config.tokenName];\n data_token = response.data['data'];\n }\n\n if (!token) {\n var tokenPath = config.tokenRoot ? config.tokenRoot + '.' + config.tokenName : config.tokenName;\n return $log.warn('Expecting a token named \"' + tokenPath);\n }\n\n this.setACL(data_token);\n storage.set(tokenName, token);\n storage.set(dataTokenName, data_token);\n };\n\n Shared.removeToken = function() {\n storage.remove(tokenName);\n storage.remove(dataTokenName);\n storage.remove(\"projectData\");\n };\n\n /**\n * @returns {boolean}\n */\n Shared.isAuthenticated = function() {\n var token = storage.get(tokenName);\n var data_token = storage.get(dataTokenName);\n // A token is present\n if (token && data_token) {\n // Token with a valid JWT format XXX.YYY.ZZZ\n if (token.split('.').length === 3) {\n // Could be a valid JWT or an access token with the same format\n try {\n var base64Url = token.split('.')[1];\n var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n var exp = angular.fromJson($window.atob(base64)).exp;\n // JWT with an optonal expiration claims\n if (exp) {\n var isExpired = Math.round(new Date().getTime() / 1000) >= exp;\n if (isExpired) {\n // FAIL: Expired token\n return false;\n } else {\n // PASS: Non-expired token\n return true;\n }\n }\n } catch(e) {\n // PASS: Non-JWT token that looks like JWT\n return true;\n }\n }\n // PASS: All other tokens\n return true;\n }\n // FAIL: No token at all\n return false;\n };\n\n Shared.logout = function() {\n storage.remove(tokenName);\n storage.remove(dataTokenName);\n storage.remove(\"projectData\");\n this.clearPermissionStore();\n return $q.when();\n };\n\n Shared.setStorageType = function(type) {\n config.storageType = type;\n };\n\n Shared.setAuthType = function(type) {\n config.authType = type;\n };\n\n return Shared;\n }\n\n\n angular.module('eHRD.kernel.auth')\n\n .factory('AuthShared', AuthShared)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n AuthPopup.$inject = [\n '$q',\n '$interval',\n '$window',\n 'AuthConfig',\n 'AuthUtils'\n ];\n\n function AuthPopup($q, $interval, $window, config, utils, $document) {\n var Popup = {};\n\n Popup.url = '';\n Popup.popupWindow = null;\n\n Popup.open = function(url, name, options) {\n Popup.url = url;\n\n var stringifiedOptions = Popup.stringifyOptions(Popup.prepareOptions(options));\n var UA = $window.navigator.userAgent;\n var windowName = ($window.cordova || UA.indexOf('CriOS') > -1) ? '_blank' : name;\n\n Popup.popupWindow = $window.open(url, windowName, stringifiedOptions);\n\n $window.popup = Popup.popupWindow;\n\n if (Popup.popupWindow && Popup.popupWindow.focus) {\n Popup.popupWindow.focus();\n }\n\n return Popup;\n };\n\n Popup.eventListener = function(redirectUri) {\n var deferred = $q.defer();\n\n Popup.popupWindow.addEventListener('loadstart', function(event) {\n if (event.url.indexOf(redirectUri) !== 0) {\n return;\n }\n\n var parser = $document.createElement('a');\n parser.href = event.url;\n\n if (parser.search || parser.hash) {\n var queryParams = parser.search.substring(1).replace(/\\/$/, '');\n var hashParams = parser.hash.substring(1).replace(/\\/$/, '');\n var hash = utils.parseQueryString(hashParams);\n var qs = utils.parseQueryString(queryParams);\n\n angular.extend(qs, hash);\n\n if (!qs.error) {\n deferred.resolve(qs);\n }\n\n Popup.popupWindow.close();\n }\n });\n\n Popup.popupWindow.addEventListener('loaderror', function() {\n deferred.reject('Authorization Failed');\n });\n\n return deferred.promise;\n };\n\n Popup.pollPopup = function(redirectUri) {\n var deferred = $q.defer();\n\n var redirectUriParser = $document.createElement('a');\n redirectUriParser.href = redirectUri;\n\n var redirectUriPath = utils.getFullUrlPath(redirectUriParser);\n\n var polling = $interval(function() {\n if (!Popup.popupWindow || Popup.popupWindow.closed || angular.isUndefined(Popup.popupWindow.closed)) {\n deferred.reject('The popup window was closed.');\n $interval.cancel(polling);\n }\n\n try {\n var popupWindowPath = utils.getFullUrlPath(Popup.popupWindow.location);\n\n // Redirect has occurred.\n if (popupWindowPath === redirectUriPath) {\n // Contains query/hash parameters as expected.\n if (Popup.popupWindow.location.search || Popup.popupWindow.location.hash) {\n var queryParams = Popup.popupWindow.location.search.substring(1).replace(/\\/$/, '');\n var hashParams = Popup.popupWindow.location.hash.substring(1).replace(/[\\/$]/, '');\n var hash = utils.parseQueryString(hashParams);\n var qs = utils.parseQueryString(queryParams);\n\n angular.extend(qs, hash);\n\n if (qs.error) {\n deferred.reject(qs);\n } else {\n deferred.resolve(qs);\n }\n } else {\n // Does not contain query/hash parameters, can't do anything at this point.\n deferred.reject(\n 'Redirect has occurred but no query or hash parameters were found. ' +\n 'They were either not set during the redirect, or were removed before Satellizer ' +\n 'could read them, e.g. AngularJS routing mechanism.'\n );\n }\n\n $interval.cancel(polling);\n Popup.popupWindow.close();\n }\n } catch (error) {\n // Ignore DOMException: Blocked a frame with origin from accessing a cross-origin frame.\n // A hack to get around same-origin security policy errors in IE.\n }\n }, 20);\n\n return deferred.promise;\n };\n\n Popup.prepareOptions = function(options) {\n options = options || {};\n var width = options.width || 500;\n var height = options.height || 500;\n\n return angular.extend({\n width: width,\n height: height,\n left: $window.screenX + (($window.outerWidth - width) / 2),\n top: $window.screenY + (($window.outerHeight - height) / 2.5)\n }, options);\n };\n\n Popup.stringifyOptions = function(options) {\n var parts = [];\n angular.forEach(options, function(value, key) {\n parts.push(key + '=' + value);\n });\n return parts.join(',');\n };\n\n return Popup;\n }\n\n angular.module('eHRD.kernel.auth')\n\n .factory('AuthPopup', AuthPopup)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n AuthOauth2.$inject = [\n '$q',\n '$http',\n '$window',\n '$timeout',\n 'AuthPopup',\n 'AuthUtils',\n 'AuthConfig',\n 'AuthStorage'\n ];\n\n function AuthOauth2($q, $http, $window, $timeout, popup, utils, config, storage) {\n return function() {\n var Oauth2 = {};\n\n var defaults = {\n defaultUrlParams: ['response_type', 'client_id', 'redirect_uri'],\n responseType: 'code',\n responseParams: {\n code: 'code',\n clientId: 'clientId',\n redirectUri: 'redirectUri'\n }\n };\n\n Oauth2.open = function(options, userData) {\n defaults = utils.merge(options, defaults);\n var defer = $q.defer();\n\n $timeout(function () {\n var url;\n var openPopup;\n var stateName = defaults.name + '_state';\n\n if (angular.isFunction(defaults.state)) {\n storage.set(stateName, defaults.state());\n } else if (angular.isString(defaults.state)) {\n storage.set(stateName, defaults.state);\n }\n\n url = [defaults.authorizationEndpoint, Oauth2.buildQueryString()].join('?');\n\n if ($window.cordova) {\n openPopup = popup.open(url, defaults.name, defaults.popupOptions, defaults.redirectUri).eventListener(defaults.redirectUri);\n } else {\n openPopup = popup.open(url, defaults.name, defaults.popupOptions, defaults.redirectUri).pollPopup(defaults.redirectUri);\n }\n\n return openPopup\n .then(function(oauthData) {\n // When no server URL provided, return popup params as-is.\n // This is for a scenario when someone wishes to opt out from\n // Satellizer's magic by doing authorization code exchange and\n // saving a token manually.\n if (defaults.responseType === 'token' || !defaults.url) {\n defer.resolve(oauthData);\n }\n\n if (oauthData.state && oauthData.state !== storage.get(stateName)) {\n return defer.reject(\n 'The value returned in the state parameter does not match the state value from your original ' +\n 'authorization code request.'\n );\n }\n\n defer.resolve(Oauth2.exchangeForToken(oauthData, userData));\n });\n });\n\n return defer.promise;\n };\n\n Oauth2.exchangeForToken = function(oauthData, userData) {\n var data = angular.extend({}, userData);\n\n angular.forEach(defaults.responseParams, function(value, key) {\n switch (key) {\n case 'code':\n data[value] = oauthData.code;\n break;\n case 'clientId':\n data[value] = defaults.clientId;\n break;\n case 'redirectUri':\n data[value] = defaults.redirectUri;\n break;\n default:\n data[value] = oauthData[key];\n }\n });\n\n if (oauthData.state) {\n data.state = oauthData.state;\n }\n\n var exchangeForTokenUrl = config.baseUrl ? utils.joinUrl(config.baseUrl, defaults.url) : defaults.url;\n\n return $http.post(exchangeForTokenUrl, data, { withCredentials: config.withCredentials });\n };\n\n Oauth2.buildQueryString = function() {\n var keyValuePairs = [];\n var urlParamsCategories = ['defaultUrlParams', 'requiredUrlParams', 'optionalUrlParams'];\n\n angular.forEach(urlParamsCategories, function(paramsCategory) {\n angular.forEach(defaults[paramsCategory], function(paramName) {\n var camelizedName = utils.camelCase(paramName);\n var paramValue = angular.isFunction(defaults[paramName]) ? defaults[paramName]() : defaults[camelizedName];\n\n if (paramName === 'redirect_uri' && !paramValue) {\n return;\n }\n\n if (paramName === 'state') {\n var stateName = defaults.name + '_state';\n paramValue = encodeURIComponent(storage.get(stateName));\n }\n\n if (paramName === 'scope' && angular.isArray(paramValue)) {\n paramValue = paramValue.join(defaults.scopeDelimiter);\n\n if (defaults.scopePrefix) {\n paramValue = [defaults.scopePrefix, paramValue].join(defaults.scopeDelimiter);\n }\n }\n\n keyValuePairs.push([paramName, paramValue]);\n });\n });\n\n return keyValuePairs.map(function(pair) {\n return pair.join('=');\n }).join('&');\n };\n\n return Oauth2;\n };\n }\n\n angular.module('eHRD.kernel.auth')\n\n .factory('AuthOauth2', AuthOauth2)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n AuthOauth1.$inject = [\n '$q',\n '$http',\n 'AuthPopup',\n 'AuthConfig',\n 'AuthUtils'\n ];\n\n function AuthOauth1($q, $http, popup, config, utils, $window) {\n return function() {\n var Oauth1 = {};\n\n var defaults = {\n url: null,\n name: null,\n popupOptions: null,\n redirectUri: null,\n authorizationEndpoint: null\n };\n\n Oauth1.open = function(options, userData) {\n angular.extend(defaults, options);\n var popupWindow;\n var serverUrl = config.baseUrl ? utils.joinUrl(config.baseUrl, defaults.url) : defaults.url;\n\n if (!$window.cordova) {\n popupWindow = popup.open('', defaults.name, defaults.popupOptions, defaults.redirectUri);\n }\n\n return $http.post(serverUrl, defaults)\n .then(function(response) {\n var url = [defaults.authorizationEndpoint, Oauth1.buildQueryString(response.data)].join('?');\n\n if ($window.cordova) {\n popupWindow = popup.open(url, defaults.name, defaults.popupOptions, defaults.redirectUri);\n } else {\n popupWindow.popupWindow.location = url;\n }\n\n var popupListener;\n\n if ($window.cordova) {\n popupListener = popupWindow.eventListener(defaults.redirectUri);\n } else {\n popupListener = popupWindow.pollPopup(defaults.redirectUri);\n }\n\n return popupListener\n .then(function(response) {\n return Oauth1.exchangeForToken(response, userData);\n });\n });\n\n };\n\n Oauth1.exchangeForToken = function(oauthData, userData) {\n var data = angular.extend({}, userData, oauthData);\n var exchangeForTokenUrl = config.baseUrl ? utils.joinUrl(config.baseUrl, defaults.url) : defaults.url;\n return $http.post(exchangeForTokenUrl, data, { withCredentials: config.withCredentials });\n };\n\n Oauth1.buildQueryString = function(obj) {\n var str = [];\n\n angular.forEach(obj, function(value, key) {\n str.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n\n return str.join('&');\n };\n\n return Oauth1;\n };\n }\n angular.module('eHRD.kernel.auth')\n\n .factory('AuthOauth1', AuthOauth1)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n AuthOauth.$inject=[\n '$q',\n '$http',\n 'AuthConfig',\n 'AuthUtils',\n 'AuthShared',\n 'AuthOauth1',\n 'AuthOauth2'\n ];\n function AuthOauth($q, $http, config, utils, shared, Oauth1, Oauth2) {\n var Oauth = {};\n\n Oauth.authenticate = function(name, userData) {\n var provider = config.providers[name].oauthType === '1.0' ? new Oauth1() : new Oauth2();\n var deferred = $q.defer();\n\n provider.open(config.providers[name], userData || {})\n .then(function(response) {\n // This is for a scenario when someone wishes to opt out from\n // Satellizer's magic by doing authorization code exchange and\n // saving a token manually.\n if (config.providers[name].url) {\n shared.setToken(response, false);\n }\n deferred.resolve(response);\n })\n .catch(function(error) {\n deferred.reject(error);\n });\n\n return deferred.promise;\n };\n\n Oauth.unlink = function(provider, opts) {\n opts = opts || {};\n opts.url = opts.url ? opts.url : utils.joinUrl(config.baseUrl, config.unlinkUrl);\n opts.data = { provider: provider } || opts.data;\n opts.method = opts.method || 'POST';\n opts.withCredentials = opts.withCredentials || config.withCredentials;\n\n return $http(opts);\n };\n\n return Oauth;\n }\n angular.module('eHRD.kernel.auth')\n\n .factory('AuthOauth', AuthOauth)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n AuthLocal.$inject=[\n '$http',\n 'AuthUtils',\n 'AuthShared',\n 'AuthConfig',\n '$location',\n 'serverSetting'\n ];\n\n function AuthLocal($http, utils, shared, config, $location, serverSetting){\n var Local = {};\n\n Local.checkServerStatus = function (data, opts) {\n opts = opts || {};\n opts.url = opts.url ? opts.url : utils.joinUrl(config.baseUrl, config.checkServerStatusUrl);\n opts.data = data || opts.data;\n opts.method = opts.method || 'POST';\n opts.withCredentials = opts.withCredentials || config.withCredentials;\n\n return $http(opts);\n };\n\n Local.logout = function () {\n var opts = {};\n if(serverSetting.SSLType === 1){\n var url = [['https', serverSetting.serverDomain].join('://'), serverSetting.SSLPort].join((serverSetting.SSLPort.length > 0) ? ':' : '');\n url = [url, serverSetting.contextPath].join('/');\n opts.url = utils.joinUrl(url, config.logoutUrl);\n }else {\n opts.url = opts.url ? opts.url : utils.joinUrl(config.baseUrl, config.logoutUrl);\n }\n // opts.url = opts.url ? opts.url : utils.joinUrl(config.baseUrl, config.logoutUrl);\n opts.method = 'POST';\n opts.withCredentials = config.withCredentials;\n\n return $http(opts);\n };\n\n Local.login = function(user, opts) {\n opts = opts || {};\n if(serverSetting.SSLType === 2){\n var url = [['https', serverSetting.serverDomain].join('://'), serverSetting.SSLPort].join((serverSetting.SSLPort.length > 0) ? ':' : '');\n url = [url, serverSetting.contextPath].join('/');\n opts.url = utils.joinUrl(url, config.loginUrl);\n }else{\n opts.url = opts.url ? opts.url : utils.joinUrl(config.baseUrl, config.loginUrl);\n }\n\n opts.data = user || opts.data;\n opts.method = opts.method || 'POST';\n opts.withCredentials = opts.withCredentials || config.withCredentials;\n return $http(opts).then(function(response) {\n shared.setToken(response);\n return response;\n });\n };\n\n Local.OtherLogin = function () {\n if(serverSetting.authConfig.enabledSSOQueryParams){\n return Local.SSOLogin();\n }else{\n return Local.NTlmLogin();\n }\n };\n\n Local.NTlmLogin = function () {\n /*\n * create-validation-token.do\n * */\n var opts = {};\n opts.url = utils.joinUrl(config.baseUrl, 'create-validation-token.do');\n opts.method = 'GET';\n opts.withCredentials = config.withCredentials;\n opts.headers= {\n 'Accept': 'application/json'\n };\n return $http(opts);\n };\n\n Local.SSOLogin = function () {\n /*\n * create-validation-token.do\n * */\n var opts = {};\n var ssoQueryParams = '?';\n angular.forEach(serverSetting.authConfig.SSOQueryParamsKey, function (param, index) {\n ssoQueryParams+= param;\n ssoQueryParams+= '=' + $location.search()[param];\n if((index+1) !== serverSetting.authConfig.SSOQueryParamsKey.length) ssoQueryParams+='&'\n });\n\n opts.url = utils.joinUrl(config.baseUrl, 'create-validation-token.do' + ssoQueryParams);\n opts.method = 'GET';\n opts.withCredentials = config.withCredentials;\n opts.headers= {\n 'Accept': 'application/json'\n };\n return $http(opts);\n };\n\n Local.validateToken = function () {\n /*\n * create-validation-token.do\n * */\n var opts = {};\n opts.url = utils.joinUrl(config.baseUrl, 'create-validation-token.do');\n opts.method = 'GET';\n opts.withCredentials = config.withCredentials;\n opts.headers= {\n 'Accept': 'application/json'\n };\n return $http(opts);\n };\n\n return Local;\n\n }\n\n angular.module('eHRD.kernel.auth')\n\n .factory('AuthLocal', AuthLocal)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n AuthInterceptor.$inject=[\n '$q',\n '$location',\n 'AuthConfig',\n 'AuthStorage',\n 'AuthShared'\n ];\n\n function AuthInterceptor($q, $location, config, storage, shared) {\n return {\n request: function(request) {\n if (request.skipAuthorization) {\n return request;\n }\n\n if (shared.isAuthenticated() && config.httpInterceptor(request)) {\n var tokenName = config.tokenPrefix ? [config.tokenPrefix, config.tokenName].join('_') : config.tokenName;\n var token = storage.get(tokenName);\n\n if (config.authHeader && config.authToken) {\n token = config.authToken + ' ' + token;\n }\n\n request.headers[config.authHeader] = token;\n }\n\n return request;\n },\n responseError: function(response) {\n return $q.reject(response);\n }\n };\n }\n\n angular.module('eHRD.kernel.auth')\n\n .factory('AuthInterceptor', AuthInterceptor)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/7/22.\n */\n(function () {\n 'use strict';\n\n function MyErrorHandler($q, $log) {\n return function (part, lang) {\n $log.error('The \"' + part + '/' + lang + '\" part was not loaded.');\n return $q.when({});\n };\n }\n\n function RequireTranslations($translatePartialLoader, $translate,$rootScope) {\n return function() {\n angular.forEach(arguments, function(translationKey) {\n $translatePartialLoader.addPart(translationKey);\n });\n return $translate.refresh().then(\n function(){\n return $translate.use($rootScope.currentLanguage);\n }\n );\n };\n }\n\n angular.module('eHRD.shared')\n .factory('MyErrorHandler', MyErrorHandler)\n .factory('RequireTranslations', RequireTranslations);\n})();\n\n// /**\n// * Created by Alan on 2017/5/31.\n// */\n//\n// (function () {\n// 'use strict';\n// sitemapService.$inject = ['Restangular', 'AuthStorage', '$q'];\n// function sitemapService(Restangular, AuthStorage, $q){\n//\n// /*\n// * Build collection api/approval\n// */\n// var _sitemapService = Restangular.all('sitemap');\n// var _SitemapLoginService = Restangular.all('sitemap-login');\n// return {\n// getProjectId: function (pid) {\n// /*\n// * api/sitemap//project-info\n// * */\n// if(angular.isUndefinedOrNull(pid) || pid==='')\n// return _sitemapService.customGET('project-info');\n// else\n// return _sitemapService.one(\"project-info\").customGET('review',{projectId:pid});\n// },\n//\n// getProject: function (name) {\n// return angular.fromJson(AuthStorage.get(\"projectData\"))[name];\n// },\n//\n// loginSitemapRequired: function(params) {\n// /*\n// * api/sitemap-login/info?companyName={companyName}\n// * */\n// var deferred = $q.defer();\n// _SitemapLoginService.customGET('info', params).then(function(data){\n// deferred.resolve(data);\n// });\n//\n// return deferred.promise;\n// },\n//\n// loginSitemapPreviewRequired: function(params) {\n// /*\n// * api/sitemap-login/info/review?projectId={projectId}\n// * */\n// var deferred = $q.defer();\n// _SitemapLoginService.one('info').customGET('review', params).then(function(data){\n// deferred.resolve(data);\n// });\n//\n// return deferred.promise;\n// },\n//\n// getOnlineUserNumber: function (params) {\n// /*\n// * api/ctl/online-user-number\n// * */\n// return _SitemapLoginService\n// .customGET('online-user-number', params);\n// }\n//\n// };\n//\n// }\n//\n// angular.module('eHRD.shared')\n// .factory('sitemapService', sitemapService);\n//\n// })();\n\n/**\n * Created by Bruce on 2016/5/12.\n */\n\n(function() {\n 'use strict';\n\n /** @ngInject */\n function navigationServiceProvider() {\n var staticMenuItems = [];\n\n this.addStaticItem = function() {\n staticMenuItems.push.apply(staticMenuItems, arguments);\n };\n\n /** @ngInject */\n this.$get = function($state) {\n return new _factory();\n\n function _factory() {\n this.updateScrollbar = function () {};\n this.scrollBarConfig = {\n scrollButtons: {\n enable: false\n },\n autoHideScrollbar: angular.element(this).hasClass('show-scroll') ? false : true,\n theme: 'light-2',\n axis: 'xy', // enable 2 axis scrollbars by default,\n advanced:{\n updateOnContentResize: true\n },\n scrollInertia: 250\n };\n\n this.getMenuItems = function() {\n var states = defineMenuItemStates();\n var menuItems = states.filter(function(item) {\n return item.level === 0 ;\n });\n\n menuItems.forEach(function(item) {\n var children = states.filter(function(child) {\n return child.level === 1 && child.name.indexOf(item.name) === 0;\n });\n item.subMenu = children.length ? children : null;\n\n });\n return menuItems.concat(staticMenuItems);\n };\n\n\n\n function defineMenuItemStates() {\n return $state.get()\n .filter(function(s) {\n return s.sidebarMeta;\n })\n .map(function(s) {\n var meta = s.sidebarMeta;\n return {\n abstract:s.abstract,\n name: s.name,\n title: s.title,\n level: (s.name.match(/\\./g) || []).length,\n order: meta.order,\n icon: meta.icon,\n stateRef: s.name,\n permissions: ((angular.isDefined(s.data) && angular.isDefined(s.data.permissions) && angular.isDefined(s.data.permissions.only)) ? s.data.permissions.only : []),\n permissionsAll: ((angular.isDefined(s.data) && angular.isDefined(s.data.permissions) && angular.isDefined(s.data.permissions.all)) ? s.data.permissions.all : [])\n };\n })\n .sort(function(a, b) {\n return (a.level - b.level) * 100 + a.order - b.order;\n });\n }\n }\n\n };\n }\n\n angular\n .module('eHRD.shared')\n .provider('navigationService', navigationServiceProvider)\n ;\n\n\n})();\n\n\n\n/**\n * Created by Alan on 2017/5/23.\n */\n\n(function () {\n 'use strict';\n loginService.$inject = ['Restangular'];\n function loginService(Restangular){\n\n /*\n * Build collection api/login\n */\n var _LoginService = Restangular.all('login');\n\n\n return {\n checkUserLimit: function () {\n /*\n * api/api/login/check-user-limit\n * */\n return _LoginService\n .customGET('check-user-limit');\n }\n\n };\n\n }\n\n angular.module('eHRD.shared')\n .factory('loginService', loginService);\n\n})();\n\n/**\n * Created by Bruce on 2016/5/18.\n */\n\n(function () {\n 'use strict';\n\n CoreService.$inject = ['localStorageService', '$cacheFactory', 'Restangular', '$q', '$state', '$http', '$location', 'AuthShared', '$auth', 'serverSetting', 'SweetAlert', 'toastr','$filter'];\n function CoreService(localStorageService, $cacheFactory, Restangular, $q, $state, $http, $location, AuthShared, $auth, serverSetting, SweetAlert, toastr, $filter) {\n var core_cache = $cacheFactory('coreCache');\n\n var refreshAccesstoken = function(/*response*/) {\n var deferred = $q.defer();\n // Refresh access-token logic\n SweetAlert.swal(\n {\n title: '',\n text: $filter('translate')('ERROR.SIGN_IN_USER_TIMEOUT'),\n type: 'error',\n confirmButtonColor: '#3085d6',\n confirmButtonText: $filter('translate')('ACTIONS.LOGIN_AGAIN'),\n allowOutsideClick: false,\n allowEscapeKey: false\n },function () {\n $auth.logout()\n .then(function() {\n //toastr.error($filter('translate')('MESSAGE.YOU_HAVE_BEEN_LOGGED_OUT'));\n AuthShared.logout().then(function () {\n $state.go('login');\n });\n });\n }\n );\n return deferred.promise;\n };\n\n function responseErrorProcess(errorCode) {\n var deferred = $q.defer();\n\n // Response Error Process logic\n deferred.reject(true);\n $state.go('error', {id: errorCode});\n\n return deferred.promise;\n }\n\n function systemInit() {\n $http.get('assets/info.ini').success(function(data) {\n if(angular.isObject(data)){\n localStorageService.clearAll();\n angular.forEach(data, function (val, key) {\n if(localStorageService.isSupported) {\n localStorageService.set(key, (val.length > 0) ? val : null);\n }\n })\n }\n });\n }\n\n return{\n refreshAccesstoken: refreshAccesstoken,\n RestangularInit: function () {\n Restangular.setBaseUrl(serverSetting.getServerConfig().baseURL + '/api');\n Restangular.setDefaultHttpFields({'withCredentials':'true'});\n // Restangular.setDefaultHeaders({ClientAuthorization: $auth.getToken()});\n\n Restangular.addFullRequestInterceptor(function(element, operation, route, url, headers, params, httpConfig) {\n if (operation === 'get' || operation === 'getList' || operation === 'customGET' || operation === 'customGETLIST') {\n httpConfig['ignoreLoadingBar'] = true;\n } else {\n httpConfig['ignoreLoadingBar'] = false;\n }\n return {\n element: element,\n params: params,\n headers: headers,\n httpConfig: httpConfig\n };\n });\n Restangular.setResponseInterceptor(function (data, operation/*, what, url, response, deferred*/) {\n var responseData = data;\n if (operation === 'getList' && data.data) {\n responseData = data.data;\n responseData.metadata = _.omit(data, 'data');\n }else {\n responseData = data.data;\n }\n return responseData; // error handled\n });\n Restangular.setErrorInterceptor(function(response, deferred, responseHandler) {\n switch (response.status){\n case 401:\n core_cache.put('rememberScope', true);\n core_cache.put('currentUser', $auth.getUserData().id);\n refreshAccesstoken(response).then(function() {\n // Repeat the request and then call the handlers the usual way.\n $http(response.config).then(responseHandler, deferred.reject);\n // Be aware that no request interceptors are called this way.\n });\n break;\n default:\n responseErrorProcess(response.status).then(function() {\n // Repeat the request and then call the handlers the usual way.\n $http(response.config).then(responseHandler, deferred.reject);\n // Be aware that no request interceptors are called this way.\n });\n break;\n }\n return false; // error handled\n });\n },\n serverSettingInit: function () {\n serverSetting.setProtocol($location.protocol());\n },\n authInit: function () {\n AuthShared.initToken(serverSetting.authConfig.defaultTokenPrefix + '_' + serverSetting.contextPath);\n $auth.setHttpInterceptor(function() { return true; });\n $auth.setWithCredentials(true);\n $auth.setTokenRoot(null);\n $auth.setBaseUrl(serverSetting.getServerConfig().baseURL);\n $auth.setLoginUrl(serverSetting.getServerConfig().baseApiLoginPath);\n $auth.setUnlinkUrl('/api/unlink/');\n $auth.setTokenName(serverSetting.authConfig.defaultTokenName);\n $auth.setTokenPrefix(serverSetting.authConfig.defaultTokenPrefix + '_' + serverSetting.contextPath);\n $auth.setAuthHeader(serverSetting.authConfig.defaultAuthHeader);\n $auth.setAuthToken(serverSetting.authConfig.defaultAuthToken);\n $auth.setStorageType(serverSetting.authConfig.defaultStorageType);\n // $auth.setAuthType(serverSetting.authConfig.defaultAuthType);\n },\n systemInit: systemInit\n };\n\n }\n\n angular.module('eHRD.shared')\n .factory('CoreService',CoreService)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/10/19.\n */\n\n(function () {\n 'use strict';\n\n serverSettingProvider.$inject = [\n 'defaultServerAddress',\n 'defaultServerDomain',\n 'defaultContextPath',\n 'defaultServerPort',\n 'webServiceSetting',\n 'serverAddress',\n 'serverDomain',\n 'contextPath',\n 'serverPort',\n 'SSLType',\n 'SSLPort',\n 'enabledSSOQueryParams',\n 'SSOQueryParamsKey',\n 'defaultSSLType',\n 'CAS_ENABLED',\n 'CAS_VALIDATE_PATH'\n ];\n /* @ngInject */\n function serverSettingProvider(defaultServerAddress, defaultServerDomain, defaultContextPath, defaultServerPort,\n webServiceSetting, serverAddress, serverDomain, contextPath, serverPort, SSLType,\n SSLPort,\n enabledSSOQueryParams, SSOQueryParamsKey, defaultSSLType, CAS_ENABLED, CAS_VALIDATE_PATH ){\n\n this.protocol = 'http';\n\n if(serverAddress.length > 0){\n this.defaultServerAddress = serverAddress;\n this.serverDomain = serverDomain;\n this.contextPath = contextPath;\n this.serverPort = serverPort;\n this.SSLType = SSLType;\n this.SSLPort = SSLPort;\n }else{\n this.defaultServerAddress = defaultServerAddress;\n this.serverDomain = defaultServerDomain;\n this.contextPath = defaultContextPath;\n this.serverPort = defaultServerPort;\n this.SSLType = defaultSSLType;\n }\n\n this.webServiceSetting = webServiceSetting;\n\n var baseURL = \"\";\n if(this.SSLType === 1){\n baseURL = [['https', this.serverDomain].join('://'), this.SSLPort].join((this.SSLPort.length > 0) ? ':' : '');\n baseURL = [baseURL, this.contextPath].join('/');\n }else {\n baseURL = this.defaultServerAddress +((this.serverPort.length > 0) ? ':'+ this.serverPort : '' ) + '/' + this.contextPath;\n }\n\n this.baseConfig = {\n serverAddress: this.defaultServerAddress +((this.serverPort.length > 0) ? ':'+ this.serverPort : '' ),\n baseURL: baseURL,\n baseApiLoginPath: this.webServiceSetting.defaultApiPath + this.webServiceSetting.defaultApiLoginPath,\n baseApiPath: this.webServiceSetting.defaultApiPath,\n baseApiFileProcessPath: this.webServiceSetting.defaultApiPath + this.webServiceSetting.defaultApiFileProcessPath\n };\n\n this.authConfig = {\n defaultApiPath: this.webServiceSetting.defaultApiPath,\n defaultApiFileProcessPath: this.webServiceSetting.defaultApiFileProcessPath,\n defaultApiLoginPath: this.webServiceSetting.defaultApiLoginPath,\n defaultTokenName: this.webServiceSetting.defaultTokenName,\n defaultTokenPrefix: this.webServiceSetting.defaultTokenPrefix,\n defaultAuthHeader: this.webServiceSetting.defaultAuthHeader,\n defaultAuthToken: this.webServiceSetting.defaultAuthToken,\n defaultStorageType: this.webServiceSetting.defaultStorageType,\n enabledSSOQueryParams: enabledSSOQueryParams,\n SSOQueryParamsKey: SSOQueryParamsKey,\n CAS_ENABLED: CAS_ENABLED,\n CAS_VALIDATE_PATH: CAS_VALIDATE_PATH\n };\n\n this.$get = function () {\n var vm = this;\n return{\n getProtocol: function(){\n return vm.protocol;\n },\n setProtocol: function (val) {\n vm.protocol = val;\n if( vm.protocol === 'https' && vm.SSLType === 1 ){\n vm.defaultServerAddress = [vm.protocol, vm.serverDomain].join('://');\n vm.baseConfig = {\n serverAddress: vm.defaultServerAddress +((vm.SSLPort.length > 0) ? ':'+ vm.SSLPort : '' ),\n baseURL: vm.defaultServerAddress +((vm.SSLPort.length > 0) ? ':'+ vm.SSLPort : '' ) + '/' + vm.contextPath,\n baseApiLoginPath: vm.webServiceSetting.defaultApiPath + vm.webServiceSetting.defaultApiLoginPath,\n baseApiPath: vm.webServiceSetting.defaultApiPath,\n baseApiFileProcessPath: vm.webServiceSetting.defaultApiPath + vm.webServiceSetting.defaultApiFileProcessPath\n };\n }\n },\n getAuthConfig: function () {\n return vm.authConfig;\n },\n getServerConfig: function () {\n return vm.baseConfig;\n },\n getServerPath: function () {\n return vm.baseConfig.baseURL;\n },\n defaultServerAddress: vm.defaultServerAddress,\n contextPath: vm.contextPath,\n webServiceSetting: vm.webServiceSetting,\n baseConfig: vm.baseConfig,\n clientConfig: vm.clientConfig,\n authConfig: vm.authConfig,\n protocol: vm.protocol,\n SSLType: vm.SSLType,\n SSLPort: vm.SSLPort,\n serverDomain: vm.serverDomain\n };\n }\n }\n\n angular.module('eHRD.shared')\n .provider('serverSetting', serverSettingProvider);\n})();\n\n/**\n * Created by Bruce on 2016/9/26.\n */\n(function () {\n 'use strict';\n\n stringToBreadcrumb.inject = ['$state', '$stateParams', 'translateFilter'];\n function stringToBreadcrumb($state, $stateParams, translateFilter) {\n return function (menuList, type, lastLabel) {\n var _lastLabel = lastLabel || null;\n var _menuList = angular.fromJson(menuList);\n var result = '';\n switch (type){\n case 'sitemap-breadcrumb':\n result += '
      ';\n angular.forEach(_menuList, function(value, index) {\n if(value.title !== \"root\") {\n result += '
    1. ';\n if (index === _menuList.length - 1 && angular.isUndefinedOrNull(_lastLabel)){\n result += '' + value.title + '';\n } else{\n var _url = $state.$current.url.prefix;\n if($stateParams['cid']) _url += $stateParams['cid'];\n if($stateParams['nid']){\n if($stateParams['cid'].toString() !== value.id.toString()) {\n _url = _url + '?nid=' + value.id;\n if($stateParams['mid']) _url = _url + '&mid=' + $stateParams['mid'];\n }else {\n if($stateParams['mid']) _url = _url + '?mid=' + $stateParams['mid'];\n }\n }else {\n if($stateParams['mid']) _url = _url + '?mid=' + $stateParams['mid'];\n }\n result += '' + value.title + '';\n }\n result += '
    2. ';\n }\n\n });\n if(!angular.isUndefinedOrNull(_lastLabel)){\n result += '
    3. ';\n result += '' + _lastLabel + '';\n result += '
    4. ';\n }\n result += '
    ';\n return result;\n case 'breadcrumb':\n result += '
      ';\n angular.forEach(_menuList, function(value, index) {\n if(value.title !== \"root\") {\n result += '
    1. ';\n if (index === _menuList.length - 1 && angular.isUndefinedOrNull(_lastLabel))\n result += '' + value.title + '';\n else\n result += '' + value.title + '';\n result += '
    2. ';\n }\n\n });\n if(!angular.isUndefinedOrNull(_lastLabel)){\n result += '
    3. ';\n result += '' + _lastLabel + '';\n result += '
    4. ';\n }\n result += '
    ';\n return result;\n case 'text':\n angular.forEach(_menuList, function(value, index) {\n if(index === _menuList.length-1){\n result = (value.title === \"root\" ? translateFilter(value.title): value.title);\n }\n });\n return result;\n }\n\n\n }\n }\n\n angular.module('eHRD.shared')\n .filter('stringToBreadcrumb', stringToBreadcrumb)\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('eHRD.shared')\n .directive('themeTopBar', themeTopBar)\n ;\n\n /*\n * topnavbar\n * */\n function themeTopBar($timeout) {\n function link() {\n // Call the metsiMenu plugin and plug it to sidebar navigation\n $timeout(function(){\n\n });\n }\n var directive = {\n templateUrl: 'app/shared/views/topbar.html',\n restrict: 'E',\n link: link\n };\n return directive;\n }\n\n})();\n\n\n\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function() {\n 'use strict';\n\n themeMaterialInit.$inject=[\n '$timeout'\n ];\n function themeMaterialInit($timeout) {\n\n function link() {\n $timeout(function(){\n angular.element.material.init();\n },0);\n }\n var directive = {\n link: link\n };\n return directive;\n }\n\n angular\n .module('eHRD.shared')\n .directive('themeMaterialInit', themeMaterialInit)\n ;\n\n})();\n\n\n\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function() {\n 'use strict';\n\n themeApplication.$inject=[\n '$timeout','$window'\n ];\n function themeApplication($timeout, $window) {\n\n var windowWidth;\n var windowHeight;\n var topbarWidth;\n var headerLeftWidth;\n var headerRightWidth;\n\n function applicationService(){\n\n return {\n\n /* ==========================================================*/\n /* BEGIN OTHER */\n /* ========================================================= */\n\n /* Switch Top navigation to Sidebar */\n reposition_topnav: function() {\n if (angular.element('.nav-horizontal').length > 0) {\n topbarWidth = angular.element('.topbar').width();\n headerRightWidth = angular.element('.header-right').width();\n if (angular.element('.header-left .nav-horizontal').length) headerLeftWidth = angular.element('.header-left').width() + 40;\n else headerLeftWidth = angular.element('.nav-sidebar.nav-horizontal > li').length * 140;\n var topbarSpace = topbarWidth - headerLeftWidth - headerRightWidth;\n // top navigation move to left nav if not enough space in topbar\n if (angular.element('.nav-horizontal').css('position') == 'relative' || topbarSpace < 0) {\n if (angular.element('.sidebar .nav-sidebar').length == 2) {\n angular.element('.nav-horizontal').insertAfter('.nav-sidebar:eq(1)');\n } else {\n // only add to bottom if .nav-horizontal is not yet in the left panel\n if (angular.element('.sidebar .nav-horizontal').length == 0) {\n angular.element('.nav-horizontal').appendTo('.sidebar-inner');\n angular.element('.sidebar-widgets').css('margin-bottom', 20);\n }\n }\n angular.element('.nav-horizontal').css({\n display: 'block'\n }).addClass('nav-sidebar').css('margin-bottom', 100);\n // applicationService().createSideScroll();\n angular.element('.nav-horizontal .children').removeClass('dropdown-menu');\n angular.element('.nav-horizontal > li').each(function () {\n angular.element(this).removeClass('open');\n angular.element(this).find('a').removeAttr('class');\n angular.element(this).find('a').removeAttr('data-toggle');\n });\n /* We hide mega menu in sidebar since video / images are too big and not adapted to sidebar */\n if (angular.element('.nav-horizontal').hasClass('mmenu')) angular.element('.nav-horizontal.mmenu').css('height', 0).css('overflow', 'hidden');\n } else {\n if (angular.element('.sidebar .nav-horizontal').length > 0) {\n angular.element('.sidebar-widgets').css('margin-bottom', 100);\n angular.element('.nav-horizontal').removeClass('nav-sidebar').appendTo('.topnav');\n angular.element('.nav-horizontal .children').addClass('dropdown-menu').removeAttr('style');\n angular.element('.nav-horizontal li:last-child').show();\n angular.element('.nav-horizontal > li > a').each(function () {\n angular.element(this).parent().removeClass('active');\n if (angular.element(this).parent().find('.dropdown-menu').length > 0) {\n angular.element(this).attr('class', 'dropdown-toggle');\n angular.element(this).attr('data-toggle', 'dropdown');\n }\n });\n }\n /* If mega menu, we make it visible */\n if (angular.element('.nav-horizontal').hasClass('mmenu')) angular.element('.nav-horizontal.mmenu').css('height', '').css('overflow', '');\n }\n }\n },\n\n /***** Scroll to top button *****/\n scrollTop: function() {\n angular.element(window).scroll(function () {\n if (angular.element(this).scrollTop() > 100) {\n angular.element('.scrollup').fadeIn();\n } else {\n angular.element('.scrollup').fadeOut();\n }\n });\n angular.element('.scrollup').click(function () {\n angular.element(\"html, body\").animate({\n scrollTop: 0\n }, 1000);\n return false;\n });\n },\n\n sidebarBehaviour: function() {\n windowWidth = angular.element(window).width();\n windowHeight = angular.element(window).height() - angular.element('.topbar').height();\n var sidebarMenuHeight = angular.element('.nav-sidebar').height();\n if (windowWidth < 1024) {\n angular.element('body').removeClass('sidebar-collapsed');\n }\n if (angular.element('body').hasClass('sidebar-collapsed') && sidebarMenuHeight > windowHeight) {\n angular.element('body').removeClass('fixed-sidebar');\n // applicationService().destroySideScroll();\n }\n },\n\n mobileSidebar: function(){\n angular.element('html').on('click', '.sidebar-show .nav-sidebar li:not(.metismenu-parent) > a',function(){\n angular.element('body').removeClass('sidebar-show');\n });\n },\n\n detectIE: function() {\n var ua = navigator.userAgent;\n var msie = ua.indexOf('MSIE ');\n var trident = ua.indexOf('Trident/');\n var edge = ua.indexOf('Edge/');\n if (msie > 0 || trident > 0 || edge > 0) {\n angular.element('html').addClass('ie-browser');\n }\n },\n\n /* ========================================================= */\n /*********************** END OTHER **************************/\n /* ========================================================= */\n\n\n init: function () {\n\n windowHeight = angular.element(window).height();\n topbarWidth = angular.element('.topbar').width();\n headerLeftWidth = angular.element('.header-left').width();\n headerRightWidth = angular.element('.header-right').width();\n\n // Check if sidebar is collapsed\n if ( angular.element('body').hasClass('sidebar-collapsed'))\n angular.element('.nav-sidebar .children').css({\n display: ''\n });\n\n applicationService().reposition_topnav();\n applicationService().scrollTop();\n applicationService().sidebarBehaviour();\n applicationService().detectIE();\n // #77833 jasonwang\n //applicationService().mobileSidebar();\n\n }\n };\n }\n\n function link($scope, element) {\n\n $timeout(function(){\n angular.element.material.init();\n // Theme Application Init\n applicationService().init($scope, element);\n\n angular.element('.main-content .page-content > .row').css(\"min-height\", angular.element($window).height());\n // Window resize Function\n angular.element(window).bind(\"resize\", function() {\n $timeout(function () {\n applicationService().reposition_topnav();\n if (!angular.element('body').hasClass('fixed-sidebar') && !angular.element('body').hasClass('builder-admin')) applicationService().sidebarBehaviour();\n }, 100);\n });\n });\n }\n var directive = {\n link: link\n };\n return directive;\n }\n\n angular\n .module('eHRD.shared')\n .directive('themeApplication', themeApplication)\n ;\n\n})();\n\n\n\n/**\n * Created by Bruce on 2016/6/23.\n */\n\n(function() {\n 'use strict';\n\n /*\n * themeSidebarHandle\n * */\n themeSidebarHandle.$inject = ['$timeout', 'navigationService'];\n function themeSidebarHandle($timeout, navigationService) {\n\n function link(scope/*, elem, attrs*/) {\n $timeout(function(){\n navigationService.updateScrollbar('scrollTo', 10);\n\n if (angular.element('body').hasClass('sidebar-collapsed')) {\n navigationService.updateScrollbar('destroy');\n angular.element('body').addClass('sidebar-collapsed');\n angular.element('.sidebar').css('width', '').resizable().resizable('destroy');\n angular.element('.nav-sidebar ul').attr('style', '');\n angular.element(this).addClass('menu-collapsed');\n angular.element('#switch-sidebar').prop('checked');\n }\n else {\n navigationService.scrollBarConfig = {\n scrollButtons: {\n enable: false\n },\n autoHideScrollbar: angular.element(this).hasClass('show-scroll') ? false : true,\n theme: 'light-2',\n axis: 'xy', // enable 2 axis scrollbars by default,\n advanced:{\n updateOnContentResize: true\n },\n scrollInertia: 250\n };\n }\n\n /* Toggle submenu open */\n // Check if sidebar is collapsed\n if (angular.element('body').hasClass('sidebar-collapsed') || angular.element('body').hasClass('sidebar-top') || angular.element('body').hasClass('submenu-hover')){\n angular.element('.nav-sidebar .children').css({\n display: ''\n });\n }else{\n angular.element('.nav-active.active .children').css('display', 'block');\n }\n angular.element('.sidebar').on('click', '.nav-sidebar li.nav-parent > a', function (e) {\n e.preventDefault();\n angular.element('.nav-active.active .children').css('display', 'block');\n if (angular.element('body').hasClass('sidebar-collapsed') && !angular.element('body').hasClass('sidebar-hover')) return;\n if (angular.element('body').hasClass('submenu-hover')) return;\n var parent = angular.element(this).parent().parent();\n parent.children('li.active').children('.children').slideUp(200);\n angular.element('.nav-sidebar .arrow').removeClass('active');\n parent.children('li.active').removeClass('active');\n var sub = angular.element(this).next();\n if (sub.is(\":visible\")) {\n sub.children().addClass('hidden-item')\n angular.element(this).parent().removeClass(\"active\");\n sub.slideUp(200, function () {\n sub.children().removeClass('hidden-item')\n });\n } else {\n angular.element(this).find('.arrow').addClass('active');\n sub.children().addClass('is-hidden');\n $timeout(function () {\n sub.children().addClass('is-shown');\n }, 0);\n sub.slideDown(200, function () {\n angular.element(this).parent().addClass(\"active\");\n // applicationService().createSideScroll();\n $timeout(function () {\n sub.children().removeClass('is-hidden').removeClass('is-shown');\n }, 500);\n });\n }\n\n });\n });\n }\n var directive = {\n restrict: 'A',\n link: link\n };\n return directive;\n }\n\n angular\n .module('eHRD.shared')\n .directive('themeSidebarHandle', themeSidebarHandle)\n ;\n\n})();\n\n\n\n/**\n * Created by Bruce on 2016/6/24.\n */\n(function() {\n 'use strict';\n\n /*\n * themeSidebarCollapsed\n * */\n themeSidebarCollapsed.$inject = ['$timeout', '$state', 'navigationService'];\n function themeSidebarCollapsed($timeout, $state, navigationService) {\n\n function link(scope, elem/*, attrs*/) {\n $timeout(function(){\n elem.bind('click', function(event) {\n event.preventDefault();\n //Click top bar to expend all folder with knowledgeManagementCenter, reportsZone and courseResource\n if ((angular.element('body').hasClass('sidebar-collapsed') || angular.element('body').css('position') === 'relative') &&\n $state.includes('knowledgeManagementCenter.*') || $state.includes('reportsZone') ||\n $state.includes('courseResourceCatalog.*') || $state.includes('courseResourceCatalog.*.*')) {\n // #77833 jasonwang\n angular.element('.nav-sidebar li ul').css({\n display: 'hidden'\n });\n }\n var toggleLayout = angular.element(this).data('toggle');\n if (toggleLayout === 'sidebar-collapsed') collapsedSidebar();\n });\n\n function collapsedSidebar() {\n if (angular.element('body').css('position') !== 'relative') {\n if (!angular.element('body').hasClass('sidebar-collapsed')) {\n navigationService.updateScrollbar('destroy');\n angular.element('body').addClass('sidebar-collapsed');\n angular.element('.sidebar').css('width', '').resizable().resizable('destroy');\n angular.element('.nav-sidebar ul').attr('style', '');\n angular.element(this).addClass('menu-collapsed');\n angular.element('#switch-sidebar').prop('checked');\n } else{\n navigationService.scrollBarConfig = {\n scrollButtons: {\n enable: false\n },\n autoHideScrollbar: angular.element(this).hasClass('show-scroll') ? false : true,\n theme: 'light-2',\n axis: 'xy', // enable 2 axis scrollbars by default,\n advanced:{\n updateOnContentResize: true\n },\n scrollInertia: 250\n };\n angular.element('body').removeClass('sidebar-collapsed');\n if (!angular.element('body').hasClass('submenu-hover'))\n // #77833 jasonwang\n angular.element('.nav-sidebar li.active ul').css({\n display: 'hidden'\n });\n angular.element(this).removeClass('menu-collapsed');\n if (angular.element('body').hasClass('sidebar-light') && !angular.element('body').hasClass('sidebar-fixed')) {\n angular.element('.sidebar').height('');\n\n }\n }\n } else {\n if (angular.element('body').hasClass('sidebar-show')) angular.element('body').removeClass('sidebar-show');\n else angular.element('body').addClass('sidebar-show');\n }\n }\n\n });\n }\n var directive = {\n restrict: 'A',\n link: link\n };\n return directive;\n }\n\n angular\n .module('eHRD.shared')\n .directive('themeSidebarCollapsed', themeSidebarCollapsed)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('eHRD.shared')\n .directive('pageTitle', pageTitle)\n ;\n\n\n\n // pageTitle\n function pageTitle($timeout, $filter, sitemapService, AuthStorage) {\n function link(scope, element) {\n var listener = function() {\n // Default title - load on Dashboard 1\n var title = angular.isDefined(AuthStorage.get(\"projectData\")) ? sitemapService.getProject('broswerTitle') : 'eHRD | Learning System';\n // Create your own title pattern\n $timeout(function() {\n element.text(title);\n });\n };\n scope.$on('$stateChangeSuccess', listener);\n }\n var directive = {\n link: link\n };\n\n return directive;\n }\n\n})();\n\n/**\n * Created by Bruce on 2016/6/8.\n */\n(function () {\n 'use strict';\n\n //ngSpinnerLoader\n ngSpinnerLoader.$inject = ['$rootScope', '$timeout','$state'];\n function ngSpinnerLoader($rootScope, $timeout, $state){\n\n function link(scope, element) {\n\n // by defult hide the spinner bar\n element.addClass('hide'); // hide spinner bar by default\n // display the spinner bar whenever the route changes(the content part started loading)\n var routeChangeStart = $rootScope.$on('$stateChangeStart', function() {\n if( $state.current.name !== 'modules.error') {\n element.removeClass('hide'); // show spinner bar\n }\n if ($state.current.name === 'login'){\n element.addClass('hide');\n }\n });\n $rootScope.$on('$destroy', routeChangeStart);\n\n var stateChangeError= $rootScope.$on('$stateChangeError', function() {\n $timeout(function(){\n element.addClass('hide'); // hide spinner bar\n },500);\n angular.element(\"html, body\").animate({\n scrollTop: 0\n }, 500);\n });\n $rootScope.$on('$destroy', stateChangeError);\n\n // hide the spinner bar on rounte change success(after the content loaded)\n var routeChangeSuccess = $rootScope.$on('$stateChangeSuccess', function() {\n $timeout(function(){\n element.addClass('hide'); // hide spinner bar\n },500);\n angular.element(\"html, body\").animate({\n scrollTop: 0\n }, 500);\n });\n $rootScope.$on('$destroy', routeChangeSuccess);\n }\n var directive = {\n link :link\n };\n\n return directive;\n }\n\n\n angular.module('eHRD.shared')\n .directive('ngSpinnerLoader', ngSpinnerLoader);\n})();\n\n/**\n * Created by Alan on 2017/3/28.\n */\n\n(function () {\n 'use strict';\n\n mobileSidebar.$inject = ['$timeout'];\n function mobileSidebar($timeout) {\n var directive = {\n restrict: 'A',\n scope: false,\n link: function (scope, element) {\n element.hover(function () {\n if (angular.element('body').hasClass('sidebar-collapsed') && angular.element('body').css('position') !== 'relative') {\n\n element.find('ul').css('visibility','hidden');\n element.removeClass('active');\n }\n }, function () {\n if (angular.element('body').hasClass('sidebar-collapsed') && angular.element('body').css('position') !== 'relative') {\n $timeout(function () {\n element.find('ul').css('visibility','');\n }, 200);\n }\n });\n\n element.click(function() {\n if (angular.element('body').hasClass('sidebar-collapsed') && angular.element('body').css('position') !== 'relative') {\n angular.element('.nav-sidebar li.active ul').css('visibility','');\n angular.element('body').removeClass('sidebar-collapsed');\n angular.element('.nav-sidebar li ul').css({\n display: 'block'\n });\n }\n });\n }\n };\n return directive;\n }\n\n angular.module('eHRD.shared')\n .directive('mobileSidebar', mobileSidebar);\n\n})();\n\n/**\r\n * Created by Alan on 2016/11/8.\r\n */\r\n\r\n(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('eHRD.shared')\r\n .directive('mdDatepickerFocusOpen', mdDatepickerFocusOpen);\r\n\r\n\r\n\r\n // pageTitle\r\n function mdDatepickerFocusOpen($timeout) {\r\n function link (scope, element, attributes, DatePickerCtrl) {\r\n element.find('input').on('click', function (e) {\r\n $timeout(DatePickerCtrl.openCalendarPane.bind(DatePickerCtrl, e));\r\n });\r\n }\r\n\r\n var directive = {\r\n restrict: 'A',\r\n require: 'mdDatepicker',\r\n link: link\r\n };\r\n\r\n return directive;\r\n }\r\n\r\n})();\r\n\n/**\n * Created by Alan on 2016/11/4.\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('eHRD.shared')\n .directive('embedSrc', embedSrc)\n ;\n\n\n\n // pageTitle\n function embedSrc() {\n function link(scope, element, attrs) {\n var current = element;\n scope.$watch(function() { return attrs.embedSrc; }, function () {\n var clone = element\n .clone()\n .attr('src', attrs.embedSrc);\n current.replaceWith(clone);\n current = clone;\n });\n }\n var directive = {\n restrict: 'A',\n link: link\n };\n\n return directive;\n }\n\n})();\n\n/**\n * Created by Bruce on 2016/6/4.\n */\n(function () {\n 'use strict';\n\n countTo.$inject = ['$timeout'];\n function countTo($timeout) {\n function link(scope, element, attrs){\n\n var e = element[0];\n var num, refreshInterval, duration, steps, step, countTo, increment;\n\n var calculate = function () {\n refreshInterval = 30;\n step = 0;\n scope.timoutId = null;\n countTo = parseFloat(attrs.countTo) || 0;\n scope.value = parseFloat(attrs.value, 10) || 0;\n duration = (parseFloat(attrs.duration) * 1000) || 0;\n\n steps = Math.ceil(duration / refreshInterval);\n increment = ((countTo - scope.value) / steps);\n num = scope.value;\n };\n\n var tick = function () {\n scope.timoutId = $timeout(function () {\n num += increment;\n step++;\n if (step >= steps) {\n $timeout.cancel(scope.timoutId);\n num = countTo;\n e.textContent = countTo;\n } else {\n e.textContent = Math.round(num);\n tick();\n }\n }, refreshInterval);\n\n };\n\n var start = function () {\n if (scope.timoutId) {\n $timeout.cancel(scope.timoutId);\n }\n calculate();\n tick();\n };\n\n attrs.$observe('countTo', function (val) {\n if (val) {\n start();\n }\n });\n\n attrs.$observe('value', function () {\n start();\n });\n\n return true;\n }\n\n var directive ={\n replace: false,\n scope: true,\n link: link\n };\n return directive;\n }\n\n\n angular.module('eHRD.shared')\n .directive('countTo', countTo);\n})();\n\n/**\n * Created by Bruce on 2016/5/12.\n */\n\n(function() {\n 'use strict';\n\n /**\n * translateCtrl - Controller for translate\n */\n function translateCtrl($translate) {\n var vm = this;\n vm.changeLanguage = function (langKey) {\n $translate.use(langKey);\n vm.language = langKey;\n };\n }\n\n angular\n .module('eHRD.shared')\n .controller('TranslateController', translateCtrl);\n})();\n\n\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n LogoutController.$inject = [ '$auth', 'toastr', '$state'/*,'Restangular','$filter'/*, '$location'*/];\n function LogoutController($auth, toastr, $state/*, Restangular, $filter, $location*/) {\n if (!$auth.isAuthenticated()) { return; }\n $auth.logout()\n .then(function() {\n // Restangular.all('logout').post().then(function () {\n //toastr.error($filter('translate')('MESSAGE.YOU_HAVE_BEEN_LOGGED_OUT'));\n $auth._redirct = 'logout';\n $state.go('login', {}, { reload: true });\n // });\n });\n }\n\n angular.module('eHRD.shared')\n .controller('LogoutController', LogoutController)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n LoginController.$inject = ['$cacheFactory', '$scope', '$location', '$auth', 'toastr', '$filter', '$translate', 'cfpLoadingBar', 'amMoment', '$state', 'loginService', '$stateParams', 'sitemapService'];\n function LoginController($cacheFactory, $scope, $location, $auth, toastr, $filter, $translate, cfpLoadingBar, amMoment, $state, loginService, $stateParams, sitemapService) {\n var vm = this;\n\n vm.isLoginPage = true;\n vm.checkUserLimit = 0;\n loginService.checkUserLimit().then(function(result){\n vm.checkUserLimit = result.status;\n });\n sitemapService.getOnlineUserNumber().then(function(result){\n vm.number = result.number;\n });\n vm.isPreview = !(angular.isUndefinedOrNull($stateParams.pid) || $stateParams.pid==='');\n\n var loginSitmap = $state.$current.locals.globals.loginSitemapRequired;\n\n switch ($translate.use()){\n case 'en-us':\n vm.headWording = loginSitmap.headWording.en;\n vm.footWording = loginSitmap.footWording.en;\n break;\n case 'zh-tw':\n vm.headWording = loginSitmap.headWording.tw;\n vm.footWording = loginSitmap.footWording.tw;\n break;\n case 'zh-cn':\n vm.headWording = loginSitmap.headWording.cn;\n vm.footWording = loginSitmap.footWording.cn;\n break;\n }\n vm.copyright = loginSitmap.copyright;\n vm.logoUrl = loginSitmap.logoUrl;\n sitemapService.setMaterialColor( loginSitmap.panelType);\n vm.login = function(valid ) {\n if(valid){\n cfpLoadingBar.start();\n $auth.login($scope.user)\n .then(function(status) {\n if(angular.isDefined($auth.getUserData())){\n if($auth.getUserData().rc === 'en'){\n $translate.use('en_us');\n }else{\n $translate.use($auth.getUserData().rc);\n }\n amMoment.changeLocale($translate.use());\n }\n /*\n $translate('MESSAGE.YOU_HAVE_SUCCESSFULLY_SIGNED_IN').then(function (translation) {\n toastr.success(translation);\n });\n */\n if( angular.isDefined($auth._redirct) && $auth._redirct!=='/login' && $auth._redirct!=='/logout' && $auth._redirct!== '/' ){\n if($cacheFactory.get('coreCache') && $cacheFactory.get('coreCache').get('currentUser') &&\n (!angular.equals($cacheFactory.get('coreCache').get('currentUser'), $auth.getUserData().id))\n ){\n $cacheFactory.get('coreCache').put('rememberScope', false);\n defaultRedirct();\n }else{\n $location.path($auth._redirct).search($auth._redirctSearch);\n }\n }else {\n defaultRedirct();\n }\n\n function defaultRedirct() {\n if(angular.isDefined($auth.getUserData())){\n sitemapService.getProjectId($stateParams.pid).then(function(data){\n sitemapService.getProjectSideMenu(data.projectId).then(function (menuItems) {\n sitemapService.setMenu(menuItems);\n switch ($auth.getUserData().DefaultLoginPage){\n case 'homepage':\n $state.go('index');\n break;\n case 'overview':\n $state.go('learningPassport.learningDashboard');\n break;\n default:\n $location.path('/');\n }\n });\n });\n }else {\n vm.errorData = status.data;\n switch(status.data) {\n case 'sign_in_user_limit':\n toastr.error($filter('translate')('ERROR.SIGN_IN_USER_LIMIT'));\n break;\n case 'c_sign_in_user_disabled':\n toastr.error($filter('translate')('ERROR.C_SIGN_IN_USER_DISABLED'));\n break;\n case 'sign_in_user_notfound':\n toastr.error($filter('translate')('ERROR.ACCOUNT_OR_PASSWORD_ERROR') + $filter('translate')('FORM_VALIDATION.PLEASE_RE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD'));\n break;\n case 'sign_in_re_ask_password':\n toastr.error($filter('translate')('ERROR.ACCOUNT_OR_PASSWORD_ERROR') + $filter('translate')('FORM_VALIDATION.PLEASE_RE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD'));\n break;\n }\n }\n }\n })\n .catch(function(error) {\n if (error.error) {\n // Popup error - invalid redirect_uri, pressed cancel button, etc.\n toastr.error( $filter('translate')('ERROR.ACCOUNT_OR_PASSWORD_ERROR') + $filter('translate')('FORM_VALIDATION.PLEASE_RE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD'));\n }\n else {\n if(error.status === -1){\n toastr.error($filter('translate')('ERROR.SERVERS_ERROR'));\n }else{\n toastr.error( $filter('translate')('ERROR.ACCOUNT_OR_PASSWORD_ERROR') + $filter('translate')('FORM_VALIDATION.PLEASE_RE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD'));\n }\n }\n })\n .finally(function () {\n cfpLoadingBar.complete();\n });\n }\n };\n\n\n vm.authenticate = function(provider) {\n $auth.authenticate(provider)\n .then(function() {\n toastr.success('You have successfully signed in with ' + provider + '!');\n $location.path('/');\n })\n .catch(function(error) {\n if (error.error) {\n // Popup error - invalid redirect_uri, pressed cancel button, etc.\n toastr.error(error.error);\n } else if (error.data) {\n // HTTP response error from server\n toastr.error(error.data.message, error.status);\n } else {\n toastr.error(error);\n }\n });\n };\n }\n\n angular.module('eHRD.shared')\n .controller('LoginController', LoginController)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n ErrorController.$inject = ['$stateParams', '$filter'];\n function ErrorController($stateParams, $filter) {\n var vm = this;\n vm.isErrorPage = true;\n vm.errorTitle = '';\n vm.serverStatus = '';\n vm.errorContent = '';\n switch ($stateParams.id){\n case '-1':\n vm.serverStatus = '500';\n vm.errorTitle = $filter('translate')('ERROR.CODE.500_TITLE');\n vm.errorContent = $filter('translate')('ERROR.CODE.500_CONTENT');\n break;\n default:\n vm.serverStatus = $stateParams.id;\n vm.errorTitle = $filter('translate')('ERROR.CODE.'+$stateParams.id+'_TITLE');\n vm.errorContent = $filter('translate')('ERROR.CODE.'+$stateParams.id+'_CONTENT');\n break;\n }\n\n }\n\n angular.module('eHRD.shared')\n .controller('ErrorController', ErrorController)\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/7/21.\n */\n(function () {\n 'use strict';\n var IMAGES_ROOT = 'assets/images/';\n\n var layoutPaths = {\n images: {\n root: IMAGES_ROOT,\n profile: IMAGES_ROOT + 'profiles/',\n course: IMAGES_ROOT + 'course/',\n sunnet: IMAGES_ROOT + 'sunnet/',\n make: IMAGES_ROOT + 'make/'\n }\n };\n\n var themeConfig = {\n mainColor : 'color-green',\n backgroundColor:'bg-light-dark'\n };\n\n var defaultFontFamily = \"\\'Microsoft JhengHei\\', RobotoDraft,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif\";\n\n\n angular.module('eHRD.shared')\n .constant('layoutPaths',layoutPaths)\n .constant('themeConfig',themeConfig)\n .constant('defaultFontFamily', defaultFontFamily);\n})();\n\n/**\n * Created by Bruce on 2016/10/5.\n */\n(function () {\n 'use strict';\n\n\n var webServiceSetting = {\n defaultApiPath:'/api',\n defaultApiFileProcessPath:'/file/',\n defaultApiLoginPath:'/login',\n defaultTokenName: 'token',\n defaultTokenPrefix: 'eHRDAuth',\n defaultAuthHeader: 'ClientAuthorization',\n defaultAuthToken: 'Bearer',\n defaultStorageType: 'localStorage'\n };\n\n var defaultEnabledSSOQueryParams = false;\n var defaultSSOQueryParamsKey = [];\n\n angular.module('eHRD.shared.server',[])\n .constant('webServiceSetting',webServiceSetting)\n .constant('defaultServerAddress','')\n .constant('defaultServerDomain','')\n .constant('defaultServerPort','')\n .constant('defaultContextPath','')\n .constant('defaultSSLType', 3)\n .constant('defaultEnabledSSOQueryParams', defaultEnabledSSOQueryParams)\n .constant('defaultSSOQueryParamsKey',defaultSSOQueryParamsKey);\n})();\n\n/**\n * Created by Bruce on 2016/7/21.\n */\n(function () {\n 'use strict';\n routerConfig.$inject = [ '$urlRouterProvider'];\n function routerConfig( $urlRouterProvider) {\n $urlRouterProvider.otherwise('/');\n }\n\n angular.module('eHRD.shared')\n .config(routerConfig);\n})();\n\n/**\n * Created by Bruce on 2016/7/21.\n */\n(function () {\n 'use strict';\n\n coreConfig.$inject = [ 'localStorageServiceProvider', '$windowProvider','$httpProvider', '$authProvider', '$translateProvider', 'RestangularProvider',\n '$breadcrumbsProvider', '$ocLazyLoadProvider', '$translatePartialLoaderProvider',\n 'tmhDynamicLocaleProvider', 'ChartJsProvider','cfpLoadingBarProvider', '$locationProvider', 'serverSettingProvider','ngDialogProvider', 'ScrollBarsProvider'];\n function coreConfig( localStorageServiceProvider, $windowProvider,$httpProvider, $authProvider, $translateProvider, RestangularProvider, $breadcrumbsProvider,\n $ocLazyLoadProvider, $translatePartialLoaderProvider, tmhDynamicLocaleProvider, ChartJsProvider\n ,cfpLoadingBarProvider, $locationProvider, serverSettingProvider, ngDialogProvider, ScrollBarsProvider){\n\n localStorageServiceProvider\n .setPrefix('client');\n\n // set default ScrollBars config\n ScrollBarsProvider.defaults = {\n // theme: 'dark',\n // scrollButtons: {\n // scrollAmount: 'auto', // scroll amount when button pressed\n // enable: true // enable scrolling buttons by default\n // },\n // scrollInertia: 400, // adjust however you want\n axis: 'y', // enable 2 axis scrollbars by default,\n autoHideScrollbar: true,\n advanced:{\n updateOnContentResize: true\n }\n };\n\n // Get IE or Edge browser version\n var isIEversion = detectIE($windowProvider);\n if(isIEversion!=false){\n //http://stackoverflow.com/questions/16098430/angular-ie-caching-issue-for-http\n //initialize get if not there\n if (!$httpProvider.defaults.headers.get) {\n $httpProvider.defaults.headers.get = {};\n }\n // Answer edited to include suggestions from comments\n // because previous version of code introduced browser-related errors\n //disable IE ajax request caching\n $httpProvider.defaults.headers.get['If-Modified-Since'] = new Date().getTime();\n // // extra\n $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache, no-store, must-revalidate';\n //no-cache, no-store, must-revalidate\n $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';\n $httpProvider.defaults.headers.get['Expires'] = '0';\n }\n\n\n $locationProvider.html5Mode(false);\n\n cfpLoadingBarProvider.includeBar = true;\n cfpLoadingBarProvider.spinnerTemplate = '
    ';\n\n\n ngDialogProvider.setDefaults({\n className: 'ngdialog-theme-default'\n });\n\n ChartJsProvider.setOptions({\n colours: ['#FF5252', '#FF8A80'],\n responsive: true\n });\n\n // Configure all charts\n ChartJsProvider.setOptions({\n colors: ['#97BBCD', '#DCDCDC', '#F7464A', '#46BFBD', '#FDB45C', '#949FB1', '#4D5360']\n });\n // Configure all doughnut charts\n ChartJsProvider.setOptions('doughnut', {\n cutoutPercentage:70,\n tooltips: { enabled: false }\n });\n ChartJsProvider.setOptions('bubble', {\n tooltips: { enabled: false }\n });\n\n\n $translateProvider\n .useSanitizeValueStrategy(null)// for prevent from XSS vulnerability but this has problem with utf-8 language\n .fallbackLanguage(['en-us', 'zh-tw','zh-cn']) //Registering a fallback language\n .registerAvailableLanguageKeys(['en-us', 'zh-tw','zh-cn'], { // register your language key and browser key find\n 'en_*': 'en-us',\n 'zh_tw': 'zh-tw',\n 'zh_cn': 'zh-cn'\n })\n .useLoaderCache(true)//use cache to loading translate file\n .useCookieStorage()// using cookie to keep current language\n .forceAsyncReload(true)\n //.useMissingTranslationHandlerLog() // you can remove in production\n //.determinePreferredLanguage();// define language by browser language\n .preferredLanguage('zh-tw')\n ;\n\n /* angular locale dynamic load */\n tmhDynamicLocaleProvider.localeLocationPattern('assets/plugins/angular-i18n/angular-locale_{{locale}}.js');\n\n\n var ocLazyLoadConfig = {\n debug: true,\n events: true,\n modules: [\n {\n name:'server-config',\n files: ['app/js/TestModule.js']\n },\n {\n name:'default',\n files:['assets/material-theme/default.css']\n },\n {\n name:'redTheme',\n files:['assets/material-theme/redTheme.css']\n },\n {\n name:'pinkTheme',\n files:['assets/material-theme/pinkTheme.css']\n },\n {\n name:'blueTheme',\n files:['assets/material-theme/blueTheme.css']\n },\n {\n name:'tealTheme',\n files:['assets/material-theme/tealTheme.css']\n },\n {\n name:'greenTheme',\n files:['assets/material-theme/greenTheme.css']\n },\n {\n name:'orangeTheme',\n files:['assets/material-theme/orangeTheme.css']\n }, \n {\n name:'blackTheme',\n files:['assets/material-theme/blackTheme.css']\n }, \n {\n name:'purpleTheme',\n files:['assets/material-theme/purpleTheme.css']\n }, \n {\n name:'theme-plugins',\n files:[\n 'assets/plugins/modernizr/modernizr-2.6.2-respond-1.1.0.min.js',\n 'assets/plugins/jstree/dist/themes/default/style.css',\n 'assets/plugins/slick/slick.css',\n 'assets/plugins/icheck/skins/all.css',\n 'assets/plugins/bootstrap/css/jasny-bootstrap.css',\n 'assets/icons/line-icons/line-icons.css',\n 'assets/icons/rounded/style.css',\n 'assets/plugins/step-form-wizard/css/step-form-wizard.css',\n 'assets/plugins/step-form-wizard/js/step-form-wizard.js'\n ]\n },\n {\n name:'stepFormWizard',\n files:[\n 'assets/plugins/step-form-wizard/css/step-form-wizard.css',\n 'assets/plugins/step-form-wizard/js/step-form-wizard.js'\n ]\n }\n ]\n };\n\n $ocLazyLoadProvider.config(ocLazyLoadConfig);\n\n // Setting breadcrumbs\n $breadcrumbsProvider.setOptions({\n prefixStateName: 'index',\n includeAbstract: true,\n templateUrl:'app/shared/views/breadcrumbTemplate.html'\n });\n }\n\n\n /**\n * detect IE\n * returns version of IE or false, if browser is not Internet Explorer\n */\n function detectIE($windowProvider) {\n var $window = $windowProvider.$get();\n var ua = $window.navigator.userAgent;\n\n // Test values; Uncomment to check result …\n\n // IE 10\n // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';\n\n // IE 11\n // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';\n\n // Edge 12 (Spartan)\n // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';\n\n // Edge 13\n // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586';\n\n var msie = ua.indexOf('MSIE ');\n if (msie > 0) {\n // IE 10 or older => return version number\n return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);\n }\n\n var trident = ua.indexOf('Trident/');\n if (trident > 0) {\n // IE 11 => return version number\n var rv = ua.indexOf('rv:');\n return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);\n }\n\n var edge = ua.indexOf('Edge/');\n if (edge > 0) {\n // Edge (IE 12+) => return version number\n return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\n }\n\n // other browser\n return false;\n }\n\n angular.module('eHRD.shared')\n .config(coreConfig);\n})();\n\n/**\n * Created by Bruce on 2016/7/21.\n */\n(function () {\n 'use strict';\n\n materialConfig.$inject = ['$mdThemingProvider', '$mdIconProvider', '$mdDateLocaleProvider'];\n function materialConfig( $mdThemingProvider, $mdIconProvider, $mdDateLocaleProvider){\n\n $mdThemingProvider.disableTheming();\n var localeDate = moment.localeData();\n $mdDateLocaleProvider.months = localeDate._months;\n $mdDateLocaleProvider.shortMonths = localeDate._monthsShort;\n $mdDateLocaleProvider.days = localeDate._weekdays;\n $mdDateLocaleProvider.shortDays = localeDate._weekdaysMin;\n // Can change week display to start on Monday.\n $mdDateLocaleProvider.firstDayOfWeek = 1;\n // Optional.\n // $mdDateLocaleProvider.dates = [1, 2, 3, 4, 5, 6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];\n // Example uses moment.js to parse and format dates.\n $mdDateLocaleProvider.parseDate = function(dateString) {\n var m = moment(dateString, 'YYYY/MM/DD', true);\n return m.isValid() ? m.toDate() : new Date(NaN);\n };\n $mdDateLocaleProvider.formatDate = function(date) {\n var m = moment(date);\n if(!date){\n return '';\n }\n return m.isValid() ? m.format('YYYY/MM/DD') : '';\n };\n\n // $mdDateLocaleProvider.monthHeaderFormatter = function(date) {\n // return shortMonths[date.getMonth()] + ' ' + date.getFullYear();\n // };\n\n // In addition to date display, date components also need localized messages\n // for aria-labels for screen-reader users.\n\n $mdDateLocaleProvider.weekNumberFormatter = function(weekNumber) {\n return 'Semaine ' + weekNumber;\n };\n\n $mdDateLocaleProvider.msgCalendar = 'Calendrier';\n $mdDateLocaleProvider.msgOpenCalendar = 'Ouvrir le calendrier';\n\n // You can also set when your calendar begins and ends.\n // $mdDateLocaleProvider.firstRenderableDate = new Date(1776, 6, 4);\n // $mdDateLocaleProvider.lastRenderableDate = new Date(2012, 11, 21);\n\n\n $mdIconProvider\n // .iconSet('fa', 'assets/icons/font-awesome/MaterialIcons-Regular.svg', 24)\n // .defaultIconSet('assets/icons/MaterialIcons-Regular.svg', 24)\n .fontSet('md', 'material-icons');\n\n //black background color\n // var backgroundPalette = $mdThemingProvider.extendPalette('grey', { '50': 'ffffff' });\n // $mdThemingProvider.definePalette('background', backgroundPalette);\n //\n // var grey = $mdThemingProvider.extendPalette('grey', {\n // '0': '#ffffff',\n // '50': '#fafafa',\n // '100': '#f5f5f5',\n // '200': '#eeeeee',\n // '300': '#e0e0e0',\n // '400': '#bdbdbd',\n // '500': '#9e9e9e',\n // '600': '#757575',\n // '700': '#616161',\n // '800': '#424242',\n // '900': '#212121',\n // 'A100': '#ffffff',\n // 'A200': '#000000',\n // 'A400': '#303030',\n // 'A700': '#616161',\n // 'contrastDefaultColor': 'dark',\n // 'contrastLightColors': '600 700 800 900 A200 A400 A700'\n // });\n // $mdThemingProvider.definePalette('grey', grey);\n\n //red\n // $mdThemingProvider.theme('redTheme')\n // .primaryPalette('red')\n // .accentPalette('brown')\n // .warnPalette('orange')\n // .backgroundPalette('background');\n //\n // //pink\n // $mdThemingProvider.theme('pinkTheme')\n // .primaryPalette('pink')\n // .accentPalette('indigo')\n // .warnPalette('orange')\n // .backgroundPalette('background');\n //\n // //blue\n // $mdThemingProvider.theme('blueTheme')\n // .primaryPalette('blue')\n // .accentPalette('orange')\n // .warnPalette('red')\n // .backgroundPalette('background');\n //\n // //teal\n // $mdThemingProvider.theme('tealTheme')\n // .primaryPalette('teal')\n // .accentPalette('light-green')\n // .warnPalette('deep-orange')\n // .backgroundPalette('background');\n //\n // //green\n // $mdThemingProvider.theme('greenTheme')\n // .primaryPalette('green')\n // .accentPalette('teal')\n // .warnPalette('deep-orange')\n // .backgroundPalette('background');\n //\n // //orange\n // $mdThemingProvider.theme('orangeTheme')\n // .primaryPalette('orange')\n // .accentPalette('light-green')\n // .warnPalette('red')\n // .backgroundPalette('background');\n //\n // //black\n // $mdThemingProvider.theme('blackTheme')\n // .primaryPalette('blue-grey')\n // .accentPalette('blue')\n // .warnPalette('deep-orange')\n // .backgroundPalette('background');\n //\n // //purple\n // $mdThemingProvider.theme('purpleTheme')\n // .primaryPalette('deep-purple')\n // .accentPalette('orange')\n // .warnPalette('red')\n // .backgroundPalette('background');\n //\n // $mdThemingProvider.theme('default')\n // .primaryPalette('teal')\n // .accentPalette('teal',{\n // 'default': '300'\n // })\n // .warnPalette('red',{\n // 'default': '800'\n // })\n // .backgroundPalette('background');\n //\n // $mdThemingProvider.theme('docs-dark', 'default')\n // .primaryPalette('teal')\n // .dark();\n //\n // $mdThemingProvider.theme('btn')\n // .primaryPalette('purple')\n // .accentPalette('green');\n //\n // $mdThemingProvider.setDefaultTheme('default');\n\n }\n\n angular.module('eHRD.shared')\n .config(materialConfig);\n})();\n\n/**\n * Created by Bruce on 2017/02/08.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules.backgroundSchedule', []);\n\n})();\n\n/**\n * Created by Bruce on 2017/02/08.\n */\n\n(function () {\n 'use strict';\n\n backgroundScheduleService.$inject = ['$log', '$auth', '$interval', 'Restangular'];\n function backgroundScheduleService($log, $auth, $interval, Restangular) {\n var connTouchTimer;\n var connTouchService = Restangular.all('conn-touch');\n function checkConnTouch() {\n if($auth.isAuthenticated()){\n connTouchService.customGET().then(function (data) {\n if(data.status === '1'){\n $log.info(\"Reset User Browser Conn Touch Time!\")\n }else {\n $log.warn(\"Reset User Browser Conn Touch Time!\")\n }\n\n });\n }else {\n $interval.cancel(connTouchTimer);\n }\n }\n function initBackgroundSchedule() {\n connTouchTimer = $interval(checkConnTouch, 60000);\n }\n return {\n initBackgroundSchedule : initBackgroundSchedule\n };\n }\n\n angular\n .module('eHRD.modules.backgroundSchedule')\n .factory('backgroundScheduleService', backgroundScheduleService);\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n(function () {\n 'use strict';\n authProvider.$inject = ['AuthConfig'];\n function authProvider(config) {\n Object.defineProperties(this, {\n httpInterceptor: {\n get: function() { return config.httpInterceptor; },\n set: function(value) {\n if (angular.isFunction(value)) {\n config.httpInterceptor = value;\n } else {\n config.httpInterceptor = function() {\n return value;\n };\n }\n }\n },\n baseUrl: {\n get: function() { return config.baseUrl; },\n set: function(value) { config.baseUrl = value; }\n },\n loginUrl: {\n get: function() { return config.loginUrl; },\n set: function(value) { config.loginUrl = value; }\n },\n tokenRoot: {\n get: function() { return config.tokenRoot; },\n set: function(value) { config.tokenRoot = value; }\n },\n tokenName: {\n get: function() { return config.tokenName; },\n set: function(value) { config.tokenName = value; }\n },\n tokenPrefix: {\n get: function() { return config.tokenPrefix; },\n set: function(value) { config.tokenPrefix = value; }\n },\n unlinkUrl: {\n get: function() { return config.unlinkUrl; },\n set: function(value) { config.unlinkUrl = value; }\n },\n authHeader: {\n get: function() { return config.authHeader; },\n set: function(value) { config.authHeader = value; }\n },\n authToken: {\n get: function() { return config.authToken; },\n set: function(value) { config.authToken = value; }\n },\n withCredentials: {\n get: function() { return config.withCredentials; },\n set: function(value) { config.withCredentials = value; }\n },\n storageType: {\n get: function() { return config.storageType; },\n set: function(value) { config.storageType = value; }\n },\n authType: {\n get: function() { return config.authType; },\n set: function(value) { config.authType = value; }\n }\n });\n angular.forEach(Object.keys(config.providers), function(provider) {\n this[provider] = function(params) {\n return angular.extend(config.providers[provider], params);\n };\n }, this);\n var oauth = function(params) {\n config.providers[params.name] = config.providers[params.name] || {};\n angular.extend(config.providers[params.name], params);\n };\n this.oauth1 = function(params) {\n oauth(params);\n config.providers[params.name].oauthType = '1.0';\n };\n this.oauth2 = function(params) {\n oauth(params);\n config.providers[params.name].oauthType = '2.0';\n };\n\n auth.$inject=[\n '$q',\n '$window',\n 'AuthShared',\n 'AuthLocal',\n 'AuthOauth',\n '$location',\n '$state',\n 'AuthConfig', 'AuthStorage', 'sitemapService', 'serverSetting'];\n function auth($q, $window, shared, local, oauth, $location, $state, AuthConfig, AuthStorage, sitemapService, serverSetting) {\n var $auth = {};\n\n $auth.setHttpInterceptor = function (val) {\n AuthConfig.httpInterceptor = val;\n };\n $auth.setWithCredentials = function (val) {\n AuthConfig.withCredentials = val;\n };\n $auth.setTokenRoot = function (val) {\n AuthConfig.tokenRoot = val;\n };\n $auth.setBaseUrl = function (val) {\n AuthConfig.baseUrl = val;\n };\n $auth.setLoginUrl = function (val) {\n AuthConfig.loginUrl = val;\n };\n $auth.setUnlinkUrl = function (val) {\n AuthConfig.unlinkUrl = val;\n };\n $auth.setTokenName = function (val) {\n AuthConfig.tokenName = val;\n };\n $auth.setTokenPrefix = function (val) {\n AuthConfig.tokenPrefix = val;\n };\n $auth.setAuthHeader = function (val) {\n AuthConfig.authHeader = val;\n };\n $auth.setAuthToken = function (val) {\n AuthConfig.authToken = val;\n };\n $auth.setStorageType = function (val) {\n AuthConfig.storageType = val;\n };\n $auth.setAuthType = function (val) {\n AuthConfig.authType = val;\n };\n\n $auth.checkServerStatus = function (options) {\n var data = {token:this.getToken()};\n local.checkServerStatus(data, options)\n .catch(function (error) {\n switch (error.status){\n default:\n $location.path('/error/'+error.status);\n break;\n }\n }\n );\n };\n\n $auth.login = function(user, opts) {\n return local.login(user, opts);\n };\n\n $auth.logout = function() {\n // return isShared? shared.logout() : local.logout();\n return local.logout();\n };\n $auth.authenticate = function(name, userData) {\n return oauth.authenticate(name, userData);\n };\n $auth.link = function(name, userData) {\n return oauth.authenticate(name, userData);\n };\n $auth.unlink = function(provider, opts) {\n return oauth.unlink(provider, opts);\n };\n $auth.isAuthenticated = function() {\n return shared.isAuthenticated();\n };\n $auth.getToken = function() {\n return shared.getToken();\n };\n $auth.getDataToken = function() {\n return shared.getDataToken();\n };\n $auth.setACL = function () {\n var token = this.getDataToken();\n return shared.setACL(token);\n };\n $auth.setToken = function(token) {\n return shared.setToken({ access_token: token });\n };\n $auth.removeToken = function() {\n return shared.removeToken();\n };\n $auth.getUserData = function(){\n return shared.getUserData();\n };\n $auth.getPayload = function() {\n return shared.getPayload();\n };\n $auth.setStorageType = function(type) {\n return shared.setStorageType(type);\n };\n $auth.setAuthType = function(type) {\n return shared.setAuthType(type);\n };\n\n $auth.skipIfLoggedIn = function(){\n var deferred = $q.defer();\n if ($auth.isAuthenticated()) {\n if($auth._redirct !== 'logout' && $auth._redirct !== '/logout' && $auth._redirct !== 'login' && $auth._redirct !== '/login'){\n $location.path($auth._redirct);\n }else {\n $state.go('index');\n }\n deferred.reject();\n } else {\n if($auth._redirct !== 'logout' && $auth._redirct !== '/logout'){\n local.OtherLogin().then(function successCallback(response) {\n shared.setToken(response);\n if ($auth.isAuthenticated()) {\n sitemapService.getProjectId().then(function(data){\n sitemapService.setSiteMap(data);\n $location.path($auth._redirct);\n $window.location.reload();\n });\n }else{\n deferred.resolve();\n }\n }, function errorCallback() {\n if (serverSetting.authConfig.CAS_ENABLED) {\n var CAS_VALIDATE_PATH = [serverSetting.baseConfig.baseURL, serverSetting.authConfig.CAS_VALIDATE_PATH].join('/');\n if (encodeURIComponent($auth._redirct).length > 0 && $auth._redirct!=='logout' && $auth._redirct!=='/logout'){\n CAS_VALIDATE_PATH = CAS_VALIDATE_PATH + '?referer=' + ($auth._redirct);\n }\n $window.location.href = CAS_VALIDATE_PATH;\n } else {\n deferred.resolve();\n }\n });\n }else{\n deferred.resolve();\n }\n }\n return deferred.promise;\n };\n\n $auth.loginRequired = function (pid) {\n var deferred = $q.defer();\n $auth._redirct = $location.path();\n $auth._redirctSearch = $location.search();\n if ( $auth.isAuthenticated()) {\n local.validateToken().then(function (response) {\n if(angular.isObject(response.data)){\n shared.setToken(response);\n sitemapService.getProjectId(pid).then(function(data){\n sitemapService.setSiteMap(data);\n deferred.resolve();\n });\n }else{\n shared.logout();\n $state.go('login');\n }\n }, function (error) {\n if (serverSetting.authConfig.CAS_ENABLED){\n var CAS_VALIDATE_PATH = [serverSetting.baseConfig.baseURL, serverSetting.authConfig.CAS_VALIDATE_PATH].join('/');\n if (encodeURIComponent($auth._redirct).length > 0 && $auth._redirct!=='logout' && $auth._redirct!=='/logout'){\n CAS_VALIDATE_PATH = CAS_VALIDATE_PATH + '?referer=' + ($auth._redirct);\n }\n $window.location.href = CAS_VALIDATE_PATH;\n } else {\n if( error.status === 401){\n shared.logout();\n $state.go('login');\n }else {\n $state.go('error', {id: error.status});\n }\n }\n });\n } else {\n $state.go('login');\n }\n return deferred.promise;\n };\n\n return $auth;\n }\n\n this.$get = auth;\n\n }\n angular.module('eHRD.kernel.auth')\n .provider('$auth', authProvider)\n ;\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n angular.module('eHRD.kernel.auth')\n\n .constant('AuthConfig', {\n httpInterceptor: function() { return true; },\n withCredentials: false,\n tokenRoot: null,\n baseUrl: '/',\n loginUrl: '/api/login',\n logoutUrl: '/api/logout',\n checkServerStatusUrl: 'auth/checkServerStatus',\n unlinkUrl: '/api/unlink/',\n tokenName: 'token',\n tokenPrefix: 'eHRDAuth',\n authHeader: 'Authorization',\n authToken: 'Bearer',\n storageType: 'localStorage',\n authType: 'General',// NTlm, SSO, General\n providers: {\n\n }\n })\n ;\n\n})();\n\n/**\n * Created by Bruce on 2016/5/17.\n */\n\n(function () {\n 'use strict';\n\n authConfig.$inject = ['$httpProvider'];\n function authConfig( $httpProvider){\n $httpProvider.interceptors.push('AuthInterceptor');\n }\n\n angular.module('eHRD.kernel.auth')\n\n .config(authConfig);\n\n})();\n\n/**\n * Created by Bruce on 2016/7/21.\n */\n(function () {\n 'use strict';\n\n /** @ngInject */\n runThemeBlock.$inject=[\n '$timeout',\n '$rootScope',\n '$q',\n '$auth',\n '$translate',\n 'CoreService',\n '$state',\n 'tmhDynamicLocale',\n 'amMoment',\n '$mdDateLocale',\n 'backgroundScheduleService'\n ];\n\n function runThemeBlock($timeout, $rootScope, $q, $auth,$translate, CoreService,$state, tmhDynamicLocale, amMoment, $mdDateLocale, backgroundScheduleService) {\n CoreService.systemInit();\n CoreService.serverSettingInit();\n CoreService.authInit();\n CoreService.RestangularInit();\n $auth.setACL();\n\n backgroundScheduleService.initBackgroundSchedule();\n var $translatePartialLoaderStructureChanged = $rootScope.$on('$translatePartialLoaderStructureChanged', function () {\n $translate.refresh();\n });\n $rootScope.$on('$destroy', $translatePartialLoaderStructureChanged);\n\n var $translateChangeEnd = $rootScope.$on('$translateChangeEnd', function() {\n // get current language\n $rootScope.currentLanguage = $translate.use();\n //dynamic load angularjs locale\n tmhDynamicLocale.set($rootScope.currentLanguage);\n // change direction to right-to-left language\n if($rootScope.currentLanguage==='ar-ae' || $rootScope.currentLanguage==='fa-ir'){\n $rootScope.currentDirection = 'rtl';\n } else{\n $rootScope.currentDirection = 'ltr';\n }\n // set lang parameter for any request that with Restangular\n // Restangular.setDefaultRequestParams({lang: $rootScope.currentLanguage});\n\n amMoment.changeLocale($translate.use());\n var localeDate = moment.localeData();\n $mdDateLocale.months = localeDate._months;\n $mdDateLocale.shortMonths = localeDate._monthsShort;\n $mdDateLocale.days = localeDate._weekdays;\n $mdDateLocale.shortDays = localeDate._weekdaysMin;\n });\n $rootScope.$on('$destroy', $translateChangeEnd);\n\n if(angular.isDefined($auth.getUserData())){\n // $translate.use($auth.getUserData().rc);\n }\n\n $rootScope.$state = $state;\n\n var scope = $rootScope;\n\n scope.$isMobile = (/android|webos|iphone|ipad|ipod|blackberry|windows phone/).test(navigator.userAgent.toLowerCase());\n\n var whatToWait = [\n $timeout(0)\n ];\n\n $q.all(whatToWait).then(function () {\n scope.$pageFinishedLoading = true;\n });\n\n $timeout(function () {\n if (!scope.$pageFinishedLoading) {\n scope.$pageFinishedLoading = true;\n }\n }, 1000);\n\n scope.$watch('$pageFinishedLoading', function(newValue) {\n if(newValue){\n angular.element('.loader-overlay').addClass('loaded');\n angular.element('body > section').animate({\n opacity: 1\n }, 400);\n }\n });\n\n scope.$on('$viewContentLoaded', function () {\n angular.element('.nav.nav-sidebar .nav-active').removeClass('nav-active active');\n angular.element('.nav.nav-sidebar .active:not(.nav-parent)').closest('.nav-parent').addClass('nav-active active');\n\n $timeout(function(){\n // Add class everytime a mouse pointer hover over it\n var hoverTimeout;\n angular.element('.nav-sidebar > li').hover(function () {\n clearTimeout(hoverTimeout);\n angular.element(this).siblings().removeClass('nav-hover');\n angular.element(this).addClass('nav-hover');\n }, function () {\n var $self = angular.element(this);\n hoverTimeout = $timeout(function () {\n $self.removeClass('nav-hover');\n }, 200);\n });\n\n angular.element('.nav-sidebar > li .children').hover(function () {\n clearTimeout(hoverTimeout);\n angular.element(this).closest('.nav-parent').siblings().removeClass('nav-hover');\n angular.element(this).closest('.nav-parent').addClass('nav-hover');\n }, function () {\n var $self = angular.element(this);\n hoverTimeout = $timeout(function () {\n $self.closest('.nav-parent').removeClass('nav-hover');\n }, 200);\n });\n });\n });\n\n scope.$on('$stateChangeSuccess',function (/*ev, to, toParams, from, fromParams*/) {\n // console.log(ev, to, toParams, from, fromParams)\n angular.element(\"html, body\").animate({\n scrollTop: 0\n }, 10);\n });\n\n }\n\n angular.module('eHRD.shared')\n .run(runThemeBlock);\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function () {\n 'use strict';\n\n angular\n .module('eHRD.modules',[\n 'eHRD.modules.sitemap',\n 'eHRD.modules.staticPage',\n 'eHRD.modules.utils',\n 'eHRD.modules.language',\n 'eHRD.modules.dashboard',\n 'eHRD.modules.system',\n 'eHRD.modules.fileProcess',\n 'eHRD.modules.index',\n 'eHRD.modules.approve',\n 'eHRD.modules.manager',\n 'eHRD.modules.user',\n 'eHRD.modules.courseResource',\n 'eHRD.modules.learningResource',\n 'eHRD.modules.reports',\n 'eHRD.modules.forum',\n 'eHRD.modules.mailLink',\n 'eHRD.modules.training',\n 'eHRD.modules.trainingRoadMap',\n 'eHRD.modules.certZone',\n 'eHRD.modules.calendar',\n 'eHRD.modules.routing',\n 'eHRD.modules.backgroundSchedule'\n ]);\n\n})();\n\n/**\n * Created by Bruce on 2016/5/11.\n */\n\n(function() {\n 'use strict';\n\n angular\n .module('eHRD', [\n 'ngMaterial',\n 'mdPickers',\n 'ngCookies',\n 'ngTouch',\n 'ngMessages',\n 'ngAria',\n 'ngResource',\n 'ui.router', // Routing\n 'oc.lazyLoad', // ocLazyLoad\n 'ui.bootstrap', // Ui Bootstrap\n 'slick',\n 'ngRateIt',\n 'LocalStorageModule',\n 'ngQueue',\n 'angular.filter',\n 'ngSanitize', // ngSanitize\n 'toastr',\n 'angular-loading-bar',\n 'ngScrollbars',\n 'tmh.dynamicLocale',\n 'pascalprecht.translate',\n 'angularMoment',\n 'restangular',\n 'eHRD.kernel.auth',\n 'eHRD.kernel.uiElements',\n 'chart.js',\n 'highcharts-ng',\n 'gridshore.c3js.chart',\n 'ngDialog',\n 'eHRD.shared',\n 'eHRD.modules'\n\n ]);\n\n})();\n\nangular.module(\"eHRD\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"app/shared/views/breadcrumbTemplate.html\",\"
    \");\n$templateCache.put(\"app/shared/views/content.html\",\"

    {{UC.copyright}}

    \");\n$templateCache.put(\"app/shared/views/error-page.html\",\"

    {{\\'YOU_DONT_HAVE_ACCESS\\' | translate}}

    \");\n$templateCache.put(\"app/shared/views/error.html\",\"

    {{vm.serverStatus}}|

    {{vm.errorTitle}}|

    {{vm.errorContent}}|


    © Copyright Themes Lab, 2015 Themes Lab Inc.
    \");\n$templateCache.put(\"app/shared/views/login.html\",\"

    \\\"\\\"

    = 0\\\">{{ \\'SYSTEM.ONLINE_USER_NO\\' | translate}}: {{vm.number}}

    {{ \\'PLACEHOLDERS.PLEASE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD\\' | translate}}

    account_circle
    https

    {{\\'ERROR.ACCOUNT_OR_PASSWORD_ERROR\\'| translate}}{{\\'FORM_VALIDATION.PLEASE_RE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD\\'| translate}}

    {{\\'ERROR.SIGN_IN_USER_LIMIT\\'| translate}}

    {{\\'ERROR.C_SIGN_IN_USER_DISABLED\\'| translate}}

    {{\\'ERROR.ACCOUNT_OR_PASSWORD_ERROR\\'| translate}}{{\\'FORM_VALIDATION.PLEASE_RE_ENTER_YOUR_ACCOUNT_NUMBER_AND_PASSWORD\\'| translate}}

    {{ \\'ACTIONS.LOGIN\\' | translate }}

    {{vm.copyright}}

    \");\n$templateCache.put(\"app/shared/views/topbar.html\",\"\");\n$templateCache.put(\"app/modules/approve/views/approve-status.html\",\"
    0\\\">
    \");\n$templateCache.put(\"app/modules/approve/views/form-status-dialog.html\",\"

    {{ \\'ACTIONS.\\' + $ctrl.approveType |uppercase |translate}}

    close
    {{$ctrl.approverTitle}}
    {{$ctrl.rejectReson}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/approve/views/manager-approve-records-search-dialog.html\",\"

    {{ \\'FIELD.SELECT_SEARCH_FILTER\\' | translate}}

    close
    {{ \\'FIELD.APPLY_DATE\\' | translate}}To
    {{evetType.name}}{{ \\'FIELD.ALL\\' |translate }}{{ \\'STATUS.APPROVALED\\' |translate }}{{ \\'STATUS.REJECTED\\' |translate }}{{ \\'STATUS.CANCEL\\' |translate }}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/approve/views/manager-approve-records.html\",\"

    {{ \\'TRAINING_APPROVE_RECORDS_SEARCH\\' | translate}}

    {{ \\'ACTIONS.SEARCH\\' | translate}}
    {{row.approvalType}}
    {{row.groups.slice(0,-1)}}
    {{row.formattedApplyDate}}
    {{row.approver}}
    {{ \\'ACTIONS.FORM_EDIT\\' | translate}}{{ \\'ACTIONS.VIEW_REPORT\\' | translate}} {{ \\'ACTIONS.FORM_VIEW\\' | translate}} {{ \\'ACTIONS.RESEND\\' | translate }} {{ \\'ACTIONS.CANCEL\\' | translate }} more_vert
    • {{\\'FIELD.TYPE\\' | translate}} :

      自行報名(外訓)
    • {{\\'FIELD.APPLICANT_DEPARTMENT\\' | translate}} :

      桃園分行(0277)
    • {{\\'FIELD.APPLY_DATE\\' | translate}} :

      2016/07/01
    • {{\\'FIELD.APPROVER\\' | translate}} :

      2016/07/22
    \");\n$templateCache.put(\"app/modules/approve/views/manager-approve.html\",\"

    {{ \\'TRAINING_APPROVE\\' | translate}}

    -1\\\" ng-click=\\\"$ctrl.selectApproveCheckbox(row)\\\">
    {{row.approvalType}}
    {{row.sessionName}}
    {{row.groups.slice(0,-1)}}
    {{row.formattedApplyDate}}
    {{row.formattedModifiedDate}}
    {{row.pendingMessage}}
    {{ \\'ACTIONS.FORM_EDIT\\' | translate}}{{ \\'ACTIONS.VIEW_REPORT\\' | translate}} {{ \\'ACTIONS.FORM_VIEW\\' | translate}} {{ \\'ACTIONS.RESEND\\' | translate }} {{ \\'ACTIONS.CANCEL\\' | translate }} {{ \\'ACTIONS.NO_APPROVAL\\' | translate }} more_vert
    • {{ \\'FIELD.TYPE\\' | translate}} :

      自行報名(外訓)
    • {{ \\'FIELD.DEPARTMENT\\' | translate}} :

      桃園分行(0277)
    • {{ \\'FIELD.APPLY_DATE\\' | translate}} :

      2016/07/01
    • {{ \\'FIELD.ARRIVAL_DATE\\' | translate}} :

      2016/07/22
    • {{ \\'FIELD.CURRENT_PROCESS\\' | translate}} :

      新到
    {{ \\'ACTIONS.APPROVAL\\' | translate}}
    \");\n$templateCache.put(\"app/modules/approve/views/user-approve-records.html\",\"

    {{ \\'APPROVE_RECORDS\\' | translate}}

    {{ \\'ACTIONS.SEARCH\\' | translate}}
    {{row.approvalType}}
    {{row.formattedApplyDate}}
    {{row.approver}}
    {{ \\'ACTIONS.FORM_EDIT\\' | translate}}{{ \\'ACTIONS.VIEW_REPORT\\' | translate}} {{ \\'ACTIONS.FORM_VIEW\\' | translate}} {{ \\'ACTIONS.RESEND\\' | translate }} {{ \\'ACTIONS.CANCEL\\' | translate }} more_vert
    • {{\\'FIELD.TYPE\\' | translate}} :

      自行報名(外訓)
    • {{\\'FIELD.APPLICANT_DEPARTMENT\\' | translate}} :

      桃園分行(0277)
    • {{\\'FIELD.APPLY_DATE\\' | translate}} :

      2016/07/01
    • {{\\'FIELD.APPROVER\\' | translate}} :

      2016/07/22
    \");\n$templateCache.put(\"app/modules/cert-zone/views/cert-applyform-compensation-view.html\",\"
    {{ \\'FIELD.APPLICANT\\' | translate}}
    {{ \\'FIELD.FULL_NAME\\' | translate}}{{ ::$ctrl.applicantInfo.FirstName}}
    {{ \\'FIELD.APPLY_DATE\\' | translate}}{{ ::$ctrl.data.formInfo.applyDate}}
    0\\\">
    {{ \\'FIELD.DEPARTMENT\\' | translate}}{{team}} ;
    {{ \\'FIELD.JOB_TITLE\\' | translate}}{{::$ctrl.applicantInfo.TitleName}}
    {{ \\'CERTIFICATE_INFO\\' | translate}}
    {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}{{::$ctrl.data.formInfo.companyName}}
    {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}{{::$ctrl.data.formInfo.subjectName}}
    {{ \\'FIELD.APPLY_REASON\\' | translate}}{{::$ctrl.data.formInfo.reason}}
    {{ \\'FIELD.TEST_DATE\\' | translate}}
    {{testTimes}}
    {{ \\'FIELD.TEST_PLAN\\' | translate}}{{::$ctrl.data.formInfo.testPlace}}
    {{ \\'FIELD.EXCERT_APPLY_TEST\\' | translate}}{{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}assignment
    {{ \\'FIELD.TEST_ITEMS\\' | translate}}{{ ::$ctrl.data.testItemName}}
    {{ \\'FIELD.SUBSIDY_COST\\' | translate}}{{$ctrl.data.compFee | suffixes: (\\'FIELD.DOLLARS\\' | translate)}}
    {{ \\'FIELD.PERCENTAGE_OF_EXAMINATIONS\\' | translate}}{{$ctrl.data.compRatio | suffixes: \\'%\\'}}
    {{ \\'FIELD.EXCERT_REAL_COMPENSATION\\' | translate}}{{$ctrl.data.realCompFee | suffixes: (\\'FIELD.DOLLARS\\' | translate)}}
    {{ \\'FIELD.COMPENSATION\\' | translate}}{{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}assignment
    {{ \\'FIELD.STATUS\\' | translate}}{{::$ctrl.data.approvalStatus}}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/cert-records-search-dialog.html\",\"

    {{ \\'FIELD.SELECT_SEARCH_FILTER\\' | translate}}

    close
    {{ \\'FIELD.CERT_TYPE\\' | translate}}
    {{\\'FIELD.INTERNAL_LICENSE\\' | translate}}{{\\'FIELD.EXTERNAL_LICENSE\\' | translate}}
    {{ \\'FIELD.CERTIFICATE_TYPE\\' | translate}}
    {{ \\'FIELD.CERTIFICATION_NAME\\' | translate}}
    {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}
    {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}
    {{ \\'FIELD.VALID_DATE\\' | translate}}
    {{\\'FIELD.ALL\\' | translate}}{{\\'FIELD.NEVER_EXPIRE\\' | translate}}{{\\'FIELD.SELECT_START_END_DATE\\' | translate}}
    {{ \\'FIELD.VALID_DATE_START\\' | translate}}
    {{ \\'FIELD.VALID_DATE_END\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/cert-records-search.html\",\"

    {{ \\'CERT_RECORDS_SEARCH\\' | translate}}

    {{ \\'ACTIONS.SEARCH\\' | translate}}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/ext-cert-apply-form-bonus-view.html\",\"
    {{ \\'FIELD.APPLICANT\\' | translate}}
    {{ \\'FIELD.FULL_NAME\\' | translate}}{{ ::$ctrl.applicantInfo.FirstName}}
    {{ \\'FIELD.BONUS_APPLY_DATE\\' | translate}}{{ ::$ctrl.data.formInfo.applyDate}}
    0\\\">
    {{ \\'FIELD.DEPARTMENT\\' | translate}}{{team}} ;
    {{ \\'FIELD.JOB_TITLE\\' | translate}}{{::$ctrl.applicantInfo.TitleName}}
    {{ \\'CERTIFICATE_INFO\\' | translate}}
    {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}{{::$ctrl.data.formInfo.companyName}}
    {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}{{::$ctrl.data.formInfo.subjectName}}
    {{ \\'FIELD.APPLY_REASON\\' | translate}}{{::$ctrl.data.formInfo.reason}}
    {{ \\'FIELD.REMARK\\' | translate}}{{::$ctrl.data.formInfo.comment}}
    {{ \\'FIELD.EXCERT_REGISTER_APPLY\\' | translate }}{{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}assignment
    {{ \\'FIELD.CERTIFICATE_GET_DATE\\' | translate}}{{ $ctrl.data.acquireDate }}
    {{ \\'FIELD.CERTIFICATE_DEADLINE\\' | translate}}{{ ::$ctrl.data.expireDate}} {{ \\'FIELD.NEVER_EXPIRE\\' | translate}}
    {{ \\'FIELD.CERTIFICATE_NUMBER\\' | translate}}{{::$ctrl.data.licenseId}}
    {{ \\'FIELD.BONUS\\' | translate}}{{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}assignment
    {{ \\'FIELD.REWARD_METHOD\\' | translate}}
    {{ \\'FIELD.BONUS_COST\\' | translate }} {{ ::$ctrl.currency.name}} {{ ::$ctrl.data.bonusCost}} {{ ::$ctrl.data.bonusOtherWay}}
    {{ \\'FIELD.STATUS\\' | translate}}{{::$ctrl.data.approvalStatus}}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/ext-cert-apply-form-reg-view.html\",\"
    {{ \\'FIELD.APPLICANT\\' | translate}}
    {{ \\'FIELD.FULL_NAME\\' | translate}}{{ ::$ctrl.applicantInfo.FirstName}}
    {{ \\'FIELD.APPLY_DATE\\' | translate}}{{ ::$ctrl.data.applyDate}}
    0\\\">
    {{ \\'FIELD.DEPARTMENT\\' | translate}}{{team}} ;
    {{ \\'FIELD.JOB_TITLE\\' | translate}}{{::$ctrl.applicantInfo.TitleName}}
    {{ \\'CERTIFICATE_INFO\\' | translate}}
    {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}{{::$ctrl.data.companyName}}
    {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}{{::$ctrl.data.subjectName}}
    {{ \\'FIELD.CERTIFICATE_GET_DATE\\' | translate}}{{::$ctrl.data.acquireDate}}
    {{ \\'FIELD.CERTIFICATE_DEADLINE\\' | translate}}{{ ::$ctrl.data.expireDate}} {{ \\'FIELD.NEVER_EXPIRE\\' | translate}}
    {{ \\'FIELD.CERTIFICATE_NUMBER\\' | translate}}{{::$ctrl.data.licenseId}}
    {{ \\'FIELD.REMARK\\' | translate}}{{::$ctrl.data.comment}}
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}assignment
    {{ \\'FIELD.STATUS\\' | translate}}{{::$ctrl.data.approvalStatus}}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/ext-cert-apply-form-test-view.html\",\"
    {{ \\'FIELD.APPLICANT\\' | translate}}
    {{ \\'FIELD.FULL_NAME\\' | translate}}{{ ::$ctrl.applicantInfo.FirstName}}
    {{ \\'FIELD.APPLY_DATE\\' | translate}}{{ ::$ctrl.data.applyDate}}
    0\\\">
    {{ \\'FIELD.DEPARTMENT\\' | translate}}{{team}} ;
    {{ \\'FIELD.JOB_TITLE\\' | translate}}{{::$ctrl.applicantInfo.TitleName}}
    {{ \\'CERTIFICATE_INFO\\' | translate}}
    {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}{{::$ctrl.data.companyName}}
    {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}{{::$ctrl.data.subjectName}}
    {{ \\'FIELD.APPLY_REASON\\' | translate}}{{::$ctrl.data.reason}}
    {{ \\'FIELD.TEST_DATE\\' | translate}}
    {{testTimes}}
    {{ \\'FIELD.TEST_PLAN\\' | translate}}{{::$ctrl.data.testPlace}}
    {{ \\'FIELD.TEST_COST\\' | translate}}{{::$ctrl.currency.name}} {{::$ctrl.data.testFee |number}}
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}assignment
    {{ \\'FIELD.STATUS\\' | translate}}{{::$ctrl.data.approvalStatus}}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/external-cert-application-records-search-dialog.html\",\"

    {{ \\'FIELD.SELECT_SEARCH_FILTER\\' | translate}}

    close
    {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}
    {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}
    {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}
    {{ \\'FIELD.STATUS\\' | translate}}
    {{ \\'FIELD.APPLY_DATE_START\\' | translate}}
    {{ \\'FIELD.APPLY_DATE_END\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/external-cert-application-records-search.html\",\"

    {{ \\'EXTERNAL_CERT_APPLICATION_RECORDS_SEARCH\\' | translate}}

    {{ \\'ACTIONS.SEARCH\\' | translate}}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/external-cert-detail-info-dialog.html\",\"

    {{ \\'CERTIFICATE_INFO_DETAIL\\' | translate}}

    close

    {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}: {{$ctrl.extCertInfo.subject}}

    {{ \\'FIELD.EXTERNAL_LICENSE\\' | translate}} {{category.categoryName}}

    {{ \\'CERTIFICATE_INFO_DETAIL\\' | translate}}

    {{ \\'FIELD.BASIC_INFORMATION\\' | translate}}
    • {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}:

      {{$ctrl.extCertInfo.companyName}}

    • {{ \\'FIELD.CREDITS\\' | translate}}:

      {{$ctrl.extCertInfo.credits}}

    • {{ \\'FIELD.CLASSIFICATION\\' | translate}}:

      {{$ctrl.extCertInfo.classification}}

    • {{ \\'FIELD.APPLICABLE_UNITS\\' | translate}}:

      {{$ctrl.extCertInfo.suitableDepartment}}

    • {{ \\'FIELD.REWARD_METHOD\\' | translate}}:

      {{$ctrl.extCertInfo.bonusWay}}

    {{ \\'FIELD.COURSE_INTRODUCTION\\' | translate}}
    • {{ \\'FIELD.DESCRIPTION\\' | translate}}:

      {{$ctrl.extCertInfo.description}}

    • {{ \\'NEWLY_OBTAIN_THIS_CERTIFIED_SUBJECT_CONDITION\\' | translate}}:

      {{$ctrl.extCertInfo.newApplyRule}}

    • {{ \\'EXPIRED_AFTER_REACQUISITION_OF_THIS_CERTIFIED_SUBJECT_CONDITION\\' | translate}}:

      {{$ctrl.extCertInfo.renewApplyRule}}

    {{ \\'FIELD.OTHER\\' | translate}}
    • {{ \\'FIELD.DIFFICULTY\\' | translate}}:

    • {{ \\'FIELD.PERCENTAGE_OF_EXAMINATIONS\\' | translate}}:

      {{$ctrl.extCertInfo.compensationRatio}}

    • 0\\\">

      {{ \\'FIELD.REFERENCE_COURSE\\' | translate}}:

      {{references.name}}

    0\\\">

    {{ \\'YOU_MUST_FIRST_OBTAIN_A_CERTIFIED_SUBJECT\\' | translate}}

    {{ \\'NEWLY_OBTAIN_THIS_CERTIFIED_SUBJECT_CONDITION\\' | translate}}

    {{newApplyRuleItem.index}}{{acquired.name | markSplit:$index:\\' , \\'}}{{passed.name | markSplit:$index:\\' , \\'}}

    {{ \\'EXPIRED_AFTER_REACQUISITION_OF_THIS_CERTIFIED_SUBJECT_CONDITION\\' | translate}}

    {{renewApplyRule.index}}{{acquired.name | markSplit:$index:\\' , \\'}}{{passed.name | markSplit:$index:\\' , \\'}}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/external-cert-exam-allowance-application.html\",\"

    {{ \\'EXTERNAL_CERT_EXAM_ALLOWANCE_APPLICATION\\' | translate}}

    \");\n$templateCache.put(\"app/modules/cert-zone/views/external-cert-exam-application.html\",\"

    {{ \\'EXTERNAL_CERT_EXAM_APPLICATION\\' |translate}}

    *{{ \\'FIELD.TEST_DATE\\' | translate}}
    {{\\'FORM_VALIDATION.PLEASE_ENTER_A_VALID_DATE\\' | translate}} {{\\'FORM_VALIDATION.SET_THE_TIME_PART_OF_OVERLAP_PLEASE_RESET\\' | translate}}
    *{{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}
    {{company.name}}
    *{{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}
    {{subject.name}}
    {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
    {{ \\'FIELD.APPLY_CATEGORY\\' | translate}}
    {{ \\'FIELD.NEW_APPLY\\' | translate}}{{ \\'FIELD.EXTENSION_APPLY\\' | translate}}
    *{{ \\'FIELD.APPLY_REASON\\' | translate}}
    {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
    {{ \\'FIELD.TEST_PLAN\\' | translate}}
    {{ \\'FIELD.DOMESTIC\\' | translate}}{{ \\'FIELD.ABROAD\\' | translate}}
    *{{ \\'FIELD.DETAIL_ADDRESS\\' | translate}}
    {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
    *{{ \\'FIELD.TEST_COST\\' | translate}}
    {{ \\'FIELD.CURRENCY\\' | translate}}
    {{currency.name}}
    {{ \\'FIELD.AMOUNT\\' | translate}}
    {{ \\'FIELD.SYSTEM_CURRENCY\\' | translate}}
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}} {{\\'FIELD.ONE\\' | translate}}
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}} {{\\'FIELD.TWO\\' | translate}}
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}} {{\\'FIELD.THREE\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.SEND_APPLY\\' | translate}}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/external-cert-qualify-reward-application.html\",\"

    {{ \\'EXTERNAL_CERT_QUALIFY_REWARD_APPLICATION\\' | translate}}

    \");\n$templateCache.put(\"app/modules/cert-zone/views/external-cert-register.html\",\"

    {{ \\'EXTERNAL_CERT_REGISTER\\' |translate}}

    *{{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}
    {{company.name}}
    *{{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}
    {{subject.name}}
    {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
    {{ \\'FIELD.APPLY_CATEGORY\\' | translate}}
    {{ \\'FIELD.NEW_APPLY\\' | translate}}{{ \\'FIELD.EXTENSION_APPLY\\' | translate}}
    *{{ \\'FIELD.CERTIFICATE_GET_DATE\\' | translate}}
    {{\\'FORM_VALIDATION.PLEASE_ENTER_A_VALID_DATE\\' | translate}} {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
    {{ \\'FIELD.CERTIFICATE_DEADLINE\\' | translate}}
    {{ \\'FIELD.PERMANENT\\' | translate}}{{\\'ACTIONS.SELECT\\' | translate}}{{ \\'FIELD.CERTIFICATE_DEADLINE\\' | translate}}*
    {{\\'FORM_VALIDATION.PLEASE_ENTER_A_VALID_DATE\\' | translate}} {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
    *{{ \\'FIELD.CERTIFICATE_NUMBER\\' | translate}}
    {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
    *{{ \\'FIELD.REMARK\\' | translate}}
    {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}} {{\\'FIELD.ONE\\' | translate}}
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}} {{\\'FIELD.TWO\\' | translate}}
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}} {{\\'FIELD.THREE\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.SEND_APPLY\\' | translate}}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/financial-cert-record-application.html\",\"
    0\\\">
    \");\n$templateCache.put(\"app/modules/cert-zone/views/financial-cert-record-search.html\",\"
    0\\\">
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-detail-info-dialog.html\",\"

    {{ \\'FIELD.COURSE_INFO_DETAIL\\' | translate}}

    close
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-info.html\",\"
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-learning-resource-menu.html\",\"\");\n$templateCache.put(\"app/modules/course-resource/views/course-resource-catalog-list.html\",\"

    {{$ctrl.courseResourceTitle}}

    {{ \\'COURSE_LEARNING_RESOURCE\\' | translate}}

    {{ \\'FIELD.LATEST_COURSE\\' | translate}}
    {{ \\'FIELD.HOT_COURSE\\' | translate}}
    {{ \\'FIELD.FEATURED_COURSE\\' | translate}}

    {{ \\'FIELD.THERE_IS_NO_DATA\\' | translate}}

    \");\n$templateCache.put(\"app/modules/course-resource/views/course-search.html\",\"

    {{ \\'FIELD.ADD_ITEM_FORM_STUDY_CATALOG\\' | translate }}

    0\\\">

    {{ \\'FIELD.YOU_HAVE_SELECTED_COURSES\\' | translate}}

    {{course.activity.name}} -1)?$ctrl.removeCourse(course):$ctrl.addCourse(course)\\\">close
    -1\\\" ng-if=\\\"$ctrl.chooseMethod===\\'checkbox\\'\\\" ng-click=\\\"(($ctrl.chooseCourse |arrayObjectIndexOf:course) > -1)?$ctrl.removeCourse(course):$ctrl.addCourse(course)\\\">
    {{course.activity.name}}
    {{ \\'FIELD.ONLINE_COURSE\\' | translate}} {{ \\'FIELD.CLASS_ROOM_COURSE\\' | translate}} {{ \\'FIELD.EXTERNAL_TRAINING\\' | translate}} {{ \\'FIELD.ONLINE_TEST\\' | translate}} {{ \\'FIELD.CLASS_ROOM_TEST\\' | translate}} {{ \\'FIELD.QUESTIONNAIRE\\' | translate}} {{ \\'FIELD.PROGRAM\\' | translate}} {{ \\'FIELD.INTERNAL_LICENSE\\' | translate}} {{ \\'FIELD.EXTERNAL_LICENSE\\' | translate}} {{course.activity.type}}
    {{\\'STATUS.PUBLISHED\\' | translate}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info.html\",\"
    {{ \\'FIELD.LEARNING_CENTER\\' | translate}}{{ \\'FIELD.ABOUT_THIS_COURSE\\' | translate}}{{ \\'FIELD.LEARNING_RESULT\\' | translate}}{{ \\'FIELD.SUBMIT_REPORT\\' | translate}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/instructor-detail.html\",\"

    {{ \\'FIELD.INSTRUCTOR_DETAIL\\' | translate}}

    close
    0\\\">
    {{ \\'FIELD.INSTRUCTOR_NAME\\' | translate}}{{IDC.instructorDetail.instructorName}}
    {{ \\'FIELD.INSTRUCTOR_PROPERTIES\\' | translate}}{{ \\'FIELD.INTERNAL\\' | translate}}{{ \\'FIELD.EXTERNAL\\' | translate}}
    {{ \\'FIELD.INSTRUCTOR_COMPANY\\' | translate}}{{IDC.instructorDetail.company}}
    {{ \\'FIELD.EMAIL\\' | translate}}{{IDC.instructorDetail.email}}
    {{ \\'FIELD.SPECIALTY_COURSE_CLASSIFICATION\\' | translate}}{{IDC.instructorDetail.specialty}}
    {{ \\'FIELD.INTRODUCTION\\' | translate}}{{IDC.instructorDetail.intrudoction}}
    {{ \\'FIELD.EDUCATION\\' | translate}}{{IDC.instructorDetail.education}}
    {{ \\'FIELD.EXPERIENCE\\' | translate}}{{IDC.instructorDetail.experience}}
    {{ \\'FIELD.CERTIFICATION\\' | translate}}{{IDC.instructorDetail.certification}}
    {{ \\'FIELD.EXPERTISE\\' | translate}}{{IDC.instructorDetail.expertise}}
    {{ \\'FIELD.INSTRUCTOR_PHOTO\\' | translate}}
    {{ \\'FIELD.REFERENCE_DOCUMENT\\' | translate}}{{refereeFile.fileName}}
    {{ \\'ACTIONS.CLOSE\\' | translate}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/learning-history-dialog.html\",\"

    {{\\'FIELD.LEARNING_HISTORY\\' | translate}}

    close
    0\\\">

    {{\\'FIELD.ATTENDANCE_RECORD\\' | translate}}: {{\\'FIELD.ATTENDANCE_RATE\\' | translate }} {{$ctrl.learningHistory.attendance}} %

    0\\\">
    {{\\'FIELD.DATE\\' | translate}}{{\\'FIELD.TIME\\' | translate}}{{\\'FIELD.CLASS_HOUR\\' | translate}}{{\\'FIELD.ATTENDANCE_STATISTIC\\' | translate}}
    {{attendanceRecord.date}}{{attendanceRecord.time}}{{attendanceRecord.hourLength}}{{\\'FIELD.HOUR\\' | translate}}{{\\'STATUS.ATTENDANCE\\' | translate}}{{attendanceStatistic.formatTime}} {{\\'STATUS.LEAVE_APPROVAL_PENDING\\' | translate}} {{\\'STATUS.ABSENCE\\' | translate}} {{\\'ACTIONS.LEAVE\\' | translate}}
    0\\\">

    {{\\'FIELD.LEARNING_ITEM\\' | translate}}: ,

    0\\\">
    {{\\'FIELD.COURSE_CONTENT\\' | translate}}{{\\'FIELD.TYPE\\' | translate}}{{\\'FIELD.VIEWING_TIME\\' | translate}}{{\\'FIELD.FINISH_TIME\\' | translate}}{{\\'FIELD.STATUS\\' | translate}}{{\\'FIELD.SCORE\\' | translate}}
    *{{learningHistoryItem.content}}{{\\'FIELD.COURSE_CONTENT\\' | translate}}{{\\'FIELD.TEST\\' | translate}}{{\\'FIELD.QUESTIONNAIRE\\' | translate}}{{learningHistoryItem.totalTime}}{{learningHistoryItem.completedDate}}{{\\'STATUS.\\' + learningHistoryItem.lessonStatus | uppercase | translate}}{{learningHistoryItem.score}} {{ \\'STATUS.NOT_PUBLISHED\\' | translate }}

    {{\\'FIELD.SUBMIT_REPORT\\' | translate}}: {{ \\'FIELD.SHOULD_BE_SUBMIT_REPORT\\' | translate}} {{$ctrl.report.numOfReports}} {{ \\'FIELD.PART\\' | translate}}/ {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}} {{$ctrl.report.learningReportSubmitted}} {{ \\'FIELD.PART\\' | translate}}

    \");\n$templateCache.put(\"app/modules/course-resource/views/learning-report-dialog.html\",\"

    {{ \\'FIELD.LEARNING_REPORT\\' | translate }}

    close

    {{\\'FIELD.COURSE_NAME\\' | translate}}:{{$ctrl.activityName}}

    {{\\'FIELD.VIEW_ITEM\\' | translate}}:

    {{$ctrl.activityName}}{{course.courseName}}
    {{row.author}}
    {{row.sessionName}}
    {{row.createDate}}
    {{row.fileSize}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/learning-report-list-dialog.html\",\"

    {{$ctrl.activityName}} - {{ \\'FIELD.LEARNING_REPORT\\' | translate }}

    close
    {{ \\'FIELD.THE_PAYMENT_N_LEARNING_REPORT\\' | translate: {\\'value\\': $ctrl.learningReport.length} }}

    {{ \\'FIELD.NO_INFORMATION\\' | translate}}

    0\\\">{{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.SET_REPORT_SCORE\\' | translate}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/program-detail-info-dialog.html\",\"

    {{ \\'PROGRAM_INFO_DETAIL\\' | translate}}

    close
    \");\n$templateCache.put(\"app/modules/course-resource/views/program-info.html\",\"
    \");\n$templateCache.put(\"app/modules/course-resource/views/program-session-info.html\",\"
    {{ \\'FIELD.COURSE_LIST\\' | translate}}{{ \\'FIELD.ABOUT_THIS_PROGRAM\\' | translate}} {{ \\'FIELD.ABOUT_THIS_CERTIFICATE\\' | translate}}{{ \\'FIELD.LEARNING_RESULT\\' | translate}}{{ \\'FIELD.SUBMIT_REPORT\\' | translate}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/reference-list.html\",\"

    {{ \\'FIELD.REFERENCE_DOCUMENT\\' | translate}}

    {{referenceData.fileName}}{{referenceData.fileSize}}link{{ \\'ACTIONS.OPEN_LINK\\' | translate}}cloud_download{{ \\'ACTIONS.DOWNLOAD_FILE\\' | translate}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/test-history-search-dialog.html\",\"

    {{ \\'FIELD.TEST_HISTORY_SEARCH\\' | translate}}

    close

    {{ \\'FIELD.COURSE_CONTENT\\' | translate}}:{{$ctrl.courseContent}}

    {{ \\'FIELD.ANSWER_DATE\\' | translate}}To{{ \\'ACTIONS.SEARCH\\' | translate}}
    {{testHistory.examDate}}
    {{testHistory.score}}
    {{\\'FIELD.TOTAL_COUNT\\' | translate:{\\'value\\': $ctrl.testHistory.length} }}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.NEXT_STEP\\' | translate}}keyboard_arrow_rightkeyboard_arrow_left{{ \\'ACTIONS.PREVIOUS_STEP\\' | translate}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/will-expire-list.html\",\"

    {{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}}

    close
    #{{ \\'FIELD.EXPIRED_ITEMS\\' | translate}}{{ \\'FIELD.DATE\\' | translate}}
    {{$index + 1}}{{willExpireData.itemTitle}} - {{ \\'FIELD.LEARNER_DURATION_OF_STUDY\\' | translate}} {{willExpireData.itemTitle}} - {{ \\'FIELD.SESSION\\' | translate}}{{ \\'FIELD.VIEW_DEADLINE\\' | translate}} {{ \\'FIELD.SESSION\\' | translate}}{{ \\'FIELD.TEST_DEADLINE\\' | translate}} {{ \\'FIELD.SESSION\\' | translate}}{{ \\'FIELD.FILL_IN_DEADLINE\\' | translate}} {{ \\'FIELD.SESSION_CLASS_DEADLINE\\' | translate}} {{willExpireData.itemTitle}} - {{ \\'FIELD.SUBMIT_REPORT_DEADLINE\\' | translate}} {{willExpireData.itemTitle}} - {{ \\'FIELD.SESSION\\' | translate}}{{ \\'FIELD.TEST_DEADLINE\\' | translate}} {{willExpireData.itemTitle}} - {{ \\'FIELD.SESSION\\' | translate}}{{ \\'FIELD.FILL_IN_DEADLINE\\' | translate}}{{willExpireData.willExpiredDate}}
    \");\n$templateCache.put(\"app/modules/dashboard/views/department-dashboard.html\",\"
    \\\"\\\"
    {{$ctrl.dashboardData.userToDo.name}}
    {{ \\'FIELD.CURRENT_DEPARTMENT\\' | translate}} :
    {{group.groupName}}
    \");\n$templateCache.put(\"app/modules/dashboard/views/learning-dashboard-blocks.html\",\"
    \");\n$templateCache.put(\"app/modules/dashboard/views/learning-dashboard-dialog.html\",\"

    {{ \\'FIELD.DEPARTMENT_MEMBERS_OF_LEARNING_INFORMATION\\' | translate}}

    close
    {{$ctrl.groupUserInfo.fullName}}
    school
    N/A 0\\\">{{($ctrl.groupUserInfo.instructorTeachingHours/60).toFixed(1) |replaceAll:\\'\\\\\\\\.?0+$\\':\\'\\'}}

    {{\\'FIELD.TEACHING_HOURS\\' |translate}}

    - 0\\\">{{$ctrl.groupUserInfo.instructorScore |number:2}}

    {{\\'FIELD.LECTURER_TEACHING_SATISFACTION\\' |translate}}

    \");\n$templateCache.put(\"app/modules/dashboard/views/learning-dashboard.html\",\"
    \\\"\\\"
    {{$ctrl.dashboardData.userToDo.name}}
    {{$ctrl.dashboardData.userToDo.incompleteCount}}

    {{ \\'ENROLLMENT\\' | translate }}

    {{$ctrl.dashboardData.userToDo.quizCount}}

    {{ \\'FIELD.TEST_QUESTIONNAIRE\\' | translate }}

    - {{$ctrl.dashboardData.userToDo.penddingCount }}

    {{ \\'FIELD.PENDING_APPROVALS\\' | translate }}

    - {{$ctrl.dashboardData.userToDo.penddingCount }}

    {{ \\'FIELD.PENDING_APPROVALS\\' | translate }}

    {{$ctrl.dashboardData.toDoDataNewCourse}}

    {{ \\'FIELD.LATEST_COURSE\\' | translate }}

    {{$ctrl.today | date:\\'yyyy\\'}} {{ \\'FIELD.TRAINING_HOURS_IN_THE_QUARTER\\' | translate: {\\'value\\': $ctrl.dashboardData.trainingHours.quarter} }}

    {{$ctrl.dashboardData.trainingHours.personalHours}}{{ \\'FIELD.HOUR\\' | translate }}

    {{ \\'FIELD.AVERAGE_TRAINING_HOURS_OF_COMPANY\\' | translate}}: {{$ctrl.dashboardData.trainingHours.avgHours}}{{ \\'FIELD.HOUR\\' | translate }}
    \");\n$templateCache.put(\"app/modules/forum/views/forum.html\",\"
    0\\\">
    \");\n$templateCache.put(\"app/modules/index/views/featured-course.html\",\"

    {{$ctrl.subject}}

    more_horiz

    {{ \\'FIELD.STAY_TUNED\\' | translate}}

    \");\n$templateCache.put(\"app/modules/index/views/incomplete-course.html\",\"

    {{$ctrl.subject}}

    more_horiz
    0\\\">
    {{course.courseName}} {{course.courseName}} {{course.courseName}}

    0\\\">{{ \\'FIELD.INSTRUCTOR\\' | translate}}: {{instructor.instructorName | markSplit:$index:\\' / \\'}} {{instructor.instructorName | markSplit:$index:\\' / \\'}} | {{course.place}}

    event_note {{course.enrolledDate}} {{course.expireStart}} {{course.expireStart}}~{{course.expireEnd}}

    play_circle_filledo

    {{ \\'FIELD.STAY_TUNED\\' | translate}}

    \");\n$templateCache.put(\"app/modules/index/views/index.html\",\"
    \");\n$templateCache.put(\"app/modules/index/views/knowledge-management-center.html\",\"

    {{$ctrl.subject}}

    more_horiz
    0\\\">
    {{ \\'ACTIONS.READ\\' | translate}}

    {{ \\'FIELD.STAY_TUNED\\' | translate}}

    \");\n$templateCache.put(\"app/modules/index/views/latest-course.html\",\"

    {{$ctrl.subject}}

    more_horiz
    0\\\">
    \\\"\\\"
    {{$ctrl.latestCoursesInfo.objectName}} {{$ctrl.latestCoursesInfo.description}}
    person_add
    • \\\"\\\"

    {{ \\'FIELD.STAY_TUNED\\' | translate}}

    \");\n$templateCache.put(\"app/modules/index/views/latest-news-more-dialog.html\",\"

    {{ \\'FIELD.ALL_ANNOUNCEMENTS\\' | translate}}

    {{$ctrl.news.title}}

    close
    {{$index+1}}
    {{ \\'FIELD.SUMMARY\\' | translate}}{{$ctrl.news.digest}}
    {{ \\'FIELD.DESCRIPTION\\' | translate}}
    {{ \\'FIELD.RELATED_LINKS\\' | translate}}{{ \\'FIELD.COURSE_LINKS\\' | translate}}{{$ctrl.news.titleURL}}{{$ctrl.news.titleCourseName}}
    {{ \\'FIELD.ANNOUNCEMENT_TIME\\' | translate}}
    {{ \\'ACTIONS.CLOSE\\' | translate}}{{ \\'ACTIONS.ALL_ANNOUNCEMENTS\\' | translate}}
    \");\n$templateCache.put(\"app/modules/index/views/latest-news.html\",\"
    {{$ctrl.subject}} :
    more_horiz

    {{ \\'FIELD.STAY_TUNED\\' | translate}}

    \");\n$templateCache.put(\"app/modules/index/views/online-course-leader-board.html\",\"
    {{$ctrl.subject}}

    {{ \\'FIELD.STAY_TUNED\\' | translate}}

    \");\n$templateCache.put(\"app/modules/index/views/related-sites.html\",\"
    {{$ctrl.subject}}

    {{ \\'FIELD.STAY_TUNED\\' | translate}}

    \");\n$templateCache.put(\"app/modules/learning-resource/views/knowledge-document-list.html\",\"

    {{$ctrl.learningResourceTitle}}

    {{KnowledgeManagementCenterData.title}}
    • {{ \\'FIELD.AUTHOR\\' | translate}}:{{KnowledgeManagementCenterData.author}}
    • {{ \\'FIELD.LOCATION\\' | translate}}: {{ \\'FIELD.ROOT_DIRECTORY\\' | translate}}/{{menu.title | markSplit:$index:\\'/\\'}}
    • {{ \\'FIELD.CLICK_COUNT\\' | translate}}: {{KnowledgeManagementCenterData.clickCount}},  {{ \\'FIELD.DOWNLOAD_COUNT\\' | translate}}: {{KnowledgeManagementCenterData.downloadCount}}
    • {{ \\'FIELD.I_WANT\\' | translate}}: {{ \\'ACTIONS.DOWNLOAD\\' | translate}} | {{ \\'ACTIONS.RATING\\' | translate}}
    • {{ \\'FIELD.AVERAGE_RATING\\' | translate}}:
      {{KnowledgeManagementCenterData.averageScore}}
    • {{ \\'FIELD.SHARE_DATE\\' | translate}}: {{KnowledgeManagementCenterData.shareDate}}
    0\\\">{{ \\'FIELD.DESCRIPTION\\' | translate}} : {{KnowledgeManagementCenterData.directions}}
    {{ \\'FIELD.HAS_BEEN_READ\\' | translate}}

    {{ \\'FIELD.NO_INFORMATION\\' | translate}}

    {{ \\'KNOWLEDGE_MANAGEMENT_CENTER\\' | translate}}

    {{KnowledgeManagementCenterData.title}}
    • {{ \\'FIELD.AUTHOR\\' | translate}}: {{KnowledgeManagementCenterData.author}}
    • {{ \\'FIELD.LOCATION\\' | translate}}: {{ \\'FIELD.ROOT_DIRECTORY\\' | translate}}/{{menu.title | markSplit:$index:\\'/\\'}}
    • {{ \\'FIELD.CLICK_COUNT\\' | translate}}: {{KnowledgeManagementCenterData.clickCount}},  {{ \\'FIELD.DOWNLOAD_COUNT\\' | translate}}: {{KnowledgeManagementCenterData.downloadCount}}
    • {{ \\'FIELD.I_WANT\\' | translate}}: {{ \\'ACTIONS.DOWNLOAD\\' | translate}} | {{ \\'ACTIONS.RATING\\' | translate}}
    • {{ \\'FIELD.AVERAGE_RATING\\' | translate}}:
      {{KnowledgeManagementCenterData.averageScore}}
    • {{ \\'FIELD.SHARE_DATE\\' | translate}}: {{KnowledgeManagementCenterData.shareDate}}
    0\\\">{{ \\'FIELD.DESCRIPTION\\' | translate}} : {{KnowledgeManagementCenterData.directions}}
    {{ \\'FIELD.HAS_BEEN_READ\\' | translate}}

    {{ \\'FIELD.NO_INFORMATION\\' | translate}}

    {{ \\'FIELD.LATEST_DOCUMENT\\' | translate}}

    {{documentsData.title}}
    • {{ \\'FIELD.AUTHOR\\' | translate}}: {{documentsData.author}}
    • {{ \\'FIELD.LOCATION\\' | translate}}: {{ \\'FIELD.ROOT_DIRECTORY\\' | translate}}/{{menu.title | markSplit:$index:\\'/\\'}}
    • {{ \\'FIELD.CLICK_COUNT\\' | translate}}: {{documentsData.clickCount}},  {{ \\'FIELD.DOWNLOAD_COUNT\\' | translate}}: {{documentsData.downloadCount}}
    • {{ \\'FIELD.I_WANT\\' | translate}}: {{ \\'ACTIONS.DOWNLOAD\\' | translate}} | {{ \\'ACTIONS.RATING\\' | translate}}
    • {{ \\'FIELD.AVERAGE_RATING\\' | translate}}:
      {{documentsData.averageScore}}
    • {{ \\'FIELD.SHARE_DATE\\' | translate}}: {{documentsData.shareDate}}
    0\\\">{{ \\'FIELD.DESCRIPTION\\' | translate}} : {{documentsData.directions}}
    {{ \\'FIELD.HAS_BEEN_READ\\' | translate}}

    {{ \\'FIELD.NO_INFORMATION\\' | translate}}

    {{ \\'FIELD.HOT_DOCUMENT\\' | translate}}

    {{documentsData.title}}
    • {{ \\'FIELD.AUTHOR\\' | translate}}: {{documentsData.author}}
    • {{ \\'FIELD.LOCATION\\' | translate}}: {{ \\'FIELD.ROOT_DIRECTORY\\' | translate}}/{{menu.title | markSplit:$index:\\'/\\'}}
    • {{ \\'FIELD.CLICK_COUNT\\' | translate}}: {{documentsData.clickCount}},  {{ \\'FIELD.DOWNLOAD_COUNT\\' | translate}}: {{documentsData.downloadCount}}
    • {{ \\'FIELD.I_WANT\\' | translate}}: {{ \\'ACTIONS.DOWNLOAD\\' | translate}} | {{ \\'ACTIONS.RATING\\' | translate}}
    • {{ \\'FIELD.AVERAGE_RATING\\' | translate}}:
      {{documentsData.averageScore}}
    • {{ \\'FIELD.SHARE_DATE\\' | translate}}: {{documentsData.shareDate}}
    0\\\">{{ \\'FIELD.DESCRIPTION\\' | translate}} : {{documentsData.directions}}
    {{ \\'FIELD.HAS_BEEN_READ\\' | translate}}

    {{ \\'FIELD.NO_INFORMATION\\' | translate}}

    \");\n$templateCache.put(\"app/modules/learning-resource/views/knowledge-document-menu.html\",\"\");\n$templateCache.put(\"app/modules/learning-resource/views/set-score.html\",\"

    {{SSC.title}}

    close
    {{ \\'FIELD.PLEASE_RATING\\' | translate}}
    group {{SSC.scoreInfos.scorePerson}}

    {{ \\'ACTIONS.SHOW_AVERAGE_RATING\\' | translate}} {{ \\'ACTIONS.HIDDEN_AVERAGE_RATING\\' | translate}}

    {{scoreInfo.percentage}}
    {{ \\'ACTIONS.CLOSE\\' | translate}}{{ \\'ACTIONS.SUBMIT_RATING\\' | translate}}
    \");\n$templateCache.put(\"app/modules/manager/views/emba-calendar.html\",\"
    0\\\">
    \");\n$templateCache.put(\"app/modules/manager/views/emba-must-read.html\",\"
    0\\\">
    \");\n$templateCache.put(\"app/modules/manager/views/manager-training-plan.html\",\"
    0\\\">
    \");\n$templateCache.put(\"app/modules/manager/views/manager-training-records.html\",\"

    {{ \\'MEMBER_TRAINING_RECORDS\\' | translate}}

    {{ \\'ACTIONS.SEARCH\\' | translate}}

    {{$ctrl.userProfiles.name}}

    • assignment_turned_in{{ \\'FIELD.PASSED_COUNT\\' | translate}} :{{$ctrl.summary.passedCount}}
    • assignment_late{{ \\'STATUS.FAILED\\' | translate}} :{{$ctrl.summary.failedCount}}
    • {{ \\'FIELD.EXEMPTION_COUNT\\' | translate}} :{{$ctrl.summary.exemptionCount}}
    • assignment_lateN/A :{{$ctrl.summary.naCount}}
    • {{ \\'FIELD.TOTAL\\' | translate}} :{{($ctrl.summary.passedCount + $ctrl.summary.failedCount + $ctrl.summary.exemptionCount + $ctrl.summary.naCount)}}
    \");\n$templateCache.put(\"app/modules/manager/views/member-cert-records-search-dialog.html\",\"

    {{ \\'FIELD.SELECT_SEARCH_FILTER\\' | translate}}

    close
    {{ \\'FIELD.DEPARTMENT_NAME\\' | translate}}
    {{ \\'FIELD.DEPARTMENT_MEMBER\\' | translate}}
    {{ \\'FIELD.CERT_TYPE\\' | translate}}
    {{\\'FIELD.INTERNAL_LICENSE\\' | translate}}{{\\'FIELD.EXTERNAL_LICENSE\\' | translate}}
    {{ \\'FIELD.CERTIFICATE_TYPE\\' | translate}}
    {{ \\'FIELD.CERTIFICATION_NAME\\' | translate}}
    {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}
    {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}
    {{ \\'FIELD.VALID_DATE\\' | translate}}
    {{\\'FIELD.ALL\\' | translate}}{{\\'FIELD.NEVER_EXPIRE\\' | translate}}{{\\'FIELD.SELECT_START_END_DATE\\' | translate}}
    {{ \\'FIELD.VALID_DATE_START\\' | translate}}
    {{ \\'FIELD.VALID_DATE_END\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/manager/views/member-cert-records-search.html\",\"

    {{ \\'CERT_RECORDS_SEARCH\\' | translate}}

    {{ \\'ACTIONS.SEARCH\\' | translate}}
    \");\n$templateCache.put(\"app/modules/manager/views/member-curriculum-detail-dialog.html\",\"

    {{\\'FIELD.DROP_NUMBER_OF_PEOPLE\\' | translate}}

    {{\\'FIELD.INCOMPLETED_NUMBER_OF_PEOPLE\\' | translate}}

    {{\\'FIELD.EXEMPTION_NUMBER_OF_PEOPLE\\' | translate}}

    {{\\'FIELD.PASSED_NUMBER_OF_PEOPLE\\' | translate}}

    {{\\'FIELD.FAILED_NUMBER_OF_PEOPLE\\' | translate}}

    {{\\'FIELD.ENROLLMENT_NUMBER_OF_PEOPLE\\' | translate}}

    close

    {{MCDDC.courseName}}

    {{\\'FIELD.SESSION_NAME\\' | translate}}: {{MCDDC.courseSession}}
    {{\\'FIELD.EMPLOYEE_NUMBER\\' | translate}}{{\\'FIELD.FULL_NAME\\' | translate}}{{\\'FIELD.DEPARTMENT\\' | translate}}{{\\'FIELD.DUTY_DAY\\' | translate}}{{\\'FIELD.INDUCTION_DATE\\' | translate}}{{\\'FIELD.PROPERTIES\\' | translate}}{{ \\'FIELD.ENROLLMENT_HOURS\\' | translate}}({{\\'FIELD.HOUR\\' | translate}}){{ \\'FIELD.PASS_STATUS\\' | translate}}{{ \\'FIELD.COST\\' | translate}}{{ \\'FIELD.TEST_SCORE\\' | translate}}{{ \\'FIELD.LEARNING_REPORT\\' | translate}}{{ \\'FIELD.REASON\\' | translate}}
    {{curriculumDetail.employeeNumber}}{{curriculumDetail.fullName}}{{curriculumDetail.joinGroupName}}{{curriculumDetail.onboardDate}}{{curriculumDetail.inboardDate}}{{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}{{curriculumDetail.totalTime}}{{\\\"N/A\\\"}} {{ \\'STATUS.EXEMPTION\\' | translate}} {{ \\'STATUS.PASSED\\' | translate}} {{ \\'STATUS.FAILED\\' | translate}}{{curriculumDetail.personalCost}}{{curriculumDetail.score}}{{ \\'STATUS.NOT_SUBMIT\\' | translate}} 0\\\">{{ \\'STATUS.SUBMITTED\\' | translate}} ({{curriculumDetail.learningReportSummitted}}/{{curriculumDetail.numOfReports}}){{ \\'STATUS.EXEMPTION_SUBMIT\\' | translate}}{{curriculumDetail.unenrollReason}}
    \");\n$templateCache.put(\"app/modules/manager/views/member-curriculum-search-dialog.html\",\"

    {{ \\'FIELD.SELECT_SEARCH_FILTER\\' | translate}}

    close
    {{ \\'FIELD.ALL_COURSE\\' | translate}} :
    {{ \\'FIELD.SPECIFIC\\' | translate}}{{ \\'FIELD.COURSE\\' | translate}} :
    {{ \\'FIELD.ALL\\' | translate}}{{ \\'FIELD.SPECIFIC\\' | translate}}
    0\\\">

    {{ \\'FIELD.YOU_HAVE_SELECTED_COURSES\\' | translate}}

    {{select.courseName}}close
    {{row.activity.name}}
    {{ \\'FIELD.ONLINE_COURSE\\' | translate}} {{ \\'FIELD.CLASS_ROOM_COURSE\\' | translate}} {{ \\'FIELD.EXTERNAL_TRAINING\\' | translate}} {{ \\'FIELD.ONLINE_TEST\\' | translate}} {{ \\'FIELD.CLASS_ROOM_TEST\\' | translate}} {{ \\'FIELD.QUESTIONNAIRE\\' | translate}} {{row.activity.type}}
    {{\\'STATUS.PUBLISHED\\' | translate}}
    {{ \\'FIELD.COURSE_DATE\\' | translate }} :
    {{ \\'FIELD.ALL\\' | translate }}{{ \\'FIELD.SPECIFIC\\' | translate }}
    To
    {{ \\'ACTIONS.CANCEL\\' | translate }}{{ \\'ACTIONS.ENTER\\' | translate }}
    \");\n$templateCache.put(\"app/modules/manager/views/member-curriculum.html\",\"

    {{ \\'MEMBER_CURRICULUM\\' | translate}}

    0\\\">{{ \\'FIELD.COURSE_START_DATE\\' | translate}}: 0 && $ctrl.filters.isQueryAllDate===1\\\">{{ \\'FIELD.ALL\\' | translate}} 0 && $ctrl.filters.isQueryAllDate===0\\\">{{$ctrl.filters.sDate.getFullYear()+\\'/\\'+($ctrl.filters.sDate.getMonth()+1)+\\'/\\'+$ctrl.filters.sDate.getDate()}}~ {{$ctrl.filters.eDate.getFullYear()+\\'/\\'+($ctrl.filters.eDate.getMonth()+1)+\\'/\\'+$ctrl.filters.eDate.getDate()}} {{ \\'MESSAGE.MSG_CAN_NOT_FIND_THE_LATEST_INFORMATION\\' | translate}}
    {{ \\'ACTIONS.SEARCH\\' | translate}}
    0\\\">
    {{row.courseName}}
    {{row.categoryName}}
    {{row.credit}}
    {{ \\'FIELD.ONLINE_COURSE\\' | translate}} {{ \\'FIELD.CLASS_ROOM_COURSE\\' | translate}} {{ \\'FIELD.EXTERNAL_TRAINING\\' | translate}} {{ \\'FIELD.ONLINE_TEST\\' | translate}} {{ \\'FIELD.CLASS_ROOM_TEST\\' | translate}} {{ \\'FIELD.QUESTIONNAIRE\\' | translate}} {{row.courseType}}
    {{row.sessionName}}
    {{row.classTime}}
    {{(row.studyHour === 0) ? \\'\\' : row.studyHour}} {{(row.studyHour + (row.studyMin/60)) | number:2}}
    {{row.instructorName}}
    {{row.numOfValid}}
    {{row.numOfDownload}}
    {{row.numOfNA}}
    {{row.numOfExemption}}
    {{row.numOfPass}}
    {{row.numOfFail}}
    {{row.numOfWithdraw}}
    {{row.scoreOfLearnerStatisfy}}
    {{row.scoreOfManagerStatisfy}}
    \");\n$templateCache.put(\"app/modules/manager/views/member-download-detail-dialog.html\",\"

    {{\\'FIELD.DOWNLOAD_COUNT_DETAIL\\' | translate}}

    close

    {{MDDDC.courseName}}

    {{\\'FIELD.SESSION_NAME\\' | translate}}: {{MDDDC.sessionName}}
    {{\\'FIELD.FULL_NAME\\' | translate}}{{\\'FIELD.EMPLOYEE_NUMBER\\' | translate}}{{\\'FIELD.DEPARTMENT\\' | translate}}{{\\'FIELD.TYPE\\' | translate}}{{\\'FIELD.DOCUMENT_TITLE\\' | translate}}{{\\'FIELD.DOWNLOAD_TIME\\' | translate}}
    {{downloadDetail.fullName}}{{downloadDetail.employeeNumber}}{{downloadDetail.joinGroupName}}{{\\'FIELD.COURSE_CONTENT\\' | translate}}{{\\'FIELD.REFERENCE_DOCUMENT\\' | translate}}{{downloadDetail.fileTitle}}{{downloadDetail.downloadDate}}
    \");\n$templateCache.put(\"app/modules/manager/views/member-financial-cert-record-search.html\",\"
    0\\\">
    \");\n$templateCache.put(\"app/modules/manager/views/member-suggest-learning-list.html\",\"

    {{ \\'MEMBER_SUGGEST_LEARNING_LIST\\' | translate}}

    {{ \\'FIELD.THERE_IS_NO_DATA\\' | translate}}

    {{ \\'FIELD.PLEASE_AT\\' | translate}}「{{ \\'ACTIONS.SEARCH\\' | translate}}」 {{\\'FIELD.SET_THE_CONDITIONS_CONDUCIVE_TO_SEARCH\\' | translate}}

    {{ \\'ACTIONS.SEARCH\\' | translate}}
    0\\\">
    {{ \\'ACTIONS.SEARCH\\' | translate}}

    {{$ctrl.userInfo.userData.name}}

    • assignment_turned_in{{ \\'FIELD.PASSED_COUNT\\' | translate}} :{{$ctrl.userInfo.pass}}
    • assignment_late{{ \\'STATUS.FAILED\\' | translate}} :{{$ctrl.userInfo.fail}}
    • {{ \\'FIELD.EXEMPTION_COUNT\\' | translate}} :{{$ctrl.userInfo.exemption}}
    • {{ \\'FIELD.TOTAL\\' | translate}} :{{($ctrl.userInfo.sum)}}
    0\\\">{{ \\'ACTIONS.UPDATE_ESTIMATED_COMPLETION_DATE\\' | translate}}{{ \\'ACTIONS.DELETE\\' | translate}}
    \");\n$templateCache.put(\"app/modules/manager/views/member-training-records-search-dialog.html\",\"

    {{ \\'FIELD.SELECT_SEARCH_FILTER\\' | translate}}

    close
    {{group.groupName}}{{groupMember.fullName}}
    {{ \\'MESSAGE.MSG_PLEASE_SELECT_DEPARTMENT_MEMBER\\' | translate}}
    {{ \\'FIELD.LEARNING_ACTIVITY\\' | translate}},{{ \\'FIELD.COURSE_FOLDER_TEST\\' | translate}},{{ \\'FIELD.COURSE_FOLDER_SURVEY\\' | translate}}{{ \\'FIELD.PROGRAM\\' | translate}},{{ \\'FIELD.INTERNAL_LICENSE\\' | translate}}{{ \\'FIELD.ALL\\' | translate}}N/A{{ \\'STATUS.EXEMPTION\\' | translate}}{{ \\'STATUS.PASSED\\' | translate}}{{ \\'STATUS.FAILED\\' | translate}}{{ \\'FIELD.ALL\\' | translate}}{{ \\'FIELD.COURSE_ELECTIVE\\' | translate}}{{ \\'FIELD.COURSE_REQUIRED\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/reports/views/learning-reports-menu.html\",\"\");\n$templateCache.put(\"app/modules/reports/views/learning-reports.html\",\"
    0\\\">
    \");\n$templateCache.put(\"app/modules/sitemap/views/sidebar.html\",\"

    \");\n$templateCache.put(\"app/modules/static-page/views/static-page.html\",\"
    0 && $ctrl.url!== \\'null\\'\\\">
    \");\n$templateCache.put(\"app/modules/system/views/system-info.html\",\"

    \\\"\\\"

    Build_Info

    {{key}} :{{info}}

    Copyright Sunnet eHRD © 2016

    \");\n$templateCache.put(\"app/modules/training/views/training-plan.html\",\"
    0\\\">
    \");\n$templateCache.put(\"app/modules/training-road-map/views/training-road-map.html\",\"

    {{ \\'TRAINING_ROAD_MAP\\' | translate}}

    {{ \\'PLACEHOLDERS.PLEASE_SELECT_TRAINING_BLUEPRINT\\' | translate}} :
    {{data.trainingRoadmapName}}({{ \\'FIELD.RELATED_TO_ME\\' | translate}}) ({{ \\'FIELD.MY_TRAINING\\' | translate}})
    {{$ctrl.trainingRoadMapInfo.trainingRoadmapName}}
    {{titleGroups.titleGroupName}} {{ \\'FIELD.ALL_STAFF\\' | translate }}
    {{ \\'FIELD.ANY_TIME_ZONE\\' | translate}} {{ \\'FIELD.DUTY\\' | translate}} {{ \\'FIELD.INDUCTION\\' | translate}} 0 || timeSpans.beginMonth > 0\\\">{{ \\'FIELD.EXPIRED\\' | translate}} 0\\\">{{timeSpans.beginYear}} {{ \\'FIELD.YEAR\\' | translate}} 0\\\">{{timeSpans.beginMonth}} {{ \\'FIELD.A_MONTH\\' | translate}} ~ 0 || timeSpans.endMonth > 0\\\">{{ \\'FIELD.UNEXPIRED\\' | translate}} 0\\\">{{timeSpans.endYear}} {{ \\'FIELD.YEAR\\' | translate}} 0\\\">{{timeSpans.endMonth}} {{ \\'FIELD.A_MONTH\\' | translate}}
    \");\n$templateCache.put(\"app/modules/utils/views/avatar.html\",\"
    \\\"\\\" {{firstName |nameRegular}}
    \");\n$templateCache.put(\"app/modules/utils/views/choice-external-course-sessions.html\",\"
    {{ \\'ACTIONS.ADD_NEW_CLASS\\' | translate }}
    {{data.SessionName}}
    \");\n$templateCache.put(\"app/modules/utils/views/choice-external-courses.html\",\"
    {{data.courseName}}
    \");\n$templateCache.put(\"app/modules/utils/views/class-time-dialog.html\",\"

    {{ \\'FIELD.SETTING_CLASS_TIME\\' | translate}}

    close
    {{ \\'FIELD.COURSE_DATE\\' | translate}}
    to
    {{ \\'FIELD.CLASS_TIME\\' | translate}}
    :
    to
    :
    {{ \\'FIELD.REST_TIME\\' | translate}}
    :
    to
    :
    {{ \\'FIELD.INCLUDE\\' | translate}}
    -1\\\">{{weekDay}}
    {{ \\'FIELD.CYCLE_MODE\\' | translate}}
    {{ \\'FIELD.REPEAT_INTERVAL\\' | translate}}
    {{repeatIntervalNumber}}
    {{repeatIntervalUnit}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/utils/views/class-time.html\",\"
    0}\\\">
    {{ \\'FIELD.TIME_TABLE\\' | translate}}({{ \\'FIELD.TIME_ZONE\\' | translate}}{{$index+1}})

    {{ \\'FIELD.COURSE_DATE\\' | translate}} {{ classTimeObject.startDate | amDateFormat:\\'YYYY/MM/DD\\'}}~{{ classTimeObject.endDate | amDateFormat:\\'YYYY/MM/DD\\'}}

    {{ \\'FIELD.CLASS_TIME\\' | translate}} {{ classTimeObject.startH | displayMinNumber : 2 }} : {{(classTimeObject.startM*5) | displayMinNumber : 2 }} ~ {{ classTimeObject.endH | displayMinNumber : 2 }} : {{(classTimeObject.endM*5) | displayMinNumber : 2 }}

    {{ \\'FIELD.REST_TIME\\' | translate}} {{ classTimeObject.rest_startH | displayMinNumber : 2 }} : {{(classTimeObject.rest_startM*5) | displayMinNumber : 2 }} ~ {{ classTimeObject.rest_endH | displayMinNumber : 2 }} : {{(classTimeObject.rest_endM*5) | displayMinNumber : 2 }}

    {{ \\'FIELD.DAYS_IN_DURATION\\' | translate}} {{$ctrl.weekDays[includeDay]}}

    {{ \\'FIELD.CYCLE_MODE\\' | translate}} {{ \\'FIELD.INTERVAL\\' | translate}} {{classTimeObject.repeatIntervalNumber}} {{classTimeObject.repeatIntervalUnit}}

    \");\n$templateCache.put(\"app/modules/utils/views/enroll-costs.html\",\"
    {{applicant.fullName}} :
    {{ \\'FIELD.CURRENCY\\' | translate}}
    *{{ \\'FIELD.AMOUNT\\' | translate}}
    {{\\'FORM_VALIDATION.PLEASE_ENTER_A_VALID_AMOUNT_OF_MONEY\\' | translate}}
    {{ \\'FIELD.SYSTEM_CURRENCY\\' | translate}}
    {{ \\'FIELD.TYPE_OF_SUBSIDY\\' | translate}}
    {{ \\'FIELD.FULL_AMOUNT\\' | translate}}{{ \\'FIELD.SUBSIDY\\' | translate}}
    {{ \\'FIELD.VOUCHER\\' | translate}}
    {{ \\'FIELD.TAXABLE_INVOICE\\' | translate}}{{ \\'FIELD.TAX_FREE_INVOICE\\' | translate}}{{ \\'FIELD.RECEIPT\\' | translate}}
    {{ \\'FIELD.APPLICATION_CONTENT\\' | translate}}
    {{ \\'FIELD.CASH\\' | translate}}{{ \\'FIELD.REMITTANCE\\' | translate}}{{ \\'FIELD.CHEQUE\\' | translate}}
    {{ \\'FIELD.PAYEE\\' | translate}}
    {{ \\'FIELD.REMITTANCE_INFORMATION\\' | translate}}
    {{ \\'FIELD.RECEIPT_INFORMATION\\' | translate}}
    {{ \\'FIELD.THE_TITLE_OF_THE_RECEIPT\\' | translate}} :
    {{ \\'FIELD.RECEIPT_EXPIRE_DATE\\' | translate}} :
    {{ \\'FIELD.RECEIPT_FORMAT\\' | translate}} :
    {{ \\'FIELD.RECEIPT_DELINEATE\\' | translate}}{{ \\'FIELD.ENDORSEMENT_OR_TRANSFERENCE_PROHIBITED\\' | translate}}
    \");\n$templateCache.put(\"app/modules/utils/views/learning-report-setting.html\",\"
    {{\\'FIELD.NO_REPORT\\' | translate}}{{\\'FIELD.NEED_TO_COMPLETE_REPORT\\' | translate}} ({{ \\'PLACEHOLDERS.FOR_LESS_THAN_N_THE_FOLLOWING_REPORTS_ARE_NOT_REQUIRED\\' | translate: {\\'value\\': $ctrl.settingRule.submitRptRate} }})
    {{ \\'FIELD.UPLOAD_REPORT\\' | translate}} :
    {{ \\'FIELD.NEED_TO_SUBMIT\\' | translate}}
    {{ \\'FIELD.PART\\' | translate}}{{ \\'FIELD.LEARNING_REPORT\\' | translate}}
    *{{ \\'FIELD.SUBMIT_DEADLINE\\' | translate}}
    {{ \\'FIELD.ORAL_REPORT\\' | translate}} :
    *{{ \\'FIELD.REPORT_DEADLINE\\' | translate}}
    {{ \\'FIELD.SCORE_TO_BE_APPROVED\\' | translate}}
    {{ \\'FIELD.INTERNAL_LECTURE\\' | translate}} :
    *{{ \\'FIELD.LECTURE_DEADLINE\\' | translate}}
    {{ \\'FIELD.SCORE_TO_BE_APPROVED\\' | translate}}
    {{ \\'FIELD.OTHER_METHOD\\' | translate}} :
    \");\n$templateCache.put(\"app/modules/utils/views/md-time-select.html\",\"{{hour | displayMinNumber:2}}{{minute | displayMinNumber:2}}\");\n$templateCache.put(\"app/modules/utils/views/member-selection-dialog.html\",\"

    {{\\'ACTIONS.ADD_APPLY_MEMBER\\' | translate}}

    close
    {{ \\'FIELD.LIST_MY_GROUP_MEMBERS\\' | translate}}
    {{member.fullName}}
    100\\\">
    {{member.fullName}}
    0\\\">

    {{ \\'FIELD.YOU_HAVE_SELECTED_MEMBERS\\' | translate}}

    {{selectedPerson.fullName}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/utils/views/multi-checkbox.html\",\" -1\\\" ng-disabled=\\\"$ctrl.ngDisabled\\\">{{data[$ctrl.titleKey]}}\");\n$templateCache.put(\"app/modules/utils/views/multi-date-picker-ctrl.html\",\"
    \");\n$templateCache.put(\"app/modules/utils/views/select-classification.html\",\"None{{classification.name}}{{classification.name}}\");\n$templateCache.put(\"app/modules/utils/views/select-ctl.html\",\"{{data.name}}\");\n$templateCache.put(\"app/modules/utils/views/select-currency.html\",\"{{currency.currencyName}}\");\n$templateCache.put(\"app/modules/utils/views/select-external-class.html\",\"

    {{ \\'ACTIONS.SELECT_COURSE\\' | translate}}

    {{ \\'ACTIONS.SELECT_CLASS\\' | translate}}

    {{ \\'ACTIONS.CLOSE\\' | translate}}close
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.NEXT_STEP\\' | translate}}keyboard_arrow_rightkeyboard_arrow_left{{ \\'ACTIONS.PREVIOUS_STEP\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/utils/views/select-external-training-vendors.html\",\"{{vendor.vendorName}}\");\n$templateCache.put(\"app/modules/utils/views/square-text.html\",\"
    {{$ctrl.text |translate}}
    \");\n$templateCache.put(\"app/modules/utils/views/tip-info-dialog.html\",\"

    {{ \\'FIELD.COURSE_INFO\\' | translate}}

    {{ \\'FIELD.SESSION_INFO\\' | translate}}

    {{ \\'PROGRAM_INFO\\' | translate}}

    {{ \\'FIELD.SESSION_INFO\\' | translate}}

    {{ \\'FIELD.EXTERNAL_TRAINING_APPLY_DETAIL\\' | translate}}

    {{ \\'FIELD.SESSION_INFO\\' | translate}}

    {{ \\'CERTIFICATE_INFO_DETAIL\\' | translate}}

    {{ \\'FIELD.COURSE_INFO\\' | translate}}

    {{ \\'FIELD.COURSE_INFO\\' | translate}}

    {{ \\'FIELD.COURSE_INFO\\' | translate}}

    {{ \\'CERTIFICATE_INFO_DETAIL\\' | translate}}

    {{ \\'FIELD.SESSION_INFO\\' | translate}}

    {{ \\'FIELD.SESSION_INFO\\' | translate}}

    {{ \\'FIELD.COMPANY_DETAIL\\' | translate}}

    {{ \\'FIELD.COURSE_INFO_DETAIL\\' | translate}}

    close

    {{ $ctrl.displayName }}

    \");\n$templateCache.put(\"app/modules/utils/views/upload-course-data-files.html\",\"
    0}\\\">
    {{ \\'FIELD.COURSE_DATA\\' | translate}} {{($index+1)}}
    {{$ctrl.refsObject[$index].fileName}} {{$ctrl._files[$index].name}}
    add_circle{{ \\'ACTIONS.REPLACE_FILES\\' | translate}}
    0 && (($index+1)===$ctrl.files.length)\\\">
    \");\n$templateCache.put(\"app/modules/utils/views/upload-refs.html\",\"
    0}\\\">
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}} {{($index+1)}}
    {{$ctrl.refsObject[$index].fileName}} {{$ctrl._files[$index].name}}
    add_circle{{ \\'ACTIONS.REPLACE_FILES\\' | translate}}
    0 && (($index+1)===$ctrl.files.length)\\\">
    \");\n$templateCache.put(\"app/modules/user/views/add-suggest-learning-list.html\",\"

    {{ \\'ACTIONS.ADD_MANAGER_SUGGEST_ITEM\\' | translate }}

    {{ \\'ACTIONS.ADD_PERSONAL_ELECTIVE_ITEM\\' | translate}}

    close

    {{ \\'FIELD.OTHER_NEED\\' | translate}}

    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}} {{ \\'ACTIONS.UPDATE\\' | translate}}
    0\\\">

    {{ \\'FIELD.YOU_HAVE_ADD_OTHER_REQUIREMENTS\\' | translate}}

    {{row.itemTypeName}}
    {{row.itemName}}
    {{row.status}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.NEXT_STEP\\' | translate}}keyboard_arrow_rightkeyboard_arrow_left{{ \\'ACTIONS.PREVIOUS_STEP\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/user/views/deputy-record-dialog.html\",\"

    {{ \\'FIELD.SETTING_DEPUTY\\' | translate}}

    close
    {{ \\'FIELD.ALL_DEPARTMENT\\' | translate }}{{managedGroup.groupName}}{{ \\'FIELD.DEPUTY_EFFECTIVE_DATE\\' | translate}}
    :
    {{ \\'FIELD.DEPUTY_END_DATE\\' | translate}}
    :
    {{ \\'FIELD.DEPUTY\\' | translate}}   {{$ctrl.agentFullName}}
    {{row.account}}
    {{row.fullName}}
    {{row.joinGroupName}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/user/views/incomplete-courses.html\",\"\");\n$templateCache.put(\"app/modules/user/views/incomplete-test-surveys.html\",\"\");\n$templateCache.put(\"app/modules/user/views/my-calendar.html\",\"
    event_note
    {{ \\'MY_CALENDAR\\' | translate}}
    {{event.dateStr | date : \\'MM\\'}}/ {{event.dateStr | date : \\'dd\\'}}

    {{event.startTime}} - {{event.endTime}}

    {{event.place}}

    {{ \\'FIELD.TODAY_IS_NOT_ANY_SCHEDULE\\' |translate }}

    Have a nice day!

    {{ \\'FIELD.TOMORROW_TO_REMIND\\' | translate}}

    {{event.dateStr | date : \\'MM\\'}}/ {{event.dateStr | date : \\'dd\\'}}

    {{event.startTime}} - {{event.endTime}}

    {{event.place}}

    {{ \\'FIELD.TOMORROW_IS_NOT_ANY_SCHEDULE\\' |translate }}

    Have a nice day!

    \");\n$templateCache.put(\"app/modules/user/views/my-curriculum.html\",\"

    {{ \\'MY_CURRICULUM\\' | translate}}

    {{ \\'ACTIONS.SEARCH\\' | translate}}

    {{$ctrl.userInfo.userData.name}}

    • assignment_turned_in{{ \\'FIELD.PASSED_COUNT\\' | translate}} :{{$ctrl.userInfo.pass}}
    • assignment_late{{ \\'STATUS.FAILED\\' | translate}} :{{$ctrl.userInfo.fail}}
    • {{ \\'FIELD.EXEMPTION_COUNT\\' | translate}} :{{$ctrl.userInfo.exemption}}
    • {{ \\'FIELD.TOTAL\\' | translate}} :{{($ctrl.userInfo.sum)}}
    {{ \\'ACTIONS.UPDATE_ESTIMATED_COMPLETION_DATE\\' | translate}}{{ \\'ACTIONS.DELETE\\' | translate}}
    \");\n$templateCache.put(\"app/modules/user/views/my-setting.html\",\"

    {{ \\'FIELD.PERSONAL_SETTING\\' | translate}}

    photo_camera
    {{ \\'FIELD.ACCOUNT\\' | translate}}{{$ctrl.userProfilesDetail.Account}}
    {{ \\'FIELD.FULL_NAME\\' | translate}}{{$ctrl.kernelUser.username}}
    {{ \\'FIELD.EMPLOYEE_NUMBER\\' | translate}}{{$ctrl.userProfilesDetail.EmployeeNumber}}
    {{ \\'FIELD.DEPARTMENT\\' | translate}}{{team}} ;
    {{ \\'FIELD.EMAIL\\' | translate}}{{$ctrl.userProfilesDetail.Email}}
    {{ \\'FIELD.TOTAL_ENROLLMENT_COUNT\\' | translate}}{{$ctrl.userProfilesDetail.totalEnrollmentCount}}
    {{ \\'FIELD.CHANGE_PASSWORD\\' | translate}}
    {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
    {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
    {{\\'FORM_VALIDATION.PLEASE_RE_CHECK_NEW_PASSWORD\\' | translate}}
    {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
    {{ \\'ACTIONS.CHANGE_LOGIN_PASSWORD\\' | translate}}
    {{ \\'FIELD.MY_PREFERENCE\\' | translate}}
    {{\\'LANGUAGE_TW\\' | translate}}{{\\'LANGUAGE_CN\\' | translate}}{{\\'LANGUAGE_EN\\' | translate}}
    {{ \\'ACTIONS.APPLY\\' | translate}}
    {{ \\'FIELD.MY_DEPUTY_SETTING\\' | translate}}
    {{ \\'FIELD.SETTING_DEPUTY\\' | translate}}
    {{ \\'FIELD.MY_DEPUTY_SETTING\\' | translate}}
    {{ \\'FIELD.SETTING_DEPUTY\\' | translate}}
    {{ \\'FIELD.DEPUTY_DEPARTMENT\\' | translate}}{{ \\'FIELD.DEPUTY_EFFECTIVE_DATE\\' | translate}}{{ \\'FIELD.DEPUTY_END_DATE\\' | translate}}{{ \\'FIELD.DEPUTY\\' | translate}}{{ \\'FIELD.SETTING_DATE\\' | translate}}{{ \\'FIELD.ACTION\\' | translate}}
    {{record.deputyGroupName}}
    {{record.deputyFrom}}
    {{record.deputyTo}}
    {{record.agentName}}
    {{record.createDate}}
    \");\n$templateCache.put(\"app/modules/user/views/suggest-learning-search-dialog.html\",\"

    {{ \\'FIELD.SELECT_SEARCH_FILTER\\' | translate}}

    close
    {{ \\'FIELD.ESTIMATED_COMPLETION_DATE\\' | translate}}
    {{value}}{{value+1}}
    To
    {{value}}{{value+1}}
    {{ \\'FIELD.SOURCE\\' | translate}}{{ \\'FIELD.ALL\\' | translate}}{{ \\'FIELD.TRAINING_PLAN\\' | translate}}{{ \\'FIELD.TRAINING_BLUEPRINT\\' | translate}}{{ \\'FIELD.COMPETENCE_RECOMMEND\\' | translate}}{{ \\'FIELD.SELF_DEMANDING\\' | translate}}{{ \\'FIELD.MANAGER_RECOMMEND\\' | translate}}{{ \\'FIELD.ABILITY_RECOMMEND\\' | translate}}{{ \\'FIELD.PERSONAL_DEVELOPMENT\\' | translate}}{{ \\'FIELD.OTHER\\' | translate}}
    {{ \\'FIELD.LEARNING_STATUS\\' | translate}}{{ \\'FIELD.ALL\\' | translate}}{{ \\'STATUS.UNENROLLED\\' | translate}}{{ \\'STATUS.ENROLLED\\' | translate}}{{ \\'STATUS.NOT_EXECUTED\\' | translate}}{{ \\'STATUS.ENROLLMENT_APPROVAL_PENDING\\' | translate}}{{ \\'STATUS.EXECUTED\\' | translate}}N/A{{ \\'STATUS.EXEMPTION\\' | translate}}{{ \\'STATUS.PASSED\\' | translate}}{{ \\'STATUS.FAILED\\' | translate}}
    {{ \\'FIELD.DEPARTMENT\\' | translate}}{{managerGroup.name}}
    {{ \\'FIELD.FULL_NAME\\' | translate}}{{managerMember.name}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/user/views/training-records-search-dialog.html\",\"

    {{ \\'FIELD.SELECT_SEARCH_FILTER\\' | translate}}

    close
    {{ \\'FIELD.LEARNING_ACTIVITY\\' | translate}},{{ \\'FIELD.COURSE_FOLDER_TEST\\' | translate}},{{ \\'FIELD.COURSE_FOLDER_SURVEY\\' | translate}}{{ \\'FIELD.PROGRAM\\' | translate}},{{ \\'FIELD.INTERNAL_LICENSE\\' | translate}}{{ \\'FIELD.ALL\\' | translate}}N/A{{ \\'STATUS.EXEMPTION\\' | translate}}{{ \\'STATUS.PASSED\\' | translate}}{{ \\'STATUS.FAILED\\' | translate}}{{ \\'FIELD.ALL\\' | translate}}{{ \\'FIELD.COURSE_ELECTIVE\\' | translate}}{{ \\'FIELD.COURSE_REQUIRED\\' | translate}}{{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/user/views/training-records.html\",\"

    {{ \\'TRAINING_RECORDS\\' | translate}}

    {{ \\'ACTIONS.SEARCH\\' | translate}}

    {{$ctrl.userProfiles.name}}

    • assignment_turned_in{{ \\'FIELD.PASSED_COUNT\\' | translate}} :{{$ctrl.summary.passedCount}}
    • assignment_late{{ \\'STATUS.FAILED\\' | translate}} :{{$ctrl.summary.failedCount}}
    • {{ \\'FIELD.EXEMPTION_COUNT\\' | translate}} :{{$ctrl.summary.exemptionCount}}
    • assignment_lateN/A :{{$ctrl.summary.naCount}}
    • {{ \\'FIELD.TOTAL\\' | translate}} :{{($ctrl.summary.passedCount + $ctrl.summary.failedCount + $ctrl.summary.exemptionCount + $ctrl.summary.naCount)}}
    \");\n$templateCache.put(\"app/modules/user/views/update-estimated-completion-date.html\",\"

    {{ \\'FIELD.ESTIMATED_COMPLETION_DATE\\' |translate }}

    close
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/user/views/user-detail.html\",\"

    {{ \\'FIELD.COUNSELOR_DETAIL\\' | translate}}

    {{ \\'FIELD.LEARNER_DETAIL\\' | translate}}

    close

    {{ \\'FIELD.COUNSELOR_DETAIL\\' | translate}}

    {{ \\'FIELD.LEARNER_DETAIL\\' | translate}}

    {{ \\'FIELD.NAME\\' | translate}}{{$ctrl.userProfile.FirstName}}
    {{ \\'FIELD.LAST_NAME\\' | translate}}{{$ctrl.userProfile.LastName}}
    {{ \\'FIELD.EMPLOYEE_NUMBER\\' | translate}}{{$ctrl.userProfile.EmployeeNumber}}
    {{ \\'FIELD.DEPARTMENT\\' | translate}}{{group |markSplit:$index:\\',\\'}}
    {{ \\'FIELD.COMPANY\\' | translate}}{{$ctrl.userProfile.Company}}
    {{ \\'FIELD.EMAIL\\' | translate}}{{$ctrl.userProfile.Email}}
    {{ \\'FIELD.OFFICE_PHONE\\' | translate}}{{$ctrl.userProfile.OfficePhone}}
    {{ \\'ACTIONS.CLOSE\\' | translate}}
    \");\n$templateCache.put(\"app/kernel/ui-elements/angular-clock/views/clock-template.html\",\"{{digital}}
    {{digital}}
    {{gmtInfo}}
    \");\n$templateCache.put(\"app/kernel/ui-elements/md-date-pickers/views/calendar.template.html\",\"
    {{ calendar.date.format(\\\"MMMM YYYY\\\") }}
    {{ d }}
    {{ day.value }}
    \");\n$templateCache.put(\"app/kernel/ui-elements/pagination/views/ui-pagination-header.tpl.html\",\"
    0\\\">{{ \\'ACTIONS.SORT\\' | translate}} :
    0\\\">{{ \\'ACTIONS.FILTERS\\' | translate}} :
    {{ \\'ACTIONS.SORT_METHOD\\' | translate}} :
    \");\n$templateCache.put(\"app/kernel/ui-elements/pagination/views/ui-pagination.tpl.html\",\"
    {{ \\'FIELD.TOTAL\\' | translate}}{{range.total}}{{ \\'FIELD.NUMBER_OF\\' | translate}} | {{ \\'FIELD.PER_PAGE\\' | translate}}
    {{state.id}}{{pagination.perPage}}
    {{ \\'FIELD.NUMBER_OF\\' | translate}}
    \");\n$templateCache.put(\"app/kernel/ui-elements/table/views/filterRow.html\",\"
    \");\n$templateCache.put(\"app/kernel/ui-elements/table/views/groupRow.html\",\"{{$selGroupTitle}} \");\n$templateCache.put(\"app/kernel/ui-elements/table/views/header.html\",\"\");\n$templateCache.put(\"app/kernel/ui-elements/table/views/pager.html\",\"
    {{ \\'FIELD.TOTAL\\' | translate}}{{params.settings().total}}{{ \\'FIELD.NUMBER_OF\\' | translate}} | {{ \\'FIELD.PER_PAGE\\' | translate}}
    {{count}}
    {{ \\'FIELD.NUMBER_OF\\' | translate}}
    \");\n$templateCache.put(\"app/kernel/ui-elements/table/views/responsive-row.html\",\"
    • 0\\\">

      {{col.title()}} :

    \");\n$templateCache.put(\"app/kernel/ui-elements/table/views/sorterRow.html\",\"
    \");\n$templateCache.put(\"app/kernel/ui-elements/tree/views/menu-tree.html\",\"
    \");\n$templateCache.put(\"app/kernel/ui-elements/ui-calendar/views/calendar.html\",\"
    The value passed to the view attribute of the calendar is not set
    The value passed to view-date attribute of the calendar is not set
    \");\n$templateCache.put(\"app/kernel/ui-elements/ui-calendar/views/calendarDayView.html\",\"
    0\\\">
    -
    ,
    \");\n$templateCache.put(\"app/kernel/ui-elements/ui-calendar/views/calendarHourList.html\",\"
     
    \");\n$templateCache.put(\"app/kernel/ui-elements/ui-calendar/views/calendarMonthCell.html\",\"
    0\\\" ng-bind=\\\"day.badgeTotal\\\">
    0) && !$ctrl.slideBoxDisabled\\\">
    \");\n$templateCache.put(\"app/kernel/ui-elements/ui-calendar/views/calendarMonthCellEvents.html\",\"
    0\\\" style=\\\"width: 100%;\\\"> 4)\\\"> 5\\\">more_vert
    \");\n$templateCache.put(\"app/kernel/ui-elements/ui-calendar/views/calendarMonthView.html\",\"
    0}\\\">
    0) && !$ctrl.slideBoxDisabled\\\" events=\\\"$ctrl.view[$ctrl.openDayIndex].events\\\" on-event-click=\\\"$ctrl.onEventClick\\\" cell=\\\"$ctrl.view[$ctrl.openDayIndex]\\\" custom-template-urls=\\\"$ctrl.customTemplateUrls\\\" template-scope=\\\"$ctrl.templateScope\\\">
    \");\n$templateCache.put(\"app/kernel/ui-elements/ui-calendar/views/calendarSlideBox.html\",\"
    •  
    \");\n$templateCache.put(\"app/kernel/ui-elements/ui-calendar/views/calendarWeekView.html\",\"

    \");\n$templateCache.put(\"app/kernel/ui-elements/ui-calendar/views/calendarYearView.html\",\"
    0, \\'cal-day-today\\': month.isToday}\\\" mwl-droppable=\\\"\\\" on-drop=\\\"$ctrl.handleEventDrop(dropData.event, month.date)\\\"> 0\\\" ng-bind=\\\"month.badgeTotal\\\">
    0) && !$ctrl.slideBoxDisabled\\\">
    0) && !$ctrl.slideBoxDisabled\\\" events=\\\"$ctrl.view[$ctrl.openMonthIndex].events\\\" on-event-click=\\\"$ctrl.onEventClick\\\" cell=\\\"$ctrl.view[$ctrl.openMonthIndex]\\\" custom-template-urls=\\\"$ctrl.customTemplateUrls\\\" template-scope=\\\"$ctrl.templateScope\\\">
    \");\n$templateCache.put(\"app/kernel/ui-elements/ui-datepicker/views/datepicker.html\",\"

    {{ lightBoxEvents[0].dateStr}} {{ lightBoxEvents[0].startTime}}~{{ lightBoxEvents[0].endTime}}

    {{ lightBoxEvents[0].eventName}}

    \");\n$templateCache.put(\"app/kernel/ui-elements/widgets/views/doughnut-gauge.html\",\"
    {{gaugeValue}}{{valueSuffix}}
    \");\n$templateCache.put(\"app/kernel/ui-elements/widgets/views/infobox.html\",\"
    {{count}} 8%
    {{title}}

    {{count}}

    {{title}}

    \");\n$templateCache.put(\"app/kernel/ui-elements/widgets/views/md-chips-select-template.html\",\"{{chip.mainTitle}}
    {{item.mainTitle}}
    \");\n$templateCache.put(\"app/kernel/ui-elements/widgets/views/md-company-chips-template.html\",\"
    {{item[$mdPersonChipsCtrl.personName]}} {{item[$mdPersonChipsCtrl.personEmail]}}
    {{$chip[$mdPersonChipsCtrl.personName]}}
    \");\n$templateCache.put(\"app/kernel/ui-elements/widgets/views/md-person-chips-template.html\",\"
    \\\"{{item[$mdPersonChipsCtrl.personName]}}\\\" {{item[$mdPersonChipsCtrl.personName]}} {{item[$mdPersonChipsCtrl.personEmail]}} {{item[$mdPersonChipsCtrl.personGroup]}}
    \\\"{{$chip[$mdPersonChipsCtrl.personName]}}\\\"
    {{$chip[$mdPersonChipsCtrl.personName]}}
    \");\n$templateCache.put(\"app/kernel/ui-elements/widgets/views/select-date.html\",\"\");\n$templateCache.put(\"app/kernel/ui-elements/wizard/views/step.html\",\"
    \");\n$templateCache.put(\"app/kernel/ui-elements/wizard/views/wizard.html\",\"
    • {{$index + 1}}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/apply-form/bonus-dialog.html\",\"

    {{ \\'EXTERNAL_CERT_QUALIFY_REWARD_APPLICATION\\' | translate}}

    {{ \\'ACTIONS.CLOSE\\' | translate}}close
    {{ \\'FIELD.EXTERNAL_CERT_EXAM_BASE_INFO\\' | translate}}
    assignment_ind
    • {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}: {{ ::$ctrl.formData.companyName }}
    • {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}: {{ ::$ctrl.formData.subjectName }}
    • {{ \\'FIELD.EXCERT_APPLY_TEST_DATE\\' | translate}}: {{ \\'FIELD.REGISTER_APPLY_DATE\\' | translate}}: {{ ::$ctrl.formData.applyDate }}
    • {{ \\'FIELD.APPLY_REASON\\' | translate}}: {{::$ctrl.formData.reason }}
    • {{ \\'FIELD.REMARK\\' | translate}}: {{::$ctrl.formData.comment }}
    • {{ \\'FIELD.TEST_DATE\\' | translate}}: {{ testTime }}
    • {{ \\'FIELD.TEST_PLAN\\' | translate}}: {{ ::$ctrl.formData.testPlace}}
    {{ \\'FIELD.APPLY_INFO\\' | translate}}
    {{ \\'FIELD.TEST_COST\\' | translate}}
    {{ ::$ctrl.currency.name}} {{ ::$ctrl.formData.testFee | number:1}}
    {{ \\'FIELD.SUBSIDY_COST\\' | translate}}
    {{ ::$ctrl.currency.name}} {{ ::$ctrl.formData.totalRealCompFee | number:1}}
    *{{ \\'FIELD.CERTIFICATE_NUMBER\\' | translate}}
    {{ ::$ctrl.formData.licenseId }}
    *{{ \\'FIELD.CERTIFICATE_GET_DATE\\' | translate}}
    {{ ::$ctrl.formData.acquireDate }}
    *{{ \\'FIELD.CERTIFICATE_DEADLINE\\' | translate}}
    {{\\'FIELD.NEVER_EXPIRE\\' | translate}}
    {{ ::$ctrl.formData.expireDate}} {{ \\'FIELD.NEVER_EXPIRE\\' | translate}}
    {{ \\'FIELD.REWARD_METHOD\\' | translate}}
    {{ \\'FIELD.BONUS_COST\\' | translate }} {{ ::$ctrl.currency.name}} {{ ::$ctrl.formData.bonusCost}} {{ ::$ctrl.formData.bonusOtherWay}}
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate }}{{ \\'ACTIONS.ENTER\\' | translate }}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/apply-form/bonus-edit-dialog.html\",\"

    {{ \\'EXTERNAL_CERT_QUALIFY_REWARD_APPLICATION\\' | translate}}

    {{ \\'ACTIONS.CLOSE\\' | translate}}close
    {{ \\'FIELD.APPLICANT\\' | translate}}
    {{ \\'FIELD.FULL_NAME\\' | translate}}{{ ::$ctrl.applicantInfo.FirstName}}
    {{ \\'FIELD.BONUS_APPLY_DATE\\' | translate}}{{ ::$ctrl.data.applyDate}}
    0\\\">
    {{ \\'FIELD.DEPARTMENT\\' | translate}}{{team}} ;
    {{ \\'FIELD.JOB_TITLE\\' | translate}}{{::$ctrl.applicantInfo.TitleName}}
    {{ \\'CERTIFICATE_INFO\\' | translate}}
    {{ \\'FIELD.REGISTER_APPLY_DATE\\' | translate}}{{ ::$ctrl.data.formData.applyDate}}
    {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}{{::$ctrl.data.formData.companyName}}
    {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}{{::$ctrl.data.formData.subjectName}}
    {{ \\'FIELD.APPLY_REASON\\' | translate}}{{::$ctrl.data.formData.reason}}
    {{ \\'FIELD.REMARK\\' | translate}}{{::$ctrl.data.formData.comment}}
    {{ \\'FIELD.TEST_DATE\\' | translate}}
    {{testTime}}
    {{ \\'FIELD.TEST_PLAN\\' | translate}}{{::$ctrl.data.formData.testPlace}}
    {{ \\'FIELD.TEST_COST\\' | translate}}{{ ::$ctrl.currency.name}} {{::$ctrl.data.formData.testFee}}
    {{ \\'FIELD.EXCERT_APPLY_TEST\\' | translate}}{{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}{{ \\'FIELD.EXCERT_REGISTER_APPLY\\' | translate}}{{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}assignment
    *{{ \\'FIELD.CERTIFICATE_NUMBER\\' | translate}}
    *{{ \\'FIELD.CERTIFICATE_GET_DATE\\' | translate}}
    {{ ::$ctrl.data.acquireDate }}
    *{{ \\'FIELD.CERTIFICATE_DEADLINE\\' | translate}}
    {{\\'FIELD.NEVER_EXPIRE\\' | translate}}
    {{ ::$ctrl.data.expireDate}} {{ \\'FIELD.NEVER_EXPIRE\\' | translate}}
    {{ \\'FIELD.REWARD_METHOD\\' | translate}}
    {{ \\'FIELD.BONUS_COST\\' | translate }} {{ ::$ctrl.currency.name}} {{ ::$ctrl.data.bonusCost}} {{ ::$ctrl.data.bonusOtherWay}}
    {{ \\'FIELD.BONUS\\' | translate}}{{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate }}{{ \\'ACTIONS.ENTER\\' | translate }}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/apply-form/compensation-dialog.html\",\"

    {{ \\'EXTERNAL_CERT_EXAM_ALLOWANCE_APPLICATION\\' | translate}}

    {{ \\'ACTIONS.CLOSE\\' | translate}}close
    {{ \\'FIELD.EXTERNAL_CERT_EXAM_BASE_INFO\\' | translate}}
    assignment_ind
    • {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}: {{ ::$ctrl.formData.companyName }}
    • {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}: {{ ::$ctrl.formData.subjectName }}
    • {{ \\'FIELD.EXCERT_APPLY_TEST_DATE\\' | translate}}: {{ ::$ctrl.formData.applyDate }}
    • {{ \\'FIELD.APPLY_REASON\\' | translate}}: {{::$ctrl.formData.reason }}
    • {{ \\'FIELD.TEST_DATE\\' | translate}}: {{ testTime }}
    • {{ \\'FIELD.TEST_PLAN\\' | translate}}: {{ ::$ctrl.formData.testPlace}}
    {{ \\'FIELD.APPLY_INFO\\' | translate}}
    {{ \\'FIELD.TEST_ITEMS\\' | translate}}
    {{ \\'FIELD.CURRENCY\\' | translate}}
    *{{ \\'FIELD.AMOUNT\\' | translate}}
    {{ \\'FORM_VALIDATION.PLEASE_ENTER_A_VALID_AMOUNT_OF_MONEY\\' | translate }}
    {{ \\'PLACEHOLDERS.CONVERSION_AMOUNT\\' | translate}}
    {{ \\'FIELD.PERCENTAGE_OF_EXAMINATIONS\\' | translate}}
    {{ $ctrl.formData.compRatio | suffixes: \\'%\\'}}
    {{ $ctrl.formData.compensationCost | suffixes: (\\'FIELD.DOLLARS\\' | translate)}}
    {{ \\'FIELD.EXCERT_REAL_COMPENSATION\\' | translate}}
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate }}{{ \\'ACTIONS.ENTER\\' | translate }}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/apply-form/compensation-edit-dialog.html\",\"

    {{ \\'EXTERNAL_CERT_EXAM_ALLOWANCE_APPLICATION\\' | translate}}

    {{ \\'ACTIONS.CLOSE\\' | translate}}close
    {{ \\'FIELD.APPLICANT\\' | translate}}
    {{ \\'FIELD.FULL_NAME\\' | translate}}{{ ::$ctrl.applicantInfo.FirstName}}
    {{ \\'FIELD.APPLY_DATE\\' | translate}}{{ ::$ctrl.data.applyDate}}
    0\\\">
    {{ \\'FIELD.DEPARTMENT\\' | translate}}{{team}} ;
    {{ \\'FIELD.JOB_TITLE\\' | translate}}{{::$ctrl.applicantInfo.TitleName}}
    {{ \\'CERTIFICATE_INFO\\' | translate}}
    {{ \\'FIELD.EXCERT_APPLY_TEST_DATE\\' | translate}}{{ ::$ctrl.data.formData.applyDate}}
    {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}{{::$ctrl.data.formData.companyName}}
    {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}{{::$ctrl.data.formData.subjectName}}
    {{ \\'FIELD.APPLY_REASON\\' | translate}}{{::$ctrl.data.formData.reason}}
    {{ \\'FIELD.REMARK\\' | translate}}{{::$ctrl.data.formData.comment}}
    {{ \\'FIELD.TEST_DATE\\' | translate}}
    {{testTime}}
    {{ \\'FIELD.TEST_PLAN\\' | translate}}{{::$ctrl.data.formData.testPlace}}
    {{ \\'FIELD.EXCERT_APPLY_TEST\\' | translate}}{{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}{{ \\'FIELD.EXCERT_REGISTER_APPLY\\' | translate}}{{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}assignment
    {{ \\'FIELD.TEST_ITEMS\\' | translate}}
    {{ ::$ctrl.data.testItemName}}
    {{ \\'FIELD.CURRENCY\\' | translate}}
    *{{ \\'FIELD.AMOUNT\\' | translate}}
    {{ \\'FORM_VALIDATION.PLEASE_ENTER_A_VALID_AMOUNT_OF_MONEY\\' | translate }}
    {{ \\'PLACEHOLDERS.CONVERSION_AMOUNT\\' | translate}}
    {{ \\'FIELD.PERCENTAGE_OF_EXAMINATIONS\\' | translate}}
    {{ $ctrl.data.compRatio | suffixes: \\'%\\'}}
    {{ $ctrl.data.compensationCost | suffixes: (\\'FIELD.DOLLARS\\' | translate)}}
    {{ \\'FIELD.EXCERT_REAL_COMPENSATION\\' | translate}}
    {{ \\'FIELD.COMPENSATION\\' | translate}}{{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate }}{{ \\'ACTIONS.ENTER\\' | translate }}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/apply-form/register-edit-dialog.html\",\"

    {{ \\'EXTERNAL_CERT_REGISTER\\' | translate}}

    {{ \\'ACTIONS.CLOSE\\' | translate}}close
    {{ \\'FIELD.APPLICANT\\' | translate}}
    {{ \\'FIELD.FULL_NAME\\' | translate}}{{ ::$ctrl.applicantInfo.FirstName}}
    {{ \\'FIELD.APPLY_DATE\\' | translate}}{{ ::$ctrl.data.applyDate}}
    0\\\">
    {{ \\'FIELD.DEPARTMENT\\' | translate}}{{team}} ;
    {{ \\'FIELD.JOB_TITLE\\' | translate}}{{::$ctrl.applicantInfo.TitleName}}
    {{ \\'CERTIFICATE_INFO\\' | translate}}
    {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}{{::$ctrl.data.companyName}}
    {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}{{::$ctrl.data.subjectName}}
    {{ \\'FIELD.CERTIFICATE_GET_DATE\\' | translate}}
    {{ \\'FIELD.CERTIFICATE_DEADLINE\\' | translate}}
    {{\\'FIELD.NEVER_EXPIRE\\' | translate}}
    {{ \\'FIELD.CERTIFICATE_NUMBER\\' | translate}}
    {{ \\'FIELD.REMARK\\' | translate}}
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate }}{{ \\'ACTIONS.ENTER\\' | translate }}
    \");\n$templateCache.put(\"app/modules/cert-zone/views/apply-form/test-edit-dialog.html\",\"

    {{ \\'EXTERNAL_CERT_EXAM_APPLICATION\\' | translate}}

    {{ \\'ACTIONS.CLOSE\\' | translate}}close
    {{ \\'FIELD.APPLICANT\\' | translate}}
    {{ \\'FIELD.FULL_NAME\\' | translate}}{{ ::$ctrl.applicantInfo.FirstName}}
    {{ \\'FIELD.APPLY_DATE\\' | translate}}{{ ::$ctrl.data.applyDate}}
    0\\\">
    {{ \\'FIELD.DEPARTMENT\\' | translate}}{{team}} ;
    {{ \\'FIELD.JOB_TITLE\\' | translate}}{{::$ctrl.applicantInfo.TitleName}}
    {{ \\'CERTIFICATE_INFO\\' | translate}}
    {{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}{{::$ctrl.data.companyName}}
    {{ \\'FIELD.CERTIFIED_SUBJECT\\' | translate}}{{::$ctrl.data.subjectName}}
    {{ \\'FIELD.APPLY_REASON\\' | translate}}{{::$ctrl.data.reason}}
    {{ \\'FIELD.TEST_DATE\\' | translate}}
    {{ \\'FIELD.TEST_PLAN\\' | translate}}{{::$ctrl.data.testPlace}}
    {{ \\'FIELD.EXCERT_APPLY_TEST\\' | translate}}{{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}assignment
    {{ \\'FIELD.CURRENCY\\' | translate}}
    *{{ \\'FIELD.AMOUNT\\' | translate}}
    {{ \\'FORM_VALIDATION.PLEASE_ENTER_A_VALID_AMOUNT_OF_MONEY\\' | translate }}
    {{ \\'PLACEHOLDERS.CONVERSION_AMOUNT\\' | translate}}
    {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate }}{{ \\'ACTIONS.ENTER\\' | translate }}
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/assignable-members.html\",\"

    {{ \\'FIELD.SESSION\\' | translate}}:{{sessionName}} {{ \\'FIELD.ASSIGNABLE_MEMBER_ENROLL\\' | translate}}

    close

    {{ \\'FIELD.ADD_LEARNER\\' | translate}}

    {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}}{{ \\'FIELD.COURSE_REQUIRED\\' | translate}}{{ \\'FIELD.LIST_ALL_SUBORDINATE_MEMBERS\\' | translate}}
    {{member.fullName}}
    0\\\">

    {{ \\'FIELD.YOU_HAVE_SELECTED_MEMBERS\\' | translate}}

    {{selectedPerson.fullName}}

    {{ \\'FIELD.EXECUTION_DATE\\' | translate}}:

    The entered value is not a date!
    {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}

    {{ \\'FIELD.YOU_CAN_SET_A_DURATION_FOR_THE_TRAINEES\\' | translate}}:

    {{ \\'FIELD.UNLIMITED\\' | translate}}
    {{ \\'FIELD.AFTER_THE_SUCCESSFUL_REGISTRATION\\' | translate}}
    {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}

    ,{{ \\'FIELD.DAYS\\' | translate}}

    {{ \\'FIELD.DIRECTLY_SPECIFY_DEADLINES\\' | translate}}
    The entered value is not a date!
    {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}

    {{ \\'FIELD.COURSE_TYPE\\' | translate}}:

    {{\\'FIELD.FREE_COURSE\\' | translate}}{{\\'FIELD.PAY_COURSE\\' | translate}}

    {{ \\'FIELD.PENDING_PREDETERMINED_COST\\' | translate}}:

    {{ \\'FIELD.CURRENCY\\' | translate}}
    *{{ \\'FIELD.AMOUNT\\' | translate}}
    {{ \\'FIELD.SYSTEM_CURRENCY\\' | translate}}
    {{ \\'FIELD.TYPE_OF_SUBSIDY\\' | translate}}
    {{ \\'FIELD.FULL_AMOUNT\\' | translate}}{{ \\'FIELD.SUBSIDY\\' | translate}}
    {{ \\'FIELD.PAYMENT_DATE\\' | translate}}
    {{ \\'FIELD.VOUCHER\\' | translate}}
    {{ \\'FIELD.TAXABLE_INVOICE\\' | translate}}{{ \\'FIELD.TAX_FREE_INVOICE\\' | translate}}{{ \\'FIELD.RECEIPT\\' | translate}}
    {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.NEXT_STEP\\' | translate}}keyboard_arrow_rightkeyboard_arrow_left{{ \\'ACTIONS.PREVIOUS_STEP\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/course-detail-enrollment-learning-report.html\",\"

    {{ \\'FIELD.SUBMIT_REPORT\\' | translate}}

    {{ \\'FIELD.UPLOADED_REPORT_LIST\\' | translate}} : ({{ \\'FIELD.SUBMIT_DEADLINE\\' | translate}} : {{$ctrl.sessionData.reportSubmitDeadline}}) ({{ \\'FIELD.SUBMIT_DEADLINE\\' | translate}} : {{$ctrl.learningReportStatus.reportSubmitDeadline}}) {{ \\'FIELD.SHOULD_BE_SUBMIT_REPORT\\' | translate}} {{$ctrl.enrollmentData.reportsTotal}} {{ \\'FIELD.PART\\' | translate}}, {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}} {{$ctrl.learningReportData.paid}} {{ \\'FIELD.PART\\' | translate}}

    {{ \\'FIELD.SELECTED\\' | translate}} {{ uploader.queue.length || 0}} {{ \\'FIELD.PART\\' | translate}}{{ \\'FIELD.FILES\\' | translate}}

    add_circle{{ \\'ACTIONS.SELECT_FILES\\' | translate}}
    {{ item.file.name }}

    Server Error {{ item._xhr.status + \\' \\' + item._xhr.statusText}}

    {{ item.file.size/1024/1024|number:2 }} MB

    {{ \\'FIELD.SUBMITTED_REPORT\\' | translate}}

    {{ \\'FIELD.SERIAL_NUMBER\\' | translate}}{{ \\'FIELD.FILE_NAME\\' | translate}}{{ \\'FIELD.DATE_OF_PAYMENT\\' | translate}}{{ \\'FIELD.SCORE\\' | translate}}{{ \\'FIELD.APPROVE_STATUS\\' | translate}}{{ \\'FIELD.ACTION\\' | translate}}
    {{learningReport.index}}
    0\\\">{{$ctrl.learningReportFileReplace[learningReport.learningReportId].queue[0].file.name}}
    {{ $ctrl.learningReportFileReplace[learningReport.learningReportId].queue[0].file.size/1024/1024|number:2 }} MB
    {{learningReport.submitDate}}{{learningReport.score}}
    {{ \\'STATUS.\\' + learningReport.appStateWording | uppercase | translate}}
    {{ \\'ACTIONS.REPLACE\\' | translate}} {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.DELETE\\' | translate}}

    {{ \\'FIELD.OTHER\\' | translate}}

    {{ \\'FIELD.ITEM\\' | translate}}{{ \\'FIELD.PROGRESS_OF_SUBMIT_REPORT\\' | translate}}{{ \\'FIELD.ACTION\\' | translate}}
    {{ \\'FIELD.ORAL_REPORT\\' | translate}} : ({{ \\'FIELD.SUBMIT_DEADLINE\\' | translate }} : {{ $ctrl.learningReportStatus.oralReportDeadline }})
    {{ \\'STATUS.NOT_SUBMIT\\' | translate}}
    {{ \\'STATUS.SUBMITTED\\' | translate}}({{ \\'STATUS.NO_RATING_REQUIRED\\' | translate}}) {{ \\'STATUS.SUBMITTED\\' | translate}} {{ \\'FIELD.SCORE\\' | translate}} :{{$ctrl.learningReportStatus.oralreportScore}}
    {{ \\'STATUS.APPROVALED\\' | translate}}, {{ \\'FIELD.SCORE\\' | translate}} :{{$ctrl.learningReportStatus.oralreportScore}} {{ \\'STATUS.WAITING_APPROVAL\\' | translate}} {{ \\'STATUS.PUBLIC_STATUS_REJECT\\' | translate}} {{ \\'STATUS.CANCEL\\' | translate}}
    {{ \\'ACTIONS.APPLY_APPROVAL\\' | translate}}
    {{ \\'FIELD.INTERNAL_LECTURE\\' | translate}} : ({{ \\'FIELD.SUBMIT_DEADLINE\\' | translate }} : {{ $ctrl.learningReportStatus.teacherDeadline }})
    {{ \\'STATUS.NOT_SUBMIT\\' | translate}}
    {{ \\'STATUS.SUBMITTED\\' | translate}}({{ \\'STATUS.NO_RATING_REQUIRED\\' | translate}}) {{ \\'STATUS.SUBMITTED\\' | translate}} {{ \\'FIELD.SCORE\\' | translate}} :{{$ctrl.learningReportStatus.teachingScore}}
    {{ \\'STATUS.APPROVALED\\' | translate}}, {{ \\'FIELD.SCORE\\' | translate}} :{{$ctrl.learningReportStatus.teachingScore}} {{ \\'STATUS.WAITING_APPROVAL\\' | translate}} {{ \\'STATUS.PUBLIC_STATUS_REJECT\\' | translate}} {{ \\'STATUS.CANCEL\\' | translate}}
    {{ \\'ACTIONS.APPLY_APPROVAL\\' | translate}}
    {{ \\'FIELD.OTHER_METHOD\\' | translate}}({{$ctrl.learningReportStatus.otherReportWay}}) :
    {{ \\'STATUS.NOT_SUBMIT\\' | translate}}
    {{ \\'STATUS.SUBMITTED\\' | translate}} {{ \\'FIELD.SCORE\\' | translate}} :{{$ctrl.learningReportStatus.otherReportScore}}
    {{ \\'STATUS.APPROVALED\\' | translate}}, {{ \\'FIELD.SCORE\\' | translate}} :{{$ctrl.learningReportStatus.otherReportScore}} {{ \\'STATUS.WAITING_APPROVAL\\' | translate}} {{ \\'STATUS.PUBLIC_STATUS_REJECT\\' | translate}} {{ \\'STATUS.CANCEL\\' | translate}}
    {{ \\'ACTIONS.APPLY_APPROVAL\\' | translate}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/course-detail-enrollment.html\",\"
    \\\"\\\" play_arrow

    {{ \\'FIELD.LAST_PLAYER\\' | translate}}: {{$ctrl.enrollmentData.lastLeaningItem.title | translate}}

    \\\"\\\"

    {{ \\'FIELD.ENROLLMENT_INFO\\' | translate}}

    • {{ \\'FIELD.REFERENCE_DOCUMENT\\' | translate}}
    • 0\\\"> {{ \\'FIELD.FORUM\\' | translate}}
    {{ \\'STATUS.\\'+ $ctrl.enrollmentData.status | uppercase | translate}}
    alarm {{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}}
    • 0 && $ctrl.data.courseType!==3\\\">{{ \\'FIELD.OVERALL_RESULT\\' | translate}} : {{$ctrl.enrollmentData.score}}  分 {{$ctrl.enrollmentData.score}}
    • {{ \\'FIELD.CLASS_TIME\\' | translate}} : {{ \\'FIELD.TEST_TIME\\' | translate}} : {{ \\'FIELD.FILL_IN_TIME\\' | translate}} : \\'\\\">
    • 0\\\">{{ \\'FIELD.INSTRUCTOR\\' | translate}} : {{instructor.instructorName | markSplit:$index:\\' / \\'}} {{instructor.instructorName | markSplit:$index:\\' / \\'}}
    • {{ \\'FIELD.LAST_LEARNING_DATE\\' | translate}} : {{$ctrl.enrollmentData.lastLearningTime}}
    • {{ \\'FIELD.SESSION\\' | translate}} : {{$ctrl.sessionData.sessionName}}
    • 0\\\">{{ \\'FIELD.EVENT_LOCATION\\' | translate}} : {{$ctrl.sessionData.place}}
    • {{ \\'FIELD.DURATION\\' | translate}} : {{$ctrl.data.duration}}
    • 0\\\">{{ \\'FIELD.APPLY_STATUS\\' | translate}} : {{$ctrl.enrollmentData.applyStatusMsg}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/course-detail-header.html\",\"

    {{ \\'FIELD.COURSE_NAME\\' | translate}}: {{$ctrl.data.courseName}}

    {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}{{ \\'FIELD.ONLINE_COURSE\\' | translate}} {{ \\'FIELD.CLASS_ROOM_COURSE\\' | translate}} {{ \\'FIELD.EXTERNAL_TRAINING\\' | translate}}{{ \\'FIELD.COURSE\\' | translate}} {{ \\'FIELD.ONLINE_TEST\\' | translate}} {{ \\'FIELD.CLASS_ROOM_TEST\\' | translate}} {{ \\'FIELD.QUESTIONNAIRE\\' | translate}}{{category.categoryName}}

    {{ \\'FIELD.PROGRAM_NAME\\' | translate}}: {{$ctrl.data.programName}}

    {{ \\'FIELD.CERTIFICATE_NAME\\' | translate}}: {{$ctrl.data.programName}}

    {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}{{ \\'FIELD.PROGRAM\\' | translate}} {{ \\'FIELD.INTERNAL_LICENSE\\' | translate}}{{category.categoryName}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/course-detail-info.html\",\"

    {{ \\'FIELD.COURSE_INFO_DETAIL\\' | translate}}

    {{ \\'FIELD.BASIC_INFORMATION\\' | translate}}
    • {{ \\'FIELD.CREATE_DATE\\' | translate}}:

      {{$ctrl.data.createDate}}

    • {{ \\'FIELD.COURSE_ATTRIBUTES\\' | translate}}:

      {{ \\'FIELD.INTERNAL_TRAINING\\' | translate}}

      {{ \\'FIELD.EXTERNAL_TRAINING\\' | translate}}

    • {{ \\'FIELD.COURSE_CODE\\' | translate}}:

      {{ \\'FIELD.TEST_CODE\\' | translate}}:

      {{$ctrl.data.courseCode}}

    • {{ \\'FIELD.DURATION\\' | translate}}:

      {{$ctrl.data.duration | durationFormat:\\\"HH:mm:ss\\\"}}

    • {{ \\'FIELD.SUITABLE_FOR_THE_OBJECT\\' | translate}}:

      {{$ctrl.data.targetAudience}}

    • {{ \\'FIELD.ENCRYPTION\\' | translate}}:

      lock lock_open
    • {{ \\'FIELD.DOMESTIC\\' | translate}}/{{ \\'FIELD.ABROAD\\' | translate}}:

      {{ \\'FIELD.DOMESTIC\\' | translate}}

      {{ \\'FIELD.ABROAD\\' | translate}}

    • {{ \\'FIELD.SUITABLE_FOR_LEVEL\\' | translate}}:

      {{$ctrl.data.availableTier}}

    • {{ \\'FIELD.CREDITS\\' | translate}}:

      {{$ctrl.data.credits}}

    • {{ \\'FIELD.CLASSIFICATION\\' | translate}}:

      {{$ctrl.data.classification}}

    {{ \\'FIELD.COURSE_INTRODUCTION\\' | translate}}
    • {{ \\'FIELD.ENROLLMENT_WEBSITE\\' | translate}}:

      {{$ctrl.data.enrollmentLink}}

    • {{ \\'FIELD.LEARNING_GOAL\\' | translate}}:

      {{$ctrl.data.courseObjectives}}

    • {{ \\'FIELD.COURSE_OUTLINE\\' | translate}}:

      {{$ctrl.data.description}}

    • {{ \\'FIELD.DESCRIPTION\\' | translate}}:

      {{$ctrl.data.note}}

    • {{ \\'FIELD.REMARK\\' | translate}}:

      {{$ctrl.data.remark}}

    {{ \\'FIELD.OTHER\\' | translate}}
    • {{ \\'FIELD.PREPARATORY_KNOWLEDGE\\' | translate}}:

      {{$ctrl.data.prerequesiteKnowledge}}

    • {{ \\'FIELD.DIFFICULTY\\' | translate}}:

      {{ \\'FIELD.NOTHING\\' | translate}}

    • {{ \\'FIELD.KEYWORD\\' | translate}}:

      {{$ctrl.data.keyword}}

    • {{ \\'FIELD.RELATED_CERTIFICATE\\' | translate}}:

      {{$ctrl.data.certificate}}

    • {{ \\'FIELD.CERTIFICATE_RECOGNIZED_HOURS\\' | translate}}:

      {{$ctrl.data.certificateAuthHours}}hr

    • {{ \\'FIELD.LEARNING_REPORT\\' | translate}}:

      {{ \\'FIELD.WATCH_REPORT\\' | translate }}

    • 0\\\">

      {{ \\'FIELD.REFERENCE_DOCUMENT\\' | translate}}:

      {{references.fileName}}

    • 0\\\">

      {{ \\'FIELD.REFERENCE_DOCUMENT\\' | translate}}:

      {{referenceData.fileName}}

    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/course-detail-learning-content.html\",\"

    {{ \\'FIELD.LEARNING_CENTER\\' | translate}}

    0\\\">

    {{ \\'MESSAGE.MSG_CURRENTLY_ON_THE_TEMPORARY_LEARNING_RESOURCES\\' | translate}}

    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/course-detail-learning-results.html\",\"

    {{ \\'FIELD.LEARNING_RESULT\\' | translate}}

    0\\\">

    {{\\'FIELD.ATTENDANCE_RECORD\\' | translate}}: {{\\'FIELD.ATTENDANCE_RATE\\' | translate }} {{$ctrl.learningHistoryData.attendance}} %

    0\\\">
    {{\\'FIELD.DATE\\' | translate}}{{\\'FIELD.TIME\\' | translate}}{{\\'FIELD.CLASS_HOUR\\' | translate}}{{\\'FIELD.ATTENDANCE_STATISTIC\\' | translate}}
    {{attendanceRecord.date}}{{attendanceRecord.time}}{{attendanceRecord.hourLength}}{{\\'FIELD.HOUR\\' | translate}}{{\\'STATUS.ATTENDANCE\\' | translate}}{{attendanceStatistic.formatTime}} {{\\'STATUS.LEAVE_APPROVAL_PENDING\\' | translate}} {{\\'STATUS.ABSENCE\\' | translate}} {{\\'ACTIONS.LEAVE\\' | translate}}
    0\\\">
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/course-detail-prerequisite-items.html\",\"\");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/course-detail-recommend-lessons.html\",\"

    {{ \\'FIELD.YOU_MAY_BE_INTERESTED_IN_THE_FOLLOWING_COURSES\\' |translate}}

    0\\\">

    {{ \\'FIELD.STAY_TUNED\\' | translate}}

    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/course-type-tag.html\",\"

    {{ \\'FIELD.ONLINE_COURSE\\' | translate}}

    school

    {{ \\'FIELD.CLASS_ROOM_COURSE\\' | translate}}

    perm_camera_mic

    {{ \\'FIELD.EXTERNAL_TRAINING\\' | translate}}

    {{ \\'FIELD.ONLINE_TEST\\' | translate}}

    {{ \\'FIELD.CLASS_ROOM_TEST\\' | translate}}

    {{ \\'FIELD.QUESTIONNAIRE\\' | translate}}

    {{ \\'FIELD.TRACK_QUESTIONNAIRE\\' |translate }}

    folder_shared assignment_ind

    {{ \\'FIELD.PROGRAM\\' | translate}}

    {{ \\'FIELD.INTERNAL_LICENSE\\' | translate}}

    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/detail-completion-rate.html\",\"
    {{ \\'FIELD.COMPLETION_PERCENTAGE\\' | translate}}
    directions_walk
    {{$ctrl.data.completionRate}}
    {{ \\'FIELD.RECENTLY_COMPLETED_THE_TRAINEES\\' | translate}}
    • \\\"\\\"
      {{classmate.userName}}
    0\\\">{{ \\'LEARNING_IS_TO_WALK_IN_THE_RIGHT_DIRECTION\\' | translate}}
    {{ \\'LEARNING_IS_TO_BREAK_THROUGH_THEIR_OWN\\' | translate}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/detail-session-learners.html\",\"

    {{ \\'FIELD.CLASSMATE\\' | translate}}

    {{row.userName}}
    {{row.groupName}}
    {{row.mail}}
    {{row.phone}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/detail-session-list-dialog.html\",\"

    {{ \\'FIELD.SESSION_INFO\\' | translate}}

    close
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/detail-session-list.html\",\"

    {{ \\'FIELD.SESSION_INFO\\' | translate}}

    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/pass-rule.html\",\"
    {{ \\'FIELD.UNDERSTANDING\\' | translate}}{{ \\'FIELD.THROUGH_THE_RULES\\' | translate}}keyboard_arrow_right
    0\\\">
    info_outline{{ \\'FIELD.THROUGH_THE_RULES\\' | translate}} :
    • check_box_outline_blank check_box cancel \\'\\\">
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/program-detail-contain-lessons.html\",\"
    0\\\">

    {{ \\'COURSE_CONTAIN\\' | translate}}

    {{ \\'GET_THE_PROCESS\\' | translate}}

    {{ \\'EXTEND_THE_PROCESS\\' | translate}}

    {{$index + 1}}
    {{ row.credits }}
    {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/program-detail-enrollment-learning-report.html\",\"

    {{ \\'FIELD.SUBMIT_REPORT\\' | translate}}

    {{ \\'FIELD.UPLOADED_REPORT_LIST\\' | translate}} : ({{ \\'FIELD.SUBMIT_DEADLINE\\' | translate}} : {{$ctrl.sessionData.reportSubmitDeadline}}) {{ \\'FIELD.SHOULD_BE_SUBMIT_REPORT\\' | translate}} {{$ctrl.enrollmentData.reportsTotal}} {{ \\'FIELD.PART\\' | translate}}, {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}} {{$ctrl.learningReportData.paid}} {{ \\'FIELD.PART\\' | translate}}

    {{ \\'FIELD.SELECTED\\' | translate}} {{ uploader.queue.length || 0}} {{ \\'FIELD.PART\\' | translate}}{{ \\'FIELD.FILES\\' | translate}}

    add_circle{{ \\'ACTIONS.SELECT_FILES\\' | translate}}
    {{ item.file.name }}

    Server Error {{ item._xhr.status + \\' \\' + item._xhr.statusText}}

    {{ item.file.size/1024/1024|number:2 }} MB

    {{ \\'FIELD.SUBMITTED_REPORT\\' | translate}}

    {{ \\'FIELD.SERIAL_NUMBER\\' | translate}}{{ \\'FIELD.FILE_NAME\\' | translate}}{{ \\'FIELD.DATE_OF_PAYMENT\\' | translate}}{{ \\'FIELD.SCORE\\' | translate}}{{ \\'FIELD.APPROVE_STATUS\\' | translate}}{{ \\'FIELD.ACTION\\' | translate}}
    {{learningReport.index}}
    0\\\">{{$ctrl.learningReportFileReplace[learningReport.learningReportId].queue[0].file.name}}
    {{ $ctrl.learningReportFileReplace[learningReport.learningReportId].queue[0].file.size/1024/1024|number:2 }} MB
    {{learningReport.submitDate}}{{learningReport.score}}
    {{ \\'STATUS.\\' + learningReport.appStateWording | uppercase | translate}}
    {{ \\'ACTIONS.REPLACE\\' | translate}} {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.DELETE\\' | translate}}
    \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/program-detail-enrollment.html\",\"
    \\\"\\\"

    {{ \\'FIELD.ENROLLMENT_INFO\\' | translate}}

      {{ \\'STATUS.\\'+ $ctrl.enrollmentData.status | uppercase | translate}}
      alarm {{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}}
      • {{ \\'FIELD.CLASS_TIME\\' | translate}} : {{$ctrl.sessionData.accessPeriod}}
      • {{ \\'FIELD.SESSION\\' | translate}} : {{$ctrl.sessionData.sessionName}}
      • 0\\\">{{ \\'FIELD.APPLY_STATUS\\' | translate}} : {{$ctrl.enrollmentData.applyStatusMsg}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/program-detail-info.html\",\"

      {{ \\'PROGRAM_INFO_DETAIL\\' | translate}}

      {{ \\'CERTIFICATE_INFO_DETAIL\\' | translate}}

      {{ \\'FIELD.BASIC_INFORMATION\\' | translate}}
      • {{ \\'FIELD.CREATE_DATE\\' | translate}}:

        {{$ctrl.data.createDate}}

      • {{ \\'FIELD.TYPE\\' | translate}}:

        {{ \\'FIELD.PROGRAM\\' | translate}}

        {{ \\'FIELD.INTERNAL_LICENSE\\' | translate}}

      • {{ \\'FIELD.PROGRAM_CODE\\' | translate}}:

        {{ \\'FIELD.CERTIFICATE_CODE\\' | translate}}:

        {{$ctrl.data.programCode}}

      • {{ \\'FIELD.CLASSIFICATION\\' | translate}}:

        {{ \\'FIELD.CERTIFICATE_TYPE\\' | translate}}:

        {{$ctrl.data.classification}}

      • {{ \\'FIELD.VALIDITY_PERIOD\\' | translate}}:

      • {{ \\'FIELD.REWARD_METHOD\\' | translate}}:

        {{$ctrl.data.innercertRewardType}}

      • {{ \\'FIELD.SUITABLE_FOR_THE_OBJECT\\' | translate}}:

        {{$ctrl.data.targetAudience}}

      • {{ \\'FIELD.CREDITS\\' | translate}}:

        {{$ctrl.data.credits}}

      {{ \\'FIELD.PROGRAM_INTRODUCTION\\' | translate}}
      {{ \\'FIELD.CERTIFICATE_INTRODUCTION\\' | translate}}
      • {{ \\'FIELD.DESCRIPTION\\' | translate}}:

        {{$ctrl.data.description}}

      {{ \\'FIELD.OTHER\\' | translate}}
      • {{ \\'FIELD.DIFFICULTY\\' | translate}}:

        {{ \\'FIELD.NOTHING\\' | translate}}

      • {{ \\'FIELD.KEYWORD\\' | translate}}:

        {{$ctrl.data.keyword}}

      • {{ \\'FIELD.LEARNING_REPORT\\' | translate}}:

        {{ \\'FIELD.WATCH_REPORT\\' | translate }}

      \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/program-detail-lessons-list.html\",\"

      {{ \\'FIELD.COURSE_LIST\\' | translate}}

      {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}{{data.courseName}} {{data.courseName}} {{data.courseName}} {{data.courseName}}
      {{ \\'STATUS.\\' + data.status | uppercase | translate}}
      {{ \\'STATUS.UNENROLLED\\'| translate}}
      {{data.actionMessage}}
      play_circle_filled{{ \\'ACTIONS.FILL_IN\\' | translate}}
      person_add{{ \\'ACTIONS.ENROLL\\' | translate}}
      {{row.actionMessage}}
      play_circle_filled{{ \\'ACTIONS.START_LEARNING\\' | translate}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/program-detail-lessons-results-dialog.html\",\"

      {{ \\'FIELD.LEARNING_HISTORY\\' | translate}}

      close

      {{\\'FIELD.SUBMIT_REPORT\\' | translate}}: {{ \\'FIELD.SHOULD_BE_SUBMIT_REPORT\\' | translate}} {{$ctrl.report.numOfReports}} {{ \\'FIELD.PART\\' | translate}}/ {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}} {{$ctrl.report.learningReportSubmitted}} {{ \\'FIELD.PART\\' | translate}}

      \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/program-detail-lessons-results.html\",\"

      {{ \\'FIELD.LEARNING_RESULT\\' | translate}}

      {{ row.index}}
      {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}{{row.courseName}} {{row.courseName}} {{row.courseName}} {{row.courseName}}
      {{row.credits}}{{row.resultModifiedDate}}{{row.score}}
      • {{ \\'FIELD.TOTAL_CREDITS\\' | translate}} : {{ $ctrl.total_credits}}
      • {{ \\'FIELD.OVERALL_RESULT\\' | translate}} : {{ $ctrl.enrollmentData.score}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/session-action-enroll-dialog.html\",\"

      {{ \\'MESSAGE.MSG_IS_SURE_ENROLL\\' | translate}}

      close
      {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
      The description must be less than 30 characters long.
      keyboard_arrow_left{{ \\'ACTIONS.PREVIOUS_STEP\\' | translate}}{{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.NEXT_STEP\\' | translate}}keyboard_arrow_right{{ \\'ACTIONS.ENTER\\' | translate}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/session-action-exemption-dialog.html\",\"

      {{ \\'FIELD.APPLY_FOR_EXEMPTION\\' | translate}}

      close
      {{ \\'FIELD.APPLY_DATE\\' | translate }} :
      >
      {{ \\'FIELD.EXEMPTION_REASON\\' | translate }} :
      {{ \\'FIELD.EVER_ENROLLED_CERTIFICATION\\' | translate}}{{ \\'FIELD.EVER_ENROLLED_INNER_CERTIFICATION\\' | translate}}{{ \\'FIELD.EVER_ENROLLED_COURSE\\' | translate}}{{ \\'FIELD.OTHER\\' | translate}}
      {{ \\'FIELD.CERTIFICATION_NAME\\' | translate }} :
      {{cert.certName}}
      {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
      {{cert.certName}}
      {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
      {{ \\'FIELD.COURSE_NAME\\' | translate }} :
      {{course.courseName}} / {{course.sessionName}}
      {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
      The description must be less than 30 characters long.
      {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/session-action-leave-dialog.html\",\"

      {{ \\'FIELD.SELECT_LEAVE_TIME\\' | translate}}

      close
      {{ row.date}}
      {{ row.startTimeHH | displayMinNumber:2}}:{{ row.startTimeMM*5 | displayMinNumber:2 }}~ {{ row.endTimeHH | displayMinNumber:2}}:{{ row.endTimeMM*5 | displayMinNumber:2}}
      {{(((row.endTimeHH*60) + (row.endTimeMM*5)) - ((row.startTimeHH * 60) + (row.startTimeMM*5)))/60 | number: ((((row.endTimeHH*60) + (row.endTimeMM*5)) - ((row.startTimeHH * 60) + (row.startTimeMM*5)))%60===0)?1:2 }} {{ \\'FIELD.HOUR\\' | translate}}
      0\\\">{{ leave.startHH | displayMinNumber:2}}:{{ leave.startMM | displayMinNumber:2 }}~ {{ leave.endHH | displayMinNumber:2}}:{{ leave.endMM | displayMinNumber:2}} {{ \\'STATUS.\\' + leave.status | uppercase | translate}}
      :~:
      {{ \\'STATUS.ABSENT\\' | translate }}
      {{ \\'STATUS.ADMINISTRATOR_REGISTER\\' | translate }} {{ \\'STATUS.LEARNER_ASK_LEAVE\\' | translate }} ({{ \\'FIELD.\\' + leave.leaveType | uppercase | translate}})
      {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
      The description must be less than 30 characters long.
      {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.NEXT_STEP\\' | translate}}{{ \\'ACTIONS.PREVIOUS_STEP\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/session-action-un-enroll-dialog.html\",\"

      {{ \\'MESSAGE.MSG_IS_SURE_UN_ENROLL\\' | translate}}

      close
      {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
      The description must be less than 30 characters long.
      {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/session-enrolled-members-dialog.html\",\"

      {{ \\'FIELD.SESSION\\' | translate}}:{{sessionData.sessionName}}

      close
      {{row.userName}}{{row.userName}}
      {{row.groupName}}
      {{row.mail}}
      {{row.phone}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/course-session-info-template/unassignable-members.html\",\"

      {{ \\'FIELD.SESSION\\' | translate}}:{{$ctrl.sessionName}} {{ \\'FIELD.UN_ASSIGNABLE_MEMBER_ENROLL\\' | translate}}

      close
      {{row.employeeNumber}}
      {{row.fullName}}
      {{row.groupName}}
      {{ \\'FIELD.\\' + row.enrollType | uppercase | translate}}
      {{ \\'STATUS.\\' + row.status | uppercase | translate}}
      {{row.enrollDate}}
      {{row.assignerFullName}}

      {{ \\'PLACEHOLDERS.CAN_CANCEL_THE_REGISTRATION_OF_STUDENTS\\' | translate}}: {{selectedMember.fullName}} ;

      {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
      The description must be less than 30 characters long.
      {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.NEXT_STEP\\' | translate}}keyboard_arrow_rightkeyboard_arrow_left{{ \\'ACTIONS.PREVIOUS_STEP\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/external/external-company-insert-dialog.html\",\"

      {{ \\'FIELD.SELECT_SEARCH_FILTER\\' | translate}}

      close
      *{{ \\'FIELD.ORIGINAL_FACTORY_NAME\\' | translate}}
      {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
      {{ \\'FIELD.VAT_NUMBER\\' | translate}}
      {{ \\'FIELD.BANK_NAME\\' | translate}}
      {{ \\'FIELD.BANK_ACCOUNT\\' | translate}}
      {{ \\'FIELD.CLASSIFICATION\\' | translate}}
      {{ \\'FIELD.ADDRESS\\' | translate}}
      {{ \\'FIELD.PHONE\\' | translate}}
      {{ \\'FIELD.FAX\\' | translate}}
      {{ \\'FIELD.CONTACT_PERSON_DATA\\' | translate}}{{$index + 1}}
      {{\\'FORM_VALIDATION.PLEASE_ENTER_A_VALID_EMAIL\\' | translate}}
      0\\\">
      {{ \\'FIELD.UPLOAD_COURSE_DATA\\' | translate}}
      {{ \\'FIELD.INTRODUCTION\\' | translate}}
      {{ \\'FIELD.URL\\' | translate}}
      {{ \\'FIELD.NOTES\\' | translate}}
      {{ \\'FIELD.VENDOR_RECEIVER_NAME\\' | translate}}
      {{ \\'ACTIONS.CANCEL\\' | translate}}{{ \\'ACTIONS.ENTER\\' | translate}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/external/external-training-apply-form-view.html\",\"

      {{ \\'FIELD.FILLER\\' | translate}}:{{ ::$ctrl.data.requesterName}}

      {{ \\'FIELD.APPLICANT\\' | translate}}
      0\\\">
      {{ \\'FIELD.FULL_NAME\\' | translate}}{{ ::$ctrl.applicantInfo.FirstName}}
      {{ \\'FIELD.DEPARTMENT\\' | translate}}{{team}} ;
      0\\\"> 0\\\">
      {{ \\'FIELD.EMAIL\\' | translate}}{{ ::$ctrl.applicantInfo.Email}}
      {{ \\'FIELD.OFFICE_PHONE\\' | translate}}{{ ::$ctrl.applicantInfo.OfficePhone}}
      {{ \\'FIELD.ENROLLMENT_INFORMATION\\' | translate}}
      0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\">
      {{ \\'FIELD.COURSE_NAME\\' | translate}}{{ ::$ctrl.data.courseName}}
      {{ \\'STATUS.ENROLLED\\' | translate}}{{\\'FIELD.TRUE\\' | translate}} {{\\'FIELD.FALSE\\' | translate}}
      {{ \\'FIELD.DESCRIPTION\\' | translate}}{{ ::$ctrl.data.reason}}
      {{ \\'FIELD.JOIN_REASON\\' | translate}}{{ ::applyReason.reasonName | markSplit:reasonIndex:\\'/ \\'}}
      {{ \\'FIELD.DOMESTIC\\' | translate}}/{{ \\'FIELD.ABROAD\\' | translate}}{{\\'FIELD.DOMESTIC\\' | translate}} {{\\'FIELD.ABROAD\\' | translate}}
      {{ \\'FIELD.VENDOR\\' | translate}}{{ organizationData}}
      {{ \\'FIELD.CLASS_TIME\\' | translate}}{{ ::$ctrl.data.timeDesc}}
      {{ \\'FIELD.EVENT_LOCATION\\' | translate}}{{ ::$ctrl.data.location}}
      {{ \\'FIELD.TRAINING_NATURE\\' | translate}}{{\\'FIELD.ASSIGNED_BY_MANAGER\\' | translate}} {{\\'FIELD.PERSONAL_REQUESTS\\' | translate}}
      {{ \\'FIELD.ENROLLMENT_WEBSITE\\' | translate}} 0\\\">{{ \\'FIELD.ENROLLMENT_WEBSITE\\' | translate}}
      {{ \\'FIELD.UPLOAD_COURSE_DATA\\' | translate}}{{ref.fileName | markSplit:$index:\\'/ \\'}}
      {{ \\'FIELD.REMARK\\' | translate}}{{ ::$ctrl.data.note}}
      {{ \\'FIELD.COURSE_COST\\' | translate}}{{ \\'FIELD.LEARNING_REPORT\\' | translate}}
      0\\\"> 0\\\">
      {{ \\'FIELD.COURSE_TYPE\\' | translate}}{{\\'FIELD.FREE_COURSE\\' | translate}} {{\\'FIELD.PAY_COURSE\\' | translate}}
      {{\\'FIELD.ENROLLMENT_COST\\' | translate}}
      • 0\\\">{{ \\'FIELD.CURRENCY\\' | translate}} {{ ::currency.currencyName }}
      • 0\\\">{{ \\'FIELD.AMOUNT\\' | translate}} {{ ::$ctrl.data.enrollCost.course_cost_amount | number}}
      • 0\\\">{{ \\'FIELD.SYSTEM_CURRENCY\\' | translate}} {{ ::currency.currencyName }}
        {{ \\'PLACEHOLDERS.NT_CONVERSION\\' | translate}}:{{ ::$ctrl.data.enrollCost.course_converting_amount | number:1}}
      • 0\\\">{{ \\'FIELD.TYPE_OF_SUBSIDY\\' | translate}} {{ \\'FIELD.FULL_AMOUNT\\' | translate}} {{ \\'FIELD.SUBSIDY\\' | translate}}, {{ ::$ctrl.data.enrollCost.subsidyPercentage}}%
      • 0\\\">{{ \\'FIELD.VOUCHER\\' | translate}} {{ \\'FIELD.TAXABLE_INVOICE\\' | translate}} {{ \\'FIELD.TAX_FREE_INVOICE\\' | translate}} {{ \\'FIELD.RECEIPT\\' | translate}}
      • 0\\\">{{ \\'FIELD.APPLICATION_CONTENT\\' | translate}} {{ \\'FIELD.CASH\\' | translate}} {{ \\'FIELD.REMITTANCE\\' | translate}} {{ \\'FIELD.CHEQUE\\' | translate}}
      • 0\\\">{{ \\'FIELD.PAYEE\\' | translate}} {{ ::$ctrl.data.enrollCost.payee}}  
      • {{ \\'FIELD.REMITTANCE_INFORMATION\\' | translate}} {{ \\'FIELD.THE_TITLE_OF_THE_COMPANY\\' | translate}}: {{ ::$ctrl.data.enrollCost.remit_title}}
        {{ \\'FIELD.BRANCHES\\' | translate}}: {{ ::$ctrl.data.enrollCost.remit_branch}}
        {{ \\'FIELD.ACCOUNT\\' | translate}}: {{ ::$ctrl.data.enrollCost.remit_account}}
      • {{ \\'FIELD.RECEIPT_INFORMATION\\' | translate}} {{ \\'FIELD.THE_TITLE_OF_THE_RECEIPT\\' | translate}}: {{ ::$ctrl.data.enrollCost.check_title}}
        {{ \\'FIELD.RECEIPT_EXPIRE_DATE\\' | translate}}: {{ ::$ctrl.data.enrollCost.check_expired_date}}
        {{ \\'FIELD.RECEIPT_FORMAT\\' | translate}}: {{ \\'FIELD.RECEIPT_DELINEATE\\' | translate}} {{ \\'FIELD.ENDORSEMENT_OR_TRANSFERENCE_PROHIBITED\\' | translate}}
      {{\\'FIELD.PAYMENT_DATE\\' | translate}}{{ ::$ctrl.data.payingDate}}
      {{ \\'FIELD.LEARNING_REPORT\\' | translate}}{{ \\'FIELD.NO_REPORT\\' | translate}}
      • {{ \\'FIELD.DOCUMENT_REPORT\\' | translate}} {{ \\'FIELD.SHOULD_BE_SUBMIT_REPORT\\' | translate}} {{ ::$ctrl.data.learningReport.numOfDocReport}} {{ \\'FIELD.PART\\' | translate}}, {{ \\'FIELD.SUBMIT_DEADLINE\\' | translate}} {{ ::$ctrl.data.learningReport.docReportDeadLine}} {{ \\'FIELD.EXTERNAL_TRAINING_NO_REPORT_NEED\\' | translate}}
      • {{ \\'FIELD.ORAL_REPORT\\' | translate}} {{ \\'FIELD.REPORT_DEADLINE\\' | translate}} {{ ::$ctrl.data.learningReport.oralReportDeadLine}} {{ \\'FIELD.EXTERNAL_TRAINING_NO_REPORT_NEED\\' | translate}}
      • {{ \\'FIELD.INTERNAL_LECTURE\\' | translate}} {{ \\'FIELD.LECTURE_DEADLINE\\' | translate}} {{ ::$ctrl.data.learningReport.teachingDeadLine}} {{ \\'FIELD.EXTERNAL_TRAINING_NO_REPORT_NEED\\' | translate}}
      • {{ \\'FIELD.OTHER_METHOD\\' | translate}} {{ ::$ctrl.data.learningReport.otherReportWay}} {{ \\'FIELD.EXTERNAL_TRAINING_NO_REPORT_NEED\\' | translate}}
      0 || ($ctrl.data.enrollEnd | trim).length > 0 || ($ctrl.data.instructor | trim).length > 0 || ($ctrl.data.classification | trim).length > 0 || ($ctrl.data.description | trim).length > 0 || ($ctrl.data.objective | trim).length > 0 || ($ctrl.data.prerequesite | trim).length > 0 || ($ctrl.data.audience | trim).length > 0 || ($ctrl.data.outline | trim).length > 0\\\">
      {{ \\'FIELD.COURSE_DETAIL\\' | translate}}
      0 || ($ctrl.data.enrollEnd | trim).length > 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\">
      {{ \\'FIELD.ENROLL_DEADLINE\\' | translate}}{{ ::$ctrl.data.enrollStart}}~ {{ ::$ctrl.data.enrollEnd}}
      {{ \\'FIELD.INSTRUCTOR_NAME\\' | translate}}{{ ::$ctrl.data.instructor}}
      {{ \\'FIELD.CLASSIFICATION\\' | translate}}{{ ::classification.name}}
      {{ \\'FIELD.COURSE_DESCRIPTION\\' | translate}}{{ ::$ctrl.data.description}}
      {{ \\'FIELD.LEARNING_GOAL\\' | translate}}{{ ::$ctrl.data.objective}}
      {{ \\'FIELD.PREPARATORY_KNOWLEDGE\\' | translate}}{{ ::$ctrl.data.prerequesite}}
      {{ \\'FIELD.SUITABLE_FOR_THE_OBJECT\\' | translate}}{{ ::$ctrl.data.audience}}
      {{ \\'FIELD.COURSE_OUTLINE\\' | translate}}{{ ::$ctrl.data.outline}}
      {{ \\'FIELD.LAST_EXTERNAL_TRAINING_HISTORY\\' | translate}}

      {{ \\'FIELD.EXTERNAL_TRAINING_APPLY_TIMES_PRE\\' | translate}} {{ ::$ctrl.data.numOfTimes }} {{ \\'FIELD.EXTERNAL_TRAINING_APPLY_TIMES_POST\\' | translate}} {{ ::$ctrl.data.annualCost }} {{ \\'FIELD.EXTERNAL_TRAINING_APPLY_COST\\' | translate}}. ({{ \\'FIELD.TAX_FREE\\' | translate}})

      {{ \\'FIELD.TRAINING_NAME\\' | translate}}:{{ ::$ctrl.data.previousCourseName}}
      {{ \\'FIELD.EXTERNAL_TRAINING_REPORT\\' | translate}}:
      {{ \\'FIELD.EXTERNAL_TRAINING_NO_REPORT_NEED\\' | translate}}
      {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}}: {{ ::$ctrl.data.learningReportStatus | stringSplitToValue: \\'/\\' : 0}}, {{ \\'FIELD.UN_PAID\\' | translate}}: {{ ::$ctrl.data.learningReportStatus | stringSplitToValue: \\'/\\' : 1}}   {{ \\'FIELD.ORIGIN\\' | translate}}:{{ ::$ctrl.data.learningReportReason}}
      {{ \\'FIELD.ORAL_REPORT\\' | translate}}:
      {{ \\'FIELD.EXTERNAL_TRAINING_NO_REPORT_NEED\\' | translate}}
      {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}} , {{ \\'FIELD.SCORE\\' | translate}} {{ \\'FIELD.NOT_YET_RATED\\' | translate}} {{ ::$ctrl.data.oralReportScore}}
      {{ \\'FIELD.UN_PAID\\' | translate}}   {{ \\'FIELD.ORIGIN\\' | translate}}:{{ ::$ctrl.data.oralReportReason}}
      {{ \\'FIELD.INTERNAL_LECTURE\\' | translate}}:
      {{ \\'FIELD.EXTERNAL_TRAINING_NO_REPORT_NEED\\' | translate}}
      {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}} , {{ \\'FIELD.SCORE\\' | translate}} {{ \\'FIELD.NOT_YET_RATED\\' | translate}} {{ ::$ctrl.data.teachingScore}}
      {{ \\'FIELD.UN_PAID\\' | translate}}   {{ \\'FIELD.ORIGIN\\' | translate}}:{{ ::$ctrl.data.teachingReportReason}}
      {{ \\'FIELD.OTHER_METHOD\\' | translate}}:
      {{ \\'FIELD.EXTERNAL_TRAINING_NO_REPORT_NEED\\' | translate}}
      {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}}
      {{ \\'FIELD.UN_PAID\\' | translate}}   {{ \\'FIELD.ORIGIN\\' | translate}}:{{ ::$ctrl.data.otherReportReason}}
      {{ \\'FIELD.TRAINING_MATERIAL\\' | translate}}:{{ \\'FIELD.HAS_BEEN_PAID\\' | translate}} {{ \\'FIELD.UN_PAID\\' | translate}} 0\\\">
      {{ \\'FIELD.ORIGIN\\' | translate}}:{{ ::$ctrl.data.materialReason}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/external/external-training-apply.html\",\"

      {{ \\'EXTERNAL_TRAINING_APPLY_FORM\\' | translate}}

      {{ \\'FIELD.COURSE_LINKS\\' | translate}}\\\" canexit=\\\"$ctrl.canExitStep1\\\">
      *{{ \\'FIELD.APPLICANT\\' | translate}}
      1\\\" name=\\\"applicants\\\" ng-class=\\\"{\\'ng-invalid\\': $ctrl.applicants.length === 0}\\\">{{$chip.fullName}}
      {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
      *{{ \\'FIELD.COURSE_NAME\\' | translate}}
      *{{ \\'STATUS.ENROLLED\\' | translate}}
      {{\\'FIELD.TRUE\\' | translate}}{{\\'FIELD.FALSE\\' | translate}}
      {{\\'FORM_VALIDATION.THIS_IS_REQUIRED\\' | translate}}
      *{{ \\'FIELD.DESCRIPTION\\' | translate}}
      *{{ \\'FIELD.JOIN_REASON\\' | translate}}({{ \\'FIELD.MULTIPLE_SELECT\\' | translate}})
      0)\\\" ng-disabled=\\\"!$ctrl.isCanEditForm\\\">
      {{\\'FORM_VALIDATION.PLEASE_SELECT_AT_LEAST_ONE_ITEM\\' | translate}}
      {{ \\'FIELD.DOMESTIC\\' | translate}}/{{ \\'FIELD.ABROAD\\' | translate}}
      {{\\'FIELD.DOMESTIC\\' | translate}}{{\\'FIELD.ABROAD\\' | translate}}
      *{{ \\'FIELD.VENDOR\\' | translate}}
      {{\\'MESSAGE.ADDED_EXTERNAL_VENDOR\\' |translate}}
      *{{ \\'FIELD.CLASS_TIME\\' | translate}}
      {{ \\'FORM_VALIDATION.PLEASE_SET_AT_LEAST_ONE_TIME_ZONE\\' | translate}}
      {{ \\'FIELD.CREATE_FROM\\' | translate}}
      {{\\'FIELD.EXTERNAL_AUTO_CREATE\\' | translate}}{{\\'FIELD.EXTERNAL_ADD_COURSE\\' | translate}}
      {{ \\'FIELD.ASSIGNED_COURSE_CLASS\\' | translate}}:
      *{{ \\'FIELD.EVENT_LOCATION\\' | translate}}
      {{ \\'FIELD.TRAINING_NATURE\\' | translate}}
      {{\\'FIELD.ASSIGNED_BY_MANAGER\\' | translate}}{{\\'FIELD.PERSONAL_REQUESTS\\' | translate}}
      {{ \\'FIELD.ENROLLMENT_WEBSITE\\' | translate}}
      {{ \\'FORM_VALIDATION.PLEASE_ENTER_A_VALID_URL\\' | translate }}
      {{ \\'FIELD.UPLOAD_COURSE_DATA\\' | translate}}
      {{ \\'FIELD.REMARK\\' | translate}}
      {{ \\'FIELD.LEARNING_REPORT\\' | translate}}\\\">
      {{ \\'FIELD.COURSE_TYPE\\' | translate}}
      {{\\'FIELD.FREE_COURSE\\' | translate}}{{\\'FIELD.PAY_COURSE\\' | translate}}
      {{\\'FIELD.ENROLLMENT_COST\\' | translate}}
      {{\\'FIELD.PAYMENT_DATE\\' | translate}}
      {{ \\'FIELD.LEARNING_REPORT\\' | translate}}
      {{ \\'FIELD.ENROLL_DEADLINE\\' | translate}}
      to
      {{ \\'FIELD.INSTRUCTOR_NAME\\' | translate}}
      {{ \\'FIELD.CLASSIFICATION\\' | translate}}
      {{ \\'FIELD.COURSE_DESCRIPTION\\' | translate}}
      {{ \\'FIELD.LEARNING_GOAL\\' | translate}}
      {{ \\'FIELD.PREPARATORY_KNOWLEDGE\\' | translate}}
      {{ \\'FIELD.SUITABLE_FOR_THE_OBJECT\\' | translate}}
      {{ \\'FIELD.COURSE_OUTLINE\\' | translate}}
      {{ \\'FIELD.LAST_EXTERNAL_TRAINING_HISTORY\\' | translate}}
      {{ \\'FIELD.TRAINING_NAME\\' | translate}}:
      {{ \\'FIELD.NOTHING\\' | translate}}
      {{ \\'FIELD.LAST_EXTERNAL_TRAINING_HISTORY\\' | translate}}

      {{ \\'FIELD.EXTERNAL_TRAINING_APPLY_TIMES_PRE\\' | translate}} {{ $ctrl.extCourseForm.numOfTimes }} {{ \\'FIELD.EXTERNAL_TRAINING_APPLY_TIMES_POST\\' | translate}} {{ $ctrl.extCourseForm.annualCost }} {{ \\'FIELD.EXTERNAL_TRAINING_APPLY_COST\\' | translate}}. ({{ \\'FIELD.TAX_FREE\\' | translate}})

      {{ \\'FIELD.TRAINING_NAME\\' | translate}}:
      {{$ctrl.extCourseForm.previousCourseName}}
      {{ \\'FIELD.EXTERNAL_TRAINING_REPORT\\' | translate}}:
      {{ \\'FIELD.EXTERNAL_TRAINING_NO_REPORT_NEED\\' | translate}}
      {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}}: {{ $ctrl.extCourseForm.learningReportStatus | stringSplitToValue: \\'/\\' : 0}}, {{ \\'FIELD.UN_PAID\\' | translate}}: {{ $ctrl.extCourseForm.learningReportStatus | stringSplitToValue: \\'/\\' : 1}}   {{ \\'FIELD.ORIGIN\\' | translate}}:
      {{ \\'FIELD.ORAL_REPORT\\' | translate}}:
      {{ \\'FIELD.EXTERNAL_TRAINING_NO_REPORT_NEED\\' | translate}}
      {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}} , {{ \\'FIELD.SCORE\\' | translate}} {{ \\'FIELD.NOT_YET_RATED\\' | translate}} {{ $ctrl.extCourseForm.oralReportScore}}
      {{ \\'FIELD.UN_PAID\\' | translate}}   {{ \\'FIELD.ORIGIN\\' | translate}}:
      {{ \\'FIELD.INTERNAL_LECTURE\\' | translate}}:
      {{ \\'FIELD.EXTERNAL_TRAINING_NO_REPORT_NEED\\' | translate}}
      {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}} , {{ \\'FIELD.SCORE\\' | translate}} {{ \\'FIELD.NOT_YET_RATED\\' | translate}} {{ $ctrl.extCourseForm.teachingScore}}
      {{ \\'FIELD.UN_PAID\\' | translate}}   {{ \\'FIELD.ORIGIN\\' | translate}}:
      {{ \\'FIELD.OTHER_METHOD\\' | translate}}:
      {{ \\'FIELD.EXTERNAL_TRAINING_NO_REPORT_NEED\\' | translate}}
      {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}}
      {{ \\'FIELD.UN_PAID\\' | translate}}   {{ \\'FIELD.ORIGIN\\' | translate}}:
      {{ \\'FIELD.TRAINING_MATERIAL\\' | translate}}:
      {{ \\'FIELD.HAS_BEEN_PAID\\' | translate}}{{ \\'FIELD.UN_PAID\\' | translate}}  {{ \\'FIELD.ORIGIN\\' | translate}}:
      \");\n$templateCache.put(\"app/modules/course-resource/views/external/external-training-bulletin-detailed-dialog.html\",\"

      {{ \\'FIELD.COURSE_INFO_DETAIL\\' | translate}}

      close
      \");\n$templateCache.put(\"app/modules/course-resource/views/external/external-training-bulletin-detailed.html\",\"

      {{ $ctrl.data.courseName}}

      0\\\"> 0 || $ctrl.data.enrollEnd.length > 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\"> 0\\\">
      {{ \\'FIELD.CLASSIFICATION\\' | translate}}:
      {{ \\'FIELD.DOMESTIC\\' | translate}}/{{ \\'FIELD.ABROAD\\' | translate}} :{{ \\'FIELD.DOMESTIC\\' | translate }} {{ \\'FIELD.ABROAD\\' | translate }}
      {{ \\'FIELD.ENROLL_DEADLINE\\' | translate}} :{{$ctrl.data.enrollStart}} ~ {{$ctrl.data.enrollEnd}}
      {{ \\'FIELD.INSTRUCTOR_NAME\\' | translate}} :{{$ctrl.data.instructor}}
      {{ \\'FIELD.COURSE_DESCRIPTION\\' | translate}} :
      {{ \\'FIELD.LEARNING_GOAL\\' | translate}} :
      {{ \\'FIELD.PREPARATORY_KNOWLEDGE\\' | translate}} :
      {{ \\'FIELD.SUITABLE_FOR_THE_OBJECT\\' | translate}} :
      {{ \\'FIELD.COURSE_OUTLINE\\' | translate}} :
      {{ \\'FIELD.VENDOR\\' | translate}} :
      {{ \\'FIELD.CLASS_TIME\\' | translate}} :{{$ctrl.data.timeDesc}}
      {{ \\'FIELD.EVENT_LOCATION\\' | translate}} :{{$ctrl.data.location}}
      {{ \\'FIELD.COURSE_TYPE\\' | translate}} :{{\\'FIELD.FREE_COURSE\\' | translate}} {{\\'FIELD.PAY_COURSE\\' | translate}}
      {{ \\'FIELD.ENROLLMENT_COST\\' | translate}} :{{$ctrl.data.ExtTotalCost | number : 0}}  {{$ctrl.basicCurrencyName}}
      {{ \\'FIELD.SUBSIDY_COST\\' | translate}} :{{$ctrl.data.ExtSubsidy | number : 0}}  {{$ctrl.basicCurrencyName}}({{$ctrl.data.enrollCost.subsidyPercentage}}%)
      {{ \\'FIELD.SELF_COST\\' | translate}} :{{$ctrl.data.ExtLearnerCost | number : 0}}  {{$ctrl.basicCurrencyName}}({{100 - ($ctrl.data.enrollCost.subsidyPercentage | stringToNumber)}}%)
      {{ \\'FIELD.REFERENCE_MATERIAL\\' | translate}} :
      {{ \\'FIELD.REMARK\\' | translate}} :{{$ctrl.data.note}}
      {{ \\'FIELD.DESCRIPTION\\' | translate}} :
      \");\n$templateCache.put(\"app/modules/course-resource/views/external/external-training-bulletin.html\",\"

      {{ \\'EXTERNAL_TRAINING_BULLETIN\\' | translate}}

      {{ExternalTrainingBulletinData.title}}
      • {{ \\'FIELD.TIME\\' | translate}}:{{ExternalTrainingBulletinData.dateTime}}
      • {{ \\'FIELD.HOURS\\' | translate}}: 0\\\">{{ExternalTrainingBulletinData.hours}}{{ \\'FIELD.HOUR\\' | translate}} 0\\\">{{ExternalTrainingBulletinData.minutes}}{{ \\'FIELD.MINUTE\\' | translate}}
      • 0\\\">{{ \\'FIELD.INSTRUCTOR\\' | translate}}: {{ExternalTrainingBulletinData.lecturer}}
      • language {{ \\'FIELD.EXTERNAL_TRAINING_WEBSITE\\' | translate}}
      • {{ \\'FIELD.VENDOR\\' | translate}}: {{ExternalTrainingBulletinData.theOrganizer}}
      • {{ \\'FIELD.SESSION\\' | translate}}: 0\\\">{{ExternalTrainingBulletinData.classes}} {{ \\'FIELD.SESSION\\' | translate}}1({{ \\'FIELD.NOT_CREATED\\' | translate}})
      • 0\\\">{{ \\'FIELD.CLASSIFICATION\\' | translate}}: {{ExternalTrainingBulletinData.classification}}
      person_add
      {{ \\'ACTIONS.APPLY_ENROLLMENT\\' | translate}}
      person_add
      {{ \\'ACTIONS.APPLY_ENROLLMENT\\' | translate}}
      {{ \\'STATUS.ENROLLED\\' | translate}} {{ \\'STATUS.NOT_ENROLLMENT\\' | translate}} {{ \\'STATUS.ENROLLMENT_DEADLINE\\' | translate}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/external/external-training-records-search-dialog.html\",\"

      {{ \\'FIELD.SELECT_SEARCH_FILTER\\' | translate}}

      close
      {{ \\'FIELD.SEARCH_SCOPE_ALL\\' | translate}}{{ \\'FIELD.SEARCH_SCOPE_DEPARTMENT\\' | translate}}
      {{ \\'FIELD.APPLY_DATE\\' | translate}}
      {{ \\'ACTIONS.CANCEL\\' | translate }}{{ \\'ACTIONS.ENTER\\' | translate }}
      \");\n$templateCache.put(\"app/modules/course-resource/views/external/external-training-records.html\",\"

      {{ \\'EXTERNAL_TRAINING_APPLY_RECORDS\\' | translate }}

      {{ \\'ACTIONS.SEARCH\\' | translate }}
      {{row.id}}
      {{row.instructors}}
      {{row.createDate}}
      {{ \\'ACTIONS.FORM_EDIT\\' | translate}}{{ \\'ACTIONS.FORM_VIEW\\' | translate}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/single-info-template/course-learning-resource-info.html\",\"
      {{ \\'STATUS.NEW\\' |translate }}
      {{ \\'STATUS.HOT\\' |translate }}
      {{ \\'STATUS.FEATURED\\' |translate }}
      {{$ctrl.courseResourceData.objectName}}
      {{$ctrl.courseResourceData.objectName}}
      • group{{ \\'FIELD.TOTAL_NUMBER_OF_CLASSES\\' | translate}}: {{$ctrl.courseResourceData.learnerCount}}
      • {{$ctrl.courseResourceData.avgScoreForAll | number:2}}
      person_add assignment_turned_in assignment_turned_in {{$ctrl.courseResourceData.statusMessage}} person_add check visibility {{$ctrl.courseResourceData.statusMessage}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/single-info-template/incomplete-course-type-classroom-test.html\",\"
      {{ \\'STATUS.\\' + $ctrl.courseData.status | uppercase | translate}}
      {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}alarm{{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}} {{$ctrl.courseData.courseName}} {{$ctrl.courseData.courseName}}
      • schedule{{$ctrl.courseData.expireStart}}~{{$ctrl.courseData.expireEnd}}
      • room{{$ctrl.courseData.place}}
      {{ \\'FIELD.DETAILS\\' | translate}}expand_more
      • group{{ \\'PLACEHOLDERS.N_PERSON_LEARNING\\' | translate: {\\'value\\': $ctrl.courseData.learnCount} }}
      • group{{ \\'PLACEHOLDERS.N_PERSON_FINISH_COURSE\\' | translate: {\\'value\\': $ctrl.courseData.completeCount} }}
      • {{ \\'FIELD.SESSION\\' | translate}} :{{$ctrl.courseData.sessionName}}
      • {{ \\'FIELD.ENROLL_TYPE\\' | translate}} :{{ \\'FIELD.SELFENROLLED\\' | translate}} {{ \\'FIELD.ASSIGNED\\' | translate}} {{ \\'STATUS.UNENROLL\\' | translate}} {{ \\'STATUS.UNKNOW_STATUS\\' | translate}}
      • {{ \\'FIELD.CREDITS\\' | translate}} :{{$ctrl.courseData.credits}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/single-info-template/incomplete-course-type-classroom.html\",\"
      {{ \\'STATUS.\\' + $ctrl.courseData.status | uppercase | translate}}
      {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}alarm{{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}} {{$ctrl.courseData.courseName}} {{$ctrl.courseData.courseName}}
      • schedule{{$ctrl.courseData.expireStart}}~{{$ctrl.courseData.expireEnd}}
      • room{{$ctrl.courseData.place}}
      {{ \\'FIELD.DETAILS\\' | translate}}expand_more
      • group{{ \\'PLACEHOLDERS.N_PERSON_LEARNING\\' | translate: {\\'value\\': $ctrl.courseData.learnCount} }}
      • group{{ \\'PLACEHOLDERS.N_PERSON_FINISH_COURSE\\' | translate: {\\'value\\': $ctrl.courseData.completeCount} }}
      • {{ \\'FIELD.SESSION\\' | translate}} :{{$ctrl.courseData.sessionName}}
      • {{ \\'FIELD.ENROLL_TYPE\\' | translate}} :{{ \\'FIELD.SELFENROLLED\\' | translate}} {{ \\'FIELD.ASSIGNED\\' | translate}} {{ \\'STATUS.UNENROLL\\' | translate}} {{ \\'STATUS.UNKNOW_STATUS\\' | translate}}
      • {{ \\'FIELD.CREDITS\\' | translate}} :{{$ctrl.courseData.credits}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/single-info-template/incomplete-course-type-external.html\",\"
      {{ \\'STATUS.\\' + $ctrl.courseData.status | uppercase | translate}}
      {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}alarm{{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}} {{$ctrl.courseData.courseName}} {{$ctrl.courseData.courseName}}
      • schedule{{$ctrl.courseData.expireStart}}~{{$ctrl.courseData.expireEnd}}
      • room{{$ctrl.courseData.place}}
      {{ \\'FIELD.DETAILS\\' | translate}}expand_more
      • group{{ \\'PLACEHOLDERS.N_PERSON_LEARNING\\' | translate: {\\'value\\': $ctrl.courseData.learnCount} }}
      • group{{ \\'PLACEHOLDERS.N_PERSON_FINISH_COURSE\\' | translate: {\\'value\\': $ctrl.courseData.completeCount} }}
      • {{ \\'FIELD.SESSION\\' | translate}} :{{$ctrl.courseData.sessionName}}
      • {{ \\'FIELD.ENROLL_TYPE\\' | translate}} :{{ \\'FIELD.SELFENROLLED\\' | translate}} {{ \\'FIELD.ASSIGNED\\' | translate}} {{ \\'STATUS.UNENROLL\\' | translate}} {{ \\'STATUS.UNKNOW_STATUS\\' | translate}}
      • {{ \\'FIELD.CREDITS\\' | translate}} :{{$ctrl.courseData.credits}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/single-info-template/incomplete-course-type-online-test.html\",\"
      {{ \\'STATUS.\\' + $ctrl.courseData.status | uppercase | translate}}
      {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}alarm{{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}} {{$ctrl.courseData.courseName}} {{$ctrl.courseData.courseName}}
      • event_note {{ \\'FIELD.TEST_DEADLINE\\' | translate}} : {{$ctrl.courseData.expireStart}}~{{$ctrl.courseData.expireEnd}}
      {{ \\'ACTIONS.FILL_IN_TEST_SURVEY\\' | translate}} play_circle_filled {{ \\'FIELD.DETAILS\\' | translate}}expand_more
      • group{{ \\'PLACEHOLDERS.N_PERSON_LEARNING\\' | translate: {\\'value\\': $ctrl.courseData.learnCount} }}
      • group{{ \\'PLACEHOLDERS.N_PERSON_FINISH_COURSE\\' | translate: {\\'value\\': $ctrl.courseData.completeCount} }}
      • {{ \\'FIELD.SESSION\\' | translate}} :{{$ctrl.courseData.sessionName}}
      • {{ \\'FIELD.ENROLL_TYPE\\' | translate}} :{{ \\'FIELD.SELFENROLLED\\' | translate}} {{ \\'FIELD.ASSIGNED\\' | translate}} {{ \\'STATUS.UNENROLL\\' | translate}} {{ \\'STATUS.UNKNOW_STATUS\\' | translate}}
      • {{ \\'FIELD.CREDITS\\' | translate}} :{{$ctrl.courseData.credits}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/single-info-template/incomplete-course-type-online.html\",\"
      {{ \\'STATUS.\\' + $ctrl.courseData.status | uppercase | translate}}
      {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}alarm{{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}} {{$ctrl.courseData.courseName}} {{$ctrl.courseData.courseName}}
      • event_note{{ \\'FIELD.VIEW_DEADLINE\\' | translate}} : {{$ctrl.courseData.expireStart}}~{{$ctrl.courseData.expireEnd}}
      {{ \\'ACTIONS.PLAY_COURSE\\' | translate}} play_circle_filled {{ \\'FIELD.DETAILS\\' | translate}}expand_more
      • group{{ \\'PLACEHOLDERS.N_PERSON_LEARNING\\' | translate: {\\'value\\': $ctrl.courseData.learnCount} }}
      • group{{ \\'PLACEHOLDERS.N_PERSON_FINISH_COURSE\\' | translate: {\\'value\\': $ctrl.courseData.completeCount} }}
      • {{ \\'FIELD.SESSION\\' | translate}} :{{$ctrl.courseData.sessionName}}
      • {{ \\'FIELD.ENROLL_TYPE\\' | translate}} :{{ \\'FIELD.SELFENROLLED\\' | translate}} {{ \\'FIELD.ASSIGNED\\' | translate}} {{ \\'STATUS.UNENROLL\\' | translate}} {{ \\'STATUS.UNKNOW_STATUS\\' | translate}}
      • {{ \\'FIELD.CREDITS\\' | translate}} :{{$ctrl.courseData.credits}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/single-info-template/incomplete-course-type-survey.html\",\"
      {{ \\'STATUS.\\' + $ctrl.courseData.status | uppercase | translate}}
      {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}alarm{{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}} {{$ctrl.courseData.courseName}} {{$ctrl.courseData.courseName}}
      • event_note{{ \\'FIELD.FILL_IN_DEADLINE\\' | translate}} : {{$ctrl.courseData.expireStart}}~{{$ctrl.courseData.expireEnd}}
      {{ \\'ACTIONS.FILL_IN_TEST_SURVEY\\' | translate}} play_circle_filled {{ \\'FIELD.DETAILS\\' | translate}}expand_more
      • group{{ \\'PLACEHOLDERS.N_PERSON_LEARNING\\' | translate: {\\'value\\': $ctrl.courseData.learnCount} }}
      • group{{ \\'PLACEHOLDERS.N_PERSON_FINISH_COURSE\\' | translate: {\\'value\\': $ctrl.courseData.completeCount} }}
      • {{ \\'FIELD.SESSION\\' | translate}} :{{$ctrl.courseData.sessionName}}
      • {{ \\'FIELD.ENROLL_TYPE\\' | translate}} :{{ \\'FIELD.SELFENROLLED\\' | translate}} {{ \\'FIELD.ASSIGNED\\' | translate}} {{ \\'STATUS.UNENROLL\\' | translate}} {{ \\'STATUS.UNKNOW_STATUS\\' | translate}}
      • {{ \\'FIELD.CREDITS\\' | translate}} :{{$ctrl.courseData.credits}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/single-info-template/incomplete-evaluation-survey.html\",\"
      {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}alarm{{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}} {{$ctrl.courseData.courseName}}
      • event_note {{ \\'FIELD.FILL_IN_END_DATE\\' | translate}} : {{$ctrl.courseData.surveyEndDate | amUtc | amLocal | amDateFormat:\\'YYYY-MM-DD\\'}}
      {{ \\'ACTIONS.FILL_IN_TEST_SURVEY\\' | translate}} play_circle_filled {{ \\'FIELD.DETAILS\\' | translate}}expand_more
      • {{ \\'FIELD.TRACKING_OBJECT\\' | translate}} :{{$ctrl.courseData.fullName}}
      • {{ \\'FIELD.TRACKING_DEPARTMENT\\' | translate}} :{{$ctrl.courseData.jointGroupName}}
      • {{ \\'FIELD.SESSION\\' | translate}} :{{$ctrl.courseData.sessionName}}
      • {{ \\'FIELD.TRACKING_PERIOD\\' | translate}} :{{$ctrl.courseData.startDays}} {{ \\'FIELD.DAYS\\' |translate}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/single-info-template/incomplete-program-type-innercert.html\",\"
      {{ \\'STATUS.\\' + $ctrl.courseData.status | uppercase | translate}}
      {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}alarm{{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}} {{$ctrl.courseData.courseName}} {{$ctrl.courseData.courseName}}
      • schedule{{$ctrl.courseData.expireStart}}~{{$ctrl.courseData.expireEnd}}
      {{ \\'FIELD.DETAILS\\' | translate}}expand_more
      • group{{ \\'PLACEHOLDERS.N_PERSON_LEARNING\\' | translate: {\\'value\\': $ctrl.courseData.learnCount} }}
      • group{{ \\'PLACEHOLDERS.N_PERSON_FINISH_COURSE\\' | translate: {\\'value\\': $ctrl.courseData.completeCount} }}
      • {{ \\'FIELD.SESSION\\' | translate}} :{{$ctrl.courseData.sessionName}}
      • {{ \\'FIELD.ENROLL_TYPE\\' | translate}} :{{ \\'FIELD.SELFENROLLED\\' | translate}} {{ \\'FIELD.ASSIGNED\\' | translate}} {{ \\'STATUS.UNENROLL\\' | translate}} {{ \\'STATUS.UNKNOW_STATUS\\' | translate}}
      • {{ \\'FIELD.CREDITS\\' | translate}} :{{$ctrl.courseData.credits}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/single-info-template/incomplete-program-type-program.html\",\"
      {{ \\'STATUS.\\' + $ctrl.courseData.status | uppercase | translate}}
      {{ \\'FIELD.COURSE_ELECTIVE\\' | translate}} {{ \\'FIELD.COURSE_REQUIRED\\' | translate}}alarm{{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}} {{$ctrl.courseData.courseName}} {{$ctrl.courseData.courseName}}
      • schedule{{$ctrl.courseData.expireStart}}~{{$ctrl.courseData.expireEnd}}
      {{ \\'FIELD.DETAILS\\' | translate}}expand_more
      • group{{ \\'PLACEHOLDERS.N_PERSON_LEARNING\\' | translate: {\\'value\\': $ctrl.courseData.learnCount} }}
      • group{{ \\'PLACEHOLDERS.N_PERSON_FINISH_COURSE\\' | translate: {\\'value\\': $ctrl.courseData.completeCount} }}
      • {{ \\'FIELD.SESSION\\' | translate}} :{{$ctrl.courseData.sessionName}}
      • {{ \\'FIELD.ENROLL_TYPE\\' | translate}} :{{ \\'FIELD.SELFENROLLED\\' | translate}} {{ \\'FIELD.ASSIGNED\\' | translate}} {{ \\'STATUS.UNENROLL\\' | translate}} {{ \\'STATUS.UNKNOW_STATUS\\' | translate}}
      • {{ \\'FIELD.CREDITS\\' | translate}} :{{$ctrl.courseData.credits}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/test-questionnaire/evaluation-survey.html\",\"
      \");\n$templateCache.put(\"app/modules/course-resource/views/test-questionnaire/options-tpl.html\",\"
      0\\\" ng-click=\\\"(option.imgDisplayType==2 || option.imgDisplayType==3) && openImage(option.viewHref)\\\"> ({{ \\'CLICK_IMG_VIEW_FULL_SIZE\\' | translate }})
      0\\\" ng-click=\\\"(option.imgDisplayType==2 || option.imgDisplayType==3) && openImage(option.viewHref)\\\"> ({{ \\'CLICK_IMG_VIEW_FULL_SIZE\\' | translate }})
      {{questionOptions[questionOptions.length - 1].optionValue}}{{questionOptions[0].optionValue}}
      {{questionOptions[0].optionValue}}{{questionOptions[questionOptions.length - 1].optionValue}}
      {{questionOptions[0].optionValue}}{{questionOptions[questionOptions.length - 1].optionValue}}
      0\\\" ng-click=\\\"(option.imgDisplayType==2 || option.imgDisplayType==3) && openImage(option.viewHref)\\\"> ({{ \\'CLICK_IMG_VIEW_FULL_SIZE\\' | translate }})
      \");\n$templateCache.put(\"app/modules/course-resource/views/test-questionnaire/test-questionnaire-component.html\",\"
      \");\n$templateCache.put(\"app/modules/course-resource/views/test-questionnaire/test-questionnaire-form-component.html\",\"

      {{$ctrl.exam.name}}

      alarm

      {{ \\'FIELD.TIME_LEFT\\' | translate}} {{hhours}}:{{mminutes}}:{{sseconds}}

      {{sseconds}}{{ \\'ACTIONS.SELECT_QUESTION_NUMBER\\' | translate}}
      {{\\\"FIELD.\\\" + questionsGroup[0].surveyGroupName |uppercase | translate}} 4 && questionsGroup[0].isSatisfactionSurvey === 1\\\">{{questionsGroup[0].surveyGroupName}}

      lens{{ \\'FIELD.QUESTION_ANSWERED\\' | translate}}

      panorama_fish_eye{{ \\'FIELD.QUESTION_NOT_ANSWERED\\' | translate}}

      *{{ \\'FIELD.QUESTION_REQUIRED\\' | translate}}

      0\\\">{{\\\"FIELD.\\\" + questionsGroup[0].surveyGroupName |uppercase | translate}} {{questionsGroup[0].surveyGroupName}}
      0\\\">* {{key + 1}}.
      0\\\">    ({{ \\'FIELD.VIEW_FILES\\' | translate}})
      * {{question.index}}.
      \\'\\\"> 0\\\">    ({{ \\'FIELD.VIEW_FILES\\' | translate}})
      \\\"\\\" 0\\\">
      * {{instructor.subject}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/test-questionnaire/test-questionnaire-form.html\",\"

      {{tqc.exam.name}}

      alarm

      {{ \\'FIELD.TIME_LEFT\\' | translate}} {{hhours}}:{{mminutes}}:{{sseconds}}

      {{sseconds}}{{ \\'ACTIONS.SELECT_QUESTION_NUMBER\\' | translate}}
      {{tqc.questionTitle}}

      0\\\">{{\\\"FIELD.\\\" + questionsGroup[0].surveyGroupName |uppercase | translate}}

      lens{{ \\'FIELD.QUESTION_ANSWERED\\' | translate}}

      panorama_fish_eye{{ \\'FIELD.QUESTION_NOT_ANSWERED\\' | translate}}

      *{{ \\'FIELD.QUESTION_REQUIRED\\' | translate}}

      0\\\">{{\\\"FIELD.\\\" + questionsGroup[0].surveyGroupName |uppercase | translate}} {{questionsGroup[0].surveyGroupName}}
      0\\\">* {{key + 1}}. {{question.subject}} 0\\\">    ({{ \\'FIELD.VIEW_FILES\\' | translate}})
      * {{question.index}}. {{question.subject}} 0\\\">    ({{ \\'FIELD.VIEW_FILES\\' | translate}})
      \\\"\\\" 0\\\">
      * {{instructor.subject}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/test-questionnaire/test-questionnaire-result-component.html\",\"

      {{$ctrl.exam.name}}

      0}\\\"> 0, \\'fa-coffee\\':$ctrl.examResult.isPass === 0}\\\">
      0 && $ctrl.examResult.waitGradeQue === 0\\\">{{ \\'FIELD.SCORE_PASSING\\' | translate}}
      {{ \\'FIELD.SCORE_FAILED\\' | translate}}

      {{ \\'FIELD.SCORE\\' | translate}} : 0\\\">{{ \\'FIELD.LECTURER_RATING_REQUIRED\\' | translate}} {{$ctrl.examResult.totalScore}}

      0 || $ctrl.exam.maximunForTest === -1) && $ctrl.isFunction===1\\\">{{ \\'ACTIONS.RE_TEST_ONCE\\' | translate}}
      0\\\">
      {{ \\'PLACEHOLDERS.THE_PAPER_WILL_BE_PUBLISHED\\' | translate: {\\'value\\': $ctrl.examResult.announceDate} }} 0\\\">{{ \\'FIELD.VIEW_MY_ANSWERED\\' | translate}} :
      *{{examReviewQuestionsData.index}}. {{examReviewQuestionsData.subject}}
      \\\"\\\" 0\\\" ng-click=\\\"(examReviewQuestionsData.imgDisplayType==2 || examReviewQuestionsData.imgDisplayType==3) && $ctrl.openImage(examReviewQuestionsData.viewHref)\\\"> \\\"\\\" 0\\\" ng-click=\\\"(examReviewQuestionsData.imgDisplayType==2 || examReviewQuestionsData.imgDisplayType==3) && $ctrl.openImage(examReviewQuestionsData.viewHref)\\\">

      {{ \\'FIELD.QUESTION_ANALYSIS\\' | translate}} : {{examReviewQuestionsData.questionOptions[0].openEndValue}}

      {{examReviewQuestionsData.score}}{{ \\'FIELD.POINT\\' | translate}} {{ \\'FIELD.NOT_YET_RATED\\' | translate}}

      \");\n$templateCache.put(\"app/modules/course-resource/views/test-questionnaire/test-questionnaire-start-component.html\",\"

      {{$ctrl.exam.name}}

      {{$ctrl.exam.description}}

      {{ \\'FIELD.EVALUATION_STAFF\\' | translate}} : {{$ctrl.exam.targetName}}

      • {{ \\'FIELD.CAN_TEST_NUMBER_OF_TIMES\\' | translate}}: 0\\\">{{$ctrl.exam.maximunForTest}} {{ \\'FIELD.NUMBER_OF_TIMES\\' | translate}} {{ \\'FIELD.UNLIMITED\\' | translate}}
      • 0\\\">{{ \\'FIELD.LAST_TEST_NUMBER_OF_TIMES\\' | translate}}: {{$ctrl.exam.remNumForTest | number}} {{ \\'FIELD.NUMBER_OF_TIMES\\' | translate}}
      • {{ \\'FIELD.TO_THE_HIGHEST_SCORE\\' | translate}}: {{ \\'FIELD.SELECT_THE_HIGHEST_SCORE_ONCE\\' | translate}}
      alarm

      {{ \\'FIELD.TEST_TIME\\' | translate}} {{hhours}} :{{mminutes}} : {{sseconds}}

      {{ \\'ACTIONS.START_SURVEY\\' | translate}}{{ \\'ACTIONS.START_TEST\\' | translate}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/test-questionnaire/test-questionnaire-start.html\",\"

      {{tqc.exam.name}}

      {{tqc.exam.description}}

      {{ \\'FIELD.EVALUATION_STAFF\\' | translate}} : {{tqc.exam.targetName}}

      • {{ \\'FIELD.CAN_TEST_NUMBER_OF_TIMES\\' | translate}}: 0\\\">{{tqc.exam.maximunForTest}} {{ \\'FIELD.NUMBER_OF_TIMES\\' | translate}} {{ \\'FIELD.UNLIMITED\\' | translate}}
      • 0\\\">{{ \\'FIELD.LAST_TEST_NUMBER_OF_TIMES\\' | translate}}: {{tqc.exam.remNumForTest | number}} {{ \\'FIELD.NUMBER_OF_TIMES\\' | translate}}
      • {{ \\'FIELD.TO_THE_HIGHEST_SCORE\\' | translate}}: {{ \\'FIELD.SELECT_THE_HIGHEST_SCORE_ONCE\\' | translate}}
      alarm

      {{ \\'FIELD.TEST_TIME\\' | translate}} {{hhours}} :{{mminutes}} : {{sseconds}}

      {{ \\'ACTIONS.START_SURVEY\\' | translate}}{{ \\'ACTIONS.START_TEST\\' | translate}}
      \");\n$templateCache.put(\"app/modules/course-resource/views/test-questionnaire/test-questionnaire-status-component.html\",\"

      {{$ctrl.exam.name}}

      {{ \\'MESSAGE.MSG_ERROR_PLAY_BLOCKING\\' | translate}}

      {{ \\'MESSAGE.MSG_CURRENTLY_NON_VIEWING_TIME\\' | translate}} ,{{ \\'MESSAGE.MSG_NEXT_TEST_DATETIME\\' | translate}}:{{$ctrl.exam.reTestDate}}

      {{ \\'MESSAGE.MSG_YOUR_ATTENDANCE_RATE_IS_TOO_LOW_TO_FILL_OUT\\' | translate}}

      {{ \\'MESSAGE.MSG_YOU_HAVE_COMPLETED_THIS_QUESTIONNAIRE\\' | translate}}

      {{ \\'MESSAGE.MSG_YOU_HAVE_COMPLETED_THIS_TEST\\' | translate}}

      \");\n$templateCache.put(\"app/modules/course-resource/views/test-questionnaire/test-questionnaire-status.html\",\"

      {{tqc.exam.name}}

      {{ \\'MESSAGE.MSG_ERROR_PLAY_BLOCKING\\' | translate}}

      {{ \\'MESSAGE.MSG_CURRENTLY_NON_VIEWING_TIME\\' | translate}} ,{{ \\'MESSAGE.MSG_NEXT_TEST_DATETIME\\' | translate}}:{{tqc.exam.reTestDate}}

      {{ \\'MESSAGE.MSG_YOUR_ATTENDANCE_RATE_IS_TOO_LOW_TO_FILL_OUT\\' | translate}}

      {{ \\'MESSAGE.MSG_YOU_HAVE_COMPLETED_THIS_QUESTIONNAIRE\\' | translate}}

      {{ \\'MESSAGE.MSG_YOU_HAVE_COMPLETED_THIS_TEST\\' | translate}}

      \");\n$templateCache.put(\"app/modules/course-resource/views/test-questionnaire/test-questionnaire-wrap.html\",\"
      \");\n$templateCache.put(\"app/modules/dashboard/views/learning/accumulation-block.html\",\"
      \");\n$templateCache.put(\"app/modules/dashboard/views/learning/certification-progress.html\",\"
      assignment_ind{{\\'FIELD.CERTIFICATE_LIST\\' |translate}}
      {{$ctrl.certProgress.innercertCount}}{{$ctrl.certProgress.extcertCount}}
      {{cert.certName}} {{\\'FIELD.VALIDITY_PERIOD\\' |translate}} : {{cert.validDate}} {{\\'FIELD.PERMANENT\\' |translate}}
      {{cert.progress}}%
      done

      {{ \\'FIELD.THERE_IS_NO_CERTIFICATE_DATA\\' | translate}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/learning/classroom-course-incomplete.html\",\"

      {{ \\'FIELD.CLASS_ROOM_COURSE\\' | translate}}{{ \\'FIELD.INCOMPLETE_ITEM\\' | translate}}

      {{ \\'FIELD.NO_INFORMATION\\' | translate}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/learning/classroom-course-schedule.html\",\"
      >

      >>

      >

      0\\\" ng-scrollbars=\\\"\\\">
      • {{calendar.startTime}} {{calendar.endTime}}

        room{{calendar.place}}

        {{calendar.eventName}}

      {{ \\'FIELD.TODAY_IS_NOT_ANY_SCHEDULE\\' |translate }}

      Have a nice day!

      \");\n$templateCache.put(\"app/modules/dashboard/views/learning/distribution-map.html\",\"
      {{ \\'FIELD.DISTRIBUTION_MAP_OF_COURSES_IN_EACH_CATEGORY\\' | translate}}
      0\\\">

      {{ \\'FIELD.NO_INFORMATION\\' | translate}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/learning/learning-detail.html\",\"
      school{{\\'FIELD.LEARNING_DETAIL_OF_THE_YEAR\\' |translate}}

      {{ \\'FIELD.THERE_IS_NO_COURSE_DATA\\' | translate}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/learning/learning-resume.html\",\"

      {{ \\'FIELD.MY_LEARNING_RESUME\\' | translate}}

      more_horiz

      {{ \\'FIELD.NO_INFORMATION\\' | translate}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/learning/online-course-curve.html\",\"
      {{ \\'FIELD.ONLINE_COURSE_LEARNING_TIME_CURVE\\' | translate}}({{ \\'FIELD.SIX_MONTH\\' | translate}})
      0\\\">

      {{ \\'FIELD.NO_INFORMATION\\' | translate}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/learning/platform-latest-news.html\",\"

      {{ \\'FIELD.PERFORM_LATEST_NEWS\\' | translate}}

        0\\\">
      • {{platformNews.userName}}

        {{ \\'FIELD.LOGIN_PLATFORM\\' | translate}}

        {{ \\'FIELD.LEARNING_COURSE\\' | translate}}

        {{ \\'FIELD.FILE_IN_ONLINE_TEST\\' | translate}}

        {{ \\'FIELD.FILE_IN_ONLINE_QUESTIONNAIRE\\' | translate}}

        {{ \\'FIELD.VIEW_DOCUMENT_CENTER\\' | translate}}

        {{ \\'FIELD.FORUM_PUBLISHED_ARTICLE\\' | translate}}

        {{ \\'FIELD.ENROLLMENT_COURSE\\' | translate}}

        {{platformNews.actionDate}}

      {{ \\'FIELD.NO_INFORMATION\\' | translate}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/learning/total-block.html\",\"
      {{($ctrl.isMaterialIcon)?$ctrl.icon:\\'\\'}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/learning/training-road-map-progress.html\",\"

      {{ \\'FIELD.TRAINING_BLUEPRINT_PROGRESS\\' | translate}}

      0 && (!$ctrl.isManager)\\\" ui-sref=\\\"learningPassport.trainingRoadMap\\\">more_horiz
      0\\\" ng-scrollbars=\\\"\\\">
      • {{roadmapProgress.roadMapName}}
        {{roadmapProgress.progressRate.slice(0,-1) |numberFormat:\\'floor\\'}} %

      {{ \\'FIELD.THERE_IS_NO_ROADMAP_DATA\\' | translate}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/learning/year-accumulated-training-costs.html\",\"
      attach_money{{\\'FIELD.CUMULATIVE_TRAINING_COSTS_FOR_THE_YEAR\\' |translate}} : {{\\'FIELD.DOLLARS\\' |translate}}
      0 && $ctrl.distributionMaps.sumCost !== 0\\\">

      {{ \\'FIELD.THERE_IS_NO_COST_DATA\\' | translate}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/manager/average-training-cost-dialog.html\",\"

      {{$ctrl.groupName }}-{{ \\'FIELD.DEPARTMENT\\' | translate}}{{ \\'FIELD.AVERAGE_TRAINING_COSTS\\' | translate}}

      close
      • {{\\'FIELD.CUMULATIVE_TRAINING_COSTS\\' |translate}}-{{\\'FIELD.COMPANY\\' | translate}} {{$ctrl.groupTrainingCost.totalCost |number}} {{\\'FIELD.DOLLARS\\' |translate}}
      • {{\\'FIELD.AVERAGE_TRAINING_COSTS\\' |translate}}-{{\\'FIELD.IN_EACH_DEPARTMENT\\' |translate}} {{\\'FIELD.AVERAGE_TRAINING_COSTS\\' |translate}}-{{\\'FIELD.DEPARTMENT_MEMBERS\\' |translate}} {{$ctrl.groupTrainingCost.avgCost |number}}{{\\'FIELD.DOLLARS\\' |translate}}
      {{$ctrl.groupName }}-{{\\'FIELD.CUMULATIVE_TRAINING_COSTS_IN_EACH_DEPARTMENT\\' | translate}}
      {{$ctrl.groupName }}{{\\'FIELD.EMPLOYEE_CUMULATIVE_TRAINING_COSTS\\' |translate}}
      {{\\'FIELD.CLICK_THE_PATH_AND_EXPAND_THE_DATA\\' |translate}}
      {{$ctrl.groupName }}{{\\'FIELD.EMPLOYEE_CUMULATIVE_TRAINING_COSTS\\' |translate}}
      \");\n$templateCache.put(\"app/modules/dashboard/views/manager/average-training-hours-dialog.html\",\"

      {{$ctrl.groupName }}-{{ \\'FIELD.DEPARTMENT\\' | translate}}{{ \\'FIELD.AVERAGE_TRAINING_HOURS\\' | translate}}

      close
      school
      • {{\\'FIELD.AVERAGE_TRAINING_HOURS\\' | translate}}-{{\\'FIELD.COMPANY\\' | translate}} {{$ctrl.groupTrainingHours.allAvgHours}} hr
      • {{\\'FIELD.AVERAGE_TRAINING_HOURS\\' |translate}}-{{\\'FIELD.IN_EACH_DEPARTMENT\\' |translate}} {{\\'FIELD.AVERAGE_TRAINING_HOURS\\' |translate}}-{{\\'FIELD.DEPARTMENT_MEMBERS\\' |translate}} {{$ctrl.groupTrainingHours.groupAvgHours}}hr
      {{$ctrl.groupName }}-{{\\'FIELD.AVERAGE_TRAINING_HOURS_IN_EACH_DEPARTMENT\\' | translate}}
      {{$ctrl.groupName }}{{\\'FIELD.EMPLOYEE_TRAINING_HOURS\\' |translate}}
      {{\\'FIELD.CLICK_THE_PATH_AND_EXPAND_THE_DATA\\' |translate}}
      {{$ctrl.groupName }}{{\\'FIELD.HOURS\\' |translate}}
      \");\n$templateCache.put(\"app/modules/dashboard/views/manager/average-training-hours.html\",\"
      {{ \\'FIELD.DEPARTMENT_MEMBERS_FOR_THE_YEAR\\' | translate}} {{ \\'FIELD.AVERAGE_TRAINING_HOURS\\' | translate}}
      school

      {{$ctrl.groupTrainingHours.groupAvgHours}}hr

      {{ \\'FIELD.COMPANY_AVERAGE\\' | translate}}:{{$ctrl.groupTrainingHours.allAvgHours}}{{ \\'FIELD.HOUR\\' | translate}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/manager/cumulative-training-costs.html\",\"
      {{ \\'FIELD.DEPARTMENT_MEMBERS_FOR_THE_YEAR\\' | translate}} {{ \\'FIELD.CUMULATIVE_TRAINING_COSTS\\' | translate}}

      {{ \\'FIELD.DEPARTMENT_EVERYONE_AVERAGE\\' | translate}}:{{$ctrl.groupCost.avgCost |number}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/manager/drill-bar-chart.html\",\"
      \");\n$templateCache.put(\"app/modules/dashboard/views/manager/group-incompleted-course.html\",\"

      {{\\'FIELD.LIST_OF_UNEXPIRED_COURSE_TO_BE_EXPIRED\\' |translate}}

      {{ \\'FIELD.COURSE\\' | translate}}{{ \\'FIELD.SESSION\\' | translate}}{{ \\'FIELD.IS_WILL_EXPIRE\\' | translate}}{{ \\'FIELD.DATE\\' | translate}}{{ \\'FIELD.FULL_NAME\\' | translate}}{{ \\'FIELD.EMPLOYEE_NUMBER\\' | translate}}
      {{groupIncompletedCourse.courseName}}
      {{groupIncompletedCourse.sessionName}}
      {{groupIncompletedCourse.expireEnd}}
      {{groupIncompletedCourse.userName}}
      {{groupIncompletedCourse.EmployeeNumber}}
      \");\n$templateCache.put(\"app/modules/dashboard/views/manager/group-user-info.html\",\"

      {{ \\'FIELD.DEPARTMENT_MEMBERS\\' | translate}}

      • {{groupUserInfo.fullName}}

        {{groupUserInfo.courseWillExpireCount}}{{\\'FIELD.WILL_BE_EXPIRED_COURSES\\' |translate}}

        NT${{groupUserInfo.annualCost |number}}

        0\\\">{{groupUserInfo.instructorScore |number:2}} -

      \");\n$templateCache.put(\"app/modules/dashboard/views/manager/lecturer-info-dialog.html\",\"

      {{$ctrl.instructorInfo.instructorName}} {{ \\'FIELD.LECTURER_TEACHING_DATA\\' | translate}}

      close
      • {{\\'FIELD.LECTURER_TEACHING_SATISFACTION\\' | translate}} : - 0\\\">{{$ctrl.learnerTotlaScore |number:2}}
      • {{\\'FIELD.CLASS_ROOM_COURSE\\' | translate}}{{\\'FIELD.CUMULATIVE_TEACHING_HOURS\\' | translate}} N/A 0\\\">{{($ctrl.classroomTotalHour/60).toFixed(1) |replaceAll:\\'\\\\\\\\.?0+$\\':\\'\\'}}hrs
      {{\\'FIELD.LECTURER_TEACHING_INFORMATION\\' | translate}}
      {{\\'FIELD.NUMBER_OF_TEACHING_SESSIONS\\' |translate}}: {{$ctrl.teachingTimes}}
      • {{lecturer.publishedDate}}    {{\\'FIELD.SESSION\\' |translate}}:{{lecturer.sessionName}}
        {{lecturer.courseName}}
        star_rate - 0\\\">{{lecturer.learnerScore.toFixed(2) |replaceAll:\\'\\\\\\\\.?0+$\\':\\'\\'}} schedule N/A 0\\\">{{(lecturer.teachingHour/60).toFixed(1) |replaceAll:\\'\\\\\\\\.?0+$\\':\\'\\'}} hrs
      \");\n$templateCache.put(\"app/modules/dashboard/views/manager/month-cumulative-training-costs.html\",\"
      {{ \\'FIELD.MONTHLY_ACCUMULATED_TRAINING_COSTS\\' | translate}}

      {{ \\'FIELD.NO_INFORMATION\\' | translate}}

      \");\n$templateCache.put(\"app/modules/dashboard/views/manager/rate-progress-bars.html\",\"
      {{$ctrl.progressTitle |translate}}
      {{progress.name}}
      {{progress[$ctrl.valueKey]}}%
      \");}]);"],"sourceRoot":"/source/"}