UNPKG

label-studio

Version:

Data Labeling Tool that is backend agnostic and can be embedded into your applications

275 lines (229 loc) 6.48 kB
import { types, getEnv } from "mobx-state-tree"; import CompletionStore from "./CompletionStore"; import Hotkey from "../core/Hotkey"; import InfoModal from "../components/Infomodal/Infomodal"; import Message from "../utils/messages"; import Project from "./ProjectStore"; import Settings from "./SettingsStore"; import Task from "./TaskStore"; import User from "./UserStore"; import Utils from "../utils"; export default types .model("AppStore", { /** * XML config */ config: types.string, /** * Task with data, id and project */ task: types.maybeNull(Task), project: types.maybeNull(Project), /** * Configure the visual UI shown to the user */ interfaces: types.array(types.string), /** * Flag for labeling of tasks */ explore: types.optional(types.boolean, false), /** * Completions Store */ completionStore: types.optional(CompletionStore, { completions: [], predictions: [], }), /** * User of Label Studio */ user: types.maybeNull(User), /** * Debug for development environment */ debug: types.optional(types.boolean, true), /** * Settings of Label Studio */ settings: types.optional(Settings, {}), /** * Data of description flag */ description: types.maybeNull(types.string), // apiCalls: types.optional(types.boolean, true), /** * Flag for settings */ showingSettings: types.optional(types.boolean, false), /** * Flag * Description of task in Label Studio */ showingDescription: types.optional(types.boolean, false), /** * Loading of Label Studio */ isLoading: types.optional(types.boolean, false), /** * Flag for disable task in Label Studio */ noTask: types.optional(types.boolean, false), /** * Flag for no access to specific task */ noAccess: types.optional(types.boolean, false), /** * Finish of labeling */ labeledSuccess: types.optional(types.boolean, false), }) .views(self => ({ /** * Get alert */ get alert() { return getEnv(self).alert; }, })) .actions(self => { /** * Update settings display state */ function toggleSettings() { self.showingSettings = !self.showingSettings; } /** * Update description display state */ function toggleDescription() { self.showingDescription = !self.showingDescription; } function setFlags(flags) { const names = ["showingSettings", "showingDescription", "isLoading", "noTask", "noAccess", "labeledSuccess"]; for (let n of names) if (n in flags) self[n] = flags[n]; } /** * Check for interfaces * @param {string} name * @returns {string | undefined} */ function hasInterface(name) { return self.interfaces.find(i => name === i) !== undefined; } function addInterface(name) { return self.interfaces.push(name); } /** * Function */ function afterCreate() { /** * Hotkey for submit */ Hotkey.addKey("ctrl+enter", self.submitCompletion); /** * Hotkey for skip task */ if (self.hasInterface("skip")) Hotkey.addKey("ctrl+space", self.skipTask); /** * Hotkey for update completion */ if (self.hasInterface("update")) Hotkey.addKey("alt+enter", self.updateCompletion); /** * Hotkey for delete */ Hotkey.addKey("ctrl+backspace", function() { const { selected } = self.completionStore; selected.deleteAllRegions(); }); Hotkey.addKey("ctrl+z", function() { const { history } = self.completionStore.selected; history && history.canUndo && history.undo(); }); Hotkey.addKey("escape", function() { const c = self.completionStore.selected; if (c && c.relationMode) { c.stopRelationMode(); } }); Hotkey.addKey("backspace", function() { const c = self.completionStore.selected; if (c && c.highlightedNode) { c.highlightedNode.deleteRegion(); } }); getEnv(self).onLabelStudioLoad(self); } /** * * @param {*} taskObject */ function assignTask(taskObject) { if (taskObject && !Utils.Checkers.isString(taskObject.data)) { taskObject = { ...taskObject, [taskObject.data]: JSON.stringify(taskObject.data), }; } self.task = Task.create(taskObject); } function showModal(message, type = "warning") { InfoModal[type](message); // InfoModal.warning("You need to label at least something!"); } function submitCompletion() { const c = self.completionStore.selected; c.beforeSend(); c.sendUserGenerate(); getEnv(self).onSubmitCompletion(self, c); } function updateCompletion() { const c = self.completionStore.selected; c.beforeSend(); getEnv(self).onUpdateCompletion(self, c); } function skipTask() { getEnv(self).onSkipTask(self); } /** * Reset completion store */ function resetState() { self.completionStore = CompletionStore.create({ completions: [] }); // const c = self.completionStore.addInitialCompletion(); // self.completionStore.selectCompletion(c.id); } /** * Function to initilaze completion store * Given completions and predictions */ function initializeStore({ completions, predictions }) { const _init = (addFun, selectFun) => { return item => { const obj = self.completionStore[addFun](item); self.completionStore[selectFun](obj.id); obj.deserializeCompletion(item.result); obj.reinitHistory(); return obj; }; }; const addPred = _init("addPrediction", "selectPrediction"); const addComp = _init("addCompletion", "selectCompletion"); predictions && predictions.forEach(p => addPred(p)); completions && completions.forEach(c => addComp(c)); } return { setFlags, addInterface, hasInterface, afterCreate, assignTask, resetState, initializeStore, skipTask, submitCompletion, updateCompletion, toggleSettings, toggleDescription, }; });