@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.
- package/CHANGELOG.md +11 -0
- package/package.json +4 -4
- package/src/jobs/components/Job.js +11 -11
- package/src/jobs/components/JobRoutes.js +2 -2
- package/src/jobs/components/JobRow.js +7 -3
- package/src/jobs/components/Jobs.js +16 -28
- package/src/jobs/components/JobsTable.js +80 -92
- package/src/jobs/components/JobsView.js +23 -0
- package/src/jobs/components/SourceJobs.js +29 -0
- package/src/jobs/components/__tests__/JobRow.spec.js +44 -23
- package/src/jobs/components/__tests__/Jobs.spec.js +33 -8
- package/src/jobs/components/__tests__/JobsTable.spec.js +50 -81
- package/src/jobs/components/__tests__/JobsView.spec.js +39 -0
- package/src/jobs/components/__tests__/SourceJobs.spec.js +38 -0
- package/src/jobs/components/__tests__/__snapshots__/Job.spec.js.snap +3 -4
- package/src/jobs/components/__tests__/__snapshots__/JobRow.spec.js.snap +40 -32
- package/src/jobs/components/__tests__/__snapshots__/Jobs.spec.js.snap +136 -35
- package/src/jobs/components/__tests__/__snapshots__/JobsTable.spec.js.snap +104 -227
- package/src/jobs/components/__tests__/__snapshots__/JobsView.spec.js.snap +167 -0
- package/src/jobs/components/__tests__/__snapshots__/SourceJobs.spec.js.snap +115 -0
- package/src/jobs/components/index.js +1 -3
- package/src/jobs/selectors/index.js +4 -2
- package/src/jobs/selectors/{getJobColumns.js → jobColumnsSelector.js} +11 -27
- package/src/jobs/selectors/jobRowsSelector.js +14 -0
- package/src/jobs/selectors/sourceJobColumnsSelector.js +35 -0
- package/src/messages/en.js +9 -1
- package/src/messages/es.js +9 -1
- package/src/reducers/cxMessage.js +15 -1
- package/src/sources/api/fragments.js +48 -0
- package/src/sources/api/mutations.js +51 -0
- package/src/sources/api/queries.js +52 -0
- package/src/sources/api.js +1 -2
- package/src/sources/components/EditSource.js +5 -29
- package/src/sources/components/JobForm.js +2 -2
- package/src/sources/components/NewJob.js +10 -23
- package/src/sources/components/Source.js +12 -76
- package/src/sources/components/SourceActions.js +13 -21
- package/src/sources/components/SourceBreadcrumbs.js +1 -1
- package/src/sources/components/SourceConfiguration.js +60 -0
- package/src/sources/components/SourceDetail.js +90 -0
- package/src/sources/components/SourceForm.js +50 -53
- package/src/sources/components/SourceHeader.js +29 -0
- package/src/sources/components/SourceRoutes.js +25 -89
- package/src/sources/components/SourceSelector.js +53 -44
- package/src/sources/components/SourceTabs.js +54 -0
- package/src/sources/components/Sources.js +7 -20
- package/src/sources/components/SourcesTable.js +3 -4
- package/src/sources/components/__tests__/EditSource.spec.js +1 -2
- package/src/sources/components/__tests__/Source.spec.js +1 -1
- package/src/sources/components/__tests__/SourceActions.spec.js +3 -1
- package/src/sources/components/__tests__/SourceDetail.spec.js +45 -0
- package/src/sources/components/__tests__/SourceForm.spec.js +16 -31
- package/src/sources/components/__tests__/SourceHeader.spec.js +16 -0
- package/src/sources/components/__tests__/SourceSelector.spec.js +44 -0
- package/src/sources/components/__tests__/SourceTabs.spec.js +21 -0
- package/src/sources/components/__tests__/Sources.spec.js +5 -2
- package/src/sources/components/__tests__/__snapshots__/EditSource.spec.js.snap +12 -35
- package/src/sources/components/__tests__/__snapshots__/NewSource.spec.js.snap +1 -1
- package/src/sources/components/__tests__/__snapshots__/Source.spec.js.snap +23 -65
- package/src/sources/components/__tests__/__snapshots__/SourceActions.spec.js.snap +1 -1
- package/src/sources/components/__tests__/__snapshots__/SourceDetail.spec.js.snap +154 -0
- package/src/sources/components/__tests__/__snapshots__/SourceForm.spec.js.snap +37 -14
- package/src/sources/components/__tests__/__snapshots__/SourceHeader.spec.js.snap +85 -0
- package/src/sources/components/__tests__/__snapshots__/SourceSelector.spec.js.snap +68 -0
- package/src/sources/components/__tests__/__snapshots__/SourceTabs.spec.js.snap +22 -0
- package/src/sources/components/__tests__/__snapshots__/Sources.spec.js.snap +2 -2
- package/src/sources/components/__tests__/__snapshots__/SourcesTable.spec.js.snap +5 -5
- package/src/sources/components/index.js +1 -4
- package/src/sources/reducers/__tests__/sourceRedirect.spec.js +26 -21
- package/src/sources/reducers/__tests__/sourceUpdateStatus.spec.js +9 -9
- package/src/sources/reducers/index.js +1 -12
- package/src/sources/reducers/sourceRedirect.js +20 -10
- package/src/sources/reducers/sourceUpdateStatus.js +5 -5
- package/src/sources/routines.js +0 -3
- package/src/sources/sagas/__tests__/createSource.spec.js +35 -20
- package/src/sources/sagas/__tests__/deleteSource.spec.js +29 -14
- package/src/sources/sagas/__tests__/disableSource.spec.js +2 -8
- package/src/sources/sagas/__tests__/enableSource.spec.js +2 -8
- package/src/sources/sagas/__tests__/updateSource.spec.js +33 -15
- package/src/sources/sagas/createSource.js +24 -14
- package/src/sources/sagas/deleteSource.js +14 -15
- package/src/sources/sagas/disableSource.js +1 -17
- package/src/sources/sagas/enableSource.js +1 -17
- package/src/sources/sagas/index.js +0 -9
- package/src/sources/sagas/updateSource.js +18 -15
- package/src/sources/components/DynamicSourceForm.js +0 -60
- package/src/sources/components/SourceLoader.js +0 -59
- package/src/sources/components/SourcesLoader.js +0 -39
- package/src/sources/components/__tests__/DynamicSourceForm.spec.js +0 -89
- package/src/sources/components/__tests__/SourceLoader.spec.js +0 -54
- package/src/sources/components/__tests__/SourcesLoader.spec.js +0 -53
- package/src/sources/components/__tests__/__snapshots__/DynamicSourceForm.spec.js.snap +0 -8
- package/src/sources/components/__tests__/__snapshots__/SourceLoader.spec.js.snap +0 -3
- package/src/sources/components/__tests__/__snapshots__/SourcesLoader.spec.js.snap +0 -3
- package/src/sources/reducers/__tests__/source.spec.js +0 -44
- package/src/sources/reducers/__tests__/sourceLoading.spec.js +0 -30
- package/src/sources/reducers/__tests__/sources.spec.js +0 -37
- package/src/sources/reducers/__tests__/sourcesLoading.spec.js +0 -30
- package/src/sources/reducers/source.js +0 -35
- package/src/sources/reducers/sourceLoading.js +0 -16
- package/src/sources/reducers/sources.js +0 -28
- package/src/sources/reducers/sourcesLoading.js +0 -16
- package/src/sources/sagas/__tests__/fetchSource.spec.js +0 -71
- package/src/sources/sagas/__tests__/fetchSources.spec.js +0 -69
- package/src/sources/sagas/__tests__/updateSourceConfig.spec.js +0 -73
- package/src/sources/sagas/fetchSource.js +0 -30
- package/src/sources/sagas/fetchSources.js +0 -26
- 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
|
-
|
|
20
|
-
width: 2
|
|
19
|
+
width: 2,
|
|
21
20
|
},
|
|
22
21
|
{
|
|
23
22
|
name: "type",
|
|
24
23
|
sort: { name: "type.sort" },
|
|
25
|
-
|
|
26
|
-
width: 2
|
|
24
|
+
width: 2,
|
|
27
25
|
},
|
|
28
26
|
{
|
|
29
27
|
name: "status",
|
|
30
28
|
sort: { name: "status.sort" },
|
|
31
|
-
|
|
32
|
-
width: 2
|
|
29
|
+
width: 2,
|
|
33
30
|
},
|
|
34
31
|
{
|
|
35
32
|
name: "message",
|
|
36
|
-
|
|
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
|
|
49
|
-
|
|
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
|
+
);
|
package/src/messages/en.js
CHANGED
|
@@ -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",
|
package/src/messages/es.js
CHANGED
|
@@ -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
|
+
`;
|
package/src/sources/api.js
CHANGED
|
@@ -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
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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
|
|
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?.
|
|
11
|
+
const id = source?.externalId;
|
|
14
12
|
const options = _.flow(
|
|
15
|
-
_.
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
47
|
-
|
|
48
|
-
export default connect(mapStateToProps, { createJob })(NewJob);
|
|
35
|
+
export default connect(null, { createJob })(NewJob);
|
|
@@ -1,85 +1,21 @@
|
|
|
1
|
-
import
|
|
2
|
-
import React, { useState, useEffect } from "react";
|
|
1
|
+
import React from "react";
|
|
3
2
|
import PropTypes from "prop-types";
|
|
4
|
-
import {
|
|
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
|
|
11
|
-
|
|
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
|
|
11
|
+
<SourceBreadcrumbs text={source?.externalId} />
|
|
45
12
|
<Segment>
|
|
46
|
-
<
|
|
47
|
-
|
|
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
|
-
|
|
80
|
-
source,
|
|
81
|
-
template: _.find(_.propEq("name", source.type))(templates),
|
|
82
|
-
sourceUpdateStatus,
|
|
83
|
-
});
|
|
19
|
+
Source.propTypes = { source: PropTypes.object };
|
|
84
20
|
|
|
85
|
-
export default
|
|
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,
|
|
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>{
|
|
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,
|
|
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>{
|
|
60
|
+
{ external_id: <i>{externalId}</i> }
|
|
61
61
|
)}
|
|
62
|
-
onConfirm={() => deleteSource({
|
|
62
|
+
onConfirm={() => deleteSource({ id })}
|
|
63
63
|
/>
|
|
64
64
|
);
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
ConfirmDeleteModal.propTypes = {
|
|
68
68
|
deleteSource: PropTypes.func,
|
|
69
|
-
|
|
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 {
|
|
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({
|
|
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
|
-
|
|
102
|
+
externalId,
|
|
103
|
+
id,
|
|
110
104
|
};
|
|
111
|
-
const actions =
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
export default connect(mapStateToProps, {
|
|
117
|
+
export default connect(null, {
|
|
126
118
|
deleteSource,
|
|
127
119
|
disableSource,
|
|
128
120
|
enableSource,
|