import { isAlive, types } from "mobx-state-tree"; import NormalizationMixin from "../mixins/Normalization"; import RegionsMixin from "../mixins/Regions"; import SpanTextMixin from "../mixins/SpanText"; import Utils from "../utils"; import { ParagraphLabelsModel } from "../tags/control/ParagraphLabels"; import { TextAreaModel } from "../tags/control/TextArea/TextArea"; import { ChoicesModel } from "../tags/control/Choices"; import { RatingModel } from "../tags/control/Rating"; import { ParagraphsModel } from "../tags/object/Paragraphs"; import { AreaMixin } from "../mixins/AreaMixin"; import Registry from "../core/Registry"; const Model = types .model("ParagraphsRegionModel", { type: "textrange", object: types.late(() => types.reference(ParagraphsModel)), startOffset: types.integer, start: types.string, endOffset: types.integer, end: types.string, states: types.maybeNull(types.array(types.union(ParagraphLabelsModel, TextAreaModel, ChoicesModel, RatingModel))), }) .volatile(() => ({ text: "", hideable: true, })) .views((self) => ({ get parent() { return isAlive(self) ? self.object : null; }, getRegionElement() { return self._spans?.[0]; }, })) .actions((self) => ({ beforeDestroy() { Utils.HTML.removeSpans(self._spans); }, setText(text) { self.text = text; }, fixOffsets(startOffset, endOffset) { self.startOffset = startOffset; self.endOffset = endOffset; }, /** * @example * { * "value": { * "start": 3, * "end": 5, * "startOffset": 2, * "endOffset": 81, * "paragraphlabels": ["Car"] * } * } * @typedef {Object} ParagraphsRegionResult * @property {Object} value * @property {number} value.start index of paragraph where the region starts * @property {number} value.end index of paragraph where the region ends * @property {number} value.startOffset offset within start paragraph * @property {number} value.endOffset offset within end paragraph * @property {string} [value.text] text content of the region, can be skipped */ /** * @return {ParagraphsRegionResult} */ serialize() { const { start, end } = self; const res = { value: { start, end, startOffset: self.startOffset, endOffset: self.endOffset, }, }; if (self.object.savetextresult === "yes") { res.value.text = self.text; } return res; }, })); const ParagraphsRegionModel = types.compose( "ParagraphsRegionModel", RegionsMixin, AreaMixin, NormalizationMixin, Model, SpanTextMixin, ); Registry.addRegionType(ParagraphsRegionModel, "paragraphs"); export { ParagraphsRegionModel };