@truedat/bg 4.56.8 → 4.56.9

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.56.9] 2022-11-12
4
+
5
+ ### Added
6
+
7
+ - [TD-5161] Buttons to create implementations
8
+
3
9
  ## [4.54.9] 2022-10-28
4
10
 
5
11
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@truedat/bg",
3
- "version": "4.56.8",
3
+ "version": "4.56.9",
4
4
  "description": "Truedat Web Business Glossary",
5
5
  "sideEffects": false,
6
6
  "jsnext:main": "src/index.js",
@@ -34,7 +34,7 @@
34
34
  "@testing-library/jest-dom": "^5.16.5",
35
35
  "@testing-library/react": "^12.0.0",
36
36
  "@testing-library/user-event": "^13.2.1",
37
- "@truedat/test": "4.56.8",
37
+ "@truedat/test": "4.56.9",
38
38
  "babel-jest": "^28.1.0",
39
39
  "babel-plugin-dynamic-import-node": "^2.3.3",
40
40
  "babel-plugin-lodash": "^3.3.4",
@@ -86,8 +86,8 @@
86
86
  ]
87
87
  },
88
88
  "dependencies": {
89
- "@truedat/core": "4.56.8",
90
- "@truedat/df": "4.56.8",
89
+ "@truedat/core": "4.56.9",
90
+ "@truedat/df": "4.56.9",
91
91
  "file-saver": "^2.0.5",
92
92
  "moment": "^2.29.4",
93
93
  "path-to-regexp": "^1.7.0",
@@ -108,5 +108,5 @@
108
108
  "react-dom": ">= 16.8.6 < 17",
109
109
  "semantic-ui-react": ">= 2.0.3 < 2.2"
110
110
  },
111
- "gitHead": "9bf266eb26e4af0b774560d5a88b0f22325495e0"
111
+ "gitHead": "da9a49da6d48b51faf603abff56ff7b1b6c5e413"
112
112
  }
@@ -21,6 +21,8 @@ export const ConceptTabs = ({
21
21
  concept,
22
22
  emptyConceptTags,
23
23
  emptyImplementationLinks,
24
+ createImplementation,
25
+ createRawImplementation,
24
26
  }) => {
25
27
  const archiveActive = useActiveRoute(CONCEPT_ARCHIVE);
26
28
  const conceptActive = useActiveRoute({
@@ -69,7 +71,9 @@ export const ConceptTabs = ({
69
71
  >
70
72
  <FormattedMessage id="tabs.bg.qualityRules" />
71
73
  </Menu.Item>
72
- {!emptyImplementationLinks && (
74
+ {(!emptyImplementationLinks ||
75
+ createImplementation ||
76
+ createRawImplementation) && (
73
77
  <Menu.Item
74
78
  active={implementationsActive}
75
79
  as={Link}
@@ -104,9 +108,16 @@ ConceptTabs.propTypes = {
104
108
  concept: PropTypes.object,
105
109
  emptyConceptTags: PropTypes.bool,
106
110
  emptyImplementationLinks: PropTypes.bool,
111
+ createImplementation: PropTypes.object,
112
+ createRawImplementation: PropTypes.object,
107
113
  };
108
114
 
109
- const mapStateToProps = ({ concept, relationTags, conceptLinks }) => ({
115
+ const mapStateToProps = ({
116
+ concept,
117
+ conceptPermissions,
118
+ conceptLinks,
119
+ relationTags,
120
+ }) => ({
110
121
  emptyConceptTags: _.flow(
111
122
  _.filter(_.pathEq("value.target_type", "business_concept")),
112
123
  _.isEmpty
@@ -116,6 +127,10 @@ const mapStateToProps = ({ concept, relationTags, conceptLinks }) => ({
116
127
  _.filter(_.pathEq("resource_type", "implementation")),
117
128
  _.isEmpty
118
129
  )(conceptLinks),
130
+ createImplementation: _.prop("create_implementation")(conceptPermissions),
131
+ createRawImplementation: _.prop("create_raw_implementation")(
132
+ conceptPermissions
133
+ ),
119
134
  });
120
135
 
121
136
  export default connect(mapStateToProps)(ConceptTabs);
@@ -29,4 +29,20 @@ describe("<ConceptTabs />", () => {
29
29
  const { container } = render(<ConceptTabs {...props} />, renderOpts);
30
30
  expect(container).toMatchSnapshot();
31
31
  });
32
+
33
+ it("With concept tags and implementation links", () => {
34
+ const props = {
35
+ concept: {
36
+ id: 1,
37
+ business_concept_id: 8,
38
+ },
39
+ emptyConceptTags: true,
40
+ emptyImplementationLinks: true,
41
+ createRawImplementation: { method: "POST" },
42
+ createLinkImplementation: { method: "POST" },
43
+ createImplementation: { method: "POST" },
44
+ };
45
+ const { container } = render(<ConceptTabs {...props} />, renderOpts);
46
+ expect(container).toMatchSnapshot();
47
+ });
32
48
  });
@@ -1,5 +1,50 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`<ConceptTabs /> With concept tags and implementation links 1`] = `
4
+ <div>
5
+ <div
6
+ class="ui pointing secondary top attached tabular menu"
7
+ >
8
+ <a
9
+ class="item"
10
+ href="/concepts/8/versions/1"
11
+ >
12
+ concept
13
+ </a>
14
+ <a
15
+ class="item"
16
+ href="/concepts/8/versions/1/links/structures"
17
+ >
18
+ relations_data_field
19
+ </a>
20
+ <a
21
+ class="item"
22
+ href="/concepts/8/versions/1/rules"
23
+ >
24
+ qualityRules
25
+ </a>
26
+ <a
27
+ class="item"
28
+ href="/concepts/8/versions/1/links/implementations"
29
+ >
30
+ qualityImplementations
31
+ </a>
32
+ <a
33
+ class="item"
34
+ href="/concepts/8/versions/1/archive"
35
+ >
36
+ history
37
+ </a>
38
+ <a
39
+ class="item"
40
+ href="/concepts/8/versions/1/events"
41
+ >
42
+ audit
43
+ </a>
44
+ </div>
45
+ </div>
46
+ `;
47
+
3
48
  exports[`<ConceptTabs /> matches the latest snapshot 1`] = `
4
49
  <div>
5
50
  <div
@@ -1,45 +1,107 @@
1
1
  import _ from "lodash/fp";
2
2
  import React from "react";
3
3
  import PropTypes from "prop-types";
4
+ import queryString from "query-string";
4
5
  import { connect } from "react-redux";
5
- import { Segment, Header } from "semantic-ui-react";
6
+ import { Button, Segment, Header, Message } from "semantic-ui-react";
6
7
  import { FormattedMessage } from "react-intl";
8
+ import { Link, useParams } from "react-router-dom";
9
+ import { useIntl } from "react-intl";
10
+ import {
11
+ IMPLEMENTATION_NEW,
12
+ IMPLEMENTATION_NEW_RAW,
13
+ } from "@truedat/core/routes";
7
14
  import { getConceptImplementationLinks } from "../selectors";
8
15
 
9
16
  const RuleImplementationsTable = React.lazy(() =>
10
17
  import("@truedat/dq/components/RuleImplementationsTable")
11
18
  );
12
19
 
13
- export const ConceptImplementationLinks = ({ groups }) => (
14
- <Segment attached="bottom">
15
- {groups.map(([tag, implementations], key) =>
16
- _.isEmpty(implementations) ? null : (
17
- <Segment vertical key={key}>
18
- <Header as="h3">
19
- {tag === "deleted" ? (
20
- <FormattedMessage id="implementationDeletedRelation.table.title" />
21
- ) : tag === "\uffee" ? (
22
- <FormattedMessage id="implementationRelation.table.title" />
23
- ) : (
24
- tag
25
- )}
26
- </Header>
27
- <RuleImplementationsTable
28
- ruleImplementations={implementations}
29
- withoutColumns={["business_concept"]}
20
+ export const ConceptImplementationLinks = ({
21
+ groups,
22
+ createImplementation,
23
+ createLinkImplementation,
24
+ createRawImplementation,
25
+ }) => {
26
+ const params = useParams();
27
+ const { formatMessage } = useIntl();
28
+ return (
29
+ <Segment attached="bottom">
30
+ <div style={{ height: "40px" }}>
31
+ {createRawImplementation && createLinkImplementation ? (
32
+ <Button
33
+ floated="right"
34
+ as={Link}
35
+ to={{
36
+ pathname: IMPLEMENTATION_NEW_RAW,
37
+ search: "?" + queryString.stringify(params),
38
+ }}
39
+ content={formatMessage({
40
+ id: "implementations.actions.create_raw",
41
+ })}
30
42
  />
31
- </Segment>
32
- )
33
- )}
34
- </Segment>
35
- );
43
+ ) : null}
44
+ {createImplementation && createLinkImplementation ? (
45
+ <Button
46
+ floated="right"
47
+ primary
48
+ as={Link}
49
+ to={{
50
+ pathname: IMPLEMENTATION_NEW,
51
+ search: "?" + queryString.stringify(params),
52
+ }}
53
+ content={formatMessage({ id: "implementations.actions.create" })}
54
+ />
55
+ ) : null}
56
+ </div>
57
+ {_.flatten(groups).length <= 2 ? (
58
+ <Message
59
+ key="empty_implementations"
60
+ content={formatMessage({ id: "concepts.implementations.empty" })}
61
+ />
62
+ ) : (
63
+ groups.map(([tag, implementations], key) =>
64
+ _.isEmpty(implementations) ? null : (
65
+ <Segment vertical key={key}>
66
+ <Header as="h3">
67
+ {tag === "deleted" ? (
68
+ <FormattedMessage id="implementationDeletedRelation.table.title" />
69
+ ) : tag === "\uffee" ? (
70
+ <FormattedMessage id="implementationRelation.table.title" />
71
+ ) : (
72
+ tag
73
+ )}
74
+ </Header>
75
+ <RuleImplementationsTable
76
+ ruleImplementations={implementations}
77
+ withoutColumns={["business_concept"]}
78
+ />
79
+ </Segment>
80
+ )
81
+ )
82
+ )}
83
+ </Segment>
84
+ );
85
+ };
36
86
 
37
87
  ConceptImplementationLinks.propTypes = {
38
88
  groups: PropTypes.array,
89
+ createImplementation: PropTypes.object,
90
+ createLinkImplementation: PropTypes.object,
91
+ createRawImplementation: PropTypes.object,
39
92
  };
40
93
 
41
94
  const mapStateToProps = (state) => ({
42
95
  groups: getConceptImplementationLinks(state),
96
+ createImplementation: _.prop("create_implementation")(
97
+ state.conceptPermissions
98
+ ),
99
+ createLinkImplementation: _.prop("create_link_implementation")(
100
+ state.conceptPermissions
101
+ ),
102
+ createRawImplementation: _.prop("create_raw_implementation")(
103
+ state.conceptPermissions
104
+ ),
43
105
  });
44
106
 
45
107
  export default connect(mapStateToProps)(ConceptImplementationLinks);
@@ -1,24 +1,102 @@
1
1
  import _ from "lodash/fp";
2
2
  import React, { Suspense } from "react";
3
3
  import { render } from "@truedat/test/render";
4
-
4
+ import en from "../../../../messages/en";
5
5
  import { ConceptImplementationLinks } from "../ConceptImplementationLinks";
6
6
 
7
- describe("<ConceptImplementationLinks />", () => {
8
- const renderOpts = {
9
- messages: {
10
- en: {
11
- "implementationDeletedRelation.table.title": "Deleted Implementations",
12
- "implementationRelation.table.title": "Link to Implementation",
13
- },
14
- },
15
- };
7
+ jest.mock("react-router-dom", () => ({
8
+ ...jest.requireActual("react-router-dom"),
9
+ useParams: () => ({
10
+ business_concept_id: "6483",
11
+ id: "12345",
12
+ }),
13
+ }));
16
14
 
17
- const props = {
18
- groups: [["group", [{ implementation_key: "foo" }]]],
19
- };
15
+ const messages = {
16
+ en: {
17
+ ...en,
18
+ "ruleImplementations.props.goal": "Goal",
19
+ "ruleImplementations.props.minimum": "Minimum",
20
+ "ruleImplementations.props.result_type": "Result Type",
21
+ "ruleImplementations.props.last_execution_at": "Last execution",
22
+ "ruleImplementations.props.status": "Status",
23
+ "ruleImplementations.props.rule": "Rule",
24
+ "ruleImplementations.props.implementation_key": "Implementation",
25
+ "ruleImplementations.props.result": "Result",
26
+ "ruleImplementations.props.updated_at": "Updated At",
27
+ "ruleImplementations.props.inserted_at": "Inserted At",
28
+ "implementations.actions.create": "Create Implementation",
29
+ "implementations.actions.create_raw": "Create Raw Implementation",
30
+ "concepts.implementations.empty": "This concept has no implementations",
31
+ },
32
+ };
20
33
 
34
+ describe("<ConceptImplementationLinks />", () => {
21
35
  it("matches the latest snapshot", () => {
36
+ const props = {
37
+ groups: [
38
+ ["group", [{ implementation_key: "foo", id: "1" }]],
39
+ ["deleted", []],
40
+ ],
41
+ };
42
+ const renderOpts = { messages };
43
+ const { container } = render(
44
+ <Suspense fallback={null}>
45
+ <ConceptImplementationLinks {...props} />
46
+ </Suspense>,
47
+ renderOpts
48
+ );
49
+ expect(container).toMatchSnapshot();
50
+ });
51
+
52
+ it("show create implementations buttons when have permissions", () => {
53
+ const renderOpts = { messages };
54
+ const props = {
55
+ groups: [
56
+ ["group", [{ implementation_key: "foo", id: "1" }]],
57
+ ["deleted", []],
58
+ ],
59
+ createRawImplementation: { method: "POST" },
60
+ createLinkImplementation: { method: "POST" },
61
+ createImplementation: { method: "POST" },
62
+ };
63
+ const { container } = render(
64
+ <Suspense fallback={null}>
65
+ <ConceptImplementationLinks {...props} />
66
+ </Suspense>,
67
+ renderOpts
68
+ );
69
+ expect(container).toMatchSnapshot();
70
+ });
71
+
72
+ it("show implementations with groups", () => {
73
+ const renderOpts = { messages };
74
+ const props = {
75
+ groups: [
76
+ ["○", [{ implementation_key: "foo", id: "1" }]],
77
+ ["deleted", [{ implementation_key: "bar", id: "2" }]],
78
+ ],
79
+ createRawImplementation: { method: "POST" },
80
+ createLinkImplementation: { method: "POST" },
81
+ createImplementation: { method: "POST" },
82
+ };
83
+ const { container } = render(
84
+ <Suspense fallback={null}>
85
+ <ConceptImplementationLinks {...props} />
86
+ </Suspense>,
87
+ renderOpts
88
+ );
89
+ expect(container).toMatchSnapshot();
90
+ });
91
+
92
+ it("when don't have any implementation", () => {
93
+ const renderOpts = { messages };
94
+ const props = {
95
+ groups: [["group", []]],
96
+ createRawImplementation: { method: "POST" },
97
+ createLinkImplementation: { method: "POST" },
98
+ createImplementation: { method: "POST" },
99
+ };
22
100
  const { container } = render(
23
101
  <Suspense fallback={null}>
24
102
  <ConceptImplementationLinks {...props} />
@@ -6,6 +6,45 @@ exports[`<ConceptImplementationLinks /> matches the latest snapshot 1`] = `
6
6
  class="ui bottom attached segment"
7
7
  style="display: none;"
8
8
  >
9
+ <div
10
+ style="height: 40px;"
11
+ />
12
+ <div
13
+ class="ui vertical segment"
14
+ >
15
+ <h3
16
+ class="ui header"
17
+ >
18
+ group
19
+ </h3>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ `;
24
+
25
+ exports[`<ConceptImplementationLinks /> show create implementations buttons when have permissions 1`] = `
26
+ <div>
27
+ <div
28
+ class="ui bottom attached segment"
29
+ >
30
+ <div
31
+ style="height: 40px;"
32
+ >
33
+ <a
34
+ class="ui right floated button"
35
+ href="/implementations/new_raw?business_concept_id=6483&id=12345"
36
+ role="button"
37
+ >
38
+ Create Raw Implementation
39
+ </a>
40
+ <a
41
+ class="ui primary right floated button"
42
+ href="/implementations/new?business_concept_id=6483&id=12345"
43
+ role="button"
44
+ >
45
+ Create Implementation
46
+ </a>
47
+ </div>
9
48
  <div
10
49
  class="ui vertical segment"
11
50
  >
@@ -14,6 +53,425 @@ exports[`<ConceptImplementationLinks /> matches the latest snapshot 1`] = `
14
53
  >
15
54
  group
16
55
  </h3>
56
+ <table
57
+ class="ui sortable table"
58
+ >
59
+ <thead
60
+ class=""
61
+ >
62
+ <tr
63
+ class=""
64
+ >
65
+ <th
66
+ class="two wide"
67
+ >
68
+ Implementation
69
+ </th>
70
+ <th
71
+ class="two wide"
72
+ >
73
+ Rule
74
+ </th>
75
+ <th
76
+ class="two wide"
77
+ >
78
+ Status
79
+ </th>
80
+ <th
81
+ class="two wide"
82
+ >
83
+ Last execution
84
+ </th>
85
+ <th
86
+ class="two wide"
87
+ >
88
+ Result Type
89
+ </th>
90
+ <th
91
+ class="one wide"
92
+ >
93
+ Minimum
94
+ </th>
95
+ <th
96
+ class="one wide"
97
+ >
98
+ Goal
99
+ </th>
100
+ <th
101
+ class="two wide"
102
+ >
103
+ Result
104
+ </th>
105
+ <th
106
+ class="ascending sorted disabled"
107
+ >
108
+ Inserted At
109
+ </th>
110
+ <th
111
+ class="ascending sorted disabled"
112
+ >
113
+ Updated At
114
+ </th>
115
+ </tr>
116
+ </thead>
117
+ <tbody
118
+ class=""
119
+ >
120
+ <tr
121
+ class=""
122
+ >
123
+ <td
124
+ class=""
125
+ >
126
+ <a
127
+ href="/implementations/1"
128
+ >
129
+ foo
130
+ </a>
131
+ </td>
132
+ <td
133
+ class=""
134
+ />
135
+ <td
136
+ class=""
137
+ >
138
+ ruleImplementation.status.undefined
139
+ </td>
140
+ <td
141
+ class=""
142
+ />
143
+ <td
144
+ class=""
145
+ />
146
+ <td
147
+ class="right aligned"
148
+ >
149
+ undefined%
150
+ </td>
151
+ <td
152
+ class="right aligned"
153
+ >
154
+ undefined%
155
+ </td>
156
+ <td
157
+ class="center aligned"
158
+ />
159
+ <td
160
+ class=""
161
+ />
162
+ <td
163
+ class=""
164
+ />
165
+ </tr>
166
+ </tbody>
167
+ </table>
168
+ </div>
169
+ </div>
170
+ </div>
171
+ `;
172
+
173
+ exports[`<ConceptImplementationLinks /> show implementations with groups 1`] = `
174
+ <div>
175
+ <div
176
+ class="ui bottom attached segment"
177
+ >
178
+ <div
179
+ style="height: 40px;"
180
+ >
181
+ <a
182
+ class="ui right floated button"
183
+ href="/implementations/new_raw?business_concept_id=6483&id=12345"
184
+ role="button"
185
+ >
186
+ Create Raw Implementation
187
+ </a>
188
+ <a
189
+ class="ui primary right floated button"
190
+ href="/implementations/new?business_concept_id=6483&id=12345"
191
+ role="button"
192
+ >
193
+ Create Implementation
194
+ </a>
195
+ </div>
196
+ <div
197
+ class="ui vertical segment"
198
+ >
199
+ <h3
200
+ class="ui header"
201
+ >
202
+ Link to Implementation
203
+ </h3>
204
+ <table
205
+ class="ui sortable table"
206
+ >
207
+ <thead
208
+ class=""
209
+ >
210
+ <tr
211
+ class=""
212
+ >
213
+ <th
214
+ class="two wide"
215
+ >
216
+ Implementation
217
+ </th>
218
+ <th
219
+ class="two wide"
220
+ >
221
+ Rule
222
+ </th>
223
+ <th
224
+ class="two wide"
225
+ >
226
+ Status
227
+ </th>
228
+ <th
229
+ class="two wide"
230
+ >
231
+ Last execution
232
+ </th>
233
+ <th
234
+ class="two wide"
235
+ >
236
+ Result Type
237
+ </th>
238
+ <th
239
+ class="one wide"
240
+ >
241
+ Minimum
242
+ </th>
243
+ <th
244
+ class="one wide"
245
+ >
246
+ Goal
247
+ </th>
248
+ <th
249
+ class="two wide"
250
+ >
251
+ Result
252
+ </th>
253
+ <th
254
+ class="ascending sorted disabled"
255
+ >
256
+ Inserted At
257
+ </th>
258
+ <th
259
+ class="ascending sorted disabled"
260
+ >
261
+ Updated At
262
+ </th>
263
+ </tr>
264
+ </thead>
265
+ <tbody
266
+ class=""
267
+ >
268
+ <tr
269
+ class=""
270
+ >
271
+ <td
272
+ class=""
273
+ >
274
+ <a
275
+ href="/implementations/1"
276
+ >
277
+ foo
278
+ </a>
279
+ </td>
280
+ <td
281
+ class=""
282
+ />
283
+ <td
284
+ class=""
285
+ >
286
+ ruleImplementation.status.undefined
287
+ </td>
288
+ <td
289
+ class=""
290
+ />
291
+ <td
292
+ class=""
293
+ />
294
+ <td
295
+ class="right aligned"
296
+ >
297
+ undefined%
298
+ </td>
299
+ <td
300
+ class="right aligned"
301
+ >
302
+ undefined%
303
+ </td>
304
+ <td
305
+ class="center aligned"
306
+ />
307
+ <td
308
+ class=""
309
+ />
310
+ <td
311
+ class=""
312
+ />
313
+ </tr>
314
+ </tbody>
315
+ </table>
316
+ </div>
317
+ <div
318
+ class="ui vertical segment"
319
+ >
320
+ <h3
321
+ class="ui header"
322
+ >
323
+ Deleted Implementations
324
+ </h3>
325
+ <table
326
+ class="ui sortable table"
327
+ >
328
+ <thead
329
+ class=""
330
+ >
331
+ <tr
332
+ class=""
333
+ >
334
+ <th
335
+ class="two wide"
336
+ >
337
+ Implementation
338
+ </th>
339
+ <th
340
+ class="two wide"
341
+ >
342
+ Rule
343
+ </th>
344
+ <th
345
+ class="two wide"
346
+ >
347
+ Status
348
+ </th>
349
+ <th
350
+ class="two wide"
351
+ >
352
+ Last execution
353
+ </th>
354
+ <th
355
+ class="two wide"
356
+ >
357
+ Result Type
358
+ </th>
359
+ <th
360
+ class="one wide"
361
+ >
362
+ Minimum
363
+ </th>
364
+ <th
365
+ class="one wide"
366
+ >
367
+ Goal
368
+ </th>
369
+ <th
370
+ class="two wide"
371
+ >
372
+ Result
373
+ </th>
374
+ <th
375
+ class="ascending sorted disabled"
376
+ >
377
+ Inserted At
378
+ </th>
379
+ <th
380
+ class="ascending sorted disabled"
381
+ >
382
+ Updated At
383
+ </th>
384
+ </tr>
385
+ </thead>
386
+ <tbody
387
+ class=""
388
+ >
389
+ <tr
390
+ class=""
391
+ >
392
+ <td
393
+ class=""
394
+ >
395
+ <a
396
+ href="/implementations/2"
397
+ >
398
+ bar
399
+ </a>
400
+ </td>
401
+ <td
402
+ class=""
403
+ />
404
+ <td
405
+ class=""
406
+ >
407
+ ruleImplementation.status.undefined
408
+ </td>
409
+ <td
410
+ class=""
411
+ />
412
+ <td
413
+ class=""
414
+ />
415
+ <td
416
+ class="right aligned"
417
+ >
418
+ undefined%
419
+ </td>
420
+ <td
421
+ class="right aligned"
422
+ >
423
+ undefined%
424
+ </td>
425
+ <td
426
+ class="center aligned"
427
+ />
428
+ <td
429
+ class=""
430
+ />
431
+ <td
432
+ class=""
433
+ />
434
+ </tr>
435
+ </tbody>
436
+ </table>
437
+ </div>
438
+ </div>
439
+ </div>
440
+ `;
441
+
442
+ exports[`<ConceptImplementationLinks /> when don't have any implementation 1`] = `
443
+ <div>
444
+ <div
445
+ class="ui bottom attached segment"
446
+ >
447
+ <div
448
+ style="height: 40px;"
449
+ >
450
+ <a
451
+ class="ui right floated button"
452
+ href="/implementations/new_raw?business_concept_id=6483&id=12345"
453
+ role="button"
454
+ >
455
+ Create Raw Implementation
456
+ </a>
457
+ <a
458
+ class="ui primary right floated button"
459
+ href="/implementations/new?business_concept_id=6483&id=12345"
460
+ role="button"
461
+ >
462
+ Create Implementation
463
+ </a>
464
+ </div>
465
+ <div
466
+ class="ui message"
467
+ >
468
+ <div
469
+ class="content"
470
+ >
471
+ <p>
472
+ This concept has no implementations
473
+ </p>
474
+ </div>
17
475
  </div>
18
476
  </div>
19
477
  </div>