diff options
-rw-r--r-- | app/assets/javascripts/gl_dropdown.js | 18 | ||||
-rw-r--r-- | app/assets/javascripts/labels_select.js | 32 | ||||
-rw-r--r-- | changelogs/unreleased/57734-improve-label-dropdown-selection-performance.yml | 5 | ||||
-rw-r--r-- | doc/ci/yaml/README.md | 6 | ||||
-rw-r--r-- | doc/development/feature_flags.md | 5 | ||||
-rw-r--r-- | doc/user/instance_statistics/convdev.md | 16 | ||||
-rw-r--r-- | doc/user/project/clusters/runbooks/index.md | 6 |
7 files changed, 46 insertions, 42 deletions
diff --git a/app/assets/javascripts/gl_dropdown.js b/app/assets/javascripts/gl_dropdown.js index a8ac2f510a4..27d8669b256 100644 --- a/app/assets/javascripts/gl_dropdown.js +++ b/app/assets/javascripts/gl_dropdown.js @@ -656,23 +656,7 @@ GitLabDropdown = (function() { if (this.options.renderMenu) { return this.options.renderMenu(html); } else { - var ul = document.createElement('ul'); - - for (var i = 0; i < html.length; i += 1) { - var el = html[i]; - - if (el instanceof $) { - el = el.get(0); - } - - if (typeof el === 'string') { - ul.innerHTML += el; - } else { - ul.appendChild(el); - } - } - - return ul; + return $('<ul>').append(html); } }; diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js index f7a611fbca0..cca4927c115 100644 --- a/app/assets/javascripts/labels_select.js +++ b/app/assets/javascripts/labels_select.js @@ -199,8 +199,8 @@ export default class LabelsSelect { .catch(() => flash(__('Error fetching labels.'))); }, renderRow: function(label, instance) { - var $a, - $li, + var linkEl, + listItemEl, color, colorEl, indeterminate, @@ -209,12 +209,11 @@ export default class LabelsSelect { spacing, i, marked, - dropdownName, dropdownValue; - $li = $('<li>'); - $a = $('<a href="#">'); + selectedClass = []; removesAll = label.id <= 0 || label.id == null; + if ($dropdown.hasClass('js-filter-bulk-update')) { indeterminate = $dropdown.data('indeterminate') || []; marked = $dropdown.data('marked') || []; @@ -233,7 +232,6 @@ export default class LabelsSelect { } } else { if (this.id(label)) { - dropdownName = $dropdown.data('fieldName'); dropdownValue = this.id(label) .toString() .replace(/'/g, "\\'"); @@ -241,7 +239,7 @@ export default class LabelsSelect { if ( $form.find( "input[type='hidden'][name='" + - dropdownName + + this.fieldName + "'][value='" + dropdownValue + "']", @@ -251,24 +249,34 @@ export default class LabelsSelect { } } - if ($dropdown.hasClass('js-multiselect') && removesAll) { + if (this.multiSelect && removesAll) { selectedClass.push('dropdown-clear-active'); } } + if (label.color) { colorEl = "<span class='dropdown-label-box' style='background: " + label.color + "'></span>"; } else { colorEl = ''; } + + linkEl = document.createElement('a'); + linkEl.href = '#'; + // We need to identify which items are actually labels if (label.id) { selectedClass.push('label-item'); - $a.attr('data-label-id', label.id); + linkEl.dataset.labelId = label.id; } - $a.addClass(selectedClass.join(' ')).html(`${colorEl} ${_.escape(label.title)}`); - // Return generated html - return $li.html($a).prop('outerHTML'); + + linkEl.className = selectedClass.join(' '); + linkEl.innerHTML = `${colorEl} ${_.escape(label.title)}`; + + listItemEl = document.createElement('li'); + listItemEl.appendChild(linkEl); + + return listItemEl; }, search: { fields: ['title'], diff --git a/changelogs/unreleased/57734-improve-label-dropdown-selection-performance.yml b/changelogs/unreleased/57734-improve-label-dropdown-selection-performance.yml new file mode 100644 index 00000000000..781446b86d7 --- /dev/null +++ b/changelogs/unreleased/57734-improve-label-dropdown-selection-performance.yml @@ -0,0 +1,5 @@ +--- +title: Improve label select rendering +merge_request: 25281 +author: +type: performance diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md index e5668c140fa..455ab900764 100644 --- a/doc/ci/yaml/README.md +++ b/doc/ci/yaml/README.md @@ -618,9 +618,9 @@ action fails, the pipeline will eventually succeed. Manual actions are considered to be write actions, so permissions for [protected branches](../../user/project/protected_branches.md) are used when -user wants to trigger an action. In other words, in order to trigger a manual -action assigned to a branch that the pipeline is running for, user needs to -have ability to merge to this branch. +a user wants to trigger an action. In other words, in order to trigger a manual +action assigned to a branch that the pipeline is running for, the user needs to +have the ability to merge to this branch. ### `when:delayed` diff --git a/doc/development/feature_flags.md b/doc/development/feature_flags.md index 67356a12eba..3271f9a7fb3 100644 --- a/doc/development/feature_flags.md +++ b/doc/development/feature_flags.md @@ -26,8 +26,9 @@ the time, you should execute `/chatops run feature set my_feature_flag 50`. ## Feature flags for user applications -GitLab does not yet support the use of feature flags in deployed user applications. -You can follow the progress on that [in the issue on our issue tracker](https://gitlab.com/gitlab-org/gitlab-ee/issues/779). +This document only covers feature flags used in the development of GitLab +itself. Feature flags in deployed user applications can be found at +[Feature Flags](https://docs.gitlab.com/ee/user/project/operations/feature_flags.html) ## Developing with feature flags diff --git a/doc/user/instance_statistics/convdev.md b/doc/user/instance_statistics/convdev.md index 52b99b69a02..ddf34b19a5a 100644 --- a/doc/user/instance_statistics/convdev.md +++ b/doc/user/instance_statistics/convdev.md @@ -2,25 +2,27 @@ > [Introduced][ce-30469] in GitLab 9.3. +NOTE: **NOTE** +Your GitLab instance's [usage ping][ping] must be activated in order to use this feature. + The Conversational Development Index (ConvDev Index) gives you an overview of your entire instance's adoption of [Concurrent DevOps](https://about.gitlab.com/concurrent-devops/) -from planning to monitoring. It displays the usage of these GitLab features over +from planning to monitoring. + +This displays the usage of these GitLab features over the last 30 days, averaged over the number of active users in that time period. It also provides a Lead score per feature, which is calculated based on GitLab's analysis of top-performing instances based on [usage ping data][ping] that GitLab has -collected. Your score is compared to the lead score, expressed as a percentage. -Your overall index score is an average of all your feature score percentages. +collected. Your score is compared to the lead score of each feature and then expressed as a percentage at the bottom of said feature. +Your overall index score is an average of all your feature score percentages - this percentage value is presented above all the of features on the page.  The page also provides helpful links to articles and GitLab docs, to help you improve your scores. -Your GitLab instance's [usage ping][ping] must be activated in order to use this feature. Usage ping data is aggregated on GitLab's servers for analysis. Your usage -information is **not sent** to any other GitLab instances. - -If you have just started using GitLab, it may take a few weeks for data to be +information is **not sent** to any other GitLab instances. If you have just started using GitLab, it may take a few weeks for data to be collected before this feature is available. [ce-30469]: https://gitlab.com/gitlab-org/gitlab-ce/issues/30469 diff --git a/doc/user/project/clusters/runbooks/index.md b/doc/user/project/clusters/runbooks/index.md index 512a4cb32f4..54c475a1762 100644 --- a/doc/user/project/clusters/runbooks/index.md +++ b/doc/user/project/clusters/runbooks/index.md @@ -4,6 +4,10 @@ Runbooks are a collection of documented procedures that explain how to carry out a particular process, be it starting, stopping, debugging, or troubleshooting a particular system. +Using [Jupyter Notebooks](https://jupyter.org/) and the [Rubix library](https://github.com/Nurtch/rubix), +users can get started writing their own executable runbooks. + + ## Overview Historically, runbooks took the form of a decision tree or a detailed @@ -36,7 +40,7 @@ To create an executable runbook, you will need: can run the helm CLI in a safe environment. 1. **Ingress** - Ingress can provide load balancing, SSL termination, and name-based virtual hosting. It acts as a web proxy for your applications. -1. **JupyterHub** - JupyterHub is a multi-user service for managing notebooks across +1. **JupyterHub** - [JupyterHub](https://jupyterhub.readthedocs.io/) is a multi-user service for managing notebooks across a team. Jupyter Notebooks provide a web-based interactive programming environment used for data analysis, visualization, and machine learning. |