ui/lib/shared/addon/components/form-labels-annotations/component.js

142 lines
3.5 KiB
JavaScript

import { next } from '@ember/runloop';
import { get, set } from '@ember/object';
import { inject as service } from '@ember/service';
import Component from '@ember/component';
import ManageLabels from 'shared/mixins/manage-labels';
import {
STATUS,
STATUS_INTL_KEY,
classForStatus
} from 'shared/components/accordion-list-item/component';
import layout from './template';
import C from 'ui/utils/constants';
export default Component.extend(ManageLabels, {
intl: service(),
layout,
classNames: ['accordion-wrapper'],
detailKey: 'formLabelsAnnotations.detail',
annotationsCount: 0,
labelsCount: 0,
expandAll: null,
editing: true,
readonlyLabels: null,
readonlyAnnotations: null,
// Inputs
initialLabels: null,
model: null,
statusClass: null,
init() {
this._super(...arguments);
this.initLablesAndAnnotations();
},
didReceiveAttrs() {
if (!this.get('expandFn')) {
this.set('expandFn', (item) => {
item.toggleProperty('expanded');
});
}
},
actions: {
addUserLabel() {
this._super();
next(() => {
if ( this.isDestroyed || this.isDestroying ) {
return;
}
this.$('.js-label.key').last()[0].focus();
});
},
annotationsChange(annotations){
set(this, 'annotationsCount', Object.keys(annotations).length)
set(this, 'model.annotations', annotations);
}
},
observeLabelCount: function() {
let count = this.get('userLabelArray').filterBy('key')
.get('length') || 0;
this.set('labelsCount', count || 0);
}.observes('userLabelArray.@each.key'),
status: function() {
let k = STATUS.NONE;
let annotationsCount = this.get('annotationsCount');
let labelsCount = this.get('labelsCount');
let count = labelsCount + annotationsCount
if ( count ) {
k = STATUS.COUNTCONFIGURED;
}
this.set('statusClass', classForStatus(k));
return this.get('intl').t(`${ STATUS_INTL_KEY }.${ k }`, { count });
}.property('labelsCount', 'annotationsCount'),
initLablesAndAnnotations() {
const readonlyLabels = get(this, 'readonlyLabels') || [];
let readonlyAnnotations = get(this, 'readonlyAnnotations') || [];
Object.keys((get(this, 'initialLabels') || {})).forEach((key) => {
if ( C.LABEL_PREFIX_TO_IGNORE.find((L) => key.startsWith(L))) {
readonlyLabels.push(key);
}
})
Object.keys((get(this, 'model.annotations') || {})).forEach((key) => {
if ( C.ANNOTATIONS_TO_IGNORE.find((L) => key.indexOf(L) > -1)) {
readonlyAnnotations.push(key);
}
})
set(this, 'readonlyAnnotations', readonlyAnnotations);
this.initLabels(this.get('initialLabels'), 'user', null, readonlyLabels);
this.labelsChanged();
this.initCounts();
},
initCounts(){
let labels = this.get('model.labels');
let annotations = this.get('model.annotations');
this.set('labelsCount', labels && Object.keys(labels).length || 0);
this.set('annotationsCount', annotations && Object.keys(annotations).length || 0);
},
updateLabels(labels) {
if (this.setLabels) {
this.setLabels(labels);
} else {
const out = {};
labels.forEach((row) => {
out[row.key] = row.value;
});
set(this, 'model.labels', out);
}
this.validate();
},
validate() {
let errors = [];
// (this.get('labelArray')||[]).forEach((obj) => {
// });
set(this, 'errors', errors);
},
});