diff --git a/public/css/externe/toastr.min.css b/public/css/externe/toastr.min.css
new file mode 100644
index 0000000..d109d13
--- /dev/null
+++ b/public/css/externe/toastr.min.css
@@ -0,0 +1 @@
+.toast-title{font-weight:700}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#fff}.toast-message a:hover{color:#ccc;text-decoration:none}.toast-close-button{position:relative;right:-.3em;top:-.3em;float:right;font-size:20px;font-weight:700;color:#fff;-webkit-text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 #fff;opacity:.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80)}.toast-close-button:focus,.toast-close-button:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}button.toast-close-button{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.toast-top-center{top:0;right:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{top:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{position:fixed;z-index:999999;pointer-events:none}#toast-container *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container>div{position:relative;pointer-events:auto;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-position:15px center;background-repeat:no-repeat;-moz-box-shadow:0 0 12px #999;-webkit-box-shadow:0 0 12px #999;box-shadow:0 0 12px #999;color:#fff;opacity:.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80)}#toast-container>:hover{-moz-box-shadow:0 0 12px #000;-webkit-box-shadow:0 0 12px #000;box-shadow:0 0 12px #000;opacity:1;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);filter:alpha(opacity=100);cursor:pointer}#toast-container>.toast-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=)!important}#toast-container>.toast-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=)!important}#toast-container>.toast-success{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==)!important}#toast-container>.toast-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=)!important}#toast-container.toast-bottom-center>div,#toast-container.toast-top-center>div{width:300px;margin-left:auto;margin-right:auto}#toast-container.toast-bottom-full-width>div,#toast-container.toast-top-full-width>div{width:96%;margin-left:auto;margin-right:auto}.toast{background-color:#030303}.toast-success{background-color:#51a351}.toast-error{background-color:#bd362f}.toast-info{background-color:#2f96b4}.toast-warning{background-color:#f89406}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}@media all and (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}}
\ No newline at end of file
diff --git a/public/css/style.css b/public/css/style.css
index ec83843..4430de0 100644
--- a/public/css/style.css
+++ b/public/css/style.css
@@ -53,3 +53,12 @@ body {
.js-navigate-bookmark a{
color:#212121;
}
+
+.ui.menu .selected.item {
+ background: rgba(1, 1, 1, 0.05);
+}
+
+img.operator{
+ width:16px;
+ height:16px
+}
diff --git a/public/images/detail-hover.png b/public/images/detail-hover.png
new file mode 100644
index 0000000..f23ae1f
Binary files /dev/null and b/public/images/detail-hover.png differ
diff --git a/public/images/detail.png b/public/images/detail.png
new file mode 100644
index 0000000..d3ab7f8
Binary files /dev/null and b/public/images/detail.png differ
diff --git a/public/index.html b/public/index.html
index 6940e5c..3ad8e2c 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,47 +1,47 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
我的书签
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/scripts/app-angular.js b/public/scripts/app-angular.js
index 50054eb..f63b5e2 100644
--- a/public/scripts/app-angular.js
+++ b/public/scripts/app-angular.js
@@ -1,6 +1,7 @@
var app = angular.module('bookmarkApp', ['ui.router']);
-app.config(function($stateProvider, $urlRouterProvider) {
+app.config(function($stateProvider, $urlRouterProvider, $httpProvider) {
+ $httpProvider.interceptors.push('httpInterceptor');
$urlRouterProvider.otherwise("/");
@@ -11,7 +12,7 @@ app.config(function($stateProvider, $urlRouterProvider) {
params: {
foo: null,
bar: null,
- showStyle: 'table',
+ showStyle: 'navigate',
},
controller: 'bookmarksCtr'
})
@@ -48,7 +49,3 @@ app.config(function($stateProvider, $urlRouterProvider) {
controller: 'homeCtr'
});
});
-
-app.config(function ($httpProvider) {
- $httpProvider.interceptors.push('TokenInterceptor');
-});
diff --git a/public/scripts/controllers/bookmarks-controller.js b/public/scripts/controllers/bookmarks-controller.js
index 4b5f992..45b52fb 100644
--- a/public/scripts/controllers/bookmarks-controller.js
+++ b/public/scripts/controllers/bookmarks-controller.js
@@ -1,56 +1,57 @@
-app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '$window', 'bookmarkService', 'pubSubService', function($scope, $state, $stateParams, $filter, $window, bookmarkService, pubSubService) {
+app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '$window', '$timeout', 'bookmarkService', 'pubSubService', function($scope, $state, $stateParams, $filter, $window, $timeout, bookmarkService, pubSubService) {
console.log("Hello bookmarksCtr...", $stateParams);
$scope.bookmarks = []; // 书签数据
- $scope.showSearch = false; // 书签数据
+ $scope.showSearch = false; // 搜索对话框
$scope.bookmarkNormalHover = false;
$scope.bookmarkEditHover = false;
$scope.showStyle = 'navigate'; // 显示风格'navigate', 'card', 'table'
$scope.edit = false;
- semanticInit();
-
var params = {
- show: $scope.showStyle,
+ showStyle: $scope.showStyle,
}
+ getBookmarks(params);
$scope.jumpToUrl = function(url, id) {
- if(!$scope.edit){
+ if (!$scope.edit) {
$window.open(url, '_blank');
bookmarkService.clickBookmark({
id: id
});
}
}
- $scope.toggleMode = function(){
- console.log('toggleMode..........');
+ $scope.toggleMode = function() {
$scope.edit = !$scope.edit
};
- $scope.delBookmark = function(bookmarkId){
- var params = {
- id:bookmarkId
- }
- bookmarkService.delBookmark(params).then(
- function(data) {
- console.log(data);
- $("#"+bookmarkId).remove();
- },
- function(data) {
- console.log(data);
- }
- );
+ $scope.delBookmark = function(bookmarkId) {
+ var params = {
+ id: bookmarkId
+ }
+ bookmarkService.delBookmark(params)
+ .then((data) => $("#" + bookmarkId).remove())
+ .catch((err) => {
+ console.log('delBookmark err ', err)
+ });
}
- $scope.editBookmark = function(bookmarkId){
+ $scope.editBookmark = function(bookmarkId) {
pubSubService.publish('bookmarksCtr.editBookmark', {
'bookmarkId': bookmarkId
});
}
- getBookmarks(params);
- pubSubService.subscribe('MenuCtr.bookmarks', $scope, function(event, params) {
- console.log('subscribe MenuCtr.bookmarks', params);
+ $scope.detailBookmark = function(bookmarkId) {
+
+ }
+
+ pubSubService.subscribe('MenuCtr.searchDetail', $scope, function(event, params) {
+ $scope.showSearch = (params && params.showSearch)
+ });
+ pubSubService.subscribe('MenuCtr.updateShowStyle', $scope, function(event, params) {
+ $scope.showStyle = (params && params.showStyle);
getBookmarks(params);
});
+
pubSubService.subscribe('MenuCtr.searchBookmarks', $scope, function(event, params) {
console.log('subscribe MenuCtr.searchBookmarks', params);
getBookmarks(params);
@@ -62,52 +63,44 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '
});
function getBookmarks(params) {
- bookmarkService.getBookmarks(params).then(
- function(data) {
+ bookmarkService.getBookmarks(params)
+ .then((data) => {
$scope.bookmarks = data;
- pubSubService.publish('loginCtr.login', {
- 'login': true,
+ pubSubService.publish('Common.menuActive', {
+ login: true,
+ index: 0
});
- },
- function(data) {
- console.log(data);
- $state.go('/');
- pubSubService.publish('loginCtr.login', {
- 'login': false,
- });
- }
- );
+ })
+ .catch((err) => console.log('getBookmarks err', err));
}
- function semanticInit() {
- setTimeout(() => {
- $('.ui.dropdown').dropdown();
- $('.ui.calendar.js-date-begin').calendar({
- type: 'date',
- formatter: {
- date: function(date, settings) {
- if (!date) return '';
- var day = date.getDate();
- var month = date.getMonth() + 1;
- var year = date.getFullYear();
- return year + '/' + month + '/' + day;
- }
- },
- endCalendar: $('.ui.calendar.js-date-end')
- });
- $('.ui.calendar.js-date-end').calendar({
- type: 'date',
- formatter: {
- date: function(date, settings) {
- if (!date) return '';
- var day = date.getDate();
- var month = date.getMonth() + 1;
- var year = date.getFullYear();
- return year + '/' + month + '/' + day;
- }
- },
- startCalendar: $('.ui.calendar.js-date-begin')
- });
- }, 100);
- }
+ $scope.$on('elementRenderFinished', function(elementRenderFinishedEvent) {
+ $('.ui.dropdown').dropdown();
+ $('.ui.calendar.js-date-begin').calendar({
+ type: 'date',
+ formatter: {
+ date: function(date, settings) {
+ if (!date) return '';
+ var day = date.getDate();
+ var month = date.getMonth() + 1;
+ var year = date.getFullYear();
+ return year + '/' + month + '/' + day;
+ }
+ },
+ endCalendar: $('.ui.calendar.js-date-end')
+ });
+ $('.ui.calendar.js-date-end').calendar({
+ type: 'date',
+ formatter: {
+ date: function(date, settings) {
+ if (!date) return '';
+ var day = date.getDate();
+ var month = date.getMonth() + 1;
+ var year = date.getFullYear();
+ return year + '/' + month + '/' + day;
+ }
+ },
+ startCalendar: $('.ui.calendar.js-date-begin')
+ });
+ });
}]);
diff --git a/public/scripts/controllers/edit-controller.js b/public/scripts/controllers/edit-controller.js
index 773da97..e3292de 100644
--- a/public/scripts/controllers/edit-controller.js
+++ b/public/scripts/controllers/edit-controller.js
@@ -1,8 +1,7 @@
app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'pubSubService', function($scope, $state, $timeout, bookmarkService, pubSubService) {
+ console.log("Hello editCtr");
var maxSelections = 3;
- console.log("Hello , editCtr...");
init();
- semanticInit();
$scope.$watch('url', function(newUrl, oldUrl, scope) {
$timeout(function() {
@@ -14,13 +13,9 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
var params = {
url: newUrl,
}
- bookmarkService.getTitle(params).then(
- function(data) {
- console.log(JSON.stringify(data));
- $scope.title = data.title;
- },
- function(errorMsg) {}
- );
+ bookmarkService.getTitle(params)
+ .then((data) => $scope.title = data.title)
+ .catch((err) => console.log('getTitle err', err))
}
}
});
@@ -46,16 +41,15 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
}
});
- bookmarkService.addTags(params).then(
- function(data) {
+ bookmarkService.addTags(params)
+ .then((data) => {
$scope.tags = data;
- console.log(JSON.stringify(data));
- $timeout(function() {
+ $timeout(() => {
+ // 将新增加的分类自动添加到下啦列表中
var count = 0;
- params.forEach(function(tagName) {
- data.forEach(function(tag) {
+ params.forEach((tagName) => {
+ data.forEach((tag) => {
if (tagName == tag.name) {
- console.log(tag.id);
if (count < maxSelections) {
$('.ui.fluid.search.dropdown').dropdown('set selected', tag.id);
}
@@ -64,9 +58,8 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
});
});
});
- },
- function(errorMsg) {}
- );
+ })
+ .catch((err) => console.log('addTags err', err));
}
$scope.cancel = function() {
console.log('Hello , you have click cancel btn......');
@@ -76,9 +69,8 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
init();
}
$scope.ok = function() {
- console.log('Hello , you have click ok btn......');
var selectedTags = $('.ui.modal.js-add-bookmark .ui.dropdown').dropdown('get value');
- console.log($scope.url, $scope.title, $scope.description, $scope.public, selectedTags);
+ console.log('Hello ok clicked', $scope.url, $scope.title, $scope.description, $scope.public, selectedTags);
$scope.urlError = $scope.url == '';
$scope.titleError = $scope.title == '';
$scope.tagsError = (selectedTags.length == 0 || selectedTags.length > maxSelections);
@@ -91,40 +83,19 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
description: $scope.description
}
if ($scope.add) {
- bookmarkService.addBookmark(params).then(
- function(data) {
- console.log(data);
+ bookmarkService.addBookmark(params)
+ .then((data) => {
$('.ui.modal.js-add-bookmark').modal('hide');
- $state.go('bookmarks', {
- foo: 'i love you',
- bar: 'hello world'
- });
- pubSubService.publish('EditCtr.inserBookmarsSuccess', {
- show: 'navigate'
- });
- },
- function(errorMsg) {
- console.log(errorMsg);
- }
- );
+ pubSubService.publish('EditCtr.inserBookmarsSuccess', data);
+ })
+ .catch((err) => console.log('addBookmark err', err));
} else {
- console.log('updateBookmark...........', params)
- bookmarkService.updateBookmark(params).then(
- function(data) {
- console.log(data);
+ bookmarkService.updateBookmark(params)
+ .then((data) => {
$('.ui.modal.js-add-bookmark').modal('hide');
- $state.go('bookmarks', {
- foo: 'i love you',
- bar: 'hello world'
- });
- pubSubService.publish('EditCtr.inserBookmarsSuccess', {
- show: 'navigate'
- });
- },
- function(errorMsg) {
- console.log(errorMsg);
- }
- );
+ pubSubService.publish('EditCtr.inserBookmarsSuccess', data);
+ })
+ .catch((err) => console.log('updateBookmark err', err));
}
}
@@ -149,17 +120,18 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
}).modal('show');
$('.ui.modal.js-add-bookmark .ui.dropdown').dropdown('clear');
$('.ui.modal.js-add-bookmark .ui.dropdown').addClass('loading');
- bookmarkService.getBookmark(params).then(
- function(data) {
- var bookmark = data.bookmark;
- $scope.add = false;
+ $scope.add = false;
+ bookmarkService.getBookmark(params)
+ .then((data) => {
+ console.log('getBookmark ', data);
+ var bookmark = data.bookmark;
$scope.id = (bookmark && bookmark.id) || '';
$scope.url = (bookmark && bookmark.url) || '';
$scope.title = (bookmark && bookmark.title) || '';
$scope.description = (bookmark && bookmark.description) || '';
- // $scope.newTags = bookmark && bookmark.url && '';
$scope.tags = data.tags;
+ $scope.public = (bookmark && bookmark.id) || '1';
$timeout(function() {
data.bookmarkTags.forEach((tagId) => {
@@ -167,44 +139,34 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
});
});
- $scope.public = '1';
-
- console.log(data);
$('.ui.modal.js-add-bookmark .ui.dropdown').removeClass('loading');
- },
- function(errorMsg) {
- console.log(errorMsg);
- }
- );
+ })
+ .catch((err) => console.log('updateBookmark err', err));
});
function getTags(params) {
- bookmarkService.getTags(params).then(
- function(data) {
+ bookmarkService.getTags(params)
+ .then((data) => {
$scope.tags = data;
- semanticInit();
- $('.ui.modal.js-add-bookmark .ui.dropdown').removeClass('loading');
- },
- function(errorMsg) {
- console.log(errorMsg);
- }
- );
+ })
+ .catch((err) => console.log('getTags err', err));
}
- function semanticInit() {
- setTimeout(() => {
- $('.ui.dropdown').dropdown({
- forceSelection: false,
- maxSelections: maxSelections,
- onChange: function(value, text, $choice) {
- var selectedTags = $('.ui.modal.js-add-bookmark .ui.dropdown').dropdown('get value');
- $timeout(function() {
- $scope.tagsError = (selectedTags.length == 0 || selectedTags.length > maxSelections) && ($('.ui.modal.js-add-bookmark').modal('is active'));
- });
- }
- });
- }, 1000);
- }
+ // 元素构造完成之后,开始使用jquery初始化
+ $scope.$on('elementRenderFinished', function(elementRenderFinishedEvent) {
+ console.log('edit ui dropdown elementRenderFinished')
+ $('.ui.modal.js-add-bookmark .ui.dropdown').removeClass('loading');
+ $('.ui.dropdown').dropdown({
+ forceSelection: false,
+ maxSelections: maxSelections,
+ onChange: function(value, text, $choice) {
+ var selectedTags = $('.ui.modal.js-add-bookmark .ui.dropdown').dropdown('get value');
+ $timeout(function() {
+ $scope.tagsError = (selectedTags.length == 0 || selectedTags.length > maxSelections) && ($('.ui.modal.js-add-bookmark').modal('is active'));
+ });
+ }
+ });
+ });
function init() {
$scope.add = true;
diff --git a/public/scripts/controllers/home-controller.js b/public/scripts/controllers/home-controller.js
index 285c7b0..5653a27 100644
--- a/public/scripts/controllers/home-controller.js
+++ b/public/scripts/controllers/home-controller.js
@@ -1,14 +1,15 @@
app.controller('homeCtr', ['$scope', '$stateParams', '$filter', '$state', '$window', 'bookmarkService', 'pubSubService', function($scope, $stateParams, $filter, $state, $window, bookmarkService, pubSubService) {
console.log('Hello homeCtr......');
- var debug = true;
+ var debug = false;
if (debug) {
- bookmarkService.login({
+ var params = {
username: 'luchenqun',
- password: 'fendoubuxi',
+ password: 'fendoubuxi1',
autoLogin: true,
- }).then(
- function(data) {
- console.log(data);
+ };
+
+ bookmarkService.login(params)
+ .then((data) => {
if (data.logined) {
pubSubService.publish('loginCtr.login', {
'login': data.logined,
@@ -19,14 +20,11 @@ app.controller('homeCtr', ['$scope', '$stateParams', '$filter', '$state', '$wind
} else {
console.log('login failed......................')
}
- },
- function(errorMsg) {
- console.log(errorMsg);
- }
- );
+ })
+ .catch((err) => console.log('login err', err));
} else {
- bookmarkService.autoLogin().then(
- function(data) {
+ bookmarkService.autoLogin()
+ .then((data) => {
if (data.logined || debug) {
pubSubService.publish('loginCtr.login', {
'login': debug || data.logined,
@@ -35,12 +33,9 @@ app.controller('homeCtr', ['$scope', '$stateParams', '$filter', '$state', '$wind
showStyle: 'navigate',
})
} else {
- console.log('login failed......................')
+ console.log('autoLogin failed......................')
}
- },
- function(errorMsg) {
- console.log(errorMsg);
- }
- );
+ })
+ .catch((err) => console.log('autoLogin err', err));
}
}]);
diff --git a/public/scripts/controllers/login-controller.js b/public/scripts/controllers/login-controller.js
index 6a4faf9..0109dba 100644
--- a/public/scripts/controllers/login-controller.js
+++ b/public/scripts/controllers/login-controller.js
@@ -1,6 +1,11 @@
app.controller('loginCtr', ['$scope', '$filter', '$state', 'bookmarkService', 'pubSubService', function($scope, $filter, $state, bookmarkService, pubSubService) {
console.log("Hello loginCtr...");
+ pubSubService.publish('Common.menuActive', {
+ login: false,
+ index: 1
+ });
+
$scope.username = "luchenqun";
$scope.password = "fendoubuxi";
$scope.showErr = false;
@@ -17,11 +22,11 @@ app.controller('loginCtr', ['$scope', '$filter', '$state', 'bookmarkService', 'p
console.log($scope.username, $scope.password, autoLogin);
var params = {
username: $scope.username,
- password:$scope.password,
- autoLogin:autoLogin,
+ password: $scope.password,
+ autoLogin: autoLogin,
};
- bookmarkService.login(params).then(
- function(data) {
+ bookmarkService.login(params)
+ .then((data) => {
console.log(data);
if (data.logined) {
pubSubService.publish('loginCtr.login', {
@@ -33,11 +38,8 @@ app.controller('loginCtr', ['$scope', '$filter', '$state', 'bookmarkService', 'p
} else {
console.log('login failed......................')
}
- },
- function(errorMsg) {
- console.log(errorMsg);
- }
- );
+ })
+ .catch((err) => console.log('login err', err));
}
}
}]);
diff --git a/public/scripts/controllers/menus-controller.js b/public/scripts/controllers/menus-controller.js
index b25dd61..48d86d2 100644
--- a/public/scripts/controllers/menus-controller.js
+++ b/public/scripts/controllers/menus-controller.js
@@ -1,27 +1,18 @@
app.controller('menuCtr', ['$scope', '$stateParams', '$state', 'pubSubService', 'bookmarkService', function($scope, $stateParams, $state, pubSubService, bookmarkService) {
- $scope.login = $stateParams.login && false; /**< 是否登陆 */
+ console.log("Hello menuCtr")
+ $scope.login = false; /**< 是否登陆 */
$scope.selectLoginIndex = 0; /**< 默认登陆之后的选择的菜单索引,下表从 0 开始 */
$scope.selectNotLoginIndex = 0; /**< 默认未登陆之后的选择的菜单索引,下表从 0 开始 */
$scope.keyword = ''; /**< 搜索关键字 */
- semanticInit();
-
- /**
- * @todo http://stackoverflow.com/questions/31449948/ui-router-state-go-not-working
- */
- // if ($scope.login) {
- // setTimeout(() => {
- // $state.go('bookmarks', {
- // foo: 'i love you',
- // bar: 'hello world'
- // })
- // }, 0);
- // }
-
- pubSubService.subscribe('loginCtr.login', $scope, function(event, params) {
- $scope.login = params.login;
+ $scope.showSearch = false;
+ // 防止在登陆的情况下,在浏览器里面直接输入url,这时候要更新菜单选项
+ pubSubService.subscribe('Common.menuActive', $scope, function(event, params) {
+ console.log("subscribe Common.menuActive", params)
+ $scope.login = (params && params.login) || false;
+ var index = $scope.login ? ($scope.selectLoginIndex = (params && params.index) || 0) : ($scope.selectNotLoginIndex = (params && params.index) || 0);
+ updateMenuActive(index);
});
-
// 登陆之后显示的菜单数据。uiSerf:内部跳转链接。
$scope.loginMenus = [{
uiSref: 'bookmarks',
@@ -35,9 +26,6 @@ app.controller('menuCtr', ['$scope', '$stateParams', '$state', 'pubSubService',
}, {
uiSref: 'settings',
title: '设置'
- }, {
- uiSref: 'intro',
- title: '说明'
}];
// 未登陆显示的菜单数据
@@ -64,12 +52,24 @@ app.controller('menuCtr', ['$scope', '$stateParams', '$state', 'pubSubService',
/**
* @func
* @desc 点击下拉列表详情搜索
+ * @warn 不要使用$('js-checkbox-search').checkbox('is checked')去取,因为dom元素还没更新的。。。
*/
$scope.searchDetail = function() {
+ $scope.showSearch = !$scope.showSearch;
+ console.log('searchDetail ', $scope.showSearch)
pubSubService.publish('MenuCtr.searchDetail', {
- 'key': 'JavaScript'
+ 'showSearch': $scope.showSearch,
});
}
+
+ $scope.updateShowStyle = function(showStyle) {
+ console.log('updateShowStyle', showStyle)
+ $('.js-radio-' + showStyle).checkbox('set checked');
+ pubSubService.publish('MenuCtr.updateShowStyle', {
+ 'showStyle': showStyle,
+ });
+ }
+
$scope.showAddBookmarkMoadl = function() {
pubSubService.publish('MenuCtr.showAddBookmarkMoadl', {
'action': 'add'
@@ -79,34 +79,55 @@ app.controller('menuCtr', ['$scope', '$stateParams', '$state', 'pubSubService',
var params = {
userName: 'luchenqun'
};
- bookmarkService.logout(params).then(
- function(data) {
+ bookmarkService.logout(params)
+ .then((data) => {
console.log('logout..........', data)
$scope.login = false;
$state.go('login', {
foo: 'i love you',
bar: 'hello world'
})
- },
- function(errorMsg) {
- console.log(errorMsg);
- }
- );
+ })
+ .catch((err) => console.log('logout err', err));
}
- function semanticInit() {
- setTimeout(() => {
- $('.ui.dropdown').dropdown({
- action: 'nothing',
- });
- $('.ui.checkbox').checkbox();
- $('.ui.checkbox.js-radio-navigate').checkbox('check');
- $('.ui.menu a.item').on('click', function() {
- $(this)
- .addClass('active')
- .siblings()
- .removeClass('active');
- });
- }, 100);
+ // 元素构造完成之后,开始使用jquery初始化
+ $scope.$on('elementRenderFinished', function(elementRenderFinishedEvent) {
+ console.log('menus elementRenderFinished')
+ $scope.showSearch = $('.js-checkbox-search').checkbox('is checked');
+ $('.js-bookmark-dropdown').dropdown({
+ action: 'hide',
+ });
+ $('.ui.dropdown').dropdown({
+ on: 'hover',
+ });
+
+ $('.ui.checkbox').checkbox();
+ $('.ui.checkbox.js-radio-navigate').checkbox('check');
+ $('.ui.menu a.item').on('click', function() {
+ $(this).addClass('selected').siblings().removeClass('selected');
+ });
+
+ $(".ui.menu a.item:first").hover(
+ function() {
+ $('.js-bookmark-dropdown').dropdown('show');
+ },
+ function() {
+ setTimeout(() => {
+ if ($('.js-menu-option:hover').length === 0) {
+ $('.js-bookmark-dropdown').dropdown('hide');
+ }
+ }, 100)
+ }
+ );
+
+ $('.ui.menu a.item').on('click', function() {
+ $(this).addClass('selected').siblings().removeClass('selected');
+ });
+ });
+
+ function updateMenuActive(index) {
+ $('.ui.menu a.item').removeClass('selected');
+ $('.ui.menu a.item:eq(' + index + ')').addClass('selected');
}
}]);
diff --git a/public/scripts/controllers/tags-controller.js b/public/scripts/controllers/tags-controller.js
index 2e90771..32c016b 100644
--- a/public/scripts/controllers/tags-controller.js
+++ b/public/scripts/controllers/tags-controller.js
@@ -1,25 +1,24 @@
app.controller('tagsCtr', ['$scope', '$filter', 'bookmarkService', 'pubSubService', function($scope, $filter, bookmarkService, pubSubService) {
console.log("Hello tagsCtr...");
- getTags({a:1, b:2, c:3});
+ getTags({
+ user_id: '1'
+ });
$scope.tags = []; // 书签数据
pubSubService.subscribe('MenuCtr.tags', $scope, function(event, data) {
console.log('subscribe MenuCtr.tags', data);
- var params = {a:1, b:2, c:3};
+ var params = {
+ a: 1,
+ b: 2,
+ c: 3
+ };
getTags(params);
});
- function getTags(params){
- bookmarkService.getTags(params).then(
- function(data) {
- console.log(data);
- $scope.tags = data;
- },
- function(errorMsg) {
- console.log(errorMsg);
- }
- );
+ function getTags(params) {
+ bookmarkService.getTags(params)
+ .then((data) => $scope.tags = data)
+ .catch((err) => console.log('getTags err', err));
}
-
}]);
diff --git a/public/scripts/directives/element-render-finish-directive.js b/public/scripts/directives/element-render-finish-directive.js
new file mode 100644
index 0000000..52a2ae6
--- /dev/null
+++ b/public/scripts/directives/element-render-finish-directive.js
@@ -0,0 +1,12 @@
+app.directive('onFinishRenderFilters', ['$timeout', function($timeout) {
+ return {
+ restrict: 'A',
+ link: function(scope, element, attr) {
+ if (scope.$last === true) {
+ $timeout(function() {
+ scope.$emit('elementRenderFinished');
+ });
+ }
+ }
+ };
+}]);
diff --git a/public/scripts/externe/toastr.min.js b/public/scripts/externe/toastr.min.js
new file mode 100644
index 0000000..227d9e1
--- /dev/null
+++ b/public/scripts/externe/toastr.min.js
@@ -0,0 +1,2 @@
+!function(e){e(["jquery"],function(e){return function(){function t(e,t,n){return g({type:O.error,iconClass:m().iconClasses.error,message:e,optionsOverride:n,title:t})}function n(t,n){return t||(t=m()),v=e("#"+t.containerId),v.length?v:(n&&(v=u(t)),v)}function i(e,t,n){return g({type:O.info,iconClass:m().iconClasses.info,message:e,optionsOverride:n,title:t})}function o(e){w=e}function s(e,t,n){return g({type:O.success,iconClass:m().iconClasses.success,message:e,optionsOverride:n,title:t})}function a(e,t,n){return g({type:O.warning,iconClass:m().iconClasses.warning,message:e,optionsOverride:n,title:t})}function r(e,t){var i=m();v||n(i),l(e,i,t)||d(i)}function c(t){var i=m();return v||n(i),t&&0===e(":focus",t).length?void h(t):void(v.children().length&&v.remove())}function d(t){for(var n=v.children(),i=n.length-1;i>=0;i--)l(e(n[i]),t)}function l(t,n,i){var o=i&&i.force?i.force:!1;return t&&(o||0===e(":focus",t).length)?(t[n.hideMethod]({duration:n.hideDuration,easing:n.hideEasing,complete:function(){h(t)}}),!0):!1}function u(t){return v=e("
").attr("id",t.containerId).addClass(t.positionClass).attr("aria-live","polite").attr("role","alert"),v.appendTo(e(t.target)),v}function p(){return{tapToDismiss:!0,toastClass:"toast",containerId:"toast-container",debug:!1,showMethod:"fadeIn",showDuration:300,showEasing:"swing",onShown:void 0,hideMethod:"fadeOut",hideDuration:1e3,hideEasing:"swing",onHidden:void 0,closeMethod:!1,closeDuration:!1,closeEasing:!1,extendedTimeOut:1e3,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},iconClass:"toast-info",positionClass:"toast-top-right",timeOut:5e3,titleClass:"toast-title",messageClass:"toast-message",escapeHtml:!1,target:"body",closeHtml:'
',newestOnTop:!0,preventDuplicates:!1,progressBar:!1}}function f(e){w&&w(e)}function g(t){function i(e){return null==e&&(e=""),new String(e).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function o(){r(),d(),l(),u(),p(),c()}function s(){y.hover(b,O),!x.onclick&&x.tapToDismiss&&y.click(w),x.closeButton&&k&&k.click(function(e){e.stopPropagation?e.stopPropagation():void 0!==e.cancelBubble&&e.cancelBubble!==!0&&(e.cancelBubble=!0),w(!0)}),x.onclick&&y.click(function(e){x.onclick(e),w()})}function a(){y.hide(),y[x.showMethod]({duration:x.showDuration,easing:x.showEasing,complete:x.onShown}),x.timeOut>0&&(H=setTimeout(w,x.timeOut),q.maxHideTime=parseFloat(x.timeOut),q.hideEta=(new Date).getTime()+q.maxHideTime,x.progressBar&&(q.intervalId=setInterval(D,10)))}function r(){t.iconClass&&y.addClass(x.toastClass).addClass(E)}function c(){x.newestOnTop?v.prepend(y):v.append(y)}function d(){t.title&&(I.append(x.escapeHtml?i(t.title):t.title).addClass(x.titleClass),y.append(I))}function l(){t.message&&(M.append(x.escapeHtml?i(t.message):t.message).addClass(x.messageClass),y.append(M))}function u(){x.closeButton&&(k.addClass("toast-close-button").attr("role","button"),y.prepend(k))}function p(){x.progressBar&&(B.addClass("toast-progress"),y.prepend(B))}function g(e,t){if(e.preventDuplicates){if(t.message===C)return!0;C=t.message}return!1}function w(t){var n=t&&x.closeMethod!==!1?x.closeMethod:x.hideMethod,i=t&&x.closeDuration!==!1?x.closeDuration:x.hideDuration,o=t&&x.closeEasing!==!1?x.closeEasing:x.hideEasing;return!e(":focus",y).length||t?(clearTimeout(q.intervalId),y[n]({duration:i,easing:o,complete:function(){h(y),x.onHidden&&"hidden"!==j.state&&x.onHidden(),j.state="hidden",j.endTime=new Date,f(j)}})):void 0}function O(){(x.timeOut>0||x.extendedTimeOut>0)&&(H=setTimeout(w,x.extendedTimeOut),q.maxHideTime=parseFloat(x.extendedTimeOut),q.hideEta=(new Date).getTime()+q.maxHideTime)}function b(){clearTimeout(H),q.hideEta=0,y.stop(!0,!0)[x.showMethod]({duration:x.showDuration,easing:x.showEasing})}function D(){var e=(q.hideEta-(new Date).getTime())/q.maxHideTime*100;B.width(e+"%")}var x=m(),E=t.iconClass||x.iconClass;if("undefined"!=typeof t.optionsOverride&&(x=e.extend(x,t.optionsOverride),E=t.optionsOverride.iconClass||E),!g(x,t)){T++,v=n(x,!0);var H=null,y=e("
"),I=e("
"),M=e("
"),B=e("
"),k=e(x.closeHtml),q={intervalId:null,hideEta:null,maxHideTime:null},j={toastId:T,state:"visible",startTime:new Date,options:x,map:t};return o(),a(),s(),f(j),x.debug&&console&&console.log(j),y}}function m(){return e.extend({},p(),b.options)}function h(e){v||(v=n()),e.is(":visible")||(e.remove(),e=null,0===v.children().length&&(v.remove(),C=void 0))}var v,w,C,T=0,O={error:"error",info:"info",success:"success",warning:"warning"},b={clear:r,remove:c,error:t,getContainer:n,info:i,options:{},subscribe:o,success:s,version:"2.1.2",warning:a};return b}()})}("function"==typeof define&&define.amd?define:function(e,t){"undefined"!=typeof module&&module.exports?module.exports=t(require("jquery")):window.toastr=t(window.jQuery)});
+//# sourceMappingURL=toastr.js.map
\ No newline at end of file
diff --git a/public/scripts/services/bookmark-service.js b/public/scripts/services/bookmark-service.js
index b949c11..8b540c6 100644
--- a/public/scripts/services/bookmark-service.js
+++ b/public/scripts/services/bookmark-service.js
@@ -10,8 +10,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
- console.log('Error: ' + data);
- def.reject('Failed to get getTitle');
+ def.reject('getTitle error');
});
return def.promise;
},
@@ -24,8 +23,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
- console.log('Error: ' + data);
- def.reject('Failed to get todos');
+ def.reject('login error');
});
return def.promise;
},
@@ -38,7 +36,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
- console.log('Error: ' + data);
+ def.reject('clickBookmark error');
});
return def.promise;
},
@@ -51,8 +49,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
- console.log('Error: ' + data);
- def.reject('Failed to get todos');
+ def.reject('logout error');
});
return def.promise;
},
@@ -63,8 +60,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
- console.log('Error: ' + data);
- def.reject('Failed to get todos');
+ def.reject('autoLogin error');
});
return def.promise;
},
@@ -83,8 +79,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data, status) {
- console.log('Error: ' + data, status);
- def.reject('Failed to get todos');
+ def.reject('getBookmarks error');
});
return def.promise;
},
@@ -98,7 +93,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data, status) {
- console.log('Error: ' + data, status);
+ def.reject('getBookmark error');
});
return def.promise;
},
@@ -111,13 +106,11 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
- console.log('Error: ' + data);
- def.reject('Failed to get todos');
+ def.reject('addBookmark error');
});
return def.promise;
},
updateBookmark: function(params) {
- console.log('service updateBookmark')
var def = $q.defer();
$http.post('/api/updateBookmark/', {
params: params
@@ -126,8 +119,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
- console.log('Error: ' + data);
- def.reject('Failed to get todos');
+ def.reject('updateBookmark error');
});
return def.promise;
},
@@ -140,13 +132,9 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
- console.log('Error: ' + data);
- def.reject('delBookmark fail');
+ def.reject('delBookmark error');
});
return def.promise;
- },
- editBookmark: function(params) {
-
},
/**
* @func
@@ -162,8 +150,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
- console.log('Error: ' + data);
- def.reject('Failed to get todos');
+ def.reject('getTags error');
});
return def.promise;
},
@@ -176,8 +163,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
- console.log('Error: ' + data);
- def.reject('Failed to get todos');
+ def.reject('addTags error');
});
return def.promise;
},
@@ -186,47 +172,27 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
return service;
}]);
-app.factory('AuthenticationService', function() {
- var auth = {
- isAuthenticated: false,
- isAdmin: false
- }
-
- return auth;
-});
-
-app.factory('TokenInterceptor', function($q, $window, $location, AuthenticationService) {
- return {
+app.factory('httpInterceptor', ['$q', '$injector', function($q, $injector) {
+ var defered = $q.defer();
+ var httpInterceptor = {
request: function(config) {
- config.headers = config.headers || {};
- if ($window.sessionStorage.token) {
- config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
- }
return config;
},
-
- requestError: function(rejection) {
- return $q.reject(rejection);
+ requestError: function(err) {
+ return $q.reject(err);
},
-
- /* Set Authentication.isAuthenticated to true if 200 received */
- response: function(response) {
- if (response != null && response.status == 200 && $window.sessionStorage.token && !AuthenticationService.isAuthenticated) {
- AuthenticationService.isAuthenticated = true;
- }
- return response || $q.when(response);
+ response: function(res) {
+ return $q.resolve(res);
},
-
- /* Revoke client authentication if 401 is received */
- responseError: function(rejection) {
- if (rejection != null && rejection.status === 401 && ($window.sessionStorage.token || AuthenticationService.isAuthenticated)) {
- delete $window.sessionStorage.token;
- AuthenticationService.isAuthenticated = false;
- // $location.path("/admin/login");
- console.log('responseError')
+ responseError: function(err) {
+ if (401 === err.status) {
+ toastr["error"]("警告", "您需要先登录才能使用该功能");
+ $injector.get('$state').go('login', {})
+ } else {
+ toastr["error"]("警告", JSON.stringify(err));
}
-
- return $q.reject(rejection);
+ return $q.reject(err);
}
- };
-});
+ }
+ return httpInterceptor;
+}]);
diff --git a/public/views/bookmarks.html b/public/views/bookmarks.html
index cc1b30c..b54aee9 100644
--- a/public/views/bookmarks.html
+++ b/public/views/bookmarks.html
@@ -1,35 +1,4 @@
-
-
-
-
-
- {{ tag.name }}
-
-
-
-
-

-

-

-
{{ bookmark.title}}
-
-
-
-
-
-
-
-
-
-