diff --git a/ee/app/assets/javascripts/admin/data_management/components/app.vue b/ee/app/assets/javascripts/admin/data_management/components/app.vue
index 53c83fd508a18fb5b45817d5a3eedf22bc219a49..8afe196ea6685604ae1ee7794a2e366b58435512 100644
--- a/ee/app/assets/javascripts/admin/data_management/components/app.vue
+++ b/ee/app/assets/javascripts/admin/data_management/components/app.vue
@@ -12,12 +12,14 @@ import { setUrlParams, visitUrl } from '~/lib/utils/url_utility';
import { createAlert } from '~/alert';
import { getModels } from 'ee/api/data_management_api';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import DataManagementItem from 'ee/admin/data_management/components/data_management_item.vue';
export default {
name: 'AdminDataManagementApp',
components: {
GeoListTopBar,
GeoList,
+ DataManagementItem,
},
props: {
modelClass: {
@@ -96,11 +98,7 @@ export default {
@listboxChange="handleListboxChange"
/>
-
- -
- {{ modelItem.recordIdentifier }}
-
-
+
diff --git a/ee/app/assets/javascripts/admin/data_management/components/data_management_item.vue b/ee/app/assets/javascripts/admin/data_management/components/data_management_item.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cd032a0142f9f91130d6caa91ee1186ed0a64ab8
--- /dev/null
+++ b/ee/app/assets/javascripts/admin/data_management/components/data_management_item.vue
@@ -0,0 +1,56 @@
+
+
+
+
+ {{ size }}
+
+
diff --git a/ee/spec/frontend/admin/data_management/components/app_spec.js b/ee/spec/frontend/admin/data_management/components/app_spec.js
index 05a12d8d7d1a6c9840427b682a87089194d3a8d4..d07db04f1fe981b80f0a5373bce488f6d29eb8bb 100644
--- a/ee/spec/frontend/admin/data_management/components/app_spec.js
+++ b/ee/spec/frontend/admin/data_management/components/app_spec.js
@@ -10,6 +10,8 @@ import { TEST_HOST } from 'spec/test_constants';
import { getModels } from 'ee/api/data_management_api';
import waitForPromises from 'helpers/wait_for_promises';
import { createAlert } from '~/alert';
+import DataManagementItem from 'ee/admin/data_management/components/data_management_item.vue';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
jest.mock('~/lib/utils/url_utility', () => ({
...jest.requireActual('~/lib/utils/url_utility'),
@@ -31,6 +33,7 @@ describe('AdminDataManagementApp', () => {
const findGeoListTopBar = () => wrapper.findComponent(GeoListTopBar);
const findGeoList = () => wrapper.findComponent(GeoList);
+ const findDataManagementItem = () => wrapper.findComponent(DataManagementItem);
beforeEach(() => {
createComponent();
@@ -86,12 +89,10 @@ describe('AdminDataManagementApp', () => {
});
it('renders items on GeoList', () => {
- expect(findGeoList().props('hasItems')).toBe(true);
- expect(findGeoList().findAll('li')).toHaveLength(models.length);
+ const [item] = convertObjectPropsToCamelCase(models, { deep: true });
- models.forEach((model) => {
- expect(findGeoList().text()).toContain(`${model.record_identifier}`);
- });
+ expect(findGeoList().props('hasItems')).toBe(true);
+ expect(findDataManagementItem().props()).toMatchObject({ item });
});
it('stops loading state', () => {
diff --git a/ee/spec/frontend/admin/data_management/components/data_management_item_spec.js b/ee/spec/frontend/admin/data_management/components/data_management_item_spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..5c0fe42f310ec019b8781d08f2ade7bd0413cc98
--- /dev/null
+++ b/ee/spec/frontend/admin/data_management/components/data_management_item_spec.js
@@ -0,0 +1,66 @@
+import { shallowMount } from '@vue/test-utils';
+import models from 'test_fixtures/api/admin/data_management/snippet_repository.json';
+import DataManagementItem from 'ee/admin/data_management/components/data_management_item.vue';
+import GeoListItem from 'ee/geo_shared/list/components/geo_list_item.vue';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+
+describe('DataManagementItem', () => {
+ let wrapper;
+
+ const [model] = convertObjectPropsToCamelCase(models, { deep: true });
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(DataManagementItem, {
+ propsData: {
+ item: model,
+ ...props,
+ },
+ });
+ };
+
+ const findGeoListItem = () => wrapper.findComponent(GeoListItem);
+
+ it('renders GeoListItem with correct props', () => {
+ createComponent();
+
+ expect(findGeoListItem().props()).toMatchObject({
+ name: `${model.modelClass}/${model.recordIdentifier}`,
+ timeAgoArray: [
+ {
+ label: 'Created',
+ dateString: model.createdAt,
+ defaultText: 'Unknown',
+ },
+ {
+ label: 'Last checksum',
+ dateString: model.checksumInformation.lastChecksum,
+ defaultText: 'Unknown',
+ },
+ ],
+ });
+ });
+
+ describe('when fileSize is provided', () => {
+ it('renders size', () => {
+ createComponent({ item: { ...model, fileSize: 1024 } });
+
+ expect(findGeoListItem().text()).toContain('Storage: 1.00 KiB');
+ });
+ });
+
+ describe('when fileSize is 0', () => {
+ it('renders size"', () => {
+ createComponent({ item: { ...model, fileSize: 0 } });
+
+ expect(findGeoListItem().text()).toContain('Storage: 0 B');
+ });
+ });
+
+ describe('when fileSize is not provided', () => {
+ it('renders size as "Unknown"', () => {
+ createComponent({ item: { ...model, fileSize: null } });
+
+ expect(findGeoListItem().text()).toContain('Storage: Unknown');
+ });
+ });
+});
diff --git a/ee/spec/frontend/fixtures/admin/data_management.rb b/ee/spec/frontend/fixtures/admin/data_management.rb
index 17fd16f49f22c880fe8303b2117dc444daeef3f3..955a9e21ae7961fa57c8e9c6fc78774327937d9e 100644
--- a/ee/spec/frontend/fixtures/admin/data_management.rb
+++ b/ee/spec/frontend/fixtures/admin/data_management.rb
@@ -6,9 +6,15 @@
type: :request, feature_category: :geo_replication do
include ApiHelpers
include JavaScriptFixturesHelpers
+ include EE::GeoHelpers
let_it_be(:admin) { create(:admin) }
- let_it_be(:snippet_repository) { create(:snippet_repository) }
+ let_it_be(:node) { create(:geo_node) }
+ let_it_be(:snippet_repository) { create(:snippet_repository, :verification_succeeded) }
+
+ before do
+ stub_current_geo_node(node)
+ end
it 'api/admin/data_management/snippet_repository.json' do
get api("/admin/data_management/snippet_repository", admin, admin_mode: true)
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 4c078394ae47dd858be91ea8324f6b804d2fd46b..d42dcd6dbf7d250216ce3218ba742c7b6d06745f 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -29550,6 +29550,9 @@ msgstr ""
msgid "Geo|LFS Objects"
msgstr ""
+msgid "Geo|Last checksum"
+msgstr ""
+
msgid "Geo|Last event ID"
msgstr ""
@@ -29883,6 +29886,9 @@ msgstr ""
msgid "Geo|Storage config"
msgstr ""
+msgid "Geo|Storage: %{size}"
+msgstr ""
+
msgid "Geo|Succeeded"
msgstr ""