@searpent/react-image-annotate 2.0.11 → 2.0.14

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.
@@ -776,6 +776,12 @@ var examplePhotos = [{
776
776
  "metadata": [{
777
777
  "key": "page",
778
778
  "value": "1"
779
+ }, {
780
+ "key": "section",
781
+ "value": "lokální zpravodajství"
782
+ }, {
783
+ "key": "mutation",
784
+ "value": "hřensko"
779
785
  }]
780
786
  }, {
781
787
  "id": "431fc636-d6d1-4e20-a35b-cc7a201c1833",
@@ -926,6 +926,15 @@ export default (function (state, action) {
926
926
  }));
927
927
  }
928
928
 
929
+ case "DELETE_GROUP":
930
+ {
931
+ var groupId = action.groupId;
932
+ if (groupId === null || groupId === undefined) return state;
933
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (activeImage.regions || []).filter(function (r) {
934
+ return r.groupId !== groupId;
935
+ }));
936
+ }
937
+
929
938
  case "DELETE_SELECTED_REGION":
930
939
  {
931
940
  return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (activeImage.regions || []).filter(function (r) {
@@ -22,11 +22,6 @@ var GroupItemDiv = styled("div")(function (_ref) {
22
22
 
23
23
  var GroupItem = function GroupItem(_ref2) {
24
24
  var group = _ref2.group;
25
- // const handleDelete = e => {
26
- // e.preventDefault()
27
- // const { value } = e.target
28
- // console.log("deleting group:", value)
29
- // }
30
25
  return React.createElement(GroupItemDiv, null, group);
31
26
  };
32
27
 
@@ -44,13 +39,7 @@ var AddGroupFormDiv = styled("div")(function (_ref4) {
44
39
  var theme = _ref4.theme;
45
40
  return {
46
41
  display: "flex",
47
- flexDirection: "row" // marginBottom: "1rem",
48
- // "& > label": {
49
- // fontSize: "1rem",
50
- // marginBottom: ".5rem",
51
- // textTransform: "capitalize"
52
- // }
53
-
42
+ flexDirection: "row"
54
43
  };
55
44
  });
56
45
 
@@ -96,6 +96,7 @@ export var ImageCanvas = function ImageCanvas(_ref2) {
96
96
  onSelectRegion = _ref2.onSelectRegion,
97
97
  onBeginMovePoint = _ref2.onBeginMovePoint,
98
98
  onDeleteRegion = _ref2.onDeleteRegion,
99
+ onDeleteGroup = _ref2.onDeleteGroup,
99
100
  onChangeVideoTime = _ref2.onChangeVideoTime,
100
101
  onChangeVideoPlaying = _ref2.onChangeVideoPlaying,
101
102
  onRegionClassAdded = _ref2.onRegionClassAdded,
@@ -349,6 +350,7 @@ export var ImageCanvas = function ImageCanvas(_ref2) {
349
350
  onChangeRegion: onChangeRegion,
350
351
  onCloseRegionEdit: onCloseRegionEdit,
351
352
  onDeleteRegion: onDeleteRegion,
353
+ onDeleteGroup: onDeleteGroup,
352
354
  layoutParams: layoutParams,
353
355
  imageSrc: imageSrc,
354
356
  RegionEditLabel: RegionEditLabel,
@@ -365,6 +367,7 @@ export var ImageCanvas = function ImageCanvas(_ref2) {
365
367
  allowedTags: regionTagList,
366
368
  onChange: onChangeRegion,
367
369
  onDelete: onDeleteRegion,
370
+ onDeleteGroup: onDeleteGroup,
368
371
  editing: true,
369
372
  region: highlightedRegion,
370
373
  imageSrc: imageSrc,
@@ -33,7 +33,7 @@ import { useSettings } from "../SettingsProvider";
33
33
  import { withHotKeys } from "react-hotkeys";
34
34
  import Editor from "../Editor";
35
35
  import regionsToBlocks from '../utils/regions-to-blocks';
36
- import PagesSelector from "../PageSelector"; // import Fullscreen from "../Fullscreen"
36
+ import PageSelector from "../PageSelector"; // import Fullscreen from "../Fullscreen"
37
37
 
38
38
  var emptyArr = [];
39
39
  var theme = createTheme();
@@ -209,6 +209,7 @@ export var MainLayout = function MainLayout(_ref4) {
209
209
  onBeginRegionEdit: action("OPEN_REGION_EDITOR", "region"),
210
210
  onCloseRegionEdit: action("CLOSE_REGION_EDITOR", "region"),
211
211
  onDeleteRegion: action("DELETE_REGION", "region"),
212
+ onDeleteGroup: action("DELETE_GROUP", "groupId"),
212
213
  onBeginBoxTransform: action("BEGIN_BOX_TRANSFORM", "box", "directions"),
213
214
  onBeginMovePolygonPoint: action("BEGIN_MOVE_POLYGON_POINT", "polygon", "pointIndex"),
214
215
  onBeginMoveKeypoint: action("BEGIN_MOVE_KEYPOINT", "region", "keypointId"),
@@ -280,7 +281,8 @@ export var MainLayout = function MainLayout(_ref4) {
280
281
  isActive: idx === state.selectedImage,
281
282
  pageNumber: (i === null || i === void 0 ? void 0 : (_i$metadata = i.metadata) === null || _i$metadata === void 0 ? void 0 : _i$metadata.find(function (md) {
282
283
  return md.key === "page";
283
- }).value) || null
284
+ }).value) || null,
285
+ metadata: i.metadata || []
284
286
  };
285
287
  });
286
288
 
@@ -314,13 +316,14 @@ export var MainLayout = function MainLayout(_ref4) {
314
316
  display: 'flex',
315
317
  flexDirection: 'row'
316
318
  }
317
- }, showPageSelector && React.createElement(PagesSelector, {
319
+ }, showPageSelector && React.createElement(PageSelector, {
318
320
  pages: pages,
319
321
  onPageClick: handlePageClick,
320
322
  onRecalc: onRecalc,
321
323
  onSave: onSave,
322
324
  saveActive: saveActive,
323
- recalcActive: recalcActive
325
+ recalcActive: recalcActive,
326
+ onMetadataChange: onMetadataChange
324
327
  }), React.createElement(Workspace, {
325
328
  allowFullscreen: true,
326
329
  iconDictionary: iconDictionary,
@@ -356,22 +359,22 @@ export var MainLayout = function MainLayout(_ref4) {
356
359
  onClickHeaderItem: onClickHeaderItem,
357
360
  onClickIconSidebarItem: onClickIconSidebarItem,
358
361
  selectedTools: [state.selectedTool, state.showTags && "show-tags", state.showMask && "show-mask"].filter(Boolean),
359
- iconSidebarItems: [{
362
+ iconSidebarItems: !state.enabledTools ? [] : [{
360
363
  name: "select",
361
364
  helperText: "Select" + getHotkeyHelpText("select_tool"),
362
- alwaysShowing: true
365
+ alwaysShowing: false
363
366
  }, {
364
367
  name: "pan",
365
368
  helperText: "Drag/Pan (right or middle click)" + getHotkeyHelpText("pan_tool"),
366
- alwaysShowing: true
369
+ alwaysShowing: false
367
370
  }, {
368
371
  name: "zoom",
369
372
  helperText: "Zoom In/Out (scroll)" + getHotkeyHelpText("zoom_tool"),
370
- alwaysShowing: true
373
+ alwaysShowing: false
371
374
  }, {
372
375
  name: "show-tags",
373
376
  helperText: "Show / Hide Tags",
374
- alwaysShowing: true
377
+ alwaysShowing: false
375
378
  }, {
376
379
  name: "create-point",
377
380
  helperText: "Add Point" + getHotkeyHelpText("create_point")
@@ -392,7 +395,7 @@ export var MainLayout = function MainLayout(_ref4) {
392
395
  helperText: "Add Keypoints (Pose)"
393
396
  }, state.fullImageSegmentationMode && {
394
397
  name: "show-mask",
395
- alwaysShowing: true,
398
+ alwaysShowing: false,
396
399
  helperText: "Show / Hide Mask"
397
400
  }, {
398
401
  name: "modify-allowed-area",
@@ -1,4 +1,5 @@
1
- import React from 'react';
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React, { useState } from 'react';
2
3
  import classnames from "classnames";
3
4
 
4
5
  require('./page-selector.css').toString();
@@ -25,17 +26,26 @@ function PageThumbnail(_ref) {
25
26
  }, pageNumber)));
26
27
  }
27
28
 
28
- function PagesSelector(_ref2) {
29
+ function PageSelector(_ref2) {
29
30
  var pages = _ref2.pages,
30
31
  onPageClick = _ref2.onPageClick,
31
32
  onRecalc = _ref2.onRecalc,
32
33
  onSave = _ref2.onSave,
33
34
  recalcActive = _ref2.recalcActive,
34
- saveActive = _ref2.saveActive;
35
+ saveActive = _ref2.saveActive,
36
+ onMetadataChange = _ref2.onMetadataChange;
37
+
38
+ var _useState = useState(false),
39
+ _useState2 = _slicedToArray(_useState, 2),
40
+ showMetadata = _useState2[0],
41
+ setShowMetadata = _useState2[1];
42
+
35
43
  return React.createElement("div", {
36
- className: "page-selector"
44
+ className: classnames('page-selector', {
45
+ 'page-selector--opened': showMetadata
46
+ })
37
47
  }, React.createElement("div", {
38
- className: "bottom-buttons"
48
+ className: "top-buttons"
39
49
  }, React.createElement("button", {
40
50
  onClick: onRecalc,
41
51
  disabled: !recalcActive,
@@ -44,21 +54,59 @@ function PagesSelector(_ref2) {
44
54
  onClick: onSave,
45
55
  disabled: !saveActive,
46
56
  className: "success"
47
- }, "Save")), React.createElement("div", {
57
+ }, "Save"), React.createElement("div", {
58
+ className: "show-metadata-wrapper"
59
+ }, React.createElement("label", {
60
+ className: "switch mr-2"
61
+ }, React.createElement("input", {
62
+ id: "show-metadata",
63
+ type: "checkbox",
64
+ value: showMetadata,
65
+ onChange: function onChange() {
66
+ return setShowMetadata(function (prev) {
67
+ return !prev;
68
+ });
69
+ }
70
+ }), React.createElement("span", {
71
+ className: "slider round"
72
+ })), React.createElement("label", null, "Metadata"))), React.createElement("div", {
48
73
  className: "pages"
49
74
  }, pages.map(function (page, idx) {
50
- return React.createElement(PageThumbnail, {
75
+ var _page$metadata;
76
+
77
+ return React.createElement("div", {
78
+ className: "page-thumbnail__wrapper"
79
+ }, React.createElement(PageThumbnail, {
51
80
  key: page.id,
52
81
  src: page.src,
53
82
  isActive: page.isActive,
54
83
  onClick: function onClick() {
55
84
  return onPageClick(idx);
56
85
  }
57
- });
86
+ }), showMetadata && React.createElement("div", {
87
+ className: "page-thumbnail__metadata"
88
+ }, React.createElement("h5", null, "Metadata"), page === null || page === void 0 ? void 0 : (_page$metadata = page.metadata) === null || _page$metadata === void 0 ? void 0 : _page$metadata.map(function (_ref3) {
89
+ var key = _ref3.key,
90
+ value = _ref3.value;
91
+ return React.createElement(React.Fragment, null, React.createElement("label", {
92
+ htmlFor: key
93
+ }, key), React.createElement("input", {
94
+ id: key,
95
+ type: "text",
96
+ value: value,
97
+ onChange: function onChange(e) {
98
+ return onMetadataChange({
99
+ name: key,
100
+ value: e.target.value,
101
+ imageIndex: idx
102
+ });
103
+ }
104
+ }));
105
+ })));
58
106
  })));
59
107
  }
60
108
 
61
- PagesSelector.defaultProps = {
109
+ PageSelector.defaultProps = {
62
110
  onPageClick: function onPageClick() {},
63
111
  onRecalc: function onRecalc() {},
64
112
  onSave: function onSave() {},
@@ -66,4 +114,4 @@ PagesSelector.defaultProps = {
66
114
  saveActive: false,
67
115
  pageNumber: undefined
68
116
  };
69
- export default PagesSelector;
117
+ export default PageSelector;
@@ -1,7 +1,12 @@
1
1
  .page-selector {
2
2
  height: 100vh;
3
3
  overflow-y: scroll;
4
- width: 10%;
4
+ max-width: 10%;
5
+ transition: max-width .5s;
6
+ }
7
+
8
+ .page-selector--opened {
9
+ max-width: 20%;
5
10
  }
6
11
 
7
12
  .pages {
@@ -9,6 +14,12 @@
9
14
  padding: 1rem;
10
15
  }
11
16
 
17
+ .page-thumbnail__wrapper {
18
+ display: flex;
19
+ flex-direction: row;
20
+ align-items: flex-start;
21
+ }
22
+
12
23
  .page-thumbnail {
13
24
  margin-bottom: 1rem;
14
25
  border-radius: .25rem !important;
@@ -21,6 +32,7 @@
21
32
  .page-thumbnail:hover {
22
33
  box-shadow: 0 0 2rem 0 #8898aa !important;
23
34
  filter: grayscale(0);
35
+ transform: scale(1.015);
24
36
  cursor: pointer;
25
37
  opacity: 1;
26
38
  }
@@ -34,7 +46,15 @@
34
46
  width: 100%;
35
47
  }
36
48
 
37
- .bottom-buttons {
49
+ .page-thumbnail__metadata {
50
+ padding: 1rem;
51
+ }
52
+
53
+ .page-thumbnail__metadata * {
54
+ display: block;
55
+ }
56
+
57
+ .top-buttons {
38
58
  background: linear-gradient(#8898aa, rgba(255, 255, 255, 0));
39
59
  position: sticky;
40
60
  top: 0;
@@ -45,21 +65,21 @@
45
65
  z-index: 100;
46
66
  }
47
67
 
48
- .bottom-buttons button {
68
+ .top-buttons button {
49
69
  margin-bottom: 1rem;
50
70
  width: 100%;
51
71
  }
52
72
 
53
- .bottom-buttons button:hover {
73
+ .top-buttons button:hover {
54
74
  cursor: pointer;
55
75
  }
56
76
 
57
- .bottom-buttons button:disabled {
77
+ .top-buttons button:disabled {
58
78
  pointer-events: none;
59
79
  opacity: .5;
60
80
  }
61
81
 
62
- .bottom-buttons button.info {
82
+ .top-buttons button.info {
63
83
  background-color: transparent;
64
84
  border-radius: 0.5rem;
65
85
  background-image: linear-gradient(310deg, #627594, #a8b8d8);
@@ -68,7 +88,7 @@
68
88
  padding: 0.5rem 0;
69
89
  }
70
90
 
71
- .bottom-buttons button.success {
91
+ .top-buttons button.success {
72
92
  color: white;
73
93
  background-image: linear-gradient(310deg, #2dce89, #2dcecc);
74
94
  border-radius: 0.5rem;
@@ -76,6 +96,17 @@
76
96
  padding: 0.5rem 0;
77
97
  }
78
98
 
99
+ .bottom-buttons {
100
+ background: linear-gradient(rgba(255, 255, 255, 0), #8898aa);
101
+ position: sticky;
102
+ bottom: 0;
103
+ display: flex;
104
+ flex-direction: column;
105
+ padding: 1rem;
106
+ margin-bottom: 1rem;
107
+ z-index: 100;
108
+ }
109
+
79
110
 
80
111
  .page-number-wrapper {
81
112
  position: absolute;
@@ -93,4 +124,75 @@
93
124
  .page-number {
94
125
  font-size: 1.5rem;
95
126
  font-weight: 800;
127
+ }
128
+
129
+ /* toggle */
130
+ .switch {
131
+ position: relative;
132
+ display: inline-block;
133
+ width: 60px;
134
+ height: 34px;
135
+ }
136
+
137
+ .switch input {
138
+ opacity: 0;
139
+ width: 0;
140
+ height: 0;
141
+ }
142
+
143
+ .slider {
144
+ position: absolute;
145
+ cursor: pointer;
146
+ top: 0;
147
+ left: 0;
148
+ right: 0;
149
+ bottom: 0;
150
+ background-color: #ccc;
151
+ -webkit-transition: .4s;
152
+ transition: .4s;
153
+ }
154
+
155
+ .slider:before {
156
+ position: absolute;
157
+ content: "";
158
+ height: 26px;
159
+ width: 26px;
160
+ left: 4px;
161
+ bottom: 4px;
162
+ background-color: white;
163
+ -webkit-transition: .4s;
164
+ transition: .4s;
165
+ }
166
+
167
+ input:checked+.slider {
168
+ background-color: #2196F3;
169
+ }
170
+
171
+ input:focus+.slider {
172
+ box-shadow: 0 0 1px #2196F3;
173
+ }
174
+
175
+ input:checked+.slider:before {
176
+ -webkit-transform: translateX(26px);
177
+ -ms-transform: translateX(26px);
178
+ transform: translateX(26px);
179
+ }
180
+
181
+ /* Rounded sliders */
182
+ .slider.round {
183
+ border-radius: 34px;
184
+ }
185
+
186
+ .slider.round:before {
187
+ border-radius: 50%;
188
+ }
189
+
190
+ .show-metadata-wrapper {
191
+ display: flex;
192
+ flex-direction: row;
193
+ align-items: center;
194
+ }
195
+
196
+ .mr-2 {
197
+ margin-right: 1rem;
96
198
  }
@@ -8,7 +8,8 @@ import styles from "./styles";
8
8
  import classnames from "classnames";
9
9
  import IconButton from "@mui/material/IconButton";
10
10
  import Button from "@mui/material/Button";
11
- import TrashIcon from "@mui/icons-material/Delete";
11
+ import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline';
12
+ import DeleteForeverIcon from '@mui/icons-material/DeleteForever';
12
13
  import CheckIcon from "@mui/icons-material/Check";
13
14
  import TextField from "@mui/material/TextField";
14
15
  import Select from "react-select";
@@ -30,7 +31,8 @@ export var RegionLabel = function RegionLabel(_ref) {
30
31
  onRegionClassAdded = _ref.onRegionClassAdded,
31
32
  allowComments = _ref.allowComments,
32
33
  hideNotEditingLabel = _ref.hideNotEditingLabel,
33
- allowedGroups = _ref.allowedGroups;
34
+ allowedGroups = _ref.allowedGroups,
35
+ onDeleteGroup = _ref.onDeleteGroup;
34
36
  var classes = useStyles();
35
37
  var commentInputRef = useRef(null);
36
38
 
@@ -106,7 +108,24 @@ export var RegionLabel = function RegionLabel(_ref) {
106
108
  },
107
109
  size: "small",
108
110
  variant: "outlined"
109
- }, React.createElement(TrashIcon, {
111
+ }, React.createElement(DeleteOutlineIcon, {
112
+ style: {
113
+ marginTop: -8,
114
+ width: 16,
115
+ height: 16
116
+ }
117
+ })), React.createElement(IconButton, {
118
+ onClick: function onClick() {
119
+ return onDeleteGroup(region.groupId);
120
+ },
121
+ tabIndex: -1,
122
+ style: {
123
+ width: 22,
124
+ height: 22
125
+ },
126
+ size: "small",
127
+ variant: "outlined"
128
+ }, React.createElement(DeleteForeverIcon, {
110
129
  style: {
111
130
  marginTop: -8,
112
131
  width: 16,
@@ -56,7 +56,7 @@ var RegionComponents = {
56
56
  width: Math.max(region.w * iw, 0),
57
57
  height: Math.max(region.h * ih, 0),
58
58
  stroke: colorAlpha(clsColor(region.cls), 0.85),
59
- fill: region.groupHighlighted ? colorAlpha(groupColor(region.groupId), 0.85) : colorAlpha(groupColor(region.groupId), 0.5)
59
+ fill: region.groupHighlighted ? colorAlpha(clsColor(region.cls), 0.15) : colorAlpha(groupColor(region.groupId), 0.5)
60
60
  }));
61
61
  } else {
62
62
  return React.createElement("g", {
@@ -29,6 +29,7 @@ export var RegionTags = function RegionTags(_ref) {
29
29
  onChangeRegion = _ref.onChangeRegion,
30
30
  onCloseRegionEdit = _ref.onCloseRegionEdit,
31
31
  onDeleteRegion = _ref.onDeleteRegion,
32
+ onDeleteGroup = _ref.onDeleteGroup,
32
33
  layoutParams = _ref.layoutParams,
33
34
  imageSrc = _ref.imageSrc,
34
35
  RegionEditLabel = _ref.RegionEditLabel,
@@ -128,6 +129,7 @@ export var RegionTags = function RegionTags(_ref) {
128
129
  onChange: onChangeRegion,
129
130
  onClose: onCloseRegionEdit,
130
131
  onDelete: onDeleteRegion,
132
+ onDeleteGroup: onDeleteGroup,
131
133
  editing: region.editingLabels,
132
134
  region: region,
133
135
  regions: regions,
@@ -3,7 +3,7 @@ import { HotKeys } from "react-hotkeys";
3
3
  export var defaultHotkeys = [{
4
4
  id: "select_tool",
5
5
  description: "Switch to the Select Tool",
6
- binding: "escape"
6
+ binding: "e"
7
7
  }, {
8
8
  id: "zoom_tool",
9
9
  description: "Select the Zoom Tool",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searpent/react-image-annotate",
3
- "version": "2.0.11",
3
+ "version": "2.0.14",
4
4
  "dependencies": {
5
5
  "@editorjs/editorjs": "^2.25.0",
6
6
  "@editorjs/paragraph": "^2.8.0",
package/site.css DELETED
@@ -1,5 +0,0 @@
1
- html,
2
- body {
3
- padding: 0;
4
- margin: 0;
5
- }