You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by th...@apache.org on 2021/11/18 22:25:51 UTC

[lucene-solr] branch branch_8x updated: SOLR-15774: Avoid weird off-by-one errors with Angular's 'chosen' select box directive for the security and schema-designer screens in Admin UI (#2613)

This is an automated email from the ASF dual-hosted git repository.

thelabdude pushed a commit to branch branch_8x
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/branch_8x by this push:
     new 563260c  SOLR-15774: Avoid weird off-by-one errors with Angular's 'chosen' select box directive for the security and schema-designer screens in Admin UI (#2613)
563260c is described below

commit 563260c523c5f2253408a02732ed5deae9c45e4f
Author: Timothy Potter <th...@gmail.com>
AuthorDate: Thu Nov 18 15:25:35 2021 -0700

    SOLR-15774: Avoid weird off-by-one errors with Angular's 'chosen' select box directive for the security and schema-designer screens in Admin UI (#2613)
---
 solr/CHANGES.txt                                     |  2 ++
 .../web/js/angular/controllers/schema-designer.js    |  9 +++++++++
 solr/webapp/web/js/angular/controllers/security.js   |  7 +++++++
 solr/webapp/web/partials/schema-designer.html        | 20 ++++++++++----------
 solr/webapp/web/partials/security.html               |  6 ++++--
 5 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index e8ab52f..9c509d5 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -17,6 +17,8 @@ Bug Fixes
 
 * SOLR-15804: Admin UI once again can show files in the Core/Collection -> Files screen. Fixed regression from 8.11.0 (Karl Stoney, janhoy)
 
+* SOLR-15774: Avoid weird off-by-one errors with Angular's 'chosen' select box directive for the security and schema-designer screens in Admin UI (Timothy Potter)
+
 ==================  8.11.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
diff --git a/solr/webapp/web/js/angular/controllers/schema-designer.js b/solr/webapp/web/js/angular/controllers/schema-designer.js
index 4b407ab..3d17036 100644
--- a/solr/webapp/web/js/angular/controllers/schema-designer.js
+++ b/solr/webapp/web/js/angular/controllers/schema-designer.js
@@ -18,6 +18,13 @@
 solrAdminApp.controller('SchemaDesignerController', function ($scope, $timeout, $cookies, $window, Constants, SchemaDesigner, Luke) {
   $scope.resetMenu("schema-designer", Constants.IS_ROOT_PAGE);
 
+  $scope.schemas = [];
+  $scope.publishedSchemas = [];
+  $scope.sampleDocIds = [];
+  $scope.sortableFields = [];
+  $scope.hlFields = [];
+  $scope.types = [];
+
   $scope.onWarning = function (warnMsg, warnDetails) {
     $scope.updateWorking = false;
     delete $scope.updateStatusMessage;
@@ -437,6 +444,8 @@ solrAdminApp.controller('SchemaDesignerController', function ($scope, $timeout,
 
     if (data.docIds) {
       $scope.sampleDocIds = data.docIds;
+    } else {
+      $scope.sampleDocIds = [];
     }
 
     // Load the Luke schema
diff --git a/solr/webapp/web/js/angular/controllers/security.js b/solr/webapp/web/js/angular/controllers/security.js
index 8ee97e3..54e1d6c 100644
--- a/solr/webapp/web/js/angular/controllers/security.js
+++ b/solr/webapp/web/js/angular/controllers/security.js
@@ -19,6 +19,7 @@ solrAdminApp.controller('SecurityController', function ($scope, $timeout, $cooki
   $scope.resetMenu("security", Constants.IS_ROOT_PAGE);
 
   $scope.params = [];
+  $scope.filteredPredefinedPermissions = [];
 
   var strongPasswordRegex = /^(?=.*[0-9])(?=.*[!@#$%^&*\-_()[\]])[a-zA-Z0-9!@#$%^&*\-_()[\]]{8,30}$/;
 
@@ -769,6 +770,12 @@ solrAdminApp.controller('SecurityController', function ($scope, $timeout, $cooki
       var action = isAdd ? "set-permission" : "update-permission";
       var postBody = {};
       postBody[action] = setPermJson;
+
+      // if they have the "all" permission in the last position, then keep it there when adding a new permission
+      if (!setPermJson["before"] && !setPermJson["index"] && $scope.permissionsTable && $scope.permissionsTable.length > 0 && $scope.permissionsTable[$scope.permissionsTable.length-1].name === "all") {
+        setPermJson["before"] = $scope.permissionsTable.length;
+      }
+
       Security.post({path: "authorization"}, postBody, function (data) {
         var errorCause = checkError(data);
         if (errorCause != null) {
diff --git a/solr/webapp/web/partials/schema-designer.html b/solr/webapp/web/partials/schema-designer.html
index 35e691c..332ec50 100644
--- a/solr/webapp/web/partials/schema-designer.html
+++ b/solr/webapp/web/partials/schema-designer.html
@@ -25,10 +25,10 @@ limitations under the License.
       <div id="schema-selector">
         <div class="left">
           <select id="select-schema" placeholder-text-single="'Schema Selector'"
-                  chosen
+                chosen
                 ng-model="currentSchema"
                 ng-change="loadSchema()"
-                ng-options="schema for schema in schemas"></select>
+                ng-options="schema for schema in schemas"><option value=""></option></select>
           <button id="add" class="action" ng-click="showNewSchemaDialog()"><span>New Schema</span></button>
         </div>
         <div class="middle">
@@ -43,7 +43,7 @@ limitations under the License.
                 <input type="text" id="add_name" ng-model="newField.name" focus-when="showAddField" placeholder="enter a name"></p>
 
               <p class="clearfix" ng-show="adding=='field'"><label for="add_type">field type:</label>
-                <select chosen type="text" id="add_type" ng-model="newField.type" ng-options="type for type in types"></select>
+                <select chosen type="text" id="add_type" ng-model="newField.type" ng-options="type for type in types"><option value=""></option></select>
               </p>
               <p class="clearfix" ng-show="adding=='type'"><label for="add_class">class:</label>
                 <input type="text" id="add_class" ng-model="newField.class" placeholder="class name"></p>
@@ -446,7 +446,7 @@ limitations under the License.
             <select id="copy_schema"
                     ng-model="copyFrom"
                     chosen
-                    ng-options="schema for schema in publishedSchemas"></select><a ng-click="showHelp('copyFromHelp')"><img class="help-ico" src="img/ico/question-white.png"/></a>
+                    ng-options="schema for schema in publishedSchemas"><option value=""></option></select><a ng-click="showHelp('copyFromHelp')"><img class="help-ico" src="img/ico/question-white.png"/></a>
             <div id="copyFromHelp" class="help" ng-show="helpId === 'copyFromHelp'" escape-pressed="hideAll()">
               <div class="help">
               <p>Copy an existing Configset (schema, solrconfig.xml, and supporting files) as the starting point for your new schema. The <b>_default</b> Configset includes a schema with field guessing enabled, dynamic fields for common field types, and field types for analyzing text data for a number of common languages supported by Lucene. For more information about Configsets, see: <div class="help-anchor"><a target="_blank" href="https://solr.apache.org/guide/config-sets.html">Config [...]
@@ -535,10 +535,10 @@ limitations under the License.
               <select id="unique_key"
                       placeholder-text-single="'Unique Key Field'"
                       ng-model="updateUniqueKeyField"
-                      chosen
+                      chosen disable-search="true"
                       disabled
                       ng-change="updateUniqueKey()"
-                      ng-options="field for field in possibleIdFields"></select>
+                      ng-options="field for field in possibleIdFields"><option value=""></option></select>
             </div>
             <div class="field-form-right">
               <label for="languages">Language(s):</label>
@@ -646,7 +646,7 @@ limitations under the License.
                             id="field_type"
                             ng-model="selectedNode.type"
                             ng-change="onFieldTypeChanged(type)"
-                            ng-options="type for type in types"></select><a ng-click="showHelp('fieldTypeHelp')"><img class="help-ico" src="img/ico/question-white.png"/></a>
+                            ng-options="type for type in types"><option value=""></option></select><a ng-click="showHelp('fieldTypeHelp')"><img class="help-ico" src="img/ico/question-white.png"/></a>
                     <div id="fieldTypeHelp" class="help" ng-show="helpId === 'fieldTypeHelp'">
                       <div class="help-wider">
                         <p>The field type defines how Solr should interpret data in a field and how the field can be queried. The properties on each field are inherited from the field type if not explicitly overridden in the field definition. In many cases, it's preferable to choose a different field type instead of overriding the field properties. For example, there's typically a multi-valued version of each type, such as <b>strings</b> is the multi-valued version of the <b>string</b> t [...]
@@ -872,7 +872,7 @@ limitations under the License.
                     ng-model="sampleDocId"
                     chosen
                     ng-change="updateSampleDocId()"
-                    ng-options="id for id in sampleDocIds"></select>
+                    ng-options="id for id in sampleDocIds"><option value=""></option></select>
           </div>
           <div class="field-form">
             <label for="analysis_fieldvalue_index">{{selectedNode.name}}</label>
@@ -959,7 +959,7 @@ limitations under the License.
               </div>
               <div class="field-form-right">
                 <label for="sort" title="Sort field">Sort by</label>
-                <select chosen placeholder-text-single="'Select Field'" id="sort" ng-model="query.sortBy" ng-options="field for field in sortableFields"></select> asc <input type="radio" ng-model="query.sortDir" value="asc"/> desc <input type="radio" ng-model="query.sortDir" value="desc"/>
+                <select chosen placeholder-text-single="'Select Field'" id="sort" ng-model="query.sortBy" ng-options="field for field in sortableFields"><option value=""></option></select> asc <input type="radio" ng-model="query.sortDir" value="asc"/> desc <input type="radio" ng-model="query.sortDir" value="desc"/>
                 <a ng-click="showHelp('querySortHelp')"><img class="help-ico" src="img/ico/question-white.png"/></a>
                 <div id="querySortHelp" class="help" ng-show="helpId === 'querySortHelp'">
                   <div class="help">
@@ -985,7 +985,7 @@ limitations under the License.
               </div>
               <div class="field-form-right">
                 <label for="hl" title="Highlight">Highlighting</label>
-                <select chosen placeholder-text-single="'Select Field'" id="hl" ng-model="query.highlight" ng-options="field for field in hlFields"></select>
+                <select chosen placeholder-text-single="'Select Field'" id="hl" ng-model="query.highlight" ng-options="field for field in hlFields"><option value=""></option></select>
               </div>
               <div class="field-form-right">
                 <label for="rawParams" title="Additional params">Additional params</label>
diff --git a/solr/webapp/web/partials/security.html b/solr/webapp/web/partials/security.html
index 2476b6f..d8d3093 100644
--- a/solr/webapp/web/partials/security.html
+++ b/solr/webapp/web/partials/security.html
@@ -137,11 +137,13 @@ limitations under the License.
               </div>
             </div>
             <div id="perm-select"><label for="predefined">Predefined:</label><select id="predefined"
-                chosen
+                chosen disable-search="true" allow-single-deselect="true"
                 ng-change="onPredefinedChanged()"
                 ng-model="selectedPredefinedPermission"
                 ng-disabled="permDialogMode === 'edit'"
-                ng-options="p for p in filteredPredefinedPermissions"></select><span id="add_perm_custom">or Custom: <input ng-disabled="permDialogMode === 'edit'" ng-change="onPredefinedChanged()" type="text" id="add_perm_name" ng-model="upsertPerm.name"><a ng-click="showHelp('permDialogHelp')"><img class="help-ico" src="img/ico/question-white.png"/></a>
+                ng-options="p for p in filteredPredefinedPermissions">
+              <option value=""></option>
+            </select><span id="add_perm_custom">or Custom: <input ng-disabled="permDialogMode === 'edit'" ng-change="onPredefinedChanged()" type="text" id="add_perm_name" ng-model="upsertPerm.name"><a ng-click="showHelp('permDialogHelp')"><img class="help-ico" src="img/ico/question-white.png"/></a>
               <div id="permDialogHelp" class="help" ng-show="helpId === 'permDialogHelp'">
                 <div class="help-perm">
                   <p>Permissions allow you to grant access to protected resources to one or more roles. Solr provides a list of <b>predefined</b> permissions to cover common use cases, such as collection administration. Otherwise, you can define a <b>custom permission</b> for fine-grained control over the API path(s), collection(s), request method(s) and params.