Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | 30x 30x 30x 30x 30x 30x 30x 30x 30x 30x 30x 30x 30x 30x 61x 61x 61x 61x 61x 61x 61x 1x 61x 61x 1x 1x 1x 1x 1x 1x 1x 1x 1x 61x | /*
* Copyright 2022 Harness Inc. All rights reserved.
* Use of this source code is governed by the PolyForm Shield 1.0.0 license
* that can be found in the licenses directory at the root of this repository, also available at
* https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt.
*/
import React from 'react'
import { useModalHook } from '@harness/use-modal'
import produce from 'immer'
import { defaultTo, merge, omit } from 'lodash-es'
import { Dialog } from '@blueprintjs/core'
import { useParams } from 'react-router-dom'
import { DefaultTemplate } from 'framework/Templates/templates'
import type { NGTemplateInfoConfig } from 'services/template-ng'
import { ModalProps, TemplateConfigModal } from 'framework/Templates/TemplateConfigModal/TemplateConfigModal'
import type { ProjectPathProps, GitQueryParams } from '@common/interfaces/RouteInterfaces'
import { useQueryParams } from '@common/hooks'
import { useSaveTemplate } from '@pipeline/utils/useSaveTemplate'
import type { JsonNode } from 'services/cd-ng'
import { AppStoreContext } from 'framework/AppStore/AppStoreContext'
import type { SaveTemplateButtonProps } from '@pipeline/components/PipelineStudio/SaveTemplateButton/SaveTemplateButton'
import { useStrings } from 'framework/strings'
import css from './SaveAsTemplate.module.scss'
interface TemplateActionsReturnType {
save: () => void
}
type SaveAsTemplateProps = Omit<SaveTemplateButtonProps, 'buttonProps'>
export function useSaveAsTemplate({ data, type }: SaveAsTemplateProps): TemplateActionsReturnType {
const { orgIdentifier, projectIdentifier } = useParams<ProjectPathProps>()
const { repoIdentifier, branch } = useQueryParams<GitQueryParams>()
const [template, setTemplate] = React.useState<NGTemplateInfoConfig>()
const [modalProps, setModalProps] = React.useState<ModalProps>()
const { isGitSyncEnabled } = React.useContext(AppStoreContext)
const { getString } = useStrings()
const [showConfigModal, hideConfigModal] = useModalHook(
() => (
<Dialog enforceFocus={false} isOpen={true} className={css.configDialog}>
{modalProps && template && (
<TemplateConfigModal
initialValues={merge(template, { repo: defaultTo(repoIdentifier, ''), branch: defaultTo(branch, '') })}
onClose={hideConfigModal}
modalProps={modalProps}
/>
)}
</Dialog>
),
[template, modalProps, repoIdentifier, branch]
)
const { saveAndPublish } = useSaveTemplate({
template: template as NGTemplateInfoConfig,
gitDetails: { repoIdentifier, branch },
isPipelineStudio: true
})
const onSaveAsTemplate = async () => {
try {
const finalData = typeof data === 'function' ? await data() : data
setTemplate(
produce(DefaultTemplate, draft => {
draft.projectIdentifier = projectIdentifier
draft.orgIdentifier = orgIdentifier
draft.type = type
draft.spec = omit(
finalData,
'name',
'identifier',
'description',
'tags',
'orgIdentifier',
'projectIdentifier'
) as JsonNode
})
)
setModalProps({
title: getString('common.template.saveAsNewTemplateHeading'),
promise: saveAndPublish,
shouldGetComment: !isGitSyncEnabled
})
showConfigModal()
} catch (_error) {
//Do not do anything as there are error in the form
}
}
return { save: onSaveAsTemplate }
}
|