diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-10-01 18:12:53 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-10-01 18:12:53 +0300 |
commit | 63fc59f6fdf8c61e7e342f89aecaf565b645960d (patch) | |
tree | 340075f94a18cd02899e6f77f1651f63adccd353 /app | |
parent | 6c7d90ede4d2890b2ca740239cd9a5338f12ba34 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/members/components/table/expires_at.vue | 66 | ||||
-rw-r--r-- | app/assets/javascripts/members/components/table/members_table.vue | 6 | ||||
-rw-r--r-- | app/assets/javascripts/members/constants.js | 6 | ||||
-rw-r--r-- | app/assets/javascripts/pages/groups/group_members/index.js | 2 | ||||
-rw-r--r-- | app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js | 34 | ||||
-rw-r--r-- | app/assets/javascripts/pages/projects/project_members/index.js | 2 | ||||
-rw-r--r-- | app/assets/javascripts/profile/profile.js | 1 | ||||
-rw-r--r-- | app/controllers/import/bulk_imports_controller.rb | 2 | ||||
-rw-r--r-- | app/helpers/time_zone_helper.rb | 2 | ||||
-rw-r--r-- | app/models/user_preference.rb | 1 | ||||
-rw-r--r-- | app/services/bulk_import_service.rb | 70 | ||||
-rw-r--r-- | app/services/bulk_imports/create_service.rb | 72 | ||||
-rw-r--r-- | app/views/profiles/show.html.haml | 2 | ||||
-rw-r--r-- | app/views/users/show.html.haml | 10 |
14 files changed, 104 insertions, 172 deletions
diff --git a/app/assets/javascripts/members/components/table/expires_at.vue b/app/assets/javascripts/members/components/table/expires_at.vue deleted file mode 100644 index c91de061b50..00000000000 --- a/app/assets/javascripts/members/components/table/expires_at.vue +++ /dev/null @@ -1,66 +0,0 @@ -<script> -import { GlSprintf, GlTooltipDirective } from '@gitlab/ui'; -import { - approximateDuration, - differenceInSeconds, - formatDate, - getDayDifference, -} from '~/lib/utils/datetime_utility'; -import { DAYS_TO_EXPIRE_SOON } from '../../constants'; - -export default { - name: 'ExpiresAt', - components: { GlSprintf }, - directives: { - GlTooltip: GlTooltipDirective, - }, - props: { - date: { - type: String, - required: false, - default: null, - }, - }, - computed: { - noExpirationSet() { - return this.date === null; - }, - parsed() { - return new Date(this.date); - }, - differenceInSeconds() { - return differenceInSeconds(new Date(), this.parsed); - }, - isExpired() { - return this.differenceInSeconds <= 0; - }, - inWords() { - return approximateDuration(this.differenceInSeconds); - }, - formatted() { - return formatDate(this.parsed); - }, - expiresSoon() { - return getDayDifference(new Date(), this.parsed) < DAYS_TO_EXPIRE_SOON; - }, - cssClass() { - return { - 'gl-text-red-500': this.isExpired, - 'gl-text-orange-500': this.expiresSoon, - }; - }, - }, -}; -</script> - -<template> - <span v-if="noExpirationSet">{{ s__('Members|No expiration set') }}</span> - <span v-else v-gl-tooltip.hover :title="formatted" :class="cssClass"> - <template v-if="isExpired">{{ s__('Members|Expired') }}</template> - <gl-sprintf v-else :message="s__('Members|in %{time}')"> - <template #time> - {{ inWords }} - </template> - </gl-sprintf> - </span> -</template> diff --git a/app/assets/javascripts/members/components/table/members_table.vue b/app/assets/javascripts/members/components/table/members_table.vue index debc3fc31f6..3caecdd1d4b 100644 --- a/app/assets/javascripts/members/components/table/members_table.vue +++ b/app/assets/javascripts/members/components/table/members_table.vue @@ -10,7 +10,6 @@ import RemoveGroupLinkModal from '../modals/remove_group_link_modal.vue'; import RemoveMemberModal from '../modals/remove_member_modal.vue'; import CreatedAt from './created_at.vue'; import ExpirationDatepicker from './expiration_datepicker.vue'; -import ExpiresAt from './expires_at.vue'; import MemberActionButtons from './member_action_buttons.vue'; import MemberAvatar from './member_avatar.vue'; import MemberSource from './member_source.vue'; @@ -24,7 +23,6 @@ export default { GlPagination, MemberAvatar, CreatedAt, - ExpiresAt, MembersTableCell, MemberSource, MemberActionButtons, @@ -182,10 +180,6 @@ export default { <created-at :date="createdAt" /> </template> - <template #cell(expires)="{ item: { expiresAt } }"> - <expires-at :date="expiresAt" /> - </template> - <template #cell(maxRole)="{ item: member }"> <members-table-cell #default="{ permissions }" :member="member"> <role-dropdown v-if="permissions.canUpdate" :permissions="permissions" :member="member" /> diff --git a/app/assets/javascripts/members/constants.js b/app/assets/javascripts/members/constants.js index 6f465245d20..54d4442d5ce 100644 --- a/app/assets/javascripts/members/constants.js +++ b/app/assets/javascripts/members/constants.js @@ -38,12 +38,6 @@ export const FIELDS = [ tdClass: 'col-meta', }, { - key: 'expires', - label: __('Access expires'), - thClass: 'col-meta', - tdClass: 'col-meta', - }, - { key: 'maxRole', label: __('Max role'), thClass: 'col-max-role', diff --git a/app/assets/javascripts/pages/groups/group_members/index.js b/app/assets/javascripts/pages/groups/group_members/index.js index 0137ff87979..01a371920f8 100644 --- a/app/assets/javascripts/pages/groups/group_members/index.js +++ b/app/assets/javascripts/pages/groups/group_members/index.js @@ -11,7 +11,7 @@ import { MEMBER_TYPES } from '~/members/constants'; import { groupLinkRequestFormatter } from '~/members/utils'; import UsersSelect from '~/users_select'; -const SHARED_FIELDS = ['account', 'expires', 'maxRole', 'expiration', 'actions']; +const SHARED_FIELDS = ['account', 'maxRole', 'expiration', 'actions']; initMembersApp(document.querySelector('.js-group-members-list-app'), { [MEMBER_TYPES.user]: { diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js index 16c4a6191b2..e92b9b30fa4 100644 --- a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js +++ b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js @@ -27,19 +27,22 @@ export const findTimezoneByIdentifier = (tzList = [], identifier = null) => { }; export default class TimezoneDropdown { - constructor({ $dropdownEl, $inputEl, onSelectTimezone, displayFormat } = defaults) { + constructor({ + $dropdownEl, + $inputEl, + onSelectTimezone, + displayFormat, + allowEmpty = false, + } = defaults) { this.$dropdown = $dropdownEl; this.$dropdownToggle = this.$dropdown.find('.dropdown-toggle-text'); this.$input = $inputEl; - this.timezoneData = this.$dropdown.data('data'); + this.timezoneData = this.$dropdown.data('data') || []; this.onSelectTimezone = onSelectTimezone; this.displayFormat = displayFormat || defaults.displayFormat; + this.allowEmpty = allowEmpty; - this.initialTimezone = - findTimezoneByIdentifier(this.timezoneData, this.$input.val()) || defaultTimezone; - - this.initDefaultTimezone(); this.initDropdown(); } @@ -52,24 +55,25 @@ export default class TimezoneDropdown { search: { fields: ['name'], }, - clicked: (cfg) => this.updateInputValue(cfg), + clicked: (cfg) => this.handleDropdownChange(cfg), text: (item) => formatTimezone(item), }); - this.setDropdownToggle(this.displayFormat(this.initialTimezone)); - } + const initialTimezone = findTimezoneByIdentifier(this.timezoneData, this.$input.val()); - initDefaultTimezone() { - if (!this.$input.val()) { - this.$input.val(defaultTimezone.name); + if (initialTimezone !== null) { + this.setDropdownValue(initialTimezone); + } else if (!this.allowEmpty) { + this.setDropdownValue(defaultTimezone); } } - setDropdownToggle(dropdownText) { - this.$dropdownToggle.text(dropdownText); + setDropdownValue(timezone) { + this.$dropdownToggle.text(this.displayFormat(timezone)); + this.$input.val(timezone.name); } - updateInputValue({ selectedObj, e }) { + handleDropdownChange({ selectedObj, e }) { e.preventDefault(); this.$input.val(selectedObj.identifier); if (this.onSelectTimezone) { diff --git a/app/assets/javascripts/pages/projects/project_members/index.js b/app/assets/javascripts/pages/projects/project_members/index.js index 0b662c945c6..947bbdacf2c 100644 --- a/app/assets/javascripts/pages/projects/project_members/index.js +++ b/app/assets/javascripts/pages/projects/project_members/index.js @@ -26,7 +26,7 @@ initInviteMembersForm(); new UsersSelect(); // eslint-disable-line no-new -const SHARED_FIELDS = ['account', 'expires', 'maxRole', 'expiration', 'actions']; +const SHARED_FIELDS = ['account', 'maxRole', 'expiration', 'actions']; initMembersApp(document.querySelector('.js-project-members-list-app'), { [MEMBER_TYPES.user]: { tableFields: SHARED_FIELDS.concat(['source', 'granted']), diff --git a/app/assets/javascripts/profile/profile.js b/app/assets/javascripts/profile/profile.js index c49ade2bbb8..ff9b47cdcd6 100644 --- a/app/assets/javascripts/profile/profile.js +++ b/app/assets/javascripts/profile/profile.js @@ -21,6 +21,7 @@ export default class Profile { $inputEl: this.$inputEl, $dropdownEl: $('.js-timezone-dropdown'), displayFormat: (selectedItem) => formatTimezone(selectedItem), + allowEmpty: true, }); } diff --git a/app/controllers/import/bulk_imports_controller.rb b/app/controllers/import/bulk_imports_controller.rb index da936215ad4..2dca9385da6 100644 --- a/app/controllers/import/bulk_imports_controller.rb +++ b/app/controllers/import/bulk_imports_controller.rb @@ -37,7 +37,7 @@ class Import::BulkImportsController < ApplicationController end def create - response = BulkImportService.new(current_user, create_params, credentials).execute + response = ::BulkImports::CreateService.new(current_user, create_params, credentials).execute if response.success? render json: response.payload.to_json(only: [:id]) diff --git a/app/helpers/time_zone_helper.rb b/app/helpers/time_zone_helper.rb index f92e32ff9b6..a0d9c8403e8 100644 --- a/app/helpers/time_zone_helper.rb +++ b/app/helpers/time_zone_helper.rb @@ -33,6 +33,8 @@ module TimeZoneHelper end def local_time(timezone) + return if timezone.blank? + time_zone_instance = ActiveSupport::TimeZone.new(timezone) || Time.zone time_zone_instance.now.strftime("%-l:%M %p") end diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb index 337ae7125f3..7687430cfd1 100644 --- a/app/models/user_preference.rb +++ b/app/models/user_preference.rb @@ -23,7 +23,6 @@ class UserPreference < ApplicationRecord ignore_columns :experience_level, remove_with: '14.10', remove_after: '2021-03-22' default_value_for :tab_width, value: Gitlab::TabWidth::DEFAULT, allows_nil: false - default_value_for :timezone, value: Time.zone.tzinfo.name, allows_nil: false default_value_for :time_display_relative, value: true, allows_nil: false default_value_for :time_format_in_24h, value: false, allows_nil: false default_value_for :render_whitespace_in_code, value: false, allows_nil: false diff --git a/app/services/bulk_import_service.rb b/app/services/bulk_import_service.rb deleted file mode 100644 index 4e13e967dbd..00000000000 --- a/app/services/bulk_import_service.rb +++ /dev/null @@ -1,70 +0,0 @@ -# frozen_string_literal: true - -# Entry point of the BulkImport feature. -# This service receives a Gitlab Instance connection params -# and a list of groups to be imported. -# -# Process topography: -# -# sync | async -# | -# User +--> P1 +----> Pn +---+ -# | ^ | Enqueue new job -# | +-----+ -# -# P1 (sync) -# -# - Create a BulkImport record -# - Create a BulkImport::Entity for each group to be imported -# - Enqueue a BulkImportWorker job (P2) to import the given groups (entities) -# -# Pn (async) -# -# - For each group to be imported (BulkImport::Entity.with_status(:created)) -# - Import the group data -# - Create entities for each subgroup of the imported group -# - Enqueue a BulkImportService job (Pn) to import the new entities (subgroups) -# -class BulkImportService - attr_reader :current_user, :params, :credentials - - def initialize(current_user, params, credentials) - @current_user = current_user - @params = params - @credentials = credentials - end - - def execute - bulk_import = create_bulk_import - - BulkImportWorker.perform_async(bulk_import.id) - - ServiceResponse.success(payload: bulk_import) - rescue ActiveRecord::RecordInvalid => e - ServiceResponse.error( - message: e.message, - http_status: :unprocessable_entity - ) - end - - private - - def create_bulk_import - BulkImport.transaction do - bulk_import = BulkImport.create!(user: current_user, source_type: 'gitlab') - bulk_import.create_configuration!(credentials.slice(:url, :access_token)) - - params.each do |entity| - BulkImports::Entity.create!( - bulk_import: bulk_import, - source_type: entity[:source_type], - source_full_path: entity[:source_full_path], - destination_name: entity[:destination_name], - destination_namespace: entity[:destination_namespace] - ) - end - - bulk_import - end - end -end diff --git a/app/services/bulk_imports/create_service.rb b/app/services/bulk_imports/create_service.rb new file mode 100644 index 00000000000..1cea7632aa1 --- /dev/null +++ b/app/services/bulk_imports/create_service.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +# Entry point of the BulkImport feature. +# This service receives a Gitlab Instance connection params +# and a list of groups to be imported. +# +# Process topography: +# +# sync | async +# | +# User +--> P1 +----> Pn +---+ +# | ^ | Enqueue new job +# | +-----+ +# +# P1 (sync) +# +# - Create a BulkImport record +# - Create a BulkImport::Entity for each group to be imported +# - Enqueue a BulkImportWorker job (P2) to import the given groups (entities) +# +# Pn (async) +# +# - For each group to be imported (BulkImport::Entity.with_status(:created)) +# - Import the group data +# - Create entities for each subgroup of the imported group +# - Enqueue a BulkImports::CreateService job (Pn) to import the new entities (subgroups) +# +module BulkImports + class CreateService + attr_reader :current_user, :params, :credentials + + def initialize(current_user, params, credentials) + @current_user = current_user + @params = params + @credentials = credentials + end + + def execute + bulk_import = create_bulk_import + + BulkImportWorker.perform_async(bulk_import.id) + + ServiceResponse.success(payload: bulk_import) + rescue ActiveRecord::RecordInvalid => e + ServiceResponse.error( + message: e.message, + http_status: :unprocessable_entity + ) + end + + private + + def create_bulk_import + BulkImport.transaction do + bulk_import = BulkImport.create!(user: current_user, source_type: 'gitlab') + bulk_import.create_configuration!(credentials.slice(:url, :access_token)) + + params.each do |entity| + BulkImports::Entity.create!( + bulk_import: bulk_import, + source_type: entity[:source_type], + source_full_path: entity[:source_full_path], + destination_name: entity[:destination_name], + destination_namespace: entity[:destination_namespace] + ) + end + + bulk_import + end + end + end +end diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml index ad8cde689f9..3e41f107e04 100644 --- a/app/views/profiles/show.html.haml +++ b/app/views/profiles/show.html.haml @@ -80,7 +80,7 @@ %p= s_("Profiles|Set your local time zone") .col-lg-8 %h5= _("Time zone") - = dropdown_tag(_("Select a time zone"), options: { toggle_class: 'gl-button btn js-timezone-dropdown input-lg', title: _("Select a time zone"), filter: true, placeholder: s_("OfSearchInADropdown|Filter"), data: { data: timezone_data } } ) + = dropdown_tag(_("Select a time zone"), options: { toggle_class: 'gl-button btn js-timezone-dropdown input-lg gl-w-full!', title: _("Select a time zone"), filter: true, placeholder: s_("OfSearchInADropdown|Filter"), data: { data: timezone_data } } ) %input.hidden{ :type => 'hidden', :id => 'user_timezone', :name => 'user[timezone]', value: @user.timezone } .col-lg-12 %hr diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 20cbe08225e..522f0f771cd 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -84,10 +84,12 @@ = sprite_icon('location', css_class: 'fgray') %span{ itemprop: 'addressLocality' } = @user.location - = render 'middle_dot_divider', stacking: true do - = sprite_icon('clock', css_class: 'fgray') - %span - = local_time(@user.timezone) + - user_local_time = local_time(@user.timezone) + - unless user_local_time.nil? + = render 'middle_dot_divider', stacking: true, data: { testid: 'user-local-time' } do + = sprite_icon('clock', css_class: 'fgray') + %span + = user_local_time - unless work_information(@user).blank? = render 'middle_dot_divider', stacking: true do = sprite_icon('work', css_class: 'fgray') |