diff --git a/bower.json b/bower.json index b2ccfa88..5f97b891 100644 --- a/bower.json +++ b/bower.json @@ -28,6 +28,7 @@ }, "private": true, "resolutions": { - "angular": "~1.3.0-beta.2" + "angular": "~1.3.0-beta.2", + "localforage": "0.2.0" } } diff --git a/res/app/components/stf/common-ui/safe-apply/index.js b/res/app/components/stf/common-ui/safe-apply/index.js new file mode 100644 index 00000000..ff4bf5c3 --- /dev/null +++ b/res/app/components/stf/common-ui/safe-apply/index.js @@ -0,0 +1,20 @@ +module.exports = angular.module('stf.safe-apply', []) + .config([ + '$provide', function ($provide) { + return $provide.decorator('$rootScope', [ + '$delegate', function ($delegate) { + $delegate.safeApply = function (fn) { + var phase = $delegate.$$phase + if (phase === "$apply" || phase === "$digest") { + if (fn && typeof fn === 'function') { + fn() + } + } else { + $delegate.$apply(fn) + } + } + return $delegate + } + ]) + } + ]) diff --git a/res/app/components/stf/common-ui/table/table.css b/res/app/components/stf/common-ui/table/table.css index 4822ad47..23ee5c39 100644 --- a/res/app/components/stf/common-ui/table/table.css +++ b/res/app/components/stf/common-ui/table/table.css @@ -6,6 +6,7 @@ -moz-user-select: none; -ms-user-select: none; user-select: none; + font-weight: bold; } .ng-table th.sortable { diff --git a/res/app/components/stf/nav-menu/index.js b/res/app/components/stf/nav-menu/index.js new file mode 100644 index 00000000..09f7229f --- /dev/null +++ b/res/app/components/stf/nav-menu/index.js @@ -0,0 +1,2 @@ +module.exports = angular.module('stf.nav-menu', []) + .directive('navMenu', require('./nav-menu-directive')) diff --git a/res/app/components/stf/nav-menu/nav-menu-directive.js b/res/app/components/stf/nav-menu/nav-menu-directive.js new file mode 100644 index 00000000..7e5aec98 --- /dev/null +++ b/res/app/components/stf/nav-menu/nav-menu-directive.js @@ -0,0 +1,39 @@ +module.exports = function ($location) { + return function (scope, element, attrs) { + var links = element.find('a') + var onClass = attrs.navMenu || 'current' + var routePattern + var link + var url + var currentLink + var urlMap = {} + var i + + if (!$location.$$html5) { + routePattern = /^#[^/]*/ + } + + for (i = 0; i < links.length; i++) { + link = angular.element(links[i]) + url = link.attr('href') + + if ($location.$$html5) { + urlMap[url] = link + } else { + urlMap[url.replace(routePattern, '')] = link + } + } + + scope.$on('$routeChangeStart', function () { + var pathLink = urlMap[$location.path()] + + if (pathLink) { + if (currentLink) { + currentLink.removeClass(onClass); + } + currentLink = pathLink; + currentLink.addClass(onClass); + } + }) + } +} \ No newline at end of file diff --git a/res/app/components/stf/nav-menu/nav-menu-spec.js b/res/app/components/stf/nav-menu/nav-menu-spec.js new file mode 100644 index 00000000..1125ee1f --- /dev/null +++ b/res/app/components/stf/nav-menu/nav-menu-spec.js @@ -0,0 +1,23 @@ +describe('navMenu', function () { + + beforeEach(module('stf.nav-menu')); + + var scope, compile; + + beforeEach(inject(function ($rootScope, $compile) { + scope = $rootScope.$new(); + compile = $compile; + })); + + it('should ...', function () { + + /* + To test your directive, you need to create some html that would use your directive, + send that through compile() then compare the results. + + var element = compile('
hi
')(scope); + expect(element.text()).toBe('hello, world'); + */ + + }); +}); \ No newline at end of file diff --git a/res/app/device-list/device-list.css b/res/app/device-list/device-list.css index 512ff9d5..6429f696 100644 --- a/res/app/device-list/device-list.css +++ b/res/app/device-list/device-list.css @@ -6,6 +6,11 @@ margin-top: -32px; } +.stf-device-list .device-not-usable { + /*background: rgb(245, 245, 245);*/ + opacity: 0.7; +} + .stf-device-list .devices-not-available { background: #f6f6f6; } diff --git a/res/app/device-list/device-list.jade b/res/app/device-list/device-list.jade index 08e2e9d0..5d391070 100644 --- a/res/app/device-list/device-list.jade +++ b/res/app/device-list/device-list.jade @@ -71,7 +71,7 @@ div.stf-device-list div {{"User"|translate}} //tbody - tr(ng-repeat='device in $data') + tr(ng-repeat='device in $data', ng-class='{ "device-not-usable": !device.usable }') td(data-title="'Status'", sortable='"state"', filter="{ 'usable': 'select' }", @@ -130,7 +130,7 @@ div.stf-device-list a(ng-href='{{deviceUser(device).link}}', target='_blank') {{ deviceUser(device).name }} -ul +//ul li(ng-repeat='device in tracker.devices track by device.serial') pre {{device|json}} diff --git a/res/app/menu/index.js b/res/app/menu/index.js index 514fdcc0..0a517241 100644 --- a/res/app/menu/index.js +++ b/res/app/menu/index.js @@ -1,6 +1,7 @@ require('./menu.css') module.exports = angular.module('stf.menu', [ + require('stf/nav-menu').name ]) .run(["$templateCache", function ($templateCache) { $templateCache.put('menu.jade', require('./menu.jade')) diff --git a/res/app/menu/menu-controller.js b/res/app/menu/menu-controller.js index 3f9aaaf2..1e1feadf 100644 --- a/res/app/menu/menu-controller.js +++ b/res/app/menu/menu-controller.js @@ -1,3 +1,16 @@ module.exports = function MenuCtrl($scope) { - + + $scope.isActive = function (viewLocation) { + var pattern = '/' + viewLocation, + re = new RegExp(pattern); + return re.test($location.path()); + }; + + $scope.isActive = function (path) { + console.log($location.path()) + console.log($location.path().substr(0, path.length)) + + return $location.path().substr(0, path.length) == path; + } + } diff --git a/res/app/menu/menu.jade b/res/app/menu/menu.jade index 04813a2d..09fbf46c 100644 --- a/res/app/menu/menu.jade +++ b/res/app/menu/menu.jade @@ -1,7 +1,7 @@ .navbar.stf-menu .container-fluid.stf-top-bar a.stf-logo(href="/") STF 2 - ul.nav.stf-nav + ul.nav.stf-nav(nav-menu) li(ng-cloak) a(href='/#!/control') span.fa.fa-mobile diff --git a/webpack.config.js b/webpack.config.js index 364369b7..919aefa9 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -33,15 +33,15 @@ module.exports = { , { test: /\.png$/, loader: "url-loader?limit=5000&mimetype=image/png" } , { test: /\.gif$/, loader: "url-loader?limit=5000&mimetype=image/gif" } , { test: /\.svg$/ - , loader: "url-loader?limit=5000&mimetype=image/svg+xml" } + , loader: "url-loader?limit=1&mimetype=image/svg+xml" } , { test: /\.woff$/ - , loader: "url-loader?limit=5000&mimetype=application/font-woff" } + , loader: "url-loader?limit=1&mimetype=application/font-woff" } , { test: /\.otf$/ - , loader: "url-loader?limit=5000&mimetype=application/font-woff" } + , loader: "url-loader?limit=1&mimetype=application/font-woff" } , { test: /\.ttf$/ - , loader: "url-loader?limit=5000&mimetype=application/font-woff" } + , loader: "url-loader?limit=1&mimetype=application/font-woff" } , { test: /\.eot$/ - , loader: "url-loader?limit=5000&mimetype=vnd.ms-fontobject" } + , loader: "url-loader?limit=1&mimetype=vnd.ms-fontobject" } , { test: /\.jade/ , loader: 'template-html-loader' } , { test: /\.html/, loader: 'html-loader' }