{"version":3,"sources":["scripts/app.js"],"names":["config","$stateProvider","$translatePartialLoaderProvider","msNavigationServiceProvider","state","url","views","content@app","templateUrl","controller","bodyClass","resolve","Events","api","localStorageService","events","query","sel_company","get","$promise","addPart","$inject","angular","module","EventFormDialogController","$mdDialog","dialogData","init","vm","type","dialogTitle","calendarEvent","copy","moment","isMoment","start","toDate","end","notifications","saveEvent","dates","utc","response","extend","hide","removeEvent","closeDialog","cancel","this","EventDetailDialogController","showEventFormDialog","event","editEvent","params","showToastMessage","client","UsersController","$compile","$scope","$mdToast","$state","$translate","$cookies","$window","DTOptionsBuilder","DTColumnBuilder","CONFIG","$mdSidenav","showToast","msg","toast","simple","content","highlightAction","hideDelay","theme","position","show","updateSearch","e","stopPropagation","toggleSidenav","sidenavId","toggle","actionsHtml","data","full","meta","allowDelete","createdRow","row","dataIndex","element","contents","checkPerm","perm","perms","indexOf","permPrefix","filterProfiles","sel_profile","sel_profile_id","id","dtInstance","reloadData","loadProfiles","promisse","profiles","then","collection","records","gotoEquipments","src","go","local","haveFilters","clearFilters","gotoDetail","deleteConfirm","record","ev","confirm","title","instant","htmlContent","name","ariaLabel","targetEvent","ok","console","log","users","totalRecords","topfilter","dtOptions","newOptions","withOption","apiBaseUrlJson","dataSrc","json","d","search","seach_keyword","profile_id","profile","withDataProp","withPaginationType","nRow","aData","iDisplayIndex","iDisplayIndexFull","$","css","unbind","bind","$apply","searchBox","find","page","info","recordsTotal","totalRecordsFiltered","recordsDisplay","length","on","target","value","withLanguage","sInfo","paginate","first","last","next","previous","dtColumns","newColumn","withTitle","notSortable","renderWith","notVisible","User","$stateParams","UserController","$document","gotoList","save","result","recordLabel","DisplayName","companys","Report","reports","ReportController","Upload","delete_report","pedido","replace","deletePhoto","photoId","photos","index","forEach","images","key","PhotoID","splice","compare","sr1","sr2","equals","checkReason","pergunta","uploadFiles","file","errFiles","photosBaseUrlJson","CompanyID","DocumentID","Description","desc","upload","resp","status","push","Photo","evt","uploadpercentagem","parseInt","loaded","total","showPhoto","image","selectedImage","PhotoController","parent","document","body","clickOutsideToClose","hasBackdrop","selectedOption","fullscreen","answer","$filter","imagem","getRespostaID","r","respostas","Question","AnswerID","perguntas","QuestionID","getResposta","Answer","save_aprovar","user_id","DocId","report_status","doc","DocumentStatus","estado","report_user_id","ngFlowOptions","ngFlow","flow","dropping","submitted","DataType","rid","valuen","keyn","Reason","OrdersController","$rootScope","statusHtml","orderStatus","getOrderStatus","color","eventHtml","report","ico_delete","UserID","hasReport","DocSerie","openReport","sel_event","IsActive","filterEvents","sel_event_id","filterStates","sel_state","sel_state_id","loadEvents","loadStates","documentstates","states","gotoAproveReport","docid","gotoReport","orders","company_back","routes","eventId","EventCompany","set","reload","event_id","state_id","Order","from","OrderController","$q","changeImplementation","s_implementacao","changeEntrega","s_entrega","localentrega","dataentrega","horaentrega","changeLevantamento","s_levantamento","locallevantamento","datalevantamento","horalevantamento","loading","lines","EventID","products","Tipo","dataentrega_f","getFullYear","getMonth","slice","getDate","datalevantamento_f","showCatalogo","DialogController","showLocal","DialogLocalController","abc","countrys","locations","location","clone","obj","constructor","attr","hasOwnProperty","i","articles","familys","subfamilies","brands","familyId","subFamily","brandId","filterProducts","aux","copyModel","aux1","aux2","Codigo","toString","toLowerCase","pesquisa","Family","undefined","SubFamily","BrandID","add","cod","filter","qtd","filterFamily","prev","lockswitch","lockinsertlocal","entrega_data","subfamilys","tipopedido","UnloadAddress","LoadAddress","Date","PlanedShipmentDate","substring","split","RealShipmentDate","contacto","FreeField01","notes","Observation","EventsController","nrPedidos","filterClients","sel_client","sel_client_id","loadClients","clients","loadRoutes","routeId","selectRoute","localId","routelocals","gotoOrders","$mdDateLocaleProvider","formatDate","date","format","Event","EventController","datai","StartDate","dataf","EndDate","create_user","user","pedidos","EventDescription","Catalog","company","CatalogController","catalog","CalendarController","calendarView","calendar","eventDetail","select","addEvent","controllerAs","locals","j","entry","activos","inactivos","nrEvents","nrRegistados","registados","nrAprovados","aprovados","eventossempedidos","pedidosporresponder","march","calendarUiConfig","eventLimit","header","handleWindowResize","aspectRatio","dayNames","dayNamesShort","monthNames","viewRender","view","currentMonthShort","columnFormat","month","week","day","eventClick","selectable","selectHelper","displayEventTime","ArticlesController","changestatus","articleId","elem","rows","DataTable","Status","description","Article","encodeURIComponent","ArticleController","verPedido","isImage","deferred","defer","Image","onerror","onload","promise","MsSearchBarController","$element","$timeout","$watch","current","old","isUndefined","collapsed","onSearchEvaluated","$parent","$eval","onSearch","isArray","isPromise","populateResults","resultsLoading","results","isNull","selectedResultIndex","expand","onExpand","isFunction","collapse","onCollapse","absorbEvent","preventDefault","handleKeydown","keyCode","keys","handleResultClick","ensureSelectedResultIsVisible","handleMouseenter","ignoreMouseEvents","temporarilyIgnoreMouseEvents","mouseEventIgnoreTimeout","item","onResultClick","resultsEl","selectedItemEl","top","bottom","outerHeight","scrollTop","height","queryOptions","debounce","msSearchBarDirective","restrict","scope","require","bindToController","compile","tElement","addClass","iElement","inputEl","bodyEl","focus","removeClass","directive","MsWidgetController","flip","isFlippable","flipped","toggleClass","isDefined","flippable","msWidgetDirective","transclude","iAttrs","MsWidgetCtrl","transcludeFn","empty","append","msWidgetFrontDirective","flipWidget","msWidgetBackDirective","MsStepperController","setOrientation","orientation","registerMainForm","form","mainForm","registerStep","step","stepNumber","steps","stepTitle","sort","a","b","setupSteps","setCurrentStep","currentStepNumber","resetForm","x","$setPristine","$setUntouched","gotoFirstStep","isStepNumberValid","gotoStep","isStepHidden","gotoPreviousStep","s","gotoNextStep","gotoLastStep","isFirstStep","isLastStep","isStepCurrent","isStepDisabled","disabled","isStepValid","isStepOptional","optionalStep","hideStep","filterHiddenStep","$valid","isFormValid","currentStep","msHorizontalStepperDirective","priority","model","ctrls","FormCtrl","MsStepperCtrl","msHorizontalStepperStepDirective","msVerticalStepperDirective","msVerticalStepperStepDirective","stepInfo","MsStepper","MsTimelineController","setScrollEl","scrollEl","getScrollEl","msTimelineDirective","msTimeline","loadMore","MsTimelineCtrl","onScroll","threshold","loadMoreEl","unregisterOnScroll","registerOnScroll","remove","off","$on","msTimelineItemDirective","args","cardEl","testForImage","itemLoaded","testForVisibility","imgEl","itemInViewport","itemReadyWatcher","msSplashScreenDirective","$animate","link","splashScreenRemoveEvent","leave","MsShortcutsController","msNavigationService","loadShortcuts","shortcuts","flatNavigation","getFlatNavigation","uisref","lowercase","hasShortcut","y","_id","fromJson","icon","weight","children","_path","put","toJson","saveShortcuts","success","addShortcut","removeShortcut","toggleMobileBar","mobileBarActive","sortableOptions","ghostClass","forceFallback","fallbackClass","onSort","msShortcutsDirective","msSidenavHelperDirective","MdSidenavCtrl","isOpen","isLockedOpen","msScrollConfigProvider","configuration","defaultConfiguration","wheelSpeed","wheelPropagation","swipePropagation","minScrollbarLength","maxScrollbarLength","useBothWheelAxes","useKeyboard","suppressScrollX","suppressScrollY","scrollXMarginOffset","scrollYMarginOffset","stopPropagationOnClick","$get","getConfig","service","msScrollDirective","msScrollConfig","msUtils","fuseConfig","isMobile","updateScrollbar","PerfectScrollbar","update","options","msScroll","initialize","prop","destroy","provider","msResponsiveTableDirective","wrapper","after","msRandomClassDirective","msRandomClass","randomClass","Math","floor","random","saveItem","path","isString","$log","error","parts","_findOrCreateParent","updateItem","_getUiSref","isNumber","deleteItem","navigation","p","sortByWeight","_byWeight","pop","createParent","join","stateParams","isObject","injector","clearNavigation","navigationScope","setActiveItem","node","activeItem","getActiveItem","getNavigation","root","_flattenNavigation","setNavigationScope","setFolded","folded","getFolded","setFoldedOpen","foldedOpen","getFoldedOpen","toggleFolded","flatNav","navToPush","concat","MsNavigationController","toggleHorizontalMobileMenu","msNavigationDirective","$broadcast","setFoldExpander","$emit","removeFoldCollapser","foldExpanderEl","onFoldExpanderHover","setFoldCollapser","foldCollapserEl","onFoldCollapserHover","sidenav","close","MsNavigationNodeController","hasChildren","group","collapsable","includes","$evalAsync","givenPathParts","activePathParts","toggleCollapsed","collapseEl","offsetHeight","animate","display","animateHeightClass","expandEl","visibility","getClass","isHidden","hidden","msNavigationNodeDirective","MsNavigationNodeCtrl","msNavigationItemDirective","msNavigationHorizontalDirective","MsNavigationHorizontalNodeController","isActive","msNavigationHorizontalNodeDirective","MsNavigationHorizontalNodeCtrl","msNavigationHorizontalItemDirective","$mdMedia","onClick","msNavFoldService","setFoldable","foldable","isNavFoldedOpen","toggleFold","openFolded","closeFolded","msNavIsFoldedDirective","isFoldedOpen","isFolded","fold","unfold","sidenavEl","openOverlay","closeOverlay","msNavIsFolded","MsNavController","isDisabled","disable","enable","setToggleItem","toggleItems","getLockedItems","lockedItems","setLockedItem","clearLockedItems","msNavDirective","$mdComponentRegistry","stateChangeSuccessEvent","when","msNavTitleDirective","msNavButtonDirective","msNavToggleDirective","tAttrs","MsNavCtrl","isCollapsed","isExpanded","reject","elementToExpand","classes","expandAnimation","expanded","elementToCollapse","collapseAnimation","links","regExp","locked","lockedItem","currentState","shouldExpand","factory","msMaterialColorPickerController","$mdColorPalette","$mdMenu","fuseGenerator","activateHueSelection","palette","hues","selectedPalette","selectedHues","selectColor","hue","updateSelectedColor","updateModel","removeColor","selectedColor","class","setSelectedColor","modelCtrl","$viewValue","msModelType","bgColorValue","rgba","palettes","fgColorValue","contrast","$selectedColor","$setViewValue","msMaterialColorPicker","ngModel","attrs","controllers","ctrl","el","nodeType","replaceWith","msMasonryController","defaultOpts","watchContainerResize","waitImagesLoaded","callback","imagesLoaded","imgLoad","container","width","newValue","oldValue","reLayout","containerPos","getBoundingClientRect","updateColumnOptions","items","referenceArr","Array","apply","columnCount","map","xPos","yPos","column","refTop","columnWidth","respectItemOrder","min","round","transform","reLayoutTimeout","reLayoutDebounce","responsive","md","sm","xs","msMasonry","attributes","pre","post","msMasonryItem","newVal","oldVal","msInfoBarDirective","removeInfoBar","$destroy","msCardDirective","templatePath","card","template","cardTemplateLoaded","msDatepickerFixConfigProvider","formatter","val","parser","offset","utcOffset","msDatepickerFix","msDatepickerFixConfig","$formatters","unshift","$parsers","MsFormWizardController","registerForm","forms","previousStep","selectedIndex","nextStep","firstStep","lastStep","totalSteps","currentStepInvalid","$invalid","previousStepInvalid","formsIncomplete","msFormWizardDirective","msFormWizardFormDirective","formCtrl","MsFormWizardCtrl","fuseThemingService","$mdTheming","getRegisteredPalettes","PALETTES","getRegisteredThemes","THEMES","setActiveTheme","themeName","themes","list","warn","active","setThemesList","themeList","$mdThemingProvider","fusePalettes","fuseThemes","invoke","_$cookies","customTheme","getObject","alwaysWatchTheme","definePalette","primaryPalette","primary","accentPalette","accent","warnPalette","backgroundPalette","background","default","hue-1","hue-2","hue-3","pinkTheme","tealTheme","constant","50","100","200","300","400","500","600","700","800","900","A100","A200","A400","A700","contrastDefaultColor","contrastDarkColors","contrastStrongLightColors","fuseGeneratorService","fuseTheming","generate","registeredThemes","registeredPalettes","registeredTheme","colors","colorType","colorTypeName","levels","contrast1","contrast2","contrast3","contrast4","hue1","hue2","hue3","processAndStoreThemes","styleVars","colorTypes","colorLevelName","colorName","ucfirst","render","_themes","selectedTheme","cssTemplate","regex","RegExp","Object","matched","headEl","styleEl","html","_contrastLevel","contrastLevel","applyContrast","contrastLevels","white","1","2","3","4","black","string","charAt","toUpperCase","MsThemeOptionsController","getActiveTheme","updateLayoutMode","layoutMode","updateLayoutStyle","layoutStyle","layoutModes","label","layoutStyles","figure","msThemeOptions","toggleOptionsSidenav","exists","detectBrowser","searchString","dataString","dataProp","versionSearchString","versionSearch","identity","subString","searchVersion","browserInfo","browserData","navigator","userAgent","vendor","opera","osData","platform","browser","version","appVersion","os","guidGenerator","S4","mobileDetect","mobile","toggleInArray","array","MobileDetect","msApiProvider","setBaseUrl","baseUrl","getBaseUrl","getApiObject","register","resource","paramDefaults","actions","$resource","action","parameters","actionParts","method","apiObject","resourceObject","request","authService","getProfile","apiResolverService","resourceParts","l","filterByPropIds","parameter","ids","filtered","match","filterByIds","toTrustedFilter","$sce","trustAsHtml","htmlToPlainTextFilter","text","String","nospaceFilter","humanizeDocFilter","$1","altDate","diff","now","fromNow","hljsDirective","$interpolate","code","codeElement","line","trim","firstLineWhitespace","startingWhitespaceRegex","highlightedCode","hljs","highlight","language","lang","shouldInterpolate","contentParent","fuseConfigProvider","fuseConfiguration","disableCustomScrollbars","disableMdInkRippleOnMobile","disableCustomScrollbarsOnMobile","configName","setConfig","configValue","ToolbarController","selectedLanguage","languages","preferredLanguage","setUserStatus","userStatus","logout","clearAll","changeLanguage","use","toggleMsNavigationFolded","username","global","pt","translation","flag","en","es","NavigationController","$sanitize","update_company","logo","defaultLogo","msScrollOptions","main@","content@app.recover","RecoverController","$http","loginLogo","token","recover","email","apiBaseUrl","definepwd","password","MainController","translate","targetScope","$id","runBlock","htmlClass","run","$ariaProvider","$logProvider","$translateProvider","debugEnabled","useLoader","urlTemplate","useSanitizeValueStrategy","tabindex","content@app.auth","AuthController","login","Login","stateChangeStartEvent","loadingProgress","routeConfig","$urlRouterProvider","$locationProvider","html5Mode","otherwise","abstract","toolbar@app","navigation@app","IndexController","jwtHelper","defaults","headers","common","Authorization","apiModules","device","apiService","md5","Logo","rules","Logout","useXDomain","k","apiModule","delete","$templateCache"],"mappings":"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AI,sCAAsC,0gKACzDolB,EAAeplB,IAAI,+CAA+C,8kDAClEolB,EAAeplB,IAAI,wCAAwC,2iDAC3DolB,EAAeplB,IAAI,sCAAsC;AACzDolB,EAAeplB,IAAI,wCAAwC,unHAC3DolB,EAAeplB,IAAI,kCAAkC,qhFACrDolB,EAAeplB,IAAI,2CAA2C,ytEAC9DolB,EAAeplB,IAAI,oCAAoC,i5EACvDolB,EAAeplB,IAAI,kCAAkC,43RACrDolB,EAAeplB,IAAI,2CAA2C,0jDAC9DolB,EAAeplB,IAAI,oCAAoC,upEACvDolB,EAAeplB,IAAI,gCAAgC,mtIACnDolB,EAAeplB,IAAI,oCAAoC;AACvDolB,EAAeplB,IAAI,yCAAyC,mkDAC5DolB,EAAeplB,IAAI,kCAAkC,05EACrDolB,EAAeplB,IAAI,uDAAuD,i6EAC1EolB,EAAeplB,IAAI,8DAA8D,skEACjFolB,EAAeplB,IAAI,4DAA4D,wsDAC/EolB,EAAeplB,IAAI,0DAA0D,6lDAC7EolB,EAAeplB,IAAI,wDAAwD,6lDAC3EolB,EAAeplB,IAAI,iDAAiD,kxEACpEolB,EAAeplB,IAAI,8CAA8C,yzEACjEolB,EAAeplB,IAAI,wDAAwD,6lDAC3EolB,EAAeplB,IAAI,+CAA+C,6hBAClEolB,EAAeplB,IAAI,uDAAuD,6lDAC1EolB,EAAeplB,IAAI,mEAAmE,maACtFolB,EAAeplB,IAAI,mEAAmE,4kBACtFolB,EAAeplB,IAAI,qEAAqE,odACxFolB,EAAeplB,IAAI,mEAAmE,yYACtFolB,EAAeplB,IAAI,mEAAmE,+UACtFolB,EAAeplB,IAAI,mEAAmE,wRACtFolB,EAAeplB,IAAI,mEAAmE,giBACtFolB,EAAeplB,IAAI,mEAAmE,g7BACtFolB,EAAeplB,IAAI,mEAAmE,sjBACtFolB,EAAeplB,IAAI,mEAAmE,63BACtFolB,EAAeplB,IAAI,sEAAsE,siEACzFolB,EAAeplB,IAAI,kEAAkE,2IACrFolB,EAAeplB,IAAI,wEAAwE;AAC3FolB,EAAeplB,IAAI,oEAAoE,qhHACvFolB,EAAeplB,IAAI,4EAA4E","file":"scripts/app-b7c455a040.js","sourcesContent":["(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.calendar',\r\n [\r\n // 3rd Party Dependencies\r\n 'ui.calendar'\r\n ]\r\n )\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n // State\r\n $stateProvider\r\n .state('app.calendar', {\r\n url : '/calendar',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/pages/calendar/calendar.html',\r\n controller : 'CalendarController as vm'\r\n }\r\n },\r\n bodyClass: 'calendar',\r\n resolve: {\r\n Events: function (api, localStorageService) {\r\n return api.events.query({'sel_company': localStorageService.get('sel_company')}).$promise;\r\n }\r\n }\r\n });\r\n\r\n // Translation\r\n $translatePartialLoaderProvider.addPart('app/main/pages/calendar');\r\n\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular.module('app.calendar')\r\n .controller('EventFormDialogController', EventFormDialogController);\r\n\r\n /** @ngInject */\r\n function EventFormDialogController($mdDialog, dialogData)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.dialogData = dialogData;\r\n vm.notifications = ['15 minutes before', '30 minutes before', '1 hour before'];\r\n\r\n // Methods\r\n vm.saveEvent = saveEvent;\r\n vm.removeEvent = removeEvent;\r\n vm.closeDialog = closeDialog;\r\n\r\n init();\r\n\r\n //////////\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Figure out the title\r\n switch ( vm.dialogData.type )\r\n {\r\n case 'add' :\r\n vm.dialogTitle = 'Add Event';\r\n break;\r\n\r\n case 'edit' :\r\n vm.dialogTitle = 'Add Event';\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n // Edit\r\n if ( vm.dialogData.calendarEvent )\r\n {\r\n // Clone the calendarEvent object before doing anything\r\n // to make sure we are not going to brake FullCalendar\r\n vm.calendarEvent = angular.copy(vm.dialogData.calendarEvent);\r\n\r\n // Convert moment.js dates to javascript date object\r\n if ( moment.isMoment(vm.calendarEvent.start) )\r\n {\r\n vm.calendarEvent.start = vm.calendarEvent.start.toDate();\r\n }\r\n\r\n if ( moment.isMoment(vm.calendarEvent.end) )\r\n {\r\n vm.calendarEvent.end = vm.calendarEvent.end.toDate();\r\n }\r\n }\r\n // Add\r\n else\r\n {\r\n // Convert moment.js dates to javascript date object\r\n if ( moment.isMoment(vm.dialogData.start) )\r\n {\r\n vm.dialogData.start = vm.dialogData.start.toDate();\r\n }\r\n\r\n if ( moment.isMoment(vm.dialogData.end) )\r\n {\r\n vm.dialogData.end = vm.dialogData.end.toDate();\r\n }\r\n\r\n vm.calendarEvent = {\r\n start : vm.dialogData.start,\r\n end : vm.dialogData.end,\r\n notifications: []\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Save the event\r\n */\r\n function saveEvent()\r\n {\r\n // Convert the javascript date objects back to the moment.js dates\r\n var dates = {\r\n start: moment.utc(vm.calendarEvent.start),\r\n end : moment.utc(vm.calendarEvent.end)\r\n };\r\n\r\n var response = {\r\n type : vm.dialogData.type,\r\n calendarEvent: angular.extend({}, vm.calendarEvent, dates)\r\n };\r\n\r\n $mdDialog.hide(response);\r\n }\r\n\r\n /**\r\n * Remove the event\r\n */\r\n function removeEvent()\r\n {\r\n var response = {\r\n type : 'remove',\r\n calendarEvent: vm.calendarEvent\r\n };\r\n\r\n $mdDialog.hide(response);\r\n }\r\n\r\n /**\r\n * Close the dialog\r\n */\r\n function closeDialog()\r\n {\r\n $mdDialog.cancel();\r\n }\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular.module('app.calendar')\r\n .controller('EventDetailDialogController', EventDetailDialogController);\r\n\r\n /** @ngInject */\r\n function EventDetailDialogController($mdDialog, calendarEvent, showEventFormDialog, event)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.calendarEvent = calendarEvent;\r\n\r\n // Methods\r\n vm.editEvent = editEvent;\r\n vm.closeDialog = closeDialog;\r\n\r\n //////////\r\n\r\n /**\r\n * Close the dialog\r\n */\r\n function closeDialog()\r\n {\r\n $mdDialog.hide();\r\n }\r\n\r\n /**\r\n * Edit the calendar event\r\n *\r\n * @param calendarEvent\r\n */\r\n function editEvent(calendarEvent)\r\n {\r\n showEventFormDialog('edit', calendarEvent, false, false, event);\r\n }\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.users', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, msNavigationServiceProvider)\r\n {\r\n $stateProvider\r\n .state('app.users', {\r\n url : '/users',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/pages/users/users.html',\r\n controller : 'UsersController as vm'\r\n }\r\n },\r\n params: {\r\n showToastMessage : null,\r\n client : null\r\n }\r\n });\r\n\r\n $translatePartialLoaderProvider.addPart('app/main/pages/users');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.users')\r\n .controller('UsersController', UsersController);\r\n\r\n /** @ngInject */\r\n function UsersController($compile, api, $scope, $mdToast, $state, $translate, $cookies, localStorageService, $mdDialog, $window, DTOptionsBuilder, DTColumnBuilder, CONFIG, $mdSidenav)\r\n {\r\n console.log(\"UsersController\");\r\n\r\n var vm = this;\r\n vm.dtInstance = {};\r\n vm.topfilter = '';\r\n\r\n vm.permPrefix = \"Utilizadores_\"\r\n vm.perms = '';\r\n\r\n vm.profiles = null;\r\n vm.sel_profile = null;\r\n vm.sel_profile_id = '';\r\n \r\n /*if($state.params.client) {\r\n vm.sel_client = $state.params.client;\r\n vm.sel_client_id = $state.params.client.id;\r\n vm.topfilter = $state.params.client.client;\r\n }*/\r\n\r\n if($state.params.showToastMessage) {\r\n showToast($state.params.showToastMessage);\r\n }\r\n\r\n function showToast(msg) {\r\n var toast = $mdToast.simple()\r\n .content(msg)\r\n .highlightAction(true)\r\n .hideDelay(3000)\r\n .theme(\"success-toast\")\r\n .position('top right');\r\n\r\n $mdToast.show(toast);\r\n }\r\n\r\n function updateSearch(e){\r\n e.stopPropagation();\r\n }\r\n\r\n function toggleSidenav(sidenavId) {\r\n $mdSidenav(sidenavId).toggle();\r\n }\r\n\r\n function actionsHtml(data, type, full, meta) {\r\n if(data.allowDelete) {\r\n return '
';\r\n } else {\r\n return '
';\r\n }\r\n }\r\n\r\n function createdRow(row, data, dataIndex) {\r\n $compile(angular.element(row).contents())($scope);\r\n }\r\n\r\n vm.dtOptions = DTOptionsBuilder.newOptions()\r\n .withOption('ajax', {\r\n url: CONFIG.apiBaseUrlJson + 'json/users.php',\r\n type: 'POST',\r\n \"dataSrc\": function(json) {\r\n vm.perms = json.perms;\r\n console.log(json);\r\n return json.data;\r\n },\r\n \"data\": function(d){\r\n d.search['value'] = vm.seach_keyword;\r\n d.profile_id = vm.sel_profile_id;\r\n d.sel_company = localStorageService.get('sel_company');\r\n d.profile = localStorageService.get('profile');\r\n }\r\n })\r\n .withOption('dom','rt<\"bottom\"<\"left\"<\"info\"i>><\"right\"<\"pagination\"p>>>')\r\n .withDataProp('data')\r\n .withOption('processing', true)\r\n .withOption('serverSide', true)\r\n .withOption('filter', false)\r\n .withOption('scrollY', 'auto')\r\n .withOption('bLengthChange', true)\r\n .withOption('responsive',true)\r\n .withPaginationType('full_numbers')\r\n .withOption('createdRow', createdRow)\r\n .withOption('rowCallback', function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {\r\n\r\n $('td:eq(0), td:eq(1), td:eq(2), #edit_btn', nRow).css('cursor', 'pointer');\r\n $('td:eq(0), td:eq(1), td:eq(2), #edit_btn', nRow).unbind('click');\r\n $('td:eq(0), td:eq(1), td:eq(2), #edit_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.gotoDetail(aData.id);\r\n return nRow;\r\n });\r\n });\r\n $('#del_btn', nRow).unbind('click');\r\n $('#del_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.deleteConfirm(aData);\r\n return nRow;\r\n });\r\n });\r\n $('#lines_btn', nRow).unbind('click');\r\n $('#lines_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.gotoEquipments(aData);\r\n return nRow;\r\n });\r\n });\r\n })\r\n //.withOption('order', [7, 'desc'])\r\n .withOption('initComplete', function(){\r\n var api = this.api(),\r\n searchBox = angular.element('body').find('#e-commerce-products-search');\r\n\r\n vm.totalRecords = api.page.info().recordsTotal;\r\n vm.totalRecordsFiltered = api.page.info().recordsDisplay;\r\n\r\n if ( searchBox.length > 0 ) {\r\n searchBox.on('keyup', function (event) {\r\n vm.seach_keyword = event.target.value;\r\n vm.dtInstance.reloadData();\r\n });\r\n }\r\n $('th').css('background-color', '#2d323e');\r\n $('th').css('color', '#fff');\r\n $('th:eq(3)').css('text-align', 'center');\r\n $('th:last-child').css('text-align', 'center');\r\n })\r\n .withLanguage({\r\n \"sInfo\": $translate.instant('USERS.TABLE_INFO'),\r\n \"paginate\": {\r\n \"first\": $translate.instant('USERS.TABLE_BUT_FIRST'),\r\n \"last\": $translate.instant('USERS.TABLE_BUT_LAST'),\r\n \"next\": $translate.instant('USERS.TABLE_BUT_NEXT'),\r\n \"previous\": $translate.instant('USERS.TABLE_BUT_PREVIOUS')\r\n }\r\n });\r\n\r\n vm.dtColumns = [\r\n DTColumnBuilder.newColumn('company').withTitle($translate.instant('USER.COMPANY')),\r\n DTColumnBuilder.newColumn('name').withTitle($translate.instant('USER.USERNAME')),\r\n DTColumnBuilder.newColumn('profile').withTitle($translate.instant('USER.PROFILE')),\r\n DTColumnBuilder.newColumn(null).withTitle($translate.instant('USER.TABLE_COL_ACTIONS')).notSortable()\r\n .renderWith(actionsHtml).withOption('width', '100px'),\r\n DTColumnBuilder.newColumn('id').notVisible()\r\n ];\r\n\r\n vm.filterProfiles = filterProfiles;\r\n vm.loadProfiles = loadProfiles;\r\n\r\n vm.checkPerm = checkPerm;\r\n\r\n function checkPerm(perm) {\r\n if(vm.perms.indexOf(vm.permPrefix+perm)>-1) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /* FILTERS */\r\n function filterProfiles() {\r\n if(vm.sel_profile) {\r\n vm.sel_profile_id = vm.sel_profile.id;\r\n vm.dtInstance.reloadData();\r\n }\r\n }\r\n\r\n /* LOADS */\r\n function loadProfiles() {\r\n var promisse = api.profiles.get().$promise;\r\n promisse.then(function (collection) {\r\n vm.profiles = collection.records;\r\n });\r\n }\r\n\r\n // Methods\r\n vm.gotoDetail = gotoDetail;\r\n vm.deleteConfirm = deleteConfirm;\r\n vm.toggleSidenav = toggleSidenav;\r\n vm.updateSearch = updateSearch;\r\n vm.haveFilters = haveFilters;\r\n vm.clearFilters = clearFilters;\r\n vm.gotoEquipments = gotoEquipments;\r\n\r\n function gotoEquipments(src)\r\n {\r\n $state.go('app.equipments', {local: src});\r\n }\r\n\r\n function haveFilters()\r\n {\r\n if(vm.sel_profile_id != '')\r\n return true;\r\n else\r\n return false;\r\n }\r\n\r\n function clearFilters()\r\n {\r\n vm.sel_profile_id = '';\r\n vm.sel_profile = null;\r\n vm.dtInstance.reloadData();\r\n }\r\n\r\n function gotoDetail(id)\r\n {\r\n $state.go('app.user', {id: id});\r\n }\r\n\r\n function deleteConfirm(record, ev)\r\n {\r\n var confirm = $mdDialog.confirm()\r\n .title( $translate.instant('USERS.DELETE_QUESTION') )\r\n .htmlContent('' + record.name + '' + $translate.instant('USERS.DELETE_SENTENCE'))\r\n .ariaLabel('delete contact')\r\n .targetEvent(ev)\r\n .ok($translate.instant('USERS.DELETE_YES'))\r\n .cancel($translate.instant('USERS.DELETE_NO'));\r\n\r\n $mdDialog.show(confirm).then(function ()\r\n {\r\n console.log(record.id);\r\n api.users.delete({ id: record.id }).$promise.then(function (record) {\r\n vm.totalRecords = vm.totalRecords - 1;\r\n vm.dtInstance.reloadData();\r\n showToast($translate.instant('USERS.DELETE_MSG'));\r\n });\r\n }, function ()\r\n {\r\n\r\n });\r\n }\r\n //////////\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.user', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider)\r\n {\r\n $stateProvider\r\n .state('app.user', {\r\n url : '/user/:id',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/pages/user/user.html',\r\n controller : 'UserController as vm'\r\n }\r\n },\r\n resolve : {\r\n User: function (api, $stateParams, localStorageService)\r\n {\r\n return api.users.get({ id: $stateParams.id, profile: localStorageService.get('profile') }).$promise;\r\n }\r\n },\r\n bodyClass: 'e-commerce'\r\n });\r\n\r\n $translatePartialLoaderProvider.addPart('app/main/pages/user');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.user')\r\n .controller('UserController', UserController);\r\n\r\n function UserController($scope, $document, $state, User, api, $window, $translate)\r\n {\r\n console.log(\"UserController\");\r\n var vm = this;\r\n\r\n vm.record = User.record ? User.record : null;\r\n vm.recordLabel = User.record ? (User.record.DisplayName ? User.record.DisplayName : $translate.instant('USER.NEW_RECORD')) : $translate.instant('USER.NEW_RECORD');\r\n\r\n vm.perms = User.perms;\r\n vm.permPrefix = \"Utilizadores_\";\r\n\r\n vm.profiles = User.profiles;\r\n vm.companys = User.companys;\r\n\r\n vm.gotoList = gotoList;\r\n vm.save = save;\r\n vm.checkPerm = checkPerm;\r\n\r\n function checkPerm(perm) {\r\n if(vm.perms.indexOf(vm.permPrefix+perm)>-1) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n function gotoList()\r\n {\r\n $state.go('app.users');\r\n }\r\n\r\n function save(record)\r\n {\r\n var msg = '';\r\n api.users.save({ record: record }).$promise.then(function (result) {\r\n if(record.id > 0)\r\n msg = $translate.instant('USER.SAVE_UPDATE');\r\n else\r\n msg = $translate.instant('USER.SAVE_NEW');\r\n\r\n $state.go('app.users', { showToastMessage: msg });\r\n });\r\n }\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.report', ['ngFileUpload'])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider)\r\n {\r\n $stateProvider\r\n .state('app.report', {\r\n url : '/report/:id',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/pages/report/report.html',\r\n controller : 'ReportController as vm'\r\n }\r\n },\r\n resolve : {\r\n Report: function (api, $stateParams, localStorageService)\r\n {\r\n return api.reports.get({ id: $stateParams.id, sel_company: localStorageService.get('sel_company') }).$promise;\r\n }\r\n },\r\n bodyClass: 'e-commerce'\r\n });\r\n\r\n $translatePartialLoaderProvider.addPart('app/main/pages/report');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.report')\r\n .controller('ReportController', ReportController);\r\n\r\n function ReportController($mdDialog, $scope, $document, $state, Report, api, $window, $translate, $mdToast, localStorageService, Upload, CONFIG)\r\n {\r\n console.log(\"ReportController\");\r\n\r\n var vm = this;\r\n\r\n console.log(Report);\r\n\r\n vm.recordLabel = \"Relatório do pedido: \" +Report.pedido ;\r\n vm.perguntas = Report.perguntas;\r\n vm.respostas = Report.respostas;\r\n vm.report_status = Report.doc.DocumentStatus;\r\n vm.estado = Report.doc.DocumentStatus;\r\n vm.id = Report.pedido;\r\n vm.images = Report.images;\r\n vm.report_user_id = Report.user_id ? Report.user_id : 0;\r\n vm.uploadpercentagem = 100;\r\n vm.desc = \"\";\r\n vm.user_id = localStorageService.get('user_id');\r\n\r\n vm.gotoList = gotoList;\r\n vm.getResposta = getResposta;\r\n vm.getRespostaID = getRespostaID;\r\n vm.save = save;\r\n vm.showPhoto = showPhoto;\r\n vm.selectedImage;\r\n vm.checkReason = checkReason;\r\n vm.compare = compare;\r\n vm.save_aprovar = save_aprovar;\r\n vm.deletePhoto = deletePhoto;\r\n vm.delete_report = delete_report;\r\n\r\n vm.ngFlowOptions = {\r\n // You can configure the ngFlow from here\r\n /*target : 'api/media/image',\r\n chunkSize : 15 * 1024 * 1024,\r\n maxChunkRetries : 1,\r\n simultaneousUploads : 1,\r\n testChunks : false,\r\n progressCallbacksInterval: 1000*/\r\n };\r\n vm.ngFlow = {\r\n // ng-flow will be injected into here through its directive\r\n flow: {}\r\n };\r\n vm.dropping = false;\r\n vm.uploadFiles = uploadFiles;\r\n\r\n vm.profile = localStorageService.get('profile');\r\n\r\n vm.submitted = false;\r\n\r\n if(vm.respostas) {\r\n vm.record = {\r\n 'state' : 'Execução'\r\n };\r\n angular.forEach(vm.perguntas, function(value, key){\r\n if(value.DataType == \"TEXTBOX\") {\r\n var r = \"\"; var rid = \"\";\r\n angular.forEach(vm.respostas, function(valuen, keyn){\r\n if(value.Description == valuen.Question) {\r\n r = valuen.Answer;\r\n rid = valuen.AnswerID;\r\n }\r\n });\r\n vm.record[rid] = r;\r\n }\r\n\r\n angular.forEach(vm.respostas, function(valuen, keyn){\r\n if(valuen.Reason != '') {\r\n vm.record['reason_'+valuen.AnswerID] = valuen.Reason;\r\n }\r\n });\r\n });\r\n } \r\n\r\n function delete_report(src,ev) {\r\n console.log(src);\r\n var confirm = $mdDialog.confirm()\r\n .title( $translate.instant('REPORT.DELETE_QUESTION') )\r\n .htmlContent('' + Report.pedido + '' + $translate.instant('REPORT.DELETE_SENTENCE'))\r\n .ariaLabel('delete contact')\r\n .targetEvent(ev)\r\n .ok($translate.instant('REPORT.DELETE_YES'))\r\n .cancel($translate.instant('REPORT.DELETE_NO'));\r\n\r\n $mdDialog.show(confirm).then(function ()\r\n {\r\n api.reports.delete({ id: Report.pedido.replace('/','_') }).$promise.then(function (record) {\r\n showToast($translate.instant('ORDERS.DELETE_MSG'));\r\n $state.go('app.orders');\r\n });\r\n }, function ()\r\n {\r\n\r\n });\r\n }\r\n\r\n function showToast(msg) {\r\n var toast = $mdToast.simple()\r\n .content(msg)\r\n .highlightAction(true)\r\n .hideDelay(3000)\r\n .theme(\"success-toast\")\r\n .position('top right');\r\n\r\n $mdToast.show(toast);\r\n }\r\n\r\n function deletePhoto(photoId) {\r\n api.photos.delete({ id: photoId }).$promise.then(function (result) {\r\n var index = 0;\r\n angular.forEach(vm.images, function(value, key){\r\n if(value.PhotoID == photoId) {\r\n vm.images.splice(index, 1);\r\n }\r\n index++;\r\n });\r\n });\r\n }\r\n\r\n function compare(sr1, sr2) {\r\n return angular.equals(sr1,sr2);\r\n }\r\n\r\n function checkReason(pergunta) {\r\n //console.log('aaa', pergunta);\r\n }\r\n\r\n function uploadFiles (file, errFiles) {\r\n console.log('upload: ' + CONFIG.photosBaseUrlJson);\r\n console.log({file: file, CompanyID: localStorageService.get('sel_company'), DocumentID: Report.pedido, Description: vm.desc})\r\n Upload.upload({\r\n url: CONFIG.photosBaseUrlJson + 'Photos',\r\n data: {file: file, CompanyID: localStorageService.get('sel_company'), DocumentID: Report.pedido, Description: vm.desc}\r\n }).then(function (resp) {\r\n console.log(resp);\r\n if(resp.data.status != 'ERROR') {\r\n vm.images.push({Description: vm.desc, type: 'image', Photo: resp.data.status});\r\n vm.desc = '';\r\n }\r\n }, function (resp) {\r\n console.log('Error status: ' + resp.status);\r\n }, function (evt) {\r\n vm.uploadpercentagem = parseInt(100.0 * evt.loaded / evt.total);\r\n });\r\n }\r\n\r\n function showPhoto(ev, image) {\r\n vm.selectedImage = image;\r\n $mdDialog.show({\r\n controller: PhotoController,\r\n templateUrl: 'app/main/pages/report/dialog/photo.tmpl.html',\r\n parent: angular.element(document.body),\r\n targetEvent: ev,\r\n clickOutsideToClose:true,\r\n hasBackdrop: true,\r\n selectedOption: 'test here',\r\n fullscreen: false // Only for -xs, -sm breakpoints.\r\n })\r\n .then(function(answer) {\r\n $scope.status = 'You said the information was \"' + answer + '\".';\r\n }, function() {\r\n $scope.status = 'You cancelled the dialog.';\r\n });\r\n\r\n }\r\n\r\n function PhotoController($scope, $mdDialog, $filter, api) {\r\n $scope.imagem = vm.selectedImage;\r\n\r\n $scope.hide = function() {\r\n $mdDialog.hide();\r\n };\r\n $scope.cancel = function() {\r\n $mdDialog.cancel();\r\n };\r\n }\r\n\r\n function getRespostaID(src) {\r\n var r = \"\";\r\n if(vm.respostas && vm.respostas.length > 0) {\r\n angular.forEach(vm.respostas, function(value, key){\r\n if(value.Question == src) \r\n r = value.AnswerID;\r\n });\r\n } else {\r\n angular.forEach(vm.perguntas, function(value, key){\r\n if(value.Description == src) \r\n r = value.QuestionID;\r\n });\r\n }\r\n return r;\r\n }\r\n\r\n function getResposta(src) {\r\n if(vm.respostas) {\r\n var r = \"\";\r\n angular.forEach(vm.respostas, function(value, key){\r\n if(value.Question == src) \r\n r = value.Answer;\r\n });\r\n return r;\r\n } else {\r\n return -1;\r\n }\r\n }\r\n\r\n function gotoList()\r\n {\r\n $state.go('app.orders');\r\n }\r\n\r\n function save_aprovar(record)\r\n {\r\n record.state = 'aproved';\r\n save(record);\r\n }\r\n\r\n function save(record)\r\n {\r\n var msg = '';\r\n if(record.state == 'aproved') {\r\n } else {\r\n if(vm.respostas && vm.respostas.length > 0) {\r\n record.state = 'edit';\r\n } else {\r\n record.state = 'normal';\r\n }\r\n }\r\n\r\n record.user_id = localStorageService.get('user_id');\r\n record.CompanyID = localStorageService.get('sel_company');\r\n record.DocId = Report.pedido;\r\n\r\n console.log(record);\r\n\r\n api.reports.save({ record: record }).$promise.then(function (result) {\r\n if(record.id > 0)\r\n msg = $translate.instant('REPORT.UPDATE_MSG');\r\n else\r\n msg = $translate.instant('REPORT.INSERT_MSG');\r\n\r\n console.log(result);\r\n\r\n $state.go('app.orders', { showToastMessage: msg });\r\n });\r\n }\r\n\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.orders', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider)\r\n {\r\n $stateProvider\r\n .state('app.orders', {\r\n url : '/orders',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/pages/orders/orders.html',\r\n controller : 'OrdersController as vm'\r\n }\r\n },\r\n params: {\r\n showToastMessage : null,\r\n event : null\r\n }\r\n });\r\n\r\n $translatePartialLoaderProvider.addPart('app/main/pages/orders');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.orders')\r\n .controller('OrdersController', OrdersController);\r\n\r\n /** @ngInject */\r\n function OrdersController($compile, api, $scope, $rootScope, $mdToast, $state, $translate, $cookies, localStorageService, $mdDialog, $window, DTOptionsBuilder, DTColumnBuilder, CONFIG, $mdSidenav)\r\n {\r\n console.log(\"OrdersController\");\r\n\r\n var vm = this;\r\n vm.dtInstance = {};\r\n vm.topfilter = '';\r\n vm.profile = localStorageService.get('profile');\r\n vm.user_id = localStorageService.get('user_id');\r\n\r\n vm.company_back = '';\r\n\r\n vm.routes = null;\r\n\r\n vm.events = null;\r\n vm.sel_event = null;\r\n vm.sel_event_id = null;\r\n\r\n vm.states = null;\r\n vm.sel_state = null;\r\n vm.sel_state_id = null;\r\n \r\n if($state.params.event) {\r\n vm.sel_event = $state.params.event;\r\n vm.sel_event_id = $state.params.event.eventId;\r\n vm.topfilter = $state.params.event.title;\r\n\r\n if(vm.sel_event.EventCompany != '' && vm.sel_event.EventCompany != localStorageService.get('sel_company') && typeof vm.sel_event.EventCompany != 'undefined') {\r\n localStorageService.set('sel_company', vm.sel_event.EventCompany);\r\n\r\n vm.company_back = vm.sel_event.EventCompany;\r\n $state.reload();\r\n }\r\n }\r\n\r\n if($state.params.showToastMessage) {\r\n showToast($state.params.showToastMessage);\r\n }\r\n\r\n function showToast(msg) {\r\n var toast = $mdToast.simple()\r\n .content(msg)\r\n .highlightAction(true)\r\n .hideDelay(3000)\r\n .theme(\"success-toast\")\r\n .position('top right');\r\n\r\n $mdToast.show(toast);\r\n }\r\n\r\n function updateSearch(e){\r\n e.stopPropagation();\r\n }\r\n\r\n function toggleSidenav(sidenavId) {\r\n $mdSidenav(sidenavId).toggle();\r\n }\r\n\r\n function statusHtml(data, type, full, meta) {\r\n var orderStatus = vm.getOrderStatus(data);\r\n return '' + orderStatus.name + '';\r\n }\r\n\r\n function eventHtml(data, type, full, meta) {\r\n return ''+data+'';\r\n }\r\n\r\n function actionsHtml(data, type, full, meta) {\r\n var report = '';\r\n var ico_delete = '';\r\n\r\n if(vm.profile == \"ADMIN\") {\r\n ico_delete = '';\r\n } else {\r\n if(vm.user_id == data.UserID) {\r\n ico_delete = '';\r\n }\r\n }\r\n\r\n if(data.hasReport == true) {\r\n if(vm.profile == \"ADMIN\") {\r\n report = 'Ver relatorio';\r\n } else {\r\n if(vm.profile != \"ADMIN\" && data.user_id != vm.user_id) {\r\n report = '';\r\n } else {\r\n report = 'Ver relatorio';\r\n }\r\n }\r\n }\r\n\r\n if(vm.profile == \"CLIENT\") {\r\n if(data.status == \"Registado\") {\r\n return '
'+report+''+ico_delete+'
';\r\n } else {\r\n return '
'+report+ico_delete+'
';\r\n }\r\n } else {\r\n if(vm.profile == \"ADMIN\") {\r\n if(report == '') {\r\n if(data.status == \"Execução\" && data.DocSerie == \"PI\") {\r\n return '
'+report+'Inserir Relatório'+ico_delete+'
';\r\n } else {\r\n return '
'+report+''+ico_delete+'
';\r\n }\r\n } else {\r\n return '
'+report+''+ico_delete+'
';\r\n }\r\n } else {\r\n if(data.status == \"Execução\" && data.DocSerie == \"PI\" && (vm.profile == \"ADMIN\" || vm.profile == \"OPERATOR\")) {\r\n return '
'+report+'Inserir Relatório'+ico_delete+'
';\r\n } else {\r\n if(data.status == \"Atualização\") {\r\n if(vm.profile == \"ADMIN\") {\r\n return '
'+report+'Aprovar Relatório'+ico_delete+'
';\r\n } else if(vm.profile == \"OPERATOR\") {\r\n return '
'+report+''+ico_delete+'
';\r\n } else {\r\n return '
'+report+ico_delete+'
';\r\n }\r\n } else {\r\n return '
'+report+''+ico_delete+'
';\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n function documentsHtml(data, type, full, meta) {\r\n var r = '';\r\n if(data.sel_docs.length > 0) {\r\n for(var i=0 ; i'\r\n + '' + data.sel_docs[i].data_fim\r\n + ''\r\n + 'T' + data.sel_docs[i].id\r\n + '';\r\n }\r\n\r\n return r;\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n function routesHtml(data, type, full, meta) {\r\n return '{{route.route}}';\r\n }\r\n\r\n function createdRow(row, data, dataIndex) {\r\n $compile(angular.element(row).contents())($scope);\r\n }\r\n\r\n vm.dtOptions = DTOptionsBuilder.newOptions()\r\n .withOption('ajax', {\r\n url: CONFIG.apiBaseUrlJson + 'json/orders.php',\r\n type: 'POST',\r\n \"dataSrc\": function(json) {\r\n console.log(\"dataSrc:\")\r\n console.log(json);\r\n return json.data;\r\n },\r\n \"data\": function(d){\r\n d.search['value'] = vm.seach_keyword;\r\n d.event_id = vm.sel_event_id;\r\n d.state_id = vm.sel_state_id;\r\n d.sel_company = localStorageService.get('sel_company');\r\n d.user_id = vm.user_id; /* CQR - 02-06-2020 */\r\n d.profile = vm.profile; /* CQR - 02-06-2020 */\r\n }\r\n })\r\n .withOption('dom','rt<\"bottom\"<\"left\"<\"info\"i>><\"right\"<\"pagination\"p>>>')\r\n .withDataProp('data')\r\n .withOption('processing', true)\r\n .withOption('serverSide', true)\r\n .withOption('filter', false)\r\n .withOption('scrollY', 'auto')\r\n .withOption('bLengthChange', true)\r\n .withOption('responsive',true)\r\n .withPaginationType('full_numbers')\r\n .withOption('createdRow', createdRow)\r\n .withOption('rowCallback', function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {\r\n\r\n $('td:eq(0), td:eq(1), td:eq(2), #edit_btn', nRow).css('cursor', 'pointer');\r\n $('td:eq(0), td:eq(1), td:eq(2), #edit_btn', nRow).unbind('click');\r\n $('td:eq(0), td:eq(1), td:eq(2), #edit_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.gotoDetail(aData.docid);\r\n return nRow;\r\n });\r\n });\r\n $('#report_btn', nRow).unbind('click');\r\n $('#report_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.gotoReport(aData);\r\n return nRow;\r\n });\r\n });\r\n $('#del_btn', nRow).unbind('click');\r\n $('#del_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.deleteConfirm(aData);\r\n return nRow;\r\n });\r\n });\r\n $('#lines_btn', nRow).unbind('click');\r\n $('#lines_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.gotoReport(aData);\r\n return nRow;\r\n });\r\n });\r\n $('#lines_ap_btn', nRow).unbind('click');\r\n $('#lines_ap_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.gotoAproveReport(aData);\r\n return nRow;\r\n });\r\n });\r\n })\r\n //.withOption('order', [7, 'desc'])\r\n .withOption('initComplete', function(){\r\n var api = this.api(),\r\n searchBox = angular.element('body').find('#e-commerce-products-search');\r\n\r\n vm.totalRecords = api.page.info().recordsTotal;\r\n vm.totalRecordsFiltered = api.page.info().recordsDisplay;\r\n\r\n if ( searchBox.length > 0 ) {\r\n searchBox.on('keyup', function (event) {\r\n vm.seach_keyword = event.target.value;\r\n vm.dtInstance.reloadData();\r\n });\r\n }\r\n $('th').css('background-color', '#2d323e');\r\n $('th').css('color', '#fff');\r\n $('th:eq(3)').css('text-align', 'center');\r\n $('th:last-child').css('text-align', 'center');\r\n })\r\n .withLanguage({\r\n \"sInfo\": $translate.instant('ORDERS.TABLE_INFO'),\r\n \"paginate\": {\r\n \"first\": $translate.instant('ORDERS.TABLE_BUT_FIRST'),\r\n \"last\": $translate.instant('ORDERS.TABLE_BUT_LAST'),\r\n \"next\": $translate.instant('ORDERS.TABLE_BUT_NEXT'),\r\n \"previous\": $translate.instant('ORDERS.TABLE_BUT_PREVIOUS')\r\n }\r\n });\r\n\r\n vm.dtColumns = [\r\n DTColumnBuilder.newColumn('docid').withTitle('DocId'),\r\n DTColumnBuilder.newColumn('data').withTitle('Data do Pedido'),\r\n DTColumnBuilder.newColumn('tipo').withTitle('Tipo'),\r\n DTColumnBuilder.newColumn('status').withTitle('Estado').renderWith(statusHtml),\r\n DTColumnBuilder.newColumn('evento').withTitle('Evento').renderWith(eventHtml),\r\n DTColumnBuilder.newColumn('obs').withTitle('Ocorrências'),\r\n DTColumnBuilder.newColumn(null).withTitle('Actions').notSortable()\r\n .renderWith(actionsHtml).withOption('width', '100px'),\r\n DTColumnBuilder.newColumn('docid').notVisible()\r\n ];\r\n\r\n vm.filterEvents = filterEvents;\r\n vm.loadEvents = loadEvents;\r\n vm.filterStates = filterStates;\r\n vm.loadStates = loadStates;\r\n vm.openReport = openReport;\r\n\r\n function openReport(id) { \r\n /* CQR - 08/11/2019 - */ \r\n if(!vm.sel_event || (vm.sel_event.IsActive==0)) {\r\n /* OLD - $state.go('app.events'); */\r\n vm.gotoDetail(0);\r\n } else {\r\n vm.gotoDetail(id);\r\n } \r\n }\r\n\r\n /* FILTERS */\r\n function filterEvents() {\r\n if(vm.sel_event) {\r\n vm.sel_event_id = vm.sel_event.id;\r\n vm.dtInstance.reloadData();\r\n }\r\n }\r\n\r\n function filterStates() {\r\n if(vm.sel_state) {\r\n vm.sel_state_id = vm.sel_state.DocumentStatus;\r\n vm.dtInstance.reloadData();\r\n }\r\n }\r\n\r\n /* LOADS */\r\n function loadEvents() {\r\n var promisse = api.events.get({'sel_company': localStorageService.get('sel_company')}).$promise;\r\n promisse.then(function (collection) {\r\n vm.events = collection.records;\r\n });\r\n }\r\n\r\n function loadStates() {\r\n var promisse = api.documentstates.get({'sel_company': localStorageService.get('sel_company')}).$promise;\r\n promisse.then(function (collection) {\r\n vm.states = collection.records;\r\n });\r\n }\r\n\r\n // Methods\r\n vm.gotoDetail = gotoDetail;\r\n vm.deleteConfirm = deleteConfirm;\r\n vm.toggleSidenav = toggleSidenav;\r\n vm.updateSearch = updateSearch;\r\n vm.haveFilters = haveFilters;\r\n vm.clearFilters = clearFilters;\r\n vm.gotoReport = gotoReport;\r\n vm.getOrderStatus = getOrderStatus;\r\n vm.gotoAproveReport = gotoAproveReport;\r\n\r\n function getOrderStatus(src) {\r\n var r;\r\n\r\n if(src == \"Execução\") {\r\n r = {color: 'md-orange-500-bg', name: src};\r\n } else {\r\n if(src == \"Atualização\") {\r\n r = {color: 'md-green-800-bg', name: src};\r\n } else {\r\n if(src == \"Executado\") {\r\n r = {color: 'md-light-green-200-bg', name: src};\r\n } else {\r\n r = {color: 'md-blue-500-bg', name: src};\r\n }\r\n }\r\n }\r\n return r;\r\n }\r\n\r\n function gotoAproveReport(src) {\r\n $state.go('app.report', {id: src.docid.replace('/','_')});\r\n }\r\n\r\n function gotoReport(src)\r\n {\r\n $state.go('app.report', {id: src.docid.replace('/','_')});\r\n }\r\n\r\n function haveFilters()\r\n {\r\n if(vm.sel_event_id > 0 || vm.sel_state_id != '')\r\n return true;\r\n else\r\n return false;\r\n }\r\n\r\n function clearFilters()\r\n {\r\n vm.sel_event_id = null;\r\n vm.sel_event = null;\r\n vm.sel_state_id = null;\r\n vm.sel_state = null;\r\n vm.dtInstance.reloadData();\r\n }\r\n\r\n function gotoDetail(id)\r\n {\r\n $state.go('app.order', {id: id, event: vm.sel_event});\r\n }\r\n\r\n function deleteConfirm(record, ev)\r\n {\r\n var confirm = $mdDialog.confirm()\r\n .title( $translate.instant('ORDERS.DELETE_QUESTION') )\r\n .htmlContent('' + record.docid + '' + $translate.instant('ORDERS.DELETE_SENTENCE'))\r\n .ariaLabel('delete contact')\r\n .targetEvent(ev)\r\n .ok($translate.instant('ORDERS.DELETE_YES'))\r\n .cancel($translate.instant('ORDERS.DELETE_NO'));\r\n\r\n $mdDialog.show(confirm).then(function ()\r\n {\r\n api.orders.delete({ id: record.docid.replace('/','_') }).$promise.then(function (record) {\r\n console.log(record);\r\n vm.totalRecords = vm.totalRecords - 1;\r\n vm.dtInstance.reloadData();\r\n showToast($translate.instant('ORDERS.DELETE_MSG'));\r\n });\r\n }, function ()\r\n {\r\n\r\n });\r\n }\r\n //////////\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.order', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider)\r\n {\r\n $stateProvider\r\n .state('app.order', {\r\n url : '/order/:id',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/pages/order/order.html',\r\n controller : 'OrderController as vm'\r\n }\r\n },\r\n resolve : {\r\n Order: function (api, $stateParams, localStorageService)\r\n {\r\n return api.orders.get({ id: $stateParams.id.replace('/','_'), sel_company: localStorageService.get('sel_company'), from: 'pedidos' }).$promise;\r\n }\r\n },\r\n params: {\r\n event : null,\r\n },\r\n bodyClass: 'e-commerce'\r\n });\r\n\r\n $translatePartialLoaderProvider.addPart('app/main/pages/order');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.order')\r\n .controller('OrderController', OrderController);\r\n\r\n function OrderController($q,$compile, $mdToast, $scope, $document, $state, Order, api, $window, $translate, $mdDialog, DTOptionsBuilder, DTColumnBuilder, CONFIG, localStorageService)\r\n {\r\n console.log(\"OrderController\", Order);\r\n\r\n var vm = this;\r\n vm.dtInstance = {};\r\n vm.products = [];\r\n vm.lines = [];\r\n vm.locations = Order.locations;\r\n vm.record = null;\r\n vm.countrys = Order.countrys;\r\n vm.profile = localStorageService.get('profile');\r\n vm.s_implementacao = false;\r\n vm.s_entrega = false;\r\n vm.s_levantamento = false;\r\n vm.lockswitch = false;\r\n vm.lockinsertlocal = false;\r\n vm.updateSearch = updateSearch;\r\n vm.loading = false; /* CQR - 19/01/2021 - Loading no Botão Gravar */\r\n\r\n vm.sel_event = null;\r\n \r\n if($state.params.event) {\r\n vm.sel_event = $state.params.event;\r\n }else{ /* CQR - 08/11/2019 - Se não existir evento, vai buscar o 1º que já exista */\r\n vm.sel_event = {};\r\n vm.sel_event.id = Order.event_id;\r\n vm.sel_event.eventId = Order.event_id;\r\n }\r\n\r\n console.log(\"vm.sel_event:\");\r\n console.log(vm.sel_event);\r\n\r\nif($state.params.company_back) {\r\nconsole.log('=>' + $state.params.company_back);\r\n}\r\n\r\n vm.dtOptions = DTOptionsBuilder.newOptions()\r\n .withOption('dom','rt<\"bottom\"<\"left\"<\"info\"i>><\"right\"<\"pagination\"p>>>');\r\n\r\n vm.dtColumns = [\r\n DTColumnBuilder.newColumn('Codigo').withTitle('Cod'),\r\n DTColumnBuilder.newColumn('Description').withTitle('Artigo'),\r\n DTColumnBuilder.newColumn('qtd').withTitle('Qtd'),\r\n DTColumnBuilder.newColumn('sn').withTitle('S/N'),\r\n DTColumnBuilder.newColumn(null).withTitle('Actions').notSortable()\r\n .renderWith(actionsHtml).withOption('width', '100px'),\r\n DTColumnBuilder.newColumn('cod').notVisible()\r\n ];\r\n\r\n function createdRow(row, data, dataIndex) {\r\n $compile(angular.element(row).contents())($scope);\r\n }\r\n\r\n function actionsHtml(data, type, full, meta) {\r\n return '
'\r\n + ''\r\n + ''\r\n + '
';\r\n }\r\n\r\n function updateSearch(e){\r\n e.stopPropagation();\r\n }\r\n\r\n function showToast(msg) {\r\n var toast = $mdToast.simple()\r\n .content(msg)\r\n .highlightAction(true)\r\n .hideDelay(3000)\r\n .theme(\"success-toast\")\r\n .position('top right');\r\n\r\n $mdToast.show(toast);\r\n }\r\n\r\n vm.entrega_data=null;\r\n vm.articles = Order.articles;\r\n vm.familys = Order.familys;\r\n vm.brands = Order.brands;\r\n vm.subfamilies = Order.subfamilys;\r\n\r\n vm.record = Order.record ? Order.record : {localentrega: '', locallevantamento: '', tipopedido: 'Implementação'};\r\n\r\n vm.recordLabel = Order.record ? $translate.instant('ORDER.EDIT_RECORD')+' '+Order.record.DocumentID : $translate.instant('ORDER.NEW_RECORD');\r\n \r\n if(Order.lines) {\r\n vm.lockswitch = true;\r\n\r\n vm.record.localentrega = Order.record.UnloadAddress;\r\n vm.record.locallevantamento = Order.record.LoadAddress;\r\n vm.record.dataentrega = new Date(Order.record.PlanedShipmentDate.substring(0,10));\r\n vm.record.horaentrega = (Order.record.PlanedShipmentDate.split(\" \")[1]).substring(0,5);\r\n\r\n vm.record.datalevantamento = new Date(Order.record.RealShipmentDate.substring(0,10));\r\n vm.record.horalevantamento = (Order.record.RealShipmentDate.split(\" \")[1]).substring(0,5);\r\n\r\n vm.products = Order.lines;\r\n vm.lines = Order.lines;\r\n vm.record.contacto = Order.record.FreeField01;\r\n vm.record.notes = Order.record.Observation;\r\n\r\n if(vm.record.DocSerie == \"PI\") {\r\n vm.s_implementacao = true;\r\n vm.lockinsertlocal = true;\r\n }\r\n if(vm.record.DocSerie == \"PE\") {\r\n vm.s_entrega = true;\r\n }\r\n if(vm.record.DocSerie == \"PR\") {\r\n vm.s_levantamento = true;\r\n }\r\n }\r\n /*vm.clients = Local.clients;\r\n vm.assistences = Local.assistences;\r\n\r\n if(vm.record)\r\n Local.record.code = Local.record.code.trim();*/\r\n\r\n vm.gotoList = gotoList;\r\n vm.save = save;\r\n vm.save_aprovar = save_aprovar;\r\n vm.showCatalogo = showCatalogo;\r\n vm.showLocal = showLocal;\r\n vm.deleteConfirm = deleteConfirm;\r\n vm.changeImplementation = changeImplementation;\r\n vm.changeEntrega = changeEntrega;\r\n vm.changeLevantamento = changeLevantamento;\r\n\r\n vm.submitted = false;\r\n\r\n function changeImplementation() {\r\n if(!vm.s_implementacao) {\r\n //vm.record.contacto = '';\r\n }\r\n }\r\n\r\n function changeEntrega() {\r\n if(!vm.s_entrega) {\r\n vm.record.localentrega = '';\r\n vm.record.dataentrega = null;\r\n vm.record.horaentrega = '';\r\n }\r\n }\r\n\r\n function changeLevantamento() {\r\n if(!vm.s_levantamento) {\r\n vm.record.locallevantamento = '';\r\n vm.record.datalevantamento = null;\r\n vm.record.horalevantamento = '';\r\n }\r\n }\r\n\r\n function gotoList()\r\n {\r\n $state.go('app.orders', {event: vm.sel_event});\r\n }\r\n\r\n function save(record)\r\n {\r\n var msg = '';\r\n vm.loading = true;\r\n\r\n console.log('presave',record);\r\n\r\n if(Order.lines) {\r\n record.DocumentID = Order.record.DocumentID;\r\n if(vm.sel_event) {\r\n if(vm.sel_event.id)\r\n record.event_id = vm.sel_event.eventId;\r\n else\r\n record.event_id = vm.sel_event.eventId;\r\n } else {\r\n record.event_id = vm.record.EventID;\r\n }\r\n } else {\r\n /*record.event_id = (typeof vm.sel_event.id != 'undefined') ? vm.sel_event.eventId : vm.sel_event.eventId;*/\r\n record.event_id = (typeof vm.sel_event != 'undefined' && vm.sel_event !== null && typeof vm.sel_event.id != 'undefined') ? vm.sel_event.eventId : 0;\r\n record.CompanyID = localStorageService.get('sel_company');\r\n }\r\n\r\n record.s_implementacao = vm.s_implementacao;\r\n record.s_entrega = vm.s_entrega;\r\n record.s_levantamento = vm.s_levantamento;\r\n\r\n record.products = vm.products;\r\n record.UserID = localStorageService.get('user_id');\r\n record.DocumentStatus = 'Registado';\r\n record.Tipo = record.DocumentStatus == \"Execução\" ? \"A\" : \"E\";\r\n\r\n if(record.dataentrega != '' && typeof record.dataentrega != 'undefined') {\r\n record.dataentrega_f = record.dataentrega.getFullYear() + \r\n '-' + ('0' + (record.dataentrega.getMonth()+1)).slice(-2) + '-' + ('0' + record.dataentrega.getDate()).slice(-2) + ' ' + record.horaentrega;\r\n }\r\n\r\n if(record.datalevantamento != '' && typeof record.datalevantamento != 'undefined') {\r\n record.datalevantamento_f = record.datalevantamento.getFullYear() + \r\n '-' + ('0' + (record.datalevantamento.getMonth()+1)).slice(-2) + '-' + ('0' + record.datalevantamento.getDate()).slice(-2) + ' ' + record.horalevantamento;\r\n }\r\n\r\n api.orders.save({ record: record }).$promise.then(function (result) {\r\n if(record.id > 0)\r\n msg = $translate.instant('ORDER.UPDATE_MSG');\r\n else\r\n msg = $translate.instant('ORDER.INSERT_MSG');\r\n\r\n $state.go('app.orders', { showToastMessage: msg, event: vm.sel_event });\r\n\r\n vm.loading = false;\r\n });\r\n }\r\n\r\n function save_aprovar(record)\r\n {\r\n var msg = '';\r\n\r\n if(Order.lines) {\r\n record.DocumentID = Order.record.DocumentID;\r\n if(vm.sel_event) {\r\n if(vm.sel_event.id)\r\n record.event_id = vm.sel_event.id;\r\n else\r\n record.event_id = vm.sel_event.eventId;\r\n } else {\r\n record.event_id = vm.record.EventID;\r\n }\r\n\r\n } else {\r\n record.event_id = (typeof vm.sel_event.id != 'undefined') ? vm.sel_event.id : vm.sel_event.eventId;\r\n record.CompanyID = localStorageService.get('sel_company');\r\n }\r\n\r\n record.products = vm.products;\r\n record.UserID = localStorageService.get('user_id');\r\n record.DocumentStatus = 'Execução';\r\n record.Tipo = \"A\";\r\n\r\n if(record.dataentrega != '' && typeof record.dataentrega != 'undefined') {\r\n record.dataentrega_f = record.dataentrega.getFullYear() + \r\n '-' + ('0' + (record.dataentrega.getMonth()+1)).slice(-2) + '-' + ('0' + record.dataentrega.getDate()).slice(-2) + ' ' + record.horaentrega;\r\n }\r\n\r\n if(record.datalevantamento != '' && typeof record.datalevantamento != 'undefined') {\r\n record.datalevantamento_f = record.datalevantamento.getFullYear() + \r\n '-' + ('0' + (record.datalevantamento.getMonth()+1)).slice(-2) + '-' + ('0' + record.datalevantamento.getDate()).slice(-2) + ' ' + record.horalevantamento;\r\n }\r\n\r\n api.orders.save({ record: record }).$promise.then(function (result) {\r\n if(record.id > 0)\r\n msg = $translate.instant('ORDER.UPDATE_MSG');\r\n else\r\n msg = $translate.instant('ORDER.INSERT_MSG');\r\n\r\n $state.go('app.orders', { showToastMessage: msg, event: vm.sel_event });\r\n });\r\n }\r\n\r\n function deleteConfirm(record, ev)\r\n {\r\n var confirm = $mdDialog.confirm()\r\n .title( $translate.instant('ORDER.DELETE_QUESTION') )\r\n .htmlContent('' + record.Description + '' + $translate.instant('ORDER.DELETE_SENTENCE'))\r\n .ariaLabel('delete contact')\r\n .targetEvent(ev)\r\n .ok($translate.instant('ORDER.DELETE_YES'))\r\n .cancel($translate.instant('ORDER.DELETE_NO'));\r\n\r\n $mdDialog.show(confirm).then(function ()\r\n {\r\n var index = vm.products.indexOf(record);\r\n if (index > -1) {\r\n vm.products.splice(index, 1);\r\n showToast($translate.instant('ORDER.DELETE_MSG'));\r\n }\r\n\r\n /*api.locals.delete({ id: record.id }).$promise.then(function (record) {\r\n vm.totalRecords = vm.totalRecords - 1;\r\n vm.dtInstance.reloadData();\r\n showToast($translate.instant('ORDERS.DELETE_MSG'));\r\n });*/\r\n }, function ()\r\n {\r\n\r\n });\r\n }\r\n\r\n function showCatalogo(ev) {\r\n $mdDialog.show({\r\n controller: DialogController,\r\n templateUrl: 'app/main/pages/order/dialog/catalogo.tmpl.html',\r\n parent: angular.element(document.body),\r\n targetEvent: ev,\r\n clickOutsideToClose:true,\r\n hasBackdrop: true,\r\n selectedOption: 'test here',\r\n fullscreen: false // Only for -xs, -sm breakpoints.\r\n })\r\n .then(function(answer) {\r\n $scope.status = 'You said the information was \"' + answer + '\".';\r\n }, function() {\r\n $scope.status = 'You cancelled the dialog.';\r\n });\r\n\r\n }\r\n\r\n function showLocal(ev) {\r\n $mdDialog.show({\r\n controller: DialogLocalController,\r\n templateUrl: 'app/main/pages/order/dialog/local.tmpl.html',\r\n parent: angular.element(document.body),\r\n targetEvent: ev,\r\n clickOutsideToClose:true,\r\n hasBackdrop: true,\r\n selectedOption: 'test here',\r\n fullscreen: false // Only for -xs, -sm breakpoints.\r\n })\r\n .then(function(answer) {\r\n $scope.status = 'You said the information was \"' + answer + '\".';\r\n }, function() {\r\n $scope.status = 'You cancelled the dialog.';\r\n });\r\n\r\n }\r\n\r\n\r\n function DialogLocalController($scope, $mdDialog, $filter, api) {\r\n $scope.abc = vm.record;\r\n $scope.countrys = vm.countrys;\r\n $scope.record = null;\r\n $scope.hide = function() {\r\n $mdDialog.hide();\r\n };\r\n $scope.cancel = function() {\r\n $mdDialog.cancel();\r\n };\r\n $scope.save = function(src) {\r\n src.CompanyID = localStorageService.get('sel_company');\r\n api.locations.save({ record: src }).$promise.then(function (record) {\r\n vm.locations.push(record.location);\r\n vm.record.localentrega = record.location.id;\r\n vm.record.locallevantamento = record.location.id;\r\n $mdDialog.cancel();\r\n });\r\n }\r\n }\r\n\r\n function DialogController($scope, $mdDialog, $filter) {\r\n $scope.i = 0;\r\n $scope.articles = vm.articles;\r\n $scope.familys = vm.familys;\r\n $scope.subfamilies = vm.subfamilies;\r\n $scope.brands = vm.brands;\r\n $scope.familyId=null;\r\n $scope.subFamily=null;\r\n $scope.brandId=null;\r\n\r\n $scope.filterProducts = function() {\r\n if($scope.familyId) {\r\n $scope.aux = $filter('filter')(vm.articles, $scope.familyId);\r\n if($scope.brandId) {\r\n $scope.aux = $filter('filter')($scope.aux, $scope.brandId);\r\n }\r\n if($scope.subFamily) { \r\n $scope.aux = $filter('filter')($scope.aux, $scope.subFamily);\r\n }\r\n $scope.articles = $scope.aux;\r\n } else if($scope.brandId) { \r\n $scope.aux = $filter('filter')(vm.articles, $scope.brandId);\r\n if($scope.subFamily) { \r\n $scope.articles = $filter('filter')($scope.aux, $scope.subFamily); \r\n }\r\n $scope.articles = $scope.aux; \r\n } else if($scope.subFamily) {\r\n $scope.articles = $filter('filter')(vm.articles, $scope.subFamily); \r\n } else {\r\n $scope.articles = vm.articles;\r\n }\r\n }\r\n\r\n function clone(obj) {\r\n if (null == obj || \"object\" != typeof obj) return obj;\r\n var copy = obj.constructor();\r\n for (var attr in obj) {\r\n if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];\r\n }\r\n return copy;\r\n }\r\n \r\n $scope.copyModel = function() {\r\n console.log(\"copyModel\");\r\n $scope.filterProducts(); /* Reset vm.articles list in case of delete */\r\n $scope.aux1 = $scope.articles;\r\n $scope.aux2 = [];\r\n $scope.obj = {};\r\n angular.forEach($scope.aux1, function(value, key) { \r\n if(value.Codigo.toString().toLowerCase().indexOf($scope.search.toLowerCase()) > -1 || value.Description.toString().toLowerCase().indexOf($scope.search.toLowerCase()) > -1){\r\n $scope.obj = clone(value);\r\n $scope.aux2.push($scope.obj); \r\n }\r\n });\r\n \r\n $scope.articles = $scope.aux2;\r\n }\r\n\r\n $scope.clearFilters = function() {\r\n /* $scope.familyId = null;\r\n // $scope.subFamily = null;\r\n // $scope.brandId = null;\r\n // $scope.pesquisa = ''; */\r\n $scope.pesquisa.Family = undefined;\r\n $scope.pesquisa.SubFamily = undefined;\r\n $scope.pesquisa.BrandID = undefined;\r\n $scope.search=undefined;\r\n $scope.articles = vm.articles;\r\n }\r\n\r\n\r\n $scope.add = function(cod) {\r\n var result = vm.articles.filter(function( obj ) {\r\n return obj.Codigo == cod;\r\n });\r\n var status = true;\r\n var aux = vm.products;\r\n angular.forEach(aux, function(value, key){\r\n if(value.Codigo == cod) {\r\n var index = vm.products.indexOf(value);\r\n\r\n if (index > -1) {\r\n vm.products.splice(index, 1);\r\n }\r\n\r\n var obj = result[0];\r\n if(obj.hasOwnProperty('qtd')) {\r\n obj.qtd = value.qtd +1;\r\n } else {\r\n obj.qtd = 1;\r\n } \r\n vm.products.push(obj);\r\n status = false;\r\n }\r\n });\r\n if(status) {\r\n var obj = result[0];\r\n if(obj.hasOwnProperty('qtd')) {\r\n } else {\r\n obj.qtd = 1;\r\n }\r\n vm.products.push(obj);\r\n }\r\n $mdDialog.hide();\r\n }\r\n $scope.hide = function() {\r\n $mdDialog.hide();\r\n };\r\n $scope.filterFamily = function() {\r\n $scope.i = 0;\r\n $scope.articles = $filter('filter')(vm.articles, $scope.familyId);\r\n }\r\n /*$scope.filterProducts = function() {\r\n $scope.i = 0;\r\n $scope.aux = vm.articles;\r\n if($scope.familyId) {\r\n console.log('f');\r\n $scope.articles = $filter('filter')($scope.aux , $scope.familyId); \r\n }\r\n if($scope.brandId) {\r\n console.log('b');\r\n $scope.articles = $filter('filter')($scope.aux , $scope.brandId);\r\n\r\n }\r\n }*/\r\n $scope.cancel = function() {\r\n $mdDialog.cancel();\r\n };\r\n $scope.prev = function() {\r\n $scope.i = $scope.i -1;\r\n if($scope.i<0) {\r\n $scope.i = $scope.articles.length-1;\r\n }\r\n }\r\n $scope.next = function() {\r\n $scope.i = $scope.i +1;\r\n if($scope.i == $scope.articles.length) {\r\n $scope.i = 0;\r\n }\r\n }\r\n $scope.answer = function(answer) {\r\n $mdDialog.hide(answer);\r\n };\r\n }\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.events', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider)\r\n {\r\n $stateProvider\r\n .state('app.events', {\r\n url : '/events',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/pages/events/events.html',\r\n controller : 'EventsController as vm'\r\n }\r\n },\r\n params: {\r\n showToastMessage : null,\r\n client : null\r\n }\r\n });\r\n\r\n $translatePartialLoaderProvider.addPart('app/main/pages/events');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.events')\r\n .controller('EventsController', EventsController);\r\n\r\n /** @ngInject */\r\n function EventsController($compile, api, $scope, $mdToast, $state, $translate, $cookies, localStorageService, $mdDialog, $window, DTOptionsBuilder, DTColumnBuilder, CONFIG, $mdSidenav)\r\n {\r\n console.log(\"EventsController\");\r\n\r\n var vm = this;\r\n vm.dtInstance = {};\r\n vm.topfilter = '';\r\n vm.permPrefix = \"Eventos_\";\r\n vm.perms = '';\r\n vm.sel_company = localStorageService.get('sel_company');\r\n\r\n vm.routes = null;\r\n\r\n vm.clients = null;\r\n vm.sel_client = null;\r\n vm.sel_client_id = null;\r\n \r\n if($state.params.client) {\r\n vm.sel_client = $state.params.client;\r\n vm.sel_client_id = $state.params.client.id;\r\n vm.topfilter = $state.params.client.client;\r\n }\r\n\r\n if($state.params.showToastMessage) {\r\n showToast($state.params.showToastMessage);\r\n }\r\n\r\n function showToast(msg) {\r\n var toast = $mdToast.simple()\r\n .content(msg)\r\n .highlightAction(true)\r\n .hideDelay(3000)\r\n .theme(\"success-toast\")\r\n .position('top right');\r\n\r\n $mdToast.show(toast);\r\n }\r\n\r\n function updateSearch(e){\r\n e.stopPropagation();\r\n }\r\n\r\n function toggleSidenav(sidenavId) {\r\n $mdSidenav(sidenavId).toggle();\r\n }\r\n\r\n function actionsHtml(data, type, full, meta) {\r\n if(data.nrPedidos) {\r\n return '
'\r\n + ''\r\n + ''\r\n + '
';\r\n } else {\r\n return '
'\r\n + ''\r\n + ''\r\n + '
';\r\n }\r\n }\r\n\r\n function documentsHtml(data, type, full, meta) {\r\n var r = '';\r\n if(data.sel_docs.length > 0) {\r\n for(var i=0 ; i'\r\n + '' + data.sel_docs[i].data_fim\r\n + ''\r\n + 'T' + data.sel_docs[i].id\r\n + '';\r\n }\r\n\r\n return r;\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n function routesHtml(data, type, full, meta) {\r\n return '{{route.route}}';\r\n }\r\n\r\n function createdRow(row, data, dataIndex) {\r\n $compile(angular.element(row).contents())($scope);\r\n }\r\n\r\n vm.dtOptions = DTOptionsBuilder.newOptions()\r\n .withOption('ajax', {\r\n url: CONFIG.apiBaseUrlJson + '/json/events.php',\r\n type: 'POST',\r\n \"dataSrc\": function(json) {\r\n console.log(json);\r\n vm.perms = json.perms;\r\n return json.data;\r\n },\r\n \"data\": function(d){\r\n d.search['value'] = vm.seach_keyword;\r\n d.sel_company = localStorageService.get('sel_company');\r\n d.profile = localStorageService.get('profile');\r\n }\r\n })\r\n .withOption('dom','rt<\"bottom\"<\"left\"<\"info\"i>><\"right\"<\"pagination\"p>>>')\r\n .withDataProp('data')\r\n .withOption('processing', true)\r\n .withOption('serverSide', true)\r\n .withOption('filter', false)\r\n .withOption('scrollY', 'auto')\r\n .withOption('bLengthChange', true)\r\n .withOption('responsive',true)\r\n .withPaginationType('full_numbers')\r\n .withOption('createdRow', createdRow)\r\n .withOption('rowCallback', function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {\r\n\r\n $('td:eq(0), td:eq(1), td:eq(2), #edit_btn', nRow).css('cursor', 'pointer');\r\n $('td:eq(0), td:eq(1), td:eq(2), #edit_btn', nRow).unbind('click');\r\n $('td:eq(0), td:eq(1), td:eq(2), #edit_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.gotoDetail(aData.eventId);\r\n return nRow;\r\n });\r\n });\r\n $('#del_btn', nRow).unbind('click');\r\n $('#del_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.deleteConfirm(aData);\r\n return nRow;\r\n });\r\n });\r\n $('#lines_btn', nRow).unbind('click');\r\n $('#lines_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.gotoOrders(aData);\r\n return nRow;\r\n });\r\n });\r\n })\r\n //.withOption('order', [7, 'desc'])\r\n .withOption('initComplete', function(){\r\n var api = this.api(),\r\n searchBox = angular.element('body').find('#e-commerce-products-search');\r\n\r\n vm.totalRecords = api.page.info().recordsTotal;\r\n vm.totalRecordsFiltered = api.page.info().recordsDisplay;\r\n\r\n if ( searchBox.length > 0 ) {\r\n searchBox.on('keyup', function (event) {\r\n vm.seach_keyword = event.target.value;\r\n vm.dtInstance.reloadData();\r\n });\r\n }\r\n $('th').css('background-color', '#2d323e');\r\n $('th').css('color', '#fff');\r\n $('th:eq(3)').css('text-align', 'center');\r\n $('th:last-child').css('text-align', 'center');\r\n })\r\n .withLanguage({\r\n \"sInfo\": $translate.instant('EVENTS.TABLE_INFO'),\r\n \"paginate\": {\r\n \"first\": $translate.instant('EVENTS.TABLE_BUT_FIRST'),\r\n \"last\": $translate.instant('EVENTS.TABLE_BUT_LAST'),\r\n \"next\": $translate.instant('EVENTS.TABLE_BUT_NEXT'),\r\n \"previous\": $translate.instant('EVENTS.TABLE_BUT_PREVIOUS')\r\n }\r\n });\r\n\r\n vm.dtColumns = [\r\n DTColumnBuilder.newColumn('title').withTitle($translate.instant('EVENTS.TABLE_EVENT')),\r\n DTColumnBuilder.newColumn('StartDate').withTitle($translate.instant('EVENTS.TABLE_STARTDATE')),\r\n DTColumnBuilder.newColumn('EndDate').withTitle($translate.instant('EVENTS.TABLE_ENDDATE')),\r\n DTColumnBuilder.newColumn(null).withTitle($translate.instant('EVENTS.TABLE_ACTIONS')).notSortable()\r\n .renderWith(actionsHtml).withOption('width', '100px'),\r\n DTColumnBuilder.newColumn('eventId').notVisible()\r\n ];\r\n\r\n vm.filterClients = filterClients;\r\n vm.loadClients = loadClients;\r\n vm.selectRoute = selectRoute;\r\n vm.loadRoutes = loadRoutes;\r\n vm.checkPerm = checkPerm;\r\n\r\n function checkPerm(perm) {\r\n if(vm.perms.indexOf(vm.permPrefix+perm)>-1) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /* FILTERS */\r\n function filterClients() {\r\n if(vm.sel_client) {\r\n vm.sel_client_id = vm.sel_client.id;\r\n vm.dtInstance.reloadData();\r\n }\r\n }\r\n\r\n /* LOADS */\r\n function loadClients() {\r\n var promisse = api.clients.get().$promise;\r\n promisse.then(function (collection) {\r\n vm.clients = collection.records;\r\n });\r\n }\r\n\r\n function loadRoutes(routeId) {\r\n /*console.log(\"OK\");\r\n var a = $('#select_'+routeId);\r\n console.log(a);*/\r\n }\r\n\r\n function selectRoute(localId) {\r\n var aux = \"route_\" + localId;\r\n $scope.routes = [];\r\n angular.forEach($scope[aux], function(value, key) {\r\n $scope.record = {\r\n routeId : value.id,\r\n localId : localId\r\n };\r\n $scope.routes.push($scope.record);\r\n });\r\n api.routelocals.save({ record: $scope.routes }).$promise.then(function (result) {\r\n });\r\n }\r\n\r\n\r\n // Methods\r\n vm.gotoDetail = gotoDetail;\r\n vm.deleteConfirm = deleteConfirm;\r\n vm.toggleSidenav = toggleSidenav;\r\n vm.updateSearch = updateSearch;\r\n vm.haveFilters = haveFilters;\r\n vm.clearFilters = clearFilters;\r\n vm.gotoOrders = gotoOrders;\r\n\r\n function gotoOrders(src)\r\n {\r\n $state.go('app.orders', {event: src});\r\n }\r\n\r\n function haveFilters()\r\n {\r\n if(vm.sel_client_id > 0)\r\n return true;\r\n else\r\n return false;\r\n }\r\n\r\n function clearFilters()\r\n {\r\n vm.sel_client_id = null;\r\n vm.sel_client = null;\r\n vm.dtInstance.reloadData();\r\n }\r\n\r\n function gotoDetail(id)\r\n {\r\n $state.go('app.event', {id: id});\r\n }\r\n\r\n function deleteConfirm(record, ev)\r\n {\r\n var confirm = $mdDialog.confirm()\r\n .title( $translate.instant('EVENTS.DELETE_QUESTION') )\r\n .htmlContent('' + record.title + '' + $translate.instant('EVENTS.DELETE_SENTENCE'))\r\n .ariaLabel('delete contact')\r\n .targetEvent(ev)\r\n .ok($translate.instant('EVENTS.DELETE_YES'))\r\n .cancel($translate.instant('EVENTS.DELETE_NO'));\r\n\r\n $mdDialog.show(confirm).then(function ()\r\n {\r\n api.events.delete({ id: record.eventId }).$promise.then(function (record) {\r\n vm.totalRecords = vm.totalRecords - 1;\r\n vm.dtInstance.reloadData();\r\n showToast($translate.instant('EVENTS.DELETE_MSG'));\r\n });\r\n }, function ()\r\n {\r\n\r\n });\r\n }\r\n //////////\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.event', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider, $mdDateLocaleProvider)\r\n {\r\n $mdDateLocaleProvider.formatDate = function(date) {\r\n return moment(date).format('YYYY-MM-DD');\r\n };\r\n\r\n $stateProvider\r\n .state('app.event', {\r\n url : '/event/:id',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/pages/event/event.html',\r\n controller : 'EventController as vm'\r\n }\r\n },\r\n resolve : {\r\n Event: function (api, $stateParams, localStorageService)\r\n {\r\n return api.events.get({ id: $stateParams.id, profile: localStorageService.get('profile') }).$promise;\r\n }\r\n },\r\n bodyClass: 'e-commerce'\r\n });\r\n\r\n $translatePartialLoaderProvider.addPart('app/main/pages/event');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.event')\r\n .controller('EventController', EventController);\r\n\r\n function EventController($scope, $document, $state, Event, api, $window, $translate, localStorageService)\r\n {\r\n console.log(\"EventController\", Event);\r\n\r\n var vm = this;\r\n\r\n if(Event.record) {\r\n vm.create_user = 'Criado por: ' + Event.user;\r\n vm.nrPedidos = Event.pedidos;\r\n vm.record = Event.record;\r\n vm.record.StartDate = new Date(vm.record.StartDate);\r\n vm.record.EndDate = new Date(vm.record.EndDate);\r\n vm.recordLabel = Event.record.EventDescription;\r\n vm.IsActive = Event.record.IsActive ==1 ? true : false;\r\n } else {\r\n vm.create_user = \"\";\r\n vm.nrPedidos = 0;\r\n vm.IsActive = true;\r\n vm.record = null;\r\n vm.recordLabel = $translate.instant('EVENT.NEW_RECORD');\r\n }\r\n\r\n vm.perms = Event.perms;\r\n vm.permPrefix = \"Eventos_\";\r\n //vm.clients = Local.clients;\r\n //vm.assistences = Local.assistences;\r\n\r\n //if(vm.record)\r\n // Local.record.code = Local.record.code.trim();\r\n\r\n vm.gotoList = gotoList;\r\n vm.save = save;\r\n vm.checkPerm = checkPerm;\r\n\r\n function checkPerm(perm) {\r\n if(vm.perms.indexOf(vm.permPrefix+perm)>-1) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n vm.submitted = false;\r\n\r\n function gotoList()\r\n {\r\n $state.go('app.events');\r\n }\r\n\r\n function save(record)\r\n {\r\n var msg = '';\r\n\r\n var datai = record.StartDate.getFullYear() + '-' + ('0' + (record.StartDate.getMonth()+1)).slice(-2) + '-'+ ('0' + record.StartDate.getDate()).slice(-2);\r\n var dataf = record.EndDate.getFullYear() + '-' + ('0' + (record.EndDate.getMonth()+1)).slice(-2) + '-'+ ('0' + record.EndDate.getDate()).slice(-2);\r\n\r\n record.CompanyID = localStorageService.get('sel_company');\r\n record.user_id = localStorageService.get('user_id');\r\n record.datai = datai;\r\n record.dataf = dataf;\r\n record.IsActive = vm.IsActive ? 1 : 0;\r\n\r\n api.events.save({ record: record }).$promise.then(function (result) {\r\n if(record.id != '')\r\n msg = $translate.instant('EVENT.UPDATE_MSG');\r\n else\r\n msg = $translate.instant('EVENT.INSERT_MSG');\r\n\r\n $state.go('app.events', { showToastMessage: msg });\r\n });\r\n }\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.catalog', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider)\r\n {\r\n $stateProvider\r\n .state('app.catalog', {\r\n url : '/catalog/:id',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/pages/catalog/catalog.html',\r\n controller : 'CatalogController as vm'\r\n }\r\n },\r\n resolve : {\r\n Catalog: function (api, $stateParams, localStorageService)\r\n {\r\n return api.articles.get({ id: 0, company: localStorageService.get('sel_company')}).$promise;\r\n }\r\n },\r\n bodyClass: 'e-commerce'\r\n });\r\n\r\n $translatePartialLoaderProvider.addPart('app/main/pages/catalog');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.catalog')\r\n .controller('CatalogController', CatalogController);\r\n\r\n function CatalogController($scope, $document, $state, Catalog, api, $window, $translate, $filter)\r\n {\r\n var vm = this;\r\n\r\n vm.articles = Catalog.records;\r\n vm.familys = Catalog.familys;\r\n vm.subfamilies = Catalog.subfamilys;\r\n vm.brands = Catalog.brands;\r\n vm.familyId=null; \r\n vm.pesquisa={};\r\n vm.brandId=null;\r\n vm.subFamily=null;\r\n vm.search=null;\r\n\r\n vm.gotoDetail = gotoDetail;\r\n vm.filterProducts = filterProducts;\r\n vm.clearFilters = clearFilters;\r\n vm.copyModel = copyModel;\r\n\r\n function clearFilters() {\r\n vm.pesquisa.Family = undefined;\r\n vm.pesquisa.SubFamily = undefined;\r\n vm.pesquisa.BrandID = undefined;\r\n vm.search=undefined;\r\n vm.articles = Catalog.records;\r\n }\r\n\r\n function clone(obj) {\r\n if (null == obj || \"object\" != typeof obj) return obj;\r\n var copy = obj.constructor();\r\n for (var attr in obj) {\r\n if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];\r\n }\r\n return copy;\r\n }\r\n\r\n function copyModel() {\r\n console.log(\"copyModel\");\r\n filterProducts(); /* Reset vm.articles list in case of delete */\r\n vm.aux1 = vm.articles;\r\n vm.aux2 = [];\r\n vm.obj = {};\r\n angular.forEach(vm.aux1, function(value, key) { \r\n if(value.Codigo.toString().toLowerCase().indexOf(vm.search.toLowerCase()) > -1 || value.Description.toString().toLowerCase().indexOf(vm.search.toLowerCase()) > -1){\r\n vm.obj = clone(value);\r\n vm.aux2.push(vm.obj); \r\n }\r\n });\r\n\r\n vm.articles = vm.aux2;\r\n }\r\n\r\n function filterProducts() {\r\n if(vm.familyId) {\r\n vm.aux = $filter('filter')(Catalog.records, vm.familyId);\r\n if(vm.brandId) {\r\n vm.aux = $filter('filter')(vm.aux, vm.brandId);\r\n }\r\n if(vm.subFamily) {\r\n vm.aux = $filter('filter')(vm.aux, vm.subFamily);\r\n }\r\n vm.articles = vm.aux;\r\n } else if(vm.brandId) {\r\n vm.aux = $filter('filter')(Catalog.records, vm.brandId);\r\n if(vm.subFamily) {\r\n vm.aux = $filter('filter')(vm.aux, vm.subFamily);\r\n }\r\n vm.articles = vm.aux;\r\n } else if(vm.subFamily) {\r\n vm.articles = $filter('filter')(vm.articles, vm.subFamily);\r\n } else {\r\n vm.articles = Catalog.records;\r\n }\r\n }\r\n\r\n function gotoDetail(src)\r\n {\r\n $state.go('app.article', {id: src, catalog: true});\r\n }\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.calendar')\r\n .controller('CalendarController', CalendarController);\r\n\r\n /** @ngInject */\r\n function CalendarController($mdDialog, $document, $state, Events, localStorageService,$translate)\r\n {\r\n var vm = this;\r\n vm.profile = localStorageService.get('profile');\r\n\r\n console.log(\"TESTE:\",Events);\r\n\r\n // Data\r\n var date = new Date();\r\n var d = date.getDate();\r\n var m = date.getMonth();\r\n var y = date.getFullYear();\r\n var events = [];\r\n var i=1;\r\n\r\n Events.records.forEach(function(entry) {\r\n entry.eventId = entry.id;\r\n entry.EventCompany = entry.CompanyID;\r\n entry.id = i;\r\n\r\n if(entry.IsActive == 0) {\r\n entry.color = 'grey';\r\n } else {\r\n if(entry.activos > 0) {\r\n entry.color = 'green';\r\n } else {\r\n if(entry.inactivos > 0) {\r\n entry.color = 'red';\r\n } else {\r\n entry.color = 'blue';\r\n }\r\n }\r\n }\r\n events.push(entry);\r\n i++;\r\n });\r\n\r\n vm.events = [events];\r\n vm.nrEvents = i-1;\r\n vm.nrRegistados = Events.registados;\r\n vm.nrAprovados = Events.aprovados;\r\n vm.eventossempedidos = Events.eventossempedidos;\r\n vm.pedidosporresponder = Events.pedidosporresponder;\r\n \r\n vm.march=$translate.instant('CALENDAR.MARCH');\r\n vm.march=vm.march.replace(\"Março\", \"Março\");\r\n\r\n vm.calendarUiConfig = {\r\n calendar: {\r\n //editable : true,\r\n eventLimit : true,\r\n header : '',\r\n handleWindowResize: false,\r\n aspectRatio : 1,\r\n dayNames : ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'],\r\n dayNamesShort : [$translate.instant('CALENDAR.SUN'), $translate.instant('CALENDAR.MON'), $translate.instant('CALENDAR.TUE'), $translate.instant('CALENDAR.WED'), $translate.instant('CALENDAR.THU'), $translate.instant('CALENDAR.FRI'), $translate.instant('CALENDAR.SAT')],\r\n monthNames : [$translate.instant('CALENDAR.JANUARY'),$translate.instant('CALENDAR.FEBRUARY'),vm.march,$translate.instant('CALENDAR.APRIL'),$translate.instant('CALENDAR.MAY'),$translate.instant('CALENDAR.JUNE'),$translate.instant('CALENDAR.JULY'),$translate.instant('CALENDAR.AUGUST'),$translate.instant('CALENDAR.SEPTEMBER'),$translate.instant('CALENDAR.OCTOBER'),$translate.instant('CALENDAR.NOVEMBER'),$translate.instant('CALENDAR.DECEMBER')],\r\n viewRender : function (view)\r\n {\r\n vm.calendarView = view;\r\n vm.calendar = vm.calendarView.calendar;\r\n vm.currentMonthShort = vm.calendar.getDate().format('MMM');\r\n },\r\n columnFormat : {\r\n month: 'ddd',\r\n week : 'ddd D',\r\n day : 'ddd M'\r\n },\r\n eventClick : eventDetail,\r\n selectable : true,\r\n selectHelper : true,\r\n select : select,\r\n displayEventTime: false\r\n }\r\n };\r\n\r\n // Methods\r\n vm.addEvent = addEvent;\r\n vm.next = next;\r\n vm.prev = prev;\r\n\r\n //////////\r\n\r\n /**\r\n * Go to next on current view (week, month etc.)\r\n */\r\n function next()\r\n {\r\n vm.calendarView.calendar.next();\r\n }\r\n\r\n /**\r\n * Go to previous on current view (week, month etc.)\r\n */\r\n function prev()\r\n {\r\n vm.calendarView.calendar.prev();\r\n }\r\n\r\n /**\r\n * Show event detail\r\n *\r\n * @param calendarEvent\r\n * @param e\r\n */\r\n function eventDetail(calendarEvent, e)\r\n {\r\n $state.go('app.orders', {event: calendarEvent});\r\n }\r\n\r\n /**\r\n * Add new event in between selected dates\r\n *\r\n * @param start\r\n * @param end\r\n * @param e\r\n */\r\n function select(start, end, event)\r\n {\r\n showEventFormDialog('add', false, start, end, event);\r\n }\r\n\r\n /**\r\n * Add event\r\n *\r\n * @param e\r\n */\r\n function addEvent(event)\r\n {\r\n var start = new Date(),\r\n end = new Date();\r\n\r\n showEventFormDialog('add', false, start, end, event);\r\n }\r\n\r\n /**\r\n * Show event detail dialog\r\n * @param calendarEvent\r\n * @param e\r\n */\r\n function showEventDetailDialog(calendarEvent, event)\r\n {\r\n $mdDialog.show({\r\n controller : 'EventDetailDialogController',\r\n controllerAs : 'vm',\r\n templateUrl : 'app/main/apps/calendar/dialogs/event-detail/event-detail-dialog.html',\r\n parent : angular.element($document.body),\r\n targetEvent : event,\r\n clickOutsideToClose: true,\r\n locals : {\r\n calendarEvent : calendarEvent,\r\n showEventFormDialog: showEventFormDialog,\r\n event : event\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Show event add/edit form dialog\r\n *\r\n * @param type\r\n * @param calendarEvent\r\n * @param start\r\n * @param end\r\n * @param e\r\n */\r\n function showEventFormDialog(type, calendarEvent, start, end, event)\r\n {\r\n var dialogData = {\r\n type : type,\r\n calendarEvent: calendarEvent,\r\n start : start,\r\n end : end\r\n };\r\n\r\n $mdDialog.show({\r\n controller : 'EventFormDialogController',\r\n controllerAs : 'vm',\r\n templateUrl : 'app/main/apps/calendar/dialogs/event-form/event-form-dialog.html',\r\n parent : angular.element($document.body),\r\n targetEvent : event,\r\n clickOutsideToClose: true,\r\n locals : {\r\n dialogData: dialogData\r\n }\r\n }).then(function (response)\r\n {\r\n switch ( response.type )\r\n {\r\n case 'add':\r\n // Add new\r\n vm.events[0].push({\r\n id : vm.events[0].length + 20,\r\n title: response.calendarEvent.title,\r\n start: response.calendarEvent.start,\r\n end : response.calendarEvent.end\r\n });\r\n break;\r\n\r\n case 'edit':\r\n // Edit\r\n for ( var i = 0; i < vm.events[0].length; i++ )\r\n {\r\n // Update\r\n if ( vm.events[0][i].id === response.calendarEvent.id )\r\n {\r\n vm.events[0][i] = {\r\n title: response.calendarEvent.title,\r\n start: response.calendarEvent.start,\r\n end : response.calendarEvent.end\r\n };\r\n\r\n break;\r\n }\r\n }\r\n break;\r\n\r\n case 'remove':\r\n // Remove\r\n for ( var j = 0; j < vm.events[0].length; j++ )\r\n {\r\n // Update\r\n if ( vm.events[0][j].id === response.calendarEvent.id )\r\n {\r\n vm.events[0].splice(j, 1);\r\n\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n });\r\n }\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.articles', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider)\r\n {\r\n $stateProvider\r\n .state('app.articles', {\r\n url : '/articles',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/pages/articles/articles.html',\r\n controller : 'ArticlesController as vm'\r\n }\r\n },\r\n params: {\r\n showToastMessage : null,\r\n client : null\r\n }\r\n });\r\n\r\n $translatePartialLoaderProvider.addPart('app/main/pages/articles');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.articles')\r\n .controller('ArticlesController', ArticlesController);\r\n\r\n /** @ngInject */\r\n function ArticlesController($compile, api, $scope, $mdToast, $state, $translate, $cookies, localStorageService, $mdDialog, $window, DTOptionsBuilder, DTColumnBuilder, CONFIG, $mdSidenav)\r\n {\r\n console.log(\"ArticlesController\");\r\n\r\n var vm = this;\r\n vm.dtInstance = {};\r\n vm.topfilter = '';\r\n\r\n vm.changestatus = changestatus;\r\n\r\n vm.permPrefix = \"Produtos_\"\r\n vm.perms = '';\r\n\r\n vm.routes = null;\r\n\r\n vm.clients = null;\r\n vm.sel_client = null;\r\n vm.sel_client_id = null;\r\n \r\n if($state.params.client) {\r\n vm.sel_client = $state.params.client;\r\n vm.sel_client_id = $state.params.client.id;\r\n vm.topfilter = $state.params.client.client;\r\n }\r\n\r\n if($state.params.showToastMessage) {\r\n showToast($state.params.showToastMessage);\r\n }\r\n\r\n function changestatus(articleId, status, elem) {\r\n\r\n api.articles.save({ id: articleId, status: status }).$promise.then(function (response) {\r\n var rows = vm.dtInstance.DataTable.rows().data();\r\n for(var i=0; i'\r\n /*+ ''\r\n + ''\r\n + ''\r\n + ''\r\n + ''\r\n + ''*/\r\n + ''\r\n + ''\r\n + ''\r\n + '';\r\n }\r\n\r\n function documentsHtml(data, type, full, meta) {\r\n var r = '';\r\n if(data.sel_docs.length > 0) {\r\n for(var i=0 ; i'\r\n + '' + data.sel_docs[i].data_fim\r\n + ''\r\n + 'T' + data.sel_docs[i].id\r\n + '';\r\n }\r\n\r\n return r;\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n function routesHtml(data, type, full, meta) {\r\n return '{{route.route}}';\r\n }\r\n\r\n function createdRow(row, data, dataIndex) {\r\n $compile(angular.element(row).contents())($scope);\r\n }\r\n\r\n vm.dtOptions = DTOptionsBuilder.newOptions()\r\n .withOption('ajax', {\r\n url: CONFIG.apiBaseUrlJson + 'json/articles.php',\r\n type: 'POST',\r\n \"dataSrc\": function(json) {\r\n vm.perms = json.perms;\r\n return json.data;\r\n },\r\n \"data\": function(d){\r\n d.search['value'] = vm.seach_keyword;\r\n d.sel_company = localStorageService.get('sel_company');\r\n d.profile = localStorageService.get('profile');\r\n }\r\n })\r\n .withOption('dom','rt<\"bottom\"<\"left\"<\"info\"i>><\"right\"<\"pagination\"p>>>')\r\n .withDataProp('data')\r\n .withOption('processing', true)\r\n .withOption('serverSide', true)\r\n .withOption('filter', false)\r\n .withOption('scrollY', 'auto')\r\n .withOption('bLengthChange', true)\r\n .withOption('responsive',true)\r\n .withPaginationType('full_numbers')\r\n .withOption('createdRow', createdRow)\r\n .withOption('rowCallback', function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {\r\n\r\n $('td:eq(0), td:eq(1), td:eq(2), #edit_btn', nRow).css('cursor', 'pointer');\r\n $('td:eq(0), td:eq(1), td:eq(2), #edit_btn', nRow).unbind('click');\r\n $('td:eq(0), td:eq(1), td:eq(2), #edit_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.gotoDetail(aData.id);\r\n return nRow;\r\n });\r\n });\r\n $('#del_btn', nRow).unbind('click');\r\n $('#del_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.deleteConfirm(aData);\r\n return nRow;\r\n });\r\n });\r\n $('#lines_btn', nRow).unbind('click');\r\n $('#lines_btn', nRow).bind('click', function() {\r\n $scope.$apply(function() {\r\n vm.gotoEquipments(aData);\r\n return nRow;\r\n });\r\n });\r\n })\r\n //.withOption('order', [7, 'desc'])\r\n .withOption('initComplete', function(){\r\n var api = this.api(),\r\n searchBox = angular.element('body').find('#e-commerce-products-search');\r\n\r\n vm.totalRecords = api.page.info().recordsTotal;\r\n vm.totalRecordsFiltered = api.page.info().recordsDisplay;\r\n\r\n if ( searchBox.length > 0 ) {\r\n searchBox.on('keyup', function (event) {\r\n vm.seach_keyword = event.target.value;\r\n vm.dtInstance.reloadData();\r\n });\r\n }\r\n $('th').css('background-color', '#2d323e');\r\n $('th').css('color', '#fff');\r\n $('th:eq(3)').css('text-align', 'center');\r\n $('th:last-child').css('text-align', 'center');\r\n })\r\n .withLanguage({\r\n \"sInfo\": $translate.instant('ARTICLES.TABLE_INFO'),\r\n \"paginate\": {\r\n \"first\": $translate.instant('ARTICLES.TABLE_BUT_FIRST'),\r\n \"last\": $translate.instant('ARTICLES.TABLE_BUT_LAST'),\r\n \"next\": $translate.instant('ARTICLES.TABLE_BUT_NEXT'),\r\n \"previous\": $translate.instant('ARTICLES.TABLE_BUT_PREVIOUS')\r\n }\r\n });\r\n\r\n vm.dtColumns = [\r\n DTColumnBuilder.newColumn('description').withTitle($translate.instant('ARTICLES.TABLE_DESCRIPTION')),\r\n DTColumnBuilder.newColumn('family').withTitle($translate.instant('ARTICLES.TABLE_FAMILY')),\r\n DTColumnBuilder.newColumn('type').withTitle($translate.instant('ARTICLES.TABLE_TYPE')),\r\n DTColumnBuilder.newColumn('brandid').withTitle($translate.instant('ARTICLES.TABLE_BRAND')),\r\n DTColumnBuilder.newColumn('stock').withTitle($translate.instant('ARTICLES.TABLE_STOCK')),\r\n DTColumnBuilder.newColumn(null).withTitle($translate.instant('ARTICLES.TABLE_ACTIONS')).notSortable()\r\n .renderWith(actionsHtml).withOption('width', '100px'),\r\n DTColumnBuilder.newColumn('id').notVisible()\r\n ];\r\n\r\n vm.filterClients = filterClients;\r\n vm.loadClients = loadClients;\r\n vm.selectRoute = selectRoute;\r\n vm.loadRoutes = loadRoutes;\r\n vm.checkPerm = checkPerm;\r\n\r\n function checkPerm(perm) {\r\n if(vm.perms.indexOf(vm.permPrefix+perm)>-1) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /* FILTERS */\r\n function filterClients() {\r\n if(vm.sel_client) {\r\n vm.sel_client_id = vm.sel_client.id;\r\n vm.dtInstance.reloadData();\r\n }\r\n }\r\n\r\n /* LOADS */\r\n function loadClients() {\r\n var promisse = api.clients.get().$promise;\r\n promisse.then(function (collection) {\r\n vm.clients = collection.records;\r\n });\r\n }\r\n\r\n function loadRoutes(routeId) {\r\n /*console.log(\"OK\");\r\n var a = $('#select_'+routeId);\r\n console.log(a);*/\r\n }\r\n\r\n function selectRoute(localId) {\r\n var aux = \"route_\" + localId;\r\n $scope.routes = [];\r\n angular.forEach($scope[aux], function(value, key) {\r\n $scope.record = {\r\n routeId : value.id,\r\n localId : localId\r\n };\r\n $scope.routes.push($scope.record);\r\n });\r\n api.routelocals.save({ record: $scope.routes }).$promise.then(function (result) {\r\n });\r\n }\r\n\r\n\r\n // Methods\r\n vm.gotoDetail = gotoDetail;\r\n vm.deleteConfirm = deleteConfirm;\r\n vm.toggleSidenav = toggleSidenav;\r\n vm.updateSearch = updateSearch;\r\n vm.haveFilters = haveFilters;\r\n vm.clearFilters = clearFilters;\r\n vm.gotoEquipments = gotoEquipments;\r\n\r\n function gotoEquipments(src)\r\n {\r\n $state.go('app.equipments', {local: src});\r\n }\r\n\r\n function haveFilters()\r\n {\r\n if(vm.sel_client_id > 0)\r\n return true;\r\n else\r\n return false;\r\n }\r\n\r\n function clearFilters()\r\n {\r\n vm.sel_client_id = null;\r\n vm.sel_client = null;\r\n vm.dtInstance.reloadData();\r\n }\r\n\r\n function gotoDetail(id)\r\n {\r\n console.log(id);\r\n $state.go('app.article', {id: id});\r\n }\r\n\r\n function deleteConfirm(record, ev)\r\n {\r\n var confirm = $mdDialog.confirm()\r\n .title( $translate.instant('ARTICLES.DELETE_QUESTION') )\r\n .htmlContent('' + record.description + '' + $translate.instant('ARTICLES.DELETE_SENTENCE'))\r\n .ariaLabel('delete contact')\r\n .targetEvent(ev)\r\n .ok($translate.instant('ARTICLES.DELETE_YES'))\r\n .cancel($translate.instant('ARTICLES.DELETE_NO'));\r\n\r\n $mdDialog.show(confirm).then(function ()\r\n {\r\n api.locals.delete({ id: record.id }).$promise.then(function (record) {\r\n vm.totalRecords = vm.totalRecords - 1;\r\n vm.dtInstance.reloadData();\r\n showToast($translate.instant('ARTICLES.DELETE_MSG'));\r\n });\r\n }, function ()\r\n {\r\n\r\n });\r\n }\r\n //////////\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.article', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider)\r\n {\r\n $stateProvider\r\n .state('app.article', {\r\n url : '/article/:id',\r\n views : {\r\n 'content@app': {\r\n templateUrl: 'app/main/pages/article/article.html',\r\n controller : 'ArticleController as vm'\r\n }\r\n },\r\n resolve : {\r\n Article: function (api, $stateParams)\r\n {\r\n console.log('id=' + $stateParams.id);\r\n return api.articles.get({ id: encodeURIComponent($stateParams.id) }).$promise;\r\n }\r\n },\r\n params: {\r\n catalog : null\r\n },\r\n bodyClass: 'e-commerce'\r\n });\r\n\r\n $translatePartialLoaderProvider.addPart('app/main/pages/article');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.article')\r\n .controller('ArticleController', ArticleController);\r\n\r\n function ArticleController($compile,$scope, $document, $state, Article, api, $window, $translate, DTOptionsBuilder, DTColumnBuilder)\r\n {\r\n console.log(\"ArticleController\",Article);\r\n\r\n var vm = this;\r\n vm.dtInstance = {};\r\n\r\n vm.locals = Article.locals;\r\n vm.catalog = 0;\r\n\r\n if($state.params.catalog > 0) {\r\n vm.catalog = 1;\r\n }\r\n\r\n vm.record = Article.record ? Article.record : null;\r\n vm.recordLabel = Article.record ? (Article.record.Description ? Article.record.Description : $translate.instant('LOCAL.NEW_RECORD')) : $translate.instant('LOCAL.NEW_RECORD');\r\n\r\n vm.gotoList = gotoList;\r\n vm.verPedido = verPedido;\r\n vm.save = save;\r\n vm.isImage = isImage;\r\n\r\n vm.submitted = false;\r\n\r\n function verPedido(id)\r\n {\r\n $state.go('app.order', {id: id});\r\n }\r\n\r\n function gotoList()\r\n {\r\n if( vm.catalog == 1) {\r\n $state.go('app.catalog');\r\n } else {\r\n $state.go('app.articles');\r\n }\r\n }\r\n\r\n function isImage(src) {\r\n\r\n var deferred = $q.defer();\r\n\r\n var image = new Image();\r\n image.onerror = function() {\r\n deferred.resolve(false);\r\n };\r\n image.onload = function() {\r\n deferred.resolve(true);\r\n };\r\n image.src = src;\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function save(record)\r\n {\r\n var msg = '';\r\n api.locals.save({ record: record }).$promise.then(function (result) {\r\n if(record.id > 0)\r\n msg = $translate.instant('LOCAL.UPDATE_MSG');\r\n else\r\n msg = $translate.instant('LOCAL.INSERT_MSG');\r\n\r\n $state.go('app.locals', { showToastMessage: msg });\r\n });\r\n }\r\n\r\n vm.dtOptions = DTOptionsBuilder.newOptions()\r\n .withOption('dom','rt<\"bottom\"<\"left\"<\"info\"i>><\"right\"<\"pagination\"p>>>');\r\n\r\n vm.dtColumns = [\r\n DTColumnBuilder.newColumn('Codigo').withTitle('Cod'),\r\n DTColumnBuilder.newColumn('Description').withTitle('Artigo'),\r\n DTColumnBuilder.newColumn('qtd').withTitle('Qtd'),\r\n DTColumnBuilder.newColumn('sn').withTitle('S/N'),\r\n DTColumnBuilder.newColumn(null).withTitle('Actions').notSortable()\r\n .renderWith(actionsHtml).withOption('width', '100px'),\r\n DTColumnBuilder.newColumn('cod').notVisible()\r\n ];\r\n\r\n function createdRow(row, data, dataIndex) {\r\n $compile(angular.element(row).contents())($scope);\r\n }\r\n\r\n function actionsHtml(data, type, full, meta) {\r\n return '
';\r\n }\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core',\r\n [\r\n 'ngMaterial',\r\n 'ngAnimate',\r\n 'ngAria',\r\n 'ngCookies',\r\n 'ngMessages',\r\n 'ngResource',\r\n 'ngSanitize',\r\n 'ngMaterial',\r\n 'pascalprecht.translate',\r\n 'ui.router',\r\n 'datatables',\r\n 'angular-jwt',\r\n 'LocalStorageModule',\r\n 'angular-md5',\r\n 'ui.calendar',\r\n '720kb.datepicker',\r\n 'ngFileUpload'\r\n ]);\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsSearchBarController', MsSearchBarController)\r\n .directive('msSearchBar', msSearchBarDirective);\r\n\r\n /** @ngInject */\r\n function MsSearchBarController($scope, $element, $timeout)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.collapsed = true;\r\n vm.query = '';\r\n vm.queryOptions = {\r\n debounce: vm.debounce || 0\r\n };\r\n vm.resultsLoading = false;\r\n vm.results = null;\r\n vm.selectedResultIndex = 0;\r\n vm.ignoreMouseEvents = false;\r\n\r\n // Methods\r\n vm.populateResults = populateResults;\r\n\r\n vm.expand = expand;\r\n vm.collapse = collapse;\r\n\r\n vm.absorbEvent = absorbEvent;\r\n vm.handleKeydown = handleKeydown;\r\n vm.handleMouseenter = handleMouseenter;\r\n vm.temporarilyIgnoreMouseEvents = temporarilyIgnoreMouseEvents;\r\n vm.handleResultClick = handleResultClick;\r\n vm.ensureSelectedResultIsVisible = ensureSelectedResultIsVisible;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n function init()\r\n {\r\n // Watch the model changes to trigger the search\r\n $scope.$watch('MsSearchBar.query', function (current, old)\r\n {\r\n if ( angular.isUndefined(current) )\r\n {\r\n return;\r\n }\r\n\r\n if ( angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n if ( vm.collapsed )\r\n {\r\n return;\r\n }\r\n\r\n // Evaluate the onSearch function to access the\r\n // function itself\r\n var onSearchEvaluated = $scope.$parent.$eval(vm.onSearch, {query: current}),\r\n isArray = angular.isArray(onSearchEvaluated),\r\n isPromise = (onSearchEvaluated && !!onSearchEvaluated.then);\r\n\r\n if ( isArray )\r\n {\r\n // Populate the results\r\n vm.populateResults(onSearchEvaluated);\r\n }\r\n\r\n if ( isPromise )\r\n {\r\n // Show the loader\r\n vm.resultsLoading = true;\r\n\r\n onSearchEvaluated.then(\r\n // Success\r\n function (response)\r\n {\r\n // Populate the results\r\n vm.populateResults(response);\r\n },\r\n // Error\r\n function ()\r\n {\r\n // Assign an empty array to show\r\n // the no-results screen\r\n vm.populateResults([]);\r\n }\r\n ).finally(function ()\r\n {\r\n // Hide the loader\r\n vm.resultsLoading = false;\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Populate the results\r\n *\r\n * @param results\r\n */\r\n function populateResults(results)\r\n {\r\n // Before doing anything,\r\n // make sure the search bar is expanded\r\n if ( vm.collapsed )\r\n {\r\n return;\r\n }\r\n\r\n var isArray = angular.isArray(results),\r\n isNull = results === null;\r\n\r\n // Only accept arrays and null values\r\n if ( !isArray && !isNull )\r\n {\r\n return;\r\n }\r\n\r\n // Reset the selected result\r\n vm.selectedResultIndex = 0;\r\n\r\n // Populate the results\r\n vm.results = results;\r\n }\r\n\r\n /**\r\n * Expand\r\n */\r\n function expand()\r\n {\r\n // Set collapsed status\r\n vm.collapsed = false;\r\n\r\n // Call expand on scope\r\n $scope.expand();\r\n\r\n // Callback\r\n if ( vm.onExpand && angular.isFunction(vm.onExpand) )\r\n {\r\n vm.onExpand();\r\n }\r\n }\r\n\r\n /**\r\n * Collapse\r\n */\r\n function collapse()\r\n {\r\n // Empty the query\r\n vm.query = '';\r\n\r\n // Empty results to hide the results view\r\n vm.populateResults(null);\r\n\r\n // Set collapsed status\r\n vm.collapsed = true;\r\n\r\n // Call collapse on scope\r\n $scope.collapse();\r\n\r\n // Callback\r\n if ( vm.onCollapse && angular.isFunction(vm.onCollapse) )\r\n {\r\n vm.onCollapse();\r\n }\r\n }\r\n\r\n /**\r\n * Absorb the given event\r\n *\r\n * @param event\r\n */\r\n function absorbEvent(event)\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n /**\r\n * Handle keydown\r\n *\r\n * @param event\r\n */\r\n function handleKeydown(event)\r\n {\r\n var keyCode = event.keyCode,\r\n keys = [27, 38, 40];\r\n\r\n // Prevent the default action if\r\n // one of the keys are pressed that\r\n // we are listening\r\n if ( keys.indexOf(keyCode) > -1 )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n switch ( keyCode )\r\n {\r\n // Enter\r\n case 13:\r\n\r\n // Trigger result click\r\n vm.handleResultClick(vm.results[vm.selectedResultIndex]);\r\n\r\n break;\r\n\r\n // Escape\r\n case 27:\r\n\r\n // Collapse the search bar\r\n vm.collapse();\r\n\r\n break;\r\n\r\n // Up Arrow\r\n case 38:\r\n\r\n // Decrease the selected result index\r\n if ( vm.selectedResultIndex - 1 >= 0 )\r\n {\r\n // Decrease the selected index\r\n vm.selectedResultIndex--;\r\n\r\n // Make sure the selected result is in the view\r\n vm.ensureSelectedResultIsVisible();\r\n }\r\n\r\n break;\r\n\r\n // Down Arrow\r\n case 40:\r\n\r\n if ( !vm.results )\r\n {\r\n return;\r\n }\r\n\r\n // Increase the selected result index\r\n if ( vm.selectedResultIndex + 1 < vm.results.length )\r\n {\r\n // Increase the selected index\r\n vm.selectedResultIndex++;\r\n\r\n // Make sure the selected result is in the view\r\n vm.ensureSelectedResultIsVisible();\r\n }\r\n\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Handle mouseenter\r\n *\r\n * @param index\r\n */\r\n function handleMouseenter(index)\r\n {\r\n if ( vm.ignoreMouseEvents )\r\n {\r\n return;\r\n }\r\n\r\n // Update the selected result index\r\n // with the given index\r\n vm.selectedResultIndex = index;\r\n }\r\n\r\n /**\r\n * Set a variable for a limited time\r\n * to make other functions to ignore\r\n * the mouse events\r\n */\r\n function temporarilyIgnoreMouseEvents()\r\n {\r\n // Set the variable\r\n vm.ignoreMouseEvents = true;\r\n\r\n // Cancel the previous timeout\r\n $timeout.cancel(vm.mouseEventIgnoreTimeout);\r\n\r\n // Set the timeout\r\n vm.mouseEventIgnoreTimeout = $timeout(function ()\r\n {\r\n vm.ignoreMouseEvents = false;\r\n }, 250);\r\n }\r\n\r\n /**\r\n * Handle the result click\r\n *\r\n * @param item\r\n */\r\n function handleResultClick(item)\r\n {\r\n if ( vm.onResultClick )\r\n {\r\n vm.onResultClick({item: item});\r\n }\r\n\r\n // Collapse the search bar\r\n vm.collapse();\r\n }\r\n\r\n /**\r\n * Ensure the selected result will\r\n * always be visible on the results\r\n * area\r\n */\r\n function ensureSelectedResultIsVisible()\r\n {\r\n var resultsEl = $element.find('.ms-search-bar-results'),\r\n selectedItemEl = angular.element(resultsEl.find('.result')[vm.selectedResultIndex]);\r\n\r\n if ( resultsEl && selectedItemEl )\r\n {\r\n var top = selectedItemEl.position().top - 8,\r\n bottom = selectedItemEl.position().top + selectedItemEl.outerHeight() + 8;\r\n\r\n // Start ignoring mouse events\r\n vm.temporarilyIgnoreMouseEvents();\r\n\r\n if ( resultsEl.scrollTop() > top )\r\n {\r\n resultsEl.scrollTop(top);\r\n }\r\n\r\n if ( bottom > (resultsEl.height() + resultsEl.scrollTop()) )\r\n {\r\n resultsEl.scrollTop(bottom - resultsEl.height());\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msSearchBarDirective($document)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {},\r\n require : 'msSearchBar',\r\n controller : 'MsSearchBarController as MsSearchBar',\r\n bindToController: {\r\n debounce : '=?',\r\n onSearch : '@',\r\n onResultClick: '&?',\r\n onExpand : '&?',\r\n onCollapse : '&?'\r\n },\r\n templateUrl : 'app/core/directives/ms-search-bar/ms-search-bar.html',\r\n compile : function (tElement)\r\n {\r\n // Add class\r\n tElement.addClass('ms-search-bar');\r\n\r\n return function postLink(scope, iElement)\r\n {\r\n // Data\r\n var inputEl,\r\n bodyEl = $document.find('body');\r\n\r\n // Methods\r\n scope.collapse = collapse;\r\n scope.expand = expand;\r\n\r\n //////////\r\n\r\n // Initialize\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Grab the input element\r\n inputEl = iElement.find('#ms-search-bar-input');\r\n }\r\n\r\n /**\r\n * Expand action\r\n */\r\n function expand()\r\n {\r\n // Add expanded class\r\n iElement.addClass('expanded');\r\n\r\n // Add helper class to the body\r\n bodyEl.addClass('ms-search-bar-expanded');\r\n\r\n // Focus on the input\r\n inputEl.focus();\r\n }\r\n\r\n /**\r\n * Collapse action\r\n */\r\n function collapse()\r\n {\r\n // Remove expanded class\r\n iElement.removeClass('expanded');\r\n\r\n // Remove helper class from the body\r\n bodyEl.removeClass('ms-search-bar-expanded');\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsWidgetController', MsWidgetController)\r\n .directive('msWidget', msWidgetDirective)\r\n .directive('msWidgetFront', msWidgetFrontDirective)\r\n .directive('msWidgetBack', msWidgetBackDirective);\r\n\r\n /** @ngInject */\r\n function MsWidgetController($scope, $element)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.flipped = false;\r\n\r\n // Methods\r\n vm.flip = flip;\r\n\r\n //////////\r\n\r\n /**\r\n * Flip the widget\r\n */\r\n function flip()\r\n {\r\n if ( !isFlippable() )\r\n {\r\n return;\r\n }\r\n\r\n // Toggle flipped status\r\n vm.flipped = !vm.flipped;\r\n\r\n // Toggle the 'flipped' class\r\n $element.toggleClass('flipped', vm.flipped);\r\n }\r\n\r\n /**\r\n * Check if widget is flippable\r\n *\r\n * @returns {boolean}\r\n */\r\n function isFlippable()\r\n {\r\n return (angular.isDefined($scope.flippable) && $scope.flippable === true);\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msWidgetDirective()\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {\r\n flippable: '=?'\r\n },\r\n controller: 'MsWidgetController',\r\n transclude: true,\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-widget');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsWidgetCtrl, transcludeFn)\r\n {\r\n // Custom transclusion\r\n transcludeFn(function (clone)\r\n {\r\n iElement.empty();\r\n iElement.append(clone);\r\n });\r\n\r\n //////////\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msWidgetFrontDirective()\r\n {\r\n return {\r\n restrict : 'E',\r\n require : '^msWidget',\r\n transclude: true,\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-widget-front');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsWidgetCtrl, transcludeFn)\r\n {\r\n // Custom transclusion\r\n transcludeFn(function (clone)\r\n {\r\n iElement.empty();\r\n iElement.append(clone);\r\n });\r\n\r\n // Methods\r\n scope.flipWidget = MsWidgetCtrl.flip;\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msWidgetBackDirective()\r\n {\r\n return {\r\n restrict : 'E',\r\n require : '^msWidget',\r\n transclude: true,\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-widget-back');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsWidgetCtrl, transcludeFn)\r\n {\r\n // Custom transclusion\r\n transcludeFn(function (clone)\r\n {\r\n iElement.empty();\r\n iElement.append(clone);\r\n });\r\n\r\n // Methods\r\n scope.flipWidget = MsWidgetCtrl.flip;\r\n };\r\n }\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsStepperController', MsStepperController)\r\n .directive('msHorizontalStepper', msHorizontalStepperDirective)\r\n .directive('msHorizontalStepperStep', msHorizontalStepperStepDirective)\r\n .directive('msVerticalStepper', msVerticalStepperDirective)\r\n .directive('msVerticalStepperStep', msVerticalStepperStepDirective);\r\n\r\n /** @ngInject */\r\n function MsStepperController($timeout)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.mainForm = undefined;\r\n\r\n vm.orientation = 'horizontal';\r\n vm.steps = [];\r\n vm.currentStep = undefined;\r\n vm.currentStepNumber = 1;\r\n\r\n // Methods\r\n vm.setOrientation = setOrientation;\r\n vm.registerMainForm = registerMainForm;\r\n vm.registerStep = registerStep;\r\n vm.setupSteps = setupSteps;\r\n vm.resetForm = resetForm;\r\n\r\n vm.setCurrentStep = setCurrentStep;\r\n\r\n vm.gotoStep = gotoStep;\r\n vm.gotoPreviousStep = gotoPreviousStep;\r\n vm.gotoNextStep = gotoNextStep;\r\n vm.gotoFirstStep = gotoFirstStep;\r\n vm.gotoLastStep = gotoLastStep;\r\n\r\n vm.isFirstStep = isFirstStep;\r\n vm.isLastStep = isLastStep;\r\n\r\n vm.isStepCurrent = isStepCurrent;\r\n vm.isStepDisabled = isStepDisabled;\r\n vm.isStepOptional = isStepOptional;\r\n vm.isStepHidden = isStepHidden;\r\n vm.filterHiddenStep = filterHiddenStep;\r\n vm.isStepValid = isStepValid;\r\n vm.isStepNumberValid = isStepNumberValid;\r\n\r\n vm.isFormValid = isFormValid;\r\n\r\n //////////\r\n\r\n /**\r\n * Set the orientation of the stepper\r\n *\r\n * @param orientation\r\n */\r\n function setOrientation(orientation)\r\n {\r\n vm.orientation = orientation || 'horizontal';\r\n }\r\n\r\n /**\r\n * Register the main form\r\n *\r\n * @param form\r\n */\r\n function registerMainForm(form)\r\n {\r\n vm.mainForm = form;\r\n }\r\n\r\n /**\r\n * Register a step\r\n *\r\n * @param element\r\n * @param scope\r\n * @param form\r\n */\r\n function registerStep(element, scope, form)\r\n {\r\n var step = {\r\n element : element,\r\n scope : scope,\r\n form : form,\r\n stepNumber: scope.step || (vm.steps.length + 1),\r\n stepTitle : scope.stepTitle\r\n };\r\n\r\n // Push the step into steps array\r\n vm.steps.push(step);\r\n\r\n // Sort steps by stepNumber\r\n vm.steps.sort(function (a, b)\r\n {\r\n return a.stepNumber - b.stepNumber;\r\n });\r\n \r\n return step;\r\n }\r\n\r\n /**\r\n * Setup steps for the first time\r\n */\r\n function setupSteps()\r\n {\r\n vm.setCurrentStep(vm.currentStepNumber);\r\n }\r\n\r\n /**\r\n * Reset steps and the main form\r\n */\r\n function resetForm()\r\n {\r\n // Timeout is required here because we need to\r\n // let form model to reset before setting the\r\n // statuses\r\n $timeout(function ()\r\n {\r\n // Reset all the steps\r\n for ( var x = 0; x < vm.steps.length; x++ )\r\n {\r\n vm.steps[x].form.$setPristine();\r\n vm.steps[x].form.$setUntouched();\r\n }\r\n\r\n // Reset the main form\r\n vm.mainForm.$setPristine();\r\n vm.mainForm.$setUntouched();\r\n\r\n // Go to first step\r\n gotoFirstStep();\r\n });\r\n }\r\n\r\n /**\r\n * Set current step\r\n *\r\n * @param stepNumber\r\n */\r\n function setCurrentStep(stepNumber)\r\n {\r\n // If the stepNumber is not a valid step number, bail...\r\n if ( !isStepNumberValid(stepNumber) )\r\n {\r\n return;\r\n }\r\n\r\n // Update the current step number\r\n vm.currentStepNumber = stepNumber;\r\n\r\n if ( vm.orientation === 'horizontal' )\r\n {\r\n // Hide all steps\r\n for ( var i = 0; i < vm.steps.length; i++ )\r\n {\r\n vm.steps[i].element.hide();\r\n }\r\n\r\n // Show the current step\r\n vm.steps[vm.currentStepNumber - 1].element.show();\r\n }\r\n else if ( vm.orientation === 'vertical' )\r\n {\r\n // Hide all step content\r\n for ( var j = 0; j < vm.steps.length; j++ )\r\n {\r\n vm.steps[j].element.find('.ms-stepper-step-content').hide();\r\n }\r\n\r\n // Show the current step content\r\n vm.steps[vm.currentStepNumber - 1].element.find('.ms-stepper-step-content').show();\r\n }\r\n }\r\n\r\n /**\r\n * Go to a step\r\n *\r\n * @param stepNumber\r\n */\r\n function gotoStep(stepNumber)\r\n {\r\n // If the step we are about to go\r\n // is hidden, bail...\r\n if ( isStepHidden(stepNumber) )\r\n {\r\n return;\r\n }\r\n\r\n vm.setCurrentStep(stepNumber);\r\n }\r\n\r\n /**\r\n * Go to the previous step\r\n */\r\n function gotoPreviousStep()\r\n {\r\n var stepNumber = vm.currentStepNumber - 1;\r\n\r\n // Test the previous steps and make sure we\r\n // will land to the one that is not hidden\r\n for ( var s = stepNumber; s >= 1; s-- )\r\n {\r\n if ( !isStepHidden(s) )\r\n {\r\n stepNumber = s;\r\n break;\r\n }\r\n }\r\n\r\n vm.setCurrentStep(stepNumber);\r\n }\r\n\r\n /**\r\n * Go to the next step\r\n */\r\n function gotoNextStep()\r\n {\r\n var stepNumber = vm.currentStepNumber + 1;\r\n\r\n // Test the following steps and make sure we\r\n // will land to the one that is not hidden\r\n for ( var s = stepNumber; s <= vm.steps.length; s++ )\r\n {\r\n if ( !isStepHidden(s) )\r\n {\r\n stepNumber = s;\r\n break;\r\n }\r\n }\r\n\r\n vm.setCurrentStep(stepNumber);\r\n }\r\n\r\n /**\r\n * Go to the first step\r\n */\r\n function gotoFirstStep()\r\n {\r\n vm.setCurrentStep(1);\r\n }\r\n\r\n /**\r\n * Go to the last step\r\n */\r\n function gotoLastStep()\r\n {\r\n vm.setCurrentStep(vm.steps.length);\r\n }\r\n\r\n /**\r\n * Check if the current step is the first step\r\n *\r\n * @returns {boolean}\r\n */\r\n function isFirstStep()\r\n {\r\n return vm.currentStepNumber === 1;\r\n }\r\n\r\n /**\r\n * Check if the current step is the last step\r\n *\r\n * @returns {boolean}\r\n */\r\n function isLastStep()\r\n {\r\n return vm.currentStepNumber === vm.steps.length;\r\n }\r\n\r\n /**\r\n * Check if the given step is the current one\r\n *\r\n * @param stepNumber\r\n * @returns {null|boolean}\r\n */\r\n function isStepCurrent(stepNumber)\r\n {\r\n // If the stepNumber is not a valid step number, bail...\r\n if ( !isStepNumberValid(stepNumber) )\r\n {\r\n return null;\r\n }\r\n\r\n return vm.currentStepNumber === stepNumber;\r\n }\r\n\r\n /**\r\n * Check if the given step should be disabled\r\n *\r\n * @param stepNumber\r\n * @returns {null|boolean}\r\n */\r\n function isStepDisabled(stepNumber)\r\n {\r\n // If the stepNumber is not a valid step number, bail...\r\n if ( !isStepNumberValid(stepNumber) )\r\n {\r\n return null;\r\n }\r\n\r\n var disabled = false;\r\n\r\n for ( var i = 1; i < stepNumber; i++ )\r\n {\r\n if ( !isStepValid(i) )\r\n {\r\n disabled = true;\r\n break;\r\n }\r\n }\r\n\r\n return disabled;\r\n }\r\n\r\n /**\r\n * Check if the given step is optional\r\n *\r\n * @param stepNumber\r\n * @returns {null|boolean}\r\n */\r\n function isStepOptional(stepNumber)\r\n {\r\n // If the stepNumber is not a valid step number, bail...\r\n if ( !isStepNumberValid(stepNumber) )\r\n {\r\n return null;\r\n }\r\n\r\n return vm.steps[stepNumber - 1].scope.optionalStep;\r\n }\r\n\r\n /**\r\n * Check if the given step is hidden\r\n *\r\n * @param stepNumber\r\n * @returns {null|boolean}\r\n */\r\n function isStepHidden(stepNumber)\r\n {\r\n // If the stepNumber is not a valid step number, bail...\r\n if ( !isStepNumberValid(stepNumber) )\r\n {\r\n return null;\r\n }\r\n\r\n return !!vm.steps[stepNumber - 1].scope.hideStep;\r\n }\r\n\r\n /**\r\n * Check if the given step is hidden as a filter\r\n *\r\n * @param step\r\n * @returns {boolean}\r\n */\r\n function filterHiddenStep(step)\r\n {\r\n return !isStepHidden(step.stepNumber);\r\n }\r\n\r\n /**\r\n * Check if the given step is valid\r\n *\r\n * @param stepNumber\r\n * @returns {null|boolean}\r\n */\r\n function isStepValid(stepNumber)\r\n {\r\n // If the stepNumber is not a valid step number, bail...\r\n if ( !isStepNumberValid(stepNumber) )\r\n {\r\n return null;\r\n }\r\n\r\n // If the step is optional, always return true\r\n if ( isStepOptional(stepNumber) )\r\n {\r\n return true;\r\n }\r\n\r\n return vm.steps[stepNumber - 1].form.$valid;\r\n }\r\n\r\n /**\r\n * Check if the given step number is a valid step number\r\n *\r\n * @param stepNumber\r\n * @returns {boolean}\r\n */\r\n function isStepNumberValid(stepNumber)\r\n {\r\n return !(angular.isUndefined(stepNumber) || stepNumber < 1 || stepNumber > vm.steps.length);\r\n }\r\n\r\n /**\r\n * Check if the entire form is valid\r\n *\r\n * @returns {boolean}\r\n */\r\n function isFormValid()\r\n {\r\n return vm.mainForm.$valid;\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msHorizontalStepperDirective()\r\n {\r\n return {\r\n restrict : 'A',\r\n scope : {},\r\n require : ['form', 'msHorizontalStepper'],\r\n priority : 1001,\r\n controller : 'MsStepperController as MsStepper',\r\n bindToController: {\r\n model: '=ngModel'\r\n },\r\n transclude : true,\r\n templateUrl : 'app/core/directives/ms-stepper/templates/horizontal/horizontal.html',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-stepper');\r\n\r\n return function postLink(scope, iElement, iAttrs, ctrls)\r\n {\r\n var FormCtrl = ctrls[0],\r\n MsStepperCtrl = ctrls[1];\r\n\r\n // Register the main form and setup\r\n // the steps for the first time\r\n MsStepperCtrl.setOrientation('horizontal');\r\n MsStepperCtrl.registerMainForm(FormCtrl);\r\n MsStepperCtrl.setupSteps();\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msHorizontalStepperStepDirective()\r\n {\r\n return {\r\n restrict: 'E',\r\n require : ['form', '^msHorizontalStepper'],\r\n priority: 1000,\r\n scope : {\r\n step : '=?',\r\n stepTitle : '=?',\r\n optionalStep: '=?',\r\n hideStep : '=?'\r\n },\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-stepper-step');\r\n\r\n return function postLink(scope, iElement, iAttrs, ctrls)\r\n {\r\n var FormCtrl = ctrls[0],\r\n MsStepperCtrl = ctrls[1];\r\n\r\n // Is it an optional step?\r\n scope.optionalStep = angular.isDefined(iAttrs.optionalStep);\r\n\r\n // Register the step\r\n MsStepperCtrl.registerStep(iElement, scope, FormCtrl);\r\n\r\n // Hide the step by default\r\n iElement.hide();\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msVerticalStepperDirective($timeout)\r\n {\r\n return {\r\n restrict : 'A',\r\n scope : {},\r\n require : ['form', 'msVerticalStepper'],\r\n priority : 1001,\r\n controller : 'MsStepperController as MsStepper',\r\n bindToController: {\r\n model: '=ngModel'\r\n },\r\n transclude : true,\r\n templateUrl : 'app/core/directives/ms-stepper/templates/vertical/vertical.html',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-stepper');\r\n\r\n return function postLink(scope, iElement, iAttrs, ctrls)\r\n {\r\n var FormCtrl = ctrls[0],\r\n MsStepperCtrl = ctrls[1];\r\n\r\n // Register the main form and setup\r\n // the steps for the first time\r\n\r\n // Timeout is required in vertical stepper\r\n // as we are using transclusion in steps.\r\n // We have to wait for them to be transcluded\r\n // and registered to the controller\r\n $timeout(function ()\r\n {\r\n MsStepperCtrl.setOrientation('vertical');\r\n MsStepperCtrl.registerMainForm(FormCtrl);\r\n MsStepperCtrl.setupSteps();\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msVerticalStepperStepDirective()\r\n {\r\n return {\r\n restrict : 'E',\r\n require : ['form', '^msVerticalStepper'],\r\n priority : 1000,\r\n scope : {\r\n step : '=?',\r\n stepTitle : '=?',\r\n optionalStep: '=?',\r\n hideStep : '=?'\r\n },\r\n transclude : true,\r\n templateUrl: 'app/core/directives/ms-stepper/templates/vertical/step/vertical-step.html',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-stepper-step');\r\n\r\n return function postLink(scope, iElement, iAttrs, ctrls)\r\n {\r\n var FormCtrl = ctrls[0],\r\n MsStepperCtrl = ctrls[1];\r\n\r\n // Is it an optional step?\r\n scope.optionalStep = angular.isDefined(iAttrs.optionalStep);\r\n \r\n // Register the step\r\n scope.stepInfo = MsStepperCtrl.registerStep(iElement, scope, FormCtrl);\r\n\r\n // Expose the controller to the scope\r\n scope.MsStepper = MsStepperCtrl;\r\n\r\n // Hide the step content by default\r\n iElement.find('.ms-stepper-step-content').hide();\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsTimelineController', MsTimelineController)\r\n .directive('msTimeline', msTimelineDirective)\r\n .directive('msTimelineItem', msTimelineItemDirective);\r\n\r\n /** @ngInject */\r\n function MsTimelineController()\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.scrollEl = undefined;\r\n\r\n // Methods\r\n vm.setScrollEl = setScrollEl;\r\n vm.getScrollEl = getScrollEl;\r\n\r\n //////////\r\n\r\n /**\r\n * Set scroll element\r\n *\r\n * @param scrollEl\r\n */\r\n function setScrollEl(scrollEl)\r\n {\r\n vm.scrollEl = scrollEl;\r\n }\r\n\r\n /**\r\n * Get scroll element\r\n *\r\n * @returns {undefined|*}\r\n */\r\n function getScrollEl()\r\n {\r\n return vm.scrollEl;\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msTimelineDirective()\r\n {\r\n return {\r\n scope : {\r\n msTimeline: '=?',\r\n loadMore : '&?msTimelineLoadMore'\r\n },\r\n controller: 'MsTimelineController',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-timeline');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsTimelineCtrl)\r\n {\r\n // Create an element for triggering the load more action and append it\r\n var loadMoreEl = angular.element('
');\r\n iElement.append(loadMoreEl);\r\n\r\n // Default config\r\n var config = {\r\n scrollEl: '#content'\r\n };\r\n\r\n // Extend the configuration\r\n config = angular.extend(config, scope.msTimeline, {});\r\n \r\n // Grab the scrollable element and store it in the controller for general use\r\n var scrollEl = angular.element(config.scrollEl);\r\n MsTimelineCtrl.setScrollEl(scrollEl);\r\n\r\n // Threshold\r\n var threshold = 144;\r\n\r\n // Register onScroll event for the first time\r\n registerOnScroll();\r\n\r\n /**\r\n * onScroll Event\r\n */\r\n function onScroll()\r\n {\r\n if ( scrollEl.scrollTop() + scrollEl.height() + threshold > loadMoreEl.position().top )\r\n {\r\n // Show the loader\r\n loadMoreEl.addClass('show');\r\n\r\n // Unregister scroll event to prevent triggering the function over and over again\r\n unregisterOnScroll();\r\n\r\n // Trigger load more event\r\n scope.loadMore().then(\r\n // Success\r\n function ()\r\n {\r\n // Hide the loader\r\n loadMoreEl.removeClass('show');\r\n\r\n // Register the onScroll event again\r\n registerOnScroll();\r\n },\r\n\r\n // Error\r\n function ()\r\n {\r\n // Remove the loader completely\r\n loadMoreEl.remove();\r\n }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * onScroll event registerer\r\n */\r\n function registerOnScroll()\r\n {\r\n scrollEl.on('scroll', onScroll);\r\n }\r\n\r\n /**\r\n * onScroll event unregisterer\r\n */\r\n function unregisterOnScroll()\r\n {\r\n scrollEl.off('scroll', onScroll);\r\n }\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n unregisterOnScroll();\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msTimelineItemDirective($timeout, $q)\r\n {\r\n return {\r\n scope : true,\r\n require: '^msTimeline',\r\n compile: function (tElement)\r\n {\r\n tElement.addClass('ms-timeline-item').addClass('hidden');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsTimelineCtrl)\r\n {\r\n var threshold = 72,\r\n itemLoaded = false,\r\n itemInViewport = false,\r\n scrollEl = MsTimelineCtrl.getScrollEl();\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Check if the timeline item has ms-card\r\n if ( iElement.find('ms-card') )\r\n {\r\n // If the ms-card template loaded...\r\n scope.$on('msCard::cardTemplateLoaded', function (event, args)\r\n {\r\n var cardEl = angular.element(args[0]);\r\n\r\n // Test the card to see if there is any image on it\r\n testForImage(cardEl).then(function ()\r\n {\r\n $timeout(function ()\r\n {\r\n itemLoaded = true;\r\n });\r\n });\r\n });\r\n }\r\n else\r\n {\r\n // Test the element to see if there is any image on it\r\n testForImage(iElement).then(function ()\r\n {\r\n $timeout(function ()\r\n {\r\n itemLoaded = true;\r\n });\r\n });\r\n }\r\n\r\n // Check if the loaded element also in the viewport\r\n scrollEl.on('scroll', testForVisibility);\r\n\r\n // Test for visibility for the first time without waiting for the scroll event\r\n testForVisibility();\r\n }\r\n\r\n // Item ready watcher\r\n var itemReadyWatcher = scope.$watch(\r\n function ()\r\n {\r\n return itemLoaded && itemInViewport;\r\n },\r\n function (current, old)\r\n {\r\n if ( angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n if ( current )\r\n {\r\n iElement.removeClass('hidden').addClass('animate');\r\n\r\n // Unbind itemReadyWatcher\r\n itemReadyWatcher();\r\n }\r\n }, true);\r\n\r\n /**\r\n * Test the given element for image\r\n *\r\n * @param element\r\n * @returns promise\r\n */\r\n function testForImage(element)\r\n {\r\n var deferred = $q.defer(),\r\n imgEl = element.find('img');\r\n\r\n if ( imgEl.length > 0 )\r\n {\r\n imgEl.on('load', function ()\r\n {\r\n deferred.resolve('Image is loaded');\r\n });\r\n }\r\n else\r\n {\r\n deferred.resolve('No images');\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Test the element for visibility\r\n */\r\n function testForVisibility()\r\n {\r\n if ( scrollEl.scrollTop() + scrollEl.height() > iElement.position().top + threshold )\r\n {\r\n $timeout(function ()\r\n {\r\n itemInViewport = true;\r\n });\r\n\r\n // Unbind the scroll event\r\n scrollEl.off('scroll', testForVisibility);\r\n }\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msSplashScreen', msSplashScreenDirective);\r\n\r\n /** @ngInject */\r\n function msSplashScreenDirective($animate)\r\n {\r\n return {\r\n restrict: 'E',\r\n link : function (scope, iElement)\r\n {\r\n var splashScreenRemoveEvent = scope.$on('msSplashScreen::remove', function ()\r\n {\r\n $animate.leave(iElement).then(function ()\r\n {\r\n // De-register scope event\r\n splashScreenRemoveEvent();\r\n\r\n // Null-ify everything else\r\n scope = iElement = null;\r\n });\r\n });\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsShortcutsController', MsShortcutsController)\r\n .directive('msShortcuts', msShortcutsDirective);\r\n\r\n /** @ngInject */\r\n function MsShortcutsController($scope, $cookies, $document, $timeout, $q, msNavigationService)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.query = '';\r\n vm.queryOptions = {\r\n debounce: 300\r\n };\r\n vm.resultsLoading = false;\r\n vm.selectedResultIndex = 0;\r\n vm.ignoreMouseEvents = false;\r\n vm.mobileBarActive = false;\r\n\r\n vm.results = null;\r\n vm.shortcuts = [];\r\n\r\n vm.sortableOptions = {\r\n ghostClass : 'ghost',\r\n forceFallback: true,\r\n fallbackClass: 'dragging',\r\n onSort : function ()\r\n {\r\n vm.saveShortcuts();\r\n }\r\n };\r\n\r\n // Methods\r\n vm.populateResults = populateResults;\r\n vm.loadShortcuts = loadShortcuts;\r\n vm.saveShortcuts = saveShortcuts;\r\n vm.addShortcut = addShortcut;\r\n vm.removeShortcut = removeShortcut;\r\n vm.handleResultClick = handleResultClick;\r\n\r\n vm.absorbEvent = absorbEvent;\r\n vm.handleKeydown = handleKeydown;\r\n vm.handleMouseenter = handleMouseenter;\r\n vm.temporarilyIgnoreMouseEvents = temporarilyIgnoreMouseEvents;\r\n vm.ensureSelectedResultIsVisible = ensureSelectedResultIsVisible;\r\n vm.toggleMobileBar = toggleMobileBar;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n function init()\r\n {\r\n // Load the shortcuts\r\n vm.loadShortcuts().then(\r\n // Success\r\n function (response)\r\n {\r\n vm.shortcuts = response;\r\n\r\n // Add shortcuts as results by default\r\n if ( vm.shortcuts.length > 0 )\r\n {\r\n vm.results = response;\r\n }\r\n }\r\n );\r\n\r\n // Watch the model changes to trigger the search\r\n $scope.$watch('MsShortcuts.query', function (current, old)\r\n {\r\n if ( angular.isUndefined(current) )\r\n {\r\n return;\r\n }\r\n\r\n if ( angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n // Show the loader\r\n vm.resultsLoading = true;\r\n\r\n // Populate the results\r\n vm.populateResults().then(\r\n // Success\r\n function (response)\r\n {\r\n vm.results = response;\r\n },\r\n // Error\r\n function ()\r\n {\r\n vm.results = [];\r\n }\r\n ).finally(\r\n function ()\r\n {\r\n // Hide the loader\r\n vm.resultsLoading = false;\r\n }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Populate the results\r\n */\r\n function populateResults()\r\n {\r\n var results = [],\r\n flatNavigation = msNavigationService.getFlatNavigation(),\r\n deferred = $q.defer();\r\n\r\n // Iterate through the navigation array and\r\n // make sure it doesn't have any groups or\r\n // none ui-sref items\r\n for ( var x = 0; x < flatNavigation.length; x++ )\r\n {\r\n if ( flatNavigation[x].uisref )\r\n {\r\n results.push(flatNavigation[x]);\r\n }\r\n }\r\n\r\n // If there is a query, filter the results\r\n if ( vm.query )\r\n {\r\n results = results.filter(function (item)\r\n {\r\n if ( angular.lowercase(item.title).search(angular.lowercase(vm.query)) > -1 )\r\n {\r\n return true;\r\n }\r\n });\r\n\r\n // Iterate through one last time and\r\n // add required properties to items\r\n for ( var i = 0; i < results.length; i++ )\r\n {\r\n // Add false to hasShortcut by default\r\n results[i].hasShortcut = false;\r\n\r\n // Test if the item is in the shortcuts list\r\n for ( var y = 0; y < vm.shortcuts.length; y++ )\r\n {\r\n if ( vm.shortcuts[y]._id === results[i]._id )\r\n {\r\n results[i].hasShortcut = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n else\r\n {\r\n // If the query is empty, that means\r\n // there is nothing to search for so\r\n // we will populate the results with\r\n // current shortcuts if there is any\r\n if ( vm.shortcuts.length > 0 )\r\n {\r\n results = vm.shortcuts;\r\n }\r\n }\r\n\r\n // Reset the selected result\r\n vm.selectedResultIndex = 0;\r\n\r\n // Fake the service delay\r\n $timeout(function ()\r\n {\r\n // Resolve the promise\r\n deferred.resolve(results);\r\n }, 250);\r\n\r\n // Return a promise\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Load shortcuts\r\n */\r\n function loadShortcuts()\r\n {\r\n var deferred = $q.defer();\r\n\r\n // For the demo purposes, we will\r\n // load the shortcuts from the cookies.\r\n // But here you can make an API call\r\n // to load them from the DB.\r\n var shortcuts = angular.fromJson($cookies.get('FUSE.shortcuts'));\r\n\r\n // No cookie available. Generate one\r\n // for the demo purposes...\r\n if ( angular.isUndefined(shortcuts) )\r\n {\r\n shortcuts = [\r\n {\r\n 'title' : 'Sample',\r\n 'icon' : 'icon-tile-four',\r\n 'state' : 'app.sample',\r\n 'weight' : 1,\r\n 'children' : [],\r\n '_id' : 'sample',\r\n '_path' : 'apps.sample',\r\n 'uisref' : 'app.sample',\r\n 'hasShortcut': true\r\n }\r\n ];\r\n\r\n $cookies.put('FUSE.shortcuts', angular.toJson(shortcuts));\r\n }\r\n\r\n // Resolve the promise\r\n deferred.resolve(shortcuts);\r\n\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Save the shortcuts\r\n */\r\n function saveShortcuts()\r\n {\r\n var deferred = $q.defer();\r\n\r\n // For the demo purposes, we will\r\n // keep the shortcuts in the cookies.\r\n // But here you can make an API call\r\n // to save them to the DB.\r\n $cookies.put('FUSE.shortcuts', angular.toJson(vm.shortcuts));\r\n\r\n // Fake the service delay\r\n $timeout(function ()\r\n {\r\n deferred.resolve({'success': true});\r\n }, 250);\r\n\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Add item as shortcut\r\n *\r\n * @param item\r\n */\r\n function addShortcut(item)\r\n {\r\n // Update the hasShortcut status\r\n item.hasShortcut = true;\r\n\r\n // Add as a shortcut\r\n vm.shortcuts.push(item);\r\n\r\n // Save the shortcuts\r\n vm.saveShortcuts();\r\n }\r\n\r\n /**\r\n * Remove item from shortcuts\r\n *\r\n * @param item\r\n */\r\n function removeShortcut(item)\r\n {\r\n // Update the hasShortcut status\r\n item.hasShortcut = false;\r\n\r\n // Remove the shortcut\r\n for ( var x = 0; x < vm.shortcuts.length; x++ )\r\n {\r\n if ( vm.shortcuts[x]._id === item._id )\r\n {\r\n // Remove the x-th item from the array\r\n vm.shortcuts.splice(x, 1);\r\n\r\n // If we aren't searching for anything...\r\n if ( !vm.query )\r\n {\r\n // If all the shortcuts have been removed,\r\n // null-ify the results\r\n if ( vm.shortcuts.length === 0 )\r\n {\r\n vm.results = null;\r\n }\r\n // Otherwise update the selected index\r\n else\r\n {\r\n if ( x >= vm.shortcuts.length )\r\n {\r\n vm.selectedResultIndex = vm.shortcuts.length - 1;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Save the shortcuts\r\n vm.saveShortcuts();\r\n }\r\n\r\n /**\r\n * Handle the result click\r\n *\r\n * @param item\r\n */\r\n function handleResultClick(item)\r\n {\r\n // Add or remove the shortcut\r\n if ( item.hasShortcut )\r\n {\r\n vm.removeShortcut(item);\r\n }\r\n else\r\n {\r\n vm.addShortcut(item);\r\n }\r\n }\r\n\r\n /**\r\n * Absorb the given event\r\n *\r\n * @param event\r\n */\r\n function absorbEvent(event)\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n /**\r\n * Handle keydown\r\n *\r\n * @param event\r\n */\r\n function handleKeydown(event)\r\n {\r\n var keyCode = event.keyCode,\r\n keys = [38, 40];\r\n\r\n // Prevent the default action if\r\n // one of the keys are pressed that\r\n // we are listening\r\n if ( keys.indexOf(keyCode) > -1 )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n switch ( keyCode )\r\n {\r\n // Enter\r\n case 13:\r\n\r\n // Trigger result click\r\n vm.handleResultClick(vm.results[vm.selectedResultIndex]);\r\n\r\n break;\r\n\r\n // Up Arrow\r\n case 38:\r\n\r\n // Decrease the selected result index\r\n if ( vm.selectedResultIndex - 1 >= 0 )\r\n {\r\n // Decrease the selected index\r\n vm.selectedResultIndex--;\r\n\r\n // Make sure the selected result is in the view\r\n vm.ensureSelectedResultIsVisible();\r\n }\r\n\r\n break;\r\n\r\n // Down Arrow\r\n case 40:\r\n\r\n // Increase the selected result index\r\n if ( vm.selectedResultIndex + 1 < vm.results.length )\r\n {\r\n // Increase the selected index\r\n vm.selectedResultIndex++;\r\n\r\n // Make sure the selected result is in the view\r\n vm.ensureSelectedResultIsVisible();\r\n }\r\n\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Handle mouseenter\r\n *\r\n * @param index\r\n */\r\n function handleMouseenter(index)\r\n {\r\n if ( vm.ignoreMouseEvents )\r\n {\r\n return;\r\n }\r\n\r\n // Update the selected result index\r\n // with the given index\r\n vm.selectedResultIndex = index;\r\n }\r\n\r\n /**\r\n * Set a variable for a limited time\r\n * to make other functions to ignore\r\n * the mouse events\r\n */\r\n function temporarilyIgnoreMouseEvents()\r\n {\r\n // Set the variable\r\n vm.ignoreMouseEvents = true;\r\n\r\n // Cancel the previous timeout\r\n $timeout.cancel(vm.mouseEventIgnoreTimeout);\r\n\r\n // Set the timeout\r\n vm.mouseEventIgnoreTimeout = $timeout(function ()\r\n {\r\n vm.ignoreMouseEvents = false;\r\n }, 250);\r\n }\r\n\r\n /**\r\n * Ensure the selected result will\r\n * always be visible on the results\r\n * area\r\n */\r\n function ensureSelectedResultIsVisible()\r\n {\r\n var resultsEl = $document.find('#ms-shortcut-add-menu').find('.results'),\r\n selectedItemEl = angular.element(resultsEl.find('.result')[vm.selectedResultIndex]);\r\n\r\n if ( resultsEl && selectedItemEl )\r\n {\r\n var top = selectedItemEl.position().top - 8,\r\n bottom = selectedItemEl.position().top + selectedItemEl.outerHeight() + 8;\r\n\r\n // Start ignoring mouse events\r\n vm.temporarilyIgnoreMouseEvents();\r\n\r\n if ( resultsEl.scrollTop() > top )\r\n {\r\n resultsEl.scrollTop(top);\r\n }\r\n\r\n if ( bottom > (resultsEl.height() + resultsEl.scrollTop()) )\r\n {\r\n resultsEl.scrollTop(bottom - resultsEl.height());\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Toggle mobile bar\r\n */\r\n function toggleMobileBar()\r\n {\r\n vm.mobileBarActive = !vm.mobileBarActive;\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msShortcutsDirective()\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {},\r\n require : 'msShortcuts',\r\n controller : 'MsShortcutsController as MsShortcuts',\r\n bindToController: {},\r\n templateUrl : 'app/core/directives/ms-shortcuts/ms-shortcuts.html',\r\n compile : function (tElement)\r\n {\r\n // Add class\r\n tElement.addClass('ms-shortcuts');\r\n\r\n return function postLink(scope, iElement)\r\n {\r\n // Data\r\n\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msSidenavHelper', msSidenavHelperDirective);\r\n\r\n /** @ngInject */\r\n function msSidenavHelperDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n require : '^mdSidenav',\r\n link : function (scope, iElement, iAttrs, MdSidenavCtrl)\r\n {\r\n // Watch md-sidenav open & locked open statuses\r\n // and add class to the \".page-layout\" if only\r\n // the sidenav open and NOT locked open\r\n scope.$watch(function ()\r\n {\r\n return MdSidenavCtrl.isOpen() && !MdSidenavCtrl.isLockedOpen();\r\n }, function (current)\r\n {\r\n if ( angular.isUndefined(current) )\r\n {\r\n return;\r\n }\r\n\r\n iElement.parent().toggleClass('full-height', current);\r\n angular.element('html').toggleClass('sidenav-open', current);\r\n });\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('msScrollConfig', msScrollConfigProvider)\r\n .directive('msScroll', msScrollDirective);\r\n\r\n /** @ngInject */\r\n function msScrollConfigProvider()\r\n {\r\n // Default configuration\r\n var defaultConfiguration = {\r\n wheelSpeed : 1,\r\n wheelPropagation : false,\r\n swipePropagation : true,\r\n minScrollbarLength : null,\r\n maxScrollbarLength : null,\r\n useBothWheelAxes : false,\r\n useKeyboard : true,\r\n suppressScrollX : false,\r\n suppressScrollY : false,\r\n scrollXMarginOffset : 0,\r\n scrollYMarginOffset : 0,\r\n stopPropagationOnClick: true\r\n };\r\n\r\n // Methods\r\n this.config = config;\r\n\r\n //////////\r\n\r\n /**\r\n * Extend default configuration with the given one\r\n *\r\n * @param configuration\r\n */\r\n function config(configuration)\r\n {\r\n defaultConfiguration = angular.extend({}, defaultConfiguration, configuration);\r\n }\r\n\r\n /**\r\n * Service\r\n */\r\n this.$get = function ()\r\n {\r\n var service = {\r\n getConfig: getConfig\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Return the config\r\n */\r\n function getConfig()\r\n {\r\n return defaultConfiguration;\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msScrollDirective($timeout, msScrollConfig, msUtils, fuseConfig)\r\n {\r\n return {\r\n restrict: 'AE',\r\n compile : function (tElement)\r\n {\r\n // Do not replace scrollbars if\r\n // 'disableCustomScrollbars' config enabled\r\n if ( fuseConfig.getConfig('disableCustomScrollbars') )\r\n {\r\n return;\r\n }\r\n\r\n // Do not replace scrollbars on mobile devices\r\n // if 'disableCustomScrollbarsOnMobile' config enabled\r\n if ( fuseConfig.getConfig('disableCustomScrollbarsOnMobile') && msUtils.isMobile() )\r\n {\r\n return;\r\n }\r\n\r\n // Add class\r\n tElement.addClass('ms-scroll');\r\n\r\n return function postLink(scope, iElement, iAttrs)\r\n {\r\n var options = {};\r\n\r\n // If options supplied, evaluate the given\r\n // value. This is because we don't want to\r\n // have an isolated scope but still be able\r\n // to use scope variables.\r\n // We don't want an isolated scope because\r\n // we should be able to use this everywhere\r\n // especially with other directives\r\n if ( iAttrs.msScroll )\r\n {\r\n options = scope.$eval(iAttrs.msScroll);\r\n }\r\n\r\n // Extend the given config with the ones from provider\r\n options = angular.extend({}, msScrollConfig.getConfig(), options);\r\n\r\n // Initialize the scrollbar\r\n $timeout(function ()\r\n {\r\n PerfectScrollbar.initialize(iElement[0], options);\r\n }, 0);\r\n\r\n // Update the scrollbar on element mouseenter\r\n iElement.on('mouseenter', updateScrollbar);\r\n\r\n // Watch scrollHeight and update\r\n // the scrollbar if it changes\r\n scope.$watch(function ()\r\n {\r\n return iElement.prop('scrollHeight');\r\n }, function (current, old)\r\n {\r\n if ( angular.isUndefined(current) || angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n updateScrollbar();\r\n });\r\n\r\n // Watch scrollWidth and update\r\n // the scrollbar if it changes\r\n scope.$watch(function ()\r\n {\r\n return iElement.prop('scrollWidth');\r\n }, function (current, old)\r\n {\r\n if ( angular.isUndefined(current) || angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n updateScrollbar();\r\n });\r\n\r\n /**\r\n * Update the scrollbar\r\n */\r\n function updateScrollbar()\r\n {\r\n PerfectScrollbar.update(iElement[0]);\r\n }\r\n\r\n // Cleanup on destroy\r\n scope.$on('$destroy', function ()\r\n {\r\n iElement.off('mouseenter');\r\n PerfectScrollbar.destroy(iElement[0]);\r\n });\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msResponsiveTable', msResponsiveTableDirective);\r\n\r\n /** @ngInject */\r\n function msResponsiveTableDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n link : function (scope, iElement)\r\n {\r\n // Wrap the table\r\n var wrapper = angular.element('
');\r\n iElement.after(wrapper);\r\n wrapper.append(iElement);\r\n\r\n //////////\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msRandomClass', msRandomClassDirective);\r\n\r\n /** @ngInject */\r\n function msRandomClassDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n scope : {\r\n msRandomClass: '='\r\n },\r\n link : function (scope, iElement)\r\n {\r\n var randomClass = scope.msRandomClass[Math.floor(Math.random() * (scope.msRandomClass.length))];\r\n iElement.addClass(randomClass);\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('msNavigationService', msNavigationServiceProvider)\r\n .controller('MsNavigationController', MsNavigationController)\r\n // Vertical\r\n .directive('msNavigation', msNavigationDirective)\r\n .controller('MsNavigationNodeController', MsNavigationNodeController)\r\n .directive('msNavigationNode', msNavigationNodeDirective)\r\n .directive('msNavigationItem', msNavigationItemDirective)\r\n //Horizontal\r\n .directive('msNavigationHorizontal', msNavigationHorizontalDirective)\r\n .controller('MsNavigationHorizontalNodeController', MsNavigationHorizontalNodeController)\r\n .directive('msNavigationHorizontalNode', msNavigationHorizontalNodeDirective)\r\n .directive('msNavigationHorizontalItem', msNavigationHorizontalItemDirective);\r\n\r\n /** @ngInject */\r\n function msNavigationServiceProvider()\r\n {\r\n // Inject $log service\r\n var $log = angular.injector(['ng']).get('$log');\r\n\r\n // Navigation array\r\n var navigation = [];\r\n\r\n var service = this;\r\n\r\n // Methods\r\n service.saveItem = saveItem;\r\n service.deleteItem = deleteItem;\r\n service.sortByWeight = sortByWeight;\r\n\r\n //////////\r\n\r\n /**\r\n * Create or update the navigation item\r\n *\r\n * @param path\r\n * @param item\r\n */\r\n function saveItem(path, item)\r\n {\r\n if ( !angular.isString(path) )\r\n {\r\n $log.error('path must be a string (eg. `dashboard.project`)');\r\n return;\r\n }\r\n\r\n var parts = path.split('.');\r\n\r\n // Generate the object id from the parts\r\n var id = parts[parts.length - 1];\r\n\r\n // Get the parent item from the parts\r\n var parent = _findOrCreateParent(parts);\r\n\r\n // Decide if we are going to update or create\r\n var updateItem = false;\r\n\r\n for ( var i = 0; i < parent.length; i++ )\r\n {\r\n if ( parent[i]._id === id )\r\n {\r\n updateItem = parent[i];\r\n\r\n break;\r\n }\r\n }\r\n\r\n // Update\r\n if ( updateItem )\r\n {\r\n angular.extend(updateItem, item);\r\n\r\n // Add proper ui-sref\r\n updateItem.uisref = _getUiSref(updateItem);\r\n }\r\n // Create\r\n else\r\n {\r\n // Create an empty children array in the item\r\n item.children = [];\r\n\r\n // Add the default weight if not provided or if it's not a number\r\n if ( angular.isUndefined(item.weight) || !angular.isNumber(item.weight) )\r\n {\r\n item.weight = 1;\r\n }\r\n\r\n // Add the item id\r\n item._id = id;\r\n\r\n // Add the item path\r\n item._path = path;\r\n\r\n // Add proper ui-sref\r\n item.uisref = _getUiSref(item);\r\n\r\n // Push the item into the array\r\n parent.push(item);\r\n }\r\n }\r\n\r\n /**\r\n * Delete navigation item\r\n *\r\n * @param path\r\n */\r\n function deleteItem(path)\r\n {\r\n if ( !angular.isString(path) )\r\n {\r\n $log.error('path must be a string (eg. `dashboard.project`)');\r\n return;\r\n }\r\n\r\n // Locate the item by using given path\r\n var item = navigation,\r\n parts = path.split('.');\r\n\r\n for ( var p = 0; p < parts.length; p++ )\r\n {\r\n var id = parts[p];\r\n\r\n for ( var i = 0; i < item.length; i++ )\r\n {\r\n if ( item[i]._id === id )\r\n {\r\n // If we have a matching path,\r\n // we have found our object:\r\n // remove it.\r\n if ( item[i]._path === path )\r\n {\r\n item.splice(i, 1);\r\n return true;\r\n }\r\n\r\n // Otherwise grab the children of\r\n // the current item and continue\r\n item = item[i].children;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Sort the navigation items by their weights\r\n *\r\n * @param parent\r\n */\r\n function sortByWeight(parent)\r\n {\r\n // If parent not provided, sort the root items\r\n if ( !parent )\r\n {\r\n parent = navigation;\r\n parent.sort(_byWeight);\r\n }\r\n\r\n // Sort the children\r\n for ( var i = 0; i < parent.length; i++ )\r\n {\r\n var children = parent[i].children;\r\n\r\n if ( children.length > 1 )\r\n {\r\n children.sort(_byWeight);\r\n }\r\n\r\n if ( children.length > 0 )\r\n {\r\n sortByWeight(children);\r\n }\r\n }\r\n }\r\n\r\n /* ----------------- */\r\n /* Private Functions */\r\n /* ----------------- */\r\n\r\n /**\r\n * Find or create parent\r\n *\r\n * @param parts\r\n * @returns {Array|Boolean}\r\n * @private\r\n */\r\n function _findOrCreateParent(parts)\r\n {\r\n // Store the main navigation\r\n var parent = navigation;\r\n\r\n // If it's going to be a root item\r\n // return the navigation itself\r\n if ( parts.length === 1 )\r\n {\r\n return parent;\r\n }\r\n\r\n // Remove the last element from the parts as\r\n // we don't need that to figure out the parent\r\n parts.pop();\r\n\r\n // Find and return the parent\r\n for ( var i = 0; i < parts.length; i++ )\r\n {\r\n var _id = parts[i],\r\n createParent = true;\r\n\r\n for ( var p = 0; p < parent.length; p++ )\r\n {\r\n if ( parent[p]._id === _id )\r\n {\r\n parent = parent[p].children;\r\n createParent = false;\r\n\r\n break;\r\n }\r\n }\r\n\r\n // If there is no parent found, create one, push\r\n // it into the current parent and assign it as a\r\n // new parent\r\n if ( createParent )\r\n {\r\n var item = {\r\n _id : _id,\r\n _path : parts.join('.'),\r\n title : _id,\r\n weight : 1,\r\n children: []\r\n };\r\n\r\n parent.push(item);\r\n parent = item.children;\r\n }\r\n }\r\n\r\n return parent;\r\n }\r\n\r\n /**\r\n * Sort by weight\r\n *\r\n * @param x\r\n * @param y\r\n * @returns {number}\r\n * @private\r\n */\r\n function _byWeight(x, y)\r\n {\r\n return parseInt(x.weight) - parseInt(y.weight);\r\n }\r\n\r\n /**\r\n * Setup the ui-sref using state & state parameters\r\n *\r\n * @param item\r\n * @returns {string}\r\n * @private\r\n */\r\n function _getUiSref(item)\r\n {\r\n var uisref = '';\r\n\r\n if ( angular.isDefined(item.state) )\r\n {\r\n uisref = item.state;\r\n\r\n if ( angular.isDefined(item.stateParams) && angular.isObject(item.stateParams) )\r\n {\r\n uisref = uisref + '(' + angular.toJson(item.stateParams) + ')';\r\n }\r\n }\r\n\r\n return uisref;\r\n }\r\n\r\n /* ----------------- */\r\n /* Service */\r\n /* ----------------- */\r\n\r\n this.$get = function ()\r\n {\r\n var activeItem = null,\r\n navigationScope = null,\r\n folded = null,\r\n foldedOpen = null;\r\n\r\n var service = {\r\n saveItem : saveItem,\r\n deleteItem : deleteItem,\r\n sort : sortByWeight,\r\n clearNavigation : clearNavigation,\r\n setActiveItem : setActiveItem,\r\n getActiveItem : getActiveItem,\r\n getNavigation : getNavigation,\r\n getFlatNavigation : getFlatNavigation,\r\n setNavigationScope: setNavigationScope,\r\n setFolded : setFolded,\r\n getFolded : getFolded,\r\n setFoldedOpen : setFoldedOpen,\r\n getFoldedOpen : getFoldedOpen,\r\n toggleFolded : toggleFolded\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Clear the entire navigation\r\n */\r\n function clearNavigation()\r\n {\r\n // Clear the navigation array\r\n navigation = [];\r\n\r\n // Clear the vm.navigation from main controller\r\n if ( navigationScope )\r\n {\r\n navigationScope.vm.navigation = navigation;\r\n }\r\n }\r\n\r\n /**\r\n * Set active item\r\n *\r\n * @param node\r\n * @param scope\r\n */\r\n function setActiveItem(node, scope)\r\n {\r\n activeItem = {\r\n node : node,\r\n scope: scope\r\n };\r\n }\r\n\r\n /**\r\n * Return active item\r\n */\r\n function getActiveItem()\r\n {\r\n return activeItem;\r\n }\r\n\r\n /**\r\n * Return navigation array\r\n *\r\n * @param root\r\n * @returns Array\r\n */\r\n function getNavigation(root)\r\n {\r\n if ( root )\r\n {\r\n for ( var i = 0; i < navigation.length; i++ )\r\n {\r\n if ( navigation[i]._id === root )\r\n {\r\n return [navigation[i]];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n return navigation;\r\n }\r\n\r\n /**\r\n * Return flat navigation array\r\n *\r\n * @param root\r\n * @returns Array\r\n */\r\n function getFlatNavigation(root)\r\n {\r\n // Get the correct navigation array\r\n var navigation = getNavigation(root);\r\n\r\n // Flatten the navigation object\r\n return _flattenNavigation(navigation);\r\n }\r\n\r\n /**\r\n * Store navigation's scope for later use\r\n *\r\n * @param scope\r\n */\r\n function setNavigationScope(scope)\r\n {\r\n navigationScope = scope;\r\n }\r\n\r\n /**\r\n * Set folded status\r\n *\r\n * @param status\r\n */\r\n function setFolded(status)\r\n {\r\n folded = status;\r\n }\r\n\r\n /**\r\n * Return folded status\r\n *\r\n * @returns {*}\r\n */\r\n function getFolded()\r\n {\r\n return folded;\r\n }\r\n\r\n /**\r\n * Set folded open status\r\n *\r\n * @param status\r\n */\r\n function setFoldedOpen(status)\r\n {\r\n foldedOpen = status;\r\n }\r\n\r\n /**\r\n * Return folded open status\r\n *\r\n * @returns {*}\r\n */\r\n function getFoldedOpen()\r\n {\r\n return foldedOpen;\r\n }\r\n\r\n\r\n /**\r\n * Toggle fold on stored navigation's scope\r\n */\r\n function toggleFolded()\r\n {\r\n navigationScope.toggleFolded();\r\n }\r\n\r\n /**\r\n * Flatten the given navigation\r\n *\r\n * @param navigation\r\n * @private\r\n */\r\n function _flattenNavigation(navigation)\r\n {\r\n var flatNav = [];\r\n\r\n for ( var x = 0; x < navigation.length; x++ )\r\n {\r\n // Copy and clear the children of the\r\n // navigation that we want to push\r\n var navToPush = angular.copy(navigation[x]);\r\n navToPush.children = [];\r\n\r\n // Push the item\r\n flatNav.push(navToPush);\r\n\r\n // If there are child items in this navigation,\r\n // do some nested function magic\r\n if ( navigation[x].children.length > 0 )\r\n {\r\n flatNav = flatNav.concat(_flattenNavigation(navigation[x].children));\r\n }\r\n }\r\n\r\n return flatNav;\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function MsNavigationController($scope, msNavigationService)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n if ( $scope.root )\r\n {\r\n vm.navigation = msNavigationService.getNavigation($scope.root);\r\n }\r\n else\r\n {\r\n vm.navigation = msNavigationService.getNavigation();\r\n }\r\n\r\n // Methods\r\n vm.toggleHorizontalMobileMenu = toggleHorizontalMobileMenu;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Sort the navigation before doing anything else\r\n msNavigationService.sort();\r\n }\r\n\r\n /**\r\n * Toggle horizontal mobile menu\r\n */\r\n function toggleHorizontalMobileMenu()\r\n {\r\n angular.element('body').toggleClass('ms-navigation-horizontal-mobile-menu-active');\r\n }\r\n\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationDirective($rootScope, $timeout, $mdSidenav, msNavigationService)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {\r\n folded: '=',\r\n root : '@'\r\n },\r\n controller : 'MsNavigationController as vm',\r\n templateUrl: 'app/core/directives/ms-navigation/templates/vertical.html',\r\n transclude : true,\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation');\r\n\r\n return function postLink(scope, iElement)\r\n {\r\n var bodyEl = angular.element('body'),\r\n foldExpanderEl = angular.element('
'),\r\n foldCollapserEl = angular.element('
'),\r\n sidenav = $mdSidenav('navigation');\r\n\r\n // Store the navigation in the service for public access\r\n msNavigationService.setNavigationScope(scope);\r\n\r\n // Initialize\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Set the folded status for the first time.\r\n // First, we have to check if we have a folded\r\n // status available in the service already. This\r\n // will prevent navigation to act weird if we already\r\n // set the fold status, remove the navigation and\r\n // then re-initialize it, which happens if we\r\n // change to a view without a navigation and then\r\n // come back with history.back() function.\r\n\r\n // If the service didn't initialize before, set\r\n // the folded status from scope, otherwise we\r\n // won't touch anything because the folded status\r\n // already set in the service...\r\n if ( msNavigationService.getFolded() === null )\r\n {\r\n msNavigationService.setFolded(scope.folded);\r\n }\r\n\r\n if ( msNavigationService.getFolded() )\r\n {\r\n // Collapse everything.\r\n // This must be inside a $timeout because by the\r\n // time we call this, the 'msNavigation::collapse'\r\n // event listener is not registered yet. $timeout\r\n // will ensure that it will be called after it is\r\n // registered.\r\n $timeout(function ()\r\n {\r\n $rootScope.$broadcast('msNavigation::collapse');\r\n });\r\n\r\n // Add class to the body\r\n bodyEl.addClass('ms-navigation-folded');\r\n\r\n // Set fold expander\r\n setFoldExpander();\r\n }\r\n }\r\n\r\n // Sidenav locked open status watcher\r\n scope.$watch(function ()\r\n {\r\n return sidenav.isLockedOpen();\r\n }, function (current, old)\r\n {\r\n if ( angular.isUndefined(current) || angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n var folded = msNavigationService.getFolded();\r\n\r\n if ( folded )\r\n {\r\n if ( current )\r\n {\r\n // Collapse everything\r\n $rootScope.$broadcast('msNavigation::collapse');\r\n }\r\n else\r\n {\r\n // Expand the active one and its parents\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activeItem.scope.$emit('msNavigation::stateMatched');\r\n }\r\n }\r\n }\r\n });\r\n\r\n // Folded status watcher\r\n scope.$watch('folded', function (current, old)\r\n {\r\n if ( angular.isUndefined(current) || angular.equals(current, old) )\r\n {\r\n return;\r\n }\r\n\r\n setFolded(current);\r\n });\r\n\r\n /**\r\n * Set folded status\r\n *\r\n * @param folded\r\n */\r\n function setFolded(folded)\r\n {\r\n // Store folded status on the service for global access\r\n msNavigationService.setFolded(folded);\r\n\r\n if ( folded )\r\n {\r\n // Collapse everything\r\n $rootScope.$broadcast('msNavigation::collapse');\r\n\r\n // Add class to the body\r\n bodyEl.addClass('ms-navigation-folded');\r\n\r\n // Set fold expander\r\n setFoldExpander();\r\n }\r\n else\r\n {\r\n // Expand the active one and its parents\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activeItem.scope.$emit('msNavigation::stateMatched');\r\n }\r\n\r\n // Remove body class\r\n bodyEl.removeClass('ms-navigation-folded ms-navigation-folded-open');\r\n\r\n // Remove fold collapser\r\n removeFoldCollapser();\r\n }\r\n }\r\n\r\n /**\r\n * Set fold expander\r\n */\r\n function setFoldExpander()\r\n {\r\n iElement.parent().append(foldExpanderEl);\r\n\r\n // Let everything settle for a moment\r\n // before registering the event listener\r\n $timeout(function ()\r\n {\r\n foldExpanderEl.on('mouseenter touchstart', onFoldExpanderHover);\r\n });\r\n }\r\n\r\n /**\r\n * Set fold collapser\r\n */\r\n function setFoldCollapser()\r\n {\r\n bodyEl.find('#main').append(foldCollapserEl);\r\n foldCollapserEl.on('mouseenter touchstart', onFoldCollapserHover);\r\n }\r\n\r\n /**\r\n * Remove fold collapser\r\n */\r\n function removeFoldCollapser()\r\n {\r\n foldCollapserEl.remove();\r\n }\r\n\r\n /**\r\n * onHover event of foldExpander\r\n */\r\n function onFoldExpanderHover(event)\r\n {\r\n if ( event )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n // Set folded open status\r\n msNavigationService.setFoldedOpen(true);\r\n\r\n // Expand the active one and its parents\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activeItem.scope.$emit('msNavigation::stateMatched');\r\n }\r\n\r\n // Add class to the body\r\n bodyEl.addClass('ms-navigation-folded-open');\r\n\r\n // Remove the fold opener\r\n foldExpanderEl.remove();\r\n\r\n // Set fold collapser\r\n setFoldCollapser();\r\n }\r\n\r\n /**\r\n * onHover event of foldCollapser\r\n */\r\n function onFoldCollapserHover(event)\r\n {\r\n if ( event )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n // Set folded open status\r\n msNavigationService.setFoldedOpen(false);\r\n\r\n // Collapse everything\r\n $rootScope.$broadcast('msNavigation::collapse');\r\n\r\n // Remove body class\r\n bodyEl.removeClass('ms-navigation-folded-open');\r\n\r\n // Remove the fold collapser\r\n foldCollapserEl.remove();\r\n\r\n // Set fold expander\r\n setFoldExpander();\r\n }\r\n\r\n /**\r\n * Public access for toggling folded status externally\r\n */\r\n scope.toggleFolded = function ()\r\n {\r\n var folded = msNavigationService.getFolded();\r\n\r\n setFolded(!folded);\r\n };\r\n\r\n /**\r\n * On $stateChangeStart\r\n */\r\n scope.$on('$stateChangeStart', function ()\r\n {\r\n // Close the sidenav\r\n sidenav.close();\r\n });\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n foldCollapserEl.off('mouseenter touchstart');\r\n foldExpanderEl.off('mouseenter touchstart');\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function MsNavigationNodeController($scope, $element, $rootScope, $animate, $state, msNavigationService)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.element = $element;\r\n vm.node = $scope.node;\r\n vm.hasChildren = undefined;\r\n vm.collapsed = undefined;\r\n vm.collapsable = undefined;\r\n vm.group = undefined;\r\n vm.animateHeightClass = 'animate-height';\r\n\r\n // Methods\r\n vm.toggleCollapsed = toggleCollapsed;\r\n vm.collapse = collapse;\r\n vm.expand = expand;\r\n vm.getClass = getClass;\r\n vm.isHidden = isHidden;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Setup the initial values\r\n\r\n // Has children?\r\n vm.hasChildren = vm.node.children.length > 0;\r\n\r\n // Is group?\r\n vm.group = !!(angular.isDefined(vm.node.group) && vm.node.group === true);\r\n\r\n // Is collapsable?\r\n if ( !vm.hasChildren || vm.group )\r\n {\r\n vm.collapsable = false;\r\n }\r\n else\r\n {\r\n vm.collapsable = !!(angular.isUndefined(vm.node.collapsable) || typeof vm.node.collapsable !== 'boolean' || vm.node.collapsable === true);\r\n }\r\n\r\n // Is collapsed?\r\n if ( !vm.collapsable )\r\n {\r\n vm.collapsed = false;\r\n }\r\n else\r\n {\r\n vm.collapsed = !!(angular.isUndefined(vm.node.collapsed) || typeof vm.node.collapsed !== 'boolean' || vm.node.collapsed === true);\r\n }\r\n\r\n // Expand all parents if we have a matching state or\r\n // the current state is a child of the node's state\r\n if ( vm.node.state === $state.current.name || $state.includes(vm.node.state) )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n $scope.$emit('msNavigation::stateMatched');\r\n\r\n // Also store the current active menu item\r\n msNavigationService.setActiveItem(vm.node, $scope);\r\n }\r\n\r\n $scope.$on('msNavigation::stateMatched', function ()\r\n {\r\n // Expand if the current scope is collapsable and is collapsed\r\n if ( vm.collapsable && vm.collapsed )\r\n {\r\n $scope.$evalAsync(function ()\r\n {\r\n vm.collapsed = false;\r\n });\r\n }\r\n });\r\n\r\n // Listen for collapse event\r\n $scope.$on('msNavigation::collapse', function (event, path)\r\n {\r\n if ( vm.collapsed || !vm.collapsable )\r\n {\r\n return;\r\n }\r\n\r\n // If there is no path defined, collapse\r\n if ( angular.isUndefined(path) )\r\n {\r\n vm.collapse();\r\n }\r\n // If there is a path defined, do not collapse\r\n // the items that are inside that path. This will\r\n // prevent parent items from collapsing\r\n else\r\n {\r\n var givenPathParts = path.split('.'),\r\n activePathParts = [];\r\n\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activePathParts = activeItem.node._path.split('.');\r\n }\r\n\r\n // Test for given path\r\n if ( givenPathParts.indexOf(vm.node._id) > -1 )\r\n {\r\n return;\r\n }\r\n\r\n // Test for active path\r\n if ( activePathParts.indexOf(vm.node._id) > -1 )\r\n {\r\n return;\r\n }\r\n\r\n vm.collapse();\r\n }\r\n });\r\n\r\n // Listen for $stateChangeSuccess event\r\n $scope.$on('$stateChangeSuccess', function ()\r\n {\r\n if ( vm.node.state === $state.current.name )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n // Update active item on state change\r\n msNavigationService.setActiveItem(vm.node, $scope);\r\n\r\n // Collapse everything except the one we're using\r\n $rootScope.$broadcast('msNavigation::collapse', vm.node._path);\r\n }\r\n\r\n // Expand the parents if we the current\r\n // state is a child of the node's state\r\n if ( $state.includes(vm.node.state) )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n // Emit the stateMatched\r\n $scope.$emit('msNavigation::stateMatched');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Toggle collapsed\r\n */\r\n function toggleCollapsed()\r\n {\r\n if ( vm.collapsed )\r\n {\r\n vm.expand();\r\n }\r\n else\r\n {\r\n vm.collapse();\r\n }\r\n }\r\n\r\n /**\r\n * Collapse\r\n */\r\n function collapse()\r\n {\r\n // Grab the element that we are going to collapse\r\n var collapseEl = vm.element.children('ul');\r\n\r\n // Grab the height\r\n var height = collapseEl[0].offsetHeight;\r\n\r\n $scope.$evalAsync(function ()\r\n {\r\n // Set collapsed status\r\n vm.collapsed = true;\r\n\r\n // Add collapsing class to the node\r\n vm.element.addClass('collapsing');\r\n\r\n // Animate the height\r\n $animate.animate(collapseEl,\r\n {\r\n 'display': 'block',\r\n 'height' : height + 'px'\r\n },\r\n {\r\n 'height': '0px'\r\n },\r\n vm.animateHeightClass\r\n ).then(\r\n function ()\r\n {\r\n // Clear the inline styles after animation done\r\n collapseEl.css({\r\n 'display': '',\r\n 'height' : ''\r\n });\r\n\r\n // Clear collapsing class from the node\r\n vm.element.removeClass('collapsing');\r\n }\r\n );\r\n\r\n // Broadcast the collapse event so child items can also be collapsed\r\n $scope.$broadcast('msNavigation::collapse');\r\n });\r\n }\r\n\r\n /**\r\n * Expand\r\n */\r\n function expand()\r\n {\r\n // Grab the element that we are going to expand\r\n var expandEl = vm.element.children('ul');\r\n\r\n // Move the element out of the dom flow and\r\n // make it block so we can get its height\r\n expandEl.css({\r\n 'position' : 'absolute',\r\n 'visibility': 'hidden',\r\n 'display' : 'block',\r\n 'height' : 'auto'\r\n });\r\n\r\n // Grab the height\r\n var height = expandEl[0].offsetHeight;\r\n\r\n // Reset the style modifications\r\n expandEl.css({\r\n 'position' : '',\r\n 'visibility': '',\r\n 'display' : '',\r\n 'height' : ''\r\n });\r\n\r\n $scope.$evalAsync(function ()\r\n {\r\n // Set collapsed status\r\n vm.collapsed = false;\r\n\r\n // Add expanding class to the node\r\n vm.element.addClass('expanding');\r\n\r\n // Animate the height\r\n $animate.animate(expandEl,\r\n {\r\n 'display': 'block',\r\n 'height' : '0px'\r\n },\r\n {\r\n 'height': height + 'px'\r\n },\r\n vm.animateHeightClass\r\n ).then(\r\n function ()\r\n {\r\n // Clear the inline styles after animation done\r\n expandEl.css({\r\n 'height': ''\r\n });\r\n\r\n // Clear expanding class from the node\r\n vm.element.removeClass('expanding');\r\n }\r\n );\r\n\r\n // If item expanded, broadcast the collapse event from rootScope so that the other expanded items\r\n // can be collapsed. This is necessary for keeping only one parent expanded at any time\r\n $rootScope.$broadcast('msNavigation::collapse', vm.node._path);\r\n });\r\n }\r\n\r\n /**\r\n * Return the class\r\n *\r\n * @returns {*}\r\n */\r\n function getClass()\r\n {\r\n return vm.node.class;\r\n }\r\n\r\n /**\r\n * Check if node should be hidden\r\n *\r\n * @returns {boolean}\r\n */\r\n function isHidden()\r\n {\r\n if ( angular.isDefined(vm.node.hidden) && angular.isFunction(vm.node.hidden) )\r\n {\r\n return vm.node.hidden();\r\n }\r\n\r\n return false;\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationNodeDirective()\r\n {\r\n return {\r\n restrict : 'A',\r\n bindToController: {\r\n node: '=msNavigationNode'\r\n },\r\n controller : 'MsNavigationNodeController as vm',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-node');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavigationNodeCtrl)\r\n {\r\n // Add custom classes\r\n iElement.addClass(MsNavigationNodeCtrl.getClass());\r\n\r\n // Add group class if it's a group\r\n if ( MsNavigationNodeCtrl.group )\r\n {\r\n iElement.addClass('group');\r\n }\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationItemDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n require : '^msNavigationNode',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-item');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavigationNodeCtrl)\r\n {\r\n // If the item is collapsable...\r\n if ( MsNavigationNodeCtrl.collapsable )\r\n {\r\n iElement.on('click', MsNavigationNodeCtrl.toggleCollapsed);\r\n }\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n iElement.off('click');\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationHorizontalDirective(msNavigationService)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {\r\n root: '@'\r\n },\r\n controller : 'MsNavigationController as vm',\r\n templateUrl: 'app/core/directives/ms-navigation/templates/horizontal.html',\r\n transclude : true,\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-horizontal');\r\n\r\n return function postLink(scope)\r\n {\r\n // Store the navigation in the service for public access\r\n msNavigationService.setNavigationScope(scope);\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function MsNavigationHorizontalNodeController($scope, $element, $rootScope, $state, msNavigationService)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.element = $element;\r\n vm.node = $scope.node;\r\n vm.hasChildren = undefined;\r\n vm.group = undefined;\r\n\r\n // Methods\r\n vm.getClass = getClass;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Setup the initial values\r\n\r\n // Is active\r\n vm.isActive = false;\r\n\r\n // Has children?\r\n vm.hasChildren = vm.node.children.length > 0;\r\n\r\n // Is group?\r\n vm.group = !!(angular.isDefined(vm.node.group) && vm.node.group === true);\r\n\r\n // Mark all parents as active if we have a matching state\r\n // or the current state is a child of the node's state\r\n if ( vm.node.state === $state.current.name || $state.includes(vm.node.state) )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n $scope.$emit('msNavigation::stateMatched');\r\n\r\n // Also store the current active menu item\r\n msNavigationService.setActiveItem(vm.node, $scope);\r\n }\r\n\r\n $scope.$on('msNavigation::stateMatched', function ()\r\n {\r\n // Mark as active if has children\r\n if ( vm.hasChildren )\r\n {\r\n $scope.$evalAsync(function ()\r\n {\r\n vm.isActive = true;\r\n });\r\n }\r\n });\r\n\r\n // Listen for clearActive event\r\n $scope.$on('msNavigation::clearActive', function ()\r\n {\r\n if ( !vm.hasChildren )\r\n {\r\n return;\r\n }\r\n\r\n var activePathParts = [];\r\n\r\n var activeItem = msNavigationService.getActiveItem();\r\n if ( activeItem )\r\n {\r\n activePathParts = activeItem.node._path.split('.');\r\n }\r\n\r\n // Test for active path\r\n if ( activePathParts.indexOf(vm.node._id) > -1 )\r\n {\r\n $scope.$evalAsync(function ()\r\n {\r\n vm.isActive = true;\r\n });\r\n }\r\n else\r\n {\r\n $scope.$evalAsync(function ()\r\n {\r\n vm.isActive = false;\r\n });\r\n }\r\n\r\n });\r\n\r\n // Listen for $stateChangeSuccess event\r\n $scope.$on('$stateChangeSuccess', function ()\r\n {\r\n if ( vm.node.state === $state.current.name || $state.includes(vm.node.state) )\r\n {\r\n // If state params are defined, make sure they are\r\n // equal, otherwise do not set the active item\r\n if ( angular.isDefined(vm.node.stateParams) && angular.isDefined($state.params) && !angular.equals(vm.node.stateParams, $state.params) )\r\n {\r\n return;\r\n }\r\n\r\n // Update active item on state change\r\n msNavigationService.setActiveItem(vm.node, $scope);\r\n\r\n // Clear all active states except the one we're using\r\n $rootScope.$broadcast('msNavigation::clearActive');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Return the class\r\n *\r\n * @returns {*}\r\n */\r\n function getClass()\r\n {\r\n return vm.node.class;\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationHorizontalNodeDirective()\r\n {\r\n return {\r\n restrict : 'A',\r\n bindToController: {\r\n node: '=msNavigationHorizontalNode'\r\n },\r\n controller : 'MsNavigationHorizontalNodeController as vm',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-horizontal-node');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavigationHorizontalNodeCtrl)\r\n {\r\n // Add custom classes\r\n iElement.addClass(MsNavigationHorizontalNodeCtrl.getClass());\r\n\r\n // Add group class if it's a group\r\n if ( MsNavigationHorizontalNodeCtrl.group )\r\n {\r\n iElement.addClass('group');\r\n }\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavigationHorizontalItemDirective($mdMedia)\r\n {\r\n return {\r\n restrict: 'A',\r\n require : '^msNavigationHorizontalNode',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-navigation-horizontal-item');\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavigationHorizontalNodeCtrl)\r\n {\r\n iElement.on('click', onClick);\r\n\r\n function onClick()\r\n {\r\n if ( !MsNavigationHorizontalNodeCtrl.hasChildren || $mdMedia('gt-md') )\r\n {\r\n return;\r\n }\r\n\r\n iElement.toggleClass('expanded');\r\n }\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n iElement.off('click');\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('msNavFoldService', msNavFoldService)\r\n .directive('msNavIsFolded', msNavIsFoldedDirective)\r\n .controller('MsNavController', MsNavController)\r\n .directive('msNav', msNavDirective)\r\n .directive('msNavTitle', msNavTitleDirective)\r\n .directive('msNavButton', msNavButtonDirective)\r\n .directive('msNavToggle', msNavToggleDirective);\r\n\r\n /** @ngInject */\r\n function msNavFoldService()\r\n {\r\n var foldable = {};\r\n\r\n var service = {\r\n setFoldable : setFoldable,\r\n isNavFoldedOpen: isNavFoldedOpen,\r\n toggleFold : toggleFold,\r\n openFolded : openFolded,\r\n closeFolded : closeFolded\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Set the foldable\r\n *\r\n * @param scope\r\n * @param element\r\n */\r\n function setFoldable(scope, element)\r\n {\r\n foldable = {\r\n 'scope' : scope,\r\n 'element': element\r\n };\r\n }\r\n\r\n /**\r\n * Is folded open\r\n */\r\n function isNavFoldedOpen()\r\n {\r\n return foldable.scope.isNavFoldedOpen();\r\n }\r\n\r\n /**\r\n * Toggle fold\r\n */\r\n function toggleFold()\r\n {\r\n foldable.scope.toggleFold();\r\n }\r\n\r\n /**\r\n * Open folded navigation\r\n */\r\n function openFolded()\r\n {\r\n foldable.scope.openFolded();\r\n }\r\n\r\n /**\r\n * Close folded navigation\r\n */\r\n function closeFolded()\r\n {\r\n foldable.scope.closeFolded();\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavIsFoldedDirective($document, $rootScope, msNavFoldService)\r\n {\r\n return {\r\n restrict: 'A',\r\n link : function (scope, iElement, iAttrs)\r\n {\r\n var isFolded = (iAttrs.msNavIsFolded === 'true'),\r\n isFoldedOpen = false,\r\n body = angular.element($document[0].body),\r\n openOverlay = angular.element('
'),\r\n closeOverlay = angular.element('
'),\r\n sidenavEl = iElement.parent();\r\n\r\n // Initialize the service\r\n msNavFoldService.setFoldable(scope, iElement, isFolded);\r\n\r\n // Set the fold status for the first time\r\n if ( isFolded )\r\n {\r\n fold();\r\n }\r\n else\r\n {\r\n unfold();\r\n }\r\n\r\n /**\r\n * Is nav folded open\r\n */\r\n function isNavFoldedOpen()\r\n {\r\n return isFoldedOpen;\r\n }\r\n\r\n /**\r\n * Toggle fold\r\n */\r\n function toggleFold()\r\n {\r\n isFolded = !isFolded;\r\n\r\n if ( isFolded )\r\n {\r\n fold();\r\n }\r\n else\r\n {\r\n unfold();\r\n }\r\n }\r\n\r\n /**\r\n * Fold the navigation\r\n */\r\n function fold()\r\n {\r\n // Add classes\r\n body.addClass('ms-nav-folded');\r\n\r\n // Collapse everything and scroll to the top\r\n $rootScope.$broadcast('msNav::forceCollapse');\r\n iElement.scrollTop(0);\r\n\r\n // Append the openOverlay to the element\r\n sidenavEl.append(openOverlay);\r\n\r\n // Event listeners\r\n openOverlay.on('mouseenter touchstart', function (event)\r\n {\r\n openFolded(event);\r\n isFoldedOpen = true;\r\n });\r\n }\r\n\r\n /**\r\n * Open folded navigation\r\n */\r\n function openFolded(event)\r\n {\r\n if ( angular.isDefined(event) )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n body.addClass('ms-nav-folded-open');\r\n\r\n // Update the location\r\n $rootScope.$broadcast('msNav::expandMatchingToggles');\r\n\r\n // Remove open overlay\r\n sidenavEl.find(openOverlay).remove();\r\n\r\n // Append close overlay and bind its events\r\n sidenavEl.parent().append(closeOverlay);\r\n closeOverlay.on('mouseenter touchstart', function (event)\r\n {\r\n closeFolded(event);\r\n isFoldedOpen = false;\r\n });\r\n }\r\n\r\n /**\r\n * Close folded navigation\r\n */\r\n function closeFolded(event)\r\n {\r\n if ( angular.isDefined(event) )\r\n {\r\n event.preventDefault();\r\n }\r\n\r\n // Collapse everything and scroll to the top\r\n $rootScope.$broadcast('msNav::forceCollapse');\r\n iElement.scrollTop(0);\r\n\r\n body.removeClass('ms-nav-folded-open');\r\n\r\n // Remove close overlay\r\n sidenavEl.parent().find(closeOverlay).remove();\r\n\r\n // Append open overlay and bind its events\r\n sidenavEl.append(openOverlay);\r\n openOverlay.on('mouseenter touchstart', function (event)\r\n {\r\n openFolded(event);\r\n isFoldedOpen = true;\r\n });\r\n }\r\n\r\n /**\r\n * Unfold the navigation\r\n */\r\n function unfold()\r\n {\r\n body.removeClass('ms-nav-folded ms-nav-folded-open');\r\n\r\n // Update the location\r\n $rootScope.$broadcast('msNav::expandMatchingToggles');\r\n\r\n iElement.off('mouseenter mouseleave');\r\n }\r\n\r\n // Expose functions to the scope\r\n scope.toggleFold = toggleFold;\r\n scope.openFolded = openFolded;\r\n scope.closeFolded = closeFolded;\r\n scope.isNavFoldedOpen = isNavFoldedOpen;\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n openOverlay.off('mouseenter touchstart');\r\n closeOverlay.off('mouseenter touchstart');\r\n iElement.off('mouseenter mouseleave');\r\n });\r\n }\r\n };\r\n }\r\n\r\n\r\n /** @ngInject */\r\n function MsNavController()\r\n {\r\n var vm = this,\r\n disabled = false,\r\n toggleItems = [],\r\n lockedItems = [];\r\n\r\n // Data\r\n\r\n // Methods\r\n vm.isDisabled = isDisabled;\r\n vm.enable = enable;\r\n vm.disable = disable;\r\n vm.setToggleItem = setToggleItem;\r\n vm.getLockedItems = getLockedItems;\r\n vm.setLockedItem = setLockedItem;\r\n vm.clearLockedItems = clearLockedItems;\r\n\r\n //////////\r\n\r\n /**\r\n * Is navigation disabled\r\n *\r\n * @returns {boolean}\r\n */\r\n function isDisabled()\r\n {\r\n return disabled;\r\n }\r\n\r\n /**\r\n * Disable the navigation\r\n */\r\n function disable()\r\n {\r\n disabled = true;\r\n }\r\n\r\n /**\r\n * Enable the navigation\r\n */\r\n function enable()\r\n {\r\n disabled = false;\r\n }\r\n\r\n /**\r\n * Set toggle item\r\n *\r\n * @param element\r\n * @param scope\r\n */\r\n function setToggleItem(element, scope)\r\n {\r\n toggleItems.push({\r\n 'element': element,\r\n 'scope' : scope\r\n });\r\n }\r\n\r\n /**\r\n * Get locked items\r\n *\r\n * @returns {Array}\r\n */\r\n function getLockedItems()\r\n {\r\n return lockedItems;\r\n }\r\n\r\n /**\r\n * Set locked item\r\n *\r\n * @param element\r\n * @param scope\r\n */\r\n function setLockedItem(element, scope)\r\n {\r\n lockedItems.push({\r\n 'element': element,\r\n 'scope' : scope\r\n });\r\n }\r\n\r\n /**\r\n * Clear locked items list\r\n */\r\n function clearLockedItems()\r\n {\r\n lockedItems = [];\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msNavDirective($rootScope, $mdComponentRegistry, msNavFoldService)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {},\r\n controller: 'MsNavController',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-nav');\r\n\r\n return function postLink(scope)\r\n {\r\n // Update toggle status according to the ui-router current state\r\n $rootScope.$broadcast('msNav::expandMatchingToggles');\r\n\r\n // Update toggles on state changes\r\n var stateChangeSuccessEvent = $rootScope.$on('$stateChangeSuccess', function ()\r\n {\r\n $rootScope.$broadcast('msNav::expandMatchingToggles');\r\n\r\n // Close navigation sidenav on stateChangeSuccess\r\n $mdComponentRegistry.when('navigation').then(function (navigation)\r\n {\r\n navigation.close();\r\n\r\n if ( msNavFoldService.isNavFoldedOpen() )\r\n {\r\n msNavFoldService.closeFolded();\r\n }\r\n });\r\n });\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n stateChangeSuccessEvent();\r\n });\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavTitleDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-nav-title');\r\n\r\n return function postLink()\r\n {\r\n\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavButtonDirective()\r\n {\r\n return {\r\n restrict: 'AE',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-nav-button');\r\n\r\n return function postLink()\r\n {\r\n\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msNavToggleDirective($rootScope, $q, $animate, $state)\r\n {\r\n return {\r\n restrict: 'A',\r\n require : '^msNav',\r\n scope : true,\r\n compile : function (tElement, tAttrs)\r\n {\r\n tElement.addClass('ms-nav-toggle');\r\n\r\n // Add collapsed attr\r\n if ( angular.isUndefined(tAttrs.collapsed) )\r\n {\r\n tAttrs.collapsed = true;\r\n }\r\n\r\n tElement.attr('collapsed', tAttrs.collapsed);\r\n\r\n return function postLink(scope, iElement, iAttrs, MsNavCtrl)\r\n {\r\n var classes = {\r\n expanded : 'expanded',\r\n expandAnimation : 'expand-animation',\r\n collapseAnimation: 'collapse-animation'\r\n };\r\n\r\n // Store all related states\r\n var links = iElement.find('a');\r\n var states = [];\r\n var regExp = /\\(.*\\)/g;\r\n\r\n angular.forEach(links, function (link)\r\n {\r\n var state = angular.element(link).attr('ui-sref');\r\n\r\n if ( angular.isUndefined(state) )\r\n {\r\n return;\r\n }\r\n\r\n // Remove any parameter definition from the state name before storing it\r\n state = state.replace(regExp, '');\r\n\r\n states.push(state);\r\n });\r\n\r\n // Store toggle-able element and its scope in the main nav controller\r\n MsNavCtrl.setToggleItem(iElement, scope);\r\n\r\n // Click handler\r\n iElement.children('.ms-nav-button').on('click', toggle);\r\n\r\n // Toggle function\r\n function toggle()\r\n {\r\n // If navigation is disabled, do nothing...\r\n if ( MsNavCtrl.isDisabled() )\r\n {\r\n return;\r\n }\r\n\r\n // Disable the entire navigation to prevent spamming\r\n MsNavCtrl.disable();\r\n\r\n if ( isCollapsed() )\r\n {\r\n // Clear the locked items list\r\n MsNavCtrl.clearLockedItems();\r\n\r\n // Emit pushToLockedList event\r\n scope.$emit('msNav::pushToLockedList');\r\n\r\n // Collapse everything but locked items\r\n $rootScope.$broadcast('msNav::collapse');\r\n\r\n // Expand and then...\r\n expand().then(function ()\r\n {\r\n // Enable the entire navigation after animations completed\r\n MsNavCtrl.enable();\r\n });\r\n }\r\n else\r\n {\r\n // Collapse with all children\r\n scope.$broadcast('msNav::forceCollapse');\r\n }\r\n }\r\n\r\n // Cleanup\r\n scope.$on('$destroy', function ()\r\n {\r\n iElement.children('.ms-nav-button').off('click');\r\n });\r\n\r\n /*---------------------*/\r\n /* Scope Events */\r\n /*---------------------*/\r\n\r\n /**\r\n * Collapse everything but locked items\r\n */\r\n scope.$on('msNav::collapse', function ()\r\n {\r\n // Only collapse toggles that are not locked\r\n var lockedItems = MsNavCtrl.getLockedItems();\r\n var locked = false;\r\n\r\n angular.forEach(lockedItems, function (lockedItem)\r\n {\r\n if ( angular.equals(lockedItem.scope, scope) )\r\n {\r\n locked = true;\r\n }\r\n });\r\n\r\n if ( locked )\r\n {\r\n return;\r\n }\r\n\r\n // Collapse and then...\r\n collapse().then(function ()\r\n {\r\n // Enable the entire navigation after animations completed\r\n MsNavCtrl.enable();\r\n });\r\n });\r\n\r\n /**\r\n * Collapse everything\r\n */\r\n scope.$on('msNav::forceCollapse', function ()\r\n {\r\n // Collapse and then...\r\n collapse().then(function ()\r\n {\r\n // Enable the entire navigation after animations completed\r\n MsNavCtrl.enable();\r\n });\r\n });\r\n\r\n /**\r\n * Expand toggles that match with the current states\r\n */\r\n scope.$on('msNav::expandMatchingToggles', function ()\r\n {\r\n var currentState = $state.current.name;\r\n var shouldExpand = false;\r\n\r\n angular.forEach(states, function (state)\r\n {\r\n if ( currentState === state )\r\n {\r\n shouldExpand = true;\r\n }\r\n });\r\n\r\n if ( shouldExpand )\r\n {\r\n expand();\r\n }\r\n else\r\n {\r\n collapse();\r\n }\r\n });\r\n\r\n /**\r\n * Add toggle to the locked list\r\n */\r\n scope.$on('msNav::pushToLockedList', function ()\r\n {\r\n // Set expanded item on main nav controller\r\n MsNavCtrl.setLockedItem(iElement, scope);\r\n });\r\n\r\n /*---------------------*/\r\n /* Internal functions */\r\n /*---------------------*/\r\n\r\n /**\r\n * Is element collapsed\r\n *\r\n * @returns {bool}\r\n */\r\n function isCollapsed()\r\n {\r\n return iElement.attr('collapsed') === 'true';\r\n }\r\n\r\n /**\r\n * Is element expanded\r\n *\r\n * @returns {bool}\r\n */\r\n function isExpanded()\r\n {\r\n return !isCollapsed();\r\n }\r\n\r\n /**\r\n * Expand the toggle\r\n *\r\n * @returns $promise\r\n */\r\n function expand()\r\n {\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // If the menu item is already expanded, do nothing..\r\n if ( isExpanded() )\r\n {\r\n // Reject the deferred object\r\n deferred.reject({'error': true});\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n // Set element attr\r\n iElement.attr('collapsed', false);\r\n\r\n // Grab the element to expand\r\n var elementToExpand = angular.element(iElement.find('ms-nav-toggle-items')[0]);\r\n\r\n // Move the element out of the dom flow and\r\n // make it block so we can get its height\r\n elementToExpand.css({\r\n 'position' : 'absolute',\r\n 'visibility': 'hidden',\r\n 'display' : 'block',\r\n 'height' : 'auto'\r\n });\r\n\r\n // Grab the height\r\n var height = elementToExpand[0].offsetHeight;\r\n\r\n // Reset the style modifications\r\n elementToExpand.css({\r\n 'position' : '',\r\n 'visibility': '',\r\n 'display' : '',\r\n 'height' : ''\r\n });\r\n\r\n // Animate the height\r\n scope.$evalAsync(function ()\r\n {\r\n $animate.animate(elementToExpand,\r\n {\r\n 'display': 'block',\r\n 'height' : '0px'\r\n },\r\n {\r\n 'height': height + 'px'\r\n },\r\n classes.expandAnimation\r\n ).then(\r\n function ()\r\n {\r\n // Add expanded class\r\n elementToExpand.addClass(classes.expanded);\r\n\r\n // Clear the inline styles after animation done\r\n elementToExpand.css({'height': ''});\r\n\r\n // Resolve the deferred object\r\n deferred.resolve({'success': true});\r\n }\r\n );\r\n });\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Collapse the toggle\r\n *\r\n * @returns $promise\r\n */\r\n function collapse()\r\n {\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // If the menu item is already collapsed, do nothing..\r\n if ( isCollapsed() )\r\n {\r\n // Reject the deferred object\r\n deferred.reject({'error': true});\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n // Set element attr\r\n iElement.attr('collapsed', true);\r\n\r\n // Grab the element to collapse\r\n var elementToCollapse = angular.element(iElement.find('ms-nav-toggle-items')[0]);\r\n\r\n // Grab the height\r\n var height = elementToCollapse[0].offsetHeight;\r\n\r\n // Animate the height\r\n scope.$evalAsync(function ()\r\n {\r\n $animate.animate(elementToCollapse,\r\n {\r\n 'height': height + 'px'\r\n },\r\n {\r\n 'height': '0px'\r\n },\r\n classes.collapseAnimation\r\n ).then(\r\n function ()\r\n {\r\n // Remove expanded class\r\n elementToCollapse.removeClass(classes.expanded);\r\n\r\n // Clear the inline styles after animation done\r\n elementToCollapse.css({\r\n 'display': '',\r\n 'height' : ''\r\n });\r\n\r\n // Resolve the deferred object\r\n deferred.resolve({'success': true});\r\n }\r\n );\r\n });\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('msMaterialColorPickerController', msMaterialColorPickerController)\r\n .directive('msMaterialColorPicker', msMaterialColorPicker);\r\n\r\n /** @ngInject */\r\n function msMaterialColorPickerController($scope, $mdColorPalette, $mdMenu, fuseGenerator)\r\n {\r\n var vm = this;\r\n vm.palettes = $mdColorPalette; // Material Color Palette\r\n vm.selectedPalette = false;\r\n vm.selectedHues = false;\r\n $scope.$selectedColor = {};\r\n\r\n // Methods\r\n vm.activateHueSelection = activateHueSelection;\r\n vm.selectColor = selectColor;\r\n vm.removeColor = removeColor;\r\n\r\n /**\r\n * Initialize / Watch model changes\r\n */\r\n $scope.$watch('ngModel', setSelectedColor);\r\n\r\n /**\r\n * Activate Hue Selection\r\n * @param palette\r\n * @param hues\r\n */\r\n function activateHueSelection(palette, hues)\r\n {\r\n vm.selectedPalette = palette;\r\n vm.selectedHues = hues;\r\n }\r\n\r\n /**\r\n * Select Color\r\n * @type {selectColor}\r\n */\r\n function selectColor(palette, hue)\r\n {\r\n // Update Selected Color\r\n updateSelectedColor(palette, hue);\r\n\r\n // Update Model Value\r\n updateModel();\r\n\r\n // Hide The picker\r\n $mdMenu.hide();\r\n }\r\n\r\n function removeColor()\r\n {\r\n vm.selectedColor = {\r\n palette: '',\r\n hue : '',\r\n class : ''\r\n };\r\n\r\n activateHueSelection(false, false);\r\n\r\n updateModel();\r\n }\r\n\r\n /**\r\n * Set SelectedColor by model type\r\n */\r\n function setSelectedColor()\r\n {\r\n if ( !vm.modelCtrl.$viewValue || vm.modelCtrl.$viewValue === '' )\r\n {\r\n removeColor();\r\n return;\r\n }\r\n\r\n var palette, hue;\r\n\r\n // If ModelType Class\r\n if ( vm.msModelType === 'class' )\r\n {\r\n var color = vm.modelCtrl.$viewValue.split('-');\r\n if ( color.length >= 5 )\r\n {\r\n palette = color[1] + '-' + color[2];\r\n hue = color[3];\r\n }\r\n else\r\n {\r\n palette = color[1];\r\n hue = color[2];\r\n }\r\n }\r\n\r\n // If ModelType Object\r\n else if ( vm.msModelType === 'obj' )\r\n {\r\n palette = vm.modelCtrl.$viewValue.palette;\r\n hue = vm.modelCtrl.$viewValue.hue || 500;\r\n }\r\n\r\n // Update Selected Color\r\n updateSelectedColor(palette, hue);\r\n }\r\n\r\n /**\r\n * Update Selected Color\r\n * @param palette\r\n * @param hue\r\n */\r\n function updateSelectedColor(palette, hue)\r\n {\r\n vm.selectedColor = {\r\n palette : palette,\r\n hue : hue,\r\n class : 'md-' + palette + '-' + hue + '-bg',\r\n bgColorValue: fuseGenerator.rgba(vm.palettes[palette][hue].value),\r\n fgColorValue: fuseGenerator.rgba(vm.palettes[palette][hue].contrast)\r\n };\r\n\r\n // If Model object not Equals the selectedColor update it\r\n // it can be happen when the model only have pallete and hue values\r\n if ( vm.msModelType === 'obj' && !angular.equals(vm.selectedColor, vm.modelCtrl.$viewValue) )\r\n {\r\n // Update Model Value\r\n updateModel();\r\n }\r\n\r\n activateHueSelection(palette, vm.palettes[palette]);\r\n\r\n $scope.$selectedColor = vm.selectedColor;\r\n }\r\n\r\n /**\r\n * Update Model Value by model type\r\n */\r\n function updateModel()\r\n {\r\n if ( vm.msModelType === 'class' )\r\n {\r\n vm.modelCtrl.$setViewValue(vm.selectedColor.class);\r\n }\r\n else if ( vm.msModelType === 'obj' )\r\n {\r\n vm.modelCtrl.$setViewValue(vm.selectedColor);\r\n }\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msMaterialColorPicker()\r\n {\r\n return {\r\n require : ['msMaterialColorPicker', 'ngModel'],\r\n restrict : 'E',\r\n scope : {\r\n ngModel : '=',\r\n msModelType: '@?'\r\n },\r\n controller : 'msMaterialColorPickerController as vm',\r\n transclude : true,\r\n templateUrl: 'app/core/directives/ms-material-color-picker/ms-material-color-picker.html',\r\n link : function (scope, element, attrs, controllers, transclude)\r\n {\r\n var ctrl = controllers[0];\r\n\r\n /**\r\n * Pass model controller to directive controller\r\n */\r\n ctrl.modelCtrl = controllers[1];\r\n\r\n /**\r\n * ModelType: 'obj', 'class'(default)\r\n * @type {string|string}\r\n */\r\n ctrl.msModelType = scope.msModelType || 'class';\r\n\r\n transclude(scope, function (clone)\r\n {\r\n clone = clone.filter(function (i, el)\r\n {\r\n return ( el.nodeType === 1 ) ? true : false;\r\n });\r\n\r\n if ( clone.length )\r\n {\r\n element.find('ms-color-picker-button').replaceWith(clone);\r\n }\r\n });\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('msMasonryController', msMasonryController)\r\n .directive('msMasonry', msMasonry)\r\n .directive('msMasonryItem', msMasonryItem);\r\n\r\n /** @ngInject */\r\n function msMasonryController($scope, $window, $mdMedia, $timeout)\r\n {\r\n var vm = this,\r\n defaultOpts = {\r\n columnCount : 5,\r\n respectItemOrder: false,\r\n reLayoutDebounce: 400,\r\n responsive : {\r\n md: 3,\r\n sm: 2,\r\n xs: 1\r\n }\r\n },\r\n reLayoutTimeout = true;\r\n\r\n vm.options = null;\r\n vm.container = [];\r\n vm.containerPos = '';\r\n vm.columnWidth = '';\r\n vm.items = [];\r\n\r\n // Methods\r\n vm.reLayout = reLayout;\r\n vm.initialize = initialize;\r\n vm.waitImagesLoaded = waitImagesLoaded;\r\n\r\n function initialize()\r\n {\r\n vm.options = !vm.options ? defaultOpts : angular.extend(defaultOpts, vm.options);\r\n\r\n\r\n watchContainerResize();\r\n }\r\n\r\n $scope.$on('msMasonry:relayout', function ()\r\n {\r\n reLayout();\r\n });\r\n\r\n function waitImagesLoaded(element, callback)\r\n {\r\n if ( typeof imagesLoaded !== 'undefined' )\r\n {\r\n var imgLoad = $window.imagesLoaded(element);\r\n\r\n imgLoad.on('done', function ()\r\n {\r\n callback();\r\n });\r\n }\r\n else\r\n {\r\n callback();\r\n }\r\n }\r\n\r\n function watchContainerResize()\r\n {\r\n $scope.$watch(\r\n function ()\r\n {\r\n return vm.container.width();\r\n },\r\n function (newValue, oldValue)\r\n {\r\n if ( newValue !== oldValue )\r\n {\r\n reLayout();\r\n }\r\n }\r\n );\r\n }\r\n\r\n function reLayout()\r\n {\r\n // Debounce for relayout\r\n if ( reLayoutTimeout )\r\n {\r\n $timeout.cancel(reLayoutTimeout);\r\n }\r\n\r\n reLayoutTimeout = $timeout(function ()\r\n {\r\n start();\r\n\r\n $scope.$broadcast('msMasonry:relayoutFinished');\r\n\r\n }, vm.options.reLayoutDebounce);\r\n\r\n // Start relayout\r\n function start()\r\n {\r\n vm.containerPos = vm.container[0].getBoundingClientRect();\r\n\r\n updateColumnOptions();\r\n\r\n $scope.$broadcast('msMasonry:relayoutStarted');\r\n\r\n vm.items = vm.container.find('ms-masonry-item');\r\n\r\n //initialize lastRowBottomArr\r\n var referenceArr = Array.apply(null, new Array(vm.columnCount)).map(function ()\r\n {\r\n return 0;\r\n });\r\n\r\n // set item positions\r\n for ( var i = 0; i < vm.items.length; i++ )\r\n {\r\n var item = vm.items[i],\r\n xPos, yPos, column, refTop;\r\n\r\n item = angular.element(item);\r\n\r\n if ( item.scope() )\r\n {\r\n item.scope().$broadcast('msMasonryItem:startReLayout');\r\n }\r\n\r\n item.css({'width': vm.columnWidth});\r\n\r\n if ( vm.options.respectItemOrder )\r\n {\r\n column = i % vm.columnCount;\r\n refTop = referenceArr[column];\r\n }\r\n else\r\n {\r\n refTop = Math.min.apply(Math, referenceArr);\r\n column = referenceArr.indexOf(refTop);\r\n }\r\n\r\n referenceArr[column] = refTop + item[0].getBoundingClientRect().height;\r\n\r\n xPos = Math.round(column * vm.columnWidth);\r\n yPos = refTop;\r\n\r\n item.css({'transform': 'translate3d(' + xPos + 'px,' + yPos + 'px,0px)'});\r\n item.addClass('placed');\r\n\r\n if ( item.scope() )\r\n {\r\n item.scope().$broadcast('msMasonryItem:finishReLayout');\r\n }\r\n }\r\n }\r\n }\r\n\r\n function updateColumnOptions()\r\n {\r\n vm.columnCount = vm.options.columnCount;\r\n\r\n if ( $mdMedia('gt-md') )\r\n {\r\n vm.columnCount = vm.options.columnCount;\r\n }\r\n else if ( $mdMedia('md') )\r\n {\r\n vm.columnCount = (vm.columnCount > vm.options.responsive.md ? vm.options.responsive.md : vm.columnCount);\r\n }\r\n else if ( $mdMedia('sm') )\r\n {\r\n vm.columnCount = (vm.columnCount > vm.options.responsive.sm ? vm.options.responsive.sm : vm.columnCount);\r\n }\r\n else\r\n {\r\n vm.columnCount = vm.options.responsive.xs;\r\n }\r\n\r\n vm.columnWidth = vm.containerPos.width / vm.columnCount;\r\n\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msMasonry($timeout)\r\n {\r\n return {\r\n restrict : 'AEC',\r\n controller: 'msMasonryController',\r\n compile : compile\r\n };\r\n function compile(element, attributes)\r\n {\r\n return {\r\n pre : function preLink(scope, iElement, iAttrs, controller)\r\n {\r\n controller.options = angular.fromJson(attributes.options || '{}');\r\n controller.container = element;\r\n },\r\n post: function postLink(scope, iElement, iAttrs, controller)\r\n {\r\n $timeout(function ()\r\n {\r\n controller.initialize();\r\n });\r\n }\r\n };\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msMasonryItem()\r\n {\r\n return {\r\n restrict: 'AEC',\r\n require : '^msMasonry',\r\n priority: 1,\r\n link : link\r\n };\r\n\r\n function link(scope, element, attributes, controller)\r\n {\r\n controller.waitImagesLoaded(element, function ()\r\n {\r\n controller.reLayout();\r\n\r\n });\r\n\r\n scope.$on('msMasonryItem:finishReLayout', function ()\r\n {\r\n scope.$watch(function ()\r\n {\r\n return element.height();\r\n }, function (newVal, oldVal)\r\n {\r\n if ( newVal !== oldVal )\r\n {\r\n controller.reLayout();\r\n }\r\n });\r\n });\r\n\r\n element.on('$destroy', function ()\r\n {\r\n controller.reLayout();\r\n });\r\n }\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msInfoBar', msInfoBarDirective);\r\n\r\n /** @ngInject */\r\n function msInfoBarDirective($document)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {},\r\n transclude : true,\r\n templateUrl: 'app/core/directives/ms-info-bar/ms-info-bar.html',\r\n link : function (scope, iElement)\r\n {\r\n var body = $document.find('body'),\r\n bodyClass = 'ms-info-bar-active';\r\n\r\n // Add body class\r\n body.addClass(bodyClass);\r\n\r\n /**\r\n * Remove the info bar\r\n */\r\n function removeInfoBar()\r\n {\r\n body.removeClass(bodyClass);\r\n iElement.remove();\r\n scope.$destroy();\r\n }\r\n\r\n // Expose functions\r\n scope.removeInfoBar = removeInfoBar;\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('msCard', msCardDirective);\r\n\r\n /** @ngInject */\r\n function msCardDirective()\r\n {\r\n return {\r\n restrict: 'E',\r\n scope : {\r\n templatePath: '=template',\r\n card : '=ngModel',\r\n vm : '=viewModel'\r\n },\r\n template: '
',\r\n compile : function (tElement)\r\n {\r\n // Add class\r\n tElement.addClass('ms-card');\r\n\r\n return function postLink(scope, iElement)\r\n {\r\n // Methods\r\n scope.cardTemplateLoaded = cardTemplateLoaded;\r\n\r\n //////////\r\n\r\n /**\r\n * Emit cardTemplateLoaded event\r\n */\r\n function cardTemplateLoaded()\r\n {\r\n scope.$emit('msCard::cardTemplateLoaded', iElement);\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('msDatepickerFixConfig', msDatepickerFixConfigProvider)\r\n .directive('msDatepickerFix', msDatepickerFix);\r\n\r\n /** @ngInject */\r\n function msDatepickerFixConfigProvider()\r\n {\r\n\r\n // Default configuration\r\n var defaultConfiguration = {\r\n // To view\r\n formatter: function (val)\r\n {\r\n if ( !val )\r\n {\r\n return '';\r\n }\r\n\r\n return val === '' ? val : new Date(val);\r\n },\r\n // To model\r\n parser : function (val)\r\n {\r\n if ( !val )\r\n {\r\n return '';\r\n }\r\n var offset = moment(val).utcOffset();\r\n var date = new Date(moment(val).add(offset, 'm'));\r\n return date;\r\n }\r\n };\r\n\r\n // Methods\r\n this.config = config;\r\n\r\n //////////\r\n\r\n /**\r\n * Extend default configuration with the given one\r\n *\r\n * @param configuration\r\n */\r\n function config(configuration)\r\n {\r\n defaultConfiguration = angular.extend({}, defaultConfiguration, configuration);\r\n }\r\n\r\n /**\r\n * Service\r\n */\r\n this.$get = function ()\r\n {\r\n return defaultConfiguration;\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msDatepickerFix(msDatepickerFixConfig)\r\n {\r\n return {\r\n require: 'ngModel',\r\n link : function (scope, elem, attrs, ngModel)\r\n {\r\n ngModel.$formatters.unshift(msDatepickerFixConfig.formatter); // to view\r\n ngModel.$parsers.unshift(msDatepickerFixConfig.parser); // to model\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsFormWizardController', MsFormWizardController)\r\n .directive('msFormWizard', msFormWizardDirective)\r\n .directive('msFormWizardForm', msFormWizardFormDirective);\r\n\r\n /** @ngInject */\r\n function MsFormWizardController()\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.forms = [];\r\n vm.selectedIndex = 0;\r\n\r\n // Methods\r\n vm.registerForm = registerForm;\r\n\r\n vm.previousStep = previousStep;\r\n vm.nextStep = nextStep;\r\n vm.firstStep = firstStep;\r\n vm.lastStep = lastStep;\r\n\r\n vm.totalSteps = totalSteps;\r\n vm.isFirstStep = isFirstStep;\r\n vm.isLastStep = isLastStep;\r\n\r\n vm.currentStepInvalid = currentStepInvalid;\r\n vm.previousStepInvalid = previousStepInvalid;\r\n vm.formsIncomplete = formsIncomplete;\r\n vm.resetForm = resetForm;\r\n\r\n //////////\r\n\r\n /**\r\n * Register form\r\n *\r\n * @param form\r\n */\r\n function registerForm(form)\r\n {\r\n vm.forms.push(form);\r\n }\r\n\r\n /**\r\n * Go to previous step\r\n */\r\n function previousStep()\r\n {\r\n if ( isFirstStep() )\r\n {\r\n return;\r\n }\r\n\r\n vm.selectedIndex--;\r\n }\r\n\r\n /**\r\n * Go to next step\r\n */\r\n function nextStep()\r\n {\r\n if ( isLastStep() )\r\n {\r\n return;\r\n }\r\n\r\n vm.selectedIndex++;\r\n }\r\n\r\n /**\r\n * Go to first step\r\n */\r\n function firstStep()\r\n {\r\n vm.selectedIndex = 0;\r\n }\r\n\r\n /**\r\n * Go to last step\r\n */\r\n function lastStep()\r\n {\r\n vm.selectedIndex = totalSteps() - 1;\r\n }\r\n\r\n /**\r\n * Return total steps\r\n *\r\n * @returns {int}\r\n */\r\n function totalSteps()\r\n {\r\n return vm.forms.length;\r\n }\r\n\r\n /**\r\n * Is first step?\r\n *\r\n * @returns {boolean}\r\n */\r\n function isFirstStep()\r\n {\r\n return vm.selectedIndex === 0;\r\n }\r\n\r\n /**\r\n * Is last step?\r\n *\r\n * @returns {boolean}\r\n */\r\n function isLastStep()\r\n {\r\n return vm.selectedIndex === totalSteps() - 1;\r\n }\r\n\r\n /**\r\n * Is current step invalid?\r\n *\r\n * @returns {boolean}\r\n */\r\n function currentStepInvalid()\r\n {\r\n return angular.isDefined(vm.forms[vm.selectedIndex]) && vm.forms[vm.selectedIndex].$invalid;\r\n }\r\n\r\n /**\r\n * Is previous step invalid?\r\n *\r\n * @returns {boolean}\r\n */\r\n function previousStepInvalid()\r\n {\r\n return vm.selectedIndex > 0 && angular.isDefined(vm.forms[vm.selectedIndex - 1]) && vm.forms[vm.selectedIndex - 1].$invalid;\r\n }\r\n\r\n /**\r\n * Check if there is any incomplete forms\r\n *\r\n * @returns {boolean}\r\n */\r\n function formsIncomplete()\r\n {\r\n for ( var x = 0; x < vm.forms.length; x++ )\r\n {\r\n if ( vm.forms[x].$invalid )\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Reset form\r\n */\r\n function resetForm()\r\n {\r\n // Go back to the first step\r\n vm.selectedIndex = 0;\r\n\r\n // Make sure all the forms are back in the $pristine & $untouched status\r\n for ( var x = 0; x < vm.forms.length; x++ )\r\n {\r\n vm.forms[x].$setPristine();\r\n vm.forms[x].$setUntouched();\r\n }\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msFormWizardDirective()\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : true,\r\n controller: 'MsFormWizardController as msWizard',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-form-wizard');\r\n\r\n return function postLink()\r\n {\r\n\r\n };\r\n }\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function msFormWizardFormDirective()\r\n {\r\n return {\r\n restrict: 'A',\r\n require : ['form', '^msFormWizard'],\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-form-wizard-form');\r\n\r\n return function postLink(scope, iElement, iAttrs, ctrls)\r\n {\r\n var formCtrl = ctrls[0],\r\n MsFormWizardCtrl = ctrls[1];\r\n\r\n MsFormWizardCtrl.registerForm(formCtrl);\r\n };\r\n }\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .service('fuseTheming', fuseThemingService);\r\n\r\n /** @ngInject */\r\n function fuseThemingService($cookies, $log, $mdTheming)\r\n {\r\n var service = {\r\n getRegisteredPalettes: getRegisteredPalettes,\r\n getRegisteredThemes : getRegisteredThemes,\r\n setActiveTheme : setActiveTheme,\r\n setThemesList : setThemesList,\r\n themes : {\r\n list : {},\r\n active: {\r\n 'name' : '',\r\n 'theme': {}\r\n }\r\n }\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Get registered palettes\r\n *\r\n * @returns {*}\r\n */\r\n function getRegisteredPalettes()\r\n {\r\n return $mdTheming.PALETTES;\r\n }\r\n\r\n /**\r\n * Get registered themes\r\n *\r\n * @returns {*}\r\n */\r\n function getRegisteredThemes()\r\n {\r\n return $mdTheming.THEMES;\r\n }\r\n\r\n /**\r\n * Set active theme\r\n *\r\n * @param themeName\r\n */\r\n function setActiveTheme(themeName)\r\n {\r\n // If theme does not exist, fallback to the default theme\r\n if ( angular.isUndefined(service.themes.list[themeName]) )\r\n {\r\n // If there is no theme called \"default\"...\r\n if ( angular.isUndefined(service.themes.list.default) )\r\n {\r\n $log.error('You must have at least one theme named \"default\"');\r\n return;\r\n }\r\n\r\n $log.warn('The theme \"' + themeName + '\" does not exist! Falling back to the \"default\" theme.');\r\n\r\n // Otherwise set theme to default theme\r\n service.themes.active.name = 'default';\r\n service.themes.active.theme = service.themes.list.default;\r\n $cookies.put('selectedTheme', service.themes.active.name);\r\n\r\n return;\r\n }\r\n\r\n service.themes.active.name = themeName;\r\n service.themes.active.theme = service.themes.list[themeName];\r\n $cookies.put('selectedTheme', themeName);\r\n }\r\n\r\n /**\r\n * Set available themes list\r\n *\r\n * @param themeList\r\n */\r\n function setThemesList(themeList)\r\n {\r\n service.themes.list = themeList;\r\n }\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($mdThemingProvider, fusePalettes, fuseThemes)\r\n {\r\n\r\n $mdThemingProvider.theme(\"success-toast\");\r\n $mdThemingProvider.theme(\"error-toast\");\r\n\r\n // Inject Cookies Service\r\n var $cookies;\r\n angular.injector(['ngCookies']).invoke([\r\n '$cookies', function (_$cookies)\r\n {\r\n $cookies = _$cookies;\r\n }\r\n ]);\r\n\r\n // Check if custom theme exist in cookies\r\n var customTheme = $cookies.getObject('customTheme');\r\n if ( customTheme )\r\n {\r\n fuseThemes['custom'] = customTheme;\r\n }\r\n\r\n $mdThemingProvider.alwaysWatchTheme(true);\r\n\r\n // Define custom palettes\r\n angular.forEach(fusePalettes, function (palette)\r\n {\r\n $mdThemingProvider.definePalette(palette.name, palette.options);\r\n });\r\n\r\n // Register custom themes\r\n angular.forEach(fuseThemes, function (theme, themeName)\r\n {\r\n $mdThemingProvider.theme(themeName)\r\n .primaryPalette(theme.primary.name, theme.primary.hues)\r\n .accentPalette(theme.accent.name, theme.accent.hues)\r\n .warnPalette(theme.warn.name, theme.warn.hues)\r\n .backgroundPalette(theme.background.name, theme.background.hues);\r\n });\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n var fuseThemes = {\r\n default : {\r\n primary : {\r\n name: 'fuse-paleblue',\r\n hues: {\r\n 'default': '700',\r\n 'hue-1' : '500',\r\n 'hue-2' : '600',\r\n 'hue-3' : '400'\r\n }\r\n },\r\n accent : {\r\n name: 'yellow',\r\n hues: {\r\n 'default': '100',\r\n 'hue-1' : '400',\r\n 'hue-2' : '700',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n warn : {\r\n name: 'red'\r\n },\r\n background: {\r\n name: 'grey',\r\n hues: {\r\n 'default': 'A100',\r\n 'hue-1' : 'A100',\r\n 'hue-2' : '100',\r\n 'hue-3' : '300'\r\n }\r\n }\r\n },\r\n 'pinkTheme': {\r\n primary : {\r\n name: 'blue-grey',\r\n hues: {\r\n 'default': '800',\r\n 'hue-1' : '600',\r\n 'hue-2' : '400',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n accent : {\r\n name: 'pink',\r\n hues: {\r\n 'default': '400',\r\n 'hue-1' : '300',\r\n 'hue-2' : '600',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n warn : {\r\n name: 'blue'\r\n },\r\n background: {\r\n name: 'grey',\r\n hues: {\r\n 'default': 'A100',\r\n 'hue-1' : 'A100',\r\n 'hue-2' : '100',\r\n 'hue-3' : '300'\r\n }\r\n }\r\n },\r\n 'tealTheme': {\r\n primary : {\r\n name: 'fuse-blue',\r\n hues: {\r\n 'default': '900',\r\n 'hue-1' : '600',\r\n 'hue-2' : '500',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n accent : {\r\n name: 'teal',\r\n hues: {\r\n 'default': '500',\r\n 'hue-1' : '400',\r\n 'hue-2' : '600',\r\n 'hue-3' : 'A100'\r\n }\r\n },\r\n warn : {\r\n name: 'deep-orange'\r\n },\r\n background: {\r\n name: 'grey',\r\n hues: {\r\n 'default': 'A100',\r\n 'hue-1' : 'A100',\r\n 'hue-2' : '100',\r\n 'hue-3' : '300'\r\n }\r\n }\r\n }\r\n };\r\n\r\n angular\r\n .module('app.core')\r\n .constant('fuseThemes', fuseThemes);\r\n})();\n(function () {\r\n 'use strict';\r\n\r\n var fusePalettes = [\r\n {\r\n name: 'yellow',\r\n options: {\r\n '50': '#000', //background menu with focus\r\n '100': '#4ED9FF', //background top pages\r\n '200': '#9ab8e5',\r\n '300': '#78a0dc',\r\n '400': '#5688d3',\r\n '500': '#3470ca',\r\n '600': '#2e62b1',\r\n '700': '#275498',\r\n '800': '#21467e',\r\n '900': '#1a3865',\r\n 'A100': '#c2d4ef',\r\n 'A200': '#9ab8e5',\r\n 'A400': '#5688d3',\r\n 'A700': '#275498',\r\n 'contrastDefaultColor': 'light',\r\n 'contrastDarkColors': '50 100 200 A100',\r\n 'contrastStrongLightColors': '300 400'\r\n }\r\n },\r\n {\r\n name: 'fuse-blue',\r\n options: {\r\n '50': '#ebf1fa',\r\n '100': '#c2d4ef',\r\n '200': '#9ab8e5',\r\n '300': '#78a0dc',\r\n '400': '#5688d3',\r\n '500': '#3470ca',\r\n '600': '#2e62b1',\r\n '700': '#275498',\r\n '800': '#21467e',\r\n '900': '#1a3865',\r\n 'A100': '#c2d4ef',\r\n 'A200': '#9ab8e5',\r\n 'A400': '#5688d3',\r\n 'A700': '#275498',\r\n 'contrastDefaultColor': 'light',\r\n 'contrastDarkColors': '50 100 200 A100',\r\n 'contrastStrongLightColors': '300 400'\r\n }\r\n },\r\n {\r\n name: 'fuse-paleblue',\r\n options: {\r\n '50': '#ececee',\r\n '100': '#c5c6cb',\r\n '200': '#9ea1a9',\r\n '300': '#7d818c',\r\n '400': '#5c616f',\r\n '500': '#3c4252',\r\n '600': '#353a48',\r\n '700': '#2d323e',\r\n '800': '#262933',\r\n '900': '#1e2129',\r\n 'A100': '#c5c6cb',\r\n 'A200': '#9ea1a9',\r\n 'A400': '#5c616f',\r\n 'A700': '#2d323e',\r\n 'contrastDefaultColor': 'light',\r\n 'contrastDarkColors': '50 100 200 A100',\r\n 'contrastStrongLightColors': '300 400'\r\n }\r\n }\r\n ];\r\n\r\n angular\r\n .module('app.core')\r\n .constant('fusePalettes', fusePalettes);\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('fuseGenerator', fuseGeneratorService);\r\n\r\n /** @ngInject */\r\n function fuseGeneratorService($cookies, $log, fuseTheming)\r\n {\r\n // Storage for simplified themes object\r\n var themes = {};\r\n\r\n var service = {\r\n generate: generate,\r\n rgba : rgba\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Generate less variables for each theme from theme's\r\n * palette by using material color naming conventions\r\n */\r\n function generate()\r\n {\r\n // Get registered themes and palettes and copy\r\n // them so we don't modify the original objects\r\n var registeredThemes = angular.copy(fuseTheming.getRegisteredThemes());\r\n var registeredPalettes = angular.copy(fuseTheming.getRegisteredPalettes());\r\n\r\n // First, create a simplified object that stores\r\n // all registered themes and their colors\r\n\r\n // Iterate through registered themes\r\n angular.forEach(registeredThemes, function (registeredTheme)\r\n {\r\n themes[registeredTheme.name] = {};\r\n\r\n // Iterate through color types (primary, accent, warn & background)\r\n angular.forEach(registeredTheme.colors, function (colorType, colorTypeName)\r\n {\r\n themes[registeredTheme.name][colorTypeName] = {\r\n 'name' : colorType.name,\r\n 'levels': {\r\n 'default': {\r\n 'color' : rgba(registeredPalettes[colorType.name][colorType.hues.default].value),\r\n 'contrast1': rgba(registeredPalettes[colorType.name][colorType.hues.default].contrast, 1),\r\n 'contrast2': rgba(registeredPalettes[colorType.name][colorType.hues.default].contrast, 2),\r\n 'contrast3': rgba(registeredPalettes[colorType.name][colorType.hues.default].contrast, 3),\r\n 'contrast4': rgba(registeredPalettes[colorType.name][colorType.hues.default].contrast, 4)\r\n },\r\n 'hue1' : {\r\n 'color' : rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].value),\r\n 'contrast1': rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].contrast, 1),\r\n 'contrast2': rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].contrast, 2),\r\n 'contrast3': rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].contrast, 3),\r\n 'contrast4': rgba(registeredPalettes[colorType.name][colorType.hues['hue-1']].contrast, 4)\r\n },\r\n 'hue2' : {\r\n 'color' : rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].value),\r\n 'contrast1': rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].contrast, 1),\r\n 'contrast2': rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].contrast, 2),\r\n 'contrast3': rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].contrast, 3),\r\n 'contrast4': rgba(registeredPalettes[colorType.name][colorType.hues['hue-2']].contrast, 4)\r\n },\r\n 'hue3' : {\r\n 'color' : rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].value),\r\n 'contrast1': rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].contrast, 1),\r\n 'contrast2': rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].contrast, 2),\r\n 'contrast3': rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].contrast, 3),\r\n 'contrast4': rgba(registeredPalettes[colorType.name][colorType.hues['hue-3']].contrast, 4)\r\n }\r\n }\r\n };\r\n });\r\n });\r\n\r\n // Process themes one more time and then store them in the service for external use\r\n processAndStoreThemes(themes);\r\n\r\n // Iterate through simplified themes\r\n // object and create style variables\r\n var styleVars = {};\r\n\r\n // Iterate through registered themes\r\n angular.forEach(themes, function (theme, themeName)\r\n {\r\n styleVars = {};\r\n styleVars['@themeName'] = themeName;\r\n\r\n // Iterate through color types (primary, accent, warn & background)\r\n angular.forEach(theme, function (colorTypes, colorTypeName)\r\n {\r\n // Iterate through color levels (default, hue1, hue2 & hue3)\r\n angular.forEach(colorTypes.levels, function (colors, colorLevelName)\r\n {\r\n // Iterate through color name (color, contrast1, contrast2, contrast3 & contrast4)\r\n angular.forEach(colors, function (color, colorName)\r\n {\r\n styleVars['@' + colorTypeName + ucfirst(colorLevelName) + ucfirst(colorName)] = color;\r\n });\r\n });\r\n });\r\n\r\n // Render styles\r\n render(styleVars);\r\n });\r\n }\r\n\r\n // ---------------------------\r\n // INTERNAL HELPER FUNCTIONS\r\n // ---------------------------\r\n\r\n /**\r\n * Process and store themes for global use\r\n *\r\n * @param _themes\r\n */\r\n function processAndStoreThemes(_themes)\r\n {\r\n // Here we will go through every registered theme one more time\r\n // and try to simplify their objects as much as possible for\r\n // easier access to their properties.\r\n var themes = angular.copy(_themes);\r\n\r\n // Iterate through themes\r\n angular.forEach(themes, function (theme)\r\n {\r\n // Iterate through color types (primary, accent, warn & background)\r\n angular.forEach(theme, function (colorType, colorTypeName)\r\n {\r\n theme[colorTypeName] = colorType.levels;\r\n theme[colorTypeName].color = colorType.levels.default.color;\r\n theme[colorTypeName].contrast1 = colorType.levels.default.contrast1;\r\n theme[colorTypeName].contrast2 = colorType.levels.default.contrast2;\r\n theme[colorTypeName].contrast3 = colorType.levels.default.contrast3;\r\n theme[colorTypeName].contrast4 = colorType.levels.default.contrast4;\r\n delete theme[colorTypeName].default;\r\n });\r\n });\r\n\r\n // Store themes and set selected theme for the first time\r\n fuseTheming.setThemesList(themes);\r\n\r\n // Remember selected theme.\r\n var selectedTheme = $cookies.get('selectedTheme');\r\n\r\n if ( selectedTheme )\r\n {\r\n fuseTheming.setActiveTheme(selectedTheme);\r\n }\r\n else\r\n {\r\n fuseTheming.setActiveTheme('default');\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Render css files\r\n *\r\n * @param styleVars\r\n */\r\n function render(styleVars)\r\n {\r\n var cssTemplate = '/* Content hack because they wont fix */\\n/* https://github.com/angular/material/pull/8067 */\\n[md-theme=\"@themeName\"] md-content.md-hue-1,\\nmd-content.md-@themeName-theme.md-hue-1 {\\n color: @backgroundHue1Contrast1;\\n background-color: @backgroundHue1Color;\\n}\\n\\n[md-theme=\"@themeName\"] md-content.md-hue-2,\\nmd-content.md-@themeName-theme.md-hue-2 {\\n color: @backgroundHue2Contrast1;\\n background-color: @backgroundHue2Color;\\n}\\n\\n[md-theme=\"@themeName\"] md-content.md-hue-3,\\n md-content.md-@themeName-theme.md-hue-3 {\\n color: @backgroundHue3Contrast1;\\n background-color: @backgroundHue3Color;\\n}\\n\\n/* Text Colors */\\n[md-theme=\"@themeName\"] a {\\n color: @accentDefaultColor;\\n}\\n\\n[md-theme=\"@themeName\"] .secondary-text,\\n[md-theme=\"@themeName\"] .icon {\\n color: @backgroundDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .hint-text,\\n[md-theme=\"@themeName\"] .disabled-text {\\n color: @backgroundDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .fade-text,\\n[md-theme=\"@themeName\"] .divider {\\n color: @backgroundDefaultContrast4;\\n}\\n\\n/* Primary */\\n[md-theme=\"@themeName\"] .md-primary-bg {\\n background-color: @primaryDefaultColor;\\n color: @primaryDefaultContrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg .secondary-text,\\n[md-theme=\"@themeName\"] .md-primary-bg .icon {\\n color: @primaryDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg .hint-text,\\n[md-theme=\"@themeName\"] .md-primary-bg .disabled-text {\\n color: @primaryDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg .fade-text,\\n[md-theme=\"@themeName\"] .md-primary-bg .divider {\\n color: @primaryDefaultContrast4;\\n}\\n\\n/* Primary, Hue-1 */\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 {\\n background-color: @primaryHue1Color;\\n color: @primaryHue1Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .secondary-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .icon {\\n color: @primaryHue1Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .hint-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .disabled-text {\\n color: @primaryHue1Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .fade-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-1 .divider {\\n color: @primaryHue1Contrast4;\\n}\\n\\n/* Primary, Hue-2 */\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 {\\n background-color: @primaryHue2Color;\\n color: @primaryHue2Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .secondary-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .icon {\\n color: @primaryHue2Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .hint-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .disabled-text {\\n color: @primaryHue2Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .fade-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-2 .divider {\\n color: @primaryHue2Contrast4;\\n}\\n\\n/* Primary, Hue-3 */\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 {\\n background-color: @primaryHue3Color;\\n color: @primaryHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .secondary-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .icon {\\n color: @primaryHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .hint-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .disabled-text {\\n color: @primaryHue3Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .fade-text,\\n[md-theme=\"@themeName\"] .md-primary-bg.md-hue-3 .divider {\\n color: @primaryHue3Contrast4;\\n}\\n\\n/* Primary foreground */\\n[md-theme=\"@themeName\"] .md-primary-fg {\\n color: @primaryDefaultColor !important;\\n}\\n\\n/* Primary foreground, Hue-1 */\\n[md-theme=\"@themeName\"] .md-primary-fg.md-hue-1 {\\n color: @primaryHue1Color !important;\\n}\\n\\n/* Primary foreground, Hue-2 */\\n[md-theme=\"@themeName\"] .md-primary-fg.md-hue-2 {\\n color: @primaryHue2Color !important;\\n}\\n\\n/* Primary foreground, Hue-3 */\\n[md-theme=\"@themeName\"] .md-primary-fg.md-hue-3 {\\n color: @primaryHue3Color !important;\\n}\\n\\n/* Accent */\\n[md-theme=\"@themeName\"] .md-accent-bg {\\n background-color: @accentDefaultColor;\\n color: @accentDefaultContrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg .secondary-text,\\n[md-theme=\"@themeName\"] .md-accent-bg .icon {\\n color: @accentDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg .hint-text,\\n[md-theme=\"@themeName\"] .md-accent-bg .disabled-text {\\n color: @accentDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg .fade-text,\\n[md-theme=\"@themeName\"] .md-accent-bg .divider {\\n color: @accentDefaultContrast4;\\n}\\n\\n/* Accent, Hue-1 */\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 {\\n background-color: @accentHue1Color;\\n color: @accentHue1Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .secondary-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .icon {\\n color: @accentHue1Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .hint-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .disabled-text {\\n color: @accentHue1Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .fade-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-1 .divider {\\n color: @accentHue1Contrast4;\\n}\\n\\n/* Accent, Hue-2 */\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 {\\n background-color: @accentHue2Color;\\n color: @accentHue2Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .secondary-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .icon {\\n color: @accentHue2Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .hint-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .disabled-text {\\n color: @accentHue2Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .fade-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-2 .divider {\\n color: @accentHue2Contrast4;\\n}\\n\\n/* Accent, Hue-3 */\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 {\\n background-color: @accentHue3Color;\\n color: @accentHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .secondary-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .icon {\\n color: @accentHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .hint-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .disabled-text {\\n color: @accentHue3Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .fade-text,\\n[md-theme=\"@themeName\"] .md-accent-bg.md-hue-3 .divider {\\n color: @accentHue3Contrast4;\\n}\\n\\n/* Accent foreground */\\n[md-theme=\"@themeName\"] .md-accent-fg {\\n color: @accentDefaultColor !important;\\n}\\n\\n/* Accent foreground, Hue-1 */\\n[md-theme=\"@themeName\"] .md-accent-fg.md-hue-1 {\\n color: @accentHue1Color !important;\\n}\\n\\n/* Accent foreground, Hue-2 */\\n[md-theme=\"@themeName\"] .md-accent-fg.md-hue-2 {\\n color: @accentHue2Color !important;\\n}\\n\\n/* Accent foreground, Hue-3 */\\n[md-theme=\"@themeName\"] .md-accent-fg.md-hue-3 {\\n color: @accentHue3Color !important;\\n}\\n\\n/* Warn */\\n[md-theme=\"@themeName\"] .md-warn-bg {\\n background-color: @warnDefaultColor;\\n color: @warnDefaultContrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg .secondary-text,\\n[md-theme=\"@themeName\"] .md-warn-bg .icon {\\n color: @warnDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg .hint-text,\\n[md-theme=\"@themeName\"] .md-warn-bg .disabled-text {\\n color: @warnDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg .fade-text,\\n[md-theme=\"@themeName\"] .md-warn-bg .divider {\\n color: @warnDefaultContrast4;\\n}\\n\\n/* Warn, Hue-1 */\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 {\\n background-color: @warnHue1Color;\\n color: @warnHue1Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .secondary-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .icon {\\n color: @warnHue1Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .hint-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .disabled-text {\\n color: @warnHue1Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .fade-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-1 .divider {\\n color: @warnHue1Contrast4;\\n}\\n\\n/* Warn, Hue-2 */\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 {\\n background-color: @warnHue2Color;\\n color: @warnHue2Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .secondary-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .icon {\\n color: @warnHue2Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .hint-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .disabled-text {\\n color: @warnHue2Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .fade-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-2 .divider {\\n color: @warnHue2Contrast4;\\n}\\n\\n/* Warn, Hue-3 */\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 {\\n background-color: @warnHue3Color;\\n color: @warnHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .secondary-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .icon {\\n color: @warnHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .hint-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .disabled-text {\\n color: @warnHue3Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .fade-text,\\n[md-theme=\"@themeName\"] .md-warn-bg.md-hue-3 .divider {\\n color: @warnHue3Contrast4;\\n}\\n\\n/* Warn foreground */\\n[md-theme=\"@themeName\"] .md-warn-fg {\\n color: @warnDefaultColor !important;\\n}\\n\\n/* Warn foreground, Hue-1 */\\n[md-theme=\"@themeName\"] .md-warn-fg.md-hue-1 {\\n color: @warnHue1Color !important;\\n}\\n\\n/* Warn foreground, Hue-2 */\\n[md-theme=\"@themeName\"] .md-warn-fg.md-hue-2 {\\n color: @warnHue2Color !important;\\n}\\n\\n/* Warn foreground, Hue-3 */\\n[md-theme=\"@themeName\"] .md-warn-fg.md-hue-3 {\\n color: @warnHue3Color !important;\\n}\\n\\n/* Background */\\n[md-theme=\"@themeName\"] .md-background-bg {\\n background-color: @backgroundDefaultColor;\\n color: @backgroundDefaultContrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg .secondary-text,\\n[md-theme=\"@themeName\"] .md-background-bg .icon {\\n color: @backgroundDefaultContrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg .hint-text,\\n[md-theme=\"@themeName\"] .md-background-bg .disabled-text {\\n color: @backgroundDefaultContrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg .fade-text,\\n[md-theme=\"@themeName\"] .md-background-bg .divider {\\n color: @backgroundDefaultContrast4;\\n}\\n\\n/* Background, Hue-1 */\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 {\\n background-color: @backgroundHue1Color;\\n color: @backgroundHue1Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .secondary-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .icon {\\n color: @backgroundHue1Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .hint-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .disabled-text {\\n color: @backgroundHue1Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .fade-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-1 .divider {\\n color: @backgroundHue1Contrast4;\\n}\\n\\n/* Background, Hue-2 */\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 {\\n background-color: @backgroundHue2Color;\\n color: @backgroundHue2Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .secondary-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .icon {\\n color: @backgroundHue2Contrast2;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .hint-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .disabled-text {\\n color: @backgroundHue2Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .fade-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-2 .divider {\\n color: @backgroundHue2Contrast4;\\n}\\n\\n/* Background, Hue-3 */\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 {\\n background-color: @backgroundHue3Color;\\n color: @backgroundHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .secondary-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .icon {\\n color: @backgroundHue3Contrast1;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .hint-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .disabled-text {\\n color: @backgroundHue3Contrast3;\\n}\\n\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .fade-text,\\n[md-theme=\"@themeName\"] .md-background-bg.md-hue-3 .divider {\\n color: @backgroundHue3Contrast4;\\n}\\n\\n/* Background foreground */\\n[md-theme=\"@themeName\"] .md-background-fg {\\n color: @backgroundDefaultColor !important;\\n}\\n\\n/* Background foreground, Hue-1 */\\n[md-theme=\"@themeName\"] .md-background-fg.md-hue-1 {\\n color: @backgroundHue1Color !important;\\n}\\n\\n/* Background foreground, Hue-2 */\\n[md-theme=\"@themeName\"] .md-background-fg.md-hue-2 {\\n color: @backgroundHue2Color !important;\\n}\\n\\n/* Background foreground, Hue-3 */\\n[md-theme=\"@themeName\"] .md-background-fg.md-hue-3 {\\n color: @backgroundHue3Color !important;\\n}';\r\n\r\n var regex = new RegExp(Object.keys(styleVars).join('|'), 'gi');\r\n var css = cssTemplate.replace(regex, function (matched)\r\n {\r\n return styleVars[matched];\r\n });\r\n\r\n var headEl = angular.element('head');\r\n var styleEl = angular.element('');\r\n styleEl.html(css);\r\n headEl.append(styleEl);\r\n }\r\n\r\n /**\r\n * Convert color array to rgb/rgba\r\n * Also apply contrasts if needed\r\n *\r\n * @param color\r\n * @param _contrastLevel\r\n * @returns {string}\r\n */\r\n function rgba(color, _contrastLevel)\r\n {\r\n var contrastLevel = _contrastLevel || false;\r\n\r\n // Convert 255,255,255,0.XX to 255,255,255\r\n // According to Google's Material design specs, white primary\r\n // text must have opacity of 1 and we will fix that here\r\n // because Angular Material doesn't care about that spec\r\n if ( color.length === 4 && color[0] === 255 && color[1] === 255 && color[2] === 255 )\r\n {\r\n color.splice(3, 4);\r\n }\r\n\r\n // If contrast level provided, apply it to the current color\r\n if ( contrastLevel )\r\n {\r\n color = applyContrast(color, contrastLevel);\r\n }\r\n\r\n // Convert color array to color string (rgb/rgba)\r\n if ( color.length === 3 )\r\n {\r\n return 'rgb(' + color.join(',') + ')';\r\n }\r\n else if ( color.length === 4 )\r\n {\r\n return 'rgba(' + color.join(',') + ')';\r\n }\r\n else\r\n {\r\n $log.error('Invalid number of arguments supplied in the color array: ' + color.length + '\\n' + 'The array must have 3 or 4 colors.');\r\n }\r\n }\r\n\r\n /**\r\n * Apply given contrast level to the given color\r\n *\r\n * @param color\r\n * @param contrastLevel\r\n */\r\n function applyContrast(color, contrastLevel)\r\n {\r\n var contrastLevels = {\r\n 'white': {\r\n '1': '1',\r\n '2': '0.7',\r\n '3': '0.3',\r\n '4': '0.12'\r\n },\r\n 'black': {\r\n '1': '0.87',\r\n '2': '0.54',\r\n '3': '0.26',\r\n '4': '0.12'\r\n }\r\n };\r\n\r\n // If white\r\n if ( color[0] === 255 && color[1] === 255 && color[2] === 255 )\r\n {\r\n color[3] = contrastLevels.white[contrastLevel];\r\n }\r\n // If black\r\n else if ( color[0] === 0 && color[1] === 0 && color[2] === 0 )\r\n {\r\n color[3] = contrastLevels.black[contrastLevel];\r\n }\r\n\r\n return color;\r\n }\r\n\r\n /**\r\n * Uppercase first\r\n */\r\n function ucfirst(string)\r\n {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n }\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .controller('MsThemeOptionsController', MsThemeOptionsController)\r\n .directive('msThemeOptions', msThemeOptions);\r\n\r\n /** @ngInject */\r\n function MsThemeOptionsController($cookies, fuseTheming)\r\n {\r\n var vm = this;\r\n\r\n // Data\r\n vm.themes = fuseTheming.themes;\r\n\r\n vm.layoutModes = [\r\n {\r\n label: 'Boxed',\r\n value: 'boxed'\r\n },\r\n {\r\n label: 'Wide',\r\n value: 'wide'\r\n }\r\n ];\r\n vm.layoutStyles = [\r\n {\r\n label : 'Vertical Navigation',\r\n value : 'verticalNavigation',\r\n figure: '/assets/images/theme-options/vertical-nav.jpg'\r\n },\r\n {\r\n label : 'Vertical Navigation with Fullwidth Toolbar',\r\n value : 'verticalNavigationFullwidthToolbar',\r\n figure: '/assets/images/theme-options/vertical-nav-with-full-toolbar.jpg'\r\n },\r\n {\r\n label : 'Vertical Navigation with Fullwidth Toolbar 2',\r\n value : 'verticalNavigationFullwidthToolbar2',\r\n figure: '/assets/images/theme-options/vertical-nav-with-full-toolbar-2.jpg'\r\n },\r\n {\r\n label : 'Horizontal Navigation',\r\n value : 'horizontalNavigation',\r\n figure: '/assets/images/theme-options/horizontal-nav.jpg'\r\n },\r\n {\r\n label : 'Content with Toolbar',\r\n value : 'contentWithToolbar',\r\n figure: '/assets/images/theme-options/content-with-toolbar.jpg'\r\n },\r\n {\r\n label : 'Content Only',\r\n value : 'contentOnly',\r\n figure: '/assets/images/theme-options/content-only.jpg'\r\n },\r\n ];\r\n\r\n vm.layoutMode = 'wide';\r\n vm.layoutStyle = $cookies.get('layoutStyle') || 'verticalNavigation';\r\n\r\n // Methods\r\n vm.setActiveTheme = setActiveTheme;\r\n vm.getActiveTheme = getActiveTheme;\r\n vm.updateLayoutMode = updateLayoutMode;\r\n vm.updateLayoutStyle = updateLayoutStyle;\r\n\r\n //////////\r\n\r\n /**\r\n * Set active theme\r\n *\r\n * @param themeName\r\n */\r\n function setActiveTheme(themeName)\r\n {\r\n fuseTheming.setActiveTheme(themeName);\r\n }\r\n\r\n /**\r\n * Get active theme\r\n *\r\n * @returns {service.themes.active|{name, theme}}\r\n */\r\n function getActiveTheme()\r\n {\r\n return fuseTheming.themes.active;\r\n }\r\n\r\n /**\r\n * Update layout mode\r\n */\r\n function updateLayoutMode()\r\n {\r\n var bodyEl = angular.element('body');\r\n\r\n // Update class on body element\r\n bodyEl.toggleClass('boxed', (vm.layoutMode === 'boxed'));\r\n }\r\n\r\n /**\r\n * Update layout style\r\n */\r\n function updateLayoutStyle()\r\n {\r\n // Update the cookie\r\n $cookies.put('layoutStyle', vm.layoutStyle);\r\n\r\n // Reload the page to apply the changes\r\n location.reload();\r\n }\r\n }\r\n\r\n /** @ngInject */\r\n function msThemeOptions($mdSidenav)\r\n {\r\n return {\r\n restrict : 'E',\r\n scope : {},\r\n controller : 'MsThemeOptionsController as vm',\r\n templateUrl: 'app/core/theme-options/theme-options.html',\r\n compile : function (tElement)\r\n {\r\n tElement.addClass('ms-theme-options');\r\n\r\n return function postLink(scope)\r\n {\r\n /**\r\n * Toggle options sidenav\r\n */\r\n function toggleOptionsSidenav()\r\n {\r\n // Toggle the fuse theme options panel\r\n $mdSidenav('fuse-theme-options').toggle();\r\n }\r\n\r\n // Expose the toggle function\r\n scope.toggleOptionsSidenav = toggleOptionsSidenav;\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('msUtils', msUtils);\r\n\r\n /** @ngInject */\r\n function msUtils($window)\r\n {\r\n // Private variables\r\n var mobileDetect = new MobileDetect($window.navigator.userAgent),\r\n browserInfo = null;\r\n\r\n var service = {\r\n exists : exists,\r\n detectBrowser: detectBrowser,\r\n guidGenerator: guidGenerator,\r\n isMobile : isMobile,\r\n toggleInArray: toggleInArray\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Check if item exists in a list\r\n *\r\n * @param item\r\n * @param list\r\n * @returns {boolean}\r\n */\r\n function exists(item, list)\r\n {\r\n return list.indexOf(item) > -1;\r\n }\r\n\r\n /**\r\n * Returns browser information\r\n * from user agent data\r\n *\r\n * Found at http://www.quirksmode.org/js/detect.html\r\n * but modified and updated to fit for our needs\r\n */\r\n function detectBrowser()\r\n {\r\n // If we already tested, do not test again\r\n if ( browserInfo )\r\n {\r\n return browserInfo;\r\n }\r\n\r\n var browserData = [\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : 'Edge',\r\n versionSearch: 'Edge',\r\n identity : 'Edge'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString: 'Chrome',\r\n identity : 'Chrome'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : 'OmniWeb',\r\n versionSearch: 'OmniWeb/',\r\n identity : 'OmniWeb'\r\n },\r\n {\r\n string : $window.navigator.vendor,\r\n subString : 'Apple',\r\n versionSearch: 'Version',\r\n identity : 'Safari'\r\n },\r\n {\r\n prop : $window.opera,\r\n identity: 'Opera'\r\n },\r\n {\r\n string : $window.navigator.vendor,\r\n subString: 'iCab',\r\n identity : 'iCab'\r\n },\r\n {\r\n string : $window.navigator.vendor,\r\n subString: 'KDE',\r\n identity : 'Konqueror'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString: 'Firefox',\r\n identity : 'Firefox'\r\n },\r\n {\r\n string : $window.navigator.vendor,\r\n subString: 'Camino',\r\n identity : 'Camino'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString: 'Netscape',\r\n identity : 'Netscape'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : 'MSIE',\r\n identity : 'Explorer',\r\n versionSearch: 'MSIE'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : 'Trident/7',\r\n identity : 'Explorer',\r\n versionSearch: 'rv'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : 'Gecko',\r\n identity : 'Mozilla',\r\n versionSearch: 'rv'\r\n },\r\n {\r\n string : $window.navigator.userAgent,\r\n subString : 'Mozilla',\r\n identity : 'Netscape',\r\n versionSearch: 'Mozilla'\r\n }\r\n ];\r\n\r\n var osData = [\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'Win',\r\n identity : 'Windows'\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'Mac',\r\n identity : 'Mac'\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'Linux',\r\n identity : 'Linux'\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'iPhone',\r\n identity : 'iPhone'\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'iPod',\r\n identity : 'iPod'\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'iPad',\r\n identity : 'iPad'\r\n },\r\n {\r\n string : $window.navigator.platform,\r\n subString: 'Android',\r\n identity : 'Android'\r\n }\r\n ];\r\n\r\n var versionSearchString = '';\r\n\r\n function searchString(data)\r\n {\r\n for ( var i = 0; i < data.length; i++ )\r\n {\r\n var dataString = data[i].string;\r\n var dataProp = data[i].prop;\r\n\r\n versionSearchString = data[i].versionSearch || data[i].identity;\r\n\r\n if ( dataString )\r\n {\r\n if ( dataString.indexOf(data[i].subString) !== -1 )\r\n {\r\n return data[i].identity;\r\n\r\n }\r\n }\r\n else if ( dataProp )\r\n {\r\n return data[i].identity;\r\n }\r\n }\r\n }\r\n\r\n function searchVersion(dataString)\r\n {\r\n var index = dataString.indexOf(versionSearchString);\r\n\r\n if ( index === -1 )\r\n {\r\n return;\r\n }\r\n\r\n return parseInt(dataString.substring(index + versionSearchString.length + 1));\r\n }\r\n\r\n var browser = searchString(browserData) || 'unknown-browser';\r\n var version = searchVersion($window.navigator.userAgent) || searchVersion($window.navigator.appVersion) || 'unknown-version';\r\n var os = searchString(osData) || 'unknown-os';\r\n\r\n // Prepare and store the object\r\n browser = browser.toLowerCase();\r\n version = browser + '-' + version;\r\n os = os.toLowerCase();\r\n\r\n browserInfo = {\r\n browser: browser,\r\n version: version,\r\n os : os\r\n };\r\n\r\n return browserInfo;\r\n }\r\n\r\n /**\r\n * Generates a globally unique id\r\n *\r\n * @returns {*}\r\n */\r\n function guidGenerator()\r\n {\r\n var S4 = function ()\r\n {\r\n return (((1 + Math.random()) * 0x10000) || 0).toString(16).substring(1);\r\n };\r\n return (S4() + S4() + S4() + S4() + S4() + S4());\r\n }\r\n\r\n /**\r\n * Return if current device is a\r\n * mobile device or not\r\n */\r\n function isMobile()\r\n {\r\n return mobileDetect.mobile();\r\n }\r\n\r\n /**\r\n * Toggle in array (push or splice)\r\n *\r\n * @param item\r\n * @param array\r\n */\r\n function toggleInArray(item, array)\r\n {\r\n if ( array.indexOf(item) === -1 )\r\n {\r\n array.push(item);\r\n }\r\n else\r\n {\r\n array.splice(array.indexOf(item), 1);\r\n }\r\n }\r\n }\r\n}());\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('msApi', msApiProvider);\r\n\r\n /** @ngInject **/\r\n function msApiProvider()\r\n {\r\n /* ----------------- */\r\n /* Provider */\r\n /* ----------------- */\r\n var provider = this;\r\n\r\n // Inject the $log service\r\n var $log = angular.injector(['ng']).get('$log');\r\n\r\n // Data\r\n var baseUrl = '';\r\n var api = [];\r\n\r\n // Methods\r\n provider.setBaseUrl = setBaseUrl;\r\n provider.getBaseUrl = getBaseUrl;\r\n provider.getApiObject = getApiObject;\r\n provider.register = register;\r\n\r\n //////////\r\n\r\n /**\r\n * Set base url for API endpoints\r\n *\r\n * @param url {string}\r\n */\r\n function setBaseUrl(url)\r\n {\r\n baseUrl = url;\r\n }\r\n\r\n /**\r\n * Return the base url\r\n *\r\n * @returns {string}\r\n */\r\n function getBaseUrl()\r\n {\r\n return baseUrl;\r\n }\r\n\r\n /**\r\n * Return the api object\r\n *\r\n * @returns {object}\r\n */\r\n function getApiObject()\r\n {\r\n return api;\r\n }\r\n\r\n /**\r\n * Register API endpoint\r\n *\r\n * @param key\r\n * @param resource\r\n */\r\n function register(key, resource)\r\n {\r\n if ( !angular.isString(key) )\r\n {\r\n $log.error('\"path\" must be a string (eg. `dashboard.project`)');\r\n return;\r\n }\r\n\r\n if ( !angular.isArray(resource) )\r\n {\r\n $log.error('\"resource\" must be an array and it must follow $resource definition');\r\n return;\r\n }\r\n\r\n // Store the API object\r\n api[key] = {\r\n url : baseUrl + (resource[0] || ''),\r\n paramDefaults: resource[1] || [],\r\n actions : resource[2] || [],\r\n options : resource[3] || {}\r\n };\r\n }\r\n\r\n /* ----------------- */\r\n /* Service */\r\n /* ----------------- */\r\n this.$get = function ($log, $q, $resource, $rootScope)\r\n {\r\n // Data\r\n\r\n // Methods\r\n var service = {\r\n setBaseUrl: setBaseUrl,\r\n getBaseUrl: getBaseUrl,\r\n register : register,\r\n resolve : resolve,\r\n request : request\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Resolve an API endpoint\r\n *\r\n * @param action {string}\r\n * @param parameters {object}\r\n * @returns {promise|boolean}\r\n */\r\n function resolve(action, parameters)\r\n {\r\n // Emit an event\r\n $rootScope.$broadcast('msApi::resolveStart');\r\n \r\n var actionParts = action.split('@'),\r\n resource = actionParts[0],\r\n method = actionParts[1],\r\n params = parameters || {};\r\n\r\n if ( !resource || !method )\r\n {\r\n $log.error('msApi.resolve requires correct action parameter (resourceName@methodName)');\r\n return false;\r\n }\r\n\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // Get the correct resource definition from api object\r\n var apiObject = api[resource];\r\n\r\n if ( !apiObject )\r\n {\r\n $log.error('Resource \"' + resource + '\" is not defined in the api service!');\r\n deferred.reject('Resource \"' + resource + '\" is not defined in the api service!');\r\n }\r\n else\r\n {\r\n // Generate the $resource object based on the stored API object\r\n var resourceObject = $resource(apiObject.url, apiObject.paramDefaults, apiObject.actions, apiObject.options);\r\n\r\n // Make the call...\r\n resourceObject[method](params,\r\n\r\n // Success\r\n function (response)\r\n {\r\n deferred.resolve(response);\r\n\r\n // Emit an event\r\n $rootScope.$broadcast('msApi::resolveSuccess');\r\n },\r\n\r\n // Error\r\n function (response)\r\n {\r\n deferred.reject(response);\r\n\r\n // Emit an event\r\n $rootScope.$broadcast('msApi::resolveError');\r\n }\r\n );\r\n }\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Make a request to an API endpoint\r\n *\r\n * @param action {string}\r\n * @param [parameters] {object}\r\n * @param [success] {function}\r\n * @param [error] {function}\r\n *\r\n * @returns {promise|boolean}\r\n */\r\n function request(action, parameters, success, error)\r\n {\r\n // Emit an event\r\n $rootScope.$broadcast('msApi::requestStart');\r\n \r\n var actionParts = action.split('@'),\r\n resource = actionParts[0],\r\n method = actionParts[1],\r\n params = parameters || {};\r\n\r\n if ( !resource || !method )\r\n {\r\n $log.error('msApi.resolve requires correct action parameter (resourceName@methodName)');\r\n return false;\r\n }\r\n\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // Get the correct resource definition from api object\r\n var apiObject = api[resource];\r\n\r\n if ( !apiObject )\r\n {\r\n $log.error('Resource \"' + resource + '\" is not defined in the api service!');\r\n deferred.reject('Resource \"' + resource + '\" is not defined in the api service!');\r\n }\r\n else\r\n {\r\n // Generate the $resource object based on the stored API object\r\n var resourceObject = $resource(apiObject.url, apiObject.paramDefaults, apiObject.actions, apiObject.options);\r\n\r\n // Make the call...\r\n resourceObject[method](params,\r\n\r\n // SUCCESS\r\n function (response)\r\n {\r\n // Emit an event\r\n $rootScope.$broadcast('msApi::requestSuccess');\r\n \r\n // Resolve the promise\r\n deferred.resolve(response);\r\n\r\n // Call the success function if there is one\r\n if ( angular.isDefined(success) && angular.isFunction(success) )\r\n {\r\n success(response);\r\n }\r\n },\r\n\r\n // ERROR\r\n function (response)\r\n {\r\n // Emit an event\r\n $rootScope.$broadcast('msApi::requestError');\r\n \r\n // Reject the promise\r\n deferred.reject(response);\r\n\r\n // Call the error function if there is one\r\n if ( angular.isDefined(error) && angular.isFunction(error) )\r\n {\r\n error(response);\r\n }\r\n }\r\n );\r\n }\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('authService', authService);\r\n\r\n /** @ngInject */\r\n function authService(localStorageService)\r\n {\r\n var profile = function profile() {\r\n return localStorageService.get('profile');\r\n }\r\n\r\n return {\r\n getProfile: function getProfile()\r\n {\r\n return profile();\r\n }\r\n }\r\n\r\n }\r\n}());\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .factory('apiResolver', apiResolverService);\r\n\r\n /** @ngInject */\r\n function apiResolverService($q, $log, api)\r\n {\r\n var service = {\r\n resolve: resolve\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n /**\r\n * Resolve api\r\n * @param action\r\n * @param parameters\r\n */\r\n function resolve(action, parameters)\r\n {\r\n var actionParts = action.split('@'),\r\n resource = actionParts[0],\r\n method = actionParts[1],\r\n params = parameters || {};\r\n\r\n if ( !resource || !method )\r\n {\r\n $log.error('apiResolver.resolve requires correct action parameter (ResourceName@methodName)');\r\n return false;\r\n }\r\n\r\n // Create a new deferred object\r\n var deferred = $q.defer();\r\n\r\n // Get the correct api object from api service\r\n var apiObject = getApiObject(resource);\r\n\r\n if ( !apiObject )\r\n {\r\n $log.error('Resource \"' + resource + '\" is not defined in the api service!');\r\n deferred.reject('Resource \"' + resource + '\" is not defined in the api service!');\r\n }\r\n else\r\n {\r\n apiObject[method](params,\r\n\r\n // Success\r\n function (response)\r\n {\r\n deferred.resolve(response);\r\n },\r\n\r\n // Error\r\n function (response)\r\n {\r\n deferred.reject(response);\r\n }\r\n );\r\n }\r\n\r\n // Return the promise\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Get correct api object\r\n *\r\n * @param resource\r\n * @returns {*}\r\n */\r\n function getApiObject(resource)\r\n {\r\n // Split the resource in case if we have a dot notated object\r\n var resourceParts = resource.split('.'),\r\n apiObject = api;\r\n\r\n // Loop through the resource parts and go all the way through\r\n // the api object and return the correct one\r\n for ( var l = 0; l < resourceParts.length; l++ )\r\n {\r\n if ( angular.isUndefined(apiObject[resourceParts[l]]) )\r\n {\r\n $log.error('Resource part \"' + resourceParts[l] + '\" is not defined!');\r\n apiObject = false;\r\n break;\r\n }\r\n\r\n apiObject = apiObject[resourceParts[l]];\r\n }\r\n\r\n if ( !apiObject )\r\n {\r\n return false;\r\n }\r\n\r\n return apiObject;\r\n }\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .filter('filterByPropIds', filterByPropIds);\r\n\r\n /** @ngInject */\r\n function filterByPropIds()\r\n {\r\n return function (items, parameter, ids)\r\n {\r\n if ( items.length === 0 || !ids || ids.length === 0 )\r\n {\r\n return items;\r\n }\r\n\r\n var filtered = [];\r\n\r\n for ( var i = 0; i < items.length; i++ )\r\n {\r\n var item = items[i];\r\n var match = false;\r\n\r\n for ( var j = 0; j < ids.length; j++ )\r\n {\r\n var id = ids[j];\r\n if ( item[parameter].indexOf(id) > -1 )\r\n {\r\n match = true;\r\n break;\r\n }\r\n }\r\n\r\n if ( match )\r\n {\r\n filtered.push(item);\r\n }\r\n\r\n }\r\n\r\n return filtered;\r\n\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .filter('filterByIds', filterByIds);\r\n\r\n /** @ngInject */\r\n function filterByIds()\r\n {\r\n return function (items, ids)\r\n {\r\n\r\n if ( items.length === 0 || !ids )\r\n {\r\n return items;\r\n }\r\n\r\n if ( ids.length === 0 )\r\n {\r\n return [];\r\n }\r\n\r\n var filtered = [];\r\n\r\n for ( var i = 0; i < items.length; i++ )\r\n {\r\n var item = items[i];\r\n var match = false;\r\n\r\n for ( var j = 0; j < ids.length; j++ )\r\n {\r\n var id = ids[j];\r\n if ( item.id === id )\r\n {\r\n match = true;\r\n break;\r\n }\r\n }\r\n\r\n if ( match )\r\n {\r\n filtered.push(item);\r\n }\r\n\r\n }\r\n\r\n return filtered;\r\n\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .filter('toTrusted', toTrustedFilter)\r\n .filter('htmlToPlaintext', htmlToPlainTextFilter)\r\n .filter('nospace', nospaceFilter)\r\n .filter('humanizeDoc', humanizeDocFilter);\r\n\r\n /** @ngInject */\r\n function toTrustedFilter($sce)\r\n {\r\n return function (value)\r\n {\r\n return $sce.trustAsHtml(value);\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function htmlToPlainTextFilter()\r\n {\r\n return function (text)\r\n {\r\n return String(text).replace(/<[^>]+>/gm, '');\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function nospaceFilter()\r\n {\r\n return function (value)\r\n {\r\n return (!value) ? '' : value.replace(/ /g, '');\r\n };\r\n }\r\n\r\n /** @ngInject */\r\n function humanizeDocFilter()\r\n {\r\n return function (doc)\r\n {\r\n if ( !doc )\r\n {\r\n return;\r\n }\r\n if ( doc.type === 'directive' )\r\n {\r\n return doc.name.replace(/([A-Z])/g, function ($1)\r\n {\r\n return '-' + $1.toLowerCase();\r\n });\r\n }\r\n return doc.label || doc.name;\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .filter('altDate', altDate);\r\n\r\n /** @ngInject */\r\n function altDate()\r\n {\r\n return function (value)\r\n {\r\n var diff = Date.now() - new Date(value);\r\n\r\n /**\r\n * If in a hour\r\n * e.g. \"2 minutes ago\"\r\n */\r\n if ( diff < (60 * 60 * 1000) )\r\n {\r\n return moment(value).fromNow();\r\n }\r\n /*\r\n * If in the day\r\n * e.g. \"11:23\"\r\n */\r\n else if ( diff < (60 * 60 * 24 * 1000) )\r\n {\r\n return moment(value).format('HH:mm');\r\n }\r\n /*\r\n * If in week\r\n * e.g \"Tuesday\"\r\n */\r\n else if ( diff < (60 * 60 * 24 * 7 * 1000) )\r\n {\r\n return moment(value).format('dddd');\r\n }\r\n /*\r\n * If more than a week\r\n * e.g. 03/29/2016\r\n */\r\n else\r\n {\r\n return moment(value).calendar();\r\n }\r\n\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .directive('hljs', hljsDirective);\r\n\r\n /** @ngInject */\r\n function hljsDirective($timeout, $q, $interpolate)\r\n {\r\n return {\r\n restrict: 'E',\r\n compile : function (element, attr)\r\n {\r\n var code;\r\n //No attribute? code is the content\r\n if ( !attr.code )\r\n {\r\n code = element.html();\r\n element.empty();\r\n }\r\n\r\n return function (scope, element, attr)\r\n {\r\n\r\n if ( attr.code )\r\n {\r\n // Attribute? code is the evaluation\r\n code = scope.$eval(attr.code);\r\n }\r\n var shouldInterpolate = scope.$eval(attr.shouldInterpolate);\r\n\r\n $q.when(code).then(function (code)\r\n {\r\n if ( code )\r\n {\r\n if ( shouldInterpolate )\r\n {\r\n code = $interpolate(code)(scope);\r\n }\r\n var contentParent = angular.element(\r\n '
'\r\n );\r\n element.append(contentParent);\r\n // Defer highlighting 1-frame to prevent GA interference...\r\n $timeout(function ()\r\n {\r\n render(code, contentParent);\r\n }, 34, false);\r\n }\r\n });\r\n\r\n function render(contents, parent)\r\n {\r\n\r\n var codeElement = parent.find('code');\r\n var lines = contents.split('\\n');\r\n\r\n // Remove empty lines\r\n lines = lines.filter(function (line)\r\n {\r\n return line.trim().length;\r\n });\r\n\r\n // Make it so each line starts at 0 whitespace\r\n var firstLineWhitespace = lines[0].match(/^\\s*/)[0];\r\n var startingWhitespaceRegex = new RegExp('^' + firstLineWhitespace);\r\n lines = lines.map(function (line)\r\n {\r\n return line\r\n .replace(startingWhitespaceRegex, '')\r\n .replace(/\\s+$/, '');\r\n });\r\n\r\n var highlightedCode = hljs.highlight(attr.language || attr.lang, lines.join('\\n'), true);\r\n highlightedCode.value = highlightedCode.value\r\n .replace(/=\"\"<\\/span>/gi, '')\r\n .replace('', '')\r\n .replace('', '');\r\n codeElement.append(highlightedCode.value).addClass('highlight');\r\n }\r\n };\r\n }\r\n };\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .provider('fuseConfig', fuseConfigProvider);\r\n\r\n /** @ngInject */\r\n function fuseConfigProvider()\r\n {\r\n // Default configuration\r\n var fuseConfiguration = {\r\n 'disableCustomScrollbars' : false,\r\n 'disableMdInkRippleOnMobile' : true,\r\n 'disableCustomScrollbarsOnMobile': true\r\n };\r\n\r\n // Methods\r\n this.config = config;\r\n\r\n //////////\r\n\r\n /**\r\n * Extend default configuration with the given one\r\n *\r\n * @param configuration\r\n */\r\n function config(configuration)\r\n {\r\n fuseConfiguration = angular.extend({}, fuseConfiguration, configuration);\r\n }\r\n\r\n /**\r\n * Service\r\n */\r\n this.$get = function ()\r\n {\r\n var service = {\r\n getConfig: getConfig,\r\n setConfig: setConfig\r\n };\r\n\r\n return service;\r\n\r\n //////////\r\n\r\n /**\r\n * Returns a config value\r\n */\r\n function getConfig(configName)\r\n {\r\n if ( angular.isUndefined(fuseConfiguration[configName]) )\r\n {\r\n return false;\r\n }\r\n\r\n return fuseConfiguration[configName];\r\n }\r\n\r\n /**\r\n * Creates or updates config object\r\n *\r\n * @param configName\r\n * @param configValue\r\n */\r\n function setConfig(configName, configValue)\r\n {\r\n fuseConfiguration[configName] = configValue;\r\n }\r\n };\r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.toolbar', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($translatePartialLoaderProvider)\r\n {\r\n $translatePartialLoaderProvider.addPart('app/toolbar');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.toolbar')\r\n .controller('ToolbarController', ToolbarController);\r\n\r\n /** @ngInject */\r\n function ToolbarController($rootScope, $q, $state, $timeout, $mdSidenav, $translate, $mdToast, msNavigationService, localStorageService)\r\n {\r\n var vm = this;\r\n vm.username = localStorageService.get('username');\r\n\r\n // Data\r\n $rootScope.global = {\r\n search: ''\r\n };\r\n\r\n vm.bodyEl = angular.element('body');\r\n vm.languages = {\r\n pt: {\r\n 'title' : 'Português',\r\n 'translation': 'TOOLBAR.PORTUGUESE',\r\n 'code' : 'pt',\r\n 'flag' : 'pt'\r\n },\r\n en: {\r\n 'title' : 'English',\r\n 'translation': 'TOOLBAR.ENGLISH',\r\n 'code' : 'en',\r\n 'flag' : 'en'\r\n },\r\n es: {\r\n 'title' : 'Spanish',\r\n 'translation': 'TOOLBAR.SPANISH',\r\n 'code' : 'es',\r\n 'flag' : 'es'\r\n }\r\n };\r\n\r\n // Methods\r\n vm.toggleSidenav = toggleSidenav;\r\n vm.logout = logout;\r\n vm.changeLanguage = changeLanguage;\r\n vm.setUserStatus = setUserStatus;\r\n vm.toggleHorizontalMobileMenu = toggleHorizontalMobileMenu;\r\n vm.toggleMsNavigationFolded = toggleMsNavigationFolded;\r\n vm.logout = logout;\r\n\r\n //////////\r\n\r\n init();\r\n\r\n /**\r\n * Initialize\r\n */\r\n function init()\r\n {\r\n // Get the selected language directly from angular-translate module setting\r\n vm.selectedLanguage = vm.languages[$translate.preferredLanguage()];\r\n }\r\n\r\n /**\r\n * Toggle sidenav\r\n *\r\n * @param sidenavId\r\n */\r\n function toggleSidenav(sidenavId)\r\n {\r\n $mdSidenav(sidenavId).toggle();\r\n }\r\n\r\n /**\r\n * Sets User Status\r\n * @param status\r\n */\r\n function setUserStatus(status)\r\n {\r\n vm.userStatus = status;\r\n }\r\n\r\n /**\r\n * Logout Function\r\n */\r\n function logout()\r\n {\r\n localStorageService.clearAll();\r\n $state.go('app.auth');\r\n }\r\n\r\n /**\r\n * Change Language\r\n */\r\n function changeLanguage(lang)\r\n {\r\n vm.selectedLanguage = lang;\r\n\r\n // Change the language\r\n $translate.use(lang.code);\r\n }\r\n\r\n /**\r\n * Toggle horizontal mobile menu\r\n */\r\n function toggleHorizontalMobileMenu()\r\n {\r\n vm.bodyEl.toggleClass('ms-navigation-horizontal-mobile-menu-active');\r\n }\r\n\r\n /**\r\n * Toggle msNavigation folded\r\n */\r\n function toggleMsNavigationFolded()\r\n {\r\n msNavigationService.toggleFolded();\r\n }\r\n\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.navigation', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config()\r\n {\r\n \r\n }\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.navigation')\r\n .controller('NavigationController', NavigationController);\r\n\r\n /** @ngInject */\r\n function NavigationController($scope, CONFIG, $sanitize, localStorageService, $state)\r\n {\r\n var vm = this;\r\n\r\n vm.username = localStorageService.get('username');\r\n vm.companys = localStorageService.get('companys');\r\n vm.logo = localStorageService.get('logo');\r\n\r\n vm.sel_company = localStorageService.get('sel_company');\r\n vm.profile = localStorageService.get('profile');\r\n\r\n vm.update_company = update_company;\r\n\r\n function update_company() {\r\n if(vm.sel_company) {\r\n localStorageService.set('sel_company', vm.sel_company);\r\n $state.reload();\r\n }\r\n }\r\n\r\n vm.defaultLogo = $sanitize(CONFIG.defaultLogo);\r\n vm.title = $sanitize(CONFIG.title);\r\n\r\n // Data\r\n vm.bodyEl = angular.element('body');\r\n vm.folded = false;\r\n vm.msScrollOptions = {\r\n suppressScrollX: true\r\n };\r\n\r\n // Methods\r\n vm.toggleMsNavigationFolded = toggleMsNavigationFolded;\r\n\r\n //////////\r\n\r\n /**\r\n * Toggle folded status\r\n */\r\n function toggleMsNavigationFolded()\r\n {\r\n vm.folded = !vm.folded;\r\n }\r\n\r\n // Close the mobile menu on $stateChangeSuccess\r\n $scope.$on('$stateChangeSuccess', function ()\r\n {\r\n vm.bodyEl.removeClass('ms-navigation-horizontal-mobile-menu-active');\r\n });\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.recover', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider)\r\n {\r\n $stateProvider\r\n .state('app.recover', {\r\n url : '/recovery/:token',\r\n views : {\r\n 'main@' : {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'content@app.recover': {\r\n templateUrl: 'app/recover/recover.html',\r\n controller : 'RecoverController as vm'\r\n }\r\n },\r\n bodyClass: 'login'\r\n });\r\n\r\n $translatePartialLoaderProvider.addPart('app/recover');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.recover')\r\n .controller('RecoverController', RecoverController);\r\n\r\n /** @ngInject */\r\n function RecoverController($state, $translate, $cookies, CONFIG, $sanitize, $window, $http, $mdToast, msNavigationService)\r\n {\r\n var vm = this;\r\n vm.loginLogo = $sanitize(CONFIG.loginLogo);\r\n\r\n vm.token = ($state.params.token) ? $state.params.token : \"\";\r\n\r\n vm.recover = function(email) {\r\n\r\n vm.loading = true;\r\n\r\n $http.post(CONFIG.apiBaseUrl + 'Recover',\r\n { email: email })\r\n .success(function (response) {\r\n if(response.status){\r\n vm.error = response.status;\r\n vm.loading = false;\r\n var toast = $mdToast.simple()\r\n .content(vm.error)\r\n .highlightAction(true)\r\n .hideDelay(10000)\r\n .position('top right'); \r\n $mdToast.show(toast);\r\n }\r\n });\r\n \r\n }\r\n\r\n vm.definepwd = function(token,password) {\r\n\r\n vm.loading = true;\r\n\r\n $http.post(CONFIG.apiBaseUrl + 'Recover/update',\r\n { token: token, password: password })\r\n .success(function (response) {\r\n if(response.status){\r\n vm.error = response.status;\r\n vm.loading = false;\r\n var toast = $mdToast.simple()\r\n .content(vm.error)\r\n .highlightAction(true)\r\n .hideDelay(15000)\r\n .position('top right'); \r\n $mdToast.show(toast);\r\n }\r\n });\r\n \r\n }\r\n\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n /**\r\n * Main module of the Fuse\r\n */\r\n angular\r\n .module('fuse', [\r\n\r\n // Core\r\n 'app.core',\r\n\r\n // Navigation\r\n 'app.navigation',\r\n\r\n // Toolbar\r\n 'app.toolbar',\r\n\r\n // Auth\r\n 'app.auth',\r\n\r\n // Recover\r\n 'app.recover',\r\n\r\n // Pages\r\n 'app.pages'\r\n\r\n ]);\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .controller('MainController', MainController);\r\n\r\n /** @ngInject */\r\n function MainController($scope, $rootScope, authService, msNavigationService)\r\n {\r\n // Data\r\n //////////\r\n console.log(\"MainController\");\r\n\r\n /*msNavigationService.saveItem('app.clients', {\r\n title : 'Dashboard',\r\n icon : 'icon-account-multiple',\r\n state : 'app.clients',\r\n hidden: function ()\r\n {\r\n return authService.getProfile() != \"ADMIN\";\r\n },\r\n translate: 'CLIENTS.NAV',\r\n weight : 5\r\n });*/\r\n\r\n\r\n msNavigationService.saveItem('app', {\r\n title : 'Menu',\r\n group : true,\r\n weight: 1\r\n });\r\n\r\n msNavigationService.saveItem('app.calendar', {\r\n title : 'Dashboard',\r\n icon : 'icon-tile-four',\r\n state : 'app.calendar',\r\n\r\n translate: 'CALENDAR.CALENDAR',\r\n weight : 1\r\n });\r\n\r\n msNavigationService.saveItem('app.events', {\r\n title : 'Eventos',\r\n icon : 'icon-calendar-clock',\r\n state : 'app.events',\r\n\r\n translate: 'EVENTS.NAV',\r\n weight : 2\r\n });\r\n\r\n msNavigationService.saveItem('app.orders', {\r\n title : 'Orders',\r\n icon : 'icon-file-document',\r\n state : 'app.orders',\r\n\r\n translate: 'ORDERS.NAV',\r\n weight : 3\r\n });\r\n\r\n msNavigationService.saveItem('app.articles', {\r\n title : 'Articles',\r\n icon : 'icon-cube-outline',\r\n state : 'app.articles',\r\n\r\n translate: 'ARTICLES.NAV',\r\n weight : 4\r\n });\r\n\r\n msNavigationService.saveItem('app.catalog', {\r\n title : 'Catalog',\r\n icon : 'icon-apps',\r\n state : 'app.catalog',\r\n\r\n translate: 'CATALOG.NAV',\r\n weight : 5\r\n });\r\n\r\n msNavigationService.saveItem('app.users', {\r\n title : 'Pedidos',\r\n icon : 'icon-account-key',\r\n state : 'app.users',\r\n translate: 'USERS.NAV',\r\n weight : 6,\r\n hidden: function ()\r\n {\r\n return authService.getProfile() != \"ADMIN\";\r\n },\r\n });\r\n\r\n\r\n // Remove the splash screen\r\n $scope.$on('$viewContentAnimationEnded', function (event)\r\n {\r\n if ( event.targetScope.$id === $scope.$id )\r\n {\r\n $rootScope.$broadcast('msSplashScreen::remove');\r\n }\r\n });\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .run(runBlock);\r\n\r\n /** @ngInject */\r\n function runBlock(msUtils, fuseGenerator, fuseConfig)\r\n {\r\n /**\r\n * Generate extra classes based on registered themes so we\r\n * can use same colors with non-angular-material elements\r\n */\r\n fuseGenerator.generate();\r\n\r\n /**\r\n * Disable md-ink-ripple effects on mobile\r\n * if 'disableMdInkRippleOnMobile' config enabled\r\n */\r\n if ( fuseConfig.getConfig('disableMdInkRippleOnMobile') && msUtils.isMobile() )\r\n {\r\n var bodyEl = angular.element('body');\r\n bodyEl.attr('md-no-ink', true);\r\n }\r\n\r\n /**\r\n * Put isMobile() to the html as a class\r\n */\r\n if ( msUtils.isMobile() )\r\n {\r\n angular.element('html').addClass('is-mobile');\r\n }\r\n\r\n /**\r\n * Put browser information to the html as a class\r\n */\r\n var browserInfo = msUtils.detectBrowser();\r\n if ( browserInfo )\r\n {\r\n var htmlClass = browserInfo.browser + ' ' + browserInfo.version + ' ' + browserInfo.os;\r\n angular.element('html').addClass(htmlClass);\r\n }\r\n }\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.core')\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($ariaProvider, $logProvider, msScrollConfigProvider, $translateProvider, fuseConfigProvider)\r\n {\r\n // Enable debug logging\r\n $logProvider.debugEnabled(true);\r\n\r\n // angular-translate configuration\r\n $translateProvider.useLoader('$translatePartialLoader', {\r\n urlTemplate: '{part}/i18n/{lang}.json'\r\n });\r\n $translateProvider.preferredLanguage('pt');\r\n $translateProvider.useSanitizeValueStrategy('sanitize');\r\n\r\n /*eslint-disable */\r\n\r\n // ng-aria configuration\r\n $ariaProvider.config({\r\n tabindex: false\r\n });\r\n\r\n // Fuse theme configurations\r\n fuseConfigProvider.config({\r\n 'disableCustomScrollbars' : false,\r\n 'disableCustomScrollbarsOnMobile': true,\r\n 'disableMdInkRippleOnMobile' : true\r\n });\r\n\r\n // msScroll configuration\r\n msScrollConfigProvider.config({\r\n wheelPropagation: true\r\n });\r\n\r\n /*eslint-enable */\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth', [])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($stateProvider, $translatePartialLoaderProvider)\r\n {\r\n $stateProvider\r\n .state('app.auth', {\r\n url : '/login',\r\n views : {\r\n 'main@' : {\r\n templateUrl: 'app/core/layouts/content-only.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'content@app.auth': {\r\n templateUrl: 'app/auth/auth.html',\r\n controller : 'AuthController as vm'\r\n }\r\n },\r\n bodyClass: 'login'\r\n });\r\n\r\n $translatePartialLoaderProvider.addPart('app/auth');\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.auth')\r\n .controller('AuthController', AuthController);\r\n\r\n /** @ngInject */\r\n function AuthController($state, $translate, $cookies, CONFIG, $sanitize, $window, api, $mdToast, msNavigationService)\r\n {\r\n var vm = this;\r\n vm.loginLogo = $sanitize(CONFIG.loginLogo);\r\n\r\n vm.recover = function()\r\n {\r\n $state.go('app.recover');\r\n }\r\n\r\n vm.login = function(username, password) {\r\n vm.loading = true;\r\n\r\n api.Login(username, password, function (result) {\r\n if (result === true) {\r\n $state.go('app.calendar');\r\n } else {\r\n //exibir mensagens de erro consoante o erro\r\n vm.error = 'Nome do utilizador ou password inválidas';\r\n vm.loading = false;\r\n var toast = $mdToast.simple()\r\n .content(vm.error)\r\n .highlightAction(true)\r\n .hideDelay(3000)\r\n .position('top right');\r\n\r\n $mdToast.show(toast);\r\n }\r\n }); \r\n\r\n /* var expToken = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEiLCJuYW1lIjoiQWRtaW5pc3RyYXRvciIsInJ1bGVzIjpbeyJtZW51IjoiQ2xpZW50cyIsInBlZGl0IjoiMSIsInBuZXciOiIxIiwicGRlbCI6IjEifV19.RKn27ls3YRZzYdwoKX0WsAbOTGytk30omSngtUeoJ4o\";\r\n var tokenPayload = jwtHelper.decodeToken(expToken);\r\n console.log(tokenPayload);\r\n\r\n var date = jwtHelper.getTokenExpirationDate(expToken);\r\n console.log(date);*/\r\n\r\n/*\r\n api.clients.query().$promise.then(function (result) {\r\n console.log(result[0]);\r\n });\r\n*/\r\n /*\r\n api.get({ id: 41 }).$promise.then(function (result) {\r\n var user = result.client;\r\n user.client = ' de Belmonte';\r\n console.log(user);\r\n\r\n /*api.save({ client: user }).$promise.then(function (result) {\r\n console.log(\"user updated\");\r\n });*/\r\n\r\n /*user.client.client = user.client.client + ' de Belmonte';\r\n user.client.$update(function(){//Then send an update HTTP PUT to server.\r\n console.log('Updating user with id ',user.id);\r\n });\r\n });*/\r\n/*\r\n api.get({ id: 41 }).$promise.then(function (result) {\r\n var user = result.client;\r\n user.morada2 = 'Ericeira';\r\n\r\n api.save(user, function(response){\r\n console.log(\"fim\");\r\n });\r\n\r\n\r\n });\r\n\r\n //DELETE\r\n /*\r\n api.delete({ id: 43 }).$promise.then(function (user) {\r\n console.log('delete');\r\n });\r\n */\r\n\r\n /*api.save({id:41,localidade:'Mafra'}, function(response){\r\n\t\t\t\t\t\tconsole.log(\"fim\");\r\n\t\t\t\t\t});*/\r\n\r\n /*\r\n api.get({ id: 33 }.$promise, function(data) {\r\n console.log(data);\r\n });\r\n/*\r\n api.user.login.login({'user': user, 'pass' : password},\r\n\r\n // Success\r\n function (response)\r\n {\r\n console.log(response);\r\n if(response.status == 'OK') {\r\n var user = response.user;\r\n $window.localStorage.setItem('user',user.name);\r\n $window.localStorage.setItem('lang',user.language_code);\r\n $window.location.href = '/clients';\r\n } else {\r\n\r\n var toast = $mdToast.simple()\r\n .content(response.status)\r\n .highlightAction(true)\r\n .hideDelay(3000)\r\n .position('top right');\r\n\r\n $mdToast.show(toast);\r\n }\r\n },\r\n // Error\r\n function (response)\r\n {\r\n console.log(response);\r\n var toast = $mdToast.simple()\r\n .content(response.status)\r\n .highlightAction(true)\r\n .hideDelay(0)\r\n .position('top right');\r\n\r\n $mdToast.show(toast);\r\n }\r\n );*/\r\n }\r\n\r\n\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .run(runBlock);\r\n\r\n /** @ngInject */\r\n function runBlock($rootScope, $timeout, $state)\r\n {\r\n // Activate loading indicator\r\n var stateChangeStartEvent = $rootScope.$on('$stateChangeStart', function ()\r\n {\r\n $rootScope.loadingProgress = true;\r\n });\r\n\r\n // De-activate loading indicator\r\n var stateChangeSuccessEvent = $rootScope.$on('$stateChangeSuccess', function ()\r\n {\r\n $timeout(function ()\r\n {\r\n $rootScope.loadingProgress = false;\r\n });\r\n });\r\n\r\n // Store state in the root scope for easy access\r\n $rootScope.state = $state;\r\n\r\n // Cleanup\r\n $rootScope.$on('$destroy', function ()\r\n {\r\n stateChangeStartEvent();\r\n stateChangeSuccessEvent();\r\n });\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .config(routeConfig);\r\n\r\n /** @ngInject */\r\n function routeConfig($stateProvider, $urlRouterProvider, $locationProvider)\r\n {\r\n $locationProvider.html5Mode(true);\r\n\r\n $urlRouterProvider.otherwise('/login');\r\n\r\n // Inject $cookies\r\n var $cookies;\r\n\r\n angular.injector(['ngCookies']).invoke([\r\n '$cookies', function (_$cookies)\r\n {\r\n $cookies = _$cookies;\r\n }\r\n ]);\r\n\r\n // State definitions\r\n $stateProvider\r\n .state('app', {\r\n abstract: true,\r\n views : {\r\n 'main@' : {\r\n templateUrl: 'app/core/layouts/vertical-navigation.html',\r\n controller : 'MainController as vm'\r\n },\r\n 'toolbar@app' : {\r\n templateUrl: 'app/toolbar/layouts/vertical-navigation/toolbar.html',\r\n controller : 'ToolbarController as vm'\r\n },\r\n 'navigation@app': {\r\n templateUrl: 'app/navigation/layouts/vertical-navigation/navigation.html',\r\n controller : 'NavigationController as vm'\r\n }\r\n }\r\n });\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .controller('IndexController', IndexController);\r\n\r\n /** @ngInject */\r\n function IndexController(fuseTheming, localStorageService, $http, jwtHelper, CONFIG, $sanitize)\r\n {\r\n console.log(\"IndexController\");\r\n \r\n var vm = this;\r\n vm.defaultLogo = $sanitize(CONFIG.defaultLogo);\r\n\r\n // Data\r\n vm.themes = fuseTheming.themes;\r\n\r\n var token = localStorageService.get('token');\r\n console.log(\"=>\" + token);\r\n if(token) {\r\n $http.defaults.headers.common.Authorization = 'Bearer ' + token;\r\n console.log(\"load token: \" + token);\r\n }\r\n\r\n //////////\r\n }\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .constant('CONFIG', {\r\n 'title': 'Short Connection', \r\n 'apiBaseUrl': 'http://app.short-connection.com/api/',\r\n 'apiBaseUrlJson': 'http://app.short-connection.com/api/',\r\n 'apiModules': 'Users,Profiles,Events,Companys,Orders,Reports,Articles,Locations,Documentstates,Photos',\r\n 'defaultLogo': 'GT',\r\n 'loginLogo': 'GT',\r\n 'device': 'desktop'\r\n });\r\n\r\n})();\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config($mdDateLocaleProvider)\r\n {\r\n $mdDateLocaleProvider.formatDate = formatDate;\r\n\r\n function formatDate(date) {\r\n return date ? moment(date).format('YYYY-MM-DD') : '';\r\n }\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('fuse')\r\n .factory('api', apiService);\r\n\r\n /** @ngInject */\r\n function apiService($resource, $http, CONFIG, localStorageService, md5, $rootScope)\r\n {\r\n $http.defaults.useXDomain = true; \r\n $http.defaults.headers.common['X-Requested-With'];\r\n var api = {};\r\n\r\n //GENERIC MODULES\r\n var apiModules = CONFIG.apiModules.split(\",\");\r\n\r\n for(var k=0 ; k < apiModules.length; k++) {\r\n var apiModule = apiModules[k];\r\n api[apiModule.toLowerCase()] = $resource( CONFIG.apiBaseUrl + apiModule +'/:id',\r\n {}, { \r\n 'query': {method:'GET', isArray:false},\r\n 'delete': {method:'GET', isArray:false, url: CONFIG.apiBaseUrl + apiModule +'/delete/:id'},\r\n } );\r\n }\r\n\r\n //ESPECIFIC MODULES\r\n api.Login = Login;\r\n api.Logout = Logout;\r\n return api;\r\n\r\n function Login(username, password, callback) {\r\n $http.post(CONFIG.apiBaseUrl + 'users/autenticate',\r\n { username: username, password: password, device: CONFIG.device })\r\n\r\n .success(function (response) {\r\n console.log(response);\r\n if (response.token) {\r\n localStorageService.set('user_id', response.user.id);\r\n localStorageService.set('username', response.user.name);\r\n localStorageService.set('logo', response.user.Logo);\r\n localStorageService.set('profile', response.user.profile);\r\n localStorageService.set('sel_company', response.user.CompanyID);\r\n localStorageService.set('rules', response.rules);\r\n localStorageService.set('token', response.token);\r\n localStorageService.set('companys', response.companys);\r\n\r\n $rootScope.profile = response.user.profile;\r\n callback(true);\r\n } else {\r\n callback(false);\r\n }\r\n });\r\n }\r\n\r\n function Logout() {\r\n localStorageService.clearAll();\r\n $http.defaults.headers.common.Authorization = '';\r\n }\r\n }\r\n\r\n})();\r\n\n(function ()\r\n{\r\n 'use strict';\r\n\r\n angular\r\n .module('app.pages', [\r\n 'app.user', 'app.users','app.calendar', 'app.order', 'app.report',\r\n 'app.events', 'app.event', 'app.orders', 'app.articles', 'app.article', 'app.catalog'\r\n ])\r\n .config(config);\r\n\r\n /** @ngInject */\r\n function config(msNavigationServiceProvider)\r\n {\r\n\r\n console.log(\"PagesModule\");\r\n\r\n }\r\n})();\r\n\nangular.module(\"fuse\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"app/auth/auth.html\",\"
\\nLog in to your account
Username field is required
\\n
Password field is required
Remember Me\\n\\nForgot Password?
LOG IN\\n
\");\n$templateCache.put(\"app/recover/recover.html\",\"
\\nInsert your e-mail account
\\n
Email field is required
\\n
RECOVER
Back to Login
Insert your new password
Token is empty
Password is empty
\\nSET NEW PASSWORD
Back to Login
\");\n$templateCache.put(\"app/core/layouts/content-only.html\",\"
\");\n$templateCache.put(\"app/core/layouts/content-with-toolbar.html\",\"
\\n
\");\n$templateCache.put(\"app/core/layouts/horizontal-navigation.html\",\"
\\n
\");\n$templateCache.put(\"app/core/layouts/vertical-navigation-fullwidth-toolbar-2.html\",\"
\");\n$templateCache.put(\"app/core/layouts/vertical-navigation-fullwidth-toolbar.html\",\"
\");\n$templateCache.put(\"app/core/layouts/vertical-navigation.html\",\"
\\n
\");\n$templateCache.put(\"app/core/theme-options/theme-options.html\",\"
\\nLayout Style:
\\n{{layoutStyle.label}}
\\n
Layout Mode:
{{layoutMode.label}}\\n
\\nColor Palette:
\");\n$templateCache.put(\"app/core/directives/ms-info-bar/ms-info-bar.html\",\"
\\n
\");\n$templateCache.put(\"app/core/directives/ms-material-color-picker/ms-material-color-picker.html\",\"
{{vm.selectedColor.palette}} {{vm.selectedColor.hue}} Select Color
\\n{{vm.selectedColor.palette}} {{vm.selectedColor.hue}} Select Color\\n\\n
{{palette}}
{{hue}}
\");\n$templateCache.put(\"app/core/directives/ms-search-bar/ms-search-bar.html\",\"
\\n
No Results!\\n
\\n
{{result.title}}
\\n{{result.description}}
\");\n$templateCache.put(\"app/core/directives/ms-shortcuts/ms-shortcuts.html\",\"
0\\\" ng-sortable=\\\"MsShortcuts.sortableOptions\\\">
{{shortcut.title.charAt(0)}}
{{shortcut.title}}\\n
\\nClick to add/remove shortcut
No Results!
\\n
\\n{{result.title}}
\\n
\");\n$templateCache.put(\"app/navigation/layouts/horizontal-navigation/navigation.html\",\"
\");\n$templateCache.put(\"app/navigation/layouts/vertical-navigation/navigation.html\",\" 0\\\" \\nclass=\\\"h4 md-no-underline\\\" style=\\\"color: #FFF !important\\\" ng-model=\\\"vm.sel_company\\\" ng-show=\\\"vm.companys.length>0\\\" \\nng-change=\\\"vm.update_company()\\\">{{company.label==\\'*\\'?vm.profile:company.label}}\\n{{vm.sel_company}}\\n\");\n$templateCache.put(\"app/navigation/layouts/vertical-navigation-fullwidth-toolbar-2/navigation.html\",\"\");\n$templateCache.put(\"app/main/pages/article/article.html\",\"
\\n
\\n
\\n{{vm.record ? (vm.record.local ? vm.record.local : vm.recordLabel) : vm.recordLabel }}
\\n{{vm.record.BrandID}}
\\n\\n\\n
\\n
\\n\\n
\\n
\\n
\\n\\n
Nr.SerieLocalEstadoNotas
{{prod.SerialNr}}{{prod.LocationID}}\\n{{prod.Status}}{{prod.notes}}
\");\n$templateCache.put(\"app/main/pages/articles/articles-filter.html\",\"
\\nOpen FiltersFilter\\n
\\n\\n-- Select --{{client.client}}\\n
\");\n$templateCache.put(\"app/main/pages/articles/articles.html\",\"
\\n
\\n
\\n
{{vm.totalRecords}}\\n
\\n
\");\n$templateCache.put(\"app/main/pages/catalog/catalog.html\",\"
\\n{{family.Description}}{{subfamily.SubFamily}}\\n{{brand.BrandID}}\\n
\\n
\\n
{{article.Description}}
\\n\\n
\");\n$templateCache.put(\"app/main/pages/calendar/calendar.html\",\"
Calendar
{{vm.nrEvents}}
\\n
\\n{{vm.eventossempedidos}}
{{vm.nrAprovados}}
\\n
{{vm.nrRegistados}}
\\n
\\n{{vm.pedidosporresponder}}
{{vm.calendarView.title}}
\\n
\");\n$templateCache.put(\"app/main/pages/event/event.html\",\"
\\n
{{vm.record ? (vm.record.local ? vm.record.local : vm.recordLabel) : vm.recordLabel }}\\n
{{vm.create_user}}
\\n
\\n0\\\" required>
0\\\" style=\\\"margin-left:-16px\\\" \\nmd-placeholder=\\'{{\\\"EVENT.STARTDATE\\\" | translate}}\\' ng-model=\\\"vm.record.StartDate\\\">

0\\\" style=\\\"margin-left:-16px\\\" \\nmd-placeholder=\\'{{\\\"EVENT.ENDDATE\\\" | translate}}\\' ng-model=\\\"vm.record.EndDate\\\">

\\n

\\n
\");\n$templateCache.put(\"app/main/pages/orders/orders-filter.html\",\"
Open FiltersFilter\\n
\\n\\n-- Select --{{event.title}}\\n
-- Select --{{state.DocumentStatus}}\\n
\");\n$templateCache.put(\"app/main/pages/orders/orders.html\",\"
\\n{{\\'Evento: \\' + vm.topfilter}}
\\n{{vm.topfilter==\\'\\' ? vm.totalRecords : vm.totalRecordsFiltered}}
\\n
\\nOpen Filters\\n
\");\n$templateCache.put(\"app/main/pages/order/order.html\",\"
{{vm.record ? (vm.record.local ? vm.record.local : vm.recordLabel) : vm.recordLabel }}
\\n
\\nAdicionar Produto
\\nSAVE
Aprovar
\\n
\\n{{ \\'ORDER.NEW_LOCATION\\' | translate }}\\n
\\n
\\n{{ \\'ORDER.IMPLEMENTATION\\' | translate }}
\\n{{ \\'ORDER.DELIVERY\\' | translate }}\\n
Escolha local{{local.label}}\\n\\nManhã\\nTardeAntes FechoApós Fecho
\\n
{{ \\'ORDER.PICKUP\\' | translate }}\\n
\\n\\n{{local.label}}\\n\\nManhãTardeAntes FechoApós Fecho
\\n
\\n
\\n
\\n
{{ \\'ORDER.CODE\\' | translate }}\\n{{ \\'ORDER.PRODUCT\\' | translate }}{{ \\'ORDER.QUANTITY\\' | translate }}{{ \\'ORDER.SERIAL\\' | translate }}\\n
{{prod.Codigo}}{{prod.Description}}\\n{{prod.sn}}
\");\n$templateCache.put(\"app/main/pages/events/events-filter.html\",\"
Open FiltersFilter\\n
\\n\\n-- Select --{{client.client}}\\n
\");\n$templateCache.put(\"app/main/pages/events/events.html\",\"
{{vm.topfilter}}\\n
\\n{{vm.topfilter==\\'\\' ? vm.totalRecords : vm.totalRecordsFiltered}}
\\n
\\n
\");\n$templateCache.put(\"app/main/pages/user/user.html\",\"
\\n
\\n{{vm.record ? (vm.record.DisplayName ? vm.record.DisplayName : vm.recordLabel) : vm.recordLabel }}
\\n
\\n
\\n
\\n
{{profile.label}}
0) && (recordForm.$submitted || recordForm.ProfileID.$touched || recordForm.ProfileID.$dirty)\\\">\\n
{{company.label}}
0) && (recordForm.$submitted || recordForm.ProfileID.$touched || recordForm.ProfileID.$dirty)\\\">\\n
BACK\\nSAVE\\n
\");\n$templateCache.put(\"app/main/pages/report/report.html\",\"
\\n
\\n{{vm.record ? (vm.record.local ? vm.record.local : vm.recordLabel) : vm.recordLabel }}
Aprovar\\n
Apagar
\\n
{{vm.report_status}}
-- Select --{{opcao}}\\n\\n\\n
BACK\\nSAVE
\\nFotografias
{{image.Description}}Apagar imagem
\\n
\\n\\n
\");\n$templateCache.put(\"app/main/pages/users/users-filter.html\",\"
Open FiltersFilter\\n
\\n\\n-- Select --{{profile.label}}\\n
\");\n$templateCache.put(\"app/main/pages/users/users.html\",\"
\\n
\\n
\\n
{{vm.topfilter}}
\\n {{vm.topfilter==\\'\\' ? vm.totalRecords : vm.totalRecordsFiltered}}\\n
Open Filters
\");\n$templateCache.put(\"app/toolbar/layouts/vertical-navigation/toolbar.html\",\"
{{vm.username}}
\\n
Logout
\\n
\\n{{vm.selectedLanguage.code}}
\\n {{lang.title}}
\\n
\");\n$templateCache.put(\"app/core/directives/ms-navigation/templates/horizontal.html\",\"
\");\n$templateCache.put(\"app/core/directives/ms-navigation/templates/vertical.html\",\"
\\n\");\n$templateCache.put(\"app/main/pages/articles/sidenav/equipments-sidenav.html\",\"
 
{{vm.total}}
\\n
NOVO CLIENTE\\n
\\nAll Tasks
Estados de Cliente
\\n{{clientstate.label}}
\");\n$templateCache.put(\"app/main/pages/orders/sidenav/equipments-sidenav.html\",\"
 
{{vm.total}}
\\n
NOVO CLIENTE\\n
\\nAll Tasks
Estados de Cliente
\\n{{clientstate.label}}
\");\n$templateCache.put(\"app/main/pages/order/dialog/catalogo.tmpl.html\",\"

\\n
\\n{{family.Description}}{{subfamily.SubFamily}}\\n\\n{{brand.BrandID}}\\nLimpar\\n
\\n
{{article.Description}}
\\n
\");\n$templateCache.put(\"app/main/pages/order/dialog/local.tmpl.html\",\"

\\n
\\n
\\n\\n
\\n
\\n
\\n{{country.Description}}
\\n\\n
\");\n$templateCache.put(\"app/main/pages/events/sidenav/equipments-sidenav.html\",\"
 
{{vm.total}}
\\n
NOVO CLIENTE\\n
\\nAll Tasks
Estados de Cliente
\\n{{clientstate.label}}
\");\n$templateCache.put(\"app/main/pages/report/dialog/photo.tmpl.html\",\"

{{imagem.Description}}

\\n
\");\n$templateCache.put(\"app/main/pages/users/sidenav/equipments-sidenav.html\",\"
 
{{vm.total}}
\\n
NOVO CLIENTE\\n
\\nAll Tasks
Estados de Cliente
\\n{{clientstate.label}}
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-1/template-1.html\",\"
{{card.title}}
{{card.subtitle}}\\n
{{card.text}}
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-2/template-2.html\",\"
{{card.title}}
\\n{{card.subtitle}}
{{card.text}}\\n
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-10/template-10.html\",\"
\\n
{{card.title}}
{{card.subtitle}}
\\\"{{card.media.image.alt}}\\\"
{{card.text}}
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-5/template-5.html\",\"
{{card.title}}
\\n{{card.event}}
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-4/template-4.html\",\"
{{card.title}}\\n
{{card.text}}
\\\"{{card.media.image.alt}}\\\"
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-6/template-6.html\",\"
\\n{{card.subtitle}}
{{card.title}}
{{card.text}}
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-3/template-3.html\",\"
{{card.title}}
{{card.subtitle}}
{{card.cta}}
\\\"{{card.media.image.alt}}\\\"
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-7/template-7.html\",\"
{{card.title}}\\n
{{card.subtitle}}
{{card.text}}
\\n
\\\"{{card.media.image.alt}}\\\"
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-8/template-8.html\",\"
{{card.title}}
{{card.subtitle}}\\n
{{card.button1}}\\n{{card.button2}}
{{card.text}}
\");\n$templateCache.put(\"app/core/directives/ms-card/templates/template-9/template-9.html\",\"
{{card.title}}
\\n{{card.subtitle}}
{{card.text}}
\\\"{{card.media.image.alt}}\\\"
\\n
\");\n$templateCache.put(\"app/core/directives/ms-stepper/templates/horizontal/horizontal.html\",\"
{{$index + 1}} \\n
\\n{{step.stepTitle}}
Optional
\\n
Back
Next\\nSubmit
\");\n$templateCache.put(\"app/core/directives/ms-stepper/templates/vertical/vertical.html\",\"
\");\n$templateCache.put(\"app/main/pages/calendar/dialogs/event-detail/event-detail-dialog.html\",\"
{{vm.calendarEvent.title}}
\\n
{{vm.calendarEvent.start.format(\\'MMMM Do YYYY, h:mm:ss a\\')}} -\\n {{vm.calendarEvent.end.format(\\'MMMM Do YYYY, h:mm:ss a\\')}} \\n{{vm.calendarEvent.repeat || \\'Does not repeat\\'}}
30 minutes before 15 minutes before \\n30 minutes later
Istanbul, Turkey
\\n
\\n
\\\"alice\\\" \\\"joyce\\\" \\\"vincent\\\"
\");\n$templateCache.put(\"app/main/pages/calendar/dialogs/event-form/event-form-dialog.html\",\"
\\n
\\n{{vm.dialogTitle}}
Title field is required
\\n

All Day

\\n
\\n
\\n
Notifications
\\n{{opt}}+ Add Another Notification\\n
\\n
SAVEDelete\\n
\");\n$templateCache.put(\"app/core/directives/ms-stepper/templates/vertical/step/vertical-step.html\",\"
{{stepInfo.stepTitle}}
\\nOptional
BackNext\\nSubmit
\");}]);"],"sourceRoot":"/source/"}