Răsfoiți Sursa

HUE-2033 [core] Added project management functionality

Enrico Berti 11 ani în urmă
părinte
comite
80dab73

+ 6 - 7
desktop/core/src/desktop/api.py

@@ -88,7 +88,6 @@ def massaged_tags_for_json2(docs, user):
   
   ts['notmine'] = [{'name': sharer.username, 'projects': projects} for sharer, projects in sharers.iteritems()]
 
-  print ts
   return ts
 
 def massaged_tags(tag):
@@ -229,7 +228,9 @@ def add_tag(request):
   if request.method == 'POST':
     try:
       tag = DocumentTag.objects.create_tag(request.user, request.POST['name'])
-      response['tag_id'] = tag.id
+      response['name'] = request.POST['name']
+      response['id'] = tag.id
+      response['docs'] = []
       response['status'] = 0
     except Exception, e:
       response['message'] = force_unicode(e)
@@ -273,15 +274,13 @@ def update_tags(request):
   return HttpResponse(json.dumps(response), mimetype="application/json")
 
 
-def remove_tags(request):
+def remove_tag(request):
   response = {'status': -1, 'message': _('Error')}
 
   if request.method == 'POST':
-    request_json = json.loads(request.POST['data'])
     try:
-      for tag_id in request_json['tag_ids']:
-        DocumentTag.objects.delete_tag(tag_id, request.user)
-      response['message'] = _('Tag(s) removed!')
+      DocumentTag.objects.delete_tag(request.POST['tag_id'], request.user)
+      response['message'] = _('Tag removed!')
       response['status'] = 0
     except Exception, e:
       response['message'] = force_unicode(e)

+ 81 - 17
desktop/core/src/desktop/templates/home2.mako

@@ -21,6 +21,10 @@
 ${ commonheader(_('Welcome Home'), "home", user) | n,unicode }
 
 <style type="text/css">
+  .sidebar-nav {
+    margin-bottom: 10px;
+  }
+
   .sidebar-nav img {
     margin-right: 6px;
   }
@@ -35,12 +39,13 @@ ${ commonheader(_('Welcome Home'), "home", user) | n,unicode }
     margin-bottom: 4px;
   }
 
-  #trashCounter, #historyCounter {
+  .tag-counter {
     margin-top: 3px;
+    margin-right: 4px;
   }
 
-  .tag-counter {
-    margin-top: 2px;
+  .fa-times-circle:hover {
+    color: #d84a38;
   }
 
   .toggle-tag, .document-tags-modal-checkbox, .tags-modal-checkbox {
@@ -133,8 +138,8 @@ ${ commonheader(_('Welcome Home'), "home", user) | n,unicode }
            <!-- /ko -->
            <li class="nav-header tag-mine-header">
              ${_('My Projects')}
-             <div class="edit-tags" style="display: inline;cursor: pointer;margin-left: 6px" title="${ _('Edit projects') }">
-               <i class="fa fa-pencil" data-bind="click: editTags"></i>
+             <div class="edit-tags" style="display: inline;cursor: pointer;margin-left: 6px" title="${ _('Create project') }" rel="tooltip" data-placement="right">
+               <i class="fa fa-plus-circle" data-bind="click: addTag"></i>
              </div>
            </li>
            <!-- ko template: { name: 'tag-template', foreach: myTags } -->
@@ -194,8 +199,10 @@ ${ commonheader(_('Welcome Home'), "home", user) | n,unicode }
 
 <script type="text/html" id="tag-template">
   <li data-bind="click: $root.filterDocs, css: {'active': $root.selectedTag().id == id}">
-    <a href="javascript:void(0)">
-      <i data-bind="css: {'fa': true, 'fa-trash-o':name() == 'trash', 'fa-clock-o': name() == 'history', 'fa-tag': name() != 'trash' && name() != 'history'}"></i> <span data-bind="text: name"></span> <span class="badge pull-right" data-bind="text: docs().length"></span>
+    <a href="javascript:void(0)" style="padding-right: 4px">
+      <i data-bind="css: {'fa': true, 'fa-trash-o':name() == 'trash', 'fa-clock-o': name() == 'history', 'fa-tag': name() != 'trash' && name() != 'history'}"></i> <span data-bind="text: name"></span>
+      <i data-bind="click: removeTag, visible: name() != 'trash' && name() != 'history'" class="pull-right fa fa-times-circle"></i>
+      <span class="badge pull-right tag-counter" data-bind="text: docs().length"></span>
     </a>
   </li>
 </script>
@@ -207,7 +214,7 @@ ${ commonheader(_('Welcome Home'), "home", user) | n,unicode }
   <!-- ko foreach: projects-->
   <li data-bind="click: $root.filterDocs, css: {'active': $root.selectedTag().id == id}">
     <a href="javascript:void(0)">
-      &nbsp;&nbsp;&nbsp;<i class="fa fa-tag"></i> <span data-bind="text: name"></span> <span class="badge pull-right" data-bind="text: docs().length"></span>
+      &nbsp;&nbsp;&nbsp;<i class="fa fa-tag"></i> <span data-bind="text: name"></span> <span class="badge pull-right tag-counter" data-bind="text: docs().length"></span>
     </a>
   </li>
   <!-- /ko -->
@@ -243,12 +250,6 @@ ${ commonheader(_('Welcome Home'), "home", user) | n,unicode }
     <p>
       <div data-bind="template: { name: 'tag-edit-template', foreach: myTags }"></div>
       <div class="clearfix"></div>
-      <div style="margin-top: 20px">
-        <div class="input-append">
-          <input id="tagsNew" type="text">
-          <a id="tagsNewBtn" class="btn" type="button"><i class="fa fa-plus-circle"></i> ${ _('Add') }</a>
-        </div>
-      </div>
     </p>
   </div>
   <div class="modal-footer">
@@ -258,6 +259,41 @@ ${ commonheader(_('Welcome Home'), "home", user) | n,unicode }
 </div>
 
 
+<div id="addTagModal" class="modal hide fade">
+  <form class="form-inline form-padding-fix" onsubmit="addTag()">
+    <div class="modal-header">
+      <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+      <h3>${_('Create project')}</h3>
+    </div>
+    <div class="modal-body">
+      <p>
+          <label>
+            ${_('Project name')} <input id="tagsNew" type="text" class="input-xlarge">
+          </label>
+      </p>
+    </div>
+    <div class="modal-footer">
+      <a href="#" data-dismiss="modal" class="btn">${_('Cancel')}</a>
+      <a id="tagsNewBtn" href="#" class="btn btn-primary disable-feedback">${ _('Add') }</a>
+    </div>
+  </form>
+</div>
+
+<div id="removeTagModal" class="modal hide fade">
+    <div class="modal-header">
+        <a href="#" class="close" data-dismiss="modal">&times;</a>
+        <h3>${_('Confirm Delete')}</h3>
+    </div>
+    <div class="modal-body">
+        <p>${_('Are you sure you want to delete the project')} <strong><span data-bind="text: selectedForDelete().name"></span></strong>?</p>
+    </div>
+    <div class="modal-footer">
+        <a class="btn" data-dismiss="modal">${_('No')}</a>
+        <a data-bind="click: removeTagFinal" class="btn btn-danger">${_('Yes')}</a>
+    </div>
+</div>
+
+
 <script type="text/html" id="tag-sharer-template">
   <div style="margin-right:10px;margin-bottom: 6px;float:left;">
     <span class="tags-modal-checkbox badge">
@@ -289,6 +325,7 @@ ${ commonheader(_('Welcome Home'), "home", user) | n,unicode }
     ko.applyBindings(viewModel);
 
     viewModel.selectedTag.subscribe(function (value) {
+      $("#searchInput").val("");
       $.totalStorage("hueHomeSelectedTag", value.id());
     });
 
@@ -314,15 +351,42 @@ ${ commonheader(_('Welcome Home'), "home", user) | n,unicode }
         viewModel.createTag(data);
         $("#tagsNew").val("");
         $(document).trigger("info", "${_('Project created')}");
+        $("#addTagModal").modal("hide");
       }).fail(function (xhr, textStatus, errorThrown) {
         $(document).trigger("error", xhr.responseText); // reserved name, duplicate etc
       });
     });
+
+    $("a[rel='tooltip']").tooltip();
+
   });
 
-  function editTags() {
-    // reset selected tags
-    $("#tagsModal").modal("show");
+  function addTag() {
+    $("#addTagModal").modal("show");
+  }
+
+  function removeTag(tag) {
+    viewModel.selectedForDelete(tag);
+    $("#removeTagModal").modal("show");
+  }
+
+  function removeTagFinal() {
+    var tag = viewModel.selectedForDelete();
+    $.post("/desktop/api/tag/remove_tag", {
+      tag_id: tag.id()
+    }, function (response) {
+      if (response != null) {
+        if (response.status == 0) {
+          $(document).trigger("info", response.message);
+          $("#removeTagModal").modal("hide");
+          viewModel.removeTag(tag);
+          viewModel.filterDocs(viewModel.history());
+        }
+        else {
+          $(document).trigger("error", "${_("There was an error processing your action: ")}" + response.message);
+        }
+      }
+    });
   }
 </script>
 

+ 1 - 1
desktop/core/src/desktop/urls.py

@@ -81,7 +81,7 @@ dynamic_patterns += patterns('desktop.views',
 dynamic_patterns += patterns('desktop.api',
   # Tags
   (r'^desktop/api/tag/add_tag$', 'add_tag'),
-  (r'^desktop/api/tag/remove_tags$', 'remove_tags'),
+  (r'^desktop/api/tag/remove_tag$', 'remove_tag'),
   (r'^desktop/api/tag/list_tags$', 'list_tags'),
   (r'^desktop/api/doc/list_docs$', 'list_docs'),
   (r'^desktop/api/doc/tag$', 'tag'),

+ 8 - 1
desktop/core/static/js/home.vm.js

@@ -73,6 +73,9 @@ function HomeViewModel(json_tags, json_docs) {
   self.editTagsToDelete = ko.observableArray([]);
 
   self.selectedTag = ko.observable("");
+  self.selectedForDelete = ko.observable({
+    name: ''
+  });
 
   self.trash = ko.computed(function () {
     return self.tags.trash;
@@ -146,7 +149,11 @@ function HomeViewModel(json_tags, json_docs) {
   }
 
   self.createTag = function (tag_json) {
-    var mapped_tag = ko.mapping.fromJS({'name': 'default2', 'id': 50, 'docs': [3]}); // todo
+    var mapped_tag = ko.mapping.fromJS(tag_json);
     self.tags.mine.push(mapped_tag);
   }
+
+  self.removeTag = function (tag) {
+    self.tags.mine.remove(tag);
+  }
 }