@datagrok/hit-triage 1.3.3 → 1.3.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"package.js","mappings":"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","sources":["webpack://hittriage/./node_modules/cash-dom/dist/cash.js","webpack://hittriage/./css/hit-triage.css","webpack://hittriage/./node_modules/@datagrok-libraries/utils/src/u2.css","webpack://hittriage/./src/app/hit-design-views/utils.css","webpack://hittriage/./node_modules/css-loader/dist/runtime/api.js","webpack://hittriage/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://hittriage/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://hittriage/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://hittriage/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://hittriage/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://hittriage/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://hittriage/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://hittriage/webpack/bootstrap","webpack://hittriage/webpack/runtime/compat get default export","webpack://hittriage/webpack/runtime/define property getters","webpack://hittriage/webpack/runtime/hasOwnProperty shorthand","webpack://hittriage/webpack/runtime/make namespace object","webpack://hittriage/webpack/runtime/nonce","webpack://hittriage/external var \"grok\"","webpack://hittriage/external var \"DG\"","webpack://hittriage/external var \"ui\"","webpack://hittriage/./src/app/consts.ts","webpack://hittriage/./css/hit-triage.css?fbc4","webpack://hittriage/./src/app/utils.ts","webpack://hittriage/./src/app/types.ts","webpack://hittriage/./src/app/dialogs/functions-dialog.ts","webpack://hittriage/external var \"rxjs\"","webpack://hittriage/./node_modules/@datagrok-libraries/utils/src/items-grid.js","webpack://hittriage/./src/app/accordeons/layout-input.ts","webpack://hittriage/./src/app/accordeons/new-template-accordeon.ts","webpack://hittriage/./src/app/base-view.ts","webpack://hittriage/./node_modules/@datagrok-libraries/utils/src/u2.css?f539","webpack://hittriage/./node_modules/@datagrok-libraries/utils/src/u2.js","webpack://hittriage/./src/app/dialogs/permissions-dialog.ts","webpack://hittriage/./src/app/hit-triage-views/info-view.ts","webpack://hittriage/./src/app/accordeons/new-campaign-accordeon.ts","webpack://hittriage/./src/app/hit-triage-views/submit-view.ts","webpack://hittriage/./src/app/hit-app-base.ts","webpack://hittriage/./src/app/utils/calculate-single-cell.ts","webpack://hittriage/./src/app/hit-triage-app.ts","webpack://hittriage/./src/app/dialogs/save-campaign-dialog.ts","webpack://hittriage/./src/app/accordeons/new-hit-design-campaign-accordeon.ts","webpack://hittriage/./src/app/accordeons/new-hit-design-template-accordeon.ts","webpack://hittriage/./src/app/hit-design-views/info-view.ts","webpack://hittriage/./src/app/hit-design-views/submit-view.ts","webpack://hittriage/./src/app/hit-design-views/utils.css?aa42","webpack://hittriage/./src/app/hit-design-views/tiles-view.ts","webpack://hittriage/external var \"rxjs.operators\"","webpack://hittriage/./src/app/hit-design-app.ts","webpack://hittriage/./src/pngRenderers.ts","webpack://hittriage/./src/app/pepti-hits-views/info-view.ts","webpack://hittriage/./src/app/pepti-hit-app.ts","webpack://hittriage/./src/package.ts"],"sourcesContent":["(function(){\n\"use strict\";\nvar doc = document;\nvar win = window;\nvar docEle = doc.documentElement;\nvar createElement = doc.createElement.bind(doc);\nvar div = createElement('div');\nvar table = createElement('table');\nvar tbody = createElement('tbody');\nvar tr = createElement('tr');\nvar isArray = Array.isArray, ArrayPrototype = Array.prototype;\nvar concat = ArrayPrototype.concat, filter = ArrayPrototype.filter, indexOf = ArrayPrototype.indexOf, map = ArrayPrototype.map, push = ArrayPrototype.push, slice = ArrayPrototype.slice, some = ArrayPrototype.some, splice = ArrayPrototype.splice;\nvar idRe = /^#(?:[\\w-]|\\\\.|[^\\x00-\\xa0])*$/;\nvar classRe = /^\\.(?:[\\w-]|\\\\.|[^\\x00-\\xa0])*$/;\nvar htmlRe = /<.+>/;\nvar tagRe = /^\\w+$/;\n// @require ./variables.ts\nfunction find(selector, context) {\n var isFragment = isDocumentFragment(context);\n return !selector || (!isFragment && !isDocument(context) && !isElement(context))\n ? []\n : !isFragment && classRe.test(selector)\n ? context.getElementsByClassName(selector.slice(1).replace(/\\\\/g, ''))\n : !isFragment && tagRe.test(selector)\n ? context.getElementsByTagName(selector)\n : context.querySelectorAll(selector);\n}\n// @require ./find.ts\n// @require ./variables.ts\nvar Cash = /** @class */ (function () {\n function Cash(selector, context) {\n if (!selector)\n return;\n if (isCash(selector))\n return selector;\n var eles = selector;\n if (isString(selector)) {\n var ctx = context || doc;\n eles = idRe.test(selector) && isDocument(ctx)\n ? ctx.getElementById(selector.slice(1).replace(/\\\\/g, ''))\n : htmlRe.test(selector)\n ? parseHTML(selector)\n : isCash(ctx)\n ? ctx.find(selector)\n : isString(ctx)\n ? cash(ctx).find(selector)\n : find(selector, ctx);\n if (!eles)\n return;\n }\n else if (isFunction(selector)) {\n return this.ready(selector); //FIXME: `fn.ready` is not included in `core`, but it's actually a core functionality\n }\n if (eles.nodeType || eles === win)\n eles = [eles];\n this.length = eles.length;\n for (var i = 0, l = this.length; i < l; i++) {\n this[i] = eles[i];\n }\n }\n Cash.prototype.init = function (selector, context) {\n return new Cash(selector, context);\n };\n return Cash;\n}());\nvar fn = Cash.prototype;\nvar cash = fn.init;\ncash.fn = cash.prototype = fn; // Ensuring that `cash () instanceof cash`\nfn.length = 0;\nfn.splice = splice; // Ensuring a cash collection gets printed as array-like in Chrome's devtools\nif (typeof Symbol === 'function') { // Ensuring a cash collection is iterable\n fn[Symbol['iterator']] = ArrayPrototype[Symbol['iterator']];\n}\nfunction isCash(value) {\n return value instanceof Cash;\n}\nfunction isWindow(value) {\n return !!value && value === value.window;\n}\nfunction isDocument(value) {\n return !!value && value.nodeType === 9;\n}\nfunction isDocumentFragment(value) {\n return !!value && value.nodeType === 11;\n}\nfunction isElement(value) {\n return !!value && value.nodeType === 1;\n}\nfunction isText(value) {\n return !!value && value.nodeType === 3;\n}\nfunction isBoolean(value) {\n return typeof value === 'boolean';\n}\nfunction isFunction(value) {\n return typeof value === 'function';\n}\nfunction isString(value) {\n return typeof value === 'string';\n}\nfunction isUndefined(value) {\n return value === undefined;\n}\nfunction isNull(value) {\n return value === null;\n}\nfunction isNumeric(value) {\n return !isNaN(parseFloat(value)) && isFinite(value);\n}\nfunction isPlainObject(value) {\n if (typeof value !== 'object' || value === null)\n return false;\n var proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\ncash.isWindow = isWindow;\ncash.isFunction = isFunction;\ncash.isArray = isArray;\ncash.isNumeric = isNumeric;\ncash.isPlainObject = isPlainObject;\nfunction each(arr, callback, _reverse) {\n if (_reverse) {\n var i = arr.length;\n while (i--) {\n if (callback.call(arr[i], i, arr[i]) === false)\n return arr;\n }\n }\n else if (isPlainObject(arr)) {\n var keys = Object.keys(arr);\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n if (callback.call(arr[key], key, arr[key]) === false)\n return arr;\n }\n }\n else {\n for (var i = 0, l = arr.length; i < l; i++) {\n if (callback.call(arr[i], i, arr[i]) === false)\n return arr;\n }\n }\n return arr;\n}\ncash.each = each;\nfn.each = function (callback) {\n return each(this, callback);\n};\nfn.empty = function () {\n return this.each(function (i, ele) {\n while (ele.firstChild) {\n ele.removeChild(ele.firstChild);\n }\n });\n};\nfunction extend() {\n var sources = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n sources[_i] = arguments[_i];\n }\n var deep = isBoolean(sources[0]) ? sources.shift() : false;\n var target = sources.shift();\n var length = sources.length;\n if (!target)\n return {};\n if (!length)\n return extend(deep, cash, target);\n for (var i = 0; i < length; i++) {\n var source = sources[i];\n for (var key in source) {\n if (deep && (isArray(source[key]) || isPlainObject(source[key]))) {\n if (!target[key] || target[key].constructor !== source[key].constructor)\n target[key] = new source[key].constructor();\n extend(deep, target[key], source[key]);\n }\n else {\n target[key] = source[key];\n }\n }\n }\n return target;\n}\ncash.extend = extend;\nfn.extend = function (plugins) {\n return extend(fn, plugins);\n};\n// @require ./type_checking.ts\nvar splitValuesRe = /\\S+/g;\nfunction getSplitValues(str) {\n return isString(str) ? str.match(splitValuesRe) || [] : [];\n}\nfn.toggleClass = function (cls, force) {\n var classes = getSplitValues(cls);\n var isForce = !isUndefined(force);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n each(classes, function (i, c) {\n if (isForce) {\n force ? ele.classList.add(c) : ele.classList.remove(c);\n }\n else {\n ele.classList.toggle(c);\n }\n });\n });\n};\nfn.addClass = function (cls) {\n return this.toggleClass(cls, true);\n};\nfn.removeAttr = function (attr) {\n var attrs = getSplitValues(attr);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n each(attrs, function (i, a) {\n ele.removeAttribute(a);\n });\n });\n};\nfunction attr(attr, value) {\n if (!attr)\n return;\n if (isString(attr)) {\n if (arguments.length < 2) {\n if (!this[0] || !isElement(this[0]))\n return;\n var value_1 = this[0].getAttribute(attr);\n return isNull(value_1) ? undefined : value_1;\n }\n if (isUndefined(value))\n return this;\n if (isNull(value))\n return this.removeAttr(attr);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n ele.setAttribute(attr, value);\n });\n }\n for (var key in attr) {\n this.attr(key, attr[key]);\n }\n return this;\n}\nfn.attr = attr;\nfn.removeClass = function (cls) {\n if (arguments.length)\n return this.toggleClass(cls, false);\n return this.attr('class', '');\n};\nfn.hasClass = function (cls) {\n return !!cls && some.call(this, function (ele) { return isElement(ele) && ele.classList.contains(cls); });\n};\nfn.get = function (index) {\n if (isUndefined(index))\n return slice.call(this);\n index = Number(index);\n return this[index < 0 ? index + this.length : index];\n};\nfn.eq = function (index) {\n return cash(this.get(index));\n};\nfn.first = function () {\n return this.eq(0);\n};\nfn.last = function () {\n return this.eq(-1);\n};\nfunction text(text) {\n if (isUndefined(text)) {\n return this.get().map(function (ele) { return isElement(ele) || isText(ele) ? ele.textContent : ''; }).join('');\n }\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n ele.textContent = text;\n });\n}\nfn.text = text;\n// @require core/type_checking.ts\n// @require core/variables.ts\nfunction computeStyle(ele, prop, isVariable) {\n if (!isElement(ele))\n return;\n var style = win.getComputedStyle(ele, null);\n return isVariable ? style.getPropertyValue(prop) || undefined : style[prop] || ele.style[prop];\n}\n// @require ./compute_style.ts\nfunction computeStyleInt(ele, prop) {\n return parseInt(computeStyle(ele, prop), 10) || 0;\n}\n// @require css/helpers/compute_style_int.ts\nfunction getExtraSpace(ele, xAxis) {\n return computeStyleInt(ele, \"border\".concat(xAxis ? 'Left' : 'Top', \"Width\")) + computeStyleInt(ele, \"padding\".concat(xAxis ? 'Left' : 'Top')) + computeStyleInt(ele, \"padding\".concat(xAxis ? 'Right' : 'Bottom')) + computeStyleInt(ele, \"border\".concat(xAxis ? 'Right' : 'Bottom', \"Width\"));\n}\n// @require css/helpers/compute_style.ts\nvar defaultDisplay = {};\nfunction getDefaultDisplay(tagName) {\n if (defaultDisplay[tagName])\n return defaultDisplay[tagName];\n var ele = createElement(tagName);\n doc.body.insertBefore(ele, null);\n var display = computeStyle(ele, 'display');\n doc.body.removeChild(ele);\n return defaultDisplay[tagName] = display !== 'none' ? display : 'block';\n}\n// @require css/helpers/compute_style.ts\nfunction isHidden(ele) {\n return computeStyle(ele, 'display') === 'none';\n}\n// @require ./cash.ts\nfunction matches(ele, selector) {\n var matches = ele && (ele['matches'] || ele['webkitMatchesSelector'] || ele['msMatchesSelector']);\n return !!matches && !!selector && matches.call(ele, selector);\n}\n// @require ./matches.ts\n// @require ./type_checking.ts\nfunction getCompareFunction(comparator) {\n return isString(comparator)\n ? function (i, ele) { return matches(ele, comparator); }\n : isFunction(comparator)\n ? comparator\n : isCash(comparator)\n ? function (i, ele) { return comparator.is(ele); }\n : !comparator\n ? function () { return false; }\n : function (i, ele) { return ele === comparator; };\n}\nfn.filter = function (comparator) {\n var compare = getCompareFunction(comparator);\n return cash(filter.call(this, function (ele, i) { return compare.call(ele, i, ele); }));\n};\n// @require collection/filter.ts\nfunction filtered(collection, comparator) {\n return !comparator ? collection : collection.filter(comparator);\n}\nfn.detach = function (comparator) {\n filtered(this, comparator).each(function (i, ele) {\n if (ele.parentNode) {\n ele.parentNode.removeChild(ele);\n }\n });\n return this;\n};\nvar fragmentRe = /^\\s*<(\\w+)[^>]*>/;\nvar singleTagRe = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/;\nvar containers = {\n '*': div,\n tr: tbody,\n td: tr,\n th: tr,\n thead: table,\n tbody: table,\n tfoot: table\n};\n//TODO: Create elements inside a document fragment, in order to prevent inline event handlers from firing\n//TODO: Ensure the created elements have the fragment as their parent instead of null, this also ensures we can deal with detatched nodes more reliably\nfunction parseHTML(html) {\n if (!isString(html))\n return [];\n if (singleTagRe.test(html))\n return [createElement(RegExp.$1)];\n var fragment = fragmentRe.test(html) && RegExp.$1;\n var container = containers[fragment] || containers['*'];\n container.innerHTML = html;\n return cash(container.childNodes).detach().get();\n}\ncash.parseHTML = parseHTML;\nfn.has = function (selector) {\n var comparator = isString(selector)\n ? function (i, ele) { return find(selector, ele).length; }\n : function (i, ele) { return ele.contains(selector); };\n return this.filter(comparator);\n};\nfn.not = function (comparator) {\n var compare = getCompareFunction(comparator);\n return this.filter(function (i, ele) { return (!isString(comparator) || isElement(ele)) && !compare.call(ele, i, ele); });\n};\nfunction pluck(arr, prop, deep, until) {\n var plucked = [];\n var isCallback = isFunction(prop);\n var compare = until && getCompareFunction(until);\n for (var i = 0, l = arr.length; i < l; i++) {\n if (isCallback) {\n var val_1 = prop(arr[i]);\n if (val_1.length)\n push.apply(plucked, val_1);\n }\n else {\n var val_2 = arr[i][prop];\n while (val_2 != null) {\n if (until && compare(-1, val_2))\n break;\n plucked.push(val_2);\n val_2 = deep ? val_2[prop] : null;\n }\n }\n }\n return plucked;\n}\n// @require core/pluck.ts\n// @require core/variables.ts\nfunction getValue(ele) {\n if (ele.multiple && ele.options)\n return pluck(filter.call(ele.options, function (option) { return option.selected && !option.disabled && !option.parentNode.disabled; }), 'value');\n return ele.value || '';\n}\nfunction val(value) {\n if (!arguments.length)\n return this[0] && getValue(this[0]);\n return this.each(function (i, ele) {\n var isSelect = ele.multiple && ele.options;\n if (isSelect || checkableRe.test(ele.type)) {\n var eleValue_1 = isArray(value) ? map.call(value, String) : (isNull(value) ? [] : [String(value)]);\n if (isSelect) {\n each(ele.options, function (i, option) {\n option.selected = eleValue_1.indexOf(option.value) >= 0;\n }, true);\n }\n else {\n ele.checked = eleValue_1.indexOf(ele.value) >= 0;\n }\n }\n else {\n ele.value = isUndefined(value) || isNull(value) ? '' : value;\n }\n });\n}\nfn.val = val;\nfn.is = function (comparator) {\n var compare = getCompareFunction(comparator);\n return some.call(this, function (ele, i) { return compare.call(ele, i, ele); });\n};\ncash.guid = 1;\nfunction unique(arr) {\n return arr.length > 1 ? filter.call(arr, function (item, index, self) { return indexOf.call(self, item) === index; }) : arr;\n}\ncash.unique = unique;\nfn.add = function (selector, context) {\n return cash(unique(this.get().concat(cash(selector, context).get())));\n};\nfn.children = function (comparator) {\n return filtered(cash(unique(pluck(this, function (ele) { return ele.children; }))), comparator);\n};\nfn.parent = function (comparator) {\n return filtered(cash(unique(pluck(this, 'parentNode'))), comparator);\n};\nfn.index = function (selector) {\n var child = selector ? cash(selector)[0] : this[0];\n var collection = selector ? this : cash(child).parent().children();\n return indexOf.call(collection, child);\n};\nfn.closest = function (comparator) {\n var filtered = this.filter(comparator);\n if (filtered.length)\n return filtered;\n var $parent = this.parent();\n if (!$parent.length)\n return filtered;\n return $parent.closest(comparator);\n};\nfn.siblings = function (comparator) {\n return filtered(cash(unique(pluck(this, function (ele) { return cash(ele).parent().children().not(ele); }))), comparator);\n};\nfn.find = function (selector) {\n return cash(unique(pluck(this, function (ele) { return find(selector, ele); })));\n};\n// @require core/variables.ts\n// @require collection/filter.ts\n// @require traversal/find.ts\nvar HTMLCDATARe = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\nvar scriptTypeRe = /^$|^module$|\\/(java|ecma)script/i;\nvar scriptAttributes = ['type', 'src', 'nonce', 'noModule'];\nfunction evalScripts(node, doc) {\n var collection = cash(node);\n collection.filter('script').add(collection.find('script')).each(function (i, ele) {\n if (scriptTypeRe.test(ele.type) && docEle.contains(ele)) { // The script type is supported // The element is attached to the DOM // Using `documentElement` for broader browser support\n var script_1 = createElement('script');\n script_1.text = ele.textContent.replace(HTMLCDATARe, '');\n each(scriptAttributes, function (i, attr) {\n if (ele[attr])\n script_1[attr] = ele[attr];\n });\n doc.head.insertBefore(script_1, null);\n doc.head.removeChild(script_1);\n }\n });\n}\n// @require ./eval_scripts.ts\nfunction insertElement(anchor, target, left, inside, evaluate) {\n if (inside) { // prepend/append\n anchor.insertBefore(target, left ? anchor.firstChild : null);\n }\n else { // before/after\n if (anchor.nodeName === 'HTML') {\n anchor.parentNode.replaceChild(target, anchor);\n }\n else {\n anchor.parentNode.insertBefore(target, left ? anchor : anchor.nextSibling);\n }\n }\n if (evaluate) {\n evalScripts(target, anchor.ownerDocument);\n }\n}\n// @require ./insert_element.ts\nfunction insertSelectors(selectors, anchors, inverse, left, inside, reverseLoop1, reverseLoop2, reverseLoop3) {\n each(selectors, function (si, selector) {\n each(cash(selector), function (ti, target) {\n each(cash(anchors), function (ai, anchor) {\n var anchorFinal = inverse ? target : anchor;\n var targetFinal = inverse ? anchor : target;\n var indexFinal = inverse ? ti : ai;\n insertElement(anchorFinal, !indexFinal ? targetFinal : targetFinal.cloneNode(true), left, inside, !indexFinal);\n }, reverseLoop3);\n }, reverseLoop2);\n }, reverseLoop1);\n return anchors;\n}\nfn.after = function () {\n return insertSelectors(arguments, this, false, false, false, true, true);\n};\nfn.append = function () {\n return insertSelectors(arguments, this, false, false, true);\n};\nfunction html(html) {\n if (!arguments.length)\n return this[0] && this[0].innerHTML;\n if (isUndefined(html))\n return this;\n var hasScript = /<script[\\s>]/.test(html);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n if (hasScript) {\n cash(ele).empty().append(html);\n }\n else {\n ele.innerHTML = html;\n }\n });\n}\nfn.html = html;\nfn.appendTo = function (selector) {\n return insertSelectors(arguments, this, true, false, true);\n};\nfn.wrapInner = function (selector) {\n return this.each(function (i, ele) {\n var $ele = cash(ele);\n var contents = $ele.contents();\n contents.length ? contents.wrapAll(selector) : $ele.append(selector);\n });\n};\nfn.before = function () {\n return insertSelectors(arguments, this, false, true);\n};\nfn.wrapAll = function (selector) {\n var structure = cash(selector);\n var wrapper = structure[0];\n while (wrapper.children.length)\n wrapper = wrapper.firstElementChild;\n this.first().before(structure);\n return this.appendTo(wrapper);\n};\nfn.wrap = function (selector) {\n return this.each(function (i, ele) {\n var wrapper = cash(selector)[0];\n cash(ele).wrapAll(!i ? wrapper : wrapper.cloneNode(true));\n });\n};\nfn.insertAfter = function (selector) {\n return insertSelectors(arguments, this, true, false, false, false, false, true);\n};\nfn.insertBefore = function (selector) {\n return insertSelectors(arguments, this, true, true);\n};\nfn.prepend = function () {\n return insertSelectors(arguments, this, false, true, true, true, true);\n};\nfn.prependTo = function (selector) {\n return insertSelectors(arguments, this, true, true, true, false, false, true);\n};\nfn.contents = function () {\n return cash(unique(pluck(this, function (ele) { return ele.tagName === 'IFRAME' ? [ele.contentDocument] : (ele.tagName === 'TEMPLATE' ? ele.content.childNodes : ele.childNodes); })));\n};\nfn.next = function (comparator, _all, _until) {\n return filtered(cash(unique(pluck(this, 'nextElementSibling', _all, _until))), comparator);\n};\nfn.nextAll = function (comparator) {\n return this.next(comparator, true);\n};\nfn.nextUntil = function (until, comparator) {\n return this.next(comparator, true, until);\n};\nfn.parents = function (comparator, _until) {\n return filtered(cash(unique(pluck(this, 'parentElement', true, _until))), comparator);\n};\nfn.parentsUntil = function (until, comparator) {\n return this.parents(comparator, until);\n};\nfn.prev = function (comparator, _all, _until) {\n return filtered(cash(unique(pluck(this, 'previousElementSibling', _all, _until))), comparator);\n};\nfn.prevAll = function (comparator) {\n return this.prev(comparator, true);\n};\nfn.prevUntil = function (until, comparator) {\n return this.prev(comparator, true, until);\n};\nfn.map = function (callback) {\n return cash(concat.apply([], map.call(this, function (ele, i) { return callback.call(ele, i, ele); })));\n};\nfn.clone = function () {\n return this.map(function (i, ele) { return ele.cloneNode(true); });\n};\nfn.offsetParent = function () {\n return this.map(function (i, ele) {\n var offsetParent = ele.offsetParent;\n while (offsetParent && computeStyle(offsetParent, 'position') === 'static') {\n offsetParent = offsetParent.offsetParent;\n }\n return offsetParent || docEle;\n });\n};\nfn.slice = function (start, end) {\n return cash(slice.call(this, start, end));\n};\n// @require ./cash.ts\nvar dashAlphaRe = /-([a-z])/g;\nfunction camelCase(str) {\n return str.replace(dashAlphaRe, function (match, letter) { return letter.toUpperCase(); });\n}\nfn.ready = function (callback) {\n var cb = function () { return setTimeout(callback, 0, cash); };\n if (doc.readyState !== 'loading') {\n cb();\n }\n else {\n doc.addEventListener('DOMContentLoaded', cb);\n }\n return this;\n};\nfn.unwrap = function () {\n this.parent().each(function (i, ele) {\n if (ele.tagName === 'BODY')\n return;\n var $ele = cash(ele);\n $ele.replaceWith($ele.children());\n });\n return this;\n};\nfn.offset = function () {\n var ele = this[0];\n if (!ele)\n return;\n var rect = ele.getBoundingClientRect();\n return {\n top: rect.top + win.pageYOffset,\n left: rect.left + win.pageXOffset\n };\n};\nfn.position = function () {\n var ele = this[0];\n if (!ele)\n return;\n var isFixed = (computeStyle(ele, 'position') === 'fixed');\n var offset = isFixed ? ele.getBoundingClientRect() : this.offset();\n if (!isFixed) {\n var doc_1 = ele.ownerDocument;\n var offsetParent = ele.offsetParent || doc_1.documentElement;\n while ((offsetParent === doc_1.body || offsetParent === doc_1.documentElement) && computeStyle(offsetParent, 'position') === 'static') {\n offsetParent = offsetParent.parentNode;\n }\n if (offsetParent !== ele && isElement(offsetParent)) {\n var parentOffset = cash(offsetParent).offset();\n offset.top -= parentOffset.top + computeStyleInt(offsetParent, 'borderTopWidth');\n offset.left -= parentOffset.left + computeStyleInt(offsetParent, 'borderLeftWidth');\n }\n }\n return {\n top: offset.top - computeStyleInt(ele, 'marginTop'),\n left: offset.left - computeStyleInt(ele, 'marginLeft')\n };\n};\nvar propMap = {\n /* GENERAL */\n class: 'className',\n contenteditable: 'contentEditable',\n /* LABEL */\n for: 'htmlFor',\n /* INPUT */\n readonly: 'readOnly',\n maxlength: 'maxLength',\n tabindex: 'tabIndex',\n /* TABLE */\n colspan: 'colSpan',\n rowspan: 'rowSpan',\n /* IMAGE */\n usemap: 'useMap'\n};\nfn.prop = function (prop, value) {\n if (!prop)\n return;\n if (isString(prop)) {\n prop = propMap[prop] || prop;\n if (arguments.length < 2)\n return this[0] && this[0][prop];\n return this.each(function (i, ele) { ele[prop] = value; });\n }\n for (var key in prop) {\n this.prop(key, prop[key]);\n }\n return this;\n};\nfn.removeProp = function (prop) {\n return this.each(function (i, ele) { delete ele[propMap[prop] || prop]; });\n};\nvar cssVariableRe = /^--/;\n// @require ./variables.ts\nfunction isCSSVariable(prop) {\n return cssVariableRe.test(prop);\n}\n// @require core/camel_case.ts\n// @require core/cash.ts\n// @require core/each.ts\n// @require core/variables.ts\n// @require ./is_css_variable.ts\nvar prefixedProps = {};\nvar style = div.style;\nvar vendorsPrefixes = ['webkit', 'moz', 'ms'];\nfunction getPrefixedProp(prop, isVariable) {\n if (isVariable === void 0) { isVariable = isCSSVariable(prop); }\n if (isVariable)\n return prop;\n if (!prefixedProps[prop]) {\n var propCC = camelCase(prop);\n var propUC = \"\".concat(propCC[0].toUpperCase()).concat(propCC.slice(1));\n var props = (\"\".concat(propCC, \" \").concat(vendorsPrefixes.join(\"\".concat(propUC, \" \"))).concat(propUC)).split(' ');\n each(props, function (i, p) {\n if (p in style) {\n prefixedProps[prop] = p;\n return false;\n }\n });\n }\n return prefixedProps[prop];\n}\n// @require core/type_checking.ts\n// @require ./is_css_variable.ts\nvar numericProps = {\n animationIterationCount: true,\n columnCount: true,\n flexGrow: true,\n flexShrink: true,\n fontWeight: true,\n gridArea: true,\n gridColumn: true,\n gridColumnEnd: true,\n gridColumnStart: true,\n gridRow: true,\n gridRowEnd: true,\n gridRowStart: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n widows: true,\n zIndex: true\n};\nfunction getSuffixedValue(prop, value, isVariable) {\n if (isVariable === void 0) { isVariable = isCSSVariable(prop); }\n return !isVariable && !numericProps[prop] && isNumeric(value) ? \"\".concat(value, \"px\") : value;\n}\nfunction css(prop, value) {\n if (isString(prop)) {\n var isVariable_1 = isCSSVariable(prop);\n prop = getPrefixedProp(prop, isVariable_1);\n if (arguments.length < 2)\n return this[0] && computeStyle(this[0], prop, isVariable_1);\n if (!prop)\n return this;\n value = getSuffixedValue(prop, value, isVariable_1);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n if (isVariable_1) {\n ele.style.setProperty(prop, value);\n }\n else {\n ele.style[prop] = value;\n }\n });\n }\n for (var key in prop) {\n this.css(key, prop[key]);\n }\n return this;\n}\n;\nfn.css = css;\nfunction attempt(fn, arg) {\n try {\n return fn(arg);\n }\n catch (_a) {\n return arg;\n }\n}\n// @require core/attempt.ts\n// @require core/camel_case.ts\nvar JSONStringRe = /^\\s+|\\s+$/;\nfunction getData(ele, key) {\n var value = ele.dataset[key] || ele.dataset[camelCase(key)];\n if (JSONStringRe.test(value))\n return value;\n return attempt(JSON.parse, value);\n}\n// @require core/attempt.ts\n// @require core/camel_case.ts\nfunction setData(ele, key, value) {\n value = attempt(JSON.stringify, value);\n ele.dataset[camelCase(key)] = value;\n}\nfunction data(name, value) {\n if (!name) {\n if (!this[0])\n return;\n var datas = {};\n for (var key in this[0].dataset) {\n datas[key] = getData(this[0], key);\n }\n return datas;\n }\n if (isString(name)) {\n if (arguments.length < 2)\n return this[0] && getData(this[0], name);\n if (isUndefined(value))\n return this;\n return this.each(function (i, ele) { setData(ele, name, value); });\n }\n for (var key in name) {\n this.data(key, name[key]);\n }\n return this;\n}\nfn.data = data;\nfunction getDocumentDimension(doc, dimension) {\n var docEle = doc.documentElement;\n return Math.max(doc.body[\"scroll\".concat(dimension)], docEle[\"scroll\".concat(dimension)], doc.body[\"offset\".concat(dimension)], docEle[\"offset\".concat(dimension)], docEle[\"client\".concat(dimension)]);\n}\neach([true, false], function (i, outer) {\n each(['Width', 'Height'], function (i, prop) {\n var name = \"\".concat(outer ? 'outer' : 'inner').concat(prop);\n fn[name] = function (includeMargins) {\n if (!this[0])\n return;\n if (isWindow(this[0]))\n return outer ? this[0][\"inner\".concat(prop)] : this[0].document.documentElement[\"client\".concat(prop)];\n if (isDocument(this[0]))\n return getDocumentDimension(this[0], prop);\n return this[0][\"\".concat(outer ? 'offset' : 'client').concat(prop)] + (includeMargins && outer ? computeStyleInt(this[0], \"margin\".concat(i ? 'Top' : 'Left')) + computeStyleInt(this[0], \"margin\".concat(i ? 'Bottom' : 'Right')) : 0);\n };\n });\n});\neach(['Width', 'Height'], function (index, prop) {\n var propLC = prop.toLowerCase();\n fn[propLC] = function (value) {\n if (!this[0])\n return isUndefined(value) ? undefined : this;\n if (!arguments.length) {\n if (isWindow(this[0]))\n return this[0].document.documentElement[\"client\".concat(prop)];\n if (isDocument(this[0]))\n return getDocumentDimension(this[0], prop);\n return this[0].getBoundingClientRect()[propLC] - getExtraSpace(this[0], !index);\n }\n var valueNumber = parseInt(value, 10);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n var boxSizing = computeStyle(ele, 'boxSizing');\n ele.style[propLC] = getSuffixedValue(propLC, valueNumber + (boxSizing === 'border-box' ? getExtraSpace(ele, !index) : 0));\n });\n };\n});\nvar displayProperty = '___cd';\nfn.toggle = function (force) {\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n var hidden = isHidden(ele);\n var show = isUndefined(force) ? hidden : force;\n if (show) {\n ele.style.display = ele[displayProperty] || '';\n if (isHidden(ele)) {\n ele.style.display = getDefaultDisplay(ele.tagName);\n }\n }\n else if (!hidden) {\n ele[displayProperty] = computeStyle(ele, 'display');\n ele.style.display = 'none';\n }\n });\n};\nfn.hide = function () {\n return this.toggle(false);\n};\nfn.show = function () {\n return this.toggle(true);\n};\nvar eventsNamespace = '___ce';\nvar eventsNamespacesSeparator = '.';\nvar eventsFocus = { focus: 'focusin', blur: 'focusout' };\nvar eventsHover = { mouseenter: 'mouseover', mouseleave: 'mouseout' };\nvar eventsMouseRe = /^(mouse|pointer|contextmenu|drag|drop|click|dblclick)/i;\n// @require ./variables.ts\nfunction getEventNameBubbling(name) {\n return eventsHover[name] || eventsFocus[name] || name;\n}\n// @require ./variables.ts\nfunction parseEventName(eventName) {\n var parts = eventName.split(eventsNamespacesSeparator);\n return [parts[0], parts.slice(1).sort()]; // [name, namespace[]]\n}\nfn.trigger = function (event, data) {\n if (isString(event)) {\n var _a = parseEventName(event), nameOriginal = _a[0], namespaces = _a[1];\n var name_1 = getEventNameBubbling(nameOriginal);\n if (!name_1)\n return this;\n var type = eventsMouseRe.test(name_1) ? 'MouseEvents' : 'HTMLEvents';\n event = doc.createEvent(type);\n event.initEvent(name_1, true, true);\n event.namespace = namespaces.join(eventsNamespacesSeparator);\n event.___ot = nameOriginal;\n }\n event.___td = data;\n var isEventFocus = (event.___ot in eventsFocus);\n return this.each(function (i, ele) {\n if (isEventFocus && isFunction(ele[event.___ot])) {\n ele[\"___i\".concat(event.type)] = true; // Ensuring the native event is ignored\n ele[event.___ot]();\n ele[\"___i\".concat(event.type)] = false; // Ensuring the custom event is not ignored\n }\n ele.dispatchEvent(event);\n });\n};\n// @require ./variables.ts\nfunction getEventsCache(ele) {\n return ele[eventsNamespace] = (ele[eventsNamespace] || {});\n}\n// @require core/guid.ts\n// @require events/helpers/get_events_cache.ts\nfunction addEvent(ele, name, namespaces, selector, callback) {\n var eventCache = getEventsCache(ele);\n eventCache[name] = (eventCache[name] || []);\n eventCache[name].push([namespaces, selector, callback]);\n ele.addEventListener(name, callback);\n}\nfunction hasNamespaces(ns1, ns2) {\n return !ns2 || !some.call(ns2, function (ns) { return ns1.indexOf(ns) < 0; });\n}\n// @require ./get_events_cache.ts\n// @require ./has_namespaces.ts\n// @require ./parse_event_name.ts\nfunction removeEvent(ele, name, namespaces, selector, callback) {\n var cache = getEventsCache(ele);\n if (!name) {\n for (name in cache) {\n removeEvent(ele, name, namespaces, selector, callback);\n }\n }\n else if (cache[name]) {\n cache[name] = cache[name].filter(function (_a) {\n var ns = _a[0], sel = _a[1], cb = _a[2];\n if ((callback && cb.guid !== callback.guid) || !hasNamespaces(ns, namespaces) || (selector && selector !== sel))\n return true;\n ele.removeEventListener(name, cb);\n });\n }\n}\nfn.off = function (eventFullName, selector, callback) {\n var _this = this;\n if (isUndefined(eventFullName)) {\n this.each(function (i, ele) {\n if (!isElement(ele) && !isDocument(ele) && !isWindow(ele))\n return;\n removeEvent(ele);\n });\n }\n else if (!isString(eventFullName)) {\n for (var key in eventFullName) {\n this.off(key, eventFullName[key]);\n }\n }\n else {\n if (isFunction(selector)) {\n callback = selector;\n selector = '';\n }\n each(getSplitValues(eventFullName), function (i, eventFullName) {\n var _a = parseEventName(eventFullName), nameOriginal = _a[0], namespaces = _a[1];\n var name = getEventNameBubbling(nameOriginal);\n _this.each(function (i, ele) {\n if (!isElement(ele) && !isDocument(ele) && !isWindow(ele))\n return;\n removeEvent(ele, name, namespaces, selector, callback);\n });\n });\n }\n return this;\n};\nfn.remove = function (comparator) {\n filtered(this, comparator).detach().off();\n return this;\n};\nfn.replaceWith = function (selector) {\n return this.before(selector).remove();\n};\nfn.replaceAll = function (selector) {\n cash(selector).replaceWith(this);\n return this;\n};\nfunction on(eventFullName, selector, data, callback, _one) {\n var _this = this;\n if (!isString(eventFullName)) {\n for (var key in eventFullName) {\n this.on(key, selector, data, eventFullName[key], _one);\n }\n return this;\n }\n if (!isString(selector)) {\n if (isUndefined(selector) || isNull(selector)) {\n selector = '';\n }\n else if (isUndefined(data)) {\n data = selector;\n selector = '';\n }\n else {\n callback = data;\n data = selector;\n selector = '';\n }\n }\n if (!isFunction(callback)) {\n callback = data;\n data = undefined;\n }\n if (!callback)\n return this;\n each(getSplitValues(eventFullName), function (i, eventFullName) {\n var _a = parseEventName(eventFullName), nameOriginal = _a[0], namespaces = _a[1];\n var name = getEventNameBubbling(nameOriginal);\n var isEventHover = (nameOriginal in eventsHover);\n var isEventFocus = (nameOriginal in eventsFocus);\n if (!name)\n return;\n _this.each(function (i, ele) {\n if (!isElement(ele) && !isDocument(ele) && !isWindow(ele))\n return;\n var finalCallback = function (event) {\n if (event.target[\"___i\".concat(event.type)])\n return event.stopImmediatePropagation(); // Ignoring native event in favor of the upcoming custom one\n if (event.namespace && !hasNamespaces(namespaces, event.namespace.split(eventsNamespacesSeparator)))\n return;\n if (!selector && ((isEventFocus && (event.target !== ele || event.___ot === name)) || (isEventHover && event.relatedTarget && ele.contains(event.relatedTarget))))\n return;\n var thisArg = ele;\n if (selector) {\n var target = event.target;\n while (!matches(target, selector)) {\n if (target === ele)\n return;\n target = target.parentNode;\n if (!target)\n return;\n }\n thisArg = target;\n }\n Object.defineProperty(event, 'currentTarget', {\n configurable: true,\n get: function () {\n return thisArg;\n }\n });\n Object.defineProperty(event, 'delegateTarget', {\n configurable: true,\n get: function () {\n return ele;\n }\n });\n Object.defineProperty(event, 'data', {\n configurable: true,\n get: function () {\n return data;\n }\n });\n var returnValue = callback.call(thisArg, event, event.___td);\n if (_one) {\n removeEvent(ele, name, namespaces, selector, finalCallback);\n }\n if (returnValue === false) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n finalCallback.guid = callback.guid = (callback.guid || cash.guid++);\n addEvent(ele, name, namespaces, selector, finalCallback);\n });\n });\n return this;\n}\nfn.on = on;\nfunction one(eventFullName, selector, data, callback) {\n return this.on(eventFullName, selector, data, callback, true);\n}\n;\nfn.one = one;\nvar queryEncodeCRLFRe = /\\r?\\n/g;\nfunction queryEncode(prop, value) {\n return \"&\".concat(encodeURIComponent(prop), \"=\").concat(encodeURIComponent(value.replace(queryEncodeCRLFRe, '\\r\\n')));\n}\nvar skippableRe = /file|reset|submit|button|image/i;\nvar checkableRe = /radio|checkbox/i;\nfn.serialize = function () {\n var query = '';\n this.each(function (i, ele) {\n each(ele.elements || [ele], function (i, ele) {\n if (ele.disabled || !ele.name || ele.tagName === 'FIELDSET' || skippableRe.test(ele.type) || (checkableRe.test(ele.type) && !ele.checked))\n return;\n var value = getValue(ele);\n if (!isUndefined(value)) {\n var values = isArray(value) ? value : [value];\n each(values, function (i, value) {\n query += queryEncode(ele.name, value);\n });\n }\n });\n });\n return query.slice(1);\n};\n// @require core/types.ts\n// @require core/cash.ts\n// @require core/type_checking.ts\n// @require core/variables.ts\n// @require core/each.ts\n// @require core/extend.ts\n// @require core/find.ts\n// @require core/get_compare_function.ts\n// @require core/get_split_values.ts\n// @require core/guid.ts\n// @require core/parse_html.ts\n// @require core/unique.ts\n// @require attributes/add_class.ts\n// @require attributes/attr.ts\n// @require attributes/has_class.ts\n// @require attributes/prop.ts\n// @require attributes/remove_attr.ts\n// @require attributes/remove_class.ts\n// @require attributes/remove_prop.ts\n// @require attributes/toggle_class.ts\n// @require collection/add.ts\n// @require collection/each.ts\n// @require collection/eq.ts\n// @require collection/filter.ts\n// @require collection/first.ts\n// @require collection/get.ts\n// @require collection/index.ts\n// @require collection/last.ts\n// @require collection/map.ts\n// @require collection/slice.ts\n// @require css/css.ts\n// @require data/data.ts\n// @require dimensions/inner_outer.ts\n// @require dimensions/normal.ts\n// @require effects/hide.ts\n// @require effects/show.ts\n// @require effects/toggle.ts\n// @require events/off.ts\n// @require events/on.ts\n// @require events/one.ts\n// @require events/ready.ts\n// @require events/trigger.ts\n// @require forms/serialize.ts\n// @require forms/val.ts\n// @require manipulation/after.ts\n// @require manipulation/append.ts\n// @require manipulation/append_to.ts\n// @require manipulation/before.ts\n// @require manipulation/clone.ts\n// @require manipulation/detach.ts\n// @require manipulation/empty.ts\n// @require manipulation/html.ts\n// @require manipulation/insert_after.ts\n// @require manipulation/insert_before.ts\n// @require manipulation/prepend.ts\n// @require manipulation/prepend_to.ts\n// @require manipulation/remove.ts\n// @require manipulation/replace_all.ts\n// @require manipulation/replace_with.ts\n// @require manipulation/text.ts\n// @require manipulation/unwrap.ts\n// @require manipulation/wrap.ts\n// @require manipulation/wrap_all.ts\n// @require manipulation/wrap_inner.ts\n// @require offset/offset.ts\n// @require offset/offset_parent.ts\n// @require offset/position.ts\n// @require traversal/children.ts\n// @require traversal/closest.ts\n// @require traversal/contents.ts\n// @require traversal/find.ts\n// @require traversal/has.ts\n// @require traversal/is.ts\n// @require traversal/next.ts\n// @require traversal/next_all.ts\n// @require traversal/next_until.ts\n// @require traversal/not.ts\n// @require traversal/parent.ts\n// @require traversal/parents.ts\n// @require traversal/parents_until.ts\n// @require traversal/prev.ts\n// @require traversal/prev_all.ts\n// @require traversal/prev_until.ts\n// @require traversal/siblings.ts\n// @no-require extras/get_script.ts\n// @no-require extras/shorthands.ts\n// @require methods.ts\nif (typeof exports !== 'undefined') { // Node.js\n module.exports = cash;\n}\nelse { // Browser\n win['cash'] = win['$'] = cash;\n}\n})();","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.grok-hit-triage-view .d4-grid {\n width: initial !important;\n height: initial !important;\n}\n\n.hit-triage-compute-dialog-pane-header {\n display: flex;\n align-items: center;\n justify-content: end;\n}\n\n.hit-triage-compute-dialog-host>.d4-tab-host.d4-tab-vertical>.d4-tab-header-stripe>.d4-tab-header.hit-triage-compute-dialog-pane-header {\n border: none;\n border-left: 4px solid transparent;\n border-radius: 1px;\n padding: 4px 8px;\n min-height: 28px;\n justify-content: flex-end;\n flex-direction: row-reverse;\n}\n\n.hit-triage-compute-dialog-host>.d4-tab-host.d4-tab-vertical>.d4-tab-header-stripe>.d4-tab-header.hit-triage-compute-dialog-pane-header.selected {\n border-left: 4px solid var(--blue-1);\n background-color: #f2f2f5;\n}\n\n.hit-triage-compute-dialog-host>.d4-tab-host.d4-tab-vertical>.d4-tab-header-stripe>.d4-tab-header.hit-triage-compute-dialog-pane-header>span {\n padding: 0 4px;\n}\n\ntable.hit-triage-table {\n margin: 10px;\n width: calc(100% - 20px);\n}\n\n.hit-triage-table-container {\n max-width: 600px;\n max-height: 500px;\n overflow-y: scroll;\n}\n\n.hit-triage-error-div {\n color: red;\n text-align: start;\n}\n\n.mx-5 {\n margin-left: 5px;\n margin-right: 5px;\n}\n\n.hit-triage-new-template-functions-input > .ui-box {\n height: 300px;\n}\n\n.hit-triage-new-template-functions-input {\n max-height: 200px;\n max-width: unset !important;\n overflow-y: scroll;\n}\n\n\n.hit-triage-new-template-functions-input > .d4-tab-host {\n width: 100% !important;\n}\n\n.hit-triage-compute-dialog-host {\n max-height: 550px;\n max-width: 800px;\n min-width: 550px;\n}\n\n.hit-triage-compute-dialog-descriptors-group {\n margin-left: 16px;\n}\n\n.oy-scroll {\n overflow-y: scroll;\n}\n\n.d4-ribbon-name .ui-breadcrumbs {\n\toverflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\tflex-wrap: nowrap;\n padding: 0;\n}\n\n.d4-ribbon-name .ui-breadcrumbs i {\n\tpadding: 0 6px;\n\tfont-size: 10px;\n\tfont-weight: bold;\n}\n\n.d4-ribbon-name .ui-breadcrumbs-element:first-child {\n\twhite-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./css/hit-triage.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,yBAAyB;IACzB,0BAA0B;AAC9B;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,oBAAoB;AACxB;;AAEA;IACI,YAAY;IACZ,kCAAkC;IAClC,kBAAkB;IAClB,gBAAgB;IAChB,gBAAgB;IAChB,yBAAyB;IACzB,2BAA2B;AAC/B;;AAEA;IACI,oCAAoC;IACpC,yBAAyB;AAC7B;;AAEA;IACI,cAAc;AAClB;;AAEA;IACI,YAAY;IACZ,wBAAwB;AAC5B;;AAEA;IACI,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;AACtB;;AAEA;IACI,UAAU;IACV,iBAAiB;AACrB;;AAEA;IACI,gBAAgB;IAChB,iBAAiB;AACrB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,iBAAiB;IACjB,2BAA2B;IAC3B,kBAAkB;AACtB;;;AAGA;IACI,sBAAsB;AAC1B;;AAEA;IACI,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;AACpB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,kBAAkB;AACtB;;AAEA;CACC,gBAAgB;IACb,mBAAmB;IACnB,uBAAuB;CAC1B,iBAAiB;IACd,UAAU;AACd;;AAEA;CACC,cAAc;CACd,eAAe;CACf,iBAAiB;AAClB;;AAEA;CACC,mBAAmB;IAChB,gBAAgB;IAChB,uBAAuB;AAC3B\",\"sourcesContent\":[\".grok-hit-triage-view .d4-grid {\\n width: initial !important;\\n height: initial !important;\\n}\\n\\n.hit-triage-compute-dialog-pane-header {\\n display: flex;\\n align-items: center;\\n justify-content: end;\\n}\\n\\n.hit-triage-compute-dialog-host>.d4-tab-host.d4-tab-vertical>.d4-tab-header-stripe>.d4-tab-header.hit-triage-compute-dialog-pane-header {\\n border: none;\\n border-left: 4px solid transparent;\\n border-radius: 1px;\\n padding: 4px 8px;\\n min-height: 28px;\\n justify-content: flex-end;\\n flex-direction: row-reverse;\\n}\\n\\n.hit-triage-compute-dialog-host>.d4-tab-host.d4-tab-vertical>.d4-tab-header-stripe>.d4-tab-header.hit-triage-compute-dialog-pane-header.selected {\\n border-left: 4px solid var(--blue-1);\\n background-color: #f2f2f5;\\n}\\n\\n.hit-triage-compute-dialog-host>.d4-tab-host.d4-tab-vertical>.d4-tab-header-stripe>.d4-tab-header.hit-triage-compute-dialog-pane-header>span {\\n padding: 0 4px;\\n}\\n\\ntable.hit-triage-table {\\n margin: 10px;\\n width: calc(100% - 20px);\\n}\\n\\n.hit-triage-table-container {\\n max-width: 600px;\\n max-height: 500px;\\n overflow-y: scroll;\\n}\\n\\n.hit-triage-error-div {\\n color: red;\\n text-align: start;\\n}\\n\\n.mx-5 {\\n margin-left: 5px;\\n margin-right: 5px;\\n}\\n\\n.hit-triage-new-template-functions-input > .ui-box {\\n height: 300px;\\n}\\n\\n.hit-triage-new-template-functions-input {\\n max-height: 200px;\\n max-width: unset !important;\\n overflow-y: scroll;\\n}\\n\\n\\n.hit-triage-new-template-functions-input > .d4-tab-host {\\n width: 100% !important;\\n}\\n\\n.hit-triage-compute-dialog-host {\\n max-height: 550px;\\n max-width: 800px;\\n min-width: 550px;\\n}\\n\\n.hit-triage-compute-dialog-descriptors-group {\\n margin-left: 16px;\\n}\\n\\n.oy-scroll {\\n overflow-y: scroll;\\n}\\n\\n.d4-ribbon-name .ui-breadcrumbs {\\n\\toverflow: hidden;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n\\tflex-wrap: nowrap;\\n padding: 0;\\n}\\n\\n.d4-ribbon-name .ui-breadcrumbs i {\\n\\tpadding: 0 6px;\\n\\tfont-size: 10px;\\n\\tfont-weight: bold;\\n}\\n\\n.d4-ribbon-name .ui-breadcrumbs-element:first-child {\\n\\twhite-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.ui-app-header {\n\n}\n\n.ui-app-header-icon {\n width: 150px;\n height: 150px;\n margin-right: 20px;\n}\n\n.u2-panel {\n gap: 10px;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@datagrok-libraries/utils/src/u2.css\"],\"names\":[],\"mappings\":\"AAAA;;AAEA;;AAEA;IACI,YAAY;IACZ,aAAa;IACb,kBAAkB;AACtB;;AAEA;IACI,SAAS;AACb\",\"sourcesContent\":[\".ui-app-header {\\n\\n}\\n\\n.ui-app-header-icon {\\n width: 150px;\\n height: 150px;\\n margin-right: 20px;\\n}\\n\\n.u2-panel {\\n gap: 10px;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `img[alt='hitDesignReadmeImg'] {\n max-width: 100%;\n}\n\n.hit-design-stage-editing-dialog {\n z-index: 10000 !important;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/app/hit-design-views/utils.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,eAAe;AACnB;;AAEA;IACI,yBAAyB;AAC7B\",\"sourcesContent\":[\"img[alt='hitDesignReadmeImg'] {\\n max-width: 100%;\\n}\\n\\n.hit-design-stage-editing-dialog {\\n z-index: 10000 !important;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","const __WEBPACK_NAMESPACE_OBJECT__ = DG;","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","export const CampaignIdKey = 'campaignId';\nexport const HitDesignCampaignIdKey = 'campaignId';\nexport const CampaignTableName = 'enriched_table.csv';\nexport const CampaignJsonName = 'campaign.json';\nexport const HitTriageComputeFunctionTag = 'HitTriageFunction';\nexport const HitTriageDataSourceTag = 'HitTriageDataSource';\nexport const HitTriageSubmitTag = 'HitTriageSubmitFunction';\nexport const HitSelectionColName = 'Selected hits';\nexport const TileCategoriesColName = 'Stage';\nexport const HitDesignMolColName = 'Molecule';\nexport const PeptiHitHelmColName = 'Helm';\nexport const ViDColName = 'V-iD';\nexport const ViDColFormat = 'V######';\nexport const HTcampaignName = 'HTcampaignName';\nexport const HDcampaignName = 'HDcampaignName';\nexport const HTScriptPrefix = 'HTScript';\nexport const HTQueryPrefix = 'HTQuery';\nexport const ComputeQueryMolColName = 'molecules';\nexport const i18n = {\n startNewCampaign: 'New campaign',\n createNewCampaign: 'New campaign',\n dataSourceFunction: 'Source',\n createNewTemplate: 'New template',\n StartCampaign: 'Start',\n createTemplate: 'Create',\n createCampaign: 'Create',\n download: 'Download',\n cancel: 'Cancel',\n continueCampaigns: 'Continue a campaign',\n createNewCampaignHeader: 'New campaign',\n selectTemplate: 'Template',\n} as const;\n\nexport const funcTypeNames = {\n script: 'script',\n function: 'function-package',\n query: 'data-query',\n} as const;\n","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js!./hit-triage.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js!./hit-triage.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {Subscription} from 'rxjs';\nimport {CampaignJsonName, ComputeQueryMolColName} from './consts';\nimport {AppName, CampaignsType, TriagePermissions} from './types';\nimport {_package} from '../package';\n\nexport const toFormatedDateString = (d: Date): string => {\n return `${d.getFullYear()}/${d.getMonth() + 1}/${d.getDate()}`;\n};\n\nexport function modifyUrl(key: string, value: string) {\n const title = document.title;\n const url = window.location.href.split('?')[0] + '?' + key + '=' + value;\n if (history.replaceState) {\n const obj = {\n Title: title,\n Url: url,\n };\n history.replaceState(obj, obj.Title, obj.Url);\n }\n}\n\nexport function hideComponents(styles: CSSStyleDeclaration[]) {\n styles.forEach((style) => {\n style.display = 'none';\n });\n}\n\nexport function showComponents(styles: CSSStyleDeclaration[]) {\n styles.forEach((style) => {\n style.display = 'flex';\n });\n}\n\nexport function addBreadCrumbsToRibbons(view: DG.ViewBase, firstPath: string, secondPath: string, handler: Function):\n {breadcrumbs: DG.Breadcrumbs, sub: Subscription} {\n const breadcrumbs = ui.breadcrumbs([firstPath, secondPath]);\n //breadcrumbs.root.id = 'hit-triage-breadcrumbs';\n const sub = breadcrumbs.onPathClick.subscribe((path) => {\n if (path.length === 1) {\n sub.unsubscribe();\n popRibbonPannels(view);\n handler();\n }\n });\n const viewNameRoot = grok.shell.v.ribbonMenu.root.parentElement?.getElementsByClassName('d4-ribbon-name')[0];\n if (viewNameRoot) {\n viewNameRoot.textContent = '';\n viewNameRoot.appendChild(breadcrumbs.root);\n }\n /*\n let ribbons = view.getRibbonPanels();\n if (!ribbons?.length)\n ribbons = [];\n ribbons.push([breadcrumbs.root]);\n\n if (document.getElementById('hit-triage-breadcrumbs') === null) {\n view.setRibbonPanels(ribbons);\n breadcrumbs.root.parentElement?.classList.add('d4-ribbon-name');\n breadcrumbs.root.parentElement?.classList.remove('d4-ribbon-item');\n }*/\n return {breadcrumbs, sub};\n}\n\nexport function popRibbonPannels(view: DG.ViewBase) {\n const ribbons = view.getRibbonPanels();\n if (!ribbons?.length)\n return;\n ribbons.pop();\n view.setRibbonPanels(ribbons);\n};\n\nexport function checkRibbonsHaveSubmit(ribbons: HTMLElement[][]): boolean {\n return ribbons.reduce((prev, cur) => {\n return prev || cur.reduce((p, c) =>\n p || c.classList.contains('hit-design-submit-button') ||\n Array.from(c.children).some((child) =>child.classList.contains('hit-design-submit-button')), false);\n }, false);\n}\n\n/** Executes {@link func} while showing the \"running\" indicator on {@link root}.\n * Handles and logs exceptions.\n * @param {HTMLElement} root\n * @param {Function} func\n * */\nexport async function runAsync<T>(root: HTMLElement, func: () => Promise<T>) {\n ui.setUpdateIndicator(root, true);\n try {\n return await func();\n } catch (e: any) {\n grok.log.error(e);\n } finally {\n ui.setUpdateIndicator(root, false);\n }\n}\n\nexport async function joinQueryResults(df: DG.DataFrame, molColName: string, qRes: DG.DataFrame) {\n if (qRes.rowCount === 0)\n return;\n const molCol = df.col(molColName);\n if (!molCol)\n throw new Error('There is no molecule column in dataframe');\n let resOriginalCol = qRes.col(ComputeQueryMolColName);\n if (!resOriginalCol) {\n await qRes.meta.detectSemanticTypes();\n resOriginalCol = qRes.columns.bySemType(DG.SEMTYPE.MOLECULE);\n }\n if (!resOriginalCol)\n throw new Error('There is no original molecule column in query result dataframe');\n const newColNames = qRes.columns.names().filter((name) => name !== ComputeQueryMolColName);\n df.join(qRes, [molColName], [resOriginalCol.name], undefined, newColNames, undefined, true);\n};\n\nexport async function loadCampaigns<T extends AppName>(\n appName: T, deletedCampaigns: string[],\n): Promise<{[name: string]: CampaignsType[T]}> {\n const campaignFolders = (await _package.files.list(`${appName}/campaigns`))\n .filter((f) => deletedCampaigns.indexOf(f.name) === -1);\n const campaignNamesMap: {[name: string]: CampaignsType[T]} = {};\n for (const folder of campaignFolders) {\n try {\n const campaignJson: CampaignsType[T] = JSON.parse(await _package.files\n .readAsText(`${appName}/campaigns/${folder.name}/${CampaignJsonName}`));\n if (campaignJson.authorUserId && campaignJson.permissions &&\n !await checkViewPermissions(campaignJson.authorUserId, campaignJson.permissions)\n )\n continue;\n campaignNamesMap[campaignJson.name] = campaignJson;\n } catch (e) {\n continue;\n }\n }\n return campaignNamesMap;\n}\n\nasync function checkPermissions(authorId: string, groupIdList: string[]): Promise<boolean> {\n const userId = DG.User.current().id;\n const userGroupId = DG.User.current().group?.id;\n if (authorId === userId)\n return true;\n const dapiGroups = grok.dapi.groups;\n for (const groupId of groupIdList) {\n const group = await dapiGroups.find(groupId);\n if (!group)\n continue;\n if (group.personal) {\n const user = await dapiGroups.getUser(group);\n if (user?.id === userId)\n return true;\n } else if (userGroupId && group.members.length > 0) {\n if (group.members.some((memberGroup) => memberGroup.id === userGroupId))\n return true;\n }\n }\n return false;\n}\n\nexport async function checkEditPermissions(authorId: string, permissions: TriagePermissions): Promise<boolean> {\n return checkPermissions(authorId, permissions.edit);\n}\n\nexport async function checkViewPermissions(authorId: string, permissions: TriagePermissions): Promise<boolean> {\n return checkPermissions(authorId, Array.from(new Set([...permissions.view, ...permissions.edit])));\n}\n","import * as DG from 'datagrok-api/dg';\n\nexport type AppName = 'Hit Triage' | 'Hit Design' | 'PeptiHit';\n\nexport type CampaignsType = {\n 'Hit Triage': HitTriageCampaign,\n 'Hit Design': HitDesignCampaign,\n 'PeptiHit': HitDesignCampaign,\n}\n\nexport type IDescriptorTree = {\n [key: string]: {\n descriptors: Array<Descriptor>,\n } & Descriptor;\n}\n\nexport type Descriptor = {\n name: string,\n description: string,\n};\n\nexport type IFunctionArgs<T = any> = {\n [key: string]: T,\n}\n\nexport type HitTriageTemplateFunction = {\n package: string,\n name: string,\n args: IFunctionArgs,\n}\n\nexport type HitTriageTemplateScript = {\n name: string,\n args: IFunctionArgs,\n id: string,\n}\n\nexport type HitTriageComputeQuery = HitTriageTemplateScript & {\n inputName: string,\n}\n\nexport type IComputeDialogResult = {\n descriptors: string[],\n externals: {\n [_: string]: IFunctionArgs\n },\n scripts?: {\n [_: string]: IFunctionArgs\n }\n queries?: {\n [_: string]: IFunctionArgs\n }\n}\n\nexport type HitTriageTemplate = {\n name: string,\n key: string,\n compute: HitTriageTemplateCompute,\n submit?: HitTriageTemplateSubmit,\n campaignFields: HitTriageCampaignField[],\n dataSourceType: IngestType,\n queryFunctionName?: string,\n isDataSourceQuery?: boolean,\n layoutViewState?: string,\n}\n\nexport const CampaignFieldTypes = {\n String: DG.TYPE.STRING,\n Number: DG.TYPE.FLOAT,\n Boolean: DG.TYPE.BOOL,\n Date: DG.TYPE.DATE_TIME,\n Molecule: DG.SEMTYPE.MOLECULE,\n} as const;\n\nexport type HitTriageCampaignFieldType = keyof typeof CampaignFieldTypes;\n\nexport type HitTriageCampaignField =\n {name: string, type: HitTriageCampaignFieldType, semtype?: string, required?: boolean};\n\nexport type IngestType = 'File' | 'Query';\n\nexport type HitTriageTemplateIngest = {\n type: IngestType,\n query: string,\n molColName: string,\n};\n\nexport type HitTriageTemplateCompute = {\n descriptors: {\n enabled: boolean,\n args: string[],\n }\n functions: HitTriageTemplateFunction[],\n scripts?: HitTriageTemplateScript[],\n queries?: HitTriageTemplateScript[],\n};\n\nexport type HitTriageTemplateSubmit = {\n fName: string,\n package: string\n};\n\nexport type HitTriageCampaignStatus = 'In Progress' | 'Submitted';\n\nexport type HitTriageCampaign = {\n name: string,\n templateName: string,\n template?: HitDesignTemplate,\n savePath?: string,\n status: HitTriageCampaignStatus,\n createDate: string,\n campaignFields: {[key: string]: any},\n filters: {[key: string]: any}[],\n ingest: HitTriageTemplateIngest,\n columnSemTypes?: {[key: string]: string},\n rowCount?: number,\n filteredRowCount?: number,\n layout?: string,\n columnTypes?: {[key: string]: string},\n version?: number,\n permissions?: TriagePermissions,\n authorUserId?: string\n};\n\nexport type TriagePermissions = {\n // will store the ids of UserGroups that have access to the campaign\n edit: string[],\n view: string[],\n};\n\nexport type IChemFunctionsDialogResult = {\n okProxy: () => void,\n root: HTMLElement,\n};\n\nexport type INewTemplateResult<T> = {\n template: Promise<T>,\n root: HTMLElement,\n cancelPromise: Promise<void>,\n}\n\n// ##################### HIT DESIGN TYPES #####################\n\nexport type HitDesignTemplate = Omit<HitTriageTemplate, 'dataSourceType' | 'queryFunctionName'> &\n {stages: string[]};\n\nexport type HitDesignCampaign = Omit<HitTriageCampaign, 'filters' | 'ingest'> & {tilesViewerFormSketch?: string};\n\n// todo: probably add some more stuff\nexport type PeptiHitTemplate = HitDesignTemplate & {toAtomiLevelProps?: {[key: string]: any}}\n\nexport type ComputeFunctions = {\n functions: DG.Func[],\n scripts: DG.Script[],\n queries: DG.DataQuery[],\n};\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport $ from 'cash-dom';\nimport {IChemFunctionsDialogResult, IComputeDialogResult, IDescriptorTree,\n HitTriageTemplate,\n IFunctionArgs} from '../types';\nimport '../../../css/hit-triage.css';\nimport {funcTypeNames, HTQueryPrefix, HTScriptPrefix} from '../consts';\nimport {HitAppBase} from '../hit-app-base';\n\nexport async function chemFunctionsDialog(app: HitAppBase<any>,\n onOk: (result: IComputeDialogResult) => void, onCancel: () => void,\n template: Omit<HitTriageTemplate, 'dataSourceType'>, dialog?: boolean,\n): Promise<IChemFunctionsDialogResult> {\n // if compute is in dialog form, we need to show all the functions\n\n const computeFunctions = await app.computeFunctions;\n\n const allFunctions: {func: DG.Func | DG.Script | DG.DataQuery, args: IFunctionArgs}[] = [];\n computeFunctions.functions\n .filter(({inputs: i}) => i.length >= 2 && i[0].propertyType === 'dataframe' && i[1].propertyType === 'column')\n .forEach((f) => {\n allFunctions.push({\n func: f,\n args: template?.compute?.functions?.find((tf) =>\n tf.name === f.name && tf.package === f.package.name)?.args ?? {}});\n });\n computeFunctions.scripts\n .filter(({inputs: i}) => i.length >= 2 && i[0].propertyType === 'dataframe' && i[1].propertyType === 'column')\n .forEach((s) => {\n allFunctions.push({\n func: s,\n args: template?.compute?.scripts?.find((ts) => ts.id === s.id)?.args ?? {}});\n });\n computeFunctions.queries\n .filter((q) => q.inputs.length > 0 && q.inputs[0].propertyType === 'list')// for now only lists...\n .forEach((q) => {\n allFunctions.push({\n func: q,\n args: template?.compute?.queries?.find((ts) => ts.id === q.id)?.args ?? {}});\n });\n\n let useDescriptors = !!template?.compute?.descriptors?.enabled || dialog;\n const host = ui.div([], {classes: 'hit-triage-compute-dialog-host'});\n const descriptorItems: DG.TreeViewNode[] = [];\n const descriptorsGroup = ui.tree();\n try {\n // tree groups\n const descriptorsTree = (await grok.chem.descriptorsTree()) as IDescriptorTree;\n descriptorsGroup.root.classList.add('hit-triage-compute-dialog-descriptors-group');\n\n function createTreeGroup(name: string, treeNode: DG.TreeViewGroup): DG.TreeViewGroup {\n const res = treeNode.group(name, null, false);\n res.enableCheckBox(false);\n return res;\n };\n\n // const descriptorsGroup = createTreeGroup('Descriptors', tree);\n const keys = Object.keys(descriptorsTree);\n const preselectedDescriptors: string[] = template?.compute?.descriptors?.args ?? [];\n for (const groupName of keys) {\n const group = createTreeGroup(groupName, descriptorsGroup);\n\n for (const descriptor of descriptorsTree[groupName].descriptors) {\n const item = group.item(descriptor.name, descriptor);\n descriptorItems.push(item);\n item.enableCheckBox(preselectedDescriptors.includes(descriptor.name));\n }\n };\n } catch (e) {\n console.error(e);\n useDescriptors = false;\n }\n\n const descriptorsName = 'Descriptors';\n const funcNamesMap: {[key: string]: string} = {[descriptorsName]: descriptorsName};\n // if compute is in dialog form, we need to show all the functions\n const tabControlArgs: {[key: string]: HTMLElement} =\n useDescriptors ? {[descriptorsName]: descriptorsGroup.root} : {};\n const funcInputsMap: {[funcName: string]: DG.FuncCall} = {};\n const calculatedFunctions: {[key: string]: boolean} = {[descriptorsName]: false};\n calculatedFunctions[descriptorsName] =\n !!template?.compute?.descriptors?.enabled && template?.compute?.descriptors?.args?.length > 0;\n // handling package functions\n for (const func of allFunctions) {\n try {\n const f = func.func;\n const funcCall = f.prepare(func.args);\n const keyName = f.type === funcTypeNames.function ?\n `${f.package.name}:${f.name}`: f.type === funcTypeNames.script ?\n `${HTScriptPrefix}:${f.name ?? ''}:${f.id}` : `${HTQueryPrefix}:${f.name ?? ''}:${f.id}`;\n funcInputsMap[keyName] = funcCall;\n const editor = ui.div();\n const inputs = await funcCall.buildEditor(editor, {condensed: false});\n editor.classList.add('oy-scroll');\n editor.style.marginLeft = '15px';\n editor.style.removeProperty('max-width');\n tabControlArgs[f.friendlyName ?? f.name] = editor;\n funcNamesMap[f.friendlyName ?? f.name] = keyName;\n calculatedFunctions[keyName] = (template?.compute?.functions?.some(\n (f) => func.func.type === funcTypeNames.function &&\n f.name === func.func.name && f.package === func.func.package?.name) ||\n template?.compute?.scripts?.some((s) => s.id === f.id) ||\n template?.compute?.queries?.some((s) => s.id === f.id)) ?? false;\n\n (editor.children[0] as HTMLElement).style.display = 'none'; // table input\n // for queries we don't have column input, we only have one input for the list of molecules\n f.type !== funcTypeNames.query && ((editor.children[1] as HTMLElement).style.display = 'none'); // column input\n inputs.forEach((input) => {\n if (input.property?.name && Object.keys(func.args).includes(input.property?.name))\n input.value = func.args[input.property.name];\n input.fireChanged();\n });\n } catch (e) {\n console.error(e);\n continue;\n }\n }\n\n const tc = ui.tabControl(tabControlArgs, true);\n tc.onTabChanged.subscribe(() => {try {tc.currentPane.content.style.removeProperty('max-width');} catch (e) {}});\n tc.header.style.overflow = 'scroll';\n tc.root.style.width = '100%';\n tc.root.style.minWidth = '350px';\n host.appendChild(tc.root);\n // add checkboxes to each hader\n tc.panes.forEach((pane)=> {\n const functionCheck =\n ui.input.bool('', {value: calculatedFunctions[funcNamesMap[pane.name]], onValueChanged: (value) => {\n calculatedFunctions[funcNamesMap[pane.name]] = !!value;\n if (!value)\n $(pane.content).find('input').attr('disabled', 'true');\n else\n $(pane.content).find('input').removeAttr('disabled');\n }});\n functionCheck.setTooltip('Toggle calculation of this function');\n pane.header.appendChild(functionCheck.root);\n pane.header.classList.add('hit-triage-compute-dialog-pane-header');\n });\n function onOkProxy() {\n const res: IComputeDialogResult = {descriptors: [], externals: {}, scripts: {}, queries: {}};\n res.descriptors = calculatedFunctions[descriptorsName] ?\n descriptorItems.filter((i) => i.checked).map((i) => i.value.name) : [];\n const filteredFuncs = Object.entries(funcInputsMap).filter(([name, _]) => calculatedFunctions[name]);\n // handling package functions\n filteredFuncs.filter(([name, _]) => !name.startsWith(HTScriptPrefix) && !name.startsWith(HTQueryPrefix))\n .forEach(([name, value]) => {\n res.externals[name] = {};\n const inputs = value.inputs;\n Object.entries(inputs).slice(2).forEach(([inputName, inputVal]) => {\n res.externals[name][inputName] = inputVal;\n });\n });\n // handling scripts\n filteredFuncs.filter(([name, _]) => name.startsWith(HTScriptPrefix))\n .forEach(([name, value]) => {\n res.scripts![name] = {};\n const inputs = value.inputs;\n Object.entries(inputs).slice(2).forEach(([inputName, inputVal]) => {\n res.scripts![name][inputName] = inputVal;\n });\n });\n // handling queries\n filteredFuncs.filter(([name, _]) => name.startsWith(HTQueryPrefix))\n .forEach(([name, value]) => {\n res.queries![name] = {};\n const inputs = value.inputs;\n Object.entries(inputs).slice(1).forEach(([inputName, inputVal]) => {\n res.queries![name][inputName] = inputVal;\n });\n });\n console.log(res);\n onOk(res);\n }\n\n if (dialog) {\n ui.dialog('Compute')\n .add(host)\n .onOK(() => onOkProxy())\n .onCancel(onCancel)\n .show();\n }\n\n return {\n root: host,\n okProxy: onOkProxy,\n };\n};\n","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs;","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport { Subject } from 'rxjs';\n/** Editor for predefined properties in a grid form. Supports adding, removing and editing of props. */\nexport class ItemsGrid {\n /**\n * Creates an instance of ItemsGrid which is a grid form for editing properties.\n * @param {DG.Property[]}properties - properties to be edited\n * @param {ItemTypep[]}items - items to be edited\n * @param {ItemsGridOptions}options - options for the grid\n * Options include:\n * removeButtonTooltip - tooltip for the remove button - default is 'Remove item'\n * addButtonTooltip - tooltip for the add button - default is 'Add item'\n * allowRemove - whether to allow removing items - default is true\n * allowAdd - whether to allow adding items - default is true\n * horizontalInputNames - Show the input names next to intput - default is false, names are shown above the grid.\n * newItemFunction - function that returns new item - default is undefind, in which case an empty object is created.\n */\n constructor(properties, items = [], options = {}) {\n /** Observable for when the added item is change */\n this.onItemChanged = new Subject();\n /** Observable for when the adding item is change */\n this.onAddingItemChanged = new Subject();\n /** Observable for when the item is added */\n this.onItemAdded = new Subject();\n /** Observable for when the item is removed */\n this.onItemRemoved = new Subject();\n this.options = { removeButtonTooltip: 'Remove item', addButtonTooltip: 'Add item', allowAdd: true, allowRemove: true };\n this.properties = properties;\n this.options = Object.assign(Object.assign({}, this.options), options);\n this._root = ui.divV([], { style: {\n display: 'grid', gridTemplateColumns: `repeat(${this.properties.length}, 1fr)`,\n alignItems: 'center', gap: '12px'\n }, classes: 'ui-items-grid' });\n this._items = items;\n this.render();\n }\n get root() {\n return this._root;\n }\n get items() {\n return this._items;\n }\n set items(value) {\n this._items = value;\n this.render();\n }\n addItem(item, notify = true) {\n this._items.push(item);\n this.render();\n if (notify)\n this.onItemAdded.next(item);\n }\n removeItem(item, notify = true) {\n if (this._items.indexOf(item) === -1)\n return;\n this._items.splice(this._items.indexOf(item), 1);\n this.render();\n if (notify)\n this.onItemRemoved.next(item);\n }\n removeAtIndex(index, notify = true) {\n if (index < 0 || index >= this._items.length)\n return;\n const removed = this._items.splice(index, 1);\n this.render();\n if (notify)\n this.onItemRemoved.next(removed[0]);\n }\n removeAllItems() {\n this._items = [];\n this.render();\n }\n render() {\n var _a, _b, _c, _d, _e;\n ui.empty(this._root);\n if (!this.options.horizontalInputNames) {\n for (const prop of this.properties) {\n let label = (_a = prop.caption) !== null && _a !== void 0 ? _a : prop.name;\n if ((_b = this.options.customLabels) === null || _b === void 0 ? void 0 : _b[prop.name])\n label = this.options.customLabels[prop.name];\n const header = ui.divText(label);\n header.style.fontWeight = 'bold';\n this._root.appendChild(header);\n }\n }\n for (const item of this._items) {\n const editors = this.getItemDiv(item);\n // if (editors.length !== this.properties.length + 1)\n // editors.push(ui.div());\n for (const editor of editors)\n this._root.appendChild(editor);\n }\n if (this.options.allowAdd) {\n const newEditor = this.getItemDiv((_e = (_d = (_c = this.options).newItemFunction) === null || _d === void 0 ? void 0 : _d.call(_c)) !== null && _e !== void 0 ? _e : undefined, true);\n for (const editor of newEditor)\n this._root.appendChild(editor);\n }\n }\n getItemDiv(item = {}, isAdding) {\n var _a, _b;\n const editors = [];\n const inputsMap = {};\n let lastInput = null;\n for (const prop of this.properties) {\n if (item[prop.name] === undefined)\n item[prop.name] = null; // needed for date editor, it can not handle undefined\n const input = ((_a = this.options.customInputs) === null || _a === void 0 ? void 0 : _a[prop.name]) ? this.options.customInputs[prop.name](item) :\n ui.input.forProperty(prop, item);\n const validator = (_b = this.options.validators) === null || _b === void 0 ? void 0 : _b[prop.name];\n if (validator)\n input.addValidator(validator);\n editors.push(this.options.horizontalInputNames ? input.root : this.hideLabel(input.root));\n if (prop.propertyType !== DG.TYPE.BOOL && prop.name.toLowerCase() !== 'color')\n input.input && (input.input.style.width = '100%');\n inputsMap[prop.name] = input;\n input.onChanged.subscribe(() => {\n item[prop.name] = input.value;\n isAdding ? this.onAddingItemChanged.next({ item, fieldName: prop.name }) :\n this.onItemChanged.next({ item, fieldName: prop.name });\n });\n input.root.style.alignItems = 'center'; // needed for molecule editor\n lastInput = input;\n }\n let companionButton = null;\n if (isAdding) {\n const addButton = ui.icons.add(() => {\n const newItem = this.options.newItemFunction ? this.options.newItemFunction() : {};\n Object.keys(inputsMap).forEach((pName) => {\n newItem[pName] = inputsMap[pName].value;\n });\n this._items.push(newItem);\n this.onItemAdded.next(newItem);\n this.render();\n }, this.options.addButtonTooltip);\n companionButton = addButton;\n }\n else {\n if (!this.options.allowRemove)\n return editors;\n const removeButton = ui.icons.delete(() => {\n this._items.splice(this._items.indexOf(item), 1);\n this.onItemRemoved.next(item);\n this.render();\n }, this.options.removeButtonTooltip);\n companionButton = removeButton;\n }\n //editors.push(companionButton);\n lastInput && lastInput.addOptions ? lastInput.addOptions(companionButton) :\n lastInput === null || lastInput === void 0 ? void 0 : lastInput.root.appendChild(companionButton);\n companionButton.style.color = '#2083d5';\n return editors;\n }\n //needed for color input\n hideLabel(el) {\n el.getElementsByTagName('label')[0] && el.removeChild(el.getElementsByTagName('label')[0]);\n return el;\n }\n hasErrors() {\n return this._root.querySelectorAll('.d4-invalid').length > 0;\n }\n}\n/** Usage example:\n * const props = [DG.Property.js('name2', DG.TYPE.STRING),\n DG.Property.js('name3', DG.TYPE.NUM),\n DG.Property.fromOptions({name: 'name4', type: DG.TYPE.DATE_TIME, nullable: true})];\n const itemsGrid = new ItemsGrid(props);\n * the component has a root property that can be added to the page\n ui.dialog('dialog').add(itemsGrid.root).show();\n at any point, filled fields can be accessed via itemsGrid.items\n */\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMtZ3JpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIml0ZW1zLWdyaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxPQUFPLEVBQWEsTUFBTSxNQUFNLENBQUM7QUF5QnpDLHVHQUF1RztBQUN2RyxNQUFNLE9BQU8sU0FBUztJQWdCbEI7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0wsWUFBWSxVQUF5QixFQUFFLFFBQW9CLEVBQUUsRUFBRSxVQUE0QixFQUFFO1FBekI3RixtREFBbUQ7UUFDNUMsa0JBQWEsR0FBZ0QsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNsRixvREFBb0Q7UUFDN0Msd0JBQW1CLEdBQWdELElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEYsNENBQTRDO1FBQ3JDLGdCQUFXLEdBQXNCLElBQUksT0FBTyxFQUFFLENBQUM7UUFDdEQsOENBQThDO1FBQ3ZDLGtCQUFhLEdBQXNCLElBQUksT0FBTyxFQUFFLENBQUM7UUFHeEQsWUFBTyxHQUNMLEVBQUMsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQWV0RyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxtQ0FBTyxJQUFJLENBQUMsT0FBTyxHQUFLLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQ3JCLEVBQUMsS0FBSyxFQUFFO2dCQUNOLE9BQU8sRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sUUFBUTtnQkFDOUUsVUFBVSxFQUFF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ZGcnO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCB7U3ViamVjdCwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB0eXBlIEl0ZW1UeXBlID0ge1tfOnN0cmluZ106IGFueX07XG5leHBvcnQgdHlwZSBJdGVtc0dyaWRPcHRpb25zID0ge1xuICAgIHJlbW92ZUJ1dHRvblRvb2x0aXA/OiBzdHJpbmcsXG4gICAgYWRkQnV0dG9uVG9vbHRpcD86IHN0cmluZyxcbiAgICBhbGxvd1JlbW92ZT86IGJvb2xlYW4sXG4gICAgYWxsb3dBZGQ/OiBib29sZWFuLFxuICAgIGhvcml6b250YWxJbnB1dE5hbWVzPzogYm9vbGVhbixcbiAgICBuZXdJdGVtRnVuY3Rpb24/OiAoKSA9PiBJdGVtVHlwZSxcbiAgICBjdXN0b21JbnB1dHM/OiB7W2tleTogc3RyaW5nXTogKGl0ZW06IEl0ZW1UeXBlKSA9PiBJbnB1dFR5cGV9LFxuICAgIHZhbGlkYXRvcnM/OiB7W2tleTogc3RyaW5nXTogKHZhbHVlOiBzdHJpbmcpID0+IHN0cmluZyB8IG51bGx9LFxuICAgIGN1c3RvbUxhYmVscz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgIGlucHV0T3B0aW9ucz86IHtba2V5OiBzdHJpbmddOiBIVE1MRWxlbWVudH1cbn07XG5cbmV4cG9ydCB0eXBlIElucHV0VHlwZSA9IHtcbiAgICBpbnB1dD86IEhUTUxFbGVtZW50LFxuICAgIHJvb3Q6IEhUTUxFbGVtZW50LFxuICAgIHZhbHVlOiBhbnksXG4gICAgb25DaGFuZ2VkOiBPYnNlcnZhYmxlPGFueT4sXG4gICAgYWRkT3B0aW9ucz86IChlbDogSFRNTEVsZW1lbnQpID0+IHZvaWQsXG4gICAgYWRkVmFsaWRhdG9yOiAodmFsaWRhdG9yOiAodmFsdWU6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbCkgPT4gdm9pZFxufVxuXG4vKiogRWRpdG9yIGZvciBwcmVkZWZpbmVkIHByb3BlcnRpZXMgaW4gYSBncmlkIGZvcm0uIFN1cHBvcnRzIGFkZGluZywgcmVtb3ZpbmcgYW5kIGVkaXRpbmcgb2YgcHJvcHMuICovXG5leHBvcnQgY2xhc3MgSXRlbXNHcmlkIHtcbiAgcHJpdmF0ZSBfcm9vdDogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgX2l0ZW1zOiB7W2tleTogc3RyaW5nXTogYW55fVtdO1xuXG4gIC8qKiBPYnNlcnZhYmxlIGZvciB3aGVuIHRoZSBhZGRlZCBpdGVtIGlzIGNoYW5nZSAqL1xuICBwdWJsaWMgb25JdGVtQ2hhbmdlZDogU3ViamVjdDx7aXRlbTpJdGVtVHlwZSwgZmllbGROYW1lOiBzdHJpbmd9PiA9IG5ldyBTdWJqZWN0KCk7XG4gIC8qKiBPYnNlcnZhYmxlIGZvciB3aGVuIHRoZSBhZGRpbmcgaXRlbSBpcyBjaGFuZ2UgKi9cbiAgcHVibGljIG9uQWRkaW5nSXRlbUNoYW5nZWQ6IFN1YmplY3Q8e2l0ZW06SXRlbVR5cGUsIGZpZWxkTmFtZTogc3RyaW5nfT4gPSBuZXcgU3ViamVjdCgpO1xuICAvKiogT2JzZXJ2YWJsZSBmb3Igd2hlbiB0aGUgaXRlbSBpcyBhZGRlZCAqL1xuICBwdWJsaWMgb25JdGVtQWRkZWQ6IFN1YmplY3Q8SXRlbVR5cGU+ID0gbmV3IFN1YmplY3QoKTtcbiAgLyoqIE9ic2VydmFibGUgZm9yIHdoZW4gdGhlIGl0ZW0gaXMgcmVtb3ZlZCAqL1xuICBwdWJsaWMgb25JdGVtUmVtb3ZlZDogU3ViamVjdDxJdGVtVHlwZT4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByb3BlcnRpZXM6IERHLlByb3BlcnR5W107XG4gIG9wdGlvbnM6IEl0ZW1zR3JpZE9wdGlvbnMgPVxuICAgIHtyZW1vdmVCdXR0b25Ub29sdGlwOiAnUmVtb3ZlIGl0ZW0nLCBhZGRCdXR0b25Ub29sdGlwOiAnQWRkIGl0ZW0nLCBhbGxvd0FkZDogdHJ1ZSwgYWxsb3dSZW1vdmU6IHRydWV9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgSXRlbXNHcmlkIHdoaWNoIGlzIGEgZ3JpZCBmb3JtIGZvciBlZGl0aW5nIHByb3BlcnRpZXMuXG4gICAgICogQHBhcmFtIHtERy5Qcm9wZXJ0eVtdfXByb3BlcnRpZXMgLSBwcm9wZXJ0aWVzIHRvIGJlIGVkaXRlZFxuICAgICAqIEBwYXJhbSB7SXRlbVR5cGVwW119aXRlbXMgLSBpdGVtcyB0byBiZSBlZGl0ZWRcbiAgICAgKiBAcGFyYW0ge0l0ZW1zR3JpZE9wdGlvbnN9b3B0aW9ucyAtIG9wdGlvbnMgZm9yIHRoZSBncmlkXG4gICAgICogT3B0aW9ucyBpbmNsdWRlOlxuICAgICAqIHJlbW92ZUJ1dHRvblRvb2x0aXAgLSB0b29sdGlwIGZvciB0aGUgcmVtb3ZlIGJ1dHRvbiAtIGRlZmF1bHQgaXMgJ1JlbW92ZSBpdGVtJ1xuICAgICAqIGFkZEJ1dHRvblRvb2x0aXAgLSB0b29sdGlwIGZvciB0aGUgYWRkIGJ1dHRvbiAtIGRlZmF1bHQgaXMgJ0FkZCBpdGVtJ1xuICAgICAqIGFsbG93UmVtb3ZlIC0gd2hldGhlciB0byBhbGxvdyByZW1vdmluZyBpdGVtcyAtIGRlZmF1bHQgaXMgdHJ1ZVxuICAgICAqIGFsbG93QWRkIC0gd2hldGhlciB0byBhbGxvdyBhZGRpbmcgaXRlbXMgLSBkZWZhdWx0IGlzIHRydWVcbiAgICAgKiBob3Jpem9udGFsSW5wdXROYW1lcyAtIFNob3cgdGhlIGlucHV0IG5hbWVzIG5leHQgdG8gaW50cHV0IC0gZGVmYXVsdCBpcyBmYWxzZSwgbmFtZXMgYXJlIHNob3duIGFib3ZlIHRoZSBncmlkLlxuICAgICAqIG5ld0l0ZW1GdW5jdGlvbiAtIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBuZXcgaXRlbSAtIGRlZmF1bHQgaXMgdW5kZWZpbmQsIGluIHdoaWNoIGNhc2UgYW4gZW1wdHkgb2JqZWN0IGlzIGNyZWF0ZWQuXG4gICAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BlcnRpZXM6IERHLlByb3BlcnR5W10sIGl0ZW1zOiBJdGVtVHlwZVtdID0gW10sIG9wdGlvbnM6IEl0ZW1zR3JpZE9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgdGhpcy5vcHRpb25zID0gey4uLnRoaXMub3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgdGhpcy5fcm9vdCA9IHVpLmRpdlYoW10sXG4gICAgICB7c3R5bGU6IHtcbiAgICAgICAgZGlzcGxheTogJ2dyaWQnLCBncmlkVGVtcGxhdGVDb2x1bW5zOiBgcmVwZWF0KCR7dGhpcy5wcm9wZXJ0aWVzLmxlbmd0aH0sIDFmcilgLFxuICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJywgZ2FwOiAnMTJweCd9LCBjbGFzc2VzOiAndWktaXRlbXMtZ3JpZCd9KTtcbiAgICB0aGlzLl9pdGVtcyA9IGl0ZW1zO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBnZXQgcm9vdCgpOiBIVE1MRGl2RWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gIH1cblxuICBnZXQgaXRlbXMoKToge1trZXk6IHN0cmluZ106IGFueX1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICB9XG5cbiAgc2V0IGl0ZW1zKHZhbHVlOiB7W2tleTogc3RyaW5nXTogYW55fVtdKSB7XG4gICAgdGhpcy5faXRlbXMgPSB2YWx1ZTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgcHVibGljIGFkZEl0ZW0oaXRlbTogSXRlbVR5cGUsIG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLl9pdGVtcy5wdXNoKGl0ZW0pO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgaWYgKG5vdGlmeSlcbiAgICAgIHRoaXMub25JdGVtQWRkZWQubmV4dChpdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVJdGVtKGl0ZW06IEl0ZW1UeXBlLCBub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2l0ZW1zLmluZGV4T2YoaXRlbSkgPT09IC0xKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuX2l0ZW1zLnNwbGljZSh0aGlzLl9pdGVtcy5pbmRleE9mKGl0ZW0pLCAxKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICB0aGlzLm9uSXRlbVJlbW92ZWQubmV4dChpdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBdEluZGV4KGluZGV4OiBudW1iZXIsIG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuX2l0ZW1zLmxlbmd0aClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5faXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICB0aGlzLm9uSXRlbVJlbW92ZWQubmV4dChyZW1vdmVkWzBdKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBbGxJdGVtcygpOiB2b2lkIHtcbiAgICB0aGlzLl9pdGVtcyA9IFtdO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKCk6IHZvaWQge1xuICAgIHVpLmVtcHR5KHRoaXMuX3Jvb3QpO1xuICAgIGlmICghdGhpcy5vcHRpb25zLmhvcml6b250YWxJbnB1dE5hbWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxldCBsYWJlbCA9IHByb3AuY2FwdGlvbiA/PyBwcm9wLm5hbWU7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tTGFiZWxzPy5bcHJvcC5uYW1lXSlcbiAgICAgICAgICBsYWJlbCA9IHRoaXMub3B0aW9ucy5jdXN0b21MYWJlbHNbcHJvcC5uYW1lXTtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdWkuZGl2VGV4dChsYWJlbCk7XG4gICAgICAgIGhlYWRlci5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xuICAgICAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKGhlYWRlcik7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLl9pdGVtcykge1xuICAgICAgY29uc3QgZWRpdG9ycyA9IHRoaXMuZ2V0SXRlbURpdihpdGVtKTtcbiAgICAgIC8vIGlmIChlZGl0b3JzLmxlbmd0aCAhPT0gdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aCArIDEpXG4gICAgICAvLyAgIGVkaXRvcnMucHVzaCh1aS5kaXYoKSk7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKVxuICAgICAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKGVkaXRvcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hbGxvd0FkZCkge1xuICAgICAgY29uc3QgbmV3RWRpdG9yID0gdGhpcy5nZXRJdGVtRGl2KHRoaXMub3B0aW9ucy5uZXdJdGVtRnVuY3Rpb24/LigpID8/IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBuZXdFZGl0b3IpXG4gICAgICAgIHRoaXMuX3Jvb3QuYXBwZW5kQ2hpbGQoZWRpdG9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEl0ZW1EaXYoaXRlbTogSXRlbVR5cGUgPSB7fSwgaXNBZGRpbmc/OiBib29sZWFuKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgY29uc3QgZWRpdG9yczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgY29uc3QgaW5wdXRzTWFwOiB7W186IHN0cmluZ106IElucHV0VHlwZX0gPSB7fTtcbiAgICBsZXQgbGFzdElucHV0OiBJbnB1dFR5cGUgfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoaXRlbVtwcm9wLm5hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAgIGl0ZW1bcHJvcC5uYW1lXSA9IG51bGw7IC8vIG5lZWRlZCBmb3IgZGF0ZSBlZGl0b3IsIGl0IGNhbiBub3QgaGFuZGxlIHVuZGVmaW5lZFxuICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tSW5wdXRzPy5bcHJvcC5uYW1lXSA/IHRoaXMub3B0aW9ucy5jdXN0b21JbnB1dHNbcHJvcC5uYW1lXShpdGVtKSA6XG4gICAgICAgIHVpLmlucHV0LmZvclByb3BlcnR5KHByb3AsIGl0ZW0pO1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5vcHRpb25zLnZhbGlkYXRvcnM/Lltwcm9wLm5hbWVdO1xuICAgICAgaWYgKHZhbGlkYXRvcilcbiAgICAgICAgaW5wdXQuYWRkVmFsaWRhdG9yKHZhbGlkYXRvcik7XG5cbiAgICAgIGVkaXRvcnMucHVzaCh0aGlzLm9wdGlvbnMuaG9yaXpvbnRhbElucHV0TmFtZXMgPyBpbnB1dC5yb290IDogdGhpcy5oaWRlTGFiZWwoaW5wdXQucm9vdCkpO1xuICAgICAgaWYgKHByb3AucHJvcGVydHlUeXBlICE9PSBERy5UWVBFLkJPT0wgJiYgcHJvcC5uYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdjb2xvcicpXG4gICAgICAgIGlucHV0LmlucHV0ICYmIChpbnB1dC5pbnB1dC5zdHlsZS53aWR0aCA9ICcxMDAlJyk7XG4gICAgICBpbnB1dHNNYXBbcHJvcC5uYW1lXSA9IGlucHV0O1xuICAgICAgaW5wdXQub25DaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGl0ZW1bcHJvcC5uYW1lXSA9IGlucHV0LnZhbHVlO1xuICAgICAgICBpc0FkZGluZyA/IHRoaXMub25BZGRpbmdJdGVtQ2hhbmdlZC5uZXh0KHtpdGVtLCBmaWVsZE5hbWU6IHByb3AubmFtZX0pIDpcbiAgICAgICAgICB0aGlzLm9uSXRlbUNoYW5nZWQubmV4dCh7aXRlbSwgZmllbGROYW1lOiBwcm9wLm5hbWV9KTtcbiAgICAgIH0pO1xuICAgICAgaW5wdXQucm9vdC5zdHlsZS5hbGlnbkl0ZW1zID0gJ2NlbnRlcic7IC8vIG5lZWRlZCBmb3IgbW9sZWN1bGUgZWRpdG9yXG4gICAgICBsYXN0SW5wdXQgPSBpbnB1dDtcbiAgICB9XG5cbiAgICBsZXQgY29tcGFuaW9uQnV0dG9uOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGlmIChpc0FkZGluZykge1xuICAgICAgY29uc3QgYWRkQnV0dG9uID0gdWkuaWNvbnMuYWRkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3SXRlbTogSXRlbVR5cGUgPSB0aGlzLm9wdGlvbnMubmV3SXRlbUZ1bmN0aW9uID8gdGhpcy5vcHRpb25zLm5ld0l0ZW1GdW5jdGlvbigpIDoge307XG4gICAgICAgIE9iamVjdC5rZXlzKGlucHV0c01hcCkuZm9yRWFjaCgocE5hbWUpID0+IHtcbiAgICAgICAgICBuZXdJdGVtW3BOYW1lXSA9IGlucHV0c01hcFtwTmFtZV0udmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9pdGVtcy5wdXNoKG5ld0l0ZW0pO1xuICAgICAgICB0aGlzLm9uSXRlbUFkZGVkLm5leHQobmV3SXRlbSk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB9LCB0aGlzLm9wdGlvbnMuYWRkQnV0dG9uVG9vbHRpcCk7XG4gICAgICBjb21wYW5pb25CdXR0b24gPSBhZGRCdXR0b247XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93UmVtb3ZlKSByZXR1cm4gZWRpdG9ycztcbiAgICAgIGNvbnN0IHJlbW92ZUJ1dHRvbiA9IHVpLmljb25zLmRlbGV0ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2l0ZW1zLnNwbGljZSh0aGlzLl9pdGVtcy5pbmRleE9mKGl0ZW0pLCAxKTtcbiAgICAgICAgdGhpcy5vbkl0ZW1SZW1vdmVkLm5leHQoaXRlbSk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB9LCB0aGlzLm9wdGlvbnMucmVtb3ZlQnV0dG9uVG9vbHRpcCk7XG4gICAgICBjb21wYW5pb25CdXR0b24gPSByZW1vdmVCdXR0b247XG4gICAgfVxuXG4gICAgLy9lZGl0b3JzLnB1c2goY29tcGFuaW9uQnV0dG9uKTtcbiAgICBsYXN0SW5wdXQgJiYgbGFzdElucHV0LmFkZE9wdGlvbnMgPyBsYXN0SW5wdXQuYWRkT3B0aW9ucyhjb21wYW5pb25CdXR0b24pIDpcbiAgICAgIGxhc3RJbnB1dD8ucm9vdC5hcHBlbmRDaGlsZChjb21wYW5pb25CdXR0b24pO1xuICAgIGNvbXBhbmlvbkJ1dHRvbi5zdHlsZS5jb2xvciA9ICcjMjA4M2Q1JztcbiAgICByZXR1cm4gZWRpdG9ycztcbiAgfVxuICAvL25lZWRlZCBmb3IgY29sb3IgaW5wdXRcbiAgcHJpdmF0ZSBoaWRlTGFiZWwoZWw6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xuICAgIGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsYWJlbCcpWzBdICYmIGVsLnJlbW92ZUNoaWxkKGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsYWJlbCcpWzBdKTtcbiAgICByZXR1cm4gZWw7XG4gIH1cblxuICBoYXNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3QucXVlcnlTZWxlY3RvckFsbCgnLmQ0LWludmFsaWQnKS5sZW5ndGggPiAwO1xuICB9XG59XG5cbi8qKiBVc2FnZSBleGFtcGxlOlxuICogY29uc3QgcHJvcHMgPSBbREcuUHJvcGVydHkuanMoJ25hbWUyJywgREcuVFlQRS5TVFJJTkcpLFxuICAgICAgREcuUHJvcGVydHkuanMoJ25hbWUzJywgREcuVFlQRS5OVU0pLFxuICAgICAgREcuUHJvcGVydHkuZnJvbU9wdGlvbnMoe25hbWU6ICduYW1lNCcsIHR5cGU6IERHLlRZUEUuREFURV9USU1FLCBudWxsYWJsZTogdHJ1ZX0pXTtcbiAgICBjb25zdCBpdGVtc0dyaWQgPSBuZXcgSXRlbXNHcmlkKHByb3BzKTtcbiAqIHRoZSBjb21wb25lbnQgaGFzIGEgcm9vdCBwcm9wZXJ0eSB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgcGFnZVxuICAgIHVpLmRpYWxvZygnZGlhbG9nJykuYWRkKGl0ZW1zR3JpZC5yb290KS5zaG93KCk7XG4gICAgYXQgYW55IHBvaW50LCBmaWxsZWQgZmllbGRzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgaXRlbXNHcmlkLml0ZW1zXG4gKi9cbiJdfQ==","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\n\nexport function getLayoutInput() {\n const dataFileProp = DG.Property.fromOptions({name: 'layout', caption: 'Layout', type: 'file'});\n const dataFileInput = DG.InputBase.forProperty(dataFileProp);\n let layout: DG.ViewLayout | null = null;\n let layoutViewState: string | null = null;\n let error: string | null = null;\n dataFileInput.addValidator((_) => error);\n dataFileInput.onChanged.subscribe(async (value) => {\n const f: DG.FileInfo = value;\n if (f) {\n try {\n const contentString = await f.readAsString();\n const l = DG.ViewLayout.fromJson(contentString);\n if (l) {\n layout = l;\n layoutViewState = l.viewState;\n error = null;\n } else {\n layout = null;\n layoutViewState = null;\n error = 'Invalid layout file';\n }\n } catch (e) {\n layout = null;\n layoutViewState = null;\n error = 'Invalid layout file';\n }\n }\n dataFileInput.setTooltip('Select a layout file');\n });\n return {\n dataFileInput, getLayout: () => layout, getLayoutViewState: () => layoutViewState,\n };\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport {_package} from '../../package';\nimport {CampaignFieldTypes, HitTriageCampaignField, HitTriageCampaignFieldType,\n IComputeDialogResult, HitTriageTemplate, IngestType, INewTemplateResult} from '../types';\nimport * as C from '../consts';\nimport '../../../css/hit-triage.css';\nimport {chemFunctionsDialog} from '../dialogs/functions-dialog';\nimport {ItemType, ItemsGrid} from '@datagrok-libraries/utils/src/items-grid';\nimport {HitAppBase} from '../hit-app-base';\nimport {getLayoutInput} from './layout-input';\n\n\nexport async function createTemplateAccordeon(app: HitAppBase<any>,\n dataSourceFunctionMap: { [key: string]: DG.Func | DG.DataQuery | DG.Script },\n): Promise<INewTemplateResult<HitTriageTemplate>> {\n const availableTemplates = (await _package.files.list('Hit Triage/templates')).map((file) => file.name.slice(0, -5));\n const availableTemplateKeys: string[] = [];\n for (const tn of availableTemplates) {\n const t: HitTriageTemplate = JSON.parse(await _package.files.readAsText(`Hit Triage/templates/${tn}.json`));\n availableTemplateKeys.push(t.key);\n }\n\n const availableSubmitFunctions = DG.Func.find({tags: [C.HitTriageSubmitTag]});\n const submitFunctionsMap: {[key: string]: DG.Func} = {};\n availableSubmitFunctions.forEach((func) => {\n submitFunctionsMap[func.friendlyName ?? func.name] = func;\n });\n const submitFunctionInput =\n ui.input.choice('Submit function', {value: null, items: [null, ...Object.keys(submitFunctionsMap)]});\n submitFunctionInput.value = null;\n submitFunctionInput.nullable = true;\n submitFunctionInput.fireChanged();\n submitFunctionInput.setTooltip('Select function to be called upon submitting');\n const layoutInput = getLayoutInput();\n const errorDiv = ui.divText('Template name is empty or already exists', {classes: 'hit-triage-error-div'});\n\n const keyErrorDiv = ui.divText('Template key is empty or already exists', {classes: 'hit-triage-error-div'});\n\n const templateNameInput = ui.input.string('Name', {value: '', onValueChanged: (value) => {\n if (value === '' || availableTemplates.includes(value)) {\n templateNameInput.root.style.borderBottom = '1px solid red';\n errorDiv.style.opacity = '100%';\n } else {\n templateNameInput.root.style.borderBottom = 'none';\n errorDiv.style.opacity = '0%';\n }\n }});\n const templateKeyInput = ui.input.string('Key', {value: '', onValueChanged: (value) => {\n if (value === '' || availableTemplateKeys.includes(value)) {\n templateKeyInput.root.style.borderBottom = '1px solid red';\n keyErrorDiv.style.opacity = '100%';\n } else {\n templateKeyInput.root.style.borderBottom = 'none';\n keyErrorDiv.style.opacity = '0%';\n }\n }});\n\n templateKeyInput.setTooltip('Template key used for campaign prefix');\n templateNameInput.setTooltip('Template name');\n templateNameInput.root.style.borderBottom = 'none';\n templateKeyInput.root.style.borderBottom = 'none';\n errorDiv.style.opacity = '0%';\n keyErrorDiv.style.opacity = '0%';\n\n let funcDialogRes: IComputeDialogResult | null = null;\n // used just for functions editor\n const dummyTemplate = {\n compute: {\n descriptors: {\n enabled: true,\n args: [],\n },\n functions: [],\n },\n } as unknown as HitTriageTemplate;\n const funcInput = await chemFunctionsDialog(app, (res) => {funcDialogRes = res;}, () => null,\n dummyTemplate, false);\n funcInput.root.classList.add('hit-triage-new-template-functions-input');\n if (Object.entries(dataSourceFunctionMap).length === 0) {\n // functions that have special tag and are applicable for data source. they should return a dataframe with molecules\n const dataSourceFunctions = DG.Func.find({tags: [C.HitTriageDataSourceTag]});\n dataSourceFunctions.forEach((func) => {\n dataSourceFunctionMap[func.friendlyName ?? func.name] = func;\n });\n }\n const combinedSourceNames = Object.keys(dataSourceFunctionMap);\n const dataSourceFunctionInput = ui.input.choice(\n C.i18n.dataSourceFunction, {value: combinedSourceNames[0], items: combinedSourceNames});\n const ingestTypeInput = ui.input.choice<IngestType>('Ingest using', {value: 'Query', items: ['Query', 'File'],\n onValueChanged: (value) => {\n dataSourceFunctionInput.root.style.display = value === 'Query' ? 'block' : 'none';\n }});\n\n const fieldsEditor = getCampaignFieldEditors();\n\n const form = ui.div([\n ui.h2('Details'),\n ui.div([templateNameInput, errorDiv]),\n ui.div([templateKeyInput, keyErrorDiv]),\n ingestTypeInput.root,\n dataSourceFunctionInput.root,\n layoutInput.dataFileInput,\n fieldsEditor.fieldsDiv,\n ui.h2('Compute'),\n funcInput.root,\n ui.h2('Submit'),\n submitFunctionInput.root,\n ], 'ui-form');\n\n const buttonsDiv = ui.buttonsInput([]);\n const buttonsContainerDiv = buttonsDiv.getElementsByClassName('ui-input-editor')?.[0] ?? buttonsDiv;\n form.appendChild(buttonsDiv);\n const cancelPromise = new Promise<void>((resolve) => {\n const cancelButton = ui.button(C.i18n.cancel, () => resolve());\n buttonsContainerDiv.appendChild(cancelButton);\n });\n\n const promise = new Promise<HitTriageTemplate>((resolve) => {\n async function onOkProxy() {\n funcInput.okProxy();\n if (errorDiv.style.opacity === '100%') {\n grok.shell.error('Template name is empty or already exists');\n return;\n }\n const submitFunction = submitFunctionInput.value ? submitFunctionsMap[submitFunctionInput.value] : undefined;\n const out: HitTriageTemplate = {\n name: templateNameInput.value,\n key: templateKeyInput.value,\n campaignFields: fieldsEditor.getFields(),\n dataSourceType: ingestTypeInput.value ?? 'Query',\n layoutViewState: layoutInput.getLayoutViewState() ?? undefined,\n compute: {\n descriptors: {\n enabled: !!funcDialogRes?.descriptors?.length,\n args: funcDialogRes?.descriptors ?? [],\n },\n functions: Object.entries(funcDialogRes?.externals ?? {}).map(([funcName, args]) => {\n const splitFunc = funcName.split(':');\n return ({\n name: splitFunc[1],\n package: splitFunc[0],\n args: args,\n });\n }),\n scripts: Object.entries(funcDialogRes?.scripts ?? {})\n .filter(([name, _]) => name.startsWith(C.HTScriptPrefix) && name.split(':').length === 3)\n .map(([scriptId, args]) => {\n const scriptNameParts = scriptId.split(':');\n return ({\n name: scriptNameParts[1] ?? '',\n id: scriptNameParts[2] ?? '',\n args: args,\n });\n }),\n queries: Object.entries(funcDialogRes?.queries ?? {})\n .filter(([name, _]) => name.startsWith(C.HTQueryPrefix) && name.split(':').length === 3)\n .map(([queryName, args]) => {\n const queryNameParts = queryName.split(':');\n return ({\n name: queryNameParts[1] ?? '',\n id: queryNameParts[2] ?? '',\n args: args,\n });\n }),\n },\n ...(submitFunction ? {submit: {fName: submitFunction.name, package: submitFunction.package.name}} : {}),\n queryFunctionName: (ingestTypeInput.value === 'Query') ? dataSourceFunctionInput.value ?? undefined : undefined,\n };\n saveTemplate(out);\n grok.shell.info('Template created successfully');\n resolve(out);\n }\n const createTemplateButton = ui.bigButton(C.i18n.createTemplate, () => onOkProxy());\n buttonsContainerDiv.appendChild(createTemplateButton);\n });\n\n return {root: form, template: promise, cancelPromise};\n}\n\nexport function getCampaignFieldEditors(preset?: HitTriageCampaignField[]) {\n const props = [DG.Property.fromOptions({name: 'Name', type: DG.TYPE.STRING}),\n DG.Property.fromOptions({name: 'Type', type: DG.TYPE.STRING, choices: Object.keys(CampaignFieldTypes)}),\n DG.Property.fromOptions({name: 'Required', type: DG.TYPE.BOOL})];\n const itemsGrid = new ItemsGrid(\n props, preset ? preset.map((p) => ({Name: p.name, Type: p.type, Required: p.required})) : undefined,\n {horizontalInputNames: false});\n itemsGrid.root.style.maxWidth = '750px';\n\n let addingItem: ItemType = {};\n itemsGrid.onItemAdded.subscribe((_) => {\n addingItem = {};\n });\n itemsGrid.onAddingItemChanged.subscribe((item) => {\n if (item)\n addingItem = item.item;\n });\n\n function getFieldParams(): HitTriageCampaignField[] {\n const items = itemsGrid.items.filter((f) => f.Name).map((f) => ({\n name: f.Name,\n type: f.Type as HitTriageCampaignFieldType,\n required: f.Required ?? false,\n }));\n if (addingItem.Name && addingItem.Name !== '' && addingItem.Type) {\n addingItem.Required ??= false;\n items.push({name: addingItem.Name, type: addingItem.Type, required: addingItem.Required});\n }\n return items;\n }\n //itemsGrid.root.style.cssText = '';\n //itemsGrid.root.className = 'd4-flex-c';\n\n const header = ui.h2('Additional fields');\n ui.tooltip.bind(header, 'Additional fields to be filled by user for each campaign');\n const fieldsContainer = ui.div([\n header,\n itemsGrid.root,\n ]);\n return {\n getFields: getFieldParams,\n fieldsDiv: ui.div([fieldsContainer]),\n };\n}\n\nexport function saveTemplate(template: HitTriageTemplate) {\n _package.files.writeAsText(`Hit Triage/templates/${template.name}.json`, JSON.stringify(template));\n}\n","import * as DG from 'datagrok-api/dg';\nimport {AppName, HitDesignTemplate, HitTriageTemplate, PeptiHitTemplate} from './types';\nimport {HitDesignApp} from './hit-design-app';\nimport {HitTriageApp} from './hit-triage-app';\nimport {_package} from '../package';\n\nexport class HitBaseView<Ttemplate extends HitDesignTemplate | HitTriageTemplate | PeptiHitTemplate,\n Tapp extends HitDesignApp | HitTriageApp> extends DG.ViewBase {\n app: Tapp;\n protected deletedCampaigns: string[] = [];\n constructor(app: Tapp) {\n super();\n\n this.app = app;\n }\n\n get template(): Ttemplate {return this.app.template! as Ttemplate;}\n\n /** Override to initialize the view based on the session. */\n onActivated(): void {\n }\n\n /** Gets called when any of the previous views change. */\n onReset() {\n }\n\n async process(): Promise<any> {\n }\n\n async deleteCampaign(appName: AppName, campaignId: string): Promise<void> {\n await _package.files.delete(`${appName}/campaigns/${campaignId}`);\n }\n}\n","\n import API from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../css-loader/dist/cjs.js!./u2.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../css-loader/dist/cjs.js!./u2.css\";\n export default content && content.locals ? content.locals : undefined;\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport $ from 'cash-dom';\nimport './u2.css';\nexport var u2;\n(function (u2) {\n /** */\n let panels;\n (function (panels) {\n /** Vertically positioned items */\n function vert(items) {\n return ui.divV(items.map((item) => ui.render(item)), { classes: 'u2-panel' });\n }\n panels.vert = vert;\n /** Horizontally positioned items */\n function horz(items) {\n return ui.divH(items.map((item) => ui.render(item)), { classes: 'u2-panel' });\n }\n panels.horz = horz;\n })(panels = u2.panels || (u2.panels = {}));\n function appHeader(header) {\n const icon = ui.iconImage('', header.iconPath);\n $(icon).addClass('ui-app-header-icon').css('margin-right', '20px');\n return panels.horz([\n icon,\n panels.vert([\n ui.markdown(header.description),\n header.learnMoreUrl ? ui.link('Learn more', header.learnMoreUrl) : null\n ])\n ]);\n }\n u2.appHeader = appHeader;\n let tools;\n (function (tools) {\n /** Executes {@link func} while showing the \"running\" indicator on {@link root}.\n * Handles and logs exceptions. */\n function runAsync(root, func) {\n return __awaiter(this, void 0, void 0, function* () {\n ui.setUpdateIndicator(root, true);\n try {\n return yield func();\n }\n catch (e) {\n grok.log.error(e);\n }\n finally {\n ui.setUpdateIndicator(root, false);\n }\n });\n }\n tools.runAsync = runAsync;\n })(tools = u2.tools || (u2.tools = {}));\n})(u2 || (u2 = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidTIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxDQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3pCLE9BQU8sVUFBVSxDQUFDO0FBR2xCLE1BQU0sS0FBVyxFQUFFLENBc0RsQjtBQXRERCxXQUFpQixFQUFFO0lBRWpCLE1BQU07SUFDTixJQUFpQixNQUFNLENBWXRCO0lBWkQsV0FBaUIsTUFBTTtRQUVyQixrQ0FBa0M7UUFDbEMsU0FBZ0IsSUFBSSxDQUFDLEtBQVk7WUFDL0IsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFGZSxXQUFJLE9BRW5CLENBQUE7UUFFRCxvQ0FBb0M7UUFDcEMsU0FBZ0IsSUFBSSxDQUFDLEtBQVk7WUFDL0IsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFGZSxXQUFJLE9BRW5CLENBQUE7SUFFSCxDQUFDLEVBWmdCLE1BQU0sR0FBTixTQUFNLEtBQU4sU0FBTSxRQVl0QjtJQVFELFNBQWdCLFNBQVMsQ0FBQyxNQUFnQjtRQUN4QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbkUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2pCLElBQUk7WUFDSixNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztnQkFDL0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2FBQ3hFLENBQUM7U0FDSCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBWGUsWUFBUyxZQVd4QixDQUFBO0lBR0QsSUFBaUIsS0FBSyxDQWdCckI7SUFoQkQsV0FBaUIsS0FBSztRQUVwQjswQ0FDa0M7UUFDbEMsU0FBc0IsUUFBUSxDQUFJLElBQWlCLEVBQUUsSUFBc0I7O2dCQUN6RSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxJQUFJO29CQUNGLE9BQU8sTUFBTSxJQUFJLEVBQUUsQ0FBQztpQkFDckI7Z0JBQ0QsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBVyxDQUFDLENBQUM7aUJBQzdCO3dCQUNPO29CQUNOLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3BDO1lBQ0gsQ0FBQztTQUFBO1FBWHFCLGNBQVEsV0FXN0IsQ0FBQTtJQUNILENBQUMsRUFoQmdCLEtBQUssR0FBTCxRQUFLLEtBQUwsUUFBSyxRQWdCckI7QUFDSCxDQUFDLEVBdERnQixFQUFFLEtBQUYsRUFBRSxRQXNEbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgJCBmcm9tICdjYXNoLWRvbSc7XG5pbXBvcnQgJy4vdTIuY3NzJztcblxuXG5leHBvcnQgbmFtZXNwYWNlIHUyIHtcblxuICAvKiogKi9cbiAgZXhwb3J0IG5hbWVzcGFjZSBwYW5lbHMge1xuXG4gICAgLyoqIFZlcnRpY2FsbHkgcG9zaXRpb25lZCBpdGVtcyAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiB2ZXJ0KGl0ZW1zOiBhbnlbXSk6IEhUTUxFbGVtZW50IHtcbiAgICAgIHJldHVybiB1aS5kaXZWKGl0ZW1zLm1hcCgoaXRlbSkgPT4gdWkucmVuZGVyKGl0ZW0pKSwgeyBjbGFzc2VzOiAndTItcGFuZWwnfSk7XG4gICAgfVxuXG4gICAgLyoqIEhvcml6b250YWxseSBwb3NpdGlvbmVkIGl0ZW1zICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGhvcnooaXRlbXM6IGFueVtdKTogSFRNTEVsZW1lbnQge1xuICAgICAgcmV0dXJuIHVpLmRpdkgoaXRlbXMubWFwKChpdGVtKSA9PiB1aS5yZW5kZXIoaXRlbSkpLCB7IGNsYXNzZXM6ICd1Mi1wYW5lbCd9KTtcbiAgICB9XG5cbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgSUFwcEluZm8ge1xuICAgIGljb25QYXRoOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBsZWFybk1vcmVVcmw/OiBzdHJpbmc7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gYXBwSGVhZGVyKGhlYWRlcjogSUFwcEluZm8pOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgaWNvbiA9IHVpLmljb25JbWFnZSgnJywgaGVhZGVyLmljb25QYXRoKTtcbiAgICAkKGljb24pLmFkZENsYXNzKCd1aS1hcHAtaGVhZGVyLWljb24nKS5jc3MoJ21hcmdpbi1yaWdodCcsICcyMHB4Jyk7XG5cbiAgICByZXR1cm4gcGFuZWxzLmhvcnooW1xuICAgICAgaWNvbixcbiAgICAgIHBhbmVscy52ZXJ0KFtcbiAgICAgICAgdWkubWFya2Rvd24oaGVhZGVyLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgaGVhZGVyLmxlYXJuTW9yZVVybCA/IHVpLmxpbmsoJ0xlYXJuIG1vcmUnLCBoZWFkZXIubGVhcm5Nb3JlVXJsKSA6IG51bGxcbiAgICAgIF0pXG4gICAgXSk7XG4gIH1cblxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgdG9vbHMge1xuXG4gICAgLyoqIEV4ZWN1dGVzIHtAbGluayBmdW5jfSB3aGlsZSBzaG93aW5nIHRoZSBcInJ1bm5pbmdcIiBpbmRpY2F0b3Igb24ge0BsaW5rIHJvb3R9LlxuICAgICAqIEhhbmRsZXMgYW5kIGxvZ3MgZXhjZXB0aW9ucy4gKi9cbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQXN5bmM8VD4ocm9vdDogSFRNTEVsZW1lbnQsIGZ1bmM6ICgpID0+IFByb21pc2U8VD4pIHtcbiAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcihyb290LCB0cnVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmdW5jKCk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICBncm9rLmxvZy5lcnJvcihlIGFzIHN0cmluZyk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHtcbiAgICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHJvb3QsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0iXX0=","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport {TriagePermissions} from '../types';\nexport const defaultPermissions: TriagePermissions = {\n view: [DG.Group.defaultGroupsIds['All users']],\n edit: [DG.Group.defaultGroupsIds['All users']],\n};\n\nexport class PermissionsDialog {\n permissions: TriagePermissions;\n editGroupsInput: DG.InputBase<DG.Group[]>;\n viewGroupsInput: DG.InputBase<DG.Group[]>;\n\n constructor(permissions?: TriagePermissions) {\n this.permissions = permissions ?? defaultPermissions;\n // @ts-ignore TODO: fix typings\n this.editGroupsInput = ui.input.userGroups('Can Edit');\n this.editGroupsInput.root.style.marginBottom = '16px';\n // @ts-ignore TODO: fix typings\n this.viewGroupsInput = ui.input.userGroups('Can View');\n }\n\n private async getDialogContent(): Promise<HTMLElement> {\n const viewGroups: DG.Group[] = [];\n const editGroups: DG.Group[] = [];\n for (const groupId of this.permissions.view) {\n const group = await grok.dapi.groups.find(groupId);\n if (group)\n viewGroups.push(group);\n }\n for (const groupId of this.permissions.edit) {\n const group = await grok.dapi.groups.find(groupId);\n if (group)\n editGroups.push(group);\n }\n\n // values are set separately as there still are some bugs with input\n //@ts-ignore\n this.editGroupsInput.value = editGroups;\n //@ts-ignore\n this.viewGroupsInput.value = viewGroups;\n return ui.divV([\n this.editGroupsInput.root,\n this.viewGroupsInput.root,\n ]);\n }\n\n async show(onOk: (res: TriagePermissions) => void) {\n const content = await this.getDialogContent();\n const dialog = ui.dialog('Edit Permissions')\n .add(content)\n .onOK(() => {\n const editSet = new Set(this.editGroupsInput.value.map((group) => group.id));\n const viewSet = new Set(this.viewGroupsInput.value.map((group) => group.id));\n this.permissions.edit = Array.from(editSet);\n editSet.forEach((id) => viewSet.add(id)); // all who can edit can also view\n this.permissions.view = Array.from(viewSet);\n if (this.permissions.view.length === 0)\n this.permissions.view = defaultPermissions.view;\n onOk(this.permissions);\n });\n content.parentElement?.style && (content.parentElement.style.overflow = 'visible');\n dialog.show();\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {HitTriageApp} from '../hit-triage-app';\nimport {_package} from '../../package';\nimport {HitTriageTemplate} from '../types';\nimport {CampaignIdKey, CampaignJsonName, i18n} from '../consts';\nimport {HitTriageCampaign} from '../types';\nimport '../../../css/hit-triage.css';\nimport {addBreadCrumbsToRibbons, checkEditPermissions, checkViewPermissions,\n loadCampaigns, modifyUrl, popRibbonPannels} from '../utils';\nimport {newCampaignAccordeon} from '../accordeons/new-campaign-accordeon';\nimport $ from 'cash-dom';\nimport {createTemplateAccordeon} from '../accordeons/new-template-accordeon';\nimport {HitBaseView} from '../base-view';\nimport {u2} from '@datagrok-libraries/utils/src/u2';\nimport {defaultPermissions} from '../dialogs/permissions-dialog';\n\nexport class InfoView extends HitBaseView<HitTriageTemplate, HitTriageApp> {\n public readmePath = _package.webRoot + 'README_HT.md';\n private dataSourceFunctionsMap: {[key: string]: DG.Func | DG.DataQuery} = {};\n constructor(app: HitTriageApp) {\n super(app);\n this.name = 'Hit Triage';\n grok.shell.windows.showHelp = true;\n grok.shell.windows.help.showHelp(this.readmePath);\n this.checkCampaign().then((c) => {this.app.campaign = c; this.init();});\n }\n\n onActivated(): void {\n grok.shell.windows.showHelp = true;\n grok.shell.windows.help.showHelp(this.readmePath);\n }\n\n async init(presetTemplate?: HitTriageTemplate): Promise<void> {\n ui.setUpdateIndicator(this.root, true);\n try {\n const continueCampaignsHeader = ui.h1(i18n.continueCampaigns);\n const createNewCampaignHeader = ui.h1(i18n.createNewCampaignHeader, {style: {marginLeft: '10px'}});\n const appHeader = u2.appHeader({\n iconPath: _package.webRoot + '/images/icons/hit-triage-icon.png',\n learnMoreUrl: 'https://github.com/datagrok-ai/public/blob/master/packages/HitTriage/README_HT.md',\n description: '- Configure your own workflow using the template editor.\\n'+\n '- Calculate different molecular properties.\\n'+\n '- Filter molecules using different criteria.\\n'+\n '- Submit processed dataframe to the function of your choice.\\n'+\n '- Save campaigns and continue any time from where you left off.\\n ',\n });\n\n const campaignAccordionDiv = ui.div();\n const templatesDiv = ui.div([], {classes: 'ui-form'});\n\n const campaignsTable = await this.getCampaignsTable();\n\n await this.startNewCampaign(campaignAccordionDiv, templatesDiv, presetTemplate);\n $(this.root).empty();\n this.root.appendChild(ui.div([\n ui.divV([appHeader, continueCampaignsHeader], {style: {marginLeft: '10px'}}),\n campaignsTable,\n createNewCampaignHeader,\n templatesDiv,\n campaignAccordionDiv,\n ]));\n this.app.resetBaseUrl();\n } catch (e) {\n ui.setUpdateIndicator(this.root, false);\n throw e;\n } finally {\n ui.setUpdateIndicator(this.root, false);\n }\n }\n\n private async startNewCampaign(\n containerDiv: HTMLElement, templateInputDiv: HTMLElement, presetTemplate?: HitTriageTemplate,\n ) {\n const templates = (await _package.files.list('Hit Triage/templates')).map((file) => file.name.slice(0, -5));\n // if the template is just created and saved, it may not be in the list of templates\n if (presetTemplate && !templates.includes(presetTemplate.name))\n templates.push(presetTemplate.name);\n\n const onTemmplateChange = async () => {\n const templateName = templatesInput.value;\n const template: HitTriageTemplate = presetTemplate && presetTemplate.name === templateName ? presetTemplate :\n JSON.parse(await _package.files.readAsText('Hit Triage/templates/' + templateName + '.json'));\n const newCampaignAccordeon = await this.getNewCampaignAccordeon(template, containerDiv);\n $(containerDiv).empty();\n containerDiv.className = 'ui-form';\n containerDiv.appendChild(newCampaignAccordeon);\n };\n\n const templatesInput =\n ui.input.choice(i18n.selectTemplate, {value: presetTemplate?.name ?? templates[0], items: templates,\n onValueChanged: async () => {\n await onTemmplateChange();\n }});\n const createNewtemplateButton = ui.icons.add(async () => {\n ui.setUpdateIndicator(this.root, true);\n await this.createNewTemplate();\n ui.setUpdateIndicator(this.root, false);\n }, i18n.createNewTemplate);\n templatesInput.addOptions(createNewtemplateButton);\n\n await onTemmplateChange();\n $(templateInputDiv).empty();\n templateInputDiv.appendChild(templatesInput.root);\n }\n\n private async checkCampaign(campId?: string) {\n const url = location.search;\n const urlParams = new URLSearchParams(url);\n if (!urlParams.has(CampaignIdKey) && !campId)\n return;\n const campaignId = campId ?? urlParams.get(CampaignIdKey);\n // check if such campaign exists\n if (!await _package.files.exists(`Hit Triage/campaigns/${campaignId}/${CampaignJsonName}`))\n return;\n const campaign: HitTriageCampaign =\n JSON.parse(await _package.files.readAsText(`Hit Triage/campaigns/${campaignId}/${CampaignJsonName}`));\n\n if (campaign) {\n // in case if the link was opened and user has no permissions to view the campaign\n if (campaign.authorUserId && campaign.permissions &&\n !await checkViewPermissions(campaign.authorUserId, campaign.permissions)\n ) {\n this.app.setBaseUrl();\n return;\n }\n this.app.campaign = campaign;\n }\n // Load the template and modify it\n const template: HitTriageTemplate = JSON.parse(\n await _package.files.readAsText(`Hit Triage/templates/${campaign.templateName}.json`),\n );\n // modify the template with path to the campaign's precalculated table\n this.app.setTemplate(template, campaign.filters, campaignId!, campaign.ingest);\n\n if (campId)\n modifyUrl(CampaignIdKey, campId);\n\n return campaign;\n }\n\n private async getCampaignsTable() {\n const campaignNamesMap = await loadCampaigns('Hit Triage', this.deletedCampaigns);\n\n const deleteCampaignIcon = (info: HitTriageCampaign) => {\n const icon = ui.icons.delete(async () => {\n ui.dialog('Delete campaign')\n .add(ui.divText(`Are you sure you want to delete campaign ${info.name}?`))\n .onOK(async () => {\n await this.deleteCampaign('Hit Triage', info.name);\n this.deletedCampaigns.push(info.name);\n await this.init();\n })\n .show();\n }, 'Delete campaign');\n icon.style.display = 'none';\n const authorId = info.authorUserId ?? DG.User.current().id;\n const perms = info.permissions ?? defaultPermissions;\n checkEditPermissions(authorId, perms).then((canEdit) => {\n if (canEdit)\n icon.style.display = 'inline-block';\n });\n return icon;\n };\n\n const campaignsInfo = Object.values(campaignNamesMap);\n const table = ui.table(campaignsInfo, (info) =>\n ([ui.link(info.name, () => this.setCampaign(info.name), '', ''),\n info.createDate, info.rowCount, info.filteredRowCount, info.status,\n deleteCampaignIcon(info),\n ]),\n ['Name', 'Created', 'Total', 'Selected', 'Status', '']);\n table.style.color = 'var(--grey-5)';\n return table;\n }\n\n public async setCampaign(campaignName: string) {\n const campaign = await this.checkCampaign(campaignName);\n this.app.campaign = campaign;\n }\n\n private async getNewCampaignAccordeon(template: HitTriageTemplate, campaignDetailsDiv: HTMLElement) {\n ui.setUpdateIndicator(campaignDetailsDiv, true);\n const {root, promise, cancelPromise} = await newCampaignAccordeon(template, this.dataSourceFunctionsMap);\n ui.setUpdateIndicator(campaignDetailsDiv, false);\n promise.then(async (camp) => {\n this.app.dataFrame = camp.df;\n this.app._fileInputType = camp.type;\n await this.app.setTemplate(template);\n this.app.campaignProps = camp.campaignProps;\n await this.app.saveCampaign(undefined, false);\n if (template.layoutViewState && this.app.campaign)\n this.app.campaign.layout = template.layoutViewState;\n });\n\n cancelPromise.then(() => {\n this.init();\n });\n return root;\n }\n\n private async createNewTemplate() {\n const newTemplateAccordeon = await createTemplateAccordeon(this.app, this.dataSourceFunctionsMap);\n\n const newView = new DG.ViewBase();\n const curView = grok.shell.v;\n newView.name = 'New Template';\n newView.root.appendChild(newTemplateAccordeon.root);\n newView.parentCall = this.app.parentCall;\n grok.shell.addView(newView);\n newView.path = new URL(this.app.baseUrl).pathname + '/new-template';\n newView.parentView = curView;\n const {sub} = addBreadCrumbsToRibbons(grok.shell.v, 'Hit Triage', i18n.createNewTemplate, () => {\n grok.shell.v = curView;\n newView.close();\n });\n\n newTemplateAccordeon.template.then(async (t) => {\n await this.init(t);\n newView.close();\n popRibbonPannels(newView);\n grok.shell.v = curView;\n sub.unsubscribe();\n });\n newTemplateAccordeon.cancelPromise.then(() => {\n sub.unsubscribe();\n newView.close();\n grok.shell.v = curView;\n });\n }\n};\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport {_package} from '../../package';\nimport {CampaignFieldTypes, HitTriageTemplate, IngestType} from '../types';\nimport * as C from '../consts';\nimport '../../../css/hit-triage.css';\n\ntype INewCampaignResult = {\n df: DG.DataFrame,\n type: IngestType,\n campaignProps: {[key: string]: any}\n}\n\ntype HitTriageCampaignAccordeon = {\n promise: Promise<INewCampaignResult>,\n root: HTMLElement,\n cancelPromise: Promise<void>\n}\n/** Creates a new campaign accordeon\n * @param {HitTriageTemplate}template template for the campaign. it contains file source type and\n * additional campaign fields\n * @return {HitTriageCampaignAccordeon} Object containing root element, promise for the campaign result and cancel\n */\nexport async function newCampaignAccordeon(template: HitTriageTemplate,\n dataSourceFunctionsMap: {[key: string]: DG.Func | DG.DataQuery}): Promise<HitTriageCampaignAccordeon> {\n const errorDiv = ui.divText('', {style: {color: 'red'}});\n // handling file input\n let fileDf: DG.DataFrame | null = null;\n const onFileChange = async () => {\n try {\n fileDf = dfInput.value;\n if (!fileDf)\n return;\n await fileDf.meta.detectSemanticTypes();\n const molcol = fileDf.columns.bySemType(DG.SEMTYPE.MOLECULE);\n if (!molcol) {\n errorDiv.innerText = 'No molecules column found';\n return;\n }\n\n errorDiv.innerText = '';\n } catch (e) {\n errorDiv.innerText = 'Error parsing file';\n }\n };\n\n const dfInput = ui.input.table('Dataframe', {onValueChanged: onFileChange});\n await onFileChange();\n const fileInputDiv = ui.div([dfInput, errorDiv]);\n if (Object.keys(dataSourceFunctionsMap).length === 0) {\n // functions that have special tag and are applicable for data source. they should return a dataframe with molecules\n const dataSourceFunctions = DG.Func.find({tags: [C.HitTriageDataSourceTag]});\n // for display purposes we use friendly name of the function\n dataSourceFunctions.forEach((func) => {\n dataSourceFunctionsMap[func.friendlyName ?? func.name] = func;\n });\n }\n let funcCall: DG.FuncCall | null = null;\n // each data source function can have some parameters like for example number of rows to return\n // whenever user selects a function we create a FuncCall object and get an editor for it\n const onDataFunctionChange = async () => {\n const func = dataSourceFunctionsMap[dataSourceFunctionInput.value!];\n funcCall = func.prepare();\n const editor = await funcCall.getEditor();\n editor.classList.remove('ui-form');\n funcEditorDiv.innerHTML = '';\n funcEditorDiv.appendChild(editor);\n };\n const funcEditorDiv = ui.div([]);\n const dataSourceFunctionInput = ui.input.choice(\n C.i18n.dataSourceFunction, {value: template.queryFunctionName ?? Object.keys(dataSourceFunctionsMap)[0],\n items: Object.keys(dataSourceFunctionsMap), onValueChanged: onDataFunctionChange});\n // call the onchange function to create an editor for the first function\n await onDataFunctionChange();\n if (template.queryFunctionName)\n dataSourceFunctionInput.root.getElementsByTagName('select').item(0)?.setAttribute('disabled', 'true');\n const functionInputDiv = ui.div([dataSourceFunctionInput, funcEditorDiv]);\n // if the file source is selected as 'File', no other inputs are needed so we hide the function editor\n functionInputDiv.style.display = 'none';\n const dataInputsDiv = ui.div([fileInputDiv, functionInputDiv]);\n\n // campaign properties. each template might have number of additional fields that should\n // be filled by user for the campaign. they are cast into DG.Property objects and displayed as a form\n const campaignProps = template.campaignFields\n .map((field) => field.type === DG.SEMTYPE.MOLECULE ?\n ({...field, type: 'String', semtype: DG.SEMTYPE.MOLECULE}) : field)\n .map((field) =>\n DG.Property.fromOptions(\n {name: field.name, type: CampaignFieldTypes[field.type as keyof typeof CampaignFieldTypes],\n nullable: !field.required, ...(field.semtype ? {semType: field.semtype} : {})}));\n const campaignPropsObject: {[key: string]: any} = {};\n const campaignPropsForm = campaignProps.length ? ui.input.form(campaignPropsObject, campaignProps) : ui.div();\n campaignPropsForm.classList.remove('ui-form');\n // displaying function editor or file input depending on the data source type\n if (template.dataSourceType === 'File') {\n fileInputDiv.style.display = 'inherit';\n functionInputDiv.style.display = 'none';\n } else {\n fileInputDiv.style.display = 'none';\n functionInputDiv.style.display = 'inherit';\n }\n\n const form = ui.div([\n dataInputsDiv,\n ...(campaignProps.length ? [campaignPropsForm] : [])]);\n const buttonsDiv = ui.buttonsInput([]); // div for create and cancel buttons\n form.appendChild(buttonsDiv);\n const promise = new Promise<INewCampaignResult>((resolve) => {\n const onOkProxy = async () => {\n if (template.dataSourceType === 'File') {\n if (!fileDf) {\n grok.shell.error('No file selected');\n return;\n }\n const df = fileDf;\n df.name = fileDf.name;\n resolve({df, type: 'File', campaignProps: campaignPropsObject});\n } else {\n const func = dataSourceFunctionsMap[dataSourceFunctionInput.value!];\n if (!func) {\n grok.shell.error('No function selected');\n return;\n }\n const funcCallInputs: {[key: string]: any} = {};\n Object.entries(funcCall!.inputs).forEach(([key, value]) => {\n funcCallInputs[key] = value;\n });\n const df: DG.DataFrame = await func.apply(funcCallInputs);\n resolve({df, type: 'Query', campaignProps: campaignPropsObject});\n };\n };\n const startCampaignButton = ui.bigButton(C.i18n.StartCampaign, () => onOkProxy());\n buttonsDiv.appendChild(startCampaignButton);\n });\n\n const cancelPromise = new Promise<void>((resolve) => {\n const _cancelButton = ui.button(C.i18n.cancel, () => resolve());\n //buttonsDiv.appendChild(cancelButton);\n });\n return {promise, root: form, cancelPromise};\n}\n","import * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport {HitTriageApp} from '../hit-triage-app';\nimport {_package} from '../../package';\nimport {HitTriageTemplate} from '../types';\nimport {HitBaseView} from '../base-view';\n\nexport class SubmitView extends HitBaseView<HitTriageTemplate, HitTriageApp> {\n constructor(app: HitTriageApp) {\n super(app);\n this.name = 'Submit';\n }\n\n render(): HTMLDivElement {\n ui.empty(this.root);\n\n const content = ui.divV([\n ui.h1('Summary'),\n ui.div([ui.tableFromMap(this.app.getSummary())]),\n ]);\n return content;\n }\n\n onActivated(): void {\n this.render();\n }\n\n public async submit(): Promise<any> {\n const submitParams= this.app.template?.submit;\n if (!submitParams)\n return;\n const submitFn = DG.Func.find({name: submitParams.fName, package: submitParams.package})[0];\n if (!submitFn) {\n grok.shell.error(`Function ${submitParams.fName} not found.`);\n return;\n }\n const filteredDf = DG.DataFrame.fromCsv(this.app.dataFrame!.toCsv({filteredRowsOnly: true}));\n await submitFn.apply({df: filteredDf, molecules: this.app.molColName});\n this.app.campaign && (this.app.campaign.status = 'Submitted');\n this.app.saveCampaign('Submitted');\n grok.shell.info('Submitted successfully.');\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {_package} from '../package';\nimport {AppName, ComputeFunctions, HitDesignCampaign, HitTriageCampaign} from './types';\nimport {funcTypeNames, HitTriageComputeFunctionTag} from './consts';\nimport {checkEditPermissions} from './utils';\n\nexport abstract class HitAppBase<T> {\n public dataFrame?: DG.DataFrame;\n public template?: T;\n public baseUrl!: string;\n public computeFunctions: Promise<ComputeFunctions>;\n protected isJoining = false;\n protected hasEditPermission = false;\n private _appName: AppName;\n public get appName(): AppName {return this._appName;}\n // public layouts: Promise<DG.ViewLayout[]>;\n constructor(public parentCall: DG.FuncCall, appN: AppName) {\n this._appName = appN;\n this.resetBaseUrl();\n this.computeFunctions = new Promise<ComputeFunctions>(async (resolve) => {\n const funcs = DG.Func.find({tags: [HitTriageComputeFunctionTag]});\n const functions = funcs.filter((f) => f.type === funcTypeNames.function);\n const scripts = funcs.filter((f) => f.type === funcTypeNames.script) as DG.Script[];\n const queries = funcs.filter((f) => f.type === funcTypeNames.query) as DG.DataQuery[];\n resolve({functions, scripts, queries});\n });\n\n // this.layouts = new Promise<DG.ViewLayout[]>(async (resolve) => {\n // // we need all layouts, as applicable ones might not be enaugh\n // const layouts = await grok.dapi.layouts.list();\n // resolve(layouts);\n // });\n }\n\n protected async setCanEdit(campaign: HitTriageCampaign | HitDesignCampaign) {\n if (!campaign.authorUserId || !campaign.permissions) {\n this.hasEditPermission = true; // if there is no author, then it is a new campaign\n return;\n }\n this.hasEditPermission = await checkEditPermissions(campaign.authorUserId, campaign.permissions);\n }\n\n public resetBaseUrl() {\n const href = window.location.href;\n const urlObj = new URL(href);\n this.baseUrl = urlObj.origin + urlObj.pathname;\n }\n\n protected getFilterType(colName: string): DG.FILTER_TYPE {\n const col = this.dataFrame!.col(colName);\n if (col?.semType === DG.SEMTYPE.MOLECULE)\n return DG.FILTER_TYPE.SUBSTRUCTURE;\n if (col?.type === DG.COLUMN_TYPE.BOOL)\n return DG.FILTER_TYPE.BOOL_COLUMNS;\n if (col?.type === DG.COLUMN_TYPE.STRING)\n return DG.FILTER_TYPE.CATEGORICAL;\n return DG.FILTER_TYPE.HISTOGRAM;\n }\n\n public download(df: DG.DataFrame, name: string, onlyFiltered = false): void {\n const element = document.createElement('a');\n const result = DG.DataFrame.fromColumns(df.columns.toList().filter((c) => !c.name.startsWith('~')))\n .toCsv({filteredRowsOnly: onlyFiltered});\n element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(result));\n element.setAttribute('download', name + '.csv');\n element.click();\n }\n\n public async getNewCampaignName(folderName: string, templateKey: string) {\n const templateCampaigns = (await _package.files.list(folderName))\n .map((file) => file.name)\n .filter((name) => name.startsWith(templateKey));\n if (templateCampaigns.length === 0)\n return templateKey + '-1';\n const postFixes = templateCampaigns.map((c) => c.split('-')[1]).filter(Boolean).map((c) => parseInt(c, 10)).sort();\n return templateKey + '-' + ((postFixes[postFixes.length - 1] + 1).toString());\n }\n\n public setBaseUrl() {\n const title = document.title;\n if (history.replaceState) {\n const obj = {\n Title: title,\n Url: this.baseUrl,\n };\n history.replaceState(obj, obj.Title, obj.Url);\n }\n }\n\n /// creates a union of two dataframes based on a molecule column and adds to second dataframe\n protected unionDataframes(df1: DG.DataFrame, df2: DG.DataFrame, molColName: string) {\n const df1MolCol: string[] | undefined = df1.col(molColName)?.toList()?.filter((it) => !!it)\n .map((it) => DG.chem.convert(it, DG.chem.Notation.Unknown, DG.chem.Notation.Smiles));\n const df2MolCol: string[] | undefined = df2.col(molColName)?.toList()?.filter((it) => !!it)\n .map((it) => DG.chem.convert(it, DG.chem.Notation.Unknown, DG.chem.Notation.Smiles));\n if (!df1MolCol || !df2MolCol)\n throw new Error('Molecule column not found');\n this.isJoining = true;\n try {\n // first check that all columns are there\n for (const col of df1.columns) {\n if (!df2.columns.contains(col.name))\n df2.columns.addNew(col.name, col.type);\n }\n for (let i = 0; i < df1MolCol.length; i++) {\n if (!df2MolCol.includes(df1MolCol[i])) {\n df2.rows.addNew(null, true);\n for (const col of df1.columns) {\n const value = col.get(i);\n df2.col(col.name)?.set(df2.rowCount - 1, value, false);\n }\n }\n }\n } finally {\n setTimeout(() => {\n this.isJoining = false;\n }, 500);\n }\n return df2;\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {HitTriageTemplateFunction, HitTriageTemplateScript, IComputeDialogResult} from '../types';\nimport {funcTypeNames, HitDesignMolColName, ViDColFormat} from '../consts';\nimport {joinQueryResults} from '../utils';\n\nexport async function calculateSingleCellValues(\n value: string, descriptors: string[], functions: HitTriageTemplateFunction[], scripts: HitTriageTemplateScript[] = [],\n queries: HitTriageTemplateScript[] = [],\n): Promise<DG.DataFrame> {\n const pg = DG.TaskBarProgressIndicator.create('Calculating ...');\n // TODO: this converts value to canonical one. We need to do it in a better way\n const canonicalSmiles = grok.chem.convert(value, grok.chem.Notation.Unknown, grok.chem.Notation.Smiles);\n const col = DG.Column.fromStrings(HitDesignMolColName, [canonicalSmiles]);\n const table = DG.DataFrame.fromColumns([col]);\n table.name = 'HD Single cell values';\n await table.meta.detectSemanticTypes();\n\n try {\n if (descriptors.length)\n await grok.chem.descriptors(table, col.name, descriptors);\n } catch (e) {\n console.error('Descriptors calculation error', e);\n }\n for (const func of functions) {\n try {\n const props = func.args;\n const fs = DG.Func.find({package: func.package, name: func.name});\n if (!fs.length || !fs[0]) {\n console.warn(`Function ${func.name} from package ${func.package} is not found`);\n continue;\n }\n const f = fs[0];\n const tablePropName = f.inputs[0].name;\n const colPropName = f.inputs[1].name;\n await f.apply({...props, [tablePropName]: table, [colPropName]: col.name});\n } catch (e) {\n console.error(e);\n continue;\n }\n }\n\n for (const script of scripts) {\n const props = script.args;\n try {\n const scriptFunc = DG.Func.find({name: script.name})\n .filter((s) => s.type === funcTypeNames.script && s.id === script.id)[0] as DG.Script | undefined;\n if (scriptFunc) {\n const tablePropName = scriptFunc.inputs[0].name;\n const colPropName = scriptFunc.inputs[1].name;\n\n const r: DG.DataFrame = await scriptFunc.apply({...props, [tablePropName]: table, [colPropName]: col.name});\n if (r && r.rowCount === table.rowCount && scriptFunc.language === 'python') {\n for (const c of r.columns) {\n c.name = table.columns.getUnusedName(c.name);\n table.columns.add(c);\n }\n }\n }\n } catch (e) {\n console.error(e);\n }\n }\n\n for (const query of queries) {\n const props = query.args;\n try {\n const queryFunc = DG.Func.find({name: query.name})\n .filter((s) => s.type === funcTypeNames.query && s.id === query.id)[0];\n if (queryFunc) {\n const listPropName = queryFunc.inputs[0].name;\n const valueList = [canonicalSmiles];\n const qRes = await queryFunc.apply({...props, [listPropName]: valueList});\n if (!qRes || qRes.rowCount === 0)\n continue;\n await joinQueryResults(table, HitDesignMolColName, qRes);\n }\n } catch (e) {\n console.error(e);\n }\n }\n pg.close();\n return table;\n};\n\nexport function getNewVid(vidCol: DG.Column<any>) {\n let maxId = 0;\n if (vidCol.length > 1) {\n for (const vid of vidCol.toList()) {\n if (!vid || !vid.startsWith(ViDColFormat[0]) || vid.length !== ViDColFormat.length)\n continue;\n const num = parseInt(vid.substring(1));\n if (isNaN(num))\n continue;\n maxId = Math.max(num, maxId);\n };\n }\n\n return `V${''.concat(...new Array(ViDColFormat.length - 1 - (maxId +1).toString().length).fill('0'))}${maxId + 1}`;\n}\n\nexport async function calculateColumns(resultMap: IComputeDialogResult, dataFrame: DG.DataFrame, molColName: string) {\n const pg = DG.TaskBarProgressIndicator.create('Calculating ...');\n // first step: convert all values to canonical smiles.\n const molCol = dataFrame.col(molColName);\n if (!molCol)\n throw new Error('There is no molecule column in dataframe');\n for (let i = 0; i < molCol.length; i++) {\n if (molCol.isNone(i))\n continue;\n const value: string | null = molCol.get(i);\n if (!value)\n continue;\n const newVal = grok.chem.convert(value, grok.chem.Notation.Unknown, grok.chem.Notation.Smiles);\n molCol.set(i, newVal, false);\n }\n try {\n if (resultMap.descriptors && resultMap.descriptors.length > 0)\n await grok.chem.descriptors(dataFrame!, molColName!, resultMap.descriptors);\n } catch (e) {\n console.error('Descriptors calculation error', e);\n }\n\n for (const funcName of Object.keys(resultMap.externals)) {\n try {\n const props = resultMap.externals[funcName];\n const f = DG.Func.find({package: funcName.split(':')[0], name: funcName.split(':')[1]})[0];\n const tablePropName = f.inputs[0].name;\n const colPropName = f.inputs[1].name;\n if (props)\n await f.apply({...props, [tablePropName]: dataFrame!, [colPropName]: molColName});\n } catch (e) {\n console.error(e);\n }\n };\n // handling scripts\n for (const scriptName of Object.keys(resultMap.scripts ?? {})) {\n const props = resultMap.scripts![scriptName];\n if (props) {\n const scriptParts = scriptName.split(':');\n const scriptId = scriptParts[2];\n if (!scriptId)\n continue;\n try {\n const sn = scriptParts[1]; // script name\n const s = DG.Func.find({name: sn})\n .filter((s) => s.type === funcTypeNames.script && s.id === scriptId)[0] as DG.Script | undefined;\n if (!s)\n continue;\n const tablePropName = s.inputs[0].name;\n const colPropName = s.inputs[1].name;\n const r: DG.DataFrame = await s.apply({...props, [tablePropName]: dataFrame, [colPropName]: molColName});\n if (r && r.rowCount === dataFrame.rowCount && s.language === 'python') {\n for (const c of r.columns) {\n c.name = dataFrame.columns.getUnusedName(c.name);\n dataFrame.columns.add(c);\n }\n }\n } catch (e) {\n console.error(e);\n }\n }\n };\n\n // handling queries\n for (const queryName of Object.keys(resultMap.queries ?? {})) {\n const props = resultMap.queries![queryName];\n if (props) {\n const queryParts = queryName.split(':');\n const queryId = queryParts[2];\n if (!queryId)\n continue;\n try {\n const qn = queryParts[1]; // query name\n const s = DG.Func.find({name: qn})\n .filter((s) => s.type === funcTypeNames.query && s.id === queryId)[0];\n if (!s)\n continue;\n const listPropName = s.inputs[0].name;\n const molList = dataFrame!.col(molColName!)!.toList();\n const resDf: DG.DataFrame = await s.apply({...props, [listPropName]: molList});\n if (resDf)\n await joinQueryResults(dataFrame!, molColName!, resDf);\n } catch (e) {\n console.error(e);\n }\n }\n };\n pg.close();\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {HitTriageCampaign, IFunctionArgs,\n HitTriageTemplate, HitTriageTemplateIngest, IngestType, HitTriageCampaignStatus,\n HitDesignTemplate} from './types';\nimport {InfoView} from './hit-triage-views/info-view';\nimport {SubmitView} from './hit-triage-views/submit-view';\nimport {CampaignIdKey, CampaignJsonName, CampaignTableName,\n HTQueryPrefix, HTScriptPrefix, HitSelectionColName, i18n} from './consts';\nimport {addBreadCrumbsToRibbons, checkRibbonsHaveSubmit, modifyUrl, toFormatedDateString} from './utils';\nimport {_package} from '../package';\nimport '../../css/hit-triage.css';\nimport {chemFunctionsDialog} from './dialogs/functions-dialog';\nimport {HitAppBase} from './hit-app-base';\nimport {HitBaseView} from './base-view';\nimport {saveCampaignDialog} from './dialogs/save-campaign-dialog';\nimport {calculateColumns} from './utils/calculate-single-cell';\nimport {defaultPermissions, PermissionsDialog} from './dialogs/permissions-dialog';\n\nexport class HitTriageApp extends HitAppBase<HitTriageTemplate> {\n multiView: DG.MultiView;\n\n private _infoView: InfoView;\n get infoView(): InfoView {return this._infoView;}\n private _pickView?: DG.TableView;\n private _submitView?: SubmitView;\n\n private _filterViewName = 'Hit triage | Pick';\n private _campaignFilters?: {[key: string]: any}[];\n private _campaignId?: string;\n private _dfName?: string;\n private _molColName?: string;\n public _fileInputType?: IngestType;\n\n private _campaign?: HitTriageCampaign;\n protected _filterDescriptions: string[] = [];\n public campaignProps: {[key: string]: any} = {};\n private currentPickViewId?: string;\n private _pickViewPromise?: Promise<void> | null = null;\n\n constructor(c: DG.FuncCall) {\n super(c, 'Hit Triage');\n this._infoView = new InfoView(this);\n this.multiView = new DG.MultiView({viewFactories: {[this._infoView.name]: () => this._infoView}});\n this.multiView.tabs.onTabChanged.subscribe((_) => {\n if (this.multiView.currentView instanceof HitBaseView)\n (this.multiView.currentView as HitBaseView<HitTriageTemplate, HitTriageApp>).onActivated();\n });\n this.multiView.parentCall = c;\n //grok.shell.addView(this.multiView);\n\n grok.events.onCurrentViewChanged.subscribe(() => {\n try {\n if (grok.shell.v?.name === this.currentPickViewId) {\n grok.shell.windows.showHelp = false;\n this.setBaseUrl();\n modifyUrl(CampaignIdKey, this._campaignId ?? this._campaign?.name ?? '');\n }\n } catch (e) {\n console.error(e);\n }\n });\n }\n\n public async setTemplate(template: HitTriageTemplate, presetFilters?: {[key: string]: any}[],\n campaignId?: string, ingestProps?: HitTriageTemplateIngest) {\n this._pickView?.dataFrame && grok.shell.closeTable(this._pickView?.dataFrame);\n this._pickView = undefined;\n if (!campaignId) {\n campaignId = await this.getNewCampaignName('Hit Triage/campaigns', template.key);\n modifyUrl(CampaignIdKey, campaignId);\n } else if (ingestProps) {\n this._fileInputType = ingestProps.type;\n if (ingestProps.type === 'File')\n this.dataFrame = await grok.dapi.files.readCsv(ingestProps.query);\n else\n this.dataFrame = await grok.functions.call(ingestProps.query);\n }\n if (!this.dataFrame) {\n console.error('Dataframe is empty.');\n return;\n }\n if (this._campaign?.columnSemTypes) {\n Object.entries(this._campaign.columnSemTypes).forEach(([colName, semtype]) => {\n const col = this.dataFrame!.columns.byName(colName);\n if (col && col.semType !== semtype)\n col.semType = semtype;\n });\n };\n if (this._campaign?.columnTypes) {\n Object.entries(this._campaign.columnTypes).forEach(([colName, type]) => {\n const col = this.dataFrame!.columns.byName(colName);\n if (col && col.type !== type)\n try {col.convertTo(type);} catch (e) {console.error(e);}\n });\n }\n await this.dataFrame.meta.detectSemanticTypes();\n this._molColName = this.dataFrame.columns.bySemType(DG.SEMTYPE.MOLECULE)?.name ?? undefined;\n this._dfName = this.dataFrame.name ?? ingestProps?.query;\n this.dataFrame.name = this._dfName ?? this.dataFrame.name ?? 'Molecules';\n this._campaignId = campaignId;\n this.template = this.campaign?.template ?\n {...this.campaign.template, dataSourceType: template.dataSourceType,\n queryFunctionName: template.queryFunctionName} : template;\n this._campaignFilters = presetFilters;\n\n if (!presetFilters) {\n const funcs: {[_: string]: IFunctionArgs} = {};\n const scripts: {[_: string]: IFunctionArgs} = {};\n const queries: {[_: string]: IFunctionArgs} = {};\n template.compute.functions.forEach((func) => {\n const fName = `${func.package}:${func.name}`;\n funcs[fName] = func.args;\n });\n template.compute.scripts?.forEach((script) => {\n const fName = `${HTScriptPrefix}:${script.name}:${script.id}`;\n scripts[fName] = script.args;\n });\n template.compute.queries?.forEach((query) => {\n const fName = `${HTQueryPrefix}:${query.name}:${query.id}`;\n queries[fName] = query.args;\n });\n\n await calculateColumns({\n descriptors: template.compute.descriptors.enabled ? template.compute.descriptors.args : [],\n externals: funcs, scripts, queries,\n }, this.dataFrame!, this._molColName!);\n };\n\n if (this.campaign)\n await this.setCanEdit(this.campaign);\n else\n this.hasEditPermission = true; // if the campaign is new, obviously the user can edit it\n\n const curView = grok.shell.v;\n const pickV = grok.shell.addView(this.pickView);\n this.currentPickViewId = pickV.name;\n this._submitView = new SubmitView(this);\n this.setBaseUrl();\n modifyUrl(CampaignIdKey, this._campaignId ?? this._campaign?.name ?? '');\n\n const newView = pickV;\n\n setTimeout(() => {\n this._pickViewPromise && this._pickViewPromise.then(() => {\n const {sub} = addBreadCrumbsToRibbons(newView, 'Hit Triage', 'Pick', () => {\n grok.shell.v = curView;\n newView.close();\n sub.unsubscribe();\n });\n });\n }, 300);\n // this.multiView.addView(this._submitView.name, () => this._submitView!, false);\n grok.shell.windows.showHelp = false;\n }\n\n get filterSettings(): {[key: string]: any}[] | undefined {return this._campaignFilters;}\n\n get campaignId(): string | undefined {return this._campaignId;}\n\n get pickView(): DG.TableView {return this._pickView = this.getFilterView();}\n\n get molColName() {return this._molColName ??= this.dataFrame?.columns.bySemType(DG.SEMTYPE.MOLECULE)?.name;}\n\n get fileInputType(): IngestType | undefined {return this._fileInputType;}\n\n get campaign(): HitTriageCampaign | undefined {return this._campaign;}\n\n set campaign(campaign: HitTriageCampaign | undefined) {this._campaign = campaign;}\n\n /**\n * A view that lets you filter the molecules using either molecules, or\n * their properties derived at the enrichment step.\n * @return {DG.TableView}\n * */\n getFilterView(): DG.TableView {\n let resolvePromise: Function | null = null;\n this._pickViewPromise = new Promise<void>((res) => {resolvePromise = res;});\n const getComputeDialog = async () => {\n chemFunctionsDialog(this, async (resultMap) => {\n const oldDescriptors = this.template!.compute.descriptors.args;\n const oldFunctions = this.template!.compute.functions;\n const oldScripts = this.template!.compute.scripts ?? [];\n const oldQueries = this.template!.compute.queries ?? [];\n const newDescriptors = resultMap.descriptors;\n const newComputeObj = {\n descriptors: {\n enabled: !!resultMap?.descriptors?.length,\n args: resultMap?.descriptors ?? [],\n },\n functions: Object.entries(resultMap?.externals ?? {}).map(([funcName, args]) => {\n const splitFunc = funcName.split(':');\n return ({\n name: splitFunc[1],\n package: splitFunc[0],\n args: args,\n });\n }),\n scripts: Object.entries(resultMap?.scripts ?? {})\n .filter(([name, _]) => name.startsWith(HTScriptPrefix) && name.split(':').length === 3)\n .map(([scriptId, args]) => {\n const scriptNameParts = scriptId.split(':');\n return ({\n name: scriptNameParts[1] ?? '',\n id: scriptNameParts[2] ?? '',\n args: args,\n });\n }),\n queries: Object.entries(resultMap?.queries ?? {})\n .filter(([name, _]) => name.startsWith(HTQueryPrefix) && name.split(':').length === 3)\n .map(([scriptId, args]) => {\n const scriptNameParts = scriptId.split(':');\n return ({\n name: scriptNameParts[1] ?? '',\n id: scriptNameParts[2] ?? '',\n args: args,\n });\n }),\n };\n this.template!.compute = newComputeObj;\n const uncalculatedDescriptors = newDescriptors.filter((d) => !oldDescriptors.includes(d));\n const uncalculatedFunctions = newComputeObj.functions.filter((func) => {\n if (!oldFunctions.some((f) => f.name === func.name && f.package === func.package))\n return true;\n const oldFunc = oldFunctions.find((f) => f.name === func.name && f.package === func.package)!;\n return !Object.entries(func.args).every(([key, value]) => oldFunc.args[key] === value);\n });\n const uncalculatedScripts = newComputeObj.scripts.filter((func) => {\n if (!oldScripts.some((f) => f.id === func.id ))\n return true;\n const oldScript = oldScripts.find((f) => f.id === func.id)!;\n return !Object.entries(func.args).every(([key, value]) => oldScript.args[key] === value);\n });\n const uncalculatedQueries = newComputeObj.queries.filter((query) => {\n if (!oldQueries.some((f) => f.id === query.id))\n return true;\n const oldQuery = oldQueries.find((f) => f.id === query.id)!;\n return !Object.entries(query.args).every(([key, value]) => oldQuery.args[key] === value);\n });\n\n const externalFuncs: {[_: string]: IFunctionArgs} = {};\n uncalculatedFunctions.forEach((func) => {\n const fName = `${func.package}:${func.name}`;\n externalFuncs[fName] = func.args;\n });\n const externalScripts: {[_: string]: IFunctionArgs} = {};\n uncalculatedScripts.forEach((script) => {\n const fName = `${HTScriptPrefix}:${script.name}:${script.id}`;\n externalScripts[fName] = script.args;\n });\n const externalQueries: {[_: string]: IFunctionArgs} = {};\n uncalculatedQueries.forEach((query) => {\n const fName = `${HTQueryPrefix}:${query.name}:${query.id}`;\n externalQueries[fName] = query.args;\n });\n await calculateColumns(\n {descriptors: uncalculatedDescriptors, externals: externalFuncs,\n scripts: externalScripts, queries: externalQueries},\n this.dataFrame!, this._molColName!);\n this.saveCampaign('In Progress', false);\n }, () => null, this.template!, true);\n };\n if (!this.dataFrame!.col(HitSelectionColName))\n this.dataFrame!.columns.addNewBool(HitSelectionColName).init(false);\n\n const view = DG.TableView.create(this.dataFrame!, false);\n const ribbons = view.getRibbonPanels();\n const calculateRibbon = ui.iconFA('wrench', getComputeDialog, 'Calculate additional properties');\n const submitButton = ui.bigButton('Submit', () => {\n const dialogContent = this._submitView?.render();\n if (dialogContent) {\n const dlg = ui.dialog('Submit');\n dlg.add(dialogContent);\n dlg.addButton('Save', ()=>{this.saveCampaign(); dlg.close();});\n dlg.addButton('Submit', ()=>{this._submitView?.submit(); dlg.close();});\n dlg.show();\n }\n });\n const permissionsButton = ui.iconFA('share', async () => {\n await (new PermissionsDialog(this.campaign?.permissions)).show((res) => {\n this.campaign!.permissions = res;\n this.saveCampaign(undefined, true);\n });\n }, 'Edit permissions');\n submitButton.classList.add('hit-design-submit-button');\n const hasSubmit = checkRibbonsHaveSubmit(ribbons);\n ribbons.push([\n calculateRibbon,\n ...(this.hasEditPermission ? [permissionsButton] : []),\n ...(hasSubmit ? [] : [submitButton])]);\n view.setRibbonPanels(ribbons);\n view.name = this._filterViewName;\n setTimeout(async () => {\n view._onAdded();\n await new Promise((r) => setTimeout(r, 1000));\n\n const f = view.filters(this._campaignFilters ? {filters: this._campaignFilters} : undefined);\n const layoutViewState = this._campaign?.layout ?? this.template?.layoutViewState;\n if (layoutViewState) {\n try {\n const layout = DG.ViewLayout.fromViewState(layoutViewState);\n view.loadLayout(layout);\n } catch (e) {\n console.error(e);\n }\n }\n view.dataFrame.onFilterChanged\n .subscribe((_) => {\n this._filterDescriptions = Array.from(view.dataFrame.rows.filters);\n this._campaignFilters = f.getOptions().look.filters;\n });\n setTimeout(() => {\n this._filterDescriptions = Array.from(view.dataFrame.rows.filters);\n this._campaignFilters = f.getOptions().look.filters;\n }, 300);\n resolvePromise && resolvePromise();\n }, 300);\n view.parentCall = this.parentCall;\n return view;\n }\n\n getSummary(): {[_: string]: any} {\n const campaignProps = this.campaign?.campaignFields ?? this.campaignProps;\n return {\n 'Template': this.template?.name ?? 'Molecules',\n 'File path': ui.divH([ui.link(this._dfName ?? '-', () => this.download(this.dataFrame!, 'molecules'),\n i18n.download)],\n {style: {alignItems: 'center'}}),\n ...campaignProps,\n 'Number of molecules': this.dataFrame!.rowCount.toString(),\n 'Enrichment methods': [this.template!.compute.descriptors.enabled ? 'descriptors' : '',\n ...this.template!.compute.functions.map((func) => func.name)].filter((f) => f && f.trim() !== '').join(', '),\n 'Filters': this._filterDescriptions.join(', '),\n 'Result Molecules': ui.divH([ui.link(this.dataFrame?.filter.trueCount.toString() ?? '0', () => {\n this.download(this.dataFrame!, 'hits', true);\n }, i18n.download)], {style: {alignItems: 'center'}}),\n };\n }\n\n async saveCampaign(status?: HitTriageCampaignStatus, notify = true): Promise<any> {\n const campaignId = this.campaignId!;\n const filters = this.filterSettings!;\n const templateName = this.template!.name;\n const enrichedDf = this.dataFrame!;\n const campaignPrefix = `System:AppData/HitTriage/Hit Triage/campaigns/${campaignId}/`;\n const campaignName = campaignId ?? await saveCampaignDialog(campaignId);\n const columnSemTypes: {[_: string]: string} = {};\n enrichedDf.columns.toList().forEach((col) => columnSemTypes[col.name] = col.semType);\n\n const colTypeMap: {[_: string]: string} = {};\n enrichedDf.columns.toList().forEach((col) => colTypeMap[col.name] = col.type);\n\n // if its first time save author as current user, else keep the same\n const authorUserId = this.campaign?.authorUserId ?? grok.shell.user.id;\n const permissions = this.campaign?.permissions ?? defaultPermissions;\n\n\n const campaign: HitTriageCampaign = {\n name: campaignName,\n templateName,\n filters: filters ?? {},\n ingest: {\n type: 'File',\n query: `${campaignPrefix}${CampaignTableName}`,\n molColName: this.molColName!,\n },\n status: status ?? this.campaign?.status ?? 'In Progress',\n createDate: this.campaign?.createDate ?? toFormatedDateString(new Date()),\n campaignFields: this.campaign?.campaignFields ?? this.campaignProps,\n columnSemTypes,\n rowCount: enrichedDf.rowCount,\n filteredRowCount: enrichedDf.filter.trueCount,\n template: this.template as HitDesignTemplate | undefined,\n columnTypes: colTypeMap,\n authorUserId,\n permissions,\n };\n\n this.campaign = campaign;\n if (!this.hasEditPermission) {\n grok.shell.error('You do not have permission to modify this campaign');\n return campaign;\n }\n const csvDf = DG.DataFrame.fromColumns(\n enrichedDf.columns.toList().filter((col) => !col.name.startsWith('~')),\n ).toCsv();\n await _package.files.writeAsText(`Hit Triage/campaigns/${campaignId}/${CampaignTableName}`, csvDf);\n const newLayout = this._pickView!.saveLayout();\n if (!newLayout)\n grok.shell.warning('Layout cound not be saved');\n else\n campaign.layout = newLayout.viewState;\n await _package.files.writeAsText(`Hit Triage/campaigns/${campaignId}/${CampaignJsonName}`,\n JSON.stringify(campaign));\n notify && grok.shell.info('Campaign saved successfully.');\n return campaign;\n }\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport {_package} from '../../package';\n\nexport async function saveCampaignDialog(id: string): Promise<string> {\n return new Promise<string>(async (resolve) => {\n const campaignNameInput = ui.input.string('Campaign name', {value: ''});\n\n function onOkProxy() {\n if (!campaignNameInput.value || campaignNameInput.value === '')\n resolve(id);\n else\n resolve(campaignNameInput.value);\n }\n ui.dialog('Save Campaign')\n .add(ui.div(campaignNameInput.root))\n .onOK(onOkProxy)\n .show();\n });\n}\n","/* eslint-disable max-len */\nimport * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport {CampaignFieldTypes, HitDesignTemplate} from '../types';\nimport {HitDesignMolColName, PeptiHitHelmColName, TileCategoriesColName, ViDColName, i18n} from '../consts';\nimport '../../../css/hit-triage.css';\nimport {getNewVid} from '../utils/calculate-single-cell';\n\ntype NewHitDesignCampaignRes = {\n df: DG.DataFrame,\n campaignProps: {[key: string]: any}\n}\n\ntype HitDesignCampaignAccordeon = {\n promise: Promise<NewHitDesignCampaignRes>,\n root: HTMLElement,\n cancelPromise: Promise<void>\n}\n\nexport function newHitDesignCampaignAccordeon(template: HitDesignTemplate, peptiHit = false): HitDesignCampaignAccordeon {\n const df = DG.DataFrame.create(1);\n if (peptiHit) {\n const pepCol = df.columns.addNew(PeptiHitHelmColName, DG.TYPE.STRING);\n pepCol.semType = DG.SEMTYPE.MACROMOLECULE;\n pepCol.meta.units = 'helm';\n pepCol.setTag('units', 'helm');\n pepCol.setTag('cell.renderer', 'helm');\n pepCol.setTag('.alphabetIsMultichar', 'true');\n }\n\n const molCol = df.columns.addNew(HitDesignMolColName, DG.TYPE.STRING);\n molCol.semType = DG.SEMTYPE.MOLECULE;\n molCol.meta.units = DG.UNITS.Molecule.SMILES;\n molCol.set(0, null);\n if (template?.stages?.length > 0) {\n const tileCategoryCol = df.columns.addNew(TileCategoriesColName, DG.TYPE.STRING);\n tileCategoryCol.set(0, template.stages[0]);\n }\n const vIdCol = df.columns.addNew(ViDColName, DG.TYPE.STRING);\n vIdCol.set(0, getNewVid(vIdCol));\n\n // campaign properties. each template might have number of additional fields that should\n // be filled by user for the campaign. they are cast into DG.Property objects and displayed as a form\n const campaignProps = template.campaignFields\n .map((field) => field.type === DG.SEMTYPE.MOLECULE ?\n ({...field, type: 'String', semtype: DG.SEMTYPE.MOLECULE}) : field)\n .map((field) =>\n DG.Property.fromOptions(\n {name: field.name, type: CampaignFieldTypes[field.type as keyof typeof CampaignFieldTypes],\n nullable: !field.required, ...(field.semtype ? {semType: field.semtype} : {})}));\n const campaignPropsObject: {[key: string]: any} = {};\n const campaignPropsForm = ui.input.form(campaignPropsObject, campaignProps);\n campaignPropsForm.classList.remove('ui-form');\n const form = ui.div([\n ...(template.campaignFields?.length > 0 ? []: []),\n campaignPropsForm,\n ]);\n const buttonsDiv = ui.buttonsInput([]); // div for create and cancel buttons\n form.appendChild(buttonsDiv);\n const okPromise = new Promise<NewHitDesignCampaignRes>((resolve) => {\n const startCampaignButton = ui.bigButton(i18n.StartCampaign,\n () => {\n for (const field of template.campaignFields) {\n if (field.required) {\n if (!campaignPropsObject[field.name] || campaignPropsObject[field.name] === '') {\n grok.shell.error(`Field '${field.name}' is required`);\n return;\n }\n }\n }\n resolve({df, campaignProps: campaignPropsObject});\n });\n buttonsDiv.appendChild(startCampaignButton);\n });\n const cancelPromise = new Promise<void>((resolve) => {\n const _cancelButton = ui.button(i18n.cancel, () => resolve());\n //buttonsDiv.appendChild(cancelButton);\n });\n\n return {promise: okPromise, root: form, cancelPromise};\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport {_package} from '../../package';\nimport * as C from '../consts';\nimport '../../../css/hit-triage.css';\nimport {IComputeDialogResult, INewTemplateResult, PeptiHitTemplate} from '../types';\nimport {chemFunctionsDialog} from '../dialogs/functions-dialog';\nimport {getCampaignFieldEditors} from './new-template-accordeon';\nimport {ItemType, ItemsGrid} from '@datagrok-libraries/utils/src/items-grid';\nimport {HitAppBase} from '../hit-app-base';\nimport {getLayoutInput} from './layout-input';\n\nexport async function newHitDesignTemplateAccordeon(app: HitAppBase<any>,\n preset?: PeptiHitTemplate): Promise<INewTemplateResult<PeptiHitTemplate>> {\n const availableTemplates = (await _package.files.list(`${app.appName}/templates`));\n let hasNameError = false;\n let hasKeyError = false;\n // Remove .json from end\n const availableTemplateNames = availableTemplates.map((file) => file.name.slice(0, -5));\n const availableTemplateKeys: string[] = [];\n\n for (const file of availableTemplates) {\n try {\n const t: PeptiHitTemplate = JSON.parse(await _package.files.readAsText(file));\n availableTemplateKeys.push(t.key);\n } catch (e) {\n console.error(e);\n }\n }\n const availableSubmitFunctions = DG.Func.find({tags: [C.HitTriageSubmitTag]});\n const submitFunctionsMap: {[key: string]: DG.Func} = {};\n availableSubmitFunctions.forEach((func) => {\n submitFunctionsMap[func.friendlyName ?? func.name] = func;\n });\n const submitFunctionInput = ui.input.choice('Submit function',\n {value: null, items: [null, ...Object.keys(submitFunctionsMap)]});\n submitFunctionInput.nullable = true;\n submitFunctionInput.value = preset?.submit?.fName ?? null;\n submitFunctionInput.setTooltip('Select function to be called upon submitting');\n const errorDiv = ui.divText('Template name is empty or already exists', {classes: 'hit-triage-error-div'});\n const keyErrorDiv = ui.divText('Template key is empty or already exists', {classes: 'hit-triage-error-div'});\n const layoutInput = getLayoutInput();\n // ######### TEMPLATE NAME INPUT #########\n function onTemplateNameChanged() {\n if (templateNameInput.value === '' || availableTemplateNames.includes(templateNameInput.value?.trim() ?? '')) {\n //templateNameInput.root.style.borderBottom = '1px solid red';\n const marginLeft = templateNameInput.input.offsetLeft ?? 0;\n const width = templateNameInput.input.offsetWidth ?? 0;\n errorDiv.style.marginLeft = `${marginLeft}px`;\n errorDiv.style.width = `${width}px`;\n errorDiv.style.opacity = '100%';\n errorDiv.style.borderTop = '1px solid red';\n hasNameError = true;\n } else {\n //templateNameInput.root.style.borderBottom = 'none';\n errorDiv.style.borderTop = 'none';\n errorDiv.style.opacity = '0%';\n hasNameError = false;\n }\n }\n const templateNameInput = ui.input.string('Name', {value: preset?.name ?? '', onValueChanged: onTemplateNameChanged});\n\n // ######### TEMPLATE KEY INPUT #########\n function onTemplateKeyChange() {\n if (templateKeyInput.value === '' || availableTemplateKeys.includes(templateKeyInput.value?.trim() ?? '')) {\n //templateKeyInput.root.style.borderBottom = '1px solid red';\n const marginLeft = templateKeyInput.input.offsetLeft ?? 0;\n const width = templateKeyInput.input.offsetWidth ?? 0;\n keyErrorDiv.style.marginLeft = `${marginLeft}px`;\n keyErrorDiv.style.width = `${width}px`;\n keyErrorDiv.style.borderTop = '1px solid red';\n keyErrorDiv.style.opacity = '100%';\n hasKeyError = true;\n } else {\n //templateKeyInput.root.style.borderBottom = 'none';\n keyErrorDiv.style.opacity = '0%';\n keyErrorDiv.style.borderTop = 'none';\n hasKeyError = false;\n }\n }\n\n const templateKeyInput = ui.input.string('Key', {value: preset?.key ?? '', onValueChanged: onTemplateKeyChange});\n templateKeyInput.setTooltip('Template key used for campaign prefix');\n templateNameInput.setTooltip('Template name');\n templateNameInput.root.style.borderBottom = 'none';\n templateKeyInput.root.style.borderBottom = 'none';\n errorDiv.style.opacity = '0%';\n keyErrorDiv.style.opacity = '0%';\n\n let funcDialogRes: IComputeDialogResult | null = null;\n // used just for functions editor\n const dummyTemplate = {\n compute: {\n descriptors: {\n enabled: true,\n args: preset?.compute?.descriptors?.args ?? [],\n },\n functions: preset?.compute?.functions ?? [],\n },\n } as unknown as PeptiHitTemplate;\n const funcInput = await chemFunctionsDialog(app, (res) => {funcDialogRes = res;}, () => null,\n dummyTemplate, false);\n funcInput.root.classList.add('hit-triage-new-template-functions-input');\n const fieldsEditor = getCampaignFieldEditors(preset?.campaignFields);\n const tileCategoriesEditor = getTileCategoryEditor(preset?.stages);\n const detailsDiv = ui.divV(\n [ui.divV([templateNameInput, errorDiv]), ui.divV([templateKeyInput, keyErrorDiv]),\n layoutInput.dataFileInput,\n fieldsEditor.fieldsDiv]);\n\n const stagesHeader = ui.h2('Stages');\n ui.tooltip.bind(stagesHeader,\n 'Define Stages for designed molecules. For example, \"Design\", \"Synthesis\", \"Test\", etc.');\n const computeHeader = ui.h2('Compute');\n ui.tooltip.bind(computeHeader,\n 'Define functions to be calculated for each molecule. For example, \"Descriptors\", \"Descriptors:Descriptors\", etc.');\n const form = ui.div(\n [ui.h2('Details'),\n detailsDiv,\n stagesHeader,\n tileCategoriesEditor.fieldsDiv,\n computeHeader,\n funcInput.root,\n ui.h2('Submit'),\n submitFunctionInput.root,\n ], 'ui-form');\n const buttonsDiv = ui.buttonsInput([]);\n form.appendChild(buttonsDiv);\n const buttonsContainerDiv = buttonsDiv.getElementsByClassName('ui-input-editor')?.[0] ?? buttonsDiv;\n const cancelPromise = new Promise<void>((resolve) => {\n const cancelButton = ui.button(C.i18n.cancel, () => resolve());\n buttonsContainerDiv.appendChild(cancelButton);\n });\n const promise = new Promise<PeptiHitTemplate>((resolve) => {\n async function onOkProxy() {\n onTemplateNameChanged();\n onTemplateKeyChange();\n funcInput.okProxy();\n if (hasNameError || !templateNameInput.value || templateNameInput.value === '') {\n grok.shell.error('Template name is empty or already exists');\n return;\n }\n if (hasKeyError || !templateKeyInput.value || templateKeyInput.value === '') {\n grok.shell.error('Template key is empty or already exists');\n return;\n }\n\n const submitFunction = submitFunctionInput.value ? submitFunctionsMap[submitFunctionInput.value] : undefined;\n const out: PeptiHitTemplate = {\n name: templateNameInput.value,\n key: templateKeyInput.value,\n campaignFields: fieldsEditor.getFields(),\n stages: tileCategoriesEditor.getFields(),\n layoutViewState: layoutInput.getLayoutViewState() ?? undefined,\n compute: {\n descriptors: {\n enabled: !!funcDialogRes?.descriptors?.length,\n args: funcDialogRes?.descriptors ?? [],\n },\n functions: Object.entries(funcDialogRes?.externals ?? {}).map(([funcName, args]) => {\n const splitFunc = funcName.split(':');\n return ({\n name: splitFunc[1],\n package: splitFunc[0],\n args: args,\n });\n }),\n scripts: Object.entries(funcDialogRes?.scripts ?? {})\n .filter(([name, _]) => name.startsWith(C.HTScriptPrefix) && name.split(':').length === 3)\n .map(([scriptId, args]) => {\n const scriptNameParts = scriptId.split(':');\n return ({\n name: scriptNameParts[1] ?? '',\n id: scriptNameParts[2] ?? '',\n args: args,\n });\n }),\n queries: Object.entries(funcDialogRes?.queries ?? {})\n .filter(([name, _]) => name.startsWith(C.HTQueryPrefix) && name.split(':').length === 3)\n .map(([queryName, args]) => {\n const queryNameParts = queryName.split(':');\n return ({\n name: queryNameParts[1] ?? '',\n id: queryNameParts[2] ?? '',\n args: args,\n });\n }),\n },\n ...(submitFunction ? {submit: {fName: submitFunction.name, package: submitFunction.package.name}} : {}),\n };\n saveHitDesignTemplate(out, app.appName);\n grok.shell.info('Template created successfully');\n resolve(out);\n }\n const createTemplateButton = ui.bigButton(C.i18n.createTemplate, () => onOkProxy());\n buttonsContainerDiv.appendChild(createTemplateButton);\n });\n\n return {root: form, template: promise, cancelPromise};\n}\n\nfunction saveHitDesignTemplate(template: PeptiHitTemplate, appName: string) {\n _package.files.writeAsText(`${appName}/templates/${template.name}.json`, JSON.stringify(template));\n}\n\n\nexport function getTileCategoryEditor(preset?: string[]) {\n const props = [DG.Property.fromOptions({name: 'Name', type: DG.TYPE.STRING})];\n const itemsGrid = new ItemsGrid(props,\n preset ? preset.map((i) => ({Name: i})) : undefined, {horizontalInputNames: true});\n let addingItem: ItemType = {};\n function getFieldParams(): string[] {\n const items = itemsGrid.items.filter((f) => f.Name).map((f) => f.Name);\n if (addingItem.Name && addingItem.Name !== '')\n items.push(addingItem.Name);\n return items;\n }\n itemsGrid.onItemAdded.subscribe((_) => {\n addingItem = {};\n });\n itemsGrid.onAddingItemChanged.subscribe((item) => {\n if (item)\n addingItem = item.item;\n });\n\n return {\n getFields: getFieldParams,\n fieldsDiv: itemsGrid.root,\n itemsGrid,\n };\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {u2} from '@datagrok-libraries/utils/src/u2';\nimport {HitDesignApp} from '../hit-design-app';\nimport {_package} from '../../package';\nimport $ from 'cash-dom';\nimport {CampaignJsonName, HitDesignCampaignIdKey, i18n} from '../consts';\nimport {HitDesignCampaign, HitDesignTemplate} from '../types';\nimport {addBreadCrumbsToRibbons, checkEditPermissions,\n checkViewPermissions, loadCampaigns, modifyUrl, popRibbonPannels} from '../utils';\nimport {newHitDesignCampaignAccordeon} from '../accordeons/new-hit-design-campaign-accordeon';\nimport {newHitDesignTemplateAccordeon} from '../accordeons/new-hit-design-template-accordeon';\nimport {HitBaseView} from '../base-view';\nimport {defaultPermissions, PermissionsDialog} from '../dialogs/permissions-dialog';\n\nexport class HitDesignInfoView\n <T extends HitDesignTemplate = HitDesignTemplate, K extends HitDesignApp = HitDesignApp>\n extends HitBaseView<T, K> {\n constructor(app: K) {\n super(app);\n this.name = 'Hit Design';\n grok.shell.windows.showHelp = true;\n grok.shell.windows.help.showHelp(_package.webRoot + 'README_HD.md'); // TODO: Separate readme for Hit Design\n this.checkCampaign().then((c) => {this.app.campaign = c; this.init();});\n }\n\n onActivated(): void {\n grok.shell.windows.showHelp = true;\n grok.shell.windows.help.showHelp(_package.webRoot + 'README_HD.md');\n }\n\n getAppHeader() {\n return u2.appHeader({\n iconPath: _package.webRoot + '/images/icons/hit-design-icon.png',\n learnMoreUrl: 'https://github.com/datagrok-ai/public/blob/master/packages/HitTriage/README_HD.md',\n description:\n '- Configure your own workflow using the template editor\\n' +\n '- Sketch molecules in the molecular spreadsheet\\n' +\n '- Annotate and share ideas with the team\\n' +\n '- Calculate different molecular properties\\n' +\n '- Save campaigns and continue from where you left off\\n' +\n '- Submit final selection to the function of your choice',\n });\n }\n\n async init(presetTemplate?: T) {\n ui.setUpdateIndicator(this.root, true);\n try {\n const continueCampaignsHeader = ui.h1(i18n.continueCampaigns);\n const createNewCampaignHeader = ui.h1(i18n.createNewCampaignHeader, {style: {marginLeft: '10px'}});\n const appHeader = this.getAppHeader();\n\n const campaignAccordionDiv = ui.div();\n const templatesDiv = ui.divH([]);\n const contentDiv = ui.div([templatesDiv, campaignAccordionDiv], 'ui-form');\n\n const campaignsTable = await this.getCampaignsTable();\n $(this.root).empty();\n this.root.appendChild(ui.div([\n ui.divV([appHeader, continueCampaignsHeader], {style: {marginLeft: '10px'}}),\n campaignsTable,\n createNewCampaignHeader,\n contentDiv,\n ]));\n await this.startNewCampaign(campaignAccordionDiv, templatesDiv, presetTemplate);\n this.app.resetBaseUrl();\n } finally {\n ui.setUpdateIndicator(this.root, false);\n }\n }\n\n protected async startNewCampaign(\n containerDiv: HTMLElement, templateInputDiv: HTMLElement, presetTemplate?: T,\n ) {\n const templates = (await _package.files.list(`${this.app.appName}/templates`))\n .filter((file) => file.name.endsWith('.json'))\n .map((file) => file.name.slice(0, -5));\n // if the template is just created and saved, it may not be in the list of templates\n if (presetTemplate && !templates.includes(presetTemplate.name))\n templates.push(presetTemplate.name);\n\n let selectedTemplate: T | null = null;\n let templateChangeFlag = true;\n const onTemmplateChange = async () => {\n if (!templateChangeFlag)\n return;\n const templateName = templatesInput.value;\n const template: T = presetTemplate && presetTemplate.name === templateName ? presetTemplate :\n JSON.parse(await _package.files.readAsText(`${this.app.appName}/templates/${templateName}.json`));\n selectedTemplate = template;\n const newCampaignAccordeon = await this.getNewCampaignAccordeon(template);\n $(containerDiv).empty();\n containerDiv.appendChild(newCampaignAccordeon);\n };\n\n const templatesInput = ui.input.choice('Template', {value: presetTemplate?.name ?? templates[0], items: templates,\n onValueChanged: async () => {\n await onTemmplateChange();\n }});\n templatesInput.root.style.width = '100%';\n const createNewtemplateButton = ui.icons.add(() => {\n this.createNewTemplate();\n }, i18n.createNewTemplate);\n\n const cloneTemplateButton = ui.icons.copy(() => {\n if (selectedTemplate)\n this.createNewTemplate(selectedTemplate);\n }, 'Clone template');\n\n const deleteTempleteButton = ui.icons.delete(() => {\n if (!templatesInput.value || templatesInput.items.length < 2)\n return;\n ui.dialog('Delete template')\n .add(ui.divText(`Are you sure you want to delete template ${templatesInput.value}?`))\n .onOK(async () => {\n try {\n const prevValue = templatesInput.value;\n await _package.files.delete(`${this.app.appName}/templates/${prevValue}.json`);\n templateChangeFlag = false;\n templatesInput.items = templatesInput.items.filter((item) => item !== prevValue);\n templatesInput.value = templatesInput.items[0];\n templateChangeFlag = true;\n await onTemmplateChange();\n grok.shell.info('Template ' + prevValue + ' was deleted successfully');\n } catch (e) {\n templateChangeFlag = true;\n grok.shell.error('Failed to delete template ' + templatesInput.value);\n console.error(e);\n }\n })\n .show();\n }, 'Delete template');\n createNewtemplateButton.style.color = '#2083d5';\n templatesInput.addOptions(deleteTempleteButton);\n templatesInput.addOptions(cloneTemplateButton);\n templatesInput.addOptions(createNewtemplateButton);\n await onTemmplateChange();\n $(templateInputDiv).empty();\n templateInputDiv.appendChild(templatesInput.root);\n }\n\n\n protected async checkCampaign(campId?: string) {\n const url = location.search;\n const urlParams = new URLSearchParams(url);\n if (!urlParams.has(HitDesignCampaignIdKey) && !campId)\n return;\n const campaignId = campId ?? urlParams.get(HitDesignCampaignIdKey);\n // check if such campaign exists\n if (!await _package.files.exists(`${this.app.appName}/campaigns/${campaignId}/${CampaignJsonName}`))\n return;\n const campaign: HitDesignCampaign =\n JSON.parse(await _package.files.readAsText(`${this.app.appName}/campaigns/${campaignId}/${CampaignJsonName}`));\n if (campaign) {\n // in case if the link was opened and user has no permissions to view the campaign\n if (campaign.authorUserId && campaign.permissions &&\n !await checkViewPermissions(campaign.authorUserId, campaign.permissions)\n ) {\n this.app.setBaseUrl();\n return;\n }\n this.app.campaign = campaign;\n }\n // Load the template and modify it\n const template: T = campaign.template ?? JSON.parse(\n await _package.files.readAsText(`${this.app.appName}/templates/${campaign.templateName}.json`),\n );\n // modify the template with path to the campaign's precalculated table\n await this.app.setTemplate(template, campaignId!);\n\n if (campId)\n modifyUrl(HitDesignCampaignIdKey, campId);\n\n campaign.template = template;\n return campaign;\n }\n\n private async getCampaignsTable() {\n const campaignNamesMap = await loadCampaigns(this.app.appName, this.deletedCampaigns);\n\n const deleteAndShareCampaignIcons = (info: HitDesignCampaign) => {\n const deleteIcon = ui.icons.delete(async () => {\n ui.dialog('Delete campaign')\n .add(ui.divText(`Are you sure you want to delete campaign ${info.name}?`))\n .onOK(async () => {\n await this.deleteCampaign(this.app.appName, info.name);\n this.deletedCampaigns.push(info.name);\n await this.init();\n })\n .show();\n }, 'Delete campaign');\n const shareIcon = ui.iconFA('share', async () => {\n await (new PermissionsDialog(info.permissions)).show(async (res) => {\n try {\n info.permissions = res;\n info.authorUserId ??= grok.shell.user.id;\n await _package.files.writeAsText(\n `${this.app.appName}/campaigns/${info.name}/${CampaignJsonName}`, JSON.stringify(info));\n grok.shell.info('Permissions updated for campaign ' + info.name);\n } catch (e) {\n grok.shell.error('Failed to update permissions for campaign ' + info.name);\n console.error(e);\n }\n });\n }, 'Manage campaign permissions');\n deleteIcon.style.display = 'none';\n shareIcon.style.display = 'none';\n const authorId = info.authorUserId ?? DG.User.current().id;\n const perms = info.permissions ?? defaultPermissions;\n checkEditPermissions(authorId, perms).then((canEdit) => {\n if (canEdit) {\n deleteIcon.style.display = 'inline-block';\n shareIcon.style.display = 'inline-block';\n }\n });\n return [shareIcon, deleteIcon];\n };\n const table = ui.table(Object.values(campaignNamesMap), (info) =>\n ([ui.link(info.name, () => this.setCampaign(info.name), '', ''),\n info.createDate,\n info.rowCount,\n info.status,\n ...(deleteAndShareCampaignIcons(info)),\n ]),\n ['Name', 'Created', 'Molecules', 'Status', '']);\n table.style.color = 'var(--grey-5)';\n table.style.marginLeft = '24px';\n return table;\n }\n\n public async setCampaign(campaignName: string) {\n const campaign = await this.checkCampaign(campaignName);\n this.app.campaign = campaign;\n }\n async getNewCampaignAccordeon(template: T) {\n const {root, promise, cancelPromise} = newHitDesignCampaignAccordeon(template);\n promise.then(async (camp) => {\n this.app.dataFrame = camp.df;\n await this.app.setTemplate(template);\n this.app.campaignProps = camp.campaignProps;\n await this.app.saveCampaign(undefined, false);\n if (template.layoutViewState && this.app.campaign)\n this.app.campaign.layout = template.layoutViewState;\n });\n\n cancelPromise.then(() => {\n this.init();\n });\n return root;\n }\n\n private async createNewTemplate(preset?: T) {\n ui.setUpdateIndicator(this.root, true);\n try {\n const newTemplateAccordeon = await newHitDesignTemplateAccordeon(this.app, preset);\n // hideComponents(toRemove);\n // $(containerDiv).empty();\n // $(templateInputDiv).empty();\n\n const newView = new DG.ViewBase();\n const curView = grok.shell.v;\n newView.name = 'New Template';\n newView.root.appendChild(newTemplateAccordeon.root);\n newView.parentCall = this.app.parentCall;\n grok.shell.addView(newView);\n newView.path = new URL(this.app.baseUrl).pathname + '/new-template';\n const {sub} = addBreadCrumbsToRibbons(newView, this.app.appName, i18n.createNewTemplate, async () => {\n grok.shell.v = curView;\n newView.close();\n });\n //containerDiv.appendChild(newTemplateAccordeon.root);\n newTemplateAccordeon.template.then(async (t) => {\n await this.init(t as any);\n newView.close();\n popRibbonPannels(newView);\n grok.shell.v = curView;\n sub.unsubscribe();\n });\n newTemplateAccordeon.cancelPromise.then(async () => {\n sub.unsubscribe();\n newView.close();\n grok.shell.v = curView;\n });\n } finally {\n ui.setUpdateIndicator(this.root, false);\n }\n }\n}\n","import * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport {HitDesignApp} from '../hit-design-app';\nimport {_package} from '../../package';\nimport {HitDesignTemplate} from '../types';\nimport {HitBaseView} from '../base-view';\n\nexport class HitDesignSubmitView extends HitBaseView<HitDesignTemplate, HitDesignApp> {\n constructor(app: HitDesignApp) {\n super(app);\n this.name = 'Submit';\n }\n\n render(): HTMLDivElement {\n ui.empty(this.root);\n\n const content = ui.divV([\n ui.h1('Summary'),\n ui.div([ui.tableFromMap(this.app.getSummary())]),\n ]);\n return content;\n }\n\n onActivated(): void {\n this.render();\n }\n\n async submit(): Promise<any> {\n const submitParams= this.app.template?.submit;\n if (!submitParams)\n return;\n const submitFn = DG.Func.find({name: submitParams.fName, package: submitParams.package})[0];\n if (!submitFn) {\n grok.shell.error(`Function ${submitParams.fName} not found.`);\n return;\n }\n const filteredDf = DG.DataFrame.fromCsv(this.app.dataFrame!.toCsv({filteredRowsOnly: true}));\n await submitFn.apply({df: filteredDf, molecules: this.app.molColName});\n this.app.campaign && (this.app.campaign.status = 'Submitted');\n this.app.saveCampaign('Submitted');\n grok.shell.info('Submitted successfully.');\n }\n}\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./utils.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./utils.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport {HitDesignApp} from '../hit-design-app';\nimport {_package} from '../../package';\nimport {TileCategoriesColName} from '../consts';\nimport './utils.css';\nimport {getTileCategoryEditor} from '../accordeons/new-hit-design-template-accordeon';\n\nexport function getTilesViewDialog(app: HitDesignApp, getTableView: () => DG.TableView | null) {\n const tilesViewerSketchStateString = app.campaign?.tilesViewerFormSketch;\n let sketchState: any | null = null;\n if (tilesViewerSketchStateString && tilesViewerSketchStateString.length > 0) {\n try {\n sketchState = JSON.parse(tilesViewerSketchStateString);\n } catch (e) {\n console.error('Failed to parse sketch state string', e);\n }\n }\n if (sketchState) {\n // after saving, some columns might be removed in the meantime, so we need to update the\n //sketch state and remove them so that the viewer can be initialized correctly.\n if (sketchState.elementStates && (sketchState.elementStates.length ?? 0) > 0) {\n sketchState.elementStates = sketchState.elementStates.filter((elementState: any) =>\n elementState?.viewerSettings?.column && app.dataFrame!.col(elementState.viewerSettings.column),\n );\n // similarly, because the table name can be duplicated or changed,\n // we need to make sure that table name in all viewer settings corresponds to actual table name\n sketchState.elementStates.forEach((elState: any) => {\n if (elState?.viewerSettings?.table)\n elState.viewerSettings.table = app.dataFrame!.name;\n });\n }\n }\n\n const tileOpts = {lanesColumnName: TileCategoriesColName,\n lanes: app.stages,\n ...((sketchState?.elementStates?.length ?? 0) > 0 ? {sketchState} : {})};\n\n const tv = getTableView();\n\n if (!tv) {\n grok.shell.error('Failed to create tiles viewer. table view is not available.');\n return;\n }\n let v: DG.Viewer | null = null;\n const modal = ui.dialog('Progress Tracker');\n try {\n v = tv.addViewer(DG.VIEWER.TILE_VIEWER, tileOpts);\n\n const opts = v.getOptions();\n opts.look.sketchState = (sketchState?.elementStates?.length ?? 0) > 0 ? sketchState : null;\n\n v.setOptions(opts);\n v.copyViewersLook(v); // hacky way to apply sketch state\n } catch (e) {\n grok.shell.error('Failed to create tiles viewer with preset layout.\\n Falling back to default layout.');\n console.error('Failed to create tiles viewer', e);\n if (v) {\n v.close();\n v.detach();\n }\n v = tv.addViewer(DG.VIEWER.TILE_VIEWER,\n {lanesColumnName: TileCategoriesColName, lanes: app.stages});\n }\n\n if (!v) {\n grok.shell.error('Failed to create tiles viewer. check the console for more details.');\n return;\n }\n\n let stageEditorDialog: DG.Dialog | null = null;\n const closeViewer = () => {// it can be already closed by the time we get here\n try {\n v.detach();\n v.close();\n } catch (e) {\n }\n };\n modal.add(v.root);\n modal.addButton('Modify Stages', () => {\n stageEditorDialog?.close();\n const stageEditor = getTileCategoryEditor(app.stages);\n stageEditorDialog = ui.dialog('Modify Stages')\n .add(stageEditor.fieldsDiv)\n .onOK(async () => {\n closeViewer(); // so that its not included in the layout.\n ui.setUpdateIndicator(modal.root, true);\n try {\n await app.setStages(stageEditor.getFields());\n ui.setUpdateIndicator(modal.root, false);\n modal.close();\n await new Promise<void>((r) => setTimeout(() => {\n r();\n getTilesViewDialog(app, getTableView);\n }, 100));\n } catch (e) {\n grok.shell.error('Failed to update stages. check the console for more details.');\n console.error('Failed to update stages', e);\n } finally {\n if (modal?.root && document.contains(modal.root))\n modal.close();\n }\n })\n .show();\n stageEditorDialog.root.classList.add('hit-design-stage-editing-dialog');\n }, 0);\n // from this modal, only way to go to another view is through edit form.\n // when this happens, we should not destroy the viewer,\n //but just hide it so that when we come back, we can show it again.\n const hideModal = () => modal.root.style.setProperty('display', 'none', 'important');\n const showModal = () => modal.root.style.display = 'flex';\n\n const viewChangeSub = grok.events.onCurrentViewChanged.subscribe(() => {\n if (grok.shell.v === tv)\n showModal();\n else\n hideModal();\n });\n\n\n const closeSub = modal.onClose.subscribe(() => {\n closeSub.unsubscribe();\n viewChangeSub.unsubscribe();\n stageEditorDialog?.close();\n // save the sketch state\n try {\n const sketchState = v.props.sketchState;\n if (sketchState && typeof sketchState == 'object') {\n const stringState = JSON.stringify(sketchState);\n if (app.campaign)\n app.campaign.tilesViewerFormSketch = stringState;\n }\n } catch (e) {\n grok.shell.error('Failed to save sketch state. check the console for more details.');\n console.error('Failed to save sketch state', e);\n }\n closeViewer();\n });\n\n modal.showModal(true);\n\n modal.getButton('CANCEL')?.remove();\n modal.onOK(() => {});\n // remove the modal background\n document.querySelector('.d4-modal-background')?.remove();\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs.operators;","/* eslint-disable max-len */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {AppName, HitDesignCampaign, HitDesignTemplate, HitTriageCampaignStatus, IFunctionArgs} from './types';\nimport {HitDesignInfoView} from './hit-design-views/info-view';\nimport {CampaignIdKey, CampaignJsonName, CampaignTableName,\n HTQueryPrefix, HTScriptPrefix, HitDesignCampaignIdKey,\n HitDesignMolColName, TileCategoriesColName, ViDColName, i18n} from './consts';\nimport {calculateColumns, calculateSingleCellValues, getNewVid} from './utils/calculate-single-cell';\nimport '../../css/hit-triage.css';\nimport {_package} from '../package';\nimport {addBreadCrumbsToRibbons, checkRibbonsHaveSubmit, modifyUrl, toFormatedDateString} from './utils';\nimport {HitDesignSubmitView} from './hit-design-views/submit-view';\nimport {getTilesViewDialog} from './hit-design-views/tiles-view';\nimport {HitAppBase} from './hit-app-base';\nimport {HitBaseView} from './base-view';\nimport {chemFunctionsDialog} from './dialogs/functions-dialog';\nimport {Subscription} from 'rxjs';\nimport {filter} from 'rxjs/operators';\nimport {defaultPermissions, PermissionsDialog} from './dialogs/permissions-dialog';\n\nexport class HitDesignApp<T extends HitDesignTemplate = HitDesignTemplate> extends HitAppBase<T> {\n multiView: DG.MultiView;\n protected _infoView: HitDesignInfoView;\n get infoView(): HitDesignInfoView {return this._infoView;}\n protected _designView?: DG.TableView;\n public _submitView?: HitDesignSubmitView;\n protected _designViewName = 'Design';\n protected _filePath = `System.AppData/HitTriage/${this.appName}/campaigns`;\n protected _campaignId?: string;\n protected _molColName: string = HitDesignMolColName;\n protected _campaign?: HitDesignCampaign;\n public campaignProps: {[key: string]: any} = {};\n\n protected currentDesignViewId?: string;\n public mainView: DG.ViewBase;\n protected get version() {return this._campaign?.version ?? 0;};\n constructor(c: DG.FuncCall, an: AppName = 'Hit Design',\n infoViewConstructor: (app: HitDesignApp) => HitDesignInfoView = (app) => new HitDesignInfoView(app)) {\n super(c, an);\n this._infoView = infoViewConstructor(this);\n this.multiView = new DG.MultiView({viewFactories: {[this._infoView.name]: () => this._infoView}});\n this.multiView.tabs.onTabChanged.subscribe((_) => {\n if (this.multiView.currentView instanceof HitBaseView)\n (this.multiView.currentView as HitBaseView<T, typeof this>).onActivated();\n });\n this.multiView.parentCall = c;\n\n this.mainView = this.multiView;\n this._initViewChangeSub();\n }\n\n _initViewChangeSub() {\n this.multiView.subs.push(grok.events.onCurrentViewChanged.subscribe(async () => {\n try {\n if (grok.shell.v?.name === this.currentDesignViewId) {\n grok.shell.windows.showHelp = false;\n\n this.setBaseUrl();\n modifyUrl(CampaignIdKey, this._campaignId ?? this._campaign?.name ?? '');\n\n const {sub} = addBreadCrumbsToRibbons(grok.shell.v, this.appName, grok.shell.v?.name, () => {\n grok.shell.v = this.mainView;\n this._designView?.close();\n this._infoView.init();\n sub.unsubscribe();\n });\n }\n } catch (e) {\n console.error(e);\n }\n }));\n }\n\n public get stages() {\n return this.campaign?.template?.stages ?? this.template?.stages ?? [];\n }\n\n public async setStages(st: string[]) {\n if (!this.campaign || !this.campaign.template || !this.template) {\n grok.shell.error('Campaign or template is not set');\n return;\n }\n if (!st?.length) {\n grok.shell.error('Removing all stages is not allowed');\n return;\n }\n const stageCol = this.dataFrame?.col(TileCategoriesColName);\n if (!stageCol) {\n grok.shell.error('No stage column found');\n return;\n }\n const removedStages: string[] = [];\n //make sure there is no duplication\n const stageSet = new Set(st);\n const uniqueStages = [...stageSet];\n const dfLen = this.dataFrame!.rowCount;\n const stageCats = stageCol.categories;\n const stageIndexes = stageCol.getRawData() as Int32Array;\n for (let i = 0; i < dfLen; i++) {\n const stage = stageCats[stageIndexes[i]];\n if (!stageSet.has(stage)) {\n stageCol.set(i, st[0], false);\n removedStages.push(stage);\n }\n }\n\n if (removedStages.length > 0)\n grok.shell.warning(`Some stages were removed: (${removedStages.join(', ')}). Corresponding rows were set to stage \"${st[0]}\"`);\n\n\n this.campaign.template.stages = uniqueStages;\n this.template.stages = uniqueStages;\n await this.saveCampaign(undefined, true);\n }\n\n public async setTemplate(template: T, campaignId?: string) {\n if (!campaignId) {\n this._designView?.dataFrame && grok.shell.closeTable(this._designView.dataFrame);\n this._designView = undefined;\n campaignId = await this.getNewCampaignName(`${this.appName}/campaigns`, template.key);\n modifyUrl(HitDesignCampaignIdKey, campaignId);\n this._filePath = `System.AppData/HitTriage/${this.appName}/campaigns/${campaignId}/${CampaignTableName}`;\n } else {\n const fileLoc = `System.AppData/HitTriage/${this.appName}/campaigns`;\n this._filePath = this.campaign?.savePath ?? `${fileLoc}/${campaignId}/${CampaignTableName}`;\n this.dataFrame = await grok.dapi.files.readCsv(this._filePath);\n if (this._campaign?.columnSemTypes) {\n Object.entries(this._campaign.columnSemTypes).forEach(([colName, semtype]) => {\n const col = this.dataFrame!.columns.byName(colName);\n if (col && semtype)\n col.semType = semtype;\n });\n }\n if (this._campaign?.columnTypes) {\n Object.entries(this._campaign.columnTypes).forEach(([colName, type]) => {\n const col = this.dataFrame!.columns.byName(colName);\n if (col && col.type !== type)\n try {this.dataFrame!.changeColumnType(colName, type as DG.COLUMN_TYPE);} catch (e) {console.error(e);}\n });\n }\n //await this.dataFrame.meta.detectSemanticTypes();\n }\n\n if (!this.dataFrame) {\n console.error('DataFrame is empty');\n return;\n }\n await this.dataFrame.meta.detectSemanticTypes();\n this._molColName = this.dataFrame.columns.bySemType(DG.SEMTYPE.MOLECULE)?.name ?? HitDesignMolColName;\n this._campaignId = campaignId;\n this.template = template;\n\n this._submitView ??= new HitDesignSubmitView(this);\n grok.shell.windows.showHelp = false;\n if (this.campaign)\n await this.setCanEdit(this.campaign);\n else\n this.hasEditPermission = true; // if the campaign is new, obviously the user can edit it\n const designV = this.designView;\n this.currentDesignViewId = designV.name;\n this.setBaseUrl();\n modifyUrl(CampaignIdKey, this._campaignId ?? this._campaign?.name ?? '');\n if (this.campaign)\n this.campaign.template = template;\n }\n\n get campaignId(): string | undefined {return this._campaignId;}\n\n get designView(): DG.TableView {return this._designView = this.getDesignView();}\n\n get designViewName(): string {return this._designViewName;}\n\n get molColName() {\n return this._molColName ??= this.dataFrame?.columns.bySemType(DG.SEMTYPE.MOLECULE)?.name ?? HitDesignMolColName;\n }\n\n get campaign(): HitDesignCampaign | undefined {return this._campaign;}\n\n set campaign(campaign: HitDesignCampaign | undefined) {this._campaign = campaign;}\n\n private _duplicateVidCache?: {\n colVersion: number,\n valueCounts: Int32Array | Uint32Array,\n indexes: Int32Array | Uint32Array,\n };\n\n private cacheDuplicateVIDs() {\n const col = this.dataFrame?.col(ViDColName);\n if (!col) {\n this._duplicateVidCache = undefined;\n return;\n }\n const colVersion = col.version;\n const valueCounts = new Uint32Array(col.categories.length).fill(0);\n const indexes = (col.getRawData() as Uint32Array).subarray(0, col.length);\n indexes.forEach((v) => valueCounts[v]++);\n this._duplicateVidCache = {colVersion, valueCounts, indexes};\n }\n\n get duplicateVidCache() {\n const col = this.dataFrame?.col(ViDColName);\n if (!col)\n return undefined;\n if (!this._duplicateVidCache || col.version !== this._duplicateVidCache.colVersion)\n this.cacheDuplicateVIDs();\n return this._duplicateVidCache;\n }\n\n async performSingleCellCalculations(newValueIdx: number, newValue?: string) {\n const computeObj = this.template!.compute;\n if (!newValue || newValue === '')\n return;\n\n const calcDf =\n await calculateSingleCellValues(\n newValue, computeObj.descriptors.args, computeObj.functions, computeObj.scripts, computeObj.queries);\n\n for (const col of calcDf.columns.toList()) {\n if (col.name === HitDesignMolColName) continue;\n if (!this.dataFrame!.columns.contains(col.name)) {\n const newCol = this.dataFrame!.columns.addNew(col.name, col.type);\n newCol.semType = col.semType;\n }\n this.dataFrame!.col(col.name)!.set(newValueIdx, col.get(0), false);\n }\n this.dataFrame!.fireValuesChanged();\n this.saveCampaign(undefined, false);\n }\n\n protected initDesignViewRibbons(view: DG.TableView, subs: Subscription[]) {\n const onRemoveSub = grok.events.onViewRemoved.subscribe((v) => {\n if (v.id === view?.id) {\n subs.forEach((s) => s.unsubscribe());\n onRemoveSub.unsubscribe();\n }\n });\n let ribbons = view?.getRibbonPanels();\n if (ribbons) {\n const hasSubmit = checkRibbonsHaveSubmit(ribbons);\n if (!hasSubmit) {\n const getComputeDialog = async () => {\n chemFunctionsDialog(this, async (resultMap) => {\n const oldDescriptors = this.template!.compute.descriptors.args;\n const oldFunctions = this.template!.compute.functions;\n const oldScripts = this.template!.compute.scripts ?? [];\n const oldQueries = this.template!.compute.queries ?? [];\n const newDescriptors = resultMap.descriptors;\n const newComputeObj = {\n descriptors: {\n enabled: !!resultMap?.descriptors?.length,\n args: resultMap?.descriptors ?? [],\n },\n functions: Object.entries(resultMap?.externals ?? {}).map(([funcName, args]) => {\n const splitFunc = funcName.split(':');\n return ({\n name: splitFunc[1],\n package: splitFunc[0],\n args: args,\n });\n }),\n scripts: Object.entries(resultMap?.scripts ?? {})\n .filter(([name, _]) => name.startsWith(HTScriptPrefix) && name.split(':').length === 3)\n .map(([scriptId, args]) => {\n const scriptNameParts = scriptId.split(':');\n return ({\n name: scriptNameParts[1] ?? '',\n id: scriptNameParts[2] ?? '',\n args: args,\n });\n }),\n queries: Object.entries(resultMap?.queries ?? {})\n .filter(([name, _]) => name.startsWith(HTQueryPrefix) && name.split(':').length === 3)\n .map(([queryName, args]) => {\n const queryNameParts = queryName.split(':');\n return ({\n name: queryNameParts[1] ?? '',\n id: queryNameParts[2] ?? '',\n args: args,\n });\n }),\n };\n this.template!.compute = newComputeObj;\n this.campaign!.template = this.template;\n const uncalculatedDescriptors = newDescriptors.filter((d) => !oldDescriptors.includes(d));\n\n const newFunctions: {[_: string]: IFunctionArgs} = {};\n Object.entries(resultMap?.externals ?? {})\n .filter(([funcName, args]) => {\n const oldFunc = oldFunctions.find((f) => `${f.package}:${f.name}` === funcName);\n if (!oldFunc)\n return true;\n return !Object.entries(args).every(([key, value]) => oldFunc.args[key] === value);\n }).forEach(([funcName, args]) => {newFunctions[funcName] = args;});\n\n const newScripts: {[_: string]: IFunctionArgs} = {};\n Object.entries(resultMap?.scripts ?? {})\n .filter(([scriptName, args]) => {\n const oldScript = oldScripts.find((f) => `${HTScriptPrefix}:${f.name}:${f.id}` === scriptName);\n if (!oldScript)\n return true;\n return !Object.entries(args).every(([key, value]) => oldScript.args[key] === value);\n }).forEach(([scriptName, args]) => {newScripts[scriptName] = args;});\n\n const newQueries: {[_: string]: IFunctionArgs} = {};\n Object.entries(resultMap?.queries ?? {})\n .filter(([queryName, args]) => {\n const oldQuery = oldQueries.find((f) => `${HTQueryPrefix}:${f.name}:${f.id}` === queryName);\n if (!oldQuery)\n return true;\n return !Object.entries(args).every(([key, value]) => oldQuery.args[key] === value);\n }).forEach(([queryName, args]) => {newQueries[queryName] = args;});\n ui.setUpdateIndicator(view.grid.root, true);\n try {\n await calculateColumns({descriptors: uncalculatedDescriptors, externals: newFunctions,\n scripts: newScripts, queries: newQueries}, this.dataFrame!, this.molColName!);\n this.dataFrame!.fireValuesChanged();\n } finally {\n ui.setUpdateIndicator(view.grid.root, false);\n this.saveCampaign(undefined, false);\n }\n }, () => null, this.campaign?.template!, true);\n };\n\n const calculateRibbon = ui.iconFA('wrench', getComputeDialog, 'Calculate additional properties');\n const addNewRowButton = ui.icons.add(() => {this.dataFrame?.rows.addNew(null, true);}, 'Add new row');\n const permissionsButton = ui.iconFA('share', async () => {\n await (new PermissionsDialog(this.campaign?.permissions)).show((res) => {\n this.campaign!.permissions = res;\n this.saveCampaign(undefined, true);\n });\n }, 'Edit campaign permissions');\n const tilesButton = ui.bigButton('Progress tracker', () => {\n getTilesViewDialog(this, () => this._designView ?? null);\n });\n\n const submitButton = ui.bigButton('Submit', () => {\n const dialogContent = this._submitView?.render();\n if (dialogContent) {\n const dlg = ui.dialog('Submit');\n dlg.add(dialogContent);\n dlg.addButton('Save', ()=>{this.saveCampaign(); dlg.close();});\n dlg.addButton('Submit', ()=>{this._submitView?.submit(); dlg.close();});\n dlg.show();\n }\n });\n submitButton.classList.add('hit-design-submit-button');\n const ribbonButtons: HTMLElement[] = [submitButton];\n if (this.stages.length > 0)\n ribbonButtons.unshift(tilesButton);\n // only initialize campaign template if its not exsitent yet\n if (this.campaign && this.template && !this.campaign.template)\n this.campaign.template = this.template;\n\n if (this.hasEditPermission)\n ribbonButtons.unshift(permissionsButton);\n ribbonButtons.unshift(calculateRibbon);\n ribbonButtons.unshift(addNewRowButton);\n\n\n ribbons.push(ribbonButtons);\n // remove project save button from the ribbon\n ribbons.some((rg) => {\n const saveBtnIdx = rg?.findIndex((r) => r?.textContent?.toLowerCase() === 'save') ?? -1;\n if (saveBtnIdx !== -1) {\n rg.splice(saveBtnIdx, 1);\n return true;\n }\n return false;\n });\n // remove empty ribbon arrays\n ribbons = ribbons.filter((r) => (r?.length ?? 0) > 0);\n view.setRibbonPanels(ribbons);\n }\n }\n return view;\n }\n\n protected getDesignView(): DG.TableView {\n const subs: Subscription[] = [];\n const isNew = this.dataFrame!.col(this.molColName)?.toList().every((m) => !m && m === '');\n const view = grok.shell.addTableView(this.dataFrame!);\n this._designViewName = this.campaign?.name ?? this._designViewName;\n view.name = this._designViewName;\n\n view._onAdded();\n const layoutViewState = this._campaign?.layout ?? this.template?.layoutViewState;\n if (layoutViewState) {\n try {\n const layout = DG.ViewLayout.fromViewState(layoutViewState);\n view.loadLayout(layout);\n } catch (e) {\n grok.shell.error('Failed to apply layout. Falling back to default layout.');\n console.error(e);\n }\n }\n\n if (isNew)\n grok.functions.call('Chem:editMoleculeCell', {cell: view.grid.cell(this._molColName, 0)});\n\n subs.push(this.dataFrame!.onRowsAdded.pipe(filter(() => !this.isJoining))\n .subscribe(() => { // TODO, insertion of rows in the middle\n try {\n if (this.stages.length > 0) {\n for (let i = 0; i < this.dataFrame!.rowCount; i++) {\n const colVal = this.dataFrame!.col(TileCategoriesColName)!.get(i);\n if (!colVal || colVal === '' || this.dataFrame!.col(TileCategoriesColName)?.isNone(i))\n this.dataFrame!.set(TileCategoriesColName, i, this.stages[0]);\n }\n }\n let lastAddedCell: DG.GridCell | null = null;\n for (let i = 0; i < this.dataFrame!.rowCount; i++) {\n const cell = view.grid.cell(this.molColName, i);\n if (!cell)\n continue;\n if (cell.cell.value === '' || cell.cell.value === null)\n lastAddedCell = cell;\n }\n if (lastAddedCell)\n grok.functions.call('Chem:editMoleculeCell', {cell: lastAddedCell});\n } catch (e) {\n console.error(e);\n }\n //const lastCell = view.grid.cell(this.molColName, this.dataFrame!.rowCount - 1);\n //view.grid.onCellValueEdited\n }));\n subs.push(grok.events.onContextMenu.subscribe((args) => {\n try {\n const viewer: DG.Viewer = args?.args?.context;\n if (!viewer)\n return;\n if (viewer?.type !== DG.VIEWER.GRID)\n return;\n if (!viewer.tableView || viewer.tableView.id !== view.id)\n return;\n if (args?.args?.item?.tableColumn?.name !== this.molColName || !args?.args?.item?.isTableCell)\n return;\n const menu: DG.Menu = args?.args?.menu;\n if (!menu)\n return;\n menu.item('Add new row', () => {\n this.dataFrame!.rows.addNew(null, true);\n });\n menu.item('Duplicate molecule', () => {\n try {\n const row = this.dataFrame!.rows.addNew(null, true);\n const cell = row.get(this.molColName);\n if (cell != null && row.idx > -1)\n this.dataFrame!.cell(row.idx, this.molColName).value = args?.args?.item?.cell?.value ?? '';\n } catch (e) {\n console.error(e);\n }\n });\n\n const cellIndex = args?.args?.item?.tableRowIndex;\n const cellValue = args?.args?.item?.cell?.value;\n if (cellValue && (cellIndex ?? -1) > -1) {\n menu.item('Re-Run Calculations', async () => {\n try {\n await this.performSingleCellCalculations(cellIndex, cellValue);\n } catch (e) {\n console.error(e);\n }\n });\n }\n } catch (e: any) {\n grok.log.error(e);\n }\n }));\n\n if (!view?.grid) {\n grok.shell.error('Applied layout created view without grid. Resetting layout.');\n view.resetLayout();\n }\n view?.grid && subs.push(view.grid.onCellValueEdited.subscribe(async (gc) => {\n try {\n if (gc.tableColumn?.name === TileCategoriesColName) {\n await this.saveCampaign(undefined, false);\n return;\n }\n if (gc.tableColumn?.name !== this.molColName)\n return;\n const newValue = gc.cell.value;\n const newValueIdx = gc.tableRowIndex!;\n let newVid = this.dataFrame!.col(ViDColName)?.get(newValueIdx);\n let foundMatch = false;\n // try to find existing molecule\n if (newValue) {\n try {\n const canonicals = gc.tableColumn.toList().map((cv) => {\n try {\n return grok.chem.convert(cv, grok.chem.Notation.Unknown, grok.chem.Notation.Smiles);\n } catch (e) {\n return '';\n }\n },\n );\n const canonicalNewValue =\n grok.chem.convert(newValue, grok.chem.Notation.Unknown, grok.chem.Notation.Smiles);\n if (canonicals?.length === this.dataFrame!.rowCount) {\n for (let i = 0; i < canonicals.length; i++) {\n if (canonicals[i] === canonicalNewValue &&\n i !== newValueIdx && this.dataFrame!.col(ViDColName)?.get(i)) {\n newVid = this.dataFrame!.col(ViDColName)?.get(i);\n foundMatch = true;\n break;\n }\n }\n }\n } catch (e) {\n console.error(e);\n }\n }\n // if the vid was duplicated, generate a new one\n if (this.duplicateVidCache && !foundMatch &&\n this.duplicateVidCache.valueCounts[this.duplicateVidCache.indexes[newValueIdx]] > 1)\n newVid = null;\n\n if (!newVid || newVid === '')\n newVid = getNewVid(this.dataFrame!.col(ViDColName)!);\n\n this.dataFrame!.col(ViDColName)!.set(newValueIdx, newVid, false);\n\n this.performSingleCellCalculations(newValueIdx, newValue);\n } catch (e) {\n console.error(e);\n }\n }));\n\n view?.grid && subs.push(view.grid.onCellRender.subscribe((args) => {\n try {\n // color duplicate vid values\n const cell = args.cell;\n if (!cell || !cell.isTableCell || !cell.tableColumn || !this.duplicateVidCache ||\n cell.tableColumn.name !== ViDColName || (cell.tableRowIndex ?? -1) < 0)\n return;\n\n if (this.duplicateVidCache.valueCounts[this.duplicateVidCache.indexes[cell.tableRowIndex!]] > 1) {\n args.cell.style.backColor =\n DG.Color.setAlpha(DG.Color.getCategoricalColor(this.duplicateVidCache.indexes[cell.tableRowIndex!])\n , 150);\n }\n } catch (e) {}\n }));\n this.initDesignViewRibbons(view, subs);\n view.parentCall = this.parentCall;\n return view;\n }\n\n getSummary(): {[_: string]: any} {\n const getFolderPath = () => {\n const campaignIndex = this._filePath.indexOf((this.campaignId ?? this._campaign?.name)!);\n const folderPath = campaignIndex === -1 ? this._filePath : this._filePath.substring(0, campaignIndex - 1);\n return folderPath;\n };\n const campaignProps = {...(this.campaign?.campaignFields ?? this.campaignProps)};\n if (this.template && this.template.campaignFields) {\n Object.entries(campaignProps).forEach(([key, value]) => {\n const field = this.template!.campaignFields!.find((f) => f.name === key);\n if (field && field.type === 'Date' && value) {\n const dateString = (new Date(value)).toString();\n if (dateString !== 'Invalid Date')\n campaignProps[key] = (new Date(value)).toLocaleDateString();\n else {\n if (value.date)\n campaignProps[key] = new Date(value.date).toLocaleDateString();\n else\n campaignProps[key] = value;\n }\n } else {\n if (field && field.type === DG.SEMTYPE.MOLECULE && value)\n campaignProps[key] = grok.chem.drawMolecule(value);\n }\n });\n }\n\n const getPathEditor = () => {\n const editIcon = ui.icons.edit(() => {\n const folderPath = getFolderPath();\n const newPathInput = ui.input.string('Path', {value: folderPath});\n const labelElement = newPathInput.root.getElementsByTagName('label').item(0);\n if (labelElement)\n labelElement.remove();\n newPathInput.root.style.width = '100%';\n\n async function checkFolder() {\n const newPath = newPathInput.value;\n if (!newPath || newPath.trim() === '') {\n grok.shell.error('Path can not be empty');\n return false;\n }\n const exists = await grok.dapi.files.exists(newPath);\n if (!exists) {\n grok.shell.error('Given folder does not exist');\n return false;\n }\n return true;\n }\n\n const saveButton = ui.button('Save', async () => {\n const exists = await checkFolder();\n if (!exists)\n return;\n const newPath = newPathInput.value;\n if (newPath.endsWith('/'))\n this._filePath = `${newPath}${this.campaignId}/${CampaignTableName}`;\n else\n this._filePath = `${newPath}/${this.campaignId}/${CampaignTableName}`;\n\n if (this._campaign)\n this._campaign!.savePath = this._filePath;\n await this.saveCampaign(undefined, true);\n ui.empty(pathDiv);\n const folderPath = getFolderPath();\n link = ui.link(folderPath,\n () => this.download(this.dataFrame!, this.campaignId ?? this._campaign?.name ?? 'Molecules'),\n i18n.download);\n pathDiv.appendChild(link);\n pathDiv.appendChild(editIcon);\n });\n const cancelButton = ui.button('Cancel', () => {\n ui.empty(pathDiv);\n pathDiv.appendChild(link);\n pathDiv.appendChild(editIcon);\n });\n ui.empty(pathDiv);\n newPathInput.addOptions(cancelButton);\n newPathInput.addOptions(saveButton);\n pathDiv.appendChild(newPathInput.root);\n }, 'Edit file path');\n editIcon.style.marginLeft = '5px';\n const folderPath = getFolderPath();\n let link = ui.link(folderPath,\n () => this.download(this.dataFrame!, this.campaignId ?? this._campaign?.name ?? 'Molecules'), i18n.download);\n const pathDiv = ui.divH([link, editIcon], {style: {alignItems: 'center'}});\n return pathDiv;\n };\n\n return {\n 'Template': this.template?.name ?? 'Molecules',\n 'File path': getPathEditor(),\n ...campaignProps,\n 'Number of molecules': (this.dataFrame!.rowCount).toString(),\n 'Enrichment methods': [this.template!.compute.descriptors.enabled ? 'descriptors' : '',\n ...this.template!.compute.functions.map((func) => func.name)].filter((f) => f && f.trim() !== '').join(', '),\n };\n }\n\n async saveCampaign(status?: HitTriageCampaignStatus, notify = true): Promise<HitDesignCampaign> {\n const campaignId = this.campaignId!;\n const templateName = this.template!.name;\n const enrichedDf = this.dataFrame!;\n const campaignName = campaignId;\n const columnSemTypes: {[_: string]: string} = {};\n enrichedDf.columns.toList().forEach((col) => columnSemTypes[col.name] = col.semType);\n const colTypeMap: {[_: string]: string} = {};\n enrichedDf.columns.toList().forEach((col) => colTypeMap[col.name] = col.type);\n const sketchStateString = this.campaign?.tilesViewerFormSketch ?? undefined;\n\n // if its first time save author as current user, else keep the same\n const authorUserId = this.campaign?.authorUserId ?? grok.shell.user.id;\n const permissions = this.campaign?.permissions ?? defaultPermissions;\n\n const campaign: HitDesignCampaign = {\n name: campaignName,\n templateName,\n status: status ?? this.campaign?.status ?? 'In Progress',\n createDate: this.campaign?.createDate ?? toFormatedDateString(new Date()),\n campaignFields: this.campaign?.campaignFields ?? this.campaignProps,\n columnSemTypes,\n rowCount: enrichedDf.rowCount,\n filteredRowCount: enrichedDf.filter.trueCount,\n savePath: this._filePath,\n columnTypes: colTypeMap,\n tilesViewerFormSketch: sketchStateString,\n version: this.version + 1,\n authorUserId,\n permissions,\n };\n if (!this.hasEditPermission) {\n grok.shell.error('You do not have permission to modify this campaign');\n return campaign;\n }\n const campaignPath = `${this.appName}/campaigns/${campaignId}/${CampaignJsonName}`;\n // check if someone already saved the campaign\n let resDf = enrichedDf;\n\n\n if (await _package.files.exists(campaignPath)) {\n const prevCamp: HitDesignCampaign = JSON.parse(await _package.files.readAsText(campaignPath));\n if ((prevCamp.version ?? 0) > this.version) {\n campaign.version = Math.max(this.version, (prevCamp.version ?? 0)) + 1;\n if (await grok.dapi.files.exists(this._filePath)) {\n try {\n const prevCampDf = await grok.dapi.files.readCsv(this._filePath);\n const joined = this.unionDataframes(prevCampDf, enrichedDf, this.molColName);\n resDf = joined;\n } catch (e) {\n console.error(e);\n }\n }\n }\n }\n const csvDf = DG.DataFrame.fromColumns(\n resDf.columns.toList().filter((col) => !col.name.startsWith('~')),\n ).toCsv();\n await grok.dapi.files.writeAsText(this._filePath, csvDf);\n const newLayout = this._designView!.saveLayout();\n if (!newLayout)\n grok.shell.warning('Layout cound not be saved');\n else\n campaign.layout = newLayout.viewState;\n campaign.template = this.template;\n\n await _package.files.writeAsText(campaignPath,\n JSON.stringify(campaign));\n notify && grok.shell.info('Campaign saved successfully.');\n this.campaign = campaign;\n return campaign;\n }\n}\n","\n/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nexport class GasteigerPngRenderer extends DG.GridCellRenderer {\n get name(): string {return 'customGasteigerPNG';}\n\n get cellType(): string {return 'customGasteigerPNG';}\n\n get defaultHeight(): number {return 200;}\n\n get defaultWidth(): number {return 200;}\n\n /**\n * Cell renderer function.\n *\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {number} x x coordinate on the canvas.\n * @param {number} y y coordinate on the canvas.\n * @param {number} w width of the cell.\n * @param {number} h height of the cell.\n * @param {DG.GridCell} gridCell Grid cell.\n * @param {DG.GridCellStyle} _cellStyle Cell style.\n */\n render(\n g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, gridCell: DG.GridCell,\n _cellStyle: DG.GridCellStyle,\n ): void {\n if (gridCell.gridRow < 0 || !gridCell.cell.value) return;\n\n const pngString: string = gridCell.cell.value;\n const img = new Image(w-2, h-2);\n\n img.src = 'data:image/png;base64,' + pngString;\n img.onload = function() {\n g.drawImage(img, x+2, y+2, w-2, h-2);\n };\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {u2} from '@datagrok-libraries/utils/src/u2';\nimport {_package} from '../../package';\nimport {PeptiHitTemplate} from '../types';\nimport {newHitDesignCampaignAccordeon} from '../accordeons/new-hit-design-campaign-accordeon';\nimport {HitDesignInfoView} from '../hit-design-views/info-view';\nimport {PeptiHitApp} from '../pepti-hit-app';\n\nexport class PeptiHitInfoView extends HitDesignInfoView<PeptiHitTemplate, PeptiHitApp> {\n constructor(app: PeptiHitApp) {\n super(app);\n this.name = 'PeptiHit';\n grok.shell.windows.showHelp = true;\n grok.shell.windows.help.showHelp(_package.webRoot + 'README_HD.md');\n }\n\n override async getNewCampaignAccordeon(template: PeptiHitTemplate) {\n const {root, promise, cancelPromise} = newHitDesignCampaignAccordeon(template, true);\n promise.then(async (camp) => {\n this.app.dataFrame = camp.df;\n await this.app.setTemplate(template);\n this.app.campaignProps = camp.campaignProps;\n await this.app.saveCampaign(undefined, false);\n if (template.layoutViewState && this.app.campaign)\n this.app.campaign.layout = template.layoutViewState;\n });\n\n cancelPromise.then(() => {\n this.init();\n });\n return root;\n }\n\n override getAppHeader() {\n return u2.appHeader({\n iconPath: _package.webRoot + '/images/icons/pepti-hit-icon.png',\n learnMoreUrl: 'https://github.com/datagrok-ai/public/blob/master/packages/HitTriage/README_HD.md',\n description:\n '- Configure your own workflow using the template editor\\n' +\n '- Sketch Helm sequences in the spreadsheet\\n' +\n '- Annotate and share ideas with the team\\n' +\n '- Convert to molecular form and calculate different properties\\n' +\n '- Save campaigns and continue from where you left off\\n' +\n '- Submit final selection to the function of your choice',\n });\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {PeptiHitTemplate} from './types';\nimport {PeptiHitHelmColName, TileCategoriesColName, ViDColName} from './consts';\nimport {getNewVid} from './utils/calculate-single-cell';\nimport '../../css/hit-triage.css';\nimport {_package} from '../package';\nimport {Subscription} from 'rxjs';\nimport {filter} from 'rxjs/operators';\nimport {HitDesignApp} from './hit-design-app';\nimport {PeptiHitInfoView} from './pepti-hits-views/info-view';\n\nexport class PeptiHitApp extends HitDesignApp<PeptiHitTemplate> {\n _helmColName: string = PeptiHitHelmColName;\n constructor(c: DG.FuncCall) {\n super(c, 'PeptiHit', (app) => new PeptiHitInfoView(app as PeptiHitApp));\n }\n\n public async setTemplate(template: PeptiHitTemplate, campaignId?: string): Promise<void> {\n await super.setTemplate(template, campaignId);\n this._helmColName = this.dataFrame!.columns.bySemType(DG.SEMTYPE.MACROMOLECULE)?.name ?? PeptiHitHelmColName;\n }\n\n get helmColName(): string {\n return this._helmColName ??\n this.dataFrame!.columns.bySemType(DG.SEMTYPE.MACROMOLECULE)?.name;\n }\n\n async performSingleCellCalculations(cellIndex: number, cellValue?: string) {\n try {\n if (!cellValue)\n throw new Error('No cell value provided');\n const col = DG.Column.fromStrings(this.helmColName, [cellValue]);\n const table = DG.DataFrame.fromColumns([col]);\n col.semType = DG.SEMTYPE.MACROMOLECULE;\n col.setTag('units', 'helm');\n col.setTag('.alphabetIsMultichar', 'true');\n await grok.functions.call('Bio:toAtomicLevel', {table: table, seqCol: col, nonlinear: true});\n const molCol = table.columns.names().find((c) => c.toLowerCase() !== this.helmColName.toLowerCase());\n const mol = molCol ? table.col(molCol)?.get(0) : null;\n if (!mol)\n throw new Error('Failed to convert sequence to atomic level');\n this.dataFrame!.set(this.molColName, cellIndex, mol);\n await super.performSingleCellCalculations(cellIndex, mol);\n } catch (e) {\n console.error(e);\n }\n }\n\n protected getDesignView(): DG.TableView {\n const subs: Subscription[] = [];\n const isNew = this.dataFrame!.col(this.helmColName)?.toList().every((m) => !m && m === '');\n const helmCol = this.dataFrame!.col(this.helmColName);\n if (!helmCol)\n throw new Error('No helm column found');\n helmCol.semType = DG.SEMTYPE.MACROMOLECULE;\n helmCol.setTag('units', 'helm');\n helmCol.setTag('.alphabetIsMultichar', 'true');\n helmCol.setTag('cell.renderer', 'helm');\n\n const view = grok.shell.addTableView(this.dataFrame!);\n this._designViewName = this.campaign?.name ?? this._designViewName;\n view.name = this._designViewName;\n view._onAdded();\n const layoutViewState = this._campaign?.layout ?? this.template?.layoutViewState;\n if (layoutViewState) {\n try {\n const layout = DG.ViewLayout.fromViewState(layoutViewState);\n view.loadLayout(layout);\n } catch (e) {\n grok.shell.error('Failed to apply layout. Falling back to default layout.');\n console.error(e);\n }\n }\n\n if (isNew)\n grok.functions.call('Helm:editMoleculeCell', {cell: view.grid.cell(this.helmColName, 0)});\n\n subs.push(this.dataFrame!.onRowsAdded.pipe(filter(() => !this.isJoining))\n .subscribe(() => { // TODO, insertion of rows in the middle\n try {\n if (this.stages.length > 0) {\n for (let i = 0; i < this.dataFrame!.rowCount; i++) {\n const colVal = this.dataFrame!.col(TileCategoriesColName)!.get(i);\n if (!colVal || colVal === '' || this.dataFrame!.col(TileCategoriesColName)?.isNone(i))\n this.dataFrame!.set(TileCategoriesColName, i, this.stages[0]);\n }\n }\n let lastAddedCell: DG.GridCell | null = null;\n for (let i = 0; i < this.dataFrame!.rowCount; i++) {\n const cell = view.grid.cell(this.helmColName, i);\n if (!cell)\n continue;\n if (cell.cell.value === '' || cell.cell.value === null)\n lastAddedCell = cell;\n }\n if (lastAddedCell)\n grok.functions.call('Helm:editMoleculeCell', {cell: lastAddedCell});\n } catch (e) {\n console.error(e);\n }\n }));\n\n subs.push(grok.events.onContextMenu.subscribe((args) => {\n try {\n const viewer: DG.Viewer = args?.args?.context;\n if (!viewer)\n return;\n if (viewer?.type !== DG.VIEWER.GRID)\n return;\n if (!viewer.tableView || viewer.tableView.id !== view.id)\n return;\n if (args?.args?.item?.tableColumn?.name !== this.helmColName || !args?.args?.item?.isTableCell)\n return;\n const menu: DG.Menu = args?.args?.menu;\n if (!menu)\n return;\n menu.item('Add new row', () => {\n this.dataFrame!.rows.addNew(null, true);\n });\n menu.item('Duplicate Sequence', () => {\n try {\n const row = this.dataFrame!.rows.addNew(null, true);\n const cell = row.get(this.helmColName);\n if (cell != null && row.idx > -1)\n this.dataFrame!.cell(row.idx, this.helmColName).value = args?.args?.item?.cell?.value ?? '';\n } catch (e) {\n console.error(e);\n }\n });\n\n const cellIndex = args?.args?.item?.tableRowIndex;\n const cellValue = args?.args?.item?.cell?.value;\n if (cellValue && (cellIndex ?? -1) > -1) {\n menu.item('Re-Run Calculations', async () => {\n try {\n await this.performSingleCellCalculations(cellIndex, cellValue);\n } catch (e) {\n console.error(e);\n }\n });\n }\n } catch (e: any) {\n grok.log.error(e);\n }\n }));\n\n if (!view?.grid) {\n grok.shell.error('Applied layout created view without grid. Resetting layout.');\n view.resetLayout();\n }\n\n view?.grid && subs.push(view.grid.onCellValueEdited.subscribe(async (gc) => {\n try {\n if (gc.tableColumn?.name === TileCategoriesColName) {\n await this.saveCampaign(undefined, false);\n return;\n }\n if (gc.tableColumn?.name !== this.helmColName)\n return;\n const newValue = gc.cell.value;\n const newValueIdx = gc.tableRowIndex!;\n let newVid = this.dataFrame!.col(ViDColName)?.get(newValueIdx);\n let foundMatch = false;\n // try to find existing sequence\n if (newValue) {\n try {\n const canonicals = gc.tableColumn.toList();\n const canonicalNewValue = newValue;\n if (canonicals?.length === this.dataFrame!.rowCount) {\n for (let i = 0; i < canonicals.length; i++) {\n if (canonicals[i] === canonicalNewValue &&\n i !== newValueIdx && this.dataFrame!.col(ViDColName)?.get(i)) {\n newVid = this.dataFrame!.col(ViDColName)?.get(i);\n foundMatch = true;\n break;\n }\n }\n }\n } catch (e) {\n console.error(e);\n }\n }\n // if the vid was duplicated, generate a new one\n if (this.duplicateVidCache && !foundMatch &&\n this.duplicateVidCache.valueCounts[this.duplicateVidCache.indexes[newValueIdx]] > 1)\n newVid = null;\n\n if (!newVid || newVid === '')\n newVid = getNewVid(this.dataFrame!.col(ViDColName)!);\n\n this.dataFrame!.col(ViDColName)!.set(newValueIdx, newVid, false);\n\n this.performSingleCellCalculations(newValueIdx, newValue);\n } catch (e) {\n console.error(e);\n }\n }));\n\n view?.grid && subs.push(view.grid.onCellRender.subscribe((args) => {\n try {\n // color duplicate vid values\n const cell = args.cell;\n if (!cell || !cell.isTableCell || !cell.tableColumn || !this.duplicateVidCache ||\n cell.tableColumn.name !== ViDColName || (cell.tableRowIndex ?? -1) < 0)\n return;\n\n if (this.duplicateVidCache.valueCounts[this.duplicateVidCache.indexes[cell.tableRowIndex!]] > 1) {\n args.cell.style.backColor =\n DG.Color.setAlpha(DG.Color.getCategoricalColor(this.duplicateVidCache.indexes[cell.tableRowIndex!])\n , 150);\n }\n } catch (e) {}\n }));\n\n this.initDesignViewRibbons(view, subs);\n view.parentCall = this.parentCall;\n return view;\n }\n}\n","/* Do not change these import lines. Datagrok will import API library in exactly the same manner */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {HitTriageApp} from './app/hit-triage-app';\nimport {HitDesignApp} from './app/hit-design-app';\nimport {GasteigerPngRenderer} from './pngRenderers';\nimport {loadCampaigns} from './app/utils';\nimport {AppName} from './app';\nimport {PeptiHitApp} from './app/pepti-hit-app';\nimport {PeptiHitHelmColName} from './app/consts';\n// import {loadCampaigns} from './app/utils';\n\nexport const _package = new DG.Package();\n\nasync function hitAppTB(treeNode: DG.TreeViewGroup, browseView: any, name: AppName) {// TODO: DG.BrowseView\n const camps = await loadCampaigns(name, []);\n\n for (const [_, camp] of Object.entries(camps)) {\n const savePath = 'ingest' in camp ? camp.ingest.query : camp.savePath;\n if (!savePath || await grok.dapi.files.exists(savePath) === false)\n continue;\n const node = treeNode.item(camp.name);\n node.onSelected.subscribe(async (_) => {\n try {\n const df = await grok.dapi.files.readCsv(savePath);\n if (!df)\n return;\n const semtypeInfo = camp.columnSemTypes;\n if (semtypeInfo) {\n for (const [colName, semType] of Object.entries(semtypeInfo)) {\n const col = df.columns.byName(colName);\n if (col) {\n col.semType = semType;\n if (semType === DG.SEMTYPE.MACROMOLECULE && colName === PeptiHitHelmColName) {\n col.setTag('units', 'helm');\n col.setTag('.alphabetIsMultichar', 'true');\n col.setTag('cell.renderer', 'helm');\n }\n }\n }\n }\n const tv = DG.TableView.create(df, false);\n browseView.preview = tv;\n const layout = camp.layout;\n if (layout)\n tv.loadLayout(DG.ViewLayout.fromViewState(layout));\n } catch (e) {\n console.error(e);\n }\n });\n }\n}\n\n//input: dynamic treeNode\n//input: view browseView\nexport async function hitTriageAppTreeBrowser(treeNode: DG.TreeViewGroup, browseView: any) {// TODO: DG.BrowseView\n await hitAppTB(treeNode, browseView, 'Hit Triage');\n}\n\n//input: dynamic treeNode\n//input: view browseView\nexport async function hitDesignAppTreeBrowser(treeNode: DG.TreeViewGroup, browseView: any) {// TODO: DG.BrowseView\n await hitAppTB(treeNode, browseView, 'Hit Design');\n}\n\n//input: dynamic treeNode\n//input: view browseView\nexport async function peptiHitAppTreeBrowser(treeNode: DG.TreeViewGroup, browseView: any) {// TODO: DG.BrowseView\n await hitAppTB(treeNode, browseView, 'PeptiHit');\n}\n\n//tags: app\n//name: Hit Triage\n//output: view v\nexport async function hitTriageApp(): Promise<DG.ViewBase> {\n const c = grok.functions.getCurrentCall();\n return new HitTriageApp(c).multiView;\n}\n\n//tags: app\n//name: Hit Design\n//meta.icon: images/icons/hit-design-icon.png\n//output: view v\nexport async function hitDesignApp(): Promise<DG.ViewBase> {\n const c = grok.functions.getCurrentCall();\n return new HitDesignApp(c).multiView;\n}\n\n//tags: app\n//name: PeptiHit\n//meta.icon: images/icons/pepti-hit-icon.png\n//output: view v\nexport async function peptiHitApp(): Promise<DG.ViewBase> {\n const c = grok.functions.getCurrentCall();\n await grok.functions.call('Bio:initBio', {});\n return new PeptiHitApp(c).multiView;\n}\n\n//name: Demo Molecules 100\n//tags: HitTriageDataSource\n//output: dataframe result\nexport async function demoFileIngest(): Promise<DG.DataFrame> {\n const df = grok.data.demo.molecules(100);\n df.name = '100 Molecules';\n return df;\n}\n\n//name: Demo Molecules 5000\n//tags: HitTriageDataSource\n//output: dataframe result\nexport async function demoFileIngest1(): Promise<DG.DataFrame> {\n const df = grok.data.demo.molecules(5000);\n df.name = '5000 Molecules';\n return df;\n}\n\n//name: Demo Molecules variable\n//input: int numberOfMolecules [Molecules count]\n//tags: HitTriageDataSource\n//output: dataframe result\nexport async function demoFileIngest2(numberOfMolecules: number): Promise<DG.DataFrame> {\n const df = grok.data.demo.molecules(numberOfMolecules);\n df.name = 'Variable Molecules number';\n return df;\n}\n\n//name: Demo File Submit\n//tags: HitTriageSubmitFunction\n//input: dataframe df [Dataframe]\n//input: string molecules [Molecules column name]\nexport async function demoFileSubmit(df: DG.DataFrame, molecules: string): Promise<void> {\n grok.shell.info(df.rowCount);\n grok.shell.info(molecules);\n}\n\n// //name: Gasteiger Partial Charges\n// //top-menu: Chem | Gasteiger\n// //tags: HitTriageFunction\n// //input: dataframe table [Input data table] {caption: Table}\n// //input: column molecules {caption: Molecules; type: categorical; semType: Molecule}\n// //input: int contours = 4 {caption: Contours;}\n// //output: dataframe result\n// export async function gasteigerPartialCharges(\n// table: DG.DataFrame, molecules: DG.Column, contours: number = 4): Promise<DG.DataFrame> {\n// const newColName = table.columns.getUnusedName('Gasteiger Partial Charges');\n// const newCol = table.columns.addNew(newColName, 'string');\n// newCol.semType = 'customGasteigerPNG';\n// for (let i = 0; i < molecules.length; i++) {\n// const mol = molecules.get(i);\n// if (mol === null)\n// continue;\n// const p = {mol, contours: contours};\n// const res = await grok.functions.call('Chem:ChemistryGasteigerPartialCharges', p);\n// newCol.set(i, res);\n// }\n// return table;\n// }\n\n//name: gasteigerRenderer\n//tags: cellRenderer\n//meta.cellType: customGasteigerPNG\n//meta.columnTags: quality=customGasteigerPNG\n//output: grid_cell_renderer result\nexport function gasteigerCellRenderer(): GasteigerPngRenderer {\n return new GasteigerPngRenderer();\n}\n"],"names":["doc","document","win","window","docEle","documentElement","createElement","bind","div","table","tbody","tr","isArray","Array","ArrayPrototype","prototype","concat","filter","indexOf","map","push","slice","some","splice","idRe","classRe","htmlRe","tagRe","find","selector","context","value","isFragment","nodeType","isDocument","isElement","test","getElementsByClassName","replace","getElementsByTagName","querySelectorAll","Cash","isCash","eles","isString","ctx","getElementById","parseHTML","cash","isFunction","this","ready","length","i","l","init","fn","isWindow","isUndefined","undefined","isNull","isNumeric","isNaN","parseFloat","isFinite","isPlainObject","proto","Object","getPrototypeOf","each","arr","callback","_reverse","call","keys","key","extend","sources","_i","arguments","deep","shift","target","source","constructor","Symbol","empty","ele","firstChild","removeChild","plugins","splitValuesRe","getSplitValues","str","match","computeStyle","prop","isVariable","style","getComputedStyle","getPropertyValue","computeStyleInt","parseInt","getExtraSpace","xAxis","toggleClass","cls","force","classes","isForce","c","classList","add","remove","toggle","addClass","removeAttr","attr","attrs","a","removeAttribute","value_1","getAttribute","setAttribute","removeClass","hasClass","contains","get","index","Number","eq","first","last","text","textContent","join","defaultDisplay","isHidden","matches","getCompareFunction","comparator","is","filtered","collection","compare","detach","parentNode","fragmentRe","singleTagRe","containers","td","th","thead","tfoot","html","RegExp","$1","fragment","container","innerHTML","childNodes","pluck","until","plucked","isCallback","val_1","apply","val_2","getValue","multiple","options","option","selected","disabled","unique","item","self","has","not","val","isSelect","checkableRe","type","eleValue_1","String","checked","guid","children","parent","child","closest","$parent","siblings","HTMLCDATARe","scriptTypeRe","scriptAttributes","insertSelectors","selectors","anchors","inverse","left","inside","reverseLoop1","reverseLoop2","reverseLoop3","si","ti","ai","anchor","targetFinal","indexFinal","evaluate","insertBefore","nodeName","replaceChild","nextSibling","node","script_1","head","evalScripts","ownerDocument","insertElement","cloneNode","after","append","hasScript","appendTo","wrapInner","$ele","contents","wrapAll","before","structure","wrapper","firstElementChild","wrap","insertAfter","prepend","prependTo","tagName","contentDocument","content","next","_all","_until","nextAll","nextUntil","parents","parentsUntil","prev","prevAll","prevUntil","clone","offsetParent","start","end","dashAlphaRe","camelCase","letter","toUpperCase","cb","setTimeout","readyState","addEventListener","unwrap","replaceWith","offset","rect","getBoundingClientRect","top","pageYOffset","pageXOffset","position","isFixed","doc_1","body","parentOffset","propMap","class","contenteditable","for","readonly","maxlength","tabindex","colspan","rowspan","usemap","removeProp","cssVariableRe","isCSSVariable","prefixedProps","vendorsPrefixes","numericProps","animationIterationCount","columnCount","flexGrow","flexShrink","fontWeight","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","opacity","order","orphans","widows","zIndex","getSuffixedValue","attempt","arg","_a","css","isVariable_1","propCC","propUC","split","p","getPrefixedProp","setProperty","JSONStringRe","getData","dataset","JSON","parse","getDocumentDimension","dimension","Math","max","data","name","datas","stringify","setData","outer","includeMargins","propLC","toLowerCase","valueNumber","boxSizing","displayProperty","hidden","display","getDefaultDisplay","hide","show","eventsNamespace","eventsFocus","focus","blur","eventsHover","mouseenter","mouseleave","eventsMouseRe","getEventNameBubbling","parseEventName","eventName","parts","sort","getEventsCache","hasNamespaces","ns1","ns2","ns","removeEvent","namespaces","cache","sel","removeEventListener","trigger","event","nameOriginal","name_1","createEvent","initEvent","namespace","___ot","___td","isEventFocus","dispatchEvent","off","eventFullName","_this","replaceAll","on","_one","isEventHover","finalCallback","stopImmediatePropagation","relatedTarget","thisArg","defineProperty","configurable","returnValue","preventDefault","stopPropagation","eventCache","addEvent","one","queryEncodeCRLFRe","skippableRe","serialize","query","elements","encodeURIComponent","queryEncode","module","exports","___CSS_LOADER_EXPORT___","id","cssWithMappingToString","list","toString","needLayer","modules","media","dedupe","supports","layer","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","sourceMapping","stylesInDOM","getIndexByIdentifier","identifier","result","modulesToDom","idCountMap","identifiers","base","count","indexByIdentifier","obj","sourceMap","references","updater","addElementStyle","byIndex","api","domAPI","update","newObj","lastIdentifiers","newList","newLastIdentifiers","_index","memo","insert","styleTarget","querySelector","HTMLIFrameElement","e","getTarget","Error","appendChild","element","setAttributes","attributes","styleElement","nonce","insertStyleElement","styleTagTransform","removeStyleElement","styleSheet","cssText","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","d","definition","o","enumerable","hasOwnProperty","r","toStringTag","nc","grok","DG","ui","CampaignIdKey","HitDesignCampaignIdKey","CampaignTableName","CampaignJsonName","HitTriageDataSourceTag","HitTriageSubmitTag","HitSelectionColName","TileCategoriesColName","HitDesignMolColName","PeptiHitHelmColName","ViDColName","ViDColFormat","HTScriptPrefix","HTQueryPrefix","ComputeQueryMolColName","i18n","funcTypeNames","script","function","locals","toFormatedDateString","getFullYear","getMonth","getDate","modifyUrl","title","url","location","href","history","replaceState","Title","Url","addBreadCrumbsToRibbons","view","firstPath","secondPath","handler","breadcrumbs","sub","onPathClick","subscribe","path","unsubscribe","popRibbonPannels","viewNameRoot","v","ribbonMenu","root","parentElement","ribbons","getRibbonPanels","pop","setRibbonPanels","checkRibbonsHaveSubmit","reduce","cur","from","joinQueryResults","df","molColName","qRes","rowCount","col","resOriginalCol","meta","detectSemanticTypes","columns","bySemType","MOLECULE","newColNames","names","loadCampaigns","appName","deletedCampaigns","campaignFolders","_package","files","f","campaignNamesMap","folder","campaignJson","readAsText","authorUserId","permissions","checkViewPermissions","checkPermissions","authorId","groupIdList","userId","current","userGroupId","group","dapiGroups","groups","groupId","personal","user","getUser","members","memberGroup","checkEditPermissions","edit","Set","CampaignFieldTypes","STRING","FLOAT","Boolean","BOOL","Date","DATE_TIME","Molecule","chemFunctionsDialog","app","onOk","onCancel","template","dialog","computeFunctions","allFunctions","functions","inputs","propertyType","forEach","func","args","compute","tf","package","scripts","s","ts","queries","q","useDescriptors","descriptors","enabled","host","descriptorItems","descriptorsGroup","descriptorsTree","createTreeGroup","treeNode","res","enableCheckBox","preselectedDescriptors","groupName","descriptor","includes","console","error","descriptorsName","funcNamesMap","tabControlArgs","funcInputsMap","calculatedFunctions","funcCall","prepare","keyName","editor","buildEditor","condensed","marginLeft","removeProperty","friendlyName","input","property","fireChanged","tc","onOkProxy","externals","filteredFuncs","entries","_","startsWith","inputName","inputVal","log","onTabChanged","currentPane","header","overflow","width","minWidth","panes","pane","functionCheck","bool","onValueChanged","setTooltip","onOK","okProxy","rxjs","ItemsGrid","properties","items","onItemChanged","Subject","onAddingItemChanged","onItemAdded","onItemRemoved","removeButtonTooltip","addButtonTooltip","allowAdd","allowRemove","assign","_root","gridTemplateColumns","alignItems","gap","_items","render","addItem","notify","removeItem","removeAtIndex","removed","removeAllItems","_b","_c","_d","_e","horizontalInputNames","label","caption","customLabels","editors","getItemDiv","newEditor","newItemFunction","isAdding","inputsMap","lastInput","customInputs","forProperty","validator","validators","addValidator","hideLabel","onChanged","fieldName","companionButton","newItem","pName","delete","addOptions","color","el","hasErrors","getLayoutInput","dataFileProp","fromOptions","dataFileInput","layout","layoutViewState","contentString","readAsString","fromJson","viewState","getLayout","getLayoutViewState","createTemplateAccordeon","dataSourceFunctionMap","availableTemplates","file","availableTemplateKeys","tn","t","availableSubmitFunctions","tags","submitFunctionsMap","submitFunctionInput","choice","nullable","layoutInput","errorDiv","keyErrorDiv","templateNameInput","string","borderBottom","templateKeyInput","funcDialogRes","funcInput","combinedSourceNames","dataSourceFunctionInput","ingestTypeInput","fieldsEditor","getCampaignFieldEditors","form","fieldsDiv","buttonsDiv","buttonsContainerDiv","cancelPromise","Promise","resolve","cancelButton","promise","createTemplateButton","submitFunction","out","campaignFields","getFields","dataSourceType","funcName","splitFunc","scriptId","scriptNameParts","queryName","queryNameParts","submit","fName","queryFunctionName","writeAsText","info","preset","props","choices","itemsGrid","Name","Type","Required","required","maxWidth","addingItem","fieldsContainer","HitBaseView","super","onActivated","onReset","process","deleteCampaign","campaignId","u2","panels","tools","vert","horz","appHeader","icon","iconPath","description","learnMoreUrl","runAsync","_arguments","generator","P","reject","fulfilled","step","rejected","done","then","defaultPermissions","defaultGroupsIds","PermissionsDialog","editGroupsInput","userGroups","marginBottom","viewGroupsInput","getDialogContent","viewGroups","editGroups","editSet","viewSet","InfoView","readmePath","webRoot","dataSourceFunctionsMap","windows","showHelp","help","checkCampaign","campaign","presetTemplate","continueCampaignsHeader","createNewCampaignHeader","campaignAccordionDiv","templatesDiv","campaignsTable","getCampaignsTable","startNewCampaign","resetBaseUrl","containerDiv","templateInputDiv","templates","onTemmplateChange","templateName","templatesInput","newCampaignAccordeon","getNewCampaignAccordeon","className","createNewtemplateButton","createNewTemplate","campId","search","urlParams","URLSearchParams","exists","setBaseUrl","setTemplate","filters","ingest","deleteCampaignIcon","canEdit","campaignsInfo","values","setCampaign","createDate","filteredRowCount","status","campaignName","campaignDetailsDiv","fileDf","onFileChange","dfInput","innerText","fileInputDiv","onDataFunctionChange","getEditor","funcEditorDiv","functionInputDiv","dataInputsDiv","campaignProps","field","semtype","semType","campaignPropsObject","campaignPropsForm","funcCallInputs","startCampaignButton","camp","dataFrame","_fileInputType","saveCampaign","newTemplateAccordeon","newView","curView","parentCall","addView","URL","baseUrl","pathname","parentView","close","SubmitView","getSummary","submitParams","submitFn","filteredDf","fromCsv","toCsv","filteredRowsOnly","molecules","HitAppBase","_appName","appN","isJoining","hasEditPermission","funcs","setCanEdit","urlObj","origin","getFilterType","colName","SUBSTRUCTURE","BOOL_COLUMNS","CATEGORICAL","HISTOGRAM","download","onlyFiltered","fromColumns","toList","click","getNewCampaignName","folderName","templateKey","templateCampaigns","postFixes","unionDataframes","df1","df2","df1MolCol","it","convert","Notation","Unknown","Smiles","df2MolCol","addNew","rows","set","getNewVid","vidCol","maxId","vid","num","substring","fill","calculateColumns","resultMap","pg","create","molCol","isNone","newVal","tablePropName","colPropName","scriptName","scriptParts","sn","language","getUnusedName","queryParts","queryId","qn","listPropName","molList","resDf","HitTriageApp","infoView","_infoView","_filterViewName","_filterDescriptions","_pickViewPromise","multiView","viewFactories","tabs","currentView","onCurrentViewChanged","currentPickViewId","_campaignId","_campaign","presetFilters","ingestProps","_pickView","closeTable","readCsv","columnSemTypes","byName","columnTypes","convertTo","_molColName","_dfName","_campaignFilters","pickV","pickView","_submitView","filterSettings","getFilterView","fileInputType","resolvePromise","addNewBool","calculateRibbon","oldDescriptors","oldFunctions","oldScripts","oldQueries","newDescriptors","newComputeObj","uncalculatedDescriptors","uncalculatedFunctions","oldFunc","every","uncalculatedScripts","oldScript","uncalculatedQueries","oldQuery","externalFuncs","externalScripts","externalQueries","submitButton","dialogContent","dlg","addButton","permissionsButton","hasSubmit","_onAdded","fromViewState","loadLayout","onFilterChanged","getOptions","look","trim","trueCount","enrichedDf","campaignPrefix","campaignNameInput","saveCampaignDialog","colTypeMap","csvDf","newLayout","saveLayout","warning","newHitDesignCampaignAccordeon","peptiHit","pepCol","MACROMOLECULE","units","setTag","SMILES","stages","vIdCol","newHitDesignTemplateAccordeon","hasNameError","hasKeyError","availableTemplateNames","onTemplateNameChanged","offsetLeft","offsetWidth","borderTop","onTemplateKeyChange","dummyTemplate","tileCategoriesEditor","getTileCategoryEditor","detailsDiv","stagesHeader","computeHeader","HitDesignInfoView","getAppHeader","contentDiv","endsWith","selectedTemplate","templateChangeFlag","cloneTemplateButton","copy","deleteTempleteButton","prevValue","deleteAndShareCampaignIcons","deleteIcon","shareIcon","HitDesignSubmitView","getTilesViewDialog","getTableView","tilesViewerSketchStateString","tilesViewerFormSketch","sketchState","elementStates","elementState","viewerSettings","column","elState","tileOpts","lanesColumnName","lanes","tv","modal","addViewer","TILE_VIEWER","opts","setOptions","copyViewersLook","stageEditorDialog","closeViewer","stageEditor","setStages","viewChangeSub","closeSub","onClose","stringState","showModal","getButton","operators","HitDesignApp","version","an","infoViewConstructor","_designViewName","_filePath","mainView","_initViewChangeSub","subs","currentDesignViewId","_designView","st","stageCol","removedStages","stageSet","uniqueStages","dfLen","stageCats","categories","stageIndexes","getRawData","stage","fileLoc","savePath","changeColumnType","designV","designView","getDesignView","designViewName","cacheDuplicateVIDs","_duplicateVidCache","colVersion","valueCounts","Uint32Array","indexes","subarray","duplicateVidCache","performSingleCellCalculations","newValueIdx","newValue","computeObj","calcDf","canonicalSmiles","fromStrings","fs","warn","scriptFunc","queryFunc","valueList","calculateSingleCellValues","fireValuesChanged","initDesignViewRibbons","onRemoveSub","onViewRemoved","getComputeDialog","newFunctions","newScripts","newQueries","grid","addNewRowButton","tilesButton","ribbonButtons","unshift","rg","saveBtnIdx","findIndex","isNew","m","addTableView","cell","onRowsAdded","pipe","colVal","lastAddedCell","onContextMenu","viewer","GRID","tableView","tableColumn","isTableCell","menu","row","idx","cellIndex","tableRowIndex","cellValue","resetLayout","onCellValueEdited","gc","newVid","foundMatch","canonicals","cv","canonicalNewValue","onCellRender","backColor","setAlpha","getCategoricalColor","getFolderPath","campaignIndex","toLocaleDateString","date","drawMolecule","editIcon","folderPath","newPathInput","labelElement","saveButton","newPath","checkFolder","pathDiv","link","getPathEditor","sketchStateString","campaignPath","prevCamp","prevCampDf","GasteigerPngRenderer","cellType","defaultHeight","defaultWidth","g","x","y","w","h","gridCell","_cellStyle","pngString","img","Image","src","onload","drawImage","PeptiHitInfoView","PeptiHitApp","_helmColName","helmColName","seqCol","nonlinear","mol","helmCol","hitAppTB","browseView","camps","onSelected","semtypeInfo","preview","hitTriageAppTreeBrowser","hitDesignAppTreeBrowser","peptiHitAppTreeBrowser","hitTriageApp","getCurrentCall","hitDesignApp","peptiHitApp","demoFileIngest","demo","demoFileIngest1","demoFileIngest2","numberOfMolecules","demoFileSubmit","gasteigerCellRenderer"],"sourceRoot":""}
1
+ {"version":3,"file":"package.js","mappings":"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","sources":["webpack://hittriage/./node_modules/cash-dom/dist/cash.js","webpack://hittriage/./css/hit-triage.css","webpack://hittriage/./node_modules/@datagrok-libraries/utils/src/u2.css","webpack://hittriage/./src/app/hit-design-views/utils.css","webpack://hittriage/./node_modules/css-loader/dist/runtime/api.js","webpack://hittriage/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://hittriage/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://hittriage/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://hittriage/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://hittriage/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://hittriage/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://hittriage/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://hittriage/webpack/bootstrap","webpack://hittriage/webpack/runtime/compat get default export","webpack://hittriage/webpack/runtime/define property getters","webpack://hittriage/webpack/runtime/hasOwnProperty shorthand","webpack://hittriage/webpack/runtime/make namespace object","webpack://hittriage/webpack/runtime/nonce","webpack://hittriage/external var \"grok\"","webpack://hittriage/external var \"DG\"","webpack://hittriage/external var \"ui\"","webpack://hittriage/./src/app/consts.ts","webpack://hittriage/./css/hit-triage.css?fbc4","webpack://hittriage/./src/app/utils.ts","webpack://hittriage/./src/app/types.ts","webpack://hittriage/./src/app/dialogs/functions-dialog.ts","webpack://hittriage/external var \"rxjs\"","webpack://hittriage/./node_modules/@datagrok-libraries/utils/src/items-grid.js","webpack://hittriage/./src/app/accordeons/layout-input.ts","webpack://hittriage/./src/app/accordeons/new-template-accordeon.ts","webpack://hittriage/./src/app/base-view.ts","webpack://hittriage/./node_modules/@datagrok-libraries/utils/src/u2.css?f539","webpack://hittriage/./node_modules/@datagrok-libraries/utils/src/u2.js","webpack://hittriage/./src/app/dialogs/permissions-dialog.ts","webpack://hittriage/./src/app/hit-triage-views/info-view.ts","webpack://hittriage/./src/app/accordeons/new-campaign-accordeon.ts","webpack://hittriage/./src/app/hit-triage-views/submit-view.ts","webpack://hittriage/./src/app/hit-app-base.ts","webpack://hittriage/./src/app/utils/calculate-single-cell.ts","webpack://hittriage/./src/app/hit-triage-app.ts","webpack://hittriage/./src/app/dialogs/save-campaign-dialog.ts","webpack://hittriage/./src/app/accordeons/new-hit-design-campaign-accordeon.ts","webpack://hittriage/./src/app/accordeons/new-hit-design-template-accordeon.ts","webpack://hittriage/./src/app/hit-design-views/info-view.ts","webpack://hittriage/./src/app/hit-design-views/submit-view.ts","webpack://hittriage/./src/app/hit-design-views/utils.css?aa42","webpack://hittriage/./src/app/hit-design-views/tiles-view.ts","webpack://hittriage/external var \"rxjs.operators\"","webpack://hittriage/./src/app/hit-design-app.ts","webpack://hittriage/./src/pngRenderers.ts","webpack://hittriage/./src/app/pepti-hits-views/info-view.ts","webpack://hittriage/./src/app/pepti-hit-app.ts","webpack://hittriage/./src/package.ts"],"sourcesContent":["(function(){\n\"use strict\";\nvar doc = document;\nvar win = window;\nvar docEle = doc.documentElement;\nvar createElement = doc.createElement.bind(doc);\nvar div = createElement('div');\nvar table = createElement('table');\nvar tbody = createElement('tbody');\nvar tr = createElement('tr');\nvar isArray = Array.isArray, ArrayPrototype = Array.prototype;\nvar concat = ArrayPrototype.concat, filter = ArrayPrototype.filter, indexOf = ArrayPrototype.indexOf, map = ArrayPrototype.map, push = ArrayPrototype.push, slice = ArrayPrototype.slice, some = ArrayPrototype.some, splice = ArrayPrototype.splice;\nvar idRe = /^#(?:[\\w-]|\\\\.|[^\\x00-\\xa0])*$/;\nvar classRe = /^\\.(?:[\\w-]|\\\\.|[^\\x00-\\xa0])*$/;\nvar htmlRe = /<.+>/;\nvar tagRe = /^\\w+$/;\n// @require ./variables.ts\nfunction find(selector, context) {\n var isFragment = isDocumentFragment(context);\n return !selector || (!isFragment && !isDocument(context) && !isElement(context))\n ? []\n : !isFragment && classRe.test(selector)\n ? context.getElementsByClassName(selector.slice(1).replace(/\\\\/g, ''))\n : !isFragment && tagRe.test(selector)\n ? context.getElementsByTagName(selector)\n : context.querySelectorAll(selector);\n}\n// @require ./find.ts\n// @require ./variables.ts\nvar Cash = /** @class */ (function () {\n function Cash(selector, context) {\n if (!selector)\n return;\n if (isCash(selector))\n return selector;\n var eles = selector;\n if (isString(selector)) {\n var ctx = context || doc;\n eles = idRe.test(selector) && isDocument(ctx)\n ? ctx.getElementById(selector.slice(1).replace(/\\\\/g, ''))\n : htmlRe.test(selector)\n ? parseHTML(selector)\n : isCash(ctx)\n ? ctx.find(selector)\n : isString(ctx)\n ? cash(ctx).find(selector)\n : find(selector, ctx);\n if (!eles)\n return;\n }\n else if (isFunction(selector)) {\n return this.ready(selector); //FIXME: `fn.ready` is not included in `core`, but it's actually a core functionality\n }\n if (eles.nodeType || eles === win)\n eles = [eles];\n this.length = eles.length;\n for (var i = 0, l = this.length; i < l; i++) {\n this[i] = eles[i];\n }\n }\n Cash.prototype.init = function (selector, context) {\n return new Cash(selector, context);\n };\n return Cash;\n}());\nvar fn = Cash.prototype;\nvar cash = fn.init;\ncash.fn = cash.prototype = fn; // Ensuring that `cash () instanceof cash`\nfn.length = 0;\nfn.splice = splice; // Ensuring a cash collection gets printed as array-like in Chrome's devtools\nif (typeof Symbol === 'function') { // Ensuring a cash collection is iterable\n fn[Symbol['iterator']] = ArrayPrototype[Symbol['iterator']];\n}\nfunction isCash(value) {\n return value instanceof Cash;\n}\nfunction isWindow(value) {\n return !!value && value === value.window;\n}\nfunction isDocument(value) {\n return !!value && value.nodeType === 9;\n}\nfunction isDocumentFragment(value) {\n return !!value && value.nodeType === 11;\n}\nfunction isElement(value) {\n return !!value && value.nodeType === 1;\n}\nfunction isText(value) {\n return !!value && value.nodeType === 3;\n}\nfunction isBoolean(value) {\n return typeof value === 'boolean';\n}\nfunction isFunction(value) {\n return typeof value === 'function';\n}\nfunction isString(value) {\n return typeof value === 'string';\n}\nfunction isUndefined(value) {\n return value === undefined;\n}\nfunction isNull(value) {\n return value === null;\n}\nfunction isNumeric(value) {\n return !isNaN(parseFloat(value)) && isFinite(value);\n}\nfunction isPlainObject(value) {\n if (typeof value !== 'object' || value === null)\n return false;\n var proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\ncash.isWindow = isWindow;\ncash.isFunction = isFunction;\ncash.isArray = isArray;\ncash.isNumeric = isNumeric;\ncash.isPlainObject = isPlainObject;\nfunction each(arr, callback, _reverse) {\n if (_reverse) {\n var i = arr.length;\n while (i--) {\n if (callback.call(arr[i], i, arr[i]) === false)\n return arr;\n }\n }\n else if (isPlainObject(arr)) {\n var keys = Object.keys(arr);\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n if (callback.call(arr[key], key, arr[key]) === false)\n return arr;\n }\n }\n else {\n for (var i = 0, l = arr.length; i < l; i++) {\n if (callback.call(arr[i], i, arr[i]) === false)\n return arr;\n }\n }\n return arr;\n}\ncash.each = each;\nfn.each = function (callback) {\n return each(this, callback);\n};\nfn.empty = function () {\n return this.each(function (i, ele) {\n while (ele.firstChild) {\n ele.removeChild(ele.firstChild);\n }\n });\n};\nfunction extend() {\n var sources = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n sources[_i] = arguments[_i];\n }\n var deep = isBoolean(sources[0]) ? sources.shift() : false;\n var target = sources.shift();\n var length = sources.length;\n if (!target)\n return {};\n if (!length)\n return extend(deep, cash, target);\n for (var i = 0; i < length; i++) {\n var source = sources[i];\n for (var key in source) {\n if (deep && (isArray(source[key]) || isPlainObject(source[key]))) {\n if (!target[key] || target[key].constructor !== source[key].constructor)\n target[key] = new source[key].constructor();\n extend(deep, target[key], source[key]);\n }\n else {\n target[key] = source[key];\n }\n }\n }\n return target;\n}\ncash.extend = extend;\nfn.extend = function (plugins) {\n return extend(fn, plugins);\n};\n// @require ./type_checking.ts\nvar splitValuesRe = /\\S+/g;\nfunction getSplitValues(str) {\n return isString(str) ? str.match(splitValuesRe) || [] : [];\n}\nfn.toggleClass = function (cls, force) {\n var classes = getSplitValues(cls);\n var isForce = !isUndefined(force);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n each(classes, function (i, c) {\n if (isForce) {\n force ? ele.classList.add(c) : ele.classList.remove(c);\n }\n else {\n ele.classList.toggle(c);\n }\n });\n });\n};\nfn.addClass = function (cls) {\n return this.toggleClass(cls, true);\n};\nfn.removeAttr = function (attr) {\n var attrs = getSplitValues(attr);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n each(attrs, function (i, a) {\n ele.removeAttribute(a);\n });\n });\n};\nfunction attr(attr, value) {\n if (!attr)\n return;\n if (isString(attr)) {\n if (arguments.length < 2) {\n if (!this[0] || !isElement(this[0]))\n return;\n var value_1 = this[0].getAttribute(attr);\n return isNull(value_1) ? undefined : value_1;\n }\n if (isUndefined(value))\n return this;\n if (isNull(value))\n return this.removeAttr(attr);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n ele.setAttribute(attr, value);\n });\n }\n for (var key in attr) {\n this.attr(key, attr[key]);\n }\n return this;\n}\nfn.attr = attr;\nfn.removeClass = function (cls) {\n if (arguments.length)\n return this.toggleClass(cls, false);\n return this.attr('class', '');\n};\nfn.hasClass = function (cls) {\n return !!cls && some.call(this, function (ele) { return isElement(ele) && ele.classList.contains(cls); });\n};\nfn.get = function (index) {\n if (isUndefined(index))\n return slice.call(this);\n index = Number(index);\n return this[index < 0 ? index + this.length : index];\n};\nfn.eq = function (index) {\n return cash(this.get(index));\n};\nfn.first = function () {\n return this.eq(0);\n};\nfn.last = function () {\n return this.eq(-1);\n};\nfunction text(text) {\n if (isUndefined(text)) {\n return this.get().map(function (ele) { return isElement(ele) || isText(ele) ? ele.textContent : ''; }).join('');\n }\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n ele.textContent = text;\n });\n}\nfn.text = text;\n// @require core/type_checking.ts\n// @require core/variables.ts\nfunction computeStyle(ele, prop, isVariable) {\n if (!isElement(ele))\n return;\n var style = win.getComputedStyle(ele, null);\n return isVariable ? style.getPropertyValue(prop) || undefined : style[prop] || ele.style[prop];\n}\n// @require ./compute_style.ts\nfunction computeStyleInt(ele, prop) {\n return parseInt(computeStyle(ele, prop), 10) || 0;\n}\n// @require css/helpers/compute_style_int.ts\nfunction getExtraSpace(ele, xAxis) {\n return computeStyleInt(ele, \"border\".concat(xAxis ? 'Left' : 'Top', \"Width\")) + computeStyleInt(ele, \"padding\".concat(xAxis ? 'Left' : 'Top')) + computeStyleInt(ele, \"padding\".concat(xAxis ? 'Right' : 'Bottom')) + computeStyleInt(ele, \"border\".concat(xAxis ? 'Right' : 'Bottom', \"Width\"));\n}\n// @require css/helpers/compute_style.ts\nvar defaultDisplay = {};\nfunction getDefaultDisplay(tagName) {\n if (defaultDisplay[tagName])\n return defaultDisplay[tagName];\n var ele = createElement(tagName);\n doc.body.insertBefore(ele, null);\n var display = computeStyle(ele, 'display');\n doc.body.removeChild(ele);\n return defaultDisplay[tagName] = display !== 'none' ? display : 'block';\n}\n// @require css/helpers/compute_style.ts\nfunction isHidden(ele) {\n return computeStyle(ele, 'display') === 'none';\n}\n// @require ./cash.ts\nfunction matches(ele, selector) {\n var matches = ele && (ele['matches'] || ele['webkitMatchesSelector'] || ele['msMatchesSelector']);\n return !!matches && !!selector && matches.call(ele, selector);\n}\n// @require ./matches.ts\n// @require ./type_checking.ts\nfunction getCompareFunction(comparator) {\n return isString(comparator)\n ? function (i, ele) { return matches(ele, comparator); }\n : isFunction(comparator)\n ? comparator\n : isCash(comparator)\n ? function (i, ele) { return comparator.is(ele); }\n : !comparator\n ? function () { return false; }\n : function (i, ele) { return ele === comparator; };\n}\nfn.filter = function (comparator) {\n var compare = getCompareFunction(comparator);\n return cash(filter.call(this, function (ele, i) { return compare.call(ele, i, ele); }));\n};\n// @require collection/filter.ts\nfunction filtered(collection, comparator) {\n return !comparator ? collection : collection.filter(comparator);\n}\nfn.detach = function (comparator) {\n filtered(this, comparator).each(function (i, ele) {\n if (ele.parentNode) {\n ele.parentNode.removeChild(ele);\n }\n });\n return this;\n};\nvar fragmentRe = /^\\s*<(\\w+)[^>]*>/;\nvar singleTagRe = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/;\nvar containers = {\n '*': div,\n tr: tbody,\n td: tr,\n th: tr,\n thead: table,\n tbody: table,\n tfoot: table\n};\n//TODO: Create elements inside a document fragment, in order to prevent inline event handlers from firing\n//TODO: Ensure the created elements have the fragment as their parent instead of null, this also ensures we can deal with detatched nodes more reliably\nfunction parseHTML(html) {\n if (!isString(html))\n return [];\n if (singleTagRe.test(html))\n return [createElement(RegExp.$1)];\n var fragment = fragmentRe.test(html) && RegExp.$1;\n var container = containers[fragment] || containers['*'];\n container.innerHTML = html;\n return cash(container.childNodes).detach().get();\n}\ncash.parseHTML = parseHTML;\nfn.has = function (selector) {\n var comparator = isString(selector)\n ? function (i, ele) { return find(selector, ele).length; }\n : function (i, ele) { return ele.contains(selector); };\n return this.filter(comparator);\n};\nfn.not = function (comparator) {\n var compare = getCompareFunction(comparator);\n return this.filter(function (i, ele) { return (!isString(comparator) || isElement(ele)) && !compare.call(ele, i, ele); });\n};\nfunction pluck(arr, prop, deep, until) {\n var plucked = [];\n var isCallback = isFunction(prop);\n var compare = until && getCompareFunction(until);\n for (var i = 0, l = arr.length; i < l; i++) {\n if (isCallback) {\n var val_1 = prop(arr[i]);\n if (val_1.length)\n push.apply(plucked, val_1);\n }\n else {\n var val_2 = arr[i][prop];\n while (val_2 != null) {\n if (until && compare(-1, val_2))\n break;\n plucked.push(val_2);\n val_2 = deep ? val_2[prop] : null;\n }\n }\n }\n return plucked;\n}\n// @require core/pluck.ts\n// @require core/variables.ts\nfunction getValue(ele) {\n if (ele.multiple && ele.options)\n return pluck(filter.call(ele.options, function (option) { return option.selected && !option.disabled && !option.parentNode.disabled; }), 'value');\n return ele.value || '';\n}\nfunction val(value) {\n if (!arguments.length)\n return this[0] && getValue(this[0]);\n return this.each(function (i, ele) {\n var isSelect = ele.multiple && ele.options;\n if (isSelect || checkableRe.test(ele.type)) {\n var eleValue_1 = isArray(value) ? map.call(value, String) : (isNull(value) ? [] : [String(value)]);\n if (isSelect) {\n each(ele.options, function (i, option) {\n option.selected = eleValue_1.indexOf(option.value) >= 0;\n }, true);\n }\n else {\n ele.checked = eleValue_1.indexOf(ele.value) >= 0;\n }\n }\n else {\n ele.value = isUndefined(value) || isNull(value) ? '' : value;\n }\n });\n}\nfn.val = val;\nfn.is = function (comparator) {\n var compare = getCompareFunction(comparator);\n return some.call(this, function (ele, i) { return compare.call(ele, i, ele); });\n};\ncash.guid = 1;\nfunction unique(arr) {\n return arr.length > 1 ? filter.call(arr, function (item, index, self) { return indexOf.call(self, item) === index; }) : arr;\n}\ncash.unique = unique;\nfn.add = function (selector, context) {\n return cash(unique(this.get().concat(cash(selector, context).get())));\n};\nfn.children = function (comparator) {\n return filtered(cash(unique(pluck(this, function (ele) { return ele.children; }))), comparator);\n};\nfn.parent = function (comparator) {\n return filtered(cash(unique(pluck(this, 'parentNode'))), comparator);\n};\nfn.index = function (selector) {\n var child = selector ? cash(selector)[0] : this[0];\n var collection = selector ? this : cash(child).parent().children();\n return indexOf.call(collection, child);\n};\nfn.closest = function (comparator) {\n var filtered = this.filter(comparator);\n if (filtered.length)\n return filtered;\n var $parent = this.parent();\n if (!$parent.length)\n return filtered;\n return $parent.closest(comparator);\n};\nfn.siblings = function (comparator) {\n return filtered(cash(unique(pluck(this, function (ele) { return cash(ele).parent().children().not(ele); }))), comparator);\n};\nfn.find = function (selector) {\n return cash(unique(pluck(this, function (ele) { return find(selector, ele); })));\n};\n// @require core/variables.ts\n// @require collection/filter.ts\n// @require traversal/find.ts\nvar HTMLCDATARe = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\nvar scriptTypeRe = /^$|^module$|\\/(java|ecma)script/i;\nvar scriptAttributes = ['type', 'src', 'nonce', 'noModule'];\nfunction evalScripts(node, doc) {\n var collection = cash(node);\n collection.filter('script').add(collection.find('script')).each(function (i, ele) {\n if (scriptTypeRe.test(ele.type) && docEle.contains(ele)) { // The script type is supported // The element is attached to the DOM // Using `documentElement` for broader browser support\n var script_1 = createElement('script');\n script_1.text = ele.textContent.replace(HTMLCDATARe, '');\n each(scriptAttributes, function (i, attr) {\n if (ele[attr])\n script_1[attr] = ele[attr];\n });\n doc.head.insertBefore(script_1, null);\n doc.head.removeChild(script_1);\n }\n });\n}\n// @require ./eval_scripts.ts\nfunction insertElement(anchor, target, left, inside, evaluate) {\n if (inside) { // prepend/append\n anchor.insertBefore(target, left ? anchor.firstChild : null);\n }\n else { // before/after\n if (anchor.nodeName === 'HTML') {\n anchor.parentNode.replaceChild(target, anchor);\n }\n else {\n anchor.parentNode.insertBefore(target, left ? anchor : anchor.nextSibling);\n }\n }\n if (evaluate) {\n evalScripts(target, anchor.ownerDocument);\n }\n}\n// @require ./insert_element.ts\nfunction insertSelectors(selectors, anchors, inverse, left, inside, reverseLoop1, reverseLoop2, reverseLoop3) {\n each(selectors, function (si, selector) {\n each(cash(selector), function (ti, target) {\n each(cash(anchors), function (ai, anchor) {\n var anchorFinal = inverse ? target : anchor;\n var targetFinal = inverse ? anchor : target;\n var indexFinal = inverse ? ti : ai;\n insertElement(anchorFinal, !indexFinal ? targetFinal : targetFinal.cloneNode(true), left, inside, !indexFinal);\n }, reverseLoop3);\n }, reverseLoop2);\n }, reverseLoop1);\n return anchors;\n}\nfn.after = function () {\n return insertSelectors(arguments, this, false, false, false, true, true);\n};\nfn.append = function () {\n return insertSelectors(arguments, this, false, false, true);\n};\nfunction html(html) {\n if (!arguments.length)\n return this[0] && this[0].innerHTML;\n if (isUndefined(html))\n return this;\n var hasScript = /<script[\\s>]/.test(html);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n if (hasScript) {\n cash(ele).empty().append(html);\n }\n else {\n ele.innerHTML = html;\n }\n });\n}\nfn.html = html;\nfn.appendTo = function (selector) {\n return insertSelectors(arguments, this, true, false, true);\n};\nfn.wrapInner = function (selector) {\n return this.each(function (i, ele) {\n var $ele = cash(ele);\n var contents = $ele.contents();\n contents.length ? contents.wrapAll(selector) : $ele.append(selector);\n });\n};\nfn.before = function () {\n return insertSelectors(arguments, this, false, true);\n};\nfn.wrapAll = function (selector) {\n var structure = cash(selector);\n var wrapper = structure[0];\n while (wrapper.children.length)\n wrapper = wrapper.firstElementChild;\n this.first().before(structure);\n return this.appendTo(wrapper);\n};\nfn.wrap = function (selector) {\n return this.each(function (i, ele) {\n var wrapper = cash(selector)[0];\n cash(ele).wrapAll(!i ? wrapper : wrapper.cloneNode(true));\n });\n};\nfn.insertAfter = function (selector) {\n return insertSelectors(arguments, this, true, false, false, false, false, true);\n};\nfn.insertBefore = function (selector) {\n return insertSelectors(arguments, this, true, true);\n};\nfn.prepend = function () {\n return insertSelectors(arguments, this, false, true, true, true, true);\n};\nfn.prependTo = function (selector) {\n return insertSelectors(arguments, this, true, true, true, false, false, true);\n};\nfn.contents = function () {\n return cash(unique(pluck(this, function (ele) { return ele.tagName === 'IFRAME' ? [ele.contentDocument] : (ele.tagName === 'TEMPLATE' ? ele.content.childNodes : ele.childNodes); })));\n};\nfn.next = function (comparator, _all, _until) {\n return filtered(cash(unique(pluck(this, 'nextElementSibling', _all, _until))), comparator);\n};\nfn.nextAll = function (comparator) {\n return this.next(comparator, true);\n};\nfn.nextUntil = function (until, comparator) {\n return this.next(comparator, true, until);\n};\nfn.parents = function (comparator, _until) {\n return filtered(cash(unique(pluck(this, 'parentElement', true, _until))), comparator);\n};\nfn.parentsUntil = function (until, comparator) {\n return this.parents(comparator, until);\n};\nfn.prev = function (comparator, _all, _until) {\n return filtered(cash(unique(pluck(this, 'previousElementSibling', _all, _until))), comparator);\n};\nfn.prevAll = function (comparator) {\n return this.prev(comparator, true);\n};\nfn.prevUntil = function (until, comparator) {\n return this.prev(comparator, true, until);\n};\nfn.map = function (callback) {\n return cash(concat.apply([], map.call(this, function (ele, i) { return callback.call(ele, i, ele); })));\n};\nfn.clone = function () {\n return this.map(function (i, ele) { return ele.cloneNode(true); });\n};\nfn.offsetParent = function () {\n return this.map(function (i, ele) {\n var offsetParent = ele.offsetParent;\n while (offsetParent && computeStyle(offsetParent, 'position') === 'static') {\n offsetParent = offsetParent.offsetParent;\n }\n return offsetParent || docEle;\n });\n};\nfn.slice = function (start, end) {\n return cash(slice.call(this, start, end));\n};\n// @require ./cash.ts\nvar dashAlphaRe = /-([a-z])/g;\nfunction camelCase(str) {\n return str.replace(dashAlphaRe, function (match, letter) { return letter.toUpperCase(); });\n}\nfn.ready = function (callback) {\n var cb = function () { return setTimeout(callback, 0, cash); };\n if (doc.readyState !== 'loading') {\n cb();\n }\n else {\n doc.addEventListener('DOMContentLoaded', cb);\n }\n return this;\n};\nfn.unwrap = function () {\n this.parent().each(function (i, ele) {\n if (ele.tagName === 'BODY')\n return;\n var $ele = cash(ele);\n $ele.replaceWith($ele.children());\n });\n return this;\n};\nfn.offset = function () {\n var ele = this[0];\n if (!ele)\n return;\n var rect = ele.getBoundingClientRect();\n return {\n top: rect.top + win.pageYOffset,\n left: rect.left + win.pageXOffset\n };\n};\nfn.position = function () {\n var ele = this[0];\n if (!ele)\n return;\n var isFixed = (computeStyle(ele, 'position') === 'fixed');\n var offset = isFixed ? ele.getBoundingClientRect() : this.offset();\n if (!isFixed) {\n var doc_1 = ele.ownerDocument;\n var offsetParent = ele.offsetParent || doc_1.documentElement;\n while ((offsetParent === doc_1.body || offsetParent === doc_1.documentElement) && computeStyle(offsetParent, 'position') === 'static') {\n offsetParent = offsetParent.parentNode;\n }\n if (offsetParent !== ele && isElement(offsetParent)) {\n var parentOffset = cash(offsetParent).offset();\n offset.top -= parentOffset.top + computeStyleInt(offsetParent, 'borderTopWidth');\n offset.left -= parentOffset.left + computeStyleInt(offsetParent, 'borderLeftWidth');\n }\n }\n return {\n top: offset.top - computeStyleInt(ele, 'marginTop'),\n left: offset.left - computeStyleInt(ele, 'marginLeft')\n };\n};\nvar propMap = {\n /* GENERAL */\n class: 'className',\n contenteditable: 'contentEditable',\n /* LABEL */\n for: 'htmlFor',\n /* INPUT */\n readonly: 'readOnly',\n maxlength: 'maxLength',\n tabindex: 'tabIndex',\n /* TABLE */\n colspan: 'colSpan',\n rowspan: 'rowSpan',\n /* IMAGE */\n usemap: 'useMap'\n};\nfn.prop = function (prop, value) {\n if (!prop)\n return;\n if (isString(prop)) {\n prop = propMap[prop] || prop;\n if (arguments.length < 2)\n return this[0] && this[0][prop];\n return this.each(function (i, ele) { ele[prop] = value; });\n }\n for (var key in prop) {\n this.prop(key, prop[key]);\n }\n return this;\n};\nfn.removeProp = function (prop) {\n return this.each(function (i, ele) { delete ele[propMap[prop] || prop]; });\n};\nvar cssVariableRe = /^--/;\n// @require ./variables.ts\nfunction isCSSVariable(prop) {\n return cssVariableRe.test(prop);\n}\n// @require core/camel_case.ts\n// @require core/cash.ts\n// @require core/each.ts\n// @require core/variables.ts\n// @require ./is_css_variable.ts\nvar prefixedProps = {};\nvar style = div.style;\nvar vendorsPrefixes = ['webkit', 'moz', 'ms'];\nfunction getPrefixedProp(prop, isVariable) {\n if (isVariable === void 0) { isVariable = isCSSVariable(prop); }\n if (isVariable)\n return prop;\n if (!prefixedProps[prop]) {\n var propCC = camelCase(prop);\n var propUC = \"\".concat(propCC[0].toUpperCase()).concat(propCC.slice(1));\n var props = (\"\".concat(propCC, \" \").concat(vendorsPrefixes.join(\"\".concat(propUC, \" \"))).concat(propUC)).split(' ');\n each(props, function (i, p) {\n if (p in style) {\n prefixedProps[prop] = p;\n return false;\n }\n });\n }\n return prefixedProps[prop];\n}\n// @require core/type_checking.ts\n// @require ./is_css_variable.ts\nvar numericProps = {\n animationIterationCount: true,\n columnCount: true,\n flexGrow: true,\n flexShrink: true,\n fontWeight: true,\n gridArea: true,\n gridColumn: true,\n gridColumnEnd: true,\n gridColumnStart: true,\n gridRow: true,\n gridRowEnd: true,\n gridRowStart: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n widows: true,\n zIndex: true\n};\nfunction getSuffixedValue(prop, value, isVariable) {\n if (isVariable === void 0) { isVariable = isCSSVariable(prop); }\n return !isVariable && !numericProps[prop] && isNumeric(value) ? \"\".concat(value, \"px\") : value;\n}\nfunction css(prop, value) {\n if (isString(prop)) {\n var isVariable_1 = isCSSVariable(prop);\n prop = getPrefixedProp(prop, isVariable_1);\n if (arguments.length < 2)\n return this[0] && computeStyle(this[0], prop, isVariable_1);\n if (!prop)\n return this;\n value = getSuffixedValue(prop, value, isVariable_1);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n if (isVariable_1) {\n ele.style.setProperty(prop, value);\n }\n else {\n ele.style[prop] = value;\n }\n });\n }\n for (var key in prop) {\n this.css(key, prop[key]);\n }\n return this;\n}\n;\nfn.css = css;\nfunction attempt(fn, arg) {\n try {\n return fn(arg);\n }\n catch (_a) {\n return arg;\n }\n}\n// @require core/attempt.ts\n// @require core/camel_case.ts\nvar JSONStringRe = /^\\s+|\\s+$/;\nfunction getData(ele, key) {\n var value = ele.dataset[key] || ele.dataset[camelCase(key)];\n if (JSONStringRe.test(value))\n return value;\n return attempt(JSON.parse, value);\n}\n// @require core/attempt.ts\n// @require core/camel_case.ts\nfunction setData(ele, key, value) {\n value = attempt(JSON.stringify, value);\n ele.dataset[camelCase(key)] = value;\n}\nfunction data(name, value) {\n if (!name) {\n if (!this[0])\n return;\n var datas = {};\n for (var key in this[0].dataset) {\n datas[key] = getData(this[0], key);\n }\n return datas;\n }\n if (isString(name)) {\n if (arguments.length < 2)\n return this[0] && getData(this[0], name);\n if (isUndefined(value))\n return this;\n return this.each(function (i, ele) { setData(ele, name, value); });\n }\n for (var key in name) {\n this.data(key, name[key]);\n }\n return this;\n}\nfn.data = data;\nfunction getDocumentDimension(doc, dimension) {\n var docEle = doc.documentElement;\n return Math.max(doc.body[\"scroll\".concat(dimension)], docEle[\"scroll\".concat(dimension)], doc.body[\"offset\".concat(dimension)], docEle[\"offset\".concat(dimension)], docEle[\"client\".concat(dimension)]);\n}\neach([true, false], function (i, outer) {\n each(['Width', 'Height'], function (i, prop) {\n var name = \"\".concat(outer ? 'outer' : 'inner').concat(prop);\n fn[name] = function (includeMargins) {\n if (!this[0])\n return;\n if (isWindow(this[0]))\n return outer ? this[0][\"inner\".concat(prop)] : this[0].document.documentElement[\"client\".concat(prop)];\n if (isDocument(this[0]))\n return getDocumentDimension(this[0], prop);\n return this[0][\"\".concat(outer ? 'offset' : 'client').concat(prop)] + (includeMargins && outer ? computeStyleInt(this[0], \"margin\".concat(i ? 'Top' : 'Left')) + computeStyleInt(this[0], \"margin\".concat(i ? 'Bottom' : 'Right')) : 0);\n };\n });\n});\neach(['Width', 'Height'], function (index, prop) {\n var propLC = prop.toLowerCase();\n fn[propLC] = function (value) {\n if (!this[0])\n return isUndefined(value) ? undefined : this;\n if (!arguments.length) {\n if (isWindow(this[0]))\n return this[0].document.documentElement[\"client\".concat(prop)];\n if (isDocument(this[0]))\n return getDocumentDimension(this[0], prop);\n return this[0].getBoundingClientRect()[propLC] - getExtraSpace(this[0], !index);\n }\n var valueNumber = parseInt(value, 10);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n var boxSizing = computeStyle(ele, 'boxSizing');\n ele.style[propLC] = getSuffixedValue(propLC, valueNumber + (boxSizing === 'border-box' ? getExtraSpace(ele, !index) : 0));\n });\n };\n});\nvar displayProperty = '___cd';\nfn.toggle = function (force) {\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n var hidden = isHidden(ele);\n var show = isUndefined(force) ? hidden : force;\n if (show) {\n ele.style.display = ele[displayProperty] || '';\n if (isHidden(ele)) {\n ele.style.display = getDefaultDisplay(ele.tagName);\n }\n }\n else if (!hidden) {\n ele[displayProperty] = computeStyle(ele, 'display');\n ele.style.display = 'none';\n }\n });\n};\nfn.hide = function () {\n return this.toggle(false);\n};\nfn.show = function () {\n return this.toggle(true);\n};\nvar eventsNamespace = '___ce';\nvar eventsNamespacesSeparator = '.';\nvar eventsFocus = { focus: 'focusin', blur: 'focusout' };\nvar eventsHover = { mouseenter: 'mouseover', mouseleave: 'mouseout' };\nvar eventsMouseRe = /^(mouse|pointer|contextmenu|drag|drop|click|dblclick)/i;\n// @require ./variables.ts\nfunction getEventNameBubbling(name) {\n return eventsHover[name] || eventsFocus[name] || name;\n}\n// @require ./variables.ts\nfunction parseEventName(eventName) {\n var parts = eventName.split(eventsNamespacesSeparator);\n return [parts[0], parts.slice(1).sort()]; // [name, namespace[]]\n}\nfn.trigger = function (event, data) {\n if (isString(event)) {\n var _a = parseEventName(event), nameOriginal = _a[0], namespaces = _a[1];\n var name_1 = getEventNameBubbling(nameOriginal);\n if (!name_1)\n return this;\n var type = eventsMouseRe.test(name_1) ? 'MouseEvents' : 'HTMLEvents';\n event = doc.createEvent(type);\n event.initEvent(name_1, true, true);\n event.namespace = namespaces.join(eventsNamespacesSeparator);\n event.___ot = nameOriginal;\n }\n event.___td = data;\n var isEventFocus = (event.___ot in eventsFocus);\n return this.each(function (i, ele) {\n if (isEventFocus && isFunction(ele[event.___ot])) {\n ele[\"___i\".concat(event.type)] = true; // Ensuring the native event is ignored\n ele[event.___ot]();\n ele[\"___i\".concat(event.type)] = false; // Ensuring the custom event is not ignored\n }\n ele.dispatchEvent(event);\n });\n};\n// @require ./variables.ts\nfunction getEventsCache(ele) {\n return ele[eventsNamespace] = (ele[eventsNamespace] || {});\n}\n// @require core/guid.ts\n// @require events/helpers/get_events_cache.ts\nfunction addEvent(ele, name, namespaces, selector, callback) {\n var eventCache = getEventsCache(ele);\n eventCache[name] = (eventCache[name] || []);\n eventCache[name].push([namespaces, selector, callback]);\n ele.addEventListener(name, callback);\n}\nfunction hasNamespaces(ns1, ns2) {\n return !ns2 || !some.call(ns2, function (ns) { return ns1.indexOf(ns) < 0; });\n}\n// @require ./get_events_cache.ts\n// @require ./has_namespaces.ts\n// @require ./parse_event_name.ts\nfunction removeEvent(ele, name, namespaces, selector, callback) {\n var cache = getEventsCache(ele);\n if (!name) {\n for (name in cache) {\n removeEvent(ele, name, namespaces, selector, callback);\n }\n }\n else if (cache[name]) {\n cache[name] = cache[name].filter(function (_a) {\n var ns = _a[0], sel = _a[1], cb = _a[2];\n if ((callback && cb.guid !== callback.guid) || !hasNamespaces(ns, namespaces) || (selector && selector !== sel))\n return true;\n ele.removeEventListener(name, cb);\n });\n }\n}\nfn.off = function (eventFullName, selector, callback) {\n var _this = this;\n if (isUndefined(eventFullName)) {\n this.each(function (i, ele) {\n if (!isElement(ele) && !isDocument(ele) && !isWindow(ele))\n return;\n removeEvent(ele);\n });\n }\n else if (!isString(eventFullName)) {\n for (var key in eventFullName) {\n this.off(key, eventFullName[key]);\n }\n }\n else {\n if (isFunction(selector)) {\n callback = selector;\n selector = '';\n }\n each(getSplitValues(eventFullName), function (i, eventFullName) {\n var _a = parseEventName(eventFullName), nameOriginal = _a[0], namespaces = _a[1];\n var name = getEventNameBubbling(nameOriginal);\n _this.each(function (i, ele) {\n if (!isElement(ele) && !isDocument(ele) && !isWindow(ele))\n return;\n removeEvent(ele, name, namespaces, selector, callback);\n });\n });\n }\n return this;\n};\nfn.remove = function (comparator) {\n filtered(this, comparator).detach().off();\n return this;\n};\nfn.replaceWith = function (selector) {\n return this.before(selector).remove();\n};\nfn.replaceAll = function (selector) {\n cash(selector).replaceWith(this);\n return this;\n};\nfunction on(eventFullName, selector, data, callback, _one) {\n var _this = this;\n if (!isString(eventFullName)) {\n for (var key in eventFullName) {\n this.on(key, selector, data, eventFullName[key], _one);\n }\n return this;\n }\n if (!isString(selector)) {\n if (isUndefined(selector) || isNull(selector)) {\n selector = '';\n }\n else if (isUndefined(data)) {\n data = selector;\n selector = '';\n }\n else {\n callback = data;\n data = selector;\n selector = '';\n }\n }\n if (!isFunction(callback)) {\n callback = data;\n data = undefined;\n }\n if (!callback)\n return this;\n each(getSplitValues(eventFullName), function (i, eventFullName) {\n var _a = parseEventName(eventFullName), nameOriginal = _a[0], namespaces = _a[1];\n var name = getEventNameBubbling(nameOriginal);\n var isEventHover = (nameOriginal in eventsHover);\n var isEventFocus = (nameOriginal in eventsFocus);\n if (!name)\n return;\n _this.each(function (i, ele) {\n if (!isElement(ele) && !isDocument(ele) && !isWindow(ele))\n return;\n var finalCallback = function (event) {\n if (event.target[\"___i\".concat(event.type)])\n return event.stopImmediatePropagation(); // Ignoring native event in favor of the upcoming custom one\n if (event.namespace && !hasNamespaces(namespaces, event.namespace.split(eventsNamespacesSeparator)))\n return;\n if (!selector && ((isEventFocus && (event.target !== ele || event.___ot === name)) || (isEventHover && event.relatedTarget && ele.contains(event.relatedTarget))))\n return;\n var thisArg = ele;\n if (selector) {\n var target = event.target;\n while (!matches(target, selector)) {\n if (target === ele)\n return;\n target = target.parentNode;\n if (!target)\n return;\n }\n thisArg = target;\n }\n Object.defineProperty(event, 'currentTarget', {\n configurable: true,\n get: function () {\n return thisArg;\n }\n });\n Object.defineProperty(event, 'delegateTarget', {\n configurable: true,\n get: function () {\n return ele;\n }\n });\n Object.defineProperty(event, 'data', {\n configurable: true,\n get: function () {\n return data;\n }\n });\n var returnValue = callback.call(thisArg, event, event.___td);\n if (_one) {\n removeEvent(ele, name, namespaces, selector, finalCallback);\n }\n if (returnValue === false) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n finalCallback.guid = callback.guid = (callback.guid || cash.guid++);\n addEvent(ele, name, namespaces, selector, finalCallback);\n });\n });\n return this;\n}\nfn.on = on;\nfunction one(eventFullName, selector, data, callback) {\n return this.on(eventFullName, selector, data, callback, true);\n}\n;\nfn.one = one;\nvar queryEncodeCRLFRe = /\\r?\\n/g;\nfunction queryEncode(prop, value) {\n return \"&\".concat(encodeURIComponent(prop), \"=\").concat(encodeURIComponent(value.replace(queryEncodeCRLFRe, '\\r\\n')));\n}\nvar skippableRe = /file|reset|submit|button|image/i;\nvar checkableRe = /radio|checkbox/i;\nfn.serialize = function () {\n var query = '';\n this.each(function (i, ele) {\n each(ele.elements || [ele], function (i, ele) {\n if (ele.disabled || !ele.name || ele.tagName === 'FIELDSET' || skippableRe.test(ele.type) || (checkableRe.test(ele.type) && !ele.checked))\n return;\n var value = getValue(ele);\n if (!isUndefined(value)) {\n var values = isArray(value) ? value : [value];\n each(values, function (i, value) {\n query += queryEncode(ele.name, value);\n });\n }\n });\n });\n return query.slice(1);\n};\n// @require core/types.ts\n// @require core/cash.ts\n// @require core/type_checking.ts\n// @require core/variables.ts\n// @require core/each.ts\n// @require core/extend.ts\n// @require core/find.ts\n// @require core/get_compare_function.ts\n// @require core/get_split_values.ts\n// @require core/guid.ts\n// @require core/parse_html.ts\n// @require core/unique.ts\n// @require attributes/add_class.ts\n// @require attributes/attr.ts\n// @require attributes/has_class.ts\n// @require attributes/prop.ts\n// @require attributes/remove_attr.ts\n// @require attributes/remove_class.ts\n// @require attributes/remove_prop.ts\n// @require attributes/toggle_class.ts\n// @require collection/add.ts\n// @require collection/each.ts\n// @require collection/eq.ts\n// @require collection/filter.ts\n// @require collection/first.ts\n// @require collection/get.ts\n// @require collection/index.ts\n// @require collection/last.ts\n// @require collection/map.ts\n// @require collection/slice.ts\n// @require css/css.ts\n// @require data/data.ts\n// @require dimensions/inner_outer.ts\n// @require dimensions/normal.ts\n// @require effects/hide.ts\n// @require effects/show.ts\n// @require effects/toggle.ts\n// @require events/off.ts\n// @require events/on.ts\n// @require events/one.ts\n// @require events/ready.ts\n// @require events/trigger.ts\n// @require forms/serialize.ts\n// @require forms/val.ts\n// @require manipulation/after.ts\n// @require manipulation/append.ts\n// @require manipulation/append_to.ts\n// @require manipulation/before.ts\n// @require manipulation/clone.ts\n// @require manipulation/detach.ts\n// @require manipulation/empty.ts\n// @require manipulation/html.ts\n// @require manipulation/insert_after.ts\n// @require manipulation/insert_before.ts\n// @require manipulation/prepend.ts\n// @require manipulation/prepend_to.ts\n// @require manipulation/remove.ts\n// @require manipulation/replace_all.ts\n// @require manipulation/replace_with.ts\n// @require manipulation/text.ts\n// @require manipulation/unwrap.ts\n// @require manipulation/wrap.ts\n// @require manipulation/wrap_all.ts\n// @require manipulation/wrap_inner.ts\n// @require offset/offset.ts\n// @require offset/offset_parent.ts\n// @require offset/position.ts\n// @require traversal/children.ts\n// @require traversal/closest.ts\n// @require traversal/contents.ts\n// @require traversal/find.ts\n// @require traversal/has.ts\n// @require traversal/is.ts\n// @require traversal/next.ts\n// @require traversal/next_all.ts\n// @require traversal/next_until.ts\n// @require traversal/not.ts\n// @require traversal/parent.ts\n// @require traversal/parents.ts\n// @require traversal/parents_until.ts\n// @require traversal/prev.ts\n// @require traversal/prev_all.ts\n// @require traversal/prev_until.ts\n// @require traversal/siblings.ts\n// @no-require extras/get_script.ts\n// @no-require extras/shorthands.ts\n// @require methods.ts\nif (typeof exports !== 'undefined') { // Node.js\n module.exports = cash;\n}\nelse { // Browser\n win['cash'] = win['$'] = cash;\n}\n})();","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.grok-hit-triage-view .d4-grid {\n width: initial !important;\n height: initial !important;\n}\n\n.hit-triage-compute-dialog-pane-header {\n display: flex;\n align-items: center;\n justify-content: end;\n}\n\n.hit-triage-compute-dialog-host>.d4-tab-host.d4-tab-vertical>.d4-tab-header-stripe>.d4-tab-header.hit-triage-compute-dialog-pane-header {\n border: none;\n border-left: 4px solid transparent;\n border-radius: 1px;\n padding: 4px 8px;\n min-height: 28px;\n justify-content: flex-end;\n flex-direction: row-reverse;\n}\n\n.hit-triage-compute-dialog-host>.d4-tab-host.d4-tab-vertical>.d4-tab-header-stripe>.d4-tab-header.hit-triage-compute-dialog-pane-header.selected {\n border-left: 4px solid var(--blue-1);\n background-color: #f2f2f5;\n}\n\n.hit-triage-compute-dialog-host>.d4-tab-host.d4-tab-vertical>.d4-tab-header-stripe>.d4-tab-header.hit-triage-compute-dialog-pane-header>span {\n padding: 0 4px;\n}\n\ntable.hit-triage-table {\n margin: 10px;\n width: calc(100% - 20px);\n}\n\n.hit-triage-table-container {\n max-width: 600px;\n max-height: 500px;\n overflow-y: scroll;\n}\n\n.hit-triage-error-div {\n color: red;\n text-align: start;\n}\n\n.mx-5 {\n margin-left: 5px;\n margin-right: 5px;\n}\n\n.hit-triage-new-template-functions-input > .ui-box {\n height: 300px;\n}\n\n.hit-triage-new-template-functions-input {\n max-height: 200px;\n max-width: unset !important;\n overflow-y: scroll;\n}\n\n\n.hit-triage-new-template-functions-input > .d4-tab-host {\n width: 100% !important;\n}\n\n.hit-triage-compute-dialog-host {\n max-height: 550px;\n max-width: 800px;\n min-width: 550px;\n}\n\n.hit-triage-compute-dialog-descriptors-group {\n margin-left: 16px;\n}\n\n.oy-scroll {\n overflow-y: scroll;\n}\n\n.d4-ribbon-name .ui-breadcrumbs {\n\toverflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\tflex-wrap: nowrap;\n padding: 0;\n}\n\n.d4-ribbon-name .ui-breadcrumbs i {\n\tpadding: 0 6px;\n\tfont-size: 10px;\n\tfont-weight: bold;\n}\n\n.d4-ribbon-name .ui-breadcrumbs-element:first-child {\n\twhite-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./css/hit-triage.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,yBAAyB;IACzB,0BAA0B;AAC9B;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,oBAAoB;AACxB;;AAEA;IACI,YAAY;IACZ,kCAAkC;IAClC,kBAAkB;IAClB,gBAAgB;IAChB,gBAAgB;IAChB,yBAAyB;IACzB,2BAA2B;AAC/B;;AAEA;IACI,oCAAoC;IACpC,yBAAyB;AAC7B;;AAEA;IACI,cAAc;AAClB;;AAEA;IACI,YAAY;IACZ,wBAAwB;AAC5B;;AAEA;IACI,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;AACtB;;AAEA;IACI,UAAU;IACV,iBAAiB;AACrB;;AAEA;IACI,gBAAgB;IAChB,iBAAiB;AACrB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,iBAAiB;IACjB,2BAA2B;IAC3B,kBAAkB;AACtB;;;AAGA;IACI,sBAAsB;AAC1B;;AAEA;IACI,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;AACpB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,kBAAkB;AACtB;;AAEA;CACC,gBAAgB;IACb,mBAAmB;IACnB,uBAAuB;CAC1B,iBAAiB;IACd,UAAU;AACd;;AAEA;CACC,cAAc;CACd,eAAe;CACf,iBAAiB;AAClB;;AAEA;CACC,mBAAmB;IAChB,gBAAgB;IAChB,uBAAuB;AAC3B\",\"sourcesContent\":[\".grok-hit-triage-view .d4-grid {\\n width: initial !important;\\n height: initial !important;\\n}\\n\\n.hit-triage-compute-dialog-pane-header {\\n display: flex;\\n align-items: center;\\n justify-content: end;\\n}\\n\\n.hit-triage-compute-dialog-host>.d4-tab-host.d4-tab-vertical>.d4-tab-header-stripe>.d4-tab-header.hit-triage-compute-dialog-pane-header {\\n border: none;\\n border-left: 4px solid transparent;\\n border-radius: 1px;\\n padding: 4px 8px;\\n min-height: 28px;\\n justify-content: flex-end;\\n flex-direction: row-reverse;\\n}\\n\\n.hit-triage-compute-dialog-host>.d4-tab-host.d4-tab-vertical>.d4-tab-header-stripe>.d4-tab-header.hit-triage-compute-dialog-pane-header.selected {\\n border-left: 4px solid var(--blue-1);\\n background-color: #f2f2f5;\\n}\\n\\n.hit-triage-compute-dialog-host>.d4-tab-host.d4-tab-vertical>.d4-tab-header-stripe>.d4-tab-header.hit-triage-compute-dialog-pane-header>span {\\n padding: 0 4px;\\n}\\n\\ntable.hit-triage-table {\\n margin: 10px;\\n width: calc(100% - 20px);\\n}\\n\\n.hit-triage-table-container {\\n max-width: 600px;\\n max-height: 500px;\\n overflow-y: scroll;\\n}\\n\\n.hit-triage-error-div {\\n color: red;\\n text-align: start;\\n}\\n\\n.mx-5 {\\n margin-left: 5px;\\n margin-right: 5px;\\n}\\n\\n.hit-triage-new-template-functions-input > .ui-box {\\n height: 300px;\\n}\\n\\n.hit-triage-new-template-functions-input {\\n max-height: 200px;\\n max-width: unset !important;\\n overflow-y: scroll;\\n}\\n\\n\\n.hit-triage-new-template-functions-input > .d4-tab-host {\\n width: 100% !important;\\n}\\n\\n.hit-triage-compute-dialog-host {\\n max-height: 550px;\\n max-width: 800px;\\n min-width: 550px;\\n}\\n\\n.hit-triage-compute-dialog-descriptors-group {\\n margin-left: 16px;\\n}\\n\\n.oy-scroll {\\n overflow-y: scroll;\\n}\\n\\n.d4-ribbon-name .ui-breadcrumbs {\\n\\toverflow: hidden;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n\\tflex-wrap: nowrap;\\n padding: 0;\\n}\\n\\n.d4-ribbon-name .ui-breadcrumbs i {\\n\\tpadding: 0 6px;\\n\\tfont-size: 10px;\\n\\tfont-weight: bold;\\n}\\n\\n.d4-ribbon-name .ui-breadcrumbs-element:first-child {\\n\\twhite-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.ui-app-header {\n\n}\n\n.ui-app-header-icon {\n width: 150px;\n height: 150px;\n margin-right: 20px;\n}\n\n.u2-panel {\n gap: 10px;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@datagrok-libraries/utils/src/u2.css\"],\"names\":[],\"mappings\":\"AAAA;;AAEA;;AAEA;IACI,YAAY;IACZ,aAAa;IACb,kBAAkB;AACtB;;AAEA;IACI,SAAS;AACb\",\"sourcesContent\":[\".ui-app-header {\\n\\n}\\n\\n.ui-app-header-icon {\\n width: 150px;\\n height: 150px;\\n margin-right: 20px;\\n}\\n\\n.u2-panel {\\n gap: 10px;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `img[alt='hitDesignReadmeImg'] {\n max-width: 100%;\n}\n\n.hit-design-stage-editing-dialog {\n z-index: 10000 !important;\n}\n\n.hit-design-groupped-campaigns-table .d4-accordion-pane-content.expanded {\n margin: 0 !important;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/app/hit-design-views/utils.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,eAAe;AACnB;;AAEA;IACI,yBAAyB;AAC7B;;AAEA;IACI,oBAAoB;AACxB\",\"sourcesContent\":[\"img[alt='hitDesignReadmeImg'] {\\n max-width: 100%;\\n}\\n\\n.hit-design-stage-editing-dialog {\\n z-index: 10000 !important;\\n}\\n\\n.hit-design-groupped-campaigns-table .d4-accordion-pane-content.expanded {\\n margin: 0 !important;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","const __WEBPACK_NAMESPACE_OBJECT__ = DG;","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","export const CampaignIdKey = 'campaignId';\nexport const HitDesignCampaignIdKey = 'campaignId';\nexport const CampaignTableName = 'enriched_table.csv';\nexport const CampaignJsonName = 'campaign.json';\nexport const HitTriageComputeFunctionTag = 'HitTriageFunction';\nexport const HitTriageDataSourceTag = 'HitTriageDataSource';\nexport const HitTriageSubmitTag = 'HitTriageSubmitFunction';\nexport const HitSelectionColName = 'Selected hits';\nexport const TileCategoriesColName = 'Stage';\nexport const HitDesignMolColName = 'Molecule';\nexport const PeptiHitHelmColName = 'Helm';\nexport const ViDColName = 'V-iD';\nexport const ViDColFormat = 'V######';\nexport const HTcampaignName = 'HTcampaignName';\nexport const HDcampaignName = 'HDcampaignName';\nexport const HTScriptPrefix = 'HTScript';\nexport const HTQueryPrefix = 'HTQuery';\nexport const ComputeQueryMolColName = 'molecules';\nexport const i18n = {\n startNewCampaign: 'New Campaign',\n createNewCampaign: 'New Campaign',\n dataSourceFunction: 'Source',\n createNewTemplate: 'New Template',\n StartCampaign: 'Start',\n createTemplate: 'Create',\n createCampaign: 'Create',\n download: 'Download',\n cancel: 'Cancel',\n continueCampaigns: 'Continue Campaign',\n createNewCampaignHeader: 'New Campaign',\n selectTemplate: 'Template',\n} as const;\n\nexport const funcTypeNames = {\n script: 'script',\n function: 'function-package',\n query: 'data-query',\n} as const;\n\nexport const HDCampaignsGroupingLSKey = 'HDCampaignsGrouping';\n\nexport enum CampaignGroupingType {\n None = 'None',\n Template = 'Template',\n Status = 'Status',\n}\n","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js!./hit-triage.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js!./hit-triage.css\";\n export default content && content.locals ? content.locals : undefined;\n","/* eslint-disable max-len */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {Subscription} from 'rxjs';\nimport {CampaignGroupingType, CampaignJsonName, ComputeQueryMolColName, HDCampaignsGroupingLSKey} from './consts';\nimport {AppName, CampaignsType, HitDesignCampaign, HitTriageCampaign, TriagePermissions} from './types';\nimport {_package} from '../package';\n\nexport const toFormatedDateString = (d: Date): string => {\n return `${d.getFullYear()}/${d.getMonth() + 1}/${d.getDate()}`;\n};\n\nexport function modifyUrl(key: string, value: string) {\n const title = document.title;\n const url = window.location.href.split('?')[0] + '?' + key + '=' + value;\n if (history.replaceState) {\n const obj = {\n Title: title,\n Url: url,\n };\n history.replaceState(obj, obj.Title, obj.Url);\n }\n}\n\nexport function hideComponents(styles: CSSStyleDeclaration[]) {\n styles.forEach((style) => {\n style.display = 'none';\n });\n}\n\nexport function showComponents(styles: CSSStyleDeclaration[]) {\n styles.forEach((style) => {\n style.display = 'flex';\n });\n}\n\nexport function addBreadCrumbsToRibbons(view: DG.ViewBase, firstPath: string, secondPath: string, handler: Function):\n {breadcrumbs: DG.Breadcrumbs, sub: Subscription} {\n const breadcrumbs = ui.breadcrumbs([firstPath, secondPath]);\n //breadcrumbs.root.id = 'hit-triage-breadcrumbs';\n const sub = breadcrumbs.onPathClick.subscribe((path) => {\n if (path.length === 1) {\n sub.unsubscribe();\n popRibbonPannels(view);\n handler();\n }\n });\n const viewNameRoot = grok.shell.v.ribbonMenu.root.parentElement?.getElementsByClassName('d4-ribbon-name')[0];\n if (viewNameRoot) {\n viewNameRoot.textContent = '';\n viewNameRoot.appendChild(breadcrumbs.root);\n }\n /*\n let ribbons = view.getRibbonPanels();\n if (!ribbons?.length)\n ribbons = [];\n ribbons.push([breadcrumbs.root]);\n\n if (document.getElementById('hit-triage-breadcrumbs') === null) {\n view.setRibbonPanels(ribbons);\n breadcrumbs.root.parentElement?.classList.add('d4-ribbon-name');\n breadcrumbs.root.parentElement?.classList.remove('d4-ribbon-item');\n }*/\n return {breadcrumbs, sub};\n}\n\nexport function popRibbonPannels(view: DG.ViewBase) {\n const ribbons = view.getRibbonPanels();\n if (!ribbons?.length)\n return;\n ribbons.pop();\n view.setRibbonPanels(ribbons);\n};\n\nexport function checkRibbonsHaveSubmit(ribbons: HTMLElement[][]): boolean {\n return ribbons.reduce((prev, cur) => {\n return prev || cur.reduce((p, c) =>\n p || c.classList.contains('hit-design-submit-button') ||\n Array.from(c.children).some((child) =>child.classList.contains('hit-design-submit-button')), false);\n }, false);\n}\n\n/** Executes {@link func} while showing the \"running\" indicator on {@link root}.\n * Handles and logs exceptions.\n * @param {HTMLElement} root\n * @param {Function} func\n * */\nexport async function runAsync<T>(root: HTMLElement, func: () => Promise<T>) {\n ui.setUpdateIndicator(root, true);\n try {\n return await func();\n } catch (e: any) {\n grok.log.error(e);\n } finally {\n ui.setUpdateIndicator(root, false);\n }\n}\n\nexport async function joinQueryResults(df: DG.DataFrame, molColName: string, qRes: DG.DataFrame) {\n if (qRes.rowCount === 0)\n return;\n const molCol = df.col(molColName);\n if (!molCol)\n throw new Error('There is no molecule column in dataframe');\n let resOriginalCol = qRes.col(ComputeQueryMolColName);\n if (!resOriginalCol) {\n await qRes.meta.detectSemanticTypes();\n resOriginalCol = qRes.columns.bySemType(DG.SEMTYPE.MOLECULE);\n }\n if (!resOriginalCol)\n throw new Error('There is no original molecule column in query result dataframe');\n const newColNames = qRes.columns.names().filter((name) => name !== ComputeQueryMolColName);\n df.join(qRes, [molColName], [resOriginalCol.name], undefined, newColNames, undefined, true);\n};\n\nexport async function loadCampaigns<T extends AppName>(\n appName: T, deletedCampaigns: string[],\n): Promise<{[name: string]: CampaignsType[T]}> {\n const campaignFolders = (await _package.files.list(`${appName}/campaigns`))\n .filter((f) => deletedCampaigns.indexOf(f.name) === -1);\n const campaignNamesMap: {[name: string]: CampaignsType[T]} = {};\n for (const folder of campaignFolders) {\n try {\n const campaignJson: CampaignsType[T] = JSON.parse(await _package.files\n .readAsText(`${appName}/campaigns/${folder.name}/${CampaignJsonName}`));\n if (campaignJson.authorUserId && campaignJson.permissions &&\n !await checkViewPermissions(campaignJson.authorUserId, campaignJson.permissions)\n )\n continue;\n campaignNamesMap[campaignJson.name] = campaignJson;\n } catch (e) {\n continue;\n }\n }\n return campaignNamesMap;\n}\n\nasync function checkPermissions(authorId: string, groupIdList: string[]): Promise<boolean> {\n const userId = DG.User.current().id;\n const userGroupId = DG.User.current().group?.id;\n if (authorId === userId)\n return true;\n const dapiGroups = grok.dapi.groups;\n for (const groupId of groupIdList) {\n const group = await dapiGroups.find(groupId);\n if (!group)\n continue;\n if (group.personal) {\n const user = await dapiGroups.getUser(group);\n if (user?.id === userId)\n return true;\n } else if (userGroupId && group.members.length > 0) {\n if (group.members.some((memberGroup) => memberGroup.id === userGroupId))\n return true;\n }\n }\n return false;\n}\n\nexport async function checkEditPermissions(authorId: string, permissions: TriagePermissions): Promise<boolean> {\n return checkPermissions(authorId, permissions.edit);\n}\n\nexport async function checkViewPermissions(authorId: string, permissions: TriagePermissions): Promise<boolean> {\n return checkPermissions(authorId, Array.from(new Set([...permissions.view, ...permissions.edit])));\n}\n\nexport function getLocalStorageValue<T = string>(key: string): T | null {\n return localStorage.getItem(key) as unknown as T;\n}\n\nexport function setLocalStorageValue(key: string, value: string) {\n localStorage.setItem(key, value as unknown as string);\n}\n\nexport function getSavedCampaignsGrouping(): CampaignGroupingType {\n return getLocalStorageValue<CampaignGroupingType>(HDCampaignsGroupingLSKey) ?? CampaignGroupingType.None;\n}\n\nexport function setSavedCampaignsGrouping(value: CampaignGroupingType) {\n setLocalStorageValue(HDCampaignsGroupingLSKey, value);\n}\n\nexport const getGroupingKey = <T extends HitDesignCampaign | HitTriageCampaign = HitDesignCampaign>(grouping: CampaignGroupingType, campaign: T): string => {\n switch (grouping) {\n case CampaignGroupingType.Template:\n return campaign.template?.key ?? campaign.templateName;\n case CampaignGroupingType.Status:\n return campaign.status;\n default:\n return '';\n }\n};\n\nexport function getGroupedCampaigns<T extends HitDesignCampaign | HitTriageCampaign = HitDesignCampaign>(campaigns: T[], grouping: CampaignGroupingType):\n {[key: string]: T[]} {\n if (grouping === CampaignGroupingType.None)\n return {'': campaigns};\n const groupedCampaigns: {[key: string]: T[]} = {};\n for (const campaign of campaigns) {\n const key = getGroupingKey(grouping, campaign);\n if (!groupedCampaigns[key])\n groupedCampaigns[key] = [];\n groupedCampaigns[key].push(campaign);\n }\n return groupedCampaigns;\n}\n\nexport function processGroupingTable<T extends HitDesignCampaign | HitTriageCampaign = HitDesignCampaign>(table: HTMLTableElement, groupedCampaigns: {[key: string]: T[]}, numCols = 6) {\n table.classList.add('hit-design-groupped-campaigns-table');\n const keys = Object.keys(groupedCampaigns);\n if (keys.length < 2)\n return table;\n const body = table.getElementsByTagName('tbody')[0];\n const rows = Array.from(table.getElementsByTagName('tr')).filter((row) => !row.classList.contains('header'));\n let curRow = 0;\n\n const setState = (expanded: boolean, start: number, end: number) => {\n for (let i = start; i < end; i++)\n rows[i]?.style && (rows[i].style.display = expanded ? 'table-row' : 'none');\n };\n\n\n for (const key of keys) {\n const row = rows[curRow];\n if (!row)\n break;\n const l = groupedCampaigns[key].length;\n const startRow = curRow;\n const endRow = curRow + l;\n const acc = ui.accordion(`Hit-Design-campaigns-group-${key}`);\n const pane = acc.addPane(key, () => {return ui.div();}, undefined, undefined, false);\n pane.root.style.marginLeft = '-24px';\n pane.root.onclick = () => {\n setState(pane.expanded, startRow, endRow);\n };\n setState(pane.expanded, startRow, endRow);\n const newRow = body.insertRow(0);\n const newCell = newRow.insertCell(0);\n newCell.appendChild(pane.root);\n newCell.colSpan = numCols;\n body.insertBefore(newRow, row);\n curRow += l;\n }\n}\n","import * as DG from 'datagrok-api/dg';\n\nexport type AppName = 'Hit Triage' | 'Hit Design' | 'PeptiHit';\n\nexport type CampaignsType = {\n 'Hit Triage': HitTriageCampaign,\n 'Hit Design': HitDesignCampaign,\n 'PeptiHit': HitDesignCampaign,\n}\n\nexport type IDescriptorTree = {\n [key: string]: {\n descriptors: Array<Descriptor>,\n } & Descriptor;\n}\n\nexport type Descriptor = {\n name: string,\n description: string,\n};\n\nexport type IFunctionArgs<T = any> = {\n [key: string]: T,\n}\n\nexport type HitTriageTemplateFunction = {\n package: string,\n name: string,\n args: IFunctionArgs,\n}\n\nexport type HitTriageTemplateScript = {\n name: string,\n args: IFunctionArgs,\n id: string,\n}\n\nexport type HitTriageComputeQuery = HitTriageTemplateScript & {\n inputName: string,\n}\n\nexport type IComputeDialogResult = {\n descriptors: string[],\n externals: {\n [_: string]: IFunctionArgs\n },\n scripts?: {\n [_: string]: IFunctionArgs\n }\n queries?: {\n [_: string]: IFunctionArgs\n }\n}\n\nexport type HitTriageTemplate = {\n name: string,\n key: string,\n compute: HitTriageTemplateCompute,\n submit?: HitTriageTemplateSubmit,\n campaignFields: HitTriageCampaignField[],\n dataSourceType: IngestType,\n queryFunctionName?: string,\n isDataSourceQuery?: boolean,\n layoutViewState?: string,\n}\n\nexport const CampaignFieldTypes = {\n String: DG.TYPE.STRING,\n Number: DG.TYPE.FLOAT,\n Boolean: DG.TYPE.BOOL,\n Date: DG.TYPE.DATE_TIME,\n Molecule: DG.SEMTYPE.MOLECULE,\n} as const;\n\nexport type HitTriageCampaignFieldType = keyof typeof CampaignFieldTypes;\n\nexport type HitTriageCampaignField =\n {name: string, type: HitTriageCampaignFieldType, semtype?: string, required?: boolean};\n\nexport type IngestType = 'File' | 'Query';\n\nexport type HitTriageTemplateIngest = {\n type: IngestType,\n query: string,\n molColName: string,\n};\n\nexport type HitTriageTemplateCompute = {\n descriptors: {\n enabled: boolean,\n args: string[],\n }\n functions: HitTriageTemplateFunction[],\n scripts?: HitTriageTemplateScript[],\n queries?: HitTriageTemplateScript[],\n};\n\nexport type HitTriageTemplateSubmit = {\n fName: string,\n package: string\n};\n\nexport type HitTriageCampaignStatus = string;\n\nexport type HitTriageCampaign = {\n name: string,\n templateName: string,\n template?: HitDesignTemplate,\n savePath?: string,\n status: HitTriageCampaignStatus,\n createDate: string,\n campaignFields: {[key: string]: any},\n filters: {[key: string]: any}[],\n ingest: HitTriageTemplateIngest,\n columnSemTypes?: {[key: string]: string},\n rowCount?: number,\n filteredRowCount?: number,\n layout?: string,\n columnTypes?: {[key: string]: string},\n version?: number,\n permissions?: TriagePermissions,\n authorUserId?: string\n};\n\nexport type TriagePermissions = {\n // will store the ids of UserGroups that have access to the campaign\n edit: string[],\n view: string[],\n};\n\nexport type IChemFunctionsDialogResult = {\n okProxy: () => void,\n root: HTMLElement,\n};\n\nexport type INewTemplateResult<T> = {\n template: Promise<T>,\n root: HTMLElement,\n cancelPromise: Promise<void>,\n}\n\n// ##################### HIT DESIGN TYPES #####################\n\nexport type HitDesignTemplate = Omit<HitTriageTemplate, 'dataSourceType' | 'queryFunctionName'> &\n {stages: string[]};\n\nexport type HitDesignCampaign = Omit<HitTriageCampaign, 'filters' | 'ingest'> & {tilesViewerFormSketch?: string};\n\n// todo: probably add some more stuff\nexport type PeptiHitTemplate = HitDesignTemplate & {toAtomiLevelProps?: {[key: string]: any}}\n\nexport type ComputeFunctions = {\n functions: DG.Func[],\n scripts: DG.Script[],\n queries: DG.DataQuery[],\n};\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport $ from 'cash-dom';\nimport {IChemFunctionsDialogResult, IComputeDialogResult, IDescriptorTree,\n HitTriageTemplate,\n IFunctionArgs} from '../types';\nimport '../../../css/hit-triage.css';\nimport {funcTypeNames, HTQueryPrefix, HTScriptPrefix} from '../consts';\nimport {HitAppBase} from '../hit-app-base';\n\nexport async function chemFunctionsDialog(app: HitAppBase<any>,\n onOk: (result: IComputeDialogResult) => void, onCancel: () => void,\n template: Omit<HitTriageTemplate, 'dataSourceType'>, dialog?: boolean,\n): Promise<IChemFunctionsDialogResult> {\n // if compute is in dialog form, we need to show all the functions\n\n const computeFunctions = await app.computeFunctions;\n\n const allFunctions: {func: DG.Func | DG.Script | DG.DataQuery, args: IFunctionArgs}[] = [];\n computeFunctions.functions\n .filter(({inputs: i}) => i.length >= 2 && i[0].propertyType === 'dataframe' && i[1].propertyType === 'column')\n .forEach((f) => {\n allFunctions.push({\n func: f,\n args: template?.compute?.functions?.find((tf) =>\n tf.name === f.name && tf.package === f.package.name)?.args ?? {}});\n });\n computeFunctions.scripts\n .filter(({inputs: i}) => i.length >= 2 && i[0].propertyType === 'dataframe' && i[1].propertyType === 'column')\n .forEach((s) => {\n allFunctions.push({\n func: s,\n args: template?.compute?.scripts?.find((ts) => ts.id === s.id)?.args ?? {}});\n });\n computeFunctions.queries\n .filter((q) => q.inputs.length > 0 && q.inputs[0].propertyType === 'list')// for now only lists...\n .forEach((q) => {\n allFunctions.push({\n func: q,\n args: template?.compute?.queries?.find((ts) => ts.id === q.id)?.args ?? {}});\n });\n\n let useDescriptors = !!template?.compute?.descriptors?.enabled || dialog;\n const host = ui.div([], {classes: 'hit-triage-compute-dialog-host'});\n const descriptorItems: DG.TreeViewNode[] = [];\n const descriptorsGroup = ui.tree();\n try {\n // tree groups\n const descriptorsTree = (await grok.chem.descriptorsTree()) as IDescriptorTree;\n descriptorsGroup.root.classList.add('hit-triage-compute-dialog-descriptors-group');\n\n function createTreeGroup(name: string, treeNode: DG.TreeViewGroup): DG.TreeViewGroup {\n const res = treeNode.group(name, null, false);\n res.enableCheckBox(false);\n return res;\n };\n\n // const descriptorsGroup = createTreeGroup('Descriptors', tree);\n const keys = Object.keys(descriptorsTree);\n const preselectedDescriptors: string[] = template?.compute?.descriptors?.args ?? [];\n for (const groupName of keys) {\n const group = createTreeGroup(groupName, descriptorsGroup);\n\n for (const descriptor of descriptorsTree[groupName].descriptors) {\n const item = group.item(descriptor.name, descriptor);\n descriptorItems.push(item);\n item.enableCheckBox(preselectedDescriptors.includes(descriptor.name));\n }\n };\n } catch (e) {\n console.error(e);\n useDescriptors = false;\n }\n\n const descriptorsName = 'Descriptors';\n const funcNamesMap: {[key: string]: string} = {[descriptorsName]: descriptorsName};\n // if compute is in dialog form, we need to show all the functions\n const tabControlArgs: {[key: string]: HTMLElement} =\n useDescriptors ? {[descriptorsName]: descriptorsGroup.root} : {};\n const funcInputsMap: {[funcName: string]: DG.FuncCall} = {};\n const calculatedFunctions: {[key: string]: boolean} = {[descriptorsName]: false};\n calculatedFunctions[descriptorsName] =\n !!template?.compute?.descriptors?.enabled && template?.compute?.descriptors?.args?.length > 0;\n // handling package functions\n for (const func of allFunctions) {\n try {\n const f = func.func;\n const funcCall = f.prepare(func.args);\n const keyName = f.type === funcTypeNames.function ?\n `${f.package.name}:${f.name}`: f.type === funcTypeNames.script ?\n `${HTScriptPrefix}:${f.name ?? ''}:${f.id}` : `${HTQueryPrefix}:${f.name ?? ''}:${f.id}`;\n funcInputsMap[keyName] = funcCall;\n const editor = ui.div();\n const inputs = await funcCall.buildEditor(editor, {condensed: false});\n editor.classList.add('oy-scroll');\n editor.style.marginLeft = '15px';\n editor.style.removeProperty('max-width');\n tabControlArgs[f.friendlyName ?? f.name] = editor;\n funcNamesMap[f.friendlyName ?? f.name] = keyName;\n calculatedFunctions[keyName] = (template?.compute?.functions?.some(\n (f) => func.func.type === funcTypeNames.function &&\n f.name === func.func.name && f.package === func.func.package?.name) ||\n template?.compute?.scripts?.some((s) => s.id === f.id) ||\n template?.compute?.queries?.some((s) => s.id === f.id)) ?? false;\n\n (editor.children[0] as HTMLElement).style.display = 'none'; // table input\n // for queries we don't have column input, we only have one input for the list of molecules\n f.type !== funcTypeNames.query && ((editor.children[1] as HTMLElement).style.display = 'none'); // column input\n inputs.forEach((input) => {\n if (input.property?.name && Object.keys(func.args).includes(input.property?.name))\n input.value = func.args[input.property.name];\n input.fireChanged();\n });\n } catch (e) {\n console.error(e);\n continue;\n }\n }\n\n const tc = ui.tabControl(tabControlArgs, true);\n tc.onTabChanged.subscribe(() => {try {tc.currentPane.content.style.removeProperty('max-width');} catch (e) {}});\n tc.header.style.overflow = 'scroll';\n tc.root.style.width = '100%';\n tc.root.style.minWidth = '350px';\n host.appendChild(tc.root);\n // add checkboxes to each hader\n tc.panes.forEach((pane)=> {\n const functionCheck =\n ui.input.bool('', {value: calculatedFunctions[funcNamesMap[pane.name]], onValueChanged: (value) => {\n calculatedFunctions[funcNamesMap[pane.name]] = !!value;\n if (!value)\n $(pane.content).find('input').attr('disabled', 'true');\n else\n $(pane.content).find('input').removeAttr('disabled');\n }});\n functionCheck.setTooltip('Toggle calculation of this function');\n pane.header.appendChild(functionCheck.root);\n pane.header.classList.add('hit-triage-compute-dialog-pane-header');\n });\n function onOkProxy() {\n const res: IComputeDialogResult = {descriptors: [], externals: {}, scripts: {}, queries: {}};\n res.descriptors = calculatedFunctions[descriptorsName] ?\n descriptorItems.filter((i) => i.checked).map((i) => i.value.name) : [];\n const filteredFuncs = Object.entries(funcInputsMap).filter(([name, _]) => calculatedFunctions[name]);\n // handling package functions\n filteredFuncs.filter(([name, _]) => !name.startsWith(HTScriptPrefix) && !name.startsWith(HTQueryPrefix))\n .forEach(([name, value]) => {\n res.externals[name] = {};\n const inputs = value.inputs;\n Object.entries(inputs).slice(2).forEach(([inputName, inputVal]) => {\n res.externals[name][inputName] = inputVal;\n });\n });\n // handling scripts\n filteredFuncs.filter(([name, _]) => name.startsWith(HTScriptPrefix))\n .forEach(([name, value]) => {\n res.scripts![name] = {};\n const inputs = value.inputs;\n Object.entries(inputs).slice(2).forEach(([inputName, inputVal]) => {\n res.scripts![name][inputName] = inputVal;\n });\n });\n // handling queries\n filteredFuncs.filter(([name, _]) => name.startsWith(HTQueryPrefix))\n .forEach(([name, value]) => {\n res.queries![name] = {};\n const inputs = value.inputs;\n Object.entries(inputs).slice(1).forEach(([inputName, inputVal]) => {\n res.queries![name][inputName] = inputVal;\n });\n });\n console.log(res);\n onOk(res);\n }\n\n if (dialog) {\n ui.dialog('Compute')\n .add(host)\n .onOK(() => onOkProxy())\n .onCancel(onCancel)\n .show();\n }\n\n return {\n root: host,\n okProxy: onOkProxy,\n };\n};\n","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs;","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport { Subject } from 'rxjs';\n/** Editor for predefined properties in a grid form. Supports adding, removing and editing of props. */\nexport class ItemsGrid {\n /**\n * Creates an instance of ItemsGrid which is a grid form for editing properties.\n * @param {DG.Property[]}properties - properties to be edited\n * @param {ItemTypep[]}items - items to be edited\n * @param {ItemsGridOptions}options - options for the grid\n * Options include:\n * removeButtonTooltip - tooltip for the remove button - default is 'Remove item'\n * addButtonTooltip - tooltip for the add button - default is 'Add item'\n * allowRemove - whether to allow removing items - default is true\n * allowAdd - whether to allow adding items - default is true\n * horizontalInputNames - Show the input names next to intput - default is false, names are shown above the grid.\n * newItemFunction - function that returns new item - default is undefind, in which case an empty object is created.\n */\n constructor(properties, items = [], options = {}) {\n /** Observable for when the added item is change */\n this.onItemChanged = new Subject();\n /** Observable for when the adding item is change */\n this.onAddingItemChanged = new Subject();\n /** Observable for when the item is added */\n this.onItemAdded = new Subject();\n /** Observable for when the item is removed */\n this.onItemRemoved = new Subject();\n this.options = { removeButtonTooltip: 'Remove item', addButtonTooltip: 'Add item', allowAdd: true, allowRemove: true };\n this.properties = properties;\n this.options = Object.assign(Object.assign({}, this.options), options);\n this._root = ui.divV([], { style: {\n display: 'grid', gridTemplateColumns: `repeat(${this.properties.length}, 1fr)`,\n alignItems: 'center', gap: '12px'\n }, classes: 'ui-items-grid' });\n this._items = items;\n this.render();\n }\n get root() {\n return this._root;\n }\n get items() {\n return this._items;\n }\n set items(value) {\n this._items = value;\n this.render();\n }\n addItem(item, notify = true) {\n this._items.push(item);\n this.render();\n if (notify)\n this.onItemAdded.next(item);\n }\n removeItem(item, notify = true) {\n if (this._items.indexOf(item) === -1)\n return;\n this._items.splice(this._items.indexOf(item), 1);\n this.render();\n if (notify)\n this.onItemRemoved.next(item);\n }\n removeAtIndex(index, notify = true) {\n if (index < 0 || index >= this._items.length)\n return;\n const removed = this._items.splice(index, 1);\n this.render();\n if (notify)\n this.onItemRemoved.next(removed[0]);\n }\n removeAllItems() {\n this._items = [];\n this.render();\n }\n render() {\n var _a, _b, _c, _d, _e;\n ui.empty(this._root);\n if (!this.options.horizontalInputNames) {\n for (const prop of this.properties) {\n let label = (_a = prop.caption) !== null && _a !== void 0 ? _a : prop.name;\n if ((_b = this.options.customLabels) === null || _b === void 0 ? void 0 : _b[prop.name])\n label = this.options.customLabels[prop.name];\n const header = ui.divText(label);\n header.style.fontWeight = 'bold';\n this._root.appendChild(header);\n }\n }\n for (const item of this._items) {\n const editors = this.getItemDiv(item);\n // if (editors.length !== this.properties.length + 1)\n // editors.push(ui.div());\n for (const editor of editors)\n this._root.appendChild(editor);\n }\n if (this.options.allowAdd) {\n const newEditor = this.getItemDiv((_e = (_d = (_c = this.options).newItemFunction) === null || _d === void 0 ? void 0 : _d.call(_c)) !== null && _e !== void 0 ? _e : undefined, true);\n for (const editor of newEditor)\n this._root.appendChild(editor);\n }\n }\n getItemDiv(item = {}, isAdding) {\n var _a, _b;\n const editors = [];\n const inputsMap = {};\n let lastInput = null;\n for (const prop of this.properties) {\n if (item[prop.name] === undefined)\n item[prop.name] = null; // needed for date editor, it can not handle undefined\n const input = ((_a = this.options.customInputs) === null || _a === void 0 ? void 0 : _a[prop.name]) ? this.options.customInputs[prop.name](item) :\n ui.input.forProperty(prop, item);\n const validator = (_b = this.options.validators) === null || _b === void 0 ? void 0 : _b[prop.name];\n if (validator)\n input.addValidator(validator);\n editors.push(this.options.horizontalInputNames ? input.root : this.hideLabel(input.root));\n if (prop.propertyType !== DG.TYPE.BOOL && prop.name.toLowerCase() !== 'color')\n input.input && (input.input.style.width = '100%');\n inputsMap[prop.name] = input;\n input.onChanged.subscribe(() => {\n item[prop.name] = input.value;\n isAdding ? this.onAddingItemChanged.next({ item, fieldName: prop.name }) :\n this.onItemChanged.next({ item, fieldName: prop.name });\n });\n input.root.style.alignItems = 'center'; // needed for molecule editor\n lastInput = input;\n }\n let companionButton = null;\n if (isAdding) {\n const addButton = ui.icons.add(() => {\n const newItem = this.options.newItemFunction ? this.options.newItemFunction() : {};\n Object.keys(inputsMap).forEach((pName) => {\n newItem[pName] = inputsMap[pName].value;\n });\n this._items.push(newItem);\n this.onItemAdded.next(newItem);\n this.render();\n }, this.options.addButtonTooltip);\n companionButton = addButton;\n }\n else {\n if (!this.options.allowRemove)\n return editors;\n const removeButton = ui.icons.delete(() => {\n this._items.splice(this._items.indexOf(item), 1);\n this.onItemRemoved.next(item);\n this.render();\n }, this.options.removeButtonTooltip);\n companionButton = removeButton;\n }\n //editors.push(companionButton);\n lastInput && lastInput.addOptions ? lastInput.addOptions(companionButton) :\n lastInput === null || lastInput === void 0 ? void 0 : lastInput.root.appendChild(companionButton);\n companionButton.style.color = '#2083d5';\n return editors;\n }\n //needed for color input\n hideLabel(el) {\n el.getElementsByTagName('label')[0] && el.removeChild(el.getElementsByTagName('label')[0]);\n return el;\n }\n hasErrors() {\n return this._root.querySelectorAll('.d4-invalid').length > 0;\n }\n}\n/** Usage example:\n * const props = [DG.Property.js('name2', DG.TYPE.STRING),\n DG.Property.js('name3', DG.TYPE.NUM),\n DG.Property.fromOptions({name: 'name4', type: DG.TYPE.DATE_TIME, nullable: true})];\n const itemsGrid = new ItemsGrid(props);\n * the component has a root property that can be added to the page\n ui.dialog('dialog').add(itemsGrid.root).show();\n at any point, filled fields can be accessed via itemsGrid.items\n */\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMtZ3JpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIml0ZW1zLWdyaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxPQUFPLEVBQWEsTUFBTSxNQUFNLENBQUM7QUF5QnpDLHVHQUF1RztBQUN2RyxNQUFNLE9BQU8sU0FBUztJQWdCbEI7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0wsWUFBWSxVQUF5QixFQUFFLFFBQW9CLEVBQUUsRUFBRSxVQUE0QixFQUFFO1FBekI3RixtREFBbUQ7UUFDNUMsa0JBQWEsR0FBZ0QsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNsRixvREFBb0Q7UUFDN0Msd0JBQW1CLEdBQWdELElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEYsNENBQTRDO1FBQ3JDLGdCQUFXLEdBQXNCLElBQUksT0FBTyxFQUFFLENBQUM7UUFDdEQsOENBQThDO1FBQ3ZDLGtCQUFhLEdBQXNCLElBQUksT0FBTyxFQUFFLENBQUM7UUFHeEQsWUFBTyxHQUNMLEVBQUMsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQWV0RyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxtQ0FBTyxJQUFJLENBQUMsT0FBTyxHQUFLLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQ3JCLEVBQUMsS0FBSyxFQUFFO2dCQUNOLE9BQU8sRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sUUFBUTtnQkFDOUUsVUFBVSxFQUFF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ZGcnO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCB7U3ViamVjdCwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB0eXBlIEl0ZW1UeXBlID0ge1tfOnN0cmluZ106IGFueX07XG5leHBvcnQgdHlwZSBJdGVtc0dyaWRPcHRpb25zID0ge1xuICAgIHJlbW92ZUJ1dHRvblRvb2x0aXA/OiBzdHJpbmcsXG4gICAgYWRkQnV0dG9uVG9vbHRpcD86IHN0cmluZyxcbiAgICBhbGxvd1JlbW92ZT86IGJvb2xlYW4sXG4gICAgYWxsb3dBZGQ/OiBib29sZWFuLFxuICAgIGhvcml6b250YWxJbnB1dE5hbWVzPzogYm9vbGVhbixcbiAgICBuZXdJdGVtRnVuY3Rpb24/OiAoKSA9PiBJdGVtVHlwZSxcbiAgICBjdXN0b21JbnB1dHM/OiB7W2tleTogc3RyaW5nXTogKGl0ZW06IEl0ZW1UeXBlKSA9PiBJbnB1dFR5cGV9LFxuICAgIHZhbGlkYXRvcnM/OiB7W2tleTogc3RyaW5nXTogKHZhbHVlOiBzdHJpbmcpID0+IHN0cmluZyB8IG51bGx9LFxuICAgIGN1c3RvbUxhYmVscz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgIGlucHV0T3B0aW9ucz86IHtba2V5OiBzdHJpbmddOiBIVE1MRWxlbWVudH1cbn07XG5cbmV4cG9ydCB0eXBlIElucHV0VHlwZSA9IHtcbiAgICBpbnB1dD86IEhUTUxFbGVtZW50LFxuICAgIHJvb3Q6IEhUTUxFbGVtZW50LFxuICAgIHZhbHVlOiBhbnksXG4gICAgb25DaGFuZ2VkOiBPYnNlcnZhYmxlPGFueT4sXG4gICAgYWRkT3B0aW9ucz86IChlbDogSFRNTEVsZW1lbnQpID0+IHZvaWQsXG4gICAgYWRkVmFsaWRhdG9yOiAodmFsaWRhdG9yOiAodmFsdWU6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbCkgPT4gdm9pZFxufVxuXG4vKiogRWRpdG9yIGZvciBwcmVkZWZpbmVkIHByb3BlcnRpZXMgaW4gYSBncmlkIGZvcm0uIFN1cHBvcnRzIGFkZGluZywgcmVtb3ZpbmcgYW5kIGVkaXRpbmcgb2YgcHJvcHMuICovXG5leHBvcnQgY2xhc3MgSXRlbXNHcmlkIHtcbiAgcHJpdmF0ZSBfcm9vdDogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgX2l0ZW1zOiB7W2tleTogc3RyaW5nXTogYW55fVtdO1xuXG4gIC8qKiBPYnNlcnZhYmxlIGZvciB3aGVuIHRoZSBhZGRlZCBpdGVtIGlzIGNoYW5nZSAqL1xuICBwdWJsaWMgb25JdGVtQ2hhbmdlZDogU3ViamVjdDx7aXRlbTpJdGVtVHlwZSwgZmllbGROYW1lOiBzdHJpbmd9PiA9IG5ldyBTdWJqZWN0KCk7XG4gIC8qKiBPYnNlcnZhYmxlIGZvciB3aGVuIHRoZSBhZGRpbmcgaXRlbSBpcyBjaGFuZ2UgKi9cbiAgcHVibGljIG9uQWRkaW5nSXRlbUNoYW5nZWQ6IFN1YmplY3Q8e2l0ZW06SXRlbVR5cGUsIGZpZWxkTmFtZTogc3RyaW5nfT4gPSBuZXcgU3ViamVjdCgpO1xuICAvKiogT2JzZXJ2YWJsZSBmb3Igd2hlbiB0aGUgaXRlbSBpcyBhZGRlZCAqL1xuICBwdWJsaWMgb25JdGVtQWRkZWQ6IFN1YmplY3Q8SXRlbVR5cGU+ID0gbmV3IFN1YmplY3QoKTtcbiAgLyoqIE9ic2VydmFibGUgZm9yIHdoZW4gdGhlIGl0ZW0gaXMgcmVtb3ZlZCAqL1xuICBwdWJsaWMgb25JdGVtUmVtb3ZlZDogU3ViamVjdDxJdGVtVHlwZT4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByb3BlcnRpZXM6IERHLlByb3BlcnR5W107XG4gIG9wdGlvbnM6IEl0ZW1zR3JpZE9wdGlvbnMgPVxuICAgIHtyZW1vdmVCdXR0b25Ub29sdGlwOiAnUmVtb3ZlIGl0ZW0nLCBhZGRCdXR0b25Ub29sdGlwOiAnQWRkIGl0ZW0nLCBhbGxvd0FkZDogdHJ1ZSwgYWxsb3dSZW1vdmU6IHRydWV9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgSXRlbXNHcmlkIHdoaWNoIGlzIGEgZ3JpZCBmb3JtIGZvciBlZGl0aW5nIHByb3BlcnRpZXMuXG4gICAgICogQHBhcmFtIHtERy5Qcm9wZXJ0eVtdfXByb3BlcnRpZXMgLSBwcm9wZXJ0aWVzIHRvIGJlIGVkaXRlZFxuICAgICAqIEBwYXJhbSB7SXRlbVR5cGVwW119aXRlbXMgLSBpdGVtcyB0byBiZSBlZGl0ZWRcbiAgICAgKiBAcGFyYW0ge0l0ZW1zR3JpZE9wdGlvbnN9b3B0aW9ucyAtIG9wdGlvbnMgZm9yIHRoZSBncmlkXG4gICAgICogT3B0aW9ucyBpbmNsdWRlOlxuICAgICAqIHJlbW92ZUJ1dHRvblRvb2x0aXAgLSB0b29sdGlwIGZvciB0aGUgcmVtb3ZlIGJ1dHRvbiAtIGRlZmF1bHQgaXMgJ1JlbW92ZSBpdGVtJ1xuICAgICAqIGFkZEJ1dHRvblRvb2x0aXAgLSB0b29sdGlwIGZvciB0aGUgYWRkIGJ1dHRvbiAtIGRlZmF1bHQgaXMgJ0FkZCBpdGVtJ1xuICAgICAqIGFsbG93UmVtb3ZlIC0gd2hldGhlciB0byBhbGxvdyByZW1vdmluZyBpdGVtcyAtIGRlZmF1bHQgaXMgdHJ1ZVxuICAgICAqIGFsbG93QWRkIC0gd2hldGhlciB0byBhbGxvdyBhZGRpbmcgaXRlbXMgLSBkZWZhdWx0IGlzIHRydWVcbiAgICAgKiBob3Jpem9udGFsSW5wdXROYW1lcyAtIFNob3cgdGhlIGlucHV0IG5hbWVzIG5leHQgdG8gaW50cHV0IC0gZGVmYXVsdCBpcyBmYWxzZSwgbmFtZXMgYXJlIHNob3duIGFib3ZlIHRoZSBncmlkLlxuICAgICAqIG5ld0l0ZW1GdW5jdGlvbiAtIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBuZXcgaXRlbSAtIGRlZmF1bHQgaXMgdW5kZWZpbmQsIGluIHdoaWNoIGNhc2UgYW4gZW1wdHkgb2JqZWN0IGlzIGNyZWF0ZWQuXG4gICAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BlcnRpZXM6IERHLlByb3BlcnR5W10sIGl0ZW1zOiBJdGVtVHlwZVtdID0gW10sIG9wdGlvbnM6IEl0ZW1zR3JpZE9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgdGhpcy5vcHRpb25zID0gey4uLnRoaXMub3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgdGhpcy5fcm9vdCA9IHVpLmRpdlYoW10sXG4gICAgICB7c3R5bGU6IHtcbiAgICAgICAgZGlzcGxheTogJ2dyaWQnLCBncmlkVGVtcGxhdGVDb2x1bW5zOiBgcmVwZWF0KCR7dGhpcy5wcm9wZXJ0aWVzLmxlbmd0aH0sIDFmcilgLFxuICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJywgZ2FwOiAnMTJweCd9LCBjbGFzc2VzOiAndWktaXRlbXMtZ3JpZCd9KTtcbiAgICB0aGlzLl9pdGVtcyA9IGl0ZW1zO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBnZXQgcm9vdCgpOiBIVE1MRGl2RWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gIH1cblxuICBnZXQgaXRlbXMoKToge1trZXk6IHN0cmluZ106IGFueX1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICB9XG5cbiAgc2V0IGl0ZW1zKHZhbHVlOiB7W2tleTogc3RyaW5nXTogYW55fVtdKSB7XG4gICAgdGhpcy5faXRlbXMgPSB2YWx1ZTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgcHVibGljIGFkZEl0ZW0oaXRlbTogSXRlbVR5cGUsIG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLl9pdGVtcy5wdXNoKGl0ZW0pO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgaWYgKG5vdGlmeSlcbiAgICAgIHRoaXMub25JdGVtQWRkZWQubmV4dChpdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVJdGVtKGl0ZW06IEl0ZW1UeXBlLCBub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2l0ZW1zLmluZGV4T2YoaXRlbSkgPT09IC0xKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuX2l0ZW1zLnNwbGljZSh0aGlzLl9pdGVtcy5pbmRleE9mKGl0ZW0pLCAxKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICB0aGlzLm9uSXRlbVJlbW92ZWQubmV4dChpdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBdEluZGV4KGluZGV4OiBudW1iZXIsIG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuX2l0ZW1zLmxlbmd0aClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5faXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICB0aGlzLm9uSXRlbVJlbW92ZWQubmV4dChyZW1vdmVkWzBdKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBbGxJdGVtcygpOiB2b2lkIHtcbiAgICB0aGlzLl9pdGVtcyA9IFtdO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKCk6IHZvaWQge1xuICAgIHVpLmVtcHR5KHRoaXMuX3Jvb3QpO1xuICAgIGlmICghdGhpcy5vcHRpb25zLmhvcml6b250YWxJbnB1dE5hbWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxldCBsYWJlbCA9IHByb3AuY2FwdGlvbiA/PyBwcm9wLm5hbWU7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tTGFiZWxzPy5bcHJvcC5uYW1lXSlcbiAgICAgICAgICBsYWJlbCA9IHRoaXMub3B0aW9ucy5jdXN0b21MYWJlbHNbcHJvcC5uYW1lXTtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdWkuZGl2VGV4dChsYWJlbCk7XG4gICAgICAgIGhlYWRlci5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xuICAgICAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKGhlYWRlcik7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLl9pdGVtcykge1xuICAgICAgY29uc3QgZWRpdG9ycyA9IHRoaXMuZ2V0SXRlbURpdihpdGVtKTtcbiAgICAgIC8vIGlmIChlZGl0b3JzLmxlbmd0aCAhPT0gdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aCArIDEpXG4gICAgICAvLyAgIGVkaXRvcnMucHVzaCh1aS5kaXYoKSk7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKVxuICAgICAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKGVkaXRvcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hbGxvd0FkZCkge1xuICAgICAgY29uc3QgbmV3RWRpdG9yID0gdGhpcy5nZXRJdGVtRGl2KHRoaXMub3B0aW9ucy5uZXdJdGVtRnVuY3Rpb24/LigpID8/IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBuZXdFZGl0b3IpXG4gICAgICAgIHRoaXMuX3Jvb3QuYXBwZW5kQ2hpbGQoZWRpdG9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEl0ZW1EaXYoaXRlbTogSXRlbVR5cGUgPSB7fSwgaXNBZGRpbmc/OiBib29sZWFuKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgY29uc3QgZWRpdG9yczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgY29uc3QgaW5wdXRzTWFwOiB7W186IHN0cmluZ106IElucHV0VHlwZX0gPSB7fTtcbiAgICBsZXQgbGFzdElucHV0OiBJbnB1dFR5cGUgfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoaXRlbVtwcm9wLm5hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAgIGl0ZW1bcHJvcC5uYW1lXSA9IG51bGw7IC8vIG5lZWRlZCBmb3IgZGF0ZSBlZGl0b3IsIGl0IGNhbiBub3QgaGFuZGxlIHVuZGVmaW5lZFxuICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tSW5wdXRzPy5bcHJvcC5uYW1lXSA/IHRoaXMub3B0aW9ucy5jdXN0b21JbnB1dHNbcHJvcC5uYW1lXShpdGVtKSA6XG4gICAgICAgIHVpLmlucHV0LmZvclByb3BlcnR5KHByb3AsIGl0ZW0pO1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5vcHRpb25zLnZhbGlkYXRvcnM/Lltwcm9wLm5hbWVdO1xuICAgICAgaWYgKHZhbGlkYXRvcilcbiAgICAgICAgaW5wdXQuYWRkVmFsaWRhdG9yKHZhbGlkYXRvcik7XG5cbiAgICAgIGVkaXRvcnMucHVzaCh0aGlzLm9wdGlvbnMuaG9yaXpvbnRhbElucHV0TmFtZXMgPyBpbnB1dC5yb290IDogdGhpcy5oaWRlTGFiZWwoaW5wdXQucm9vdCkpO1xuICAgICAgaWYgKHByb3AucHJvcGVydHlUeXBlICE9PSBERy5UWVBFLkJPT0wgJiYgcHJvcC5uYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdjb2xvcicpXG4gICAgICAgIGlucHV0LmlucHV0ICYmIChpbnB1dC5pbnB1dC5zdHlsZS53aWR0aCA9ICcxMDAlJyk7XG4gICAgICBpbnB1dHNNYXBbcHJvcC5uYW1lXSA9IGlucHV0O1xuICAgICAgaW5wdXQub25DaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGl0ZW1bcHJvcC5uYW1lXSA9IGlucHV0LnZhbHVlO1xuICAgICAgICBpc0FkZGluZyA/IHRoaXMub25BZGRpbmdJdGVtQ2hhbmdlZC5uZXh0KHtpdGVtLCBmaWVsZE5hbWU6IHByb3AubmFtZX0pIDpcbiAgICAgICAgICB0aGlzLm9uSXRlbUNoYW5nZWQubmV4dCh7aXRlbSwgZmllbGROYW1lOiBwcm9wLm5hbWV9KTtcbiAgICAgIH0pO1xuICAgICAgaW5wdXQucm9vdC5zdHlsZS5hbGlnbkl0ZW1zID0gJ2NlbnRlcic7IC8vIG5lZWRlZCBmb3IgbW9sZWN1bGUgZWRpdG9yXG4gICAgICBsYXN0SW5wdXQgPSBpbnB1dDtcbiAgICB9XG5cbiAgICBsZXQgY29tcGFuaW9uQnV0dG9uOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGlmIChpc0FkZGluZykge1xuICAgICAgY29uc3QgYWRkQnV0dG9uID0gdWkuaWNvbnMuYWRkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3SXRlbTogSXRlbVR5cGUgPSB0aGlzLm9wdGlvbnMubmV3SXRlbUZ1bmN0aW9uID8gdGhpcy5vcHRpb25zLm5ld0l0ZW1GdW5jdGlvbigpIDoge307XG4gICAgICAgIE9iamVjdC5rZXlzKGlucHV0c01hcCkuZm9yRWFjaCgocE5hbWUpID0+IHtcbiAgICAgICAgICBuZXdJdGVtW3BOYW1lXSA9IGlucHV0c01hcFtwTmFtZV0udmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9pdGVtcy5wdXNoKG5ld0l0ZW0pO1xuICAgICAgICB0aGlzLm9uSXRlbUFkZGVkLm5leHQobmV3SXRlbSk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB9LCB0aGlzLm9wdGlvbnMuYWRkQnV0dG9uVG9vbHRpcCk7XG4gICAgICBjb21wYW5pb25CdXR0b24gPSBhZGRCdXR0b247XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93UmVtb3ZlKSByZXR1cm4gZWRpdG9ycztcbiAgICAgIGNvbnN0IHJlbW92ZUJ1dHRvbiA9IHVpLmljb25zLmRlbGV0ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2l0ZW1zLnNwbGljZSh0aGlzLl9pdGVtcy5pbmRleE9mKGl0ZW0pLCAxKTtcbiAgICAgICAgdGhpcy5vbkl0ZW1SZW1vdmVkLm5leHQoaXRlbSk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB9LCB0aGlzLm9wdGlvbnMucmVtb3ZlQnV0dG9uVG9vbHRpcCk7XG4gICAgICBjb21wYW5pb25CdXR0b24gPSByZW1vdmVCdXR0b247XG4gICAgfVxuXG4gICAgLy9lZGl0b3JzLnB1c2goY29tcGFuaW9uQnV0dG9uKTtcbiAgICBsYXN0SW5wdXQgJiYgbGFzdElucHV0LmFkZE9wdGlvbnMgPyBsYXN0SW5wdXQuYWRkT3B0aW9ucyhjb21wYW5pb25CdXR0b24pIDpcbiAgICAgIGxhc3RJbnB1dD8ucm9vdC5hcHBlbmRDaGlsZChjb21wYW5pb25CdXR0b24pO1xuICAgIGNvbXBhbmlvbkJ1dHRvbi5zdHlsZS5jb2xvciA9ICcjMjA4M2Q1JztcbiAgICByZXR1cm4gZWRpdG9ycztcbiAgfVxuICAvL25lZWRlZCBmb3IgY29sb3IgaW5wdXRcbiAgcHJpdmF0ZSBoaWRlTGFiZWwoZWw6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xuICAgIGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsYWJlbCcpWzBdICYmIGVsLnJlbW92ZUNoaWxkKGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsYWJlbCcpWzBdKTtcbiAgICByZXR1cm4gZWw7XG4gIH1cblxuICBoYXNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3QucXVlcnlTZWxlY3RvckFsbCgnLmQ0LWludmFsaWQnKS5sZW5ndGggPiAwO1xuICB9XG59XG5cbi8qKiBVc2FnZSBleGFtcGxlOlxuICogY29uc3QgcHJvcHMgPSBbREcuUHJvcGVydHkuanMoJ25hbWUyJywgREcuVFlQRS5TVFJJTkcpLFxuICAgICAgREcuUHJvcGVydHkuanMoJ25hbWUzJywgREcuVFlQRS5OVU0pLFxuICAgICAgREcuUHJvcGVydHkuZnJvbU9wdGlvbnMoe25hbWU6ICduYW1lNCcsIHR5cGU6IERHLlRZUEUuREFURV9USU1FLCBudWxsYWJsZTogdHJ1ZX0pXTtcbiAgICBjb25zdCBpdGVtc0dyaWQgPSBuZXcgSXRlbXNHcmlkKHByb3BzKTtcbiAqIHRoZSBjb21wb25lbnQgaGFzIGEgcm9vdCBwcm9wZXJ0eSB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgcGFnZVxuICAgIHVpLmRpYWxvZygnZGlhbG9nJykuYWRkKGl0ZW1zR3JpZC5yb290KS5zaG93KCk7XG4gICAgYXQgYW55IHBvaW50LCBmaWxsZWQgZmllbGRzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgaXRlbXNHcmlkLml0ZW1zXG4gKi9cbiJdfQ==","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\n\nexport function getLayoutInput() {\n const dataFileProp = DG.Property.fromOptions({name: 'layout', caption: 'Layout', type: 'file'});\n const dataFileInput = DG.InputBase.forProperty(dataFileProp);\n let layout: DG.ViewLayout | null = null;\n let layoutViewState: string | null = null;\n let error: string | null = null;\n dataFileInput.addValidator((_) => error);\n dataFileInput.onChanged.subscribe(async (value) => {\n const f: DG.FileInfo = value;\n if (f) {\n try {\n const contentString = await f.readAsString();\n const l = DG.ViewLayout.fromJson(contentString);\n if (l) {\n layout = l;\n layoutViewState = l.viewState;\n error = null;\n } else {\n layout = null;\n layoutViewState = null;\n error = 'Invalid layout file';\n }\n } catch (e) {\n layout = null;\n layoutViewState = null;\n error = 'Invalid layout file';\n }\n }\n dataFileInput.setTooltip('Select a layout file');\n });\n return {\n dataFileInput, getLayout: () => layout, getLayoutViewState: () => layoutViewState,\n };\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport {_package} from '../../package';\nimport {CampaignFieldTypes, HitTriageCampaignField, HitTriageCampaignFieldType,\n IComputeDialogResult, HitTriageTemplate, IngestType, INewTemplateResult} from '../types';\nimport * as C from '../consts';\nimport '../../../css/hit-triage.css';\nimport {chemFunctionsDialog} from '../dialogs/functions-dialog';\nimport {ItemType, ItemsGrid} from '@datagrok-libraries/utils/src/items-grid';\nimport {HitAppBase} from '../hit-app-base';\nimport {getLayoutInput} from './layout-input';\n\n\nexport async function createTemplateAccordeon(app: HitAppBase<any>,\n dataSourceFunctionMap: { [key: string]: DG.Func | DG.DataQuery | DG.Script },\n): Promise<INewTemplateResult<HitTriageTemplate>> {\n const availableTemplates = (await _package.files.list('Hit Triage/templates')).map((file) => file.name.slice(0, -5));\n const availableTemplateKeys: string[] = [];\n for (const tn of availableTemplates) {\n const t: HitTriageTemplate = JSON.parse(await _package.files.readAsText(`Hit Triage/templates/${tn}.json`));\n availableTemplateKeys.push(t.key);\n }\n\n const availableSubmitFunctions = DG.Func.find({tags: [C.HitTriageSubmitTag]});\n const submitFunctionsMap: {[key: string]: DG.Func} = {};\n availableSubmitFunctions.forEach((func) => {\n submitFunctionsMap[func.friendlyName ?? func.name] = func;\n });\n const submitFunctionInput =\n ui.input.choice('Submit function', {value: null, items: [null, ...Object.keys(submitFunctionsMap)]});\n submitFunctionInput.value = null;\n submitFunctionInput.nullable = true;\n submitFunctionInput.fireChanged();\n submitFunctionInput.setTooltip('Select function to be called upon submitting');\n const layoutInput = getLayoutInput();\n const errorDiv = ui.divText('Template name is empty or already exists', {classes: 'hit-triage-error-div'});\n\n const keyErrorDiv = ui.divText('Template key is empty or already exists', {classes: 'hit-triage-error-div'});\n\n const templateNameInput = ui.input.string('Name', {value: '', onValueChanged: (value) => {\n if (value === '' || availableTemplates.includes(value)) {\n templateNameInput.root.style.borderBottom = '1px solid red';\n errorDiv.style.opacity = '100%';\n } else {\n templateNameInput.root.style.borderBottom = 'none';\n errorDiv.style.opacity = '0%';\n }\n }});\n const templateKeyInput = ui.input.string('Key', {value: '', onValueChanged: (value) => {\n if (value === '' || availableTemplateKeys.includes(value)) {\n templateKeyInput.root.style.borderBottom = '1px solid red';\n keyErrorDiv.style.opacity = '100%';\n } else {\n templateKeyInput.root.style.borderBottom = 'none';\n keyErrorDiv.style.opacity = '0%';\n }\n }});\n\n templateKeyInput.setTooltip('Template key used for campaign prefix');\n templateNameInput.setTooltip('Template name');\n templateNameInput.root.style.borderBottom = 'none';\n templateKeyInput.root.style.borderBottom = 'none';\n errorDiv.style.opacity = '0%';\n keyErrorDiv.style.opacity = '0%';\n\n let funcDialogRes: IComputeDialogResult | null = null;\n // used just for functions editor\n const dummyTemplate = {\n compute: {\n descriptors: {\n enabled: true,\n args: [],\n },\n functions: [],\n },\n } as unknown as HitTriageTemplate;\n const funcInput = await chemFunctionsDialog(app, (res) => {funcDialogRes = res;}, () => null,\n dummyTemplate, false);\n funcInput.root.classList.add('hit-triage-new-template-functions-input');\n if (Object.entries(dataSourceFunctionMap).length === 0) {\n // functions that have special tag and are applicable for data source. they should return a dataframe with molecules\n const dataSourceFunctions = DG.Func.find({tags: [C.HitTriageDataSourceTag]});\n dataSourceFunctions.forEach((func) => {\n dataSourceFunctionMap[func.friendlyName ?? func.name] = func;\n });\n }\n const combinedSourceNames = Object.keys(dataSourceFunctionMap);\n const dataSourceFunctionInput = ui.input.choice(\n C.i18n.dataSourceFunction, {value: combinedSourceNames[0], items: combinedSourceNames});\n const ingestTypeInput = ui.input.choice<IngestType>('Ingest using', {value: 'Query', items: ['Query', 'File'],\n onValueChanged: (value) => {\n dataSourceFunctionInput.root.style.display = value === 'Query' ? 'block' : 'none';\n }});\n\n const fieldsEditor = getCampaignFieldEditors();\n\n const form = ui.div([\n ui.h2('Details'),\n ui.div([templateNameInput, errorDiv]),\n ui.div([templateKeyInput, keyErrorDiv]),\n ingestTypeInput.root,\n dataSourceFunctionInput.root,\n layoutInput.dataFileInput,\n fieldsEditor.fieldsDiv,\n ui.h2('Compute'),\n funcInput.root,\n ui.h2('Submit'),\n submitFunctionInput.root,\n ], 'ui-form');\n\n const buttonsDiv = ui.buttonsInput([]);\n const buttonsContainerDiv = buttonsDiv.getElementsByClassName('ui-input-editor')?.[0] ?? buttonsDiv;\n form.appendChild(buttonsDiv);\n const cancelPromise = new Promise<void>((resolve) => {\n const cancelButton = ui.button(C.i18n.cancel, () => resolve());\n buttonsContainerDiv.appendChild(cancelButton);\n });\n\n const promise = new Promise<HitTriageTemplate>((resolve) => {\n async function onOkProxy() {\n funcInput.okProxy();\n if (errorDiv.style.opacity === '100%') {\n grok.shell.error('Template name is empty or already exists');\n return;\n }\n const submitFunction = submitFunctionInput.value ? submitFunctionsMap[submitFunctionInput.value] : undefined;\n const out: HitTriageTemplate = {\n name: templateNameInput.value,\n key: templateKeyInput.value,\n campaignFields: fieldsEditor.getFields(),\n dataSourceType: ingestTypeInput.value ?? 'Query',\n layoutViewState: layoutInput.getLayoutViewState() ?? undefined,\n compute: {\n descriptors: {\n enabled: !!funcDialogRes?.descriptors?.length,\n args: funcDialogRes?.descriptors ?? [],\n },\n functions: Object.entries(funcDialogRes?.externals ?? {}).map(([funcName, args]) => {\n const splitFunc = funcName.split(':');\n return ({\n name: splitFunc[1],\n package: splitFunc[0],\n args: args,\n });\n }),\n scripts: Object.entries(funcDialogRes?.scripts ?? {})\n .filter(([name, _]) => name.startsWith(C.HTScriptPrefix) && name.split(':').length === 3)\n .map(([scriptId, args]) => {\n const scriptNameParts = scriptId.split(':');\n return ({\n name: scriptNameParts[1] ?? '',\n id: scriptNameParts[2] ?? '',\n args: args,\n });\n }),\n queries: Object.entries(funcDialogRes?.queries ?? {})\n .filter(([name, _]) => name.startsWith(C.HTQueryPrefix) && name.split(':').length === 3)\n .map(([queryName, args]) => {\n const queryNameParts = queryName.split(':');\n return ({\n name: queryNameParts[1] ?? '',\n id: queryNameParts[2] ?? '',\n args: args,\n });\n }),\n },\n ...(submitFunction ? {submit: {fName: submitFunction.name, package: submitFunction.package.name}} : {}),\n queryFunctionName: (ingestTypeInput.value === 'Query') ? dataSourceFunctionInput.value ?? undefined : undefined,\n };\n saveTemplate(out);\n grok.shell.info('Template created successfully');\n resolve(out);\n }\n const createTemplateButton = ui.bigButton(C.i18n.createTemplate, () => onOkProxy());\n buttonsContainerDiv.appendChild(createTemplateButton);\n });\n\n return {root: form, template: promise, cancelPromise};\n}\n\nexport function getCampaignFieldEditors(preset?: HitTriageCampaignField[]) {\n const props = [DG.Property.fromOptions({name: 'Name', type: DG.TYPE.STRING}),\n DG.Property.fromOptions({name: 'Type', type: DG.TYPE.STRING, choices: Object.keys(CampaignFieldTypes)}),\n DG.Property.fromOptions({name: 'Required', type: DG.TYPE.BOOL})];\n const itemsGrid = new ItemsGrid(\n props, preset ? preset.map((p) => ({Name: p.name, Type: p.type, Required: p.required})) : undefined,\n {horizontalInputNames: false});\n itemsGrid.root.style.maxWidth = '750px';\n\n let addingItem: ItemType = {};\n itemsGrid.onItemAdded.subscribe((_) => {\n addingItem = {};\n });\n itemsGrid.onAddingItemChanged.subscribe((item) => {\n if (item)\n addingItem = item.item;\n });\n\n function getFieldParams(): HitTriageCampaignField[] {\n const items = itemsGrid.items.filter((f) => f.Name).map((f) => ({\n name: f.Name,\n type: f.Type as HitTriageCampaignFieldType,\n required: f.Required ?? false,\n }));\n if (addingItem.Name && addingItem.Name !== '' && addingItem.Type) {\n addingItem.Required ??= false;\n items.push({name: addingItem.Name, type: addingItem.Type, required: addingItem.Required});\n }\n return items;\n }\n //itemsGrid.root.style.cssText = '';\n //itemsGrid.root.className = 'd4-flex-c';\n\n const header = ui.h2('Additional fields');\n ui.tooltip.bind(header, 'Additional fields to be filled by user for each campaign');\n const fieldsContainer = ui.div([\n header,\n itemsGrid.root,\n ]);\n return {\n getFields: getFieldParams,\n fieldsDiv: ui.div([fieldsContainer]),\n };\n}\n\nexport function saveTemplate(template: HitTriageTemplate) {\n _package.files.writeAsText(`Hit Triage/templates/${template.name}.json`, JSON.stringify(template));\n}\n","import * as DG from 'datagrok-api/dg';\nimport {AppName, HitDesignTemplate, HitTriageTemplate, PeptiHitTemplate} from './types';\nimport {HitDesignApp} from './hit-design-app';\nimport {HitTriageApp} from './hit-triage-app';\nimport {_package} from '../package';\n\nexport class HitBaseView<Ttemplate extends HitDesignTemplate | HitTriageTemplate | PeptiHitTemplate,\n Tapp extends HitDesignApp | HitTriageApp> extends DG.ViewBase {\n app: Tapp;\n protected deletedCampaigns: string[] = [];\n constructor(app: Tapp) {\n super();\n\n this.app = app;\n }\n\n get template(): Ttemplate {return this.app.template! as Ttemplate;}\n\n /** Override to initialize the view based on the session. */\n onActivated(): void {\n }\n\n /** Gets called when any of the previous views change. */\n onReset() {\n }\n\n async process(): Promise<any> {\n }\n\n async deleteCampaign(appName: AppName, campaignId: string): Promise<void> {\n await _package.files.delete(`${appName}/campaigns/${campaignId}`);\n }\n}\n","\n import API from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../css-loader/dist/cjs.js!./u2.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../css-loader/dist/cjs.js!./u2.css\";\n export default content && content.locals ? content.locals : undefined;\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport $ from 'cash-dom';\nimport './u2.css';\nexport var u2;\n(function (u2) {\n /** */\n let panels;\n (function (panels) {\n /** Vertically positioned items */\n function vert(items) {\n return ui.divV(items.map((item) => ui.render(item)), { classes: 'u2-panel' });\n }\n panels.vert = vert;\n /** Horizontally positioned items */\n function horz(items) {\n return ui.divH(items.map((item) => ui.render(item)), { classes: 'u2-panel' });\n }\n panels.horz = horz;\n })(panels = u2.panels || (u2.panels = {}));\n function appHeader(header) {\n const icon = ui.iconImage('', header.iconPath);\n $(icon).addClass('ui-app-header-icon').css('margin-right', '20px');\n return panels.horz([\n icon,\n panels.vert([\n ui.markdown(header.description),\n header.learnMoreUrl ? ui.link('Learn more', header.learnMoreUrl) : null\n ])\n ]);\n }\n u2.appHeader = appHeader;\n let tools;\n (function (tools) {\n /** Executes {@link func} while showing the \"running\" indicator on {@link root}.\n * Handles and logs exceptions. */\n function runAsync(root, func) {\n return __awaiter(this, void 0, void 0, function* () {\n ui.setUpdateIndicator(root, true);\n try {\n return yield func();\n }\n catch (e) {\n grok.log.error(e);\n }\n finally {\n ui.setUpdateIndicator(root, false);\n }\n });\n }\n tools.runAsync = runAsync;\n })(tools = u2.tools || (u2.tools = {}));\n})(u2 || (u2 = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidTIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxDQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3pCLE9BQU8sVUFBVSxDQUFDO0FBR2xCLE1BQU0sS0FBVyxFQUFFLENBc0RsQjtBQXRERCxXQUFpQixFQUFFO0lBRWpCLE1BQU07SUFDTixJQUFpQixNQUFNLENBWXRCO0lBWkQsV0FBaUIsTUFBTTtRQUVyQixrQ0FBa0M7UUFDbEMsU0FBZ0IsSUFBSSxDQUFDLEtBQVk7WUFDL0IsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFGZSxXQUFJLE9BRW5CLENBQUE7UUFFRCxvQ0FBb0M7UUFDcEMsU0FBZ0IsSUFBSSxDQUFDLEtBQVk7WUFDL0IsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFGZSxXQUFJLE9BRW5CLENBQUE7SUFFSCxDQUFDLEVBWmdCLE1BQU0sR0FBTixTQUFNLEtBQU4sU0FBTSxRQVl0QjtJQVFELFNBQWdCLFNBQVMsQ0FBQyxNQUFnQjtRQUN4QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbkUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2pCLElBQUk7WUFDSixNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztnQkFDL0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2FBQ3hFLENBQUM7U0FDSCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBWGUsWUFBUyxZQVd4QixDQUFBO0lBR0QsSUFBaUIsS0FBSyxDQWdCckI7SUFoQkQsV0FBaUIsS0FBSztRQUVwQjswQ0FDa0M7UUFDbEMsU0FBc0IsUUFBUSxDQUFJLElBQWlCLEVBQUUsSUFBc0I7O2dCQUN6RSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxJQUFJO29CQUNGLE9BQU8sTUFBTSxJQUFJLEVBQUUsQ0FBQztpQkFDckI7Z0JBQ0QsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBVyxDQUFDLENBQUM7aUJBQzdCO3dCQUNPO29CQUNOLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3BDO1lBQ0gsQ0FBQztTQUFBO1FBWHFCLGNBQVEsV0FXN0IsQ0FBQTtJQUNILENBQUMsRUFoQmdCLEtBQUssR0FBTCxRQUFLLEtBQUwsUUFBSyxRQWdCckI7QUFDSCxDQUFDLEVBdERnQixFQUFFLEtBQUYsRUFBRSxRQXNEbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgJCBmcm9tICdjYXNoLWRvbSc7XG5pbXBvcnQgJy4vdTIuY3NzJztcblxuXG5leHBvcnQgbmFtZXNwYWNlIHUyIHtcblxuICAvKiogKi9cbiAgZXhwb3J0IG5hbWVzcGFjZSBwYW5lbHMge1xuXG4gICAgLyoqIFZlcnRpY2FsbHkgcG9zaXRpb25lZCBpdGVtcyAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiB2ZXJ0KGl0ZW1zOiBhbnlbXSk6IEhUTUxFbGVtZW50IHtcbiAgICAgIHJldHVybiB1aS5kaXZWKGl0ZW1zLm1hcCgoaXRlbSkgPT4gdWkucmVuZGVyKGl0ZW0pKSwgeyBjbGFzc2VzOiAndTItcGFuZWwnfSk7XG4gICAgfVxuXG4gICAgLyoqIEhvcml6b250YWxseSBwb3NpdGlvbmVkIGl0ZW1zICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGhvcnooaXRlbXM6IGFueVtdKTogSFRNTEVsZW1lbnQge1xuICAgICAgcmV0dXJuIHVpLmRpdkgoaXRlbXMubWFwKChpdGVtKSA9PiB1aS5yZW5kZXIoaXRlbSkpLCB7IGNsYXNzZXM6ICd1Mi1wYW5lbCd9KTtcbiAgICB9XG5cbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgSUFwcEluZm8ge1xuICAgIGljb25QYXRoOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBsZWFybk1vcmVVcmw/OiBzdHJpbmc7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gYXBwSGVhZGVyKGhlYWRlcjogSUFwcEluZm8pOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgaWNvbiA9IHVpLmljb25JbWFnZSgnJywgaGVhZGVyLmljb25QYXRoKTtcbiAgICAkKGljb24pLmFkZENsYXNzKCd1aS1hcHAtaGVhZGVyLWljb24nKS5jc3MoJ21hcmdpbi1yaWdodCcsICcyMHB4Jyk7XG5cbiAgICByZXR1cm4gcGFuZWxzLmhvcnooW1xuICAgICAgaWNvbixcbiAgICAgIHBhbmVscy52ZXJ0KFtcbiAgICAgICAgdWkubWFya2Rvd24oaGVhZGVyLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgaGVhZGVyLmxlYXJuTW9yZVVybCA/IHVpLmxpbmsoJ0xlYXJuIG1vcmUnLCBoZWFkZXIubGVhcm5Nb3JlVXJsKSA6IG51bGxcbiAgICAgIF0pXG4gICAgXSk7XG4gIH1cblxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgdG9vbHMge1xuXG4gICAgLyoqIEV4ZWN1dGVzIHtAbGluayBmdW5jfSB3aGlsZSBzaG93aW5nIHRoZSBcInJ1bm5pbmdcIiBpbmRpY2F0b3Igb24ge0BsaW5rIHJvb3R9LlxuICAgICAqIEhhbmRsZXMgYW5kIGxvZ3MgZXhjZXB0aW9ucy4gKi9cbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQXN5bmM8VD4ocm9vdDogSFRNTEVsZW1lbnQsIGZ1bmM6ICgpID0+IFByb21pc2U8VD4pIHtcbiAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcihyb290LCB0cnVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmdW5jKCk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICBncm9rLmxvZy5lcnJvcihlIGFzIHN0cmluZyk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHtcbiAgICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHJvb3QsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0iXX0=","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport {TriagePermissions} from '../types';\nexport const defaultPermissions: TriagePermissions = {\n view: [DG.Group.defaultGroupsIds['All users']],\n edit: [DG.Group.defaultGroupsIds['All users']],\n};\n\nexport class PermissionsDialog {\n permissions: TriagePermissions;\n editGroupsInput: DG.InputBase<DG.Group[]>;\n viewGroupsInput: DG.InputBase<DG.Group[]>;\n\n constructor(permissions?: TriagePermissions) {\n this.permissions = permissions ?? defaultPermissions;\n // @ts-ignore TODO: fix typings\n this.editGroupsInput = ui.input.userGroups('Can Edit');\n this.editGroupsInput.root.style.marginBottom = '16px';\n // @ts-ignore TODO: fix typings\n this.viewGroupsInput = ui.input.userGroups('Can View');\n }\n\n private async getDialogContent(): Promise<HTMLElement> {\n const viewGroups: DG.Group[] = [];\n const editGroups: DG.Group[] = [];\n for (const groupId of this.permissions.view) {\n const group = await grok.dapi.groups.find(groupId);\n if (group)\n viewGroups.push(group);\n }\n for (const groupId of this.permissions.edit) {\n const group = await grok.dapi.groups.find(groupId);\n if (group)\n editGroups.push(group);\n }\n\n // values are set separately as there still are some bugs with input\n //@ts-ignore\n this.editGroupsInput.value = editGroups;\n //@ts-ignore\n this.viewGroupsInput.value = viewGroups;\n return ui.divV([\n this.editGroupsInput.root,\n this.viewGroupsInput.root,\n ]);\n }\n\n async show(onOk: (res: TriagePermissions) => void) {\n const content = await this.getDialogContent();\n const dialog = ui.dialog('Edit Permissions')\n .add(content)\n .onOK(() => {\n const editSet = new Set(this.editGroupsInput.value.map((group) => group.id));\n const viewSet = new Set(this.viewGroupsInput.value.map((group) => group.id));\n this.permissions.edit = Array.from(editSet);\n editSet.forEach((id) => viewSet.add(id)); // all who can edit can also view\n this.permissions.view = Array.from(viewSet);\n if (this.permissions.view.length === 0)\n this.permissions.view = defaultPermissions.view;\n onOk(this.permissions);\n });\n content.parentElement?.style && (content.parentElement.style.overflow = 'visible');\n dialog.show();\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {HitTriageApp} from '../hit-triage-app';\nimport {_package} from '../../package';\nimport {HitTriageTemplate} from '../types';\nimport {CampaignIdKey, CampaignJsonName, i18n} from '../consts';\nimport {HitTriageCampaign} from '../types';\nimport '../../../css/hit-triage.css';\nimport {addBreadCrumbsToRibbons, checkEditPermissions, checkViewPermissions,\n loadCampaigns, modifyUrl, popRibbonPannels} from '../utils';\nimport {newCampaignAccordeon} from '../accordeons/new-campaign-accordeon';\nimport $ from 'cash-dom';\nimport {createTemplateAccordeon} from '../accordeons/new-template-accordeon';\nimport {HitBaseView} from '../base-view';\nimport {u2} from '@datagrok-libraries/utils/src/u2';\nimport {defaultPermissions} from '../dialogs/permissions-dialog';\n\nexport class InfoView extends HitBaseView<HitTriageTemplate, HitTriageApp> {\n public readmePath = _package.webRoot + 'README_HT.md';\n private dataSourceFunctionsMap: {[key: string]: DG.Func | DG.DataQuery} = {};\n constructor(app: HitTriageApp) {\n super(app);\n this.name = 'Hit Triage';\n grok.shell.windows.showHelp = true;\n grok.shell.windows.help.showHelp(this.readmePath);\n this.checkCampaign().then((c) => {this.app.campaign = c; this.init();});\n }\n\n onActivated(): void {\n grok.shell.windows.showHelp = true;\n grok.shell.windows.help.showHelp(this.readmePath);\n }\n\n async init(presetTemplate?: HitTriageTemplate): Promise<void> {\n ui.setUpdateIndicator(this.root, true);\n try {\n const continueCampaignsHeader = ui.h1(i18n.continueCampaigns);\n const createNewCampaignHeader = ui.h1(i18n.createNewCampaignHeader, {style: {marginLeft: '10px'}});\n const appHeader = u2.appHeader({\n iconPath: _package.webRoot + '/images/icons/hit-triage-icon.png',\n learnMoreUrl: 'https://github.com/datagrok-ai/public/blob/master/packages/HitTriage/README_HT.md',\n description: '- Configure your own workflow using the template editor.\\n'+\n '- Calculate different molecular properties.\\n'+\n '- Filter molecules using different criteria.\\n'+\n '- Submit processed dataframe to the function of your choice.\\n'+\n '- Save campaigns and continue any time from where you left off.\\n ',\n });\n\n const campaignAccordionDiv = ui.div();\n const templatesDiv = ui.div([], {classes: 'ui-form'});\n\n const campaignsTable = await this.getCampaignsTable();\n\n await this.startNewCampaign(campaignAccordionDiv, templatesDiv, presetTemplate);\n $(this.root).empty();\n this.root.appendChild(ui.div([\n ui.divV([appHeader, continueCampaignsHeader], {style: {marginLeft: '10px'}}),\n campaignsTable,\n createNewCampaignHeader,\n templatesDiv,\n campaignAccordionDiv,\n ]));\n this.app.resetBaseUrl();\n } catch (e) {\n ui.setUpdateIndicator(this.root, false);\n throw e;\n } finally {\n ui.setUpdateIndicator(this.root, false);\n }\n }\n\n private async startNewCampaign(\n containerDiv: HTMLElement, templateInputDiv: HTMLElement, presetTemplate?: HitTriageTemplate,\n ) {\n const templates = (await _package.files.list('Hit Triage/templates')).map((file) => file.name.slice(0, -5));\n // if the template is just created and saved, it may not be in the list of templates\n if (presetTemplate && !templates.includes(presetTemplate.name))\n templates.push(presetTemplate.name);\n\n const onTemmplateChange = async () => {\n const templateName = templatesInput.value;\n const template: HitTriageTemplate = presetTemplate && presetTemplate.name === templateName ? presetTemplate :\n JSON.parse(await _package.files.readAsText('Hit Triage/templates/' + templateName + '.json'));\n const newCampaignAccordeon = await this.getNewCampaignAccordeon(template, containerDiv);\n $(containerDiv).empty();\n containerDiv.className = 'ui-form';\n containerDiv.appendChild(newCampaignAccordeon);\n };\n\n const templatesInput =\n ui.input.choice(i18n.selectTemplate, {value: presetTemplate?.name ?? templates[0], items: templates,\n onValueChanged: async () => {\n await onTemmplateChange();\n }});\n const createNewtemplateButton = ui.icons.add(async () => {\n ui.setUpdateIndicator(this.root, true);\n await this.createNewTemplate();\n ui.setUpdateIndicator(this.root, false);\n }, i18n.createNewTemplate);\n templatesInput.addOptions(createNewtemplateButton);\n\n await onTemmplateChange();\n $(templateInputDiv).empty();\n templateInputDiv.appendChild(templatesInput.root);\n }\n\n private async checkCampaign(campId?: string) {\n const url = location.search;\n const urlParams = new URLSearchParams(url);\n if (!urlParams.has(CampaignIdKey) && !campId)\n return;\n const campaignId = campId ?? urlParams.get(CampaignIdKey);\n // check if such campaign exists\n if (!await _package.files.exists(`Hit Triage/campaigns/${campaignId}/${CampaignJsonName}`))\n return;\n const campaign: HitTriageCampaign =\n JSON.parse(await _package.files.readAsText(`Hit Triage/campaigns/${campaignId}/${CampaignJsonName}`));\n\n if (campaign) {\n // in case if the link was opened and user has no permissions to view the campaign\n if (campaign.authorUserId && campaign.permissions &&\n !await checkViewPermissions(campaign.authorUserId, campaign.permissions)\n ) {\n this.app.setBaseUrl();\n return;\n }\n this.app.campaign = campaign;\n }\n // Load the template and modify it\n const template: HitTriageTemplate = JSON.parse(\n await _package.files.readAsText(`Hit Triage/templates/${campaign.templateName}.json`),\n );\n // modify the template with path to the campaign's precalculated table\n this.app.setTemplate(template, campaign.filters, campaignId!, campaign.ingest);\n\n if (campId)\n modifyUrl(CampaignIdKey, campId);\n\n return campaign;\n }\n\n private async getCampaignsTable() {\n const campaignNamesMap = await loadCampaigns('Hit Triage', this.deletedCampaigns);\n\n const deleteCampaignIcon = (info: HitTriageCampaign) => {\n const icon = ui.icons.delete(async () => {\n ui.dialog('Delete campaign')\n .add(ui.divText(`Are you sure you want to delete campaign ${info.name}?`))\n .onOK(async () => {\n await this.deleteCampaign('Hit Triage', info.name);\n this.deletedCampaigns.push(info.name);\n await this.init();\n })\n .show();\n }, 'Delete campaign');\n icon.style.display = 'none';\n const authorId = info.authorUserId ?? DG.User.current().id;\n const perms = info.permissions ?? defaultPermissions;\n checkEditPermissions(authorId, perms).then((canEdit) => {\n if (canEdit)\n icon.style.display = 'inline-block';\n });\n return icon;\n };\n\n const campaignsInfo = Object.values(campaignNamesMap);\n const table = ui.table(campaignsInfo, (info) =>\n ([ui.link(info.name, () => this.setCampaign(info.name), '', ''),\n info.createDate, info.rowCount, info.filteredRowCount, info.status,\n deleteCampaignIcon(info),\n ]),\n ['Name', 'Created', 'Total', 'Selected', 'Status', '']);\n table.style.color = 'var(--grey-5)';\n return table;\n }\n\n public async setCampaign(campaignName: string) {\n const campaign = await this.checkCampaign(campaignName);\n this.app.campaign = campaign;\n }\n\n private async getNewCampaignAccordeon(template: HitTriageTemplate, campaignDetailsDiv: HTMLElement) {\n ui.setUpdateIndicator(campaignDetailsDiv, true);\n const {root, promise, cancelPromise} = await newCampaignAccordeon(template, this.dataSourceFunctionsMap);\n ui.setUpdateIndicator(campaignDetailsDiv, false);\n promise.then(async (camp) => {\n this.app.dataFrame = camp.df;\n this.app._fileInputType = camp.type;\n await this.app.setTemplate(template);\n this.app.campaignProps = camp.campaignProps;\n await this.app.saveCampaign(undefined, false);\n if (template.layoutViewState && this.app.campaign)\n this.app.campaign.layout = template.layoutViewState;\n });\n\n cancelPromise.then(() => {\n this.init();\n });\n return root;\n }\n\n private async createNewTemplate() {\n const newTemplateAccordeon = await createTemplateAccordeon(this.app, this.dataSourceFunctionsMap);\n\n const newView = new DG.ViewBase();\n const curView = grok.shell.v;\n newView.name = 'New Template';\n newView.root.appendChild(newTemplateAccordeon.root);\n newView.parentCall = this.app.parentCall;\n grok.shell.addView(newView);\n newView.path = new URL(this.app.baseUrl).pathname + '/new-template';\n newView.parentView = curView;\n const {sub} = addBreadCrumbsToRibbons(grok.shell.v, 'Hit Triage', i18n.createNewTemplate, () => {\n grok.shell.v = curView;\n newView.close();\n });\n\n newTemplateAccordeon.template.then(async (t) => {\n await this.init(t);\n newView.close();\n popRibbonPannels(newView);\n grok.shell.v = curView;\n sub.unsubscribe();\n });\n newTemplateAccordeon.cancelPromise.then(() => {\n sub.unsubscribe();\n newView.close();\n grok.shell.v = curView;\n });\n }\n};\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport {_package} from '../../package';\nimport {CampaignFieldTypes, HitTriageTemplate, IngestType} from '../types';\nimport * as C from '../consts';\nimport '../../../css/hit-triage.css';\n\ntype INewCampaignResult = {\n df: DG.DataFrame,\n type: IngestType,\n campaignProps: {[key: string]: any}\n}\n\ntype HitTriageCampaignAccordeon = {\n promise: Promise<INewCampaignResult>,\n root: HTMLElement,\n cancelPromise: Promise<void>\n}\n/** Creates a new campaign accordeon\n * @param {HitTriageTemplate}template template for the campaign. it contains file source type and\n * additional campaign fields\n * @return {HitTriageCampaignAccordeon} Object containing root element, promise for the campaign result and cancel\n */\nexport async function newCampaignAccordeon(template: HitTriageTemplate,\n dataSourceFunctionsMap: {[key: string]: DG.Func | DG.DataQuery}): Promise<HitTriageCampaignAccordeon> {\n const errorDiv = ui.divText('', {style: {color: 'red'}});\n // handling file input\n let fileDf: DG.DataFrame | null = null;\n const onFileChange = async () => {\n try {\n fileDf = dfInput.value;\n if (!fileDf)\n return;\n await fileDf.meta.detectSemanticTypes();\n const molcol = fileDf.columns.bySemType(DG.SEMTYPE.MOLECULE);\n if (!molcol) {\n errorDiv.innerText = 'No molecules column found';\n return;\n }\n\n errorDiv.innerText = '';\n } catch (e) {\n errorDiv.innerText = 'Error parsing file';\n }\n };\n\n const dfInput = ui.input.table('Dataframe', {onValueChanged: onFileChange});\n await onFileChange();\n const fileInputDiv = ui.div([dfInput, errorDiv]);\n if (Object.keys(dataSourceFunctionsMap).length === 0) {\n // functions that have special tag and are applicable for data source. they should return a dataframe with molecules\n const dataSourceFunctions = DG.Func.find({tags: [C.HitTriageDataSourceTag]});\n // for display purposes we use friendly name of the function\n dataSourceFunctions.forEach((func) => {\n dataSourceFunctionsMap[func.friendlyName ?? func.name] = func;\n });\n }\n let funcCall: DG.FuncCall | null = null;\n // each data source function can have some parameters like for example number of rows to return\n // whenever user selects a function we create a FuncCall object and get an editor for it\n const onDataFunctionChange = async () => {\n const func = dataSourceFunctionsMap[dataSourceFunctionInput.value!];\n funcCall = func.prepare();\n const editor = await funcCall.getEditor();\n editor.classList.remove('ui-form');\n funcEditorDiv.innerHTML = '';\n funcEditorDiv.appendChild(editor);\n };\n const funcEditorDiv = ui.div([]);\n const dataSourceFunctionInput = ui.input.choice(\n C.i18n.dataSourceFunction, {value: template.queryFunctionName ?? Object.keys(dataSourceFunctionsMap)[0],\n items: Object.keys(dataSourceFunctionsMap), onValueChanged: onDataFunctionChange});\n // call the onchange function to create an editor for the first function\n await onDataFunctionChange();\n if (template.queryFunctionName)\n dataSourceFunctionInput.root.getElementsByTagName('select').item(0)?.setAttribute('disabled', 'true');\n const functionInputDiv = ui.div([dataSourceFunctionInput, funcEditorDiv]);\n // if the file source is selected as 'File', no other inputs are needed so we hide the function editor\n functionInputDiv.style.display = 'none';\n const dataInputsDiv = ui.div([fileInputDiv, functionInputDiv]);\n\n // campaign properties. each template might have number of additional fields that should\n // be filled by user for the campaign. they are cast into DG.Property objects and displayed as a form\n const campaignProps = template.campaignFields\n .map((field) => field.type === DG.SEMTYPE.MOLECULE ?\n ({...field, type: 'String', semtype: DG.SEMTYPE.MOLECULE}) : field)\n .map((field) =>\n DG.Property.fromOptions(\n {name: field.name, type: CampaignFieldTypes[field.type as keyof typeof CampaignFieldTypes],\n nullable: !field.required, ...(field.semtype ? {semType: field.semtype} : {})}));\n const campaignPropsObject: {[key: string]: any} = {};\n const campaignPropsForm = campaignProps.length ? ui.input.form(campaignPropsObject, campaignProps) : ui.div();\n campaignPropsForm.classList.remove('ui-form');\n // displaying function editor or file input depending on the data source type\n if (template.dataSourceType === 'File') {\n fileInputDiv.style.display = 'inherit';\n functionInputDiv.style.display = 'none';\n } else {\n fileInputDiv.style.display = 'none';\n functionInputDiv.style.display = 'inherit';\n }\n\n const form = ui.div([\n dataInputsDiv,\n ...(campaignProps.length ? [campaignPropsForm] : [])]);\n const buttonsDiv = ui.buttonsInput([]); // div for create and cancel buttons\n form.appendChild(buttonsDiv);\n const promise = new Promise<INewCampaignResult>((resolve) => {\n const onOkProxy = async () => {\n if (template.dataSourceType === 'File') {\n if (!fileDf) {\n grok.shell.error('No file selected');\n return;\n }\n const df = fileDf;\n df.name = fileDf.name;\n resolve({df, type: 'File', campaignProps: campaignPropsObject});\n } else {\n const func = dataSourceFunctionsMap[dataSourceFunctionInput.value!];\n if (!func) {\n grok.shell.error('No function selected');\n return;\n }\n const funcCallInputs: {[key: string]: any} = {};\n Object.entries(funcCall!.inputs).forEach(([key, value]) => {\n funcCallInputs[key] = value;\n });\n const df: DG.DataFrame = await func.apply(funcCallInputs);\n resolve({df, type: 'Query', campaignProps: campaignPropsObject});\n };\n };\n const startCampaignButton = ui.bigButton(C.i18n.StartCampaign, () => onOkProxy());\n buttonsDiv.appendChild(startCampaignButton);\n });\n\n const cancelPromise = new Promise<void>((resolve) => {\n const _cancelButton = ui.button(C.i18n.cancel, () => resolve());\n //buttonsDiv.appendChild(cancelButton);\n });\n return {promise, root: form, cancelPromise};\n}\n","import * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport {HitTriageApp} from '../hit-triage-app';\nimport {_package} from '../../package';\nimport {HitTriageTemplate} from '../types';\nimport {HitBaseView} from '../base-view';\n\nexport class SubmitView extends HitBaseView<HitTriageTemplate, HitTriageApp> {\n constructor(app: HitTriageApp) {\n super(app);\n this.name = 'Submit';\n }\n\n render(): HTMLDivElement {\n ui.empty(this.root);\n\n const content = ui.divV([\n ui.h1('Summary'),\n ui.div([ui.tableFromMap(this.app.getSummary())]),\n ]);\n return content;\n }\n\n onActivated(): void {\n this.render();\n }\n\n public async submit(): Promise<any> {\n const submitParams= this.app.template?.submit;\n if (!submitParams)\n return;\n const submitFn = DG.Func.find({name: submitParams.fName, package: submitParams.package})[0];\n if (!submitFn) {\n grok.shell.error(`Function ${submitParams.fName} not found.`);\n return;\n }\n const filteredDf = DG.DataFrame.fromCsv(this.app.dataFrame!.toCsv({filteredRowsOnly: true}));\n await submitFn.apply({df: filteredDf, molecules: this.app.molColName});\n this.app.campaign && (this.app.campaign.status = 'Submitted');\n this.app.saveCampaign('Submitted');\n grok.shell.info('Submitted successfully.');\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {_package} from '../package';\nimport {AppName, ComputeFunctions, HitDesignCampaign, HitTriageCampaign} from './types';\nimport {funcTypeNames, HitTriageComputeFunctionTag} from './consts';\nimport {checkEditPermissions} from './utils';\n\nexport abstract class HitAppBase<T> {\n public dataFrame?: DG.DataFrame;\n public template?: T;\n public baseUrl!: string;\n public computeFunctions: Promise<ComputeFunctions>;\n protected isJoining = false;\n protected hasEditPermission = false;\n private _appName: AppName;\n public get appName(): AppName {return this._appName;}\n // public layouts: Promise<DG.ViewLayout[]>;\n constructor(public parentCall: DG.FuncCall, appN: AppName) {\n this._appName = appN;\n this.resetBaseUrl();\n this.computeFunctions = new Promise<ComputeFunctions>(async (resolve) => {\n const funcs = DG.Func.find({tags: [HitTriageComputeFunctionTag]});\n const functions = funcs.filter((f) => f.type === funcTypeNames.function);\n const scripts = funcs.filter((f) => f.type === funcTypeNames.script) as DG.Script[];\n const queries = funcs.filter((f) => f.type === funcTypeNames.query) as DG.DataQuery[];\n resolve({functions, scripts, queries});\n });\n\n // this.layouts = new Promise<DG.ViewLayout[]>(async (resolve) => {\n // // we need all layouts, as applicable ones might not be enaugh\n // const layouts = await grok.dapi.layouts.list();\n // resolve(layouts);\n // });\n }\n\n protected async setCanEdit(campaign: HitTriageCampaign | HitDesignCampaign) {\n if (!campaign.authorUserId || !campaign.permissions) {\n this.hasEditPermission = true; // if there is no author, then it is a new campaign\n return;\n }\n this.hasEditPermission = await checkEditPermissions(campaign.authorUserId, campaign.permissions);\n }\n\n public resetBaseUrl() {\n const href = window.location.href;\n const urlObj = new URL(href);\n this.baseUrl = urlObj.origin + urlObj.pathname;\n }\n\n protected getFilterType(colName: string): DG.FILTER_TYPE {\n const col = this.dataFrame!.col(colName);\n if (col?.semType === DG.SEMTYPE.MOLECULE)\n return DG.FILTER_TYPE.SUBSTRUCTURE;\n if (col?.type === DG.COLUMN_TYPE.BOOL)\n return DG.FILTER_TYPE.BOOL_COLUMNS;\n if (col?.type === DG.COLUMN_TYPE.STRING)\n return DG.FILTER_TYPE.CATEGORICAL;\n return DG.FILTER_TYPE.HISTOGRAM;\n }\n\n public download(df: DG.DataFrame, name: string, onlyFiltered = false): void {\n const element = document.createElement('a');\n const result = DG.DataFrame.fromColumns(df.columns.toList().filter((c) => !c.name.startsWith('~')))\n .toCsv({filteredRowsOnly: onlyFiltered});\n element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(result));\n element.setAttribute('download', name + '.csv');\n element.click();\n }\n\n public async getNewCampaignName(folderName: string, templateKey: string) {\n const templateCampaigns = (await _package.files.list(folderName))\n .map((file) => file.name)\n .filter((name) => name.startsWith(templateKey));\n if (templateCampaigns.length === 0)\n return templateKey + '-1';\n const postFixes = templateCampaigns.map((c) => c.split('-')[1]).filter(Boolean).map((c) => parseInt(c, 10)).sort();\n return templateKey + '-' + ((postFixes[postFixes.length - 1] + 1).toString());\n }\n\n public setBaseUrl() {\n const title = document.title;\n if (history.replaceState) {\n const obj = {\n Title: title,\n Url: this.baseUrl,\n };\n history.replaceState(obj, obj.Title, obj.Url);\n }\n }\n\n /// creates a union of two dataframes based on a molecule column and adds to second dataframe\n protected unionDataframes(df1: DG.DataFrame, df2: DG.DataFrame, molColName: string) {\n const df1MolCol: string[] | undefined = df1.col(molColName)?.toList()?.filter((it) => !!it)\n .map((it) => DG.chem.convert(it, DG.chem.Notation.Unknown, DG.chem.Notation.Smiles));\n const df2MolCol: string[] | undefined = df2.col(molColName)?.toList()?.filter((it) => !!it)\n .map((it) => DG.chem.convert(it, DG.chem.Notation.Unknown, DG.chem.Notation.Smiles));\n if (!df1MolCol || !df2MolCol)\n throw new Error('Molecule column not found');\n this.isJoining = true;\n try {\n // first check that all columns are there\n for (const col of df1.columns) {\n if (!df2.columns.contains(col.name))\n df2.columns.addNew(col.name, col.type);\n }\n for (let i = 0; i < df1MolCol.length; i++) {\n if (!df2MolCol.includes(df1MolCol[i])) {\n df2.rows.addNew(null, true);\n for (const col of df1.columns) {\n const value = col.get(i);\n df2.col(col.name)?.set(df2.rowCount - 1, value, false);\n }\n }\n }\n } finally {\n setTimeout(() => {\n this.isJoining = false;\n }, 500);\n }\n return df2;\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {HitTriageTemplateFunction, HitTriageTemplateScript, IComputeDialogResult} from '../types';\nimport {funcTypeNames, HitDesignMolColName, ViDColFormat} from '../consts';\nimport {joinQueryResults} from '../utils';\n\nexport async function calculateSingleCellValues(\n value: string, descriptors: string[], functions: HitTriageTemplateFunction[], scripts: HitTriageTemplateScript[] = [],\n queries: HitTriageTemplateScript[] = [],\n): Promise<DG.DataFrame> {\n const pg = DG.TaskBarProgressIndicator.create('Calculating ...');\n // TODO: this converts value to canonical one. We need to do it in a better way\n const canonicalSmiles = grok.chem.convert(value, grok.chem.Notation.Unknown, grok.chem.Notation.Smiles);\n const col = DG.Column.fromStrings(HitDesignMolColName, [canonicalSmiles]);\n const table = DG.DataFrame.fromColumns([col]);\n table.name = 'HD Single cell values';\n await table.meta.detectSemanticTypes();\n\n try {\n if (descriptors.length)\n await grok.chem.descriptors(table, col.name, descriptors);\n } catch (e) {\n console.error('Descriptors calculation error', e);\n }\n for (const func of functions) {\n try {\n const props = func.args;\n const fs = DG.Func.find({package: func.package, name: func.name});\n if (!fs.length || !fs[0]) {\n console.warn(`Function ${func.name} from package ${func.package} is not found`);\n continue;\n }\n const f = fs[0];\n const tablePropName = f.inputs[0].name;\n const colPropName = f.inputs[1].name;\n await f.apply({...props, [tablePropName]: table, [colPropName]: col.name});\n } catch (e) {\n console.error(e);\n continue;\n }\n }\n\n for (const script of scripts) {\n const props = script.args;\n try {\n const scriptFunc = DG.Func.find({name: script.name})\n .filter((s) => s.type === funcTypeNames.script && s.id === script.id)[0] as DG.Script | undefined;\n if (scriptFunc) {\n const tablePropName = scriptFunc.inputs[0].name;\n const colPropName = scriptFunc.inputs[1].name;\n\n const r: DG.DataFrame = await scriptFunc.apply({...props, [tablePropName]: table, [colPropName]: col.name});\n if (r && r.rowCount === table.rowCount && scriptFunc.language === 'python') {\n for (const c of r.columns) {\n c.name = table.columns.getUnusedName(c.name);\n table.columns.add(c);\n }\n }\n }\n } catch (e) {\n console.error(e);\n }\n }\n\n for (const query of queries) {\n const props = query.args;\n try {\n const queryFunc = DG.Func.find({name: query.name})\n .filter((s) => s.type === funcTypeNames.query && s.id === query.id)[0];\n if (queryFunc) {\n const listPropName = queryFunc.inputs[0].name;\n const valueList = [canonicalSmiles];\n const qRes = await queryFunc.apply({...props, [listPropName]: valueList});\n if (!qRes || qRes.rowCount === 0)\n continue;\n await joinQueryResults(table, HitDesignMolColName, qRes);\n }\n } catch (e) {\n console.error(e);\n }\n }\n pg.close();\n return table;\n};\n\nexport function getNewVid(vidCol: DG.Column<any>) {\n let maxId = 0;\n if (vidCol.length > 1) {\n for (const vid of vidCol.toList()) {\n if (!vid || !vid.startsWith(ViDColFormat[0]) || vid.length !== ViDColFormat.length)\n continue;\n const num = parseInt(vid.substring(1));\n if (isNaN(num))\n continue;\n maxId = Math.max(num, maxId);\n };\n }\n\n return `V${''.concat(...new Array(ViDColFormat.length - 1 - (maxId +1).toString().length).fill('0'))}${maxId + 1}`;\n}\n\nexport async function calculateColumns(resultMap: IComputeDialogResult, dataFrame: DG.DataFrame, molColName: string) {\n const pg = DG.TaskBarProgressIndicator.create('Calculating ...');\n // first step: convert all values to canonical smiles.\n const molCol = dataFrame.col(molColName);\n if (!molCol)\n throw new Error('There is no molecule column in dataframe');\n for (let i = 0; i < molCol.length; i++) {\n if (molCol.isNone(i))\n continue;\n const value: string | null = molCol.get(i);\n if (!value)\n continue;\n const newVal = grok.chem.convert(value, grok.chem.Notation.Unknown, grok.chem.Notation.Smiles);\n molCol.set(i, newVal, false);\n }\n try {\n if (resultMap.descriptors && resultMap.descriptors.length > 0)\n await grok.chem.descriptors(dataFrame!, molColName!, resultMap.descriptors);\n } catch (e) {\n console.error('Descriptors calculation error', e);\n }\n\n for (const funcName of Object.keys(resultMap.externals)) {\n try {\n const props = resultMap.externals[funcName];\n const f = DG.Func.find({package: funcName.split(':')[0], name: funcName.split(':')[1]})[0];\n const tablePropName = f.inputs[0].name;\n const colPropName = f.inputs[1].name;\n if (props)\n await f.apply({...props, [tablePropName]: dataFrame!, [colPropName]: molColName});\n } catch (e) {\n console.error(e);\n }\n };\n // handling scripts\n for (const scriptName of Object.keys(resultMap.scripts ?? {})) {\n const props = resultMap.scripts![scriptName];\n if (props) {\n const scriptParts = scriptName.split(':');\n const scriptId = scriptParts[2];\n if (!scriptId)\n continue;\n try {\n const sn = scriptParts[1]; // script name\n const s = DG.Func.find({name: sn})\n .filter((s) => s.type === funcTypeNames.script && s.id === scriptId)[0] as DG.Script | undefined;\n if (!s)\n continue;\n const tablePropName = s.inputs[0].name;\n const colPropName = s.inputs[1].name;\n const r: DG.DataFrame = await s.apply({...props, [tablePropName]: dataFrame, [colPropName]: molColName});\n if (r && r.rowCount === dataFrame.rowCount && s.language === 'python') {\n for (const c of r.columns) {\n c.name = dataFrame.columns.getUnusedName(c.name);\n dataFrame.columns.add(c);\n }\n }\n } catch (e) {\n console.error(e);\n }\n }\n };\n\n // handling queries\n for (const queryName of Object.keys(resultMap.queries ?? {})) {\n const props = resultMap.queries![queryName];\n if (props) {\n const queryParts = queryName.split(':');\n const queryId = queryParts[2];\n if (!queryId)\n continue;\n try {\n const qn = queryParts[1]; // query name\n const s = DG.Func.find({name: qn})\n .filter((s) => s.type === funcTypeNames.query && s.id === queryId)[0];\n if (!s)\n continue;\n const listPropName = s.inputs[0].name;\n const molList = dataFrame!.col(molColName!)!.toList();\n const resDf: DG.DataFrame = await s.apply({...props, [listPropName]: molList});\n if (resDf)\n await joinQueryResults(dataFrame!, molColName!, resDf);\n } catch (e) {\n console.error(e);\n }\n }\n };\n pg.close();\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {HitTriageCampaign, IFunctionArgs,\n HitTriageTemplate, HitTriageTemplateIngest, IngestType, HitTriageCampaignStatus,\n HitDesignTemplate} from './types';\nimport {InfoView} from './hit-triage-views/info-view';\nimport {SubmitView} from './hit-triage-views/submit-view';\nimport {CampaignIdKey, CampaignJsonName, CampaignTableName,\n HTQueryPrefix, HTScriptPrefix, HitSelectionColName, i18n} from './consts';\nimport {addBreadCrumbsToRibbons, checkRibbonsHaveSubmit, modifyUrl, toFormatedDateString} from './utils';\nimport {_package} from '../package';\nimport '../../css/hit-triage.css';\nimport {chemFunctionsDialog} from './dialogs/functions-dialog';\nimport {HitAppBase} from './hit-app-base';\nimport {HitBaseView} from './base-view';\nimport {saveCampaignDialog} from './dialogs/save-campaign-dialog';\nimport {calculateColumns} from './utils/calculate-single-cell';\nimport {defaultPermissions, PermissionsDialog} from './dialogs/permissions-dialog';\n\nexport class HitTriageApp extends HitAppBase<HitTriageTemplate> {\n multiView: DG.MultiView;\n\n private _infoView: InfoView;\n get infoView(): InfoView {return this._infoView;}\n private _pickView?: DG.TableView;\n private _submitView?: SubmitView;\n\n private _filterViewName = 'Hit triage | Pick';\n private _campaignFilters?: {[key: string]: any}[];\n private _campaignId?: string;\n private _dfName?: string;\n private _molColName?: string;\n public _fileInputType?: IngestType;\n\n private _campaign?: HitTriageCampaign;\n protected _filterDescriptions: string[] = [];\n public campaignProps: {[key: string]: any} = {};\n private currentPickViewId?: string;\n private _pickViewPromise?: Promise<void> | null = null;\n\n constructor(c: DG.FuncCall) {\n super(c, 'Hit Triage');\n this._infoView = new InfoView(this);\n this.multiView = new DG.MultiView({viewFactories: {[this._infoView.name]: () => this._infoView}});\n this.multiView.tabs.onTabChanged.subscribe((_) => {\n if (this.multiView.currentView instanceof HitBaseView)\n (this.multiView.currentView as HitBaseView<HitTriageTemplate, HitTriageApp>).onActivated();\n });\n this.multiView.parentCall = c;\n //grok.shell.addView(this.multiView);\n\n grok.events.onCurrentViewChanged.subscribe(() => {\n try {\n if (grok.shell.v?.name === this.currentPickViewId) {\n grok.shell.windows.showHelp = false;\n this.setBaseUrl();\n modifyUrl(CampaignIdKey, this._campaignId ?? this._campaign?.name ?? '');\n }\n } catch (e) {\n console.error(e);\n }\n });\n }\n\n public async setTemplate(template: HitTriageTemplate, presetFilters?: {[key: string]: any}[],\n campaignId?: string, ingestProps?: HitTriageTemplateIngest) {\n this._pickView?.dataFrame && grok.shell.closeTable(this._pickView?.dataFrame);\n this._pickView = undefined;\n if (!campaignId) {\n campaignId = await this.getNewCampaignName('Hit Triage/campaigns', template.key);\n modifyUrl(CampaignIdKey, campaignId);\n } else if (ingestProps) {\n this._fileInputType = ingestProps.type;\n if (ingestProps.type === 'File')\n this.dataFrame = await grok.dapi.files.readCsv(ingestProps.query);\n else\n this.dataFrame = await grok.functions.call(ingestProps.query);\n }\n if (!this.dataFrame) {\n console.error('Dataframe is empty.');\n return;\n }\n if (this._campaign?.columnSemTypes) {\n Object.entries(this._campaign.columnSemTypes).forEach(([colName, semtype]) => {\n const col = this.dataFrame!.columns.byName(colName);\n if (col && col.semType !== semtype)\n col.semType = semtype;\n });\n };\n if (this._campaign?.columnTypes) {\n Object.entries(this._campaign.columnTypes).forEach(([colName, type]) => {\n const col = this.dataFrame!.columns.byName(colName);\n if (col && col.type !== type)\n try {col.convertTo(type);} catch (e) {console.error(e);}\n });\n }\n await this.dataFrame.meta.detectSemanticTypes();\n this._molColName = this.dataFrame.columns.bySemType(DG.SEMTYPE.MOLECULE)?.name ?? undefined;\n this._dfName = this.dataFrame.name ?? ingestProps?.query;\n this.dataFrame.name = this._dfName ?? this.dataFrame.name ?? 'Molecules';\n this._campaignId = campaignId;\n this.template = this.campaign?.template ?\n {...this.campaign.template, dataSourceType: template.dataSourceType,\n queryFunctionName: template.queryFunctionName} : template;\n this._campaignFilters = presetFilters;\n\n if (!presetFilters) {\n const funcs: {[_: string]: IFunctionArgs} = {};\n const scripts: {[_: string]: IFunctionArgs} = {};\n const queries: {[_: string]: IFunctionArgs} = {};\n template.compute.functions.forEach((func) => {\n const fName = `${func.package}:${func.name}`;\n funcs[fName] = func.args;\n });\n template.compute.scripts?.forEach((script) => {\n const fName = `${HTScriptPrefix}:${script.name}:${script.id}`;\n scripts[fName] = script.args;\n });\n template.compute.queries?.forEach((query) => {\n const fName = `${HTQueryPrefix}:${query.name}:${query.id}`;\n queries[fName] = query.args;\n });\n\n await calculateColumns({\n descriptors: template.compute.descriptors.enabled ? template.compute.descriptors.args : [],\n externals: funcs, scripts, queries,\n }, this.dataFrame!, this._molColName!);\n };\n\n if (this.campaign)\n await this.setCanEdit(this.campaign);\n else\n this.hasEditPermission = true; // if the campaign is new, obviously the user can edit it\n\n const curView = grok.shell.v;\n const pickV = grok.shell.addView(this.pickView);\n this.currentPickViewId = pickV.name;\n this._submitView = new SubmitView(this);\n this.setBaseUrl();\n modifyUrl(CampaignIdKey, this._campaignId ?? this._campaign?.name ?? '');\n\n const newView = pickV;\n\n setTimeout(() => {\n this._pickViewPromise && this._pickViewPromise.then(() => {\n const {sub} = addBreadCrumbsToRibbons(newView, 'Hit Triage', 'Pick', () => {\n grok.shell.v = curView;\n newView.close();\n sub.unsubscribe();\n });\n });\n }, 300);\n // this.multiView.addView(this._submitView.name, () => this._submitView!, false);\n grok.shell.windows.showHelp = false;\n }\n\n get filterSettings(): {[key: string]: any}[] | undefined {return this._campaignFilters;}\n\n get campaignId(): string | undefined {return this._campaignId;}\n\n get pickView(): DG.TableView {return this._pickView = this.getFilterView();}\n\n get molColName() {return this._molColName ??= this.dataFrame?.columns.bySemType(DG.SEMTYPE.MOLECULE)?.name;}\n\n get fileInputType(): IngestType | undefined {return this._fileInputType;}\n\n get campaign(): HitTriageCampaign | undefined {return this._campaign;}\n\n set campaign(campaign: HitTriageCampaign | undefined) {this._campaign = campaign;}\n\n /**\n * A view that lets you filter the molecules using either molecules, or\n * their properties derived at the enrichment step.\n * @return {DG.TableView}\n * */\n getFilterView(): DG.TableView {\n let resolvePromise: Function | null = null;\n this._pickViewPromise = new Promise<void>((res) => {resolvePromise = res;});\n const getComputeDialog = async () => {\n chemFunctionsDialog(this, async (resultMap) => {\n const oldDescriptors = this.template!.compute.descriptors.args;\n const oldFunctions = this.template!.compute.functions;\n const oldScripts = this.template!.compute.scripts ?? [];\n const oldQueries = this.template!.compute.queries ?? [];\n const newDescriptors = resultMap.descriptors;\n const newComputeObj = {\n descriptors: {\n enabled: !!resultMap?.descriptors?.length,\n args: resultMap?.descriptors ?? [],\n },\n functions: Object.entries(resultMap?.externals ?? {}).map(([funcName, args]) => {\n const splitFunc = funcName.split(':');\n return ({\n name: splitFunc[1],\n package: splitFunc[0],\n args: args,\n });\n }),\n scripts: Object.entries(resultMap?.scripts ?? {})\n .filter(([name, _]) => name.startsWith(HTScriptPrefix) && name.split(':').length === 3)\n .map(([scriptId, args]) => {\n const scriptNameParts = scriptId.split(':');\n return ({\n name: scriptNameParts[1] ?? '',\n id: scriptNameParts[2] ?? '',\n args: args,\n });\n }),\n queries: Object.entries(resultMap?.queries ?? {})\n .filter(([name, _]) => name.startsWith(HTQueryPrefix) && name.split(':').length === 3)\n .map(([scriptId, args]) => {\n const scriptNameParts = scriptId.split(':');\n return ({\n name: scriptNameParts[1] ?? '',\n id: scriptNameParts[2] ?? '',\n args: args,\n });\n }),\n };\n this.template!.compute = newComputeObj;\n const uncalculatedDescriptors = newDescriptors.filter((d) => !oldDescriptors.includes(d));\n const uncalculatedFunctions = newComputeObj.functions.filter((func) => {\n if (!oldFunctions.some((f) => f.name === func.name && f.package === func.package))\n return true;\n const oldFunc = oldFunctions.find((f) => f.name === func.name && f.package === func.package)!;\n return !Object.entries(func.args).every(([key, value]) => oldFunc.args[key] === value);\n });\n const uncalculatedScripts = newComputeObj.scripts.filter((func) => {\n if (!oldScripts.some((f) => f.id === func.id ))\n return true;\n const oldScript = oldScripts.find((f) => f.id === func.id)!;\n return !Object.entries(func.args).every(([key, value]) => oldScript.args[key] === value);\n });\n const uncalculatedQueries = newComputeObj.queries.filter((query) => {\n if (!oldQueries.some((f) => f.id === query.id))\n return true;\n const oldQuery = oldQueries.find((f) => f.id === query.id)!;\n return !Object.entries(query.args).every(([key, value]) => oldQuery.args[key] === value);\n });\n\n const externalFuncs: {[_: string]: IFunctionArgs} = {};\n uncalculatedFunctions.forEach((func) => {\n const fName = `${func.package}:${func.name}`;\n externalFuncs[fName] = func.args;\n });\n const externalScripts: {[_: string]: IFunctionArgs} = {};\n uncalculatedScripts.forEach((script) => {\n const fName = `${HTScriptPrefix}:${script.name}:${script.id}`;\n externalScripts[fName] = script.args;\n });\n const externalQueries: {[_: string]: IFunctionArgs} = {};\n uncalculatedQueries.forEach((query) => {\n const fName = `${HTQueryPrefix}:${query.name}:${query.id}`;\n externalQueries[fName] = query.args;\n });\n await calculateColumns(\n {descriptors: uncalculatedDescriptors, externals: externalFuncs,\n scripts: externalScripts, queries: externalQueries},\n this.dataFrame!, this._molColName!);\n this.saveCampaign('In Progress', false);\n }, () => null, this.template!, true);\n };\n if (!this.dataFrame!.col(HitSelectionColName))\n this.dataFrame!.columns.addNewBool(HitSelectionColName).init(false);\n\n const view = DG.TableView.create(this.dataFrame!, false);\n const ribbons = view.getRibbonPanels();\n const calculateRibbon = ui.iconFA('wrench', getComputeDialog, 'Calculate additional properties');\n const submitButton = ui.bigButton('Submit', () => {\n const dialogContent = this._submitView?.render();\n if (dialogContent) {\n const dlg = ui.dialog('Submit');\n dlg.add(dialogContent);\n dlg.addButton('Save', ()=>{this.saveCampaign(); dlg.close();});\n dlg.addButton('Submit', ()=>{this._submitView?.submit(); dlg.close();});\n dlg.show();\n }\n });\n const permissionsButton = ui.iconFA('share', async () => {\n await (new PermissionsDialog(this.campaign?.permissions)).show((res) => {\n this.campaign!.permissions = res;\n this.saveCampaign(undefined, true);\n });\n }, 'Edit permissions');\n submitButton.classList.add('hit-design-submit-button');\n const hasSubmit = checkRibbonsHaveSubmit(ribbons);\n ribbons.push([\n calculateRibbon,\n ...(this.hasEditPermission ? [permissionsButton] : []),\n ...(hasSubmit ? [] : [submitButton])]);\n view.setRibbonPanels(ribbons);\n view.name = this._filterViewName;\n setTimeout(async () => {\n view._onAdded();\n await new Promise((r) => setTimeout(r, 1000));\n\n const f = view.filters(this._campaignFilters ? {filters: this._campaignFilters} : undefined);\n const layoutViewState = this._campaign?.layout ?? this.template?.layoutViewState;\n if (layoutViewState) {\n try {\n const layout = DG.ViewLayout.fromViewState(layoutViewState);\n view.loadLayout(layout);\n } catch (e) {\n console.error(e);\n }\n }\n view.dataFrame.onFilterChanged\n .subscribe((_) => {\n this._filterDescriptions = Array.from(view.dataFrame.rows.filters);\n this._campaignFilters = f.getOptions().look.filters;\n });\n setTimeout(() => {\n this._filterDescriptions = Array.from(view.dataFrame.rows.filters);\n this._campaignFilters = f.getOptions().look.filters;\n }, 300);\n resolvePromise && resolvePromise();\n }, 300);\n view.parentCall = this.parentCall;\n return view;\n }\n\n getSummary(): {[_: string]: any} {\n const campaignProps = this.campaign?.campaignFields ?? this.campaignProps;\n return {\n 'Template': this.template?.name ?? 'Molecules',\n 'File path': ui.divH([ui.link(this._dfName ?? '-', () => this.download(this.dataFrame!, 'molecules'),\n i18n.download)],\n {style: {alignItems: 'center'}}),\n ...campaignProps,\n 'Number of molecules': this.dataFrame!.rowCount.toString(),\n 'Enrichment methods': [this.template!.compute.descriptors.enabled ? 'descriptors' : '',\n ...this.template!.compute.functions.map((func) => func.name)].filter((f) => f && f.trim() !== '').join(', '),\n 'Filters': this._filterDescriptions.join(', '),\n 'Result Molecules': ui.divH([ui.link(this.dataFrame?.filter.trueCount.toString() ?? '0', () => {\n this.download(this.dataFrame!, 'hits', true);\n }, i18n.download)], {style: {alignItems: 'center'}}),\n };\n }\n\n async saveCampaign(status?: HitTriageCampaignStatus, notify = true): Promise<any> {\n const campaignId = this.campaignId!;\n const filters = this.filterSettings!;\n const templateName = this.template!.name;\n const enrichedDf = this.dataFrame!;\n const campaignPrefix = `System:AppData/HitTriage/Hit Triage/campaigns/${campaignId}/`;\n const campaignName = campaignId ?? await saveCampaignDialog(campaignId);\n const columnSemTypes: {[_: string]: string} = {};\n enrichedDf.columns.toList().forEach((col) => columnSemTypes[col.name] = col.semType);\n\n const colTypeMap: {[_: string]: string} = {};\n enrichedDf.columns.toList().forEach((col) => colTypeMap[col.name] = col.type);\n\n // if its first time save author as current user, else keep the same\n const authorUserId = this.campaign?.authorUserId ?? grok.shell.user.id;\n const permissions = this.campaign?.permissions ?? defaultPermissions;\n\n\n const campaign: HitTriageCampaign = {\n name: campaignName,\n templateName,\n filters: filters ?? {},\n ingest: {\n type: 'File',\n query: `${campaignPrefix}${CampaignTableName}`,\n molColName: this.molColName!,\n },\n status: status ?? this.campaign?.status ?? 'In Progress',\n createDate: this.campaign?.createDate ?? toFormatedDateString(new Date()),\n campaignFields: this.campaign?.campaignFields ?? this.campaignProps,\n columnSemTypes,\n rowCount: enrichedDf.rowCount,\n filteredRowCount: enrichedDf.filter.trueCount,\n template: this.template as HitDesignTemplate | undefined,\n columnTypes: colTypeMap,\n authorUserId,\n permissions,\n };\n\n this.campaign = campaign;\n if (!this.hasEditPermission) {\n grok.shell.error('You do not have permission to modify this campaign');\n return campaign;\n }\n const csvDf = DG.DataFrame.fromColumns(\n enrichedDf.columns.toList().filter((col) => !col.name.startsWith('~')),\n ).toCsv();\n await _package.files.writeAsText(`Hit Triage/campaigns/${campaignId}/${CampaignTableName}`, csvDf);\n const newLayout = this._pickView!.saveLayout();\n if (!newLayout)\n grok.shell.warning('Layout cound not be saved');\n else\n campaign.layout = newLayout.viewState;\n await _package.files.writeAsText(`Hit Triage/campaigns/${campaignId}/${CampaignJsonName}`,\n JSON.stringify(campaign));\n notify && grok.shell.info('Campaign saved successfully.');\n return campaign;\n }\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport {_package} from '../../package';\n\nexport async function saveCampaignDialog(id: string): Promise<string> {\n return new Promise<string>(async (resolve) => {\n const campaignNameInput = ui.input.string('Campaign name', {value: ''});\n\n function onOkProxy() {\n if (!campaignNameInput.value || campaignNameInput.value === '')\n resolve(id);\n else\n resolve(campaignNameInput.value);\n }\n ui.dialog('Save Campaign')\n .add(ui.div(campaignNameInput.root))\n .onOK(onOkProxy)\n .show();\n });\n}\n","/* eslint-disable max-len */\nimport * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport {CampaignFieldTypes, HitDesignTemplate} from '../types';\nimport {HitDesignMolColName, PeptiHitHelmColName, TileCategoriesColName, ViDColName, i18n} from '../consts';\nimport '../../../css/hit-triage.css';\nimport {getNewVid} from '../utils/calculate-single-cell';\n\ntype NewHitDesignCampaignRes = {\n df: DG.DataFrame,\n campaignProps: {[key: string]: any}\n}\n\ntype HitDesignCampaignAccordeon = {\n promise: Promise<NewHitDesignCampaignRes>,\n root: HTMLElement,\n cancelPromise: Promise<void>\n}\n\nexport function newHitDesignCampaignAccordeon(template: HitDesignTemplate, peptiHit = false): HitDesignCampaignAccordeon {\n const df = DG.DataFrame.create(1);\n if (peptiHit) {\n const pepCol = df.columns.addNew(PeptiHitHelmColName, DG.TYPE.STRING);\n pepCol.semType = DG.SEMTYPE.MACROMOLECULE;\n pepCol.meta.units = 'helm';\n pepCol.setTag('units', 'helm');\n pepCol.setTag('cell.renderer', 'helm');\n pepCol.setTag('.alphabetIsMultichar', 'true');\n }\n\n const molCol = df.columns.addNew(HitDesignMolColName, DG.TYPE.STRING);\n molCol.semType = DG.SEMTYPE.MOLECULE;\n molCol.meta.units = DG.UNITS.Molecule.SMILES;\n molCol.set(0, null);\n if (template?.stages?.length > 0) {\n const tileCategoryCol = df.columns.addNew(TileCategoriesColName, DG.TYPE.STRING);\n tileCategoryCol.set(0, template.stages[0]);\n }\n const vIdCol = df.columns.addNew(ViDColName, DG.TYPE.STRING);\n vIdCol.set(0, getNewVid(vIdCol));\n\n // campaign properties. each template might have number of additional fields that should\n // be filled by user for the campaign. they are cast into DG.Property objects and displayed as a form\n const campaignProps = template.campaignFields\n .map((field) => field.type === DG.SEMTYPE.MOLECULE ?\n ({...field, type: 'String', semtype: DG.SEMTYPE.MOLECULE}) : field)\n .map((field) =>\n DG.Property.fromOptions(\n {name: field.name, type: CampaignFieldTypes[field.type as keyof typeof CampaignFieldTypes],\n nullable: !field.required, ...(field.semtype ? {semType: field.semtype} : {})}));\n const campaignPropsObject: {[key: string]: any} = {};\n const campaignPropsForm = ui.input.form(campaignPropsObject, campaignProps);\n campaignPropsForm.classList.remove('ui-form');\n const form = ui.div([\n ...(template.campaignFields?.length > 0 ? []: []),\n campaignPropsForm,\n ]);\n const buttonsDiv = ui.buttonsInput([]); // div for create and cancel buttons\n form.appendChild(buttonsDiv);\n const okPromise = new Promise<NewHitDesignCampaignRes>((resolve) => {\n const startCampaignButton = ui.bigButton(i18n.StartCampaign,\n () => {\n for (const field of template.campaignFields) {\n if (field.required) {\n if (!campaignPropsObject[field.name] || campaignPropsObject[field.name] === '') {\n grok.shell.error(`Field '${field.name}' is required`);\n return;\n }\n }\n }\n resolve({df, campaignProps: campaignPropsObject});\n });\n buttonsDiv.appendChild(startCampaignButton);\n });\n const cancelPromise = new Promise<void>((resolve) => {\n const _cancelButton = ui.button(i18n.cancel, () => resolve());\n //buttonsDiv.appendChild(cancelButton);\n });\n\n return {promise: okPromise, root: form, cancelPromise};\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport {_package} from '../../package';\nimport * as C from '../consts';\nimport '../../../css/hit-triage.css';\nimport {IComputeDialogResult, INewTemplateResult, PeptiHitTemplate} from '../types';\nimport {chemFunctionsDialog} from '../dialogs/functions-dialog';\nimport {getCampaignFieldEditors} from './new-template-accordeon';\nimport {ItemType, ItemsGrid} from '@datagrok-libraries/utils/src/items-grid';\nimport {HitAppBase} from '../hit-app-base';\nimport {getLayoutInput} from './layout-input';\n\nexport async function newHitDesignTemplateAccordeon(app: HitAppBase<any>,\n preset?: PeptiHitTemplate): Promise<INewTemplateResult<PeptiHitTemplate>> {\n const availableTemplates = (await _package.files.list(`${app.appName}/templates`));\n let hasNameError = false;\n let hasKeyError = false;\n // Remove .json from end\n const availableTemplateNames = availableTemplates.map((file) => file.name.slice(0, -5));\n const availableTemplateKeys: string[] = [];\n\n for (const file of availableTemplates) {\n try {\n const t: PeptiHitTemplate = JSON.parse(await _package.files.readAsText(file));\n availableTemplateKeys.push(t.key);\n } catch (e) {\n console.error(e);\n }\n }\n const availableSubmitFunctions = DG.Func.find({tags: [C.HitTriageSubmitTag]});\n const submitFunctionsMap: {[key: string]: DG.Func} = {};\n availableSubmitFunctions.forEach((func) => {\n submitFunctionsMap[func.friendlyName ?? func.name] = func;\n });\n const submitFunctionInput = ui.input.choice('Submit function',\n {value: null, items: [null, ...Object.keys(submitFunctionsMap)]});\n submitFunctionInput.nullable = true;\n submitFunctionInput.value = preset?.submit?.fName ?? null;\n submitFunctionInput.setTooltip('Select function to be called upon submitting');\n const errorDiv = ui.divText('Template name is empty or already exists', {classes: 'hit-triage-error-div'});\n const keyErrorDiv = ui.divText('Template key is empty or already exists', {classes: 'hit-triage-error-div'});\n const layoutInput = getLayoutInput();\n // ######### TEMPLATE NAME INPUT #########\n function onTemplateNameChanged() {\n if (templateNameInput.value === '' || availableTemplateNames.includes(templateNameInput.value?.trim() ?? '')) {\n //templateNameInput.root.style.borderBottom = '1px solid red';\n const marginLeft = templateNameInput.input.offsetLeft ?? 0;\n const width = templateNameInput.input.offsetWidth ?? 0;\n errorDiv.style.marginLeft = `${marginLeft}px`;\n errorDiv.style.width = `${width}px`;\n errorDiv.style.opacity = '100%';\n errorDiv.style.borderTop = '1px solid red';\n hasNameError = true;\n } else {\n //templateNameInput.root.style.borderBottom = 'none';\n errorDiv.style.borderTop = 'none';\n errorDiv.style.opacity = '0%';\n hasNameError = false;\n }\n }\n const templateNameInput = ui.input.string('Name', {value: preset?.name ?? '', onValueChanged: onTemplateNameChanged});\n\n // ######### TEMPLATE KEY INPUT #########\n function onTemplateKeyChange() {\n if (templateKeyInput.value === '' || availableTemplateKeys.includes(templateKeyInput.value?.trim() ?? '')) {\n //templateKeyInput.root.style.borderBottom = '1px solid red';\n const marginLeft = templateKeyInput.input.offsetLeft ?? 0;\n const width = templateKeyInput.input.offsetWidth ?? 0;\n keyErrorDiv.style.marginLeft = `${marginLeft}px`;\n keyErrorDiv.style.width = `${width}px`;\n keyErrorDiv.style.borderTop = '1px solid red';\n keyErrorDiv.style.opacity = '100%';\n hasKeyError = true;\n } else {\n //templateKeyInput.root.style.borderBottom = 'none';\n keyErrorDiv.style.opacity = '0%';\n keyErrorDiv.style.borderTop = 'none';\n hasKeyError = false;\n }\n }\n\n const templateKeyInput = ui.input.string('Key', {value: preset?.key ?? '', onValueChanged: onTemplateKeyChange});\n templateKeyInput.setTooltip('Template key used for campaign prefix');\n templateNameInput.setTooltip('Template name');\n templateNameInput.root.style.borderBottom = 'none';\n templateKeyInput.root.style.borderBottom = 'none';\n errorDiv.style.opacity = '0%';\n keyErrorDiv.style.opacity = '0%';\n\n let funcDialogRes: IComputeDialogResult | null = null;\n // used just for functions editor\n const dummyTemplate = {\n compute: {\n descriptors: {\n enabled: true,\n args: preset?.compute?.descriptors?.args ?? [],\n },\n functions: preset?.compute?.functions ?? [],\n },\n } as unknown as PeptiHitTemplate;\n const funcInput = await chemFunctionsDialog(app, (res) => {funcDialogRes = res;}, () => null,\n dummyTemplate, false);\n funcInput.root.classList.add('hit-triage-new-template-functions-input');\n const fieldsEditor = getCampaignFieldEditors(preset?.campaignFields);\n const tileCategoriesEditor = getTileCategoryEditor(preset?.stages);\n const detailsDiv = ui.divV(\n [ui.divV([templateNameInput, errorDiv]), ui.divV([templateKeyInput, keyErrorDiv]),\n layoutInput.dataFileInput,\n fieldsEditor.fieldsDiv]);\n\n const stagesHeader = ui.h2('Stages');\n ui.tooltip.bind(stagesHeader,\n 'Define Stages for designed molecules. For example, \"Design\", \"Synthesis\", \"Test\", etc.');\n const computeHeader = ui.h2('Compute');\n ui.tooltip.bind(computeHeader,\n 'Define functions to be calculated for each molecule. For example, \"Descriptors\", \"Descriptors:Descriptors\", etc.');\n const form = ui.div(\n [ui.h2('Details'),\n detailsDiv,\n stagesHeader,\n tileCategoriesEditor.fieldsDiv,\n computeHeader,\n funcInput.root,\n ui.h2('Submit'),\n submitFunctionInput.root,\n ], 'ui-form');\n const buttonsDiv = ui.buttonsInput([]);\n form.appendChild(buttonsDiv);\n const buttonsContainerDiv = buttonsDiv.getElementsByClassName('ui-input-editor')?.[0] ?? buttonsDiv;\n const cancelPromise = new Promise<void>((resolve) => {\n const cancelButton = ui.button(C.i18n.cancel, () => resolve());\n buttonsContainerDiv.appendChild(cancelButton);\n });\n const promise = new Promise<PeptiHitTemplate>((resolve) => {\n async function onOkProxy() {\n onTemplateNameChanged();\n onTemplateKeyChange();\n funcInput.okProxy();\n if (hasNameError || !templateNameInput.value || templateNameInput.value === '') {\n grok.shell.error('Template name is empty or already exists');\n return;\n }\n if (hasKeyError || !templateKeyInput.value || templateKeyInput.value === '') {\n grok.shell.error('Template key is empty or already exists');\n return;\n }\n\n const submitFunction = submitFunctionInput.value ? submitFunctionsMap[submitFunctionInput.value] : undefined;\n const out: PeptiHitTemplate = {\n name: templateNameInput.value,\n key: templateKeyInput.value,\n campaignFields: fieldsEditor.getFields(),\n stages: tileCategoriesEditor.getFields(),\n layoutViewState: layoutInput.getLayoutViewState() ?? undefined,\n compute: {\n descriptors: {\n enabled: !!funcDialogRes?.descriptors?.length,\n args: funcDialogRes?.descriptors ?? [],\n },\n functions: Object.entries(funcDialogRes?.externals ?? {}).map(([funcName, args]) => {\n const splitFunc = funcName.split(':');\n return ({\n name: splitFunc[1],\n package: splitFunc[0],\n args: args,\n });\n }),\n scripts: Object.entries(funcDialogRes?.scripts ?? {})\n .filter(([name, _]) => name.startsWith(C.HTScriptPrefix) && name.split(':').length === 3)\n .map(([scriptId, args]) => {\n const scriptNameParts = scriptId.split(':');\n return ({\n name: scriptNameParts[1] ?? '',\n id: scriptNameParts[2] ?? '',\n args: args,\n });\n }),\n queries: Object.entries(funcDialogRes?.queries ?? {})\n .filter(([name, _]) => name.startsWith(C.HTQueryPrefix) && name.split(':').length === 3)\n .map(([queryName, args]) => {\n const queryNameParts = queryName.split(':');\n return ({\n name: queryNameParts[1] ?? '',\n id: queryNameParts[2] ?? '',\n args: args,\n });\n }),\n },\n ...(submitFunction ? {submit: {fName: submitFunction.name, package: submitFunction.package.name}} : {}),\n };\n saveHitDesignTemplate(out, app.appName);\n grok.shell.info('Template created successfully');\n resolve(out);\n }\n const createTemplateButton = ui.bigButton(C.i18n.createTemplate, () => onOkProxy());\n buttonsContainerDiv.appendChild(createTemplateButton);\n });\n\n return {root: form, template: promise, cancelPromise};\n}\n\nfunction saveHitDesignTemplate(template: PeptiHitTemplate, appName: string) {\n _package.files.writeAsText(`${appName}/templates/${template.name}.json`, JSON.stringify(template));\n}\n\n\nexport function getTileCategoryEditor(preset?: string[]) {\n const props = [DG.Property.fromOptions({name: 'Name', type: DG.TYPE.STRING})];\n const itemsGrid = new ItemsGrid(props,\n preset ? preset.map((i) => ({Name: i})) : undefined, {horizontalInputNames: true});\n let addingItem: ItemType = {};\n function getFieldParams(): string[] {\n const items = itemsGrid.items.filter((f) => f.Name).map((f) => f.Name);\n if (addingItem.Name && addingItem.Name !== '')\n items.push(addingItem.Name);\n return items;\n }\n itemsGrid.onItemAdded.subscribe((_) => {\n addingItem = {};\n });\n itemsGrid.onAddingItemChanged.subscribe((item) => {\n if (item)\n addingItem = item.item;\n });\n\n return {\n getFields: getFieldParams,\n fieldsDiv: itemsGrid.root,\n itemsGrid,\n };\n}\n","/* eslint-disable max-len */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {u2} from '@datagrok-libraries/utils/src/u2';\nimport {HitDesignApp} from '../hit-design-app';\nimport {_package} from '../../package';\nimport $ from 'cash-dom';\nimport {CampaignGroupingType, CampaignJsonName, HitDesignCampaignIdKey, i18n} from '../consts';\nimport {HitDesignCampaign, HitDesignTemplate} from '../types';\nimport {addBreadCrumbsToRibbons, checkEditPermissions,\n checkViewPermissions, getGroupedCampaigns, getSavedCampaignsGrouping,\n loadCampaigns, modifyUrl, popRibbonPannels,\n processGroupingTable,\n setSavedCampaignsGrouping} from '../utils';\nimport {newHitDesignCampaignAccordeon} from '../accordeons/new-hit-design-campaign-accordeon';\nimport {newHitDesignTemplateAccordeon} from '../accordeons/new-hit-design-template-accordeon';\nimport {HitBaseView} from '../base-view';\nimport {defaultPermissions, PermissionsDialog} from '../dialogs/permissions-dialog';\n\nexport class HitDesignInfoView\n <T extends HitDesignTemplate = HitDesignTemplate, K extends HitDesignApp = HitDesignApp>\n extends HitBaseView<T, K> {\n currentSorting: string = 'None';\n constructor(app: K) {\n super(app);\n this.name = 'Hit Design';\n grok.shell.windows.showHelp = true;\n grok.shell.windows.help.showHelp(_package.webRoot + 'README_HD.md'); // TODO: Separate readme for Hit Design\n this.checkCampaign().then((c) => {this.app.campaign = c; this.init();});\n }\n\n onActivated(): void {\n grok.shell.windows.showHelp = true;\n grok.shell.windows.help.showHelp(_package.webRoot + 'README_HD.md');\n }\n\n getAppHeader() {\n return u2.appHeader({\n iconPath: _package.webRoot + '/images/icons/hit-design-icon.png',\n learnMoreUrl: 'https://github.com/datagrok-ai/public/blob/master/packages/HitTriage/README_HD.md',\n description:\n '- Configure your own workflow using the template editor\\n' +\n '- Sketch molecules in the molecular spreadsheet\\n' +\n '- Annotate and share ideas with the team\\n' +\n '- Calculate different molecular properties\\n' +\n '- Save campaigns and continue from where you left off\\n' +\n '- Submit final selection to the function of your choice',\n });\n }\n\n async init(presetTemplate?: T) {\n ui.setUpdateIndicator(this.root, true);\n try {\n const continueCampaignsHeader = ui.h1(i18n.continueCampaigns);\n\n const createNewCampaignHeader = ui.h1(i18n.createNewCampaignHeader, {style: {marginLeft: '10px'}});\n const appHeader = this.getAppHeader();\n\n const campaignAccordionDiv = ui.div();\n const templatesDiv = ui.divH([]);\n const contentDiv = ui.div([templatesDiv, campaignAccordionDiv], 'ui-form');\n\n const campaignsTable = await this.getCampaignsTable();\n const tableRoot = ui.div([campaignsTable], {style: {position: 'relative'}});\n\n const sortIcon = ui.iconFA('sort', () => {\n const menu = DG.Menu.popup();\n Object.values(CampaignGroupingType).forEach((i) => {\n menu.item(i, async () => {\n setSavedCampaignsGrouping(i as CampaignGroupingType);\n ui.setUpdateIndicator(tableRoot, true);\n try {\n const t = await this.getCampaignsTable();\n ui.setUpdateIndicator(tableRoot, false);\n ui.empty(tableRoot);\n tableRoot.appendChild(t);\n } catch (e) {\n grok.shell.error('Failed to update campaigns table');\n console.error(e);\n } finally {\n ui.setUpdateIndicator(tableRoot, false);\n }\n });\n menu.show({element: sortingHeader, x: 100, y: sortingHeader.offsetTop + 30});\n });\n });\n sortIcon.style.marginBottom = '12px';\n sortIcon.style.marginLeft = '5px';\n sortIcon.style.fontSize = '15px';\n ui.tooltip.bind(sortIcon, () => `Group Campaigns. Current: ${this.currentSorting}`);\n const sortingHeader = ui.divH([continueCampaignsHeader, sortIcon], {style: {alignItems: 'center'}});\n $(this.root).empty();\n this.root.appendChild(ui.div([\n ui.divV([appHeader, sortingHeader], {style: {marginLeft: '10px'}}),\n tableRoot,\n createNewCampaignHeader,\n contentDiv,\n ]));\n await this.startNewCampaign(campaignAccordionDiv, templatesDiv, presetTemplate);\n this.app.resetBaseUrl();\n } finally {\n ui.setUpdateIndicator(this.root, false);\n }\n }\n\n protected async startNewCampaign(\n containerDiv: HTMLElement, templateInputDiv: HTMLElement, presetTemplate?: T,\n ) {\n const templates = (await _package.files.list(`${this.app.appName}/templates`))\n .filter((file) => file.name.endsWith('.json'))\n .map((file) => file.name.slice(0, -5));\n // if the template is just created and saved, it may not be in the list of templates\n if (presetTemplate && !templates.includes(presetTemplate.name))\n templates.push(presetTemplate.name);\n\n let selectedTemplate: T | null = null;\n let templateChangeFlag = true;\n const onTemmplateChange = async () => {\n if (!templateChangeFlag)\n return;\n const templateName = templatesInput.value;\n const template: T = presetTemplate && presetTemplate.name === templateName ? presetTemplate :\n JSON.parse(await _package.files.readAsText(`${this.app.appName}/templates/${templateName}.json`));\n selectedTemplate = template;\n const newCampaignAccordeon = await this.getNewCampaignAccordeon(template);\n $(containerDiv).empty();\n containerDiv.appendChild(newCampaignAccordeon);\n };\n\n const templatesInput = ui.input.choice('Template', {value: presetTemplate?.name ?? templates[0], items: templates,\n onValueChanged: async () => {\n await onTemmplateChange();\n }});\n templatesInput.root.style.width = '100%';\n const createNewtemplateButton = ui.icons.add(() => {\n this.createNewTemplate();\n }, i18n.createNewTemplate);\n\n const cloneTemplateButton = ui.icons.copy(() => {\n if (selectedTemplate)\n this.createNewTemplate(selectedTemplate);\n }, 'Clone template');\n\n const deleteTempleteButton = ui.icons.delete(() => {\n if (!templatesInput.value || templatesInput.items.length < 2)\n return;\n ui.dialog('Delete template')\n .add(ui.divText(`Are you sure you want to delete template ${templatesInput.value}?`))\n .onOK(async () => {\n try {\n const prevValue = templatesInput.value;\n await _package.files.delete(`${this.app.appName}/templates/${prevValue}.json`);\n templateChangeFlag = false;\n templatesInput.items = templatesInput.items.filter((item) => item !== prevValue);\n templatesInput.value = templatesInput.items[0];\n templateChangeFlag = true;\n await onTemmplateChange();\n grok.shell.info('Template ' + prevValue + ' was deleted successfully');\n } catch (e) {\n templateChangeFlag = true;\n grok.shell.error('Failed to delete template ' + templatesInput.value);\n console.error(e);\n }\n })\n .show();\n }, 'Delete template');\n createNewtemplateButton.style.color = '#2083d5';\n templatesInput.addOptions(deleteTempleteButton);\n templatesInput.addOptions(cloneTemplateButton);\n templatesInput.addOptions(createNewtemplateButton);\n await onTemmplateChange();\n $(templateInputDiv).empty();\n templateInputDiv.appendChild(templatesInput.root);\n }\n\n\n protected async checkCampaign(campId?: string) {\n const url = location.search;\n const urlParams = new URLSearchParams(url);\n if (!urlParams.has(HitDesignCampaignIdKey) && !campId)\n return;\n const campaignId = campId ?? urlParams.get(HitDesignCampaignIdKey);\n // check if such campaign exists\n if (!await _package.files.exists(`${this.app.appName}/campaigns/${campaignId}/${CampaignJsonName}`))\n return;\n const campaign: HitDesignCampaign =\n JSON.parse(await _package.files.readAsText(`${this.app.appName}/campaigns/${campaignId}/${CampaignJsonName}`));\n if (campaign) {\n // in case if the link was opened and user has no permissions to view the campaign\n if (campaign.authorUserId && campaign.permissions &&\n !await checkViewPermissions(campaign.authorUserId, campaign.permissions)\n ) {\n this.app.setBaseUrl();\n return;\n }\n this.app.campaign = campaign;\n }\n // Load the template and modify it\n const template: T = campaign.template ?? JSON.parse(\n await _package.files.readAsText(`${this.app.appName}/templates/${campaign.templateName}.json`),\n );\n // modify the template with path to the campaign's precalculated table\n await this.app.setTemplate(template, campaignId!);\n\n if (campId)\n modifyUrl(HitDesignCampaignIdKey, campId);\n\n campaign.template = template;\n return campaign;\n }\n\n private async getCampaignsTable() {\n const campaignNamesMap = await loadCampaigns(this.app.appName, this.deletedCampaigns);\n const grouppingMode = getSavedCampaignsGrouping();\n const grouppedCampaigns = getGroupedCampaigns<HitDesignCampaign>(Object.values(campaignNamesMap), grouppingMode);\n this.currentSorting = grouppingMode;\n this.app.existingStatuses = Array.from(new Set(Object.values(campaignNamesMap).map((c) => c.status).filter((s) => !!s)));\n const deleteAndShareCampaignIcons = (info: HitDesignCampaign) => {\n const deleteIcon = ui.icons.delete(async () => {\n ui.dialog('Delete campaign')\n .add(ui.divText(`Are you sure you want to delete campaign ${info.name}?`))\n .onOK(async () => {\n await this.deleteCampaign(this.app.appName, info.name);\n this.deletedCampaigns.push(info.name);\n await this.init();\n })\n .show();\n }, 'Delete campaign');\n const shareIcon = ui.iconFA('share', async () => {\n await (new PermissionsDialog(info.permissions)).show(async (res) => {\n try {\n info.permissions = res;\n info.authorUserId ??= grok.shell.user.id;\n await _package.files.writeAsText(\n `${this.app.appName}/campaigns/${info.name}/${CampaignJsonName}`, JSON.stringify(info));\n grok.shell.info('Permissions updated for campaign ' + info.name);\n } catch (e) {\n grok.shell.error('Failed to update permissions for campaign ' + info.name);\n console.error(e);\n }\n });\n }, 'Manage campaign permissions');\n deleteIcon.style.display = 'none';\n shareIcon.style.display = 'none';\n const authorId = info.authorUserId ?? DG.User.current().id;\n const perms = info.permissions ?? defaultPermissions;\n checkEditPermissions(authorId, perms).then((canEdit) => {\n if (canEdit) {\n deleteIcon.style.display = 'inline-block';\n shareIcon.style.display = 'inline-block';\n }\n });\n return [shareIcon, deleteIcon];\n };\n const table = ui.table(Object.values(campaignNamesMap), (info) =>\n ([ui.link(info.name, () => this.setCampaign(info.name), '', ''),\n info.createDate,\n info.rowCount,\n info.status,\n ...(deleteAndShareCampaignIcons(info)),\n ]),\n ['Name', 'Created', 'Molecules', 'Status', '']);\n table.style.color = 'var(--grey-5)';\n table.style.marginLeft = '24px';\n processGroupingTable(table, grouppedCampaigns);\n return table;\n }\n\n public async setCampaign(campaignName: string) {\n const campaign = await this.checkCampaign(campaignName);\n this.app.campaign = campaign;\n }\n async getNewCampaignAccordeon(template: T) {\n const {root, promise, cancelPromise} = newHitDesignCampaignAccordeon(template);\n promise.then(async (camp) => {\n this.app.dataFrame = camp.df;\n await this.app.setTemplate(template);\n this.app.campaignProps = camp.campaignProps;\n await this.app.saveCampaign(false);\n if (template.layoutViewState && this.app.campaign)\n this.app.campaign.layout = template.layoutViewState;\n });\n\n cancelPromise.then(() => {\n this.init();\n });\n return root;\n }\n\n private async createNewTemplate(preset?: T) {\n ui.setUpdateIndicator(this.root, true);\n try {\n const newTemplateAccordeon = await newHitDesignTemplateAccordeon(this.app, preset);\n // hideComponents(toRemove);\n // $(containerDiv).empty();\n // $(templateInputDiv).empty();\n\n const newView = new DG.ViewBase();\n const curView = grok.shell.v;\n newView.name = 'New Template';\n newView.root.appendChild(newTemplateAccordeon.root);\n newView.parentCall = this.app.parentCall;\n grok.shell.addView(newView);\n newView.path = new URL(this.app.baseUrl).pathname + '/new-template';\n const {sub} = addBreadCrumbsToRibbons(newView, this.app.appName, i18n.createNewTemplate, async () => {\n grok.shell.v = curView;\n newView.close();\n });\n //containerDiv.appendChild(newTemplateAccordeon.root);\n newTemplateAccordeon.template.then(async (t) => {\n await this.init(t as any);\n newView.close();\n popRibbonPannels(newView);\n grok.shell.v = curView;\n sub.unsubscribe();\n });\n newTemplateAccordeon.cancelPromise.then(async () => {\n sub.unsubscribe();\n newView.close();\n grok.shell.v = curView;\n });\n } finally {\n ui.setUpdateIndicator(this.root, false);\n }\n }\n}\n","/* eslint-disable max-len */\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport {HitDesignApp} from '../hit-design-app';\nimport {_package} from '../../package';\nimport {HitDesignTemplate} from '../types';\nimport {HitBaseView} from '../base-view';\n\nexport class HitDesignSubmitView extends HitBaseView<HitDesignTemplate, HitDesignApp> {\n private statusInput: DG.InputBase<string | undefined>;\n private statusSuggestionsMenu: DG.Menu;\n content: HTMLDivElement;\n constructor(app: HitDesignApp) {\n super(app);\n this.name = 'Submit';\n this.statusInput = ui.input.string('Status', {value: this.app.campaign?.status, nullable: false});\n this.statusSuggestionsMenu = DG.Menu.popup();\n this.statusInput.root.style.marginLeft = '12px';\n this.content = ui.div();\n\n this.statusInput.onChanged.subscribe(() => {\n this.statusSuggestionsMenu.clear();\n const status = (this.statusInput.value ?? '').toLowerCase();\n // eslint-disable-next-line max-len\n const similarStatuses = this.app.existingStatuses.filter((s) => s?.toLowerCase()?.includes(status) && s?.toLowerCase() !== status).filter((_, i) => i < 5);\n if (similarStatuses.length) {\n similarStatuses.forEach((s) => {\n this.statusSuggestionsMenu.item(s, () => {\n this.statusInput.value = s;\n this.statusSuggestionsMenu.root.remove();\n this.statusInput.root.focus();\n });\n });\n if (this.content.parentElement?.parentElement) {\n const xOffset = this.statusInput.root.offsetLeft + (this.statusInput.input?.offsetLeft ?? 0);\n const yOffset = this.statusInput.root.offsetTop + this.statusInput.root.offsetHeight + this.content.parentElement.offsetTop;\n this.statusSuggestionsMenu.show({element: this.content.parentElement.parentElement!, x: xOffset, y: yOffset});\n }\n } else\n this.statusSuggestionsMenu.root.remove();\n });\n }\n\n public getStatus() {\n return this.statusInput.value ?? this.app.campaign?.status ?? 'No Status';\n }\n\n render(): HTMLDivElement {\n this.statusInput.value = this.app.campaign?.status ?? '';\n ui.empty(this.content);\n\n this.content = ui.divV([\n ui.h1('Summary'),\n ui.div([ui.tableFromMap(this.app.getSummary())]),\n this.statusInput.root,\n ]);\n return this.content;\n }\n\n onActivated(): void {\n this.render();\n }\n\n async submit(): Promise<any> {\n const submitParams= this.app.template?.submit;\n if (!submitParams)\n return;\n const submitFn = DG.Func.find({name: submitParams.fName, package: submitParams.package})[0];\n if (!submitFn) {\n grok.shell.error(`Function ${submitParams.fName} not found.`);\n return;\n }\n const filteredDf = DG.DataFrame.fromCsv(this.app.dataFrame!.toCsv({filteredRowsOnly: true}));\n await submitFn.apply({df: filteredDf, molecules: this.app.molColName});\n this.app.campaign!.status = this.getStatus();\n this.app.saveCampaign();\n grok.shell.info('Submitted successfully.');\n }\n}\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./utils.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./utils.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport {HitDesignApp} from '../hit-design-app';\nimport {_package} from '../../package';\nimport {TileCategoriesColName} from '../consts';\nimport './utils.css';\nimport {getTileCategoryEditor} from '../accordeons/new-hit-design-template-accordeon';\n\nexport function getTilesViewDialog(app: HitDesignApp, getTableView: () => DG.TableView | null) {\n const tilesViewerSketchStateString = app.campaign?.tilesViewerFormSketch;\n let sketchState: any | null = null;\n if (tilesViewerSketchStateString && tilesViewerSketchStateString.length > 0) {\n try {\n sketchState = JSON.parse(tilesViewerSketchStateString);\n } catch (e) {\n console.error('Failed to parse sketch state string', e);\n }\n }\n if (sketchState) {\n // after saving, some columns might be removed in the meantime, so we need to update the\n //sketch state and remove them so that the viewer can be initialized correctly.\n if (sketchState.elementStates && (sketchState.elementStates.length ?? 0) > 0) {\n sketchState.elementStates = sketchState.elementStates.filter((elementState: any) =>\n elementState?.viewerSettings?.column && app.dataFrame!.col(elementState.viewerSettings.column),\n );\n // similarly, because the table name can be duplicated or changed,\n // we need to make sure that table name in all viewer settings corresponds to actual table name\n sketchState.elementStates.forEach((elState: any) => {\n if (elState?.viewerSettings?.table)\n elState.viewerSettings.table = app.dataFrame!.name;\n });\n }\n }\n\n const tileOpts = {lanesColumnName: TileCategoriesColName,\n lanes: app.stages,\n ...((sketchState?.elementStates?.length ?? 0) > 0 ? {sketchState} : {})};\n\n const tv = getTableView();\n\n if (!tv) {\n grok.shell.error('Failed to create tiles viewer. table view is not available.');\n return;\n }\n let v: DG.Viewer | null = null;\n const modal = ui.dialog('Progress Tracker');\n try {\n v = tv.addViewer(DG.VIEWER.TILE_VIEWER, tileOpts);\n\n const opts = v.getOptions();\n opts.look.sketchState = (sketchState?.elementStates?.length ?? 0) > 0 ? sketchState : null;\n\n v.setOptions(opts);\n v.copyViewersLook(v); // hacky way to apply sketch state\n } catch (e) {\n grok.shell.error('Failed to create tiles viewer with preset layout.\\n Falling back to default layout.');\n console.error('Failed to create tiles viewer', e);\n if (v) {\n v.close();\n v.detach();\n }\n v = tv.addViewer(DG.VIEWER.TILE_VIEWER,\n {lanesColumnName: TileCategoriesColName, lanes: app.stages});\n }\n\n if (!v) {\n grok.shell.error('Failed to create tiles viewer. check the console for more details.');\n return;\n }\n\n let stageEditorDialog: DG.Dialog | null = null;\n const closeViewer = () => {// it can be already closed by the time we get here\n try {\n v.detach();\n v.close();\n } catch (e) {\n }\n };\n modal.add(v.root);\n modal.addButton('Modify Stages', () => {\n stageEditorDialog?.close();\n const stageEditor = getTileCategoryEditor(app.stages);\n stageEditorDialog = ui.dialog('Modify Stages')\n .add(stageEditor.fieldsDiv)\n .onOK(async () => {\n closeViewer(); // so that its not included in the layout.\n ui.setUpdateIndicator(modal.root, true);\n try {\n await app.setStages(stageEditor.getFields());\n ui.setUpdateIndicator(modal.root, false);\n modal.close();\n await new Promise<void>((r) => setTimeout(() => {\n r();\n getTilesViewDialog(app, getTableView);\n }, 100));\n } catch (e) {\n grok.shell.error('Failed to update stages. check the console for more details.');\n console.error('Failed to update stages', e);\n } finally {\n if (modal?.root && document.contains(modal.root))\n modal.close();\n }\n })\n .show();\n stageEditorDialog.root.classList.add('hit-design-stage-editing-dialog');\n }, 0);\n // from this modal, only way to go to another view is through edit form.\n // when this happens, we should not destroy the viewer,\n //but just hide it so that when we come back, we can show it again.\n const hideModal = () => modal.root.style.setProperty('display', 'none', 'important');\n const showModal = () => modal.root.style.display = 'flex';\n\n const viewChangeSub = grok.events.onCurrentViewChanged.subscribe(() => {\n if (grok.shell.v === tv)\n showModal();\n else\n hideModal();\n });\n\n\n const closeSub = modal.onClose.subscribe(() => {\n closeSub.unsubscribe();\n viewChangeSub.unsubscribe();\n stageEditorDialog?.close();\n // save the sketch state\n try {\n const sketchState = v.props.sketchState;\n if (sketchState && typeof sketchState == 'object') {\n const stringState = JSON.stringify(sketchState);\n if (app.campaign)\n app.campaign.tilesViewerFormSketch = stringState;\n }\n } catch (e) {\n grok.shell.error('Failed to save sketch state. check the console for more details.');\n console.error('Failed to save sketch state', e);\n }\n closeViewer();\n });\n\n modal.showModal(true);\n\n modal.getButton('CANCEL')?.remove();\n modal.onOK(() => {});\n // remove the modal background\n document.querySelector('.d4-modal-background')?.remove();\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs.operators;","/* eslint-disable max-len */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {AppName, HitDesignCampaign, HitDesignTemplate, IFunctionArgs} from './types';\nimport {HitDesignInfoView} from './hit-design-views/info-view';\nimport {CampaignIdKey, CampaignJsonName, CampaignTableName,\n HTQueryPrefix, HTScriptPrefix, HitDesignCampaignIdKey,\n HitDesignMolColName, TileCategoriesColName, ViDColName, i18n} from './consts';\nimport {calculateColumns, calculateSingleCellValues, getNewVid} from './utils/calculate-single-cell';\nimport '../../css/hit-triage.css';\nimport {_package} from '../package';\nimport {addBreadCrumbsToRibbons, checkRibbonsHaveSubmit, modifyUrl, toFormatedDateString} from './utils';\nimport {HitDesignSubmitView} from './hit-design-views/submit-view';\nimport {getTilesViewDialog} from './hit-design-views/tiles-view';\nimport {HitAppBase} from './hit-app-base';\nimport {HitBaseView} from './base-view';\nimport {chemFunctionsDialog} from './dialogs/functions-dialog';\nimport {Subscription} from 'rxjs';\nimport {filter} from 'rxjs/operators';\nimport {defaultPermissions, PermissionsDialog} from './dialogs/permissions-dialog';\n\nexport class HitDesignApp<T extends HitDesignTemplate = HitDesignTemplate> extends HitAppBase<T> {\n multiView: DG.MultiView;\n protected _infoView: HitDesignInfoView;\n get infoView(): HitDesignInfoView {return this._infoView;}\n protected _designView?: DG.TableView;\n public _submitView?: HitDesignSubmitView;\n protected _designViewName = 'Design';\n protected _filePath = `System.AppData/HitTriage/${this.appName}/campaigns`;\n protected _campaignId?: string;\n protected _molColName: string = HitDesignMolColName;\n protected _campaign?: HitDesignCampaign;\n public campaignProps: {[key: string]: any} = {};\n\n protected currentDesignViewId?: string;\n public mainView: DG.ViewBase;\n protected get version() {return this._campaign?.version ?? 0;};\n public existingStatuses: string[] = [];\n constructor(c: DG.FuncCall, an: AppName = 'Hit Design',\n infoViewConstructor: (app: HitDesignApp) => HitDesignInfoView = (app) => new HitDesignInfoView(app)) {\n super(c, an);\n this._infoView = infoViewConstructor(this);\n this.multiView = new DG.MultiView({viewFactories: {[this._infoView.name]: () => this._infoView}});\n this.multiView.tabs.onTabChanged.subscribe((_) => {\n if (this.multiView.currentView instanceof HitBaseView)\n (this.multiView.currentView as HitBaseView<T, typeof this>).onActivated();\n });\n this.multiView.parentCall = c;\n\n this.mainView = this.multiView;\n this._initViewChangeSub();\n }\n\n _initViewChangeSub() {\n this.multiView.subs.push(grok.events.onCurrentViewChanged.subscribe(async () => {\n try {\n if (grok.shell.v?.name === this.currentDesignViewId) {\n grok.shell.windows.showHelp = false;\n\n this.setBaseUrl();\n modifyUrl(CampaignIdKey, this._campaignId ?? this._campaign?.name ?? '');\n\n const {sub} = addBreadCrumbsToRibbons(grok.shell.v, this.appName, grok.shell.v?.name, () => {\n grok.shell.v = this.mainView;\n this._designView?.close();\n this._infoView.init();\n sub.unsubscribe();\n });\n }\n } catch (e) {\n console.error(e);\n }\n }));\n }\n\n public get stages() {\n return this.campaign?.template?.stages ?? this.template?.stages ?? [];\n }\n\n public async setStages(st: string[]) {\n if (!this.campaign || !this.campaign.template || !this.template) {\n grok.shell.error('Campaign or template is not set');\n return;\n }\n if (!st?.length) {\n grok.shell.error('Removing all stages is not allowed');\n return;\n }\n const stageCol = this.dataFrame?.col(TileCategoriesColName);\n if (!stageCol) {\n grok.shell.error('No stage column found');\n return;\n }\n const removedStages: string[] = [];\n //make sure there is no duplication\n const stageSet = new Set(st);\n const uniqueStages = [...stageSet];\n const dfLen = this.dataFrame!.rowCount;\n const stageCats = stageCol.categories;\n const stageIndexes = stageCol.getRawData() as Int32Array;\n for (let i = 0; i < dfLen; i++) {\n const stage = stageCats[stageIndexes[i]];\n if (!stageSet.has(stage)) {\n stageCol.set(i, st[0], false);\n removedStages.push(stage);\n }\n }\n\n if (removedStages.length > 0)\n grok.shell.warning(`Some stages were removed: (${removedStages.join(', ')}). Corresponding rows were set to stage \"${st[0]}\"`);\n\n\n this.campaign.template.stages = uniqueStages;\n this.template.stages = uniqueStages;\n await this.saveCampaign(true);\n }\n\n public async setTemplate(template: T, campaignId?: string) {\n if (!campaignId) {\n this._designView?.dataFrame && grok.shell.closeTable(this._designView.dataFrame);\n this._designView = undefined;\n campaignId = await this.getNewCampaignName(`${this.appName}/campaigns`, template.key);\n modifyUrl(HitDesignCampaignIdKey, campaignId);\n this._filePath = `System.AppData/HitTriage/${this.appName}/campaigns/${campaignId}/${CampaignTableName}`;\n } else {\n const fileLoc = `System.AppData/HitTriage/${this.appName}/campaigns`;\n this._filePath = this.campaign?.savePath ?? `${fileLoc}/${campaignId}/${CampaignTableName}`;\n this.dataFrame = await grok.dapi.files.readCsv(this._filePath);\n if (this._campaign?.columnSemTypes) {\n Object.entries(this._campaign.columnSemTypes).forEach(([colName, semtype]) => {\n const col = this.dataFrame!.columns.byName(colName);\n if (col && semtype)\n col.semType = semtype;\n });\n }\n if (this._campaign?.columnTypes) {\n Object.entries(this._campaign.columnTypes).forEach(([colName, type]) => {\n const col = this.dataFrame!.columns.byName(colName);\n if (col && col.type !== type)\n try {this.dataFrame!.changeColumnType(colName, type as DG.COLUMN_TYPE);} catch (e) {console.error(e);}\n });\n }\n //await this.dataFrame.meta.detectSemanticTypes();\n }\n\n if (!this.dataFrame) {\n console.error('DataFrame is empty');\n return;\n }\n await this.dataFrame.meta.detectSemanticTypes();\n this._molColName = this.dataFrame.columns.bySemType(DG.SEMTYPE.MOLECULE)?.name ?? HitDesignMolColName;\n this._campaignId = campaignId;\n this.template = template;\n\n this._submitView ??= new HitDesignSubmitView(this);\n grok.shell.windows.showHelp = false;\n if (this.campaign)\n await this.setCanEdit(this.campaign);\n else\n this.hasEditPermission = true; // if the campaign is new, obviously the user can edit it\n const designV = this.designView;\n this.currentDesignViewId = designV.name;\n this.setBaseUrl();\n modifyUrl(CampaignIdKey, this._campaignId ?? this._campaign?.name ?? '');\n if (this.campaign)\n this.campaign.template = template;\n }\n\n get campaignId(): string | undefined {return this._campaignId;}\n\n get designView(): DG.TableView {return this._designView = this.getDesignView();}\n\n get designViewName(): string {return this._designViewName;}\n\n get molColName() {\n return this._molColName ??= this.dataFrame?.columns.bySemType(DG.SEMTYPE.MOLECULE)?.name ?? HitDesignMolColName;\n }\n\n get campaign(): HitDesignCampaign | undefined {return this._campaign;}\n\n set campaign(campaign: HitDesignCampaign | undefined) {this._campaign = campaign;}\n\n private _duplicateVidCache?: {\n colVersion: number,\n valueCounts: Int32Array | Uint32Array,\n indexes: Int32Array | Uint32Array,\n };\n\n private cacheDuplicateVIDs() {\n const col = this.dataFrame?.col(ViDColName);\n if (!col) {\n this._duplicateVidCache = undefined;\n return;\n }\n const colVersion = col.version;\n const valueCounts = new Uint32Array(col.categories.length).fill(0);\n const indexes = (col.getRawData() as Uint32Array).subarray(0, col.length);\n indexes.forEach((v) => valueCounts[v]++);\n this._duplicateVidCache = {colVersion, valueCounts, indexes};\n }\n\n get duplicateVidCache() {\n const col = this.dataFrame?.col(ViDColName);\n if (!col)\n return undefined;\n if (!this._duplicateVidCache || col.version !== this._duplicateVidCache.colVersion)\n this.cacheDuplicateVIDs();\n return this._duplicateVidCache;\n }\n\n async performSingleCellCalculations(newValueIdx: number, newValue?: string) {\n const computeObj = this.template!.compute;\n if (!newValue || newValue === '')\n return;\n\n const calcDf =\n await calculateSingleCellValues(\n newValue, computeObj.descriptors.args, computeObj.functions, computeObj.scripts, computeObj.queries);\n\n for (const col of calcDf.columns.toList()) {\n if (col.name === HitDesignMolColName) continue;\n if (!this.dataFrame!.columns.contains(col.name)) {\n const newCol = this.dataFrame!.columns.addNew(col.name, col.type);\n newCol.semType = col.semType;\n }\n this.dataFrame!.col(col.name)!.set(newValueIdx, col.get(0), false);\n }\n this.dataFrame!.fireValuesChanged();\n this.saveCampaign(false);\n }\n\n protected initDesignViewRibbons(view: DG.TableView, subs: Subscription[]) {\n const onRemoveSub = grok.events.onViewRemoved.subscribe((v) => {\n if (v.id === view?.id) {\n subs.forEach((s) => s.unsubscribe());\n onRemoveSub.unsubscribe();\n }\n });\n let ribbons = view?.getRibbonPanels();\n if (ribbons) {\n const hasSubmit = checkRibbonsHaveSubmit(ribbons);\n if (!hasSubmit) {\n const getComputeDialog = async () => {\n chemFunctionsDialog(this, async (resultMap) => {\n const oldDescriptors = this.template!.compute.descriptors.args;\n const oldFunctions = this.template!.compute.functions;\n const oldScripts = this.template!.compute.scripts ?? [];\n const oldQueries = this.template!.compute.queries ?? [];\n const newDescriptors = resultMap.descriptors;\n const newComputeObj = {\n descriptors: {\n enabled: !!resultMap?.descriptors?.length,\n args: resultMap?.descriptors ?? [],\n },\n functions: Object.entries(resultMap?.externals ?? {}).map(([funcName, args]) => {\n const splitFunc = funcName.split(':');\n return ({\n name: splitFunc[1],\n package: splitFunc[0],\n args: args,\n });\n }),\n scripts: Object.entries(resultMap?.scripts ?? {})\n .filter(([name, _]) => name.startsWith(HTScriptPrefix) && name.split(':').length === 3)\n .map(([scriptId, args]) => {\n const scriptNameParts = scriptId.split(':');\n return ({\n name: scriptNameParts[1] ?? '',\n id: scriptNameParts[2] ?? '',\n args: args,\n });\n }),\n queries: Object.entries(resultMap?.queries ?? {})\n .filter(([name, _]) => name.startsWith(HTQueryPrefix) && name.split(':').length === 3)\n .map(([queryName, args]) => {\n const queryNameParts = queryName.split(':');\n return ({\n name: queryNameParts[1] ?? '',\n id: queryNameParts[2] ?? '',\n args: args,\n });\n }),\n };\n this.template!.compute = newComputeObj;\n this.campaign!.template = this.template;\n const uncalculatedDescriptors = newDescriptors.filter((d) => !oldDescriptors.includes(d));\n\n const newFunctions: {[_: string]: IFunctionArgs} = {};\n Object.entries(resultMap?.externals ?? {})\n .filter(([funcName, args]) => {\n const oldFunc = oldFunctions.find((f) => `${f.package}:${f.name}` === funcName);\n if (!oldFunc)\n return true;\n return !Object.entries(args).every(([key, value]) => oldFunc.args[key] === value);\n }).forEach(([funcName, args]) => {newFunctions[funcName] = args;});\n\n const newScripts: {[_: string]: IFunctionArgs} = {};\n Object.entries(resultMap?.scripts ?? {})\n .filter(([scriptName, args]) => {\n const oldScript = oldScripts.find((f) => `${HTScriptPrefix}:${f.name}:${f.id}` === scriptName);\n if (!oldScript)\n return true;\n return !Object.entries(args).every(([key, value]) => oldScript.args[key] === value);\n }).forEach(([scriptName, args]) => {newScripts[scriptName] = args;});\n\n const newQueries: {[_: string]: IFunctionArgs} = {};\n Object.entries(resultMap?.queries ?? {})\n .filter(([queryName, args]) => {\n const oldQuery = oldQueries.find((f) => `${HTQueryPrefix}:${f.name}:${f.id}` === queryName);\n if (!oldQuery)\n return true;\n return !Object.entries(args).every(([key, value]) => oldQuery.args[key] === value);\n }).forEach(([queryName, args]) => {newQueries[queryName] = args;});\n ui.setUpdateIndicator(view.grid.root, true);\n try {\n await calculateColumns({descriptors: uncalculatedDescriptors, externals: newFunctions,\n scripts: newScripts, queries: newQueries}, this.dataFrame!, this.molColName!);\n this.dataFrame!.fireValuesChanged();\n } finally {\n ui.setUpdateIndicator(view.grid.root, false);\n this.saveCampaign(false);\n }\n }, () => null, this.campaign?.template!, true);\n };\n\n const calculateRibbon = ui.iconFA('wrench', getComputeDialog, 'Calculate additional properties');\n const addNewRowButton = ui.icons.add(() => {this.dataFrame?.rows.addNew(null, true);}, 'Add new row');\n const permissionsButton = ui.iconFA('share', async () => {\n await (new PermissionsDialog(this.campaign?.permissions)).show((res) => {\n this.campaign!.permissions = res;\n this.saveCampaign(true);\n });\n }, 'Edit campaign permissions');\n const tilesButton = ui.bigButton('Progress tracker', () => {\n getTilesViewDialog(this, () => this._designView ?? null);\n });\n\n const submitButton = ui.bigButton('Submit', () => {\n const dialogContent = this._submitView?.render();\n if (dialogContent) {\n const dlg = ui.dialog('Submit');\n dlg.add(dialogContent);\n dlg.addButton('Save', () => {\n this._campaign!.status = this._submitView!.getStatus();\n this.saveCampaign();\n dlg.close();\n });\n if (this.template?.submit?.fName && this.template?.submit?.package && DG.Func.find({name: this.template.submit.fName, package: this.template.submit.package})?.length > 0)\n dlg.addButton('Submit', ()=>{this._submitView?.submit(); dlg.close();});\n dlg.show();\n }\n });\n submitButton.classList.add('hit-design-submit-button');\n const ribbonButtons: HTMLElement[] = [submitButton];\n if (this.stages.length > 0)\n ribbonButtons.unshift(tilesButton);\n // only initialize campaign template if its not exsitent yet\n if (this.campaign && this.template && !this.campaign.template)\n this.campaign.template = this.template;\n\n if (this.hasEditPermission)\n ribbonButtons.unshift(permissionsButton);\n ribbonButtons.unshift(calculateRibbon);\n ribbonButtons.unshift(addNewRowButton);\n\n\n ribbons.push(ribbonButtons);\n // remove project save button from the ribbon\n ribbons.some((rg) => {\n const saveBtnIdx = rg?.findIndex((r) => r?.textContent?.toLowerCase() === 'save') ?? -1;\n if (saveBtnIdx !== -1) {\n rg.splice(saveBtnIdx, 1);\n return true;\n }\n return false;\n });\n // remove empty ribbon arrays\n ribbons = ribbons.filter((r) => (r?.length ?? 0) > 0);\n view.setRibbonPanels(ribbons);\n }\n }\n return view;\n }\n\n protected getDesignView(): DG.TableView {\n const subs: Subscription[] = [];\n const isNew = this.dataFrame!.col(this.molColName)?.toList().every((m) => !m && m === '');\n const view = grok.shell.addTableView(this.dataFrame!);\n this._designViewName = this.campaign?.name ?? this._designViewName;\n view.name = this._designViewName;\n\n view._onAdded();\n const layoutViewState = this._campaign?.layout ?? this.template?.layoutViewState;\n if (layoutViewState) {\n try {\n const layout = DG.ViewLayout.fromViewState(layoutViewState);\n view.loadLayout(layout);\n } catch (e) {\n grok.shell.error('Failed to apply layout. Falling back to default layout.');\n console.error(e);\n }\n }\n\n if (isNew)\n grok.functions.call('Chem:editMoleculeCell', {cell: view.grid.cell(this._molColName, 0)});\n\n subs.push(this.dataFrame!.onRowsAdded.pipe(filter(() => !this.isJoining))\n .subscribe(() => { // TODO, insertion of rows in the middle\n try {\n if (this.stages.length > 0) {\n for (let i = 0; i < this.dataFrame!.rowCount; i++) {\n const colVal = this.dataFrame!.col(TileCategoriesColName)!.get(i);\n if (!colVal || colVal === '' || this.dataFrame!.col(TileCategoriesColName)?.isNone(i))\n this.dataFrame!.set(TileCategoriesColName, i, this.stages[0]);\n }\n }\n let lastAddedCell: DG.GridCell | null = null;\n for (let i = 0; i < this.dataFrame!.rowCount; i++) {\n const cell = view.grid.cell(this.molColName, i);\n if (!cell)\n continue;\n if (cell.cell.value === '' || cell.cell.value === null)\n lastAddedCell = cell;\n }\n if (lastAddedCell)\n grok.functions.call('Chem:editMoleculeCell', {cell: lastAddedCell});\n } catch (e) {\n console.error(e);\n }\n //const lastCell = view.grid.cell(this.molColName, this.dataFrame!.rowCount - 1);\n //view.grid.onCellValueEdited\n }));\n subs.push(grok.events.onContextMenu.subscribe((args) => {\n try {\n const viewer: DG.Viewer = args?.args?.context;\n if (!viewer)\n return;\n if (viewer?.type !== DG.VIEWER.GRID)\n return;\n if (!viewer.tableView || viewer.tableView.id !== view.id)\n return;\n if (args?.args?.item?.tableColumn?.name !== this.molColName || !args?.args?.item?.isTableCell)\n return;\n const menu: DG.Menu = args?.args?.menu;\n if (!menu)\n return;\n menu.item('Add new row', () => {\n this.dataFrame!.rows.addNew(null, true);\n });\n menu.item('Duplicate molecule', () => {\n try {\n const row = this.dataFrame!.rows.addNew(null, true);\n const cell = row.get(this.molColName);\n if (cell != null && row.idx > -1)\n this.dataFrame!.cell(row.idx, this.molColName).value = args?.args?.item?.cell?.value ?? '';\n } catch (e) {\n console.error(e);\n }\n });\n\n const cellIndex = args?.args?.item?.tableRowIndex;\n const cellValue = args?.args?.item?.cell?.value;\n if (cellValue && (cellIndex ?? -1) > -1) {\n menu.item('Re-Run Calculations', async () => {\n try {\n await this.performSingleCellCalculations(cellIndex, cellValue);\n } catch (e) {\n console.error(e);\n }\n });\n }\n } catch (e: any) {\n grok.log.error(e);\n }\n }));\n\n if (!view?.grid) {\n grok.shell.error('Applied layout created view without grid. Resetting layout.');\n view.resetLayout();\n }\n view?.grid && subs.push(view.grid.onCellValueEdited.subscribe(async (gc) => {\n try {\n if (gc.tableColumn?.name === TileCategoriesColName) {\n await this.saveCampaign(false);\n return;\n }\n if (gc.tableColumn?.name !== this.molColName)\n return;\n const newValue = gc.cell.value;\n const newValueIdx = gc.tableRowIndex!;\n let newVid = this.dataFrame!.col(ViDColName)?.get(newValueIdx);\n let foundMatch = false;\n // try to find existing molecule\n if (newValue) {\n try {\n const canonicals = gc.tableColumn.toList().map((cv) => {\n try {\n return grok.chem.convert(cv, grok.chem.Notation.Unknown, grok.chem.Notation.Smiles);\n } catch (e) {\n return '';\n }\n },\n );\n const canonicalNewValue =\n grok.chem.convert(newValue, grok.chem.Notation.Unknown, grok.chem.Notation.Smiles);\n if (canonicals?.length === this.dataFrame!.rowCount) {\n for (let i = 0; i < canonicals.length; i++) {\n if (canonicals[i] === canonicalNewValue &&\n i !== newValueIdx && this.dataFrame!.col(ViDColName)?.get(i)) {\n newVid = this.dataFrame!.col(ViDColName)?.get(i);\n foundMatch = true;\n break;\n }\n }\n }\n } catch (e) {\n console.error(e);\n }\n }\n // if the vid was duplicated, generate a new one\n if (this.duplicateVidCache && !foundMatch &&\n this.duplicateVidCache.valueCounts[this.duplicateVidCache.indexes[newValueIdx]] > 1)\n newVid = null;\n\n if (!newVid || newVid === '')\n newVid = getNewVid(this.dataFrame!.col(ViDColName)!);\n\n this.dataFrame!.col(ViDColName)!.set(newValueIdx, newVid, false);\n\n this.performSingleCellCalculations(newValueIdx, newValue);\n } catch (e) {\n console.error(e);\n }\n }));\n\n view?.grid && subs.push(view.grid.onCellRender.subscribe((args) => {\n try {\n // color duplicate vid values\n const cell = args.cell;\n if (!cell || !cell.isTableCell || !cell.tableColumn || !this.duplicateVidCache ||\n cell.tableColumn.name !== ViDColName || (cell.tableRowIndex ?? -1) < 0)\n return;\n\n if (this.duplicateVidCache.valueCounts[this.duplicateVidCache.indexes[cell.tableRowIndex!]] > 1) {\n args.cell.style.backColor =\n DG.Color.setAlpha(DG.Color.getCategoricalColor(this.duplicateVidCache.indexes[cell.tableRowIndex!])\n , 150);\n }\n } catch (e) {}\n }));\n this.initDesignViewRibbons(view, subs);\n view.parentCall = this.parentCall;\n return view;\n }\n\n getSummary(): {[_: string]: any} {\n const getFolderPath = () => {\n const campaignIndex = this._filePath.indexOf((this.campaignId ?? this._campaign?.name)!);\n const folderPath = campaignIndex === -1 ? this._filePath : this._filePath.substring(0, campaignIndex - 1);\n return folderPath;\n };\n const campaignProps = {...(this.campaign?.campaignFields ?? this.campaignProps)};\n if (this.template && this.template.campaignFields) {\n Object.entries(campaignProps).forEach(([key, value]) => {\n const field = this.template!.campaignFields!.find((f) => f.name === key);\n if (field && field.type === 'Date' && value) {\n const dateString = (new Date(value)).toString();\n if (dateString !== 'Invalid Date')\n campaignProps[key] = (new Date(value)).toLocaleDateString();\n else {\n if (value.date)\n campaignProps[key] = new Date(value.date).toLocaleDateString();\n else\n campaignProps[key] = value;\n }\n } else {\n if (field && field.type === DG.SEMTYPE.MOLECULE && value)\n campaignProps[key] = grok.chem.drawMolecule(value);\n }\n });\n }\n\n const getPathEditor = () => {\n const editIcon = ui.icons.edit(() => {\n const folderPath = getFolderPath();\n const newPathInput = ui.input.string('Path', {value: folderPath});\n const labelElement = newPathInput.root.getElementsByTagName('label').item(0);\n if (labelElement)\n labelElement.remove();\n newPathInput.root.style.width = '100%';\n\n async function checkFolder() {\n const newPath = newPathInput.value;\n if (!newPath || newPath.trim() === '') {\n grok.shell.error('Path can not be empty');\n return false;\n }\n const exists = await grok.dapi.files.exists(newPath);\n if (!exists) {\n grok.shell.error('Given folder does not exist');\n return false;\n }\n return true;\n }\n\n const saveButton = ui.button('Save', async () => {\n const exists = await checkFolder();\n if (!exists)\n return;\n const newPath = newPathInput.value;\n if (newPath.endsWith('/'))\n this._filePath = `${newPath}${this.campaignId}/${CampaignTableName}`;\n else\n this._filePath = `${newPath}/${this.campaignId}/${CampaignTableName}`;\n\n if (this._campaign)\n this._campaign!.savePath = this._filePath;\n await this.saveCampaign(true);\n ui.empty(pathDiv);\n const folderPath = getFolderPath();\n link = ui.link(folderPath,\n () => this.download(this.dataFrame!, this.campaignId ?? this._campaign?.name ?? 'Molecules'),\n i18n.download);\n pathDiv.appendChild(link);\n pathDiv.appendChild(editIcon);\n });\n const cancelButton = ui.button('Cancel', () => {\n ui.empty(pathDiv);\n pathDiv.appendChild(link);\n pathDiv.appendChild(editIcon);\n });\n ui.empty(pathDiv);\n newPathInput.addOptions(cancelButton);\n newPathInput.addOptions(saveButton);\n pathDiv.appendChild(newPathInput.root);\n }, 'Edit file path');\n editIcon.style.marginLeft = '5px';\n const folderPath = getFolderPath();\n let link = ui.link(folderPath,\n () => this.download(this.dataFrame!, this.campaignId ?? this._campaign?.name ?? 'Molecules'), i18n.download);\n const pathDiv = ui.divH([link, editIcon], {style: {alignItems: 'center'}});\n return pathDiv;\n };\n\n return {\n 'Template': this.template?.name ?? 'Molecules',\n 'File path': getPathEditor(),\n ...campaignProps,\n 'Number of molecules': (this.dataFrame!.rowCount).toString(),\n 'Enrichment methods': [this.template!.compute.descriptors.enabled ? 'descriptors' : '',\n ...this.template!.compute.functions.map((func) => func.name)].filter((f) => f && f.trim() !== '').join(', '),\n };\n }\n\n async saveCampaign(notify = true): Promise<HitDesignCampaign> {\n const campaignId = this.campaignId!;\n const templateName = this.template!.name;\n const enrichedDf = this.dataFrame!;\n const campaignName = campaignId;\n const columnSemTypes: {[_: string]: string} = {};\n enrichedDf.columns.toList().forEach((col) => columnSemTypes[col.name] = col.semType);\n const colTypeMap: {[_: string]: string} = {};\n enrichedDf.columns.toList().forEach((col) => colTypeMap[col.name] = col.type);\n const sketchStateString = this.campaign?.tilesViewerFormSketch ?? undefined;\n\n // if its first time save author as current user, else keep the same\n const authorUserId = this.campaign?.authorUserId ?? grok.shell.user.id;\n const permissions = this.campaign?.permissions ?? defaultPermissions;\n\n const campaign: HitDesignCampaign = {\n name: campaignName,\n templateName,\n status: this.campaign?.status ?? 'In Progress',\n createDate: this.campaign?.createDate ?? toFormatedDateString(new Date()),\n campaignFields: this.campaign?.campaignFields ?? this.campaignProps,\n columnSemTypes,\n rowCount: enrichedDf.rowCount,\n filteredRowCount: enrichedDf.filter.trueCount,\n savePath: this._filePath,\n columnTypes: colTypeMap,\n tilesViewerFormSketch: sketchStateString,\n version: this.version + 1,\n authorUserId,\n permissions,\n };\n if (!this.hasEditPermission) {\n grok.shell.error('You do not have permission to modify this campaign');\n return campaign;\n }\n const campaignPath = `${this.appName}/campaigns/${campaignId}/${CampaignJsonName}`;\n // check if someone already saved the campaign\n let resDf = enrichedDf;\n\n\n if (await _package.files.exists(campaignPath)) {\n const prevCamp: HitDesignCampaign = JSON.parse(await _package.files.readAsText(campaignPath));\n if ((prevCamp.version ?? 0) > this.version) {\n campaign.version = Math.max(this.version, (prevCamp.version ?? 0)) + 1;\n if (await grok.dapi.files.exists(this._filePath)) {\n try {\n const prevCampDf = await grok.dapi.files.readCsv(this._filePath);\n const joined = this.unionDataframes(prevCampDf, enrichedDf, this.molColName);\n resDf = joined;\n } catch (e) {\n console.error(e);\n }\n }\n }\n }\n const csvDf = DG.DataFrame.fromColumns(\n resDf.columns.toList().filter((col) => !col.name.startsWith('~')),\n ).toCsv();\n await grok.dapi.files.writeAsText(this._filePath, csvDf);\n const newLayout = this._designView!.saveLayout();\n if (!newLayout)\n grok.shell.warning('Layout cound not be saved');\n else\n campaign.layout = newLayout.viewState;\n campaign.template = this.template;\n\n await _package.files.writeAsText(campaignPath,\n JSON.stringify(campaign));\n notify && grok.shell.info('Campaign saved successfully.');\n this.campaign = campaign;\n return campaign;\n }\n}\n","\n/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nexport class GasteigerPngRenderer extends DG.GridCellRenderer {\n get name(): string {return 'customGasteigerPNG';}\n\n get cellType(): string {return 'customGasteigerPNG';}\n\n get defaultHeight(): number {return 200;}\n\n get defaultWidth(): number {return 200;}\n\n /**\n * Cell renderer function.\n *\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {number} x x coordinate on the canvas.\n * @param {number} y y coordinate on the canvas.\n * @param {number} w width of the cell.\n * @param {number} h height of the cell.\n * @param {DG.GridCell} gridCell Grid cell.\n * @param {DG.GridCellStyle} _cellStyle Cell style.\n */\n render(\n g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, gridCell: DG.GridCell,\n _cellStyle: DG.GridCellStyle,\n ): void {\n if (gridCell.gridRow < 0 || !gridCell.cell.value) return;\n\n const pngString: string = gridCell.cell.value;\n const img = new Image(w-2, h-2);\n\n img.src = 'data:image/png;base64,' + pngString;\n img.onload = function() {\n g.drawImage(img, x+2, y+2, w-2, h-2);\n };\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {u2} from '@datagrok-libraries/utils/src/u2';\nimport {_package} from '../../package';\nimport {PeptiHitTemplate} from '../types';\nimport {newHitDesignCampaignAccordeon} from '../accordeons/new-hit-design-campaign-accordeon';\nimport {HitDesignInfoView} from '../hit-design-views/info-view';\nimport {PeptiHitApp} from '../pepti-hit-app';\n\nexport class PeptiHitInfoView extends HitDesignInfoView<PeptiHitTemplate, PeptiHitApp> {\n constructor(app: PeptiHitApp) {\n super(app);\n this.name = 'PeptiHit';\n grok.shell.windows.showHelp = true;\n grok.shell.windows.help.showHelp(_package.webRoot + 'README_HD.md');\n }\n\n override async getNewCampaignAccordeon(template: PeptiHitTemplate) {\n const {root, promise, cancelPromise} = newHitDesignCampaignAccordeon(template, true);\n promise.then(async (camp) => {\n this.app.dataFrame = camp.df;\n await this.app.setTemplate(template);\n this.app.campaignProps = camp.campaignProps;\n await this.app.saveCampaign(false);\n if (template.layoutViewState && this.app.campaign)\n this.app.campaign.layout = template.layoutViewState;\n });\n\n cancelPromise.then(() => {\n this.init();\n });\n return root;\n }\n\n override getAppHeader() {\n return u2.appHeader({\n iconPath: _package.webRoot + '/images/icons/pepti-hit-icon.png',\n learnMoreUrl: 'https://github.com/datagrok-ai/public/blob/master/packages/HitTriage/README_HD.md',\n description:\n '- Configure your own workflow using the template editor\\n' +\n '- Sketch Helm sequences in the spreadsheet\\n' +\n '- Annotate and share ideas with the team\\n' +\n '- Convert to molecular form and calculate different properties\\n' +\n '- Save campaigns and continue from where you left off\\n' +\n '- Submit final selection to the function of your choice',\n });\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {PeptiHitTemplate} from './types';\nimport {PeptiHitHelmColName, TileCategoriesColName, ViDColName} from './consts';\nimport {getNewVid} from './utils/calculate-single-cell';\nimport '../../css/hit-triage.css';\nimport {_package} from '../package';\nimport {Subscription} from 'rxjs';\nimport {filter} from 'rxjs/operators';\nimport {HitDesignApp} from './hit-design-app';\nimport {PeptiHitInfoView} from './pepti-hits-views/info-view';\n\nexport class PeptiHitApp extends HitDesignApp<PeptiHitTemplate> {\n _helmColName: string = PeptiHitHelmColName;\n constructor(c: DG.FuncCall) {\n super(c, 'PeptiHit', (app) => new PeptiHitInfoView(app as PeptiHitApp));\n }\n\n public async setTemplate(template: PeptiHitTemplate, campaignId?: string): Promise<void> {\n await super.setTemplate(template, campaignId);\n this._helmColName = this.dataFrame!.columns.bySemType(DG.SEMTYPE.MACROMOLECULE)?.name ?? PeptiHitHelmColName;\n }\n\n get helmColName(): string {\n return this._helmColName ??\n this.dataFrame!.columns.bySemType(DG.SEMTYPE.MACROMOLECULE)?.name;\n }\n\n async performSingleCellCalculations(cellIndex: number, cellValue?: string) {\n try {\n if (!cellValue)\n throw new Error('No cell value provided');\n const col = DG.Column.fromStrings(this.helmColName, [cellValue]);\n const table = DG.DataFrame.fromColumns([col]);\n col.semType = DG.SEMTYPE.MACROMOLECULE;\n col.setTag('units', 'helm');\n col.setTag('.alphabetIsMultichar', 'true');\n await grok.functions.call('Bio:toAtomicLevel', {table: table, seqCol: col, nonlinear: true});\n const molCol = table.columns.names().find((c) => c.toLowerCase() !== this.helmColName.toLowerCase());\n const mol = molCol ? table.col(molCol)?.get(0) : null;\n if (!mol)\n throw new Error('Failed to convert sequence to atomic level');\n this.dataFrame!.set(this.molColName, cellIndex, mol);\n await super.performSingleCellCalculations(cellIndex, mol);\n } catch (e) {\n console.error(e);\n }\n }\n\n protected getDesignView(): DG.TableView {\n const subs: Subscription[] = [];\n const isNew = this.dataFrame!.col(this.helmColName)?.toList().every((m) => !m && m === '');\n const helmCol = this.dataFrame!.col(this.helmColName);\n if (!helmCol)\n throw new Error('No helm column found');\n helmCol.semType = DG.SEMTYPE.MACROMOLECULE;\n helmCol.setTag('units', 'helm');\n helmCol.setTag('.alphabetIsMultichar', 'true');\n helmCol.setTag('cell.renderer', 'helm');\n\n const view = grok.shell.addTableView(this.dataFrame!);\n this._designViewName = this.campaign?.name ?? this._designViewName;\n view.name = this._designViewName;\n view._onAdded();\n const layoutViewState = this._campaign?.layout ?? this.template?.layoutViewState;\n if (layoutViewState) {\n try {\n const layout = DG.ViewLayout.fromViewState(layoutViewState);\n view.loadLayout(layout);\n } catch (e) {\n grok.shell.error('Failed to apply layout. Falling back to default layout.');\n console.error(e);\n }\n }\n\n if (isNew)\n grok.functions.call('Helm:editMoleculeCell', {cell: view.grid.cell(this.helmColName, 0)});\n\n subs.push(this.dataFrame!.onRowsAdded.pipe(filter(() => !this.isJoining))\n .subscribe(() => { // TODO, insertion of rows in the middle\n try {\n if (this.stages.length > 0) {\n for (let i = 0; i < this.dataFrame!.rowCount; i++) {\n const colVal = this.dataFrame!.col(TileCategoriesColName)!.get(i);\n if (!colVal || colVal === '' || this.dataFrame!.col(TileCategoriesColName)?.isNone(i))\n this.dataFrame!.set(TileCategoriesColName, i, this.stages[0]);\n }\n }\n let lastAddedCell: DG.GridCell | null = null;\n for (let i = 0; i < this.dataFrame!.rowCount; i++) {\n const cell = view.grid.cell(this.helmColName, i);\n if (!cell)\n continue;\n if (cell.cell.value === '' || cell.cell.value === null)\n lastAddedCell = cell;\n }\n if (lastAddedCell)\n grok.functions.call('Helm:editMoleculeCell', {cell: lastAddedCell});\n } catch (e) {\n console.error(e);\n }\n }));\n\n subs.push(grok.events.onContextMenu.subscribe((args) => {\n try {\n const viewer: DG.Viewer = args?.args?.context;\n if (!viewer)\n return;\n if (viewer?.type !== DG.VIEWER.GRID)\n return;\n if (!viewer.tableView || viewer.tableView.id !== view.id)\n return;\n if (args?.args?.item?.tableColumn?.name !== this.helmColName || !args?.args?.item?.isTableCell)\n return;\n const menu: DG.Menu = args?.args?.menu;\n if (!menu)\n return;\n menu.item('Add new row', () => {\n this.dataFrame!.rows.addNew(null, true);\n });\n menu.item('Duplicate Sequence', () => {\n try {\n const row = this.dataFrame!.rows.addNew(null, true);\n const cell = row.get(this.helmColName);\n if (cell != null && row.idx > -1)\n this.dataFrame!.cell(row.idx, this.helmColName).value = args?.args?.item?.cell?.value ?? '';\n } catch (e) {\n console.error(e);\n }\n });\n\n const cellIndex = args?.args?.item?.tableRowIndex;\n const cellValue = args?.args?.item?.cell?.value;\n if (cellValue && (cellIndex ?? -1) > -1) {\n menu.item('Re-Run Calculations', async () => {\n try {\n await this.performSingleCellCalculations(cellIndex, cellValue);\n } catch (e) {\n console.error(e);\n }\n });\n }\n } catch (e: any) {\n grok.log.error(e);\n }\n }));\n\n if (!view?.grid) {\n grok.shell.error('Applied layout created view without grid. Resetting layout.');\n view.resetLayout();\n }\n\n view?.grid && subs.push(view.grid.onCellValueEdited.subscribe(async (gc) => {\n try {\n if (gc.tableColumn?.name === TileCategoriesColName) {\n await this.saveCampaign(false);\n return;\n }\n if (gc.tableColumn?.name !== this.helmColName)\n return;\n const newValue = gc.cell.value;\n const newValueIdx = gc.tableRowIndex!;\n let newVid = this.dataFrame!.col(ViDColName)?.get(newValueIdx);\n let foundMatch = false;\n // try to find existing sequence\n if (newValue) {\n try {\n const canonicals = gc.tableColumn.toList();\n const canonicalNewValue = newValue;\n if (canonicals?.length === this.dataFrame!.rowCount) {\n for (let i = 0; i < canonicals.length; i++) {\n if (canonicals[i] === canonicalNewValue &&\n i !== newValueIdx && this.dataFrame!.col(ViDColName)?.get(i)) {\n newVid = this.dataFrame!.col(ViDColName)?.get(i);\n foundMatch = true;\n break;\n }\n }\n }\n } catch (e) {\n console.error(e);\n }\n }\n // if the vid was duplicated, generate a new one\n if (this.duplicateVidCache && !foundMatch &&\n this.duplicateVidCache.valueCounts[this.duplicateVidCache.indexes[newValueIdx]] > 1)\n newVid = null;\n\n if (!newVid || newVid === '')\n newVid = getNewVid(this.dataFrame!.col(ViDColName)!);\n\n this.dataFrame!.col(ViDColName)!.set(newValueIdx, newVid, false);\n\n this.performSingleCellCalculations(newValueIdx, newValue);\n } catch (e) {\n console.error(e);\n }\n }));\n\n view?.grid && subs.push(view.grid.onCellRender.subscribe((args) => {\n try {\n // color duplicate vid values\n const cell = args.cell;\n if (!cell || !cell.isTableCell || !cell.tableColumn || !this.duplicateVidCache ||\n cell.tableColumn.name !== ViDColName || (cell.tableRowIndex ?? -1) < 0)\n return;\n\n if (this.duplicateVidCache.valueCounts[this.duplicateVidCache.indexes[cell.tableRowIndex!]] > 1) {\n args.cell.style.backColor =\n DG.Color.setAlpha(DG.Color.getCategoricalColor(this.duplicateVidCache.indexes[cell.tableRowIndex!])\n , 150);\n }\n } catch (e) {}\n }));\n\n this.initDesignViewRibbons(view, subs);\n view.parentCall = this.parentCall;\n return view;\n }\n}\n","/* Do not change these import lines. Datagrok will import API library in exactly the same manner */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {HitTriageApp} from './app/hit-triage-app';\nimport {HitDesignApp} from './app/hit-design-app';\nimport {GasteigerPngRenderer} from './pngRenderers';\nimport {loadCampaigns} from './app/utils';\nimport {AppName} from './app';\nimport {PeptiHitApp} from './app/pepti-hit-app';\nimport {PeptiHitHelmColName} from './app/consts';\n// import {loadCampaigns} from './app/utils';\n\nexport const _package = new DG.Package();\n\nasync function hitAppTB(treeNode: DG.TreeViewGroup, browseView: any, name: AppName) {// TODO: DG.BrowseView\n const camps = await loadCampaigns(name, []);\n\n for (const [_, camp] of Object.entries(camps)) {\n const savePath = 'ingest' in camp ? camp.ingest.query : camp.savePath;\n if (!savePath || await grok.dapi.files.exists(savePath) === false)\n continue;\n const node = treeNode.item(camp.name);\n node.onSelected.subscribe(async (_) => {\n try {\n const df = await grok.dapi.files.readCsv(savePath);\n if (!df)\n return;\n const semtypeInfo = camp.columnSemTypes;\n if (semtypeInfo) {\n for (const [colName, semType] of Object.entries(semtypeInfo)) {\n const col = df.columns.byName(colName);\n if (col) {\n col.semType = semType;\n if (semType === DG.SEMTYPE.MACROMOLECULE && colName === PeptiHitHelmColName) {\n col.setTag('units', 'helm');\n col.setTag('.alphabetIsMultichar', 'true');\n col.setTag('cell.renderer', 'helm');\n }\n }\n }\n }\n const tv = DG.TableView.create(df, false);\n browseView.preview = tv;\n const layout = camp.layout;\n if (layout)\n tv.loadLayout(DG.ViewLayout.fromViewState(layout));\n } catch (e) {\n console.error(e);\n }\n });\n }\n}\n\n//input: dynamic treeNode\n//input: view browseView\nexport async function hitTriageAppTreeBrowser(treeNode: DG.TreeViewGroup, browseView: any) {// TODO: DG.BrowseView\n await hitAppTB(treeNode, browseView, 'Hit Triage');\n}\n\n//input: dynamic treeNode\n//input: view browseView\nexport async function hitDesignAppTreeBrowser(treeNode: DG.TreeViewGroup, browseView: any) {// TODO: DG.BrowseView\n await hitAppTB(treeNode, browseView, 'Hit Design');\n}\n\n//input: dynamic treeNode\n//input: view browseView\nexport async function peptiHitAppTreeBrowser(treeNode: DG.TreeViewGroup, browseView: any) {// TODO: DG.BrowseView\n await hitAppTB(treeNode, browseView, 'PeptiHit');\n}\n\n//tags: app\n//name: Hit Triage\n//output: view v\nexport async function hitTriageApp(): Promise<DG.ViewBase> {\n const c = grok.functions.getCurrentCall();\n return new HitTriageApp(c).multiView;\n}\n\n//tags: app\n//name: Hit Design\n//meta.icon: images/icons/hit-design-icon.png\n//output: view v\nexport async function hitDesignApp(): Promise<DG.ViewBase> {\n const c = grok.functions.getCurrentCall();\n return new HitDesignApp(c).multiView;\n}\n\n//tags: app\n//name: PeptiHit\n//meta.icon: images/icons/pepti-hit-icon.png\n//output: view v\nexport async function peptiHitApp(): Promise<DG.ViewBase> {\n const c = grok.functions.getCurrentCall();\n await grok.functions.call('Bio:initBio', {});\n return new PeptiHitApp(c).multiView;\n}\n\n//name: Demo Molecules 100\n//tags: HitTriageDataSource\n//output: dataframe result\nexport async function demoFileIngest(): Promise<DG.DataFrame> {\n const df = grok.data.demo.molecules(100);\n df.name = '100 Molecules';\n return df;\n}\n\n//name: Demo Molecules 5000\n//tags: HitTriageDataSource\n//output: dataframe result\nexport async function demoFileIngest1(): Promise<DG.DataFrame> {\n const df = grok.data.demo.molecules(5000);\n df.name = '5000 Molecules';\n return df;\n}\n\n//name: Demo Molecules variable\n//input: int numberOfMolecules [Molecules count]\n//tags: HitTriageDataSource\n//output: dataframe result\nexport async function demoFileIngest2(numberOfMolecules: number): Promise<DG.DataFrame> {\n const df = grok.data.demo.molecules(numberOfMolecules);\n df.name = 'Variable Molecules number';\n return df;\n}\n\n//name: Demo File Submit\n//tags: HitTriageSubmitFunction\n//input: dataframe df [Dataframe]\n//input: string molecules [Molecules column name]\nexport async function demoFileSubmit(df: DG.DataFrame, molecules: string): Promise<void> {\n grok.shell.info(df.rowCount);\n grok.shell.info(molecules);\n}\n\n// //name: Gasteiger Partial Charges\n// //top-menu: Chem | Gasteiger\n// //tags: HitTriageFunction\n// //input: dataframe table [Input data table] {caption: Table}\n// //input: column molecules {caption: Molecules; type: categorical; semType: Molecule}\n// //input: int contours = 4 {caption: Contours;}\n// //output: dataframe result\n// export async function gasteigerPartialCharges(\n// table: DG.DataFrame, molecules: DG.Column, contours: number = 4): Promise<DG.DataFrame> {\n// const newColName = table.columns.getUnusedName('Gasteiger Partial Charges');\n// const newCol = table.columns.addNew(newColName, 'string');\n// newCol.semType = 'customGasteigerPNG';\n// for (let i = 0; i < molecules.length; i++) {\n// const mol = molecules.get(i);\n// if (mol === null)\n// continue;\n// const p = {mol, contours: contours};\n// const res = await grok.functions.call('Chem:ChemistryGasteigerPartialCharges', p);\n// newCol.set(i, res);\n// }\n// return table;\n// }\n\n//name: gasteigerRenderer\n//tags: cellRenderer\n//meta.cellType: customGasteigerPNG\n//meta.columnTags: quality=customGasteigerPNG\n//output: grid_cell_renderer result\nexport function gasteigerCellRenderer(): GasteigerPngRenderer {\n return new GasteigerPngRenderer();\n}\n"],"names":["doc","document","win","window","docEle","documentElement","createElement","bind","div","table","tbody","tr","isArray","Array","ArrayPrototype","prototype","concat","filter","indexOf","map","push","slice","some","splice","idRe","classRe","htmlRe","tagRe","find","selector","context","value","isFragment","nodeType","isDocument","isElement","test","getElementsByClassName","replace","getElementsByTagName","querySelectorAll","Cash","isCash","eles","isString","ctx","getElementById","parseHTML","cash","isFunction","this","ready","length","i","l","init","fn","isWindow","isUndefined","undefined","isNull","isNumeric","isNaN","parseFloat","isFinite","isPlainObject","proto","Object","getPrototypeOf","each","arr","callback","_reverse","call","keys","key","extend","sources","_i","arguments","deep","shift","target","source","constructor","Symbol","empty","ele","firstChild","removeChild","plugins","splitValuesRe","getSplitValues","str","match","computeStyle","prop","isVariable","style","getComputedStyle","getPropertyValue","computeStyleInt","parseInt","getExtraSpace","xAxis","toggleClass","cls","force","classes","isForce","c","classList","add","remove","toggle","addClass","removeAttr","attr","attrs","a","removeAttribute","value_1","getAttribute","setAttribute","removeClass","hasClass","contains","get","index","Number","eq","first","last","text","textContent","join","defaultDisplay","isHidden","matches","getCompareFunction","comparator","is","filtered","collection","compare","detach","parentNode","fragmentRe","singleTagRe","containers","td","th","thead","tfoot","html","RegExp","$1","fragment","container","innerHTML","childNodes","pluck","until","plucked","isCallback","val_1","apply","val_2","getValue","multiple","options","option","selected","disabled","unique","item","self","has","not","val","isSelect","checkableRe","type","eleValue_1","String","checked","guid","children","parent","child","closest","$parent","siblings","HTMLCDATARe","scriptTypeRe","scriptAttributes","insertSelectors","selectors","anchors","inverse","left","inside","reverseLoop1","reverseLoop2","reverseLoop3","si","ti","ai","anchor","targetFinal","indexFinal","evaluate","insertBefore","nodeName","replaceChild","nextSibling","node","script_1","head","evalScripts","ownerDocument","insertElement","cloneNode","after","append","hasScript","appendTo","wrapInner","$ele","contents","wrapAll","before","structure","wrapper","firstElementChild","wrap","insertAfter","prepend","prependTo","tagName","contentDocument","content","next","_all","_until","nextAll","nextUntil","parents","parentsUntil","prev","prevAll","prevUntil","clone","offsetParent","start","end","dashAlphaRe","camelCase","letter","toUpperCase","cb","setTimeout","readyState","addEventListener","unwrap","replaceWith","offset","rect","getBoundingClientRect","top","pageYOffset","pageXOffset","position","isFixed","doc_1","body","parentOffset","propMap","class","contenteditable","for","readonly","maxlength","tabindex","colspan","rowspan","usemap","removeProp","cssVariableRe","isCSSVariable","prefixedProps","vendorsPrefixes","numericProps","animationIterationCount","columnCount","flexGrow","flexShrink","fontWeight","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","opacity","order","orphans","widows","zIndex","getSuffixedValue","attempt","arg","_a","css","isVariable_1","propCC","propUC","split","p","getPrefixedProp","setProperty","JSONStringRe","getData","dataset","JSON","parse","getDocumentDimension","dimension","Math","max","data","name","datas","stringify","setData","outer","includeMargins","propLC","toLowerCase","valueNumber","boxSizing","displayProperty","hidden","display","getDefaultDisplay","hide","show","eventsNamespace","eventsFocus","focus","blur","eventsHover","mouseenter","mouseleave","eventsMouseRe","getEventNameBubbling","parseEventName","eventName","parts","sort","getEventsCache","hasNamespaces","ns1","ns2","ns","removeEvent","namespaces","cache","sel","removeEventListener","trigger","event","nameOriginal","name_1","createEvent","initEvent","namespace","___ot","___td","isEventFocus","dispatchEvent","off","eventFullName","_this","replaceAll","on","_one","isEventHover","finalCallback","stopImmediatePropagation","relatedTarget","thisArg","defineProperty","configurable","returnValue","preventDefault","stopPropagation","eventCache","addEvent","one","queryEncodeCRLFRe","skippableRe","serialize","query","elements","encodeURIComponent","queryEncode","module","exports","___CSS_LOADER_EXPORT___","id","cssWithMappingToString","list","toString","needLayer","modules","media","dedupe","supports","layer","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","sourceMapping","stylesInDOM","getIndexByIdentifier","identifier","result","modulesToDom","idCountMap","identifiers","base","count","indexByIdentifier","obj","sourceMap","references","updater","addElementStyle","byIndex","api","domAPI","update","newObj","lastIdentifiers","newList","newLastIdentifiers","_index","memo","insert","styleTarget","querySelector","HTMLIFrameElement","e","getTarget","Error","appendChild","element","setAttributes","attributes","styleElement","nonce","insertStyleElement","styleTagTransform","removeStyleElement","styleSheet","cssText","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","d","definition","o","enumerable","hasOwnProperty","r","toStringTag","nc","grok","DG","ui","CampaignIdKey","HitDesignCampaignIdKey","CampaignTableName","CampaignJsonName","HitTriageDataSourceTag","HitTriageSubmitTag","HitSelectionColName","TileCategoriesColName","HitDesignMolColName","PeptiHitHelmColName","ViDColName","ViDColFormat","HTScriptPrefix","HTQueryPrefix","ComputeQueryMolColName","i18n","funcTypeNames","script","function","HDCampaignsGroupingLSKey","CampaignGroupingType","locals","toFormatedDateString","getFullYear","getMonth","getDate","modifyUrl","title","url","location","href","history","replaceState","Title","Url","addBreadCrumbsToRibbons","view","firstPath","secondPath","handler","breadcrumbs","sub","onPathClick","subscribe","path","unsubscribe","popRibbonPannels","viewNameRoot","v","ribbonMenu","root","parentElement","ribbons","getRibbonPanels","pop","setRibbonPanels","checkRibbonsHaveSubmit","reduce","cur","from","joinQueryResults","df","molColName","qRes","rowCount","col","resOriginalCol","meta","detectSemanticTypes","columns","bySemType","MOLECULE","newColNames","names","loadCampaigns","appName","deletedCampaigns","campaignFolders","_package","files","f","campaignNamesMap","folder","campaignJson","readAsText","authorUserId","permissions","checkViewPermissions","checkPermissions","authorId","groupIdList","userId","current","userGroupId","group","dapiGroups","groups","groupId","personal","user","getUser","members","memberGroup","checkEditPermissions","edit","Set","getGroupingKey","grouping","campaign","Template","template","templateName","Status","status","CampaignFieldTypes","STRING","FLOAT","Boolean","BOOL","Date","DATE_TIME","Molecule","chemFunctionsDialog","app","onOk","onCancel","dialog","computeFunctions","allFunctions","functions","inputs","propertyType","forEach","func","args","compute","tf","package","scripts","s","ts","queries","q","useDescriptors","descriptors","enabled","host","descriptorItems","descriptorsGroup","descriptorsTree","createTreeGroup","treeNode","res","enableCheckBox","preselectedDescriptors","groupName","descriptor","includes","console","error","descriptorsName","funcNamesMap","tabControlArgs","funcInputsMap","calculatedFunctions","funcCall","prepare","keyName","editor","buildEditor","condensed","marginLeft","removeProperty","friendlyName","input","property","fireChanged","tc","onOkProxy","externals","filteredFuncs","entries","_","startsWith","inputName","inputVal","log","onTabChanged","currentPane","header","overflow","width","minWidth","panes","pane","functionCheck","bool","onValueChanged","setTooltip","onOK","okProxy","rxjs","ItemsGrid","properties","items","onItemChanged","Subject","onAddingItemChanged","onItemAdded","onItemRemoved","removeButtonTooltip","addButtonTooltip","allowAdd","allowRemove","assign","_root","gridTemplateColumns","alignItems","gap","_items","render","addItem","notify","removeItem","removeAtIndex","removed","removeAllItems","_b","_c","_d","_e","horizontalInputNames","label","caption","customLabels","editors","getItemDiv","newEditor","newItemFunction","isAdding","inputsMap","lastInput","customInputs","forProperty","validator","validators","addValidator","hideLabel","onChanged","fieldName","companionButton","newItem","pName","delete","addOptions","color","el","hasErrors","getLayoutInput","dataFileProp","fromOptions","dataFileInput","layout","layoutViewState","contentString","readAsString","fromJson","viewState","getLayout","getLayoutViewState","createTemplateAccordeon","dataSourceFunctionMap","availableTemplates","file","availableTemplateKeys","tn","t","availableSubmitFunctions","tags","submitFunctionsMap","submitFunctionInput","choice","nullable","layoutInput","errorDiv","keyErrorDiv","templateNameInput","string","borderBottom","templateKeyInput","funcDialogRes","funcInput","combinedSourceNames","dataSourceFunctionInput","ingestTypeInput","fieldsEditor","getCampaignFieldEditors","form","fieldsDiv","buttonsDiv","buttonsContainerDiv","cancelPromise","Promise","resolve","cancelButton","promise","createTemplateButton","submitFunction","out","campaignFields","getFields","dataSourceType","funcName","splitFunc","scriptId","scriptNameParts","queryName","queryNameParts","submit","fName","queryFunctionName","writeAsText","info","preset","props","choices","itemsGrid","Name","Type","Required","required","maxWidth","addingItem","fieldsContainer","HitBaseView","super","onActivated","onReset","process","deleteCampaign","campaignId","u2","panels","tools","vert","horz","appHeader","icon","iconPath","description","learnMoreUrl","runAsync","_arguments","generator","P","reject","fulfilled","step","rejected","done","then","defaultPermissions","defaultGroupsIds","PermissionsDialog","editGroupsInput","userGroups","marginBottom","viewGroupsInput","getDialogContent","viewGroups","editGroups","editSet","viewSet","InfoView","readmePath","webRoot","dataSourceFunctionsMap","windows","showHelp","help","checkCampaign","presetTemplate","continueCampaignsHeader","createNewCampaignHeader","campaignAccordionDiv","templatesDiv","campaignsTable","getCampaignsTable","startNewCampaign","resetBaseUrl","containerDiv","templateInputDiv","templates","onTemmplateChange","templatesInput","newCampaignAccordeon","getNewCampaignAccordeon","className","createNewtemplateButton","createNewTemplate","campId","search","urlParams","URLSearchParams","exists","setBaseUrl","setTemplate","filters","ingest","deleteCampaignIcon","canEdit","campaignsInfo","values","setCampaign","createDate","filteredRowCount","campaignName","campaignDetailsDiv","fileDf","onFileChange","dfInput","innerText","fileInputDiv","onDataFunctionChange","getEditor","funcEditorDiv","functionInputDiv","dataInputsDiv","campaignProps","field","semtype","semType","campaignPropsObject","campaignPropsForm","funcCallInputs","startCampaignButton","camp","dataFrame","_fileInputType","saveCampaign","newTemplateAccordeon","newView","curView","parentCall","addView","URL","baseUrl","pathname","parentView","close","SubmitView","getSummary","submitParams","submitFn","filteredDf","fromCsv","toCsv","filteredRowsOnly","molecules","HitAppBase","_appName","appN","isJoining","hasEditPermission","funcs","setCanEdit","urlObj","origin","getFilterType","colName","SUBSTRUCTURE","BOOL_COLUMNS","CATEGORICAL","HISTOGRAM","download","onlyFiltered","fromColumns","toList","click","getNewCampaignName","folderName","templateKey","templateCampaigns","postFixes","unionDataframes","df1","df2","df1MolCol","it","convert","Notation","Unknown","Smiles","df2MolCol","addNew","rows","set","getNewVid","vidCol","maxId","vid","num","substring","fill","calculateColumns","resultMap","pg","create","molCol","isNone","newVal","tablePropName","colPropName","scriptName","scriptParts","sn","language","getUnusedName","queryParts","queryId","qn","listPropName","molList","resDf","HitTriageApp","infoView","_infoView","_filterViewName","_filterDescriptions","_pickViewPromise","multiView","viewFactories","tabs","currentView","onCurrentViewChanged","currentPickViewId","_campaignId","_campaign","presetFilters","ingestProps","_pickView","closeTable","readCsv","columnSemTypes","byName","columnTypes","convertTo","_molColName","_dfName","_campaignFilters","pickV","pickView","_submitView","filterSettings","getFilterView","fileInputType","resolvePromise","addNewBool","calculateRibbon","oldDescriptors","oldFunctions","oldScripts","oldQueries","newDescriptors","newComputeObj","uncalculatedDescriptors","uncalculatedFunctions","oldFunc","every","uncalculatedScripts","oldScript","uncalculatedQueries","oldQuery","externalFuncs","externalScripts","externalQueries","submitButton","dialogContent","dlg","addButton","permissionsButton","hasSubmit","_onAdded","fromViewState","loadLayout","onFilterChanged","getOptions","look","trim","trueCount","enrichedDf","campaignPrefix","campaignNameInput","saveCampaignDialog","colTypeMap","csvDf","newLayout","saveLayout","warning","newHitDesignCampaignAccordeon","peptiHit","pepCol","MACROMOLECULE","units","setTag","SMILES","stages","vIdCol","newHitDesignTemplateAccordeon","hasNameError","hasKeyError","availableTemplateNames","onTemplateNameChanged","offsetLeft","offsetWidth","borderTop","onTemplateKeyChange","dummyTemplate","tileCategoriesEditor","getTileCategoryEditor","detailsDiv","stagesHeader","computeHeader","HitDesignInfoView","currentSorting","getAppHeader","contentDiv","tableRoot","sortIcon","menu","popup","localStorage","setItem","setLocalStorageValue","sortingHeader","x","y","offsetTop","fontSize","endsWith","selectedTemplate","templateChangeFlag","cloneTemplateButton","copy","deleteTempleteButton","prevValue","grouppingMode","getItem","None","grouppedCampaigns","campaigns","groupedCampaigns","getGroupedCampaigns","existingStatuses","deleteAndShareCampaignIcons","deleteIcon","shareIcon","numCols","row","curRow","setState","expanded","startRow","endRow","addPane","onclick","newRow","insertRow","newCell","insertCell","colSpan","processGroupingTable","HitDesignSubmitView","statusInput","statusSuggestionsMenu","clear","similarStatuses","xOffset","yOffset","offsetHeight","getStatus","getTilesViewDialog","getTableView","tilesViewerSketchStateString","tilesViewerFormSketch","sketchState","elementStates","elementState","viewerSettings","column","elState","tileOpts","lanesColumnName","lanes","tv","modal","addViewer","TILE_VIEWER","opts","setOptions","copyViewersLook","stageEditorDialog","closeViewer","stageEditor","setStages","viewChangeSub","closeSub","onClose","stringState","showModal","getButton","operators","HitDesignApp","version","an","infoViewConstructor","_designViewName","_filePath","mainView","_initViewChangeSub","subs","currentDesignViewId","_designView","st","stageCol","removedStages","stageSet","uniqueStages","dfLen","stageCats","categories","stageIndexes","getRawData","stage","fileLoc","savePath","changeColumnType","designV","designView","getDesignView","designViewName","cacheDuplicateVIDs","_duplicateVidCache","colVersion","valueCounts","Uint32Array","indexes","subarray","duplicateVidCache","performSingleCellCalculations","newValueIdx","newValue","computeObj","calcDf","canonicalSmiles","fromStrings","fs","warn","scriptFunc","queryFunc","valueList","calculateSingleCellValues","fireValuesChanged","initDesignViewRibbons","onRemoveSub","onViewRemoved","getComputeDialog","newFunctions","newScripts","newQueries","grid","addNewRowButton","tilesButton","ribbonButtons","unshift","rg","saveBtnIdx","findIndex","isNew","m","addTableView","cell","onRowsAdded","pipe","colVal","lastAddedCell","onContextMenu","viewer","GRID","tableView","tableColumn","isTableCell","idx","cellIndex","tableRowIndex","cellValue","resetLayout","onCellValueEdited","gc","newVid","foundMatch","canonicals","cv","canonicalNewValue","onCellRender","backColor","setAlpha","getCategoricalColor","getFolderPath","campaignIndex","toLocaleDateString","date","drawMolecule","editIcon","folderPath","newPathInput","labelElement","saveButton","newPath","checkFolder","pathDiv","link","getPathEditor","sketchStateString","campaignPath","prevCamp","prevCampDf","GasteigerPngRenderer","cellType","defaultHeight","defaultWidth","g","w","h","gridCell","_cellStyle","pngString","img","Image","src","onload","drawImage","PeptiHitInfoView","PeptiHitApp","_helmColName","helmColName","seqCol","nonlinear","mol","helmCol","hitAppTB","browseView","camps","onSelected","semtypeInfo","preview","hitTriageAppTreeBrowser","hitDesignAppTreeBrowser","peptiHitAppTreeBrowser","hitTriageApp","getCurrentCall","hitDesignApp","peptiHitApp","demoFileIngest","demo","demoFileIngest1","demoFileIngest2","numberOfMolecules","demoFileSubmit","gasteigerCellRenderer"],"sourceRoot":""}