@truedat/ie 4.44.1 → 4.44.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.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truedat/ie",
|
|
3
|
-
"version": "4.44.
|
|
3
|
+
"version": "4.44.4",
|
|
4
4
|
"description": "Truedat Web Ingests",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"jsnext:main": "src/index.js",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"@babel/plugin-transform-modules-commonjs": "^7.15.0",
|
|
31
31
|
"@babel/preset-env": "^7.15.0",
|
|
32
32
|
"@babel/preset-react": "^7.14.5",
|
|
33
|
-
"@truedat/test": "4.44.
|
|
33
|
+
"@truedat/test": "4.44.4",
|
|
34
34
|
"babel-jest": "^27.0.6",
|
|
35
35
|
"babel-plugin-dynamic-import-node": "^2.3.3",
|
|
36
36
|
"babel-plugin-lodash": "^3.3.4",
|
|
@@ -80,8 +80,8 @@
|
|
|
80
80
|
]
|
|
81
81
|
},
|
|
82
82
|
"dependencies": {
|
|
83
|
-
"@truedat/core": "4.44.
|
|
84
|
-
"@truedat/df": "4.44.
|
|
83
|
+
"@truedat/core": "4.44.4",
|
|
84
|
+
"@truedat/df": "4.44.4",
|
|
85
85
|
"file-saver": "^2.0.5",
|
|
86
86
|
"moment": "^2.24.0",
|
|
87
87
|
"path-to-regexp": "^1.7.0",
|
|
@@ -100,5 +100,5 @@
|
|
|
100
100
|
"react-dom": ">= 16.8.6 < 17",
|
|
101
101
|
"semantic-ui-react": ">= 0.88.2 < 2.1"
|
|
102
102
|
},
|
|
103
|
-
"gitHead": "
|
|
103
|
+
"gitHead": "36fb183e1d22181e6a15b3bac2c01b39214eacdb"
|
|
104
104
|
}
|
|
@@ -13,8 +13,8 @@ import {
|
|
|
13
13
|
import { compose } from "redux";
|
|
14
14
|
import { connect } from "react-redux";
|
|
15
15
|
import { injectIntl, FormattedMessage } from "react-intl";
|
|
16
|
-
import { HistoryBackButton } from "@truedat/core/components";
|
|
17
|
-
import {
|
|
16
|
+
import { HistoryBackButton, TemplateSelector } from "@truedat/core/components";
|
|
17
|
+
import { selectDomain } from "@truedat/df/routines";
|
|
18
18
|
import { applyTemplate } from "@truedat/df/utils";
|
|
19
19
|
import { ingestAction } from "../routines";
|
|
20
20
|
|
|
@@ -30,9 +30,6 @@ const RichTextEditor = React.lazy(() =>
|
|
|
30
30
|
const TemplateLoader = React.lazy(() =>
|
|
31
31
|
import("@truedat/df/templates/components/TemplateLoader")
|
|
32
32
|
);
|
|
33
|
-
const TemplateSelector = React.lazy(() =>
|
|
34
|
-
import("@truedat/df/templates/components/TemplateSelector")
|
|
35
|
-
);
|
|
36
33
|
|
|
37
34
|
const actionKey = "create";
|
|
38
35
|
|
|
@@ -42,6 +39,8 @@ const initialState = {
|
|
|
42
39
|
name: "",
|
|
43
40
|
description: {},
|
|
44
41
|
content: {},
|
|
42
|
+
templatesLoading: true,
|
|
43
|
+
template: null,
|
|
45
44
|
};
|
|
46
45
|
|
|
47
46
|
const isNonEmptyString = _.flow(_.trim, _.negate(_.isEmpty));
|
|
@@ -54,38 +53,37 @@ const isValid = _.conforms({
|
|
|
54
53
|
export class IngestForm extends React.Component {
|
|
55
54
|
static propTypes = {
|
|
56
55
|
action: PropTypes.object,
|
|
57
|
-
applyTemplate: PropTypes.func,
|
|
58
56
|
ingestAction: PropTypes.func,
|
|
59
57
|
ingestActionLoading: PropTypes.string,
|
|
60
58
|
intl: PropTypes.object,
|
|
61
59
|
selectDomain: PropTypes.func,
|
|
62
|
-
selectTemplate: PropTypes.func,
|
|
63
|
-
template: PropTypes.object,
|
|
64
|
-
templateLoading: PropTypes.bool,
|
|
65
|
-
templates: PropTypes.array,
|
|
66
60
|
};
|
|
67
61
|
|
|
68
62
|
state = initialState;
|
|
69
63
|
|
|
70
|
-
|
|
71
|
-
const {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
64
|
+
handleTemplatesLoaded = ({ templates = [] } = {}) => {
|
|
65
|
+
const { type: name, content, domain_id } = this.state;
|
|
66
|
+
const template = name
|
|
67
|
+
? _.find(_.propEq("name", name))(templates)
|
|
68
|
+
: _.size(templates) == 1
|
|
69
|
+
? templates[0]
|
|
70
|
+
: null;
|
|
71
|
+
this.setState({
|
|
72
|
+
template,
|
|
73
|
+
templatesLoading: false,
|
|
74
|
+
type: template?.name || null,
|
|
75
|
+
content: template ? applyTemplate(template)(content, domain_id) : {},
|
|
76
|
+
});
|
|
77
|
+
};
|
|
82
78
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
79
|
+
handleTemplateSelected = (e, { template }) => {
|
|
80
|
+
const { content, domain_id } = this.state;
|
|
81
|
+
this.setState({
|
|
82
|
+
template,
|
|
83
|
+
type: template?.name || null,
|
|
84
|
+
content: template ? applyTemplate(template)(content, domain_id) : {},
|
|
85
|
+
});
|
|
86
|
+
};
|
|
89
87
|
|
|
90
88
|
handleDomainSelected = (e, { value }) => {
|
|
91
89
|
const domain_id = value;
|
|
@@ -96,12 +94,6 @@ export class IngestForm extends React.Component {
|
|
|
96
94
|
this.setState({ domain_id });
|
|
97
95
|
};
|
|
98
96
|
|
|
99
|
-
handleTemplateSelected = (e, data) => {
|
|
100
|
-
const { value } = data;
|
|
101
|
-
const { selectTemplate } = this.props;
|
|
102
|
-
selectTemplate({ id: value });
|
|
103
|
-
};
|
|
104
|
-
|
|
105
97
|
handleEditorChange = (e, { value }) => {
|
|
106
98
|
this.handleChange(null, { name: "description", value });
|
|
107
99
|
};
|
|
@@ -120,20 +112,19 @@ export class IngestForm extends React.Component {
|
|
|
120
112
|
|
|
121
113
|
handleSubmit = (e) => {
|
|
122
114
|
e.preventDefault();
|
|
123
|
-
const { action,
|
|
115
|
+
const { action, ingestAction } = this.props;
|
|
124
116
|
const ingestVersion = _.pick(["domain_id", "type", ...staticFields])(
|
|
125
117
|
this.state
|
|
126
118
|
);
|
|
127
|
-
|
|
128
|
-
const content = applyTemplate(
|
|
129
|
-
this.state?.content,
|
|
130
|
-
ingestVersion?.domain_id
|
|
131
|
-
);
|
|
119
|
+
const { template, content, domain_id } = this.state;
|
|
132
120
|
|
|
133
121
|
ingestAction({
|
|
134
122
|
action: actionKey,
|
|
135
123
|
...action,
|
|
136
|
-
ingest_version: {
|
|
124
|
+
ingest_version: {
|
|
125
|
+
...ingestVersion,
|
|
126
|
+
content: applyTemplate(template)(content, domain_id),
|
|
127
|
+
},
|
|
137
128
|
});
|
|
138
129
|
};
|
|
139
130
|
|
|
@@ -142,15 +133,13 @@ export class IngestForm extends React.Component {
|
|
|
142
133
|
action,
|
|
143
134
|
ingestActionLoading,
|
|
144
135
|
intl: { formatMessage },
|
|
145
|
-
template,
|
|
146
|
-
templateLoading,
|
|
147
|
-
templates,
|
|
148
136
|
} = this.props;
|
|
149
137
|
|
|
150
|
-
const { name, description, content } =
|
|
138
|
+
const { name, description, content, template, templatesLoading } =
|
|
139
|
+
this.state;
|
|
151
140
|
|
|
152
141
|
const loading =
|
|
153
|
-
|
|
142
|
+
templatesLoading ||
|
|
154
143
|
(action && action.href && ingestActionLoading === action.href);
|
|
155
144
|
|
|
156
145
|
return (
|
|
@@ -167,12 +156,13 @@ export class IngestForm extends React.Component {
|
|
|
167
156
|
onChange={this.handleDomainSelected}
|
|
168
157
|
invalid={!_.isFinite(this.state.domain_id)}
|
|
169
158
|
/>
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
159
|
+
<TemplateSelector
|
|
160
|
+
scope="ie"
|
|
161
|
+
selectedValue={template?.id}
|
|
162
|
+
onChange={this.handleTemplateSelected}
|
|
163
|
+
onLoad={this.handleTemplatesLoaded}
|
|
164
|
+
required
|
|
165
|
+
/>
|
|
176
166
|
<Form.Field required>
|
|
177
167
|
<label>
|
|
178
168
|
<FormattedMessage id="ingests.props.name" />
|
|
@@ -184,7 +174,6 @@ export class IngestForm extends React.Component {
|
|
|
184
174
|
</label>
|
|
185
175
|
<Form.Input name="name" value={name} onChange={this.handleChange} />
|
|
186
176
|
</Form.Field>
|
|
187
|
-
|
|
188
177
|
<Form.Field required>
|
|
189
178
|
<label>
|
|
190
179
|
<FormattedMessage id="ingests.props.description" />
|
|
@@ -200,12 +189,13 @@ export class IngestForm extends React.Component {
|
|
|
200
189
|
onChange={this.handleEditorChange}
|
|
201
190
|
/>
|
|
202
191
|
</Form.Field>
|
|
203
|
-
{template
|
|
192
|
+
{template?.id ? (
|
|
204
193
|
<DynamicForm
|
|
205
194
|
onChange={this.handleContentChange}
|
|
206
195
|
content={content}
|
|
196
|
+
template={template}
|
|
207
197
|
/>
|
|
208
|
-
)}
|
|
198
|
+
) : null}
|
|
209
199
|
<div className="actions">
|
|
210
200
|
<HistoryBackButton
|
|
211
201
|
content={formatMessage({ id: "actions.cancel" })}
|
|
@@ -223,22 +213,12 @@ export class IngestForm extends React.Component {
|
|
|
223
213
|
}
|
|
224
214
|
}
|
|
225
215
|
|
|
226
|
-
const mapStateToProps = ({
|
|
227
|
-
ingestActionLoading,
|
|
228
|
-
ingestsActions,
|
|
229
|
-
template,
|
|
230
|
-
templateLoading,
|
|
231
|
-
templates,
|
|
232
|
-
}) => ({
|
|
216
|
+
const mapStateToProps = ({ ingestActionLoading, ingestsActions }) => ({
|
|
233
217
|
action: _.prop(actionKey)(ingestsActions),
|
|
234
|
-
applyTemplate: applyTemplate(template),
|
|
235
218
|
ingestActionLoading,
|
|
236
|
-
template,
|
|
237
|
-
templateLoading,
|
|
238
|
-
templates,
|
|
239
219
|
});
|
|
240
220
|
|
|
241
221
|
export default compose(
|
|
242
222
|
injectIntl,
|
|
243
|
-
connect(mapStateToProps, { ingestAction,
|
|
223
|
+
connect(mapStateToProps, { ingestAction, selectDomain })
|
|
244
224
|
)(IngestForm);
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
INGESTS,
|
|
19
19
|
INGESTS_PENDING,
|
|
20
20
|
INGESTS_NEW,
|
|
21
|
-
INGEST_EXECUTIONS
|
|
21
|
+
INGEST_EXECUTIONS,
|
|
22
22
|
} from "@truedat/core/routes";
|
|
23
23
|
import IngestRelationsRoutes from "../relations/components/IngestRelationsRoutes";
|
|
24
24
|
import Events from "./Events";
|
|
@@ -77,7 +77,7 @@ const IngestRoutes = ({ ingestLoaded, ingest_id, templatesLoaded }) => {
|
|
|
77
77
|
<>
|
|
78
78
|
<IngestsLoader
|
|
79
79
|
defaultFilters={{
|
|
80
|
-
status: ["draft", "pending_approval", "rejected"]
|
|
80
|
+
status: ["draft", "pending_approval", "rejected"],
|
|
81
81
|
}}
|
|
82
82
|
/>
|
|
83
83
|
<IngestFiltersLoader />
|
|
@@ -92,9 +92,8 @@ const IngestRoutes = ({ ingestLoaded, ingest_id, templatesLoaded }) => {
|
|
|
92
92
|
<>
|
|
93
93
|
<DomainsLoader actions="create_ingest" />
|
|
94
94
|
<IngestCrumbs ingestAction="ingests.actions.create" />
|
|
95
|
-
<TemplatesLoader scope="ie" />
|
|
96
95
|
<IngestsLoader />
|
|
97
|
-
|
|
96
|
+
<IngestForm />
|
|
98
97
|
</>
|
|
99
98
|
)}
|
|
100
99
|
/>
|
|
@@ -191,7 +190,10 @@ const IngestRoutes = ({ ingestLoaded, ingest_id, templatesLoaded }) => {
|
|
|
191
190
|
<RelationTagsLoader />
|
|
192
191
|
<IngestArchiveLoader />
|
|
193
192
|
{ingestLoaded && (
|
|
194
|
-
<EventsLoader
|
|
193
|
+
<EventsLoader
|
|
194
|
+
resource_id={ingest_id}
|
|
195
|
+
resource_type="ingest"
|
|
196
|
+
/>
|
|
195
197
|
)}
|
|
196
198
|
{ingestLoaded && <Ingest />}
|
|
197
199
|
{ingestLoaded && <Events />}
|
|
@@ -283,13 +285,13 @@ const IngestRoutes = ({ ingestLoaded, ingest_id, templatesLoaded }) => {
|
|
|
283
285
|
IngestRoutes.propTypes = {
|
|
284
286
|
ingestLoaded: PropTypes.bool,
|
|
285
287
|
templatesLoaded: PropTypes.bool,
|
|
286
|
-
ingest_id: PropTypes.number
|
|
288
|
+
ingest_id: PropTypes.number,
|
|
287
289
|
};
|
|
288
290
|
|
|
289
291
|
const mapStateToProps = ({ ingest, templatesLoading, templates }) => ({
|
|
290
292
|
ingestLoaded: !_.isEmpty(ingest),
|
|
291
293
|
ingest_id: !_.isEmpty(ingest) ? ingest.ingest_id : undefined,
|
|
292
|
-
templatesLoaded: !templatesLoading && !_.isEmpty(templates)
|
|
294
|
+
templatesLoaded: !templatesLoading && !_.isEmpty(templates),
|
|
293
295
|
});
|
|
294
296
|
|
|
295
297
|
export default connect(mapStateToProps)(IngestRoutes);
|
|
@@ -1,71 +1,103 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import React, { Suspense } from "react";
|
|
2
|
+
import { waitFor } from "@testing-library/react";
|
|
3
|
+
import { render } from "@truedat/test/render";
|
|
4
|
+
import { TEMPLATES_QUERY } from "@truedat/core/api/queries";
|
|
5
|
+
import IngestForm from "../IngestForm";
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
7
|
+
const template1 = {
|
|
8
|
+
id: "1",
|
|
9
|
+
name: "template1",
|
|
10
|
+
label: "template1",
|
|
11
|
+
scope: "remediation",
|
|
12
|
+
content: [
|
|
13
|
+
{
|
|
14
|
+
name: "g1",
|
|
15
|
+
fields: [{ name: "field1", label: "field1", placeholder: "field1" }],
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
const template2 = {
|
|
20
|
+
id: "2",
|
|
21
|
+
name: "template2",
|
|
22
|
+
label: "template2",
|
|
23
|
+
scope: "remediation",
|
|
24
|
+
content: {},
|
|
25
|
+
};
|
|
26
|
+
const makeRenderOpts = (templates) => ({
|
|
27
|
+
mocks: [
|
|
28
|
+
{
|
|
29
|
+
request: { query: TEMPLATES_QUERY, variables: { scope: "ie" } },
|
|
30
|
+
result: { data: { templates } },
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
state: {
|
|
34
|
+
ingestActions: { create: {} },
|
|
35
|
+
ingestActionLoading: "",
|
|
36
|
+
domains: [{ id: 1, name: "domain1" }],
|
|
37
|
+
},
|
|
38
|
+
});
|
|
24
39
|
|
|
40
|
+
describe("<IngestForm />", () => {
|
|
25
41
|
describe("with multiple templates", () => {
|
|
26
42
|
const templates = [template1, template2];
|
|
27
|
-
const
|
|
28
|
-
const wrapper = shallowWithIntl(
|
|
29
|
-
<IngestForm
|
|
30
|
-
templates={templates}
|
|
31
|
-
selectTemplate={selectTemplate}
|
|
32
|
-
{...props}
|
|
33
|
-
/>
|
|
34
|
-
);
|
|
43
|
+
const renderOpts = makeRenderOpts(templates);
|
|
35
44
|
|
|
36
|
-
it("matches the latest snapshot", () => {
|
|
37
|
-
|
|
45
|
+
it("matches the latest snapshot", async () => {
|
|
46
|
+
const { container, queryByText } = render(
|
|
47
|
+
<Suspense fallback="loading...">
|
|
48
|
+
<IngestForm />
|
|
49
|
+
</Suspense>,
|
|
50
|
+
renderOpts
|
|
51
|
+
);
|
|
52
|
+
await waitFor(() => {
|
|
53
|
+
expect(queryByText(/loading/i)).not.toBeInTheDocument();
|
|
54
|
+
});
|
|
55
|
+
expect(container).toMatchSnapshot();
|
|
38
56
|
});
|
|
39
57
|
|
|
40
|
-
it("
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
58
|
+
it("contains a template selector", async () => {
|
|
59
|
+
const { queryByRole } = render(
|
|
60
|
+
<Suspense fallback="loading...">
|
|
61
|
+
<IngestForm />
|
|
62
|
+
</Suspense>,
|
|
63
|
+
renderOpts
|
|
64
|
+
);
|
|
65
|
+
await waitFor(() => {
|
|
66
|
+
expect(
|
|
67
|
+
queryByRole("option", { name: "template1" })
|
|
68
|
+
).toBeInTheDocument();
|
|
69
|
+
});
|
|
48
70
|
});
|
|
49
71
|
});
|
|
50
72
|
|
|
51
73
|
describe("with a single template", () => {
|
|
52
74
|
const templates = [template1];
|
|
53
|
-
const
|
|
54
|
-
const wrapper = shallowWithIntl(
|
|
55
|
-
<IngestForm
|
|
56
|
-
templates={templates}
|
|
57
|
-
selectTemplate={selectTemplate}
|
|
58
|
-
{...props}
|
|
59
|
-
/>
|
|
60
|
-
);
|
|
75
|
+
const renderOpts = makeRenderOpts(templates);
|
|
61
76
|
|
|
62
|
-
it("matches the latest snapshot", () => {
|
|
63
|
-
|
|
77
|
+
it("matches the latest snapshot", async () => {
|
|
78
|
+
const { container, queryByText } = render(
|
|
79
|
+
<Suspense fallback="loading...">
|
|
80
|
+
<IngestForm />
|
|
81
|
+
</Suspense>,
|
|
82
|
+
renderOpts
|
|
83
|
+
);
|
|
84
|
+
await waitFor(() => {
|
|
85
|
+
expect(queryByText(/loading/i)).not.toBeInTheDocument();
|
|
86
|
+
});
|
|
87
|
+
expect(container).toMatchSnapshot();
|
|
64
88
|
});
|
|
65
89
|
|
|
66
|
-
it("
|
|
67
|
-
|
|
68
|
-
|
|
90
|
+
it("contains no <TemplateSelector />", async () => {
|
|
91
|
+
const { queryByText } = render(
|
|
92
|
+
<Suspense fallback="loading...">
|
|
93
|
+
<IngestForm />
|
|
94
|
+
</Suspense>,
|
|
95
|
+
renderOpts
|
|
96
|
+
);
|
|
97
|
+
await waitFor(() => {
|
|
98
|
+
expect(queryByText(/loading/i)).not.toBeInTheDocument();
|
|
99
|
+
});
|
|
100
|
+
expect(queryByText("template1")).not.toBeInTheDocument();
|
|
69
101
|
});
|
|
70
102
|
});
|
|
71
103
|
});
|
|
@@ -1,180 +1,629 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
3
|
exports[`<IngestForm /> with a single template matches the latest snapshot 1`] = `
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
<Header
|
|
9
|
-
as="h2"
|
|
4
|
+
<div>
|
|
5
|
+
<div
|
|
6
|
+
class="ui segment ui text container"
|
|
7
|
+
style=""
|
|
10
8
|
>
|
|
11
|
-
<
|
|
12
|
-
|
|
13
|
-
name="share square"
|
|
14
|
-
/>
|
|
15
|
-
<HeaderContent>
|
|
16
|
-
<MemoizedFormattedMessage
|
|
17
|
-
id="ingests.actions.create"
|
|
18
|
-
/>
|
|
19
|
-
</HeaderContent>
|
|
20
|
-
</Header>
|
|
21
|
-
<lazy />
|
|
22
|
-
<Form
|
|
23
|
-
as="form"
|
|
24
|
-
>
|
|
25
|
-
<lazy
|
|
26
|
-
invalid={true}
|
|
27
|
-
onChange={[Function]}
|
|
28
|
-
/>
|
|
29
|
-
<FormField
|
|
30
|
-
required={true}
|
|
9
|
+
<h2
|
|
10
|
+
class="ui header"
|
|
31
11
|
>
|
|
32
|
-
<
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
/>
|
|
36
|
-
<Label
|
|
37
|
-
pointing="left"
|
|
38
|
-
>
|
|
39
|
-
<MemoizedFormattedMessage
|
|
40
|
-
id="template.form.validation.empty_required"
|
|
41
|
-
/>
|
|
42
|
-
</Label>
|
|
43
|
-
</label>
|
|
44
|
-
<FormInput
|
|
45
|
-
as={[Function]}
|
|
46
|
-
control={[Function]}
|
|
47
|
-
name="name"
|
|
48
|
-
onChange={[Function]}
|
|
49
|
-
value=""
|
|
12
|
+
<i
|
|
13
|
+
aria-hidden="true"
|
|
14
|
+
class="share square icon"
|
|
50
15
|
/>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
16
|
+
<div
|
|
17
|
+
class="content"
|
|
18
|
+
>
|
|
19
|
+
New Ingest
|
|
20
|
+
</div>
|
|
21
|
+
</h2>
|
|
22
|
+
<form
|
|
23
|
+
class="ui form"
|
|
54
24
|
>
|
|
55
|
-
<
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
25
|
+
<div
|
|
26
|
+
class="required field"
|
|
27
|
+
>
|
|
28
|
+
<label>
|
|
29
|
+
Domain
|
|
30
|
+
</label>
|
|
31
|
+
<div
|
|
32
|
+
class="field"
|
|
61
33
|
>
|
|
62
|
-
<
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
34
|
+
<div
|
|
35
|
+
aria-expanded="false"
|
|
36
|
+
class="ui fluid search selection dropdown"
|
|
37
|
+
name="domain"
|
|
38
|
+
role="combobox"
|
|
39
|
+
>
|
|
40
|
+
<input
|
|
41
|
+
aria-autocomplete="list"
|
|
42
|
+
autocomplete="off"
|
|
43
|
+
class="search"
|
|
44
|
+
tabindex="0"
|
|
45
|
+
type="text"
|
|
46
|
+
value=""
|
|
47
|
+
/>
|
|
48
|
+
<div
|
|
49
|
+
aria-atomic="true"
|
|
50
|
+
aria-live="polite"
|
|
51
|
+
class="divider text"
|
|
52
|
+
role="alert"
|
|
53
|
+
>
|
|
54
|
+
domain1
|
|
55
|
+
</div>
|
|
56
|
+
<i
|
|
57
|
+
aria-hidden="true"
|
|
58
|
+
class="dropdown icon"
|
|
59
|
+
/>
|
|
60
|
+
<div
|
|
61
|
+
aria-multiselectable="false"
|
|
62
|
+
class="menu transition"
|
|
63
|
+
role="listbox"
|
|
64
|
+
>
|
|
65
|
+
<div
|
|
66
|
+
aria-checked="true"
|
|
67
|
+
aria-selected="true"
|
|
68
|
+
class="active selected item"
|
|
69
|
+
role="option"
|
|
70
|
+
style="pointer-events: all;"
|
|
71
|
+
>
|
|
72
|
+
<div
|
|
73
|
+
class="text"
|
|
74
|
+
style="margin-left: 0px;"
|
|
75
|
+
>
|
|
76
|
+
<i
|
|
77
|
+
aria-hidden="true"
|
|
78
|
+
class="icon"
|
|
79
|
+
/>
|
|
80
|
+
domain1
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
<div
|
|
88
|
+
class="required field"
|
|
89
|
+
>
|
|
90
|
+
<label>
|
|
91
|
+
Ingest
|
|
92
|
+
<div
|
|
93
|
+
class="ui left pointing label"
|
|
94
|
+
>
|
|
95
|
+
Empty required field
|
|
96
|
+
</div>
|
|
97
|
+
</label>
|
|
98
|
+
<div
|
|
99
|
+
class="field"
|
|
100
|
+
>
|
|
101
|
+
<div
|
|
102
|
+
class="ui input"
|
|
103
|
+
>
|
|
104
|
+
<input
|
|
105
|
+
name="name"
|
|
106
|
+
type="text"
|
|
107
|
+
value=""
|
|
108
|
+
/>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
<div
|
|
113
|
+
class="required field"
|
|
114
|
+
>
|
|
115
|
+
<label>
|
|
116
|
+
Description
|
|
117
|
+
<div
|
|
118
|
+
class="ui left pointing label"
|
|
119
|
+
>
|
|
120
|
+
Empty required field
|
|
121
|
+
</div>
|
|
122
|
+
</label>
|
|
123
|
+
<div>
|
|
124
|
+
<div
|
|
125
|
+
style="border: 1px solid rgba(34, 36, 38, 0.15); border-radius: 0.28571429rem;"
|
|
126
|
+
>
|
|
127
|
+
<div
|
|
128
|
+
class="ui menu"
|
|
129
|
+
>
|
|
130
|
+
<div
|
|
131
|
+
class="disabled icon item"
|
|
132
|
+
>
|
|
133
|
+
<i
|
|
134
|
+
aria-hidden="true"
|
|
135
|
+
class="bold icon"
|
|
136
|
+
/>
|
|
137
|
+
</div>
|
|
138
|
+
<div
|
|
139
|
+
class="disabled icon item"
|
|
140
|
+
>
|
|
141
|
+
<i
|
|
142
|
+
aria-hidden="true"
|
|
143
|
+
class="italic icon"
|
|
144
|
+
/>
|
|
145
|
+
</div>
|
|
146
|
+
<div
|
|
147
|
+
class="disabled icon item"
|
|
148
|
+
>
|
|
149
|
+
<i
|
|
150
|
+
aria-hidden="true"
|
|
151
|
+
class="underline icon"
|
|
152
|
+
/>
|
|
153
|
+
</div>
|
|
154
|
+
<div
|
|
155
|
+
class="disabled icon item"
|
|
156
|
+
>
|
|
157
|
+
<i
|
|
158
|
+
aria-hidden="true"
|
|
159
|
+
class="header icon"
|
|
160
|
+
/>
|
|
161
|
+
</div>
|
|
162
|
+
<div
|
|
163
|
+
class="disabled icon item"
|
|
164
|
+
>
|
|
165
|
+
<i
|
|
166
|
+
aria-hidden="true"
|
|
167
|
+
class="h icon"
|
|
168
|
+
/>
|
|
169
|
+
</div>
|
|
170
|
+
<div
|
|
171
|
+
class="disabled icon item"
|
|
172
|
+
>
|
|
173
|
+
<i
|
|
174
|
+
aria-hidden="true"
|
|
175
|
+
class="list ol icon"
|
|
176
|
+
/>
|
|
177
|
+
</div>
|
|
178
|
+
<div
|
|
179
|
+
class="disabled icon item"
|
|
180
|
+
>
|
|
181
|
+
<i
|
|
182
|
+
aria-hidden="true"
|
|
183
|
+
class="list ul icon"
|
|
184
|
+
/>
|
|
185
|
+
</div>
|
|
186
|
+
<div
|
|
187
|
+
class="disabled icon item"
|
|
188
|
+
>
|
|
189
|
+
<i
|
|
190
|
+
aria-hidden="true"
|
|
191
|
+
class="linkify icon"
|
|
192
|
+
/>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
<div
|
|
196
|
+
style="padding: 10px;"
|
|
197
|
+
>
|
|
198
|
+
<div
|
|
199
|
+
autocorrect="on"
|
|
200
|
+
contenteditable="true"
|
|
201
|
+
data-gramm="false"
|
|
202
|
+
data-key="10"
|
|
203
|
+
data-slate-editor="true"
|
|
204
|
+
role="textbox"
|
|
205
|
+
spellcheck="true"
|
|
206
|
+
style="outline: none; white-space: pre-wrap; word-wrap: break-word;"
|
|
207
|
+
>
|
|
208
|
+
<div
|
|
209
|
+
data-key="11"
|
|
210
|
+
data-slate-object="block"
|
|
211
|
+
style="position: relative;"
|
|
212
|
+
>
|
|
213
|
+
<span
|
|
214
|
+
data-key="14"
|
|
215
|
+
data-slate-object="text"
|
|
216
|
+
>
|
|
217
|
+
<span
|
|
218
|
+
data-offset-key="14:0"
|
|
219
|
+
data-slate-leaf="true"
|
|
220
|
+
>
|
|
221
|
+
<span>
|
|
222
|
+
<span
|
|
223
|
+
contenteditable="false"
|
|
224
|
+
style="pointer-events: none; display: inline-block; width: 0px; max-width: 100%; white-space: nowrap; opacity: 0.333; vertical-align: text-top;"
|
|
225
|
+
/>
|
|
226
|
+
<span
|
|
227
|
+
data-slate-length="0"
|
|
228
|
+
data-slate-zero-width="n"
|
|
229
|
+
>
|
|
230
|
+
|
|
231
|
+
<br />
|
|
232
|
+
</span>
|
|
233
|
+
</span>
|
|
234
|
+
</span>
|
|
235
|
+
</span>
|
|
236
|
+
</div>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
</div>
|
|
242
|
+
<div
|
|
243
|
+
class="ui segment"
|
|
244
|
+
>
|
|
245
|
+
<h4
|
|
246
|
+
class="ui header"
|
|
247
|
+
>
|
|
248
|
+
g1
|
|
249
|
+
</h4>
|
|
250
|
+
<div
|
|
251
|
+
class="field"
|
|
252
|
+
>
|
|
253
|
+
<label>
|
|
254
|
+
field1
|
|
255
|
+
</label>
|
|
256
|
+
<div
|
|
257
|
+
class="field"
|
|
258
|
+
>
|
|
259
|
+
<div
|
|
260
|
+
class="ui input"
|
|
261
|
+
>
|
|
262
|
+
<input
|
|
263
|
+
name="field1"
|
|
264
|
+
type="text"
|
|
265
|
+
value=""
|
|
266
|
+
/>
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
271
|
+
<div
|
|
272
|
+
class="actions"
|
|
273
|
+
>
|
|
274
|
+
<a
|
|
275
|
+
class="ui secondary button"
|
|
276
|
+
href="/"
|
|
277
|
+
role="button"
|
|
278
|
+
>
|
|
279
|
+
Cancel
|
|
280
|
+
</a>
|
|
281
|
+
<button
|
|
282
|
+
class="ui primary disabled button"
|
|
283
|
+
disabled=""
|
|
284
|
+
tabindex="-1"
|
|
285
|
+
>
|
|
286
|
+
Create
|
|
287
|
+
</button>
|
|
288
|
+
</div>
|
|
289
|
+
</form>
|
|
290
|
+
</div>
|
|
291
|
+
</div>
|
|
89
292
|
`;
|
|
90
293
|
|
|
91
294
|
exports[`<IngestForm /> with multiple templates matches the latest snapshot 1`] = `
|
|
92
|
-
<
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
<Header
|
|
97
|
-
as="h2"
|
|
295
|
+
<div>
|
|
296
|
+
<div
|
|
297
|
+
class="ui segment ui text container"
|
|
298
|
+
style=""
|
|
98
299
|
>
|
|
99
|
-
<
|
|
100
|
-
|
|
101
|
-
name="share square"
|
|
102
|
-
/>
|
|
103
|
-
<HeaderContent>
|
|
104
|
-
<MemoizedFormattedMessage
|
|
105
|
-
id="ingests.actions.create"
|
|
106
|
-
/>
|
|
107
|
-
</HeaderContent>
|
|
108
|
-
</Header>
|
|
109
|
-
<lazy />
|
|
110
|
-
<Form
|
|
111
|
-
as="form"
|
|
112
|
-
>
|
|
113
|
-
<lazy
|
|
114
|
-
invalid={true}
|
|
115
|
-
onChange={[Function]}
|
|
116
|
-
/>
|
|
117
|
-
<lazy
|
|
118
|
-
onChange={[Function]}
|
|
119
|
-
/>
|
|
120
|
-
<FormField
|
|
121
|
-
required={true}
|
|
300
|
+
<h2
|
|
301
|
+
class="ui header"
|
|
122
302
|
>
|
|
123
|
-
<
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
/>
|
|
127
|
-
<Label
|
|
128
|
-
pointing="left"
|
|
129
|
-
>
|
|
130
|
-
<MemoizedFormattedMessage
|
|
131
|
-
id="template.form.validation.empty_required"
|
|
132
|
-
/>
|
|
133
|
-
</Label>
|
|
134
|
-
</label>
|
|
135
|
-
<FormInput
|
|
136
|
-
as={[Function]}
|
|
137
|
-
control={[Function]}
|
|
138
|
-
name="name"
|
|
139
|
-
onChange={[Function]}
|
|
140
|
-
value=""
|
|
303
|
+
<i
|
|
304
|
+
aria-hidden="true"
|
|
305
|
+
class="share square icon"
|
|
141
306
|
/>
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
307
|
+
<div
|
|
308
|
+
class="content"
|
|
309
|
+
>
|
|
310
|
+
New Ingest
|
|
311
|
+
</div>
|
|
312
|
+
</h2>
|
|
313
|
+
<form
|
|
314
|
+
class="ui form"
|
|
145
315
|
>
|
|
146
|
-
<
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
316
|
+
<div
|
|
317
|
+
class="required field"
|
|
318
|
+
>
|
|
319
|
+
<label>
|
|
320
|
+
Domain
|
|
321
|
+
</label>
|
|
322
|
+
<div
|
|
323
|
+
class="field"
|
|
152
324
|
>
|
|
153
|
-
<
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
325
|
+
<div
|
|
326
|
+
aria-expanded="false"
|
|
327
|
+
class="ui fluid search selection dropdown"
|
|
328
|
+
name="domain"
|
|
329
|
+
role="combobox"
|
|
330
|
+
>
|
|
331
|
+
<input
|
|
332
|
+
aria-autocomplete="list"
|
|
333
|
+
autocomplete="off"
|
|
334
|
+
class="search"
|
|
335
|
+
tabindex="0"
|
|
336
|
+
type="text"
|
|
337
|
+
value=""
|
|
338
|
+
/>
|
|
339
|
+
<div
|
|
340
|
+
aria-atomic="true"
|
|
341
|
+
aria-live="polite"
|
|
342
|
+
class="divider text"
|
|
343
|
+
role="alert"
|
|
344
|
+
>
|
|
345
|
+
domain1
|
|
346
|
+
</div>
|
|
347
|
+
<i
|
|
348
|
+
aria-hidden="true"
|
|
349
|
+
class="dropdown icon"
|
|
350
|
+
/>
|
|
351
|
+
<div
|
|
352
|
+
aria-multiselectable="false"
|
|
353
|
+
class="menu transition"
|
|
354
|
+
role="listbox"
|
|
355
|
+
>
|
|
356
|
+
<div
|
|
357
|
+
aria-checked="true"
|
|
358
|
+
aria-selected="true"
|
|
359
|
+
class="active selected item"
|
|
360
|
+
role="option"
|
|
361
|
+
style="pointer-events: all;"
|
|
362
|
+
>
|
|
363
|
+
<div
|
|
364
|
+
class="text"
|
|
365
|
+
style="margin-left: 0px;"
|
|
366
|
+
>
|
|
367
|
+
<i
|
|
368
|
+
aria-hidden="true"
|
|
369
|
+
class="icon"
|
|
370
|
+
/>
|
|
371
|
+
domain1
|
|
372
|
+
</div>
|
|
373
|
+
</div>
|
|
374
|
+
</div>
|
|
375
|
+
</div>
|
|
376
|
+
</div>
|
|
377
|
+
</div>
|
|
378
|
+
<div
|
|
379
|
+
class="required field"
|
|
380
|
+
>
|
|
381
|
+
<label>
|
|
382
|
+
Template
|
|
383
|
+
<div
|
|
384
|
+
class="ui left pointing label"
|
|
385
|
+
>
|
|
386
|
+
Empty required field
|
|
387
|
+
</div>
|
|
388
|
+
</label>
|
|
389
|
+
<div
|
|
390
|
+
class="field"
|
|
391
|
+
>
|
|
392
|
+
<div
|
|
393
|
+
aria-busy="false"
|
|
394
|
+
aria-expanded="false"
|
|
395
|
+
class="ui search selection dropdown"
|
|
396
|
+
name="template"
|
|
397
|
+
role="combobox"
|
|
398
|
+
>
|
|
399
|
+
<input
|
|
400
|
+
aria-autocomplete="list"
|
|
401
|
+
autocomplete="off"
|
|
402
|
+
class="search"
|
|
403
|
+
tabindex="0"
|
|
404
|
+
type="text"
|
|
405
|
+
value=""
|
|
406
|
+
/>
|
|
407
|
+
<div
|
|
408
|
+
aria-atomic="true"
|
|
409
|
+
aria-live="polite"
|
|
410
|
+
class="divider default text"
|
|
411
|
+
role="alert"
|
|
412
|
+
>
|
|
413
|
+
Select a template...
|
|
414
|
+
</div>
|
|
415
|
+
<i
|
|
416
|
+
aria-hidden="true"
|
|
417
|
+
class="dropdown icon"
|
|
418
|
+
/>
|
|
419
|
+
<div
|
|
420
|
+
class="menu transition"
|
|
421
|
+
role="listbox"
|
|
422
|
+
>
|
|
423
|
+
<div
|
|
424
|
+
aria-checked="false"
|
|
425
|
+
aria-selected="true"
|
|
426
|
+
class="selected item"
|
|
427
|
+
role="option"
|
|
428
|
+
style="pointer-events: all;"
|
|
429
|
+
>
|
|
430
|
+
<span
|
|
431
|
+
class="text"
|
|
432
|
+
>
|
|
433
|
+
template1
|
|
434
|
+
</span>
|
|
435
|
+
</div>
|
|
436
|
+
<div
|
|
437
|
+
aria-checked="false"
|
|
438
|
+
aria-selected="false"
|
|
439
|
+
class="item"
|
|
440
|
+
role="option"
|
|
441
|
+
style="pointer-events: all;"
|
|
442
|
+
>
|
|
443
|
+
<span
|
|
444
|
+
class="text"
|
|
445
|
+
>
|
|
446
|
+
template2
|
|
447
|
+
</span>
|
|
448
|
+
</div>
|
|
449
|
+
</div>
|
|
450
|
+
</div>
|
|
451
|
+
</div>
|
|
452
|
+
</div>
|
|
453
|
+
<div
|
|
454
|
+
class="required field"
|
|
455
|
+
>
|
|
456
|
+
<label>
|
|
457
|
+
Ingest
|
|
458
|
+
<div
|
|
459
|
+
class="ui left pointing label"
|
|
460
|
+
>
|
|
461
|
+
Empty required field
|
|
462
|
+
</div>
|
|
463
|
+
</label>
|
|
464
|
+
<div
|
|
465
|
+
class="field"
|
|
466
|
+
>
|
|
467
|
+
<div
|
|
468
|
+
class="ui input"
|
|
469
|
+
>
|
|
470
|
+
<input
|
|
471
|
+
name="name"
|
|
472
|
+
type="text"
|
|
473
|
+
value=""
|
|
474
|
+
/>
|
|
475
|
+
</div>
|
|
476
|
+
</div>
|
|
477
|
+
</div>
|
|
478
|
+
<div
|
|
479
|
+
class="required field"
|
|
480
|
+
>
|
|
481
|
+
<label>
|
|
482
|
+
Description
|
|
483
|
+
<div
|
|
484
|
+
class="ui left pointing label"
|
|
485
|
+
>
|
|
486
|
+
Empty required field
|
|
487
|
+
</div>
|
|
488
|
+
</label>
|
|
489
|
+
<div>
|
|
490
|
+
<div
|
|
491
|
+
style="border: 1px solid rgba(34, 36, 38, 0.15); border-radius: 0.28571429rem;"
|
|
492
|
+
>
|
|
493
|
+
<div
|
|
494
|
+
class="ui menu"
|
|
495
|
+
>
|
|
496
|
+
<div
|
|
497
|
+
class="disabled icon item"
|
|
498
|
+
>
|
|
499
|
+
<i
|
|
500
|
+
aria-hidden="true"
|
|
501
|
+
class="bold icon"
|
|
502
|
+
/>
|
|
503
|
+
</div>
|
|
504
|
+
<div
|
|
505
|
+
class="disabled icon item"
|
|
506
|
+
>
|
|
507
|
+
<i
|
|
508
|
+
aria-hidden="true"
|
|
509
|
+
class="italic icon"
|
|
510
|
+
/>
|
|
511
|
+
</div>
|
|
512
|
+
<div
|
|
513
|
+
class="disabled icon item"
|
|
514
|
+
>
|
|
515
|
+
<i
|
|
516
|
+
aria-hidden="true"
|
|
517
|
+
class="underline icon"
|
|
518
|
+
/>
|
|
519
|
+
</div>
|
|
520
|
+
<div
|
|
521
|
+
class="disabled icon item"
|
|
522
|
+
>
|
|
523
|
+
<i
|
|
524
|
+
aria-hidden="true"
|
|
525
|
+
class="header icon"
|
|
526
|
+
/>
|
|
527
|
+
</div>
|
|
528
|
+
<div
|
|
529
|
+
class="disabled icon item"
|
|
530
|
+
>
|
|
531
|
+
<i
|
|
532
|
+
aria-hidden="true"
|
|
533
|
+
class="h icon"
|
|
534
|
+
/>
|
|
535
|
+
</div>
|
|
536
|
+
<div
|
|
537
|
+
class="disabled icon item"
|
|
538
|
+
>
|
|
539
|
+
<i
|
|
540
|
+
aria-hidden="true"
|
|
541
|
+
class="list ol icon"
|
|
542
|
+
/>
|
|
543
|
+
</div>
|
|
544
|
+
<div
|
|
545
|
+
class="disabled icon item"
|
|
546
|
+
>
|
|
547
|
+
<i
|
|
548
|
+
aria-hidden="true"
|
|
549
|
+
class="list ul icon"
|
|
550
|
+
/>
|
|
551
|
+
</div>
|
|
552
|
+
<div
|
|
553
|
+
class="disabled icon item"
|
|
554
|
+
>
|
|
555
|
+
<i
|
|
556
|
+
aria-hidden="true"
|
|
557
|
+
class="linkify icon"
|
|
558
|
+
/>
|
|
559
|
+
</div>
|
|
560
|
+
</div>
|
|
561
|
+
<div
|
|
562
|
+
style="padding: 10px;"
|
|
563
|
+
>
|
|
564
|
+
<div
|
|
565
|
+
autocorrect="on"
|
|
566
|
+
contenteditable="true"
|
|
567
|
+
data-gramm="false"
|
|
568
|
+
data-key="0"
|
|
569
|
+
data-slate-editor="true"
|
|
570
|
+
role="textbox"
|
|
571
|
+
spellcheck="true"
|
|
572
|
+
style="outline: none; white-space: pre-wrap; word-wrap: break-word;"
|
|
573
|
+
>
|
|
574
|
+
<div
|
|
575
|
+
data-key="1"
|
|
576
|
+
data-slate-object="block"
|
|
577
|
+
style="position: relative;"
|
|
578
|
+
>
|
|
579
|
+
<span
|
|
580
|
+
data-key="4"
|
|
581
|
+
data-slate-object="text"
|
|
582
|
+
>
|
|
583
|
+
<span
|
|
584
|
+
data-offset-key="4:0"
|
|
585
|
+
data-slate-leaf="true"
|
|
586
|
+
>
|
|
587
|
+
<span>
|
|
588
|
+
<span
|
|
589
|
+
contenteditable="false"
|
|
590
|
+
style="pointer-events: none; display: inline-block; width: 0px; max-width: 100%; white-space: nowrap; opacity: 0.333; vertical-align: text-top;"
|
|
591
|
+
/>
|
|
592
|
+
<span
|
|
593
|
+
data-slate-length="0"
|
|
594
|
+
data-slate-zero-width="n"
|
|
595
|
+
>
|
|
596
|
+
|
|
597
|
+
<br />
|
|
598
|
+
</span>
|
|
599
|
+
</span>
|
|
600
|
+
</span>
|
|
601
|
+
</span>
|
|
602
|
+
</div>
|
|
603
|
+
</div>
|
|
604
|
+
</div>
|
|
605
|
+
</div>
|
|
606
|
+
</div>
|
|
607
|
+
</div>
|
|
608
|
+
<div
|
|
609
|
+
class="actions"
|
|
610
|
+
>
|
|
611
|
+
<a
|
|
612
|
+
class="ui secondary button"
|
|
613
|
+
href="/"
|
|
614
|
+
role="button"
|
|
615
|
+
>
|
|
616
|
+
Cancel
|
|
617
|
+
</a>
|
|
618
|
+
<button
|
|
619
|
+
class="ui primary disabled button"
|
|
620
|
+
disabled=""
|
|
621
|
+
tabindex="-1"
|
|
622
|
+
>
|
|
623
|
+
Create
|
|
624
|
+
</button>
|
|
625
|
+
</div>
|
|
626
|
+
</form>
|
|
627
|
+
</div>
|
|
628
|
+
</div>
|
|
180
629
|
`;
|