label-studio
Version:
Data Labeling Tool that is backend agnostic and can be embedded into your applications
119 lines (99 loc) • 3.23 kB
JavaScript
import { types, getRoot, getParentOfType } from "mobx-state-tree";
import NormalizationMixin from "../mixins/Normalization";
import RegionsMixin from "../mixins/Regions";
import Utils from "../utils";
import { HyperTextLabelsModel } from "../tags/control/HyperTextLabels";
import { HyperTextModel } from "../tags/object/HyperText";
import { guidGenerator } from "../core/Helpers";
const Model = types
.model("HyperTextRegionModel", {
id: types.optional(types.identifier, guidGenerator),
pid: types.optional(types.string, guidGenerator),
type: "hypertextregion",
startOffset: types.integer,
start: types.string,
endOffset: types.integer,
end: types.string,
text: types.string,
states: types.maybeNull(types.array(types.union(HyperTextLabelsModel))),
})
.views(self => ({
get parent() {
return getParentOfType(self, HyperTextModel);
},
get completion() {
return getRoot(self).completionStore.selected;
},
}))
.actions(self => ({
highlightStates() {},
toStateJSON() {
const parent = self.parent;
const buildTree = obj => {
const tree = {
id: self.pid,
from_name: obj.name,
to_name: parent.name,
source: parent.value,
type: "htmllabels",
value: {
startOffset: self.startOffset,
endOffset: self.endOffset,
start: self.start,
end: self.end,
text: self.text,
},
};
if (self.normalization) tree["normalization"] = self.normalization;
return tree;
};
if (self.states && self.states.length) {
return self.states.map(s => {
const tree = buildTree(s);
tree["value"]["htmllabels"] = s.getSelectedNames();
return tree;
});
} else {
return buildTree(parent);
}
},
selectRegion() {
self.selected = true;
self.completion.setHighlightedNode(self);
self._spans.forEach(span => {
span.style.backgroundColor = Utils.Colors.rgbaChangeAlpha(span.style.backgroundColor, 0.8);
});
},
_updateSpansOpacity(opacity) {
self._spans &&
self._spans.forEach(span => {
span.style.backgroundColor = Utils.Colors.rgbaChangeAlpha(span.style.backgroundColor, opacity);
});
},
/**
* Unselect audio region
*/
unselectRegion() {
self.selected = false;
self.completion.setHighlightedNode(null);
self._updateSpansOpacity(0.3);
},
setHighlight(val) {
self.highlighted = val;
if (val) self._updateSpansOpacity(0.8);
else if (!self.selected) self._updateSpansOpacity(0.3);
},
beforeDestroy() {
var norm = [];
if (self._spans) {
self._spans.forEach(span => {
while (span.firstChild) span.parentNode.insertBefore(span.firstChild, span);
norm.push(span.parentNode);
span.parentNode.removeChild(span);
});
}
norm.forEach(n => n.normalize());
},
}));
const HyperTextRegionModel = types.compose("HyperTextRegionModel", RegionsMixin, NormalizationMixin, Model);
export { HyperTextRegionModel };