mirror of
https://github.com/Athou/commafeed.git
synced 2026-03-21 21:37:29 +00:00
initial ui for entry filtering
This commit is contained in:
@@ -322,17 +322,21 @@ module.controller('FeedDetailsCtrl', ['$scope', '$state', '$stateParams', 'FeedS
|
|||||||
|
|
||||||
$scope.save = function() {
|
$scope.save = function() {
|
||||||
var sub = $scope.sub;
|
var sub = $scope.sub;
|
||||||
|
$scope.error = null;
|
||||||
FeedService.modify({
|
FeedService.modify({
|
||||||
id : sub.id,
|
id : sub.id,
|
||||||
name : sub.name,
|
name : sub.name,
|
||||||
position : sub.position,
|
position : sub.position,
|
||||||
categoryId : sub.categoryId
|
categoryId : sub.categoryId,
|
||||||
|
filter : sub.filter
|
||||||
}, function() {
|
}, function() {
|
||||||
CategoryService.init();
|
CategoryService.init();
|
||||||
$state.transitionTo('feeds.view', {
|
$state.transitionTo('feeds.view', {
|
||||||
_id : 'all',
|
_id : 'all',
|
||||||
_type : 'category'
|
_type : 'category'
|
||||||
});
|
});
|
||||||
|
}, function(e) {
|
||||||
|
$scope.error = e.data;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}]);
|
}]);
|
||||||
@@ -489,7 +493,7 @@ module.controller('ToolbarCtrl', [
|
|||||||
type : $stateParams._type,
|
type : $stateParams._type,
|
||||||
id : $stateParams._id,
|
id : $stateParams._id,
|
||||||
olderThan : olderThan,
|
olderThan : olderThan,
|
||||||
keywords: $location.search().q,
|
keywords : $location.search().q,
|
||||||
read : true
|
read : true
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -882,7 +886,7 @@ module.controller('FeedListCtrl', [
|
|||||||
service.mark({
|
service.mark({
|
||||||
id : $scope.selectedId,
|
id : $scope.selectedId,
|
||||||
olderThan : olderThan || $scope.timestamp,
|
olderThan : olderThan || $scope.timestamp,
|
||||||
keywords: $location.search().q,
|
keywords : $location.search().q,
|
||||||
read : true
|
read : true
|
||||||
}, function() {
|
}, function() {
|
||||||
CategoryService.refresh(function() {
|
CategoryService.refresh(function() {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<h3>{{ 'details.feed_details' | translate }}</h3>
|
<h3>{{ 'details.feed_details' | translate }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<form name="form" class="form-horizontal" ng-submit="save()">
|
<form name="form" class="form-horizontal" ng-submit="save()">
|
||||||
|
<div class="alert alert-danger" ng-if="error">{{ error }}</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-2 control-label">{{ 'details.url' | translate }}</label>
|
<label class="col-sm-2 control-label">{{ 'details.url' | translate }}</label>
|
||||||
<div class="col-sm-10 checkbox">
|
<div class="col-sm-10 checkbox">
|
||||||
@@ -69,6 +70,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-2 control-label">Filtering expression</label>
|
||||||
|
<div class="col-sm-10 checkbox">
|
||||||
|
<input type="text" name="filter" ng-model="sub.filter" class="form-control"></input>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-offset-2 col-sm-10">
|
<div class="col-sm-offset-2 col-sm-10">
|
||||||
<button type="submit" class="btn btn-primary">{{ 'global.save' | translate }}</button>
|
<button type="submit" class="btn btn-primary">{{ 'global.save' | translate }}</button>
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ public class FeedEntryFilter {
|
|||||||
};
|
};
|
||||||
|
|
||||||
JexlEngine engine = new JexlEngine(uberspect, null, null, null);
|
JexlEngine engine = new JexlEngine(uberspect, null, null, null);
|
||||||
|
engine.setStrict(true);
|
||||||
engine.setClassLoader(cl);
|
engine.setClassLoader(cl);
|
||||||
return engine;
|
return engine;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,6 @@ public class FeedSubscription extends AbstractModel {
|
|||||||
private Integer position;
|
private Integer position;
|
||||||
|
|
||||||
@Column(length = 4096)
|
@Column(length = 4096)
|
||||||
private String filter = "author.contains('a')";
|
private String filter;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ public class Subscription implements Serializable {
|
|||||||
sub.setUnread(unreadCount.getUnreadCount());
|
sub.setUnread(unreadCount.getUnreadCount());
|
||||||
sub.setNewestItemTime(unreadCount.getNewestItemTime());
|
sub.setNewestItemTime(unreadCount.getNewestItemTime());
|
||||||
sub.setCategoryId(category == null ? null : String.valueOf(category.getId()));
|
sub.setCategoryId(category == null ? null : String.valueOf(category.getId()));
|
||||||
|
sub.setFilter(subscription.getFilter());
|
||||||
return sub;
|
return sub;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,4 +78,7 @@ public class Subscription implements Serializable {
|
|||||||
@ApiModelProperty("date of the newest item")
|
@ApiModelProperty("date of the newest item")
|
||||||
private Date newestItemTime;
|
private Date newestItemTime;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "JEXL string evaluated on new entries to mark them as read if they do not match")
|
||||||
|
private String filter;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -24,4 +24,7 @@ public class FeedModificationRequest implements Serializable {
|
|||||||
@ApiModelProperty(value = "new display position, null if not changed")
|
@ApiModelProperty(value = "new display position, null if not changed")
|
||||||
private Integer position;
|
private Integer position;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "JEXL string evaluated on new entries to mark them as read if they do not match")
|
||||||
|
private String filter;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,12 +44,15 @@ import com.commafeed.backend.cache.CacheService;
|
|||||||
import com.commafeed.backend.dao.FeedCategoryDAO;
|
import com.commafeed.backend.dao.FeedCategoryDAO;
|
||||||
import com.commafeed.backend.dao.FeedEntryStatusDAO;
|
import com.commafeed.backend.dao.FeedEntryStatusDAO;
|
||||||
import com.commafeed.backend.dao.FeedSubscriptionDAO;
|
import com.commafeed.backend.dao.FeedSubscriptionDAO;
|
||||||
|
import com.commafeed.backend.feed.FeedEntryFilter;
|
||||||
import com.commafeed.backend.feed.FeedFetcher;
|
import com.commafeed.backend.feed.FeedFetcher;
|
||||||
import com.commafeed.backend.feed.FeedQueues;
|
import com.commafeed.backend.feed.FeedQueues;
|
||||||
import com.commafeed.backend.feed.FeedUtils;
|
import com.commafeed.backend.feed.FeedUtils;
|
||||||
import com.commafeed.backend.feed.FetchedFeed;
|
import com.commafeed.backend.feed.FetchedFeed;
|
||||||
import com.commafeed.backend.model.Feed;
|
import com.commafeed.backend.model.Feed;
|
||||||
import com.commafeed.backend.model.FeedCategory;
|
import com.commafeed.backend.model.FeedCategory;
|
||||||
|
import com.commafeed.backend.model.FeedEntry;
|
||||||
|
import com.commafeed.backend.model.FeedEntryContent;
|
||||||
import com.commafeed.backend.model.FeedEntryStatus;
|
import com.commafeed.backend.model.FeedEntryStatus;
|
||||||
import com.commafeed.backend.model.FeedSubscription;
|
import com.commafeed.backend.model.FeedSubscription;
|
||||||
import com.commafeed.backend.model.User;
|
import com.commafeed.backend.model.User;
|
||||||
@@ -93,6 +96,20 @@ import com.wordnik.swagger.annotations.ApiParam;
|
|||||||
@Singleton
|
@Singleton
|
||||||
public class FeedREST {
|
public class FeedREST {
|
||||||
|
|
||||||
|
private static final FeedEntry TEST_ENTRY = initTestEntry();
|
||||||
|
|
||||||
|
private static FeedEntry initTestEntry() {
|
||||||
|
FeedEntry entry = new FeedEntry();
|
||||||
|
entry.setUrl("https://github.com/Athou/commafeed");
|
||||||
|
|
||||||
|
FeedEntryContent content = new FeedEntryContent();
|
||||||
|
content.setAuthor("Athou");
|
||||||
|
content.setTitle("Merge pull request #662 from Athou/dw8");
|
||||||
|
content.setContent("Merge pull request #662 from Athou/dw8");
|
||||||
|
entry.setContent(content);
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
private final FeedSubscriptionDAO feedSubscriptionDAO;
|
private final FeedSubscriptionDAO feedSubscriptionDAO;
|
||||||
private final FeedCategoryDAO feedCategoryDAO;
|
private final FeedCategoryDAO feedCategoryDAO;
|
||||||
private final FeedEntryStatusDAO feedEntryStatusDAO;
|
private final FeedEntryStatusDAO feedEntryStatusDAO;
|
||||||
@@ -418,7 +435,15 @@ public class FeedREST {
|
|||||||
Preconditions.checkNotNull(req);
|
Preconditions.checkNotNull(req);
|
||||||
Preconditions.checkNotNull(req.getId());
|
Preconditions.checkNotNull(req.getId());
|
||||||
|
|
||||||
|
try {
|
||||||
|
new FeedEntryFilter(req.getFilter()).matchesEntry(TEST_ENTRY);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Throwable root = Throwables.getRootCause(e);
|
||||||
|
return Response.status(Status.BAD_REQUEST).entity(root.getMessage()).build();
|
||||||
|
}
|
||||||
|
|
||||||
FeedSubscription subscription = feedSubscriptionDAO.findById(user, req.getId());
|
FeedSubscription subscription = feedSubscriptionDAO.findById(user, req.getId());
|
||||||
|
subscription.setFilter(req.getFilter());
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(req.getName())) {
|
if (StringUtils.isNotBlank(req.getName())) {
|
||||||
subscription.setTitle(req.getName());
|
subscription.setTitle(req.getName());
|
||||||
|
|||||||
Reference in New Issue
Block a user