From 37140013714814d8ffe662a372697c56eea2fde0 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 10 Jun 2022 15:09:22 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- GITALY_SERVER_VERSION | 2 +- app/assets/javascripts/awards_handler.js | 40 +++- app/assets/javascripts/emoji/constants.js | 2 + app/assets/javascripts/emoji/index.js | 18 +- app/assets/javascripts/emoji/utils.js | 8 + app/assets/javascripts/gfm_auto_complete.js | 2 +- .../new_merge_request_option.vue | 48 ++-- .../components/commit_sidebar/radio_group.vue | 55 +++-- .../admin_runners/admin_runners_app.vue | 18 +- .../javascripts/runner/admin_runners/index.js | 4 + .../components/cells/runner_status_cell.vue | 7 + .../runner/components/runner_list.vue | 2 +- .../components/runner_list_empty_state.vue | 68 ++++++ .../graphql/list/admin_runners.query.graphql | 2 +- .../graphql/list/group_runners.query.graphql | 2 +- .../graphql/list/list_item.fragment.graphql | 21 +- .../list/list_item_shared.fragment.graphql | 20 ++ .../group_runner_show_app.vue | 114 +++++++++ .../runner/group_runner_show/index.js | 36 +++ .../group_runners/group_runners_app.vue | 17 +- .../javascripts/runner/group_runners/index.js | 4 + .../javascripts/runner/runner_search_utils.js | 14 ++ .../components/sidebar/sidebar_assignees.vue | 4 +- .../framework/contextual_sidebar.scss | 6 +- .../stylesheets/framework/variables.scss | 2 + app/assets/stylesheets/page_bundles/ide.scss | 19 +- .../stylesheets/startup/startup-dark.scss | 7 +- .../stylesheets/startup/startup-general.scss | 6 +- .../themes/dark_mode_overrides.scss | 1 + app/controllers/groups/runners_controller.rb | 2 + app/finders/crm/contacts_finder.rb | 27 ++- app/finders/crm/organizations_finder.rb | 64 +++++ .../resolvers/concerns/resolves_groups.rb | 2 - .../resolvers/crm/contacts_resolver.rb | 29 +++ .../resolvers/crm/organizations_resolver.rb | 29 +++ .../customer_relations/contact_state_enum.rb | 17 ++ .../organization_state_enum.rb | 17 ++ app/graphql/types/group_type.rb | 6 +- app/helpers/ci/runners_helper.rb | 8 +- app/models/ci/build.rb | 1 + app/models/ci/job_artifact.rb | 27 ++- app/models/ci/pipeline.rb | 11 +- app/models/concerns/file_store_mounter.rb | 14 +- app/models/customer_relations/contact.rb | 21 ++ app/models/customer_relations/organization.rb | 21 ++ app/services/projects/update_pages_service.rb | 8 + .../projects/_service_desk_settings.html.haml | 2 +- .../projects/buttons/_remove_tag.html.haml | 3 +- app/workers/pipeline_hooks_worker.rb | 1 + app/workers/pipeline_notification_worker.rb | 1 + ...e_throttle_pipelines_creation_override.yml | 8 + ...cense_available_for_non_public_projects.rb | 31 +++ db/schema_migrations/20220520040416 | 1 + doc/api/graphql/reference/index.md | 50 +++- doc/ci/yaml/index.md | 2 +- doc/ci/yaml/yaml_optimization.md | 25 +- doc/development/fe_guide/emojis.md | 4 + .../specification_guide/index.md | 25 +- doc/operations/incident_management/alerts.md | 2 +- .../integrations/pipeline_status_emails.md | 3 + .../project/integrations/webhook_events.md | 6 + .../img/ff_merge_rebase_v14_9.png | Bin 6552 -> 0 bytes .../project/merge_requests/methods/index.md | 25 +- fixtures/emojis/intents.json | 16 ++ ...cense_available_for_non_public_projects.rb | 24 ++ .../ci/pipeline/chain/limit/rate_limit.rb | 18 +- locale/gitlab.pot | 38 ++- package.json | 2 +- spec/features/admin/admin_runners_spec.rb | 91 ++++--- spec/features/groups/group_runners_spec.rb | 14 +- spec/finders/crm/contacts_finder_spec.rb | 78 ++++++ spec/finders/crm/organizations_finder_spec.rb | 134 +++++++++++ spec/frontend/__helpers__/emoji.js | 10 + spec/frontend/awards_handler_spec.js | 29 +++ spec/frontend/emoji/index_spec.js | 119 ++++++---- spec/frontend/emoji/utils_spec.js | 15 ++ spec/frontend/fixtures/runner.rb | 6 + .../new_merge_request_option_spec.js | 222 +++++------------- .../admin_runners/admin_runners_app_spec.js | 26 +- .../cells/runner_status_cell_spec.js | 17 +- .../runner_list_empty_state_spec.js | 76 ++++++ .../group_runners/group_runners_app_spec.js | 10 +- spec/frontend/runner/mock_data.js | 3 + .../runner/runner_search_utils_spec.js | 20 +- .../ide/helpers/ide_helper.js | 4 +- .../concerns/resolves_groups_spec.rb | 2 - .../resolvers/crm/contacts_resolver_spec.rb | 86 +++++++ .../crm/organizations_resolver_spec.rb | 80 +++++++ spec/helpers/ci/runners_helper_spec.rb | 16 +- ..._available_for_non_public_projects_spec.rb | 54 +++++ .../pipeline/chain/limit/rate_limit_spec.rb | 42 +++- ..._available_for_non_public_projects_spec.rb | 63 +++++ spec/models/ci/build_spec.rb | 12 + spec/models/ci/pipeline_spec.rb | 40 +++- .../rate_limit_spec.rb | 1 + .../projects/update_pages_service_spec.rb | 19 ++ .../features/runners_shared_examples.rb | 12 +- spec/workers/pipeline_hooks_worker_spec.rb | 10 + .../pipeline_notification_worker_spec.rb | 14 ++ yarn.lock | 8 +- 100 files changed, 2030 insertions(+), 443 deletions(-) create mode 100644 app/assets/javascripts/emoji/utils.js create mode 100644 app/assets/javascripts/runner/components/runner_list_empty_state.vue create mode 100644 app/assets/javascripts/runner/graphql/list/list_item_shared.fragment.graphql create mode 100644 app/assets/javascripts/runner/group_runner_show/group_runner_show_app.vue create mode 100644 app/assets/javascripts/runner/group_runner_show/index.js create mode 100644 app/finders/crm/organizations_finder.rb create mode 100644 app/graphql/resolvers/crm/contacts_resolver.rb create mode 100644 app/graphql/resolvers/crm/organizations_resolver.rb create mode 100644 app/graphql/types/customer_relations/contact_state_enum.rb create mode 100644 app/graphql/types/customer_relations/organization_state_enum.rb create mode 100644 config/feature_flags/development/ci_enforce_throttle_pipelines_creation_override.yml create mode 100644 db/post_migrate/20220520040416_schedule_set_legacy_open_source_license_available_for_non_public_projects.rb create mode 100644 db/schema_migrations/20220520040416 delete mode 100644 doc/user/project/merge_requests/img/ff_merge_rebase_v14_9.png create mode 100644 fixtures/emojis/intents.json create mode 100644 lib/gitlab/background_migration/set_legacy_open_source_license_available_for_non_public_projects.rb create mode 100644 spec/finders/crm/organizations_finder_spec.rb create mode 100644 spec/frontend/emoji/utils_spec.js create mode 100644 spec/frontend/runner/components/runner_list_empty_state_spec.js create mode 100644 spec/graphql/resolvers/crm/contacts_resolver_spec.rb create mode 100644 spec/graphql/resolvers/crm/organizations_resolver_spec.rb create mode 100644 spec/lib/gitlab/background_migration/set_legacy_open_source_license_available_for_non_public_projects_spec.rb create mode 100644 spec/migrations/20220520040416_schedule_set_legacy_open_source_license_available_for_non_public_projects_spec.rb diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index 14352baf9ba..e754d61ec81 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -70d6aa021ebfc05d9d727a7eb4c9ff4782db4c30 +30b922784b9d0492ba525a35ec09782dd2bcace3 diff --git a/app/assets/javascripts/awards_handler.js b/app/assets/javascripts/awards_handler.js index aa735df7da5..a030797c698 100644 --- a/app/assets/javascripts/awards_handler.js +++ b/app/assets/javascripts/awards_handler.js @@ -3,9 +3,9 @@ import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils'; import $ from 'jquery'; import { uniq } from 'lodash'; +import { getEmojiScoreWithIntent } from '~/emoji/utils'; import { getCookie, setCookie, scrollToElement } from '~/lib/utils/common_utils'; import * as Emoji from '~/emoji'; - import { dispose, fixTitle } from '~/tooltips'; import createFlash from './flash'; import axios from './lib/utils/axios_utils'; @@ -559,13 +559,45 @@ export class AwardsHandler { } } + getEmojiScore(emojis, value) { + const elem = $(value).find('[data-name]').get(0); + const emoji = emojis.filter((x) => x.emoji.name === elem.dataset.name)[0]; + elem.dataset.score = emoji.score; + + return emoji.score; + } + + sortEmojiElements(emojis, $elements) { + const scores = new WeakMap(); + + return $elements.sort((a, b) => { + let aScore = scores.get(a); + let bScore = scores.get(b); + + if (!aScore) { + aScore = this.getEmojiScore(emojis, a); + scores.set(a, aScore); + } + + if (!bScore) { + bScore = this.getEmojiScore(emojis, b); + scores.set(b, bScore); + } + + return aScore - bScore; + }); + } + findMatchingEmojiElements(query) { - const emojiMatches = this.emoji.searchEmoji(query).map((x) => x.emoji.name); + const matchingEmoji = this.emoji + .searchEmoji(query) + .map((x) => ({ ...x, score: getEmojiScoreWithIntent(x.emoji.name, x.score) })); + const matchingEmojiNames = matchingEmoji.map((x) => x.emoji.name); const $emojiElements = $('.emoji-menu-list:not(.frequent-emojis) [data-name]'); const $matchingElements = $emojiElements.filter( - (i, elm) => emojiMatches.indexOf(elm.dataset.name) >= 0, + (i, elm) => matchingEmojiNames.indexOf(elm.dataset.name) >= 0, ); - return $matchingElements.closest('li').clone(); + return this.sortEmojiElements(matchingEmoji, $matchingElements.closest('li').clone()); } /* showMenuElement and hideMenuElement are performance optimizations. We use diff --git a/app/assets/javascripts/emoji/constants.js b/app/assets/javascripts/emoji/constants.js index a6eb4256561..7970a932095 100644 --- a/app/assets/javascripts/emoji/constants.js +++ b/app/assets/javascripts/emoji/constants.js @@ -19,3 +19,5 @@ export const CATEGORY_ROW_HEIGHT = 37; export const CACHE_VERSION_KEY = 'gl-emoji-map-version'; export const CACHE_KEY = 'gl-emoji-map'; + +export const NEUTRAL_INTENT_MULTIPLIER = 1; diff --git a/app/assets/javascripts/emoji/index.js b/app/assets/javascripts/emoji/index.js index 4fdcdcc1b04..b9392fabcbd 100644 --- a/app/assets/javascripts/emoji/index.js +++ b/app/assets/javascripts/emoji/index.js @@ -2,6 +2,7 @@ import { escape, minBy } from 'lodash'; import emojiRegexFactory from 'emoji-regex'; import emojiAliases from 'emojis/aliases.json'; import { setAttributes } from '~/lib/utils/dom_utils'; +import { getEmojiScoreWithIntent } from '~/emoji/utils'; import AccessorUtilities from '../lib/utils/accessor'; import axios from '../lib/utils/axios_utils'; import { CACHE_KEY, CACHE_VERSION_KEY, CATEGORY_ICON_MAP, FREQUENTLY_USED_KEY } from './constants'; @@ -144,6 +145,11 @@ function getNameMatch(emoji, query) { return null; } +// Sort emoji by emoji score falling back to a string comparison +export function sortEmoji(a, b) { + return a.score - b.score || a.fieldValue.localeCompare(b.fieldValue); +} + export function searchEmoji(query) { const lowercaseQuery = query ? `${query}`.toLowerCase() : ''; @@ -156,16 +162,14 @@ export function searchEmoji(query) { getDescriptionMatch(emoji, lowercaseQuery), getAliasMatch(emoji, matchingAliases), getNameMatch(emoji, lowercaseQuery), - ].filter(Boolean); + ] + .filter(Boolean) + .map((x) => ({ ...x, score: getEmojiScoreWithIntent(x.emoji.name, x.score) })); return minBy(matches, (x) => x.score); }) - .filter(Boolean); -} - -export function sortEmoji(items) { - // Sort results by index of and string comparison - return [...items].sort((a, b) => a.score - b.score || a.fieldValue.localeCompare(b.fieldValue)); + .filter(Boolean) + .sort(sortEmoji); } export const CATEGORY_NAMES = Object.keys(CATEGORY_ICON_MAP); diff --git a/app/assets/javascripts/emoji/utils.js b/app/assets/javascripts/emoji/utils.js new file mode 100644 index 00000000000..eb3dcea73c0 --- /dev/null +++ b/app/assets/javascripts/emoji/utils.js @@ -0,0 +1,8 @@ +import emojiIntents from 'emojis/intents.json'; +import { NEUTRAL_INTENT_MULTIPLIER } from '~/emoji/constants'; + +export function getEmojiScoreWithIntent(emojiName, baseScore) { + const intentMultiplier = emojiIntents[emojiName] || NEUTRAL_INTENT_MULTIPLIER; + + return 2 ** baseScore * intentMultiplier; +} diff --git a/app/assets/javascripts/gfm_auto_complete.js b/app/assets/javascripts/gfm_auto_complete.js index 146255df31f..d4dafbdc94f 100644 --- a/app/assets/javascripts/gfm_auto_complete.js +++ b/app/assets/javascripts/gfm_auto_complete.js @@ -897,7 +897,7 @@ GfmAutoComplete.Emoji = { return Emoji.searchEmoji(query); }, sorter(items) { - return Emoji.sortEmoji(items); + return items.sort(Emoji.sortEmoji); }, }; // Team Members diff --git a/app/assets/javascripts/ide/components/commit_sidebar/new_merge_request_option.vue b/app/assets/javascripts/ide/components/commit_sidebar/new_merge_request_option.vue index 43bf2e1a90c..0a8fec49aac 100644 --- a/app/assets/javascripts/ide/components/commit_sidebar/new_merge_request_option.vue +++ b/app/assets/javascripts/ide/components/commit_sidebar/new_merge_request_option.vue @@ -1,5 +1,5 @@ diff --git a/app/assets/javascripts/ide/components/commit_sidebar/radio_group.vue b/app/assets/javascripts/ide/components/commit_sidebar/radio_group.vue index 870355e884e..bd5d28dbb56 100644 --- a/app/assets/javascripts/ide/components/commit_sidebar/radio_group.vue +++ b/app/assets/javascripts/ide/components/commit_sidebar/radio_group.vue @@ -1,8 +1,20 @@ diff --git a/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue b/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue index c2bb635e056..a90ef2d3530 100644 --- a/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue +++ b/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue @@ -10,6 +10,7 @@ import RegistrationDropdown from '../components/registration/registration_dropdo import RunnerFilteredSearchBar from '../components/runner_filtered_search_bar.vue'; import RunnerBulkDelete from '../components/runner_bulk_delete.vue'; import RunnerList from '../components/runner_list.vue'; +import RunnerListEmptyState from '../components/runner_list_empty_state.vue'; import RunnerName from '../components/runner_name.vue'; import RunnerStats from '../components/stat/runner_stats.vue'; import RunnerPagination from '../components/runner_pagination.vue'; @@ -35,6 +36,7 @@ import { fromUrlQueryToSearch, fromSearchToUrl, fromSearchToVariables, + isSearchFiltered, } from '../runner_search_utils'; import { captureException } from '../sentry_utils'; @@ -91,6 +93,7 @@ export default { RunnerFilteredSearchBar, RunnerBulkDelete, RunnerList, + RunnerListEmptyState, RunnerName, RunnerStats, RunnerPagination, @@ -98,7 +101,7 @@ export default { RunnerActionsCell, }, mixins: [glFeatureFlagMixin()], - inject: ['localMutations'], + inject: ['emptyStateSvgPath', 'emptyStateFilteredSvgPath', 'localMutations'], props: { registrationToken: { type: String, @@ -190,6 +193,9 @@ export default { // Rollout issue: https://gitlab.com/gitlab-org/gitlab/-/issues/353981 return this.glFeatures.adminRunnersBulkDelete; }, + isSearchFiltered() { + return isSearchFiltered(this.search); + }, }, watch: { search: { @@ -298,9 +304,13 @@ export default { :stale-runners-count="staleRunnersTotal" /> -
- {{ __('No runners found') }} -
+