summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--controller/itemcontroller.php1
-rw-r--r--css/items.css6
-rw-r--r--js/app/controllers/feedcontroller.coffee13
-rw-r--r--js/app/directives/addfolderselect.coffee12
-rw-r--r--js/app/services/models/foldermodel.coffee9
-rw-r--r--js/public/app.js35
-rw-r--r--js/tests/controllers/feedcontrollerSpec.coffee8
-rw-r--r--js/tests/services/models/foldermodelSpec.coffee10
-rw-r--r--templates/part.addnew.php12
9 files changed, 70 insertions, 36 deletions
diff --git a/controller/itemcontroller.php b/controller/itemcontroller.php
index 2a8aa6725..3fa422eab 100644
--- a/controller/itemcontroller.php
+++ b/controller/itemcontroller.php
@@ -101,6 +101,7 @@ class ItemController extends Controller {
$this->itemBl->star($feedId, $guidHash, $isStarred, $userId);
}
+
/**
* @IsAdminExemption
* @IsSubAdminExemption
diff --git a/css/items.css b/css/items.css
index 864112f3e..04603c3d5 100644
--- a/css/items.css
+++ b/css/items.css
@@ -1,16 +1,16 @@
-#right-content:after {
+#app-content:after {
content: '';
display: block;
height: 100%;
}
-#right-content.loading {
+#app-content.loading {
background-image: url('%webroot%/core/img/loading.gif');
background-position: center;
background-repeat: no-repeat;
}
-#right-content.loading > ul {
+#app-content.loading > ul {
display: none;
}
diff --git a/js/app/controllers/feedcontroller.coffee b/js/app/controllers/feedcontroller.coffee
index 14e1aea5b..33d23d935 100644
--- a/js/app/controllers/feedcontroller.coffee
+++ b/js/app/controllers/feedcontroller.coffee
@@ -103,14 +103,13 @@ angular.module('News').factory '_FeedController', ->
@$scope.addFolder = (folderName) =>
@$scope.folderEmptyError = false
@$scope.folderExistsError = false
+ folderName = folderName.trim()
- if angular.isUndefined(folderName) or folderName.trim() == ''
+ if angular.isUndefined(folderName) or folderName == ''
@$scope.folderEmptyError = true
else
- folderName = folderName.trim()
- for folder in @_folderModel.getAll()
- if folderName.toLowerCase() == folder.name.toLowerCase()
- @$scope.folderExistsError = true
+ if @_folderModel.nameExists(folderName)
+ @$scope.folderExistsError = true
if not (@$scope.folderEmptyError or @$scope.folderExistsError)
@_isAddingFolder = true
@@ -119,6 +118,10 @@ angular.module('News').factory '_FeedController', ->
@_isAddingFolder = false
+ @$scope.$on 'createFolder', (scope, folderName) =>
+ $scope.addFolder(folderName)
+
+
toggleFolder: (folderId) ->
folder = @_folderModel.getById(folderId)
diff --git a/js/app/directives/addfolderselect.coffee b/js/app/directives/addfolderselect.coffee
index 1c3f39f04..41a111823 100644
--- a/js/app/directives/addfolderselect.coffee
+++ b/js/app/directives/addfolderselect.coffee
@@ -25,7 +25,8 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
Turns a normal select into a folder select with the ability to create new
folders
###
-angular.module('News').directive 'addFolderSelect', ['$rootScope', ->
+angular.module('News').directive 'addFolderSelect',
+['$rootScope', 'FolderModel', ($rootScope, FolderModel) ->
return (scope, elm, attr) ->
@@ -33,9 +34,12 @@ angular.module('News').directive 'addFolderSelect', ['$rootScope', ->
singleSelect: true
selectedFirst: true
createText: $(elm).data('create')
- createdCallback: (selected, value) ->
- console.log selected
- console.log value
+ createCallback: (selected, value) ->
+ if FolderModel.nameExists(value)
+ return false
+ else
+ $rootScope.$broadcast 'createFolder', value
+
$(elm).multiSelect(options)
diff --git a/js/app/services/models/foldermodel.coffee b/js/app/services/models/foldermodel.coffee
index 208bd2f4b..56997e603 100644
--- a/js/app/services/models/foldermodel.coffee
+++ b/js/app/services/models/foldermodel.coffee
@@ -20,9 +20,16 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
###
-angular.module('News').factory '_FolderModel', ['_Model', (_Model) ->
+angular.module('News').factory '_FolderModel',
+['_Model', '_EqualQuery', (_Model, _EqualQuery) ->
class FolderModel extends _Model
+
+ nameExists: (folderName) ->
+ query = new _EqualQuery('name', folderName.trim(), true)
+ return @get(query).length > 0
+
+
return FolderModel
] \ No newline at end of file
diff --git a/js/public/app.js b/js/public/app.js
index 06cbb6e3e..edf48f309 100644
--- a/js/public/app.js
+++ b/js/public/app.js
@@ -97,16 +97,19 @@ folders
(function() {
angular.module('News').directive('addFolderSelect', [
- '$rootScope', function() {
+ '$rootScope', 'FolderModel', function($rootScope, FolderModel) {
return function(scope, elm, attr) {
var options;
options = {
singleSelect: true,
selectedFirst: true,
createText: $(elm).data('create'),
- createdCallback: function(selected, value) {
- console.log(selected);
- return console.log(value);
+ createCallback: function(selected, value) {
+ if (FolderModel.nameExists(value)) {
+ return false;
+ } else {
+ return $rootScope.$broadcast('createFolder', value);
+ }
}
};
return $(elm).multiSelect(options);
@@ -275,19 +278,14 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
}
};
this.$scope.addFolder = function(folderName) {
- var folder, _i, _len, _ref;
_this.$scope.folderEmptyError = false;
_this.$scope.folderExistsError = false;
- if (angular.isUndefined(folderName) || folderName.trim() === '') {
+ folderName = folderName.trim();
+ if (angular.isUndefined(folderName) || folderName === '') {
_this.$scope.folderEmptyError = true;
} else {
- folderName = folderName.trim();
- _ref = _this._folderModel.getAll();
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- folder = _ref[_i];
- if (folderName.toLowerCase() === folder.name.toLowerCase()) {
- _this.$scope.folderExistsError = true;
- }
+ if (_this._folderModel.nameExists(folderName)) {
+ _this.$scope.folderExistsError = true;
}
}
if (!(_this.$scope.folderEmptyError || _this.$scope.folderExistsError)) {
@@ -298,6 +296,9 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
});
}
};
+ this.$scope.$on('createFolder', function(scope, folderName) {
+ return $scope.addFolder(folderName);
+ });
}
FeedController.prototype.toggleFolder = function(folderId) {
@@ -793,7 +794,7 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
angular.module('News').factory('_FolderModel', [
- '_Model', function(_Model) {
+ '_Model', '_EqualQuery', function(_Model, _EqualQuery) {
var FolderModel;
FolderModel = (function(_super) {
@@ -803,6 +804,12 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
return FolderModel.__super__.constructor.apply(this, arguments);
}
+ FolderModel.prototype.nameExists = function(folderName) {
+ var query;
+ query = new _EqualQuery('name', folderName.trim(), true);
+ return this.get(query).length > 0;
+ };
+
return FolderModel;
})(_Model);
diff --git a/js/tests/controllers/feedcontrollerSpec.coffee b/js/tests/controllers/feedcontrollerSpec.coffee
index 71c76d57e..a37430d26 100644
--- a/js/tests/controllers/feedcontrollerSpec.coffee
+++ b/js/tests/controllers/feedcontrollerSpec.coffee
@@ -29,10 +29,12 @@ describe '_FeedController', ->
beforeEach inject (@_FeedController, @ActiveFeed, @ShowAll, @FeedType,
@StarredCount, @FeedModel, @FolderModel, @ItemModel) =>
- @scope = {}
- @persistence = {
+ @scope =
+ $on: ->
+
+ @persistence =
getItems: ->
- }
+
@controller = new @_FeedController(@scope, @FolderModel, @FeedModel,
@ActiveFeed, @ShowAll, @FeedType,
@StarredCount, @persistence,
diff --git a/js/tests/services/models/foldermodelSpec.coffee b/js/tests/services/models/foldermodelSpec.coffee
index 3cae0064c..bfac1fd49 100644
--- a/js/tests/services/models/foldermodelSpec.coffee
+++ b/js/tests/services/models/foldermodelSpec.coffee
@@ -29,4 +29,12 @@ describe '_FolderModel', ->
it 'should extend model', =>
- expect(new @_FolderModel instanceof @_Model).toBeTruthy() \ No newline at end of file
+ expect(new @_FolderModel instanceof @_Model).toBeTruthy()
+
+
+ it 'should allow to search for foldernames', =>
+ model = new @_FolderModel()
+ model.add({id: 3, name: 'hi'})
+
+ expect(model.nameExists('hi')).toBeTruthy()
+ expect(model.nameExists('dhi')).toBeFalsy() \ No newline at end of file
diff --git a/templates/part.addnew.php b/templates/part.addnew.php
index 9a625e2f3..e78c5f97f 100644
--- a/templates/part.addnew.php
+++ b/templates/part.addnew.php
@@ -28,12 +28,14 @@
ng-click="addFeed(feedUrl, folderId)"><?php p($l->t('Add')); ?></button>
<select name="folder"
data-create="<?php p($l->t('New folder')); ?>"
- title="<?php p($l->t('Folder')); ?>"
- ng-model="folderId"
+ title="<?php p($l->t('Folder')); ?>
+" ng-model="folderId"
ng-disabled="isAddingFolder()"
- ng-options="folder.name for folder in getFolders()"
- add-folder-select>
- <option value="" selected><?php p($l->t('No folder')); ?></option>
+ ng-options="folder.name for folder in folders"
+ add-folder-select
+ multiple="multiple">
+ <option value="" selected="selected">- <?php p($l->t('Top Level')); ?></option>
+ <option>create</option>
</select>
</form>
</fieldset>