Replace dropdowns with autocomplete, for "find principals by perm"
This commit is contained in:
		
							parent
							
								
									f86cc83996
								
							
						
					
					
						commit
						659f5a8fe1
					
				
					 3 changed files with 173 additions and 47 deletions
				
			
		| 
						 | 
					@ -16,44 +16,67 @@
 | 
				
			||||||
    <div>
 | 
					    <div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ${h.form(request.current_route_url(), method='GET', **{'@submit': 'formSubmitting = true'})}
 | 
					      ${h.form(request.current_route_url(), method='GET', **{'@submit': 'formSubmitting = true'})}
 | 
				
			||||||
 | 
					        <div style="margin-left: 10rem; max-width: 50%;">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <b-field label="Permission Group" horizontal>
 | 
					          ${h.hidden('permission_group', **{':value': 'selectedGroup'})}
 | 
				
			||||||
        <b-select name="permission_group"
 | 
					          <b-field label="Permission Group" horizontal>
 | 
				
			||||||
                  v-model="selectedGroup"
 | 
					            <b-autocomplete v-if="!selectedGroup"
 | 
				
			||||||
                  @input="selectGroup">
 | 
					                            ref="permissionGroupAutocomplete"
 | 
				
			||||||
          <option v-for="groupkey in sortedGroups"
 | 
					                            v-model="permissionGroupTerm"
 | 
				
			||||||
                  :key="groupkey"
 | 
					                            :data="permissionGroupChoices"
 | 
				
			||||||
                  :value="groupkey">
 | 
					                            field="groupkey"
 | 
				
			||||||
            {{ permissionGroups[groupkey].label }}
 | 
					                            :custom-formatter="filtr => filtr.label"
 | 
				
			||||||
          </option>
 | 
					                            open-on-focus
 | 
				
			||||||
        </b-select>
 | 
					                            keep-first
 | 
				
			||||||
      </b-field>
 | 
					                            icon-pack="fas"
 | 
				
			||||||
 | 
					                            clearable
 | 
				
			||||||
 | 
					                            clear-on-select
 | 
				
			||||||
 | 
					                            @select="permissionGroupSelect">
 | 
				
			||||||
 | 
					            </b-autocomplete>
 | 
				
			||||||
 | 
					            <b-button v-if="selectedGroup"
 | 
				
			||||||
 | 
					                      @click="permissionGroupReset()">
 | 
				
			||||||
 | 
					              {{ permissionGroups[selectedGroup].label }}
 | 
				
			||||||
 | 
					            </b-button>
 | 
				
			||||||
 | 
					          </b-field>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <b-field label="Permission" horizontal>
 | 
					          ${h.hidden('permission', **{':value': 'selectedPermission'})}
 | 
				
			||||||
        <b-select name="permission"
 | 
					          <b-field label="Permission" horizontal>
 | 
				
			||||||
                  v-model="selectedPermission">
 | 
					            <b-autocomplete v-if="!selectedPermission"
 | 
				
			||||||
          <option v-for="perm in groupPermissions"
 | 
					                            ref="permissionAutocomplete"
 | 
				
			||||||
                  :key="perm.permkey"
 | 
					                            v-model="permissionTerm"
 | 
				
			||||||
                  :value="perm.permkey">
 | 
					                            :data="permissionChoices"
 | 
				
			||||||
            {{ perm.label }}
 | 
					                            field="permkey"
 | 
				
			||||||
          </option>
 | 
					                            :custom-formatter="filtr => filtr.label"
 | 
				
			||||||
        </b-select>
 | 
					                            open-on-focus
 | 
				
			||||||
      </b-field>
 | 
					                            keep-first
 | 
				
			||||||
 | 
					                            icon-pack="fas"
 | 
				
			||||||
 | 
					                            clearable
 | 
				
			||||||
 | 
					                            clear-on-select
 | 
				
			||||||
 | 
					                            @select="permissionSelect">
 | 
				
			||||||
 | 
					            </b-autocomplete>
 | 
				
			||||||
 | 
					            <b-button v-if="selectedPermission"
 | 
				
			||||||
 | 
					                      @click="permissionReset()">
 | 
				
			||||||
 | 
					              {{ selectedPermissionLabel }}
 | 
				
			||||||
 | 
					            </b-button>
 | 
				
			||||||
 | 
					          </b-field>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <div class="buttons">
 | 
					          <b-field horizontal>
 | 
				
			||||||
        <once-button tag="a"
 | 
					            <div class="buttons" style="margin-top: 1rem;">
 | 
				
			||||||
                     href="${request.current_route_url(_query=None)}"
 | 
					              <once-button tag="a"
 | 
				
			||||||
                     text="Reset Form">
 | 
					                           href="${request.current_route_url(_query=None)}"
 | 
				
			||||||
        </once-button>
 | 
					                           text="Reset Form">
 | 
				
			||||||
        <b-button type="is-primary"
 | 
					              </once-button>
 | 
				
			||||||
                  native-type="submit"
 | 
					              <b-button type="is-primary"
 | 
				
			||||||
                  icon-pack="fas"
 | 
					                        native-type="submit"
 | 
				
			||||||
                  icon-left="search"
 | 
					                        icon-pack="fas"
 | 
				
			||||||
                  :disabled="formSubmitting">
 | 
					                        icon-left="search"
 | 
				
			||||||
          {{ formSubmitting ? "Working, please wait..." : "Find ${model_title_plural}" }}
 | 
					                        :disabled="formSubmitting">
 | 
				
			||||||
        </b-button>
 | 
					                {{ formSubmitting ? "Working, please wait..." : "Find ${model_title_plural}" }}
 | 
				
			||||||
      </div>
 | 
					              </b-button>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </b-field>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
      ${h.end_form()}
 | 
					      ${h.end_form()}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      % if principals is not None:
 | 
					      % if principals is not None:
 | 
				
			||||||
| 
						 | 
					@ -91,24 +114,114 @@
 | 
				
			||||||
        data() {
 | 
					        data() {
 | 
				
			||||||
            return {
 | 
					            return {
 | 
				
			||||||
                groupPermissions: ${json.dumps(buefy_perms.get(selected_group, {}).get('permissions', []))|n},
 | 
					                groupPermissions: ${json.dumps(buefy_perms.get(selected_group, {}).get('permissions', []))|n},
 | 
				
			||||||
 | 
					                permissionGroupTerm: '',
 | 
				
			||||||
 | 
					                permissionTerm: '',
 | 
				
			||||||
                selectedGroup: ${json.dumps(selected_group)|n},
 | 
					                selectedGroup: ${json.dumps(selected_group)|n},
 | 
				
			||||||
                % if selected_permission:
 | 
					 | 
				
			||||||
                selectedPermission: ${json.dumps(selected_permission)|n},
 | 
					                selectedPermission: ${json.dumps(selected_permission)|n},
 | 
				
			||||||
                % elif selected_group in buefy_perms:
 | 
					                selectedPermissionLabel: ${json.dumps(selected_permission_label or '')|n},
 | 
				
			||||||
                selectedPermission: ${json.dumps(buefy_perms[selected_group]['permissions'][0]['permkey'])|n},
 | 
					 | 
				
			||||||
                % else:
 | 
					 | 
				
			||||||
                selectedPermission: null,
 | 
					 | 
				
			||||||
                % endif
 | 
					 | 
				
			||||||
                formSubmitting: false,
 | 
					                formSubmitting: false,
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        computed: {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            permissionGroupChoices() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // collect all groups
 | 
				
			||||||
 | 
					                let choices = []
 | 
				
			||||||
 | 
					                for (let groupkey of this.sortedGroups) {
 | 
				
			||||||
 | 
					                    choices.push(this.permissionGroups[groupkey])
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // parse list of search terms
 | 
				
			||||||
 | 
					                let terms = []
 | 
				
			||||||
 | 
					                for (let term of this.permissionGroupTerm.toLowerCase().split(' ')) {
 | 
				
			||||||
 | 
					                    term = term.trim()
 | 
				
			||||||
 | 
					                    if (term) {
 | 
				
			||||||
 | 
					                        terms.push(term)
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // filter groups by search terms
 | 
				
			||||||
 | 
					                choices = choices.filter(option => {
 | 
				
			||||||
 | 
					                    let label = option.label.toLowerCase()
 | 
				
			||||||
 | 
					                    for (let term of terms) {
 | 
				
			||||||
 | 
					                        if (label.indexOf(term) < 0) {
 | 
				
			||||||
 | 
					                            return false
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    return true
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return choices
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            permissionChoices() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // collect all permissions for current group
 | 
				
			||||||
 | 
					                let choices = this.groupPermissions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // parse list of search terms
 | 
				
			||||||
 | 
					                let terms = []
 | 
				
			||||||
 | 
					                for (let term of this.permissionTerm.toLowerCase().split(' ')) {
 | 
				
			||||||
 | 
					                    term = term.trim()
 | 
				
			||||||
 | 
					                    if (term) {
 | 
				
			||||||
 | 
					                        terms.push(term)
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // filter permissions by search terms
 | 
				
			||||||
 | 
					                choices = choices.filter(option => {
 | 
				
			||||||
 | 
					                    let label = option.label.toLowerCase()
 | 
				
			||||||
 | 
					                    for (let term of terms) {
 | 
				
			||||||
 | 
					                        if (label.indexOf(term) < 0) {
 | 
				
			||||||
 | 
					                            return false
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    return true
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return choices
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        methods: {
 | 
					        methods: {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            selectGroup(groupkey) {
 | 
					            permissionGroupSelect(option) {
 | 
				
			||||||
 | 
					                this.selectedPermission = null
 | 
				
			||||||
 | 
					                this.selectedPermissionLabel = null
 | 
				
			||||||
 | 
					                if (option) {
 | 
				
			||||||
 | 
					                    this.selectedGroup = option.groupkey
 | 
				
			||||||
 | 
					                    this.groupPermissions = this.permissionGroups[option.groupkey].permissions
 | 
				
			||||||
 | 
					                    this.$nextTick(() => {
 | 
				
			||||||
 | 
					                        this.$refs.permissionAutocomplete.focus()
 | 
				
			||||||
 | 
					                    })
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // re-populate Permission dropdown, auto-select first option
 | 
					            permissionGroupReset() {
 | 
				
			||||||
                this.groupPermissions = this.permissionGroups[groupkey].permissions
 | 
					                this.selectedGroup = null
 | 
				
			||||||
                this.selectedPermission = this.groupPermissions[0].permkey
 | 
					                this.selectedPermission = null
 | 
				
			||||||
 | 
					                this.selectedPermissionLabel = ''
 | 
				
			||||||
 | 
					                this.$nextTick(() => {
 | 
				
			||||||
 | 
					                    this.$refs.permissionGroupAutocomplete.focus()
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            permissionSelect(option) {
 | 
				
			||||||
 | 
					                if (option) {
 | 
				
			||||||
 | 
					                    this.selectedPermission = option.permkey
 | 
				
			||||||
 | 
					                    this.selectedPermissionLabel = option.label
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            permissionReset() {
 | 
				
			||||||
 | 
					                this.selectedPermission = null
 | 
				
			||||||
 | 
					                this.selectedPermissionLabel = null
 | 
				
			||||||
 | 
					                this.permissionTerm = ''
 | 
				
			||||||
 | 
					                this.$nextTick(() => {
 | 
				
			||||||
 | 
					                    this.$refs.permissionAutocomplete.focus()
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,8 +3,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<%def name="context_menu_items()">
 | 
					<%def name="context_menu_items()">
 | 
				
			||||||
  ${parent.context_menu_items()}
 | 
					  ${parent.context_menu_items()}
 | 
				
			||||||
  % if request.has_perm('{}.find_by_perm'.format(permission_prefix)):
 | 
					  % if master.has_perm('find_by_perm'):
 | 
				
			||||||
      <li>${h.link_to("Find {} with Permission X".format(model_title_plural), url('{}.find_by_perm'.format(route_prefix)))}</li>
 | 
					      <li>${h.link_to(f"Find {model_title_plural} by Permission", url(f'{route_prefix}.find_by_perm'))}</li>
 | 
				
			||||||
  % endif
 | 
					  % endif
 | 
				
			||||||
</%def>
 | 
					</%def>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -77,7 +77,20 @@ class PrincipalMasterView(MasterView):
 | 
				
			||||||
        perms = self.get_buefy_perms_data(sorted_perms)
 | 
					        perms = self.get_buefy_perms_data(sorted_perms)
 | 
				
			||||||
        context['buefy_perms'] = perms
 | 
					        context['buefy_perms'] = perms
 | 
				
			||||||
        context['buefy_sorted_groups'] = list(perms)
 | 
					        context['buefy_sorted_groups'] = list(perms)
 | 
				
			||||||
        context['selected_group'] = permission_group or 'common'
 | 
					
 | 
				
			||||||
 | 
					        if permission_group and permission_group not in perms:
 | 
				
			||||||
 | 
					            permission_group = None
 | 
				
			||||||
 | 
					        if permission:
 | 
				
			||||||
 | 
					            if permission_group:
 | 
				
			||||||
 | 
					                group = dict([(p['permkey'], p) for p in perms[permission_group]['permissions']])
 | 
				
			||||||
 | 
					                if permission in group:
 | 
				
			||||||
 | 
					                    context['selected_permission_label'] = group[permission]['label']
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
 | 
					                    permission = None
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                permission = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        context['selected_group'] = permission_group
 | 
				
			||||||
        context['selected_permission'] = permission
 | 
					        context['selected_permission'] = permission
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return self.render_to_response('find_by_perm', context)
 | 
					        return self.render_to_response('find_by_perm', context)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue