diff --git a/package.json b/package.json index 2930549d127a48f335b6643d5948779dd8bdfe4a..826a3a93ed62ad0127ea32cb19a47da9bb1220a1 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "angular-ui-bootstrap": "^0.12.1", "angular-xeditable": "git://github.com/vitalets/angular-xeditable#0.1.9", "angularytics": "0.3.0", - "bluebird": "^2.9.34", "classnames": "^2.1.3", "crossfilter": "1.3.11", "d3": "3.5.3", diff --git a/resources/frontend_client/app/admin/metadata/metadata.controllers.js b/resources/frontend_client/app/admin/metadata/metadata.controllers.js index 167de87375debb021107d2eae32e6953b554af14..e5db85816781dc6985d679acc7db05f993838252 100644 --- a/resources/frontend_client/app/admin/metadata/metadata.controllers.js +++ b/resources/frontend_client/app/admin/metadata/metadata.controllers.js @@ -3,8 +3,6 @@ import MetadataEditor from './components/MetadataEditor.react'; -import Promise from 'bluebird'; - angular .module('metabase.admin.metadata.controllers', [ 'corvus.services', @@ -50,33 +48,41 @@ function($scope, $route, $routeParams, $location, $q, $timeout, databases, Metab } }, true); - $scope.$watch('databaseId', Promise.coroutine(function *() { + $scope.$watch('databaseId', async function() { $scope.tables = {}; if ($scope.databaseId != null) { try { - var tables = yield Metabase.db_tables({ 'dbId': $scope.databaseId }).$promise; - yield Promise.all(tables.map(Promise.coroutine(function *(table) { - $scope.tables[table.id] = yield Metabase.table_query_metadata({ - 'tableId': table.id, - 'include_sensitive_fields': true - }).$promise; - computeMetadataStrength($scope.tables[table.id]); - }))); - var result = yield Metabase.db_idfields({ 'dbId': $scope.databaseId }).$promise; - if (result && !result.error) { - $scope.idfields = result.map(function(field) { - field.displayName = field.table.display_name + " → " + field.display_name; - return field; - }); - } else { - console.warn(result); - } + await loadTableMetadata(); + await loadIdFields(); $timeout(() => $scope.$digest()); } catch (error) { console.warn("error loading tables", error) } } - }), true); + }, true); + + async function loadTableMetadata() { + var tables = await Metabase.db_tables({ 'dbId': $scope.databaseId }).$promise; + await* tables.map(async function(table) { + $scope.tables[table.id] = await Metabase.table_query_metadata({ + 'tableId': table.id, + 'include_sensitive_fields': true + }).$promise; + computeMetadataStrength($scope.tables[table.id]); + }); + } + + async function loadIdFields() { + var result = await Metabase.db_idfields({ 'dbId': $scope.databaseId }).$promise; + if (result && !result.error) { + $scope.idfields = result.map(function(field) { + field.displayName = field.table.display_name + " → " + field.display_name; + return field; + }); + } else { + console.warn(result); + } + } $scope.selectDatabase = function(db) { $location.path('/admin/metadata/'+db.id); @@ -98,6 +104,8 @@ function($scope, $route, $routeParams, $location, $q, $timeout, databases, Metab return Metabase.field_update(field).$promise.then(function(result) { _.each(result, (value, key) => { if (key.charAt(0) !== "$") { field[key] = value } }); computeMetadataStrength($scope.tables[field.table_id]); + return loadIdFields(); + }).then(function() { $timeout(() => $scope.$digest()); }); }; @@ -122,13 +130,13 @@ function($scope, $route, $routeParams, $location, $q, $timeout, databases, Metab table.metadataStrength = completed / total; } - $scope.updateFieldSpecialType = Promise.coroutine(function *(field) { + $scope.updateFieldSpecialType = async function(field) { // If we are changing the field from a FK to something else, we should delete any FKs present if (field.target && field.target.id != null && field.special_type !== "fk") { // we have something that used to be an FK and is now not an FK // Let's delete its foreign keys try { - yield deleteAllFieldForeignKeys(field); + await deleteAllFieldForeignKeys(field); } catch (e) { console.warn("Errpr deleting foreign keys", e); } @@ -138,32 +146,31 @@ function($scope, $route, $routeParams, $location, $q, $timeout, databases, Metab } // save the field return $scope.updateField(field); - }); + }; - $scope.updateFieldTarget = Promise.coroutine(function *(field) { + $scope.updateFieldTarget = async function(field) { // This function notes a change in the target of the target of a foreign key // If there is already a target, we should delete that FK and create a new one // This is meant to be transitional until we add an FK modify function to the API // If there was not a target, we should create a new FK try { - yield deleteAllFieldForeignKeys(field); + await deleteAllFieldForeignKeys(field); } catch (e) { console.warn("Error deleting foreign keys", e); } - var result = yield Metabase.field_addfk({ + var result = await Metabase.field_addfk({ "db": $scope.databaseId, "fieldId": field.id, 'target_field': field.target_id, "relationship": "Mt1" }).$promise; field.target = result.destination; - }); + }; - function deleteAllFieldForeignKeys(field) { - return Metabase.field_foreignkeys({ 'fieldId': field.id }).$promise.then(function(fks) { - return Promise.all(fks.map(function(fk) { - return ForeignKey.delete({ 'fkID': fk.id }).$promise; - })); + async function deleteAllFieldForeignKeys(field) { + var fks = await Metabase.field_foreignkeys({ 'fieldId': field.id }).$promise; + return await* fks.map(function(fk) { + return ForeignKey.delete({ 'fkID': fk.id }).$promise; }); } }]); diff --git a/webpack.config.js b/webpack.config.js index 18e9e5246b77ad1c8660fdeee38a95f8164b8da3..8e1c00c580e3408a7c2d46b999be60b5e25da217 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -52,7 +52,7 @@ module.exports = { module: { loaders: [ // JavaScript - { test: /\.js$/, exclude: /node_modules/, loader: 'babel', query: { cacheDirectory: '.babel_cache' }}, + { test: /\.js$/, exclude: /node_modules/, loader: 'babel', query: { cacheDirectory: '.babel_cache', optional: ['es7.asyncFunctions'] }}, { test: /\.js$/, exclude: /node_modules|\.spec\.js/, loader: 'eslint' }, // CSS { test: /\.css$/, loader: ExtractTextPlugin.extract('style-loader', 'css-loader?-restructuring&compatibility!cssnext-loader') }