From f76e1d6668d91434169753e8b157155413e656e3 Mon Sep 17 00:00:00 2001 From: cgonzalez Date: Fri, 11 Jun 2021 15:26:28 +0100 Subject: [PATCH 01/15] Only perform required calls --- .../javascripts/builder/data/user-actions.js | 18 ++++++++++-------- .../builder/editor/widgets/widgets-view.js | 7 ++++++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/lib/assets/javascripts/builder/data/user-actions.js b/lib/assets/javascripts/builder/data/user-actions.js index 7b3f2ab188..11271b2e3e 100755 --- a/lib/assets/javascripts/builder/data/user-actions.js +++ b/lib/assets/javascripts/builder/data/user-actions.js @@ -223,16 +223,18 @@ module.exports = function (params) { return widgetDefinitionsCollection.updateWidgetsOrder(widgets); }, - saveWidget: function (widgetDefModel) { + saveWidget: function (widgetDefModel, saveLayerAnalysis = true, saveOnlyOwnedAnalysis = false) { if (!widgetDefModel) throw new Error('widgetDefModel is required'); - var widgetLayerId = widgetDefModel.get('layer_id'); - layerDefinitionsCollection.some(function (layerDefModel) { - if (layerDefModel.id === widgetLayerId) { - analysisDefinitionsCollection.saveAnalysisForLayer(layerDefModel); - return true; // aborts the "some"-iterator - } - }); + if (saveLayerAnalysis) { + var widgetLayerId = widgetDefModel.get('layer_id'); + layerDefinitionsCollection.some(function (layerDefModel) { + if (layerDefModel.id === widgetLayerId) { + analysisDefinitionsCollection.saveAnalysisForLayer(layerDefModel, !saveOnlyOwnedAnalysis); + return true; // aborts the "some"-iterator + } + }); + } widgetDefModel.save(); }, diff --git a/lib/assets/javascripts/builder/editor/widgets/widgets-view.js b/lib/assets/javascripts/builder/editor/widgets/widgets-view.js index f1e0198b32..d1743e4ecd 100755 --- a/lib/assets/javascripts/builder/editor/widgets/widgets-view.js +++ b/lib/assets/javascripts/builder/editor/widgets/widgets-view.js @@ -171,11 +171,16 @@ module.exports = CoreView.extend({ _onSortableFinish: function () { var self = this; + var savedLayers = {}; this.$('.js-widgets > .js-widgetItem').each(function (index, item) { var modelCid = $(item).data('model-cid'); var widgetDefModel = self._widgetDefinitionsCollection.get(modelCid); widgetDefModel.set('order', index); - self._userActions.saveWidget(widgetDefModel); + + // NOTE: Save only each layer once to avoid rate limits + var layerId = widgetDefModel.get('layer_id'); + self._userActions.saveWidget(widgetDefModel, !savedLayers[layerId], true); + savedLayers[layerId] = true; }); }, From cfe418f6018ef4b31c771cc6ec55fce98e79e57f Mon Sep 17 00:00:00 2001 From: cgonzalez Date: Fri, 11 Jun 2021 15:36:50 +0100 Subject: [PATCH 02/15] Add tests --- .../spec/builder/data/user-actions.spec.js | 46 +++++++++++++++++++ .../editor/widgets/widgets-view.spec.js | 3 +- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/lib/assets/test/spec/builder/data/user-actions.spec.js b/lib/assets/test/spec/builder/data/user-actions.spec.js index 5e37c22755..2ea80fbac9 100644 --- a/lib/assets/test/spec/builder/data/user-actions.spec.js +++ b/lib/assets/test/spec/builder/data/user-actions.spec.js @@ -2579,6 +2579,52 @@ describe('builder/data/user-actions', function () { expect(this.analysisDefinitionsCollection.pluck('node_id')).toEqual(['a0']); }); }); + + describe('when flags are not the default ones', function () { + beforeEach(function () { + this.wa1 = this.widgetDefinitionsCollection.add({ + id: 'wa1', + layer_id: 'A', + type: 'formula', + source: { id: 'a0' } + }); + + this.a0 = this.analysisDefinitionsCollection.add({ + id: 'A', + analysis_definition: { + id: 'a0', type: 'source', params: { query: 'SELECT * FROM a_single_source' } + } + }); + this.b1 = this.analysisDefinitionsCollection.add({ + id: 'B', + analysis_definition: { + id: 'b1', + type: 'intersection', + params: { + source: { id: 'b0', type: 'source', params: { query: 'SELECT * FROM my_polygons' } }, + target: { id: 'a0' } + }, + options: { primary_source_name: 'source' } + } + }); + + spyOn(this.analysisDefinitionsCollection, 'saveAnalysisForLayer'); + spyOn(this.a0, 'save'); + spyOn(this.b1, 'save'); + }); + + it('should not save the layer analysis if the "saveLayerAnalysis" flag is set to false', function () { + this.userActions.saveWidget(this.wa1, false); + + expect(this.analysisDefinitionsCollection.saveAnalysisForLayer).not.toHaveBeenCalled(); + }); + + it('should save only the owned layer analysis if the "saveOnlyOwnedAnalysis" flag is set to true', function () { + this.userActions.saveWidget(this.wa1, true, true); + + expect(this.analysisDefinitionsCollection.saveAnalysisForLayer).toHaveBeenCalledWith(this.A, false); + }); + }); }); describe('smoke tests', function () { diff --git a/lib/assets/test/spec/builder/editor/widgets/widgets-view.spec.js b/lib/assets/test/spec/builder/editor/widgets/widgets-view.spec.js index b006761f5b..6dee493131 100644 --- a/lib/assets/test/spec/builder/editor/widgets/widgets-view.spec.js +++ b/lib/assets/test/spec/builder/editor/widgets/widgets-view.spec.js @@ -206,7 +206,8 @@ describe('editor/widgets/widgets-view', function () { // End of fake sortable expect(this.widgetDefModel1.get('order')).toBe(0); expect(this.widgetDefModel2.get('order')).toBe(1); - expect(this.userActions.saveWidget).toHaveBeenCalled(); + expect(this.userActions.saveWidget).toHaveBeenCalledWith(this.widgetDefModel1, true, true); + expect(this.userActions.saveWidget).toHaveBeenCalledWith(this.widgetDefModel2, true, false); }); }); From d4fd9f9d66916cb49201b7eadc73b67e225814d6 Mon Sep 17 00:00:00 2001 From: cgonzalez Date: Fri, 11 Jun 2021 15:42:41 +0100 Subject: [PATCH 03/15] Bump assets version --- lib/assets/javascripts/builder/editor/widgets/widgets-view.js | 2 +- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/assets/javascripts/builder/editor/widgets/widgets-view.js b/lib/assets/javascripts/builder/editor/widgets/widgets-view.js index d1743e4ecd..cde8040278 100755 --- a/lib/assets/javascripts/builder/editor/widgets/widgets-view.js +++ b/lib/assets/javascripts/builder/editor/widgets/widgets-view.js @@ -177,7 +177,7 @@ module.exports = CoreView.extend({ var widgetDefModel = self._widgetDefinitionsCollection.get(modelCid); widgetDefModel.set('order', index); - // NOTE: Save only each layer once to avoid rate limits + // NOTE: Save only each layer analysis once to avoid rate limits var layerId = widgetDefModel.get('layer_id'); self._userActions.saveWidget(widgetDefModel, !savedLayers[layerId], true); savedLayers[layerId] = true; diff --git a/package-lock.json b/package-lock.json index 0204049eb9..0344b2d13e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "cartodb-ui", - "version": "1.0.0-assets.248", + "version": "1.0.0-assets.249", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c734b663cf..4ae9767a56 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cartodb-ui", - "version": "1.0.0-assets.248", + "version": "1.0.0-assets.249", "description": "CARTO UI frontend", "repository": { "type": "git", From b8dc428dc02eacb5d83dd8f89e41a5acfbe895b3 Mon Sep 17 00:00:00 2001 From: cgonzalez Date: Fri, 11 Jun 2021 15:57:04 +0100 Subject: [PATCH 04/15] Update NEWS.md and fix hound issues --- NEWS.md | 1 + lib/assets/javascripts/builder/data/user-actions.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index fadc08891f..6e20c9345a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -27,6 +27,7 @@ Development - Fix subscription/sample filter for datasets [#16254](https://github.com/CartoDB/cartodb/pull/16254) - Use fully qualified table name while creating a new map from a shared dataset [#16241](https://github.com/CartoDB/cartodb/pull/16241) - Add new events for DO full access [#16290](https://github.com/CartoDB/cartodb/pull/16290) +- Avoid updating the same layer more than once when reordering widgets in Builder [#16303](https://github.com/CartoDB/cartodb/pull/16303) - Fix an issue that prevents API OPTIONS from succeeding because of undue CSRF check [#16292](https://github.com/CartoDB/cartodb/pull/16292) - Fix a regression test and add some warnings to source code [#16297](https://github.com/CartoDB/cartodb/pull/16297) diff --git a/lib/assets/javascripts/builder/data/user-actions.js b/lib/assets/javascripts/builder/data/user-actions.js index 11271b2e3e..a4b9a91074 100755 --- a/lib/assets/javascripts/builder/data/user-actions.js +++ b/lib/assets/javascripts/builder/data/user-actions.js @@ -229,7 +229,7 @@ module.exports = function (params) { if (saveLayerAnalysis) { var widgetLayerId = widgetDefModel.get('layer_id'); layerDefinitionsCollection.some(function (layerDefModel) { - if (layerDefModel.id === widgetLayerId) { + if (layerDefModel.id === widgetLayerId) { analysisDefinitionsCollection.saveAnalysisForLayer(layerDefModel, !saveOnlyOwnedAnalysis); return true; // aborts the "some"-iterator } From 2bdae3e8e17eb725bd6439027b7f897dd04ead22 Mon Sep 17 00:00:00 2001 From: cgonzalez Date: Mon, 21 Jun 2021 11:57:01 +0100 Subject: [PATCH 05/15] Fix schema name for layers created by free users --- .../builder/data/analysis-definition-nodes-collection.js | 2 +- lib/assets/javascripts/builder/helpers/table-name-utils.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/assets/javascripts/builder/data/analysis-definition-nodes-collection.js b/lib/assets/javascripts/builder/data/analysis-definition-nodes-collection.js index d180374c3e..442559f7cf 100755 --- a/lib/assets/javascripts/builder/data/analysis-definition-nodes-collection.js +++ b/lib/assets/javascripts/builder/data/analysis-definition-nodes-collection.js @@ -46,7 +46,7 @@ module.exports = Backbone.Collection.extend({ if (r.type === 'source') { var tableData = _.find(self._relatedTableData, function (t) { - return TableNameUtils.isSameTableName(r.options.table_name, t.name, self._configModel.get('user_name')); + return TableNameUtils.isSameTableName(r.options.table_name, t.name, self._userModel.getSchemaName()); }); if (tableData) { opts.tableData = tableData; diff --git a/lib/assets/javascripts/builder/helpers/table-name-utils.js b/lib/assets/javascripts/builder/helpers/table-name-utils.js index 264d44d612..844705a51b 100755 --- a/lib/assets/javascripts/builder/helpers/table-name-utils.js +++ b/lib/assets/javascripts/builder/helpers/table-name-utils.js @@ -35,7 +35,7 @@ module.exports = { }, getQualifiedTableName: function (tableName, userName, inOrganization) { - var schemaPrefix = (inOrganization && userName) ? this._quoteIfNeeded(userName) + '.' : ''; + var schemaPrefix = (inOrganization && userName) ? this._quoteIfNeeded(userName) + '.' : 'public.'; return schemaPrefix + this._quoteIfNeeded(this.getUnqualifiedName(tableName)); }, From f85138d469635732eec4aee5930b12ec8b33c037 Mon Sep 17 00:00:00 2001 From: cgonzalez Date: Mon, 21 Jun 2021 15:44:24 +0100 Subject: [PATCH 06/15] Fix tests and update NEWS.md --- NEWS.md | 1 + .../builder/helpers/table-name-utils.js | 2 +- .../analysis-definition-nodes-collection.spec.js | 16 +++++++++++----- .../data/layer-definitions-collection.spec.js | 4 ++-- .../test/spec/builder/data/user-actions.spec.js | 4 ++-- .../builder/dataset/dataset-header-view.spec.js | 2 +- .../test/spec/builder/helpers/sql-utils.spec.js | 8 ++++---- 7 files changed, 22 insertions(+), 15 deletions(-) diff --git a/NEWS.md b/NEWS.md index 573d5b3c91..260e1ba639 100644 --- a/NEWS.md +++ b/NEWS.md @@ -15,6 +15,7 @@ Development - Guard code for vizjson users [#16267](https://github.com/CartoDB/cartodb/pull/16267) - Guard code for Users and Visualizations [#16265](https://github.com/CartoDB/cartodb/pull/16265) - Use the organization user's data while editing a user from organization settings [#16280](https://github.com/CartoDB/cartodb/pull/16280) +- Fix schema name in layers created by free users [#16307](https://github.com/CartoDB/cartodb/pull/16307) - Limit start parameter of Dropbox connector [#16264](https://github.com/CartoDB/cartodb/pull/16264) - OauthApps restricted by default [#16304](https://github.com/CartoDB/cartodb/pull/16304) - Support staging hostname in the catalog [#16258](https://github.com/CartoDB/cartodb/pull/16258) diff --git a/lib/assets/javascripts/builder/helpers/table-name-utils.js b/lib/assets/javascripts/builder/helpers/table-name-utils.js index 844705a51b..2ea518c125 100755 --- a/lib/assets/javascripts/builder/helpers/table-name-utils.js +++ b/lib/assets/javascripts/builder/helpers/table-name-utils.js @@ -35,7 +35,7 @@ module.exports = { }, getQualifiedTableName: function (tableName, userName, inOrganization) { - var schemaPrefix = (inOrganization && userName) ? this._quoteIfNeeded(userName) + '.' : 'public.'; + var schemaPrefix = userName ? (inOrganization ? this._quoteIfNeeded(userName) + '.' : 'public.') : ''; return schemaPrefix + this._quoteIfNeeded(this.getUnqualifiedName(tableName)); }, diff --git a/lib/assets/test/spec/builder/data/analysis-definition-nodes-collection.spec.js b/lib/assets/test/spec/builder/data/analysis-definition-nodes-collection.spec.js index 65062a05e7..7d522b31fd 100644 --- a/lib/assets/test/spec/builder/data/analysis-definition-nodes-collection.spec.js +++ b/lib/assets/test/spec/builder/data/analysis-definition-nodes-collection.spec.js @@ -1,6 +1,7 @@ var AnalysisDefinitionNodesCollection = require('builder/data/analysis-definition-nodes-collection'); var AnalysisDefinitionNodeModel = require('builder/data/analysis-definition-node-model'); var ConfigModel = require('builder/data/config-model'); +var UserModel = require('builder/data/config-model'); describe('data/analysis-definition-nodes-collection', function () { beforeEach(function () { @@ -8,9 +9,14 @@ describe('data/analysis-definition-nodes-collection', function () { base_url: '/u/pepe' }); + var userModel = new UserModel({ + username: 'pepe', + { configModel: configModel } + }); + this.collection = new AnalysisDefinitionNodesCollection(null, { configModel: configModel, - userModel: {}, + userModel: userModel, relatedTableData: [ { name: 'foo', @@ -38,7 +44,7 @@ describe('data/analysis-definition-nodes-collection', function () { id: 'a0', type: 'source', table_name: 'foo', - query: 'SELECT * FROM foo', + query: 'SELECT * FROM public.foo', status: 'ready' }); @@ -47,7 +53,7 @@ describe('data/analysis-definition-nodes-collection', function () { id: 'b0', type: 'source', table_name: '000cd294-b124-4f82-b569-0f7fe41d2db8', - query: 'SELECT * FROM "000cd294-b124-4f82-b569-0f7fe41d2db8"', + query: 'SELECT * FROM public."000cd294-b124-4f82-b569-0f7fe41d2db8"', status: 'ready' }); @@ -56,7 +62,7 @@ describe('data/analysis-definition-nodes-collection', function () { id: 'c0', type: 'source', table_name: 'bar', - query: 'SELECT * FROM bar', + query: 'SELECT * FROM public.bar', status: 'ready' }); @@ -65,7 +71,7 @@ describe('data/analysis-definition-nodes-collection', function () { id: 'd0', type: 'source', table_name: '000cd294-b124-4f82-b569-0f7fe41d2db8', - query: 'SELECT * FROM "000cd294-b124-4f82-b569-0f7fe41d2db8"', + query: 'SELECT * FROM public."000cd294-b124-4f82-b569-0f7fe41d2db8"', status: 'ready' }); }); diff --git a/lib/assets/test/spec/builder/data/layer-definitions-collection.spec.js b/lib/assets/test/spec/builder/data/layer-definitions-collection.spec.js index 5c4dd14ccf..f35e28d02b 100644 --- a/lib/assets/test/spec/builder/data/layer-definitions-collection.spec.js +++ b/lib/assets/test/spec/builder/data/layer-definitions-collection.spec.js @@ -188,8 +188,8 @@ describe('data/layer-definitions-collection', function () { }); var sourceNode3 = analysisDefinitionNodesCollection.get(layer3.get('source')); - expect(layer3.get('sql').toLowerCase()).toBe('select * from table_name'); - expect(sourceNode3.get('query').toLowerCase()).toBe('select * from table_name'); + expect(layer3.get('sql').toLowerCase()).toBe('select * from public.table_name'); + expect(sourceNode3.get('query').toLowerCase()).toBe('select * from public.table_name'); var layer4 = collection.add({ kind: 'carto', diff --git a/lib/assets/test/spec/builder/data/user-actions.spec.js b/lib/assets/test/spec/builder/data/user-actions.spec.js index 5e37c22755..69f2345be8 100644 --- a/lib/assets/test/spec/builder/data/user-actions.spec.js +++ b/lib/assets/test/spec/builder/data/user-actions.spec.js @@ -831,7 +831,7 @@ describe('builder/data/user-actions', function () { id: 'a0', type: 'source', table_name: 'foobar', - query: 'SELECT * FROM foobar', + query: 'SELECT * FROM public.foobar', status: 'ready' }); }); @@ -848,7 +848,7 @@ describe('builder/data/user-actions', function () { id: 'a0', type: 'source', table_name: '"000cd294-b124-4f82-b569-0f7fe41d2db8"', - query: 'SELECT * FROM "000cd294-b124-4f82-b569-0f7fe41d2db8"', + query: 'SELECT * FROM public."000cd294-b124-4f82-b569-0f7fe41d2db8"', status: 'ready' }); }); diff --git a/lib/assets/test/spec/builder/dataset/dataset-header-view.spec.js b/lib/assets/test/spec/builder/dataset/dataset-header-view.spec.js index bb4d01f6d4..00583e59d0 100644 --- a/lib/assets/test/spec/builder/dataset/dataset-header-view.spec.js +++ b/lib/assets/test/spec/builder/dataset/dataset-header-view.spec.js @@ -217,7 +217,7 @@ describe('dataset/dataset-header-view', function () { it('should set default query when vis name changes', function () { HeaderView.prototype._setDocumentTitle.calls.reset(); this.view._visModel.set('name', 'hello_new_table'); - expect(this.view._layerDefinitionModel.get('sql')).toBe('SELECT * FROM hello_new_table'); + expect(this.view._layerDefinitionModel.get('sql')).toBe('SELECT * FROM public.hello_new_table'); }); it('should open privacy dropdown if user is owner', function () { diff --git a/lib/assets/test/spec/builder/helpers/sql-utils.spec.js b/lib/assets/test/spec/builder/helpers/sql-utils.spec.js index cd78356102..48d05bff26 100644 --- a/lib/assets/test/spec/builder/helpers/sql-utils.spec.js +++ b/lib/assets/test/spec/builder/helpers/sql-utils.spec.js @@ -72,19 +72,19 @@ describe('helpers/sql-utils', function () { }); it('.getDefaultSQL', function () { - expect(SQLUtils.getDefaultSQL('table', 'user', false)).toBe('SELECT * FROM table'); + expect(SQLUtils.getDefaultSQL('table', 'user', false)).toBe('SELECT * FROM public.table'); expect(SQLUtils.getDefaultSQL('table', 'user', true)).toBe('SELECT * FROM user.table'); expect(SQLUtils.getDefaultSQL('table', undefined, true)).toBe('SELECT * FROM table'); - expect(SQLUtils.getDefaultSQL('1table', 'user', false)).toBe('SELECT * FROM "1table"'); + expect(SQLUtils.getDefaultSQL('1table', 'user', false)).toBe('SELECT * FROM public."1table"'); expect(SQLUtils.getDefaultSQL('1table', 'user', true)).toBe('SELECT * FROM user."1table"'); expect(SQLUtils.getDefaultSQL('1table', undefined, true)).toBe('SELECT * FROM "1table"'); - expect(SQLUtils.getDefaultSQL('table', 'user-me', false)).toBe('SELECT * FROM table'); + expect(SQLUtils.getDefaultSQL('table', 'user-me', false)).toBe('SELECT * FROM public.table'); expect(SQLUtils.getDefaultSQL('table', 'user-me', true)).toBe('SELECT * FROM "user-me".table'); expect(SQLUtils.getDefaultSQL('table', undefined, true)).toBe('SELECT * FROM table'); - expect(SQLUtils.getDefaultSQL('tabl-e', '1stuser', false)).toBe('SELECT * FROM "tabl-e"'); + expect(SQLUtils.getDefaultSQL('tabl-e', '1stuser', false)).toBe('SELECT * FROM public."tabl-e"'); expect(SQLUtils.getDefaultSQL('tabl-e', '1stuser', true)).toBe('SELECT * FROM "1stuser"."tabl-e"'); expect(SQLUtils.getDefaultSQL('tabl-e', undefined, true)).toBe('SELECT * FROM "tabl-e"'); }); From 105670edb9f9e8fc536dc0870b08e4ba4512094a Mon Sep 17 00:00:00 2001 From: cgonzalez Date: Mon, 21 Jun 2021 15:52:22 +0100 Subject: [PATCH 07/15] Fix more tests --- .../data/analysis-definition-node-source-model.spec.js | 4 ++-- .../data/analysis-definition-nodes-collection.spec.js | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/assets/test/spec/builder/data/analysis-definition-node-source-model.spec.js b/lib/assets/test/spec/builder/data/analysis-definition-node-source-model.spec.js index dfed784242..9561203e1c 100644 --- a/lib/assets/test/spec/builder/data/analysis-definition-node-source-model.spec.js +++ b/lib/assets/test/spec/builder/data/analysis-definition-node-source-model.spec.js @@ -40,10 +40,10 @@ describe('builder/data/analysis-definition-node-source-model', function () { spyOn(this.model.tableModel, 'getOwnerName'); }); - it('should provide a default query without qualifing if user does not belong to an organization', function () { + it('should provide a default query with qualifing if user does not belong to an organization', function () { this.userModel.isInsideOrg.and.returnValue(false); this.model.tableModel.getOwnerName.and.returnValue('pericoo'); - expect(this.model.getDefaultQuery()).toBe('SELECT * FROM bar'); + expect(this.model.getDefaultQuery()).toBe('SELECT * FROM public.bar'); }); it('should provide a default query with qualifing if user does belong to an organization', function () { diff --git a/lib/assets/test/spec/builder/data/analysis-definition-nodes-collection.spec.js b/lib/assets/test/spec/builder/data/analysis-definition-nodes-collection.spec.js index 7d522b31fd..cdbe0e2b3d 100644 --- a/lib/assets/test/spec/builder/data/analysis-definition-nodes-collection.spec.js +++ b/lib/assets/test/spec/builder/data/analysis-definition-nodes-collection.spec.js @@ -9,10 +9,10 @@ describe('data/analysis-definition-nodes-collection', function () { base_url: '/u/pepe' }); - var userModel = new UserModel({ - username: 'pepe', + var userModel = new UserModel( + { username: 'pepe' }, { configModel: configModel } - }); + ); this.collection = new AnalysisDefinitionNodesCollection(null, { configModel: configModel, From 705afc6d71548d8d12d0c121ab656187df84dab8 Mon Sep 17 00:00:00 2001 From: cgonzalez Date: Mon, 21 Jun 2021 16:40:17 +0100 Subject: [PATCH 08/15] Fix more tests --- .../data/analysis-definition-nodes-collection.spec.js | 11 ++++++----- .../test/spec/builder/data/user-actions.spec.js | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/assets/test/spec/builder/data/analysis-definition-nodes-collection.spec.js b/lib/assets/test/spec/builder/data/analysis-definition-nodes-collection.spec.js index cdbe0e2b3d..01b72fa3b4 100644 --- a/lib/assets/test/spec/builder/data/analysis-definition-nodes-collection.spec.js +++ b/lib/assets/test/spec/builder/data/analysis-definition-nodes-collection.spec.js @@ -1,11 +1,12 @@ var AnalysisDefinitionNodesCollection = require('builder/data/analysis-definition-nodes-collection'); var AnalysisDefinitionNodeModel = require('builder/data/analysis-definition-node-model'); var ConfigModel = require('builder/data/config-model'); -var UserModel = require('builder/data/config-model'); +var UserModel = require('builder/data/user-model'); describe('data/analysis-definition-nodes-collection', function () { beforeEach(function () { var configModel = new ConfigModel({ + user_name: 'pepe', base_url: '/u/pepe' }); @@ -44,7 +45,7 @@ describe('data/analysis-definition-nodes-collection', function () { id: 'a0', type: 'source', table_name: 'foo', - query: 'SELECT * FROM public.foo', + query: 'SELECT * FROM foo', status: 'ready' }); @@ -53,7 +54,7 @@ describe('data/analysis-definition-nodes-collection', function () { id: 'b0', type: 'source', table_name: '000cd294-b124-4f82-b569-0f7fe41d2db8', - query: 'SELECT * FROM public."000cd294-b124-4f82-b569-0f7fe41d2db8"', + query: 'SELECT * FROM "000cd294-b124-4f82-b569-0f7fe41d2db8"', status: 'ready' }); @@ -62,7 +63,7 @@ describe('data/analysis-definition-nodes-collection', function () { id: 'c0', type: 'source', table_name: 'bar', - query: 'SELECT * FROM public.bar', + query: 'SELECT * FROM bar', status: 'ready' }); @@ -71,7 +72,7 @@ describe('data/analysis-definition-nodes-collection', function () { id: 'd0', type: 'source', table_name: '000cd294-b124-4f82-b569-0f7fe41d2db8', - query: 'SELECT * FROM public."000cd294-b124-4f82-b569-0f7fe41d2db8"', + query: 'SELECT * FROM "000cd294-b124-4f82-b569-0f7fe41d2db8"', status: 'ready' }); }); diff --git a/lib/assets/test/spec/builder/data/user-actions.spec.js b/lib/assets/test/spec/builder/data/user-actions.spec.js index 69f2345be8..5e37c22755 100644 --- a/lib/assets/test/spec/builder/data/user-actions.spec.js +++ b/lib/assets/test/spec/builder/data/user-actions.spec.js @@ -831,7 +831,7 @@ describe('builder/data/user-actions', function () { id: 'a0', type: 'source', table_name: 'foobar', - query: 'SELECT * FROM public.foobar', + query: 'SELECT * FROM foobar', status: 'ready' }); }); @@ -848,7 +848,7 @@ describe('builder/data/user-actions', function () { id: 'a0', type: 'source', table_name: '"000cd294-b124-4f82-b569-0f7fe41d2db8"', - query: 'SELECT * FROM public."000cd294-b124-4f82-b569-0f7fe41d2db8"', + query: 'SELECT * FROM "000cd294-b124-4f82-b569-0f7fe41d2db8"', status: 'ready' }); }); From caf82cf6ed18196d4dafdb6402d029592b5f50d0 Mon Sep 17 00:00:00 2001 From: cgonzalez Date: Mon, 21 Jun 2021 16:55:12 +0100 Subject: [PATCH 09/15] Bump assets version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0344b2d13e..59d486048f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "cartodb-ui", - "version": "1.0.0-assets.249", + "version": "1.0.0-assets.250", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4ae9767a56..cf776db7f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cartodb-ui", - "version": "1.0.0-assets.249", + "version": "1.0.0-assets.250", "description": "CARTO UI frontend", "repository": { "type": "git", From 2b28026042a64f4818483a27624be54623e33fd9 Mon Sep 17 00:00:00 2001 From: cgonzalez Date: Fri, 25 Jun 2021 12:47:10 +0100 Subject: [PATCH 10/15] Update asset version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 04fcefd767..999f3d8739 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "cartodb-ui", - "version": "1.0.0-assets.251-stag", + "version": "1.0.0-assets.252-stag", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 135a9b76b6..d31d5976c0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cartodb-ui", - "version": "1.0.0-assets.251-stag", + "version": "1.0.0-assets.252-stag", "description": "CARTO UI frontend", "repository": { "type": "git", From b36cc5208ce99c89ee731b35b7eeb33e0e642146 Mon Sep 17 00:00:00 2001 From: cgonzalez Date: Fri, 2 Jul 2021 13:34:42 +0100 Subject: [PATCH 11/15] Send requests to save widgets in batches --- .../javascripts/builder/data/user-actions.js | 2 +- .../builder/editor/widgets/widgets-view.js | 20 ++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/assets/javascripts/builder/data/user-actions.js b/lib/assets/javascripts/builder/data/user-actions.js index a4b9a91074..82caca40ec 100755 --- a/lib/assets/javascripts/builder/data/user-actions.js +++ b/lib/assets/javascripts/builder/data/user-actions.js @@ -236,7 +236,7 @@ module.exports = function (params) { }); } - widgetDefModel.save(); + return widgetDefModel.save(); }, deleteAnalysisNode: function (nodeId) { diff --git a/lib/assets/javascripts/builder/editor/widgets/widgets-view.js b/lib/assets/javascripts/builder/editor/widgets/widgets-view.js index cde8040278..4023ee50ce 100755 --- a/lib/assets/javascripts/builder/editor/widgets/widgets-view.js +++ b/lib/assets/javascripts/builder/editor/widgets/widgets-view.js @@ -2,6 +2,7 @@ var _ = require('underscore'); var $ = require('jquery'); var Backbone = require('backbone'); var CoreView = require('backbone/core-view'); +var queue = require('queue-async'); var EditorWidgetView = require('./widget-view'); var IconView = require('builder/components/icon/icon-view'); var template = require('./widgets-view.tpl'); @@ -30,6 +31,8 @@ var REQUIRED_OPTS = [ 'modals' ]; +var SAVE_WIDGET_BATCH_SIZE = 5; + /** * View to render widgets definitions overview */ @@ -169,18 +172,29 @@ module.exports = CoreView.extend({ } }, - _onSortableFinish: function () { + _onSortableFinish: async function () { var self = this; var savedLayers = {}; - this.$('.js-widgets > .js-widgetItem').each(function (index, item) { + + var widgets = this.$('.js-widgets > .js-widgetItem').map(function (index, item) { var modelCid = $(item).data('model-cid'); var widgetDefModel = self._widgetDefinitionsCollection.get(modelCid); widgetDefModel.set('order', index); // NOTE: Save only each layer analysis once to avoid rate limits var layerId = widgetDefModel.get('layer_id'); - self._userActions.saveWidget(widgetDefModel, !savedLayers[layerId], true); + var data = { model: widgetDefModel, saveLayer: !savedLayers[layerId] } savedLayers[layerId] = true; + + return data; + }); + + var q = queue(SAVE_WIDGET_BATCH_SIZE); + _.each(widgets, function(item) { + q.defer(async function (callback) { + await self._userActions.saveWidget(item.model, item.saveLayer, true); + callback(); + }); }); }, From 1264fbfb014f63f43f590e26e8ccb28eba4d415e Mon Sep 17 00:00:00 2001 From: cgonzalez Date: Fri, 2 Jul 2021 13:36:12 +0100 Subject: [PATCH 12/15] Fix Hound issues --- lib/assets/javascripts/builder/editor/widgets/widgets-view.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/assets/javascripts/builder/editor/widgets/widgets-view.js b/lib/assets/javascripts/builder/editor/widgets/widgets-view.js index 4023ee50ce..ce0ecae363 100755 --- a/lib/assets/javascripts/builder/editor/widgets/widgets-view.js +++ b/lib/assets/javascripts/builder/editor/widgets/widgets-view.js @@ -183,14 +183,14 @@ module.exports = CoreView.extend({ // NOTE: Save only each layer analysis once to avoid rate limits var layerId = widgetDefModel.get('layer_id'); - var data = { model: widgetDefModel, saveLayer: !savedLayers[layerId] } + var data = { model: widgetDefModel, saveLayer: !savedLayers[layerId] }; savedLayers[layerId] = true; return data; }); var q = queue(SAVE_WIDGET_BATCH_SIZE); - _.each(widgets, function(item) { + _.each(widgets, function (item) { q.defer(async function (callback) { await self._userActions.saveWidget(item.model, item.saveLayer, true); callback(); From 84636bdab05b48dca54dae66ddfd33a56319faf7 Mon Sep 17 00:00:00 2001 From: manmorjim Date: Tue, 6 Jul 2021 11:56:28 +0200 Subject: [PATCH 13/15] cast column to text to allow pattern ilike --- .../editors/lazy-select/lazy-search-collection.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/assets/javascripts/builder/components/form-components/editors/lazy-select/lazy-search-collection.js b/lib/assets/javascripts/builder/components/form-components/editors/lazy-select/lazy-search-collection.js index 90e19a33d9..fcd47bde22 100644 --- a/lib/assets/javascripts/builder/components/form-components/editors/lazy-select/lazy-search-collection.js +++ b/lib/assets/javascripts/builder/components/form-components/editors/lazy-select/lazy-search-collection.js @@ -6,7 +6,7 @@ var checkAndBuildOpts = require('builder/helpers/required-opts'); var CustomListCollection = require('builder/components/custom-list/custom-list-collection'); var BaseModel = require('builder/components/custom-list/custom-list-item-model'); -var queryTemplate = _.template("SELECT DISTINCT <%= column %> FROM (<%= sql %>) _table_sql WHERE <%= column %> ilike '%<%= search %>%' ORDER BY <%= column %> ASC"); +var queryTemplate = _.template("SELECT DISTINCT <%= column %> FROM (<%= sql %>) _table_sql WHERE <%= column %>::text ilike '%<%= search %>%' ORDER BY <%= column %> ASC"); var REQUIRED_OPTS = [ 'configModel', From 4813a087b580e2a6845197bc95c1955ec00bb19f Mon Sep 17 00:00:00 2001 From: manmorjim Date: Tue, 6 Jul 2021 12:03:36 +0200 Subject: [PATCH 14/15] update NEWS.md --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index 281f757869..f937e2ff24 100644 --- a/NEWS.md +++ b/NEWS.md @@ -34,6 +34,7 @@ Development - Fix an issue that prevents API OPTIONS from succeeding because of undue CSRF check [#16292](https://github.com/CartoDB/cartodb/pull/16292) - Fix a regression test and add some warnings to source code [#16297](https://github.com/CartoDB/cartodb/pull/16297) - Fix broken links on the public footer [#16308](https://github.com/CartoDB/cartodb/pull/16308) +- Fix search in _Filter by Column Value_ analysis [#16310](https://github.com/CartoDB/cartodb/pull/16310) 4.45.0 (2021-04-14) ------------------- From f4690d4a440cac66a3aef6d2479607477d3f0b16 Mon Sep 17 00:00:00 2001 From: manmorjim Date: Tue, 6 Jul 2021 13:14:59 +0200 Subject: [PATCH 15/15] bump assets version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ca89ed379a..525bafecef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cartodb-ui", - "version": "1.0.0-assets.251", + "version": "1.0.0-assets.252", "description": "CARTO UI frontend", "repository": { "type": "git",