@truedat/bg 6.0.2 → 6.0.4

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 (27) hide show
  1. package/package.json +6 -6
  2. package/src/concepts/api.js +3 -0
  3. package/src/concepts/components/ConceptDetails.js +1 -3
  4. package/src/concepts/components/ConceptEdit.js +124 -110
  5. package/src/concepts/components/ConceptForm.js +154 -123
  6. package/src/concepts/components/ConceptRoutes.js +9 -0
  7. package/src/concepts/components/ConceptsActions.js +4 -1
  8. package/src/concepts/components/ConceptsUpdateButton.js +3 -2
  9. package/src/concepts/components/ConceptsUploadButton.js +21 -2
  10. package/src/concepts/components/ConceptsUploadEvents.js +24 -0
  11. package/src/concepts/components/ConceptsUploadEventsTable.js +166 -0
  12. package/src/concepts/components/__tests__/ConceptForm.spec.js +23 -1
  13. package/src/concepts/components/__tests__/ConceptsActions.spec.js +1 -0
  14. package/src/concepts/components/__tests__/ConceptsUploadButton.spec.js +35 -13
  15. package/src/concepts/components/__tests__/ConceptsUploadEventsTable.spec.js +98 -0
  16. package/src/concepts/components/__tests__/__snapshots__/ConceptsUploadButton.spec.js.snap +75 -24
  17. package/src/concepts/components/__tests__/__snapshots__/ConceptsUploadEventsTable.spec.js.snap +115 -0
  18. package/src/concepts/hooks/useUploadEvents.js +11 -0
  19. package/src/concepts/reducers/uploadConceptsFile.js +0 -1
  20. package/src/concepts/selectors/__tests__/getConceptUploadEventColumns.spec.js +20 -0
  21. package/src/concepts/selectors/getConceptUploadEventColumns.js +72 -0
  22. package/src/concepts/selectors/index.js +4 -0
  23. package/src/concepts/styles/conceptsUploadEventColumns.less +24 -0
  24. package/src/messages/en.js +45 -9
  25. package/src/messages/es.js +46 -9
  26. package/src/reducers/__tests__/bgMessage.spec.js +12 -9
  27. package/src/reducers/bgMessage.js +12 -9
@@ -0,0 +1,115 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`<ConceptsUploadEventsTable /> matches the latest snapshot 1`] = `
4
+ <div>
5
+ <table
6
+ class="ui selectable sortable table"
7
+ >
8
+ <thead
9
+ class=""
10
+ >
11
+ <tr
12
+ class=""
13
+ >
14
+ <th
15
+ class="two wide"
16
+ >
17
+ Status
18
+ </th>
19
+ <th
20
+ class="two wide"
21
+ >
22
+ Response
23
+ </th>
24
+ <th
25
+ class="two wide"
26
+ >
27
+ Date
28
+ </th>
29
+ </tr>
30
+ </thead>
31
+ <tbody
32
+ class=""
33
+ >
34
+ <tr
35
+ class="contracted"
36
+ >
37
+ <td
38
+ class=""
39
+ >
40
+ Completed
41
+ </td>
42
+ <td
43
+ class=""
44
+ >
45
+ <p>
46
+ Upload success! Created: 3, updated: 3
47
+ </p>
48
+ <ul
49
+ class="bulk-upload-error"
50
+ />
51
+ </td>
52
+ <td
53
+ class="center aligned"
54
+ >
55
+ <time
56
+ datetime="1650729204638"
57
+ >
58
+ 2022-04-23 15:53
59
+ </time>
60
+ </td>
61
+ </tr>
62
+ <tr
63
+ class="contracted"
64
+ >
65
+ <td
66
+ class=""
67
+ >
68
+ Completed
69
+ </td>
70
+ <td
71
+ class=""
72
+ >
73
+ <p>
74
+ Upload success with errors. Created: 0, updated: 0, errors: 3
75
+ </p>
76
+ <ul
77
+ class="bulk-upload-error"
78
+ >
79
+ <li>
80
+ The field gdpr of row 4 of type grpd_template is invalid. Error: Missing value
81
+ </li>
82
+ <li>
83
+ Can't update concept of row 2 of type test_template. Unauthorized concept updating for forbidden_domain domain
84
+ </li>
85
+ <li>
86
+ Concept name not available. Row 7 of type test_template. Name test_name_not_available.
87
+ </li>
88
+ </ul>
89
+ <a
90
+ class="alert-exporter-in-table"
91
+ download="errors.csv"
92
+ href="data:text/csv;charset=utf-8,"RENDEREDMESSAGE","ERROR_TYPE","BODY.MESSAGE","BODY.CONTEXT.FIELD","BODY.CONTEXT.TYPE","BODY.CONTEXT.ROW","BODY.CONTEXT.ERROR","BODY.CONTEXT.DOMAIN","BODY.CONTEXT.NAME"
93
+ "The field gdpr of row 4 of type grpd_template is invalid. Error: Missing value","test_field_error","concepts.upload.failed.invalid_field_value","gdpr","grpd_template","4","Missing value","",""
94
+ "Can't update concept of row 2 of type test_template. Unauthorized concept updating for forbidden_domain domain","test_forbidden_update","concepts.upload.failed.forbidden_update","","test_template","2","","forbidden_domain",""
95
+ "Concept name not available. Row 7 of type test_template. Name test_name_not_available.","test_name_not_available","concepts.upload.failed.name_not_available","","test_template","7","","","test_name_not_available""
96
+ style="float: right;"
97
+ target="_self"
98
+ >
99
+ Export to CSV
100
+ </a>
101
+ </td>
102
+ <td
103
+ class="center aligned"
104
+ >
105
+ <time
106
+ datetime="1650726888770"
107
+ >
108
+ 2022-04-23 15:14
109
+ </time>
110
+ </td>
111
+ </tr>
112
+ </tbody>
113
+ </table>
114
+ </div>
115
+ `;
@@ -0,0 +1,11 @@
1
+ import useSWR from "swr";
2
+ import { apiJson } from "@truedat/core/services/api";
3
+ import { API_BUSINESS_CONCEPT_BULK_UPLOAD } from "../api";
4
+
5
+ export const useUploadEvents = () => {
6
+ const { data, error, mutate } = useSWR(
7
+ API_BUSINESS_CONCEPT_BULK_UPLOAD,
8
+ apiJson
9
+ );
10
+ return { data: data?.data, error, loading: !error && !data, mutate };
11
+ };
@@ -2,7 +2,6 @@ import { uploadConcepts } from "../routines";
2
2
 
3
3
  const initialState = {
4
4
  loading: false,
5
- error: {}
6
5
  };
7
6
 
8
7
  export const uploadConceptsFile = (state = initialState, { type, payload }) => {
@@ -0,0 +1,20 @@
1
+ import {
2
+ getConceptUploadEventColumns,
3
+ defaultConceptsUploadEventColumns,
4
+ } from "..";
5
+
6
+ describe("selectors: getConceptUploadEventColumns", () => {
7
+ it("should return custom conceptsUploadEventColumns when present", () => {
8
+ const conceptsUploadEventColumns = [{ name: "test" }];
9
+ const res = getConceptUploadEventColumns({
10
+ conceptsUploadEventColumns,
11
+ });
12
+ expect(res).toHaveLength(1);
13
+ expect(res).toEqual(conceptsUploadEventColumns);
14
+ });
15
+
16
+ it("should return default defaultRuleImplementationColumns when no customized", () => {
17
+ const res = getConceptUploadEventColumns({});
18
+ expect(res).toHaveLength(defaultConceptsUploadEventColumns.length);
19
+ });
20
+ });
@@ -0,0 +1,72 @@
1
+ import _ from "lodash/fp";
2
+ import React from "react";
3
+ import { createSelector } from "reselect";
4
+ import { FormattedMessage } from "react-intl";
5
+ import Moment from "react-moment";
6
+ import { AlertExporter } from "@truedat/core/components/AlertExporter";
7
+
8
+ const bulkUpdateErrors = (response) => {
9
+ return _.isEmpty(response) ? (
10
+ ""
11
+ ) : (
12
+ <>
13
+ <p>{response.translatedHeader}</p>
14
+ <ul className="bulk-upload-error">
15
+ {_.map.convert({ cap: false })((translatedError, key) => {
16
+ return <li key={`error_${key}`}>{translatedError}</li>;
17
+ })(response.translatedErrors)}
18
+ </ul>
19
+ {_.isEmpty(response.errors) ? null : (
20
+ <AlertExporter
21
+ className="alert-exporter-in-table"
22
+ onClick={(e) => e.stopPropagation()}
23
+ {...{
24
+ list: response.translatedErrors,
25
+ messages: response.errors,
26
+ }}
27
+ />
28
+ )}
29
+ </>
30
+ );
31
+ };
32
+
33
+ const dateDecorator = (date) =>
34
+ date && <Moment locale="es" date={date} format="YYYY-MM-DD HH:mm" />;
35
+
36
+ const statusDecorator = (status) => (
37
+ <FormattedMessage id={`concepts.upload.status.${_.toLower(status)}`} />
38
+ );
39
+
40
+ export const defaultConceptsUploadEventColumns = [
41
+ {
42
+ name: "filename",
43
+ width: 2,
44
+ },
45
+ {
46
+ name: "status",
47
+ fieldDecorator: statusDecorator,
48
+ width: 2,
49
+ },
50
+ {
51
+ name: "response",
52
+ fieldDecorator: bulkUpdateErrors,
53
+ width: 2,
54
+ },
55
+ {
56
+ name: "message",
57
+ width: 2,
58
+ },
59
+ {
60
+ name: "inserted_at",
61
+ fieldDecorator: dateDecorator,
62
+ textAlign: "center",
63
+ width: 2,
64
+ },
65
+ ];
66
+
67
+ const getColumns = (state) => state.conceptsUploadEventColumns;
68
+
69
+ export const getConceptUploadEventColumns = createSelector(
70
+ [getColumns],
71
+ (columns) => _.defaultTo(defaultConceptsUploadEventColumns)(columns)
72
+ );
@@ -5,6 +5,10 @@ export { getConceptFilterTypes } from "./getConceptFilterTypes";
5
5
  export { getConceptSelectedFilters } from "./getConceptSelectedFilters";
6
6
  export { getConceptSelectedFilterActiveValues } from "./getConceptSelectedFilterActiveValues";
7
7
  export { getConceptSelectedFilterValues } from "./getConceptSelectedFilterValues";
8
+ export {
9
+ getConceptUploadEventColumns,
10
+ defaultConceptsUploadEventColumns,
11
+ } from "./getConceptUploadEventColumns";
8
12
  export { getParsedEvents } from "./getParsedEvents";
9
13
  export { getPreviousConceptQuery } from "./getPreviousConceptQuery";
10
14
  export { getTemplateFields } from "./getTemplateFields";
@@ -0,0 +1,24 @@
1
+ .contracted ul.bulk-upload-error {
2
+ max-height: 100px;
3
+ overflow: hidden;
4
+ }
5
+
6
+ .contracted ul.bulk-upload-error {
7
+ .fade-up();
8
+ }
9
+
10
+ .fade-up {
11
+ background: -webkit-linear-gradient(rgba(0,0,0,1), rgba(0,0,0,0));
12
+ background-clip: text;
13
+ -webkit-background-clip: text;
14
+ -webkit-text-fill-color: transparent;
15
+ }
16
+
17
+ .alert-exporter-in-table {
18
+ padding: 3px;
19
+ margin: 5px;
20
+ &:hover {
21
+ padding: 2px;
22
+ border: 1px solid blue;
23
+ }
24
+ }
@@ -183,25 +183,61 @@ export default {
183
183
  "concepts.subheader.view": "Query business concepts",
184
184
  "concepts.summary": "Summary",
185
185
  "concepts.taxonomy": "Taxonomy",
186
+ "concepts.upload.header": "Upload concepts events",
187
+ "concepts.upload.subheader": "Upload concepts events by XLSX",
188
+ "concepts.upload.failed.business_concept_not_exists":
189
+ "The concept with id {id} not exists. File {row} of type {type}",
190
+ "concepts.upload.failed.domain_changed":
191
+ "Domain can't be changed. Row {row} of type {type} domain {domain}",
192
+ "concepts.upload.failed.empty_template_name": "Empty template name",
193
+ "concepts.upload.failed.forbidden":
194
+ "Access forbidden to domain. Row {row}. Domain {domain}.",
195
+ "concepts.upload.failed.forbidden_creation":
196
+ "Can't create concept of row {row} of type {type}. Unauthorized concept creation for {domain} domain",
197
+ "concepts.upload.failed.forbidden_publish":
198
+ "Can't publish concept of row {row} of type {type}. Unauthorized concept publishing for {domain} domain",
199
+ "concepts.upload.failed.forbidden_update":
200
+ "Can't update concept of row {row} of type {type}. Unauthorized concept updating for {domain} domain",
201
+ "concepts.upload.failed.forbidden_version":
202
+ "The concept with {id} of row {row} of type {type} can't be versioned",
186
203
  "concepts.upload.failed.header":
187
- "Error uploading file. No concepts have been created.",
188
- "alert.uploadConcepts.failed.header":
189
- "Error uploading file. No concepts have been created.",
204
+ "Headers {headers} of type {type} are missing but are required",
205
+ "concepts.upload.failed.invalid_concept":
206
+ "Invalid concept id {id}, doesn't exists. Row {row} of type {type}",
190
207
  "concepts.upload.failed.invalid_domain":
191
- "Invalid domain. Row {row}. Domain {domain}.",
208
+ "Invalid domain. Row {row} of type {type}. Domain {domain}.",
209
+ "concepts.upload.failed.invalid_field_value":
210
+ "The field {field} of row {row} of type {type} is invalid. Error: {error}",
192
211
  "concepts.upload.failed.invalid_file_format": "File format is invalid.",
193
212
  "concepts.upload.failed.invalid_template":
194
- "Invalid template. Row {row}. Template {template}.",
213
+ "Template {template} doesn't exists",
195
214
  "concepts.upload.failed.missing_required_columns":
196
215
  "Missing required columns. Expected [{expected}]. Found [{found}].",
197
216
  "concepts.upload.failed.missing_value":
198
217
  "Missing required value. Row {row}. Field {field}.",
199
218
  "concepts.upload.failed.name_not_available":
200
- "Concept name not available. Row {row}. Name {name}.",
201
- "concepts.upload.failed.forbidden":
202
- "Access forbidden to domain. Row {row}. Domain {domain}.",
219
+ "Concept name not available. Row {row} of type {type}. Name {name}.",
220
+ "concepts.upload.failed.success.errors": "Error in line {row} of type {type}",
221
+ "concepts.upload.props.filename": "File",
222
+ "concepts.upload.props.file_hash": "File hash",
223
+ "concepts.upload.props.inserted_at": "Date",
224
+ "concepts.upload.props.message": "Message",
225
+ "concepts.upload.props.response": "Response",
226
+ "concepts.upload.props.status": "Status",
227
+ "concepts.upload.status.already_calculated": "Already calculated",
228
+ "concepts.upload.status.already_started": "Already started",
229
+ "concepts.upload.status.completed": "Completed",
230
+ "concepts.upload.status.failed": "Failed",
231
+ "concepts.upload.status.just_started": "Just started",
232
+ "concepts.upload.status.started": "Started",
233
+ "concepts.upload.status.timed_out": "Timed out",
234
+ "concepts.upload.success.accepted.header":
235
+ "XLSX accepted. Status can be checked at the link below:",
203
236
  "concepts.upload.success.content": "Loaded {count} concepts successfully",
204
- "concepts.upload.success.header": "Upload success!",
237
+ "concepts.upload.success.header":
238
+ "Upload success! Created: {count_created}, updated: {count_updated}",
239
+ "concepts.upload.success.header_with_errors":
240
+ "Upload success with errors. Created: {count_created}, updated: {count_updated}, errors: {count_errors}",
205
241
  "createDomain.error.external_id.blank": "Empty external id",
206
242
  "createDomain.error.external_id.unique":
207
243
  "A domain with the same external id exists",
@@ -184,27 +184,64 @@ export default {
184
184
  "concepts.subheader.view": "Consultar conceptos de negocio",
185
185
  "concepts.summary": "Resumen",
186
186
  "concepts.taxonomy": "Taxonomía",
187
+ "concepts.upload.header": "Eventos de subida de conceptos",
188
+ "concepts.upload.subheader": "Eventos de subida de conceptos por XLSX",
189
+ "concepts.upload.failed.business_concept_not_exists":
190
+ "El concepto con id {id} no existe. Fila {row} del tipo {type}",
191
+ "concepts.upload.failed.domain_changed":
192
+ "El dominio no puede ser cambiado. Fila {row} of tipo {type} dominio {domain}",
193
+ "concepts.upload.failed.empty_template_name": "Nombre de plantilla vacío",
194
+ "concepts.upload.failed.forbidden":
195
+ "Acceso a dominio no permitido. Línea: {row}. Dominio: {domain}.",
196
+ "concepts.upload.failed.forbidden_creation":
197
+ "No se puede crear el concepto de la fila {row} de la template {template}. La creación de conceptos en el dominio {domain} no está autorizada",
198
+ "concepts.upload.failed.forbidden_publish":
199
+ "No se puede publicar el concepto de la fila {row} del tipo {type}. La publicación de conceptos en el dominio {domain} no está autorizada",
200
+ "concepts.upload.failed.forbidden_update":
201
+ "No se puede actualizar el concepto de la fila {row} del tipo {type}. La actualización de conceptos en el dominio {domain} no está autorizada",
202
+ "concepts.upload.failed.forbidden_version":
203
+ "No se puede versionar el concepto con id {id} de la fila {row} del tipo {type}",
187
204
  "concepts.upload.failed.header":
188
- "Error al subir el fichero. No se ha realizado ninguna inserción.",
189
- "alert.uploadConcepts.failed.header":
190
- "Error al subir el fichero. No se ha realizado ninguna inserción.",
205
+ "Las cabeceras {headers} del tipo {type} son requeridas pero no están definidas",
206
+ "concepts.upload.failed.invalid_concept":
207
+ "El concepto con id {id} no existe. Fila {row} del tipo {type}",
191
208
  "concepts.upload.failed.invalid_domain":
192
- "Domínio invalido. Linea {row}. Domínio: {domain}.",
209
+ "Dominio inválido. Línea {row} del tipo {type}. Dominio: {domain}.",
210
+ "concepts.upload.failed.invalid_field_value":
211
+ "El campo {field} de la fila {row} del tipo {type} es inválido. Error: {error}",
193
212
  "concepts.upload.failed.invalid_file_format":
194
213
  "Formato del fichero es inválido.",
195
214
  "concepts.upload.failed.invalid_template":
196
- "Plantilla invalida. Linea: {row}. Plantilla: {template}",
215
+ "La plantilla {template} no existe",
197
216
  "concepts.upload.failed.missing_required_columns":
198
217
  "Faltan columnas obligatorias en el fichero. Esperado [{expected}]. Recibido [{found}].",
199
218
  "concepts.upload.failed.missing_value":
200
219
  "Campo obligatorio no informado. Linea: {row}. Campo: {field}",
201
220
  "concepts.upload.failed.name_not_available":
202
- "Nombre de concepto no disponible. Linea: {row}. Nombre: {name}",
203
- "concepts.upload.failed.forbidden":
204
- "Acceso a dominio no permitido. Línea: {row}. Dominio: {domain}.",
221
+ "Nombre de concepto no disponible. Linea: {row} tipo {type}. Nombre: {name}",
222
+ "concepts.upload.failed.success.errors":
223
+ "Error en linea {row} del tipo {type}",
224
+ "concepts.upload.props.filename": "Fichero",
225
+ "concepts.upload.props.file_hash": "Hash de Fichero",
226
+ "concepts.upload.props.inserted_at": "Fecha",
227
+ "concepts.upload.props.message": "Mensaje",
228
+ "concepts.upload.props.response": "Respuesta",
229
+ "concepts.upload.props.status": "Estado",
230
+ "concepts.upload.status.already_calculated": "Previamente calculado",
231
+ "concepts.upload.status.already_started": "Previamente iniciado",
232
+ "concepts.upload.status.completed": "Finalizado",
233
+ "concepts.upload.status.failed": "Fallido",
234
+ "concepts.upload.status.just_started": "Acaba de iniciarse",
235
+ "concepts.upload.status.started": "Iniciado",
236
+ "concepts.upload.status.timed_out": "Tiempo de espera máximo sobrepasado",
237
+ "concepts.upload.success.accepted.header":
238
+ "XLSX aceptado. Puede comprobar el estado en el siguiente enlace:",
205
239
  "concepts.upload.success.content":
206
240
  "Se han insertado correctamente {count} términos",
207
- "concepts.upload.success.header": "Fichero subido correctamente",
241
+ "concepts.upload.success.header":
242
+ "Fichero subido correctamente. Creados: {count_created}, actualizados: {count_updated}",
243
+ "concepts.upload.success.header_with_errors":
244
+ "Fichero subido con errores. Creados: {count_created}, actualizados: {count_updated}, errores: {count_errors}",
208
245
  "createDomain.error.external_id.blank": "Id Externo vacío",
209
246
  "createDomain.error.external_id.unique":
210
247
  "Ya existe un dominio con el mismo id externo",
@@ -1,3 +1,4 @@
1
+ import { CONCEPTS_BULK_UPLOAD_EVENTS } from "@truedat/core/routes";
1
2
  import { uploadConcepts } from "../../routines";
2
3
  import { bgMessage } from "..";
3
4
 
@@ -14,16 +15,18 @@ describe("reducers: bgMessage", () => {
14
15
  expect(
15
16
  bgMessage(fooState, {
16
17
  type: uploadConcepts.SUCCESS,
17
- payload: { data: { message: { length: 5 } } }
18
+ payload: { data: { message: { length: 5 } } },
18
19
  })
19
20
  ).toEqual({
20
21
  error: false,
21
- header: "concepts.upload.success.header",
22
- content: "concepts.upload.success.content",
22
+ header: "concepts.upload.success.accepted.header",
23
23
  icon: "check",
24
- color: "green",
24
+ color: "blue",
25
25
  text: "",
26
- fields: { count: 5 }
26
+ anchor: {
27
+ reference: CONCEPTS_BULK_UPLOAD_EVENTS,
28
+ label: "sidemenu.concepts_upload_events",
29
+ },
27
30
  });
28
31
  });
29
32
 
@@ -33,10 +36,10 @@ describe("reducers: bgMessage", () => {
33
36
  type: uploadConcepts.FAILURE,
34
37
  payload: {
35
38
  data: {
36
- error: { error: "unprocessable_entity", field: "What a field!!" }
39
+ error: { error: "unprocessable_entity", field: "What a field!!" },
37
40
  },
38
- status: 422
39
- }
41
+ status: 422,
42
+ },
40
43
  })
41
44
  ).toEqual({
42
45
  error: true,
@@ -44,7 +47,7 @@ describe("reducers: bgMessage", () => {
44
47
  content: `concepts.upload.failed.unprocessable_entity`,
45
48
  icon: "attention",
46
49
  text: "",
47
- fields: { error: "unprocessable_entity", field: "What a field!!" }
50
+ fields: { error: "unprocessable_entity", field: "What a field!!" },
48
51
  });
49
52
  });
50
53
  });
@@ -1,5 +1,6 @@
1
1
  import _ from "lodash/fp";
2
2
  import { dismissAlert } from "@truedat/core/routines";
3
+ import { CONCEPTS_BULK_UPLOAD_EVENTS } from "@truedat/core/routes";
3
4
  import { uploadConcepts } from "../routines";
4
5
  import { bulkUpdate } from "../concepts/routines";
5
6
 
@@ -12,24 +13,26 @@ const bgMessage = (state = initialState, { type, payload }) => {
12
13
  case uploadConcepts.SUCCESS:
13
14
  return {
14
15
  error: false,
15
- header: "concepts.upload.success.header",
16
- content: "concepts.upload.success.content",
16
+ header: "concepts.upload.success.accepted.header",
17
17
  icon: "check",
18
- color: "green",
18
+ color: "blue",
19
19
  text: "",
20
- fields: { count: payload.data.message.length }
20
+ anchor: {
21
+ reference: CONCEPTS_BULK_UPLOAD_EVENTS,
22
+ label: "sidemenu.concepts_upload_events",
23
+ },
21
24
  };
22
25
  case uploadConcepts.FAILURE:
23
26
  if (payload.status != 500 && !_.path("data.errors")(payload)) {
24
27
  return {
25
28
  error: true,
26
29
  header: "concepts.upload.failed.header",
27
- content: `concepts.upload.failed.${_.path("data.error.error")(
28
- payload
29
- ) || _.path("data.error")(payload)}`,
30
+ content: `concepts.upload.failed.${
31
+ _.path("data.error.error")(payload) || _.path("data.error")(payload)
32
+ }`,
30
33
  icon: "attention",
31
34
  text: "",
32
- fields: _.path("data.error")(payload)
35
+ fields: _.path("data.error")(payload),
33
36
  };
34
37
  } else {
35
38
  return null;
@@ -42,7 +45,7 @@ const bgMessage = (state = initialState, { type, payload }) => {
42
45
  icon: "check",
43
46
  color: "green",
44
47
  text: "",
45
- fields: { count: payload.data.message.length }
48
+ fields: { count: payload.data.message.length },
46
49
  };
47
50
  default:
48
51
  return state;