frontend: apply prettier

PR-URL: https://github.com/hasura/graphql-engine-mono/pull/7668
GitOrigin-RevId: 0ed901780092994ae40c2c57557c5854812a91b2
This commit is contained in:
Nicolas Beaussart 2023-01-25 21:53:48 +01:00 committed by hasura-bot
parent 221af57e53
commit 09c9cf8b46
205 changed files with 9464 additions and 8769 deletions

View File

@ -1,2 +1,3 @@
11a454c2d69bb05c3471be0d04d2282cc93a557e # reformat with Ormolu 11a454c2d69bb05c3471be0d04d2282cc93a557e # reformat with Ormolu
342391f39dd68dd7922ef29215e150dca7811975 # reformat with Ormolu v0.5.0.1 342391f39dd68dd7922ef29215e150dca7811975 # reformat with Ormolu v0.5.0.1
fb19d80e16092186c6aa61bf90b3d1a55644a5a7 # Prettier reformat

3
frontend/.gitignore vendored
View File

@ -42,3 +42,6 @@ Thumbs.db
# Env # Env
.env .env
# This is a snapshot generated during npm install, but not needed
/snapshots.js

View File

@ -3,3 +3,7 @@
/dist /dist
/coverage /coverage
/docs /docs
/apps/console-ce/src/assets/
/apps/console-ee/src/assets/
/apps/console-ce-e2e/**/snapshots.js
/snapshots.js

View File

@ -2,7 +2,6 @@
"eslint.validate": ["json"], "eslint.validate": ["json"],
"cSpell.words": ["clsx"], "cSpell.words": ["clsx"],
"tailwindCSS.experimental.classRegex": [ "tailwindCSS.experimental.classRegex": [
"tw\\w+ ?= ?`([^`]*)`", "tw\\w+ ?= ?`([^`]*)`",
"tw\\w+: ?`([^`]*)`" "tw\\w+: ?`([^`]*)`"
], ],

View File

@ -6,8 +6,7 @@ Visit the [Nx Documentation](https://nx.dev) to learn more about it.
This `frontend` monorepo contains the Hasura Console, in all the possible modes. This `frontend` monorepo contains the Hasura Console, in all the possible modes.
_Last import [2023-01-12](https://github.com/hasura/graphql-engine-mono/tree/a8cbb297437e4c2d9ba4cab5da1e464d4eac43e4)_
*Last import [2023-01-12](https://github.com/hasura/graphql-engine-mono/tree/a8cbb297437e4c2d9ba4cab5da1e464d4eac43e4)*
## Nx Console ## Nx Console

View File

@ -1,6 +1,7 @@
# Test # Test
## Useful resources ## Useful resources
- [Cypress Dashboard for the Console project](https://dashboard.cypress.io/projects/5yiuic) - [Cypress Dashboard for the Console project](https://dashboard.cypress.io/projects/5yiuic)
## Running all tests to generate coverage ## Running all tests to generate coverage

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -37,71 +37,71 @@
* @see https://github.com/bahmutov/cypress-network-idle * @see https://github.com/bahmutov/cypress-network-idle
*/ */
import 'cypress-wait-until'; import 'cypress-wait-until';
export function waitForPostCreationRequests() { export function waitForPostCreationRequests() {
let waitCompleted = false; let waitCompleted = false;
cy.log('*--- All requests must be settled*'); cy.log('*--- All requests must be settled*');
const pendingRequests = new Map(); const pendingRequests = new Map();
cy.intercept('POST', 'http://localhost:8080/v1/metadata', req => { cy.intercept('POST', 'http://localhost:8080/v1/metadata', req => {
if (waitCompleted) return; if (waitCompleted) return;
Cypress.log({ message: '*--- Request pending*' }); Cypress.log({ message: '*--- Request pending*' });
pendingRequests.set(req, true); pendingRequests.set(req, true);
req.continue(() => { req.continue(() => {
Cypress.log({ message: '*--- Request settled*' }); Cypress.log({ message: '*--- Request settled*' });
pendingRequests.delete(req); pendingRequests.delete(req);
});
}); });
});
Cypress.log({ message: '*--- Waiting for the first request to start*' });
Cypress.log({ message: '*--- Waiting for the first request to start*' });
// Check if at least one request has been caught. This check must protect from the following case
// // Check if at least one request has been caught. This check must protect from the following case
// check requests start test failure, the requests got the UI re-rendered //
// | | | // check requests start test failure, the requests got the UI re-rendered
// |--🚦🔴----⚠️---🚦🟢-------1-2-3-4-5-6-7-1----------💥 // | | |
// // |--🚦🔴----⚠️---🚦🟢-------1-2-3-4-5-6-7-1----------💥
// where checking that "there are no pending requests" falls in the false positive case where //
// there are no pending requests because no one started at all. // where checking that "there are no pending requests" falls in the false positive case where
// // there are no pending requests because no one started at all.
// The check runs every millisecond to be 100% sure that no request can escape (ex. because of a //
// super fast server). A false-negative case represented here // The check runs every millisecond to be 100% sure that no request can escape (ex. because of a
// // super fast server). A false-negative case represented here
// requests start requests end check check test failure, no first request caught //
// | | | | | | | // requests start requests end check check test failure, no first request caught
// |--🚦🔴--1-2-3-4-5-6-7-1-2-3-4-5-6-7--⚠️------------------⚠️------------------💥 // | | | | | | |
cy.waitUntil(() => pendingRequests.size > 0, { // |--🚦🔴--1-2-3-4-5-6-7-1-2-3-4-5-6-7--⚠️------------------⚠️------------------💥
timeout: 5000, // 5 seconds is the default Cypress wait for a request to start cy.waitUntil(() => pendingRequests.size > 0, {
interval: 1, timeout: 5000, // 5 seconds is the default Cypress wait for a request to start
errorMsg: 'No first request caught', interval: 1,
}); errorMsg: 'No first request caught',
});
Cypress.log({ message: '*--- Waiting for all the requests to start*' });
Cypress.log({ message: '*--- Waiting for all the requests to start*' });
// Let pass some time to collect all the requests. Otherwise, it could detect that the first
// request complete and go on with the test, even if another one will be performed in a while. // Let pass some time to collect all the requests. Otherwise, it could detect that the first
// // request complete and go on with the test, even if another one will be performed in a while.
// This fixed wait protects from the following timeline //
// // This fixed wait protects from the following timeline
// 1st request start first request end other requests start test failure, the requests got the UI re-rendered //
// | | | | // 1st request start first request end other requests start test failure, the requests got the UI re-rendered
// |--🚦🔴---1---------------------1----🚦🟢----------------2-3-4-5-6-7-1----------💥 // | | | |
// // |--🚦🔴---1---------------------1----🚦🟢----------------2-3-4-5-6-7-1----------💥
// Obviously, it is an empiric waiting, that also slows down the test. //
cy.wait(500); // Obviously, it is an empiric waiting, that also slows down the test.
cy.wait(500);
Cypress.log({ message: '*--- Waiting for all the requests to be settled*' });
Cypress.log({ message: '*--- Waiting for all the requests to be settled*' });
cy.waitUntil(() => pendingRequests.size === 0, {
timeout: 30000, // 30 seconds is the default Cypress wait for the request to complete cy.waitUntil(() => pendingRequests.size === 0, {
errorMsg: 'Some requests are not settled yet', timeout: 30000, // 30 seconds is the default Cypress wait for the request to complete
}).then(() => { errorMsg: 'Some requests are not settled yet',
waitCompleted = true; }).then(() => {
}); waitCompleted = true;
} });
}

View File

@ -1,123 +1,128 @@
module.exports = { module.exports = {
"__version": "10.4.0", __version: '10.4.0',
"Actions with Transform": { 'Actions with Transform': {
"When the users create, and delete a Action with Transform, everything should work": { 'When the users create, and delete a Action with Transform, everything should work':
"Action payload": { {
"bodyToSnapshot": [ 'Action payload': {
{ bodyToSnapshot: [
"type": "set_custom_types", {
"args": { type: 'set_custom_types',
"scalars": [], args: {
"input_objects": [], scalars: [],
"objects": [ input_objects: [],
{ objects: [
"name": "LoginResponse",
"description": null,
"fields": [
{
"name": "accessToken",
"type": "String!",
"description": null
}
]
}
],
"enums": []
}
},
{
"type": "create_action",
"args": {
"name": "login",
"definition": {
"arguments": [
{ {
"name": "username", name: 'LoginResponse',
"type": "String!", description: null,
"description": null fields: [
{
name: 'accessToken',
type: 'String!',
description: null,
},
],
}, },
{
"name": "password",
"type": "String!",
"description": null
}
], ],
"kind": "synchronous", enums: [],
"output_type": "LoginResponse",
"handler": "https://hasura-actions-demo.glitch.me",
"type": "mutation",
"headers": [],
"forward_client_headers": false,
"timeout": null,
"request_transform": {
"version": 2,
"template_engine": "Kriti",
"method": "POST",
"url": "{{$base_url}}/{{$body.action.name}}",
"query_params": {
"id": "5",
"name": "{{$body.action.name}}"
},
"body": {
"action": "transform",
"template": "{\n \"userInfo\": {\n \"name\": {{$body.input.username}},\n \"password\": {{$body.input.password}},\n \"type\": {{$body.action.name}}\n \n }\n}"
}
},
"response_transform": {
"version": 2,
"body": {
"action": "transform",
"template": "{\n \"userInfo\": {\n \"name\": {{$body.input.username}},\n \"password\": {{$body.input.password}},\n \"type\": {{$body.action.name}}\n \n }\n}"
},
"template_engine": "Kriti"
}
}, },
"comment": null
}
}
]
},
"Action metadata": {
"name": "login",
"definition": {
"handler": "https://hasura-actions-demo.glitch.me",
"output_type": "LoginResponse",
"arguments": [
{
"name": "username",
"type": "String!"
}, },
{ {
"name": "password", type: 'create_action',
"type": "String!" args: {
} name: 'login',
definition: {
arguments: [
{
name: 'username',
type: 'String!',
description: null,
},
{
name: 'password',
type: 'String!',
description: null,
},
],
kind: 'synchronous',
output_type: 'LoginResponse',
handler: 'https://hasura-actions-demo.glitch.me',
type: 'mutation',
headers: [],
forward_client_headers: false,
timeout: null,
request_transform: {
version: 2,
template_engine: 'Kriti',
method: 'POST',
url: '{{$base_url}}/{{$body.action.name}}',
query_params: {
id: '5',
name: '{{$body.action.name}}',
},
body: {
action: 'transform',
template:
'{\n "userInfo": {\n "name": {{$body.input.username}},\n "password": {{$body.input.password}},\n "type": {{$body.action.name}}\n \n }\n}',
},
},
response_transform: {
version: 2,
body: {
action: 'transform',
template:
'{\n "userInfo": {\n "name": {{$body.input.username}},\n "password": {{$body.input.password}},\n "type": {{$body.action.name}}\n \n }\n}',
},
template_engine: 'Kriti',
},
},
comment: null,
},
},
], ],
"request_transform": { },
"body": { 'Action metadata': {
"action": "transform", name: 'login',
"template": "{\n \"userInfo\": {\n \"name\": {{$body.input.username}},\n \"password\": {{$body.input.password}},\n \"type\": {{$body.action.name}}\n \n }\n}" definition: {
handler: 'https://hasura-actions-demo.glitch.me',
output_type: 'LoginResponse',
arguments: [
{
name: 'username',
type: 'String!',
},
{
name: 'password',
type: 'String!',
},
],
request_transform: {
body: {
action: 'transform',
template:
'{\n "userInfo": {\n "name": {{$body.input.username}},\n "password": {{$body.input.password}},\n "type": {{$body.action.name}}\n \n }\n}',
},
method: 'POST',
query_params: {
id: '5',
name: '{{$body.action.name}}',
},
template_engine: 'Kriti',
url: '{{$base_url}}/{{$body.action.name}}',
version: 2,
}, },
"method": "POST", response_transform: {
"query_params": { body: {
"id": "5", action: 'transform',
"name": "{{$body.action.name}}" template:
'{\n "userInfo": {\n "name": {{$body.input.username}},\n "password": {{$body.input.password}},\n "type": {{$body.action.name}}\n \n }\n}',
},
template_engine: 'Kriti',
version: 2,
}, },
"template_engine": "Kriti", type: 'mutation',
"url": "{{$base_url}}/{{$body.action.name}}", kind: 'synchronous',
"version": 2
}, },
"response_transform": { },
"body": { },
"action": "transform", },
"template": "{\n \"userInfo\": {\n \"name\": {{$body.input.username}},\n \"password\": {{$body.input.password}},\n \"type\": {{$body.action.name}}\n \n }\n}" };
},
"template_engine": "Kriti",
"version": 2
},
"type": "mutation",
"kind": "synchronous"
}
}
}
}
}

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -92,7 +92,9 @@ export const failCTWrongDefaultValue = () => {
}; };
export const passCT = () => { export const passCT = () => {
cy.get(getElementFromAlias('frequently-used-columns')).first().should('exist'); cy.get(getElementFromAlias('frequently-used-columns'))
.first()
.should('exist');
// Set second column // Set second column
cy.get(getElementFromAlias('column-1')).clear().type(getColName(1)); cy.get(getElementFromAlias('column-1')).clear().type(getColName(1));
tableColumnTypeSelector('col-type-1'); tableColumnTypeSelector('col-type-1');

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -7,9 +7,7 @@ export const toggleOnMigrationMode = () => {
}).then(response => { }).then(response => {
if (response.body.migration_mode === 'false') { if (response.body.migration_mode === 'false') {
// Go to migrations section // Go to migrations section
cy.get('a') cy.get('a').contains('Migrations').click();
.contains('Migrations')
.click();
cy.wait(3000); cy.wait(3000);
// Toggle Migration mode // Toggle Migration mode
cy.get('[class=react-toggle-track]').click(); cy.get('[class=react-toggle-track]').click();
@ -25,9 +23,7 @@ export const toggleOffMigrationMode = () => {
}).then(response => { }).then(response => {
if (response.body.migration_mode === 'true') { if (response.body.migration_mode === 'true') {
// Go to migrations section // Go to migrations section
cy.get('a') cy.get('a').contains('Migrations').click();
.contains('Migrations')
.click();
cy.wait(3000); cy.wait(3000);
// Toggle Migration mode // Toggle Migration mode
cy.get('[class=react-toggle-track]').click(); cy.get('[class=react-toggle-track]').click();

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -208,7 +208,9 @@ export const Addcolumnname = (name: string) => {
}; };
export const passMTAddColumn = () => { export const passMTAddColumn = () => {
cy.get(getElementFromAlias('frequently-used-columns')).first().should('exist'); cy.get(getElementFromAlias('frequently-used-columns'))
.first()
.should('exist');
cy.get(getElementFromAlias('column-name')).type('{selectall}{del}'); cy.get(getElementFromAlias('column-name')).type('{selectall}{del}');
cy.get(getElementFromAlias('column-name')).type(getColName(0)); cy.get(getElementFromAlias('column-name')).type(getColName(0));
tableColumnTypeSelector('col-type-0'); tableColumnTypeSelector('col-type-0');

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -47,7 +47,10 @@ export const passPTCreateTable = () => {
cy.wait(7000); cy.wait(7000);
cy.url().should( cy.url().should(
'eq', 'eq',
`${baseUrl}/data/default/schema/public/tables/${getTableName(0, testName)}/modify` `${baseUrl}/data/default/schema/public/tables/${getTableName(
0,
testName
)}/modify`
); );
}; };
@ -107,9 +110,7 @@ export const passPVDeleteView = () => {
// Delete view // Delete view
setPromptValue(getTableName(1, testName)); setPromptValue(getTableName(1, testName));
cy.get(getElementFromAlias('delete-view')).click(); cy.get(getElementFromAlias('delete-view')).click();
cy.window() cy.window().its('prompt').should('be.called');
.its('prompt')
.should('be.called');
cy.wait(7000); cy.wait(7000);
}; };
@ -122,9 +123,7 @@ export const passPTDeleteTable = () => {
// Delete table // Delete table
setPromptValue(getTableName(0, testName)); setPromptValue(getTableName(0, testName));
cy.get(getElementFromAlias('delete-table')).click(); cy.get(getElementFromAlias('delete-table')).click();
cy.window() cy.window().its('prompt').should('be.called');
.its('prompt')
.should('be.called');
cy.wait(7000); cy.wait(7000);
}; };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -25,26 +25,16 @@ export const checkCreateRemoteSchemaRoute = () => {
}; };
export const failRSWithInvalidRemoteUrl = () => { export const failRSWithInvalidRemoteUrl = () => {
cy.get('[data-testid=name]').type(getRemoteSchemaName(0, testName));
cy.get('[data-testid=url]').type(getInvalidRemoteSchemaUrl());
cy.get('[data-testid=name]').type(
getRemoteSchemaName(0, testName)
);
cy.get('[data-testid=url]').type(
getInvalidRemoteSchemaUrl()
);
cy.get('[data-testid=submit]').click(); cy.get('[data-testid=submit]').click();
cy.get('.notifications-wrapper').contains('Error'); cy.get('.notifications-wrapper').contains('Error');
}; };
export const createSimpleRemoteSchema = () => { export const createSimpleRemoteSchema = () => {
cy.get('[data-testid=name]') cy.get('[data-testid=name]').clear().type(getRemoteSchemaName(1, testName));
.clear() cy.get('[data-testid=url]').clear().type(getRemoteGraphQLURL());
.type(getRemoteSchemaName(1, testName));
cy.get('[data-testid=url]')
.clear()
.type(getRemoteGraphQLURL());
cy.get('[data-testid=submit]').click(); cy.get('[data-testid=submit]').click();
cy.get('.notifications-wrapper').contains('Success'); cy.get('.notifications-wrapper').contains('Success');
validateRS(getRemoteSchemaName(1, testName), ResultType.SUCCESS); validateRS(getRemoteSchemaName(1, testName), ResultType.SUCCESS);
@ -59,12 +49,8 @@ export const createSimpleRemoteSchema = () => {
export const failRSDuplicateSchemaName = () => { export const failRSDuplicateSchemaName = () => {
cy.visit('remote-schemas/manage/add'); cy.visit('remote-schemas/manage/add');
cy.get('[data-testid=name]') cy.get('[data-testid=name]').clear().type(getRemoteSchemaName(1, testName));
.clear() cy.get('[data-testid=url]').clear().type(getRemoteGraphQLURL());
.type(getRemoteSchemaName(1, testName));
cy.get('[data-testid=url]')
.clear()
.type(getRemoteGraphQLURL());
cy.get('[data-testid=submit]').click(); cy.get('[data-testid=submit]').click();
cy.get('.notifications-wrapper').contains('Error'); cy.get('.notifications-wrapper').contains('Error');
cy.url().should('eq', `${baseUrl}/remote-schemas/manage/add`); cy.url().should('eq', `${baseUrl}/remote-schemas/manage/add`);
@ -72,12 +58,8 @@ export const failRSDuplicateSchemaName = () => {
export const failRSDuplicateSchemaNodes = () => { export const failRSDuplicateSchemaNodes = () => {
cy.visit('remote-schemas/manage/add'); cy.visit('remote-schemas/manage/add');
cy.get('[data-testid=name]') cy.get('[data-testid=name]').clear().type(getRemoteSchemaName(2, testName));
.clear() cy.get('[data-testid=url]').clear().type(getRemoteGraphQLURL());
.type(getRemoteSchemaName(2, testName));
cy.get('[data-testid=url]')
.clear()
.type(getRemoteGraphQLURL());
cy.get('[data-testid=submit]').click(); cy.get('[data-testid=submit]').click();
cy.get('.notifications-wrapper').contains('Error'); cy.get('.notifications-wrapper').contains('Error');
cy.url().should('eq', `${baseUrl}/remote-schemas/manage/add`); cy.url().should('eq', `${baseUrl}/remote-schemas/manage/add`);
@ -112,15 +94,9 @@ export const deleteSimpleRemoteSchema = () => {
export const failWithRemoteSchemaEnvUrl = () => { export const failWithRemoteSchemaEnvUrl = () => {
cy.visit('remote-schemas/manage/add'); cy.visit('remote-schemas/manage/add');
cy.get('[data-testid=name]') cy.get('[data-testid=name]').clear().type(getRemoteSchemaName(3, testName));
.clear() cy.get('[name="url.type"]').select('from_env');
.type(getRemoteSchemaName(3, testName)); cy.get('[data-testid=url]').clear().type(getRemoteGraphQLURLFromEnv());
cy.get(
'[name="url.type"]'
).select('from_env');
cy.get('[data-testid=url]')
.clear()
.type(getRemoteGraphQLURLFromEnv());
cy.get('[data-testid=submit]').click(); cy.get('[data-testid=submit]').click();
cy.get('.notifications-wrapper').contains('Error'); cy.get('.notifications-wrapper').contains('Error');
cy.url().should('eq', `${baseUrl}/remote-schemas/manage/add`); cy.url().should('eq', `${baseUrl}/remote-schemas/manage/add`);
@ -128,38 +104,22 @@ export const failWithRemoteSchemaEnvUrl = () => {
export const failWithRemoteSchemaEnvHeader = () => { export const failWithRemoteSchemaEnvHeader = () => {
cy.visit('remote-schemas/manage/add'); cy.visit('remote-schemas/manage/add');
cy.get('[data-testid=name]') cy.get('[data-testid=name]').clear().type(getRemoteSchemaName(3, testName));
.clear() cy.get('[data-testid=url]').clear().type(getRemoteGraphQLURL());
.type(getRemoteSchemaName(3, testName));
cy.get('[data-testid=url]')
.clear()
.type(getRemoteGraphQLURL());
cy.get('[data-testid="add-header') cy.get('[data-testid="add-header').click();
.click()
cy.get('[name="headers[0].name"]') cy.get('[name="headers[0].name"]').clear().type('sampleHeader1');
.clear()
.type('sampleHeader1');
cy.get('[name="headers[0].value"]') cy.get('[name="headers[0].value"]').clear().type('sampleHeaderValue1');
.clear()
.type('sampleHeaderValue1');
cy.get('[data-testid="add-header') cy.get('[data-testid="add-header').click();
.click()
cy.get('[name="headers[1].name"]') cy.get('[name="headers[1].name"]').clear().type('sampleHeader2');
.clear()
.type('sampleHeader2');
cy.get( cy.get('[name="headers[1].type"]').select('from_env');
'[name="headers[1].type"]'
).select("from_env");
cy.get('[name="headers[1].value"]') cy.get('[name="headers[1].value"]').clear().type('SAMPLE_ENV_HEADER');
.clear()
.type('SAMPLE_ENV_HEADER');
cy.get('[data-testid=submit]').click(); cy.get('[data-testid=submit]').click();
cy.get('.notifications-wrapper').contains('Error'); cy.get('.notifications-wrapper').contains('Error');
@ -168,34 +128,20 @@ export const failWithRemoteSchemaEnvHeader = () => {
export const passWithRemoteSchemaHeader = () => { export const passWithRemoteSchemaHeader = () => {
cy.visit('remote-schemas/manage/add'); cy.visit('remote-schemas/manage/add');
cy.get('[data-testid=name]') cy.get('[data-testid=name]').clear().type(getRemoteSchemaName(3, testName));
.clear() cy.get('[data-testid=url]').clear().type(getRemoteGraphQLURL());
.type(getRemoteSchemaName(3, testName));
cy.get('[data-testid=url]')
.clear()
.type(getRemoteGraphQLURL());
cy.get('[data-testid="add-header') cy.get('[data-testid="add-header').click();
.click()
cy.get('[name="headers[0].name"]') cy.get('[name="headers[0].name"]').clear().type('sampleHeader1');
.clear()
.type('sampleHeader1');
cy.get('[name="headers[0].value"]') cy.get('[name="headers[0].value"]').clear().type('sampleHeaderValue1');
.clear()
.type('sampleHeaderValue1');
cy.get('[data-testid="add-header') cy.get('[data-testid="add-header').click();
.click()
cy.get('[name="headers[1].name"]') cy.get('[name="headers[1].name"]').clear().type('sampleHeader2');
.clear()
.type('sampleHeader2');
cy.get('[name="headers[1].value"]') cy.get('[name="headers[1].value"]').clear().type('sampleHeaderValue2');
.clear()
.type('sampleHeaderValue2');
cy.get('[data-testid=submit]').click(); cy.get('[data-testid=submit]').click();
cy.get('.notifications-wrapper').contains('Success'); cy.get('.notifications-wrapper').contains('Success');
@ -240,7 +186,7 @@ export const createSimpleRemoteSchemaPermission = () => {
cy.get(getElementFromAlias('save-remote-schema-permissions')).click({ cy.get(getElementFromAlias('save-remote-schema-permissions')).click({
force: true, force: true,
}); });
cy.get('.notifications-wrapper').contains('saved') cy.get('.notifications-wrapper').contains('saved');
cy.url().should( cy.url().should(
'eq', 'eq',
`${baseUrl}/remote-schemas/manage/${getRemoteSchemaName( `${baseUrl}/remote-schemas/manage/${getRemoteSchemaName(

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -14,5 +14,5 @@ export const config: ServerConfig = {
claims_namespace: '', claims_namespace: '',
claims_format: '', claims_format: '',
}, },
is_prometheus_metrics_enabled: false is_prometheus_metrics_enabled: false,
}; };

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -18,7 +18,7 @@ export const setPromptValue = (value: string | null) => {
}; };
// This is works as setPromptValue with no unnecessary waiting // This is works as setPromptValue with no unnecessary waiting
export const setPromptWithCb = (value: string | null, cb: () => void) => { export const setPromptWithCb = (value: string | null, cb: () => void) => {
cy.window().then(win => { cy.window().then(win => {
cy.stub(win, 'prompt').returns(value); cy.stub(win, 'prompt').returns(value);
cb(); cb();

View File

@ -5,8 +5,7 @@ export const baseUrl = Cypress.config('baseUrl');
export const getRemoteSchemaName = (i: number, schemaName: string) => export const getRemoteSchemaName = (i: number, schemaName: string) =>
`test-remote-schema-${schemaName}-${i}`; `test-remote-schema-${schemaName}-${i}`;
export const getRemoteGraphQLURL = () => export const getRemoteGraphQLURL = () => 'https://graphql-pokemon2.vercel.app/';
'https://graphql-pokemon2.vercel.app/';
export const getRemoteGraphQLURLFromEnv = () => 'GRAPHQL_URL'; export const getRemoteGraphQLURLFromEnv = () => 'GRAPHQL_URL';

View File

@ -13,9 +13,10 @@ export const toggleRequestTransformSection = () => {
}; };
export const clearRequestUrl = () => { export const clearRequestUrl = () => {
cy.get( cy.get(getElementFromAlias('transform-requestUrl')).type(
getElementFromAlias('transform-requestUrl') '{selectall}{backspace}',
).type('{selectall}{backspace}', { force: true }); { force: true }
);
}; };
export const typeIntoRequestUrl = (content: string) => { export const typeIntoRequestUrl = (content: string) => {

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
"__version": "10.4.0" __version: '10.4.0',
} };

View File

@ -29,9 +29,7 @@
"output": "common" "output": "common"
} }
], ],
"styles": [ "styles": ["apps/console-ce/src/css/tailwind.css"],
"apps/console-ce/src/css/tailwind.css"
],
"scripts": [], "scripts": [],
"webpackConfig": "custom-webpack.config.js", "webpackConfig": "custom-webpack.config.js",
"postcssConfig": "apps/console-ce/postcss.config.js" "postcssConfig": "apps/console-ce/postcss.config.js"

View File

@ -8,10 +8,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" type="image/x-icon" href="favicon.ico" /> <link rel="icon" type="image/x-icon" href="favicon.ico" />
<script> <script>
// Needed since if the env var is not defined, it won't be replaced with undefined but keep as the string // Needed since if the env var is not defined, it won't be replaced with undefined but keep as the string
const getEnv = (value) => value.startsWith('%NX') ? undefined : value; const getEnv = value => (value.startsWith('%NX') ? undefined : value);
const getEnvAsBool = (value) => Boolean(getEnv(value)) const getEnvAsBool = value => Boolean(getEnv(value));
const serverEnvVars = { const serverEnvVars = {
dataApiUrl: getEnv('%NX_DATA_API_URL%'), dataApiUrl: getEnv('%NX_DATA_API_URL%'),
@ -30,7 +29,7 @@
tenantID: getEnv('%NX_HASURA_CLOUD_TENANT_ID%') || '', tenantID: getEnv('%NX_HASURA_CLOUD_TENANT_ID%') || '',
projectID: getEnv('%NX_HASURA_CLOUD_PROJECT_ID%') || '', projectID: getEnv('%NX_HASURA_CLOUD_PROJECT_ID%') || '',
cloudRootDomain: getEnv('%NX_HASURA_CLOUD_ROOT_DOMAIN%'), cloudRootDomain: getEnv('%NX_HASURA_CLOUD_ROOT_DOMAIN%'),
consoleType: getEnv('%NX_HASURA_CONSOLE_TYPE%') consoleType: getEnv('%NX_HASURA_CONSOLE_TYPE%'),
}; };
const cliEnvVars = { const cliEnvVars = {
@ -52,29 +51,28 @@
}; };
const envVars = const envVars =
getEnv('%NX_CONSOLE_MODE%') === 'cli' ? cliEnvVars : serverEnvVars; getEnv('%NX_CONSOLE_MODE%') === 'cli' ? cliEnvVars : serverEnvVars;
window.__env = envVars; window.__env = envVars;
</script> </script>
</head> </head>
<body> <body>
<style> <style>
.content { .content {
display: 'none'; display: 'none';
opacity: 0; opacity: 0;
transition: opacity 0.2s linear; transition: opacity 0.2s linear;
} }
.content.show { .content.show {
display: 'block'; display: 'block';
opacity: 1; opacity: 1;
transition: opacity 0.2s linear; transition: opacity 0.2s linear;
} }
</style> </style>
<div id="loading"> <div id="loading">
<div <div
class="page-loading" class="page-loading"
style=" style="
min-height: 100vh; min-height: 100vh;
width: 100%; width: 100%;
display: flex; display: flex;
@ -82,12 +80,12 @@
font-family: sans-serif; font-family: sans-serif;
justify-content: center; justify-content: center;
" "
> >
<span class="" style="font-size: 2em; margin-top: -3em; color: #848484"> <span class="" style="font-size: 2em; margin-top: -3em; color: #848484">
Loading... Loading...
</span> </span>
</div>
</div> </div>
</div> <div id="content" class="content"></div>
<div id="content" class="content"></div>
</body> </body>
</html> </html>

View File

@ -28,9 +28,7 @@
"output": "common" "output": "common"
} }
], ],
"styles": [ "styles": ["apps/console-ee/src/css/tailwind.css"],
"apps/console-ee/src/css/tailwind.css"
],
"scripts": [], "scripts": [],
"webpackConfig": "custom-webpack.config.js", "webpackConfig": "custom-webpack.config.js",
"postcssConfig": "apps/console-ee/postcss.config.js" "postcssConfig": "apps/console-ee/postcss.config.js"

View File

@ -10,8 +10,8 @@
<script src="https://graphql-engine-cdn.hasura.io/pro-console/assets/common/js/lottie.min.js"></script> <script src="https://graphql-engine-cdn.hasura.io/pro-console/assets/common/js/lottie.min.js"></script>
<script> <script>
// Needed since if the env var is not defined, it won't be replaced with undefined but keep as the string // Needed since if the env var is not defined, it won't be replaced with undefined but keep as the string
const getEnv = (value) => (value.startsWith('%NX') ? undefined : value); const getEnv = value => (value.startsWith('%NX') ? undefined : value);
const getEnvAsBool = (value) => Boolean(getEnv(value)); const getEnvAsBool = value => Boolean(getEnv(value));
const serverEnvVars = { const serverEnvVars = {
dataApiUrl: getEnv('%NX_DATA_API_URL%'), dataApiUrl: getEnv('%NX_DATA_API_URL%'),

View File

@ -102,7 +102,10 @@
"**/__tests__/**/*.[jt]s?(x)", "**/__tests__/**/*.[jt]s?(x)",
"**/?(*.)+(spec|test).[jt]s?(x)" "**/?(*.)+(spec|test).[jt]s?(x)"
], ],
"extends": ["plugin:testing-library/react", "plugin:jest-dom/recommended"], "extends": [
"plugin:testing-library/react",
"plugin:jest-dom/recommended"
],
"rules": { "rules": {
"testing-library/no-unnecessary-act": "warn", "testing-library/no-unnecessary-act": "warn",
"testing-library/prefer-query-by-disappearance": "warn", "testing-library/prefer-query-by-disappearance": "warn",

View File

@ -3,7 +3,6 @@
dataApiUrl: 'http://localhost:8080', dataApiUrl: 'http://localhost:8080',
apiHost: 'http://localhost', apiHost: 'http://localhost',
apiPort: '8080', apiPort: '8080',
nodeEnv: 'development' nodeEnv: 'development',
}; };
</script> </script>

View File

@ -13,7 +13,7 @@ import '../src/lib/components/Common/Common.module.scss';
const channel = addons.getChannel(); const channel = addons.getChannel();
initialize(); initialize();
const DocsContainerElement = (props) => { const DocsContainerElement = props => {
// Sync Docs dark mode with Storybook Manager // Sync Docs dark mode with Storybook Manager
const [isDark, setDark] = React.useState(); const [isDark, setDark] = React.useState();
@ -28,8 +28,8 @@ const DocsContainerElement = (props) => {
{...props} {...props}
context={{ context={{
...props.context, ...props.context,
storyById: (id) => { storyById: id => {
return produce(props.context.storyById(id), (draft) => { return produce(props.context.storyById(id), draft => {
draft.parameters.docs.theme = isDark ? theme.dark : theme.light; draft.parameters.docs.theme = isDark ? theme.dark : theme.light;
}); });
}, },
@ -67,7 +67,7 @@ export const parameters = {
export const decorators = [ export const decorators = [
(fn, c) => <Provider store={store}>{fn(c)}</Provider>, (fn, c) => <Provider store={store}>{fn(c)}</Provider>,
mswDecorator, mswDecorator,
(Story) => { Story => {
document.body.classList.add('hasura-tailwind-on'); document.body.classList.add('hasura-tailwind-on');
return <div className={'bg-legacybg'}>{Story()}</div>; return <div className={'bg-legacybg'}>{Story()}</div>;
}, },

View File

@ -1,4 +1,4 @@
@import "../Common/Common.module"; @import '../Common/Common.module';
:global { :global {
@keyframes react-progress-spinner { @keyframes react-progress-spinner {

View File

@ -1565,7 +1565,7 @@ code {
margin-bottom: 2px; margin-bottom: 2px;
align-self: flex-end; align-self: flex-end;
padding-top: 8px; padding-top: 8px;
border-color:rgba(0, 0, 0, 0.1); border-color: rgba(0, 0, 0, 0.1);
border-top-width: 1px; border-top-width: 1px;
position: sticky; position: sticky;
bottom: 0; bottom: 0;

View File

@ -42,234 +42,234 @@ type ConfigureTransformationProps = {
responseBodyOnChange?: (responseBody: ResponseTransformStateBody) => void; responseBodyOnChange?: (responseBody: ResponseTransformStateBody) => void;
}; };
const ConfigureTransformation: React.FC<ConfigureTransformationProps> = const ConfigureTransformation: React.FC<
props => { ConfigureTransformationProps
const { > = props => {
transformationType, const {
requestTransfromState, transformationType,
responseTransformState, requestTransfromState,
resetSampleInput, responseTransformState,
envVarsOnChange, resetSampleInput,
sessionVarsOnChange, envVarsOnChange,
requestMethodOnChange, sessionVarsOnChange,
requestUrlOnChange, requestMethodOnChange,
requestQueryParamsOnChange, requestUrlOnChange,
requestAddHeadersOnChange, requestQueryParamsOnChange,
requestBodyOnChange, requestAddHeadersOnChange,
requestSampleInputOnChange, requestBodyOnChange,
requestUrlTransformOnChange, requestSampleInputOnChange,
requestPayloadTransformOnChange, requestUrlTransformOnChange,
responsePayloadTransformOnChange, requestPayloadTransformOnChange,
responseBodyOnChange, responsePayloadTransformOnChange,
} = props; responseBodyOnChange,
const { } = props;
envVars, const {
sessionVars, envVars,
requestMethod, sessionVars,
requestUrl, requestMethod,
requestUrlError, requestUrl,
requestUrlPreview, requestUrlError,
requestQueryParams, requestUrlPreview,
requestAddHeaders, requestQueryParams,
requestBody, requestAddHeaders,
requestBodyError, requestBody,
requestSampleInput, requestBodyError,
requestTransformedBody, requestSampleInput,
isRequestUrlTransform, requestTransformedBody,
isRequestPayloadTransform, isRequestUrlTransform,
} = requestTransfromState; isRequestPayloadTransform,
const [isContextAreaActive, toggleContextArea] = useState<boolean>(false); } = requestTransfromState;
const [isContextAreaActive, toggleContextArea] = useState<boolean>(false);
const contextAreaText = isContextAreaActive const contextAreaText = isContextAreaActive
? `Hide Sample Context` ? `Hide Sample Context`
: `Show Sample Context`; : `Show Sample Context`;
const requestUrlTransformText = isRequestUrlTransform const requestUrlTransformText = isRequestUrlTransform
? `Remove Request Options Transform` ? `Remove Request Options Transform`
: `Add Request Options Transform`; : `Add Request Options Transform`;
const requestPayloadTransformText = isRequestPayloadTransform const requestPayloadTransformText = isRequestPayloadTransform
? `Remove Payload Transform` ? `Remove Payload Transform`
: `Add Payload Transform`; : `Add Payload Transform`;
const responsePayloadTransformText = const responsePayloadTransformText =
responseTransformState?.isResponsePayloadTransform responseTransformState?.isResponsePayloadTransform
? `Remove Response Transform` ? `Remove Response Transform`
: `Add Response Transform`; : `Add Response Transform`;
return ( return (
<> <>
<h2 className="text-lg font-semibold mb-sm flex items-center"> <h2 className="text-lg font-semibold mb-sm flex items-center">
Configure REST Connectors Configure REST Connectors
</h2> </h2>
<div className="mb-lg"> <div className="mb-lg">
<label className="block text-gray-600 font-medium mb-xs"> <label className="block text-gray-600 font-medium mb-xs">
Sample Context Sample Context
</label> </label>
<p className="text-sm text-gray-600 mb-sm"> <p className="text-sm text-gray-600 mb-sm">
Add sample env vars and session vars for testing the connector Add sample env vars and session vars for testing the connector
</p> </p>
<Analytics <Analytics
name={ name={
isContextAreaActive isContextAreaActive
? 'actions-tab-hide-sample-context-button' ? 'actions-tab-hide-sample-context-button'
: 'actions-tab-show-sample-context-button' : 'actions-tab-show-sample-context-button'
} }
passHtmlAttributesToChildren passHtmlAttributesToChildren
>
<Button
color="white"
size="sm"
data-test="toggle-context-area"
onClick={() => {
toggleContextArea(!isContextAreaActive);
}}
> >
<Button {!isContextAreaActive ? <AddIcon /> : null}
color="white" {contextAreaText}
size="sm" </Button>
data-test="toggle-context-area" </Analytics>
onClick={() => {
toggleContextArea(!isContextAreaActive);
}}
>
{!isContextAreaActive ? <AddIcon /> : null}
{contextAreaText}
</Button>
</Analytics>
{isContextAreaActive ? ( {isContextAreaActive ? (
<SampleContextTransforms <SampleContextTransforms
transformationType={transformationType} transformationType={transformationType}
envVars={envVars} envVars={envVars}
sessionVars={sessionVars} sessionVars={sessionVars}
envVarsOnChange={envVarsOnChange} envVarsOnChange={envVarsOnChange}
sessionVarsOnChange={sessionVarsOnChange} sessionVarsOnChange={sessionVarsOnChange}
/> />
) : null} ) : null}
</div> </div>
<div className="mb-lg"> <div className="mb-lg">
<label className="block text-gray-600 font-medium mb-xs"> <label className="block text-gray-600 font-medium mb-xs">
Change Request Options Change Request Options
</label> </label>
<p className="text-sm text-gray-600 mb-sm"> <p className="text-sm text-gray-600 mb-sm">
Change the method and URL to adapt to your API&apos;s expected Change the method and URL to adapt to your API&apos;s expected format.
format. </p>
</p> <Analytics
<Analytics name={
name={ isRequestUrlTransform
isRequestUrlTransform ? 'actions-tab-hide-request-transform-button'
? 'actions-tab-hide-request-transform-button' : 'actions-tab-show-request-transform-button'
: 'actions-tab-show-request-transform-button' }
} passHtmlAttributesToChildren
passHtmlAttributesToChildren >
<Button
size="sm"
icon={!isRequestUrlTransform ? <AddIcon /> : undefined}
iconPosition="start"
data-test="toggle-request-transform"
onClick={() => {
requestUrlTransformOnChange(!isRequestUrlTransform);
resetSampleInput();
}}
> >
<Button {requestUrlTransformText}
size="sm" </Button>
icon={!isRequestUrlTransform ? <AddIcon /> : undefined} </Analytics>
iconPosition="start" {isRequestUrlTransform ? (
data-test="toggle-request-transform" <RequestOptionsTransforms
onClick={() => { requestMethod={requestMethod}
requestUrlTransformOnChange(!isRequestUrlTransform); requestUrl={requestUrl}
resetSampleInput(); requestUrlError={requestUrlError}
}} requestUrlPreview={requestUrlPreview}
> requestQueryParams={requestQueryParams}
{requestUrlTransformText} requestAddHeaders={requestAddHeaders}
</Button> requestMethodOnChange={requestMethodOnChange}
</Analytics> requestUrlOnChange={requestUrlOnChange}
{isRequestUrlTransform ? ( requestQueryParamsOnChange={requestQueryParamsOnChange}
<RequestOptionsTransforms requestAddHeadersOnChange={requestAddHeadersOnChange}
requestMethod={requestMethod} />
requestUrl={requestUrl} ) : null}
requestUrlError={requestUrlError} </div>
requestUrlPreview={requestUrlPreview}
requestQueryParams={requestQueryParams}
requestAddHeaders={requestAddHeaders}
requestMethodOnChange={requestMethodOnChange}
requestUrlOnChange={requestUrlOnChange}
requestQueryParamsOnChange={requestQueryParamsOnChange}
requestAddHeadersOnChange={requestAddHeadersOnChange}
/>
) : null}
</div>
<div className="mb-lg">
<label className="block text-gray-600 font-medium mb-xs">
Change Payload
</label>
<p className="text-sm text-gray-600 mb-sm">
Change the payload to adapt to your API&apos;s expected format.
</p>
<Analytics
name={
isRequestPayloadTransform
? 'actions-tab-hide-payload-transform-button'
: 'actions-tab-show-payload-transform-button'
}
passHtmlAttributesToChildren
>
<Button
color="white"
size="sm"
data-test="toggle-payload-transform"
onClick={() => {
requestPayloadTransformOnChange(!isRequestPayloadTransform);
resetSampleInput();
}}
>
{!isRequestPayloadTransform ? <AddIcon /> : null}
{requestPayloadTransformText}
</Button>
</Analytics>
{isRequestPayloadTransform ? (
<PayloadOptionsTransforms
transformationType={transformationType}
requestBody={requestBody}
requestBodyError={requestBodyError}
requestSampleInput={requestSampleInput}
requestTransformedBody={requestTransformedBody}
resetSampleInput={resetSampleInput}
requestBodyOnChange={requestBodyOnChange}
requestSampleInputOnChange={requestSampleInputOnChange}
/>
) : null}
</div>
{responseTransformState && responsePayloadTransformOnChange && (
<div className="mb-lg"> <div className="mb-lg">
<label className="block text-gray-600 font-medium mb-xs"> <label className="block text-gray-600 font-medium mb-xs">
Change Payload Change Response
</label> </label>
<p className="text-sm text-gray-600 mb-sm"> <p className="text-sm text-gray-600 mb-sm">
Change the payload to adapt to your API&apos;s expected format. Change the incoming response to adapt to your declared types.
</p> </p>
<Analytics <Analytics
name={ name={
isRequestPayloadTransform isRequestPayloadTransform
? 'actions-tab-hide-payload-transform-button' ? 'actions-tab-hide-response-transform-button'
: 'actions-tab-show-payload-transform-button' : 'actions-tab-show-response-transform-button'
} }
passHtmlAttributesToChildren passHtmlAttributesToChildren
> >
<Button <Button
color="white" color="white"
size="sm" size="sm"
data-test="toggle-payload-transform" data-test="toggle-response-transform"
onClick={() => { onClick={() => {
requestPayloadTransformOnChange(!isRequestPayloadTransform); responsePayloadTransformOnChange(
!responseTransformState.isResponsePayloadTransform
);
resetSampleInput(); resetSampleInput();
}} }}
> >
{!isRequestPayloadTransform ? <AddIcon /> : null} {!responseTransformState.isResponsePayloadTransform ? (
{requestPayloadTransformText} <AddIcon />
) : null}
{responsePayloadTransformText}
</Button> </Button>
</Analytics> </Analytics>
{isRequestPayloadTransform ? ( {responseTransformState.isResponsePayloadTransform &&
<PayloadOptionsTransforms responseBodyOnChange ? (
transformationType={transformationType} <ResponseTransforms
requestBody={requestBody} responseBody={responseTransformState.responseBody}
requestBodyError={requestBodyError} responseBodyOnChange={responseBodyOnChange}
requestSampleInput={requestSampleInput}
requestTransformedBody={requestTransformedBody}
resetSampleInput={resetSampleInput}
requestBodyOnChange={requestBodyOnChange}
requestSampleInputOnChange={requestSampleInputOnChange}
/> />
) : null} ) : null}
</div> </div>
{responseTransformState && responsePayloadTransformOnChange && ( )}
<div className="mb-lg"> </>
<label className="block text-gray-600 font-medium mb-xs"> );
Change Response };
</label>
<p className="text-sm text-gray-600 mb-sm">
Change the incoming response to adapt to your declared types.
</p>
<Analytics
name={
isRequestPayloadTransform
? 'actions-tab-hide-response-transform-button'
: 'actions-tab-show-response-transform-button'
}
passHtmlAttributesToChildren
>
<Button
color="white"
size="sm"
data-test="toggle-response-transform"
onClick={() => {
responsePayloadTransformOnChange(
!responseTransformState.isResponsePayloadTransform
);
resetSampleInput();
}}
>
{!responseTransformState.isResponsePayloadTransform ? (
<AddIcon />
) : null}
{responsePayloadTransformText}
</Button>
</Analytics>
{responseTransformState.isResponsePayloadTransform &&
responseBodyOnChange ? (
<ResponseTransforms
responseBody={responseTransformState.responseBody}
responseBodyOnChange={responseBodyOnChange}
/>
) : null}
</div>
)}
</>
);
};
export default ConfigureTransformation; export default ConfigureTransformation;

View File

@ -55,8 +55,9 @@ const CustomInputAutoSuggest: React.FC<CustomInputAutoSuggestProps> = ({
setSuggestions(getSuggestions(value)); setSuggestions(getSuggestions(value));
}; };
const getSuggestionValue: GetSuggestionValue<AutoSuggestOption> = const getSuggestionValue: GetSuggestionValue<
suggestion => suggestion.value; AutoSuggestOption
> = suggestion => suggestion.value;
const onSuggestionsClearRequested = () => { const onSuggestionsClearRequested = () => {
setSuggestions([]); setSuggestions([]);

View File

@ -9,7 +9,7 @@
z-index: 100; z-index: 100;
opacity: 0.3; opacity: 0.3;
&:hover { &:hover {
opacity: 1.0; opacity: 1;
} }
} }
@ -19,4 +19,4 @@
right: 28px; right: 28px;
z-index: 100; z-index: 100;
font-style: italic; font-style: italic;
} }

View File

@ -1,4 +1,4 @@
@import "../Common.module"; @import '../Common.module';
.data_dropdown_wrapper { .data_dropdown_wrapper {
display: inline-block; display: inline-block;
@ -31,7 +31,7 @@
text-align: left; text-align: left;
margin-right: 5px; margin-right: 5px;
} }
// &:hover { // &:hover {
// background-color: #eee; // background-color: #eee;
// } // }
@ -54,9 +54,9 @@
.dropdownRight:before, .dropdownRight:before,
.dropdownBottom:before { .dropdownBottom:before {
content: ""; content: '';
position: absolute; position: absolute;
border: solid 5px transparent; border: solid 5px transparent;
z-index: 10000; z-index: 10000;
} }

View File

@ -1,4 +1,4 @@
@import "../Common.module"; @import '../Common.module';
.queryBox { .queryBox {
box-sizing: border-box; box-sizing: border-box;
@ -8,7 +8,7 @@
.inputRow { .inputRow {
margin: 20px 0; margin: 20px 0;
div[class^=col-xs-] { div[class^='col-xs-'] {
padding-left: 0; padding-left: 0;
padding-right: 2.5px; padding-right: 2.5px;
} }
@ -19,7 +19,8 @@
} }
:global(.form-control):focus { :global(.form-control):focus {
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075),
0 0 0px rgba(102, 175, 233, 0.6);
} }
:global(.fa) { :global(.fa) {

View File

@ -1,5 +1,5 @@
@import "../Common.module"; @import '../Common.module';
.headerInputWidth { .headerInputWidth {
width: 300px width: 300px;
} }

View File

@ -1,4 +1,4 @@
@import "../../Common.module"; @import '../../Common.module';
.editorExpanded { .editorExpanded {
margin: 10px 0; margin: 10px 0;
@ -15,4 +15,4 @@
.editorContent { .editorContent {
padding: 10px 15px; padding: 10px 15px;
} }

View File

@ -1,4 +1,3 @@
@import '../../Common.module'; @import '../../Common.module';
.displayFlexContainer { .displayFlexContainer {
@ -273,4 +272,4 @@
height: 17px; height: 17px;
width: 17px; width: 17px;
margin-left: 5px; margin-left: 5px;
} }

View File

@ -1,4 +1,4 @@
@import "../../Common.module"; @import '../../Common.module';
.common_header_wrapper { .common_header_wrapper {
.defaultWidth { .defaultWidth {

View File

@ -1,4 +1,4 @@
@import "../../Common.module"; @import '../../Common.module';
.loader_ml { .loader_ml {
margin-left: 3px; margin-left: 3px;

View File

@ -1,4 +1,4 @@
@import "../../Common.module"; @import '../../Common.module';
.container { .container {
} }
@ -42,7 +42,8 @@
padding: 7px 0; padding: 7px 0;
transition: color 0.5s; transition: color 0.5s;
a,a:visited { a,
a:visited {
/* Taken from boostrap navbar-inverse-link-color variables */ /* Taken from boostrap navbar-inverse-link-color variables */
color: lighten(lighten(#000, 46.7%), 15%); color: lighten(lighten(#000, 46.7%), 15%);
} }
@ -61,7 +62,7 @@
transition: color 0.5s; transition: color 0.5s;
pointer: cursor; pointer: cursor;
} }
} }
} }
.main { .main {

View File

@ -1,4 +1,4 @@
@import "../Common.module"; @import '../Common.module';
.qb_nested { .qb_nested {
margin-top: 5px; margin-top: 5px;
@ -23,11 +23,10 @@
color: #999; color: #999;
select option { select option {
color: #555 color: #555;
} }
} }
.qb_unselected_key { .qb_unselected_key {
color: #999; color: #999;
} }

View File

@ -57,22 +57,25 @@
z-index: 100; z-index: 100;
} }
.copyGenerated img, .copyExecution img { .copyGenerated img,
.copyExecution img {
width: 20px; width: 20px;
opacity: .6; opacity: 0.6;
} }
.copyGenerated img:hover, .copyExecution img:hover { .copyGenerated img:hover,
.copyExecution img:hover {
opacity: 1; opacity: 1;
} }
.copyGenerated:focus, .copyExecution:focus { .copyGenerated:focus,
.copyExecution:focus {
outline: none; outline: none;
} }
.copyTooltip { .copyTooltip {
position: relative; position: relative;
display: inline-block; display: inline-block;
} }
.copyTooltip i { .copyTooltip i {
@ -80,36 +83,36 @@
} }
.copyTooltip .tooltiptext { .copyTooltip .tooltiptext {
background-color: #555; background-color: #555;
color: #fff; color: #fff;
text-align: center; text-align: center;
border-radius: 6px; border-radius: 6px;
padding: 4px 0px; padding: 4px 0px;
font-size: 14px; font-size: 14px;
position: absolute; position: absolute;
z-index: 1000000000; z-index: 1000000000;
right: -21px; right: -21px;
bottom: 30px; bottom: 30px;
opacity: 0; opacity: 0;
-webkit-transition: opacity 0.3s; -webkit-transition: opacity 0.3s;
transition: opacity 0.3s; transition: opacity 0.3s;
display: none; display: none;
width: 57px; width: 57px;
} }
.copyTooltip .tooltiptext::after { .copyTooltip .tooltiptext::after {
content: ""; content: '';
position: absolute; position: absolute;
top: 26px; top: 26px;
right: 22px; right: 22px;
margin-left: -5px; margin-left: -5px;
border-width: 5px; border-width: 5px;
border-style: solid; border-style: solid;
border-color: #555 transparent transparent transparent; border-color: #555 transparent transparent transparent;
} }
.copyTooltip:hover .tooltiptext { .copyTooltip:hover .tooltiptext {
visibility: visible; visibility: visible;
opacity: 1; opacity: 1;
display: block; display: block;
} }

View File

@ -1,3 +1,3 @@
.tooltipIcon{ .tooltipIcon {
margin-left: 5px; margin-left: 5px;
} }

View File

@ -1,5 +1,5 @@
@import "../Common.module"; @import '../Common.module';
.warningSymbol { .warningSymbol {
color: #d9534f; color: #d9534f;
} }

View File

@ -192,7 +192,7 @@ export function getAllJsonPaths(
const handleSubJson = (subJson: any, newPrefix: string) => { const handleSubJson = (subJson: any, newPrefix: string) => {
const subPaths = getAllJsonPaths(subJson, leafKeys, newPrefix); const subPaths = getAllJsonPaths(subJson, leafKeys, newPrefix);
subPaths.forEach((subPath: typeof subPaths[0]) => { subPaths.forEach((subPath: (typeof subPaths)[0]) => {
paths.push(subPath); paths.push(subPath);
}); });

View File

@ -1,4 +1,4 @@
@import "../../Common/Common.module"; @import '../../Common/Common.module';
.addPaddCommom { .addPaddCommom {
padding: 10px 0; padding: 10px 0;
@ -52,7 +52,7 @@
.commonBtn { .commonBtn {
text-align: center; text-align: center;
padding: 20px 0; padding: 20px 0;
padding-bottom: 10px padding-bottom: 10px;
} }
.readMore { .readMore {
@ -61,7 +61,7 @@
} }
} }
.iconWrapper{ .iconWrapper {
padding: 20px 0; padding: 20px 0;
.icon { .icon {
@ -119,7 +119,8 @@
.inputLabel { .inputLabel {
margin-left: 0; margin-left: 0;
input, select { input,
select {
width: 300px; width: 300px;
} }
} }
@ -140,7 +141,7 @@
} }
.red_button { .red_button {
color: #FFF; color: #fff;
} }
a { a {
@ -166,7 +167,6 @@
.set_line_height { .set_line_height {
line-height: 26px; line-height: 26px;
} }
} }
.actionsImg { .actionsImg {
@ -193,7 +193,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
a{ a {
color: #909090; color: #909090;
} }
@ -260,24 +260,24 @@
display: inline-block; display: inline-block;
} }
.instructionsWrapper, .instructionsWrapperPos { .instructionsWrapper,
.instructionsWrapperPos {
margin-top: 20px; margin-top: 20px;
border-top: 1px solid #DEDEDE; border-top: 1px solid #dedede;
.instructions { .instructions {
padding: 12px 0; padding: 12px 0;
} }
} }
.instructionsWrapper .instructionsWrapper {
{
position: relative; position: relative;
} }
.instructionsWrapperPos .instructionsWrapperPos {
{
position: static; position: static;
} }
.instructionsWrapper:hover, .instructionsWrapperPos:hover { .instructionsWrapper:hover,
.instructionsWrapperPos:hover {
.instructions { .instructions {
color: #505050 color: #505050;
} }
.rightArrow { .rightArrow {

View File

@ -1 +1 @@
@import '../../../Common/Common.module'; @import '../../../Common/Common.module';

View File

@ -86,8 +86,8 @@ const acceptedGQLTypes = [
'Double', 'Double',
] as const; ] as const;
export type VariableData = { export type VariableData = {
kind: typeof acceptedTypeKind[number] | 'Unsupported'; kind: (typeof acceptedTypeKind)[number] | 'Unsupported';
type: typeof acceptedGQLTypes[number]; type: (typeof acceptedGQLTypes)[number];
name: string; name: string;
}; };

View File

@ -10,27 +10,28 @@ import IntrospectionTable from './IntrospectionTable';
interface IntrospectionOptionsComponentProps extends InjectedProps {} interface IntrospectionOptionsComponentProps extends InjectedProps {}
const IntrospectionOptionsComponent: React.FC<IntrospectionOptionsComponentProps> = const IntrospectionOptionsComponent: React.FC<
({ metadata, allRoles, dispatch }) => { IntrospectionOptionsComponentProps
// Fire on component load, so that pro console doesn't crash on undefined metadata > = ({ metadata, allRoles, dispatch }) => {
useEffect(() => { // Fire on component load, so that pro console doesn't crash on undefined metadata
dispatch(exportMetadata()); useEffect(() => {
}, []); dispatch(exportMetadata());
}, []);
const disabledRoles = const disabledRoles =
metadata?.graphql_schema_introspection?.disabled_for_roles ?? []; metadata?.graphql_schema_introspection?.disabled_for_roles ?? [];
const tableData = allRoles.map(role => ({ const tableData = allRoles.map(role => ({
roleName: role, roleName: role,
instrospectionIsDisabled: disabledRoles.includes(role), instrospectionIsDisabled: disabledRoles.includes(role),
})); }));
return ( return (
<SecurityTabs tabName="introspection"> <SecurityTabs tabName="introspection">
<IntrospectionTable rows={tableData} /> <IntrospectionTable rows={tableData} />
</SecurityTabs> </SecurityTabs>
); );
}; };
const mapDispatchToProps = (dispatch: Dispatch) => ({ const mapDispatchToProps = (dispatch: Dispatch) => ({
dispatch, dispatch,

View File

@ -1,5 +1,5 @@
@import "../../../Common/Common.module"; @import '../../../Common/Common.module';
@import "../../../Common/TextAreaWithCopy/TextAreaWithCopy.module"; @import '../../../Common/TextAreaWithCopy/TextAreaWithCopy.module';
.wd100 { .wd100 {
width: 100%; width: 100%;
@ -11,7 +11,7 @@
height: 0; height: 0;
border-top: 8px solid transparent; border-top: 8px solid transparent;
border-bottom: 8px solid transparent; border-bottom: 8px solid transparent;
border-right:8px solid #fff; border-right: 8px solid #fff;
position: absolute; position: absolute;
left: 0; left: 0;
bottom: 20px; bottom: 20px;
@ -32,7 +32,7 @@
} }
.commonBorBottom { .commonBorBottom {
border-bottom: 1px solid #DEDEDE; border-bottom: 1px solid #dedede;
} }
.addPaddLeft { .addPaddLeft {
@ -59,12 +59,12 @@
top: 60px; top: 60px;
left: 524px; left: 524px;
} }
.popupWrapper .popupWrapper {
{
bottom: 0px; bottom: 0px;
left: 244px; left: 244px;
} }
.popupWrapper, .popupWrapperPos { .popupWrapper,
.popupWrapperPos {
box-shadow: 0 0 14px 0 rgba(0, 0, 0, 0.16); box-shadow: 0 0 14px 0 rgba(0, 0, 0, 0.16);
background-color: #ffffff; background-color: #ffffff;
position: absolute; position: absolute;
@ -90,7 +90,6 @@
} }
.copyGenerated { .copyGenerated {
} }
.copyTooltip .tooltiptext::after { .copyTooltip .tooltiptext::after {

View File

@ -1 +1 @@
@import "../../../Common/Common.module"; @import '../../../Common/Common.module';

View File

@ -33,46 +33,47 @@ interface FrequentlyUsedColumnSelectorProps {
dispatch?: Dispatch | null; dispatch?: Dispatch | null;
} }
const FrequentlyUsedColumnSelector: React.VFC<FrequentlyUsedColumnSelectorProps> = const FrequentlyUsedColumnSelector: React.VFC<
({ onSelect, postgresVersion, action = null, dispatch = null }) => { FrequentlyUsedColumnSelectorProps
const frequentlyUsedColumnsOptions = frequentlyUsedColumns > = ({ onSelect, postgresVersion, action = null, dispatch = null }) => {
.filter(fuc => !action || fuc.validFor.includes(action)) const frequentlyUsedColumnsOptions = frequentlyUsedColumns
.filter(col => .filter(fuc => !action || fuc.validFor.includes(action))
postgresVersion && col.minPGVersion .filter(col =>
? parseFloat(postgresVersion) >= col.minPGVersion postgresVersion && col.minPGVersion
: true ? parseFloat(postgresVersion) >= col.minPGVersion
) : true
.map(fuc => { )
const { title, subTitle } = getFreqUsedColDisplayInfo(fuc); .map(fuc => {
return { const { title, subTitle } = getFreqUsedColDisplayInfo(fuc);
content: ( return {
content: (
<div>
<div> <div>
<div> <b>{title}</b>
<b>{title}</b>
</div>
<div>{subTitle}</div>
</div> </div>
), <div>{subTitle}</div>
onClick: () => (dispatch ? dispatch(onSelect(fuc)) : onSelect(fuc)), </div>
}; ),
}); onClick: () => (dispatch ? dispatch(onSelect(fuc)) : onSelect(fuc)),
};
});
return ( return (
<Dropdown <Dropdown
testId="frequently-used-columns" testId="frequently-used-columns"
options={frequentlyUsedColumnsOptions} options={frequentlyUsedColumnsOptions}
data-test="frequently-used-columns" data-test="frequently-used-columns"
position="bottom" position="bottom"
key="frequently-used-columns" key="frequently-used-columns"
keyPrefix="frequently-used-columns" keyPrefix="frequently-used-columns"
> >
{({ onClick }) => ( {({ onClick }) => (
<Button size="sm" onClick={onClick}> <Button size="sm" onClick={onClick}>
+ Frequently used columns + Frequently used columns
</Button> </Button>
)} )}
</Dropdown> </Dropdown>
); );
}; };
export default FrequentlyUsedColumnSelector; export default FrequentlyUsedColumnSelector;

View File

@ -5,46 +5,47 @@ import { IndicatorCard } from '@/new-components/IndicatorCard';
import { FaExclamationTriangle } from 'react-icons/fa'; import { FaExclamationTriangle } from 'react-icons/fa';
import styles from '../../DataSources.module.scss'; import styles from '../../DataSources.module.scss';
export const CumulativeMaxConnections: React.VFC<ConnectionSettingsFormProps> = export const CumulativeMaxConnections: React.VFC<
({ connectionDBState, connectionDBStateDispatch }) => ( ConnectionSettingsFormProps
<> > = ({ connectionDBState, connectionDBStateDispatch }) => (
<div className={styles.connection_settings_input_layout}> <>
<LabeledInput <div className={styles.connection_settings_input_layout}>
label="Total Max Connections" <LabeledInput
tooltipText="Maximum number of database connections" label="Total Max Connections"
type="number" tooltipText="Maximum number of database connections"
className={`form-control ${styles.connnection_settings_form_input}`} type="number"
placeholder="1000" className={`form-control ${styles.connnection_settings_form_input}`}
value={ placeholder="1000"
connectionDBState.connectionSettings?.total_max_connections || value={
undefined connectionDBState.connectionSettings?.total_max_connections ||
} undefined
onChange={e => }
connectionDBStateDispatch({ onChange={e =>
type: 'UPDATE_TOTAL_MAX_CONNECTIONS', connectionDBStateDispatch({
data: e.target.value, type: 'UPDATE_TOTAL_MAX_CONNECTIONS',
}) data: e.target.value,
} })
min="0" }
boldlabel min="0"
data-test="max-connections" boldlabel
icon={ data-test="max-connections"
connectionDBState?.connectionSettings?.max_connections !== undefined icon={
} connectionDBState?.connectionSettings?.max_connections !== undefined
/> }
</div> />
{connectionDBState?.connectionSettings?.max_connections && ( </div>
<IndicatorCard status="info"> {connectionDBState?.connectionSettings?.max_connections && (
<p className="font-bold"> <IndicatorCard status="info">
<FaExclamationTriangle className="text-blue-300 pb-1 mr-4 text-lg" /> <p className="font-bold">
Set Total Max Connections <FaExclamationTriangle className="text-blue-300 pb-1 mr-4 text-lg" />
</p> Set Total Max Connections
<p className="ml-lg"> </p>
You have set <b>Max Connections Per Instance</b> which is not <p className="ml-lg">
recommended for Hasura Cloud. Use <b>Total Max Connections</b>{' '} You have set <b>Max Connections Per Instance</b> which is not
instead. recommended for Hasura Cloud. Use <b>Total Max Connections</b>{' '}
</p> instead.
</IndicatorCard> </p>
)} </IndicatorCard>
</> )}
); </>
);

View File

@ -9,8 +9,9 @@ export default {
argTypes: { onChange: { action: 'change' } }, argTypes: { onChange: { action: 'change' } },
} as ComponentMeta<typeof GraphQLFieldCustomization>; } as ComponentMeta<typeof GraphQLFieldCustomization>;
export const Playground: ComponentStory<typeof GraphQLFieldCustomization> = export const Playground: ComponentStory<
args => <GraphQLFieldCustomization {...args} />; typeof GraphQLFieldCustomization
> = args => <GraphQLFieldCustomization {...args} />;
Playground.args = { Playground.args = {
rootFields: { rootFields: {

View File

@ -30,33 +30,34 @@ export const getActionType = (
): ConnectDBActions['type'] | null => ): ConnectDBActions['type'] | null =>
CustomizationFieldNameToActionTypeMap[fieldName] || null; CustomizationFieldNameToActionTypeMap[fieldName] || null;
export const GraphQLFieldCustomizationContainer: React.FC<GraphQLFieldCustomizationContainerProps> = export const GraphQLFieldCustomizationContainer: React.FC<
({ GraphQLFieldCustomizationContainerProps
rootFields, > = ({
typeNames, rootFields,
namingConvention, typeNames,
connectionDBStateDispatch, namingConvention,
connectionDBState, connectionDBStateDispatch,
}) => { connectionDBState,
const onChange = ( }) => {
fieldName: CustomizationFieldName, const onChange = (
fieldValue: string | null | undefined fieldName: CustomizationFieldName,
) => { fieldValue: string | null | undefined
const actionType = getActionType(fieldName); ) => {
if (actionType) { const actionType = getActionType(fieldName);
connectionDBStateDispatch({ if (actionType) {
type: actionType, connectionDBStateDispatch({
data: fieldValue, type: actionType,
} as ConnectDBActions); data: fieldValue,
} } as ConnectDBActions);
}; }
return (
<GraphQLFieldCustomization
rootFields={rootFields}
typeNames={typeNames}
namingConvention={namingConvention}
onChange={onChange}
connectionDBState={connectionDBState}
/>
);
}; };
return (
<GraphQLFieldCustomization
rootFields={rootFields}
typeNames={typeNames}
namingConvention={namingConvention}
onChange={onChange}
connectionDBState={connectionDBState}
/>
);
};

View File

@ -1,4 +1,4 @@
@import "../../../Common/Common.module"; @import '../../../Common/Common.module';
.migration_mode { .migration_mode {
display: inline-block; display: inline-block;

View File

@ -1,4 +1,3 @@
.table { .table {
width: 100%; width: 100%;
background-color: white; background-color: white;
@ -75,7 +74,7 @@
.ace_custom_style { .ace_custom_style {
border: 1px solid #dddddd; border: 1px solid #dddddd;
margin: .5em 0; margin: 0.5em 0;
background-color: #f8fafb; background-color: #f8fafb;
border-radius: 4px; border-radius: 4px;
} }
@ -85,7 +84,7 @@
padding: 4px 8px; padding: 4px 8px;
font-weight: 600; font-weight: 600;
border-radius: 16px; border-radius: 16px;
color: #6B7280; color: #6b7280;
border: 1px solid #d1d5db; border: 1px solid #d1d5db;
} }
@ -116,7 +115,7 @@
opacity: 0; opacity: 0;
} }
tr:hover .schema_gallery_button{ tr:hover .schema_gallery_button {
opacity: 1; opacity: 1;
} }

View File

@ -28,77 +28,77 @@ type TableTrackingCustomizationModalContainerProps = Omit<
'onSubmit' 'onSubmit'
> & { dataSource: string; driver: Driver; schema: string }; > & { dataSource: string; driver: Driver; schema: string };
export const TableTrackingCustomizationModalContainer: React.FC<TableTrackingCustomizationModalContainerProps> = export const TableTrackingCustomizationModalContainer: React.FC<
({ onClose, tableName, schema, dataSource, driver }) => { TableTrackingCustomizationModalContainerProps
const { fireNotification } = useFireNotification(); > = ({ onClose, tableName, schema, dataSource, driver }) => {
const dispatch: ThunkDispatch<ReduxState, unknown, AnyAction> = const { fireNotification } = useFireNotification();
useDispatch(); const dispatch: ThunkDispatch<ReduxState, unknown, AnyAction> = useDispatch();
const mutation = useMetadataMigration({ const mutation = useMetadataMigration({
onSuccess: () => { onSuccess: () => {
dispatch({ type: REQUEST_SUCCESS }); dispatch({ type: REQUEST_SUCCESS });
dispatch(updateSchemaInfo()).then(() => { dispatch(updateSchemaInfo()).then(() => {
const nextRoute = const nextRoute =
driver !== 'bigquery' driver !== 'bigquery'
? getTableModifyRoute(schema, dataSource, tableName, true) ? getTableModifyRoute(schema, dataSource, tableName, true)
: getTableBrowseRoute(schema, dataSource, tableName, true); : getTableBrowseRoute(schema, dataSource, tableName, true);
dispatch(_push(nextRoute)); dispatch(_push(nextRoute));
dispatch(setSidebarLoading(false)); dispatch(setSidebarLoading(false));
fireNotification({
title: 'Success!',
message: 'Existing table/view added',
type: 'success',
});
if (onClose) onClose();
});
},
onError: (error: Error) => {
fireNotification({ fireNotification({
title: 'Error', title: 'Success!',
message: error?.message ?? 'Error while adding table/view', message: 'Existing table/view added',
type: 'error', type: 'success',
}); });
}, if (onClose) onClose();
}); });
},
onError: (error: Error) => {
fireNotification({
title: 'Error',
message: error?.message ?? 'Error while adding table/view',
type: 'error',
});
},
});
const onCustomizationFormSubmit = (values: FormValues) => { const onCustomizationFormSubmit = (values: FormValues) => {
const requestBody = { const requestBody = {
type: getTrackTableType(driver) as allowedMetadataTypes, type: getTrackTableType(driver) as allowedMetadataTypes,
args: { args: {
source: dataSource, source: dataSource,
table: getQualifiedTable({ table: getQualifiedTable({
driver, driver,
tableName, tableName,
schema, schema,
}), }),
configuration: { configuration: {
custom_name: values.custom_name, custom_name: values.custom_name,
custom_root_fields: { custom_root_fields: {
select: values.select, select: values.select,
select_by_pk: values.select_by_pk, select_by_pk: values.select_by_pk,
select_aggregate: values.select_aggregate, select_aggregate: values.select_aggregate,
select_stream: values.select_stream, select_stream: values.select_stream,
insert: values.insert, insert: values.insert,
insert_one: values.insert_one, insert_one: values.insert_one,
update: values.update, update: values.update,
update_by_pk: values.update_by_pk, update_by_pk: values.update_by_pk,
delete: values.delete, delete: values.delete,
delete_by_pk: values.delete_by_pk, delete_by_pk: values.delete_by_pk,
update_many: values.update_many, update_many: values.update_many,
},
}, },
}, },
}; },
mutation.mutate({
query: requestBody,
});
}; };
mutation.mutate({
return ( query: requestBody,
<TableTrackingCustomizationModal });
tableName={tableName}
onSubmit={onCustomizationFormSubmit}
onClose={onClose}
isLoading={mutation.isLoading}
/>
);
}; };
return (
<TableTrackingCustomizationModal
tableName={tableName}
onSubmit={onCustomizationFormSubmit}
onClose={onClose}
isLoading={mutation.isLoading}
/>
);
};

View File

@ -21,125 +21,126 @@ export type TableTrackingCustomizationFormProps = {
onClose: () => void; onClose: () => void;
}; };
export const TableTrackingCustomizationForm: React.VFC<TableTrackingCustomizationFormProps> = export const TableTrackingCustomizationForm: React.VFC<
props => { TableTrackingCustomizationFormProps
const { onClose } = props; > = props => {
const { onClose } = props;
const { const {
errors, errors,
formMethods, formMethods,
handleSubmit, handleSubmit,
hasValues, hasValues,
isMutateOpen, isMutateOpen,
isQueryOpen, isQueryOpen,
placeholders, placeholders,
reset, reset,
setCustomTableName, setCustomTableName,
} = useGqlCustomizationForm(props); } = useGqlCustomizationForm(props);
return ( return (
<FormProvider {...formMethods}> <FormProvider {...formMethods}>
<form onSubmit={formMethods.handleSubmit(handleSubmit)}> <form onSubmit={formMethods.handleSubmit(handleSubmit)}>
<div> <div>
<div className="px-sm pb-sm"> <div className="px-sm pb-sm">
<SanitizeTips /> <SanitizeTips />
<div className="mb-4 flex justify-end"> <div className="mb-4 flex justify-end">
<Button disabled={!hasValues} size="sm" onClick={reset}> <Button disabled={!hasValues} size="sm" onClick={reset}>
Clear All Fields Clear All Fields
</Button> </Button>
</div> </div>
<div className="pl-6"> <div className="pl-6">
<InputField <InputField
label="Custom Table Name" label="Custom Table Name"
fieldName="custom_name" fieldName="custom_name"
placeholder={placeholders.custom_name} placeholder={placeholders.custom_name}
onClear={() => { onClear={() => {
setCustomTableName(''); setCustomTableName('');
}} }}
onChange={value => { onChange={value => {
setCustomTableName(value); setCustomTableName(value);
}} }}
/> />
</div> </div>
{errors.custom_name?.type === 'required' && ( {errors.custom_name?.type === 'required' && (
<div className="grid grid-cols-12 gap-3"> <div className="grid grid-cols-12 gap-3">
<div className="col-span-4 flex items-center" /> <div className="col-span-4 flex items-center" />
<div className="col-span-8"> <div className="col-span-8">
<div <div
role="alert" role="alert"
aria-label="custom table name is a required field!" aria-label="custom table name is a required field!"
className="text-red-600 flex items-center text-sm pt-1" className="text-red-600 flex items-center text-sm pt-1"
> >
<span className="flex items-center"> <span className="flex items-center">
<FaExclamationCircle className="mr-1" /> <FaExclamationCircle className="mr-1" />
This field is required! This field is required!
</span> </span>
</div>
</div> </div>
</div> </div>
)}
<div className="mb-sm">
<div className="flex items-center">
<Collapse
defaultOpen={isQueryOpen}
title="Query and Subscription"
rootClassName="w-full"
>
<Collapse.Content>
<div className="pl-sm py-xs ml-[0.47rem]">
<div className="space-y-sm">
{query_field_props.map(name => (
<InputField
key={`query-and-subscription-${name}`}
fieldName={name}
label={name}
placeholder={placeholders[name]}
/>
))}
</div>
</div>
</Collapse.Content>
</Collapse>
</div>
</div> </div>
)}
<div> <div className="mb-sm">
<div className="flex items-center"> <div className="flex items-center">
<Collapse <Collapse
defaultOpen={isMutateOpen} defaultOpen={isQueryOpen}
title="Mutation" title="Query and Subscription"
rootClassName="w-full" rootClassName="w-full"
> >
<Collapse.Content> <Collapse.Content>
<div className="pl-sm py-xs ml-[0.47rem]"> <div className="pl-sm py-xs ml-[0.47rem]">
<div className="space-y-sm"> <div className="space-y-sm">
{mutation_field_props.map(name => ( {query_field_props.map(name => (
<InputField <InputField
key={`mutation-${name}`} key={`query-and-subscription-${name}`}
label={name} fieldName={name}
fieldName={name} label={name}
placeholder={placeholders[name]} placeholder={placeholders[name]}
/> />
))} ))}
</div>
</div> </div>
</Collapse.Content> </div>
</Collapse> </Collapse.Content>
</div> </Collapse>
</div> </div>
</div> </div>
<Dialog.Footer <div>
callToAction="Save" <div className="flex items-center">
callToActionLoadingText="Saving..." <Collapse
callToDeny="Cancel" defaultOpen={isMutateOpen}
onClose={onClose} title="Mutation"
className="absolute w-full bottom-0" rootClassName="w-full"
/> >
<Collapse.Content>
<div className="pl-sm py-xs ml-[0.47rem]">
<div className="space-y-sm">
{mutation_field_props.map(name => (
<InputField
key={`mutation-${name}`}
label={name}
fieldName={name}
placeholder={placeholders[name]}
/>
))}
</div>
</div>
</Collapse.Content>
</Collapse>
</div>
</div>
</div> </div>
</form>
</FormProvider> <Dialog.Footer
); callToAction="Save"
}; callToActionLoadingText="Saving..."
callToDeny="Cancel"
onClose={onClose}
className="absolute w-full bottom-0"
/>
</div>
</form>
</FormProvider>
);
};

View File

@ -22,41 +22,42 @@ export type TableTrackingCustomizationModalProps = {
currentConfiguration?: MetadataTableConfig; currentConfiguration?: MetadataTableConfig;
}; };
export const TableTrackingCustomizationModal: React.FC<TableTrackingCustomizationModalProps> = export const TableTrackingCustomizationModal: React.FC<
({ TableTrackingCustomizationModalProps
tableName, > = ({
onSubmit, tableName,
onClose, onSubmit,
show = true, onClose,
currentConfiguration, show = true,
dialogDescription, currentConfiguration,
}) => { dialogDescription,
return ( }) => {
<> return (
{show && ( <>
<Analytics {show && (
name="TableTrackingCustomizationModal" <Analytics
{...REDACT_EVERYTHING} name="TableTrackingCustomizationModal"
{...REDACT_EVERYTHING}
>
<Dialog
hasBackdrop
title={tableName}
description={dialogDescription}
onClose={onClose}
titleTooltip="Customize table name and root fields for GraphQL operations."
contentContainer={{
className: 'mb-[60px]',
}}
> >
<Dialog <TableTrackingCustomizationForm
hasBackdrop initialTableName={tableName}
title={tableName} currentConfiguration={currentConfiguration}
description={dialogDescription}
onClose={onClose} onClose={onClose}
titleTooltip="Customize table name and root fields for GraphQL operations." onSubmit={onSubmit}
contentContainer={{ />
className: 'mb-[60px]', </Dialog>
}} </Analytics>
> )}
<TableTrackingCustomizationForm </>
initialTableName={tableName} );
currentConfiguration={currentConfiguration} };
onClose={onClose}
onSubmit={onSubmit}
/>
</Dialog>
</Analytics>
)}
</>
);
};

View File

@ -1,6 +1,7 @@
@import "../../../../Common/Common.module"; @import '../../../../Common/Common.module';
.qb_select, .qb_input { .qb_select,
.qb_input {
border: none; border: none;
background-color: transparent; background-color: transparent;
border-bottom: 2px dotted; border-bottom: 2px dotted;
@ -12,7 +13,8 @@
cursor: pointer; cursor: pointer;
} }
.qb_select:focus, .qb_input:focus { .qb_select:focus,
.qb_input:focus {
outline: none; outline: none;
} }

View File

@ -1,9 +1,10 @@
@import "../TableModify/ModifyTable.module"; @import '../TableModify/ModifyTable.module';
.permissionsTable { .permissionsTable {
width: 85%; width: 85%;
td, th { td,
th {
text-align: center; text-align: center;
vertical-align: middle !important; vertical-align: middle !important;
position: relative; position: relative;
@ -13,12 +14,14 @@
font-weight: bold; font-weight: bold;
} }
td:last-child, th:last-child { td:last-child,
th:last-child {
border-left: 4px double #ddd; border-left: 4px double #ddd;
width: 10%; width: 10%;
} }
td:first-child, th:first-child { td:first-child,
th:first-child {
overflow: auto; overflow: auto;
border-right: 4px double #ddd; border-right: 4px double #ddd;
max-width: 250px; max-width: 250px;
@ -56,9 +59,10 @@
} }
} }
.currEdit, .currEdit:hover { .currEdit,
background-color: #FFF3D5; .currEdit:hover {
color: #FD9540; background-color: #fff3d5;
color: #fd9540;
.editPermsIcon { .editPermsIcon {
display: inline-block; display: inline-block;

View File

@ -14,4 +14,4 @@
.ant-tree { .ant-tree {
color: grey; color: grey;
} }

View File

@ -1,4 +1,4 @@
@import "../../../../Common/TableCommon/Table.module"; @import '../../../../Common/TableCommon/Table.module';
.dropdown_wrapper { .dropdown_wrapper {
width: 300px; width: 300px;
@ -28,15 +28,13 @@
display: flex; display: flex;
align-items: center; align-items: center;
} }
.tabletdCenter .tabletdCenter {
{
height: 21px; height: 21px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.tableArrowCenter .tableArrowCenter {
{
height: 100%; height: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
@ -56,7 +54,7 @@
} }
.invocationSuccess { .invocationSuccess {
color: #28a745 color: #28a745;
} }
.invocationFailure { .invocationFailure {
color: red; color: red;
@ -107,7 +105,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background-color: #FFF3D5; background-color: #fff3d5;
padding: 5px; padding: 5px;
min-height: 41px; min-height: 41px;
} }
@ -116,7 +114,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background-color: #FFF3D5; background-color: #fff3d5;
padding: 5px; padding: 5px;
min-height: 41px; min-height: 41px;
position: relative; position: relative;
@ -176,7 +174,7 @@
} }
i:hover { i:hover {
color: #4D4D4D ; color: #4d4d4d;
} }
} }

View File

@ -83,4 +83,4 @@
"2021-05-18 07:14:19.196511", "2021-05-18 07:14:19.196511",
"f" "f"
] ]
] ]

View File

@ -1,222 +1,222 @@
[ [
[ [
"id", "id",
"event_id", "event_id",
"status", "status",
"request", "request",
"response", "response",
"created_at", "created_at",
"id", "id",
"schema_name", "schema_name",
"table_name", "table_name",
"trigger_name", "trigger_name",
"payload", "payload",
"delivered", "delivered",
"error", "error",
"tries", "tries",
"created_at", "created_at",
"locked", "locked",
"next_retry_at", "next_retry_at",
"archived" "archived"
], ],
[ [
"31b4c28c-954d-4871-ba95-a6d7da8d6988", "31b4c28c-954d-4871-ba95-a6d7da8d6988",
"7bc7b398-f1cd-4761-839d-44971e01be48", "7bc7b398-f1cd-4761-839d-44971e01be48",
"1000", "1000",
"{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":8}},\"trace_context\":{\"trace_id\":\"04415c5c0870f8f6\",\"span_id\":\"455d47a2c5d8f40e\"}},\"created_at\":\"2021-05-18T07:39:50.658771Z\",\"id\":\"7bc7b398-f1cd-4761-839d-44971e01be48\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":4},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}", "{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":8}},\"trace_context\":{\"trace_id\":\"04415c5c0870f8f6\",\"span_id\":\"455d47a2c5d8f40e\"}},\"created_at\":\"2021-05-18T07:39:50.658771Z\",\"id\":\"7bc7b398-f1cd-4761-839d-44971e01be48\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":4},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}",
"{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"04415c5c0870f8f6\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"d1260fcdfe50945e\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"de05cf247e935b7a\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}", "{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"04415c5c0870f8f6\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"d1260fcdfe50945e\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"de05cf247e935b7a\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}",
"2021-05-18 07:40:32.81592", "2021-05-18 07:40:32.81592",
"7bc7b398-f1cd-4761-839d-44971e01be48", "7bc7b398-f1cd-4761-839d-44971e01be48",
"public", "public",
"users", "users",
"new_user", "new_user",
"{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 8, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"455d47a2c5d8f40e\", \"trace_id\": \"04415c5c0870f8f6\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}", "{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 8, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"455d47a2c5d8f40e\", \"trace_id\": \"04415c5c0870f8f6\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}",
"f", "f",
"t", "t",
"5", "5",
"2021-05-18 07:39:50.658771", "2021-05-18 07:39:50.658771",
"NULL", "NULL",
"NULL", "NULL",
"f" "f"
], ],
[ [
"bf1760ee-c628-4b94-b535-1d5453675958", "bf1760ee-c628-4b94-b535-1d5453675958",
"c3ac48be-a569-4d87-8c52-cb84309002ed", "c3ac48be-a569-4d87-8c52-cb84309002ed",
"1000", "1000",
"{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":6}},\"trace_context\":{\"trace_id\":\"ecba73bac1b4601a\",\"span_id\":\"5a75ae38fccf4473\"}},\"created_at\":\"2021-05-18T07:39:50.332379Z\",\"id\":\"c3ac48be-a569-4d87-8c52-cb84309002ed\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":4},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}", "{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":6}},\"trace_context\":{\"trace_id\":\"ecba73bac1b4601a\",\"span_id\":\"5a75ae38fccf4473\"}},\"created_at\":\"2021-05-18T07:39:50.332379Z\",\"id\":\"c3ac48be-a569-4d87-8c52-cb84309002ed\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":4},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}",
"{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"ecba73bac1b4601a\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"1c3c460b36da4a0e\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"f309dbf4632da6a5\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}", "{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"ecba73bac1b4601a\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"1c3c460b36da4a0e\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"f309dbf4632da6a5\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}",
"2021-05-18 07:40:32.815484", "2021-05-18 07:40:32.815484",
"c3ac48be-a569-4d87-8c52-cb84309002ed", "c3ac48be-a569-4d87-8c52-cb84309002ed",
"public", "public",
"users", "users",
"new_user", "new_user",
"{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 6, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"5a75ae38fccf4473\", \"trace_id\": \"ecba73bac1b4601a\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}", "{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 6, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"5a75ae38fccf4473\", \"trace_id\": \"ecba73bac1b4601a\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}",
"f", "f",
"t", "t",
"5", "5",
"2021-05-18 07:39:50.332379", "2021-05-18 07:39:50.332379",
"NULL", "NULL",
"NULL", "NULL",
"f" "f"
], ],
[ [
"5836823f-9104-489e-b339-946b45e266a9", "5836823f-9104-489e-b339-946b45e266a9",
"338eec2d-0c1f-4358-ae12-05d3f73a85c6", "338eec2d-0c1f-4358-ae12-05d3f73a85c6",
"1000", "1000",
"{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":9}},\"trace_context\":{\"trace_id\":\"ea970ad818f358cf\",\"span_id\":\"77150de9d725e5df\"}},\"created_at\":\"2021-05-18T07:39:50.831182Z\",\"id\":\"338eec2d-0c1f-4358-ae12-05d3f73a85c6\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":4},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}", "{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":9}},\"trace_context\":{\"trace_id\":\"ea970ad818f358cf\",\"span_id\":\"77150de9d725e5df\"}},\"created_at\":\"2021-05-18T07:39:50.831182Z\",\"id\":\"338eec2d-0c1f-4358-ae12-05d3f73a85c6\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":4},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}",
"{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"ea970ad818f358cf\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"332c2f49df1cb4d2\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"3668323420f67bb1\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}", "{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"ea970ad818f358cf\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"332c2f49df1cb4d2\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"3668323420f67bb1\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}",
"2021-05-18 07:40:32.81517", "2021-05-18 07:40:32.81517",
"338eec2d-0c1f-4358-ae12-05d3f73a85c6", "338eec2d-0c1f-4358-ae12-05d3f73a85c6",
"public", "public",
"users", "users",
"new_user", "new_user",
"{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 9, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"77150de9d725e5df\", \"trace_id\": \"ea970ad818f358cf\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}", "{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 9, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"77150de9d725e5df\", \"trace_id\": \"ea970ad818f358cf\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}",
"f", "f",
"t", "t",
"5", "5",
"2021-05-18 07:39:50.831182", "2021-05-18 07:39:50.831182",
"NULL", "NULL",
"NULL", "NULL",
"f" "f"
], ],
[ [
"7b314fa3-fa10-4d1d-9c7b-0799e2a2345c", "7b314fa3-fa10-4d1d-9c7b-0799e2a2345c",
"423e5a24-d4e0-493a-83df-ecff0eca2398", "423e5a24-d4e0-493a-83df-ecff0eca2398",
"1000", "1000",
"{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":7}},\"trace_context\":{\"trace_id\":\"da0635bf4fb444b1\",\"span_id\":\"5e088982a14f9bdd\"}},\"created_at\":\"2021-05-18T07:39:50.490999Z\",\"id\":\"423e5a24-d4e0-493a-83df-ecff0eca2398\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":4},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}", "{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":7}},\"trace_context\":{\"trace_id\":\"da0635bf4fb444b1\",\"span_id\":\"5e088982a14f9bdd\"}},\"created_at\":\"2021-05-18T07:39:50.490999Z\",\"id\":\"423e5a24-d4e0-493a-83df-ecff0eca2398\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":4},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}",
"{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"da0635bf4fb444b1\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"f92c4fac3a66595a\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"b3a34f8a72e89980\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}", "{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"da0635bf4fb444b1\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"f92c4fac3a66595a\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"b3a34f8a72e89980\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}",
"2021-05-18 07:40:32.815118", "2021-05-18 07:40:32.815118",
"423e5a24-d4e0-493a-83df-ecff0eca2398", "423e5a24-d4e0-493a-83df-ecff0eca2398",
"public", "public",
"users", "users",
"new_user", "new_user",
"{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 7, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"5e088982a14f9bdd\", \"trace_id\": \"da0635bf4fb444b1\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}", "{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 7, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"5e088982a14f9bdd\", \"trace_id\": \"da0635bf4fb444b1\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}",
"f", "f",
"t", "t",
"5", "5",
"2021-05-18 07:39:50.490999", "2021-05-18 07:39:50.490999",
"NULL", "NULL",
"NULL", "NULL",
"f" "f"
], ],
[ [
"c6ec4304-3848-4c4c-a188-ff91ebe61ea0", "c6ec4304-3848-4c4c-a188-ff91ebe61ea0",
"7bc7b398-f1cd-4761-839d-44971e01be48", "7bc7b398-f1cd-4761-839d-44971e01be48",
"1000", "1000",
"{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":8}},\"trace_context\":{\"trace_id\":\"04415c5c0870f8f6\",\"span_id\":\"455d47a2c5d8f40e\"}},\"created_at\":\"2021-05-18T07:39:50.658771Z\",\"id\":\"7bc7b398-f1cd-4761-839d-44971e01be48\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":3},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}", "{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":8}},\"trace_context\":{\"trace_id\":\"04415c5c0870f8f6\",\"span_id\":\"455d47a2c5d8f40e\"}},\"created_at\":\"2021-05-18T07:39:50.658771Z\",\"id\":\"7bc7b398-f1cd-4761-839d-44971e01be48\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":3},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}",
"{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"04415c5c0870f8f6\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"f520ea1624695587\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"2dc1b4d86426e316\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}", "{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"04415c5c0870f8f6\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"f520ea1624695587\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"2dc1b4d86426e316\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}",
"2021-05-18 07:40:22.736277", "2021-05-18 07:40:22.736277",
"7bc7b398-f1cd-4761-839d-44971e01be48", "7bc7b398-f1cd-4761-839d-44971e01be48",
"public", "public",
"users", "users",
"new_user", "new_user",
"{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 8, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"455d47a2c5d8f40e\", \"trace_id\": \"04415c5c0870f8f6\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}", "{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 8, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"455d47a2c5d8f40e\", \"trace_id\": \"04415c5c0870f8f6\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}",
"f", "f",
"t", "t",
"5", "5",
"2021-05-18 07:39:50.658771", "2021-05-18 07:39:50.658771",
"NULL", "NULL",
"NULL", "NULL",
"f" "f"
], ],
[ [
"8c88c745-29eb-4637-ad2d-85f3d6ba82c4", "8c88c745-29eb-4637-ad2d-85f3d6ba82c4",
"423e5a24-d4e0-493a-83df-ecff0eca2398", "423e5a24-d4e0-493a-83df-ecff0eca2398",
"1000", "1000",
"{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":7}},\"trace_context\":{\"trace_id\":\"da0635bf4fb444b1\",\"span_id\":\"5e088982a14f9bdd\"}},\"created_at\":\"2021-05-18T07:39:50.490999Z\",\"id\":\"423e5a24-d4e0-493a-83df-ecff0eca2398\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":3},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}", "{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":7}},\"trace_context\":{\"trace_id\":\"da0635bf4fb444b1\",\"span_id\":\"5e088982a14f9bdd\"}},\"created_at\":\"2021-05-18T07:39:50.490999Z\",\"id\":\"423e5a24-d4e0-493a-83df-ecff0eca2398\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":3},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}",
"{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"da0635bf4fb444b1\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"d6bdb95ec116b8ff\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"01b61664322a458b\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}", "{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"da0635bf4fb444b1\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"d6bdb95ec116b8ff\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"01b61664322a458b\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}",
"2021-05-18 07:40:22.736095", "2021-05-18 07:40:22.736095",
"423e5a24-d4e0-493a-83df-ecff0eca2398", "423e5a24-d4e0-493a-83df-ecff0eca2398",
"public", "public",
"users", "users",
"new_user", "new_user",
"{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 7, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"5e088982a14f9bdd\", \"trace_id\": \"da0635bf4fb444b1\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}", "{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 7, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"5e088982a14f9bdd\", \"trace_id\": \"da0635bf4fb444b1\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}",
"f", "f",
"t", "t",
"5", "5",
"2021-05-18 07:39:50.490999", "2021-05-18 07:39:50.490999",
"NULL", "NULL",
"NULL", "NULL",
"f" "f"
], ],
[ [
"48532d4d-ee73-4245-a8f6-378b034eb4f0", "48532d4d-ee73-4245-a8f6-378b034eb4f0",
"338eec2d-0c1f-4358-ae12-05d3f73a85c6", "338eec2d-0c1f-4358-ae12-05d3f73a85c6",
"1000", "1000",
"{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":9}},\"trace_context\":{\"trace_id\":\"ea970ad818f358cf\",\"span_id\":\"77150de9d725e5df\"}},\"created_at\":\"2021-05-18T07:39:50.831182Z\",\"id\":\"338eec2d-0c1f-4358-ae12-05d3f73a85c6\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":3},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}", "{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":9}},\"trace_context\":{\"trace_id\":\"ea970ad818f358cf\",\"span_id\":\"77150de9d725e5df\"}},\"created_at\":\"2021-05-18T07:39:50.831182Z\",\"id\":\"338eec2d-0c1f-4358-ae12-05d3f73a85c6\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":3},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}",
"{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"ea970ad818f358cf\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"4d8d92209b40eab3\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"876f35924d13168e\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}", "{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"ea970ad818f358cf\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"4d8d92209b40eab3\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"876f35924d13168e\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}",
"2021-05-18 07:40:22.736039", "2021-05-18 07:40:22.736039",
"338eec2d-0c1f-4358-ae12-05d3f73a85c6", "338eec2d-0c1f-4358-ae12-05d3f73a85c6",
"public", "public",
"users", "users",
"new_user", "new_user",
"{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 9, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"77150de9d725e5df\", \"trace_id\": \"ea970ad818f358cf\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}", "{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 9, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"77150de9d725e5df\", \"trace_id\": \"ea970ad818f358cf\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}",
"f", "f",
"t", "t",
"5", "5",
"2021-05-18 07:39:50.831182", "2021-05-18 07:39:50.831182",
"NULL", "NULL",
"NULL", "NULL",
"f" "f"
], ],
[ [
"33105396-99dc-446c-ac7f-d93c38ceb686", "33105396-99dc-446c-ac7f-d93c38ceb686",
"c3ac48be-a569-4d87-8c52-cb84309002ed", "c3ac48be-a569-4d87-8c52-cb84309002ed",
"1000", "1000",
"{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":6}},\"trace_context\":{\"trace_id\":\"ecba73bac1b4601a\",\"span_id\":\"5a75ae38fccf4473\"}},\"created_at\":\"2021-05-18T07:39:50.332379Z\",\"id\":\"c3ac48be-a569-4d87-8c52-cb84309002ed\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":3},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}", "{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":6}},\"trace_context\":{\"trace_id\":\"ecba73bac1b4601a\",\"span_id\":\"5a75ae38fccf4473\"}},\"created_at\":\"2021-05-18T07:39:50.332379Z\",\"id\":\"c3ac48be-a569-4d87-8c52-cb84309002ed\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":3},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}",
"{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"ecba73bac1b4601a\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"4fa95afd2b803b9c\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"de923514252481ca\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}", "{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"ecba73bac1b4601a\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"4fa95afd2b803b9c\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"de923514252481ca\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}",
"2021-05-18 07:40:22.735757", "2021-05-18 07:40:22.735757",
"c3ac48be-a569-4d87-8c52-cb84309002ed", "c3ac48be-a569-4d87-8c52-cb84309002ed",
"public", "public",
"users", "users",
"new_user", "new_user",
"{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 6, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"5a75ae38fccf4473\", \"trace_id\": \"ecba73bac1b4601a\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}", "{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 6, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"5a75ae38fccf4473\", \"trace_id\": \"ecba73bac1b4601a\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}",
"f", "f",
"t", "t",
"5", "5",
"2021-05-18 07:39:50.332379", "2021-05-18 07:39:50.332379",
"NULL", "NULL",
"NULL", "NULL",
"f" "f"
], ],
[ [
"f7980cf5-7520-489a-87f1-f658773f9e60", "f7980cf5-7520-489a-87f1-f658773f9e60",
"423e5a24-d4e0-493a-83df-ecff0eca2398", "423e5a24-d4e0-493a-83df-ecff0eca2398",
"1000", "1000",
"{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":7}},\"trace_context\":{\"trace_id\":\"da0635bf4fb444b1\",\"span_id\":\"5e088982a14f9bdd\"}},\"created_at\":\"2021-05-18T07:39:50.490999Z\",\"id\":\"423e5a24-d4e0-493a-83df-ecff0eca2398\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":2},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}", "{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":7}},\"trace_context\":{\"trace_id\":\"da0635bf4fb444b1\",\"span_id\":\"5e088982a14f9bdd\"}},\"created_at\":\"2021-05-18T07:39:50.490999Z\",\"id\":\"423e5a24-d4e0-493a-83df-ecff0eca2398\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":2},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}",
"{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"da0635bf4fb444b1\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"2fbf0361df48ccc7\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"ebc5dd9ef22f9543\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}", "{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"da0635bf4fb444b1\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"2fbf0361df48ccc7\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"ebc5dd9ef22f9543\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}",
"2021-05-18 07:40:11.704173", "2021-05-18 07:40:11.704173",
"423e5a24-d4e0-493a-83df-ecff0eca2398", "423e5a24-d4e0-493a-83df-ecff0eca2398",
"public", "public",
"users", "users",
"new_user", "new_user",
"{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 7, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"5e088982a14f9bdd\", \"trace_id\": \"da0635bf4fb444b1\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}", "{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 7, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"5e088982a14f9bdd\", \"trace_id\": \"da0635bf4fb444b1\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}",
"f", "f",
"t", "t",
"5", "5",
"2021-05-18 07:39:50.490999", "2021-05-18 07:39:50.490999",
"NULL", "NULL",
"NULL", "NULL",
"f" "f"
], ],
[ [
"18e6a7de-c38d-4f56-90f5-d0cc1298ea97", "18e6a7de-c38d-4f56-90f5-d0cc1298ea97",
"338eec2d-0c1f-4358-ae12-05d3f73a85c6", "338eec2d-0c1f-4358-ae12-05d3f73a85c6",
"1000", "1000",
"{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":9}},\"trace_context\":{\"trace_id\":\"ea970ad818f358cf\",\"span_id\":\"77150de9d725e5df\"}},\"created_at\":\"2021-05-18T07:39:50.831182Z\",\"id\":\"338eec2d-0c1f-4358-ae12-05d3f73a85c6\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":2},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}", "{\"payload\":{\"event\":{\"session_variables\":{\"x-hasura-role\":\"admin\"},\"op\":\"INSERT\",\"data\":{\"old\":null,\"new\":{\"name\":\"safs\",\"id\":9}},\"trace_context\":{\"trace_id\":\"ea970ad818f358cf\",\"span_id\":\"77150de9d725e5df\"}},\"created_at\":\"2021-05-18T07:39:50.831182Z\",\"id\":\"338eec2d-0c1f-4358-ae12-05d3f73a85c6\",\"delivery_info\":{\"max_retries\":4,\"current_retry\":2},\"trigger\":{\"name\":\"new_user\"},\"table\":{\"schema\":\"public\",\"name\":\"users\"}},\"headers\":[{\"value\":\"application/json\",\"name\":\"Content-Type\"},{\"value\":\"hasura-graphql-engine/v2.0.0-alpha.9\",\"name\":\"User-Agent\"}],\"version\":\"2\"}",
"{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"ea970ad818f358cf\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"18ac4aa73874b52d\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"705e55f29e621be4\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}", "{\"data\":{\"message\":\"\\\"HttpExceptionRequest Request {\\\\n host = \\\\\\\"httsssp.org\\\\\\\"\\\\n port = 80\\\\n secure = False\\\\n requestHeaders = [(\\\\\\\"X-B3-TraceId\\\\\\\",\\\\\\\"ea970ad818f358cf\\\\\\\"),(\\\\\\\"X-B3-SpanId\\\\\\\",\\\\\\\"18ac4aa73874b52d\\\\\\\"),(\\\\\\\"X-B3-ParentSpanId\\\\\\\",\\\\\\\"705e55f29e621be4\\\\\\\"),(\\\\\\\"Content-Type\\\\\\\",\\\\\\\"application/json\\\\\\\"),(\\\\\\\"User-Agent\\\\\\\",\\\\\\\"hasura-graphql-engine/v2.0.0-alpha.9\\\\\\\")]\\\\n path = \\\\\\\"/post\\\\\\\"\\\\n queryString = \\\\\\\"\\\\\\\"\\\\n method = \\\\\\\"POST\\\\\\\"\\\\n proxy = Nothing\\\\n rawBody = False\\\\n redirectCount = 10\\\\n responseTimeout = ResponseTimeoutMicro 60000000\\\\n requestVersion = HTTP/1.1\\\\n proxySecureMode = ProxySecureWithConnect\\\\n}\\\\n (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just \\\\\\\"httsssp.org\\\\\\\", service name: Just \\\\\\\"80\\\\\\\"): does not exist (Name or service not known))\\\"\"},\"version\":\"2\",\"type\":\"client_error\"}",
"2021-05-18 07:40:11.704093", "2021-05-18 07:40:11.704093",
"338eec2d-0c1f-4358-ae12-05d3f73a85c6", "338eec2d-0c1f-4358-ae12-05d3f73a85c6",
"public", "public",
"users", "users",
"new_user", "new_user",
"{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 9, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"77150de9d725e5df\", \"trace_id\": \"ea970ad818f358cf\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}", "{\"op\": \"INSERT\", \"data\": {\"new\": {\"id\": 9, \"name\": \"safs\"}, \"old\": null}, \"trace_context\": {\"span_id\": \"77150de9d725e5df\", \"trace_id\": \"ea970ad818f358cf\"}, \"session_variables\": {\"x-hasura-role\": \"admin\"}}",
"f", "f",
"t", "t",
"5", "5",
"2021-05-18 07:39:50.831182", "2021-05-18 07:39:50.831182",
"NULL", "NULL",
"NULL", "NULL",
"f" "f"
] ]
] ]

View File

@ -332,4 +332,4 @@
width: 15px; width: 15px;
min-width: 15px; min-width: 15px;
cursor: pointer; cursor: pointer;
} }

View File

@ -35,7 +35,7 @@ const InheritedRolesEditor: React.FC<EditorProps> = ({
const [isCollapsed, setIsCollapsed] = useState(props.isCollapsed); const [isCollapsed, setIsCollapsed] = useState(props.isCollapsed);
type Option = { type Option = {
value: typeof allRoles[number]; value: (typeof allRoles)[number];
isChecked: true | false; isChecked: true | false;
}; };

View File

@ -150,24 +150,26 @@ CloudMetadataKo.parameters = {
msw: mockHandlers({}), msw: mockHandlers({}),
}; };
export const ProLitePrometheusEnabled: ComponentStory<typeof Sidebar> = export const ProLitePrometheusEnabled: ComponentStory<
args => { typeof Sidebar
// eslint-disable-next-line no-underscore-dangle > = args => {
window.__env.consoleType = 'pro-lite'; // eslint-disable-next-line no-underscore-dangle
return <Sidebar {...args} />; window.__env.consoleType = 'pro-lite';
}; return <Sidebar {...args} />;
};
ProLitePrometheusEnabled.storyName = '💠 Demo Pro Lite Prometheus Enabled'; ProLitePrometheusEnabled.storyName = '💠 Demo Pro Lite Prometheus Enabled';
ProLitePrometheusEnabled.args = generateArgs(); ProLitePrometheusEnabled.args = generateArgs();
ProLitePrometheusEnabled.parameters = { ProLitePrometheusEnabled.parameters = {
msw: mockHandlers({ prometheusEnabled: true }), msw: mockHandlers({ prometheusEnabled: true }),
}; };
export const ProLitePrometheusDisabled: ComponentStory<typeof Sidebar> = export const ProLitePrometheusDisabled: ComponentStory<
args => { typeof Sidebar
// eslint-disable-next-line no-underscore-dangle > = args => {
window.__env.consoleType = 'pro-lite'; // eslint-disable-next-line no-underscore-dangle
return <Sidebar {...args} />; window.__env.consoleType = 'pro-lite';
}; return <Sidebar {...args} />;
};
ProLitePrometheusDisabled.storyName = '💠 Demo Pro Lite Prometheus Disabled'; ProLitePrometheusDisabled.storyName = '💠 Demo Pro Lite Prometheus Disabled';
ProLitePrometheusDisabled.args = generateArgs(); ProLitePrometheusDisabled.args = generateArgs();
ProLitePrometheusDisabled.parameters = { ProLitePrometheusDisabled.parameters = {

View File

@ -46,7 +46,7 @@ export const drivers = [
'cockroach', 'cockroach',
'alloy', 'alloy',
] as const; ] as const;
export type Driver = typeof drivers[number]; export type Driver = (typeof drivers)[number];
export const driverToLabel: Record<Driver, string> = { export const driverToLabel: Record<Driver, string> = {
postgres: 'PostgreSQL', postgres: 'PostgreSQL',

View File

@ -7,37 +7,38 @@ export interface OasGeneratorMoreInfoProps {
operation: Operation; operation: Operation;
} }
export const OasGeneratorMoreInfo: React.FC<OasGeneratorMoreInfoProps> = export const OasGeneratorMoreInfo: React.FC<
props => { OasGeneratorMoreInfoProps
const { operation } = props; > = props => {
const [isExpanded, setExpanded] = React.useState(false); const { operation } = props;
return ( const [isExpanded, setExpanded] = React.useState(false);
<div> return (
<div <div>
className="flex justify-between cursor-pointer" <div
onClick={() => setExpanded(!isExpanded)} className="flex justify-between cursor-pointer"
> onClick={() => setExpanded(!isExpanded)}
<div>{operation.path}</div> >
<div> <div>{operation.path}</div>
More info{' '} <div>
<FaChevronDown More info{' '}
className={clsx( <FaChevronDown
isExpanded ? 'rotate-180' : '', className={clsx(
'transition-all duration-300 ease-in-out' isExpanded ? 'rotate-180' : '',
)} 'transition-all duration-300 ease-in-out'
/> )}
</div> />
</div>
<div
className={clsx(
'whitespace-normal',
isExpanded ? 'h-auto pt-4' : 'h-0 pt-0',
'overflow-hidden transition-all duration-300 ease-in-out'
)}
>
{operation.description.trim() ??
'No description available for this endpoint'}
</div> </div>
</div> </div>
); <div
}; className={clsx(
'whitespace-normal',
isExpanded ? 'h-auto pt-4' : 'h-0 pt-0',
'overflow-hidden transition-all duration-300 ease-in-out'
)}
>
{operation.description.trim() ??
'No description available for this endpoint'}
</div>
</div>
);
};

View File

@ -7,33 +7,34 @@ interface AllowListSidebarSearchFormProps {
setSearch: (search: string) => void; setSearch: (search: string) => void;
} }
export const AllowListSidebarSearchForm: React.FC<AllowListSidebarSearchFormProps> = export const AllowListSidebarSearchForm: React.FC<
({ setSearch }) => { AllowListSidebarSearchFormProps
const schema = z.object({ > = ({ setSearch }) => {
search: z.string(), const schema = z.object({
}); search: z.string(),
});
const { const {
methods: { watch }, methods: { watch },
Form, Form,
} = useConsoleForm({ } = useConsoleForm({
schema, schema,
}); });
const search = watch('search'); const search = watch('search');
useEffect(() => { useEffect(() => {
setSearch(search); setSearch(search);
}, [search]); }, [search]);
return ( return (
<Form onSubmit={() => {}} className="pl-0 pr-0 !p-0 bg-transparent"> <Form onSubmit={() => {}} className="pl-0 pr-0 !p-0 bg-transparent">
<InputField <InputField
id="search" id="search"
placeholder="Search Collections..." placeholder="Search Collections..."
icon={<FaSearch />} icon={<FaSearch />}
name="search" name="search"
/> />
</Form> </Form>
); );
}; };

Some files were not shown because too many files have changed in this diff Show More