Skip to content

added search functionality first draft #26

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<script src="js/controllers/main.js"></script>
<script src="js/controllers/hubs.js"></script>
<script src="js/controllers/browse.js"></script>
<script src="js/controllers/search.js"></script>
<script src="js/controllers/queue.js"></script>
<script src="js/controllers/share.js"></script>
<script src="js/controllers/settings.js"></script>
Expand Down
7 changes: 6 additions & 1 deletion app/js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ EiskaltApp.value('settings', {
refresh: {
hashAndRatio: 5000,
chat: 3000,
queues: 5000
queues: 5000,
search: 3000,
},
settings: [
{key: 'Nick', type: 'text'},
Expand All @@ -39,6 +40,10 @@ EiskaltApp.config(function ($routeProvider) {
controller: 'BrowseCtrl',
templateUrl: 'partials/browse.html'
})
.when('/search', {
controller: 'SearchCtrl',
templateUrl: 'partials/search.html'
})
.when('/queue', {
controller: 'QueueCtrl',
templateUrl: 'partials/queue.html'
Expand Down
113 changes: 113 additions & 0 deletions app/js/controllers/search.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/* Copyright (c) 2017 Lars Kreisz */
/* License:The MIT License (MIT) */

'use strict';
EiskaltApp.controller('SearchCtrl', function ($scope, $interval, settings, EiskaltRPC) {
$scope.result = [];
$scope.term = "";
$scope.hubs = [];
$scope.filelists = [];

var loadHubs = function () {
EiskaltRPC.ListHubsFullDesc().success(function (data) {
$scope.hubs = data;
});
};
loadHubs();

$scope.loadLists = function () {
EiskaltRPC.ShowLocalLists().success(function (filelists) {
$scope.filelists = filelists;
});
};
$scope.loadLists();

$scope.refreshSearchResults = function () {
if($scope.hub != null) {
EiskaltRPC.ReturnSearchResults($scope.hub.huburl).success(function (result) {
$scope.result = result;
});
}
};

$scope.refreshSearchPage = function () {
$scope.loadLists();
$scope.refreshSearchResults();
};

var refreshSearchTimer = $interval($scope.refreshSearchPage, settings.refresh.search);
$scope.$on("$destroy", function(event) {
$interval.cancel(refreshSearchPage);
});

$scope.search = function() {
$scope.result = [];
EiskaltRPC.ClearSearchResults($scope.hub.huburl).success(function (status) {
if (status != 0) {
alert("Couldn't clear old results");
}
});
EiskaltRPC.SendSearch($scope.term, 0, 0, 0, 0.0, $scope.hub.huburl)
.success(function(status) {
if (status != 0) {
alert('Search failed.');
}
});
};
});

EiskaltApp.controller('SearchDownloadCtrl', function ($scope, EiskaltRPC) {
$scope.nonDownloadableFile = true;
$scope.downloadedFileList = false;

$scope.$watch(
function () {
var item = $scope.$parent.item;
var filelist = item.Nick + "." + item.CID + ".xml.bz2";
return $scope.filelists.includes(filelist);
},
function (newValue, oldValue, scope) {
if(oldValue != newValue) {
$scope.downloadedFileList = newValue;
$scope.nonDownloadableFile = !newValue;
}
}
);

$scope.init = function(item) {
var filelist = item.Nick + "." + item.CID + ".xml.bz2";
$scope.downloadedFileList = $scope.filelists.includes(filelist);
$scope.nonDownloadableFile = !$scope.downloadedFileList;
};

$scope.downloadFileList = function(item) {
var filelist = item.Nick + "." + item.CID + ".xml.bz2";
if(!$scope.filelists.includes(filelist)) {
EiskaltRPC.GetFileList($scope.hub.huburl, item.Nick).success(function(filelist) {
if(status != 0) {
alert('Download failed. Maybe still downloading or downloaded already?');
}
});
} else {
alert('Filelist already downloaded.');
}
};

$scope.download = function(item) {
var isFolder = item.Filename.endsWith('/');
var method = isFolder ? EiskaltRPC.DownloadDirFromList : EiskaltRPC.DownloadFileFromList;
var target = (item.Path + item.Filename).replace(/\//g,"\\");
var filelist = item.Nick + "." + item.CID + ".xml.bz2";
if($scope.filelists.includes(filelist)) {
method(target, '', filelist).success(function (status) {
if (status == 0) {
$scope.nonDownloadableFile = true;
} else {
alert('Download failed. Maybe still downloading or downloaded already?');
}
});
} else {
alert('Download failed. Please download the filelist first');
}
};
});
6 changes: 6 additions & 0 deletions app/partials/navbar.html
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@
<span class="hidden-sm">Browse</span>
</a>
</li>
<li ng-class="{active:isActive('/search')}">
<a href="#/search">
<span class="glyphicon glyphicon-search"></span>
<span class="hidden-sm">Search</span>
</a>
</li>
<li ng-class="{active:isActive('/settings')}">
<a href="#/settings">
<span class="glyphicon glyphicon-cog"></span>
Expand Down
58 changes: 58 additions & 0 deletions app/partials/search.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<div id="search">
<div id="hubSelection" class="form-horizontal">
Hub:
<select ng-model="hub" ng-options="h.huburl for h in hubs"></select>
</div>
<form class="form-inline" ng-model-options="{ updateOn: 'blur' }" id="searchBar">
<input id="searchText" type="text" class="form-control" ng-model="term" width="100%">
<button type="submit" class="btn btn-primary btn-xs" ng-click="search()">
<span class="glyphicon" ng-class="glyphicon-search"></span>
Search
</button>
</form>
<div id="output" class="table-responsive">
<table class="table table-striped table-hover table-condensed" id="searchResults">
<thead>
<tr>
<th class="name-cell">Filename</th>
<th class="path-cell">Path</th>
<th class="host-cell">Nick</th>
<th class="size-cell">Size</th>
<th class="button-cell"></th>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in result track by $index ">
<td>
{{ item.Filename }}
</td>
<td>
{{ item.Path }}
</td>
<td>
{{ item.Nick }}
</td>
<td>
{{ item.Size }}
</td>
<td ng-controller="SearchDownloadCtrl" ng-init="init(item)">
<button type="button" class="btn btn-primary btn-xs pull-right"
ng-click="downloadFileList(item)"
ng-disabled="downloadedFileList">
<span class="glyphicon"
ng-class="downloaded ? 'glyphicon-ok' : 'glyphicon-download-alt'"></span>
Download Filelist
</button>
<button type="button" class="btn btn-primary btn-xs pull-right"
ng-click="download(item)"
ng-disabled="nonDownloadableFile">
<span class="glyphicon"
ng-class="downloaded ? 'glyphicon-ok' : 'glyphicon-download-alt'"></span>
Download
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>