mirror of https://github.com/rancher/ui.git
129 lines
3.7 KiB
JavaScript
129 lines
3.7 KiB
JavaScript
import { inject as service } from '@ember/service';
|
|
import { get, set, computed } from '@ember/object';
|
|
import Component from '@ember/component';
|
|
import ModalBase from 'shared/mixins/modal-base';
|
|
import layout from './template';
|
|
import C from 'shared/utils/constants';
|
|
import moment from 'moment';
|
|
|
|
import jsondiffpatch from 'jsondiffpatch';
|
|
|
|
const HIDDEN_FIELDS = ['created', 'creatorId', 'name', 'ownerReferences', 'removed', 'scale', 'state', 'uuid', 'workloadLabels', 'workloadAnnotations'];
|
|
|
|
function sanitize(config, keys) {
|
|
const result = {};
|
|
|
|
keys.forEach((key) => {
|
|
if (config[key] !== undefined) {
|
|
result[key] = config[key]
|
|
}
|
|
if (key === 'labels' && result.labels) {
|
|
delete result.labels['pod-template-hash'];
|
|
}
|
|
if (key === 'selector' && result.selector && result.selector.matchLabels) {
|
|
delete result.selector.matchLabels['pod-template-hash'];
|
|
}
|
|
});
|
|
|
|
return result;
|
|
}
|
|
|
|
export default Component.extend(ModalBase, {
|
|
growl: service(),
|
|
|
|
layout,
|
|
classNames: ['large-modal'],
|
|
|
|
keys: null,
|
|
|
|
name: null,
|
|
loading: true,
|
|
revisions: null,
|
|
revisionId: null,
|
|
|
|
init() {
|
|
this._super(...arguments);
|
|
|
|
const schema = get(this, 'store').getById('schema', 'workload');
|
|
const resourceFields = get(schema, 'resourceFields');
|
|
|
|
set(this, 'keys', Object.keys(resourceFields).filter((field) => !field.endsWith('Status') && HIDDEN_FIELDS.indexOf(field) === -1));
|
|
},
|
|
|
|
didReceiveAttrs() {
|
|
let model = get(this, 'modalService.modalOpts.originalModel').clone();
|
|
|
|
set(this, 'model', model);
|
|
get(this, 'store').rawRequest({
|
|
url: get(model, 'links.revisions'),
|
|
method: 'GET',
|
|
})
|
|
.then((revs) => {
|
|
set(this, 'revisions', revs.body.data);
|
|
})
|
|
.catch((err) => {
|
|
this.send('cancel');
|
|
get(this, 'growl').fromError(err);
|
|
})
|
|
.finally(() => {
|
|
set(this, 'loading', false);
|
|
});
|
|
},
|
|
|
|
actions: {
|
|
save(cb) {
|
|
const id = get(this, 'selected.id');
|
|
|
|
get(this, 'model').doAction('rollback', { replicaSetId: id, })
|
|
.then(() => {
|
|
this.send('cancel');
|
|
})
|
|
.finally(() => {
|
|
cb();
|
|
});
|
|
},
|
|
},
|
|
|
|
choices: computed('model.workloadAnnotations', 'revisions.[]', function() {
|
|
return (get(this, 'revisions') || [])
|
|
.sortBy('createdTS')
|
|
.reverse()
|
|
.map((r) => {
|
|
let time = moment(get(r, 'created'));
|
|
let id = get(r, 'id');
|
|
|
|
return {
|
|
label: `${ id }: ${ time.format('YYYY-MM-DD HH:mm:ss') } (${ time.fromNow() })`,
|
|
value: id,
|
|
ts: get(r, 'createdTS'),
|
|
data: r,
|
|
disabled: r.workloadAnnotations[C.LABEL.DEPLOYMENT_REVISION] === get(this, 'model.workloadAnnotations')[C.LABEL.DEPLOYMENT_REVISION]
|
|
};
|
|
});
|
|
}),
|
|
|
|
current: computed('model.workloadAnnotations', 'revisions.@each.workloadAnnotations', function() {
|
|
const currentRevision = get(this, 'model.workloadAnnotations')[C.LABEL.DEPLOYMENT_REVISION];
|
|
|
|
return (get(this, 'revisions') || []).find((r) => get(r, 'workloadAnnotations')[C.LABEL.DEPLOYMENT_REVISION] === currentRevision);
|
|
}),
|
|
|
|
selected: computed('revisionId', 'revisions.[]', function() {
|
|
return (get(this, 'revisions') || []).findBy('id', get(this, 'revisionId'));
|
|
}),
|
|
|
|
diff: computed('current', 'keys', 'selected', function() {
|
|
if (get(this, 'current') && get(this, 'selected')) {
|
|
let left = sanitize(get(this, 'current'), get(this, 'keys'));
|
|
let right = sanitize(get(this, 'selected'), get(this, 'keys'));
|
|
var delta = jsondiffpatch.diff(left, right);
|
|
|
|
jsondiffpatch.formatters.html.hideUnchanged();
|
|
|
|
return jsondiffpatch.formatters.html.format(delta, left).htmlSafe();
|
|
}
|
|
|
|
return null;
|
|
}),
|
|
});
|