Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2025-01-21 00:36:49 +00:00
parent bdcf532079
commit c232c17b46
526 changed files with 801 additions and 3363 deletions

View File

@ -1095,8 +1095,6 @@ Gitlab/NamespacedClass:
- 'lib/gitlab/git_logger.rb'
- 'lib/gitlab/git_post_receive.rb'
- 'lib/gitlab/gl_repository.rb'
- 'lib/gitlab/gl_repository/identifier.rb'
- 'lib/gitlab/gl_repository/repo_type.rb'
- 'lib/gitlab/graphql_logger.rb'
- 'lib/gitlab/group_search_results.rb'
- 'lib/gitlab/hashed_path.rb'

View File

@ -441,7 +441,6 @@ Layout/EmptyLineAfterMagicComment:
- 'spec/lib/gitlab/git/patches/commit_patches_spec.rb'
- 'spec/lib/gitlab/git/patches/patch_spec.rb'
- 'spec/lib/gitlab/git_access_design_spec.rb'
- 'spec/lib/gitlab/gl_repository/repo_type_spec.rb'
- 'spec/lib/gitlab/graphql/calls_gitaly/field_extension_spec.rb'
- 'spec/lib/gitlab/graphql/limit/field_call_count_spec.rb'
- 'spec/lib/gitlab/graphql/markdown_field_spec.rb'
@ -607,23 +606,6 @@ Layout/EmptyLineAfterMagicComment:
- 'spec/services/protected_branches/cache_service_spec.rb'
- 'spec/services/submodules/update_service_spec.rb'
- 'spec/services/wikis/create_attachment_service_spec.rb'
- 'spec/support/fips.rb'
- 'spec/support/generate-seed-repo-rb'
- 'spec/support/helpers/fake_webauthn_device.rb'
- 'spec/support/helpers/features/responsive_table_helpers.rb'
- 'spec/support/helpers/features/two_factor_helpers.rb'
- 'spec/support/helpers/lfs_http_helpers.rb'
- 'spec/support/redis.rb'
- 'spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb'
- 'spec/support/shared_examples/controllers/rate_limited_endpoint_shared_examples.rb'
- 'spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb'
- 'spec/support/shared_examples/controllers/unique_hll_events_examples.rb'
- 'spec/support/shared_examples/graphql/projects/services_resolver_shared_examples.rb'
- 'spec/support/shared_examples/lib/gitlab/import_export/attributes_permitter_shared_examples.rb'
- 'spec/support/shared_examples/models/concerns/counter_attribute_shared_examples.rb'
- 'spec/support/shared_examples/requests/rack_attack_shared_examples.rb'
- 'spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb'
- 'spec/support/view_component.rb'
- 'spec/tasks/rubocop_rake_spec.rb'
- 'spec/uploaders/dependency_proxy/file_uploader_spec.rb'
- 'spec/uploaders/packages/debian/component_file_uploader_spec.rb'

View File

@ -3244,7 +3244,6 @@ Layout/LineLength:
- 'spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb'
- 'spec/lib/gitlab/github_import/importer/lfs_object_importer_spec.rb'
- 'spec/lib/gitlab/github_import/object_counter_spec.rb'
- 'spec/lib/gitlab/gl_repository/repo_type_spec.rb'
- 'spec/lib/gitlab/gpg/commit_spec.rb'
- 'spec/lib/gitlab/gpg/invalid_gpg_signature_updater_spec.rb'
- 'spec/lib/gitlab/graphql/loaders/batch_lfs_oid_loader_spec.rb'

View File

@ -1391,7 +1391,6 @@ RSpec/FeatureCategory:
- 'spec/frontend/fixtures/tabs.rb'
- 'spec/frontend/fixtures/tags.rb'
- 'spec/frontend/fixtures/timezones.rb'
- 'spec/frontend/fixtures/todos.rb'
- 'spec/frontend/fixtures/webauthn.rb'
- 'spec/graphql/features/authorization_spec.rb'
- 'spec/graphql/gitlab_schema_spec.rb'
@ -2560,8 +2559,6 @@ RSpec/FeatureCategory:
- 'spec/lib/gitlab/gitaly_client/praefect_info_service_spec.rb'
- 'spec/lib/gitlab/gitaly_client/remote_service_spec.rb'
- 'spec/lib/gitlab/gitaly_client/util_spec.rb'
- 'spec/lib/gitlab/gl_repository/identifier_spec.rb'
- 'spec/lib/gitlab/gl_repository/repo_type_spec.rb'
- 'spec/lib/gitlab/gl_repository_spec.rb'
- 'spec/lib/gitlab/global_id/deprecations_spec.rb'
- 'spec/lib/gitlab/global_id_spec.rb'

View File

@ -2005,7 +2005,6 @@ RSpec/NamedSubject:
- 'spec/lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer_spec.rb'
- 'spec/lib/gitlab/github_import/importer/single_endpoint_issue_events_importer_spec.rb'
- 'spec/lib/gitlab/github_import/representation/note_text_spec.rb'
- 'spec/lib/gitlab/gl_repository/repo_type_spec.rb'
- 'spec/lib/gitlab/grape_logging/loggers/cloudflare_logger_spec.rb'
- 'spec/lib/gitlab/grape_logging/loggers/exception_logger_spec.rb'
- 'spec/lib/gitlab/grape_logging/loggers/filter_parameters_spec.rb'

View File

@ -11,7 +11,6 @@ import {
WIDGET_TYPE_NOTES,
WIDGET_TYPE_AWARD_EMOJI,
WIDGET_TYPE_HIERARCHY,
WIDGET_TYPE_DESIGNS,
} from '~/work_items/constants';
import isExpandedHierarchyTreeChildQuery from '~/work_items/graphql/client/is_expanded_hierarchy_tree_child.query.graphql';
@ -191,11 +190,6 @@ export const config = {
};
}
// Prevent cache being overwritten when opening a design
if (incomingWidget?.type === WIDGET_TYPE_DESIGNS && context.variables.filenames) {
return existingWidget;
}
return { ...existingWidget, ...incomingWidget };
});
},
@ -231,10 +225,21 @@ export const config = {
merge: true,
},
WorkItemType: {
// this prevents child and parent work item types from overriding each other
fields: {
widgetDefinitions: {
merge(existing = [], incoming) {
return [...existing, ...incoming];
if (existing.length === 0) {
return incoming;
}
return existing.map((existingWidget) => {
const incomingWidget = incoming.find(
(w) => w.type && w.type === existingWidget.type,
);
return { ...existingWidget, ...incomingWidget };
});
},
},
},

View File

@ -1,8 +1,3 @@
import initTodosApp from '~/todos';
import Todos from './todos';
if (gon.features.todosVueApplication) {
initTodosApp();
} else {
new Todos(); // eslint-disable-line no-new
}
initTodosApp();

View File

@ -1,215 +0,0 @@
/* eslint-disable class-methods-use-this */
import $ from 'jquery';
import { getGroups } from '~/api/groups_api';
import { getProjects } from '~/api/projects_api';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
import { createAlert } from '~/alert';
import axios from '~/lib/utils/axios_utils';
import { addDelimiter } from '~/lib/utils/text_utility';
import { __ } from '~/locale';
import UsersSelect from '~/users_select';
export default class Todos {
constructor() {
this.initFilters();
this.bindEvents();
this.todo_ids = [];
this.cleanupWrapper = this.cleanup.bind(this);
document.addEventListener('beforeunload', this.cleanupWrapper);
}
cleanup() {
this.unbindEvents();
document.removeEventListener('beforeunload', this.cleanupWrapper);
}
unbindEvents() {
document.querySelectorAll('.js-done-todo, .js-undo-todo, .js-add-todo').forEach((el) => {
el.removeEventListener('click', this.updateRowStateClickedWrapper);
});
document.querySelectorAll('.js-todos-mark-all, .js-todos-undo-all').forEach((el) => {
el.removeEventListener('click', this.updateallStateClickedWrapper);
});
}
bindEvents() {
this.updateRowStateClickedWrapper = this.updateRowStateClicked.bind(this);
this.updateAllStateClickedWrapper = this.updateAllStateClicked.bind(this);
document.querySelectorAll('.js-done-todo, .js-undo-todo, .js-add-todo').forEach((el) => {
el.addEventListener('click', this.updateRowStateClickedWrapper);
});
document.querySelectorAll('.js-todos-mark-all, .js-todos-undo-all').forEach((el) => {
el.addEventListener('click', this.updateAllStateClickedWrapper);
});
}
initFilters() {
this.initAjaxFilterDropdown(getGroups, $('.js-group-search'), 'group_id');
this.initAjaxFilterDropdown(getProjects, $('.js-project-search'), 'project_id');
this.initFilterDropdown($('.js-type-search'), 'type');
this.initFilterDropdown($('.js-action-search'), 'action_id');
return new UsersSelect();
}
initAjaxFilterDropdown(apiMethod, $dropdown, fieldName) {
initDeprecatedJQueryDropdown($dropdown, {
fieldName,
selectable: true,
filterable: true,
filterRemote: true,
data(search, callback) {
return apiMethod(search, {}, (data) => {
callback(
data.map((d) => ({
id: d.id,
text: d.full_name || d.name_with_namespace,
})),
);
});
},
clicked: () => {
const $formEl = $dropdown.closest('form.filter-form');
$formEl.submit();
},
});
}
initFilterDropdown($dropdown, fieldName, searchFields) {
initDeprecatedJQueryDropdown($dropdown, {
fieldName,
selectable: true,
filterable: Boolean(searchFields),
search: { fields: searchFields },
data: $dropdown.data('data'),
clicked: () => {
const $formEl = $dropdown.closest('form.filter-form');
$formEl.submit();
},
});
}
updateRowStateClicked(e) {
e.stopPropagation();
e.preventDefault();
let { currentTarget } = e;
if (currentTarget.tagName === 'svg' || currentTarget.tagName === 'use') {
currentTarget = currentTarget.closest('a');
}
currentTarget.setAttribute('disabled', true);
currentTarget.classList.add('disabled');
const loadingSpinner = currentTarget.querySelector('.gl-spinner-container');
loadingSpinner.classList.remove('hidden');
currentTarget.querySelector('.js-todo-button-icon').classList.add('hidden');
axios[currentTarget.dataset.method](currentTarget.href)
.then(({ data }) => {
this.updateRowState(currentTarget);
this.updateBadges(data);
})
.catch(() => {
this.updateRowState(currentTarget, true);
return createAlert({
message: __('Error updating status of to-do item.'),
});
});
}
updateRowState(target, isInactive = false) {
const row = target.closest('li');
const restoreBtn = row.querySelector('.js-undo-todo');
const doneBtn = row.querySelector('.js-done-todo');
const loadingSpinner = row.querySelector('.gl-spinner-container');
target.classList.add('hidden');
target.removeAttribute('disabled');
target.classList.remove('disabled');
loadingSpinner.classList.add('hidden');
target.querySelector('.js-todo-button-icon').classList.remove('hidden');
if (isInactive === true) {
restoreBtn.classList.add('hidden');
doneBtn.classList.remove('hidden');
} else if (target === doneBtn) {
row.classList.add('done-reversible', 'gl-bg-gray-10', 'gl-border-subtle');
restoreBtn.classList.remove('hidden');
} else if (target === restoreBtn) {
row.classList.remove('done-reversible', 'gl-bg-gray-10', 'gl-border-subtle');
doneBtn.classList.remove('hidden');
} else {
row.parentNode.removeChild(row);
}
}
updateAllStateClicked(e) {
e.stopPropagation();
e.preventDefault();
const { currentTarget } = e;
currentTarget.setAttribute('disabled', true);
currentTarget.classList.add('disabled');
const loadingSpinner = currentTarget.querySelector('.gl-spinner-container');
loadingSpinner.classList.remove('hidden');
currentTarget.querySelector('.gl-spinner-container').classList.add('gl-mr-2');
axios[currentTarget.dataset.method](currentTarget.href, {
ids: this.todo_ids,
})
.then(({ data }) => {
this.updateAllState(currentTarget, data);
this.updateBadges(data);
})
.catch(() =>
createAlert({
message: __('Error updating status for all to-do items.'),
}),
);
}
updateAllState(target, data) {
const markAllDoneBtn = document.querySelector('.js-todos-mark-all');
const undoAllBtn = document.querySelector('.js-todos-undo-all');
const todoListContainer = document.querySelector('.js-todos-list-container');
const nothingHereContainer = document.querySelector('.js-nothing-here-container');
const loadingSpinner = target.querySelector('.gl-spinner-container');
target.removeAttribute('disabled');
target.classList.remove('disabled');
loadingSpinner.classList.add('hidden');
target.querySelector('.gl-spinner-container').classList.remove('gl-mr-2');
this.todo_ids = target === markAllDoneBtn ? data.updated_ids : [];
undoAllBtn.classList.toggle('hidden');
markAllDoneBtn.classList.toggle('hidden');
todoListContainer.classList.toggle('hidden');
nothingHereContainer.classList.toggle('hidden');
}
updateBadges(data) {
const event = new CustomEvent('todo:toggle', {
detail: {
count: data.count,
},
});
document.dispatchEvent(event);
// eslint-disable-next-line no-unsanitized/property
document.querySelector('.js-todos-pending .js-todos-badge').innerHTML = addDelimiter(
data.count,
);
// eslint-disable-next-line no-unsanitized/property
document.querySelector('.js-todos-done .js-todos-badge').innerHTML = addDelimiter(
data.done_count,
);
}
}

View File

@ -167,7 +167,6 @@ ul.content-list {
ul.content-list.content-list-items-padding > li,
ul.content-list.issuable-list > li,
ul.content-list.todos-list > li,
.card > .content-list > li {
padding: $gl-padding-top $gl-padding;
}

View File

@ -1,110 +1,9 @@
@import 'mixins_and_variables_and_functions';
/**
* Dashboard Todos
*
*/
.todos-list > .todo {
// workaround because we cannot use border-collapse
padding: 6px 12px !important;
margin-top: -1px;
span:not(.todo-label),
button,
a:not(.todo-target-link),
time {
position: relative;
}
// overwrite border style of .content-list
&:last-child {
border-bottom: 1px solid transparent;
&:hover {
border-color: var(--blue-200, $blue-200);
}
}
&.todo-pending.done-reversible {
.todo-avatar {
filter: grayscale(1);
}
&:hover {
border-top-width: $gl-border-size-1;
border-top-color: transparent;
border-top-style: solid;
}
}
}
.todo-item {
@include transition(opacity);
.todo-label a::before {
// Make area of the todo item clickable by expanding the area around the todo link
content: '';
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 9;
}
}
.todo-title {
margin-right: 2.5rem;
@include media-breakpoint-up(sm) {
margin-right: 0;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
}
.todo-body {
p {
display: inline;
color: var(--gl-text-color-default);
}
pre.code.highlight {
padding-top: 0;
padding-bottom: 0;
padding-left: $gl-spacing-scale-1;
padding-right: $gl-spacing-scale-1;
margin: 0;
border-width: 0;
border-radius: $gl-border-radius-base;
display: inline-flex;
background: var(--gray-50, $gray-50);
color: var(--gl-text-color-default);
}
// stylelint-disable-next-line gitlab/no-gl-class
.gl-label-scoped {
--label-inset-border: inset 0 0 0 1px currentColor;
}
.avatar {
margin-bottom: 0;
}
}
.todo-actions,
.todo-body .todo-avatar,
.todos-list > .todo a:not(.todo-target-link) {
z-index: 11 !important;
}
.todo-actions {
position: absolute;
right: 0;
@include media-breakpoint-up(sm) {
position: relative;
}
// stylelint-disable-next-line gitlab/no-gl-class
.gl-label-scoped {
--label-inset-border: inset 0 0 0 1px currentColor;
}

View File

@ -1,10 +0,0 @@
/**
* Dashboard Todos (Vue version)
*
*/
// stylelint-disable-next-line gitlab/no-gl-class
.gl-label-scoped {
--label-inset-border: inset 0 0 0 1px currentColor;
}

View File

@ -1,40 +1,11 @@
# frozen_string_literal: true
class Dashboard::TodosController < Dashboard::ApplicationController
include ActionView::Helpers::NumberHelper
include PaginatedCollection
include Gitlab::Utils::StrongMemoize
before_action :authorize_read_project!, only: :index
before_action :authorize_read_group!, only: :index
before_action :find_todos, only: [:destroy_all]
feature_category :notifications
urgency :low
def index
push_frontend_feature_flag(:todos_vue_application, current_user)
push_frontend_feature_flag(:todos_snoozing, current_user)
# When removing the `todos_vue_application`, also drop the #vue method below
if Feature.enabled?(:todos_vue_application, current_user)
render :vue
else
@sort = pagination_params[:sort]
find_todos
@todos = @todos.page(pagination_params[:page])
@todos = @todos.with_entity_associations
return if redirect_out_of_range(@todos, todos_page_count(@todos))
@allowed_todos = ::Todos::AllowedTargetFilterService.new(@todos, current_user).execute
end
end
# To be removed along with the `todos_vue_application` feature flag.
# Also make sure to remove the corresponding route in `config/routes/dashboard.rb`.
def vue
redirect_to(dashboard_todos_path, status: :found)
end
def destroy
@ -51,92 +22,12 @@ class Dashboard::TodosController < Dashboard::ApplicationController
end
end
def destroy_all
updated_ids = TodoService.new.resolve_todos(@todos, current_user, resolved_by_action: :mark_all_done)
respond_to do |format|
format.html do
redirect_to dashboard_todos_path, status: :found, notice: _('Everything on your to-do list is marked as done.')
end
format.js { head :ok }
format.json { render json: todos_counts.merge(updated_ids: updated_ids) }
end
end
def restore
TodoService.new.restore_todo(current_user.todos.find(params[:id]), current_user)
render json: todos_counts
end
def bulk_restore
TodoService.new.restore_todos(current_user.todos.id_in(params[:ids]), current_user)
render json: todos_counts
end
private
def authorize_read_project!
project_id = params[:project_id]
return unless project_id.present?
project = Project.find(project_id)
render_404 unless can?(current_user, :read_project, project)
end
def authorize_read_group!
group_id = params[:group_id]
return unless group_id.present?
group = Group.find(group_id)
render_404 unless can?(current_user, :read_group, group)
end
def find_todos
@todos ||= TodosFinder.new(current_user, todo_params).execute
end
def todos_counts
{
count: current_user.todos_pending_count,
done_count: current_user.todos_done_count
}
end
def todos_page_count(todos)
if todo_params.except(:sort, :page).empty?
(current_user.todos_pending_count.to_f / todos.limit_value).ceil
else
todos.total_pages
end
end
def todo_params
aliased_params(
params.permit(:action_id, :author_id, :project_id, :type, :sort, :state, :group_id)
)
end
strong_memoize_attr :todo_params
def aliased_params(original_params)
alias_issue_type(original_params)
alias_action_id(original_params)
original_params
end
def alias_issue_type(original_params)
return unless original_params[:type] == Issue.name
original_params[:type] = [Issue.name, WorkItem.name]
end
def alias_action_id(original_params)
return unless original_params[:action_id].to_i == ::Todo::MENTIONED
original_params[:action_id] = [::Todo::MENTIONED, ::Todo::DIRECTLY_ADDRESSED]
end
end

View File

@ -9,54 +9,6 @@ module TodosHelper
@todos_done_count ||= current_user.todos_done_count
end
def todo_action_name(todo) # rubocop:disable Metrics/CyclomaticComplexity -- Will be removed/refactored as part of https://gitlab.com/gitlab-org/gitlab/-/issues/464069
case todo.action
when Todo::ASSIGNED then todo.self_added? ? _('assigned') : _('assigned you')
when Todo::REVIEW_REQUESTED then s_('Todos|requested a review')
when Todo::MENTIONED, Todo::DIRECTLY_ADDRESSED then format(
s_("Todos|mentioned %{who}"), who: todo_action_subject(todo)
)
when Todo::BUILD_FAILED then s_('Todos|The pipeline failed')
when Todo::MARKED then s_('Todos|added a to-do item')
when Todo::APPROVAL_REQUIRED then format(
s_("Todos|set %{who} as an approver"), who: todo_action_subject(todo)
)
when Todo::UNMERGEABLE then s_('Todos|Could not merge')
when Todo::MERGE_TRAIN_REMOVED then s_("Todos|Removed from Merge Train")
when Todo::MEMBER_ACCESS_REQUESTED then format(
s_("Todos|has requested access to %{what} %{which}"), what: _(todo.member_access_type), which: _(todo.target.name)
)
when Todo::REVIEW_SUBMITTED then s_('Todos|reviewed your merge request')
when Todo::OKR_CHECKIN_REQUESTED then format(
s_("Todos|requested an OKR update for %{what}"), what: todo.target.title
)
when Todo::SSH_KEY_EXPIRED then s_('Todos|Your SSH key has expired')
when Todo::SSH_KEY_EXPIRING_SOON then s_('Todos|Your SSH key is expiring soon')
end
end
def todo_self_addressing(todo)
case todo.action
when Todo::ASSIGNED then _('to yourself')
when Todo::REVIEW_REQUESTED then _('from yourself')
end
end
def todo_target_name(todo)
return todo.target_reference unless todo.for_commit?
content_tag(:span, todo.target_reference, class: 'commit-sha')
end
def todo_target_title(todo)
# Design To Dos' filenames are displayed in `#todo_target_name` (see `Design#to_reference`),
# so to avoid displaying duplicate filenames in the To Do list for designs,
# we return an empty string here.
return "" if todo.target.blank? || todo.for_design? || todo.member_access_requested?
todo.target.title.to_s
end
def todo_parent_path(todo)
if todo.resource_parent.is_a?(Group)
todo.resource_parent.name
@ -73,22 +25,6 @@ module TodosHelper
end
end
def todo_target_aria_label(todo)
target_type = if todo.for_design?
_('Design')
elsif todo.for_alert?
_('Alert')
elsif todo.member_access_requested?
_('Group')
elsif todo.for_issue_or_work_item?
IntegrationsHelper.integration_issue_type(todo.target.issue_type)
else
IntegrationsHelper.integration_todo_target_type(todo.target_type)
end
"#{target_type} #{todo_target_name(todo)}"
end
def todo_target_path(todo)
return unless todo.target.present?
@ -124,37 +60,6 @@ module TodosHelper
dom_id(todo.note) if todo.note.present?
end
def todo_target_state_pill(todo)
return unless show_todo_state?(todo)
state = todo.target.state.to_s
raw_state_to_i18n = {
"closed" => _('Closed'),
"merged" => _('Merged'),
"resolved" => _('Resolved')
}
case todo.target
when MergeRequest
case state
when 'closed'
variant = 'danger'
when 'merged'
variant = 'info'
end
when Issue
variant = 'info' if state == 'closed'
when AlertManagement::Alert
variant = 'info' if state == 'resolved'
else
variant = 'info'
end
content_tag(:span, class: 'todo-target-state') do
gl_badge_tag(raw_state_to_i18n[state] || state.capitalize, { variant: variant })
end
end
def todos_filter_params
{
state: params[:state].presence,
@ -169,10 +74,6 @@ module TodosHelper
todos_filter_params.values.none?
end
def todos_has_filtered_results?
params[:group_id] || params[:project_id] || params[:author_id] || params[:type] || params[:action_id]
end
def no_todos_messages
[
s_('Todos|Good job! Looks like you don\'t have anything left on your To-Do List'),
@ -232,38 +133,6 @@ module TodosHelper
selected_type ? selected_type[:text] : default_type
end
def todo_due_date(todo)
return unless todo.target.try(:due_date)
is_due_today = todo.target.due_date.today?
is_overdue = todo.target.overdue?
css_class =
if is_due_today
'gl-text-warning'
elsif is_overdue
'gl-text-danger'
else
''
end
due_date =
if is_due_today
_("today")
else
l(todo.target.due_date, format: Date::DATE_FORMATS[:medium])
end
content = content_tag(:span, class: css_class) do
format(s_("Todos|Due %{due_date}"), due_date: due_date)
end
"#{content} &middot;".html_safe
end
def todo_author_display?(todo)
!todo.build_failed? && !todo.unmergeable? && !todo.for_ssh_key?
end
def todo_groups_requiring_saml_reauth(_todos)
[]
end

View File

@ -155,7 +155,7 @@ class Wiki
# This is needed in:
# - Storage::Hashed
# - Gitlab::GlRepository::RepoType#identifier_for_container
# - Gitlab::Repositories::RepoType#identifier_for_container
#
# We also need an `#id` to support `build_stubbed` in tests, where the
# value doesn't matter.

View File

@ -1,66 +0,0 @@
%li.todo.gl-border-t.gl-border-subtle.hover:gl-border-blue-200.hover:gl-bg-blue-50.hover:gl-cursor-pointer.gl-relative{ class: "hover:gl-z-1 todo-#{todo.done? ? 'done' : 'pending'}", id: dom_id(todo) }
.gl-flex.gl-flex-col.sm:gl-flex-row.sm:gl-items-center
.todo-item.gl-overflow-hidden.gl-overflow-x-auto.gl-self-center.gl-w-full{ data: { testid: "todo-item-container" } }
.todo-title.gl-pt-2.gl-pb-3.gl-px-2.gl-md-mb-1.gl-text-sm.gl-text-subtle
= todo_target_state_pill(todo)
%span.todo-target-title{ :id => dom_id(todo) + "_describer" }
= todo_target_title(todo)
- if !todo.for_design? && !todo.member_access_requested?
&middot;
%span
= todo_parent_path(todo)
%span.todo-label
- if todo.target
= link_to todo_target_name(todo), todo_target_path(todo), class: 'todo-target-link !gl-text-subtle !gl-no-underline', :'aria-describedby' => dom_id(todo) + "_describer", :'aria-label' => todo_target_aria_label(todo)
- else
= _("(removed)")
.todo-body.gl-mb-2.gl-px-2.gl-flex.gl-items-start
.todo-avatar.gl-hidden.sm:gl-inline-block
= author_avatar(todo, size: 24)
.todo-note
- if todo_author_display?(todo)
.author-name.gl-font-bold.gl-inline{ data: { testid: "todo-author-name-content" } }<
- if todo.author
= link_to_author(todo, self_added: todo.self_added?)
- else
= _('(removed)')
- if todo.note.present?
\:
%span.action-name{ data: { testid: "todo-action-name-content" } }<
- if !todo.note.present?
= todo_action_name(todo)
- unless todo.self_assigned?
\.
- if todo.self_assigned?
%span.action-name<
= todo_self_addressing(todo)
\.
- if todo.note.present?
%span.action-description<
= first_line_in_markdown(todo, :body, 125, project: todo.project, group: todo.group)
.todo-timestamp.gl-whitespace-nowrap.sm:gl-ml-3.gl-mt-2.gl-mb-2.gl-sm-my-0.gl-px-2.gl-sm-px-0
%span.todo-timestamp.gl-text-sm.gl-text-subtle
= todo_due_date(todo)
#{time_ago_with_tooltip(todo.created_at)}
.todo-actions.gl-mr-4.gl-px-2.gl-sm-px-0.sm:gl-mx-0
- if todo.pending?
= render Pajamas::ButtonComponent.new(button_options: { class: 'btn-icon gl-flex js-done-todo has-tooltip', title: _('Mark as done'), aria: { label: _('Mark as done') }}, method: :delete, href: dashboard_todo_path(todo)) do
= gl_loading_icon(inline: true, css_class: 'hidden')
= sprite_icon('check', css_class: 'js-todo-button-icon')
= render Pajamas::ButtonComponent.new(button_options: { class: 'btn-icon gl-flex js-undo-todo hidden has-tooltip', title: _('Undo'), aria: { label: _('Undo') }}, method: :patch, href: restore_dashboard_todo_path(todo)) do
= gl_loading_icon(inline: true, css_class: 'hidden')
= sprite_icon('redo', css_class: 'js-todo-button-icon')
- else
= render Pajamas::ButtonComponent.new(button_options: { class: 'btn-icon gl-flex js-add-todo has-tooltip', title: _('Re-add this to-do item'), aria: { label: _('Re-add this to-do item') }}, method: :patch, href: restore_dashboard_todo_path(todo)) do
= gl_loading_icon(inline: true, css_class: 'hidden')
= sprite_icon('redo', css_class: 'js-todo-button-icon')

View File

@ -1,117 +1,12 @@
- page_title _("To-Do List")
- add_page_specific_style 'page_bundles/todos'
= render_two_factor_auth_recovery_settings_check
= render_dashboard_ultimate_trial(current_user)
= render_if_exists 'shared/dashboard/saml_reauth_notice',
groups_requiring_saml_reauth: todo_groups_requiring_saml_reauth(@todos)
- add_page_specific_style 'page_bundles/todos'
- add_issuable_stylesheet
- filter_by_done = params[:state] == 'done'
- open_todo_count = todos_has_filtered_results? && !filter_by_done ? @allowed_todos.count : todos_pending_count
- done_todo_count = todos_has_filtered_results? && filter_by_done ? @allowed_todos.count : todos_done_count
- user_have_todos = current_user.todos.any?
- show_header = @allowed_todos.any? || user_have_todos
- if show_header
- if current_user.todos.any?
= render ::Layouts::PageHeadingComponent.new(_('To-Do List'))
.js-todos-all
- if user_have_todos
.top-area
= gl_tabs_nav({ class: 'gl-grow gl-border-0' }) do
= gl_tab_link_to todos_filter_path(state: 'pending'), item_active: params[:state].blank? || params[:state] == 'pending', class: "js-todos-pending" do
= _("To Do")
= gl_tab_counter_badge(number_with_delimiter(open_todo_count), { class: 'js-todos-badge' })
= gl_tab_link_to todos_filter_path(state: 'done'), item_active: filter_by_done, class: "js-todos-done" do
= _("Done")
= gl_tab_counter_badge(number_with_delimiter(done_todo_count), { class: 'js-todos-badge' })
.nav-controls
- if @allowed_todos.any?(&:pending?)
.gl-mr-3
= render Pajamas::ButtonComponent.new(button_options: { class: 'gl-items-center js-todos-mark-all'}, method: :delete, href: destroy_all_dashboard_todos_path(todos_filter_params)) do
= gl_loading_icon(inline: true, css_class: 'hidden')
= s_("Todos|Mark all as done")
= render Pajamas::ButtonComponent.new(button_options: { class: 'gl-items-center js-todos-undo-all hidden'}, method: :patch, href: bulk_restore_dashboard_todos_path(todos_filter_params)) do
= gl_loading_icon(inline: true, css_class: 'hidden')
= s_("Todos|Undo mark all as done")
.todos-filters
.issues-details-filters.row-content-block.second-block
= form_tag todos_filter_path(without: [:project_id, :author_id, :type, :action_id]), method: :get, class: 'filter-form gl-flex gl-flex-col sm:gl-flex-row' do
.filter-categories.gl-flex.gl-flex-col.md:gl-flex-row.gl-grow.gl-flex-wrap.-gl-mx-2
.filter-item.gl-m-2
- if params[:group_id].present?
= hidden_field_tag(:group_id, params[:group_id])
= dropdown_tag(group_dropdown_label(params[:group_id], _("Group")), options: { toggle_class: 'js-group-search js-filter-submit gl-w-full sm:gl-w-auto', title: s_("Todos|Filter by group"), filter: true, filterInput: 'input#group-search', dropdown_class: 'dropdown-menu-selectable dropdown-menu-group js-filter-submit', placeholder: _("Search groups"), data: { default_label: _("Group"), display: 'static', testid: 'group-dropdown' } })
.filter-item.gl-m-2
- if params[:project_id].present?
= hidden_field_tag(:project_id, params[:project_id])
= dropdown_tag(project_dropdown_label(params[:project_id], _("Project")), options: { toggle_class: 'js-project-search js-filter-submit gl-w-full sm:gl-w-auto', title: s_("Todos|Filter by project"), filter: true, filterInput: 'input#project-search', dropdown_class: 'dropdown-menu-selectable dropdown-menu-project js-filter-submit', placeholder: _("Search projects"), data: { default_label: _("Project"), display: 'static' } })
.filter-item.gl-m-2
- if params[:author_id].present?
= hidden_field_tag(:author_id, params[:author_id])
= dropdown_tag(user_dropdown_label(params[:author_id], _("Author")), options: { toggle_class: 'js-user-search js-filter-submit js-author-search gl-w-full sm:gl-w-auto', title: s_("Todos|Filter by author"), filter: true, filterInput: 'input#author-search', dropdown_class: 'dropdown-menu-user dropdown-menu-selectable dropdown-menu-author js-filter-submit', placeholder: _("Search authors"), data: { any_user: _("Any Author"), first_user: (current_user.username if current_user), project_id: (@project.id if @project), selected: params[:author_id], field_name: 'author_id', default_label: _("Author"), todo_filter: true, todo_state_filter: params[:state] || 'pending' } })
.filter-item.gl-m-2
- if params[:type].present?
= hidden_field_tag(:type, params[:type])
= dropdown_tag(todo_types_dropdown_label(params[:type], _("Type")), options: { toggle_class: 'js-type-search js-filter-submit gl-w-full sm:gl-w-auto', dropdown_class: 'dropdown-menu-selectable dropdown-menu-type js-filter-submit', data: { data: todo_types_options, default_label: _("Type") } })
.filter-item.actions-filter.gl-m-2
- if params[:action_id].present?
= hidden_field_tag(:action_id, params[:action_id])
= dropdown_tag(todo_actions_dropdown_label(params[:action_id], _("Action")), options: { toggle_class: 'js-action-search js-filter-submit gl-w-full sm:gl-w-auto', dropdown_class: 'dropdown-menu-selectable dropdown-menu-action js-filter-submit', data: { data: todo_actions_options, default_label: _("Action") } })
.filter-item.sort-filter.gl-my-2
.dropdown
%button.dropdown-menu-toggle.dropdown-menu-toggle-sort{ type: 'button', class: 'gl-w-full sm:gl-w-auto', 'data-toggle' => 'dropdown' }
%span.light
- if @sort.present?
= sort_options_hash[@sort]
- else
= sort_title_recently_created
= sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon')
%ul.dropdown-menu.dropdown-menu-sort.dropdown-menu-right
%li
= link_to todos_filter_path(sort: sort_value_label_priority) do
= sort_title_label_priority
= link_to todos_filter_path(sort: sort_value_recently_created) do
= sort_title_recently_created
= link_to todos_filter_path(sort: sort_value_oldest_created) do
= sort_title_oldest_created
= link_to todos_filter_path(sort: sort_value_recently_updated) do
= sort_title_recently_updated
- if @allowed_todos.any?
.js-todos-list-container{ data: { testid: "todos-list-container" } }
%ul.content-list.todos-list
= render @allowed_todos
= paginate @todos, theme: "gitlab"
.js-nothing-here-container.hidden
= render Pajamas::EmptyStateComponent.new(svg_path: 'illustrations/empty-todos-all-done-md.svg',
title: s_("Todos|You're all done!"))
- elsif user_have_todos
- empty_state_image = (!todos_filter_empty? && !todos_has_filtered_results?) ? 'illustrations/empty-todos-all-done-md.svg' : 'illustrations/empty-todos-md.svg'
- empty_state_title = s_("Todos|Nothing is on your to-do list. Nice work!")
- if todos_filter_empty?
- empty_state_title = no_todos_messages.sample
- elsif todos_has_filtered_results?
- empty_state_title = _("Sorry, your filter produced no results")
= render Pajamas::EmptyStateComponent.new(svg_path: empty_state_image,
title: empty_state_title) do |c|
- c.with_description do
- if todos_filter_empty?
%p
= (s_("Todos|Not sure where to go next? Take a look at your %{strongStart}%{assignedIssuesLinkStart}assigned issues%{assignedIssuesLinkEnd}%{strongEnd} or %{strongStart}%{mergeRequestLinkStart}merge requests%{mergeRequestLinkEnd}%{mergeRequestLinkEnd}%{strongEnd}.") % { strongStart: '<strong>', strongEnd: '</strong>', assignedIssuesLinkStart: "<a href=\"#{issues_dashboard_path(assignee_username: current_user.username)}\">", assignedIssuesLinkEnd: '</a>', mergeRequestLinkStart: "<a href=\"#{merge_requests_dashboard_path(assignee_username: current_user.username)}\">", mergeRequestLinkEnd: '</a>' }).html_safe
%p
= link_to s_("Todos| What actions create to-do items?"), help_page_path('user/todos.md', anchor: 'actions-that-create-to-do-items'), target: '_blank', rel: 'noopener noreferrer'
- elsif todos_has_filtered_results?
%p
= link_to s_("Todos|Do you want to remove the filters?"), todos_filter_path(without: [:project_id, :author_id, :type, :action_id])
- else
= render 'dashboard/todos/user_has_no_todos'
#js-todos-app-root{ data: { issues_dashboard_path: issues_dashboard_path(assignee_username: current_user.username),
merge_requests_dashboard_path: merge_requests_dashboard_path(assignee_username: current_user.username) } }
- else
= render 'dashboard/todos/user_has_no_todos'

View File

@ -1,15 +0,0 @@
- page_title _("To-Do List")
- add_page_specific_style 'page_bundles/todos_vue'
= render_two_factor_auth_recovery_settings_check
= render_dashboard_ultimate_trial(current_user)
= render_if_exists 'shared/dashboard/saml_reauth_notice',
groups_requiring_saml_reauth: todo_groups_requiring_saml_reauth(@todos)
- if current_user.todos.any?
= render ::Layouts::PageHeadingComponent.new(_('To-Do List'))
#js-todos-app-root{ data: { issues_dashboard_path: issues_dashboard_path(assignee_username: current_user.username),
merge_requests_dashboard_path: merge_requests_dashboard_path(assignee_username: current_user.username) } }
- else
= render 'dashboard/todos/user_has_no_todos'

View File

@ -11,4 +11,4 @@
('js-first-button' if page.first?),
('js-last-button' if page.last?),
('!gl-hidden md:!gl-block' if !page.current?)] }
= link_to page, url, { remote: remote, rel: page.next? ? 'next' : page.prev? ? 'prev' : nil, class: ['gl-pagination-item', active_when(page.current?)], 'data-testid': 'kaminari-pagination-item' }
= link_to page, url, { 'aria-current': page.current? ? 'page' : nil, remote: remote, rel: page.next? ? 'next' : page.prev? ? 'prev' : nil, class: ['gl-pagination-item', active_when(page.current?)], 'data-testid': 'kaminari-pagination-item' }

View File

@ -367,7 +367,6 @@ module Gitlab
config.assets.precompile << "page_bundles/terminal.css"
config.assets.precompile << "page_bundles/terms.css"
config.assets.precompile << "page_bundles/todos.css"
config.assets.precompile << "page_bundles/todos_vue.css"
config.assets.precompile << "page_bundles/tree.css"
config.assets.precompile << "page_bundles/users.css"
config.assets.precompile << "page_bundles/web_ide_loader.css"

View File

@ -1,9 +0,0 @@
---
name: todos_vue_application
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/464069
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/162587
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/503821
milestone: '17.4'
group: group::personal productivity
type: beta
default_enabled: true

View File

@ -12,9 +12,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_title_changed
unique: user.id
distribution:
- ee
- ce
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- p_analytics_pipelines
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- p_analytics_valuestream
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- p_analytics_repo
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_analytics_cohorts
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: i_analytics_dev_ops_score
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_analytics_merge_request
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_analytics_instance_statistics
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -49,9 +49,6 @@ events:
unique: user.id
- name: p_analytics_ci_cd_lead_time
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_analytics_instance_statistics
distribution:
- ee
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- merge_request_action
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_source_code_code_intelligence
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_code_review_mr_diffs
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_code_review_user_single_file_diffs
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_code_review_mr_single_file_diffs
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -12,9 +12,6 @@ data_source: internal_events
events:
- name: i_code_review_user_create_mr
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_code_review_user_close_mr
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_code_review_user_reopen_mr
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_code_review_user_merge_mr
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_code_review_user_create_mr_comment
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_code_review_user_edit_mr_comment
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_code_review_user_remove_mr_comment
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_code_review_user_add_suggestion
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_code_review_user_apply_suggestion
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -12,9 +12,6 @@ data_source: internal_events
events:
- name: g_edit_by_web_ide
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_edit_by_sfe
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_edit_by_snippet_ide
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -17,9 +17,6 @@ events:
unique: user.id
- name: g_edit_by_snippet_ide
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_search_total
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_search_total
distribution:
- ee
- ce
tiers:
- free
- premium

View File

@ -17,9 +17,6 @@ events:
unique: user.id
- name: i_search_paid
unique: user.id
distribution:
- ee
- ce
tiers:
- free
- premium

View File

@ -17,9 +17,6 @@ events:
unique: user.id
- name: incident_management_alert_create_incident
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -31,9 +31,6 @@ events:
unique: user.id
- name: incident_management_incident_change_confidential
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_alert_status_changed
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_alert_assigned
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_alert_todo
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_incident_created
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_incident_reopened
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_incident_closed
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_incident_assigned
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_incident_todo
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_incident_comment
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_incident_zoom_meeting
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -12,9 +12,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_incident_relate
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -12,9 +12,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_incident_unrelate
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_incident_change_confidential
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -43,9 +43,6 @@ events:
unique: user.id
- name: incident_management_timeline_event_deleted
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -12,9 +12,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- incident_management_alert_create_incident
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_description_changed
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_assignee_changed
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_made_confidential
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_made_visible
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_created
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_closed
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_reopened
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_label_changed
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_milestone_changed
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_cross_referenced
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_moved
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_related
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_unrelated
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_marked_as_duplicate
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_locked
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_unlocked
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_designs_added
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_designs_modified
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_designs_removed
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_due_date_changed
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_time_estimate_changed
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_time_spent_changed
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_comment_added
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_comment_edited
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_comment_removed
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -10,9 +10,6 @@ data_source: internal_events
events:
- name: g_project_management_issue_cloned
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -75,9 +75,6 @@ events:
unique: user.id
- name: g_project_management_issue_cloned
unique: user.id
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_quickactions_approve
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -12,9 +12,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_quickactions_assign_single
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_quickactions_assign_multiple
distribution:
- ce
- ee
tiers:
- premium
- ultimate

View File

@ -12,9 +12,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_quickactions_assign_self
distribution:
- ce
- ee
tiers:
- free
- premium

View File

@ -14,9 +14,6 @@ instrumentation_class: RedisHLLMetric
options:
events:
- i_quickactions_assign_reviewer
distribution:
- ce
- ee
tiers:
- free
- premium

Some files were not shown because too many files have changed in this diff Show More