instances tests are mostly passing, issues with table resizing on the list w/ burnettk
This commit is contained in:
parent
08bfbccffb
commit
bac7dbcac1
|
@ -32,7 +32,7 @@ describe('process-groups', () => {
|
||||||
|
|
||||||
cy.contains('Delete Process Group').click();
|
cy.contains('Delete Process Group').click();
|
||||||
cy.contains('Are you sure');
|
cy.contains('Are you sure');
|
||||||
cy.getBySel('modal-confirmation-dialog').get('.cds--btn--danger').click();
|
cy.getBySel('modal-confirmation-dialog').find('.cds--btn--danger').click();
|
||||||
cy.url().should('include', `process-groups`);
|
cy.url().should('include', `process-groups`);
|
||||||
cy.contains(groupId).should('not.exist');
|
cy.contains(groupId).should('not.exist');
|
||||||
});
|
});
|
||||||
|
|
|
@ -48,7 +48,7 @@ const updateBpmnPythonScriptWithMonaco = (
|
||||||
.focused() // change subject to currently focused element
|
.focused() // change subject to currently focused element
|
||||||
// .type('{ctrl}a') // had been doing it this way, but it turns out to be flaky relative to clear()
|
// .type('{ctrl}a') // had been doing it this way, but it turns out to be flaky relative to clear()
|
||||||
.clear()
|
.clear()
|
||||||
.type(pythonScript);
|
.type(pythonScript, { delay: 30 });
|
||||||
|
|
||||||
cy.contains('Close').click();
|
cy.contains('Close').click();
|
||||||
// wait for a little bit for the xml to get set before saving
|
// wait for a little bit for the xml to get set before saving
|
||||||
|
@ -111,8 +111,10 @@ describe('process-instances', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('can create a new instance and can modify with monaco text editor', () => {
|
it('can create a new instance and can modify with monaco text editor', () => {
|
||||||
const originalPythonScript = 'person = "Kevin"';
|
// leave off the ending double quote since manco adds it
|
||||||
const newPythonScript = 'person = "Mike"';
|
const originalPythonScript = 'person = "Kevin';
|
||||||
|
const newPythonScript = 'person = "Mike';
|
||||||
|
|
||||||
const bpmnFile = 'process_model_one.bpmn';
|
const bpmnFile = 'process_model_one.bpmn';
|
||||||
|
|
||||||
// Change bpmn
|
// Change bpmn
|
||||||
|
@ -152,7 +154,7 @@ describe('process-instances', () => {
|
||||||
cy.basicPaginationTest();
|
cy.basicPaginationTest();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('can filter', () => {
|
it.only('can filter', () => {
|
||||||
cy.getBySel('process-instance-list-link').click();
|
cy.getBySel('process-instance-list-link').click();
|
||||||
cy.assertAtLeastOneItemInPaginatedResults();
|
cy.assertAtLeastOneItemInPaginatedResults();
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ Cypress.Commands.add('navigateToHome', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
Cypress.Commands.add('navigateToAdmin', () => {
|
Cypress.Commands.add('navigateToAdmin', () => {
|
||||||
cy.getBySel('spiffworkflow-logo').click();
|
cy.visit('/admin');
|
||||||
});
|
});
|
||||||
|
|
||||||
Cypress.Commands.add('login', (selector, ...args) => {
|
Cypress.Commands.add('login', (selector, ...args) => {
|
||||||
|
|
|
@ -1,6 +1,14 @@
|
||||||
import {
|
import {
|
||||||
Header,
|
Header,
|
||||||
|
HeaderContainer,
|
||||||
|
HeaderMenuButton,
|
||||||
|
SkipToContent,
|
||||||
Theme,
|
Theme,
|
||||||
|
HeaderMenu,
|
||||||
|
SideNav,
|
||||||
|
SideNavItem,
|
||||||
|
SideNavItems,
|
||||||
|
HeaderSideNavItems,
|
||||||
HeaderName,
|
HeaderName,
|
||||||
HeaderNavigation,
|
HeaderNavigation,
|
||||||
HeaderMenuItem,
|
HeaderMenuItem,
|
||||||
|
@ -77,35 +85,60 @@ export default function NavigationBar() {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (activeKey) {
|
const headerMenuItems = () => {
|
||||||
return (
|
return (
|
||||||
<div className="spiffworkflow-header-container">
|
<>
|
||||||
<Theme theme="g100">
|
<HeaderMenuItem href="/" isCurrentPage={isActivePage('/')}>
|
||||||
<Header aria-label="Spiffworkflow">
|
Home
|
||||||
<HeaderName href="/" prefix="">
|
</HeaderMenuItem>
|
||||||
|
<HeaderMenuItem
|
||||||
|
href="/admin/process-groups"
|
||||||
|
isCurrentPage={isActivePage('/admin/process-groups')}
|
||||||
|
data-qa="header-nav-processes"
|
||||||
|
>
|
||||||
|
Processes
|
||||||
|
</HeaderMenuItem>
|
||||||
|
<HeaderMenuItem
|
||||||
|
href="/admin/process-instances"
|
||||||
|
isCurrentPage={isActivePage('/admin/process-instances')}
|
||||||
|
>
|
||||||
|
Process Instances
|
||||||
|
</HeaderMenuItem>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (activeKey) {
|
||||||
|
// TODO: apply theme g100 to the header
|
||||||
|
return (
|
||||||
|
<HeaderContainer
|
||||||
|
render={({ isSideNavExpanded, onClickSideNavExpand }: any) => (
|
||||||
|
<Header aria-label="IBM Platform Name">
|
||||||
|
<SkipToContent />
|
||||||
|
<HeaderMenuButton
|
||||||
|
aria-label="Open menu"
|
||||||
|
onClick={onClickSideNavExpand}
|
||||||
|
isActive={isSideNavExpanded}
|
||||||
|
/>
|
||||||
|
<HeaderName href="/" prefix="" data-qa="spiffworkflow-logo">
|
||||||
<img src={logo} className="app-logo" alt="logo" />
|
<img src={logo} className="app-logo" alt="logo" />
|
||||||
</HeaderName>
|
</HeaderName>
|
||||||
<HeaderNavigation aria-label="Spifffff">
|
<HeaderNavigation aria-label="Spiffworkflow">
|
||||||
<HeaderMenuItem href="/" isCurrentPage={isActivePage('/')}>
|
{headerMenuItems()}
|
||||||
Home
|
|
||||||
</HeaderMenuItem>
|
|
||||||
<HeaderMenuItem
|
|
||||||
href="/admin/process-groups"
|
|
||||||
isCurrentPage={isActivePage('/admin/process-groups')}
|
|
||||||
>
|
|
||||||
Processes
|
|
||||||
</HeaderMenuItem>
|
|
||||||
<HeaderMenuItem
|
|
||||||
href="/admin/process-instances"
|
|
||||||
isCurrentPage={isActivePage('/admin/process-instances')}
|
|
||||||
>
|
|
||||||
Process Instances
|
|
||||||
</HeaderMenuItem>
|
|
||||||
</HeaderNavigation>
|
</HeaderNavigation>
|
||||||
|
<SideNav
|
||||||
|
aria-label="Side navigation"
|
||||||
|
expanded={isSideNavExpanded}
|
||||||
|
isPersistent={false}
|
||||||
|
>
|
||||||
|
<SideNavItems>
|
||||||
|
<HeaderSideNavItems>{headerMenuItems()}</HeaderSideNavItems>
|
||||||
|
</SideNavItems>
|
||||||
|
</SideNav>
|
||||||
<HeaderGlobalBar>{loginAndLogoutAction()}</HeaderGlobalBar>
|
<HeaderGlobalBar>{loginAndLogoutAction()}</HeaderGlobalBar>
|
||||||
</Header>
|
</Header>
|
||||||
</Theme>
|
)}
|
||||||
</div>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -30,6 +30,10 @@ span.bjs-crumb {
|
||||||
margin-bottom: 2em;
|
margin-bottom: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// forces the navigation items to be displayed at all viewport sizes
|
||||||
|
.cds--header__nav {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
.active-task-highlight:not(.djs-connection) .djs-visual > :nth-child(1) {
|
.active-task-highlight:not(.djs-connection) .djs-visual > :nth-child(1) {
|
||||||
fill: yellow !important;
|
fill: yellow !important;
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
// @use '@carbon/react/scss/themes';
|
||||||
|
// @use '@carbon/react/scss/theme' with ($theme: themes.$g100);
|
||||||
@use '@carbon/react';
|
@use '@carbon/react';
|
||||||
@use '@carbon/styles';
|
@use '@carbon/styles';
|
||||||
// @include grid.flex-grid();
|
// @include grid.flex-grid();
|
||||||
|
|
|
@ -17,6 +17,11 @@ import {
|
||||||
Grid,
|
Grid,
|
||||||
Column,
|
Column,
|
||||||
MultiSelect,
|
MultiSelect,
|
||||||
|
TableHeader,
|
||||||
|
TableHead,
|
||||||
|
TableRow,
|
||||||
|
TableBody,
|
||||||
|
TableCell,
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
} from '@carbon/react';
|
} from '@carbon/react';
|
||||||
import { PROCESS_STATUSES, DATE_FORMAT, DATE_FORMAT_CARBON } from '../config';
|
import { PROCESS_STATUSES, DATE_FORMAT, DATE_FORMAT_CARBON } from '../config';
|
||||||
|
@ -373,55 +378,144 @@ export default function ProcessInstanceList() {
|
||||||
};
|
};
|
||||||
|
|
||||||
const buildTable = () => {
|
const buildTable = () => {
|
||||||
const rows = processInstances.map((row: any) => {
|
// const rows = processInstances.map((row: any) => {
|
||||||
const formattedStartDate =
|
// const formattedStartDate =
|
||||||
convertSecondsToFormattedDate(row.start_in_seconds) || '-';
|
// convertSecondsToFormattedDate(row.start_in_seconds) || '-';
|
||||||
const formattedEndDate =
|
// const formattedEndDate =
|
||||||
convertSecondsToFormattedDate(row.end_in_seconds) || '-';
|
// convertSecondsToFormattedDate(row.end_in_seconds) || '-';
|
||||||
|
//
|
||||||
|
// return (
|
||||||
|
// <tr key={row.id}>
|
||||||
|
// <td>
|
||||||
|
// <Link
|
||||||
|
// data-qa="process-instance-show-link"
|
||||||
|
// to={`/admin/process-models/${row.process_group_identifier}/${row.process_model_identifier}/process-instances/${row.id}`}
|
||||||
|
// >
|
||||||
|
// {row.id}
|
||||||
|
// </Link>
|
||||||
|
// </td>
|
||||||
|
// <td>
|
||||||
|
// <Link to={`/admin/process-groups/${row.process_group_identifier}`}>
|
||||||
|
// {row.process_group_identifier}
|
||||||
|
// </Link>
|
||||||
|
// </td>
|
||||||
|
// <td>
|
||||||
|
// <Link
|
||||||
|
// to={`/admin/process-models/${row.process_group_identifier}/${row.process_model_identifier}`}
|
||||||
|
// >
|
||||||
|
// {row.process_model_identifier}
|
||||||
|
// </Link>
|
||||||
|
// </td>
|
||||||
|
// <td>{formattedStartDate}</td>
|
||||||
|
// <td>{formattedEndDate}</td>
|
||||||
|
// <td data-qa={`process-instance-status-${row.status}`}>
|
||||||
|
// {row.status}
|
||||||
|
// </td>
|
||||||
|
// </tr>
|
||||||
|
// );
|
||||||
|
// });
|
||||||
|
// return (
|
||||||
|
// <Table size="lg">
|
||||||
|
// <thead>
|
||||||
|
// <tr>
|
||||||
|
// <th>Process Instance Id</th>
|
||||||
|
// <th>Process Group</th>
|
||||||
|
// <th>Process Model</th>
|
||||||
|
// <th>Start Time</th>
|
||||||
|
// <th>End Time</th>
|
||||||
|
// <th>Status</th>
|
||||||
|
// </tr>
|
||||||
|
// </thead>
|
||||||
|
// <tbody>{rows}</tbody>
|
||||||
|
// </Table>
|
||||||
|
// );
|
||||||
|
const rows = [
|
||||||
|
{
|
||||||
|
id: 'load-balancer-1',
|
||||||
|
name: 'Load Balancer 1',
|
||||||
|
rule: 'Round robin',
|
||||||
|
Status: 'Starting',
|
||||||
|
other: 'Test',
|
||||||
|
example: '22',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'load-balancer-2',
|
||||||
|
name: 'Load Balancer 2',
|
||||||
|
rule: 'DNS delegation',
|
||||||
|
status: 'Active',
|
||||||
|
other: 'Test',
|
||||||
|
example: '22',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'load-balancer-3',
|
||||||
|
name: 'Load Balancer 3',
|
||||||
|
rule: 'Round robin',
|
||||||
|
status: 'Disabled',
|
||||||
|
other: 'Test',
|
||||||
|
example: '22',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'load-balancer-4',
|
||||||
|
name: 'Load Balancer 4',
|
||||||
|
rule: 'Round robin',
|
||||||
|
status: 'Disabled',
|
||||||
|
other: 'Test',
|
||||||
|
example: '22',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'load-balancer-5',
|
||||||
|
name: 'Load Balancer 5',
|
||||||
|
rule: 'Round robin',
|
||||||
|
status: 'Disabled',
|
||||||
|
other: 'Test',
|
||||||
|
example: '22',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'load-balancer-6',
|
||||||
|
name: 'Load Balancer 6',
|
||||||
|
rule: 'Round robin',
|
||||||
|
status: 'Disabled',
|
||||||
|
other: 'Test',
|
||||||
|
example: '22',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'load-balancer-7',
|
||||||
|
name: 'Load Balancer 7',
|
||||||
|
rule: 'Round robin',
|
||||||
|
status: 'Disabled',
|
||||||
|
other: 'Test',
|
||||||
|
example: '22',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const headers = ['Name', 'Rule', 'Status', 'Other', 'Example'];
|
||||||
|
|
||||||
return (
|
|
||||||
<tr key={row.id}>
|
|
||||||
<td>
|
|
||||||
<Link
|
|
||||||
data-qa="process-instance-show-link"
|
|
||||||
to={`/admin/process-models/${row.process_group_identifier}/${row.process_model_identifier}/process-instances/${row.id}`}
|
|
||||||
>
|
|
||||||
{row.id}
|
|
||||||
</Link>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<Link to={`/admin/process-groups/${row.process_group_identifier}`}>
|
|
||||||
{row.process_group_identifier}
|
|
||||||
</Link>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<Link
|
|
||||||
to={`/admin/process-models/${row.process_group_identifier}/${row.process_model_identifier}`}
|
|
||||||
>
|
|
||||||
{row.process_model_identifier}
|
|
||||||
</Link>
|
|
||||||
</td>
|
|
||||||
<td>{formattedStartDate}</td>
|
|
||||||
<td>{formattedEndDate}</td>
|
|
||||||
<td data-qa={`process-instance-status-${row.status}`}>
|
|
||||||
{row.status}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
return (
|
return (
|
||||||
<Table striped bordered>
|
<Table size="lg" useZebraStyles={false} isSortable>
|
||||||
<thead>
|
<TableHead>
|
||||||
<tr>
|
<TableRow>
|
||||||
<th>Process Instance Id</th>
|
{headers.map((header) => (
|
||||||
<th>Process Group</th>
|
<TableHeader
|
||||||
<th>Process Model</th>
|
id={header}
|
||||||
<th>Start Time</th>
|
key={header}
|
||||||
<th>End Time</th>
|
isSortable
|
||||||
<th>Status</th>
|
sortDirection="ASC"
|
||||||
</tr>
|
>
|
||||||
</thead>
|
{header}
|
||||||
<tbody>{rows}</tbody>
|
</TableHeader>
|
||||||
|
))}
|
||||||
|
</TableRow>
|
||||||
|
</TableHead>
|
||||||
|
<TableBody>
|
||||||
|
{rows.map((row) => (
|
||||||
|
<TableRow key={row.id}>
|
||||||
|
{Object.keys(row)
|
||||||
|
.filter((key) => key !== 'id')
|
||||||
|
.map((key) => {
|
||||||
|
return <TableCell key={key}>{(row as any)[key]}</TableCell>;
|
||||||
|
})}
|
||||||
|
</TableRow>
|
||||||
|
))}
|
||||||
|
</TableBody>
|
||||||
</Table>
|
</Table>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -283,7 +283,6 @@ export default function ProcessModelEditDiagram() {
|
||||||
// we should update this to act like updating scripts
|
// we should update this to act like updating scripts
|
||||||
// where we pass an event to bpmn-js
|
// where we pass an event to bpmn-js
|
||||||
setScriptModeling(modeling);
|
setScriptModeling(modeling);
|
||||||
|
|
||||||
setScriptText(script || '');
|
setScriptText(script || '');
|
||||||
setScriptType(scriptTypeString);
|
setScriptType(scriptTypeString);
|
||||||
setScriptEventBus(eventBus);
|
setScriptEventBus(eventBus);
|
||||||
|
@ -559,28 +558,25 @@ export default function ProcessModelEditDiagram() {
|
||||||
if (scriptElement) {
|
if (scriptElement) {
|
||||||
scriptName = (scriptElement as any).di.bpmnElement.name;
|
scriptName = (scriptElement as any).di.bpmnElement.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal size="xl" show={showScriptEditor} onHide={handleScriptEditorClose}>
|
<Modal
|
||||||
<Modal.Header closeButton>
|
open={showScriptEditor}
|
||||||
<Modal.Title>Editing Script: {scriptName}</Modal.Title>
|
modalHeading={`Editing Script: ${scriptName}`}
|
||||||
</Modal.Header>
|
primaryButtonText="Close"
|
||||||
<Modal.Body>
|
onRequestSubmit={handleScriptEditorClose}
|
||||||
<Editor
|
size="lg"
|
||||||
height={500}
|
>
|
||||||
width="auto"
|
<Editor
|
||||||
options={generalEditorOptions()}
|
height={500}
|
||||||
defaultLanguage="python"
|
width="auto"
|
||||||
defaultValue={scriptText}
|
options={generalEditorOptions()}
|
||||||
onChange={handleEditorScriptChange}
|
defaultLanguage="python"
|
||||||
onMount={handleEditorDidMount}
|
value={scriptText}
|
||||||
/>
|
onChange={handleEditorScriptChange}
|
||||||
{scriptUnitTestEditorElement()}
|
onMount={handleEditorDidMount}
|
||||||
</Modal.Body>
|
/>
|
||||||
<Modal.Footer>
|
{scriptUnitTestEditorElement()}
|
||||||
<Button variant="secondary" onClick={handleScriptEditorClose}>
|
|
||||||
Close
|
|
||||||
</Button>
|
|
||||||
</Modal.Footer>
|
|
||||||
</Modal>
|
</Modal>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue