UNPKG

@spalger/kibana

Version:

Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic

142 lines (116 loc) 4.96 kB
define(function (require) { require('ui/field_format_editor'); require('ui/modules') .get('kibana') .directive('fieldEditor', function (Private, $sce) { var _ = require('lodash'); var fieldFormats = Private(require('ui/registry/field_formats')); var Field = Private(require('ui/index_patterns/_field')); var scriptingInfo = $sce.trustAsHtml(require('ui/field_editor/scripting_info.html')); var scriptingWarning = $sce.trustAsHtml(require('ui/field_editor/scripting_warning.html')); return { restrict: 'E', template: require('ui/field_editor/field_editor.html'), scope: { getIndexPattern: '&indexPattern', getField: '&field' }, controllerAs: 'editor', controller: function ($scope, Notifier, kbnUrl) { var self = this; var notify = new Notifier({ location: 'Field Editor' }); self.scriptingInfo = scriptingInfo; self.scriptingWarning = scriptingWarning; self.indexPattern = $scope.getIndexPattern(); self.field = shadowCopy($scope.getField()); self.formatParams = self.field.format.params(); // only init on first create self.creating = !self.indexPattern.fields.byName[self.field.name]; self.selectedFormatId = _.get(self.indexPattern, ['fieldFormatMap', self.field.name, 'type', 'id']); self.defFormatType = initDefaultFormat(); self.fieldFormatTypes = [self.defFormatType].concat(fieldFormats.byFieldType[self.field.type] || []); self.cancel = redirectAway; self.save = function () { var indexPattern = self.indexPattern; var fields = indexPattern.fields; var field = self.field.toActualField(); fields.remove({ name: field.name }); fields.push(field); if (!self.selectedFormatId) { delete indexPattern.fieldFormatMap[field.name]; } else { indexPattern.fieldFormatMap[field.name] = self.field.format; } return indexPattern.save() .then(function () { notify.info('Saved Field "' + self.field.name + '"'); redirectAway(); }); }; self.delete = function () { var indexPattern = self.indexPattern; var field = self.field; indexPattern.fields.remove({ name: field.name }); return indexPattern.save() .then(function () { notify.info('Deleted Field "' + field.name + '"'); redirectAway(); }); }; $scope.$watch('editor.selectedFormatId', function (cur, prev) { var format = self.field.format; var changedFormat = cur !== prev; var missingFormat = cur && (!format || format.type.id !== cur); if (!changedFormat || !missingFormat) return; // reset to the defaults, but make sure it's an object self.formatParams = _.assign({}, getFieldFormatType().paramDefaults); }); $scope.$watch('editor.formatParams', function () { var FieldFormat = getFieldFormatType(); self.field.format = new FieldFormat(self.formatParams); }, true); // copy the defined properties of the field to a plain object // which is mutable, and capture the changed seperately. function shadowCopy(field) { var changes = {}; var shadowProps = { toActualField: { // bring the shadow copy out of the shadows value: function toActualField() { return new Field(self.indexPattern, _.defaults({}, changes, field.$$spec)); } } }; Object.getOwnPropertyNames(field).forEach(function (prop) { var desc = Object.getOwnPropertyDescriptor(field, prop); shadowProps[prop] = { enumerable: desc.enumerable, get: function () { return _.has(changes, prop) ? changes[prop] : field[prop]; }, set: function (v) { changes[prop] = v; } }; }); return Object.create(null, shadowProps); } function redirectAway() { kbnUrl.changeToRoute(self.indexPattern, self.field.scripted ? 'scriptedFields' : 'indexedFields'); } function getFieldFormatType() { if (self.selectedFormatId) return fieldFormats.getType(self.selectedFormatId); else return fieldFormats.getDefaultType(self.field.type); } function initDefaultFormat() { var def = Object.create(fieldFormats.getDefaultType(self.field.type)); // explicitly set to undefined to prevent inheritting the prototypes id def.id = undefined; def.resolvedTitle = def.title; def.title = '- default - '; return def; } } }; }); });