@rcsb/rcsb-saguaro-3d
Version:
RCSB Molstar/Saguaro Web App
145 lines (144 loc) • 10.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AssemblyPfvManagerFactory = void 0;
const tslib_1 = require("tslib");
const jsx_runtime_1 = require("react/jsx-runtime");
const rxjs_1 = require("rxjs");
const RcsbFvConstants_1 = require("../../../../RcsbFvConstants/RcsbFvConstants");
const ChainDisplayComponent_1 = require("./AssemblyPfvComponents/ChainDisplayComponent");
const GqlTypes_1 = require("@rcsb/rcsb-api-tools/lib/RcsbGraphQL/Types/Borrego/GqlTypes");
const DataContainer_1 = require("../../../../Utils/DataContainer");
const PfvManagerFactoryInterface_1 = require("../PfvManagerFactoryInterface");
const RcsbFvBuilder_1 = require("@rcsb/rcsb-saguaro-app/lib/RcsbFvWeb/RcsbFvBuilder");
const RcsbFvUI_1 = require("@rcsb/rcsb-saguaro-app/lib/RcsbExport/RcsbFvUI");
const app_1 = require("@rcsb/rcsb-saguaro-app/lib/app");
const TagDelimiter_1 = require("@rcsb/rcsb-api-tools/lib/RcsbUtils/TagDelimiter");
class AssemblyPfvManagerFactory {
getPfvManager(config) {
return new AssemblyPfvManager(config);
}
}
exports.AssemblyPfvManagerFactory = AssemblyPfvManagerFactory;
class AssemblyPfvManager extends PfvManagerFactoryInterface_1.AbstractPfvManager {
constructor(config) {
super(config);
this.OPERATOR_DROPDOWN_TITLE = "Symmetry Partner";
this.module = undefined;
this.instanceSequenceConfig = config.instanceSequenceConfig;
this.useOperatorsFlag = config.useOperatorsFlag;
}
create(config) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
var _a, _b;
const onChangeCallback = new Map();
const assemblyInstances = new Map();
this.stateManager.assemblyModelSate.forEach((v, k) => {
assemblyInstances.set(v.entryId, new Set(v.chains.map(d => d.label)));
onChangeCallback.set(v.entryId, (x) => {
this.stateManager.assemblyModelSate.set({ entryId: v.entryId, labelAsymId: x.asymId, modelId: k });
rxjs_1.asyncScheduler.schedule(() => {
this.pfvChangeCallback(undefined);
}, 100);
});
});
const operatorNameContainer = new DataContainer_1.DataContainer(config.defaultOperatorName);
if (this.stateManager.assemblyModelSate.get("entryId") != null) {
this.module = yield (0, RcsbFvBuilder_1.buildInstanceSequenceFv)(this.rcsbFvDivId, RcsbFvConstants_1.RcsbFvDOMConstants.SELECT_BUTTON_PFV_ID, this.stateManager.assemblyModelSate.getString("entryId"), Object.assign(Object.assign({}, this.instanceSequenceConfig), { defaultValue: (_a = config.defaultAsymId) !== null && _a !== void 0 ? _a : (_b = this.instanceSequenceConfig) === null || _b === void 0 ? void 0 : _b.defaultValue, onChangeCallback: (context, module) => {
var _a, _b, _c;
(_a = onChangeCallback.get(this.stateManager.assemblyModelSate.getString("entryId"))) === null || _a === void 0 ? void 0 : _a(context);
const entryMap = Array.from(this.stateManager.assemblyModelSate.entries()).find((e) => (e[1].entryId === context.entryId));
const operator = entryMap && entryMap[0] ? getOperator(this.stateManager.assemblyModelSate.getMap().get(entryMap[0]), config.defaultAsymId, operatorNameContainer.get()) : undefined;
this.stateManager.pfvContext.set(Object.assign(Object.assign({}, context), { operator }));
(_c = (_b = this.instanceSequenceConfig) === null || _b === void 0 ? void 0 : _b.onChangeCallback) === null || _c === void 0 ? void 0 : _c.call(_b, context, module);
}, beforeChangeCallback: (x) => {
var _a, _b, _c, _d;
this.stateManager.assemblyModelSate.set({ entryId: x.entryId, labelAsymId: x.asymId });
const entryMap = Array.from(this.stateManager.assemblyModelSate.entries()).find((e) => (e[1].entryId === x.entryId));
if (!entryMap) {
throw `Error: no modelId was found for ${x.entryId}`;
}
const operator = getOperator(this.stateManager.assemblyModelSate.getMap().get(entryMap[0]), config.defaultAsymId, operatorNameContainer.get());
this.addOperatorButton(operator === null || operator === void 0 ? void 0 : operator.name);
this.stateManager.assemblyModelSate.setOperator(x.asymId, operator === null || operator === void 0 ? void 0 : operator.name);
operatorNameContainer.set(undefined);
if (typeof ((_a = this.additionalConfig) === null || _a === void 0 ? void 0 : _a.operatorChangeCallback) === "function" && this.stateManager.assemblyModelSate.getOperator()) {
this.additionalConfig.operatorChangeCallback(this.stateManager.assemblyModelSate.getOperator());
}
if (((_d = (_c = (_b = this.stateManager.assemblyModelSate.getChainInfo()) === null || _b === void 0 ? void 0 : _b.operators) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0) > 1)
return {
operatorIds: operator === null || operator === void 0 ? void 0 : operator.ids
};
}, filterInstances: assemblyInstances.get(this.stateManager.assemblyModelSate.getString("entryId")), selectButtonOptionProps: (props) => ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex' }, children: [(0, jsx_runtime_1.jsx)(ChainDisplayComponent_1.ChainDisplayComponent, { stateManager: this.stateManager, label: props.data.label }), props.children] })) }), Object.assign(Object.assign({}, this.additionalConfig), { boardConfig: this.boardConfigContainer.get(), externalTrackBuilder: {
filterFeatures: this.filterFeatures.bind(this)
} }));
}
return this.module;
});
}
addOperatorButton(operatorName) {
var _a;
const currentChainInfo = this.stateManager.assemblyModelSate.getChainInfo();
if (this.useOperatorsFlag && currentChainInfo && currentChainInfo.operators.length > 1) {
this.stateManager.assemblyModelSate.setOperator(undefined, operatorName);
RcsbFvUI_1.RcsbFvUI.addSelectButton(this.rcsbFvDivId, RcsbFvConstants_1.RcsbFvDOMConstants.SELECT_BUTTON_PFV_ID, currentChainInfo.operators.map(op => ({
label: `${op.ids.join("-")} (${op.name})`,
optId: op.name,
onChange: () => tslib_1.__awaiter(this, void 0, void 0, function* () {
var _a, _b, _c;
(_b = (_a = this.module) === null || _a === void 0 ? void 0 : _a.getFv()) === null || _b === void 0 ? void 0 : _b.reset();
this.stateManager.assemblyModelSate.set({ operator: op });
yield this.create({
defaultAsymId: (_c = this.stateManager.assemblyModelSate.getChainInfo()) === null || _c === void 0 ? void 0 : _c.label,
defaultOperatorName: op.name
});
})
})), {
defaultValue: (_a = this.stateManager.assemblyModelSate.getOperator()) === null || _a === void 0 ? void 0 : _a.name,
dropdownTitle: this.OPERATOR_DROPDOWN_TITLE
});
}
else {
RcsbFvUI_1.RcsbFvUI.clearSelectButton(this.rcsbFvDivId, RcsbFvConstants_1.RcsbFvDOMConstants.SELECT_BUTTON_PFV_ID);
}
}
filterFeatures(data) {
return new Promise((resolve) => tslib_1.__awaiter(this, void 0, void 0, function* () {
let annotations = [];
(yield Promise.all(data.annotations.map((ann) => tslib_1.__awaiter(this, void 0, void 0, function* () {
var _a, _b, _c, _d;
if (ann.source == GqlTypes_1.AnnotationReference.PdbInterface && ann.target_identifiers && ((_a = data.rcsbContext) === null || _a === void 0 ? void 0 : _a.asymId)) {
const interfaceId = TagDelimiter_1.TagDelimiter.getInterfaceId(ann.target_identifiers);
const interfaceToInstance = yield app_1.RcsbRequestContextManager.getInterfaceToInstance(interfaceId);
if (typeof ((_b = ann.target_identifiers) === null || _b === void 0 ? void 0 : _b.interface_partner_index) === "number" && ann.target_identifiers.assembly_id === this.stateManager.assemblyModelSate.getString("assemblyId") && Array.isArray(interfaceToInstance.getOperatorIds(interfaceId))) {
const operatorIds = (_c = interfaceToInstance.getOperatorIds(interfaceId)) === null || _c === void 0 ? void 0 : _c[ann.target_identifiers.interface_partner_index];
if (ann.features && this.stateManager.assemblyModelSate.getOperator() && (operatorIds === null || operatorIds === void 0 ? void 0 : operatorIds.map(o => o.join("|")).includes(this.stateManager.assemblyModelSate.getOperator().ids.join("|")))) {
ann.features = ann.features.filter(f => (f && f.type == app_1.FeatureType.BurialFraction));
if (ann.features.length > 0)
return ann;
}
}
}
else if (ann.source == GqlTypes_1.AnnotationReference.PdbInstance && ann.features) {
ann.features = (_d = ann.features) === null || _d === void 0 ? void 0 : _d.filter(f => ((f === null || f === void 0 ? void 0 : f.type) !== GqlTypes_1.FeaturesType.Asa));
return ann;
}
else if (ann.source != GqlTypes_1.AnnotationReference.PdbInterface) {
return ann;
}
})))).forEach((value, index, array) => {
if (value)
annotations = annotations.concat(value);
});
resolve(annotations);
}));
}
}
function getOperator(entryInfo, defaultAsymId, defaultOperatorName) {
const chainInfo = defaultAsymId ? entryInfo.chains.find(ch => ch.label === defaultAsymId) : entryInfo.chains[0];
if (chainInfo) {
const operatorInfo = defaultOperatorName ? chainInfo.operators.find(op => op.name === defaultOperatorName) : chainInfo.operators[0];
if (operatorInfo)
return operatorInfo;
}
return undefined;
}