Browse Source

Added enhanced Group access functionality.

Thorsten Eckel 7 years ago
parent
commit
350c3ead51

+ 1 - 0
Gemfile

@@ -52,6 +52,7 @@ gem 'mime-types'
 
 gem 'biz'
 
+gem 'composite_primary_keys'
 gem 'delayed_job_active_record'
 gem 'daemons'
 

+ 3 - 0
Gemfile.lock

@@ -75,6 +75,8 @@ GEM
       coffee-script
       execjs
       json
+    composite_primary_keys (8.1.5)
+      activerecord (~> 4.2.0)
     concurrent-ruby (1.0.2)
     coveralls (0.8.16)
       json (>= 1.8, < 3)
@@ -430,6 +432,7 @@ DEPENDENCIES
   coffee-rails
   coffee-script-source
   coffeelint
+  composite_primary_keys
   coveralls
   daemons
   delayed_job_active_record

+ 9 - 8
app/assets/javascripts/app/controllers/_profile/notification.coffee

@@ -75,13 +75,14 @@ class Index extends App.ControllerSubContent
     groups = []
     group_ids = @Session.get('group_ids')
     if group_ids
-      for group_id in group_ids
-        group = App.Group.find(group_id)
-        groups.push group
-        if !user_group_config
-          if !config['group_ids']
-            config['group_ids'] = []
-          config['group_ids'].push group_id.toString()
+      for group_id, access of group_ids
+        if _.contains(access, 'full')
+          group = App.Group.find(group_id)
+          groups.push group
+          if !user_group_config
+            if !config['group_ids']
+              config['group_ids'] = []
+            config['group_ids'].push group_id.toString()
 
     for sound in @sounds
       sound.selected = sound.file is App.OnlineNotification.soundFile() ? true : false
@@ -90,7 +91,7 @@ class Index extends App.ControllerSubContent
       groups: groups
       config: config
       sounds: @sounds
-      notification_sound_enabled: App.OnlineNotification.soundEnabled()
+      notificationSoundEnabled: App.OnlineNotification.soundEnabled()
 
   update: (e) =>
 

+ 16 - 1
app/assets/javascripts/app/controllers/_ui_element/permission.coffee

@@ -4,10 +4,25 @@ class App.UiElement.permission extends App.UiElement.ApplicationUiElement
 
     permissions = App.Permission.search(sortBy: 'name')
 
+    # get selectable groups and selected groups
+    groups = []
+    groupsSelected = {}
+    groupsRaw = App.Group.search(sortBy: 'name')
+    for group in groupsRaw
+      if group.active
+        groups.push group
+        if params.group_ids
+          for group_id in params.group_ids
+            if group_id.toString() is group.id.toString()
+              groupsSelected[group.id] = true
+
     item = $( App.view('generic/permission')(
       attribute: attribute
       params: params
       permissions: permissions
+      groups: groups
+      groupsSelected: groupsSelected
+      groupAccesses: App.Group.accesses()
     ) )
 
     # show/hide trees
@@ -37,4 +52,4 @@ class App.UiElement.permission extends App.UiElement.ApplicationUiElement
 
     )
 
-    item
+    item

+ 3 - 2
app/assets/javascripts/app/controllers/_ui_element/user_permission.coffee

@@ -72,6 +72,7 @@ class App.UiElement.user_permission
       rolesSelected: rolesSelected
       groupsSelected: groupsSelected
       hideGroups: hideGroups
+      groupAccesses: App.Group.accesses()
     ) )
 
     # if customer, remove admin and agent
@@ -105,7 +106,7 @@ class App.UiElement.user_permission
 
           # select groups if only one is available
           if hideGroups
-            item.find('.js-groupList [name=group_ids]').prop('checked', false)
+            item.find('.js-groupList .js-groupListItem[value=full]').prop('checked', false)
         return
 
       # if role with groups plugin is selected, show group selection
@@ -114,7 +115,7 @@ class App.UiElement.user_permission
 
         # select groups if only one is available
         if hideGroups
-          item.find('.js-groupList [name=group_ids]').prop('checked', true)
+          item.find('.js-groupList .js-groupListItem[value=full]').prop('checked', true)
 
       for trigger in triggers
         trigger.trigger('change')

+ 5 - 4
app/assets/javascripts/app/controllers/agent_ticket_create.coffee

@@ -476,10 +476,11 @@ class App.TicketCreate extends App.Controller
         ui.scrollTo()
 
         # access to group
-        group_ids = _.map(App.Session.get('group_ids'), (id) -> id.toString())
-        if group_ids && _.contains(group_ids, @group_id.toString())
-          ui.navigate "#ticket/zoom/#{@id}"
-          return
+        for group_id, access of App.Session.get('group_ids')
+          if @group_id.toString() is group_id.toString()
+            if _.contains(access, 'read') || _.contains(access, 'full')
+              ui.navigate "#ticket/zoom/#{@id}"
+              return
 
         # if not, show start screen
         ui.navigate '#'

+ 9 - 1
app/assets/javascripts/app/models/group.coffee

@@ -34,4 +34,12 @@ class App.Group extends App.Model
     cssClass.push("avatar--group-color-#{@id % 3}")
 
     return App.view('avatar_group')
-      cssClass: cssClass.join(' ')
+      cssClass: cssClass.join(' ')
+
+  @accesses: ->
+    read: 'Read'
+    create: 'Create'
+    change: 'Change'
+    delete: 'Delete'
+    overview: 'Overview'
+    full: 'Full'

+ 1 - 1
app/assets/javascripts/app/models/role.coffee

@@ -1,5 +1,5 @@
 class App.Role extends App.Model
-  @configure 'Role', 'name', 'permission_ids', 'default_at_signup', 'note', 'active', 'updated_at'
+  @configure 'Role', 'name', 'permission_ids', 'group_ids', 'default_at_signup', 'note', 'active', 'updated_at'
   @extend Spine.Model.Ajax
   @url: @apiPath + '/roles'
   @configure_attributes = [

+ 30 - 0
app/assets/javascripts/app/views/generic/permission.jst.eco

@@ -15,6 +15,36 @@
         <%- @Icon('checkbox-checked', 'icon-checked') %>
         <span class="label-text"><%= permission.displayName().replace(/^.+?\./, '') %> - <span class="help-text"><%- @T.apply(@, [permission.note].concat(permission.preferences.translations)) %></span></span>
       </label>
+  <%     if _.contains(permission.preferences.plugin, 'groups'): %>
+    <div style="padding-left: 18px; padding-top: 10px;" class="js-groupList <% if @hideGroups: %>js-groupListHide hidden<% end %>">
+      <table class="settings-list">
+        <thead>
+          <th><%- @T('Group') %>
+          <% for key, text of @groupAccesses: %>
+            <th><%- @T(text) %>
+          <% end %>
+        <tbody>
+      <% for group in @groups: %>
+      <%   accesses = [] %>
+      <%   if @params.group_ids && @params.group_ids[group.id]: %>
+      <%     accesses = @params.group_ids[group.id] %>
+      <%   end %>
+        <tr>
+          <td>
+            <%= group.displayName() %>
+          <% for key, text of @groupAccesses: %>
+            <td>
+            <label class="inline-label checkbox-replacement">
+              <input type="checkbox" value="<%= key %>" name="group_ids::<%= group.id %>" <% if _.contains(accesses, key): %>checked<% end %>/>
+              <%- @Icon('checkbox', 'icon-unchecked') %>
+              <%- @Icon('checkbox-checked', 'icon-checked') %>
+            </label>
+          <% end %>
+        </tr>
+      <% end %>
+      </table>
+    </div>
+  <%     end %>
     </div>
   <% end %>
 <% end %>

+ 41 - 9
app/assets/javascripts/app/views/generic/user_permission.jst.eco

@@ -1,4 +1,18 @@
 <div class="checkbox <%= @attribute.class %> checkbox">
+<% showGroups = false %>
+<% for role in @roles: %>
+<%   if role.permissions: %>
+<%     for permission in role.permissions: %>
+<%       if _.contains(permission.preferences.plugin, 'groups'): %>
+<%         if showGroups is true: %>
+<%           showGroups = false %>
+<%           break %>
+<%         end %>
+<%         showGroups = true %>
+<%       end %>
+<%     end %>
+<%   end %>
+<% end %>
 <% for role in @roles: %>
   <label class="inline-label checkbox-replacement">
     <input type="checkbox" value="<%= role.id %>" name="role_ids" <% if @rolesSelected[role.id]: %>checked<% end %>/>
@@ -8,20 +22,38 @@
   </label>
   <% if role.permissions: %>
   <%   for permission in role.permissions: %>
-  <%     if _.contains(permission.preferences.plugin, 'groups'): %>
-    <div style="padding-left: 20px;" class="js-groupList <% if @hideGroups: %>js-groupListHide hidden<% end %>">
+  <%     if showGroups is true && _.contains(permission.preferences.plugin, 'groups'): %>
+    <div style="padding-left: 18px; padding-top: 10px;" class="js-groupList <% if @hideGroups: %>js-groupListHide hidden<% end %>">
+      <table class="settings-list">
+        <thead>
+          <th><%- @T('Group') %>
+          <% for key, text of @groupAccesses: %>
+            <th><%- @T(text) %>
+          <% end %>
+        <tbody>
       <% for group in @groups: %>
-        <label class="inline-label checkbox-replacement">
-          <input type="checkbox" value="<%= group.id %>" name="group_ids" <% if @groupsSelected[group.id]: %>checked<% end %>/>
-          <%- @Icon('checkbox', 'icon-unchecked') %>
-          <%- @Icon('checkbox-checked', 'icon-checked') %>
-          <span class="label-text"><%= group.displayName() %> <% if group.note: %>- <span class="help-text"><%- group.note %></span><% end %></span>
-        </label>
+      <%   permissions = [] %>
+      <%   if @params.group_ids && @params.group_ids[group.id]: %>
+      <%     permissions = @params.group_ids[group.id] %>
+      <%   end %>
+        <tr>
+          <td>
+            <%= group.displayName() %>
+          <% for key, text of @groupAccesses: %>
+            <td>
+            <label class="inline-label checkbox-replacement">
+              <input class="js-groupListItem" type="checkbox" value="<%= key %>" name="group_ids::<%= group.id %>" <% if _.contains(permissions, key): %>checked<% end %>/>
+              <%- @Icon('checkbox', 'icon-unchecked') %>
+              <%- @Icon('checkbox-checked', 'icon-checked') %>
+            </label>
+          <% end %>
+        </tr>
       <% end %>
+      </table>
     </div>
   <%       break %>
   <%     end %>
   <%   end %>
   <% end %>
 <% end %>
-</div>
+</div>

Some files were not shown because too many files changed in this diff