mirror of
https://github.com/Athou/commafeed.git
synced 2026-03-21 21:37:29 +00:00
apply prettier
This commit is contained in:
7
.prettierrc
Normal file
7
.prettierrc
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"printWidth": 140,
|
||||
"semi": false,
|
||||
"tabWidth": 4,
|
||||
"arrowParens": "avoid",
|
||||
"endOfLine": "auto"
|
||||
}
|
||||
@@ -1,86 +1,86 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Swagger UI</title>
|
||||
<link href='css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
|
||||
<link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
|
||||
<link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
|
||||
<link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/>
|
||||
<link href='css/screen.css' media='print' rel='stylesheet' type='text/css'/>
|
||||
<script type="text/javascript" src="lib/shred.bundle.js"></script>
|
||||
<script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script>
|
||||
<script src='lib/jquery.slideto.min.js' type='text/javascript'></script>
|
||||
<script src='lib/jquery.wiggle.min.js' type='text/javascript'></script>
|
||||
<script src='lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
|
||||
<script src='lib/handlebars-2.0.0.js' type='text/javascript'></script>
|
||||
<script src='lib/underscore-min.js' type='text/javascript'></script>
|
||||
<script src='lib/backbone-min.js' type='text/javascript'></script>
|
||||
<script src='lib/swagger-client.js' type='text/javascript'></script>
|
||||
<script src='swagger-ui.js' type='text/javascript'></script>
|
||||
<script src='lib/highlight.7.3.pack.js' type='text/javascript'></script>
|
||||
<script src='lib/marked.js' type='text/javascript'></script>
|
||||
<head>
|
||||
<title>Swagger UI</title>
|
||||
<link href="css/typography.css" media="screen" rel="stylesheet" type="text/css" />
|
||||
<link href="css/reset.css" media="screen" rel="stylesheet" type="text/css" />
|
||||
<link href="css/screen.css" media="screen" rel="stylesheet" type="text/css" />
|
||||
<link href="css/reset.css" media="print" rel="stylesheet" type="text/css" />
|
||||
<link href="css/screen.css" media="print" rel="stylesheet" type="text/css" />
|
||||
<script type="text/javascript" src="lib/shred.bundle.js"></script>
|
||||
<script src="lib/jquery-1.8.0.min.js" type="text/javascript"></script>
|
||||
<script src="lib/jquery.slideto.min.js" type="text/javascript"></script>
|
||||
<script src="lib/jquery.wiggle.min.js" type="text/javascript"></script>
|
||||
<script src="lib/jquery.ba-bbq.min.js" type="text/javascript"></script>
|
||||
<script src="lib/handlebars-2.0.0.js" type="text/javascript"></script>
|
||||
<script src="lib/underscore-min.js" type="text/javascript"></script>
|
||||
<script src="lib/backbone-min.js" type="text/javascript"></script>
|
||||
<script src="lib/swagger-client.js" type="text/javascript"></script>
|
||||
<script src="swagger-ui.js" type="text/javascript"></script>
|
||||
<script src="lib/highlight.7.3.pack.js" type="text/javascript"></script>
|
||||
<script src="lib/marked.js" type="text/javascript"></script>
|
||||
|
||||
<!-- enabling this will enable oauth2 implicit scope support -->
|
||||
<script src='lib/swagger-oauth.js' type='text/javascript'></script>
|
||||
<script type="text/javascript">
|
||||
$(function () {
|
||||
window.swaggerUi = new SwaggerUi({
|
||||
url: "./swagger.json",
|
||||
dom_id: "swagger-ui-container",
|
||||
supportedSubmitMethods: ['get', 'post', 'put', 'delete'],
|
||||
onComplete: function(swaggerApi, swaggerUi){
|
||||
if(typeof initOAuth == "function") {
|
||||
/*
|
||||
<!-- enabling this will enable oauth2 implicit scope support -->
|
||||
<script src="lib/swagger-oauth.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(function () {
|
||||
window.swaggerUi = new SwaggerUi({
|
||||
url: "./swagger.json",
|
||||
dom_id: "swagger-ui-container",
|
||||
supportedSubmitMethods: ["get", "post", "put", "delete"],
|
||||
onComplete: function (swaggerApi, swaggerUi) {
|
||||
if (typeof initOAuth == "function") {
|
||||
/*
|
||||
initOAuth({
|
||||
clientId: "your-client-id",
|
||||
realm: "your-realms",
|
||||
appName: "your-app-name"
|
||||
});
|
||||
*/
|
||||
}
|
||||
$('pre code').each(function(i, e) {
|
||||
hljs.highlightBlock(e)
|
||||
});
|
||||
},
|
||||
onFailure: function(data) {
|
||||
log("Unable to Load SwaggerUI");
|
||||
},
|
||||
docExpansion: "none",
|
||||
sorter : "alpha"
|
||||
});
|
||||
}
|
||||
$("pre code").each(function (i, e) {
|
||||
hljs.highlightBlock(e)
|
||||
})
|
||||
},
|
||||
onFailure: function (data) {
|
||||
log("Unable to Load SwaggerUI")
|
||||
},
|
||||
docExpansion: "none",
|
||||
sorter: "alpha",
|
||||
})
|
||||
|
||||
$('#input_apiKey').change(function() {
|
||||
var key = $('#input_apiKey')[0].value;
|
||||
log("key: " + key);
|
||||
if(key && key.trim() != "") {
|
||||
log("added key " + key);
|
||||
window.authorizations.add("key", new ApiKeyAuthorization("api_key", key, "query"));
|
||||
}
|
||||
})
|
||||
window.swaggerUi.load();
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
$("#input_apiKey").change(function () {
|
||||
var key = $("#input_apiKey")[0].value
|
||||
log("key: " + key)
|
||||
if (key && key.trim() != "") {
|
||||
log("added key " + key)
|
||||
window.authorizations.add("key", new ApiKeyAuthorization("api_key", key, "query"))
|
||||
}
|
||||
})
|
||||
window.swaggerUi.load()
|
||||
})
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body class="swagger-section">
|
||||
<div id='header'>
|
||||
<div class="swagger-ui-wrap">
|
||||
<a id="logo" href="http://swagger.wordnik.com">swagger</a>
|
||||
<form id='api_selector'>
|
||||
<div class='input icon-btn'>
|
||||
<img id="show-pet-store-icon" src="images/pet_store_api.png" title="Show Swagger Petstore Example Apis">
|
||||
</div>
|
||||
<div class='input icon-btn'>
|
||||
<img id="show-wordnik-dev-icon" src="images/wordnik_api.png" title="Show Wordnik Developer Apis">
|
||||
</div>
|
||||
<div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
|
||||
<div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"/></div>
|
||||
<div class='input'><a id="explore" href="#">Explore</a></div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<body class="swagger-section">
|
||||
<div id="header">
|
||||
<div class="swagger-ui-wrap">
|
||||
<a id="logo" href="http://swagger.wordnik.com">swagger</a>
|
||||
<form id="api_selector">
|
||||
<div class="input icon-btn">
|
||||
<img id="show-pet-store-icon" src="images/pet_store_api.png" title="Show Swagger Petstore Example Apis" />
|
||||
</div>
|
||||
<div class="input icon-btn">
|
||||
<img id="show-wordnik-dev-icon" src="images/wordnik_api.png" title="Show Wordnik Developer Apis" />
|
||||
</div>
|
||||
<div class="input"><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text" /></div>
|
||||
<div class="input"><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text" /></div>
|
||||
<div class="input"><a id="explore" href="#">Explore</a></div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="message-bar" class="swagger-ui-wrap"> </div>
|
||||
<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
|
||||
</body>
|
||||
<div id="message-bar" class="swagger-ui-wrap"> </div>
|
||||
<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,86 +1,86 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>CommaFeed</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="default">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<link rel="manifest" href="manifest.json">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
|
||||
<link rel="apple-touch-icon" href="app-icon-57.png" />
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="app-icon-72.png" />
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="app-icon-114.png" />
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="app-icon-144.png" />
|
||||
<link rel="icon" sizes="32x32" href="app-icon-32.png" />
|
||||
<link rel="icon" sizes="64x64" href="app-icon-64.png" />
|
||||
<link rel="icon" sizes="128x128" href="app-icon-128.png" />
|
||||
<link rel="icon" sizes="192x192" href="app-icon-192.png" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
|
||||
<meta name="theme-color" content="#F88A14" />
|
||||
<meta name="application-name" content="CommaFeed" />
|
||||
<meta name="msapplication-navbutton-color" content="#F88A14" />
|
||||
<meta name="msapplication-starturl" content="/" />
|
||||
<meta name="msapplication-square70x70logo" content="metro-icon-70.png" />
|
||||
<meta name="msapplication-square150x150logo" content="metro-icon-150.png" />
|
||||
<link rel="fluid-icon" href="app-icon-512.png" title="CommaFeed" />
|
||||
<link rel="logo" type="image/svg" href="app-icon.svg" />
|
||||
<head>
|
||||
<title>CommaFeed</title>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
|
||||
<meta name="mobile-web-app-capable" content="yes" />
|
||||
<link rel="manifest" href="manifest.json" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
|
||||
<link rel="apple-touch-icon" href="app-icon-57.png" />
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="app-icon-72.png" />
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="app-icon-114.png" />
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="app-icon-144.png" />
|
||||
<link rel="icon" sizes="32x32" href="app-icon-32.png" />
|
||||
<link rel="icon" sizes="64x64" href="app-icon-64.png" />
|
||||
<link rel="icon" sizes="128x128" href="app-icon-128.png" />
|
||||
<link rel="icon" sizes="192x192" href="app-icon-192.png" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
|
||||
<meta name="theme-color" content="#F88A14" />
|
||||
<meta name="application-name" content="CommaFeed" />
|
||||
<meta name="msapplication-navbutton-color" content="#F88A14" />
|
||||
<meta name="msapplication-starturl" content="/" />
|
||||
<meta name="msapplication-square70x70logo" content="metro-icon-70.png" />
|
||||
<meta name="msapplication-square150x150logo" content="metro-icon-150.png" />
|
||||
<link rel="fluid-icon" href="app-icon-512.png" title="CommaFeed" />
|
||||
<link rel="logo" type="image/svg" href="app-icon.svg" />
|
||||
|
||||
<!-- build:css css/app.css -->
|
||||
<link rel="stylesheet" href="lib/bootstrap/dist/css/bootstrap.css" />
|
||||
<link rel="stylesheet" href="lib/font-awesome/css/font-awesome.css" />
|
||||
<link rel="stylesheet" href="lib/select2/select2.css" />
|
||||
<link rel="stylesheet" href="lib/ng-grid/ng-grid.css" />
|
||||
<link rel="stylesheet" href="lib/jquery-ui/themes/base/jquery-ui.css" />
|
||||
<link rel="stylesheet" href="lib/angular-loading-bar/build/loading-bar.css" />
|
||||
<!-- build:css css/app.css -->
|
||||
<link rel="stylesheet" href="lib/bootstrap/dist/css/bootstrap.css" />
|
||||
<link rel="stylesheet" href="lib/font-awesome/css/font-awesome.css" />
|
||||
<link rel="stylesheet" href="lib/select2/select2.css" />
|
||||
<link rel="stylesheet" href="lib/ng-grid/ng-grid.css" />
|
||||
<link rel="stylesheet" href="lib/jquery-ui/themes/base/jquery-ui.css" />
|
||||
<link rel="stylesheet" href="lib/angular-loading-bar/build/loading-bar.css" />
|
||||
|
||||
<link rel="stylesheet" href="css/app.css" />
|
||||
<!-- endbuild -->
|
||||
<link rel="stylesheet" href="custom_css.css" />
|
||||
</head>
|
||||
<body>
|
||||
<div ng-app="commafeed" id="main" class="main">
|
||||
<div ui-view></div>
|
||||
</div>
|
||||
|
||||
<!-- build:js js/app.js -->
|
||||
<script type="text/javascript" src="lib/lodash/lodash.js"></script>
|
||||
<script type="text/javascript" src="lib/jquery/dist/jquery.js"></script>
|
||||
<script type="text/javascript" src="lib/jquery-ui/ui/jquery-ui.js"></script>
|
||||
<script type="text/javascript" src="lib/jquery-mousewheel/jquery.mousewheel.js"></script>
|
||||
<script type="text/javascript" src="lib/bootstrap/dist/js/bootstrap.js"></script>
|
||||
<script type="text/javascript" src="lib/angular/angular.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-route/angular-route.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-resource/angular-resource.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-sanitize/angular-sanitize.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-touch/angular-touch.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-animate/angular-animate.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-bootstrap/ui-bootstrap-tpls.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-loading-bar/build/loading-bar.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-translate/angular-translate.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-translate-loader-static-files/angular-translate-loader-static-files.js"></script>
|
||||
|
||||
<script type="text/javascript" src="lib/ngInfiniteScroll/build/ng-infinite-scroll.js"></script>
|
||||
<script type="text/javascript" src="lib/ng-grid/build/ng-grid.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-ui-router/release/angular-ui-router.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-ui-utils/ui-utils.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-ui-select2/src/select2.js"></script>
|
||||
<script type="text/javascript" src="lib/select2/select2.js"></script>
|
||||
<script type="text/javascript" src="lib/mousetrap/mousetrap.js"></script>
|
||||
<script type="text/javascript" src="lib/momentjs/min/moment-with-locales.js"></script>
|
||||
<script type="text/javascript" src="lib/devicejs/lib/device.js"></script>
|
||||
<script type="text/javascript" src="lib/tinycon/tinycon.js"></script>
|
||||
|
||||
<script type="text/javascript" src="js/controllers.js"></script>
|
||||
<script type="text/javascript" src="js/directives.js"></script>
|
||||
<script type="text/javascript" src="js/filters.js"></script>
|
||||
<script type="text/javascript" src="js/main.js"></script>
|
||||
<script type="text/javascript" src="js/services.js"></script>
|
||||
<script type="text/javascript" src="js/i18n.js"></script>
|
||||
|
||||
<script type="text/javascript" src="js/templates.js"></script>
|
||||
<!-- endbuild -->
|
||||
<script type="text/javascript" src="analytics.js"></script>
|
||||
</body>
|
||||
<link rel="stylesheet" href="css/app.css" />
|
||||
<!-- endbuild -->
|
||||
<link rel="stylesheet" href="custom_css.css" />
|
||||
</head>
|
||||
<body>
|
||||
<div ng-app="commafeed" id="main" class="main">
|
||||
<div ui-view></div>
|
||||
</div>
|
||||
|
||||
<!-- build:js js/app.js -->
|
||||
<script type="text/javascript" src="lib/lodash/lodash.js"></script>
|
||||
<script type="text/javascript" src="lib/jquery/dist/jquery.js"></script>
|
||||
<script type="text/javascript" src="lib/jquery-ui/ui/jquery-ui.js"></script>
|
||||
<script type="text/javascript" src="lib/jquery-mousewheel/jquery.mousewheel.js"></script>
|
||||
<script type="text/javascript" src="lib/bootstrap/dist/js/bootstrap.js"></script>
|
||||
<script type="text/javascript" src="lib/angular/angular.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-route/angular-route.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-resource/angular-resource.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-sanitize/angular-sanitize.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-touch/angular-touch.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-animate/angular-animate.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-bootstrap/ui-bootstrap-tpls.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-loading-bar/build/loading-bar.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-translate/angular-translate.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-translate-loader-static-files/angular-translate-loader-static-files.js"></script>
|
||||
|
||||
<script type="text/javascript" src="lib/ngInfiniteScroll/build/ng-infinite-scroll.js"></script>
|
||||
<script type="text/javascript" src="lib/ng-grid/build/ng-grid.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-ui-router/release/angular-ui-router.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-ui-utils/ui-utils.js"></script>
|
||||
<script type="text/javascript" src="lib/angular-ui-select2/src/select2.js"></script>
|
||||
<script type="text/javascript" src="lib/select2/select2.js"></script>
|
||||
<script type="text/javascript" src="lib/mousetrap/mousetrap.js"></script>
|
||||
<script type="text/javascript" src="lib/momentjs/min/moment-with-locales.js"></script>
|
||||
<script type="text/javascript" src="lib/devicejs/lib/device.js"></script>
|
||||
<script type="text/javascript" src="lib/tinycon/tinycon.js"></script>
|
||||
|
||||
<script type="text/javascript" src="js/controllers.js"></script>
|
||||
<script type="text/javascript" src="js/directives.js"></script>
|
||||
<script type="text/javascript" src="js/filters.js"></script>
|
||||
<script type="text/javascript" src="js/main.js"></script>
|
||||
<script type="text/javascript" src="js/services.js"></script>
|
||||
<script type="text/javascript" src="js/i18n.js"></script>
|
||||
|
||||
<script type="text/javascript" src="js/templates.js"></script>
|
||||
<!-- endbuild -->
|
||||
<script type="text/javascript" src="analytics.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,373 +1,402 @@
|
||||
var module = angular.module('commafeed.directives', []);
|
||||
var module = angular.module("commafeed.directives", [])
|
||||
|
||||
module.directive('focus', ['$timeout', function($timeout) {
|
||||
return {
|
||||
restrict : 'A',
|
||||
link : function(scope, element, attrs) {
|
||||
scope.$watch(attrs.focus, function(value) {
|
||||
if (!value)
|
||||
return;
|
||||
$timeout(function() {
|
||||
$(element).focus();
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
}]);
|
||||
module.directive("focus", [
|
||||
"$timeout",
|
||||
function ($timeout) {
|
||||
return {
|
||||
restrict: "A",
|
||||
link: function (scope, element, attrs) {
|
||||
scope.$watch(attrs.focus, function (value) {
|
||||
if (!value) return
|
||||
$timeout(function () {
|
||||
$(element).focus()
|
||||
})
|
||||
})
|
||||
},
|
||||
}
|
||||
},
|
||||
])
|
||||
|
||||
module.directive('confirmClick', [function() {
|
||||
return {
|
||||
priority : -1,
|
||||
restrict : 'A',
|
||||
link : function(scope, element, attrs) {
|
||||
element.bind('click', function(e) {
|
||||
var message = scope.$eval(attrs.confirmClick);
|
||||
if (message && !confirm(message)) {
|
||||
e.stopImmediatePropagation();
|
||||
e.preventDefault();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
}]);
|
||||
module.directive("confirmClick", [
|
||||
function () {
|
||||
return {
|
||||
priority: -1,
|
||||
restrict: "A",
|
||||
link: function (scope, element, attrs) {
|
||||
element.bind("click", function (e) {
|
||||
var message = scope.$eval(attrs.confirmClick)
|
||||
if (message && !confirm(message)) {
|
||||
e.stopImmediatePropagation()
|
||||
e.preventDefault()
|
||||
}
|
||||
})
|
||||
},
|
||||
}
|
||||
},
|
||||
])
|
||||
|
||||
/**
|
||||
* Open a popup window pointing to the url in the href attribute
|
||||
*/
|
||||
module.directive('popup', function() {
|
||||
var opts = 'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=600,width=800';
|
||||
return {
|
||||
link : function(scope, elm, attrs) {
|
||||
elm.bind('click', function(event) {
|
||||
window.open(this.href, '', opts);
|
||||
event.preventDefault();
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
||||
module.directive("popup", function () {
|
||||
var opts = "menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=600,width=800"
|
||||
return {
|
||||
link: function (scope, elm, attrs) {
|
||||
elm.bind("click", function (event) {
|
||||
window.open(this.href, "", opts)
|
||||
event.preventDefault()
|
||||
})
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* entry tag handling
|
||||
*/
|
||||
module.directive('tags', function() {
|
||||
return {
|
||||
restrict : 'E',
|
||||
scope : {
|
||||
entry : '='
|
||||
},
|
||||
replace : true,
|
||||
templateUrl : 'templates/_tags.html',
|
||||
controller : ['$scope', 'EntryService', function($scope, EntryService) {
|
||||
$scope.select2Options = {
|
||||
'multiple' : true,
|
||||
'simple_tags' : true,
|
||||
'maximumInputLength' : 40,
|
||||
tags : EntryService.tags
|
||||
};
|
||||
module.directive("tags", function () {
|
||||
return {
|
||||
restrict: "E",
|
||||
scope: {
|
||||
entry: "=",
|
||||
},
|
||||
replace: true,
|
||||
templateUrl: "templates/_tags.html",
|
||||
controller: [
|
||||
"$scope",
|
||||
"EntryService",
|
||||
function ($scope, EntryService) {
|
||||
$scope.select2Options = {
|
||||
multiple: true,
|
||||
simple_tags: true,
|
||||
maximumInputLength: 40,
|
||||
tags: EntryService.tags,
|
||||
}
|
||||
|
||||
$scope.$watch('entry.tags', function(newValue, oldValue) {
|
||||
if (oldValue && newValue != oldValue) {
|
||||
var data = {
|
||||
entryId : $scope.entry.id,
|
||||
tags : []
|
||||
};
|
||||
if (newValue) {
|
||||
data.tags = newValue;
|
||||
}
|
||||
EntryService.tag(data);
|
||||
}
|
||||
}, true);
|
||||
}]
|
||||
};
|
||||
});
|
||||
$scope.$watch(
|
||||
"entry.tags",
|
||||
function (newValue, oldValue) {
|
||||
if (oldValue && newValue != oldValue) {
|
||||
var data = {
|
||||
entryId: $scope.entry.id,
|
||||
tags: [],
|
||||
}
|
||||
if (newValue) {
|
||||
data.tags = newValue
|
||||
}
|
||||
EntryService.tag(data)
|
||||
}
|
||||
},
|
||||
true
|
||||
)
|
||||
},
|
||||
],
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* Reusable favicon component
|
||||
*/
|
||||
module.directive('favicon', function() {
|
||||
var tpl = '<img ng-src="{{url}}" class="favicon"></img>';
|
||||
return {
|
||||
restrict : 'E',
|
||||
scope : {
|
||||
url : '='
|
||||
},
|
||||
replace : true,
|
||||
template : tpl
|
||||
};
|
||||
});
|
||||
module.directive("favicon", function () {
|
||||
var tpl = '<img ng-src="{{url}}" class="favicon"></img>'
|
||||
return {
|
||||
restrict: "E",
|
||||
scope: {
|
||||
url: "=",
|
||||
},
|
||||
replace: true,
|
||||
template: tpl,
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* Support for the blur event
|
||||
*/
|
||||
module.directive('ngBlur', function() {
|
||||
return {
|
||||
restrict : 'A',
|
||||
link : function(scope, elm, attrs) {
|
||||
elm.bind('blur', function() {
|
||||
scope.$apply(attrs.ngBlur);
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
||||
module.directive("ngBlur", function () {
|
||||
return {
|
||||
restrict: "A",
|
||||
link: function (scope, elm, attrs) {
|
||||
elm.bind("blur", function () {
|
||||
scope.$apply(attrs.ngBlur)
|
||||
})
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* Prevent mousewheel scrolling from propagating to the parent when scrollbar
|
||||
* reaches top or bottom
|
||||
*/
|
||||
module.directive('mousewheelScrolling', function() {
|
||||
return {
|
||||
restrict : 'A',
|
||||
link : function(scope, elem, attr) {
|
||||
elem.bind('mousewheel', function(e, d) {
|
||||
var t = $(this);
|
||||
if (d > 0 && t.scrollTop() === 0) {
|
||||
e.preventDefault();
|
||||
} else {
|
||||
if (d < 0 && (t.scrollTop() == t.get(0).scrollHeight - t.innerHeight())) {
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
||||
module.directive("mousewheelScrolling", function () {
|
||||
return {
|
||||
restrict: "A",
|
||||
link: function (scope, elem, attr) {
|
||||
elem.bind("mousewheel", function (e, d) {
|
||||
var t = $(this)
|
||||
if (d > 0 && t.scrollTop() === 0) {
|
||||
e.preventDefault()
|
||||
} else {
|
||||
if (d < 0 && t.scrollTop() == t.get(0).scrollHeight - t.innerHeight()) {
|
||||
e.preventDefault()
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* Needed to use recursive directives. Wrap a recursive element with a
|
||||
* <recursive> tag
|
||||
*/
|
||||
module.directive('recursive', ['$compile', function($compile) {
|
||||
return {
|
||||
restrict : 'E',
|
||||
priority : 100000,
|
||||
compile : function(tElement, tAttr) {
|
||||
var contents = tElement.contents().remove();
|
||||
var compiledContents = null;
|
||||
return function(scope, iElement, iAttr) {
|
||||
if (!compiledContents) {
|
||||
compiledContents = $compile(contents);
|
||||
}
|
||||
iElement.append(compiledContents(scope, function(clone) {
|
||||
return clone;
|
||||
}));
|
||||
};
|
||||
}
|
||||
};
|
||||
}]);
|
||||
module.directive("recursive", [
|
||||
"$compile",
|
||||
function ($compile) {
|
||||
return {
|
||||
restrict: "E",
|
||||
priority: 100000,
|
||||
compile: function (tElement, tAttr) {
|
||||
var contents = tElement.contents().remove()
|
||||
var compiledContents = null
|
||||
return function (scope, iElement, iAttr) {
|
||||
if (!compiledContents) {
|
||||
compiledContents = $compile(contents)
|
||||
}
|
||||
iElement.append(
|
||||
compiledContents(scope, function (clone) {
|
||||
return clone
|
||||
})
|
||||
)
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
])
|
||||
|
||||
/**
|
||||
* Reusable category component
|
||||
*/
|
||||
module.directive('category', [function() {
|
||||
return {
|
||||
scope : {
|
||||
node : '=',
|
||||
level : '=',
|
||||
selectedType : '=',
|
||||
selectedId : '=',
|
||||
showLabel : '=',
|
||||
showChildren : '=',
|
||||
unreadCount : '&',
|
||||
tag : '='
|
||||
},
|
||||
restrict : 'E',
|
||||
replace : true,
|
||||
templateUrl : 'templates/_category.html',
|
||||
controller : ['$scope', '$state', 'FeedService', 'CategoryService', 'SettingsService', 'MobileService',
|
||||
function($scope, $state, FeedService, CategoryService, SettingsService, MobileService) {
|
||||
$scope.settingsService = SettingsService;
|
||||
module.directive("category", [
|
||||
function () {
|
||||
return {
|
||||
scope: {
|
||||
node: "=",
|
||||
level: "=",
|
||||
selectedType: "=",
|
||||
selectedId: "=",
|
||||
showLabel: "=",
|
||||
showChildren: "=",
|
||||
unreadCount: "&",
|
||||
tag: "=",
|
||||
},
|
||||
restrict: "E",
|
||||
replace: true,
|
||||
templateUrl: "templates/_category.html",
|
||||
controller: [
|
||||
"$scope",
|
||||
"$state",
|
||||
"FeedService",
|
||||
"CategoryService",
|
||||
"SettingsService",
|
||||
"MobileService",
|
||||
function ($scope, $state, FeedService, CategoryService, SettingsService, MobileService) {
|
||||
$scope.settingsService = SettingsService
|
||||
|
||||
$scope.getClass = function(level) {
|
||||
if ($scope.showLabel) {
|
||||
return 'indent' + level;
|
||||
}
|
||||
};
|
||||
$scope.getClass = function (level) {
|
||||
if ($scope.showLabel) {
|
||||
return "indent" + level
|
||||
}
|
||||
}
|
||||
|
||||
$scope.categoryLabel = function(category) {
|
||||
return $scope.showLabel !== true ? $scope.showLabel : category.name;
|
||||
};
|
||||
$scope.categoryLabel = function (category) {
|
||||
return $scope.showLabel !== true ? $scope.showLabel : category.name
|
||||
}
|
||||
|
||||
$scope.categoryCountLabel = function(category) {
|
||||
var count = $scope.unreadCount({
|
||||
category : category
|
||||
});
|
||||
var label = '';
|
||||
if (count > 0) {
|
||||
label += count;
|
||||
}
|
||||
return label;
|
||||
};
|
||||
$scope.categoryCountLabel = function (category) {
|
||||
var count = $scope.unreadCount({
|
||||
category: category,
|
||||
})
|
||||
var label = ""
|
||||
if (count > 0) {
|
||||
label += count
|
||||
}
|
||||
return label
|
||||
}
|
||||
|
||||
$scope.feedCountLabel = function(feed) {
|
||||
var label = '';
|
||||
if (feed.unread > 0) {
|
||||
label += feed.unread;
|
||||
}
|
||||
return label;
|
||||
};
|
||||
$scope.feedCountLabel = function (feed) {
|
||||
var label = ""
|
||||
if (feed.unread > 0) {
|
||||
label += feed.unread
|
||||
}
|
||||
return label
|
||||
}
|
||||
|
||||
$scope.feedClicked = function(id, event) {
|
||||
// Could be called by a middle click
|
||||
if (!event || (!event.ctrlKey && event.which == 1)) {
|
||||
MobileService.toggleLeftMenu();
|
||||
if ($scope.selectedType == 'feed' && id == $scope.selectedId) {
|
||||
$scope.$emit('emitReload');
|
||||
} else {
|
||||
$state.transitionTo('feeds.view', {
|
||||
_type : 'feed',
|
||||
_id : id
|
||||
});
|
||||
}
|
||||
$scope.feedClicked = function (id, event) {
|
||||
// Could be called by a middle click
|
||||
if (!event || (!event.ctrlKey && event.which == 1)) {
|
||||
MobileService.toggleLeftMenu()
|
||||
if ($scope.selectedType == "feed" && id == $scope.selectedId) {
|
||||
$scope.$emit("emitReload")
|
||||
} else {
|
||||
$state.transitionTo("feeds.view", {
|
||||
_type: "feed",
|
||||
_id: id,
|
||||
})
|
||||
}
|
||||
|
||||
if (event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
}
|
||||
};
|
||||
if (event) {
|
||||
event.preventDefault()
|
||||
event.stopPropagation()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$scope.categoryClicked = function(id, isTag) {
|
||||
MobileService.toggleLeftMenu();
|
||||
var type = isTag ? 'tag' : 'category';
|
||||
if ($scope.selectedType == type && id == $scope.selectedId) {
|
||||
$scope.$emit('emitReload');
|
||||
} else {
|
||||
$state.transitionTo('feeds.view', {
|
||||
_type : type,
|
||||
_id : id
|
||||
});
|
||||
}
|
||||
};
|
||||
$scope.categoryClicked = function (id, isTag) {
|
||||
MobileService.toggleLeftMenu()
|
||||
var type = isTag ? "tag" : "category"
|
||||
if ($scope.selectedType == type && id == $scope.selectedId) {
|
||||
$scope.$emit("emitReload")
|
||||
} else {
|
||||
$state.transitionTo("feeds.view", {
|
||||
_type: type,
|
||||
_id: id,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
$scope.showFeedDetails = function(feed) {
|
||||
$state.transitionTo('feeds.feed_details', {
|
||||
_id : feed.id
|
||||
});
|
||||
};
|
||||
$scope.showFeedDetails = function (feed) {
|
||||
$state.transitionTo("feeds.feed_details", {
|
||||
_id: feed.id,
|
||||
})
|
||||
}
|
||||
|
||||
$scope.showCategoryDetails = function(id, isTag) {
|
||||
if (isTag) {
|
||||
$state.transitionTo('feeds.tag_details', {
|
||||
_id : id
|
||||
});
|
||||
} else {
|
||||
$state.transitionTo('feeds.category_details', {
|
||||
_id : id
|
||||
});
|
||||
}
|
||||
};
|
||||
$scope.showCategoryDetails = function (id, isTag) {
|
||||
if (isTag) {
|
||||
$state.transitionTo("feeds.tag_details", {
|
||||
_id: id,
|
||||
})
|
||||
} else {
|
||||
$state.transitionTo("feeds.category_details", {
|
||||
_id: id,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
$scope.toggleCategory = function(category, event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
category.expanded = !category.expanded;
|
||||
if (category.id == 'all') {
|
||||
return;
|
||||
}
|
||||
CategoryService.collapse({
|
||||
id : category.id,
|
||||
collapse : !category.expanded
|
||||
});
|
||||
};
|
||||
}]
|
||||
};
|
||||
}]);
|
||||
$scope.toggleCategory = function (category, event) {
|
||||
event.preventDefault()
|
||||
event.stopPropagation()
|
||||
category.expanded = !category.expanded
|
||||
if (category.id == "all") {
|
||||
return
|
||||
}
|
||||
CategoryService.collapse({
|
||||
id: category.id,
|
||||
collapse: !category.expanded,
|
||||
})
|
||||
}
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
])
|
||||
|
||||
module.directive('draggable', function() {
|
||||
return {
|
||||
restrict : 'A',
|
||||
link : function(scope, element, attrs) {
|
||||
element.draggable({
|
||||
revert : 'invalid',
|
||||
helper : 'clone',
|
||||
distance : 10,
|
||||
axis : 'y'
|
||||
}).data('source', scope.$eval(attrs.draggable));
|
||||
}
|
||||
};
|
||||
});
|
||||
module.directive("draggable", function () {
|
||||
return {
|
||||
restrict: "A",
|
||||
link: function (scope, element, attrs) {
|
||||
element
|
||||
.draggable({
|
||||
revert: "invalid",
|
||||
helper: "clone",
|
||||
distance: 10,
|
||||
axis: "y",
|
||||
})
|
||||
.data("source", scope.$eval(attrs.draggable))
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
module.directive('droppable', ['CategoryService', 'FeedService', function(CategoryService, FeedService) {
|
||||
return {
|
||||
restrict : 'A',
|
||||
link : function(scope, element, attrs) {
|
||||
element.droppable({
|
||||
tolerance : 'pointer',
|
||||
over : function(event, ui) {
|
||||
module.directive("droppable", [
|
||||
"CategoryService",
|
||||
"FeedService",
|
||||
function (CategoryService, FeedService) {
|
||||
return {
|
||||
restrict: "A",
|
||||
link: function (scope, element, attrs) {
|
||||
element.droppable({
|
||||
tolerance: "pointer",
|
||||
over: function (event, ui) {},
|
||||
drop: function (event, ui) {
|
||||
var draggable = angular.element(ui.draggable)
|
||||
|
||||
},
|
||||
drop : function(event, ui) {
|
||||
var draggable = angular.element(ui.draggable);
|
||||
var source = draggable.data("source")
|
||||
var target = scope.$eval(attrs.droppable)
|
||||
|
||||
var source = draggable.data('source');
|
||||
var target = scope.$eval(attrs.droppable);
|
||||
if (angular.equals(source, target)) {
|
||||
return
|
||||
}
|
||||
|
||||
if (angular.equals(source, target)) {
|
||||
return;
|
||||
}
|
||||
var data = {
|
||||
id: source.id,
|
||||
name: source.name,
|
||||
filter: source.filter,
|
||||
}
|
||||
|
||||
var data = {
|
||||
id : source.id,
|
||||
name : source.name,
|
||||
filter : source.filter
|
||||
};
|
||||
if (source.children) {
|
||||
// source is a category
|
||||
} else {
|
||||
// source is a feed
|
||||
|
||||
if (source.children) {
|
||||
// source is a category
|
||||
if (target.children) {
|
||||
// target is a category
|
||||
data.categoryId = target.id
|
||||
data.position = 0
|
||||
} else {
|
||||
// target is a feed
|
||||
data.categoryId = target.categoryId
|
||||
data.position = target.position
|
||||
}
|
||||
|
||||
} else {
|
||||
// source is a feed
|
||||
FeedService.modify(data, function () {
|
||||
CategoryService.init()
|
||||
})
|
||||
}
|
||||
scope.$apply()
|
||||
},
|
||||
})
|
||||
},
|
||||
}
|
||||
},
|
||||
])
|
||||
|
||||
if (target.children) {
|
||||
// target is a category
|
||||
data.categoryId = target.id;
|
||||
data.position = 0;
|
||||
} else {
|
||||
// target is a feed
|
||||
data.categoryId = target.categoryId;
|
||||
data.position = target.position;
|
||||
}
|
||||
module.directive("metricMeter", function () {
|
||||
return {
|
||||
scope: {
|
||||
metric: "=",
|
||||
label: "=",
|
||||
},
|
||||
restrict: "E",
|
||||
templateUrl: "templates/_metrics.meter.html",
|
||||
}
|
||||
})
|
||||
|
||||
FeedService.modify(data, function() {
|
||||
CategoryService.init();
|
||||
});
|
||||
}
|
||||
scope.$apply();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
}]);
|
||||
module.directive("metricGauge", function () {
|
||||
return {
|
||||
scope: {
|
||||
metric: "=",
|
||||
label: "=",
|
||||
},
|
||||
restrict: "E",
|
||||
templateUrl: "templates/_metrics.gauge.html",
|
||||
}
|
||||
})
|
||||
|
||||
module.directive('metricMeter', function() {
|
||||
return {
|
||||
scope : {
|
||||
metric : '=',
|
||||
label : '='
|
||||
},
|
||||
restrict : 'E',
|
||||
templateUrl : 'templates/_metrics.meter.html'
|
||||
};
|
||||
});
|
||||
|
||||
module.directive('metricGauge', function() {
|
||||
return {
|
||||
scope : {
|
||||
metric : '=',
|
||||
label : '='
|
||||
},
|
||||
restrict : 'E',
|
||||
templateUrl : 'templates/_metrics.gauge.html'
|
||||
};
|
||||
});
|
||||
|
||||
module.directive('metricTimer', function() {
|
||||
return {
|
||||
scope : {
|
||||
metric : '=',
|
||||
label : '='
|
||||
},
|
||||
restrict : 'E',
|
||||
templateUrl : 'templates/_metrics.timer.html'
|
||||
};
|
||||
});
|
||||
module.directive("metricTimer", function () {
|
||||
return {
|
||||
scope: {
|
||||
metric: "=",
|
||||
label: "=",
|
||||
},
|
||||
restrict: "E",
|
||||
templateUrl: "templates/_metrics.timer.html",
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1,113 +1,119 @@
|
||||
var module = angular.module('commafeed.filters', []);
|
||||
var module = angular.module("commafeed.filters", [])
|
||||
|
||||
/**
|
||||
* smart date formatter
|
||||
*/
|
||||
module.filter('entryDate', function() {
|
||||
return function(timestamp, defaultValue) {
|
||||
if (!timestamp) {
|
||||
return defaultValue;
|
||||
}
|
||||
module.filter("entryDate", function () {
|
||||
return function (timestamp, defaultValue) {
|
||||
if (!timestamp) {
|
||||
return defaultValue
|
||||
}
|
||||
|
||||
var d = moment(timestamp);
|
||||
var now = moment();
|
||||
var formatted;
|
||||
if (Math.abs(d.diff(now)) < 86400000) {
|
||||
formatted = d.fromNow();
|
||||
} else {
|
||||
formatted = d.format('YYYY-MM-DD HH:mm');
|
||||
}
|
||||
return formatted;
|
||||
};
|
||||
});
|
||||
var d = moment(timestamp)
|
||||
var now = moment()
|
||||
var formatted
|
||||
if (Math.abs(d.diff(now)) < 86400000) {
|
||||
formatted = d.fromNow()
|
||||
} else {
|
||||
formatted = d.format("YYYY-MM-DD HH:mm")
|
||||
}
|
||||
return formatted
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* rewrites iframes to use https if commafeed uses https
|
||||
*/
|
||||
module.filter('iframeHttpsRewrite', function() {
|
||||
return function(html) {
|
||||
var result = html;
|
||||
if (location.protocol === 'https:') {
|
||||
var wrapper = $('<div></div>').html(html);
|
||||
$('iframe', wrapper).each(function(i, elem) {
|
||||
var e = $(elem);
|
||||
e.attr('src', e.attr('src').replace(/^http:\/\//i, 'https://'));
|
||||
});
|
||||
result = wrapper.html();
|
||||
}
|
||||
return result;
|
||||
};
|
||||
});
|
||||
module.filter("iframeHttpsRewrite", function () {
|
||||
return function (html) {
|
||||
var result = html
|
||||
if (location.protocol === "https:") {
|
||||
var wrapper = $("<div></div>").html(html)
|
||||
$("iframe", wrapper).each(function (i, elem) {
|
||||
var e = $(elem)
|
||||
e.attr("src", e.attr("src").replace(/^http:\/\//i, "https://"))
|
||||
})
|
||||
result = wrapper.html()
|
||||
}
|
||||
return result
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* inserts title or alt-text after images, if any
|
||||
*/
|
||||
module.filter('appendImageTitles', function() {
|
||||
return function(html) {
|
||||
var result = html;
|
||||
var wrapper = $('<div></div>').html(html);
|
||||
$('img', wrapper).each(function(i, elem) {
|
||||
var e = $(elem);
|
||||
var title = e.attr('title') || e.attr('alt');
|
||||
if (title) {
|
||||
var text = $('<span style="font-style: italic;"></span>').text(title);
|
||||
e.after(text);
|
||||
}
|
||||
});
|
||||
result = wrapper.html();
|
||||
return result;
|
||||
};
|
||||
});
|
||||
module.filter("appendImageTitles", function () {
|
||||
return function (html) {
|
||||
var result = html
|
||||
var wrapper = $("<div></div>").html(html)
|
||||
$("img", wrapper).each(function (i, elem) {
|
||||
var e = $(elem)
|
||||
var title = e.attr("title") || e.attr("alt")
|
||||
if (title) {
|
||||
var text = $('<span style="font-style: italic;"></span>').text(title)
|
||||
e.after(text)
|
||||
}
|
||||
})
|
||||
result = wrapper.html()
|
||||
return result
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* escapes the url
|
||||
*/
|
||||
module.filter('escape', function() {
|
||||
return encodeURIComponent;
|
||||
});
|
||||
module.filter("escape", function () {
|
||||
return encodeURIComponent
|
||||
})
|
||||
|
||||
/**
|
||||
* returns a trusted html content
|
||||
*/
|
||||
module.filter('trustHtml', ['$sce', function($sce) {
|
||||
return function(val) {
|
||||
return $sce.trustAsHtml(val);
|
||||
};
|
||||
}]);
|
||||
module.filter("trustHtml", [
|
||||
"$sce",
|
||||
function ($sce) {
|
||||
return function (val) {
|
||||
return $sce.trustAsHtml(val)
|
||||
}
|
||||
},
|
||||
])
|
||||
|
||||
/**
|
||||
* returns a trusted url
|
||||
*/
|
||||
module.filter('trustUrl', ['$sce', function($sce) {
|
||||
return function(val) {
|
||||
return $sce.trustAsResourceUrl(val);
|
||||
};
|
||||
}]);
|
||||
module.filter("trustUrl", [
|
||||
"$sce",
|
||||
function ($sce) {
|
||||
return function (val) {
|
||||
return $sce.trustAsResourceUrl(val)
|
||||
}
|
||||
},
|
||||
])
|
||||
|
||||
/**
|
||||
* add the 'highlight-search' class to text matching keywords
|
||||
*/
|
||||
module.filter('highlight', function() {
|
||||
return function(html, keywords) {
|
||||
if (keywords) {
|
||||
var handleKeyword = function(token, html) {
|
||||
var expr = new RegExp(token, 'gi');
|
||||
var container = $('<span>').html(html);
|
||||
var elements = container.find('*').addBack();
|
||||
var textNodes = elements.not('iframe').contents().not(elements);
|
||||
textNodes.each(function() {
|
||||
var replaced = this.nodeValue.replace(expr, '<span class="highlight-search">$&</span>');
|
||||
$('<span>').html(replaced).insertBefore(this);
|
||||
$(this).remove();
|
||||
});
|
||||
return container.html();
|
||||
};
|
||||
module.filter("highlight", function () {
|
||||
return function (html, keywords) {
|
||||
if (keywords) {
|
||||
var handleKeyword = function (token, html) {
|
||||
var expr = new RegExp(token, "gi")
|
||||
var container = $("<span>").html(html)
|
||||
var elements = container.find("*").addBack()
|
||||
var textNodes = elements.not("iframe").contents().not(elements)
|
||||
textNodes.each(function () {
|
||||
var replaced = this.nodeValue.replace(expr, '<span class="highlight-search">$&</span>')
|
||||
$("<span>").html(replaced).insertBefore(this)
|
||||
$(this).remove()
|
||||
})
|
||||
return container.html()
|
||||
}
|
||||
|
||||
var tokens = keywords.split(' ');
|
||||
for (var i = 0; i < tokens.length; i++) {
|
||||
html = handleKeyword(tokens[i], html);
|
||||
}
|
||||
}
|
||||
return html;
|
||||
};
|
||||
});
|
||||
var tokens = keywords.split(" ")
|
||||
for (var i = 0; i < tokens.length; i++) {
|
||||
html = handleKeyword(tokens[i], html)
|
||||
}
|
||||
}
|
||||
return html
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1,35 +1,37 @@
|
||||
var module = angular.module('commafeed.i18n', []);
|
||||
var module = angular.module("commafeed.i18n", [])
|
||||
|
||||
module.service('LangService', [function() {
|
||||
this.langs = {
|
||||
'ar': 'العربية',
|
||||
'ca': 'Català',
|
||||
'en': 'English',
|
||||
'es': 'Español',
|
||||
'de': 'Deutsch',
|
||||
'fa': 'فارسی',
|
||||
'fr': 'Français',
|
||||
'gl': 'Galician',
|
||||
'glk': 'گیلکی',
|
||||
'hu': 'Magyar',
|
||||
'id': 'Indonesian',
|
||||
'ja': '日本語',
|
||||
'ko': '한국어',
|
||||
'nl': 'Nederlands',
|
||||
'nb': 'Norsk (bokmål)',
|
||||
'nn': 'Norsk (nynorsk)',
|
||||
'pt': 'Português',
|
||||
'pl': 'Polski',
|
||||
'ru': 'Русский',
|
||||
'fi': 'Suomi',
|
||||
'sv': 'Svenska',
|
||||
'zh': '简体中文',
|
||||
'it': 'Italiano',
|
||||
'tr': 'Türkçe',
|
||||
'cy': 'Cymraeg',
|
||||
'sk': 'Slovenčina',
|
||||
'da': 'Danish',
|
||||
'cs': 'Čeština',
|
||||
'ms': 'Bahasa Malaysian'
|
||||
}
|
||||
}]);
|
||||
module.service("LangService", [
|
||||
function () {
|
||||
this.langs = {
|
||||
ar: "العربية",
|
||||
ca: "Català",
|
||||
en: "English",
|
||||
es: "Español",
|
||||
de: "Deutsch",
|
||||
fa: "فارسی",
|
||||
fr: "Français",
|
||||
gl: "Galician",
|
||||
glk: "گیلکی",
|
||||
hu: "Magyar",
|
||||
id: "Indonesian",
|
||||
ja: "日本語",
|
||||
ko: "한국어",
|
||||
nl: "Nederlands",
|
||||
nb: "Norsk (bokmål)",
|
||||
nn: "Norsk (nynorsk)",
|
||||
pt: "Português",
|
||||
pl: "Polski",
|
||||
ru: "Русский",
|
||||
fi: "Suomi",
|
||||
sv: "Svenska",
|
||||
zh: "简体中文",
|
||||
it: "Italiano",
|
||||
tr: "Türkçe",
|
||||
cy: "Cymraeg",
|
||||
sk: "Slovenčina",
|
||||
da: "Danish",
|
||||
cs: "Čeština",
|
||||
ms: "Bahasa Malaysian",
|
||||
}
|
||||
},
|
||||
])
|
||||
|
||||
@@ -1,145 +1,172 @@
|
||||
var app = angular.module('commafeed', ['ngRoute', 'ngTouch', 'ngAnimate', 'ui.utils', 'ui.bootstrap', 'ui.router', 'ui.select2',
|
||||
'commafeed.directives', 'commafeed.controllers', 'commafeed.services', 'commafeed.filters', 'commafeed.i18n', 'ngSanitize',
|
||||
'infinite-scroll', 'ngGrid', 'chieffancypants.loadingBar', 'pascalprecht.translate']);
|
||||
var app = angular.module("commafeed", [
|
||||
"ngRoute",
|
||||
"ngTouch",
|
||||
"ngAnimate",
|
||||
"ui.utils",
|
||||
"ui.bootstrap",
|
||||
"ui.router",
|
||||
"ui.select2",
|
||||
"commafeed.directives",
|
||||
"commafeed.controllers",
|
||||
"commafeed.services",
|
||||
"commafeed.filters",
|
||||
"commafeed.i18n",
|
||||
"ngSanitize",
|
||||
"infinite-scroll",
|
||||
"ngGrid",
|
||||
"chieffancypants.loadingBar",
|
||||
"pascalprecht.translate",
|
||||
])
|
||||
|
||||
app.config([
|
||||
'$routeProvider',
|
||||
'$stateProvider',
|
||||
'$urlRouterProvider',
|
||||
'$httpProvider',
|
||||
'$compileProvider',
|
||||
'cfpLoadingBarProvider',
|
||||
'$translateProvider',
|
||||
function($routeProvider, $stateProvider, $urlRouterProvider, $httpProvider, $compileProvider, cfpLoadingBarProvider,
|
||||
$translateProvider) {
|
||||
|
||||
$translateProvider.useStaticFilesLoader({
|
||||
prefix : 'i18n/',
|
||||
suffix : '.js'
|
||||
});
|
||||
$translateProvider.preferredLanguage('en');
|
||||
"$routeProvider",
|
||||
"$stateProvider",
|
||||
"$urlRouterProvider",
|
||||
"$httpProvider",
|
||||
"$compileProvider",
|
||||
"cfpLoadingBarProvider",
|
||||
"$translateProvider",
|
||||
function (
|
||||
$routeProvider,
|
||||
$stateProvider,
|
||||
$urlRouterProvider,
|
||||
$httpProvider,
|
||||
$compileProvider,
|
||||
cfpLoadingBarProvider,
|
||||
$translateProvider
|
||||
) {
|
||||
$translateProvider.useStaticFilesLoader({
|
||||
prefix: "i18n/",
|
||||
suffix: ".js",
|
||||
})
|
||||
$translateProvider.preferredLanguage("en")
|
||||
|
||||
cfpLoadingBarProvider.includeSpinner = false;
|
||||
cfpLoadingBarProvider.includeSpinner = false
|
||||
|
||||
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|javascript):/);
|
||||
var interceptor = ['$rootScope', '$q', '$injector', function(scope, $q, $injector) {
|
||||
var f = {};
|
||||
|
||||
f.response = function(response) {
|
||||
return response;
|
||||
};
|
||||
|
||||
f.responseError = function(response) {
|
||||
var status = response.status;
|
||||
if (status == 401) {
|
||||
$injector.get('$state').transitionTo('welcome');
|
||||
}
|
||||
return $q.reject(response);
|
||||
};
|
||||
return f;
|
||||
}];
|
||||
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|javascript):/)
|
||||
var interceptor = [
|
||||
"$rootScope",
|
||||
"$q",
|
||||
"$injector",
|
||||
function (scope, $q, $injector) {
|
||||
var f = {}
|
||||
|
||||
$httpProvider.interceptors.push(interceptor);
|
||||
f.response = function (response) {
|
||||
return response
|
||||
}
|
||||
|
||||
$stateProvider.state('feeds', {
|
||||
'abstract' : true,
|
||||
url : '/feeds',
|
||||
templateUrl : 'templates/feeds.html'
|
||||
});
|
||||
$stateProvider.state('feeds.view', {
|
||||
url : '/view/:_type/:_id',
|
||||
templateUrl : 'templates/feeds.view.html',
|
||||
controller : 'FeedListCtrl'
|
||||
});
|
||||
$stateProvider.state('feeds.subscribe', {
|
||||
url : '/subscribe',
|
||||
templateUrl : 'templates/feeds.subscribe.html',
|
||||
controller : 'SubscribeCtrl'
|
||||
});
|
||||
$stateProvider.state('feeds.new_category', {
|
||||
url : '/add_category',
|
||||
templateUrl : 'templates/feeds.new_category.html',
|
||||
controller : 'NewCategoryCtrl'
|
||||
});
|
||||
$stateProvider.state('feeds.import', {
|
||||
url : '/import',
|
||||
templateUrl : 'templates/feeds.import.html',
|
||||
controller : 'ImportCtrl'
|
||||
});
|
||||
$stateProvider.state('feeds.search', {
|
||||
url : '/search/:_keywords',
|
||||
templateUrl : 'templates/feeds.view.html',
|
||||
controller : 'FeedListCtrl'
|
||||
});
|
||||
$stateProvider.state('feeds.feed_details', {
|
||||
url : '/details/feed/:_id',
|
||||
templateUrl : 'templates/feeds.feed_details.html',
|
||||
controller : 'FeedDetailsCtrl'
|
||||
});
|
||||
$stateProvider.state('feeds.category_details', {
|
||||
url : '/details/category/:_id',
|
||||
templateUrl : 'templates/feeds.category_details.html',
|
||||
controller : 'CategoryDetailsCtrl'
|
||||
});
|
||||
$stateProvider.state('feeds.tag_details', {
|
||||
url : '/details/tag/:_id',
|
||||
templateUrl : 'templates/feeds.tag_details.html',
|
||||
controller : 'TagDetailsCtrl'
|
||||
});
|
||||
$stateProvider.state('feeds.help', {
|
||||
url : '/help',
|
||||
templateUrl : 'templates/feeds.help.html',
|
||||
controller : 'HelpController'
|
||||
});
|
||||
$stateProvider.state('feeds.settings', {
|
||||
url : '/settings',
|
||||
templateUrl : 'templates/settings.html',
|
||||
controller : 'SettingsCtrl'
|
||||
});
|
||||
$stateProvider.state('feeds.profile', {
|
||||
url : '/profile',
|
||||
templateUrl : 'templates/profile.html',
|
||||
controller : 'ProfileCtrl'
|
||||
});
|
||||
f.responseError = function (response) {
|
||||
var status = response.status
|
||||
if (status == 401) {
|
||||
$injector.get("$state").transitionTo("welcome")
|
||||
}
|
||||
return $q.reject(response)
|
||||
}
|
||||
return f
|
||||
},
|
||||
]
|
||||
|
||||
$stateProvider.state('admin', {
|
||||
'abstract' : true,
|
||||
url : '/admin',
|
||||
templateUrl : 'templates/admin.html'
|
||||
});
|
||||
$stateProvider.state('admin.userlist', {
|
||||
url : '/user/list',
|
||||
templateUrl : 'templates/admin.userlist.html',
|
||||
controller : 'ManageUsersCtrl'
|
||||
});
|
||||
$stateProvider.state('admin.useradd', {
|
||||
url : '/user/add',
|
||||
templateUrl : 'templates/admin.useradd.html',
|
||||
controller : 'ManageUserCtrl'
|
||||
});
|
||||
$stateProvider.state('admin.useredit', {
|
||||
url : '/user/edit/:_id',
|
||||
templateUrl : 'templates/admin.useredit.html',
|
||||
controller : 'ManageUserCtrl'
|
||||
});
|
||||
$stateProvider.state('admin.settings', {
|
||||
url : '/settings',
|
||||
templateUrl : 'templates/admin.settings.html',
|
||||
controller : 'ManageSettingsCtrl'
|
||||
});
|
||||
$stateProvider.state('admin.metrics', {
|
||||
url : '/metrics',
|
||||
templateUrl : 'templates/admin.metrics.html',
|
||||
controller : 'MetricsCtrl'
|
||||
});
|
||||
$httpProvider.interceptors.push(interceptor)
|
||||
|
||||
$stateProvider.state('welcome', {
|
||||
url : '/welcome',
|
||||
templateUrl : 'templates/welcome.html'
|
||||
});
|
||||
$stateProvider.state("feeds", {
|
||||
abstract: true,
|
||||
url: "/feeds",
|
||||
templateUrl: "templates/feeds.html",
|
||||
})
|
||||
$stateProvider.state("feeds.view", {
|
||||
url: "/view/:_type/:_id",
|
||||
templateUrl: "templates/feeds.view.html",
|
||||
controller: "FeedListCtrl",
|
||||
})
|
||||
$stateProvider.state("feeds.subscribe", {
|
||||
url: "/subscribe",
|
||||
templateUrl: "templates/feeds.subscribe.html",
|
||||
controller: "SubscribeCtrl",
|
||||
})
|
||||
$stateProvider.state("feeds.new_category", {
|
||||
url: "/add_category",
|
||||
templateUrl: "templates/feeds.new_category.html",
|
||||
controller: "NewCategoryCtrl",
|
||||
})
|
||||
$stateProvider.state("feeds.import", {
|
||||
url: "/import",
|
||||
templateUrl: "templates/feeds.import.html",
|
||||
controller: "ImportCtrl",
|
||||
})
|
||||
$stateProvider.state("feeds.search", {
|
||||
url: "/search/:_keywords",
|
||||
templateUrl: "templates/feeds.view.html",
|
||||
controller: "FeedListCtrl",
|
||||
})
|
||||
$stateProvider.state("feeds.feed_details", {
|
||||
url: "/details/feed/:_id",
|
||||
templateUrl: "templates/feeds.feed_details.html",
|
||||
controller: "FeedDetailsCtrl",
|
||||
})
|
||||
$stateProvider.state("feeds.category_details", {
|
||||
url: "/details/category/:_id",
|
||||
templateUrl: "templates/feeds.category_details.html",
|
||||
controller: "CategoryDetailsCtrl",
|
||||
})
|
||||
$stateProvider.state("feeds.tag_details", {
|
||||
url: "/details/tag/:_id",
|
||||
templateUrl: "templates/feeds.tag_details.html",
|
||||
controller: "TagDetailsCtrl",
|
||||
})
|
||||
$stateProvider.state("feeds.help", {
|
||||
url: "/help",
|
||||
templateUrl: "templates/feeds.help.html",
|
||||
controller: "HelpController",
|
||||
})
|
||||
$stateProvider.state("feeds.settings", {
|
||||
url: "/settings",
|
||||
templateUrl: "templates/settings.html",
|
||||
controller: "SettingsCtrl",
|
||||
})
|
||||
$stateProvider.state("feeds.profile", {
|
||||
url: "/profile",
|
||||
templateUrl: "templates/profile.html",
|
||||
controller: "ProfileCtrl",
|
||||
})
|
||||
|
||||
$urlRouterProvider.when('/', '/feeds/view/category/all');
|
||||
$urlRouterProvider.when('/admin', '/admin/settings');
|
||||
$urlRouterProvider.otherwise('/');
|
||||
$stateProvider.state("admin", {
|
||||
abstract: true,
|
||||
url: "/admin",
|
||||
templateUrl: "templates/admin.html",
|
||||
})
|
||||
$stateProvider.state("admin.userlist", {
|
||||
url: "/user/list",
|
||||
templateUrl: "templates/admin.userlist.html",
|
||||
controller: "ManageUsersCtrl",
|
||||
})
|
||||
$stateProvider.state("admin.useradd", {
|
||||
url: "/user/add",
|
||||
templateUrl: "templates/admin.useradd.html",
|
||||
controller: "ManageUserCtrl",
|
||||
})
|
||||
$stateProvider.state("admin.useredit", {
|
||||
url: "/user/edit/:_id",
|
||||
templateUrl: "templates/admin.useredit.html",
|
||||
controller: "ManageUserCtrl",
|
||||
})
|
||||
$stateProvider.state("admin.settings", {
|
||||
url: "/settings",
|
||||
templateUrl: "templates/admin.settings.html",
|
||||
controller: "ManageSettingsCtrl",
|
||||
})
|
||||
$stateProvider.state("admin.metrics", {
|
||||
url: "/metrics",
|
||||
templateUrl: "templates/admin.metrics.html",
|
||||
controller: "MetricsCtrl",
|
||||
})
|
||||
|
||||
}]);
|
||||
$stateProvider.state("welcome", {
|
||||
url: "/welcome",
|
||||
templateUrl: "templates/welcome.html",
|
||||
})
|
||||
|
||||
$urlRouterProvider.when("/", "/feeds/view/category/all")
|
||||
$urlRouterProvider.when("/admin", "/admin/settings")
|
||||
$urlRouterProvider.otherwise("/")
|
||||
},
|
||||
])
|
||||
|
||||
@@ -1,336 +1,375 @@
|
||||
var module = angular.module('commafeed.services', ['ngResource']);
|
||||
var module = angular.module("commafeed.services", ["ngResource"])
|
||||
|
||||
module.service('AnalyticsService', ['$state', function($state) {
|
||||
this.track = function(path) {
|
||||
if (typeof ga === 'undefined') {
|
||||
return;
|
||||
}
|
||||
path = path || $state.$current.url.prefix;
|
||||
ga('send', 'pageview', {
|
||||
page : path
|
||||
});
|
||||
};
|
||||
}]);
|
||||
module.service("AnalyticsService", [
|
||||
"$state",
|
||||
function ($state) {
|
||||
this.track = function (path) {
|
||||
if (typeof ga === "undefined") {
|
||||
return
|
||||
}
|
||||
path = path || $state.$current.url.prefix
|
||||
ga("send", "pageview", {
|
||||
page: path,
|
||||
})
|
||||
}
|
||||
},
|
||||
])
|
||||
|
||||
module.service('MobileService', ['$state', function($state) {
|
||||
this.leftMenu = false;
|
||||
this.rightMenu = false;
|
||||
this.toggleLeftMenu = function() {
|
||||
this.leftMenu = !this.leftMenu;
|
||||
$('body').toggleClass('left-menu-active');
|
||||
};
|
||||
this.toggleRightMenu = function() {
|
||||
this.rightMenu = !this.rightMenu;
|
||||
$('body').toggleClass('right-menu-active');
|
||||
};
|
||||
this.mobile = device.mobile() || device.tablet();
|
||||
}]);
|
||||
module.service("MobileService", [
|
||||
"$state",
|
||||
function ($state) {
|
||||
this.leftMenu = false
|
||||
this.rightMenu = false
|
||||
this.toggleLeftMenu = function () {
|
||||
this.leftMenu = !this.leftMenu
|
||||
$("body").toggleClass("left-menu-active")
|
||||
}
|
||||
this.toggleRightMenu = function () {
|
||||
this.rightMenu = !this.rightMenu
|
||||
$("body").toggleClass("right-menu-active")
|
||||
}
|
||||
this.mobile = device.mobile() || device.tablet()
|
||||
},
|
||||
])
|
||||
|
||||
module.factory('ProfileService', ['$resource', function($resource) {
|
||||
var res = $resource('rest/user/profile/');
|
||||
res.deleteAccount = $resource('rest/user/profile/deleteAccount').save;
|
||||
return res;
|
||||
}]);
|
||||
module.factory("ProfileService", [
|
||||
"$resource",
|
||||
function ($resource) {
|
||||
var res = $resource("rest/user/profile/")
|
||||
res.deleteAccount = $resource("rest/user/profile/deleteAccount").save
|
||||
return res
|
||||
},
|
||||
])
|
||||
|
||||
module.factory('SessionService', ['$resource', function($resource) {
|
||||
var res = {};
|
||||
res.login = $resource('rest/user/login').save;
|
||||
res.register = $resource('rest/user/register').save;
|
||||
res.passwordReset = $resource('rest/user/passwordReset').save;
|
||||
return res;
|
||||
}]);
|
||||
module.factory("SessionService", [
|
||||
"$resource",
|
||||
function ($resource) {
|
||||
var res = {}
|
||||
res.login = $resource("rest/user/login").save
|
||||
res.register = $resource("rest/user/register").save
|
||||
res.passwordReset = $resource("rest/user/passwordReset").save
|
||||
return res
|
||||
},
|
||||
])
|
||||
|
||||
module.factory('SettingsService', ['$resource', '$translate', function($resource, $translate) {
|
||||
var res = $resource('rest/user/settings');
|
||||
module.factory("SettingsService", [
|
||||
"$resource",
|
||||
"$translate",
|
||||
function ($resource, $translate) {
|
||||
var res = $resource("rest/user/settings")
|
||||
|
||||
var s = {};
|
||||
s.settings = {};
|
||||
s.save = function(callback) {
|
||||
res.save(s.settings, function(data) {
|
||||
if (callback) {
|
||||
callback(data);
|
||||
}
|
||||
});
|
||||
};
|
||||
s.init = function(callback) {
|
||||
res.get(function(data) {
|
||||
s.settings = data;
|
||||
var lang = s.settings.language || 'en';
|
||||
$translate.use(lang);
|
||||
if (lang === 'zh') {
|
||||
lang = 'zh-cn';
|
||||
} else if (lang === 'ms') {
|
||||
lang = 'ms-my';
|
||||
}
|
||||
moment.locale(lang, {});
|
||||
if (callback) {
|
||||
callback(data);
|
||||
}
|
||||
});
|
||||
};
|
||||
s.init();
|
||||
return s;
|
||||
}]);
|
||||
var s = {}
|
||||
s.settings = {}
|
||||
s.save = function (callback) {
|
||||
res.save(s.settings, function (data) {
|
||||
if (callback) {
|
||||
callback(data)
|
||||
}
|
||||
})
|
||||
}
|
||||
s.init = function (callback) {
|
||||
res.get(function (data) {
|
||||
s.settings = data
|
||||
var lang = s.settings.language || "en"
|
||||
$translate.use(lang)
|
||||
if (lang === "zh") {
|
||||
lang = "zh-cn"
|
||||
} else if (lang === "ms") {
|
||||
lang = "ms-my"
|
||||
}
|
||||
moment.locale(lang, {})
|
||||
if (callback) {
|
||||
callback(data)
|
||||
}
|
||||
})
|
||||
}
|
||||
s.init()
|
||||
return s
|
||||
},
|
||||
])
|
||||
|
||||
module.factory('FeedService', ['$resource', '$http', function($resource, $http) {
|
||||
var actions = {
|
||||
entries : {
|
||||
method : 'GET',
|
||||
params : {
|
||||
_method : 'entries'
|
||||
}
|
||||
},
|
||||
fetch : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'fetch'
|
||||
}
|
||||
},
|
||||
mark : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'mark'
|
||||
}
|
||||
},
|
||||
refresh : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'refresh'
|
||||
}
|
||||
},
|
||||
refreshAll : {
|
||||
method : 'GET',
|
||||
params : {
|
||||
_method : 'refreshAll'
|
||||
}
|
||||
},
|
||||
subscribe : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'subscribe'
|
||||
}
|
||||
},
|
||||
unsubscribe : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'unsubscribe'
|
||||
}
|
||||
},
|
||||
modify : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'modify'
|
||||
}
|
||||
}
|
||||
};
|
||||
var res = $resource('rest/feed/:_method', {}, actions);
|
||||
res.get = $resource('rest/feed/get/:id').get;
|
||||
return res;
|
||||
}]);
|
||||
module.factory("FeedService", [
|
||||
"$resource",
|
||||
"$http",
|
||||
function ($resource, $http) {
|
||||
var actions = {
|
||||
entries: {
|
||||
method: "GET",
|
||||
params: {
|
||||
_method: "entries",
|
||||
},
|
||||
},
|
||||
fetch: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "fetch",
|
||||
},
|
||||
},
|
||||
mark: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "mark",
|
||||
},
|
||||
},
|
||||
refresh: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "refresh",
|
||||
},
|
||||
},
|
||||
refreshAll: {
|
||||
method: "GET",
|
||||
params: {
|
||||
_method: "refreshAll",
|
||||
},
|
||||
},
|
||||
subscribe: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "subscribe",
|
||||
},
|
||||
},
|
||||
unsubscribe: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "unsubscribe",
|
||||
},
|
||||
},
|
||||
modify: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "modify",
|
||||
},
|
||||
},
|
||||
}
|
||||
var res = $resource("rest/feed/:_method", {}, actions)
|
||||
res.get = $resource("rest/feed/get/:id").get
|
||||
return res
|
||||
},
|
||||
])
|
||||
|
||||
module.factory('CategoryService', ['$resource', '$http', function($resource, $http) {
|
||||
module.factory("CategoryService", [
|
||||
"$resource",
|
||||
"$http",
|
||||
function ($resource, $http) {
|
||||
var traverse = function (callback, category, parentName) {
|
||||
callback(category, parentName)
|
||||
var children = category.children
|
||||
if (children) {
|
||||
for (var c = 0; c < children.length; c++) {
|
||||
traverse(callback, children[c], category.name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var traverse = function(callback, category, parentName) {
|
||||
callback(category, parentName);
|
||||
var children = category.children;
|
||||
if (children) {
|
||||
for (var c = 0; c < children.length; c++) {
|
||||
traverse(callback, children[c], category.name);
|
||||
}
|
||||
}
|
||||
};
|
||||
// flatten categories
|
||||
var flatten = function (category) {
|
||||
var array = []
|
||||
var callback = function (category, parentName) {
|
||||
var name = category.name
|
||||
if (parentName) {
|
||||
name += " (in " + parentName + ")"
|
||||
}
|
||||
array.push({
|
||||
id: category.id,
|
||||
name: name,
|
||||
orig: category,
|
||||
})
|
||||
}
|
||||
traverse(callback, category)
|
||||
return array
|
||||
}
|
||||
|
||||
// flatten categories
|
||||
var flatten = function(category) {
|
||||
var array = [];
|
||||
var callback = function(category, parentName) {
|
||||
var name = category.name;
|
||||
if (parentName) {
|
||||
name += (' (in ' + parentName + ')');
|
||||
}
|
||||
array.push({
|
||||
id : category.id,
|
||||
name : name,
|
||||
orig : category
|
||||
});
|
||||
};
|
||||
traverse(callback, category);
|
||||
return array;
|
||||
};
|
||||
// flatten feeds
|
||||
var flatFeeds = function (category) {
|
||||
var subs = []
|
||||
var callback = function (category) {
|
||||
subs.push.apply(subs, category.feeds)
|
||||
}
|
||||
traverse(callback, category)
|
||||
return subs
|
||||
}
|
||||
|
||||
// flatten feeds
|
||||
var flatFeeds = function(category) {
|
||||
var subs = [];
|
||||
var callback = function(category) {
|
||||
subs.push.apply(subs, category.feeds);
|
||||
};
|
||||
traverse(callback, category);
|
||||
return subs;
|
||||
};
|
||||
// flatten everything
|
||||
var flatAll = function (category, a) {
|
||||
a.push([category.id, "category"])
|
||||
_.each(category.children, function (child) {
|
||||
flatAll(child, a)
|
||||
})
|
||||
_.each(category.feeds, function (feed) {
|
||||
a.push([feed.id, "feed"])
|
||||
})
|
||||
}
|
||||
|
||||
// flatten everything
|
||||
var flatAll = function(category, a) {
|
||||
a.push([category.id, 'category']);
|
||||
_.each(category.children, function(child) {
|
||||
flatAll(child, a);
|
||||
});
|
||||
_.each(category.feeds, function(feed) {
|
||||
a.push([feed.id, 'feed']);
|
||||
});
|
||||
};
|
||||
var actions = {
|
||||
get: {
|
||||
method: "GET",
|
||||
ignoreLoadingBar: true,
|
||||
params: {
|
||||
_method: "get",
|
||||
},
|
||||
},
|
||||
entries: {
|
||||
method: "GET",
|
||||
params: {
|
||||
_method: "entries",
|
||||
},
|
||||
},
|
||||
mark: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "mark",
|
||||
},
|
||||
},
|
||||
add: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "add",
|
||||
},
|
||||
},
|
||||
remove: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "delete",
|
||||
},
|
||||
},
|
||||
modify: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "modify",
|
||||
},
|
||||
},
|
||||
collapse: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "collapse",
|
||||
},
|
||||
},
|
||||
}
|
||||
var res = $resource("rest/category/:_method", {}, actions)
|
||||
res.subscriptions = {}
|
||||
res.flatCategories = {}
|
||||
res.feeds = []
|
||||
|
||||
var actions = {
|
||||
get : {
|
||||
method : 'GET',
|
||||
ignoreLoadingBar : true,
|
||||
params : {
|
||||
_method : 'get'
|
||||
}
|
||||
},
|
||||
entries : {
|
||||
method : 'GET',
|
||||
params : {
|
||||
_method : 'entries'
|
||||
}
|
||||
},
|
||||
mark : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'mark'
|
||||
}
|
||||
},
|
||||
add : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'add'
|
||||
}
|
||||
},
|
||||
remove : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'delete'
|
||||
}
|
||||
},
|
||||
modify : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'modify'
|
||||
}
|
||||
},
|
||||
collapse : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'collapse'
|
||||
}
|
||||
}
|
||||
};
|
||||
var res = $resource('rest/category/:_method', {}, actions);
|
||||
res.subscriptions = {};
|
||||
res.flatCategories = {};
|
||||
res.feeds = [];
|
||||
res.init = function (callback) {
|
||||
res.get(function (data) {
|
||||
res.subscriptions = data
|
||||
res.flatCategories = flatten(data)
|
||||
res.feeds = flatFeeds(data)
|
||||
|
||||
res.init = function(callback) {
|
||||
res.get(function(data) {
|
||||
res.subscriptions = data;
|
||||
res.flatCategories = flatten(data);
|
||||
res.feeds = flatFeeds(data);
|
||||
res.flatAll = []
|
||||
flatAll(data, res.flatAll)
|
||||
res.flatAll.splice(1, 0, ["starred", "category"])
|
||||
|
||||
res.flatAll = [];
|
||||
flatAll(data, res.flatAll);
|
||||
res.flatAll.splice(1, 0, ['starred', 'category']);
|
||||
if (callback) callback(data)
|
||||
})
|
||||
}
|
||||
res.refresh = function (success, error) {
|
||||
res.get(
|
||||
function (data) {
|
||||
_.merge(res.subscriptions, data)
|
||||
if (success) success(data)
|
||||
},
|
||||
function (data) {
|
||||
if (error) error(data)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
if (callback)
|
||||
callback(data);
|
||||
});
|
||||
};
|
||||
res.refresh = function(success, error) {
|
||||
res.get(function(data) {
|
||||
_.merge(res.subscriptions, data);
|
||||
if (success)
|
||||
success(data);
|
||||
}, function(data) {
|
||||
if (error)
|
||||
error(data);
|
||||
});
|
||||
};
|
||||
res.init()
|
||||
return res
|
||||
},
|
||||
])
|
||||
|
||||
res.init();
|
||||
return res;
|
||||
}]);
|
||||
module.factory("EntryService", [
|
||||
"$resource",
|
||||
"$http",
|
||||
function ($resource, $http) {
|
||||
var actions = {
|
||||
search: {
|
||||
method: "GET",
|
||||
params: {
|
||||
_method: "search",
|
||||
},
|
||||
},
|
||||
mark: {
|
||||
method: "POST",
|
||||
ignoreLoadingBar: true,
|
||||
params: {
|
||||
_method: "mark",
|
||||
},
|
||||
},
|
||||
markMultiple: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "markMultiple",
|
||||
},
|
||||
},
|
||||
star: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "star",
|
||||
},
|
||||
},
|
||||
tag: {
|
||||
method: "POST",
|
||||
params: {
|
||||
_method: "tag",
|
||||
},
|
||||
},
|
||||
}
|
||||
var res = $resource("rest/entry/:_method", {}, actions)
|
||||
res.tags = []
|
||||
var initTags = function () {
|
||||
$http.get("rest/entry/tags").success(function (data) {
|
||||
res.tags = []
|
||||
res.tags.push.apply(res.tags, data)
|
||||
res.tags.sort()
|
||||
})
|
||||
}
|
||||
var oldTag = res.tag
|
||||
res.tag = function (data) {
|
||||
oldTag(data, function () {
|
||||
initTags()
|
||||
})
|
||||
}
|
||||
initTags()
|
||||
return res
|
||||
},
|
||||
])
|
||||
|
||||
module.factory('EntryService', ['$resource', '$http', function($resource, $http) {
|
||||
var actions = {
|
||||
search : {
|
||||
method : 'GET',
|
||||
params : {
|
||||
_method : 'search'
|
||||
}
|
||||
},
|
||||
mark : {
|
||||
method : 'POST',
|
||||
ignoreLoadingBar : true,
|
||||
params : {
|
||||
_method : 'mark'
|
||||
}
|
||||
},
|
||||
markMultiple : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'markMultiple'
|
||||
}
|
||||
},
|
||||
star : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'star'
|
||||
}
|
||||
},
|
||||
tag : {
|
||||
method : 'POST',
|
||||
params : {
|
||||
_method : 'tag'
|
||||
}
|
||||
}
|
||||
};
|
||||
var res = $resource('rest/entry/:_method', {}, actions);
|
||||
res.tags = [];
|
||||
var initTags = function() {
|
||||
$http.get('rest/entry/tags').success(function(data) {
|
||||
res.tags = [];
|
||||
res.tags.push.apply(res.tags, data);
|
||||
res.tags.sort();
|
||||
});
|
||||
};
|
||||
var oldTag = res.tag;
|
||||
res.tag = function(data) {
|
||||
oldTag(data, function() {
|
||||
initTags();
|
||||
});
|
||||
};
|
||||
initTags();
|
||||
return res;
|
||||
}]);
|
||||
module.factory("AdminUsersService", [
|
||||
"$resource",
|
||||
function ($resource) {
|
||||
var res = {}
|
||||
res.get = $resource("rest/admin/user/get/:id").get
|
||||
res.getAll = $resource("rest/admin/user/getAll").query
|
||||
res.save = $resource("rest/admin/user/save").save
|
||||
res.remove = $resource("rest/admin/user/delete").save
|
||||
return res
|
||||
},
|
||||
])
|
||||
|
||||
module.factory('AdminUsersService', ['$resource', function($resource) {
|
||||
var res = {};
|
||||
res.get = $resource('rest/admin/user/get/:id').get;
|
||||
res.getAll = $resource('rest/admin/user/getAll').query;
|
||||
res.save = $resource('rest/admin/user/save').save;
|
||||
res.remove = $resource('rest/admin/user/delete').save;
|
||||
return res;
|
||||
}]);
|
||||
module.factory("AdminSettingsService", [
|
||||
"$resource",
|
||||
function ($resource) {
|
||||
var res = $resource("rest/admin/settings/")
|
||||
return res
|
||||
},
|
||||
])
|
||||
|
||||
module.factory('AdminSettingsService', ['$resource', function($resource) {
|
||||
var res = $resource('rest/admin/settings/');
|
||||
return res;
|
||||
}]);
|
||||
module.factory("AdminMetricsService", [
|
||||
"$resource",
|
||||
function ($resource) {
|
||||
var res = $resource("rest/admin/metrics/")
|
||||
return res
|
||||
},
|
||||
])
|
||||
|
||||
module.factory('AdminMetricsService', ['$resource', function($resource) {
|
||||
var res = $resource('rest/admin/metrics/');
|
||||
return res;
|
||||
}]);
|
||||
|
||||
module.factory('ServerService', ['$resource', function($resource) {
|
||||
var res = $resource('rest/server/get');
|
||||
return res;
|
||||
}]);
|
||||
module.factory("ServerService", [
|
||||
"$resource",
|
||||
function ($resource) {
|
||||
var res = $resource("rest/server/get")
|
||||
return res
|
||||
},
|
||||
])
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
$(function() {
|
||||
var reg = $('#register-panel');
|
||||
if (!reg) {
|
||||
return;
|
||||
}
|
||||
$('#login-panel').height(reg.height());
|
||||
});
|
||||
$(function () {
|
||||
var reg = $("#register-panel")
|
||||
if (!reg) {
|
||||
return
|
||||
}
|
||||
$("#login-panel").height(reg.height())
|
||||
})
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
{
|
||||
"name": "CommaFeed",
|
||||
"icons": [
|
||||
{
|
||||
"src": "app-icon-72.png",
|
||||
"sizes": "72x72",
|
||||
"type": "image/png",
|
||||
"density": "1.5"
|
||||
},
|
||||
{
|
||||
"src": "app-icon-114.png",
|
||||
"sizes": "96x96",
|
||||
"type": "image/png",
|
||||
"density": "2.0"
|
||||
},
|
||||
{
|
||||
"src": "app-icon-144.png",
|
||||
"sizes": "144x144",
|
||||
"type": "image/png",
|
||||
"density": "3.0"
|
||||
},
|
||||
{
|
||||
"src": "app-icon-192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"density": "4.0"
|
||||
}
|
||||
],
|
||||
"start_url": "/",
|
||||
"display": "standalone"
|
||||
"name": "CommaFeed",
|
||||
"icons": [
|
||||
{
|
||||
"src": "app-icon-72.png",
|
||||
"sizes": "72x72",
|
||||
"type": "image/png",
|
||||
"density": "1.5"
|
||||
},
|
||||
{
|
||||
"src": "app-icon-114.png",
|
||||
"sizes": "96x96",
|
||||
"type": "image/png",
|
||||
"density": "2.0"
|
||||
},
|
||||
{
|
||||
"src": "app-icon-144.png",
|
||||
"sizes": "144x144",
|
||||
"type": "image/png",
|
||||
"density": "3.0"
|
||||
},
|
||||
{
|
||||
"src": "app-icon-192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"density": "4.0"
|
||||
}
|
||||
],
|
||||
"start_url": "/",
|
||||
"display": "standalone"
|
||||
}
|
||||
|
||||
@@ -1,38 +1,66 @@
|
||||
<li>
|
||||
<div class="pointer tree-item" ng-if="showLabel" ng-class="getClass(level - 1)" droppable="node">
|
||||
<div class="dropdown pull-right">
|
||||
<div class="pull-right" ng-click="showCategoryDetails(node.id, node.isTag)">
|
||||
<i class="icon-wrench config pointer"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="category-link" ng-click="categoryClicked(node.id, node.isTag)" ng-dblclick="showCategoryDetails(node.id, node.isTag)">
|
||||
<span class="fldr">
|
||||
<i ng-class="{'icon-caret-right': !node.expanded, 'icon-caret-down': node.expanded}" ng-click="toggleCategory(node, $event)"
|
||||
ng-show="showChildren"></i>
|
||||
<i ng-class="{'icon-star' : node.id == 'starred', 'icon-inbox': node.id == 'all', 'icon-tag' : node.isTag}" ng-show="!showChildren"></i>
|
||||
</span>
|
||||
<span ng-class="{selected: (node.id == selectedId && (node.isTag ? selectedType == 'tag' : selectedType == 'category'))}">
|
||||
<span ng-class="{unread: unreadCount({category:node})}" class="bidi-embed">{{categoryLabel(node)}}</span>
|
||||
<span class="unread-counter">{{categoryCountLabel(node)}}</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<ul ng-show="node.expanded && showChildren">
|
||||
<recursive> <category ng-repeat="child in node.children"
|
||||
ng-show="settingsService.settings.showRead == true || unreadCount({category:node}) > 0" node="child" level="level + 1"
|
||||
selected-type="selectedType" selected-id="selectedId" show-label="true" show-children="true"
|
||||
unread-count="unreadCount({category:category})"> </category> </recursive>
|
||||
<li ng-repeat="feed in node.feeds" ng-class="getClass(level)" class="tree-item" draggable="feed" droppable="feed"
|
||||
ng-show="settingsService.settings.showRead == true || feed.unread > 0">
|
||||
<div class="pull-right" ng-click="showFeedDetails(feed)">
|
||||
<i class="icon-wrench config pointer"></i>
|
||||
</div>
|
||||
<a ng-click="feedClicked(feed.id, $event)" ng-dblclick="showFeedDetails(feed)" class="feed-link" href="{{feed.feedLink}}" target="_blank"
|
||||
ng-class="{error: feed.message && feed.errorCount > 10, selected: (feed.id == selectedId && selectedType == 'feed') }">
|
||||
<favicon url="feed.iconUrl" />
|
||||
<span ng-class="{unread: feed.unread}" class="bidi-embed">{{feed.name}}</span>
|
||||
<span class="unread-counter">{{feedCountLabel(feed)}}</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="pointer tree-item" ng-if="showLabel" ng-class="getClass(level - 1)" droppable="node">
|
||||
<div class="dropdown pull-right">
|
||||
<div class="pull-right" ng-click="showCategoryDetails(node.id, node.isTag)">
|
||||
<i class="icon-wrench config pointer"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="category-link" ng-click="categoryClicked(node.id, node.isTag)" ng-dblclick="showCategoryDetails(node.id, node.isTag)">
|
||||
<span class="fldr">
|
||||
<i
|
||||
ng-class="{'icon-caret-right': !node.expanded, 'icon-caret-down': node.expanded}"
|
||||
ng-click="toggleCategory(node, $event)"
|
||||
ng-show="showChildren"
|
||||
></i>
|
||||
<i
|
||||
ng-class="{'icon-star' : node.id == 'starred', 'icon-inbox': node.id == 'all', 'icon-tag' : node.isTag}"
|
||||
ng-show="!showChildren"
|
||||
></i>
|
||||
</span>
|
||||
<span ng-class="{selected: (node.id == selectedId && (node.isTag ? selectedType == 'tag' : selectedType == 'category'))}">
|
||||
<span ng-class="{unread: unreadCount({category:node})}" class="bidi-embed">{{categoryLabel(node)}}</span>
|
||||
<span class="unread-counter">{{categoryCountLabel(node)}}</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<ul ng-show="node.expanded && showChildren">
|
||||
<recursive>
|
||||
<category
|
||||
ng-repeat="child in node.children"
|
||||
ng-show="settingsService.settings.showRead == true || unreadCount({category:node}) > 0"
|
||||
node="child"
|
||||
level="level + 1"
|
||||
selected-type="selectedType"
|
||||
selected-id="selectedId"
|
||||
show-label="true"
|
||||
show-children="true"
|
||||
unread-count="unreadCount({category:category})"
|
||||
>
|
||||
</category>
|
||||
</recursive>
|
||||
<li
|
||||
ng-repeat="feed in node.feeds"
|
||||
ng-class="getClass(level)"
|
||||
class="tree-item"
|
||||
draggable="feed"
|
||||
droppable="feed"
|
||||
ng-show="settingsService.settings.showRead == true || feed.unread > 0"
|
||||
>
|
||||
<div class="pull-right" ng-click="showFeedDetails(feed)">
|
||||
<i class="icon-wrench config pointer"></i>
|
||||
</div>
|
||||
<a
|
||||
ng-click="feedClicked(feed.id, $event)"
|
||||
ng-dblclick="showFeedDetails(feed)"
|
||||
class="feed-link"
|
||||
href="{{feed.feedLink}}"
|
||||
target="_blank"
|
||||
ng-class="{error: feed.message && feed.errorCount > 10, selected: (feed.id == selectedId && selectedType == 'feed') }"
|
||||
>
|
||||
<favicon url="feed.iconUrl" />
|
||||
<span ng-class="{unread: feed.unread}" class="bidi-embed">{{feed.name}}</span>
|
||||
<span class="unread-counter">{{feedCountLabel(feed)}}</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -1,29 +1,33 @@
|
||||
<div ng-controller="FeedSearchCtrl">
|
||||
<div modal="feedSearchModal" close="close()" options="{dialogClass: 'modal feed-search-dialog'}">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" ng-click="close()">×</button>
|
||||
<h4>
|
||||
<input ng-model="filter" class="filter-input"
|
||||
ui-keydown="{'up': 'focusPrevious($event)', 'down': 'focusNext($event)', 'enter': 'openFocused()' }" placeholder="{{'feedsearch.hint' | translate}}"
|
||||
focus="feedSearchModal">
|
||||
</h4>
|
||||
<small>{{ 'feedsearch.help' | translate }}</small>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<strong>{{ 'feedsearch.result_prefix' | translate }}</strong>
|
||||
<span ng-repeat="feed in (filtered = (CategoryService.feeds | filter:{name: filter} | limitTo:40))">
|
||||
<span ng-class="{block: filter, focus: focus.id == feed.id}" class="feed-link">
|
||||
<a class=" pointer" ng-click="goToFeed(feed.id)">
|
||||
<favicon url="feed.iconUrl" />
|
||||
{{feed.name}}
|
||||
</a>
|
||||
<span ng-show="!filter && !$last">•</span>
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div modal="feedSearchModal" close="close()" options="{dialogClass: 'modal feed-search-dialog'}">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" ng-click="close()">×</button>
|
||||
<h4>
|
||||
<input
|
||||
ng-model="filter"
|
||||
class="filter-input"
|
||||
ui-keydown="{'up': 'focusPrevious($event)', 'down': 'focusNext($event)', 'enter': 'openFocused()' }"
|
||||
placeholder="{{'feedsearch.hint' | translate}}"
|
||||
focus="feedSearchModal"
|
||||
/>
|
||||
</h4>
|
||||
<small>{{ 'feedsearch.help' | translate }}</small>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<strong>{{ 'feedsearch.result_prefix' | translate }}</strong>
|
||||
<span ng-repeat="feed in (filtered = (CategoryService.feeds | filter:{name: filter} | limitTo:40))">
|
||||
<span ng-class="{block: filter, focus: focus.id == feed.id}" class="feed-link">
|
||||
<a class="pointer" ng-click="goToFeed(feed.id)">
|
||||
<favicon url="feed.iconUrl" />
|
||||
{{feed.name}}
|
||||
</a>
|
||||
<span ng-show="!filter && !$last">•</span>
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<div ng-controller="FooterController">
|
||||
<iframe ng-if="subToMeUrl" style="display: none;" ng-src='{{subToMeUrl}}'></iframe>
|
||||
</div>
|
||||
<iframe ng-if="subToMeUrl" style="display: none" ng-src="{{subToMeUrl}}"></iframe>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<div>
|
||||
<span>{{label}}</span>
|
||||
<span>{{metric.value}}</span>
|
||||
</div>
|
||||
<span>{{label}}</span>
|
||||
<span>{{metric.value}}</span>
|
||||
</div>
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
<div>
|
||||
<span>{{label}}</span>
|
||||
<dl class="dl-horizontal">
|
||||
<dt>Mean</dt>
|
||||
<dd>{{metric.mean_rate | number:2}}</dd>
|
||||
<span>{{label}}</span>
|
||||
<dl class="dl-horizontal">
|
||||
<dt>Mean</dt>
|
||||
<dd>{{metric.mean_rate | number:2}}</dd>
|
||||
|
||||
<dt>1/5/15 min</dt>
|
||||
<dd>{{metric.m1_rate | number:2}} {{metric.m5_rate | number:2}} {{metric.m15_rate | number:2}}</dd>
|
||||
<dt>1/5/15 min</dt>
|
||||
<dd>{{metric.m1_rate | number:2}} {{metric.m5_rate | number:2}} {{metric.m15_rate | number:2}}</dd>
|
||||
|
||||
<dt>Total</dt>
|
||||
<dd>{{metric.count}}</dd>
|
||||
|
||||
</dl>
|
||||
</div>
|
||||
<dt>Total</dt>
|
||||
<dd>{{metric.count}}</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
<div>
|
||||
<span>{{label}}</span>
|
||||
<dl class="dl-horizontal">
|
||||
<dt>Mean</dt>
|
||||
<dd>{{metric.mean_rate | number:2}}</dd>
|
||||
<span>{{label}}</span>
|
||||
<dl class="dl-horizontal">
|
||||
<dt>Mean</dt>
|
||||
<dd>{{metric.mean_rate | number:2}}</dd>
|
||||
|
||||
<dt>1/5/15 min</dt>
|
||||
<dd>{{metric.m1_rate | number:2}} {{metric.m5_rate | number:2}} {{metric.m15_rate | number:2}}</dd>
|
||||
<dt>1/5/15 min</dt>
|
||||
<dd>{{metric.m1_rate | number:2}} {{metric.m5_rate | number:2}} {{metric.m15_rate | number:2}}</dd>
|
||||
|
||||
<dt>Total</dt>
|
||||
<dd>{{metric.count}}</dd>
|
||||
|
||||
<dt>min/max/mean (ms)</dt>
|
||||
<dd>{{metric.min/1000000 | number:0}} {{metric.max/1000000 | number:0}} {{metric.mean/1000000 | number:0}}</dd>
|
||||
<dt>Total</dt>
|
||||
<dd>{{metric.count}}</dd>
|
||||
|
||||
</dl>
|
||||
</div>
|
||||
<dt>min/max/mean (ms)</dt>
|
||||
<dd>{{metric.min/1000000 | number:0}} {{metric.max/1000000 | number:0}} {{metric.mean/1000000 | number:0}}</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
@@ -1,74 +1,73 @@
|
||||
<dl class="dl-horizontal">
|
||||
<dt>r</dt>
|
||||
<dd>{{ 'about.shortcuts.refresh' | translate }}</dd>
|
||||
<dt>r</dt>
|
||||
<dd>{{ 'about.shortcuts.refresh' | translate }}</dd>
|
||||
|
||||
<dt>j</dt>
|
||||
<dd>{{ 'about.shortcuts.open_next_entry' | translate }}</dd>
|
||||
<dt>j</dt>
|
||||
<dd>{{ 'about.shortcuts.open_next_entry' | translate }}</dd>
|
||||
|
||||
<dt>k</dt>
|
||||
<dd>{{ 'about.shortcuts.open_previous_entry' | translate }}</dd>
|
||||
<dt>k</dt>
|
||||
<dd>{{ 'about.shortcuts.open_previous_entry' | translate }}</dd>
|
||||
|
||||
<dt>{{ 'about.shortcuts.spacebar' | translate }}</dt>
|
||||
<dd>{{ 'about.shortcuts.move_page_down_up' | translate }}</dd>
|
||||
<dt>{{ 'about.shortcuts.spacebar' | translate }}</dt>
|
||||
<dd>{{ 'about.shortcuts.move_page_down_up' | translate }}</dd>
|
||||
|
||||
<dt>n</dt>
|
||||
<dd>{{ 'about.shortcuts.focus_next_entry' | translate }}</dd>
|
||||
<dt>n</dt>
|
||||
<dd>{{ 'about.shortcuts.focus_next_entry' | translate }}</dd>
|
||||
|
||||
<dt>p</dt>
|
||||
<dd>{{ 'about.shortcuts.focus_previous_entry' | translate }}</dd>
|
||||
<dt>p</dt>
|
||||
<dd>{{ 'about.shortcuts.focus_previous_entry' | translate }}</dd>
|
||||
|
||||
<dt>shift+j,shift+n</dt>
|
||||
<dd>{{ 'about.shortcuts.open_next_feed' | translate }}</dd>
|
||||
<dt>shift+j,shift+n</dt>
|
||||
<dd>{{ 'about.shortcuts.open_next_feed' | translate }}</dd>
|
||||
|
||||
<dt>shift+k,shift+p</dt>
|
||||
<dd>{{ 'about.shortcuts.open_previous_feed' | translate }}</dd>
|
||||
<dt>shift+k,shift+p</dt>
|
||||
<dd>{{ 'about.shortcuts.open_previous_feed' | translate }}</dd>
|
||||
|
||||
<dt>o, enter</dt>
|
||||
<dd>{{ 'about.shortcuts.open_close_current_entry' | translate }}</dd>
|
||||
<dt>o, enter</dt>
|
||||
<dd>{{ 'about.shortcuts.open_close_current_entry' | translate }}</dd>
|
||||
|
||||
<dt>v</dt>
|
||||
<dd>{{ 'about.shortcuts.open_current_entry_in_new_window' | translate }}</dd>
|
||||
<dt>v</dt>
|
||||
<dd>{{ 'about.shortcuts.open_current_entry_in_new_window' | translate }}</dd>
|
||||
|
||||
<dt>b</dt>
|
||||
<dd>{{ 'about.shortcuts.open_current_entry_in_new_window_background' | translate }}</dd>
|
||||
<dt>b</dt>
|
||||
<dd>{{ 'about.shortcuts.open_current_entry_in_new_window_background' | translate }}</dd>
|
||||
|
||||
<dt>s</dt>
|
||||
<dd>{{ 'about.shortcuts.star_unstar' | translate }}</dd>
|
||||
<dt>s</dt>
|
||||
<dd>{{ 'about.shortcuts.star_unstar' | translate }}</dd>
|
||||
|
||||
<dt>m</dt>
|
||||
<dd>{{ 'about.shortcuts.mark_current_entry' | translate }}</dd>
|
||||
<dt>m</dt>
|
||||
<dd>{{ 'about.shortcuts.mark_current_entry' | translate }}</dd>
|
||||
|
||||
<dt>shift+a</dt>
|
||||
<dd>{{ 'about.shortcuts.mark_all_as_read' | translate }}</dd>
|
||||
<dt>shift+a</dt>
|
||||
<dd>{{ 'about.shortcuts.mark_all_as_read' | translate }}</dd>
|
||||
|
||||
<dt>{{ 'about.shortcuts.mouse_middleclick' | translate }}</dt>
|
||||
<dd>{{ 'about.shortcuts.open_in_new_tab_mark_as_read' | translate }}</dd>
|
||||
<dt>{{ 'about.shortcuts.mouse_middleclick' | translate }}</dt>
|
||||
<dd>{{ 'about.shortcuts.open_in_new_tab_mark_as_read' | translate }}</dd>
|
||||
|
||||
<dt>f</dt>
|
||||
<dd>{{ 'about.shortcuts.fullscreen' | translate }}</dd>
|
||||
<dt>f</dt>
|
||||
<dd>{{ 'about.shortcuts.fullscreen' | translate }}</dd>
|
||||
|
||||
<dt>+,-</dt>
|
||||
<dd>{{ 'about.shortcuts.font_size' | translate }}</dd>
|
||||
<dt>+,-</dt>
|
||||
<dd>{{ 'about.shortcuts.font_size' | translate }}</dd>
|
||||
|
||||
<dt>
|
||||
g
|
||||
<i class="icon-arrow-right"></i>
|
||||
a
|
||||
</dt>
|
||||
<dd>{{ 'about.shortcuts.go_to_all' | translate }}</dd>
|
||||
<dt>
|
||||
g
|
||||
<i class="icon-arrow-right"></i>
|
||||
a
|
||||
</dt>
|
||||
<dd>{{ 'about.shortcuts.go_to_all' | translate }}</dd>
|
||||
|
||||
<dt>
|
||||
g
|
||||
<i class="icon-arrow-right"></i>
|
||||
s
|
||||
</dt>
|
||||
<dd>{{ 'about.shortcuts.go_to_starred' | translate }}</dd>
|
||||
|
||||
<dt>
|
||||
g
|
||||
<i class="icon-arrow-right"></i>
|
||||
u
|
||||
</dt>
|
||||
<dd>{{ 'about.shortcuts.feed_search' | translate }}</dd>
|
||||
<dt>
|
||||
g
|
||||
<i class="icon-arrow-right"></i>
|
||||
s
|
||||
</dt>
|
||||
<dd>{{ 'about.shortcuts.go_to_starred' | translate }}</dd>
|
||||
|
||||
<dt>
|
||||
g
|
||||
<i class="icon-arrow-right"></i>
|
||||
u
|
||||
</dt>
|
||||
<dd>{{ 'about.shortcuts.feed_search' | translate }}</dd>
|
||||
</dl>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<span>
|
||||
<span ng-click="edit_mode=!edit_mode" class="nolink pointer">
|
||||
<i class="icon-tags"></i>
|
||||
{{ 'global.tags' | translate }}
|
||||
</span>
|
||||
<span ng-if="!edit_mode">
|
||||
<span class="label label-info" ng-repeat="tag in entry.tags">{{tag}}</span>
|
||||
</span>
|
||||
<span ng-if="edit_mode">
|
||||
<input type="hidden" ui-select2="select2Options" ng-model="entry.tags" class="tag-input" autofocus />
|
||||
</span>
|
||||
</span>
|
||||
<span ng-click="edit_mode=!edit_mode" class="nolink pointer">
|
||||
<i class="icon-tags"></i>
|
||||
{{ 'global.tags' | translate }}
|
||||
</span>
|
||||
<span ng-if="!edit_mode">
|
||||
<span class="label label-info" ng-repeat="tag in entry.tags">{{tag}}</span>
|
||||
</span>
|
||||
<span ng-if="edit_mode">
|
||||
<input type="hidden" ui-select2="select2Options" ng-model="entry.tags" class="tag-input" autofocus />
|
||||
</span>
|
||||
</span>
|
||||
|
||||
@@ -1,136 +1,169 @@
|
||||
<div ng-controller="ToolbarCtrl">
|
||||
<div class="form-horizontal">
|
||||
<div class="btn-group" ng-if="MobileService.mobile">
|
||||
<button type="button" class="btn btn-default" ng-click="MobileService.toggleLeftMenu()">
|
||||
<i class="icon-list-alt"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="btn-group" ng-if="MobileService.mobile">
|
||||
<button type="button" class="btn btn-default" ng-click="MobileService.toggleLeftMenu()">
|
||||
<i class="icon-list-alt"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="btn-group" id="toolbar-nav">
|
||||
<a type="button" class="btn btn-default" ng-click="previousEntry()" title="{{ 'toolbar.previous_entry' | translate }}">
|
||||
<i class="icon-chevron-up"></i>
|
||||
</a>
|
||||
<a type="button" class="btn btn-default" ng-click="nextEntry()" title="{{ 'toolbar.next_entry' | translate }}">
|
||||
<i class="icon-chevron-down"></i>
|
||||
</a>
|
||||
<div class="btn-group" id="toolbar-refresh">
|
||||
<a type="button" class="btn btn-default" ng-click="refresh()" title="{{ 'toolbar.refresh' | translate }}">
|
||||
<i class="icon-refresh"></i>
|
||||
</a>
|
||||
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right">
|
||||
<li>
|
||||
<a ng-click="refreshAll()">{{ 'toolbar.refresh_all' | translate }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="btn-group" id="toolbar-nav">
|
||||
<a type="button" class="btn btn-default" ng-click="previousEntry()" title="{{ 'toolbar.previous_entry' | translate }}">
|
||||
<i class="icon-chevron-up"></i>
|
||||
</a>
|
||||
<a type="button" class="btn btn-default" ng-click="nextEntry()" title="{{ 'toolbar.next_entry' | translate }}">
|
||||
<i class="icon-chevron-down"></i>
|
||||
</a>
|
||||
<div class="btn-group" id="toolbar-refresh">
|
||||
<a type="button" class="btn btn-default" ng-click="refresh()" title="{{ 'toolbar.refresh' | translate }}">
|
||||
<i class="icon-refresh"></i>
|
||||
</a>
|
||||
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right">
|
||||
<li>
|
||||
<a ng-click="refreshAll()">{{ 'toolbar.refresh_all' | translate }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="btn-group" id="toolbar-mark-read">
|
||||
<a type="button" class="btn btn-default" ng-click="markAllAsRead()" title="{{ 'toolbar.mark_all_as_read' | translate }}">
|
||||
<i class="icon-ok"></i>
|
||||
</a>
|
||||
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right">
|
||||
<li>
|
||||
<a ng-click="markAll12Hours()">{{ 'toolbar.mark_all_older_12_hours' | translate }}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a ng-click="markAllDay()">{{ 'toolbar.mark_all_older_day' | translate }}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a ng-click="markAllWeek()">{{ 'toolbar.mark_all_older_week' | translate }}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a ng-click="markAllTwoWeeks()">{{ 'toolbar.mark_all_older_two_weeks' | translate }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="btn-group" id="toolbar-mark-read">
|
||||
<a type="button" class="btn btn-default" ng-click="markAllAsRead()" title="{{ 'toolbar.mark_all_as_read' | translate }}">
|
||||
<i class="icon-ok"></i>
|
||||
</a>
|
||||
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right">
|
||||
<li>
|
||||
<a ng-click="markAll12Hours()">{{ 'toolbar.mark_all_older_12_hours' | translate }}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a ng-click="markAllDay()">{{ 'toolbar.mark_all_older_day' | translate }}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a ng-click="markAllWeek()">{{ 'toolbar.mark_all_older_week' | translate }}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a ng-click="markAllTwoWeeks()">{{ 'toolbar.mark_all_older_two_weeks' | translate }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="btn-group toolbar-expand" ng-if="MobileService.mobile">
|
||||
<button type="button" class="btn btn-default" ng-click="MobileService.toggleRightMenu()">
|
||||
<i ng-class="{'icon-double-angle-right' : !MobileService.rightMenu, 'icon-double-angle-left': MobileService.rightMenu}"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="btn-group toolbar-expand" ng-if="MobileService.mobile">
|
||||
<button type="button" class="btn btn-default" ng-click="MobileService.toggleRightMenu()">
|
||||
<i ng-class="{'icon-double-angle-right' : !MobileService.rightMenu, 'icon-double-angle-left': MobileService.rightMenu}"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="actions btn-group" id="toolbar-read-mode">
|
||||
<div ng-if="!MobileService.mobile || MobileService.rightMenu">
|
||||
<div class="btn-group read-mode">
|
||||
<button type="button" class="btn btn-default" ng-click="settingsService.settings.readingMode = 'unread'" ng-class="{'active': settingsService.settings.readingMode == 'unread'}">{{
|
||||
'toolbar.unread' | translate }}</button>
|
||||
<button type="button" class="btn btn-default" ng-click="settingsService.settings.readingMode = 'all'" ng-class="{'active': settingsService.settings.readingMode == 'all'}">{{
|
||||
'toolbar.all' | translate }}</button>
|
||||
</div>
|
||||
<div class="actions btn-group" id="toolbar-read-mode">
|
||||
<div ng-if="!MobileService.mobile || MobileService.rightMenu">
|
||||
<div class="btn-group read-mode">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
ng-click="settingsService.settings.readingMode = 'unread'"
|
||||
ng-class="{'active': settingsService.settings.readingMode == 'unread'}"
|
||||
>
|
||||
{{ 'toolbar.unread' | translate }}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
ng-click="settingsService.settings.readingMode = 'all'"
|
||||
ng-class="{'active': settingsService.settings.readingMode == 'all'}"
|
||||
>
|
||||
{{ 'toolbar.all' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="btn-group" id="toolbar-read-order">
|
||||
<a type="button" class="btn btn-default" ng-click="toggleOrder()" title="{{ 'toolbar.sort_by_asc_desc' | translate }}"
|
||||
ng-class="{'active' : settingsService.settings.readingOrder == 'asc' || settingsService.settings.readingOrder == 'desc'}">
|
||||
<i ng-class="{'icon-arrow-up' : settingsService.settings.readingOrder == 'asc', 'icon-arrow-down': settingsService.settings.readingOrder != 'asc'}"></i>
|
||||
</a>
|
||||
</div>
|
||||
<div class="btn-group" id="toolbar-read-order">
|
||||
<a
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
ng-click="toggleOrder()"
|
||||
title="{{ 'toolbar.sort_by_asc_desc' | translate }}"
|
||||
ng-class="{'active' : settingsService.settings.readingOrder == 'asc' || settingsService.settings.readingOrder == 'desc'}"
|
||||
>
|
||||
<i
|
||||
ng-class="{'icon-arrow-up' : settingsService.settings.readingOrder == 'asc', 'icon-arrow-down': settingsService.settings.readingOrder != 'asc'}"
|
||||
></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="btn-group" id="toolbar-read-view-settings">
|
||||
<a type="button" class="btn btn-default" ng-click="settingsService.settings.viewMode = 'title'" ng-class="{'active': settingsService.settings.viewMode == 'title'}"
|
||||
title="{{ 'toolbar.titles_only' | translate }}">
|
||||
<i class="icon-list"></i>
|
||||
</a>
|
||||
<a type="button" class="btn btn-default" ng-click="settingsService.settings.viewMode = 'expanded'" ng-class="{'active': settingsService.settings.viewMode == 'expanded'}"
|
||||
title="{{ 'toolbar.expanded_view' | translate }}">
|
||||
<i class="icon-th-list"></i>
|
||||
</a>
|
||||
</div>
|
||||
<div class="btn-group" id="toolbar-read-view-settings">
|
||||
<a
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
ng-click="settingsService.settings.viewMode = 'title'"
|
||||
ng-class="{'active': settingsService.settings.viewMode == 'title'}"
|
||||
title="{{ 'toolbar.titles_only' | translate }}"
|
||||
>
|
||||
<i class="icon-list"></i>
|
||||
</a>
|
||||
<a
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
ng-click="settingsService.settings.viewMode = 'expanded'"
|
||||
ng-class="{'active': settingsService.settings.viewMode == 'expanded'}"
|
||||
title="{{ 'toolbar.expanded_view' | translate }}"
|
||||
>
|
||||
<i class="icon-th-list"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="btn-group" id="toolbar-settings">
|
||||
<a class="btn btn-default" ng-click="toSettings()" title="{{ 'toolbar.settings' | translate }}">
|
||||
<i class="icon-cog"></i>
|
||||
</a>
|
||||
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right">
|
||||
<li>
|
||||
<a ng-click="toProfile()">
|
||||
<i class="icon-user"></i>
|
||||
{{ 'toolbar.profile' | translate }}
|
||||
</a>
|
||||
</li>
|
||||
<li ng-show="session.admin">
|
||||
<a ng-click="toAdmin()">
|
||||
<i class="icon-edit"></i>
|
||||
{{ 'toolbar.admin' | translate }}
|
||||
</a>
|
||||
</li>
|
||||
<li class="divider"></li>
|
||||
<li>
|
||||
<a href="logout">
|
||||
<i class="icon-off"></i>
|
||||
{{ 'toolbar.logout' | translate }}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<form ng-submit="search()" class="input-group keywords" ng-if="!MobileService.mobile">
|
||||
<input type="text" class="form-control" ng-model="keywords"></input>
|
||||
<span class="input-group-btn">
|
||||
<button class="btn btn-default" type="submit">
|
||||
<i class="icon-search"></i>
|
||||
</button>
|
||||
</span>
|
||||
</form>
|
||||
</div>
|
||||
<div class="btn-group donate">
|
||||
<button class="btn btn-success" type="button" ng-click="toHelp()" title="{{ 'toolbar.about' | translate }} / {{ 'toolbar.donate' | translate }}">
|
||||
<i class="icon-info-sign"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<span ng-if="!MobileService.mobile" ng-bind-html="ServerService.announcement | trustHtml"></span>
|
||||
</div>
|
||||
<div class="btn-group" id="toolbar-settings">
|
||||
<a class="btn btn-default" ng-click="toSettings()" title="{{ 'toolbar.settings' | translate }}">
|
||||
<i class="icon-cog"></i>
|
||||
</a>
|
||||
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right">
|
||||
<li>
|
||||
<a ng-click="toProfile()">
|
||||
<i class="icon-user"></i>
|
||||
{{ 'toolbar.profile' | translate }}
|
||||
</a>
|
||||
</li>
|
||||
<li ng-show="session.admin">
|
||||
<a ng-click="toAdmin()">
|
||||
<i class="icon-edit"></i>
|
||||
{{ 'toolbar.admin' | translate }}
|
||||
</a>
|
||||
</li>
|
||||
<li class="divider"></li>
|
||||
<li>
|
||||
<a href="logout">
|
||||
<i class="icon-off"></i>
|
||||
{{ 'toolbar.logout' | translate }}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<form ng-submit="search()" class="input-group keywords" ng-if="!MobileService.mobile">
|
||||
<input type="text" class="form-control" ng-model="keywords" />
|
||||
<span class="input-group-btn">
|
||||
<button class="btn btn-default" type="submit">
|
||||
<i class="icon-search"></i>
|
||||
</button>
|
||||
</span>
|
||||
</form>
|
||||
</div>
|
||||
<div class="btn-group donate">
|
||||
<button
|
||||
class="btn btn-success"
|
||||
type="button"
|
||||
ng-click="toHelp()"
|
||||
title="{{ 'toolbar.about' | translate }} / {{ 'toolbar.donate' | translate }}"
|
||||
>
|
||||
<i class="icon-info-sign"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span ng-if="!MobileService.mobile" ng-bind-html="ServerService.announcement | trustHtml"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,49 +1,86 @@
|
||||
<div ng-controller="CategoryTreeCtrl" class="sidebar-nav-fixed" mousewheel-scrolling ui-jq="resizable"
|
||||
ui-options="{handles: 'e', resize: resizeCallback}">
|
||||
<div class="btn-group">
|
||||
<button class="btn btn-default" ui-sref="feeds.subscribe" ng-click="MobileService.toggleLeftMenu()">
|
||||
<span class="icon-rss"></span>
|
||||
{{ 'tree.subscribe' | translate }}
|
||||
</button>
|
||||
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li>
|
||||
<a ui-sref="feeds.new_category" ng-click="MobileService.toggleLeftMenu()">
|
||||
<i class="icon-plus"></i>
|
||||
{{ 'tree.new_category' | translate }}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a ui-sref="feeds.import" ng-click="MobileService.toggleLeftMenu()">
|
||||
<i class="icon-arrow-down"></i>
|
||||
{{ 'tree.import' | translate }}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div
|
||||
ng-controller="CategoryTreeCtrl"
|
||||
class="sidebar-nav-fixed"
|
||||
mousewheel-scrolling
|
||||
ui-jq="resizable"
|
||||
ui-options="{handles: 'e', resize: resizeCallback}"
|
||||
>
|
||||
<div class="btn-group">
|
||||
<button class="btn btn-default" ui-sref="feeds.subscribe" ng-click="MobileService.toggleLeftMenu()">
|
||||
<span class="icon-rss"></span>
|
||||
{{ 'tree.subscribe' | translate }}
|
||||
</button>
|
||||
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li>
|
||||
<a ui-sref="feeds.new_category" ng-click="MobileService.toggleLeftMenu()">
|
||||
<i class="icon-plus"></i>
|
||||
{{ 'tree.new_category' | translate }}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a ui-sref="feeds.import" ng-click="MobileService.toggleLeftMenu()">
|
||||
<i class="icon-arrow-down"></i>
|
||||
{{ 'tree.import' | translate }}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-default" ng-click="MobileService.toggleLeftMenu()" ng-if="MobileService.mobile">
|
||||
<i class="icon-remove"></i>
|
||||
{{ 'global.close' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-default" ng-click="MobileService.toggleLeftMenu()" ng-if="MobileService.mobile">
|
||||
<i class="icon-remove"></i>
|
||||
{{ 'global.close' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="css-treeview">
|
||||
<ul>
|
||||
<category node="CategoryService.subscriptions" show-label="'tree.all' | translate" show-children="false" level="0" selected-type="selectedType"
|
||||
selected-id="selectedId" unread-count="unreadCount(category)"> </category>
|
||||
<category node="starred" show-label="'tree.starred' | translate" show-children="false" level="0" selected-type="selectedType"
|
||||
selected-id="selectedId" unread-count="unreadCount(category)"> </category>
|
||||
<category node="CategoryService.subscriptions" show-label="false" show-children="true" level="0" selected-type="selectedType"
|
||||
selected-id="selectedId" unread-count="unreadCount(category)"> </category>
|
||||
<div class="css-treeview">
|
||||
<ul>
|
||||
<category
|
||||
node="CategoryService.subscriptions"
|
||||
show-label="'tree.all' | translate"
|
||||
show-children="false"
|
||||
level="0"
|
||||
selected-type="selectedType"
|
||||
selected-id="selectedId"
|
||||
unread-count="unreadCount(category)"
|
||||
>
|
||||
</category>
|
||||
<category
|
||||
node="starred"
|
||||
show-label="'tree.starred' | translate"
|
||||
show-children="false"
|
||||
level="0"
|
||||
selected-type="selectedType"
|
||||
selected-id="selectedId"
|
||||
unread-count="unreadCount(category)"
|
||||
>
|
||||
</category>
|
||||
<category
|
||||
node="CategoryService.subscriptions"
|
||||
show-label="false"
|
||||
show-children="true"
|
||||
level="0"
|
||||
selected-type="selectedType"
|
||||
selected-id="selectedId"
|
||||
unread-count="unreadCount(category)"
|
||||
>
|
||||
</category>
|
||||
|
||||
<li ng-repeat="tag in tags | orderBy: 'name'">
|
||||
<category node="tag" show-label="tag.name" show-children="false" level="0" selected-type="selectedType" selected-id="selectedId"
|
||||
unread-count="unreadCount(category)"> </category>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<li ng-repeat="tag in tags | orderBy: 'name'">
|
||||
<category
|
||||
node="tag"
|
||||
show-label="tag.name"
|
||||
show-children="false"
|
||||
level="0"
|
||||
selected-type="selectedType"
|
||||
selected-id="selectedId"
|
||||
unread-count="unreadCount(category)"
|
||||
>
|
||||
</category>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<div class="container">
|
||||
<div class="admin" ui-view></div>
|
||||
</div>
|
||||
<div class="admin" ui-view></div>
|
||||
</div>
|
||||
|
||||
@@ -1,28 +1,60 @@
|
||||
<div>
|
||||
<div class="col-md-6">
|
||||
<metric-meter metric="metrics.meters['com.commafeed.backend.feed.FeedQueues.refill']" label="'Refresh queue refill rate (/sec)'"></metric-meter>
|
||||
<metric-meter metric="metrics.meters['com.commafeed.backend.feed.FeedRefreshTaskGiver.feedRefreshed']" label="'Feed refreshed (/sec)'"></metric-meter>
|
||||
<metric-meter metric="metrics.meters['com.commafeed.backend.feed.FeedRefreshUpdater.feedUpdated']" label="'Feed updated (/sec)'"></metric-meter>
|
||||
<metric-meter metric="metrics.meters['com.commafeed.backend.feed.FeedRefreshUpdater.entryCacheHit']" label="'Entry cache hit (/sec)'"></metric-meter>
|
||||
<metric-meter metric="metrics.meters['com.commafeed.backend.feed.FeedRefreshUpdater.entryCacheMiss']" label="'Entry cache miss (/sec)'"></metric-meter>
|
||||
|
||||
<metric-gauge metric="metrics.gauges['com.commafeed.backend.feed.FeedRefreshExecutor.feed-refresh-updater.active']"
|
||||
label="'Feed Updater active'"></metric-gauge>
|
||||
<metric-gauge metric="metrics.gauges['com.commafeed.backend.feed.FeedRefreshExecutor.feed-refresh-updater.pending']"
|
||||
label="'Feed Updater queued'"></metric-gauge>
|
||||
<div class="col-md-6">
|
||||
<metric-meter
|
||||
metric="metrics.meters['com.commafeed.backend.feed.FeedQueues.refill']"
|
||||
label="'Refresh queue refill rate (/sec)'"
|
||||
></metric-meter>
|
||||
<metric-meter
|
||||
metric="metrics.meters['com.commafeed.backend.feed.FeedRefreshTaskGiver.feedRefreshed']"
|
||||
label="'Feed refreshed (/sec)'"
|
||||
></metric-meter>
|
||||
<metric-meter
|
||||
metric="metrics.meters['com.commafeed.backend.feed.FeedRefreshUpdater.feedUpdated']"
|
||||
label="'Feed updated (/sec)'"
|
||||
></metric-meter>
|
||||
<metric-meter
|
||||
metric="metrics.meters['com.commafeed.backend.feed.FeedRefreshUpdater.entryCacheHit']"
|
||||
label="'Entry cache hit (/sec)'"
|
||||
></metric-meter>
|
||||
<metric-meter
|
||||
metric="metrics.meters['com.commafeed.backend.feed.FeedRefreshUpdater.entryCacheMiss']"
|
||||
label="'Entry cache miss (/sec)'"
|
||||
></metric-meter>
|
||||
|
||||
<metric-gauge metric="metrics.gauges['com.commafeed.backend.feed.FeedRefreshExecutor.feed-refresh-worker.active']"
|
||||
label="'Feed Worker active'"></metric-gauge>
|
||||
<metric-gauge metric="metrics.gauges['com.commafeed.backend.feed.FeedRefreshExecutor.feed-refresh-worker.pending']"
|
||||
label="'Feed Worker queued'"></metric-gauge>
|
||||
<metric-gauge
|
||||
metric="metrics.gauges['com.commafeed.backend.feed.FeedRefreshExecutor.feed-refresh-updater.active']"
|
||||
label="'Feed Updater active'"
|
||||
></metric-gauge>
|
||||
<metric-gauge
|
||||
metric="metrics.gauges['com.commafeed.backend.feed.FeedRefreshExecutor.feed-refresh-updater.pending']"
|
||||
label="'Feed Updater queued'"
|
||||
></metric-gauge>
|
||||
|
||||
<metric-gauge metric="metrics.gauges['com.commafeed.backend.feed.FeedQueues.addQueue']" label="'Task Giver Add Queue'"></metric-gauge>
|
||||
<metric-gauge metric="metrics.gauges['com.commafeed.backend.feed.FeedQueues.takeQueue']" label="'Task Giver Take Queue'"></metric-gauge>
|
||||
<metric-gauge metric="metrics.gauges['com.commafeed.backend.feed.FeedQueues.giveBackQueue']" label="'Task Giver Give Back Queue'"></metric-gauge>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div ng-repeat="(name, timer) in metrics.timers">
|
||||
<metric-timer metric="timer" label="name"></metric-gauge>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<metric-gauge
|
||||
metric="metrics.gauges['com.commafeed.backend.feed.FeedRefreshExecutor.feed-refresh-worker.active']"
|
||||
label="'Feed Worker active'"
|
||||
></metric-gauge>
|
||||
<metric-gauge
|
||||
metric="metrics.gauges['com.commafeed.backend.feed.FeedRefreshExecutor.feed-refresh-worker.pending']"
|
||||
label="'Feed Worker queued'"
|
||||
></metric-gauge>
|
||||
|
||||
<metric-gauge
|
||||
metric="metrics.gauges['com.commafeed.backend.feed.FeedQueues.addQueue']"
|
||||
label="'Task Giver Add Queue'"
|
||||
></metric-gauge>
|
||||
<metric-gauge
|
||||
metric="metrics.gauges['com.commafeed.backend.feed.FeedQueues.takeQueue']"
|
||||
label="'Task Giver Take Queue'"
|
||||
></metric-gauge>
|
||||
<metric-gauge
|
||||
metric="metrics.gauges['com.commafeed.backend.feed.FeedQueues.giveBackQueue']"
|
||||
label="'Task Giver Give Back Queue'"
|
||||
></metric-gauge>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div ng-repeat="(name, timer) in metrics.timers">
|
||||
<metric-timer metric="timer" label="name"></metric-timer>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,157 +1,183 @@
|
||||
<div class="row">
|
||||
<div class="page-header">
|
||||
<h1>
|
||||
Application settings -
|
||||
<small>
|
||||
<a ng-click="toUsers()" class="pointer">Manage users</a>
|
||||
</small>
|
||||
-
|
||||
<small>
|
||||
<a ng-click="toMetrics()" class="pointer">Metrics</a>
|
||||
</small>
|
||||
</h1>
|
||||
</div>
|
||||
<div class="page-header">
|
||||
<h1>
|
||||
Application settings -
|
||||
<small>
|
||||
<a ng-click="toUsers()" class="pointer">Manage users</a>
|
||||
</small>
|
||||
-
|
||||
<small>
|
||||
<a ng-click="toMetrics()" class="pointer">Metrics</a>
|
||||
</small>
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<form name="settingsForm" class="form-horizontal" ng-submit="save()">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="publicUrl">Public URL</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" id="publicUrl" name="publicUrl" class="form-control" placeholder="http://localhost:8082/commafeed"
|
||||
ng-model="settings.publicUrl" />
|
||||
<span class="help-block">The URL in your address bar right now, up to the # (not included)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="publicUrl">Allow registrations</label>
|
||||
<div class="col-sm-9">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" id="allowRegistrations" name="allowRegistrations" ng-model="settings.allowRegistrations" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="googleAnalyticsTrackingCode">Google Analytics tracking code</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" name="googleAnalyticsTrackingCode" class="form-control" ng-model="settings.googleAnalyticsTrackingCode" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="googleClientSecret">Background HTTP threads</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="number" name="backgroundThreads" class="form-control" ng-model="settings.backgroundThreads" />
|
||||
<span class="help-inline">Requires restart</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="databaseUpdateThreads">Database update threads</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="number" name="databaseUpdateThreads" class="form-control" ng-model="settings.databaseUpdateThreads" />
|
||||
<span class="help-inline">Requires restart</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="announcement">Announcement</label>
|
||||
<div class="col-sm-9">
|
||||
<textarea name="announcement" rows="10" class="form-control" ng-model="settings.announcement">
|
||||
</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="announcement">SMTP Host</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" name="smtpHost" class="form-control" ng-model="settings.smtpHost" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="announcement">SMTP Port</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" name="smtpPort" class="form-control" ng-model="settings.smtpPort" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="smtpTls">SMTP TLS </label>
|
||||
<div class="col-sm-9">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="smtpTls" ng-model="settings.smtpTls" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="smtpUserName">SMTP Username</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" name="smtpUserName" class="form-control" ng-model="settings.smtpUserName" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="smtpPassword">SMTP Password</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="password" name="smtpPassword" class="form-control" ng-model="settings.smtpPassword" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="heavyLoad">Heavy load</label>
|
||||
<div class="col-sm-9">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="heavyLoad" ng-model="settings.heavyLoad" />
|
||||
<span class="help-block">Don't use this unless you know what you're doing!</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="pubsubhubbub">PubSubHubbub</label>
|
||||
<div class="col-sm-9">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="pubsubhubbub" ng-model="settings.pubsubhubbub" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="imageProxyEnabled">Proxy entry images</label>
|
||||
<div class="col-sm-9">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="imageProxyEnabled" ng-model="settings.imageProxyEnabled" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="logLevel">Database query timeout (ms)</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="number" name="queryTimeout" class="form-control" ng-model="settings.queryTimeout" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="keepStatusDays">Keep read status for (days)</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="number" name="keepStatusDays" class="form-control" ng-model="settings.keepStatusDays" />
|
||||
<span class="help-inline">0 = keep forever</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="refreshIntervalMinutes">Refresh feeds every (minutes)</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="number" name="refreshIntervalMinutes" class="form-control" min="1" ng-model="settings.refreshIntervalMinutes" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="crawlingPaused">Pause crawling</label>
|
||||
<div class="col-sm-9">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="crawlingPaused" ng-model="settings.crawlingPaused" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="text-center form-group">
|
||||
<button type="button" class="btn btn-default" ng-click="cancel()">Back</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<form name="settingsForm" class="form-horizontal" ng-submit="save()">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="publicUrl">Public URL</label>
|
||||
<div class="col-sm-9">
|
||||
<input
|
||||
type="text"
|
||||
id="publicUrl"
|
||||
name="publicUrl"
|
||||
class="form-control"
|
||||
placeholder="http://localhost:8082/commafeed"
|
||||
ng-model="settings.publicUrl"
|
||||
/>
|
||||
<span class="help-block">The URL in your address bar right now, up to the # (not included)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="publicUrl">Allow registrations</label>
|
||||
<div class="col-sm-9">
|
||||
<div class="checkbox">
|
||||
<input
|
||||
type="checkbox"
|
||||
id="allowRegistrations"
|
||||
name="allowRegistrations"
|
||||
ng-model="settings.allowRegistrations"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="googleAnalyticsTrackingCode">Google Analytics tracking code</label>
|
||||
<div class="col-sm-9">
|
||||
<input
|
||||
type="text"
|
||||
name="googleAnalyticsTrackingCode"
|
||||
class="form-control"
|
||||
ng-model="settings.googleAnalyticsTrackingCode"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="googleClientSecret">Background HTTP threads</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="number" name="backgroundThreads" class="form-control" ng-model="settings.backgroundThreads" />
|
||||
<span class="help-inline">Requires restart</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="databaseUpdateThreads">Database update threads</label>
|
||||
<div class="col-sm-9">
|
||||
<input
|
||||
type="number"
|
||||
name="databaseUpdateThreads"
|
||||
class="form-control"
|
||||
ng-model="settings.databaseUpdateThreads"
|
||||
/>
|
||||
<span class="help-inline">Requires restart</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="announcement">Announcement</label>
|
||||
<div class="col-sm-9">
|
||||
<textarea name="announcement" rows="10" class="form-control" ng-model="settings.announcement"> </textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="announcement">SMTP Host</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" name="smtpHost" class="form-control" ng-model="settings.smtpHost" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="announcement">SMTP Port</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" name="smtpPort" class="form-control" ng-model="settings.smtpPort" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="smtpTls">SMTP TLS </label>
|
||||
<div class="col-sm-9">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="smtpTls" ng-model="settings.smtpTls" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="smtpUserName">SMTP Username</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" name="smtpUserName" class="form-control" ng-model="settings.smtpUserName" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="smtpPassword">SMTP Password</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="password" name="smtpPassword" class="form-control" ng-model="settings.smtpPassword" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="heavyLoad">Heavy load</label>
|
||||
<div class="col-sm-9">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="heavyLoad" ng-model="settings.heavyLoad" />
|
||||
<span class="help-block">Don't use this unless you know what you're doing!</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="pubsubhubbub">PubSubHubbub</label>
|
||||
<div class="col-sm-9">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="pubsubhubbub" ng-model="settings.pubsubhubbub" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="imageProxyEnabled">Proxy entry images</label>
|
||||
<div class="col-sm-9">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="imageProxyEnabled" ng-model="settings.imageProxyEnabled" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="logLevel">Database query timeout (ms)</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="number" name="queryTimeout" class="form-control" ng-model="settings.queryTimeout" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="keepStatusDays">Keep read status for (days)</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="number" name="keepStatusDays" class="form-control" ng-model="settings.keepStatusDays" />
|
||||
<span class="help-inline">0 = keep forever</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="refreshIntervalMinutes">Refresh feeds every (minutes)</label>
|
||||
<div class="col-sm-9">
|
||||
<input
|
||||
type="number"
|
||||
name="refreshIntervalMinutes"
|
||||
class="form-control"
|
||||
min="1"
|
||||
ng-model="settings.refreshIntervalMinutes"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-3" for="crawlingPaused">Pause crawling</label>
|
||||
<div class="col-sm-9">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="crawlingPaused" ng-model="settings.crawlingPaused" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="text-center form-group">
|
||||
<button type="button" class="btn btn-default" ng-click="cancel()">Back</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,40 +1,40 @@
|
||||
<div class="row">
|
||||
<div class="page-header">
|
||||
<h1>Add user</h1>
|
||||
</div>
|
||||
<div class="page-header">
|
||||
<h1>Add user</h1>
|
||||
</div>
|
||||
|
||||
<alert ng-repeat="alert in alerts" type="alert.type" close="closeAlert($index)">{{alert.msg}}</alert>
|
||||
<alert ng-repeat="alert in alerts" type="alert.type" close="closeAlert($index)">{{alert.msg}}</alert>
|
||||
|
||||
<form name="userAddForm" class="form-horizontal" ng-submit="save()">
|
||||
<div class="form-group" ng-class="{error : !userAddForm.name.$valid}">
|
||||
<label class="col-sm-2 control-label" for="name">User name</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" id="name" name="name" ng-model="user.name" required class="form-control" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !userAddForm.password.$valid}">
|
||||
<label class="col-sm-2 control-label" for="password">Password</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" id="password" name="password" class="form-control" ng-model="user.password" required />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="admin">Admin</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="checkbox" name="admin" ng-model="user.admin" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="enabled">Enabled</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="checkbox" name="enabled" ng-model="user.enabled" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary">Save</button>
|
||||
<button type="button" class="btn btn-default" ng-click="cancel()">Cancel</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<form name="userAddForm" class="form-horizontal" ng-submit="save()">
|
||||
<div class="form-group" ng-class="{error : !userAddForm.name.$valid}">
|
||||
<label class="col-sm-2 control-label" for="name">User name</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" id="name" name="name" ng-model="user.name" required class="form-control" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !userAddForm.password.$valid}">
|
||||
<label class="col-sm-2 control-label" for="password">Password</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" id="password" name="password" class="form-control" ng-model="user.password" required />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="admin">Admin</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="checkbox" name="admin" ng-model="user.admin" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="enabled">Enabled</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="checkbox" name="enabled" ng-model="user.enabled" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary">Save</button>
|
||||
<button type="button" class="btn btn-default" ng-click="cancel()">Cancel</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -1,48 +1,55 @@
|
||||
<div class="row">
|
||||
<div class="page-header">
|
||||
<h1>Edit user</h1>
|
||||
</div>
|
||||
<div class="page-header">
|
||||
<h1>Edit user</h1>
|
||||
</div>
|
||||
|
||||
<alert ng-repeat="alert in alerts" type="alert.type" close="closeAlert($index)">{{alert.msg}}</alert>
|
||||
<alert ng-repeat="alert in alerts" type="alert.type" close="closeAlert($index)">{{alert.msg}}</alert>
|
||||
|
||||
<form name="userAddForm" class="form-horizontal" ng-submit="save()">
|
||||
<div class="form-group" ng-class="{error : !userAddForm.name.$valid}">
|
||||
<label class="col-sm-2 control-label" for="name">User name</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" id="name" name="name" ng-model="user.name" class="form-control" required />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !userAddForm.password.$valid}">
|
||||
<label class="col-sm-2 control-label" for="password">Password</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" id="password" name="password" class="form-control" ng-model="user.password" />
|
||||
<span class="help-block">Leave blank if you don't want to change the password.</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="email">Email</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" id="email" name="email" ng-model="user.email" class="form-control" required />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="admin">Admin</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="checkbox" name="admin" ng-model="user.admin" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="enabled">Enabled</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="checkbox" name="enabled" ng-model="user.enabled" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary">Save</button>
|
||||
<button type="button" class="btn btn-danger" ng-click="remove()" confirm-click="'Are you sure you want to delete this user?'">Delete</button>
|
||||
<button type="button" class="btn btn-default" ng-click="cancel()">Cancel</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<form name="userAddForm" class="form-horizontal" ng-submit="save()">
|
||||
<div class="form-group" ng-class="{error : !userAddForm.name.$valid}">
|
||||
<label class="col-sm-2 control-label" for="name">User name</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" id="name" name="name" ng-model="user.name" class="form-control" required />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !userAddForm.password.$valid}">
|
||||
<label class="col-sm-2 control-label" for="password">Password</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" id="password" name="password" class="form-control" ng-model="user.password" />
|
||||
<span class="help-block">Leave blank if you don't want to change the password.</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="email">Email</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" id="email" name="email" ng-model="user.email" class="form-control" required />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="admin">Admin</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="checkbox" name="admin" ng-model="user.admin" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="enabled">Enabled</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="checkbox" name="enabled" ng-model="user.enabled" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary">Save</button>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-danger"
|
||||
ng-click="remove()"
|
||||
confirm-click="'Are you sure you want to delete this user?'"
|
||||
>
|
||||
Delete
|
||||
</button>
|
||||
<button type="button" class="btn btn-default" ng-click="cancel()">Cancel</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<div class="row">
|
||||
<div class="page-header">
|
||||
<h1>Manage users</h1>
|
||||
</div>
|
||||
<div class="page-header">
|
||||
<h1>Manage users</h1>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="button-bar">
|
||||
<button class="btn btn-default" ng-click="addUser()">Add user</button>
|
||||
<button class="btn btn-default" ng-click="back()">Back</button>
|
||||
</div>
|
||||
<div class="users-table" ng-grid="gridOptions"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="button-bar">
|
||||
<button class="btn btn-default" ng-click="addUser()">Add user</button>
|
||||
<button class="btn btn-default" ng-click="back()">Back</button>
|
||||
</div>
|
||||
<div class="users-table" ng-grid="gridOptions"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,49 +1,63 @@
|
||||
<div>
|
||||
<div class="page-header">
|
||||
<h3>{{ 'details.category_details' | translate }}</h3>
|
||||
</div>
|
||||
<form name="form" class="form-horizontal" ng-submit="save()">
|
||||
<div class="form-group" ng-class="{error : !form.name.$valid}" ng-if="!isMeta()">
|
||||
<label class="col-sm-2 control-label">{{ 'details.name' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" name="name" ng-model="category.name" class="form-control" required></input>
|
||||
<span class="help-block" ng-show="!form.name.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="page-header">
|
||||
<h3>{{ 'details.category_details' | translate }}</h3>
|
||||
</div>
|
||||
<form name="form" class="form-horizontal" ng-submit="save()">
|
||||
<div class="form-group" ng-class="{error : !form.name.$valid}" ng-if="!isMeta()">
|
||||
<label class="col-sm-2 control-label">{{ 'details.name' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" name="name" ng-model="category.name" class="form-control" required />
|
||||
<span class="help-block" ng-show="!form.name.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group" ng-class="{error : !form.category.$valid}" ng-if="!isMeta()">
|
||||
<label class="col-sm-2 control-label">{{ 'details.parent_category' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="category" class="form-control" ng-model="category.parentId"
|
||||
ng-options="cat.id as cat.name for cat in CategoryService.flatCategories | filter: filterCurrent">
|
||||
</select>
|
||||
<span class="help-block" ng-show="!form.category.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !form.category.$valid}" ng-if="!isMeta()">
|
||||
<label class="col-sm-2 control-label">{{ 'details.parent_category' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<select
|
||||
name="category"
|
||||
class="form-control"
|
||||
ng-model="category.parentId"
|
||||
ng-options="cat.id as cat.name for cat in CategoryService.flatCategories | filter: filterCurrent"
|
||||
></select>
|
||||
<span class="help-block" ng-show="!form.category.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group" ng-if="!isMeta()">
|
||||
<label class="col-sm-2 control-label">{{ 'details.position' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" min="0" ng-model="category.position" class="form-control" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-if="!isMeta()">
|
||||
<label class="col-sm-2 control-label">{{ 'details.position' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" min="0" ng-model="category.position" class="form-control" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.feed_url' | translate }}</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<a ng-show="user.apiKey" href="{{'rest/category/entriesAsFeed?id=' + category.id + '&apiKey=' + user.apiKey}}" target="_blank">{{ 'global.link' | translate }}</a>
|
||||
<span ng-show="!user.apiKey">{{ 'details.generate_api_key_first' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary" ng-if="!isMeta()">{{ 'global.save' | translate }}</button>
|
||||
<button type="button" class="btn btn-danger" ng-click="deleteCategory()" ng-show="!isMeta()"
|
||||
confirm-click="'details.delete_category_confirmation' | translate">{{ 'global.delete' | translate }}</button>
|
||||
<button type="button" class="btn btn-default" ng-click="back()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.feed_url' | translate }}</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<a
|
||||
ng-show="user.apiKey"
|
||||
href="{{'rest/category/entriesAsFeed?id=' + category.id + '&apiKey=' + user.apiKey}}"
|
||||
target="_blank"
|
||||
>{{ 'global.link' | translate }}</a
|
||||
>
|
||||
<span ng-show="!user.apiKey">{{ 'details.generate_api_key_first' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary" ng-if="!isMeta()">{{ 'global.save' | translate }}</button>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-danger"
|
||||
ng-click="deleteCategory()"
|
||||
ng-show="!isMeta()"
|
||||
confirm-click="'details.delete_category_confirmation' | translate"
|
||||
>
|
||||
{{ 'global.delete' | translate }}
|
||||
</button>
|
||||
<button type="button" class="btn btn-default" ng-click="back()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -1,90 +1,101 @@
|
||||
<div>
|
||||
<div class="page-header">
|
||||
<h3>{{ 'details.feed_details' | translate }}</h3>
|
||||
</div>
|
||||
<form name="form" class="form-horizontal" ng-submit="save()">
|
||||
<div class="alert alert-danger" ng-if="error">{{ error }}</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.url' | translate }}</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<a href="{{sub.feedUrl}}" target="_blank">{{sub.feedUrl}}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.website' | translate }}</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<a href="{{sub.feedLink}}" target="_blank">{{sub.feedLink}}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !form.name.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'details.name' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" name="name" ng-model="sub.name" class="form-control" required></input>
|
||||
<span class="help-block" ng-show="!form.name.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="page-header">
|
||||
<h3>{{ 'details.feed_details' | translate }}</h3>
|
||||
</div>
|
||||
<form name="form" class="form-horizontal" ng-submit="save()">
|
||||
<div class="alert alert-danger" ng-if="error">{{ error }}</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.url' | translate }}</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<a href="{{sub.feedUrl}}" target="_blank">{{sub.feedUrl}}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.website' | translate }}</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<a href="{{sub.feedLink}}" target="_blank">{{sub.feedLink}}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !form.name.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'details.name' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" name="name" ng-model="sub.name" class="form-control" required />
|
||||
<span class="help-block" ng-show="!form.name.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group" ng-class="{error : !form.category.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'details.category' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="category" class="form-control" ng-model="sub.categoryId"
|
||||
ng-options="cat.id as cat.name for cat in CategoryService.flatCategories">
|
||||
</select>
|
||||
<span class="help-block" ng-show="!form.category.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !form.category.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'details.category' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<select
|
||||
name="category"
|
||||
class="form-control"
|
||||
ng-model="sub.categoryId"
|
||||
ng-options="cat.id as cat.name for cat in CategoryService.flatCategories"
|
||||
></select>
|
||||
<span class="help-block" ng-show="!form.category.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.position' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" min="0" ng-model="sub.position" class="form-control" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.position' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" min="0" ng-model="sub.position" class="form-control" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.last_refresh' | translate }}</label>
|
||||
<div class="col-sm-10 checkbox">
|
||||
<span>{{sub.lastRefresh|entryDate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.last_refresh' | translate }}</label>
|
||||
<div class="col-sm-10 checkbox">
|
||||
<span>{{sub.lastRefresh|entryDate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.next_refresh' | translate }}</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<span>{{sub.nextRefresh|entryDate:('details.queued_for_refresh' | translate) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.next_refresh' | translate }}</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<span>{{sub.nextRefresh|entryDate:('details.queued_for_refresh' | translate) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.message' | translate }}</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<span>{{sub.message}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.message' | translate }}</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<span>{{sub.message}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.feed_url' | translate }}</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<a ng-show="user.apiKey" href="{{'rest/feed/entriesAsFeed?id=' + sub.id + '&apiKey=' + user.apiKey}}" target="_blank">{{ 'global.link' | translate }}</a>
|
||||
<span ng-show="!user.apiKey">{{ 'details.generate_api_key_first' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.feed_url' | translate }}</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<a ng-show="user.apiKey" href="{{'rest/feed/entriesAsFeed?id=' + sub.id + '&apiKey=' + user.apiKey}}" target="_blank"
|
||||
>{{ 'global.link' | translate }}</a
|
||||
>
|
||||
<span ng-show="!user.apiKey">{{ 'details.generate_api_key_first' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.filtering_expression' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" name="filter" ng-model="sub.filter" class="form-control"></input>
|
||||
<p class="help-block pre-wrap" ng-bind-html="'details.filtering_expression_help' | translate"></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary">{{ 'global.save' | translate }}</button>
|
||||
<button type="button" class="btn btn-danger" ng-click="unsubscribe()" confirm-click="'details.unsubscribe_confirmation' | translate">{{ 'details.unsubscribe' | translate }}</button>
|
||||
<button type="button" class="btn btn-default" ng-click="back()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.filtering_expression' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" name="filter" ng-model="sub.filter" class="form-control" />
|
||||
<p class="help-block pre-wrap" ng-bind-html="'details.filtering_expression_help' | translate"></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary">{{ 'global.save' | translate }}</button>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-danger"
|
||||
ng-click="unsubscribe()"
|
||||
confirm-click="'details.unsubscribe_confirmation' | translate"
|
||||
>
|
||||
{{ 'details.unsubscribe' | translate }}
|
||||
</button>
|
||||
<button type="button" class="btn btn-default" ng-click="back()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -1,144 +1,163 @@
|
||||
<div class="row help">
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-6">
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-question-sign"></i>
|
||||
{{ 'toolbar.about' | translate }}
|
||||
</h4>
|
||||
<p>
|
||||
{{ 'about.line1_prefix' | translate }}
|
||||
<a href="https://github.com/Athou/commafeed" target="_blank">GitHub</a>
|
||||
{{ 'about.line1_suffix' | translate }}
|
||||
</p>
|
||||
<p>
|
||||
{{ 'about.line2_prefix' | translate }}
|
||||
<a href="https://github.com/Athou/commafeed/issues" target="_blank">GitHub</a>
|
||||
{{ 'about.line2_suffix' | translate }}
|
||||
</p>
|
||||
{{ 'about.version' | translate }} {{infos.version}} ({{infos.gitCommit}})
|
||||
</div>
|
||||
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-question-sign"></i>
|
||||
{{ 'toolbar.about' | translate }}
|
||||
</h4>
|
||||
<p>
|
||||
{{ 'about.line1_prefix' | translate }}
|
||||
<a href="https://github.com/Athou/commafeed" target="_blank">GitHub</a>
|
||||
{{ 'about.line1_suffix' | translate }}
|
||||
</p>
|
||||
<p>
|
||||
{{ 'about.line2_prefix' | translate }}
|
||||
<a href="https://github.com/Athou/commafeed/issues" target="_blank">GitHub</a>
|
||||
{{ 'about.line2_suffix' | translate }}
|
||||
</p>
|
||||
{{ 'about.version' | translate }} {{infos.version}} ({{infos.gitCommit}})
|
||||
</div>
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-money"></i>
|
||||
{{ 'toolbar.donate' | translate }}
|
||||
</h4>
|
||||
<p>{{ 'about.line3' | translate }}</p>
|
||||
<form class="donate-action" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
|
||||
<input type="hidden" name="cmd" value="_donations" />
|
||||
<input type="hidden" name="business" value="9CNQHMJG2ZJVY" />
|
||||
<input type="hidden" name="lc" value="US" />
|
||||
<input type="hidden" name="item_name" value="CommaFeed" />
|
||||
<input type="hidden" name="bn" value="PP-DonationsBF:btn_donateCC_LG.gif:NonHosted" />
|
||||
<input
|
||||
type="image"
|
||||
class="donate-image"
|
||||
src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif"
|
||||
border="0"
|
||||
name="submit"
|
||||
alt="PayPal - The safer, easier way to pay online!"
|
||||
/>
|
||||
<input type="hidden" name="currency_code" value="USD" />
|
||||
<select name="currency_code">
|
||||
<option value="EUR">Euro</option>
|
||||
<option value="USD">US Dollars</option>
|
||||
</select>
|
||||
</form>
|
||||
{{ 'about.line4' | translate }}
|
||||
<code class="bitcoin-code">1dymfUxqCWpyD7a6rQSqNy4rLVDBsAr5e</code>
|
||||
</div>
|
||||
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-money"></i>
|
||||
{{ 'toolbar.donate' | translate }}
|
||||
</h4>
|
||||
<p>{{ 'about.line3' | translate }}</p>
|
||||
<form class="donate-action" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
|
||||
<input type="hidden" name="cmd" value="_donations">
|
||||
<input type="hidden" name="business" value="9CNQHMJG2ZJVY">
|
||||
<input type="hidden" name="lc" value="US">
|
||||
<input type="hidden" name="item_name" value="CommaFeed">
|
||||
<input type="hidden" name="bn" value="PP-DonationsBF:btn_donateCC_LG.gif:NonHosted">
|
||||
<input type="image" class="donate-image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit"
|
||||
alt="PayPal - The safer, easier way to pay online!">
|
||||
<input type="hidden" name="currency_code" value="USD">
|
||||
<select name="currency_code">
|
||||
<option value="EUR">Euro</option>
|
||||
<option value="USD">US Dollars</option>
|
||||
</select>
|
||||
</form>
|
||||
{{ 'about.line4' | translate }}
|
||||
<code class="bitcoin-code">1dymfUxqCWpyD7a6rQSqNy4rLVDBsAr5e</code>
|
||||
</div>
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-puzzle-piece"></i>
|
||||
{{ 'about.goodies.value' | translate }}
|
||||
</h4>
|
||||
<p>
|
||||
{{ 'about.goodies.android_app' | translate }}:
|
||||
<a href="https://github.com/Athou/commafeed-newsplus" target="_blank">News+ extension</a>
|
||||
,
|
||||
<a href="https://play.google.com/store/apps/details?id=com.commafeed.commafeedreader" target="_blank">CommaFeed Reader</a>
|
||||
,
|
||||
<a href="https://play.google.com/store/apps/details?id=com.mv.cloudfeedlr" target="_blank">Cloudfeedlr</a>
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://chrome.google.com/webstore/detail/commafeed/bpbfpjiciblcfeganojjkfapnllbhdga" target="_blank"
|
||||
>{{ 'about.goodies.chrome_extension' | translate }}</a
|
||||
>
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://addons.mozilla.org/en-US/firefox/addon/commafeed/" target="_blank"
|
||||
>{{ 'about.goodies.firefox_extension' | translate }}</a
|
||||
>
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://addons.opera.com/en/extensions/details/commafeed-extension-for-opera/" target="_blank"
|
||||
>{{ 'about.goodies.opera_extension' | translate }}</a
|
||||
>
|
||||
</p>
|
||||
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-puzzle-piece"></i>
|
||||
{{ 'about.goodies.value' | translate }}
|
||||
</h4>
|
||||
<p>
|
||||
{{ 'about.goodies.android_app' | translate }}:
|
||||
<a href="https://github.com/Athou/commafeed-newsplus" target="_blank">News+ extension</a>
|
||||
,
|
||||
<a href="https://play.google.com/store/apps/details?id=com.commafeed.commafeedreader" target="_blank">CommaFeed Reader</a>
|
||||
,
|
||||
<a href="https://play.google.com/store/apps/details?id=com.mv.cloudfeedlr" target="_blank">Cloudfeedlr</a>
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://chrome.google.com/webstore/detail/commafeed/bpbfpjiciblcfeganojjkfapnllbhdga" target="_blank">{{ 'about.goodies.chrome_extension' | translate }}</a>
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://addons.mozilla.org/en-US/firefox/addon/commafeed/" target="_blank">{{ 'about.goodies.firefox_extension' | translate }}</a>
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://addons.opera.com/en/extensions/details/commafeed-extension-for-opera/" target="_blank">{{ 'about.goodies.opera_extension' | translate }}</a>
|
||||
</p>
|
||||
<p>
|
||||
{{ 'about.goodies.subscribe_url' | translate }}:
|
||||
<a href="rest/feed/subscribe?url=FEED_URL_HERE" target="_blank">rest/feed/subscribe?url=FEED_URL_HERE</a>
|
||||
</p>
|
||||
<p>
|
||||
{{ 'about.goodies.subscribe_bookmarklet' | translate }}:
|
||||
<a href="https://www.subtome.com/settings.html" target="_blank">SubToMe</a>
|
||||
</p>
|
||||
<p>
|
||||
{{ 'about.goodies.next_unread_bookmarklet' | translate }}:
|
||||
<br />
|
||||
<br />
|
||||
{{ 'subscribe.category' | translate }}
|
||||
<select
|
||||
ng-model="categoryId"
|
||||
ng-options="cat.id as cat.name for cat in CategoryService.flatCategories"
|
||||
class="bookmarklet-select"
|
||||
></select>
|
||||
<select ng-model="order" class="bookmarklet-select">
|
||||
<option value="desc">{{ 'about.goodies.subscribe_bookmarklet_desc' | translate }}</option>
|
||||
<option value="asc">{{ 'about.goodies.subscribe_bookmarklet_asc' | translate }}</option>
|
||||
</select>
|
||||
<a
|
||||
href="javascript:window.location.href='{{baseUrl}}next?category={{categoryId}}&order={{order}}&t='+new Date().getTime();"
|
||||
target="_blank"
|
||||
>{{ 'global.link' | translate }}</a
|
||||
>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
{{ 'about.goodies.subscribe_url' | translate }}:
|
||||
<a href="rest/feed/subscribe?url=FEED_URL_HERE" target="_blank">rest/feed/subscribe?url=FEED_URL_HERE</a>
|
||||
</p>
|
||||
<p>
|
||||
{{ 'about.goodies.subscribe_bookmarklet' | translate }}:
|
||||
<a href="https://www.subtome.com/settings.html" target="_blank">SubToMe</a>
|
||||
</p>
|
||||
<p>
|
||||
{{ 'about.goodies.next_unread_bookmarklet' | translate }}:
|
||||
<br />
|
||||
<br />
|
||||
{{ 'subscribe.category' | translate }}
|
||||
<select ng-model="categoryId" ng-options="cat.id as cat.name for cat in CategoryService.flatCategories" class="bookmarklet-select">
|
||||
</select>
|
||||
<select ng-model="order" class="bookmarklet-select">
|
||||
<option value="desc">{{ 'about.goodies.subscribe_bookmarklet_desc' | translate }}</option>
|
||||
<option value="asc">{{ 'about.goodies.subscribe_bookmarklet_asc' | translate }}</option>
|
||||
</select>
|
||||
<a href="javascript:window.location.href='{{baseUrl}}next?category={{categoryId}}&order={{order}}&t='+new Date().getTime();"
|
||||
target="_blank">{{ 'global.link' | translate }}</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-globe"></i>
|
||||
{{ 'about.translation.value' | translate }}
|
||||
</h4>
|
||||
<p>{{ 'about.translation.message' | translate }}</p>
|
||||
<p>
|
||||
<a href="https://github.com/Athou/commafeed#translate-commafeed-into-your-language" target="_blank">
|
||||
{{ 'about.translation.link' | translate }}
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-rocket"></i>
|
||||
{{ 'about.rest_api.value' | translate }}
|
||||
</h4>
|
||||
<p>{{ 'about.rest_api.line1' | translate }}</p>
|
||||
<p>
|
||||
<a href="api/" target="_blank">{{ 'about.rest_api.link_to_documentation' | translate }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-keyboard"></i>
|
||||
{{ 'about.keyboard_shortcuts' | translate }}
|
||||
</h4>
|
||||
<div ng-include="'templates/_shortcuts.html'"></div>
|
||||
</div>
|
||||
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-globe"></i>
|
||||
{{ 'about.translation.value' | translate }}
|
||||
</h4>
|
||||
<p>{{ 'about.translation.message' | translate }}</p>
|
||||
<p>
|
||||
<a href="https://github.com/Athou/commafeed#translate-commafeed-into-your-language" target="_blank"> {{ 'about.translation.link' | translate }} </a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-rocket"></i>
|
||||
{{ 'about.rest_api.value' | translate }}
|
||||
</h4>
|
||||
<p>{{ 'about.rest_api.line1' | translate }}</p>
|
||||
<p>
|
||||
<a href="api/" target="_blank">{{ 'about.rest_api.link_to_documentation' | translate }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-keyboard"></i>
|
||||
{{ 'about.keyboard_shortcuts' | translate }}
|
||||
</h4>
|
||||
<div ng-include="'templates/_shortcuts.html'"></div>
|
||||
</div>
|
||||
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-info-sign"></i>
|
||||
{{ 'about.announcements' | translate }}
|
||||
</h4>
|
||||
<a class="twitter-timeline" href="https://twitter.com/CommaFeed" data-widget-id="333897786657480704">Tweets by @CommaFeed</a>
|
||||
<script>
|
||||
!function(d, s, id) {
|
||||
var js, fjs = d.getElementsByTagName(s)[0], p = /^http:/.test(d.location) ? 'http' : 'https';
|
||||
if (!d.getElementById(id)) {
|
||||
js = d.createElement(s);
|
||||
js.id = id;
|
||||
js.src = p + "://platform.twitter.com/widgets.js";
|
||||
fjs.parentNode.insertBefore(js, fjs);
|
||||
}
|
||||
}(document, "script", "twitter-wjs");
|
||||
</script>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="about-module">
|
||||
<h4>
|
||||
<i class="icon-info-sign"></i>
|
||||
{{ 'about.announcements' | translate }}
|
||||
</h4>
|
||||
<a class="twitter-timeline" href="https://twitter.com/CommaFeed" data-widget-id="333897786657480704">Tweets by @CommaFeed</a>
|
||||
<script>
|
||||
!(function (d, s, id) {
|
||||
var js,
|
||||
fjs = d.getElementsByTagName(s)[0],
|
||||
p = /^http:/.test(d.location) ? "http" : "https"
|
||||
if (!d.getElementById(id)) {
|
||||
js = d.createElement(s)
|
||||
js.id = id
|
||||
js.src = p + "://platform.twitter.com/widgets.js"
|
||||
fjs.parentNode.insertBefore(js, fjs)
|
||||
}
|
||||
})(document, "script", "twitter-wjs")
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<div class="container-full">
|
||||
<div class="left-menu">
|
||||
<div ng-include="'templates/_tree.html'"></div>
|
||||
<div ng-include="'templates/_feedsearch.html'"></div>
|
||||
</div>
|
||||
<div class="main-content">
|
||||
<div id="toolbar" class="toolbar" ng-include="'templates/_toolbar.html'"></div>
|
||||
<div class="entryList">
|
||||
<div ui-view></div>
|
||||
</div>
|
||||
</div>
|
||||
<div ng-include="'templates/_footer.html'"></div>
|
||||
</div>
|
||||
<div class="left-menu">
|
||||
<div ng-include="'templates/_tree.html'"></div>
|
||||
<div ng-include="'templates/_feedsearch.html'"></div>
|
||||
</div>
|
||||
<div class="main-content">
|
||||
<div id="toolbar" class="toolbar" ng-include="'templates/_toolbar.html'"></div>
|
||||
<div class="entryList">
|
||||
<div ui-view></div>
|
||||
</div>
|
||||
</div>
|
||||
<div ng-include="'templates/_footer.html'"></div>
|
||||
</div>
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
<div>
|
||||
<div class="page-header">
|
||||
<h3>{{ 'tree.import' | translate }}</h3>
|
||||
</div>
|
||||
<form class="form-horizontal" action="rest/feed/import" method="post" enctype="multipart/form-data">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'import.xml_file' | translate }}</label>
|
||||
<div class="col-sm-10 ">
|
||||
<input type="file" name="file" class="form-control"></input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button class="btn btn-primary ok" type="submit">{{ 'tree.import' | translate }}</button>
|
||||
<button type="button" class="btn btn-default cancel" ng-click="back()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="page-header">
|
||||
<h3>{{ 'tree.import' | translate }}</h3>
|
||||
</div>
|
||||
<form class="form-horizontal" action="rest/feed/import" method="post" enctype="multipart/form-data">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'import.xml_file' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="file" name="file" class="form-control" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button class="btn btn-primary ok" type="submit">{{ 'tree.import' | translate }}</button>
|
||||
<button type="button" class="btn btn-default cancel" ng-click="back()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -1,29 +1,33 @@
|
||||
<div>
|
||||
<div class="page-header">
|
||||
<h3>{{ 'tree.new_category' | translate }}</h3>
|
||||
</div>
|
||||
<form name="categoryForm" class="form-horizontal" ng-submit="saveCategory()">
|
||||
<div class="form-group" ng-class="{error : !categoryForm.name.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'new_category.name' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="name" ng-model="cat.name" required></input>
|
||||
<span class="help-block" ng-show="!categoryForm.name.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !categoryForm.category.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'new_category.parent' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="category" ng-model="cat.parentId" class="form-control"
|
||||
ng-options="cat.id as cat.name for cat in CategoryService.flatCategories" required>
|
||||
</select>
|
||||
<span class="help-block" ng-show="!categoryForm.category.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button class="btn btn-primary ok" type="submit">{{ 'global.save' | translate }}</button>
|
||||
<button type="button" class="btn btn-default cancel" ng-click="back()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="page-header">
|
||||
<h3>{{ 'tree.new_category' | translate }}</h3>
|
||||
</div>
|
||||
<form name="categoryForm" class="form-horizontal" ng-submit="saveCategory()">
|
||||
<div class="form-group" ng-class="{error : !categoryForm.name.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'new_category.name' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="name" ng-model="cat.name" required />
|
||||
<span class="help-block" ng-show="!categoryForm.name.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !categoryForm.category.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'new_category.parent' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<select
|
||||
name="category"
|
||||
ng-model="cat.parentId"
|
||||
class="form-control"
|
||||
ng-options="cat.id as cat.name for cat in CategoryService.flatCategories"
|
||||
required
|
||||
></select>
|
||||
<span class="help-block" ng-show="!categoryForm.category.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button class="btn btn-primary ok" type="submit">{{ 'global.save' | translate }}</button>
|
||||
<button type="button" class="btn btn-default cancel" ng-click="back()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -1,39 +1,52 @@
|
||||
<div>
|
||||
<div class="page-header">
|
||||
<h3>{{ 'tree.subscribe' | translate }}</h3>
|
||||
</div>
|
||||
<form name="subscribeForm" class="form-horizontal" ng-submit="save()">
|
||||
<div class="form-group" ng-class="{error : !subscribeForm.url.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'subscribe.feed_url' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" name="url" ng-model="sub.url" ng-blur="urlChanged()" placeholder="http://example.com/feed" class="form-control"
|
||||
required ng-disabled="state=='loading'" autofocus></input>
|
||||
<span class="help-block" ng-show="!subscribeForm.url.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !subscribeForm.title.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'subscribe.feed_name' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" name="title" ng-model="sub.title" class="form-control" required ng-disabled="state=='loading'"></input>
|
||||
<span class="help-block" ng-show="!subscribeForm.title.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !subscribeForm.category.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'subscribe.category' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="category" ng-model="sub.categoryId" class="form-control"
|
||||
ng-options="cat.id as cat.name for cat in CategoryService.flatCategories" required>
|
||||
</select>
|
||||
<span class="help-block" ng-show="!subscribeForm.category.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button class="btn btn-primary ok" type="submit" ng-disabled="state!='ok'">{{ 'global.save' | translate }}</button>
|
||||
<button class="btn btn-default cancel" ng-click="back()" type="button">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<pre ng-if="state == 'failed'">{{stacktrace}}</pre>
|
||||
</div>
|
||||
<div class="page-header">
|
||||
<h3>{{ 'tree.subscribe' | translate }}</h3>
|
||||
</div>
|
||||
<form name="subscribeForm" class="form-horizontal" ng-submit="save()">
|
||||
<div class="form-group" ng-class="{error : !subscribeForm.url.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'subscribe.feed_url' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input
|
||||
type="text"
|
||||
name="url"
|
||||
ng-model="sub.url"
|
||||
ng-blur="urlChanged()"
|
||||
placeholder="http://example.com/feed"
|
||||
class="form-control"
|
||||
required
|
||||
ng-disabled="state=='loading'"
|
||||
autofocus
|
||||
/>
|
||||
<span class="help-block" ng-show="!subscribeForm.url.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !subscribeForm.title.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'subscribe.feed_name' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" name="title" ng-model="sub.title" class="form-control" required ng-disabled="state=='loading'" />
|
||||
<span class="help-block" ng-show="!subscribeForm.title.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-class="{error : !subscribeForm.category.$valid}">
|
||||
<label class="col-sm-2 control-label">{{ 'subscribe.category' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<select
|
||||
name="category"
|
||||
ng-model="sub.categoryId"
|
||||
class="form-control"
|
||||
ng-options="cat.id as cat.name for cat in CategoryService.flatCategories"
|
||||
required
|
||||
></select>
|
||||
<span class="help-block" ng-show="!subscribeForm.category.$valid">{{ 'global.required' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button class="btn btn-primary ok" type="submit" ng-disabled="state!='ok'">{{ 'global.save' | translate }}</button>
|
||||
<button class="btn btn-default cancel" ng-click="back()" type="button">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<pre ng-if="state == 'failed'">{{stacktrace}}</pre>
|
||||
</div>
|
||||
|
||||
@@ -1,23 +1,27 @@
|
||||
<div>
|
||||
<div class="page-header">
|
||||
<h3>{{ 'details.tag_details' | translate }}</h3>
|
||||
</div>
|
||||
<form name="form" class="form-horizontal" ng-submit="save()">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.feed_url' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="checkbox">
|
||||
<a ng-show="user.apiKey" href="{{'rest/category/entriesAsFeed?id=all&tag=' + tag + '&apiKey=' + user.apiKey}}" target="_blank">{{ 'global.link' | translate }}</a>
|
||||
<span ng-show="!user.apiKey">{{ 'details.generate_api_key_first' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="button" class="btn btn-default" ng-click="back()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="page-header">
|
||||
<h3>{{ 'details.tag_details' | translate }}</h3>
|
||||
</div>
|
||||
<form name="form" class="form-horizontal" ng-submit="save()">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{ 'details.feed_url' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="checkbox">
|
||||
<a
|
||||
ng-show="user.apiKey"
|
||||
href="{{'rest/category/entriesAsFeed?id=all&tag=' + tag + '&apiKey=' + user.apiKey}}"
|
||||
target="_blank"
|
||||
>{{ 'global.link' | translate }}</a
|
||||
>
|
||||
<span ng-show="!user.apiKey">{{ 'details.generate_api_key_first' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="button" class="btn btn-default" ng-click="back()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -1,155 +1,241 @@
|
||||
<div ng-class="{expanded: settingsService.settings.viewMode == 'expanded'}">
|
||||
<div class="entrylist-header" ng-if="name">
|
||||
<h3>
|
||||
<span ng-switch on="selectedId">
|
||||
<span ng-switch-when="all">{{ 'tree.all' | translate }}</span>
|
||||
<span ng-switch-when="starred">{{ 'tree.starred' | translate }}</span>
|
||||
<span ng-switch-default>
|
||||
<span ng-hide="feedLink">{{name}}</span>
|
||||
<a ng-show="feedLink" href="{{feedLink}}" target="_blank" rel="noreferrer">{{name}}</a>
|
||||
</span>
|
||||
</span>
|
||||
<span ng-show="name"> »</span>
|
||||
<span ng-show="keywords">{{ 'view.search_for' | translate }} '{{ keywords }}'</span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="entrylist-header" ng-if="name">
|
||||
<h3>
|
||||
<span ng-switch on="selectedId">
|
||||
<span ng-switch-when="all">{{ 'tree.all' | translate }}</span>
|
||||
<span ng-switch-when="starred">{{ 'tree.starred' | translate }}</span>
|
||||
<span ng-switch-default>
|
||||
<span ng-hide="feedLink">{{name}}</span>
|
||||
<a ng-show="feedLink" href="{{feedLink}}" target="_blank" rel="noreferrer">{{name}}</a>
|
||||
</span>
|
||||
</span>
|
||||
<span ng-show="name"> »</span>
|
||||
<span ng-show="keywords">{{ 'view.search_for' | translate }} '{{ keywords }}'</span>
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div infinite-scroll="loadMoreEntries()" infinite-scroll-disabled="busy || !settingsService.settings.readingMode"
|
||||
infinite-scroll-distance="1" id="feed-accordion" ng-class="{'expanded' : settingsService.settings.viewMode == 'expanded' }">
|
||||
<div ng-show="message && errorCount > 10">{{ 'view.error_while_loading_feed' | translate }} : {{ message }}</div>
|
||||
<div ng-repeat="entry in entries" class="entry entry-font-size-{{font_size}}" id="entry_{{entry.id}}"
|
||||
ng-class="{unread: entry.read == false, current: current==entry, open: isOpen, closed: !isOpen }">
|
||||
<div class="entry-heading" ng-swipe-right="mark(entry, !entry.read)">
|
||||
<a href="{{entry.url}}" target="_blank" rel="noreferrer" class="entry-heading-link" ng-click="noop($event)" ng-mouseup="entryClicked(entry, $event)">
|
||||
<span class="feed-name">
|
||||
<span class="star" ng-mouseup="star(entry, !entry.starred, $event)">
|
||||
<i ng-class="{'icon-star icon-star-yellow': entry.starred, 'icon-star-empty': !entry.starred}" class="pointer"></i>
|
||||
</span>
|
||||
<favicon url="entry.iconUrl" />
|
||||
{{entry.feedName}}
|
||||
</span>
|
||||
<span class="entry-date">{{entry.date | entryDate}}</span>
|
||||
<span class="entry-name" ng-class="{shrink: true, rtl: entry.rtl}" ng-bind-html="entry.title | highlight:keywords | trustHtml"></span>
|
||||
</a>
|
||||
<a href="{{entry.url}}" target="_blank" rel="noreferrer" class="entry-external-link" ng-click="mark(entry, true)">
|
||||
<i class="icon-external-link"></i>
|
||||
</a>
|
||||
</div>
|
||||
<div class="entry-body" ng-if="settingsService.settings.viewMode == 'expanded' || (isOpen && current == entry)"
|
||||
ng-mouseup="bodyClicked(entry, $event)" ng-class="{rtl: entry.rtl}">
|
||||
<div class="entry-header">
|
||||
<div class="entry-title">
|
||||
<a href="{{entry.url}}" target="_blank" rel="noreferrer" ng-bind-html="entry.title | highlight:keywords | trustHtml"></a>
|
||||
<div class="entry-subtitle">
|
||||
<span class="entry-source" ng-if="selectedType == 'category'">
|
||||
<span class="entry-source-prefix">{{ 'view.entry_source' | translate }}</span>
|
||||
<a ng-click="goToFeed(entry.feedId)" class="pointer bidi-embed">
|
||||
<span>{{entry.feedName}}</span>
|
||||
</a>
|
||||
</span>
|
||||
<span class="entry-author" ng-if="entry.author">
|
||||
<span class="entry-author-prefix">{{ 'view.entry_author' | translate }}</span>
|
||||
<span class="entry-author-name">{{entry.author}}</span>
|
||||
</span>
|
||||
<span class="entry-categories" ng-if="entry.categories">
|
||||
<span class="entry-categories-name">({{entry.categories}})</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
infinite-scroll="loadMoreEntries()"
|
||||
infinite-scroll-disabled="busy || !settingsService.settings.readingMode"
|
||||
infinite-scroll-distance="1"
|
||||
id="feed-accordion"
|
||||
ng-class="{'expanded' : settingsService.settings.viewMode == 'expanded' }"
|
||||
>
|
||||
<div ng-show="message && errorCount > 10">{{ 'view.error_while_loading_feed' | translate }} : {{ message }}</div>
|
||||
<div
|
||||
ng-repeat="entry in entries"
|
||||
class="entry entry-font-size-{{font_size}}"
|
||||
id="entry_{{entry.id}}"
|
||||
ng-class="{unread: entry.read == false, current: current==entry, open: isOpen, closed: !isOpen }"
|
||||
>
|
||||
<div class="entry-heading" ng-swipe-right="mark(entry, !entry.read)">
|
||||
<a
|
||||
href="{{entry.url}}"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
class="entry-heading-link"
|
||||
ng-click="noop($event)"
|
||||
ng-mouseup="entryClicked(entry, $event)"
|
||||
>
|
||||
<span class="feed-name">
|
||||
<span class="star" ng-mouseup="star(entry, !entry.starred, $event)">
|
||||
<i
|
||||
ng-class="{'icon-star icon-star-yellow': entry.starred, 'icon-star-empty': !entry.starred}"
|
||||
class="pointer"
|
||||
></i>
|
||||
</span>
|
||||
<favicon url="entry.iconUrl" />
|
||||
{{entry.feedName}}
|
||||
</span>
|
||||
<span class="entry-date">{{entry.date | entryDate}}</span>
|
||||
<span
|
||||
class="entry-name"
|
||||
ng-class="{shrink: true, rtl: entry.rtl}"
|
||||
ng-bind-html="entry.title | highlight:keywords | trustHtml"
|
||||
></span>
|
||||
</a>
|
||||
<a href="{{entry.url}}" target="_blank" rel="noreferrer" class="entry-external-link" ng-click="mark(entry, true)">
|
||||
<i class="icon-external-link"></i>
|
||||
</a>
|
||||
</div>
|
||||
<div
|
||||
class="entry-body"
|
||||
ng-if="settingsService.settings.viewMode == 'expanded' || (isOpen && current == entry)"
|
||||
ng-mouseup="bodyClicked(entry, $event)"
|
||||
ng-class="{rtl: entry.rtl}"
|
||||
>
|
||||
<div class="entry-header">
|
||||
<div class="entry-title">
|
||||
<a
|
||||
href="{{entry.url}}"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
ng-bind-html="entry.title | highlight:keywords | trustHtml"
|
||||
></a>
|
||||
<div class="entry-subtitle">
|
||||
<span class="entry-source" ng-if="selectedType == 'category'">
|
||||
<span class="entry-source-prefix">{{ 'view.entry_source' | translate }}</span>
|
||||
<a ng-click="goToFeed(entry.feedId)" class="pointer bidi-embed">
|
||||
<span>{{entry.feedName}}</span>
|
||||
</a>
|
||||
</span>
|
||||
<span class="entry-author" ng-if="entry.author">
|
||||
<span class="entry-author-prefix">{{ 'view.entry_author' | translate }}</span>
|
||||
<span class="entry-author-name">{{entry.author}}</span>
|
||||
</span>
|
||||
<span class="entry-categories" ng-if="entry.categories">
|
||||
<span class="entry-categories-name">({{entry.categories}})</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="entry-body-content">
|
||||
<div ng-if="!MobileService.mobile" ng-bind-html="entry.content | iframeHttpsRewrite| highlight:keywords | trustHtml"></div>
|
||||
<div ng-if="MobileService.mobile" ng-bind-html="entry.content | iframeHttpsRewrite| highlight:keywords | appendImageTitles | trustHtml"></div>
|
||||
<div class="entry-enclosure" ng-if="entry.enclosureType && (entry.enclosureUrl && entry.content && entry.content.indexOf(entry.enclosureUrl) == -1)">
|
||||
<video controls ng-if="entry.enclosureType && entry.enclosureType.indexOf('video') == 0">
|
||||
<source ng-src="{{entry.enclosureUrl | trustUrl}}" type="{{entry.enclosureType}}" />
|
||||
</video>
|
||||
<audio controls ng-if="entry.enclosureType && entry.enclosureType.indexOf('audio') == 0">
|
||||
<source ng-src="{{entry.enclosureUrl | trustUrl}}" type="{{entry.enclosureType}}" />
|
||||
</audio>
|
||||
<div ng-if="entry.enclosureType && entry.enclosureType.indexOf('image') == 0">
|
||||
<img ng-src="{{entry.enclosureUrl | trustUrl}}" />
|
||||
</div>
|
||||
<a ng-href="{{entry.enclosureUrl | trustUrl}}" target="_blank" ng-if="entry.enclosureType" download> {{ 'global.download' | translate }} </a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="entry-buttons form-inline">
|
||||
<div class="form-group star" ng-mouseup="star(entry, !entry.starred, $event)">
|
||||
<i ng-class="{'icon-star icon-star-yellow': entry.starred, 'icon-star-empty': !entry.starred}" class="pointer"></i>
|
||||
</div>
|
||||
<div class="checkbox-inline keep-unread">
|
||||
<label ng-if="entry.markable" class="pointer">
|
||||
<input type="checkbox" ng-checked="!entry.read" ng-click="mark(entry, !entry.read)" class="mousetrap"></input>
|
||||
{{ 'view.keep_unread' | translate }}
|
||||
</label>
|
||||
</div>
|
||||
<div class="entry-body-content">
|
||||
<div
|
||||
ng-if="!MobileService.mobile"
|
||||
ng-bind-html="entry.content | iframeHttpsRewrite| highlight:keywords | trustHtml"
|
||||
></div>
|
||||
<div
|
||||
ng-if="MobileService.mobile"
|
||||
ng-bind-html="entry.content | iframeHttpsRewrite| highlight:keywords | appendImageTitles | trustHtml"
|
||||
></div>
|
||||
<div
|
||||
class="entry-enclosure"
|
||||
ng-if="entry.enclosureType && (entry.enclosureUrl && entry.content && entry.content.indexOf(entry.enclosureUrl) == -1)"
|
||||
>
|
||||
<video controls ng-if="entry.enclosureType && entry.enclosureType.indexOf('video') == 0">
|
||||
<source ng-src="{{entry.enclosureUrl | trustUrl}}" type="{{entry.enclosureType}}" />
|
||||
</video>
|
||||
<audio controls ng-if="entry.enclosureType && entry.enclosureType.indexOf('audio') == 0">
|
||||
<source ng-src="{{entry.enclosureUrl | trustUrl}}" type="{{entry.enclosureType}}" />
|
||||
</audio>
|
||||
<div ng-if="entry.enclosureType && entry.enclosureType.indexOf('image') == 0">
|
||||
<img ng-src="{{entry.enclosureUrl | trustUrl}}" />
|
||||
</div>
|
||||
<a ng-href="{{entry.enclosureUrl | trustUrl}}" target="_blank" ng-if="entry.enclosureType" download>
|
||||
{{ 'global.download' | translate }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="entry-buttons form-inline">
|
||||
<div class="form-group star" ng-mouseup="star(entry, !entry.starred, $event)">
|
||||
<i ng-class="{'icon-star icon-star-yellow': entry.starred, 'icon-star-empty': !entry.starred}" class="pointer"></i>
|
||||
</div>
|
||||
<div class="checkbox-inline keep-unread">
|
||||
<label ng-if="entry.markable" class="pointer">
|
||||
<input type="checkbox" ng-checked="!entry.read" ng-click="mark(entry, !entry.read)" class="mousetrap" />
|
||||
{{ 'view.keep_unread' | translate }}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<span class="share-buttons">
|
||||
<a href="mailto:?subject={{entry.title|escape}}&body={{entry.url|escape}}" title="E-mail" popup ng-if="settingsService.settings.email">
|
||||
<i class="icon-envelope"></i>
|
||||
</a>
|
||||
<a href="https://mail.google.com/mail/?view=cm&fs=1&tf=1&source=mailto&su={{entry.title|escape}}&body={{entry.url|escape}}"
|
||||
title="Gmail" popup ng-if="settingsService.settings.gmail">
|
||||
<i class="icon-gmail"></i>
|
||||
</a>
|
||||
<a href="http://www.facebook.com/sharer.php?u={{entry.url|escape}}" title="Facebook" popup ng-if="settingsService.settings.facebook">
|
||||
<i class="icon-facebook"></i>
|
||||
</a>
|
||||
<a href="http://twitter.com/share?text={{entry.title|escape}}&url={{entry.url|escape}}" title="Twitter" popup
|
||||
ng-if="settingsService.settings.twitter">
|
||||
<i class="icon-twitter"></i>
|
||||
</a>
|
||||
<a href="https://plus.google.com/share?url={{entry.url|escape}}" title="Google+" popup ng-if="settingsService.settings.googleplus">
|
||||
<i class="icon-google-plus"></i>
|
||||
</a>
|
||||
<a href="http://www.tumblr.com/share/link?url={{entry.url|escape}}&name={{entry.title|escape}}" title="Tumblr" popup
|
||||
ng-if="settingsService.settings.tumblr">
|
||||
<i class="icon-tumblr"></i>
|
||||
</a>
|
||||
<a href="https://getpocket.com/save?url={{entry.url|escape}}&title={{entry.title|escape}}" title="Pocket" popup
|
||||
ng-if="settingsService.settings.pocket">
|
||||
<i class="icon-pocket"></i>
|
||||
</a>
|
||||
<a href="https://www.instapaper.com/hello2?url={{entry.url|escape}}&title={{entry.title|escape}}" title="Instapaper" popup
|
||||
ng-if="settingsService.settings.instapaper">
|
||||
<i class="icon-instapaper"></i>
|
||||
</a>
|
||||
<a href="https://bufferapp.com/add?url={{entry.url|escape}}&text={{entry.title|escape}}" title="Buffer" popup
|
||||
ng-if="settingsService.settings.buffer">
|
||||
<i class="icon-buffer"></i>
|
||||
</a>
|
||||
<a href="http://www.readability.com/save?url={{entry.url|escape}}" title="Readability" popup
|
||||
ng-if="settingsService.settings.readability">
|
||||
<i class="icon-couch"></i>
|
||||
</a>
|
||||
</span>
|
||||
<span class="share-buttons">
|
||||
<a
|
||||
href="mailto:?subject={{entry.title|escape}}&body={{entry.url|escape}}"
|
||||
title="E-mail"
|
||||
popup
|
||||
ng-if="settingsService.settings.email"
|
||||
>
|
||||
<i class="icon-envelope"></i>
|
||||
</a>
|
||||
<a
|
||||
href="https://mail.google.com/mail/?view=cm&fs=1&tf=1&source=mailto&su={{entry.title|escape}}&body={{entry.url|escape}}"
|
||||
title="Gmail"
|
||||
popup
|
||||
ng-if="settingsService.settings.gmail"
|
||||
>
|
||||
<i class="icon-gmail"></i>
|
||||
</a>
|
||||
<a
|
||||
href="http://www.facebook.com/sharer.php?u={{entry.url|escape}}"
|
||||
title="Facebook"
|
||||
popup
|
||||
ng-if="settingsService.settings.facebook"
|
||||
>
|
||||
<i class="icon-facebook"></i>
|
||||
</a>
|
||||
<a
|
||||
href="http://twitter.com/share?text={{entry.title|escape}}&url={{entry.url|escape}}"
|
||||
title="Twitter"
|
||||
popup
|
||||
ng-if="settingsService.settings.twitter"
|
||||
>
|
||||
<i class="icon-twitter"></i>
|
||||
</a>
|
||||
<a
|
||||
href="https://plus.google.com/share?url={{entry.url|escape}}"
|
||||
title="Google+"
|
||||
popup
|
||||
ng-if="settingsService.settings.googleplus"
|
||||
>
|
||||
<i class="icon-google-plus"></i>
|
||||
</a>
|
||||
<a
|
||||
href="http://www.tumblr.com/share/link?url={{entry.url|escape}}&name={{entry.title|escape}}"
|
||||
title="Tumblr"
|
||||
popup
|
||||
ng-if="settingsService.settings.tumblr"
|
||||
>
|
||||
<i class="icon-tumblr"></i>
|
||||
</a>
|
||||
<a
|
||||
href="https://getpocket.com/save?url={{entry.url|escape}}&title={{entry.title|escape}}"
|
||||
title="Pocket"
|
||||
popup
|
||||
ng-if="settingsService.settings.pocket"
|
||||
>
|
||||
<i class="icon-pocket"></i>
|
||||
</a>
|
||||
<a
|
||||
href="https://www.instapaper.com/hello2?url={{entry.url|escape}}&title={{entry.title|escape}}"
|
||||
title="Instapaper"
|
||||
popup
|
||||
ng-if="settingsService.settings.instapaper"
|
||||
>
|
||||
<i class="icon-instapaper"></i>
|
||||
</a>
|
||||
<a
|
||||
href="https://bufferapp.com/add?url={{entry.url|escape}}&text={{entry.title|escape}}"
|
||||
title="Buffer"
|
||||
popup
|
||||
ng-if="settingsService.settings.buffer"
|
||||
>
|
||||
<i class="icon-buffer"></i>
|
||||
</a>
|
||||
<a
|
||||
href="http://www.readability.com/save?url={{entry.url|escape}}"
|
||||
title="Readability"
|
||||
popup
|
||||
ng-if="settingsService.settings.readability"
|
||||
>
|
||||
<i class="icon-couch"></i>
|
||||
</a>
|
||||
</span>
|
||||
|
||||
<span class="tags-panel">
|
||||
<tags entry="entry"></tags>
|
||||
</span>
|
||||
<a ng-click="markUpTo(entry)" class="mark-up-to" title="{{ 'view.mark_up_to_here' | translate }}">
|
||||
<i class="icon-step-forward icon-rotate-90"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="no-entries" ng-show="name && entries.length == 0 && !busy">
|
||||
<span ng-show="keywords">{{ 'view.no_search_results' | translate }}</span>
|
||||
<span ng-hide="keywords">"{{name}}" {{ 'view.no_unread_items' | translate }}</span>
|
||||
</div>
|
||||
<div modal="shortcutsModal" close="shortcutsModal=false" options="shortcutsOpts">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" ng-click="shortcutsModal=false">×</button>
|
||||
<h4>{{ 'about.keyboard_shortcuts' | translate }}</h4>
|
||||
</div>
|
||||
<div class="modal-body" ng-include="'templates/_shortcuts.html'"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="height: 30px" ng-if="settingsService.settings.viewMode != 'expanded' && entries.length != 0"></div>
|
||||
<div style="height: 1000px" ng-if="settingsService.settings.viewMode == 'expanded' && entries.length != 0"></div>
|
||||
<span class="tags-panel">
|
||||
<tags entry="entry"></tags>
|
||||
</span>
|
||||
<a ng-click="markUpTo(entry)" class="mark-up-to" title="{{ 'view.mark_up_to_here' | translate }}">
|
||||
<i class="icon-step-forward icon-rotate-90"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="no-entries" ng-show="name && entries.length == 0 && !busy">
|
||||
<span ng-show="keywords">{{ 'view.no_search_results' | translate }}</span>
|
||||
<span ng-hide="keywords">"{{name}}" {{ 'view.no_unread_items' | translate }}</span>
|
||||
</div>
|
||||
<div modal="shortcutsModal" close="shortcutsModal=false" options="shortcutsOpts">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" ng-click="shortcutsModal=false">×</button>
|
||||
<h4>{{ 'about.keyboard_shortcuts' | translate }}</h4>
|
||||
</div>
|
||||
<div class="modal-body" ng-include="'templates/_shortcuts.html'"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="height: 30px" ng-if="settingsService.settings.viewMode != 'expanded' && entries.length != 0"></div>
|
||||
<div style="height: 1000px" ng-if="settingsService.settings.viewMode == 'expanded' && entries.length != 0"></div>
|
||||
</div>
|
||||
|
||||
@@ -1,66 +1,90 @@
|
||||
<div class="profile">
|
||||
<div class="page-header">
|
||||
<h1>{{ 'toolbar.profile' | translate }}</h1>
|
||||
</div>
|
||||
<form name="profileForm" ng-submit="save()" class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="email">{{ 'profile.user_name' | translate }}</label>
|
||||
<div class="col-sm-10 checkbox">
|
||||
<span>{{user.name}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="email">{{ 'profile.email' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" id="email" ng-model="user.email" class="form-control" autocomplete="off" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="password">{{ 'profile.change_password' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" name="password" id="password" ng-model="user.password" class="form-control" ng-minlength="6" autocomplete="off" />
|
||||
<span class="help-inline" ng-show="profileForm.password.$error.minlength">{{ 'profile.minimum_6_chars' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="password">{{ 'profile.confirm_password' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="password_c" id="password_c" ng-model="password_c"
|
||||
ui-validate="'$value==user.password'" ui-validate-watch="'user.password'" autocomplete="off">
|
||||
<span class="help-inline" ng-show="profileForm.password_c.$error.validator">{{ 'profile.passwords_do_not_match' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="page-header">
|
||||
<h1>{{ 'toolbar.profile' | translate }}</h1>
|
||||
</div>
|
||||
<form name="profileForm" ng-submit="save()" class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="email">{{ 'profile.user_name' | translate }}</label>
|
||||
<div class="col-sm-10 checkbox">
|
||||
<span>{{user.name}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="email">{{ 'profile.email' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" id="email" ng-model="user.email" class="form-control" autocomplete="off" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="password">{{ 'profile.change_password' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input
|
||||
type="password"
|
||||
name="password"
|
||||
id="password"
|
||||
ng-model="user.password"
|
||||
class="form-control"
|
||||
ng-minlength="6"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<span class="help-inline" ng-show="profileForm.password.$error.minlength">{{ 'profile.minimum_6_chars' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="password">{{ 'profile.confirm_password' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<input
|
||||
type="password"
|
||||
class="form-control"
|
||||
name="password_c"
|
||||
id="password_c"
|
||||
ng-model="password_c"
|
||||
ui-validate="'$value==user.password'"
|
||||
ui-validate-watch="'user.password'"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<span class="help-inline" ng-show="profileForm.password_c.$error.validator"
|
||||
>{{ 'profile.passwords_do_not_match' | translate }}</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="password">{{ 'profile.api_key' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<pre ng-show="user.apiKey">{{user.apiKey}}</pre>
|
||||
<span class="help-block" ng-show="!user.apiKey">{{ 'profile.api_key_not_generated' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="password">{{ 'profile.generate_new_api_key' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="newApiKey" id="newApiKey" ng-model="newApiKey">
|
||||
<span class="help-inline">{{ 'profile.generate_new_api_key_info' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="password">{{ 'profile.opml_export' | translate }}</label>
|
||||
<div class="col-sm-10 checkbox">
|
||||
<a href="rest/feed/export" download="commafeed_opml.xml">{{ 'global.download' | translate }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="password">{{ 'profile.api_key' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<pre ng-show="user.apiKey">{{user.apiKey}}</pre>
|
||||
<span class="help-block" ng-show="!user.apiKey">{{ 'profile.api_key_not_generated' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="password">{{ 'profile.generate_new_api_key' | translate }}</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="newApiKey" id="newApiKey" ng-model="newApiKey" />
|
||||
<span class="help-inline">{{ 'profile.generate_new_api_key_info' | translate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" for="password">{{ 'profile.opml_export' | translate }}</label>
|
||||
<div class="col-sm-10 checkbox">
|
||||
<a href="rest/feed/export" download="commafeed_opml.xml">{{ 'global.download' | translate }}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary">{{ 'global.save' | translate }}</button>
|
||||
<button type="button" class="btn btn-danger" ng-click="deleteAccount()"
|
||||
confirm-click="'profile.delete_account_confirmation' | translate">{{ 'profile.delete_account' | translate }}</button>
|
||||
<button type="button" class="btn btn-default" ng-click="cancel()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary">{{ 'global.save' | translate }}</button>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-danger"
|
||||
ng-click="deleteAccount()"
|
||||
confirm-click="'profile.delete_account_confirmation' | translate"
|
||||
>
|
||||
{{ 'profile.delete_account' | translate }}
|
||||
</button>
|
||||
<button type="button" class="btn btn-default" ng-click="cancel()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -1,145 +1,151 @@
|
||||
<div class="settings">
|
||||
<div class="page-header">
|
||||
<h1>{{ 'toolbar.settings' | translate }}</h1>
|
||||
</div>
|
||||
<form name="settingsForm" ng-submit="save()">
|
||||
<div class="row">
|
||||
<div class="col-md-2">
|
||||
<ul class="nav nav-pills nav-stacked">
|
||||
<li ng-class="{active: !tab || tab == 'general'}" class="pointer">
|
||||
<a ng-click="tab = 'general'">{{ 'settings.general.value' | translate }}</a>
|
||||
</li>
|
||||
<li ng-class="{active: tab == 'css'}" class="pointer">
|
||||
<a ng-click="tab = 'css'">{{ 'settings.appearance' | translate }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane" ng-class="{active: !tab || tab == 'general'}">
|
||||
<div class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<label>{{ 'settings.general.language' | translate }}</label>
|
||||
<select name="language" ng-model="settings.language" class="form-control"
|
||||
ng-options="id as label for (id,label) in langs" required>
|
||||
</select>
|
||||
<span class="help-block">
|
||||
<a href="https://github.com/Athou/commafeed#translate-commafeed-into-your-language" target="_blank">
|
||||
{{ 'settings.general.language_contribute' | translate }} </a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="showRead" ng-model="settings.showRead" />
|
||||
{{ 'settings.general.show_unread' | translate }}
|
||||
</label>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="scrollMarks" ng-model="settings.scrollMarks" />
|
||||
{{ 'settings.general.scroll_marks' | translate }}
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<h4>{{ 'settings.general.social_buttons' | translate }}</h4>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="email" ng-model="settings.email" />
|
||||
<i class="icon-envelope"></i>
|
||||
E-Mail
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="gmail" ng-model="settings.gmail" />
|
||||
<i class="icon-gmail"></i>
|
||||
GMail
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="facebook" ng-model="settings.facebook" />
|
||||
<i class="icon-facebook"></i>
|
||||
Facebook
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="twitter" ng-model="settings.twitter" />
|
||||
<i class="icon-twitter"></i>
|
||||
Twitter
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="googleplus" ng-model="settings.googleplus" />
|
||||
<i class="icon-google-plus"></i>
|
||||
Google+
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="tumblr" ng-model="settings.tumblr" />
|
||||
<i class="icon-tumblr"></i>
|
||||
Tumblr
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="pocket" ng-model="settings.pocket" />
|
||||
<i class="icon-pocket"></i>
|
||||
Pocket
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="instapaper" ng-model="settings.instapaper" />
|
||||
<i class="icon-instapaper"></i>
|
||||
Instapaper
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="buffer" ng-model="settings.buffer" />
|
||||
<i class="icon-buffer"></i>
|
||||
Buffer
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="readability" ng-model="settings.readability" />
|
||||
<i class="icon-couch"></i>
|
||||
Readability
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane" ng-class="{active: tab == 'css'}">
|
||||
<div class="form-group">
|
||||
<label>{{ 'settings.scroll_speed' | translate }}</label>
|
||||
<input type="number" ng-model="settings.scrollSpeed" min="0" max="1000" class="form-control" />
|
||||
<span class="help-inline">{{ 'settings.scroll_speed_help' | translate }}</span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>{{ 'settings.theme' | translate }}</label>
|
||||
<select ng-model="settings.theme" ng-options="theme for theme in themes" class="form-control"></select>
|
||||
<span class="help-block">
|
||||
<a href="https://github.com/Athou/commafeed#themes" target="_blank"> {{ 'settings.submit_your_theme' | translate }} </a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>{{ 'settings.custom_css' | translate }}</label>
|
||||
<textarea ng-model="settings.customCss" class="form-control" rows="20">
|
||||
</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary">{{ 'global.save' | translate }}</button>
|
||||
<button type="button" class="btn btn-default" ng-click="cancel()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="page-header">
|
||||
<h1>{{ 'toolbar.settings' | translate }}</h1>
|
||||
</div>
|
||||
<form name="settingsForm" ng-submit="save()">
|
||||
<div class="row">
|
||||
<div class="col-md-2">
|
||||
<ul class="nav nav-pills nav-stacked">
|
||||
<li ng-class="{active: !tab || tab == 'general'}" class="pointer">
|
||||
<a ng-click="tab = 'general'">{{ 'settings.general.value' | translate }}</a>
|
||||
</li>
|
||||
<li ng-class="{active: tab == 'css'}" class="pointer">
|
||||
<a ng-click="tab = 'css'">{{ 'settings.appearance' | translate }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane" ng-class="{active: !tab || tab == 'general'}">
|
||||
<div class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<label>{{ 'settings.general.language' | translate }}</label>
|
||||
<select
|
||||
name="language"
|
||||
ng-model="settings.language"
|
||||
class="form-control"
|
||||
ng-options="id as label for (id,label) in langs"
|
||||
required
|
||||
></select>
|
||||
<span class="help-block">
|
||||
<a href="https://github.com/Athou/commafeed#translate-commafeed-into-your-language" target="_blank">
|
||||
{{ 'settings.general.language_contribute' | translate }}
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="showRead" ng-model="settings.showRead" />
|
||||
{{ 'settings.general.show_unread' | translate }}
|
||||
</label>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="scrollMarks" ng-model="settings.scrollMarks" />
|
||||
{{ 'settings.general.scroll_marks' | translate }}
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<h4>{{ 'settings.general.social_buttons' | translate }}</h4>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="email" ng-model="settings.email" />
|
||||
<i class="icon-envelope"></i>
|
||||
E-Mail
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="gmail" ng-model="settings.gmail" />
|
||||
<i class="icon-gmail"></i>
|
||||
GMail
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="facebook" ng-model="settings.facebook" />
|
||||
<i class="icon-facebook"></i>
|
||||
Facebook
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="twitter" ng-model="settings.twitter" />
|
||||
<i class="icon-twitter"></i>
|
||||
Twitter
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="googleplus" ng-model="settings.googleplus" />
|
||||
<i class="icon-google-plus"></i>
|
||||
Google+
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="tumblr" ng-model="settings.tumblr" />
|
||||
<i class="icon-tumblr"></i>
|
||||
Tumblr
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="pocket" ng-model="settings.pocket" />
|
||||
<i class="icon-pocket"></i>
|
||||
Pocket
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="instapaper" ng-model="settings.instapaper" />
|
||||
<i class="icon-instapaper"></i>
|
||||
Instapaper
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="buffer" ng-model="settings.buffer" />
|
||||
<i class="icon-buffer"></i>
|
||||
Buffer
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" name="readability" ng-model="settings.readability" />
|
||||
<i class="icon-couch"></i>
|
||||
Readability
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane" ng-class="{active: tab == 'css'}">
|
||||
<div class="form-group">
|
||||
<label>{{ 'settings.scroll_speed' | translate }}</label>
|
||||
<input type="number" ng-model="settings.scrollSpeed" min="0" max="1000" class="form-control" />
|
||||
<span class="help-inline">{{ 'settings.scroll_speed_help' | translate }}</span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>{{ 'settings.theme' | translate }}</label>
|
||||
<select ng-model="settings.theme" ng-options="theme for theme in themes" class="form-control"></select>
|
||||
<span class="help-block">
|
||||
<a href="https://github.com/Athou/commafeed#themes" target="_blank">
|
||||
{{ 'settings.submit_your_theme' | translate }}
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>{{ 'settings.custom_css' | translate }}</label>
|
||||
<textarea ng-model="settings.customCss" class="form-control" rows="20"> </textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary">{{ 'global.save' | translate }}</button>
|
||||
<button type="button" class="btn btn-default" ng-click="cancel()">{{ 'global.cancel' | translate }}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -1,111 +1,115 @@
|
||||
<div class="container welcome">
|
||||
<div class="row header" ng-controller="LoginCtrl">
|
||||
<div class="pull-left">
|
||||
<a>
|
||||
<img src="images/logo_2.png"></img>
|
||||
</a>
|
||||
</div>
|
||||
<div class="pull-right tagline">Bloat-free feed reader</div>
|
||||
<div class="text-center clear-both">
|
||||
<img src="images/preview.jpg" class="preview" />
|
||||
<a href="" ng-click="demoLogin()" class="demo">
|
||||
Try out the demo
|
||||
<br />
|
||||
<small>(some features are disabled)</small>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6" ng-controller="LoginCtrl">
|
||||
<div class="well" id="login-panel" ng-if="!recovery">
|
||||
<h3>Login</h3>
|
||||
<div class="feedback alert alert-danger" ng-if="message">{{message}}</div>
|
||||
<form ng-submit="login()">
|
||||
<div class="form-group">
|
||||
<label for="username">User Name or E-mail</label>
|
||||
<input type="text" name="username" class="form-control" ng-model="model.name"></input>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password">Password</label>
|
||||
<input type="password" name="password" class="form-control" ng-model="model.password"></input>
|
||||
</div>
|
||||
<div>
|
||||
<input type="submit" class="btn btn-primary" value="Log in" />
|
||||
<a href="" class="pull-right" ng-click="toggleRecovery()" ng-if="recovery_enabled">Forgot password?</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="well" id="recovery-panel" ng-if="recovery">
|
||||
<h3>Password Recovery</h3>
|
||||
<div class="feedback alert alert-danger" ng-if="recovery_message">{{recovery_message}}</div>
|
||||
<form ng-submit="recover()">
|
||||
<div class="form-group">
|
||||
<label for="email">Email</label>
|
||||
<input type="email" name="email" class="form-control" ng-model="recovery_model.email" focus="true"></input>
|
||||
</div>
|
||||
<div>
|
||||
<input type="submit" class="btn btn-primary" value="Recover" />
|
||||
<input type="button" class="btn" value="Cancel" ng-click="toggleRecovery()" />
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6" ng-controller="RegisterCtrl">
|
||||
<div ng-if="ServerService.allowRegistrations">
|
||||
<div class="well" id="register-panel">
|
||||
<h3>Register</h3>
|
||||
<div ng-repeat="message in messages">{{message}}</div>
|
||||
<form autocomplete="off" ng-submit="register()">
|
||||
<div class="form-group">
|
||||
<label>User Name</label>
|
||||
<input type="text" class="form-control" ng-model="model.name"></input>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Password</label>
|
||||
<input type="password" class="form-control" ng-model="model.password"></input>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Email address (used for password recovery only)</label>
|
||||
<input type="email" class="form-control" ng-model="model.email"></input>
|
||||
</div>
|
||||
<div>
|
||||
<input type="submit" class="btn btn-primary" value="Register" />
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row header" ng-controller="LoginCtrl">
|
||||
<div class="pull-left">
|
||||
<a>
|
||||
<img src="images/logo_2.png" />
|
||||
</a>
|
||||
</div>
|
||||
<div class="pull-right tagline">Bloat-free feed reader</div>
|
||||
<div class="text-center clear-both">
|
||||
<img src="images/preview.jpg" class="preview" />
|
||||
<a href="" ng-click="demoLogin()" class="demo">
|
||||
Try out the demo
|
||||
<br />
|
||||
<small>(some features are disabled)</small>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6" ng-controller="LoginCtrl">
|
||||
<div class="well" id="login-panel" ng-if="!recovery">
|
||||
<h3>Login</h3>
|
||||
<div class="feedback alert alert-danger" ng-if="message">{{message}}</div>
|
||||
<form ng-submit="login()">
|
||||
<div class="form-group">
|
||||
<label for="username">User Name or E-mail</label>
|
||||
<input type="text" name="username" class="form-control" ng-model="model.name" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password">Password</label>
|
||||
<input type="password" name="password" class="form-control" ng-model="model.password" />
|
||||
</div>
|
||||
<div>
|
||||
<input type="submit" class="btn btn-primary" value="Log in" />
|
||||
<a href="" class="pull-right" ng-click="toggleRecovery()" ng-if="recovery_enabled">Forgot password?</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="well" id="recovery-panel" ng-if="recovery">
|
||||
<h3>Password Recovery</h3>
|
||||
<div class="feedback alert alert-danger" ng-if="recovery_message">{{recovery_message}}</div>
|
||||
<form ng-submit="recover()">
|
||||
<div class="form-group">
|
||||
<label for="email">Email</label>
|
||||
<input type="email" name="email" class="form-control" ng-model="recovery_model.email" focus="true" />
|
||||
</div>
|
||||
<div>
|
||||
<input type="submit" class="btn btn-primary" value="Recover" />
|
||||
<input type="button" class="btn" value="Cancel" ng-click="toggleRecovery()" />
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6" ng-controller="RegisterCtrl">
|
||||
<div ng-if="ServerService.allowRegistrations">
|
||||
<div class="well" id="register-panel">
|
||||
<h3>Register</h3>
|
||||
<div ng-repeat="message in messages">{{message}}</div>
|
||||
<form autocomplete="off" ng-submit="register()">
|
||||
<div class="form-group">
|
||||
<label>User Name</label>
|
||||
<input type="text" class="form-control" ng-model="model.name" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Password</label>
|
||||
<input type="password" class="form-control" ng-model="model.password" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Email address (used for password recovery only)</label>
|
||||
<input type="email" class="form-control" ng-model="model.email" />
|
||||
</div>
|
||||
<div>
|
||||
<input type="submit" class="btn btn-primary" value="Register" />
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
<div class="footer">
|
||||
<div class="row">
|
||||
<span>
|
||||
©
|
||||
<a href="http://www.commafeed.com" target="_blank">CommaFeed</a>
|
||||
</span>
|
||||
<span>
|
||||
- Sources on
|
||||
<a href="https://github.com/Athou/commafeed" target="_blank">GitHub</a>
|
||||
</span>
|
||||
<span>
|
||||
- REST API
|
||||
<a href="api/" target="_blank">documentation</a>
|
||||
</span>
|
||||
<span class="pull-right">
|
||||
<a href="https://twitter.com/CommaFeed" class="twitter-follow-button" data-show-count="false" data-size="large">Follow @CommaFeed</a>
|
||||
<script>
|
||||
!function(d, s, id) {
|
||||
var js, fjs = d.getElementsByTagName(s)[0], p = /^http:/.test(d.location) ? 'http' : 'https';
|
||||
if (!d.getElementById(id)) {
|
||||
js = d.createElement(s);
|
||||
js.id = id;
|
||||
js.src = p + '://platform.twitter.com/widgets.js';
|
||||
fjs.parentNode.insertBefore(js, fjs);
|
||||
}
|
||||
}(document, 'script', 'twitter-wjs');
|
||||
</script>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="footer">
|
||||
<div class="row">
|
||||
<span>
|
||||
©
|
||||
<a href="http://www.commafeed.com" target="_blank">CommaFeed</a>
|
||||
</span>
|
||||
<span>
|
||||
- Sources on
|
||||
<a href="https://github.com/Athou/commafeed" target="_blank">GitHub</a>
|
||||
</span>
|
||||
<span>
|
||||
- REST API
|
||||
<a href="api/" target="_blank">documentation</a>
|
||||
</span>
|
||||
<span class="pull-right">
|
||||
<a href="https://twitter.com/CommaFeed" class="twitter-follow-button" data-show-count="false" data-size="large"
|
||||
>Follow @CommaFeed</a
|
||||
>
|
||||
<script>
|
||||
!(function (d, s, id) {
|
||||
var js,
|
||||
fjs = d.getElementsByTagName(s)[0],
|
||||
p = /^http:/.test(d.location) ? "http" : "https"
|
||||
if (!d.getElementById(id)) {
|
||||
js = d.createElement(s)
|
||||
js.id = id
|
||||
js.src = p + "://platform.twitter.com/widgets.js"
|
||||
fjs.parentNode.insertBefore(js, fjs)
|
||||
}
|
||||
})(document, "script", "twitter-wjs")
|
||||
</script>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user