ui/lib/shared/addon/mixins/catalog-app.js

159 lines
4.6 KiB
JavaScript

import Mixin from '@ember/object/mixin';
import {
get, set, computed, setProperties, observer
} from '@ember/object';
import { next } from '@ember/runloop';
import { compare as compareVersion } from 'ui/utils/parse-version';
import { stringifyAnswer } from 'shared/utils/evaluate';
import C from 'ui/utils/constants';
import { evaluate } from 'shared/utils/evaluate';
import { isEmpty } from '@ember/utils';
export default Mixin.create({
previewTabDidChange: observer('previewTab', 'previewOpen', function() {
const files = (get(this, 'selectedTemplateModel.filesAsArray') || []);
const previewTab = get(this, 'previewTab');
const found = files.findBy('name', previewTab);
if ( !found ) {
return;
}
set(this, 'decoding', true);
next(() => {
if ( !found.decoded ) {
setProperties(found, {
body: atob(found.body),
decoded: true
});
}
setProperties(this, {
selectedFileContetnt: found.body,
decoding: false
});
});
}),
templateChanged: observer('editable.selectedTemplateUrl', 'templateResource.defaultVersion', function() {
const { editable : { selectedTemplateUrl = '' } } = this;
if (!isEmpty(selectedTemplateUrl)) {
this.getTemplate.perform();
}
}),
isLonghorn: computed('templateResource.id', function() {
const { templateResource } = this;
if (templateResource && templateResource.id === 'cattle-global-data:library-longhorn') {
return true;
}
return false;
}),
filenames: computed('selectedTemplateModel', 'selectedTemplateModel.filesAsArray.[]', function(){
const files = get(this, 'selectedTemplateModel.filesAsArray').map( (file) => ({
label: file.name,
value: file.name
}));
files.addObject({
label: 'answers.yaml',
value: 'answers'
});
return files.sortBy('label');
}),
sortedVersions: computed('defaultUrl', 'intl', 'showDefaultVersionOption', 'templateResource.defaultVersion', 'versionsArray', function() {
const out = get(this, 'versionsArray').sort((a, b) => {
if ( a.sortVersion && b.sortVersion ) {
return compareVersion(a.sortVersion, b.sortVersion);
} else {
return compareVersion(a.version, b.version);
}
});
const def = get(this, 'templateResource.defaultVersion');
if ( get(this, 'showDefaultVersionOption') && get(this, 'defaultUrl') ) {
out.unshift({
version: get(this, 'intl').t('newCatalog.version.default', { version: def }),
link: 'default'
});
}
return out;
}),
defaultUrl: computed('templateResource.defaultVersion', 'versionLinks', function() {
const defaultVersion = get(this, 'templateResource.defaultVersion');
const versionLinks = get(this, 'versionLinks');
if ( defaultVersion && versionLinks && versionLinks[defaultVersion] ) {
return versionLinks[defaultVersion];
}
return null;
}),
answers: computed('selectedTemplateModel.allQuestions.@each.{answer,variable}', 'selectedTemplateModel.customAnswers', function() {
const out = {};
const allQuestions = (get(this, 'selectedTemplateModel.allQuestions') || []);
const filteredQuestions = allQuestions.filter((q) => evaluate(q, allQuestions));
filteredQuestions.forEach((item) => {
out[item.variable] = stringifyAnswer(item.answer);
});
const customAnswers = get(this, 'selectedTemplateModel.customAnswers') || {};
Object.keys(customAnswers).forEach((key) => {
out[key] = stringifyAnswer(customAnswers[key]);
});
return out;
}),
newExternalId: computed('selectedTemplateModel.id', function() {
return `${ C.EXTERNAL_ID.KIND_CATALOG }${ C.EXTERNAL_ID.KIND_SEPARATOR }${ get(this, 'selectedTemplateModel.id') }`;
}),
updateReadme() {
const model = get(this, 'selectedTemplateModel');
setProperties(this, {
readmeContent: null,
appReadmeContent: null,
noAppReadme: false,
});
if ( model && model.hasLink('readme') ) {
model.followLink('readme').then((response) => {
if (this.isDestroyed || this.isDestroying) {
return;
}
set(this, 'readmeContent', response);
});
}
if ( model && model.hasLink('app-readme') ) {
set(this, 'noAppReadme', false);
model.followLink('app-readme').then((response) => {
if (this.isDestroyed || this.isDestroying) {
return;
}
set(this, 'appReadmeContent', response);
if ( !response ) {
set(this, 'noAppReadme', true);
}
});
} else {
set(this, 'noAppReadme', true);
}
},
});