diff --git a/app/assets/javascripts/admin/abuse_report/components/notes/abuse_report_note.vue b/app/assets/javascripts/admin/abuse_report/components/notes/abuse_report_note.vue
index 4423eb9e7b259a9036aae0d273c1136e89d1ca6a..61d1baf75b16b2aefd793841eb8cbfda39a0e5b5 100644
--- a/app/assets/javascripts/admin/abuse_report/components/notes/abuse_report_note.vue
+++ b/app/assets/javascripts/admin/abuse_report/components/notes/abuse_report_note.vue
@@ -103,6 +103,7 @@ export default {
:created-at="note.createdAt"
:note-id="note.id"
:note-url="note.url"
+ :imported="note.imported"
>
·
diff --git a/app/assets/javascripts/design_management/components/design_destroyer.vue b/app/assets/javascripts/design_management/components/design_destroyer.vue
index 0178111f651b2bad16a98867bf7bec1d923bfb76..e1824b725465c177800dd3c2c1904807e96fc7fc 100644
--- a/app/assets/javascripts/design_management/components/design_destroyer.vue
+++ b/app/assets/javascripts/design_management/components/design_destroyer.vue
@@ -22,6 +22,11 @@ export default {
type: Array,
required: true,
},
+ imported: {
+ type: Boolean,
+ required: false,
+ default: false,
+ }
},
computed: {
projectQueryBody() {
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_note.vue b/app/assets/javascripts/design_management/components/design_notes/design_note.vue
index 38081c99e72af05ab0206a0015f7c0b91443d6e1..2faa968b8bfa0aa09c37c289b6ea4af56406dfaa 100644
--- a/app/assets/javascripts/design_management/components/design_notes/design_note.vue
+++ b/app/assets/javascripts/design_management/components/design_notes/design_note.vue
@@ -299,6 +299,7 @@ export default {
>
+ imported
diff --git a/app/assets/javascripts/design_management/components/toolbar/index.vue b/app/assets/javascripts/design_management/components/toolbar/index.vue
index 45c04b80a2da39dd2cacfefb5fc405b715ea1dac..0972aa827d20eaafe4937bc4e20e0e273805aaf7 100644
--- a/app/assets/javascripts/design_management/components/toolbar/index.vue
+++ b/app/assets/javascripts/design_management/components/toolbar/index.vue
@@ -71,6 +71,11 @@ export default {
required: false,
default: '',
},
+ imported: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
isLoading: {
type: Boolean,
required: true,
@@ -142,6 +147,7 @@ export default {
{{ filename }}
+ imported
{{ updatedText }}
diff --git a/app/assets/javascripts/design_management/graphql/fragments/design.fragment.graphql b/app/assets/javascripts/design_management/graphql/fragments/design.fragment.graphql
index 4b1703e41c34cf0b64912a6cdde324e2f4df861d..47ea165470f3d2568141265179a8a27c918e75ac 100644
--- a/app/assets/javascripts/design_management/graphql/fragments/design.fragment.graphql
+++ b/app/assets/javascripts/design_management/graphql/fragments/design.fragment.graphql
@@ -6,6 +6,7 @@
fragment DesignItem on Design {
...DesignListItem
fullPath
+ imported
diffRefs {
...DesignDiffRefs
}
diff --git a/app/assets/javascripts/design_management/graphql/fragments/design_note.fragment.graphql b/app/assets/javascripts/design_management/graphql/fragments/design_note.fragment.graphql
index 9af4733d5dc06db36c8d48bf6fe53d3e00979748..de1ce702f21c31259926a3a843fe4769effa55be 100644
--- a/app/assets/javascripts/design_management/graphql/fragments/design_note.fragment.graphql
+++ b/app/assets/javascripts/design_management/graphql/fragments/design_note.fragment.graphql
@@ -11,6 +11,7 @@ fragment DesignNote on Note {
bodyHtml
createdAt
resolved
+ imported
awardEmoji {
nodes {
name
diff --git a/app/assets/javascripts/design_management/pages/design/index.vue b/app/assets/javascripts/design_management/pages/design/index.vue
index 0caed73a44ab9b7603349ffc76380a7c207946b9..81f01e9a16d622c61caaa70513aaedd2511a4b69 100644
--- a/app/assets/javascripts/design_management/pages/design/index.vue
+++ b/app/assets/javascripts/design_management/pages/design/index.vue
@@ -344,6 +344,7 @@ export default {
design.filename,
] /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
:project-path="projectPath"
+ :impoted="design.imported"
:iid="issueIid"
@done="$router.push({ name: $options.DESIGNS_ROUTE_NAME })"
@error="onDesignDeleteError"
diff --git a/app/assets/javascripts/issues/show/components/app.vue b/app/assets/javascripts/issues/show/components/app.vue
index 27646df506b94bfc1d22c2726e72403e1e35877c..a0e8be3cd145d423c77ecbf940a0c35b9902ab91 100644
--- a/app/assets/javascripts/issues/show/components/app.vue
+++ b/app/assets/javascripts/issues/show/components/app.vue
@@ -221,6 +221,11 @@ export default {
required: false,
default: '',
},
+ imported: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -556,6 +561,7 @@ export default {
:issuable-type="issuableType"
:show="isStickyHeaderShowing"
:title="state.titleText"
+ :imported="imported"
@hide="hideStickyHeader"
@show="showStickyHeader"
/>
@@ -576,6 +582,7 @@ export default {
:moved-to-issue-url="movedToIssueUrl"
:promoted-to-epic-url="promotedToEpicUrl"
:service-desk-reply-to="serviceDeskReplyTo"
+ :imported="imported"
/>
diff --git a/app/assets/javascripts/issues/show/components/issue_header.vue b/app/assets/javascripts/issues/show/components/issue_header.vue
index 96eb8fbb3c7240329106af5b48ff869b3c512b83..522d214b40828798b65e2d8eeae439cacdb15302 100644
--- a/app/assets/javascripts/issues/show/components/issue_header.vue
+++ b/app/assets/javascripts/issues/show/components/issue_header.vue
@@ -61,6 +61,11 @@ export default {
required: false,
default: '',
},
+ imported: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
closedStatusLink() {
@@ -111,6 +116,7 @@ export default {
show-work-item-type-icon
:status-icon="statusIcon"
:workspace-type="$options.WORKSPACE_PROJECT"
+ :imported="imported"
>
diff --git a/app/assets/javascripts/issues/show/components/sticky_header.vue b/app/assets/javascripts/issues/show/components/sticky_header.vue
index 18e37c4216ce355a08b552a945f82989840c6c13..356d9c3bba152997b944f57bc045173d4f4b52f8 100644
--- a/app/assets/javascripts/issues/show/components/sticky_header.vue
+++ b/app/assets/javascripts/issues/show/components/sticky_header.vue
@@ -49,6 +49,11 @@ export default {
type: String,
required: true,
},
+ imported: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
isClosed() {
@@ -87,6 +92,7 @@ export default {
:issuable-type="issuableType"
:workspace-type="$options.WORKSPACE_PROJECT"
/>
+ imported
+ imported
+ imported
@@ -518,6 +519,7 @@ export default {
:is-draft="note.isDraft"
:resolve-discussion="note.isDraft && note.resolve_discussion"
:discussion-id="discussionId"
+ :imported="note.imported"
:award-path="note.toggle_award_path"
@handleEdit="editHandler"
@handleDelete="deleteHandler"
diff --git a/app/assets/javascripts/pages/projects/merge_requests/page.js b/app/assets/javascripts/pages/projects/merge_requests/page.js
index 6114b6fe9d4d6481eeca03f471364d63e629ccf1..e9c99a9d5f53636c4f1582c323ca181b8ba2318d 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/page.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/page.js
@@ -51,6 +51,7 @@ requestIdleCallback(() => {
isFluidLayout,
sourceProjectPath,
blocksMerge,
+ imported,
} = JSON.parse(data);
tabData.tabs = tabs;
@@ -72,6 +73,7 @@ requestIdleCallback(() => {
render(h) {
return h(StickyHeader, {
props: {
+ imported: imported,
tabs: tabData.tabs,
},
});
diff --git a/app/assets/javascripts/snippets/components/snippet_header.vue b/app/assets/javascripts/snippets/components/snippet_header.vue
index f639b64aeba845a962da7b55b9befafc577bb42d..048574f9ba7507bbb1c4934bd976fb36bb90b8b6 100644
--- a/app/assets/javascripts/snippets/components/snippet_header.vue
+++ b/app/assets/javascripts/snippets/components/snippet_header.vue
@@ -355,6 +355,7 @@ export default {
{{ snippetVisibilityLevelDescription }}
+ imported
diff --git a/app/assets/javascripts/vue_shared/components/notes/system_note.vue b/app/assets/javascripts/vue_shared/components/notes/system_note.vue
index dbf3a7011a4d74f55c94f8c2d82054f9797f9203..026d026fc450369b23bf6fae919b3c9f629e5537 100644
--- a/app/assets/javascripts/vue_shared/components/notes/system_note.vue
+++ b/app/assets/javascripts/vue_shared/components/notes/system_note.vue
@@ -167,6 +167,7 @@ export default {
:created-at="note.created_at"
:note-id="note.id"
:is-system-note="true"
+ :imported="note.imported"
>
{{ badgeText }}
+
+ imported
NULL::bigint) AND (merge_request_id IS NULL) AND (epic_id IS NULL)) OR ((issue_id IS NULL) AND (merge_request_id <> NULL::bigint) AND (epic_id IS NULL)) OR ((issue_id IS NULL) AND (merge_request_id IS NULL) AND (epic_id <> NULL::integer))))
);
@@ -16107,7 +16116,8 @@ CREATE TABLE snippets (
encrypted_secret_token character varying(255),
encrypted_secret_token_iv character varying(255),
secret boolean DEFAULT false NOT NULL,
- repository_read_only boolean DEFAULT false NOT NULL
+ repository_read_only boolean DEFAULT false NOT NULL,
+ imported boolean DEFAULT false NOT NULL
);
CREATE SEQUENCE snippets_id_seq
diff --git a/ee/app/assets/javascripts/epic/components/epic_app.vue b/ee/app/assets/javascripts/epic/components/epic_app.vue
index da0bdcc14427a684a1500de71d9430255b8ac939..1da67cba56d84a1f358fccaa47f2ae170ea651c5 100644
--- a/ee/app/assets/javascripts/epic/components/epic_app.vue
+++ b/ee/app/assets/javascripts/epic/components/epic_app.vue
@@ -35,6 +35,7 @@ export default {
'lockVersion',
'state',
'confidential',
+ 'imported',
]),
formattedAuthor() {
const { url, username } = this.author;
@@ -76,6 +77,7 @@ export default {
:initial-description-text="initialDescriptionText"
:issuable-status="state"
:is-confidential="confidential"
+ :imported="imported"
enable-autocomplete
project-namespace
issuable-ref
@@ -85,7 +87,7 @@ export default {
-
+
diff --git a/ee/app/assets/javascripts/epic/components/epic_header.vue b/ee/app/assets/javascripts/epic/components/epic_header.vue
index 2a3b2dfde952fb0d38fd67b5b6687b1c75010e5f..f58b991d4829c6f8c69b3f94e44cdc9b85452dee 100644
--- a/ee/app/assets/javascripts/epic/components/epic_header.vue
+++ b/ee/app/assets/javascripts/epic/components/epic_header.vue
@@ -17,6 +17,11 @@ export default {
type: Object,
required: true,
},
+ imported: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
...mapState(['sidebarCollapsed', 'author', 'created', 'confidential', 'state']),
@@ -58,6 +63,7 @@ export default {
:issuable-type="$options.TYPE_EPIC"
:status-icon="statusIcon"
:workspace-type="$options.WORKSPACE_GROUP"
+ :imported="imported"
show-work-item-type-icon
@toggle="toggleSidebar({ sidebarCollapsed })"
/>
diff --git a/ee/app/assets/javascripts/epic/epic_bundle.js b/ee/app/assets/javascripts/epic/epic_bundle.js
index d2d481c15f386e61b150dafd44f5e2df1cd23b2e..863e5a4ef1e7cc135f3530496f289f9b96e36095 100644
--- a/ee/app/assets/javascripts/epic/epic_bundle.js
+++ b/ee/app/assets/javascripts/epic/epic_bundle.js
@@ -77,6 +77,7 @@ export default () => {
roadmapElementSelector,
containerElementSelector,
reportAbusePath,
+ imported: epicData.imported,
},
created() {
this.setEpicMeta({
diff --git a/lib/api/entities/note.rb b/lib/api/entities/note.rb
index c693edc611bbaf0150330d90fb259f3247c8e943..a678de517f0d5f1b416d26f6aa105c764540673d 100644
--- a/lib/api/entities/note.rb
+++ b/lib/api/entities/note.rb
@@ -29,6 +29,8 @@ class Note < Grape::Entity
expose :confidential?, as: :confidential
expose :confidential?, as: :internal
+ expose :imported
+
# Avoid N+1 queries as much as possible
expose(:noteable_iid) { |note| note.noteable.iid if NOTEABLE_TYPES_WITH_IID.include?(note.noteable_type) }
diff --git a/lib/gitlab/import_export/base/relation_factory.rb b/lib/gitlab/import_export/base/relation_factory.rb
index c3021f034cd5784adbfb5c236dd2ccdf793c5d48..efb9b9163011791e35731050436a8bcd454c0a60 100644
--- a/lib/gitlab/import_export/base/relation_factory.rb
+++ b/lib/gitlab/import_export/base/relation_factory.rb
@@ -180,6 +180,8 @@ def importable_class_name
def imported_object
if existing_or_new_object.respond_to?(:importing)
existing_or_new_object.importing = true
+
+ existing_or_new_object.imported = true if existing_or_new_object.respond_to?(:imported)
end
existing_or_new_object