Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/09/18 07:56:01 (7 years ago)
Author:
jzenisek
Message:

#2839 worked on HiveAdministrator:

  • corrected and modified CRUD operations
  • improved usability by providing detailed state information, adding dialogs etc.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs

    r15658 r15742  
    4040    private const int greenFlagImageIndex = 0;
    4141    private const int redFlagImageIndex = 1;
     42
    4243    private readonly Color changedColor = Color.FromArgb(255, 87, 191, 193); // #57bfc1
    4344    private readonly Color selectedColor = Color.FromArgb(255, 240, 194, 59); // #f0c23b
     45    private Project selectedProject = null;
    4446
    4547    private readonly object locker = new object();
    46 
    47     private Project selectedProject = null;
    4848
    4949    public new IItemList<Project> Content {
     
    173173    private async void ProjectsView_Load(object sender, EventArgs e) {
    174174      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
    175         action: () => UpdateProjects(),
    176         finallyCallback: () => Content = HiveAdminClient.Instance.Projects);
     175        action: () => UpdateProjects());
    177176    }
    178177
     
    186185        action: () => UpdateProjects(),
    187186        finallyCallback: () => {
    188           Content = HiveAdminClient.Instance.Projects;
    189187          refreshButton.Enabled = true;
    190188        });
     
    193191    private void addButton_Click(object sender, EventArgs e) {
    194192      Guid? parentProjectId = null;
     193
     194      if (selectedProject != null && selectedProject.Id == Guid.Empty) {
     195        MessageBox.Show(
     196          "You cannot add a project to a not yet stored project.",
     197          "HeuristicLab Hive Administrator",
     198          MessageBoxButtons.OK,
     199          MessageBoxIcon.Information);
     200        return;
     201      }
     202
    195203      if (selectedProject != null) parentProjectId = selectedProject.Id;
    196204      var project = new Project {
     
    199207        ParentProjectId = parentProjectId
    200208      };
     209
     210      selectedProject = project;
    201211      Content.Add(project);
    202212    }
    203213
    204214    private async void removeButton_Click(object sender, EventArgs e) {
     215      if (selectedProject == null) return;
     216
    205217      lock (locker) {
    206218        if (!removeButton.Enabled) return;
     
    208220      }
    209221
    210       var selectedNode = projectsTreeView.SelectedNode;
    211       if (selectedNode == null || selectedNode.Tag == null) return;
    212 
    213       var project = (Project)selectedNode.Tag;
     222      if(!IsAdmin()
     223        && HiveAdminClient.Instance.CheckOwnershipOfParentProject(selectedProject,
     224          UserInformation.Instance.User.Id)) {
     225        MessageBox.Show(
     226          "Only subprojects of owned projects can be deleted.",
     227          "HeuristicLab Hive Administrator",
     228          MessageBoxButtons.OK,
     229          MessageBoxIcon.Error);
     230        return;
     231      }
     232
     233      if (!IsAdmin() && Content.Any(x => x.ParentProjectId == selectedProject.Id)) {
     234        MessageBox.Show(
     235          "Only empty projects can be deleted.",
     236          "HeuristicLab Hive Administrator",
     237          MessageBoxButtons.OK,
     238          MessageBoxIcon.Error);
     239        return;
     240      }
     241
    214242      var result = MessageBox.Show(
    215         "Do you really want to delete " + project.Name + "?",
     243        "Do you really want to delete " + selectedProject.Name + "?",
    216244        "HeuristicLab Hive Administrator",
    217245        MessageBoxButtons.YesNo,
     
    219247
    220248      if (result == DialogResult.Yes) {
    221         if (Content.Any(x => x.ParentProjectId == project.Id)) {
    222           MessageBox.Show(
    223             "Only empty projects can be deleted.",
    224             "HeuristicLab Hive Administrator",
    225             MessageBoxButtons.OK,
    226             MessageBoxIcon.Error);
    227         } else {
    228           await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
    229             action: () => RemoveProject(project),
    230             finallyCallback: () => {
    231               Content.Remove(project);
    232               removeButton.Enabled = true;
    233             });
    234         }
     249        await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
     250          action: () => RemoveProject(selectedProject),
     251          finallyCallback: () => {
     252            removeButton.Enabled = true;
     253          });
    235254      }
    236255    }
     
    247266          foreach (var project in projectsToSave)
    248267            project.Store();
     268          UpdateProjects();
    249269        },
    250270        finallyCallback: () => saveProjectButton.Enabled = true);
     
    254274
    255275    private void projectsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
    256       selectedProject = (Project)e.Node.Tag;
    257       ReColorTreeNodes(projectsTreeView.Nodes, selectedColor, Color.Transparent, true);
    258       e.Node.BackColor = selectedColor;
    259       e.Node.Text += " [selected]";
    260      
     276      ChangeSelectedProjectNode(e.Node);
    261277
    262278      //if (projectView.Content != null)
     
    269285      //if (selectedProject != null)
    270286      //  selectedProject.PropertyChanged += ProjectViewContent_PropertyChanged;
    271 
    272       //if (IsAuthorized(selectedProject)) {
    273       //  if (!tabControl.TabPages.Contains(permissionsTabPage))
    274       //    tabControl.TabPages.Add(permissionsTabPage);
    275       //  if (!tabControl.TabPages.Contains(resourcesTabPage))
    276       //    tabControl.TabPages.Add(resourcesTabPage);
    277       //} else {
    278       //  if (tabControl.TabPages.Contains(permissionsTabPage))
    279       //    tabControl.TabPages.Remove(permissionsTabPage);
    280       //  if (tabControl.TabPages.Contains(resourcesTabPage))
    281       //    tabControl.TabPages.Remove(resourcesTabPage);
    282       //}
    283287    }
    284288
     
    286290      var sourceNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
    287291      if (sourceNode == null) return;
     292      var sourceResource = ((Project)sourceNode.Tag);
     293      if (sourceResource == null) return;
    288294
    289295      var treeView = (TreeView)sender;
     
    294300
    295301      if (sourceNode == targetNode) return;
    296 
    297       if (sourceNode.Parent == null)
     302      var targetProject = (targetNode != null) ? (Project)targetNode.Tag : null;
     303
     304      if(targetProject != null && targetProject.Id == Guid.Empty) {
     305        MessageBox.Show(
     306          "You cannot drag projects to a not yet stored project.",
     307          "HeuristicLab Hive Administrator",
     308          MessageBoxButtons.OK,
     309          MessageBoxIcon.Information);
     310            return;
     311      }
     312
     313      if (sourceNode.Parent == null) {
    298314        treeView.Nodes.Remove(sourceNode);
    299       else {
     315      } else {
    300316        sourceNode.Parent.Nodes.Remove(sourceNode);
    301         ((Project)sourceNode.Tag).ParentProjectId = null;
     317        sourceResource.ParentProjectId = null;
    302318      }
    303319
    304320      if (targetNode == null) {
    305321        treeView.Nodes.Add(sourceNode);
    306       } else {
     322      } else if(targetProject.Id != Guid.Empty) {
    307323        targetNode.Nodes.Add(sourceNode);
    308         ((Project)sourceNode.Tag).ParentProjectId = ((Project)targetNode.Tag).Id;
    309       }
     324        sourceResource.ParentProjectId = targetProject.Id;
     325      }
     326
     327      selectedProject = sourceResource;
     328      OnContentChanged();
    310329    }
    311330
     
    330349
    331350    #region Helpers
    332     private void ReColorTreeNodes(TreeNodeCollection nodes, Color c1, Color c2, bool resetText) {
    333       foreach(TreeNode n in nodes) {
    334         if(n.BackColor.Equals(c1)) {
     351    private void ResetTreeNodes(TreeNodeCollection nodes, Color c1, Color c2, bool resetText) {
     352      foreach (TreeNode n in nodes) {
     353        var pro = ((Project)n.Tag);
     354        if (n.BackColor.Equals(c1)) {
    335355          n.BackColor = c2;
    336           if (resetText) n.Text = ((Project)n.Tag).Name;
     356        }
     357        if (resetText) {
     358          n.Text = pro.Name;
     359
     360          if (pro.Id == Guid.Empty) {
     361            n.Text += " [not stored]";
     362          } else if (pro.Modified) {
     363            n.Text += " [changes not stored]";
     364          }
    337365        }
    338366        if (n.Nodes.Count > 0) {
    339           ReColorTreeNodes(n.Nodes, c1, c2, resetText);
    340         }
    341       }
     367          ResetTreeNodes(n.Nodes, c1, c2, resetText);
     368        }
     369      }
     370    }
     371
     372    private void ChangeSelectedProjectNode(TreeNode projectNode) {
     373      selectedProject = (Project)projectNode.Tag;
     374      ResetTreeNodes(projectsTreeView.Nodes, selectedColor, Color.Transparent, true);
     375      projectNode.BackColor = selectedColor;
     376      projectNode.Text += " [selected]";
    342377    }
    343378
     
    354389
    355390      var stack = new Stack<Project>(mainProjects.OrderByDescending(x => x.Name));
    356       Project top = null;
     391      if (selectedProject != null) selectedProject = projects.Where(x => x.Id == selectedProject.Id).FirstOrDefault();
    357392
    358393      TreeNode currentNode = null;
     
    362397        var newProject = stack.Pop();
    363398        var newNode = new TreeNode(newProject.Name) { Tag = newProject };
    364         if (top == null) {
    365           top = newProject;
     399
     400        if (newProject.Id == Guid.Empty) {
     401          newNode.Text += " [not stored]";
     402        } else if(newProject.Modified) {
     403          newNode.Text += " [changes not stored]";
     404        }
     405        if (selectedProject == null) {
     406          selectedProject = newProject;
     407        }
     408        if (newProject.Id == selectedProject.Id) {
    366409          newNode.BackColor = selectedColor;
    367410          newNode.Text += " [selected]";
    368411        }
    369412
     413        // search for parent node of newNode and save in currentNode
     414        // necessary since newNodes (stack top items) might be siblings
     415        // or grand..grandparents of previous node (currentNode)
    370416        while (currentNode != null && newProject.ParentProjectId != currentProject.Id) {
    371417          currentNode = currentNode.Parent;
     
    396442      projectsTreeView.ExpandAll();
    397443
    398       return top;
     444      return selectedProject;
    399445    }
    400446
     
    402448      try {
    403449        HiveAdminClient.Instance.Refresh();
     450        Content = HiveAdminClient.Instance.Projects;
    404451      } catch (AnonymousUserException) {
    405452        ShowHiveInformationDialog();
     
    408455
    409456    private void RemoveProject(Project project) {
     457      if (project == null || project.Id == Guid.Empty) return;
     458
    410459      try {
    411460        HiveAdminClient.Delete(project);
     461        Content.Remove(selectedProject);
    412462      } catch (AnonymousUserException) {
    413463        ShowHiveInformationDialog();
     
    420470    }
    421471
     472    private bool IsAdmin() {
     473      return HiveRoles.CheckAdminUserPermissions();
     474    }
     475
    422476    private void ShowHiveInformationDialog() {
    423477      if (InvokeRequired) Invoke((Action)ShowHiveInformationDialog);
Note: See TracChangeset for help on using the changeset viewer.