@devtron-labs/devtron-fe-common-lib 0.0.33-beta-3 → 0.0.33-beta-5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Common/Common.service.d.ts +2 -2
- package/dist/Common/Constants.d.ts +1 -0
- package/dist/Common/Types.d.ts +25 -2
- package/dist/index.js +175 -71
- package/package.json +1 -1
- package/src/Common/Common.service.ts +215 -76
- package/src/Common/Constants.ts +1 -0
- package/src/Common/ImageTags.tsx +9 -1
- package/src/Common/Types.ts +32 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TeamList, ResponseType, DeploymentNodeType } from './Types';
|
|
1
|
+
import { TeamList, ResponseType, DeploymentNodeType, CDMaterialServiceEnum, CDMaterialServiceQueryParams, CDMaterialResponseType } from './Types';
|
|
2
2
|
export declare const getTeamListMin: () => Promise<TeamList>;
|
|
3
3
|
interface UserRole extends ResponseType {
|
|
4
4
|
result?: {
|
|
@@ -13,7 +13,7 @@ export declare const SourceTypeMap: {
|
|
|
13
13
|
};
|
|
14
14
|
export declare function getUserRole(appName?: string): Promise<UserRole>;
|
|
15
15
|
export declare function setImageTags(request: any, pipelineId: number, artifactId: number): Promise<ResponseType>;
|
|
16
|
-
export declare const
|
|
16
|
+
export declare const genericCDMaterialsService: (serviceType: CDMaterialServiceEnum, cdMaterialID: number, stage: DeploymentNodeType, signal: AbortSignal, queryParams?: CDMaterialServiceQueryParams) => Promise<CDMaterialResponseType>;
|
|
17
17
|
export declare function extractImage(image: string): string;
|
|
18
18
|
export declare function createGitCommitUrl(url: string, revision: string): string;
|
|
19
19
|
export {};
|
package/dist/Common/Types.d.ts
CHANGED
|
@@ -223,6 +223,25 @@ export interface CDMaterialType {
|
|
|
223
223
|
imageReleaseTags?: ReleaseTag[];
|
|
224
224
|
artifactStatus?: string;
|
|
225
225
|
filterState: FilterStates;
|
|
226
|
+
scanToolId?: number;
|
|
227
|
+
}
|
|
228
|
+
export declare enum CDMaterialServiceEnum {
|
|
229
|
+
ROLLBACK = "rollback",
|
|
230
|
+
CD_MATERIALS = "cd-materials"
|
|
231
|
+
}
|
|
232
|
+
export declare enum CDMaterialResourceQuery {
|
|
233
|
+
PENDING_APPROVAL = "PENDING_APPROVAL"
|
|
234
|
+
}
|
|
235
|
+
export declare enum CDMaterialFilterQuery {
|
|
236
|
+
RESOURCE = "ELIGIBLE_RESOURCES",
|
|
237
|
+
ALL = "ALL_RESOURCES"
|
|
238
|
+
}
|
|
239
|
+
export interface CDMaterialServiceQueryParams {
|
|
240
|
+
search?: string;
|
|
241
|
+
offset?: number;
|
|
242
|
+
size?: number;
|
|
243
|
+
resource?: CDMaterialResourceQuery;
|
|
244
|
+
filter?: CDMaterialFilterQuery;
|
|
226
245
|
}
|
|
227
246
|
export interface CommonNodeAttr {
|
|
228
247
|
connectingCiPipelineId?: number;
|
|
@@ -329,16 +348,20 @@ export interface FilterConditionsListType {
|
|
|
329
348
|
description: string;
|
|
330
349
|
conditions: FilterConditionsInfo[];
|
|
331
350
|
}
|
|
332
|
-
export interface
|
|
351
|
+
export interface CDMaterialsApprovalInfo {
|
|
333
352
|
approvalUsers: string[];
|
|
334
|
-
materials: any[];
|
|
335
353
|
userApprovalConfig: UserApprovalConfigType;
|
|
336
354
|
requestedUserId: number;
|
|
355
|
+
}
|
|
356
|
+
export interface CDMaterialsMetaInfo {
|
|
337
357
|
tagsEditable: boolean;
|
|
338
358
|
appReleaseTagNames: string[];
|
|
339
359
|
hideImageTaggingHardDelete: boolean;
|
|
340
360
|
resourceFilters?: FilterConditionsListType[];
|
|
341
361
|
}
|
|
362
|
+
export interface CDMaterialResponseType extends CDMaterialsMetaInfo, CDMaterialsApprovalInfo {
|
|
363
|
+
materials: CDMaterialType[];
|
|
364
|
+
}
|
|
342
365
|
export interface InputDetailType {
|
|
343
366
|
label: string;
|
|
344
367
|
defaultValue: string;
|
package/dist/index.js
CHANGED
|
@@ -44,6 +44,7 @@ var ROUTES = {
|
|
|
44
44
|
PROJECT_LIST_MIN: 'team/autocomplete',
|
|
45
45
|
USER_CHECK_ROLE: 'user/check/roles',
|
|
46
46
|
IMAGE_TAGGING: 'app/image-tagging',
|
|
47
|
+
CD_MATERIAL_GET: 'app/cd-pipeline'
|
|
47
48
|
};
|
|
48
49
|
exports.KEY_VALUE = void 0;
|
|
49
50
|
(function (KEY_VALUE) {
|
|
@@ -430,6 +431,20 @@ exports.FilterStates = void 0;
|
|
|
430
431
|
FilterStates[FilterStates["BLOCKED"] = 1] = "BLOCKED";
|
|
431
432
|
FilterStates[FilterStates["ERROR"] = 2] = "ERROR";
|
|
432
433
|
})(exports.FilterStates || (exports.FilterStates = {}));
|
|
434
|
+
exports.CDMaterialServiceEnum = void 0;
|
|
435
|
+
(function (CDMaterialServiceEnum) {
|
|
436
|
+
CDMaterialServiceEnum["ROLLBACK"] = "rollback";
|
|
437
|
+
CDMaterialServiceEnum["CD_MATERIALS"] = "cd-materials";
|
|
438
|
+
})(exports.CDMaterialServiceEnum || (exports.CDMaterialServiceEnum = {}));
|
|
439
|
+
exports.CDMaterialResourceQuery = void 0;
|
|
440
|
+
(function (CDMaterialResourceQuery) {
|
|
441
|
+
CDMaterialResourceQuery["PENDING_APPROVAL"] = "PENDING_APPROVAL";
|
|
442
|
+
})(exports.CDMaterialResourceQuery || (exports.CDMaterialResourceQuery = {}));
|
|
443
|
+
exports.CDMaterialFilterQuery = void 0;
|
|
444
|
+
(function (CDMaterialFilterQuery) {
|
|
445
|
+
CDMaterialFilterQuery["RESOURCE"] = "ELIGIBLE_RESOURCES";
|
|
446
|
+
CDMaterialFilterQuery["ALL"] = "ALL_RESOURCES";
|
|
447
|
+
})(exports.CDMaterialFilterQuery || (exports.CDMaterialFilterQuery = {}));
|
|
433
448
|
exports.DeploymentAppTypes = void 0;
|
|
434
449
|
(function (DeploymentAppTypes) {
|
|
435
450
|
DeploymentAppTypes["HELM"] = "helm";
|
|
@@ -22688,77 +22703,161 @@ function getUserRole(appName) {
|
|
|
22688
22703
|
function setImageTags(request, pipelineId, artifactId) {
|
|
22689
22704
|
return post("".concat(ROUTES.IMAGE_TAGGING, "/").concat(pipelineId, "/").concat(artifactId), request);
|
|
22690
22705
|
}
|
|
22691
|
-
|
|
22692
|
-
var
|
|
22693
|
-
|
|
22694
|
-
|
|
22695
|
-
|
|
22696
|
-
|
|
22706
|
+
var processURL = function (url, params) {
|
|
22707
|
+
var validParams = Object.keys(params).filter(function (key) {
|
|
22708
|
+
return params[key] != null;
|
|
22709
|
+
});
|
|
22710
|
+
if (!validParams.length) {
|
|
22711
|
+
return url;
|
|
22712
|
+
}
|
|
22713
|
+
var queryString = validParams
|
|
22714
|
+
.map(function (key) {
|
|
22715
|
+
if (Array.isArray(params[key])) {
|
|
22716
|
+
return "".concat(key, "=").concat(params[key].join(','));
|
|
22717
|
+
}
|
|
22718
|
+
return "".concat(key, "=").concat(params[key]);
|
|
22719
|
+
})
|
|
22720
|
+
.join('&');
|
|
22721
|
+
return "".concat(url, "?").concat(queryString);
|
|
22722
|
+
};
|
|
22723
|
+
var cdMaterialListModal = function (artifacts, offset, artifactId, artifactStatus) {
|
|
22724
|
+
if (!artifacts || !artifacts.length)
|
|
22725
|
+
return [];
|
|
22726
|
+
var markFirstSelected = offset === 1;
|
|
22727
|
+
var startIndex = offset - 1;
|
|
22728
|
+
var isImageMarked = false;
|
|
22729
|
+
var materials = artifacts.map(function (material, index) {
|
|
22697
22730
|
var _a;
|
|
22698
|
-
var
|
|
22699
|
-
|
|
22700
|
-
|
|
22701
|
-
|
|
22702
|
-
};
|
|
22731
|
+
var artifactStatusValue = '';
|
|
22732
|
+
var filterState = (_a = material.filterState) !== null && _a !== void 0 ? _a : exports.FilterStates.ALLOWED;
|
|
22733
|
+
if (artifactId && artifactStatus && material.id === artifactId) {
|
|
22734
|
+
artifactStatusValue = artifactStatus;
|
|
22703
22735
|
}
|
|
22704
|
-
|
|
22705
|
-
|
|
22706
|
-
|
|
22707
|
-
var artifactStatusValue = '';
|
|
22708
|
-
var filterState = (_a = material.filterState) !== null && _a !== void 0 ? _a : exports.FilterStates.ALLOWED;
|
|
22709
|
-
return {
|
|
22710
|
-
index: index,
|
|
22711
|
-
id: material.id,
|
|
22712
|
-
deployedTime: material.deployed_time
|
|
22713
|
-
? moment(material.deployed_time).format('ddd, DD MMM YYYY, hh:mm A')
|
|
22714
|
-
: 'Not Deployed',
|
|
22715
|
-
deployedBy: material.deployedBy,
|
|
22716
|
-
wfrId: material.wfrId,
|
|
22717
|
-
image: extractImage(material.image),
|
|
22718
|
-
showChanges: false,
|
|
22719
|
-
vulnerabilities: [],
|
|
22720
|
-
buildTime: material.build_time || '',
|
|
22721
|
-
tab: CDModalTab.Changes,
|
|
22722
|
-
showSourceInfo: false,
|
|
22723
|
-
deployed: material.deployed || false,
|
|
22724
|
-
latest: material.latest || false,
|
|
22725
|
-
vulnerabilitiesLoading: true,
|
|
22726
|
-
scanned: material.scanned,
|
|
22727
|
-
scanEnabled: material.scanEnabled,
|
|
22728
|
-
isSelected: !material.vulnerable && filterState === exports.FilterStates.ALLOWED && index === 0,
|
|
22729
|
-
vulnerable: material.vulnerable,
|
|
22730
|
-
runningOnParentCd: material.runningOnParentCd,
|
|
22731
|
-
artifactStatus: artifactStatusValue,
|
|
22732
|
-
userApprovalMetadata: material.userApprovalMetadata,
|
|
22733
|
-
triggeredBy: material.triggeredBy,
|
|
22734
|
-
isVirtualEnvironment: material.isVirtualEnvironment,
|
|
22735
|
-
imageComment: material.imageComment,
|
|
22736
|
-
imageReleaseTags: material.imageReleaseTags,
|
|
22737
|
-
materialInfo: material.material_info
|
|
22738
|
-
? material.material_info.map(function (mat) {
|
|
22739
|
-
return {
|
|
22740
|
-
modifiedTime: mat.modifiedTime ? moment(mat.modifiedTime).format("ddd, DD MMM YYYY, hh:mm A") : '',
|
|
22741
|
-
commitLink: createGitCommitUrl(mat.url, mat.revision),
|
|
22742
|
-
author: mat.author || '',
|
|
22743
|
-
message: mat.message || '',
|
|
22744
|
-
revision: mat.revision || '',
|
|
22745
|
-
tag: mat.tag || '',
|
|
22746
|
-
webhookData: mat.webhookData || '',
|
|
22747
|
-
url: mat.url || '',
|
|
22748
|
-
branch: (material.ciConfigureSourceType === SourceTypeMap.WEBHOOK
|
|
22749
|
-
? material.ciConfigureSourceValue
|
|
22750
|
-
: mat.branch) || '',
|
|
22751
|
-
type: material.ciConfigureSourceType || '',
|
|
22752
|
-
};
|
|
22753
|
-
})
|
|
22754
|
-
: [],
|
|
22755
|
-
filterState: filterState,
|
|
22756
|
-
};
|
|
22757
|
-
});
|
|
22758
|
-
return {
|
|
22759
|
-
materials: materials
|
|
22760
|
-
};
|
|
22736
|
+
var selectImage = !isImageMarked && markFirstSelected && filterState === exports.FilterStates.ALLOWED ? !material.vulnerable : false;
|
|
22737
|
+
if (selectImage) {
|
|
22738
|
+
isImageMarked = true;
|
|
22761
22739
|
}
|
|
22740
|
+
return {
|
|
22741
|
+
index: startIndex + index,
|
|
22742
|
+
id: material.id,
|
|
22743
|
+
deployedTime: material.deployed_time
|
|
22744
|
+
? moment(material.deployed_time).format('ddd, DD MMM YYYY, hh:mm A')
|
|
22745
|
+
: 'Not Deployed',
|
|
22746
|
+
deployedBy: material.deployedBy,
|
|
22747
|
+
wfrId: material.wfrId,
|
|
22748
|
+
tab: CDModalTab.Changes,
|
|
22749
|
+
image: extractImage(material.image),
|
|
22750
|
+
showChanges: false,
|
|
22751
|
+
vulnerabilities: [],
|
|
22752
|
+
buildTime: material.build_time || '',
|
|
22753
|
+
isSelected: selectImage,
|
|
22754
|
+
showSourceInfo: false,
|
|
22755
|
+
deployed: material.deployed || false,
|
|
22756
|
+
latest: material.latest || false,
|
|
22757
|
+
vulnerabilitiesLoading: true,
|
|
22758
|
+
scanned: material.scanned,
|
|
22759
|
+
scanEnabled: material.scanEnabled,
|
|
22760
|
+
vulnerable: material.vulnerable,
|
|
22761
|
+
runningOnParentCd: material.runningOnParentCd,
|
|
22762
|
+
artifactStatus: artifactStatusValue,
|
|
22763
|
+
userApprovalMetadata: material.userApprovalMetadata,
|
|
22764
|
+
triggeredBy: material.triggeredBy,
|
|
22765
|
+
isVirtualEnvironment: material.isVirtualEnvironment,
|
|
22766
|
+
imageComment: material.imageComment,
|
|
22767
|
+
imageReleaseTags: material.imageReleaseTags,
|
|
22768
|
+
// It is going to be null but required in type so can't remove
|
|
22769
|
+
lastExecution: material.lastExecution,
|
|
22770
|
+
materialInfo: material.material_info
|
|
22771
|
+
? material.material_info.map(function (mat) {
|
|
22772
|
+
return {
|
|
22773
|
+
modifiedTime: mat.modifiedTime
|
|
22774
|
+
? moment(mat.modifiedTime).format('ddd, DD MMM YYYY, hh:mm A')
|
|
22775
|
+
: '',
|
|
22776
|
+
commitLink: createGitCommitUrl(mat.url, mat.revision),
|
|
22777
|
+
author: mat.author || '',
|
|
22778
|
+
message: mat.message || '',
|
|
22779
|
+
revision: mat.revision || '',
|
|
22780
|
+
tag: mat.tag || '',
|
|
22781
|
+
webhookData: mat.webhookData || '',
|
|
22782
|
+
url: mat.url || '',
|
|
22783
|
+
branch: (material.ciConfigureSourceType === SourceTypeMap.WEBHOOK
|
|
22784
|
+
? material.ciConfigureSourceValue
|
|
22785
|
+
: mat.branch) || '',
|
|
22786
|
+
type: material.ciConfigureSourceType || '',
|
|
22787
|
+
};
|
|
22788
|
+
})
|
|
22789
|
+
: [],
|
|
22790
|
+
filterState: filterState,
|
|
22791
|
+
};
|
|
22792
|
+
});
|
|
22793
|
+
return materials;
|
|
22794
|
+
};
|
|
22795
|
+
var processCDMaterialsApprovalInfo = function (enableApproval, cdMaterialsResult) {
|
|
22796
|
+
if (!enableApproval) {
|
|
22797
|
+
return {
|
|
22798
|
+
approvalUsers: [],
|
|
22799
|
+
userApprovalConfig: null,
|
|
22800
|
+
requestedUserId: 0,
|
|
22801
|
+
};
|
|
22802
|
+
}
|
|
22803
|
+
return {
|
|
22804
|
+
approvalUsers: cdMaterialsResult.approvalUsers,
|
|
22805
|
+
userApprovalConfig: cdMaterialsResult.userApprovalConfig,
|
|
22806
|
+
requestedUserId: cdMaterialsResult.requestedUserId,
|
|
22807
|
+
};
|
|
22808
|
+
};
|
|
22809
|
+
var processCDMaterialsMetaInfo = function (cdMaterialsResult) {
|
|
22810
|
+
var _a;
|
|
22811
|
+
if (!cdMaterialsResult) {
|
|
22812
|
+
return {
|
|
22813
|
+
tagsEditable: false,
|
|
22814
|
+
appReleaseTagNames: [],
|
|
22815
|
+
hideImageTaggingHardDelete: false,
|
|
22816
|
+
resourceFilters: [],
|
|
22817
|
+
};
|
|
22818
|
+
}
|
|
22819
|
+
return {
|
|
22820
|
+
appReleaseTagNames: cdMaterialsResult.appReleaseTagNames,
|
|
22821
|
+
tagsEditable: cdMaterialsResult.tagsEditable,
|
|
22822
|
+
hideImageTaggingHardDelete: cdMaterialsResult.hideImageTaggingHardDelete,
|
|
22823
|
+
resourceFilters: (_a = cdMaterialsResult.resourceFilters) !== null && _a !== void 0 ? _a : [],
|
|
22824
|
+
};
|
|
22825
|
+
};
|
|
22826
|
+
var processCDMaterialServiceResponse = function (cdMaterialsResult, stage, offset, filter) {
|
|
22827
|
+
if (!cdMaterialsResult) {
|
|
22828
|
+
return __assign(__assign({ materials: [] }, processCDMaterialsMetaInfo(cdMaterialsResult)), processCDMaterialsApprovalInfo(false, cdMaterialsResult));
|
|
22829
|
+
}
|
|
22830
|
+
var materials = cdMaterialListModal(cdMaterialsResult.ci_artifacts, offset !== null && offset !== void 0 ? offset : 1, cdMaterialsResult.latest_wf_artifact_id, cdMaterialsResult.latest_wf_artifact_status);
|
|
22831
|
+
var approvalInfo = processCDMaterialsApprovalInfo(stage === exports.DeploymentNodeType.CD || stage === exports.DeploymentNodeType.APPROVAL, cdMaterialsResult);
|
|
22832
|
+
var metaInfo = processCDMaterialsMetaInfo(cdMaterialsResult);
|
|
22833
|
+
// TODO: On update of service would remove from here
|
|
22834
|
+
var filteredMaterials = filter && filter === exports.CDMaterialFilterQuery.RESOURCE
|
|
22835
|
+
? materials.filter(function (material) {
|
|
22836
|
+
return material.filterState === exports.FilterStates.ALLOWED;
|
|
22837
|
+
})
|
|
22838
|
+
: materials;
|
|
22839
|
+
return __assign(__assign({ materials: filteredMaterials }, approvalInfo), metaInfo);
|
|
22840
|
+
};
|
|
22841
|
+
var getSanitizedQueryParams = function (queryParams) {
|
|
22842
|
+
queryParams.filter; var rest = __rest(queryParams, ["filter"]);
|
|
22843
|
+
return rest;
|
|
22844
|
+
};
|
|
22845
|
+
var genericCDMaterialsService = function (serviceType, cdMaterialID, stage, signal, queryParams) {
|
|
22846
|
+
if (queryParams === void 0) { queryParams = {}; }
|
|
22847
|
+
// TODO: On update of service would remove from here
|
|
22848
|
+
var manipulatedParams = getSanitizedQueryParams(queryParams);
|
|
22849
|
+
var URL;
|
|
22850
|
+
switch (serviceType) {
|
|
22851
|
+
case exports.CDMaterialServiceEnum.ROLLBACK:
|
|
22852
|
+
URL = processURL("".concat(ROUTES.CD_MATERIAL_GET, "/").concat(cdMaterialID, "/material/rollback"), manipulatedParams);
|
|
22853
|
+
break;
|
|
22854
|
+
// Meant for handling getCDMaterialList
|
|
22855
|
+
default:
|
|
22856
|
+
URL = processURL("".concat(ROUTES.CD_MATERIAL_GET, "/").concat(cdMaterialID, "/material"), __assign(__assign({}, manipulatedParams), { stage: stageMap[stage] }));
|
|
22857
|
+
break;
|
|
22858
|
+
}
|
|
22859
|
+
return get(URL, { signal: signal }).then(function (response) {
|
|
22860
|
+
return processCDMaterialServiceResponse(response.result, stage, manipulatedParams.offset, manipulatedParams.filter);
|
|
22762
22861
|
});
|
|
22763
22862
|
};
|
|
22764
22863
|
function extractImage(image) {
|
|
@@ -23140,6 +23239,7 @@ var ImageTagsContainer = function (_a) {
|
|
|
23140
23239
|
var _o = __read(React.useState(false), 2), isSuperAdmin = _o[0], setSuperAdmin = _o[1];
|
|
23141
23240
|
var _p = __read(React.useState(''), 2), descriptionValidationMessage = _p[0], setDescriptionValidationMessage = _p[1];
|
|
23142
23241
|
var _q = __read(React.useState(''), 2), textInput = _q[0], setTextInput = _q[1];
|
|
23242
|
+
var _r = __read(React.useState(false), 2), loading = _r[0], setLoading = _r[1];
|
|
23143
23243
|
React.useEffect(function () {
|
|
23144
23244
|
initialise();
|
|
23145
23245
|
}, []);
|
|
@@ -23313,6 +23413,7 @@ var ImageTagsContainer = function (_a) {
|
|
|
23313
23413
|
hardDeleteTags: hardDeleteTags,
|
|
23314
23414
|
};
|
|
23315
23415
|
// set loading state true
|
|
23416
|
+
setLoading(true);
|
|
23316
23417
|
setImageTags(payload, ciPipelineId, artifactId)
|
|
23317
23418
|
.then(function (res) {
|
|
23318
23419
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
@@ -23352,6 +23453,9 @@ var ImageTagsContainer = function (_a) {
|
|
|
23352
23453
|
else {
|
|
23353
23454
|
showError(err);
|
|
23354
23455
|
}
|
|
23456
|
+
})
|
|
23457
|
+
.finally(function () {
|
|
23458
|
+
setLoading(false);
|
|
23355
23459
|
});
|
|
23356
23460
|
return [2 /*return*/];
|
|
23357
23461
|
});
|
|
@@ -23402,10 +23506,10 @@ var ImageTagsContainer = function (_a) {
|
|
|
23402
23506
|
}, tagId: tag.id, softDeleteTags: softDeleteTags, isSuperAdmin: isSuperAdmin, duplicateTag: tag === null || tag === void 0 ? void 0 : tag.duplicateTag, hideHardDelete: hideHardDelete }, tag.id)); }) })), showTagsWarning && (jsxRuntime.jsxs("div", __assign({ className: "cn-7 mb-8 flex left" }, { children: [jsxRuntime.jsx(SvgIcInfoFilled, { className: "form__icon--info icon-dim-16 mr-2" }), "Tags cannot be edited/removed later"] }))), jsxRuntime.jsx("div", __assign({ className: "cn-7 mt-12" }, { children: "Comment" })), jsxRuntime.jsx("div", __assign({ className: "flex left flex-wrap dc__gap-8 w-100 mt-6 mb-12", "data-testid": "add-image-comment-text-area" }, { children: jsxRuntime.jsx("textarea", { value: newDescription, onChange: handleDescriptionChange, className: "flex left flex-wrap dc__gap-8 dc__description-textarea fs-13", style: { height: '90px !important' } }) })), descriptionValidationMessage !== '' && (jsxRuntime.jsxs("div", __assign({ className: "flex left" }, { children: [jsxRuntime.jsx(SvgIcWarning, { className: "form__icon form__icon--error" }), jsxRuntime.jsx("div", __assign({ className: "form__error" }, { children: descriptionValidationMessage }))] }))), jsxRuntime.jsxs("div", __assign({ className: "w-100 flex right mt-12" }, { children: [jsxRuntime.jsx("button", __assign({ className: "cta flex cancel h-32 lh-32-imp", type: "button", onClick: function (e) {
|
|
23403
23507
|
stopPropagation(e);
|
|
23404
23508
|
handleCancel();
|
|
23405
|
-
} }, { children: "Cancel" })), jsxRuntime.jsx("button", __assign({ className: "cta flex h-32 lh-32-imp ml-12", "data-testid": "save-tags-button", type: "button", onClick: function (e) {
|
|
23509
|
+
}, disabled: loading }, { children: "Cancel" })), jsxRuntime.jsx("button", __assign({ className: "cta flex h-32 lh-32-imp ml-12", "data-testid": "save-tags-button", type: "button", onClick: function (e) {
|
|
23406
23510
|
stopPropagation(e);
|
|
23407
23511
|
onClickSave();
|
|
23408
|
-
} }, { children:
|
|
23512
|
+
}, disabled: loading }, { children: loading ? jsxRuntime.jsx(Progressing, {}) : 'Save' }))] }))] }))) : (jsxRuntime.jsxs("div", __assign({ className: "top br-4 bcn-0 image-tags-container flexbox" }, { children: [jsxRuntime.jsx("div", __assign({ className: "flex left image-tag-left-border w-100 mt-8 mb-8 pr-10 pl-10", "data-testid": "image-tags-container-hover" }, { children: jsxRuntime.jsxs("div", __assign({ className: 'w-100' }, { children: [initialDescription && jsxRuntime.jsx("div", __assign({ className: "mb-6 fs-13 lh-20 dc__word-break-all" }, { children: initialDescription })), jsxRuntime.jsx("div", __assign({ className: "flex-wrap flex left" }, { children: initialTags === null || initialTags === void 0 ? void 0 : initialTags.map(function (tag, index) { return (jsxRuntime.jsx(ImageTagButton, { text: tag === null || tag === void 0 ? void 0 : tag.tagName, isSoftDeleted: tag === null || tag === void 0 ? void 0 : tag.deleted, isEditing: isEditing, onSoftDeleteClick: function (e) {
|
|
23409
23513
|
stopPropagation(e);
|
|
23410
23514
|
handleTagSoftDelete(index);
|
|
23411
23515
|
}, onHardDeleteClick: function (e) {
|
|
@@ -23690,9 +23794,9 @@ exports.closeOnEscKeyPressed = closeOnEscKeyPressed;
|
|
|
23690
23794
|
exports.copyToClipboard = copyToClipboard;
|
|
23691
23795
|
exports.createGitCommitUrl = createGitCommitUrl;
|
|
23692
23796
|
exports.extractImage = extractImage;
|
|
23797
|
+
exports.genericCDMaterialsService = genericCDMaterialsService;
|
|
23693
23798
|
exports.get = get;
|
|
23694
23799
|
exports.getAlphabetIcon = getAlphabetIcon;
|
|
23695
|
-
exports.getCDMaterials = getCDMaterials;
|
|
23696
23800
|
exports.getCookie = getCookie;
|
|
23697
23801
|
exports.getEmptyArrayOfLength = getEmptyArrayOfLength;
|
|
23698
23802
|
exports.getLoginInfo = getLoginInfo;
|
package/package.json
CHANGED
|
@@ -2,7 +2,20 @@ import moment from 'moment';
|
|
|
2
2
|
import {get, post} from './Api';
|
|
3
3
|
import { ROUTES } from './Constants'
|
|
4
4
|
import { sortCallback } from './Helper';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
TeamList,
|
|
7
|
+
ResponseType,
|
|
8
|
+
DeploymentNodeType,
|
|
9
|
+
CDModalTab,
|
|
10
|
+
FilterStates,
|
|
11
|
+
CDMaterialServiceEnum,
|
|
12
|
+
CDMaterialServiceQueryParams,
|
|
13
|
+
CDMaterialResponseType,
|
|
14
|
+
CDMaterialsMetaInfo,
|
|
15
|
+
CDMaterialsApprovalInfo,
|
|
16
|
+
CDMaterialFilterQuery,
|
|
17
|
+
CDMaterialType,
|
|
18
|
+
} from './Types'
|
|
6
19
|
|
|
7
20
|
export const getTeamListMin = (): Promise<TeamList> => {
|
|
8
21
|
// ignore active field
|
|
@@ -30,7 +43,7 @@ interface UserRole extends ResponseType {
|
|
|
30
43
|
}
|
|
31
44
|
}
|
|
32
45
|
|
|
33
|
-
|
|
46
|
+
const stageMap = {
|
|
34
47
|
PRECD: 'PRE',
|
|
35
48
|
CD: 'DEPLOY',
|
|
36
49
|
POSTCD: 'POST',
|
|
@@ -51,83 +64,209 @@ export function setImageTags(request, pipelineId: number, artifactId: number){
|
|
|
51
64
|
return post(`${ROUTES.IMAGE_TAGGING}/${pipelineId}/${artifactId}`,request )
|
|
52
65
|
}
|
|
53
66
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (!response.result) {
|
|
68
|
-
return {
|
|
69
|
-
materials: [],
|
|
67
|
+
const processURL = (url: string, params: object) => {
|
|
68
|
+
const validParams = Object.keys(params).filter((key) => {
|
|
69
|
+
return params[key] != null
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
if (!validParams.length) {
|
|
73
|
+
return url
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const queryString = validParams
|
|
77
|
+
.map((key) => {
|
|
78
|
+
if (Array.isArray(params[key])) {
|
|
79
|
+
return `${key}=${params[key].join(',')}`
|
|
70
80
|
}
|
|
81
|
+
return `${key}=${params[key]}`
|
|
82
|
+
})
|
|
83
|
+
.join('&')
|
|
84
|
+
|
|
85
|
+
return `${url}?${queryString}`
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const cdMaterialListModal = (artifacts: any[], offset: number, artifactId?: number, artifactStatus?: string) => {
|
|
89
|
+
if (!artifacts || !artifacts.length) return []
|
|
90
|
+
|
|
91
|
+
const markFirstSelected = offset === 1
|
|
92
|
+
const startIndex = offset - 1
|
|
93
|
+
let isImageMarked = false
|
|
94
|
+
|
|
95
|
+
const materials: CDMaterialType[] = artifacts.map((material, index) => {
|
|
96
|
+
let artifactStatusValue = ''
|
|
97
|
+
const filterState = material.filterState ?? FilterStates.ALLOWED
|
|
98
|
+
|
|
99
|
+
if (artifactId && artifactStatus && material.id === artifactId) {
|
|
100
|
+
artifactStatusValue = artifactStatus
|
|
71
101
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
102
|
+
|
|
103
|
+
const selectImage =
|
|
104
|
+
!isImageMarked && markFirstSelected && filterState === FilterStates.ALLOWED ? !material.vulnerable : false
|
|
105
|
+
if (selectImage) {
|
|
106
|
+
isImageMarked = true
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
index: startIndex + index,
|
|
111
|
+
id: material.id,
|
|
112
|
+
deployedTime: material.deployed_time
|
|
113
|
+
? moment(material.deployed_time).format('ddd, DD MMM YYYY, hh:mm A')
|
|
114
|
+
: 'Not Deployed',
|
|
115
|
+
deployedBy: material.deployedBy,
|
|
116
|
+
wfrId: material.wfrId,
|
|
117
|
+
tab: CDModalTab.Changes,
|
|
118
|
+
image: extractImage(material.image),
|
|
119
|
+
showChanges: false,
|
|
120
|
+
vulnerabilities: [],
|
|
121
|
+
buildTime: material.build_time || '',
|
|
122
|
+
isSelected: selectImage,
|
|
123
|
+
showSourceInfo: false,
|
|
124
|
+
deployed: material.deployed || false,
|
|
125
|
+
latest: material.latest || false,
|
|
126
|
+
vulnerabilitiesLoading: true,
|
|
127
|
+
scanned: material.scanned,
|
|
128
|
+
scanEnabled: material.scanEnabled,
|
|
129
|
+
vulnerable: material.vulnerable,
|
|
130
|
+
runningOnParentCd: material.runningOnParentCd,
|
|
131
|
+
artifactStatus: artifactStatusValue,
|
|
132
|
+
userApprovalMetadata: material.userApprovalMetadata,
|
|
133
|
+
triggeredBy: material.triggeredBy,
|
|
134
|
+
isVirtualEnvironment: material.isVirtualEnvironment,
|
|
135
|
+
imageComment: material.imageComment,
|
|
136
|
+
imageReleaseTags: material.imageReleaseTags,
|
|
137
|
+
// It is going to be null but required in type so can't remove
|
|
138
|
+
lastExecution: material.lastExecution,
|
|
139
|
+
materialInfo: material.material_info
|
|
140
|
+
? material.material_info.map((mat) => {
|
|
141
|
+
return {
|
|
142
|
+
modifiedTime: mat.modifiedTime
|
|
143
|
+
? moment(mat.modifiedTime).format('ddd, DD MMM YYYY, hh:mm A')
|
|
144
|
+
: '',
|
|
145
|
+
commitLink: createGitCommitUrl(mat.url, mat.revision),
|
|
146
|
+
author: mat.author || '',
|
|
147
|
+
message: mat.message || '',
|
|
148
|
+
revision: mat.revision || '',
|
|
149
|
+
tag: mat.tag || '',
|
|
150
|
+
webhookData: mat.webhookData || '',
|
|
151
|
+
url: mat.url || '',
|
|
152
|
+
branch:
|
|
153
|
+
(material.ciConfigureSourceType === SourceTypeMap.WEBHOOK
|
|
154
|
+
? material.ciConfigureSourceValue
|
|
155
|
+
: mat.branch) || '',
|
|
156
|
+
type: material.ciConfigureSourceType || '',
|
|
157
|
+
}
|
|
158
|
+
})
|
|
159
|
+
: [],
|
|
160
|
+
filterState,
|
|
161
|
+
}
|
|
162
|
+
})
|
|
163
|
+
return materials
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const processCDMaterialsApprovalInfo = (enableApproval: boolean, cdMaterialsResult): CDMaterialsApprovalInfo => {
|
|
167
|
+
if (!enableApproval) {
|
|
168
|
+
return {
|
|
169
|
+
approvalUsers: [],
|
|
170
|
+
userApprovalConfig: null,
|
|
171
|
+
requestedUserId: 0,
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return {
|
|
176
|
+
approvalUsers: cdMaterialsResult.approvalUsers,
|
|
177
|
+
userApprovalConfig: cdMaterialsResult.userApprovalConfig,
|
|
178
|
+
requestedUserId: cdMaterialsResult.requestedUserId,
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const processCDMaterialsMetaInfo = (cdMaterialsResult): CDMaterialsMetaInfo => {
|
|
183
|
+
if (!cdMaterialsResult) {
|
|
184
|
+
return {
|
|
185
|
+
tagsEditable: false,
|
|
186
|
+
appReleaseTagNames: [],
|
|
187
|
+
hideImageTaggingHardDelete: false,
|
|
188
|
+
resourceFilters: [],
|
|
130
189
|
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return {
|
|
193
|
+
appReleaseTagNames: cdMaterialsResult.appReleaseTagNames,
|
|
194
|
+
tagsEditable: cdMaterialsResult.tagsEditable,
|
|
195
|
+
hideImageTaggingHardDelete: cdMaterialsResult.hideImageTaggingHardDelete,
|
|
196
|
+
resourceFilters: cdMaterialsResult.resourceFilters ?? [],
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const processCDMaterialServiceResponse = (
|
|
201
|
+
cdMaterialsResult,
|
|
202
|
+
stage: DeploymentNodeType,
|
|
203
|
+
offset: number,
|
|
204
|
+
filter: CDMaterialFilterQuery,
|
|
205
|
+
): CDMaterialResponseType => {
|
|
206
|
+
if (!cdMaterialsResult) {
|
|
207
|
+
return {
|
|
208
|
+
materials: [],
|
|
209
|
+
...processCDMaterialsMetaInfo(cdMaterialsResult),
|
|
210
|
+
...processCDMaterialsApprovalInfo(false, cdMaterialsResult),
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const materials = cdMaterialListModal(
|
|
215
|
+
cdMaterialsResult.ci_artifacts,
|
|
216
|
+
offset ?? 1,
|
|
217
|
+
cdMaterialsResult.latest_wf_artifact_id,
|
|
218
|
+
cdMaterialsResult.latest_wf_artifact_status,
|
|
219
|
+
)
|
|
220
|
+
const approvalInfo = processCDMaterialsApprovalInfo(
|
|
221
|
+
stage === DeploymentNodeType.CD || stage === DeploymentNodeType.APPROVAL,
|
|
222
|
+
cdMaterialsResult,
|
|
223
|
+
)
|
|
224
|
+
const metaInfo = processCDMaterialsMetaInfo(cdMaterialsResult)
|
|
225
|
+
|
|
226
|
+
// TODO: On update of service would remove from here
|
|
227
|
+
const filteredMaterials =
|
|
228
|
+
filter && filter === CDMaterialFilterQuery.RESOURCE
|
|
229
|
+
? materials.filter((material) => {
|
|
230
|
+
return material.filterState === FilterStates.ALLOWED
|
|
231
|
+
})
|
|
232
|
+
: materials
|
|
233
|
+
|
|
234
|
+
return {
|
|
235
|
+
materials: filteredMaterials,
|
|
236
|
+
...approvalInfo,
|
|
237
|
+
...metaInfo,
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const getSanitizedQueryParams = (queryParams: CDMaterialServiceQueryParams): CDMaterialServiceQueryParams => {
|
|
242
|
+
const { filter, ...rest } = queryParams
|
|
243
|
+
return rest
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export const genericCDMaterialsService = (
|
|
247
|
+
serviceType: CDMaterialServiceEnum,
|
|
248
|
+
cdMaterialID: number,
|
|
249
|
+
stage: DeploymentNodeType,
|
|
250
|
+
signal: AbortSignal,
|
|
251
|
+
queryParams: CDMaterialServiceQueryParams = {},
|
|
252
|
+
): Promise<CDMaterialResponseType> => {
|
|
253
|
+
// TODO: On update of service would remove from here
|
|
254
|
+
const manipulatedParams = getSanitizedQueryParams(queryParams)
|
|
255
|
+
|
|
256
|
+
let URL
|
|
257
|
+
switch (serviceType) {
|
|
258
|
+
case CDMaterialServiceEnum.ROLLBACK:
|
|
259
|
+
URL = processURL(`${ROUTES.CD_MATERIAL_GET}/${cdMaterialID}/material/rollback`, manipulatedParams)
|
|
260
|
+
break
|
|
261
|
+
|
|
262
|
+
// Meant for handling getCDMaterialList
|
|
263
|
+
default:
|
|
264
|
+
URL = processURL(`${ROUTES.CD_MATERIAL_GET}/${cdMaterialID}/material`, { ...manipulatedParams, stage: stageMap[stage] })
|
|
265
|
+
break
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return get(URL, { signal }).then((response) => {
|
|
269
|
+
return processCDMaterialServiceResponse(response.result, stage, manipulatedParams.offset, manipulatedParams.filter)
|
|
131
270
|
})
|
|
132
271
|
}
|
|
133
272
|
|
package/src/Common/Constants.ts
CHANGED
package/src/Common/ImageTags.tsx
CHANGED
|
@@ -18,6 +18,7 @@ import { showError, stopPropagation } from './Helper'
|
|
|
18
18
|
import { TippyCustomized } from './TippyCustomized'
|
|
19
19
|
import { setImageTags, getUserRole } from './Common.service'
|
|
20
20
|
import Tippy from '@tippyjs/react'
|
|
21
|
+
import { Progressing } from './Progressing'
|
|
21
22
|
|
|
22
23
|
export const ImageTagsContainer = ({
|
|
23
24
|
ciPipelineId,
|
|
@@ -47,6 +48,7 @@ export const ImageTagsContainer = ({
|
|
|
47
48
|
const [isSuperAdmin, setSuperAdmin] = useState<boolean>(false)
|
|
48
49
|
const [descriptionValidationMessage, setDescriptionValidationMessage] = useState<string>('')
|
|
49
50
|
const [textInput, setTextInput] = useState<string>('')
|
|
51
|
+
const [loading, setLoading] = useState<boolean>(false)
|
|
50
52
|
|
|
51
53
|
useEffect(() => {
|
|
52
54
|
initialise()
|
|
@@ -226,6 +228,7 @@ export const ImageTagsContainer = ({
|
|
|
226
228
|
}
|
|
227
229
|
|
|
228
230
|
// set loading state true
|
|
231
|
+
setLoading(true)
|
|
229
232
|
setImageTags(payload, ciPipelineId, artifactId)
|
|
230
233
|
.then((res) => {
|
|
231
234
|
const tags = res.result?.imageReleaseTags?.map((tag) => ({
|
|
@@ -262,6 +265,9 @@ export const ImageTagsContainer = ({
|
|
|
262
265
|
showError(err)
|
|
263
266
|
}
|
|
264
267
|
})
|
|
268
|
+
.finally(()=>{
|
|
269
|
+
setLoading(false)
|
|
270
|
+
})
|
|
265
271
|
}
|
|
266
272
|
|
|
267
273
|
const renderInfoCard = (): JSX.Element => {
|
|
@@ -438,6 +444,7 @@ export const ImageTagsContainer = ({
|
|
|
438
444
|
stopPropagation(e)
|
|
439
445
|
handleCancel()
|
|
440
446
|
}}
|
|
447
|
+
disabled={loading}
|
|
441
448
|
>
|
|
442
449
|
Cancel
|
|
443
450
|
</button>
|
|
@@ -449,8 +456,9 @@ export const ImageTagsContainer = ({
|
|
|
449
456
|
stopPropagation(e)
|
|
450
457
|
onClickSave()
|
|
451
458
|
}}
|
|
459
|
+
disabled={loading}
|
|
452
460
|
>
|
|
453
|
-
Save
|
|
461
|
+
{loading ? <Progressing /> : 'Save'}
|
|
454
462
|
</button>
|
|
455
463
|
</div>
|
|
456
464
|
</div>
|
package/src/Common/Types.ts
CHANGED
|
@@ -247,6 +247,30 @@ export interface CDMaterialType {
|
|
|
247
247
|
imageReleaseTags?: ReleaseTag[]
|
|
248
248
|
artifactStatus?: string
|
|
249
249
|
filterState: FilterStates
|
|
250
|
+
// Not even coming from API but required in CDMaterials for Security which makes its own api call but stores data in CDMaterials
|
|
251
|
+
scanToolId?: number
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export enum CDMaterialServiceEnum {
|
|
255
|
+
ROLLBACK = 'rollback',
|
|
256
|
+
CD_MATERIALS = 'cd-materials',
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export enum CDMaterialResourceQuery {
|
|
260
|
+
PENDING_APPROVAL = 'PENDING_APPROVAL'
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export enum CDMaterialFilterQuery {
|
|
264
|
+
RESOURCE = 'ELIGIBLE_RESOURCES',
|
|
265
|
+
ALL = 'ALL_RESOURCES'
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export interface CDMaterialServiceQueryParams {
|
|
269
|
+
search?: string
|
|
270
|
+
offset?: number
|
|
271
|
+
size?: number
|
|
272
|
+
resource?: CDMaterialResourceQuery
|
|
273
|
+
filter?: CDMaterialFilterQuery
|
|
250
274
|
}
|
|
251
275
|
|
|
252
276
|
export interface CommonNodeAttr {
|
|
@@ -362,17 +386,23 @@ export interface FilterConditionsListType {
|
|
|
362
386
|
conditions: FilterConditionsInfo[]
|
|
363
387
|
}
|
|
364
388
|
|
|
365
|
-
export interface
|
|
389
|
+
export interface CDMaterialsApprovalInfo {
|
|
366
390
|
approvalUsers: string[]
|
|
367
|
-
materials: any[]
|
|
368
391
|
userApprovalConfig: UserApprovalConfigType
|
|
369
392
|
requestedUserId: number
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
export interface CDMaterialsMetaInfo {
|
|
370
396
|
tagsEditable: boolean
|
|
371
397
|
appReleaseTagNames: string[]
|
|
372
398
|
hideImageTaggingHardDelete: boolean
|
|
373
399
|
resourceFilters?: FilterConditionsListType[]
|
|
374
400
|
}
|
|
375
401
|
|
|
402
|
+
export interface CDMaterialResponseType extends CDMaterialsMetaInfo, CDMaterialsApprovalInfo {
|
|
403
|
+
materials: CDMaterialType[]
|
|
404
|
+
}
|
|
405
|
+
|
|
376
406
|
export interface InputDetailType {
|
|
377
407
|
label: string
|
|
378
408
|
defaultValue: string
|