mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-16 09:36:44 +00:00
fix: Fix formatting/linting for CI (no-changelog) (#5264)
* ⬆️ Upgrade Prettier * 📦 Update `pnpm-lock.yaml` * 🎨 Format all packages * 🔧 Specify `prettierPath`
This commit is contained in:
@@ -1,4 +1,9 @@
|
||||
import { MANUAL_TRIGGER_NODE_NAME, CODE_NODE_NAME, SCHEDULE_TRIGGER_NODE_NAME, SET_NODE_NAME } from './../constants';
|
||||
import {
|
||||
MANUAL_TRIGGER_NODE_NAME,
|
||||
CODE_NODE_NAME,
|
||||
SCHEDULE_TRIGGER_NODE_NAME,
|
||||
SET_NODE_NAME,
|
||||
} from './../constants';
|
||||
import { WorkflowPage as WorkflowPageClass } from '../pages/workflow';
|
||||
|
||||
const WorkflowPage = new WorkflowPageClass();
|
||||
@@ -57,14 +62,17 @@ describe('Canvas Actions', () => {
|
||||
WorkflowPage.actions.addNodeToCanvas(SCHEDULE_TRIGGER_NODE_NAME);
|
||||
WorkflowPage.actions.addNodeToCanvas(CODE_NODE_NAME);
|
||||
WorkflowPage.getters.nodeConnections().first().trigger('mouseover', { force: true });
|
||||
cy.get('.connection-actions .add').as('AddNodeConnectionButton')
|
||||
cy.get('.connection-actions .add').as('AddNodeConnectionButton');
|
||||
cy.get('@AddNodeConnectionButton').invoke('show');
|
||||
cy.get('@AddNodeConnectionButton').should('be.visible').click();
|
||||
WorkflowPage.actions.addNodeToCanvas(SET_NODE_NAME);
|
||||
WorkflowPage.getters.canvasNodes().should('have.length', 3);
|
||||
WorkflowPage.getters.nodeConnections().should('have.length', 2);
|
||||
// And last node should be pushed to the right
|
||||
WorkflowPage.getters.canvasNodes().last().should('have.attr', 'style', 'left: 640px; top: 260px;');
|
||||
WorkflowPage.getters
|
||||
.canvasNodes()
|
||||
.last()
|
||||
.should('have.attr', 'style', 'left: 640px; top: 260px;');
|
||||
});
|
||||
|
||||
it('should delete node using node action button', () => {
|
||||
@@ -114,37 +122,48 @@ describe('Canvas Actions', () => {
|
||||
WorkflowPage.actions.addNodeToCanvas(CODE_NODE_NAME);
|
||||
WorkflowPage.actions.zoomToFit();
|
||||
cy.drag('[data-test-id="canvas-node"].jtk-drag-selected', 50, 150);
|
||||
WorkflowPage.getters.canvasNodes().last().should('have.attr', 'style', 'left: 740px; top: 360px;');
|
||||
WorkflowPage.getters
|
||||
.canvasNodes()
|
||||
.last()
|
||||
.should('have.attr', 'style', 'left: 740px; top: 360px;');
|
||||
});
|
||||
|
||||
it('should zoom in', () => {
|
||||
WorkflowPage.getters.zoomInButton().should('be.visible').click();
|
||||
WorkflowPage.getters.nodeView().should(
|
||||
'have.css',
|
||||
'transform',
|
||||
`matrix(${ ZOOM_IN_X1_FACTOR }, 0, 0, ${ ZOOM_IN_X1_FACTOR }, 0, 0)`
|
||||
);
|
||||
WorkflowPage.getters
|
||||
.nodeView()
|
||||
.should(
|
||||
'have.css',
|
||||
'transform',
|
||||
`matrix(${ZOOM_IN_X1_FACTOR}, 0, 0, ${ZOOM_IN_X1_FACTOR}, 0, 0)`,
|
||||
);
|
||||
WorkflowPage.getters.zoomInButton().click();
|
||||
WorkflowPage.getters.nodeView().should(
|
||||
'have.css',
|
||||
'transform',
|
||||
`matrix(${ ZOOM_IN_X2_FACTOR }, 0, 0, ${ ZOOM_IN_X2_FACTOR }, 0, 0)`
|
||||
);
|
||||
WorkflowPage.getters
|
||||
.nodeView()
|
||||
.should(
|
||||
'have.css',
|
||||
'transform',
|
||||
`matrix(${ZOOM_IN_X2_FACTOR}, 0, 0, ${ZOOM_IN_X2_FACTOR}, 0, 0)`,
|
||||
);
|
||||
});
|
||||
|
||||
it('should zoom out', () => {
|
||||
WorkflowPage.getters.zoomOutButton().should('be.visible').click();
|
||||
WorkflowPage.getters.nodeView().should(
|
||||
'have.css',
|
||||
'transform',
|
||||
`matrix(${ ZOOM_OUT_X1_FACTOR }, 0, 0, ${ ZOOM_OUT_X1_FACTOR }, 0, 0)`
|
||||
);
|
||||
WorkflowPage.getters
|
||||
.nodeView()
|
||||
.should(
|
||||
'have.css',
|
||||
'transform',
|
||||
`matrix(${ZOOM_OUT_X1_FACTOR}, 0, 0, ${ZOOM_OUT_X1_FACTOR}, 0, 0)`,
|
||||
);
|
||||
WorkflowPage.getters.zoomOutButton().click();
|
||||
WorkflowPage.getters.nodeView().should(
|
||||
'have.css',
|
||||
'transform',
|
||||
`matrix(${ ZOOM_OUT_X2_FACTOR }, 0, 0, ${ ZOOM_OUT_X2_FACTOR }, 0, 0)`
|
||||
);
|
||||
WorkflowPage.getters
|
||||
.nodeView()
|
||||
.should(
|
||||
'have.css',
|
||||
'transform',
|
||||
`matrix(${ZOOM_OUT_X2_FACTOR}, 0, 0, ${ZOOM_OUT_X2_FACTOR}, 0, 0)`,
|
||||
);
|
||||
});
|
||||
|
||||
it('should reset zoom', () => {
|
||||
@@ -152,11 +171,13 @@ describe('Canvas Actions', () => {
|
||||
WorkflowPage.getters.resetZoomButton().should('not.exist');
|
||||
WorkflowPage.getters.zoomInButton().click();
|
||||
WorkflowPage.getters.resetZoomButton().should('be.visible').click();
|
||||
WorkflowPage.getters.nodeView().should(
|
||||
'have.css',
|
||||
'transform',
|
||||
`matrix(${ DEFAULT_ZOOM_FACTOR }, 0, 0, ${ DEFAULT_ZOOM_FACTOR }, 0, 0)`
|
||||
);
|
||||
WorkflowPage.getters
|
||||
.nodeView()
|
||||
.should(
|
||||
'have.css',
|
||||
'transform',
|
||||
`matrix(${DEFAULT_ZOOM_FACTOR}, 0, 0, ${DEFAULT_ZOOM_FACTOR}, 0, 0)`,
|
||||
);
|
||||
});
|
||||
|
||||
it('should zoom to fit', () => {
|
||||
@@ -187,7 +208,7 @@ describe('Canvas Actions', () => {
|
||||
WorkflowPage.getters.canvasNodes().last().should('have.class', 'jtk-drag-selected');
|
||||
});
|
||||
|
||||
it ('should select nodes using shift and arrow keys', () => {
|
||||
it('should select nodes using shift and arrow keys', () => {
|
||||
WorkflowPage.actions.addNodeToCanvas(MANUAL_TRIGGER_NODE_NAME);
|
||||
WorkflowPage.actions.addNodeToCanvas(CODE_NODE_NAME);
|
||||
cy.wait(500);
|
||||
@@ -260,7 +281,7 @@ describe('Canvas Actions', () => {
|
||||
.click({ force: true });
|
||||
WorkflowPage.getters.canvasNodes().should('have.length', 3);
|
||||
WorkflowPage.getters.nodeConnections().should('have.length', 1);
|
||||
})
|
||||
});
|
||||
|
||||
it('should execute node', () => {
|
||||
WorkflowPage.actions.addNodeToCanvas(MANUAL_TRIGGER_NODE_NAME);
|
||||
|
||||
@@ -27,15 +27,18 @@ describe('Data pinning', () => {
|
||||
ndv.getters.outputTableHeaders().first().should('include.text', 'timestamp');
|
||||
ndv.getters.outputTableHeaders().eq(1).should('include.text', 'Readable date');
|
||||
|
||||
ndv.getters.outputTbodyCell(1, 0).invoke('text').then((prevValue) => {
|
||||
ndv.actions.pinData();
|
||||
ndv.actions.close();
|
||||
ndv.getters
|
||||
.outputTbodyCell(1, 0)
|
||||
.invoke('text')
|
||||
.then((prevValue) => {
|
||||
ndv.actions.pinData();
|
||||
ndv.actions.close();
|
||||
|
||||
workflowPage.actions.executeWorkflow();
|
||||
workflowPage.actions.openNode('Schedule Trigger');
|
||||
workflowPage.actions.executeWorkflow();
|
||||
workflowPage.actions.openNode('Schedule Trigger');
|
||||
|
||||
ndv.getters.outputTbodyCell(1, 0).invoke('text').should('eq', prevValue);
|
||||
});
|
||||
ndv.getters.outputTbodyCell(1, 0).invoke('text').should('eq', prevValue);
|
||||
});
|
||||
});
|
||||
|
||||
it('Should be be able to set pinned data', () => {
|
||||
|
||||
@@ -1,7 +1,21 @@
|
||||
import { HTTP_REQUEST_NODE_TYPE } from './../../packages/editor-ui/src/constants';
|
||||
import { NEW_NOTION_ACCOUNT_NAME, NOTION_NODE_NAME, PIPEDRIVE_NODE_NAME, HTTP_REQUEST_NODE_NAME, NEW_QUERY_AUTH_ACCOUNT_NAME } from './../constants';
|
||||
import {
|
||||
NEW_NOTION_ACCOUNT_NAME,
|
||||
NOTION_NODE_NAME,
|
||||
PIPEDRIVE_NODE_NAME,
|
||||
HTTP_REQUEST_NODE_NAME,
|
||||
NEW_QUERY_AUTH_ACCOUNT_NAME,
|
||||
} from './../constants';
|
||||
import { visit } from 'recast';
|
||||
import { DEFAULT_USER_EMAIL, DEFAULT_USER_PASSWORD, GMAIL_NODE_NAME, NEW_GOOGLE_ACCOUNT_NAME, NEW_TRELLO_ACCOUNT_NAME, SCHEDULE_TRIGGER_NODE_NAME, TRELLO_NODE_NAME } from '../constants';
|
||||
import {
|
||||
DEFAULT_USER_EMAIL,
|
||||
DEFAULT_USER_PASSWORD,
|
||||
GMAIL_NODE_NAME,
|
||||
NEW_GOOGLE_ACCOUNT_NAME,
|
||||
NEW_TRELLO_ACCOUNT_NAME,
|
||||
SCHEDULE_TRIGGER_NODE_NAME,
|
||||
TRELLO_NODE_NAME,
|
||||
} from '../constants';
|
||||
import { randFirstName, randLastName } from '@ngneat/falso';
|
||||
import { CredentialsPage, CredentialsModal, WorkflowPage, NDV } from '../pages';
|
||||
|
||||
@@ -106,7 +120,7 @@ describe('Credentials', () => {
|
||||
credentialsModal.actions.fillCredentialsForm();
|
||||
cy.get('.el-message-box').find('button').contains('Close').click();
|
||||
workflowPage.getters.nodeCredentialsSelect().should('contain', NEW_GOOGLE_ACCOUNT_NAME);
|
||||
})
|
||||
});
|
||||
|
||||
it('should show multiple credential types in the same dropdown', () => {
|
||||
workflowPage.actions.visit();
|
||||
@@ -226,7 +240,10 @@ describe('Credentials', () => {
|
||||
nodeDetailsView.getters.parameterInput('authentication').find('li').last().click();
|
||||
nodeDetailsView.getters.parameterInput('genericAuthType').should('exist');
|
||||
nodeDetailsView.getters.parameterInput('genericAuthType').click();
|
||||
nodeDetailsView.getters.parameterInput('genericAuthType').find('li').should('have.length.greaterThan', 0);
|
||||
nodeDetailsView.getters
|
||||
.parameterInput('genericAuthType')
|
||||
.find('li')
|
||||
.should('have.length.greaterThan', 0);
|
||||
nodeDetailsView.getters.parameterInput('genericAuthType').find('li').last().click();
|
||||
|
||||
workflowPage.getters.nodeCredentialsSelect().should('exist');
|
||||
|
||||
@@ -69,8 +69,8 @@ describe('NDV', () => {
|
||||
workflowPage.actions.addNodeToCanvas('Airtable', true);
|
||||
ndv.getters.container().should('be.visible');
|
||||
cy.get('.has-issues').should('have.length', 0);
|
||||
ndv.getters.parameterInput('table').find('input').eq(1).focus().blur()
|
||||
ndv.getters.parameterInput('application').find('input').eq(1).focus().blur()
|
||||
ndv.getters.parameterInput('table').find('input').eq(1).focus().blur();
|
||||
ndv.getters.parameterInput('application').find('input').eq(1).focus().blur();
|
||||
cy.get('.has-issues').should('have.length', 2);
|
||||
ndv.getters.backToCanvas().click();
|
||||
workflowPage.actions.openNode('Airtable');
|
||||
@@ -87,5 +87,4 @@ describe('NDV', () => {
|
||||
cy.get('[class*=hasIssues]').should('have.length', 1);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
import { CODE_NODE_NAME, MANUAL_TRIGGER_NODE_NAME, META_KEY, SCHEDULE_TRIGGER_NODE_NAME } from '../constants';
|
||||
import {
|
||||
CODE_NODE_NAME,
|
||||
MANUAL_TRIGGER_NODE_NAME,
|
||||
META_KEY,
|
||||
SCHEDULE_TRIGGER_NODE_NAME,
|
||||
} from '../constants';
|
||||
import { WorkflowPage as WorkflowPageClass } from '../pages/workflow';
|
||||
|
||||
const NEW_WORKFLOW_NAME = 'Something else';
|
||||
const TEST_WF_TAGS = ['Tag 1', 'Tag 2', 'Tag 3'];
|
||||
const IMPORT_WORKFLOW_URL = 'https://www.jsonkeeper.com/b/FNB0#.json';
|
||||
const DUPLICATE_WORKFLOW_NAME = 'Duplicated workflow';
|
||||
const DUPLICATE_WORKFLOW_TAG = 'Duplicate'
|
||||
const DUPLICATE_WORKFLOW_TAG = 'Duplicate';
|
||||
|
||||
const WorkflowPage = new WorkflowPageClass();
|
||||
|
||||
@@ -201,8 +206,7 @@ describe('Workflow Actions', () => {
|
||||
it('should not be able to delete unsaved workflow', () => {
|
||||
WorkflowPage.getters.workflowMenu().should('be.visible');
|
||||
WorkflowPage.getters.workflowMenu().click();
|
||||
WorkflowPage.getters.workflowMenuItemDelete().closest('li')
|
||||
.should('have.class', 'is-disabled');
|
||||
WorkflowPage.getters.workflowMenuItemDelete().closest('li').should('have.class', 'is-disabled');
|
||||
});
|
||||
|
||||
it('should delete workflow', () => {
|
||||
@@ -218,9 +222,9 @@ describe('Workflow Actions', () => {
|
||||
|
||||
it('should duplicate workflow', () => {
|
||||
// Stub window.open so new tab is not getting opened
|
||||
cy.window().then(win => {
|
||||
cy.stub(win, 'open').as('open')
|
||||
})
|
||||
cy.window().then((win) => {
|
||||
cy.stub(win, 'open').as('open');
|
||||
});
|
||||
|
||||
WorkflowPage.actions.addNodeToCanvas(MANUAL_TRIGGER_NODE_NAME);
|
||||
WorkflowPage.actions.saveWorkflowOnButtonClick();
|
||||
@@ -230,13 +234,23 @@ describe('Workflow Actions', () => {
|
||||
WorkflowPage.getters.duplicateWorkflowModal().should('be.visible');
|
||||
WorkflowPage.getters.duplicateWorkflowModal().find('input').first().should('be.visible');
|
||||
WorkflowPage.getters.duplicateWorkflowModal().find('input').first().type('{selectall}');
|
||||
WorkflowPage.getters.duplicateWorkflowModal().find('input').first().type(DUPLICATE_WORKFLOW_NAME);
|
||||
WorkflowPage.getters.duplicateWorkflowModal().find('.el-select__tags input').type(DUPLICATE_WORKFLOW_TAG);
|
||||
WorkflowPage.getters
|
||||
.duplicateWorkflowModal()
|
||||
.find('input')
|
||||
.first()
|
||||
.type(DUPLICATE_WORKFLOW_NAME);
|
||||
WorkflowPage.getters
|
||||
.duplicateWorkflowModal()
|
||||
.find('.el-select__tags input')
|
||||
.type(DUPLICATE_WORKFLOW_TAG);
|
||||
WorkflowPage.getters.duplicateWorkflowModal().find('.el-select__tags input').type('{enter}');
|
||||
WorkflowPage.getters.duplicateWorkflowModal().find('.el-select__tags input').type('{enter}');
|
||||
WorkflowPage.getters.duplicateWorkflowModal().find('button').contains('Duplicate').should('be.visible');
|
||||
WorkflowPage.getters
|
||||
.duplicateWorkflowModal()
|
||||
.find('button')
|
||||
.contains('Duplicate')
|
||||
.should('be.visible');
|
||||
WorkflowPage.getters.duplicateWorkflowModal().find('button').contains('Duplicate').click();
|
||||
WorkflowPage.getters.errorToast().should('not.exist');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -1,32 +1,29 @@
|
||||
{
|
||||
"meta": {
|
||||
"instanceId": "3204fc455f5cbeb4e71fdbd3b1dfaf0b088088dea3e639de49e61462b80ffc1d"
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {
|
||||
"application": {
|
||||
"__rl": true,
|
||||
"mode": "url",
|
||||
"value": "",
|
||||
"__regex": "https://airtable.com/([a-zA-Z0-9]{2,})"
|
||||
},
|
||||
"table": {
|
||||
"__rl": true,
|
||||
"mode": "url",
|
||||
"value": "",
|
||||
"__regex": "https://airtable.com/[a-zA-Z0-9]{2,}/([a-zA-Z0-9]{2,})"
|
||||
}
|
||||
},
|
||||
"id": "e0c0cf7e-aa98-4b72-9645-6e64e2902bd1",
|
||||
"name": "Airtable",
|
||||
"type": "n8n-nodes-base.airtable",
|
||||
"typeVersion": 1,
|
||||
"position": [
|
||||
380,
|
||||
180
|
||||
]
|
||||
}
|
||||
],
|
||||
"connections": {}
|
||||
"meta": {
|
||||
"instanceId": "3204fc455f5cbeb4e71fdbd3b1dfaf0b088088dea3e639de49e61462b80ffc1d"
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {
|
||||
"application": {
|
||||
"__rl": true,
|
||||
"mode": "url",
|
||||
"value": "",
|
||||
"__regex": "https://airtable.com/([a-zA-Z0-9]{2,})"
|
||||
},
|
||||
"table": {
|
||||
"__rl": true,
|
||||
"mode": "url",
|
||||
"value": "",
|
||||
"__regex": "https://airtable.com/[a-zA-Z0-9]{2,}/([a-zA-Z0-9]{2,})"
|
||||
}
|
||||
},
|
||||
"id": "e0c0cf7e-aa98-4b72-9645-6e64e2902bd1",
|
||||
"name": "Airtable",
|
||||
"type": "n8n-nodes-base.airtable",
|
||||
"typeVersion": 1,
|
||||
"position": [380, 180]
|
||||
}
|
||||
],
|
||||
"connections": {}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,8 @@ export class CredentialsModal extends BasePage {
|
||||
closeButton: () => this.getters.editCredentialModal().find('.el-dialog__close').first(),
|
||||
credentialsEditModal: () => cy.getByTestId('credential-edit-dialog'),
|
||||
credentialsAuthTypeSelector: () => cy.getByTestId('node-auth-type-selector'),
|
||||
credentialAuthTypeRadioButtons: () => this.getters.credentialsAuthTypeSelector().find('label[role=radio]'),
|
||||
credentialAuthTypeRadioButtons: () =>
|
||||
this.getters.credentialsAuthTypeSelector().find('label[role=radio]'),
|
||||
credentialInputs: () => cy.getByTestId('credential-connection-parameter'),
|
||||
};
|
||||
actions = {
|
||||
@@ -49,9 +50,12 @@ export class CredentialsModal extends BasePage {
|
||||
fillCredentialsForm: () => {
|
||||
this.getters.credentialsEditModal().should('be.visible');
|
||||
this.getters.credentialInputs().should('have.length.greaterThan', 0);
|
||||
this.getters.credentialInputs().find('input[type=text], input[type=password]').each(($el) => {
|
||||
cy.wrap($el).type('test');
|
||||
});
|
||||
this.getters
|
||||
.credentialInputs()
|
||||
.find('input[type=text], input[type=password]')
|
||||
.each(($el) => {
|
||||
cy.wrap($el).type('test');
|
||||
});
|
||||
this.getters.saveButton().click();
|
||||
this.getters.closeButton().click();
|
||||
},
|
||||
@@ -59,6 +63,6 @@ export class CredentialsModal extends BasePage {
|
||||
this.getters.nameInput().type('{selectall}');
|
||||
this.getters.nameInput().type(newName);
|
||||
this.getters.nameInput().type('{enter}');
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@ export class NDV extends BasePage {
|
||||
outputTableRows: () => this.getters.outputDataContainer().find('table tr'),
|
||||
outputTableHeaders: () => this.getters.outputDataContainer().find('table thead th'),
|
||||
outputTableRow: (row: number) => this.getters.outputTableRows().eq(row),
|
||||
outputTbodyCell: (row: number, cell: number) => this.getters.outputTableRow(row).find('td').eq(cell),
|
||||
outputTbodyCell: (row: number, cell: number) =>
|
||||
this.getters.outputTableRow(row).find('td').eq(cell),
|
||||
parameterInput: (parameterName: string) => cy.getByTestId(`parameter-input-${parameterName}`),
|
||||
nodeNameContainer: () => cy.getByTestId('node-title-container'),
|
||||
nodeRenameInput: () => cy.getByTestId('node-rename-input'),
|
||||
@@ -44,10 +45,10 @@ export class NDV extends BasePage {
|
||||
setPinnedData: (data: object) => {
|
||||
this.getters.editPinnedDataButton().click();
|
||||
|
||||
const editor = this.getters.pinnedDataEditor()
|
||||
const editor = this.getters.pinnedDataEditor();
|
||||
editor.click();
|
||||
editor.type(`{selectall}{backspace}`);
|
||||
editor.type(JSON.stringify(data).replace(new RegExp('{', 'g'),'{{}'));
|
||||
editor.type(JSON.stringify(data).replace(new RegExp('{', 'g'), '{{}'));
|
||||
|
||||
this.getters.savePinnedDataButton().click();
|
||||
},
|
||||
@@ -55,18 +56,11 @@ export class NDV extends BasePage {
|
||||
this.getters.parameterInput(parameterName).type(content);
|
||||
},
|
||||
selectOptionInParameterDropdown: (parameterName: string, content: string) => {
|
||||
this.getters
|
||||
.parameterInput(parameterName)
|
||||
.find('.option-headline')
|
||||
.contains(content)
|
||||
.click();
|
||||
this.getters.parameterInput(parameterName).find('.option-headline').contains(content).click();
|
||||
},
|
||||
rename: (newName: string) => {
|
||||
this.getters.nodeNameContainer().click();
|
||||
this.getters.nodeRenameInput()
|
||||
.should('be.visible')
|
||||
.type('{selectall}')
|
||||
.type(newName);
|
||||
this.getters.nodeRenameInput().should('be.visible').type('{selectall}').type(newName);
|
||||
cy.get('body').type('{enter}');
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2,8 +2,6 @@ import { BasePage } from './base';
|
||||
|
||||
export class SettingsUsagePage extends BasePage {
|
||||
url = '/settings/usage';
|
||||
getters = {
|
||||
};
|
||||
actions = {
|
||||
};
|
||||
getters = {};
|
||||
actions = {};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user