import Component from '@ember/component'; import { inject as service } from '@ember/service'; import { set, get, observer, setProperties } from '@ember/object'; import { alias } from '@ember/object/computed'; import { next } from '@ember/runloop'; export default Component.extend({ growl: service(), intl: service(), router: service(), modalService: service('modal'), errors: null, selectedConfig: null, showAdvanced: false, pushConfig: true, when: null, selectedNotification: null, notificationEnabled: false, pipeline: alias('model.pipelineConfig'), selectedBranch: alias('pipeline.selectedBranch'), actions: { save(success){ let pipeline = get(this, 'model.pipeline').clone(); const unSyncConfigs = {}; const updatedBranch = []; const key = get(this, 'selectedBranch'); const branch = (get(this, 'pipeline.branches') || []).findBy('branch', key); let current; if (!this.validateNotification()) { success() return } const selectedNotification = get(this, 'selectedNotification') set(branch, 'config.notification', selectedNotification) if ( !get(branch, 'config') || !get(branch, 'config.stages') || get(branch, 'config.stages.length') < 2 ) { current = 'null'; } else { const config = Object.assign({}, get(branch, 'config')); set(config, 'stages', get(config, 'stages').slice(1)); current = JSON.stringify(config); } const originConfigs = JSON.parse(get(branch, 'rawBranches')); const origin = JSON.stringify(originConfigs[key]); if ( current !== origin ) { const config = Object.assign({}, get(branch, 'config')); const stages = get(config, 'stages').filter((stage) => get(stage, 'steps') && get(stage, 'steps.length') && !get(stage, 'steps.firstObject.sourceCodeConfig') ); const branches = get(config, 'branch'); set(config, 'stages', stages); set(config, 'branch', branches); if ( get(config, 'timeout') ) { set(config, 'timeout', parseInt(get(config, 'timeout'), 10)); } unSyncConfigs[key] = config; updatedBranch.push(key); } set(pipeline, 'unSyncConfigs', unSyncConfigs); if ( get(updatedBranch, 'length') ) { get(this, 'modalService').toggleModal('confirm-update-config', { updatedBranch, pushToRepo: () => { this.submit(pipeline, success, true) }, download: () => { this.download(pipeline, success); }, cancel: () => { success(false) }, }); } else { this.submit(pipeline, success); } }, cancel(){ get(this, 'router').transitionTo('authenticated.project.pipeline.pipelines'); }, select(branch){ set(this, 'selectedBranch', get(branch, 'branch')); }, enableBranch() { const branch = (get(this, 'pipeline.branches') || []).findBy('branch', get(this, 'selectedBranch')); set(branch, 'config', { stages: [{ name: 'clone', steps: [{ sourceCodeConfig: {}, }] }], timeout: 60 }); this.branchDidChange(); }, }, whenDidChange: observer('when', function(){ const branches = get(this, 'when.branch'); if ( get(this, 'selectedConfig') ) { if ( !get(this, 'selectedConfig.branch') && Object.keys(branches).length === 0 ) { return; } set(this, 'selectedConfig.branch', branches); } }), selectedConfigDidChange: observer('selectedConfig', function(){ set(this, 'showAdvanced', false); const branches = get(this, 'selectedConfig.branch') || {}; const defaultNotification = { recipients: [] } let notification = get(this, 'selectedConfig.notification') if (!notification) { notification = defaultNotification set(this, 'selectedConfig.notification', notification) } if ( get(this, 'selectedConfig') ) { setProperties(this, { when: { branch: branches }, selectedNotification: notification, }) next(() => { set(this, 'showAdvanced', true); }); } }), branchDidChange: observer('pipeline.branches.@each.config', 'selectedBranch', function(){ const branch = (get(this, 'pipeline.branches') || []).findBy('branch', get(this, 'selectedBranch')); if ( !branch ) { return; } if ( !get(branch, 'config') ) { set(branch, 'config', {}); } if ( !get(branch, 'config.stages') ) { set(branch, 'config.stages', []); } set(this, 'selectedConfig', get(branch, 'config')); }), validateNotification() { const notificationEnabled = get(this, 'notificationEnabled') if (!notificationEnabled) { return true } let errors = [] const intl = get(this, 'intl') set(this, 'errors', []) const selectedNotification = get(this, 'selectedNotification') const { condition = [], recipients = [] } = selectedNotification const recipientsError = intl.t('pipelineNotification.recipients.required') const conditionError = intl.t('pipelineNotification.condition.required') if (condition.length > 0) { const { notifier, recipient } = recipients[0] if (!notifier || !recipient) { errors.pushObject(recipientsError) } } if (condition.length === 0) { const { notifier, recipient } = recipients[0] if (notifier || recipient) { errors.pushObject(conditionError) } else { errors.pushObjects([recipientsError, conditionError]) } } set(this, 'errors', errors) return errors.length === 0 ? true : false }, download(pipeline, success) { console.error('Pipeline download no longer supported'); success(false); }, submit(pipeline, success, pushToRepo = false) { const unSyncConfigs = get(pipeline, 'unSyncConfigs'); if ( pushToRepo ) { pipeline.doAction('pushconfig', { configs: unSyncConfigs }).then(() => { success(true); get(this, 'router').transitionTo('authenticated.project.pipeline.pipelines'); }).catch(() => { success(false); }); } else { success(true); get(this, 'router').transitionTo('authenticated.project.pipeline.pipelines'); } }, });