Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
bdcf532079
commit
c232c17b46
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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 };
|
||||
});
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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} ·".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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
·
|
||||
|
||||
%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')
|
||||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
@ -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' }
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- p_analytics_pipelines
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- p_analytics_valuestream
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- p_analytics_repo
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_analytics_cohorts
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: i_analytics_dev_ops_score
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- g_analytics_merge_request
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_analytics_instance_statistics
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -49,9 +49,6 @@ events:
|
|||
unique: user.id
|
||||
- name: p_analytics_ci_cd_lead_time
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_analytics_instance_statistics
|
||||
distribution:
|
||||
- ee
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- merge_request_action
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_source_code_code_intelligence
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_code_review_mr_diffs
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_code_review_user_single_file_diffs
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_code_review_mr_single_file_diffs
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_code_review_user_close_mr
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_code_review_user_reopen_mr
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_code_review_user_merge_mr
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_code_review_user_create_mr_comment
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_code_review_user_edit_mr_comment
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_code_review_user_remove_mr_comment
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_code_review_user_add_suggestion
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_code_review_user_apply_suggestion
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -12,9 +12,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: g_edit_by_web_ide
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: g_edit_by_sfe
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: g_edit_by_snippet_ide
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -17,9 +17,6 @@ events:
|
|||
unique: user.id
|
||||
- name: g_edit_by_snippet_ide
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_search_total
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_search_total
|
||||
distribution:
|
||||
- ee
|
||||
- ce
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -17,9 +17,6 @@ events:
|
|||
unique: user.id
|
||||
- name: i_search_paid
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ee
|
||||
- ce
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -17,9 +17,6 @@ events:
|
|||
unique: user.id
|
||||
- name: incident_management_alert_create_incident
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -31,9 +31,6 @@ events:
|
|||
unique: user.id
|
||||
- name: incident_management_incident_change_confidential
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_alert_status_changed
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_alert_assigned
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_alert_todo
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_incident_created
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_incident_reopened
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_incident_closed
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_incident_assigned
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_incident_todo
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_incident_comment
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_incident_zoom_meeting
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -12,9 +12,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_incident_relate
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -12,9 +12,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_incident_unrelate
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_incident_change_confidential
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -43,9 +43,6 @@ events:
|
|||
unique: user.id
|
||||
- name: incident_management_timeline_event_deleted
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -12,9 +12,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- incident_management_alert_create_incident
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: g_project_management_issue_created
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: g_project_management_issue_closed
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: g_project_management_issue_reopened
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: g_project_management_issue_moved
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: g_project_management_issue_related
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: g_project_management_issue_unrelated
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: g_project_management_issue_locked
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: g_project_management_issue_unlocked
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@ data_source: internal_events
|
|||
events:
|
||||
- name: g_project_management_issue_cloned
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -75,9 +75,6 @@ events:
|
|||
unique: user.id
|
||||
- name: g_project_management_issue_cloned
|
||||
unique: user.id
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -13,9 +13,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_quickactions_approve
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -12,9 +12,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_quickactions_assign_single
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_quickactions_assign_multiple
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- premium
|
||||
- ultimate
|
||||
|
|
|
|||
|
|
@ -12,9 +12,6 @@ instrumentation_class: RedisHLLMetric
|
|||
options:
|
||||
events:
|
||||
- i_quickactions_assign_self
|
||||
distribution:
|
||||
- ce
|
||||
- ee
|
||||
tiers:
|
||||
- free
|
||||
- premium
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in New Issue