diff options
Diffstat (limited to 'app/assets/javascripts/pages')
44 files changed, 179 insertions, 167 deletions
diff --git a/app/assets/javascripts/pages/admin/abuse_reports/index.js b/app/assets/javascripts/pages/admin/abuse_reports/index.js index ab29f9149f7..7634f131e4d 100644 --- a/app/assets/javascripts/pages/admin/abuse_reports/index.js +++ b/app/assets/javascripts/pages/admin/abuse_reports/index.js @@ -1,3 +1,4 @@ +import { initAbuseReportsApp } from '~/admin/abuse_reports'; import initDeprecatedRemoveRowBehavior from '~/behaviors/deprecated_remove_row_behavior'; import UsersSelect from '~/users_select'; import AbuseReports from './abuse_reports'; @@ -6,3 +7,4 @@ new AbuseReports(); /* eslint-disable-line no-new */ new UsersSelect(); /* eslint-disable-line no-new */ initDeprecatedRemoveRowBehavior(); +initAbuseReportsApp(); diff --git a/app/assets/javascripts/pages/admin/application_settings/general/components/signup_form.vue b/app/assets/javascripts/pages/admin/application_settings/general/components/signup_form.vue index 96477b9f476..7e6654140a9 100644 --- a/app/assets/javascripts/pages/admin/application_settings/general/components/signup_form.vue +++ b/app/assets/javascripts/pages/admin/application_settings/general/components/signup_form.vue @@ -207,6 +207,10 @@ export default { emailConfirmationSettingsOffHelpText: s__( 'ApplicationSettings|New users can sign up without confirming their email address.', ), + emailConfirmationSettingsSoftLabel: s__('ApplicationSettings|Soft'), + emailConfirmationSettingsSoftHelpText: s__( + 'ApplicationSettings|Send a confirmation email during sign up. New users can log in immediately, but must confirm their email within three days.', + ), emailConfirmationSettingsHardLabel: s__('ApplicationSettings|Hard'), emailConfirmationSettingsHardHelpText: s__( 'ApplicationSettings|Send a confirmation email during sign up. New users must confirm their email address before they can log in.', @@ -286,16 +290,23 @@ export default { v-model="form.emailConfirmationSetting" name="application_setting[email_confirmation_setting]" > - <gl-form-radio value="hard"> - {{ $options.i18n.emailConfirmationSettingsHardLabel }} - - <template #help> {{ $options.i18n.emailConfirmationSettingsHardHelpText }} </template> - </gl-form-radio> <gl-form-radio value="off"> {{ $options.i18n.emailConfirmationSettingsOffLabel }} <template #help> {{ $options.i18n.emailConfirmationSettingsOffHelpText }} </template> </gl-form-radio> + + <gl-form-radio value="soft"> + {{ $options.i18n.emailConfirmationSettingsSoftLabel }} + + <template #help> {{ $options.i18n.emailConfirmationSettingsSoftHelpText }} </template> + </gl-form-radio> + + <gl-form-radio value="hard"> + {{ $options.i18n.emailConfirmationSettingsHardLabel }} + + <template #help> {{ $options.i18n.emailConfirmationSettingsHardHelpText }} </template> + </gl-form-radio> </gl-form-radio-group> </gl-form-group> diff --git a/app/assets/javascripts/pages/admin/application_settings/network/index.js b/app/assets/javascripts/pages/admin/application_settings/network/index.js new file mode 100644 index 00000000000..841c68c5cd0 --- /dev/null +++ b/app/assets/javascripts/pages/admin/application_settings/network/index.js @@ -0,0 +1,3 @@ +import initNetworkOutbound from '~/admin/application_settings/network_outbound'; + +initNetworkOutbound(); diff --git a/app/assets/javascripts/pages/admin/application_settings/payload_downloader.js b/app/assets/javascripts/pages/admin/application_settings/payload_downloader.js index 97fb64f9971..54c1e37d899 100644 --- a/app/assets/javascripts/pages/admin/application_settings/payload_downloader.js +++ b/app/assets/javascripts/pages/admin/application_settings/payload_downloader.js @@ -1,4 +1,4 @@ -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { __ } from '~/locale'; diff --git a/app/assets/javascripts/pages/admin/application_settings/payload_previewer.js b/app/assets/javascripts/pages/admin/application_settings/payload_previewer.js index 1cd19fc09a8..41862789185 100644 --- a/app/assets/javascripts/pages/admin/application_settings/payload_previewer.js +++ b/app/assets/javascripts/pages/admin/application_settings/payload_previewer.js @@ -1,4 +1,4 @@ -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { __ } from '~/locale'; diff --git a/app/assets/javascripts/pages/admin/jobs/index/components/cancel_jobs_modal.vue b/app/assets/javascripts/pages/admin/jobs/index/components/cancel_jobs_modal.vue index d5857294617..3bc785ee1b6 100644 --- a/app/assets/javascripts/pages/admin/jobs/index/components/cancel_jobs_modal.vue +++ b/app/assets/javascripts/pages/admin/jobs/index/components/cancel_jobs_modal.vue @@ -1,6 +1,6 @@ <script> import { GlModal } from '@gitlab/ui'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { redirectTo } from '~/lib/utils/url_utility'; import { @@ -43,7 +43,7 @@ export default { }, primaryAction: { text: PRIMARY_ACTION_TEXT, - attributes: [{ variant: 'danger' }], + attributes: { variant: 'danger' }, }, cancelAction: { text: CANCEL_TEXT, diff --git a/app/assets/javascripts/pages/admin/projects/index/components/delete_project_modal.vue b/app/assets/javascripts/pages/admin/projects/index/components/delete_project_modal.vue index 48241a213ef..3a91f8e2c55 100644 --- a/app/assets/javascripts/pages/admin/projects/index/components/delete_project_modal.vue +++ b/app/assets/javascripts/pages/admin/projects/index/components/delete_project_modal.vue @@ -72,7 +72,7 @@ export default { primaryProps() { return { text: __('Delete project'), - attributes: [{ variant: 'danger' }, { category: 'primary' }, { disabled: !this.canSubmit }], + attributes: { variant: 'danger', category: 'primary', disabled: !this.canSubmit }, }; }, }, diff --git a/app/assets/javascripts/pages/admin/runners/register/index.js b/app/assets/javascripts/pages/admin/runners/register/index.js new file mode 100644 index 00000000000..d7ee2ee369a --- /dev/null +++ b/app/assets/javascripts/pages/admin/runners/register/index.js @@ -0,0 +1,3 @@ +import { initAdminRegisterRunner } from '~/ci/runner/admin_register_runner'; + +initAdminRegisterRunner(); diff --git a/app/assets/javascripts/pages/dashboard/todos/index/todos.js b/app/assets/javascripts/pages/dashboard/todos/index/todos.js index 2fdf3c42935..f57b6144b69 100644 --- a/app/assets/javascripts/pages/dashboard/todos/index/todos.js +++ b/app/assets/javascripts/pages/dashboard/todos/index/todos.js @@ -4,7 +4,7 @@ import $ from 'jquery'; import { getGroups } from '~/api/groups_api'; import { getProjects } from '~/api/projects_api'; import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { addDelimiter } from '~/lib/utils/text_utility'; import { __ } from '~/locale'; diff --git a/app/assets/javascripts/pages/groups/new/components/app.vue b/app/assets/javascripts/pages/groups/new/components/app.vue index f01e5e595a3..8b68cb5f3bf 100644 --- a/app/assets/javascripts/pages/groups/new/components/app.vue +++ b/app/assets/javascripts/pages/groups/new/components/app.vue @@ -2,7 +2,7 @@ import importGroupIllustration from '@gitlab/svgs/dist/illustrations/group-import.svg'; import newGroupIllustration from '@gitlab/svgs/dist/illustrations/group-new.svg'; -import { __, s__ } from '~/locale'; +import { s__ } from '~/locale'; import NewNamespacePage from '~/vue_shared/new_namespace/new_namespace_page.vue'; import createGroupDescriptionDetails from './create_group_description_details.vue'; @@ -11,6 +11,15 @@ export default { NewNamespacePage, }, props: { + groupsUrl: { + type: String, + required: true, + }, + parentGroupUrl: { + type: String, + required: false, + default: null, + }, parentGroupName: { type: String, required: false, @@ -28,8 +37,16 @@ export default { }, }, computed: { - initialBreadcrumb() { - return this.parentGroupName || __('New group'); + initialBreadcrumbs() { + return this.parentGroupUrl + ? [ + { text: this.parentGroupName, href: this.parentGroupUrl }, + { text: s__('GroupsNew|New subgroup'), href: '#' }, + ] + : [ + { text: s__('GroupsNew|Groups'), href: this.groupsUrl }, + { text: s__('GroupsNew|New group'), href: '#' }, + ]; }, panels() { return [ @@ -68,7 +85,7 @@ export default { <template> <new-namespace-page :jump-to-last-persisted-panel="hasErrors" - :initial-breadcrumb="initialBreadcrumb" + :initial-breadcrumbs="initialBreadcrumbs" :panels="panels" :title="s__('GroupsNew|Create new group')" persistence-key="new_group_last_active_tab" diff --git a/app/assets/javascripts/pages/groups/new/group_path_validator.js b/app/assets/javascripts/pages/groups/new/group_path_validator.js index fa111032b2e..16f4f7b7f7e 100644 --- a/app/assets/javascripts/pages/groups/new/group_path_validator.js +++ b/app/assets/javascripts/pages/groups/new/group_path_validator.js @@ -1,6 +1,6 @@ import { debounce } from 'lodash'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { __ } from '~/locale'; import InputValidator from '~/validators/input_validator'; import { getGroupPathAvailability } from '~/rest_api'; diff --git a/app/assets/javascripts/pages/groups/new/index.js b/app/assets/javascripts/pages/groups/new/index.js index a555038ed5c..b16c5f3da9f 100644 --- a/app/assets/javascripts/pages/groups/new/index.js +++ b/app/assets/javascripts/pages/groups/new/index.js @@ -22,6 +22,8 @@ initFilePickers(); function initNewGroupCreation(el) { const { hasErrors, + groupsUrl, + parentGroupUrl, parentGroupName, importExistingGroupPath, verificationRequired, @@ -30,6 +32,8 @@ function initNewGroupCreation(el) { } = el.dataset; const props = { + groupsUrl, + parentGroupUrl, parentGroupName, importExistingGroupPath, hasErrors: parseBoolean(hasErrors), diff --git a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue index 3dcababb4fd..582aee3c9a3 100644 --- a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue +++ b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue @@ -10,11 +10,12 @@ import { } from '@gitlab/ui'; import { s__, __ } from '~/locale'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils'; import { joinPaths } from '~/lib/utils/url_utility'; import { getBulkImportsHistory } from '~/rest_api'; import ImportStatus from '~/import_entities/components/import_status.vue'; +import { WORKSPACE_GROUP, WORKSPACE_PROJECT } from '~/issues/constants'; import PaginationBar from '~/vue_shared/components/pagination_bar/pagination_bar.vue'; import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue'; import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue'; @@ -131,15 +132,15 @@ export default { }, getPresentationUrl(item) { - const suffix = item.entity_type === 'group' ? '/' : ''; + const suffix = item.entity_type === WORKSPACE_GROUP ? '/' : ''; return `${item.destination_full_path}${suffix}`; }, getEntityTooltip(item) { switch (item.entity_type) { - case 'project': + case WORKSPACE_PROJECT: return __('Project'); - case 'group': + case WORKSPACE_GROUP: return __('Group'); default: return ''; diff --git a/app/assets/javascripts/pages/import/history/components/import_error_details.vue b/app/assets/javascripts/pages/import/history/components/import_error_details.vue index 6af137cd722..9c26804f73d 100644 --- a/app/assets/javascripts/pages/import/history/components/import_error_details.vue +++ b/app/assets/javascripts/pages/import/history/components/import_error_details.vue @@ -1,7 +1,7 @@ <script> import { GlLoadingIcon } from '@gitlab/ui'; import API from '~/api'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { DEFAULT_ERROR } from '../utils/error_messages'; export default { diff --git a/app/assets/javascripts/pages/import/history/components/import_history_app.vue b/app/assets/javascripts/pages/import/history/components/import_history_app.vue index 09b1b3a9c0f..938c2be89c5 100644 --- a/app/assets/javascripts/pages/import/history/components/import_history_app.vue +++ b/app/assets/javascripts/pages/import/history/components/import_history_app.vue @@ -1,7 +1,7 @@ <script> import { GlButton, GlEmptyState, GlIcon, GlLink, GlLoadingIcon, GlTable } from '@gitlab/ui'; import { s__, __ } from '~/locale'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils'; import { getProjects } from '~/rest_api'; import ImportStatus from '~/import_entities/components/import_status.vue'; diff --git a/app/assets/javascripts/pages/profiles/index.js b/app/assets/javascripts/pages/profiles/index.js index 91b20a05196..b576aab9291 100644 --- a/app/assets/javascripts/pages/profiles/index.js +++ b/app/assets/javascripts/pages/profiles/index.js @@ -2,6 +2,7 @@ import $ from 'jquery'; import '~/profile/gl_crop'; import Profile from '~/profile/profile'; import initSearchSettings from '~/search_settings'; +import LengthValidator from '~/validators/length_validator'; import initPasswordPrompt from './password_prompt'; import { initTimezoneDropdown } from './init_timezone_dropdown'; @@ -19,6 +20,7 @@ $(document).on('input.ssh_key', '#key_key', function () { }); new Profile(); // eslint-disable-line no-new +new LengthValidator(); // eslint-disable-line no-new initSearchSettings(); initPasswordPrompt(); diff --git a/app/assets/javascripts/pages/profiles/password_prompt/password_prompt_modal.vue b/app/assets/javascripts/pages/profiles/password_prompt/password_prompt_modal.vue index 44728ea9cdf..7db94ea435e 100644 --- a/app/assets/javascripts/pages/profiles/password_prompt/password_prompt_modal.vue +++ b/app/assets/javascripts/pages/profiles/password_prompt/password_prompt_modal.vue @@ -33,7 +33,7 @@ export default { primaryProps() { return { text: I18N_PASSWORD_PROMPT_CONFIRM_BUTTON, - attributes: [{ variant: 'danger' }, { category: 'primary' }, { disabled: !this.isValid }], + attributes: { variant: 'danger', category: 'primary', disabled: !this.isValid }, }; }, }, diff --git a/app/assets/javascripts/pages/profiles/two_factor_auths/index.js b/app/assets/javascripts/pages/profiles/two_factor_auths/index.js index 96c4d0e0670..ea6bca644ed 100644 --- a/app/assets/javascripts/pages/profiles/two_factor_auths/index.js +++ b/app/assets/javascripts/pages/profiles/two_factor_auths/index.js @@ -1,4 +1,5 @@ import { mount2faRegistration } from '~/authentication/mount_2fa'; +import { initWebAuthnRegistration } from '~/authentication/webauthn/registration'; import { initRecoveryCodes, initManageTwoFactorForm } from '~/authentication/two_factor_auth'; import { parseBoolean } from '~/lib/utils/common_utils'; @@ -15,6 +16,7 @@ if (skippable) { } mount2faRegistration(); +initWebAuthnRegistration(); initRecoveryCodes(); diff --git a/app/assets/javascripts/pages/projects/airflow/dags/index/index.js b/app/assets/javascripts/pages/projects/airflow/dags/index/index.js deleted file mode 100644 index 1d7cf4a5b8e..00000000000 --- a/app/assets/javascripts/pages/projects/airflow/dags/index/index.js +++ /dev/null @@ -1,27 +0,0 @@ -import Vue from 'vue'; -import AirflowDags from '~/airflow/dags/components/dags.vue'; -import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; - -const initShowDags = () => { - const element = document.querySelector('#js-show-airflow-dags'); - if (!element) { - return null; - } - - const dags = JSON.parse(element.dataset.dags); - const pagination = convertObjectPropsToCamelCase(JSON.parse(element.dataset.pagination)); - - return new Vue({ - el: element, - render(h) { - return h(AirflowDags, { - props: { - dags, - pagination, - }, - }); - }, - }); -}; - -initShowDags(); diff --git a/app/assets/javascripts/pages/projects/blame/show/index.js b/app/assets/javascripts/pages/projects/blame/show/index.js index 1e4b9de90f2..f0fdd18c828 100644 --- a/app/assets/javascripts/pages/projects/blame/show/index.js +++ b/app/assets/javascripts/pages/projects/blame/show/index.js @@ -1,5 +1,10 @@ import initBlob from '~/pages/projects/init_blob'; import redirectToCorrectPage from '~/blame/blame_redirect'; +import { renderBlamePageStreams } from '~/blame/streaming'; -redirectToCorrectPage(); +if (new URLSearchParams(window.location.search).get('streaming')) { + renderBlamePageStreams(window.blamePageStream); +} else { + redirectToCorrectPage(); +} initBlob(); diff --git a/app/assets/javascripts/pages/projects/blob/show/index.js b/app/assets/javascripts/pages/projects/blob/show/index.js index e45f9a10294..a0f391c912b 100644 --- a/app/assets/javascripts/pages/projects/blob/show/index.js +++ b/app/assets/javascripts/pages/projects/blob/show/index.js @@ -13,6 +13,9 @@ import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_sta import BlobContentViewer from '~/repository/components/blob_content_viewer.vue'; import '~/sourcegraph/load'; import createStore from '~/code_navigation/store'; +import { generateRefDestinationPath } from '~/repository/utils/ref_switcher_utils'; +import RefSelector from '~/ref/components/ref_selector.vue'; +import { visitUrl } from '~/lib/utils/url_utility'; Vue.use(Vuex); Vue.use(VueApollo); @@ -26,6 +29,33 @@ const router = new VueRouter({ mode: 'history' }); const viewBlobEl = document.querySelector('#js-view-blob-app'); +const initRefSwitcher = () => { + const refSwitcherEl = document.getElementById('js-tree-ref-switcher'); + + if (!refSwitcherEl) return false; + + const { projectId, projectRootPath, ref } = refSwitcherEl.dataset; + + return new Vue({ + el: refSwitcherEl, + render(createElement) { + return createElement(RefSelector, { + props: { + projectId, + value: ref, + }, + on: { + input(selectedRef) { + visitUrl(generateRefDestinationPath(projectRootPath, ref, selectedRef)); + }, + }, + }); + }, + }); +}; + +initRefSwitcher(); + if (viewBlobEl) { const { blobPath, projectPath, targetBranch, originalBranch } = viewBlobEl.dataset; diff --git a/app/assets/javascripts/pages/projects/boards/index.js b/app/assets/javascripts/pages/projects/boards/index.js index bde0007ec6a..23f5b083589 100644 --- a/app/assets/javascripts/pages/projects/boards/index.js +++ b/app/assets/javascripts/pages/projects/boards/index.js @@ -1,7 +1,5 @@ import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation'; import initBoards from '~/boards'; -import UsersSelect from '~/users_select'; -new UsersSelect(); // eslint-disable-line no-new new ShortcutsNavigation(); // eslint-disable-line no-new initBoards(); diff --git a/app/assets/javascripts/pages/projects/commit/show/index.js b/app/assets/javascripts/pages/projects/commit/show/index.js index 667fd89af55..f871cd804e7 100644 --- a/app/assets/javascripts/pages/projects/commit/show/index.js +++ b/app/assets/javascripts/pages/projects/commit/show/index.js @@ -4,7 +4,7 @@ import Vue from 'vue'; import loadAwardsHandler from '~/awards_handler'; import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation'; import Diff from '~/diff'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import initDeprecatedNotes from '~/init_deprecated_notes'; import { initDiffStatsDropdown } from '~/init_diff_stats_dropdown'; import axios from '~/lib/utils/axios_utils'; @@ -20,7 +20,9 @@ import { initReportAbuse } from '~/projects/report_abuse'; const hasPerfBar = document.querySelector('.with-performance-bar'); const performanceHeight = hasPerfBar ? 35 : 0; -initDiffStatsDropdown(document.querySelector('.navbar-gitlab').offsetHeight + performanceHeight); +initDiffStatsDropdown( + (document.querySelector('.navbar-gitlab')?.offsetHeight ?? 0) + performanceHeight, +); new ZenMode(); new ShortcutsNavigation(); diff --git a/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue b/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue index 85fe3477d7c..2cfedd78bd8 100644 --- a/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue +++ b/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue @@ -12,7 +12,7 @@ import { } from '@gitlab/ui'; import { kebabCase } from 'lodash'; import { buildApiUrl } from '~/api/api_utils'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import csrf from '~/lib/utils/csrf'; import { redirectTo } from '~/lib/utils/url_utility'; diff --git a/app/assets/javascripts/pages/projects/forks/new/components/project_namespace.vue b/app/assets/javascripts/pages/projects/forks/new/components/project_namespace.vue index 5e0c5735bc0..12ddf538775 100644 --- a/app/assets/javascripts/pages/projects/forks/new/components/project_namespace.vue +++ b/app/assets/javascripts/pages/projects/forks/new/components/project_namespace.vue @@ -1,6 +1,6 @@ <script> import { GlButton, GlButtonGroup, GlCollapsibleListbox } from '@gitlab/ui'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { MINIMUM_SEARCH_LENGTH } from '~/graphql_shared/constants'; import { s__ } from '~/locale'; import { getIdFromGraphQLId } from '~/graphql_shared/utils'; diff --git a/app/assets/javascripts/pages/projects/graphs/components/code_coverage.vue b/app/assets/javascripts/pages/projects/graphs/components/code_coverage.vue index 10bfcdc2294..b2e96471769 100644 --- a/app/assets/javascripts/pages/projects/graphs/components/code_coverage.vue +++ b/app/assets/javascripts/pages/projects/graphs/components/code_coverage.vue @@ -1,5 +1,5 @@ <script> -import { GlAlert, GlButton, GlListbox, GlSprintf } from '@gitlab/ui'; +import { GlAlert, GlButton, GlCollapsibleListbox, GlSprintf } from '@gitlab/ui'; import { GlAreaChart } from '@gitlab/ui/dist/charts'; import { get } from 'lodash'; import { formatDate } from '~/lib/utils/datetime_utility'; @@ -12,7 +12,7 @@ export default { GlAlert, GlAreaChart, GlButton, - GlListbox, + GlCollapsibleListbox, GlSprintf, }, props: { @@ -98,7 +98,7 @@ export default { mappedCoverages() { return this.dailyCoverageData?.map((item, index) => ({ // A numerical index makes an item into a group header, so - // convert these to strings to get non-header GlListbox items + // convert these to strings to get non-header GlCollapsibleListbox items value: index.toString(), text: item.group_name, })); @@ -182,7 +182,7 @@ export default { {{ __('It seems that there is currently no available data for code coverage') }} </span> </gl-alert> - <gl-listbox + <gl-collapsible-listbox v-if="canShowData" :items="mappedCoverages" :selected="selectedCoverageIndex.toString()" diff --git a/app/assets/javascripts/pages/projects/merge_requests/edit/index.js b/app/assets/javascripts/pages/projects/merge_requests/edit/index.js index 406959c80ea..f8cb8b30250 100644 --- a/app/assets/javascripts/pages/projects/merge_requests/edit/index.js +++ b/app/assets/javascripts/pages/projects/merge_requests/edit/index.js @@ -1,4 +1,4 @@ -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { __ } from '~/locale'; diff --git a/app/assets/javascripts/pages/projects/merge_requests/index/index.js b/app/assets/javascripts/pages/projects/merge_requests/index/index.js index af75c05b300..3ae8018714a 100644 --- a/app/assets/javascripts/pages/projects/merge_requests/index/index.js +++ b/app/assets/javascripts/pages/projects/merge_requests/index/index.js @@ -3,10 +3,9 @@ import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation'; import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys'; import { FILTERED_SEARCH } from '~/filtered_search/constants'; import { initBulkUpdateSidebar, initCsvImportExportButtons, initIssuableByEmail } from '~/issuable'; -import { ISSUABLE_INDEX } from '~/issuable/constants'; import initFilteredSearch from '~/pages/search/init_filtered_search'; -initBulkUpdateSidebar(ISSUABLE_INDEX.MERGE_REQUEST); +initBulkUpdateSidebar('merge_request_'); addExtraTokensForMergeRequests(IssuableFilteredSearchTokenKeys); IssuableFilteredSearchTokenKeys.removeTokensForKeys('iteration'); diff --git a/app/assets/javascripts/pages/projects/ml/candidates/show/index.js b/app/assets/javascripts/pages/projects/ml/candidates/show/index.js index fee6258eddc..9dc85cded0e 100644 --- a/app/assets/javascripts/pages/projects/ml/candidates/show/index.js +++ b/app/assets/javascripts/pages/projects/ml/candidates/show/index.js @@ -1,4 +1,4 @@ import { initSimpleApp } from '~/helpers/init_simple_app_helper'; -import MlCandidate from '~/ml/experiment_tracking/components/ml_candidate.vue'; +import MlCandidateShow from '~/ml/experiment_tracking/routes/candidates/show'; -initSimpleApp('#js-show-ml-candidate', MlCandidate); +initSimpleApp('#js-show-ml-candidate', MlCandidateShow); diff --git a/app/assets/javascripts/pages/projects/ml/experiments/show/index.js b/app/assets/javascripts/pages/projects/ml/experiments/show/index.js index 0e64d8c17db..a90cabb3c68 100644 --- a/app/assets/javascripts/pages/projects/ml/experiments/show/index.js +++ b/app/assets/javascripts/pages/projects/ml/experiments/show/index.js @@ -1,32 +1,24 @@ import Vue from 'vue'; -import MlExperiment from '~/ml/experiment_tracking/components/ml_experiment.vue'; +import MlExperimentsShow from '~/ml/experiment_tracking/routes/experiments/show/ml_experiments_show.vue'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; const initShowExperiment = () => { const element = document.querySelector('#js-show-ml-experiment'); if (!element) { - return; + return undefined; } - const container = document.createElement('div'); - element.appendChild(container); + const props = { + candidates: JSON.parse(element.dataset.candidates), + metricNames: JSON.parse(element.dataset.metrics), + paramNames: JSON.parse(element.dataset.params), + pageInfo: convertObjectPropsToCamelCase(JSON.parse(element.dataset.pageInfo)), + }; - const candidates = JSON.parse(element.dataset.candidates); - const metricNames = JSON.parse(element.dataset.metrics); - const paramNames = JSON.parse(element.dataset.params); - const pageInfo = convertObjectPropsToCamelCase(JSON.parse(element.dataset.pageInfo)); - - // eslint-disable-next-line no-new - new Vue({ - el: container, - provide: { - candidates, - metricNames, - paramNames, - pageInfo, - }, + return new Vue({ + el: element, render(h) { - return h(MlExperiment); + return h(MlExperimentsShow, { props }); }, }); }; diff --git a/app/assets/javascripts/pages/projects/project.js b/app/assets/javascripts/pages/projects/project.js index 5773737c41b..5f15a11e708 100644 --- a/app/assets/javascripts/pages/projects/project.js +++ b/app/assets/javascripts/pages/projects/project.js @@ -4,7 +4,7 @@ import $ from 'jquery'; import { setCookie } from '~/lib/utils/common_utils'; import initClonePanel from '~/clone_panel'; import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { serializeForm } from '~/lib/utils/forms'; import { mergeUrlParams } from '~/lib/utils/url_utility'; diff --git a/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js b/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js index 964c6ca9792..9ec56015405 100644 --- a/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js +++ b/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js @@ -6,6 +6,7 @@ import initDeployFreeze from '~/deploy_freeze'; import registrySettingsApp from '~/packages_and_registries/settings/project/registry_settings_bundle'; import { initInstallRunner } from '~/pages/shared/mount_runner_instructions'; import initSharedRunnersToggle from '~/projects/settings/mount_shared_runners_toggle'; +import initRefSwitcherBadges from '~/projects/settings/mount_ref_switcher_badges'; import initSettingsPanels from '~/settings_panels'; import { initTokenAccess } from '~/token_access'; import { initCiSecureFiles } from '~/ci_secure_files'; @@ -42,6 +43,7 @@ initArtifactsSettings(); initProjectRunners(); initSharedRunnersToggle(); +initRefSwitcherBadges(); initInstallRunner(); initTokenAccess(); initCiSecureFiles(); diff --git a/app/assets/javascripts/pages/projects/settings/repository/form.js b/app/assets/javascripts/pages/projects/settings/repository/form.js index 380091a3501..f64de693188 100644 --- a/app/assets/javascripts/pages/projects/settings/repository/form.js +++ b/app/assets/javascripts/pages/projects/settings/repository/form.js @@ -10,8 +10,8 @@ import ProtectedTagEditList from '~/protected_tags/protected_tag_edit_list'; import initSettingsPanels from '~/settings_panels'; export default () => { - new ProtectedTagCreate(); - new ProtectedTagEditList(); + new ProtectedTagCreate({ hasLicense: false }); + new ProtectedTagEditList({ hasLicense: false }); initDeployKeys(); initSettingsPanels(); new ProtectedBranchCreate({ hasLicense: false }); diff --git a/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue b/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue index f2bc4796324..2f29d96d85e 100644 --- a/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue +++ b/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue @@ -65,7 +65,7 @@ export default { releasesHelpText: s__( 'ProjectSettings|Combine git tags with release notes, release evidence, and assets to create a release.', ), - securityAndComplianceLabel: s__('ProjectSettings|Security & Compliance'), + securityAndComplianceLabel: s__('ProjectSettings|Security and Compliance'), snippetsLabel: s__('ProjectSettings|Snippets'), wikiLabel: s__('ProjectSettings|Wiki'), pucWarningLabel: s__('ProjectSettings|Warn about Potentially Unwanted Characters'), @@ -825,7 +825,7 @@ export default { </project-setting-row> <project-setting-row :label="$options.i18n.securityAndComplianceLabel" - :help-text="s__('ProjectSettings|Security & Compliance for this project')" + :help-text="s__('ProjectSettings|Security and compliance for this project.')" > <project-feature-setting v-model="securityAndComplianceAccessLevel" diff --git a/app/assets/javascripts/pages/registrations/new/index.js b/app/assets/javascripts/pages/registrations/new/index.js index eaafc0235a8..b8de2757284 100644 --- a/app/assets/javascripts/pages/registrations/new/index.js +++ b/app/assets/javascripts/pages/registrations/new/index.js @@ -1,7 +1,7 @@ import { trackNewRegistrations } from '~/google_tag_manager'; import NoEmojiValidator from '~/emoji/no_emoji_validator'; -import LengthValidator from '~/pages/sessions/new/length_validator'; +import LengthValidator from '~/validators/length_validator'; import UsernameValidator from '~/pages/sessions/new/username_validator'; import EmailFormatValidator from '~/pages/sessions/new/email_format_validator'; import { initLanguageSwitcher } from '~/language_switcher'; @@ -10,10 +10,7 @@ import Tracking from '~/tracking'; new UsernameValidator(); // eslint-disable-line no-new new LengthValidator(); // eslint-disable-line no-new new NoEmojiValidator(); // eslint-disable-line no-new - -if (gon.features.trialEmailValidation) { - new EmailFormatValidator(); // eslint-disable-line no-new -} +new EmailFormatValidator(); // eslint-disable-line no-new trackNewRegistrations(); diff --git a/app/assets/javascripts/pages/sessions/new/index.js b/app/assets/javascripts/pages/sessions/new/index.js index a84ed5f01ad..a8b4dca0845 100644 --- a/app/assets/javascripts/pages/sessions/new/index.js +++ b/app/assets/javascripts/pages/sessions/new/index.js @@ -2,7 +2,7 @@ import $ from 'jquery'; import initVueAlerts from '~/vue_alerts'; import NoEmojiValidator from '~/emoji/no_emoji_validator'; import { initLanguageSwitcher } from '~/language_switcher'; -import LengthValidator from './length_validator'; +import LengthValidator from '~/validators/length_validator'; import OAuthRememberMe from './oauth_remember_me'; import preserveUrlFragment from './preserve_url_fragment'; import SigninTabsMemoizer from './signin_tabs_memoizer'; diff --git a/app/assets/javascripts/pages/sessions/new/length_validator.js b/app/assets/javascripts/pages/sessions/new/length_validator.js deleted file mode 100644 index b2074fb1e39..00000000000 --- a/app/assets/javascripts/pages/sessions/new/length_validator.js +++ /dev/null @@ -1,45 +0,0 @@ -import InputValidator from '~/validators/input_validator'; - -const errorMessageClass = 'gl-field-error'; - -export default class LengthValidator extends InputValidator { - constructor(opts = {}) { - super(); - - const container = opts.container || ''; - const validateLengthElements = document.querySelectorAll(`${container} .js-validate-length`); - - validateLengthElements.forEach((element) => - element.addEventListener('input', this.eventHandler.bind(this)), - ); - } - - eventHandler(event) { - this.inputDomElement = event.target; - this.inputErrorMessage = this.inputDomElement.parentElement.querySelector( - `.${errorMessageClass}`, - ); - - const { value } = this.inputDomElement; - const { - minLength, - minLengthMessage, - maxLengthMessage, - maxLength, - } = this.inputDomElement.dataset; - - this.invalidInput = false; - - if (value.length > parseInt(maxLength, 10)) { - this.invalidInput = true; - this.errorMessage = maxLengthMessage; - } - - if (value.length < parseInt(minLength, 10)) { - this.invalidInput = true; - this.errorMessage = minLengthMessage; - } - - this.setValidationStateAndMessage(); - } -} diff --git a/app/assets/javascripts/pages/sessions/new/username_validator.js b/app/assets/javascripts/pages/sessions/new/username_validator.js index 1848aa70cf0..664909a9012 100644 --- a/app/assets/javascripts/pages/sessions/new/username_validator.js +++ b/app/assets/javascripts/pages/sessions/new/username_validator.js @@ -1,6 +1,6 @@ import { debounce } from 'lodash'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { __ } from '~/locale'; import InputValidator from '~/validators/input_validator'; diff --git a/app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue b/app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue index b19809aff53..8491d667213 100644 --- a/app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue +++ b/app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue @@ -1,7 +1,7 @@ <script> import { GlSkeletonLoader, GlAlert } from '@gitlab/ui'; import SafeHtml from '~/vue_shared/directives/safe_html'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { __ } from '~/locale'; import axios from '~/lib/utils/axios_utils'; import { handleLocationHash } from '~/lib/utils/common_utils'; diff --git a/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue b/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue index 0d2bbfbbc43..549c964cce4 100644 --- a/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue +++ b/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue @@ -351,6 +351,7 @@ export default { :enable-content-editor="isMarkdownFormat" :enable-preview="isMarkdownFormat" :autofocus="pageInfo.persisted" + :drawio-enabled="true" @contentEditor="notifyContentEditorActive" @markdownField="notifyContentEditorInactive" @keydown.ctrl.enter="submitFormShortcut" diff --git a/app/assets/javascripts/pages/shared/wikis/wikis.js b/app/assets/javascripts/pages/shared/wikis/wikis.js index 8d0105bc681..ec085eae199 100644 --- a/app/assets/javascripts/pages/shared/wikis/wikis.js +++ b/app/assets/javascripts/pages/shared/wikis/wikis.js @@ -16,6 +16,17 @@ export default class Wikis { sidebarToggles[i].addEventListener('click', (e) => this.handleToggleSidebar(e)); } + const listToggles = document.querySelectorAll('.js-wiki-list-toggle'); + + listToggles.forEach((listToggle) => { + listToggle.querySelector('.js-wiki-list-expand-button')?.addEventListener('click', () => { + listToggle.classList.remove('collapsed'); + }); + listToggle.querySelector('.js-wiki-list-collapse-button')?.addEventListener('click', () => { + listToggle.classList.add('collapsed'); + }); + }); + window.addEventListener('resize', () => this.renderSidebar()); this.renderSidebar(); diff --git a/app/assets/javascripts/pages/users/activity_calendar.js b/app/assets/javascripts/pages/users/activity_calendar.js index fb761725c43..13bba06d425 100644 --- a/app/assets/javascripts/pages/users/activity_calendar.js +++ b/app/assets/javascripts/pages/users/activity_calendar.js @@ -1,7 +1,7 @@ import { select } from 'd3-selection'; import $ from 'jquery'; import { last } from 'lodash'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import dateFormat from '~/lib/dateformat'; import axios from '~/lib/utils/axios_utils'; import { getDayName, getDayDifference } from '~/lib/utils/datetime_utility'; @@ -58,7 +58,7 @@ export const getLevelFromContributions = (count) => { }; export default class ActivityCalendar { - constructor( + constructor({ container, activitiesContainer, timestamps, @@ -66,7 +66,8 @@ export default class ActivityCalendar { utcOffset = 0, firstDayOfWeek = firstDayOfWeekChoices.sunday, monthsAgo = 12, - ) { + onClickDay, + }) { this.calendarActivitiesPath = calendarActivitiesPath; this.clickDay = this.clickDay.bind(this); this.currentSelectedDate = ''; @@ -91,6 +92,7 @@ export default class ActivityCalendar { this.firstDayOfWeek = firstDayOfWeek; this.activitiesContainer = activitiesContainer; this.container = container; + this.onClickDay = onClickDay; // Loop through the timestamps to create a group of objects // The group of objects will be grouped based on the day of the week they are @@ -152,7 +154,8 @@ export default class ActivityCalendar { .append('svg') .attr('width', width) .attr('height', 169) - .attr('class', 'contrib-calendar'); + .attr('class', 'contrib-calendar') + .attr('data-testid', 'contrib-calendar'); } dayYPos(day) { @@ -181,6 +184,7 @@ export default class ActivityCalendar { }); return `translate(${this.daySizeWithSpace * i + 1 + this.daySizeWithSpace}, 18)`; }) + .attr('data-testid', 'user-contrib-cell-group') .selectAll('rect') .data((stamp) => stamp) .enter() @@ -192,6 +196,7 @@ export default class ActivityCalendar { .attr('data-level', (stamp) => getLevelFromContributions(stamp.count)) .attr('title', (stamp) => formatTooltipText(stamp)) .attr('class', 'user-contrib-cell has-tooltip') + .attr('data-testid', 'user-contrib-cell') .attr('data-html', true) .attr('data-container', 'body') .on('click', this.clickDay); @@ -281,6 +286,12 @@ export default class ActivityCalendar { this.currentSelectedDate.getDate(), ].join('-'); + if (this.onClickDay) { + this.onClickDay(date); + + return; + } + $(this.activitiesContainer) .empty() .append(loadingIconForLegacyJS({ size: 'lg' })); diff --git a/app/assets/javascripts/pages/users/show/index.js b/app/assets/javascripts/pages/users/show/index.js index f1b4e00c810..c213753257d 100644 --- a/app/assets/javascripts/pages/users/show/index.js +++ b/app/assets/javascripts/pages/users/show/index.js @@ -1,16 +1,7 @@ -import { s__ } from '~/locale'; -import { createAlert } from '~/flash'; +import { initProfileTabs, initUserAchievements } from '~/profile'; -if (window.gon.features?.profileTabsVue) { - import('~/profile') - .then(({ initProfileTabs }) => { - initProfileTabs(); - }) - .catch(() => { - createAlert({ - message: s__( - 'UserProfile|An error occurred loading the profile. Please refresh the page to try again.', - ), - }); - }); +if (gon.features?.profileTabsVue) { + initProfileTabs(); } + +initUserAchievements(); diff --git a/app/assets/javascripts/pages/users/user_tabs.js b/app/assets/javascripts/pages/users/user_tabs.js index 90eafa85886..430022f9a9b 100644 --- a/app/assets/javascripts/pages/users/user_tabs.js +++ b/app/assets/javascripts/pages/users/user_tabs.js @@ -247,15 +247,15 @@ export default class UserTabs { $calendarWrap.find('.calendar-hint').text(calendarHint); // eslint-disable-next-line no-new - new ActivityCalendar( - '.tab-pane.active .js-contrib-calendar', - '.tab-pane.active .user-calendar-activities', - data, + new ActivityCalendar({ + container: '.tab-pane.active .js-contrib-calendar', + activitiesContainer: '.tab-pane.active .user-calendar-activities', + timestamps: data, calendarActivitiesPath, utcOffset, - gon.first_day_of_week, + firstDayOfWeek: gon.first_day_of_week, monthsAgo, - ); + }); } toggleLoading(status) { |