diff --git a/src/components/Apps/VariableCreateUpdateForm/index.vue b/src/components/Apps/VariableCreateUpdateForm/index.vue new file mode 100644 index 000000000..c411dd22f --- /dev/null +++ b/src/components/Apps/VariableCreateUpdateForm/index.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/src/components/Apps/VariableSetForm/index.vue b/src/components/Apps/VariableSetForm/index.vue new file mode 100644 index 000000000..9a6c92c3f --- /dev/null +++ b/src/components/Apps/VariableSetForm/index.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/views/ops/Adhoc/AdhocOpenDialog.vue b/src/views/ops/Adhoc/AdhocOpenDialog.vue index 230da4327..13dff095f 100644 --- a/src/views/ops/Adhoc/AdhocOpenDialog.vue +++ b/src/views/ops/Adhoc/AdhocOpenDialog.vue @@ -52,6 +52,7 @@ export default { title: this.$tc('Select'), name: 'select', can: true, + type: 'primary', callback: ({ row }) => { this.$emit('select', row) this.iVisible = false diff --git a/src/views/ops/Adhoc/QuickJob.vue b/src/views/ops/Adhoc/QuickJob.vue index 22ccb6067..6c0aec011 100644 --- a/src/views/ops/Adhoc/QuickJob.vue +++ b/src/views/ops/Adhoc/QuickJob.vue @@ -8,6 +8,12 @@ :visible.sync="showOpenAdhocSaveDialog" /> + @@ -13,9 +20,13 @@ import i18n from '@/i18n/i18n' import VariableHelpDialog from '@/views/ops/Adhoc/VariableHelpDialog.vue' import { Required } from '@/components/Form/DataForm/rules' import { crontab, interval } from '@/views/accounts/const' +import LoadTemplateLink from '@/views/ops/Job/components/loadTemplateLink' +import Variable from '@/views/ops/Template/components/Variable' +import setVariableDialog from '@/views/ops/Template/components/setVariableDialog.vue' export default { components: { + setVariableDialog, GenericCreateUpdatePage, VariableHelpDialog }, @@ -27,9 +38,9 @@ export default { url: '/api/v1/ops/jobs/', fields: [ [this.$t('Basic'), ['name', 'type', 'instant']], - [this.$t('Task'), ['module', 'args', 'playbook', 'chdir', 'timeout']], - [this.$t('Asset'), ['assets', 'runas', 'runas_policy']], - [this.$t('Plan'), ['run_after_save', 'is_periodic', 'interval', 'crontab']], + [this.$t('Asset'), ['assets', 'nodes', 'runas', 'runas_policy']], + [this.$t('Task'), ['module', 'argsLoadFromTemplate', 'args', 'playbook', 'variable', 'chdir', 'timeout']], + [this.$t('Plan'), ['is_periodic', 'interval', 'crontab', 'periodic_variable']], [this.$t('Other'), ['comment']] ], initial: { @@ -88,13 +99,26 @@ export default { return { label: item.name, value: item.id } } } + }, + on: { + change: ([event], updateForm) => { + this.queryParam = `playbook=${event.pk}` + this.$axios.get(`/api/v1/ops/playbooks/${event.pk}/`, + ).then(data => { + data?.variable.map(item => { + delete item.job + delete item.playbook + return item + }) + updateForm({ variable: data.variable }) + }) + } } }, assets: { type: 'assetSelect', component: AssetSelect, label: this.$t('Asset'), - rules: [Required], el: { baseUrl: '/api/v1/perms/users/self/assets/', baseNodeUrl: '/api/v1/perms/users/self/nodes/', @@ -102,6 +126,38 @@ export default { value: [] } }, + nodes: { + el: { + value: [], + ajax: { + url: '/api/v1/perms/users/self/nodes/', + filterOption: (item) => { + if (item.value !== 'favorite') { + return item + } + }, + transformOption: (item) => { + return { label: item.full_value || item.name, value: item.id } + } + } + } + }, + argsLoadFromTemplate: { + label: this.$t('Templates'), + hidden: (formValue) => { + return formValue.type !== 'adhoc' + }, + component: LoadTemplateLink, + on: { + change: ([event], updateForm) => { + updateForm({ + args: event.args, + module: event.module.value, + variable: event.variable + }) + } + } + }, args: { rules: [Required], hidden: (formValue) => { @@ -125,6 +181,25 @@ export default { ] } }, + variable: { + component: Variable, + on: { + input: ([event], updateForm) => { + this.formData = event.map(item => { + return item.form_data + }) + if (event.length > 0) { + if (event[0].job) { + this.queryParam = `job=${event[0].job}` + } else if (event[0].adhoc) { + this.queryParam = `adhoc=${event[0].adhoc}` + } else if (event[0].playbook) { + this.queryParam = `playbook=${event[0].playbook}` + } + } + } + } + }, timeout: { helpText: i18n.t('TimeoutHelpText') }, @@ -149,13 +224,42 @@ export default { type: 'switch', hidden: () => { return this.instantTask + }, + on: { + change: ([event], updateForm) => { + if (this.formData.length > 0) { + this.showVariableDialog = event + } + } + } + }, + periodic_variable: { + hidden: () => { + return true } }, interval, crontab }, createSuccessNextRoute: { name: 'JobManagement' }, - updateSuccessNextRoute: { name: 'JobManagement' } + updateSuccessNextRoute: { name: 'JobManagement' }, + cleanFormValue: (data) => { + Object.assign(data, { periodic_variable: this.periodicVariableValue }) + return data + }, + moreButtons: [ + { + title: this.$t('ExecuteAfterSaving'), + callback: (value, form, btn) => { + form.value.instant = true + this.submitForm(form, btn) + } + } + ], + formData: [], + queryParam: '', + showVariableDialog: false, + periodicVariableValue: {} } }, mounted() { @@ -192,7 +296,20 @@ export default { this.ready = true } }, - methods: {} + methods: { + submitForm(form, btn) { + form.validate((valid) => { + if (valid) { + btn.loading = true + } + }) + this.$refs.form.$refs.createUpdateForm.$refs.form.$refs.dataForm.submitForm('form', false) + }, + setPeriodicParams(data) { + this.showVariableDialog = false + this.periodicVariableValue = data + } + } } diff --git a/src/views/ops/Job/components/Adhoc.vue b/src/views/ops/Job/components/Adhoc.vue index 5d0ae3609..41d0bb83a 100644 --- a/src/views/ops/Job/components/Adhoc.vue +++ b/src/views/ops/Job/components/Adhoc.vue @@ -1,129 +1,16 @@ diff --git a/src/views/ops/Job/components/BaseJob.vue b/src/views/ops/Job/components/BaseJob.vue new file mode 100644 index 000000000..e77d0912c --- /dev/null +++ b/src/views/ops/Job/components/BaseJob.vue @@ -0,0 +1,166 @@ + + + diff --git a/src/views/ops/Job/components/PlayBook.vue b/src/views/ops/Job/components/PlayBook.vue index 710272cb3..dc9927eb5 100644 --- a/src/views/ops/Job/components/PlayBook.vue +++ b/src/views/ops/Job/components/PlayBook.vue @@ -1,136 +1,16 @@ diff --git a/src/views/ops/Job/components/loadTemplateLink.vue b/src/views/ops/Job/components/loadTemplateLink.vue new file mode 100644 index 000000000..def5c4d26 --- /dev/null +++ b/src/views/ops/Job/components/loadTemplateLink.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/views/ops/Template/Adhoc/AdhocUpdateCreate.vue b/src/views/ops/Template/Adhoc/AdhocUpdateCreate.vue index 5331f1240..45e246a7d 100644 --- a/src/views/ops/Template/Adhoc/AdhocUpdateCreate.vue +++ b/src/views/ops/Template/Adhoc/AdhocUpdateCreate.vue @@ -5,6 +5,7 @@ + + diff --git a/src/views/ops/Template/components/Variable.vue b/src/views/ops/Template/components/Variable.vue new file mode 100644 index 000000000..c5f26b371 --- /dev/null +++ b/src/views/ops/Template/components/Variable.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/src/views/ops/Template/components/setVariableDialog.vue b/src/views/ops/Template/components/setVariableDialog.vue new file mode 100644 index 000000000..c1d322d27 --- /dev/null +++ b/src/views/ops/Template/components/setVariableDialog.vue @@ -0,0 +1,66 @@ + + + + +