@@ -31,10 +31,12 @@ |
||
31 | 31 |
<script src="scripts/controllers/note-view-ctrl.js"></script> |
32 | 32 |
<script src="scripts/controllers/note-edit-ctrl.js"></script> |
33 | 33 |
<script src="scripts/services/file-service.js"></script> |
34 |
+ <script src="scripts/services/search-service.js"></script> |
|
34 | 35 |
<script src="scripts/services/thumbnail-service.js"></script> |
35 | 36 |
<script src="scripts/services/prefs-service.js"></script> |
36 | 37 |
<script src="scripts/services/date-formatter.js" charset="utf-8"></script> |
37 | 38 |
<script src="scripts/directives/right-click-directive.js"></script> |
39 |
+ <script src="scripts/directives/ng-enter.js"></script> |
|
38 | 40 |
|
39 | 41 |
|
40 | 42 |
|
@@ -218,6 +220,14 @@ |
||
218 | 220 |
</button> |
219 | 221 |
</div> |
220 | 222 |
|
223 |
+ <div class="btn-group pull-right"> |
|
224 |
+ <form> |
|
225 |
+ <div class="form-group"> |
|
226 |
+ <input type="text" ng-model="search_text" ng-enter="fileSearch()" class="form-control" placeholder="Search" style="height: 24px;"> |
|
227 |
+ </div> |
|
228 |
+ </form> |
|
229 |
+ </div> |
|
230 |
+ |
|
221 | 231 |
</div> |
222 | 232 |
</header> |
223 | 233 |
|
@@ -33,7 +33,11 @@ angular.module('codexApp.index', []) |
||
33 | 33 |
break; |
34 | 34 |
case "Notebook": |
35 | 35 |
$scope.files = FileService.getFiles(FileService.getCurrentNote().path); |
36 |
- |
|
36 |
+ var info = $scope.files.length + " Items" |
|
37 |
+ $rootScope.$broadcast('footer:info', info); |
|
38 |
+ break; |
|
39 |
+ case "Searched Files": |
|
40 |
+ $scope.files = FileService.getSearchFiles(); |
|
37 | 41 |
var info = $scope.files.length + " Items" |
38 | 42 |
$rootScope.$broadcast('footer:info', info); |
39 | 43 |
break; |
@@ -8,7 +8,7 @@ |
||
8 | 8 |
* Controller of the domainManagerApp |
9 | 9 |
*/ |
10 | 10 |
angular.module('codexApp.header', []) |
11 |
- .controller('HeaderCtrl',['$scope', '$rootScope', '$state', 'FileService', function ($scope, $rootScope, $state, FileService) { |
|
11 |
+ .controller('HeaderCtrl',['$scope', '$rootScope', '$state', 'FileService', 'SearchService', 'PrefsService', function ($scope, $rootScope, $state, FileService, SearchService, PrefsService) { |
|
12 | 12 |
|
13 | 13 |
console.log('-> Header loaded') |
14 | 14 |
|
@@ -113,4 +113,18 @@ angular.module('codexApp.header', []) |
||
113 | 113 |
} |
114 | 114 |
}); |
115 | 115 |
|
116 |
+ // Search Functions |
|
117 |
+ |
|
118 |
+ SearchService.init(); |
|
119 |
+ $scope.fileSearch = function(){ |
|
120 |
+ console.log("> SEARCHING: " + $scope.search_text); |
|
121 |
+ var results = SearchService.search($scope.search_text); |
|
122 |
+ FileService.setSearchedFiles(results); |
|
123 |
+ PrefsService.setCurrentView("Searched Files"); |
|
124 |
+ //$scope.activateSidebarBtn(0); |
|
125 |
+ $rootScope.$broadcast('main-window:note-list'); |
|
126 |
+ $rootScope.$broadcast('window-view:change'); |
|
127 |
+ $state.go("index"); |
|
128 |
+ } |
|
129 |
+ |
|
116 | 130 |
}]); |
@@ -0,0 +1,14 @@ |
||
1 |
+angular.module('codexApp') |
|
2 |
+.directive('ngEnter', function() { |
|
3 |
+ return function(scope, element, attrs) { |
|
4 |
+ element.bind("keydown keypress", function(event) { |
|
5 |
+ if(event.which === 13) { |
|
6 |
+ scope.$apply(function(){ |
|
7 |
+ scope.$eval(attrs.ngEnter); |
|
8 |
+ }); |
|
9 |
+ |
|
10 |
+ event.preventDefault(); |
|
11 |
+ } |
|
12 |
+ }); |
|
13 |
+ }; |
|
14 |
+}); |
@@ -5,6 +5,7 @@ angular.module('codexApp') |
||
5 | 5 |
var appDataPath = ""; |
6 | 6 |
var appData = {}; |
7 | 7 |
var notes_dir = ""; |
8 |
+ var searched_files = []; |
|
8 | 9 |
|
9 | 10 |
var getAppData = function(){ |
10 | 11 |
var remote = require('remote'); |
@@ -144,7 +145,7 @@ angular.module('codexApp') |
||
144 | 145 |
break; |
145 | 146 |
} |
146 | 147 |
} |
147 |
- console.log(thumb); |
|
148 |
+ //console.log(thumb); |
|
148 | 149 |
if(thumb == "" || thumb == undefined){ |
149 | 150 |
console.log("> NO THUMBNAIL FOUND! GENERATING NEW ONE") |
150 | 151 |
thumb = saveThumbnail(file_path); |
@@ -592,4 +593,12 @@ angular.module('codexApp') |
||
592 | 593 |
return saveThumbnail(file_path); |
593 | 594 |
} |
594 | 595 |
|
596 |
+ this.setSearchedFiles = function(files){ |
|
597 |
+ searched_files = files; |
|
598 |
+ } |
|
599 |
+ |
|
600 |
+ this.getSearchFiles = function() { |
|
601 |
+ return searched_files; |
|
602 |
+ } |
|
603 |
+ |
|
595 | 604 |
}]) |
@@ -0,0 +1,63 @@ |
||
1 |
+angular.module('codexApp') |
|
2 |
+.service('SearchService', [ '$rootScope', '$http', 'ThumbnailService', '$state', 'FileService', function($rootScope, $http, ThumbnailService, $state, FileService) { |
|
3 |
+ |
|
4 |
+ var fs = require('fs'); |
|
5 |
+ |
|
6 |
+ var fulltextsearchlight = require('full-text-search-light'); |
|
7 |
+ var search = new fulltextsearchlight(); |
|
8 |
+ var appDataPath = FileService.getAppDataPath(); |
|
9 |
+ |
|
10 |
+ this.init = function() { |
|
11 |
+ // Load db |
|
12 |
+ fulltextsearchlight.load(appDataPath + '/search.json', function(error, search_loaded){ |
|
13 |
+ if(error){ |
|
14 |
+ console.log("> SEARCH DB NOT FOUND!") |
|
15 |
+ console.log(error) |
|
16 |
+ search.save(appDataPath + '/search.json', function(error){ |
|
17 |
+ console.log("> CREATING SEARCH DB") |
|
18 |
+ buildSearchDB(); |
|
19 |
+ console.log("> NEW SEARCH DB CREATED") |
|
20 |
+ }); |
|
21 |
+ } |
|
22 |
+ else { |
|
23 |
+ search = search_loaded |
|
24 |
+ console.log("> SEARCH DB LOADED"); |
|
25 |
+ } |
|
26 |
+ }); |
|
27 |
+ } |
|
28 |
+ |
|
29 |
+ this.search = function(search_text) { |
|
30 |
+ var results = search.search(search_text) |
|
31 |
+ console.log("> FOUND " + results.length + " RESULTS"); |
|
32 |
+ return results |
|
33 |
+ } |
|
34 |
+ |
|
35 |
+ var buildSearchDB = function() { |
|
36 |
+ var parsed_files = [] |
|
37 |
+ var all_files = FileService.getAllFiles(); |
|
38 |
+ for (var i = 0; i < all_files.length; i++) { |
|
39 |
+ file = all_files[i] |
|
40 |
+ var file_data = { |
|
41 |
+ path: file.path, |
|
42 |
+ title: file.title, |
|
43 |
+ type: file.type |
|
44 |
+ } |
|
45 |
+ if(file.type == "Markdown"){ |
|
46 |
+ var raw_data = fs.readFileSync(file.path, 'utf8'); |
|
47 |
+ var data = new Buffer(raw_data).toString('utf8') |
|
48 |
+ console.log(file); |
|
49 |
+ file_data.content = data; |
|
50 |
+ file_data.thumbnail = file.thumbnail; |
|
51 |
+ } |
|
52 |
+ parsed_files.push(file_data); |
|
53 |
+ } |
|
54 |
+ for (var i = 0; i < parsed_files.length; i++) { |
|
55 |
+ console.log(parsed_files[i].title); |
|
56 |
+ search.add(parsed_files[i]); |
|
57 |
+ } |
|
58 |
+ search.save(appDataPath + '/search.json', function(error){ |
|
59 |
+ console.log("> SEARCH DB SAVED") |
|
60 |
+ }); |
|
61 |
+ } |
|
62 |
+ |
|
63 |
+}]) |
@@ -23,6 +23,7 @@ |
||
23 | 23 |
], |
24 | 24 |
"dependencies": { |
25 | 25 |
"electron-debug": "^0.2.1", |
26 |
+ "full-text-search-light": "0.0.16", |
|
26 | 27 |
"marked": "^0.3.5" |
27 | 28 |
}, |
28 | 29 |
"devDependencies": { |