@plone/volto 18.0.0-alpha.18 → 18.0.0-alpha.19

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 (92) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/locales/ca/LC_MESSAGES/volto.po +17 -42
  3. package/locales/ca.json +1 -1
  4. package/locales/de/LC_MESSAGES/volto.po +15 -40
  5. package/locales/de.json +1 -1
  6. package/locales/en/LC_MESSAGES/volto.po +14 -39
  7. package/locales/en.json +1 -1
  8. package/locales/es/LC_MESSAGES/volto.po +15 -40
  9. package/locales/es.json +1 -1
  10. package/locales/eu/LC_MESSAGES/volto.po +15 -40
  11. package/locales/eu.json +1 -1
  12. package/locales/fi/LC_MESSAGES/volto.po +15 -40
  13. package/locales/fi.json +1 -1
  14. package/locales/fr/LC_MESSAGES/volto.po +15 -40
  15. package/locales/fr.json +1 -1
  16. package/locales/it/LC_MESSAGES/volto.po +15 -40
  17. package/locales/it.json +1 -1
  18. package/locales/ja/LC_MESSAGES/volto.po +15 -40
  19. package/locales/ja.json +1 -1
  20. package/locales/nl/LC_MESSAGES/volto.po +14 -39
  21. package/locales/nl.json +1 -1
  22. package/locales/pt/LC_MESSAGES/volto.po +15 -40
  23. package/locales/pt.json +1 -1
  24. package/locales/pt_BR/LC_MESSAGES/volto.po +15 -40
  25. package/locales/pt_BR.json +1 -1
  26. package/locales/ro/LC_MESSAGES/volto.po +15 -40
  27. package/locales/ro.json +1 -1
  28. package/locales/volto.pot +15 -40
  29. package/locales/zh_CN/LC_MESSAGES/volto.po +15 -40
  30. package/locales/zh_CN.json +1 -1
  31. package/package.json +10 -20
  32. package/src/components/index.js +0 -6
  33. package/src/components/manage/Blocks/Search/SearchBlockEdit.jsx +8 -2
  34. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +2 -2
  35. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +33 -5
  36. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.test.jsx +12 -0
  37. package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +22 -11
  38. package/src/components/manage/Controlpanels/Groups/RenderGroups.test.jsx +21 -0
  39. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +30 -21
  40. package/src/components/manage/Controlpanels/Users/RenderUsers.test.jsx +27 -1
  41. package/src/components/manage/Controlpanels/Users/UserGroupMembershipListing.jsx +29 -7
  42. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +51 -3
  43. package/src/components/manage/Controlpanels/Users/UsersControlpanel.test.jsx +8 -0
  44. package/src/config/Blocks.jsx +63 -67
  45. package/src/config/Loadables.jsx +0 -22
  46. package/src/config/Widgets.jsx +0 -2
  47. package/src/config/index.js +0 -13
  48. package/src/helpers/User/User.js +29 -0
  49. package/src/helpers/index.js +6 -1
  50. package/test-setup-config.js +0 -30
  51. package/types/components/index.d.ts +0 -6
  52. package/types/config/Blocks.d.ts +0 -51
  53. package/types/config/Loadables.d.ts +0 -10
  54. package/types/config/Widgets.d.ts +0 -2
  55. package/types/helpers/User/User.d.ts +18 -0
  56. package/types/helpers/index.d.ts +1 -1
  57. package/webpack-plugins/webpack-bundle-analyze-plugin.js +1 -1
  58. package/src/components/manage/AnchorPlugin/components/Link/index.jsx +0 -37
  59. package/src/components/manage/AnchorPlugin/components/LinkButton/index.jsx +0 -126
  60. package/src/components/manage/AnchorPlugin/index.jsx +0 -82
  61. package/src/components/manage/AnchorPlugin/linkStrategy.js +0 -21
  62. package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +0 -47
  63. package/src/components/manage/Blocks/HeroImageLeft/Data.jsx +0 -29
  64. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +0 -493
  65. package/src/components/manage/Blocks/HeroImageLeft/Edit.test.jsx +0 -58
  66. package/src/components/manage/Blocks/HeroImageLeft/View.jsx +0 -37
  67. package/src/components/manage/Blocks/HeroImageLeft/View.test.jsx +0 -9
  68. package/src/components/manage/Blocks/HeroImageLeft/schema.js +0 -43
  69. package/src/components/manage/Blocks/Table/Cell.jsx +0 -206
  70. package/src/components/manage/Blocks/Table/Cell.test.jsx +0 -19
  71. package/src/components/manage/Blocks/Table/Edit.jsx +0 -748
  72. package/src/components/manage/Blocks/Table/Edit.test.jsx +0 -44
  73. package/src/components/manage/Blocks/Table/Readme.md +0 -5
  74. package/src/components/manage/Blocks/Table/View.jsx +0 -51
  75. package/src/components/manage/Blocks/Table/View.test.jsx +0 -41
  76. package/src/components/manage/Blocks/Text/Edit.jsx +0 -372
  77. package/src/components/manage/Blocks/Text/Edit.test.jsx +0 -46
  78. package/src/components/manage/Blocks/Text/Readme.md +0 -5
  79. package/src/components/manage/Blocks/Text/Schema.jsx +0 -31
  80. package/src/components/manage/Blocks/Text/View.jsx +0 -26
  81. package/src/components/manage/Blocks/Text/View.test.jsx +0 -28
  82. package/src/components/manage/LinkDetectionPlugin/link-detection-plugin.jsx +0 -227
  83. package/src/components/manage/LinkDetectionPlugin/utils.js +0 -12
  84. package/src/components/manage/Widgets/WysiwygWidget.jsx +0 -350
  85. package/src/components/manage/Widgets/WysiwygWidget.stories.jsx +0 -24
  86. package/src/components/manage/Widgets/WysiwygWidget.test.jsx +0 -37
  87. package/src/config/RichTextEditor/Blocks.jsx +0 -29
  88. package/src/config/RichTextEditor/FromHTML.jsx +0 -8
  89. package/src/config/RichTextEditor/Plugins.jsx +0 -59
  90. package/src/config/RichTextEditor/Styles.jsx +0 -69
  91. package/src/config/RichTextEditor/ToHTML.jsx +0 -262
  92. package/src/config/RichTextEditor/index.js +0 -25
@@ -1,748 +0,0 @@
1
- /**
2
- * Edit text block.
3
- * @module components/manage/Blocks/Title/Edit
4
- */
5
-
6
- import React, { Component } from 'react';
7
- import PropTypes from 'prop-types';
8
- import { compose } from 'redux';
9
- import { map, remove } from 'lodash';
10
- import { Button, Segment, Table, Form } from 'semantic-ui-react';
11
- import { createPortal } from 'react-dom';
12
- import cx from 'classnames';
13
- import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
14
-
15
- import Cell from '@plone/volto/components/manage/Blocks/Table/Cell';
16
- import { Field, Icon } from '@plone/volto/components';
17
- import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
18
-
19
- import rowBeforeSVG from '@plone/volto/icons/row-before.svg';
20
- import rowAfterSVG from '@plone/volto/icons/row-after.svg';
21
- import colBeforeSVG from '@plone/volto/icons/column-before.svg';
22
- import colAfterSVG from '@plone/volto/icons/column-after.svg';
23
- import rowDeleteSVG from '@plone/volto/icons/row-delete.svg';
24
- import colDeleteSVG from '@plone/volto/icons/column-delete.svg';
25
-
26
- const getId = () => Math.floor(Math.random() * Math.pow(2, 24)).toString(32);
27
-
28
- const valueToDraft = (value) => ({
29
- blocks: [
30
- {
31
- data: {},
32
- depth: 0,
33
- entityRanges: [],
34
- inlineStyleRanges: [],
35
- key: getId(),
36
- text: value,
37
- type: 'unstyled',
38
- },
39
- ],
40
- entityMap: {},
41
- });
42
-
43
- const emptyCell = (type) => ({
44
- key: getId(),
45
- type: type || 'data',
46
- value: valueToDraft(''),
47
- });
48
-
49
- const emptyRow = (cells) => ({
50
- key: getId(),
51
- cells: map(cells, () => emptyCell()),
52
- });
53
-
54
- const initialTable = () => ({
55
- fixed: true,
56
- compact: false,
57
- basic: false,
58
- celled: true,
59
- inverted: false,
60
- striped: false,
61
- rows: [
62
- {
63
- key: getId(),
64
- cells: [
65
- {
66
- key: getId(),
67
- type: 'header',
68
- value: valueToDraft(''),
69
- },
70
- {
71
- key: getId(),
72
- type: 'header',
73
- value: valueToDraft(''),
74
- },
75
- ],
76
- },
77
- {
78
- key: getId(),
79
- cells: [
80
- {
81
- key: getId(),
82
- type: 'data',
83
- value: valueToDraft(''),
84
- },
85
- {
86
- key: getId(),
87
- type: 'data',
88
- value: valueToDraft(''),
89
- },
90
- ],
91
- },
92
- ],
93
- });
94
-
95
- const messages = defineMessages({
96
- insertRowBefore: {
97
- id: 'Insert row before',
98
- defaultMessage: 'Insert row before',
99
- },
100
- insertRowAfter: {
101
- id: 'Insert row after',
102
- defaultMessage: 'Insert row after',
103
- },
104
- deleteRow: {
105
- id: 'Delete row',
106
- defaultMessage: 'Delete row',
107
- },
108
- insertColBefore: {
109
- id: 'Insert col before',
110
- defaultMessage: 'Insert col before',
111
- },
112
- insertColAfter: {
113
- id: 'Insert col after',
114
- defaultMessage: 'Insert col after',
115
- },
116
- deleteCol: {
117
- id: 'Delete col',
118
- defaultMessage: 'Delete col',
119
- },
120
- fixed: {
121
- id: 'Fixed width table cells',
122
- defaultMessage: 'Fixed width columns',
123
- },
124
- compact: {
125
- id: 'Make the table compact',
126
- defaultMessage: 'Reduce cell padding',
127
- },
128
- basic: {
129
- id: 'Reduce complexity',
130
- defaultMessage: 'Minimalistic table design',
131
- },
132
- celled: {
133
- id: 'Divide each row into separate cells',
134
- defaultMessage: 'Add border to inner columns',
135
- },
136
- striped: {
137
- id: 'Stripe alternate rows with color',
138
- defaultMessage: 'Alternate row background color',
139
- },
140
- headerCell: {
141
- id: 'Header cell',
142
- defaultMessage: 'Header cell',
143
- },
144
- });
145
-
146
- /**
147
- * Edit text block class.
148
- * @class Edit
149
- * @extends Component
150
- */
151
- class Edit extends Component {
152
- /**
153
- * Property types.
154
- * @property {Object} propTypes Property types.
155
- * @static
156
- */
157
- static propTypes = {
158
- data: PropTypes.objectOf(PropTypes.any).isRequired,
159
- detached: PropTypes.bool,
160
- index: PropTypes.number.isRequired,
161
- selected: PropTypes.bool.isRequired,
162
- block: PropTypes.string.isRequired,
163
- onAddBlock: PropTypes.func.isRequired,
164
- onInsertBlock: PropTypes.func.isRequired,
165
- onChangeBlock: PropTypes.func.isRequired,
166
- onDeleteBlock: PropTypes.func.isRequired,
167
- onMutateBlock: PropTypes.func.isRequired,
168
- onFocusPreviousBlock: PropTypes.func.isRequired,
169
- onFocusNextBlock: PropTypes.func.isRequired,
170
- onSelectBlock: PropTypes.func.isRequired,
171
- };
172
-
173
- /**
174
- * Default properties
175
- * @property {Object} defaultProps Default properties.
176
- * @static
177
- */
178
- static defaultProps = {
179
- detached: false,
180
- };
181
-
182
- /**
183
- * Constructor
184
- * @method constructor
185
- * @param {Object} props Component properties
186
- * @constructs WysiwygEditor
187
- */
188
- constructor(props) {
189
- super(props);
190
- this.state = {
191
- selected: {
192
- row: 0,
193
- cell: 0,
194
- },
195
- isClient: false,
196
- };
197
- this.onSelectCell = this.onSelectCell.bind(this);
198
- this.onInsertRowBefore = this.onInsertRowBefore.bind(this);
199
- this.onInsertRowAfter = this.onInsertRowAfter.bind(this);
200
- this.onInsertColBefore = this.onInsertColBefore.bind(this);
201
- this.onInsertColAfter = this.onInsertColAfter.bind(this);
202
- this.onDeleteRow = this.onDeleteRow.bind(this);
203
- this.onDeleteCol = this.onDeleteCol.bind(this);
204
- this.onChangeCell = this.onChangeCell.bind(this);
205
- this.toggleCellType = this.toggleCellType.bind(this);
206
- this.toggleBool = this.toggleBool.bind(this);
207
- this.toggleFixed = this.toggleFixed.bind(this);
208
- this.toggleCompact = this.toggleCompact.bind(this);
209
- this.toggleBasic = this.toggleBasic.bind(this);
210
- this.toggleCelled = this.toggleCelled.bind(this);
211
- this.toggleStriped = this.toggleStriped.bind(this);
212
-
213
- const { convertToRaw } = props.draftJs;
214
- this.convertToRaw = convertToRaw;
215
- }
216
-
217
- /**
218
- * Component did mount
219
- * @method componentDidMount
220
- * @returns {undefined}
221
- */
222
- componentDidMount() {
223
- if (!this.props.data.table) {
224
- this.props.onChangeBlock(this.props.block, {
225
- ...this.props.data,
226
- table: initialTable(),
227
- });
228
- }
229
- this.setState({ isClient: true });
230
- }
231
-
232
- /**
233
- * Component will receive props
234
- * @method componentWillReceiveProps
235
- * @param {Object} nextProps Next properties
236
- * @returns {undefined}
237
- */
238
- UNSAFE_componentWillReceiveProps(nextProps) {
239
- if (!nextProps.data.table) {
240
- this.props.onChangeBlock(nextProps.block, {
241
- ...nextProps.data,
242
- table: initialTable(),
243
- });
244
- }
245
- }
246
-
247
- /**
248
- * Select cell handler
249
- * @method onSelectCell
250
- * @param {Number} row Row index.
251
- * @param {Number} cell Cell index.
252
- * @returns {undefined}
253
- */
254
- onSelectCell(row, cell) {
255
- this.setState({ selected: { row, cell } });
256
- }
257
-
258
- /**
259
- * Change cell handler
260
- * @method onChangeCell
261
- * @param {Number} row Row index.
262
- * @param {Number} cell Cell index.
263
- * @param {Object} editorState Editor state.
264
- * @returns {undefined}
265
- */
266
- onChangeCell(row, cell, editorState) {
267
- const table = { ...this.props.data.table };
268
- table.rows[row].cells[cell].value = this.convertToRaw(
269
- editorState.getCurrentContent(),
270
- );
271
- this.props.onChangeBlock(this.props.block, {
272
- ...this.props.data,
273
- table,
274
- });
275
- }
276
-
277
- /**
278
- * Toggle cell type
279
- * @method toggleCellType
280
- * @returns {undefined}
281
- */
282
- toggleCellType() {
283
- const table = { ...this.props.data.table };
284
- let type =
285
- table.rows[this.state.selected.row].cells[this.state.selected.cell].type;
286
- table.rows[this.state.selected.row].cells[this.state.selected.cell].type =
287
- type === 'header' ? 'data' : 'header';
288
- this.props.onChangeBlock(this.props.block, {
289
- ...this.props.data,
290
- table,
291
- });
292
- }
293
-
294
- /**
295
- * Insert row before handler
296
- * @method onInsertRowBefore
297
- * @returns {undefined}
298
- */
299
- onInsertRowBefore(e) {
300
- e.preventDefault();
301
- e.stopPropagation();
302
- const table = this.props.data.table;
303
- this.props.onChangeBlock(this.props.block, {
304
- ...this.props.data,
305
- table: {
306
- ...table,
307
- rows: [
308
- ...table.rows.slice(0, this.state.selected.row),
309
- emptyRow(table.rows[0].cells),
310
- ...table.rows.slice(this.state.selected.row),
311
- ],
312
- },
313
- });
314
- this.setState({
315
- selected: {
316
- row: this.state.selected.row + 1,
317
- cell: this.state.selected.cell,
318
- },
319
- });
320
- }
321
-
322
- /**
323
- * Insert row after handler
324
- * @method onInsertRowAfter
325
- * @returns {undefined}
326
- */
327
- onInsertRowAfter(e) {
328
- e.preventDefault();
329
- e.stopPropagation();
330
- const table = this.props.data.table;
331
- this.props.onChangeBlock(this.props.block, {
332
- ...this.props.data,
333
- table: {
334
- ...table,
335
- rows: [
336
- ...table.rows.slice(0, this.state.selected.row + 1),
337
- emptyRow(table.rows[0].cells),
338
- ...table.rows.slice(this.state.selected.row + 1),
339
- ],
340
- },
341
- });
342
- }
343
-
344
- /**
345
- * Insert col before handler
346
- * @method onInsertColBefore
347
- * @returns {undefined}
348
- */
349
- onInsertColBefore(e) {
350
- e.preventDefault();
351
- e.stopPropagation();
352
- const table = this.props.data.table;
353
- this.props.onChangeBlock(this.props.block, {
354
- ...this.props.data,
355
- table: {
356
- ...table,
357
- rows: map(table.rows, (row, index) => ({
358
- ...row,
359
- cells: [
360
- ...row.cells.slice(0, this.state.selected.cell),
361
- emptyCell(table.rows[index].cells[this.state.selected.cell].type),
362
- ...row.cells.slice(this.state.selected.cell),
363
- ],
364
- })),
365
- },
366
- });
367
- this.setState({
368
- selected: {
369
- row: this.state.selected.row,
370
- cell: this.state.selected.cell + 1,
371
- },
372
- });
373
- }
374
-
375
- /**
376
- * Insert col after handler
377
- * @method onInsertColAfter
378
- * @returns {undefined}
379
- */
380
- onInsertColAfter(e) {
381
- e.preventDefault();
382
- e.stopPropagation();
383
- const table = this.props.data.table;
384
- this.props.onChangeBlock(this.props.block, {
385
- ...this.props.data,
386
- table: {
387
- ...table,
388
- rows: map(table.rows, (row, index) => ({
389
- ...row,
390
- cells: [
391
- ...row.cells.slice(0, this.state.selected.cell + 1),
392
- emptyCell(table.rows[index].cells[this.state.selected.cell].type),
393
- ...row.cells.slice(this.state.selected.cell + 1),
394
- ],
395
- })),
396
- },
397
- });
398
- }
399
-
400
- /**
401
- * Delete col handler
402
- * @method onDeleteCol
403
- * @returns {undefined}
404
- */
405
- onDeleteCol(e) {
406
- e.preventDefault();
407
- e.stopPropagation();
408
- const table = this.props.data.table;
409
-
410
- if (this.state.selected.cell === table.rows[0].cells.length - 1) {
411
- this.setState({
412
- selected: {
413
- row: this.state.selected.row,
414
- cell: this.state.selected.cell - 1,
415
- },
416
- });
417
- }
418
-
419
- this.props.onChangeBlock(this.props.block, {
420
- ...this.props.data,
421
- table: {
422
- ...table,
423
- rows: map(table.rows, (row) => ({
424
- ...row,
425
- cells: remove(
426
- row.cells,
427
- (cell, index) => index !== this.state.selected.cell,
428
- ),
429
- })),
430
- },
431
- });
432
- }
433
-
434
- /**
435
- * Delete row handler
436
- * @method onDeleteRow
437
- * @returns {undefined}
438
- */
439
- onDeleteRow(e) {
440
- e.preventDefault();
441
- e.stopPropagation();
442
- const table = this.props.data.table;
443
-
444
- if (this.state.selected.row === table.rows.length - 1) {
445
- this.setState({
446
- selected: {
447
- row: this.state.selected.row - 1,
448
- cell: this.state.selected.cell,
449
- },
450
- });
451
- }
452
-
453
- this.props.onChangeBlock(this.props.block, {
454
- ...this.props.data,
455
- table: {
456
- ...table,
457
- rows: remove(
458
- table.rows,
459
- (row, index) => index !== this.state.selected.row,
460
- ),
461
- },
462
- });
463
- }
464
-
465
- /**
466
- * Toggle bool
467
- * @method toggleBool
468
- * @param {string} value Value to toggle.
469
- * @returns {undefined}
470
- */
471
- toggleBool(value) {
472
- const table = this.props.data.table;
473
- this.props.onChangeBlock(this.props.block, {
474
- ...this.props.data,
475
- table: {
476
- ...table,
477
- [value]: !table[value],
478
- },
479
- });
480
- }
481
-
482
- /**
483
- * Toggle fixed
484
- * @method toggleFixed
485
- * @returns {undefined}
486
- */
487
- toggleFixed() {
488
- this.toggleBool('fixed');
489
- }
490
-
491
- /**
492
- * Toggle compact
493
- * @method toggleCompact
494
- * @returns {undefined}
495
- */
496
- toggleCompact() {
497
- this.toggleBool('compact');
498
- }
499
-
500
- /**
501
- * Toggle basic
502
- * @method toggleBasic
503
- * @returns {undefined}
504
- */
505
- toggleBasic() {
506
- this.toggleBool('basic');
507
- }
508
-
509
- /**
510
- * Toggle celled
511
- * @method toggleCelled
512
- * @returns {undefined}
513
- */
514
- toggleCelled() {
515
- this.toggleBool('celled');
516
- }
517
-
518
- /**
519
- * Toggle striped
520
- * @method toggleStriped
521
- * @returns {undefined}
522
- */
523
- toggleStriped() {
524
- this.toggleBool('striped');
525
- }
526
-
527
- /**
528
- * Render method.
529
- * @method render
530
- * @returns {string} Markup for the component.
531
- */
532
- render() {
533
- if (!this.state.isClient) {
534
- return <div />;
535
- }
536
-
537
- return (
538
- <div className={cx('block table', { selected: this.props.selected })}>
539
- {this.props.selected && (
540
- <div className="toolbar">
541
- <Button.Group>
542
- <Button
543
- icon
544
- basic
545
- onClick={this.onInsertRowBefore}
546
- title={this.props.intl.formatMessage(messages.insertRowBefore)}
547
- aria-label={this.props.intl.formatMessage(
548
- messages.insertRowBefore,
549
- )}
550
- >
551
- <Icon name={rowBeforeSVG} size="24px" />
552
- </Button>
553
- </Button.Group>
554
- <Button.Group>
555
- <Button
556
- icon
557
- basic
558
- onClick={this.onInsertRowAfter}
559
- title={this.props.intl.formatMessage(messages.insertRowAfter)}
560
- aria-label={this.props.intl.formatMessage(
561
- messages.insertRowAfter,
562
- )}
563
- >
564
- <Icon name={rowAfterSVG} size="24px" />
565
- </Button>
566
- </Button.Group>
567
- <Button.Group>
568
- <Button
569
- icon
570
- basic
571
- onClick={this.onDeleteRow}
572
- disabled={
573
- this.props.data.table &&
574
- this.props.data.table.rows.length === 1
575
- }
576
- title={this.props.intl.formatMessage(messages.deleteRow)}
577
- aria-label={this.props.intl.formatMessage(messages.deleteRow)}
578
- >
579
- <Icon name={rowDeleteSVG} size="24px" />
580
- </Button>
581
- </Button.Group>
582
- <Button.Group>
583
- <Button
584
- icon
585
- basic
586
- onClick={this.onInsertColBefore}
587
- title={this.props.intl.formatMessage(messages.insertColBefore)}
588
- aria-label={this.props.intl.formatMessage(
589
- messages.insertColBefore,
590
- )}
591
- >
592
- <Icon name={colBeforeSVG} size="24px" />
593
- </Button>
594
- </Button.Group>
595
- <Button.Group>
596
- <Button
597
- icon
598
- basic
599
- onClick={this.onInsertColAfter}
600
- title={this.props.intl.formatMessage(messages.insertColAfter)}
601
- aria-label={this.props.intl.formatMessage(
602
- messages.insertColAfter,
603
- )}
604
- >
605
- <Icon name={colAfterSVG} size="24px" />
606
- </Button>
607
- </Button.Group>
608
- <Button.Group>
609
- <Button
610
- icon
611
- basic
612
- onClick={this.onDeleteCol}
613
- disabled={
614
- this.props.data.table &&
615
- this.props.data.table.rows[0].cells.length === 1
616
- }
617
- title={this.props.intl.formatMessage(messages.deleteCol)}
618
- aria-label={this.props.intl.formatMessage(messages.deleteCol)}
619
- >
620
- <Icon name={colDeleteSVG} size="24px" />
621
- </Button>
622
- </Button.Group>
623
- </div>
624
- )}
625
- {this.props.data.table && (
626
- <Table
627
- fixed={this.props.data.table.fixed}
628
- compact={this.props.data.table.compact}
629
- basic={this.props.data.table.basic ? 'very' : false}
630
- celled={this.props.data.table.celled}
631
- inverted={this.props.data.table.inverted}
632
- striped={this.props.data.table.striped}
633
- >
634
- <Table.Body>
635
- {map(this.props.data.table.rows, (row, rowIndex) => (
636
- <Table.Row key={row.key}>
637
- {map(row.cells, (cell, cellIndex) => (
638
- <Table.Cell
639
- key={cell.key}
640
- as={cell.type === 'header' ? 'th' : 'td'}
641
- className={
642
- rowIndex === this.state.selected.row &&
643
- cellIndex === this.state.selected.cell &&
644
- this.props.selected
645
- ? 'selected'
646
- : ''
647
- }
648
- >
649
- <Cell
650
- editable={this.props.editable}
651
- value={cell.value}
652
- row={rowIndex}
653
- cell={cellIndex}
654
- onSelectCell={this.onSelectCell}
655
- selected={
656
- rowIndex === this.state.selected.row &&
657
- cellIndex === this.state.selected.cell
658
- }
659
- isTableBlockSelected={this.props.selected}
660
- onAddBlock={this.props.onAddBlock}
661
- onSelectBlock={this.props.onSelectBlock}
662
- onChange={this.onChangeCell}
663
- index={this.props.index}
664
- disableNewBlocks={this.props.data?.disableNewBlocks}
665
- />
666
- </Table.Cell>
667
- ))}
668
- </Table.Row>
669
- ))}
670
- </Table.Body>
671
- </Table>
672
- )}
673
- {this.props.selected &&
674
- this.state.isClient &&
675
- createPortal(
676
- <Form
677
- method="post"
678
- onSubmit={(event) => {
679
- event.preventDefault();
680
- event.stopPropagation();
681
- }}
682
- >
683
- <Segment secondary attached>
684
- <FormattedMessage id="Table" defaultMessage="Table" />
685
- </Segment>
686
- <Segment attached>
687
- <Field
688
- id="fixed"
689
- title={this.props.intl.formatMessage(messages.fixed)}
690
- type="boolean"
691
- value={this.props.data.table && this.props.data.table.fixed}
692
- onChange={() => this.toggleFixed()}
693
- />
694
- <Field
695
- id="celled"
696
- title={this.props.intl.formatMessage(messages.celled)}
697
- type="boolean"
698
- value={this.props.data.table && this.props.data.table.celled}
699
- onChange={this.toggleCelled}
700
- />
701
- <Field
702
- id="striped"
703
- title={this.props.intl.formatMessage(messages.striped)}
704
- type="boolean"
705
- value={this.props.data.table && this.props.data.table.striped}
706
- onChange={this.toggleStriped}
707
- />
708
- <Field
709
- id="compact"
710
- title={this.props.intl.formatMessage(messages.compact)}
711
- type="boolean"
712
- value={this.props.data.table && this.props.data.table.compact}
713
- onChange={() => this.toggleCompact()}
714
- />
715
- <Field
716
- id="basic"
717
- title={this.props.intl.formatMessage(messages.basic)}
718
- type="boolean"
719
- value={this.props.data.table && this.props.data.table.basic}
720
- onChange={this.toggleBasic}
721
- />
722
- </Segment>
723
- <Segment secondary attached>
724
- <FormattedMessage id="Cell" defaultMessage="Cell" />
725
- </Segment>
726
- <Segment attached>
727
- <Field
728
- id="celltype"
729
- title={this.props.intl.formatMessage(messages.headerCell)}
730
- type="boolean"
731
- value={
732
- this.props.data.table &&
733
- this.props.data.table.rows[this.state.selected.row].cells[
734
- this.state.selected.cell
735
- ].type === 'header'
736
- }
737
- onChange={this.toggleCellType}
738
- />
739
- </Segment>
740
- </Form>,
741
- document.getElementById('sidebar-properties'),
742
- )}
743
- </div>
744
- );
745
- }
746
- }
747
-
748
- export default compose(injectLazyLibs(['draftJs']), injectIntl)(Edit);