@truedat/cx 4.41.2 → 4.41.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/package.json +4 -4
  3. package/src/jobs/components/Job.js +11 -11
  4. package/src/jobs/components/JobRoutes.js +2 -2
  5. package/src/jobs/components/JobRow.js +7 -3
  6. package/src/jobs/components/Jobs.js +16 -28
  7. package/src/jobs/components/JobsTable.js +80 -92
  8. package/src/jobs/components/JobsView.js +23 -0
  9. package/src/jobs/components/SourceJobs.js +29 -0
  10. package/src/jobs/components/__tests__/JobRow.spec.js +44 -23
  11. package/src/jobs/components/__tests__/Jobs.spec.js +33 -8
  12. package/src/jobs/components/__tests__/JobsTable.spec.js +50 -81
  13. package/src/jobs/components/__tests__/JobsView.spec.js +39 -0
  14. package/src/jobs/components/__tests__/SourceJobs.spec.js +38 -0
  15. package/src/jobs/components/__tests__/__snapshots__/Job.spec.js.snap +3 -4
  16. package/src/jobs/components/__tests__/__snapshots__/JobRow.spec.js.snap +40 -32
  17. package/src/jobs/components/__tests__/__snapshots__/Jobs.spec.js.snap +136 -35
  18. package/src/jobs/components/__tests__/__snapshots__/JobsTable.spec.js.snap +104 -227
  19. package/src/jobs/components/__tests__/__snapshots__/JobsView.spec.js.snap +167 -0
  20. package/src/jobs/components/__tests__/__snapshots__/SourceJobs.spec.js.snap +115 -0
  21. package/src/jobs/components/index.js +1 -3
  22. package/src/jobs/selectors/index.js +4 -2
  23. package/src/jobs/selectors/{getJobColumns.js → jobColumnsSelector.js} +11 -27
  24. package/src/jobs/selectors/jobRowsSelector.js +14 -0
  25. package/src/jobs/selectors/sourceJobColumnsSelector.js +35 -0
  26. package/src/messages/en.js +9 -1
  27. package/src/messages/es.js +9 -1
  28. package/src/reducers/cxMessage.js +15 -1
  29. package/src/sources/api/fragments.js +48 -0
  30. package/src/sources/api/mutations.js +51 -0
  31. package/src/sources/api/queries.js +52 -0
  32. package/src/sources/api.js +1 -2
  33. package/src/sources/components/EditSource.js +5 -29
  34. package/src/sources/components/JobForm.js +2 -2
  35. package/src/sources/components/NewJob.js +10 -23
  36. package/src/sources/components/Source.js +12 -76
  37. package/src/sources/components/SourceActions.js +13 -21
  38. package/src/sources/components/SourceBreadcrumbs.js +1 -1
  39. package/src/sources/components/SourceConfiguration.js +60 -0
  40. package/src/sources/components/SourceDetail.js +90 -0
  41. package/src/sources/components/SourceForm.js +50 -53
  42. package/src/sources/components/SourceHeader.js +29 -0
  43. package/src/sources/components/SourceRoutes.js +25 -89
  44. package/src/sources/components/SourceSelector.js +53 -44
  45. package/src/sources/components/SourceTabs.js +54 -0
  46. package/src/sources/components/Sources.js +7 -20
  47. package/src/sources/components/SourcesTable.js +3 -4
  48. package/src/sources/components/__tests__/EditSource.spec.js +1 -2
  49. package/src/sources/components/__tests__/Source.spec.js +1 -1
  50. package/src/sources/components/__tests__/SourceActions.spec.js +3 -1
  51. package/src/sources/components/__tests__/SourceDetail.spec.js +45 -0
  52. package/src/sources/components/__tests__/SourceForm.spec.js +16 -31
  53. package/src/sources/components/__tests__/SourceHeader.spec.js +16 -0
  54. package/src/sources/components/__tests__/SourceSelector.spec.js +44 -0
  55. package/src/sources/components/__tests__/SourceTabs.spec.js +21 -0
  56. package/src/sources/components/__tests__/Sources.spec.js +5 -2
  57. package/src/sources/components/__tests__/__snapshots__/EditSource.spec.js.snap +12 -35
  58. package/src/sources/components/__tests__/__snapshots__/NewSource.spec.js.snap +1 -1
  59. package/src/sources/components/__tests__/__snapshots__/Source.spec.js.snap +23 -65
  60. package/src/sources/components/__tests__/__snapshots__/SourceActions.spec.js.snap +1 -1
  61. package/src/sources/components/__tests__/__snapshots__/SourceDetail.spec.js.snap +154 -0
  62. package/src/sources/components/__tests__/__snapshots__/SourceForm.spec.js.snap +37 -14
  63. package/src/sources/components/__tests__/__snapshots__/SourceHeader.spec.js.snap +85 -0
  64. package/src/sources/components/__tests__/__snapshots__/SourceSelector.spec.js.snap +68 -0
  65. package/src/sources/components/__tests__/__snapshots__/SourceTabs.spec.js.snap +22 -0
  66. package/src/sources/components/__tests__/__snapshots__/Sources.spec.js.snap +2 -2
  67. package/src/sources/components/__tests__/__snapshots__/SourcesTable.spec.js.snap +5 -5
  68. package/src/sources/components/index.js +1 -4
  69. package/src/sources/reducers/__tests__/sourceRedirect.spec.js +26 -21
  70. package/src/sources/reducers/__tests__/sourceUpdateStatus.spec.js +9 -9
  71. package/src/sources/reducers/index.js +1 -12
  72. package/src/sources/reducers/sourceRedirect.js +20 -10
  73. package/src/sources/reducers/sourceUpdateStatus.js +5 -5
  74. package/src/sources/routines.js +0 -3
  75. package/src/sources/sagas/__tests__/createSource.spec.js +35 -20
  76. package/src/sources/sagas/__tests__/deleteSource.spec.js +29 -14
  77. package/src/sources/sagas/__tests__/disableSource.spec.js +2 -8
  78. package/src/sources/sagas/__tests__/enableSource.spec.js +2 -8
  79. package/src/sources/sagas/__tests__/updateSource.spec.js +33 -15
  80. package/src/sources/sagas/createSource.js +24 -14
  81. package/src/sources/sagas/deleteSource.js +14 -15
  82. package/src/sources/sagas/disableSource.js +1 -17
  83. package/src/sources/sagas/enableSource.js +1 -17
  84. package/src/sources/sagas/index.js +0 -9
  85. package/src/sources/sagas/updateSource.js +18 -15
  86. package/src/sources/components/DynamicSourceForm.js +0 -60
  87. package/src/sources/components/SourceLoader.js +0 -59
  88. package/src/sources/components/SourcesLoader.js +0 -39
  89. package/src/sources/components/__tests__/DynamicSourceForm.spec.js +0 -89
  90. package/src/sources/components/__tests__/SourceLoader.spec.js +0 -54
  91. package/src/sources/components/__tests__/SourcesLoader.spec.js +0 -53
  92. package/src/sources/components/__tests__/__snapshots__/DynamicSourceForm.spec.js.snap +0 -8
  93. package/src/sources/components/__tests__/__snapshots__/SourceLoader.spec.js.snap +0 -3
  94. package/src/sources/components/__tests__/__snapshots__/SourcesLoader.spec.js.snap +0 -3
  95. package/src/sources/reducers/__tests__/source.spec.js +0 -44
  96. package/src/sources/reducers/__tests__/sourceLoading.spec.js +0 -30
  97. package/src/sources/reducers/__tests__/sources.spec.js +0 -37
  98. package/src/sources/reducers/__tests__/sourcesLoading.spec.js +0 -30
  99. package/src/sources/reducers/source.js +0 -35
  100. package/src/sources/reducers/sourceLoading.js +0 -16
  101. package/src/sources/reducers/sources.js +0 -28
  102. package/src/sources/reducers/sourcesLoading.js +0 -16
  103. package/src/sources/sagas/__tests__/fetchSource.spec.js +0 -71
  104. package/src/sources/sagas/__tests__/fetchSources.spec.js +0 -69
  105. package/src/sources/sagas/__tests__/updateSourceConfig.spec.js +0 -73
  106. package/src/sources/sagas/fetchSource.js +0 -30
  107. package/src/sources/sagas/fetchSources.js +0 -26
  108. package/src/sources/sagas/updateSourceConfig.js +0 -29
@@ -3,61 +3,45 @@ import React from "react";
3
3
  import { createSelector } from "reselect";
4
4
  import Moment from "react-moment";
5
5
 
6
- const dateDecorator = date =>
6
+ const dateDecorator = (date) =>
7
7
  date && <Moment locale="es" date={date} format="YYYY-MM-DD HH:mm" />;
8
8
 
9
- const defaultJobColumns = [
9
+ export const defaultJobColumns = [
10
10
  {
11
11
  name: "source.external_id",
12
12
  sort: { name: "source.external_id.sort" },
13
13
  fieldSelector: _.path("source.external_id"),
14
- width: 2
14
+ width: 2,
15
15
  },
16
16
  {
17
17
  name: "source.type",
18
18
  sort: { name: "source.type.sort" },
19
- fieldSelector: _.path("source.type"),
20
- width: 2
19
+ width: 2,
21
20
  },
22
21
  {
23
22
  name: "type",
24
23
  sort: { name: "type.sort" },
25
- fieldSelector: _.path("type"),
26
- width: 2
24
+ width: 2,
27
25
  },
28
26
  {
29
27
  name: "status",
30
28
  sort: { name: "status.sort" },
31
- fieldSelector: _.path("status"),
32
- width: 2
29
+ width: 2,
33
30
  },
34
31
  {
35
32
  name: "message",
36
- fieldSelector: _.path("message"),
37
- width: 2
33
+ width: 2,
38
34
  },
39
35
  {
40
36
  name: "end_date",
41
37
  sort: { name: "end_date" },
42
38
  fieldDecorator: dateDecorator,
43
39
  textAlign: "center",
44
- width: 2
45
- }
40
+ width: 2,
41
+ },
46
42
  ];
47
43
 
48
- const getJobs = state => state.jobs;
49
- const getColumns = state => state.jobsColumns;
50
-
51
- export const getJobColumns = createSelector(
52
- getColumns,
44
+ export const jobColumnsSelector = createSelector(
45
+ _.prop("jobsColumns"),
53
46
  _.defaultTo(defaultJobColumns)
54
47
  );
55
-
56
- const getJobColumnNames = createSelector(getJobColumns, _.map("name"));
57
-
58
- export const getJobsRows = createSelector(
59
- getJobs,
60
- getJobColumnNames,
61
- (jobs, columnNames) =>
62
- _.map(_.pick([...columnNames, "external_id", "id"]))(jobs)
63
- );
@@ -0,0 +1,14 @@
1
+ import _ from "lodash/fp";
2
+ import { createSelector } from "reselect";
3
+ import { jobColumnsSelector } from "./jobColumnsSelector";
4
+
5
+ export const jobRowsSelector = createSelector(
6
+ _.prop("jobs"),
7
+ jobColumnsSelector,
8
+ (jobs, jobColumns) => {
9
+ const columnNames = _.map("name")(jobColumns);
10
+ return _.map(_.pick([...columnNames, "external_id", "id", "source_id"]))(
11
+ jobs
12
+ );
13
+ }
14
+ );
@@ -0,0 +1,35 @@
1
+ import _ from "lodash/fp";
2
+ import React from "react";
3
+ import { createSelector } from "reselect";
4
+ import Moment from "react-moment";
5
+
6
+ const dateDecorator = (date) =>
7
+ date && <Moment locale="es" date={date} format="YYYY-MM-DD HH:mm" />;
8
+
9
+ export const defaultSourceJobColumns = [
10
+ {
11
+ name: "end_date",
12
+ sort: { name: "end_date" },
13
+ fieldDecorator: dateDecorator,
14
+ width: 3,
15
+ },
16
+ {
17
+ name: "type",
18
+ sort: { name: "type.sort" },
19
+ width: 2,
20
+ },
21
+ {
22
+ name: "status",
23
+ sort: { name: "status.sort" },
24
+ width: 2,
25
+ },
26
+ {
27
+ name: "message",
28
+ width: 9,
29
+ },
30
+ ];
31
+
32
+ export const sourceJobColumnsSelector = createSelector(
33
+ _.prop("sourceJobsColumns"),
34
+ _.defaultTo(defaultSourceJobColumns)
35
+ );
@@ -1,8 +1,16 @@
1
1
  /* eslint-disable prettier/prettier */
2
2
  export default {
3
- "alert.fetchSource.failed.header": "Error retrieving source",
4
3
  "alert.signConfiguration.failed.header": "Error signing configuration",
4
+ "alert.createSource.failed.header": "Error creating source",
5
+ "alert.createSource.success.header": "Source created",
6
+ "alert.deleteSource.failed.header": "Error deleting source",
7
+ "alert.deleteSource.success.header": "Source deleted",
8
+ "alert.disableSource.failed.header": "Error disabling source",
9
+ "alert.disableSource.success.header": "Source disabled",
10
+ "alert.enableSource.failed.header": "Error enabling source",
11
+ "alert.enableSource.success.header": "Source enabled",
5
12
  "alert.updateSource.failed.header": "Error editing source",
13
+ "alert.updateSource.success.header": "Source updated",
6
14
  "configuration.content.label": "Content",
7
15
  "configuration.props.external_id": "Id Externo",
8
16
  "configuration.search.no_results": "No configurations found",
@@ -1,8 +1,16 @@
1
1
  /* eslint-disable prettier/prettier */
2
2
  export default {
3
- "alert.fetchSource.failed.header": "Error al recuperar origen",
4
3
  "alert.signConfiguration.failed.header": "Error firmando configuración",
4
+ "alert.createSource.failed.header": "Error al crear origen",
5
+ "alert.createSource.success.header": "Origen creado",
6
+ "alert.deleteSource.failed.header": "Error al borrar origen",
7
+ "alert.deleteSource.success.header": "Origen borrado",
8
+ "alert.disableSource.failed.header": "Error al deshabilitar origen",
9
+ "alert.disableSource.success.header": "Origen deshabilitado",
10
+ "alert.enableSource.failed.header": "Error al habilitar origen",
11
+ "alert.enableSource.success.header": "Origen habilitado",
5
12
  "alert.updateSource.failed.header": "Error al editar origen",
13
+ "alert.updateSource.success.header": "Origen actualizado",
6
14
  "configuration.content.label": "Contenido",
7
15
  "configuration.props.external_id": "External Id",
8
16
  "configuration.search.no_results": "Ninguna configuración encontrada",
@@ -1,11 +1,25 @@
1
1
  import { dismissAlert } from "@truedat/core/routines";
2
+ import {
3
+ createSource,
4
+ deleteSource,
5
+ disableSource,
6
+ enableSource,
7
+ } from "../routines";
2
8
 
3
9
  const initialState = {};
4
10
 
5
- const cxMessage = (state = initialState, { type }) => {
11
+ const cxMessage = (state = initialState, { type, meta }) => {
6
12
  switch (type) {
7
13
  case dismissAlert.TRIGGER:
8
14
  return initialState;
15
+ case createSource.SUCCESS:
16
+ return { color: "green", header: "alert.createSource.success.header" };
17
+ case deleteSource.SUCCESS:
18
+ return { color: "green", header: "alert.deleteSource.success.header" };
19
+ case disableSource.SUCCESS:
20
+ return { color: "green", header: "alert.disableSource.success.header" };
21
+ case enableSource.SUCCESS:
22
+ return { color: "green", header: "alert.enableSource.success.header" };
9
23
  default:
10
24
  return state;
11
25
  }
@@ -0,0 +1,48 @@
1
+ import { gql } from "@apollo/client";
2
+
3
+ export const SOURCE_DETAIL = gql`
4
+ fragment SourceDetail on Source {
5
+ id
6
+ externalId
7
+ active
8
+ type
9
+ }
10
+ `;
11
+
12
+ export const JOB_LATEST_EVENT = gql`
13
+ fragment JobLatestEvent on Job {
14
+ events(limit: 1) {
15
+ id
16
+ type
17
+ message
18
+ insertedAt
19
+ }
20
+ }
21
+ `;
22
+
23
+ export const SOURCE_CONFIG = gql`
24
+ fragment SourceConfig on Source {
25
+ config
26
+ jobTypes
27
+ }
28
+ `;
29
+
30
+ export const SOURCE_LATEST_EVENT = gql`
31
+ fragment SourceLatestEvent on Source {
32
+ events(limit: 1) {
33
+ id
34
+ type
35
+ message
36
+ insertedAt
37
+ }
38
+ }
39
+ `;
40
+
41
+ export const SOURCE_TEMPLATE = gql`
42
+ fragment SourceTemplate on Source {
43
+ template {
44
+ id
45
+ content
46
+ }
47
+ }
48
+ `;
@@ -0,0 +1,51 @@
1
+ import { gql } from "@apollo/client";
2
+ import { SOURCE_CONFIG, SOURCE_DETAIL, SOURCE_TEMPLATE } from "./fragments";
3
+
4
+ export const CREATE_SOURCE = gql`
5
+ mutation CreateSource($source: CreateSourceInput!) {
6
+ createSource(source: $source) {
7
+ ...SourceDetail
8
+ }
9
+ }
10
+ ${SOURCE_DETAIL}
11
+ `;
12
+
13
+ export const DELETE_SOURCE = gql`
14
+ mutation DeleteSource($id: ID!) {
15
+ deleteSource(id: $id) {
16
+ id
17
+ externalId
18
+ }
19
+ }
20
+ `;
21
+
22
+ export const DISABLE_SOURCE = gql`
23
+ mutation DisableSource($id: ID!) {
24
+ disableSource(id: $id) {
25
+ ...SourceDetail
26
+ }
27
+ }
28
+ ${SOURCE_DETAIL}
29
+ `;
30
+
31
+ export const ENABLE_SOURCE = gql`
32
+ mutation EnableSource($id: ID!) {
33
+ enableSource(id: $id) {
34
+ ...SourceDetail
35
+ }
36
+ }
37
+ ${SOURCE_DETAIL}
38
+ `;
39
+
40
+ export const UPDATE_SOURCE = gql`
41
+ mutation UpdateSource($source: UpdateSourceInput!) {
42
+ updateSource(source: $source) {
43
+ ...SourceDetail
44
+ ...SourceConfig
45
+ ...SourceTemplate
46
+ }
47
+ }
48
+ ${SOURCE_DETAIL}
49
+ ${SOURCE_CONFIG}
50
+ ${SOURCE_TEMPLATE}
51
+ `;
@@ -0,0 +1,52 @@
1
+ import { gql } from "@apollo/client";
2
+ import {
3
+ SOURCE_CONFIG,
4
+ SOURCE_DETAIL,
5
+ SOURCE_LATEST_EVENT,
6
+ SOURCE_TEMPLATE,
7
+ } from "./fragments";
8
+
9
+ export const SOURCES_QUERY = gql`
10
+ query Sources {
11
+ sources {
12
+ ...SourceDetail
13
+ ...SourceLatestEvent
14
+ }
15
+ }
16
+ ${SOURCE_DETAIL}
17
+ ${SOURCE_LATEST_EVENT}
18
+ `;
19
+
20
+ export const SOURCE_OPTIONS_QUERY = gql`
21
+ query SourceOptions($jobTypes: String) {
22
+ sources(jobTypes: $jobTypes) {
23
+ id
24
+ externalId
25
+ }
26
+ }
27
+ `;
28
+
29
+ export const SOURCE_QUERY = gql`
30
+ query Source($sourceId: ID!) {
31
+ source(id: $sourceId) {
32
+ ...SourceDetail
33
+ ...SourceConfig
34
+ ...SourceTemplate
35
+ }
36
+ }
37
+ ${SOURCE_DETAIL}
38
+ ${SOURCE_CONFIG}
39
+ ${SOURCE_TEMPLATE}
40
+ `;
41
+
42
+ export const TEMPLATES_QUERY = gql`
43
+ query Templates($scope: String!) {
44
+ templates(scope: $scope) {
45
+ id
46
+ name
47
+ label
48
+ scope
49
+ content
50
+ }
51
+ }
52
+ `;
@@ -1,4 +1,3 @@
1
1
  const API_SOURCE = "/api/sources/:external_id";
2
- const API_SOURCES = "/api/sources";
3
2
 
4
- export { API_SOURCE, API_SOURCES };
3
+ export { API_SOURCE };
@@ -1,40 +1,16 @@
1
1
  import React from "react";
2
2
  import PropTypes from "prop-types";
3
3
  import { connect } from "react-redux";
4
- import { Container, Header, Icon, Segment } from "semantic-ui-react";
5
- import { FormattedMessage, useIntl } from "react-intl";
6
- import { Loading } from "@truedat/core/components";
7
4
  import { updateSource } from "../routines";
8
- import SourceBreadcrumbs from "./SourceBreadcrumbs";
9
5
  import SourceForm from "./SourceForm";
10
6
 
11
- export const EditSource = ({ updateSource, source, sourceLoading }) => {
12
- const { formatMessage } = useIntl();
13
- return sourceLoading ? (
14
- <Loading />
15
- ) : (
16
- <>
17
- <SourceBreadcrumbs text={formatMessage({ id: "source.actions.edit" })} />
18
- <Container as={Segment} text>
19
- <Header as="h2">
20
- <Icon name="plug" />
21
- <Header.Content>
22
- <FormattedMessage id="source.actions.edit" />
23
- </Header.Content>
24
- </Header>
25
- <SourceForm source={source} onSubmit={updateSource} />
26
- </Container>
27
- </>
28
- );
29
- };
7
+ export const EditSource = ({ updateSource, source }) => (
8
+ <SourceForm source={source} onSubmit={updateSource} />
9
+ );
30
10
 
31
11
  EditSource.propTypes = {
32
12
  updateSource: PropTypes.func.isRequired,
13
+ source: PropTypes.object.isRequired,
33
14
  };
34
15
 
35
- const mapStateToProps = ({ source, sourceLoading }) => ({
36
- source,
37
- sourceLoading,
38
- });
39
-
40
- export default connect(mapStateToProps, { updateSource })(EditSource);
16
+ export default connect(null, { updateSource })(EditSource);
@@ -9,7 +9,7 @@ export const JobForm = ({ options, onSubmit }) => {
9
9
  const { formatMessage } = useIntl();
10
10
  return (
11
11
  <Form>
12
- <Form.Group inline>
12
+ <Form.Group>
13
13
  <Form.Dropdown
14
14
  name="type"
15
15
  label={formatMessage({ id: "jobType.label" })}
@@ -35,7 +35,7 @@ export const JobForm = ({ options, onSubmit }) => {
35
35
 
36
36
  JobForm.propTypes = {
37
37
  options: PropTypes.array,
38
- onSubmit: PropTypes.func.isRequired
38
+ onSubmit: PropTypes.func.isRequired,
39
39
  };
40
40
 
41
41
  export default JobForm;
@@ -2,47 +2,34 @@ import _ from "lodash/fp";
2
2
  import React from "react";
3
3
  import PropTypes from "prop-types";
4
4
  import { connect } from "react-redux";
5
- import { Container, Header, Segment } from "semantic-ui-react";
6
5
  import { useIntl } from "react-intl";
7
6
  import { createJob } from "../routines";
8
- import SourceBreadcrumbs from "./SourceBreadcrumbs";
9
7
  import JobForm from "./JobForm";
10
8
 
11
9
  export const NewJob = ({ createJob, source }) => {
12
10
  const { formatMessage } = useIntl();
13
- const id = source?.external_id;
11
+ const id = source?.externalId;
14
12
  const options = _.flow(
15
- _.prop("job_types"),
13
+ _.path("config.job_types"),
16
14
  _.defaultTo([]),
17
- _.map(t => ({
15
+ _.map((t) => ({
18
16
  key: t,
19
17
  text: formatMessage({ id: `jobType.${t}.label`, defaultMessage: t }),
20
- value: t
18
+ value: t,
21
19
  })),
22
20
  _.sortBy("text")
23
21
  )(source);
24
22
  return id && options ? (
25
- <>
26
- <SourceBreadcrumbs text={source?.external_id} />
27
- <Container as={Segment} text>
28
- <Header
29
- as="h2"
30
- content={formatMessage({ id: "jobs.actions.create" })}
31
- />
32
- <JobForm
33
- options={options}
34
- onSubmit={({ type }) => createJob({ id, type })}
35
- />
36
- </Container>
37
- </>
23
+ <JobForm
24
+ options={options}
25
+ onSubmit={({ type }) => createJob({ id, type })}
26
+ />
38
27
  ) : null;
39
28
  };
40
29
 
41
30
  NewJob.propTypes = {
42
31
  source: PropTypes.object,
43
- createJob: PropTypes.func.isRequired
32
+ createJob: PropTypes.func.isRequired,
44
33
  };
45
34
 
46
- export const mapStateToProps = ({ source }) => ({ source });
47
-
48
- export default connect(mapStateToProps, { createJob })(NewJob);
35
+ export default connect(null, { createJob })(NewJob);
@@ -1,85 +1,21 @@
1
- import _ from "lodash/fp";
2
- import React, { useState, useEffect } from "react";
1
+ import React from "react";
3
2
  import PropTypes from "prop-types";
4
- import { Header, Icon, Grid, Segment } from "semantic-ui-react";
5
- import { connect } from "react-redux";
6
- import { updateSourceConfig } from "../routines";
7
- import SourceActions from "./SourceActions";
3
+ import { Segment } from "semantic-ui-react";
8
4
  import SourceBreadcrumbs from "./SourceBreadcrumbs";
5
+ import SourceHeader from "./SourceHeader";
6
+ import SourceDetail from "./SourceDetail";
9
7
 
10
- const DynamicFormViewer = React.lazy(() =>
11
- import("@truedat/df/components/DynamicFormViewer")
12
- );
13
-
14
- export const Source = ({
15
- source,
16
- template,
17
- updateSourceConfig,
18
- sourceUpdateStatus,
19
- }) => {
20
- const [editingField, setEditingField] = useState();
21
- const [sourceConfig, setSourceConfig] = useState();
22
- useEffect(() => {
23
- if (source) {
24
- setSourceConfig(source?.config);
25
- }
26
- }, [source]);
27
- const editFunctions = {
28
- onChange: (e, { name, value }) => {
29
- e && e.preventDefault();
30
- setSourceConfig({ ...sourceConfig, [name]: value });
31
- },
32
- onCancel: () => setSourceConfig(source?.config),
33
- onSubmit: (field) =>
34
- updateSourceConfig({
35
- source: { ...source, config: _.pick(field)(sourceConfig) },
36
- }),
37
- editingField,
38
- setEditingField,
39
- updateStatus: sourceUpdateStatus,
40
- };
41
-
42
- return _.isEmpty(source) ? null : (
8
+ export const Source = ({ source }) =>
9
+ source ? (
43
10
  <>
44
- <SourceBreadcrumbs text={source.external_id} />
11
+ <SourceBreadcrumbs text={source?.externalId} />
45
12
  <Segment>
46
- <Grid>
47
- <Grid.Column width={8}>
48
- <Header as="h2">
49
- <Icon circular name="plug" />
50
- <Header.Content>
51
- {source.external_id}
52
- <Header.Subheader>{source.type}</Header.Subheader>
53
- </Header.Content>
54
- </Header>
55
- </Grid.Column>
56
- <Grid.Column width={8} textAlign="right">
57
- <SourceActions />
58
- </Grid.Column>
59
- <Grid.Column width={8}>
60
- <DynamicFormViewer
61
- template={template}
62
- content={sourceConfig}
63
- editFunctions={editFunctions}
64
- />
65
- </Grid.Column>
66
- </Grid>
13
+ <SourceHeader source={source} />
14
+ <SourceDetail source={source} />
67
15
  </Segment>
68
16
  </>
69
- );
70
- };
71
-
72
- Source.propTypes = {
73
- source: PropTypes.object.isRequired,
74
- sourceUpdateStatus: PropTypes.string,
75
- template: PropTypes.object,
76
- updateSourceConfig: PropTypes.func.isRequired,
77
- };
17
+ ) : null;
78
18
 
79
- const mapStateToProps = ({ source, templates, sourceUpdateStatus }) => ({
80
- source,
81
- template: _.find(_.propEq("name", source.type))(templates),
82
- sourceUpdateStatus,
83
- });
19
+ Source.propTypes = { source: PropTypes.object };
84
20
 
85
- export default connect(mapStateToProps, { updateSourceConfig })(Source);
21
+ export default Source;
@@ -10,7 +10,7 @@ import { deleteSource, disableSource, enableSource } from "../routines";
10
10
 
11
11
  export const ConfirmToggleModal = ({ onConfirm, source }) => {
12
12
  const { formatMessage } = useIntl();
13
- const { active, id, external_id } = source || {};
13
+ const { active, id, externalId } = source || {};
14
14
  const action = active ? "disable" : "enable";
15
15
  const icon = active ? "pause" : "play";
16
16
  return (
@@ -28,7 +28,7 @@ export const ConfirmToggleModal = ({ onConfirm, source }) => {
28
28
  size="small"
29
29
  content={formatMessage(
30
30
  { id: `source.actions.${action}.confirmation.content` },
31
- { external_id: <i>{external_id}</i> }
31
+ { external_id: <i>{externalId}</i> }
32
32
  )}
33
33
  onConfirm={() => onConfirm({ id })}
34
34
  />
@@ -40,7 +40,7 @@ ConfirmToggleModal.propTypes = {
40
40
  onConfirm: PropTypes.func,
41
41
  };
42
42
 
43
- export const ConfirmDeleteModal = ({ deleteSource, external_id }) => {
43
+ export const ConfirmDeleteModal = ({ deleteSource, externalId, id }) => {
44
44
  const { formatMessage } = useIntl();
45
45
  return (
46
46
  <ConfirmModal
@@ -57,16 +57,17 @@ export const ConfirmDeleteModal = ({ deleteSource, external_id }) => {
57
57
  size="small"
58
58
  content={formatMessage(
59
59
  { id: "source.actions.delete.confirmation.content" },
60
- { external_id: <i>{external_id}</i> }
60
+ { external_id: <i>{externalId}</i> }
61
61
  )}
62
- onConfirm={() => deleteSource({ external_id })}
62
+ onConfirm={() => deleteSource({ id })}
63
63
  />
64
64
  );
65
65
  };
66
66
 
67
67
  ConfirmDeleteModal.propTypes = {
68
68
  deleteSource: PropTypes.func,
69
- external_id: PropTypes.string,
69
+ externalId: PropTypes.string,
70
+ id: PropTypes.number,
70
71
  };
71
72
 
72
73
  export const SourceActions = ({
@@ -76,22 +77,14 @@ export const SourceActions = ({
76
77
  source,
77
78
  }) => {
78
79
  const { formatMessage } = useIntl();
79
- const { external_id, active } = source || {};
80
+ const { externalId, id, active } = source || {};
80
81
  const edit = {
81
82
  key: "edit",
82
83
  icon: "edit",
83
84
  text: formatMessage({ id: "source.actions.edit" }),
84
85
  value: "edit",
85
86
  as: Link,
86
- to: linkTo.SOURCE_EDIT({ external_id }),
87
- };
88
- const run = {
89
- key: "run",
90
- icon: "sync",
91
- text: "Run",
92
- value: "run",
93
- as: Link,
94
- to: linkTo.SOURCE_JOBS_NEW({ external_id }),
87
+ to: linkTo.SOURCE_EDIT({ sourceId: id }),
95
88
  };
96
89
  const toggle = {
97
90
  key: "toggle",
@@ -106,9 +99,10 @@ export const SourceActions = ({
106
99
  value: "delete",
107
100
  as: ConfirmDeleteModal,
108
101
  deleteSource,
109
- external_id,
102
+ externalId,
103
+ id,
110
104
  };
111
- const actions = active ? [edit, run, toggle, remove] : [edit, toggle, remove];
105
+ const actions = [edit, toggle, remove];
112
106
 
113
107
  return <GroupActions availableActions={actions} />;
114
108
  };
@@ -120,9 +114,7 @@ SourceActions.propTypes = {
120
114
  source: PropTypes.object.isRequired,
121
115
  };
122
116
 
123
- const mapStateToProps = ({ source }) => ({ source });
124
-
125
- export default connect(mapStateToProps, {
117
+ export default connect(null, {
126
118
  deleteSource,
127
119
  disableSource,
128
120
  enableSource,
@@ -16,7 +16,7 @@ export const SourceBreadcrumbs = ({ text }) => (
16
16
  );
17
17
 
18
18
  SourceBreadcrumbs.propTypes = {
19
- text: PropTypes.string
19
+ text: PropTypes.string,
20
20
  };
21
21
 
22
22
  export default SourceBreadcrumbs;