MsaPfvManagerFactory.ts 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import {
  2. AbstractPfvManager,
  3. PfvManagerFactoryConfigInterface,
  4. PfvManagerInterface,
  5. PfvManagerFactoryInterface
  6. } from "../PfvManagerFactoryInterface";
  7. import {
  8. RcsbFvAdditionalConfig,
  9. RcsbFvModulePublicInterface
  10. } from "@rcsb/rcsb-saguaro-app/build/dist/RcsbFvWeb/RcsbFvModule/RcsbFvModuleInterface";
  11. import {TagDelimiter} from "@rcsb/rcsb-saguaro-app";
  12. import {
  13. AlignmentRequestContextType
  14. } from "@rcsb/rcsb-saguaro-app/build/dist/RcsbFvWeb/RcsbFvFactories/RcsbFvTrackFactory/TrackFactoryImpl/AlignmentTrackFactory";
  15. import {AlignmentResponse, TargetAlignment} from "@rcsb/rcsb-api-tools/build/RcsbGraphQL/Types/Borrego/GqlTypes";
  16. import {MsaRowTitleComponent} from "./MsaPfvComponents/MsaRowTitleComponent";
  17. import {MsaRowMarkComponent} from "./MsaPfvComponents/MsaRowMarkComponent";
  18. import {
  19. PolymerEntityInstanceInterface
  20. } from "@rcsb/rcsb-saguaro-app/build/dist/RcsbCollectTools/DataCollectors/PolymerEntityInstancesCollector";
  21. import {DataContainer} from "../../../../Utils/DataContainer";
  22. import {MsaUiSortComponent} from "./MsaPfvComponents/MsaUiSortComponent";
  23. import {ActionMethods} from "@rcsb/rcsb-saguaro-app/build/dist/RcsbFvUI/Helper/ActionMethods";
  24. import {MsaUiSequenceAlignmentDownload} from "./MsaPfvComponents/MsaUiSequenceAlignmentDownload";
  25. import {MsaUiStructureDownload} from "./MsaPfvComponents/MsaUiStructureDownload";
  26. export interface MsaPfvManagerInterface<T extends any[]> {
  27. id:string;
  28. alignmentResponseContainer: DataContainer<AlignmentResponse>;
  29. pfvArgs: T;
  30. buildMsaAlignmentFv(...args:[string, ...T, RcsbFvAdditionalConfig & ActionMethods.FvChangeConfigInterface]): Promise<RcsbFvModulePublicInterface>;
  31. }
  32. type MsaPfvManagerInterType<T extends any[]> = MsaPfvManagerInterface<T> & PfvManagerFactoryConfigInterface<{context: {id:string};}>
  33. export class MsaPfvManagerFactory<T extends any[]> implements PfvManagerFactoryInterface<{id:string},{context: {id:string};}> {
  34. getPfvManager(config: MsaPfvManagerInterType<T>): PfvManagerInterface {
  35. return new MsaPfvManager(config);
  36. }
  37. }
  38. type AlignmentDataType = {
  39. pdb:{entryId:string;entityId:string;}|{entryId:string;instanceId:string;},
  40. targetAlignment: TargetAlignment;
  41. who: "user"|"auto";
  42. };
  43. class MsaPfvManager<T extends any[]> extends AbstractPfvManager<{id:string},{context: {id:string} & Partial<PolymerEntityInstanceInterface>;}>{
  44. private readonly config:MsaPfvManagerInterType<T>;
  45. private module:RcsbFvModulePublicInterface;
  46. constructor(config:MsaPfvManagerInterType<T>) {
  47. super(config);
  48. this.config = config;
  49. }
  50. async create(): Promise<RcsbFvModulePublicInterface | undefined> {
  51. const args: [string, ...T, RcsbFvAdditionalConfig & ActionMethods.FvChangeConfigInterface] = [this.rcsbFvDivId, ...this.config.pfvArgs, {
  52. ... this.additionalConfig,
  53. boardConfig: this.boardConfigContainer.get(),
  54. externalTrackBuilder:{
  55. filterAlignments: (data: { alignments: AlignmentResponse; rcsbContext?: Partial<PolymerEntityInstanceInterface> }) => {
  56. const visAlignment = this.config.alignmentResponseContainer?.get()?.target_alignment
  57. ?.filter(ta=>ta?.target_id && this.config.stateManager.assemblyModelSate.getMap()?.has(ta.target_id));
  58. const otherAlignment = data.alignments.target_alignment
  59. ?.filter(ta=>ta?.target_id && !this.config.stateManager.assemblyModelSate.getMap()?.has(ta.target_id));
  60. return new Promise(resolve => resolve({
  61. ...data.alignments,
  62. target_alignment: (visAlignment ?? []).concat(otherAlignment ?? [])
  63. }));
  64. }
  65. },
  66. trackConfigModifier: {
  67. alignment: (alignmentContext: AlignmentRequestContextType, targetAlignment: TargetAlignment) => new Promise((resolve)=>{
  68. const alignmentMod = {
  69. rowMark:{
  70. externalRowMark: {
  71. component:MsaRowMarkComponent,
  72. props:{
  73. rowRef:TagDelimiter.parseEntityOrInstance(targetAlignment.target_id!),
  74. stateManager: this.stateManager
  75. }
  76. },
  77. clickCallback:() => this.loadAlignment(alignmentContext,targetAlignment)
  78. },
  79. externalRowTitle: {
  80. rowTitleComponent:MsaRowTitleComponent,
  81. rowTitleAdditionalProps:{
  82. alignmentContext,
  83. targetAlignment,
  84. stateManager: this.stateManager,
  85. titleClick: ()=> this.loadAlignment(alignmentContext,targetAlignment)
  86. }
  87. },
  88. metadata:{
  89. targetId:targetAlignment.target_id
  90. }
  91. };
  92. if(this.additionalConfig?.trackConfigModifier?.alignment)
  93. this.additionalConfig.trackConfigModifier.alignment(alignmentContext, targetAlignment).then((rc)=>{
  94. resolve({
  95. ...rc,
  96. ...alignmentMod
  97. });
  98. });
  99. else
  100. resolve(alignmentMod);
  101. })
  102. },
  103. beforeChangeCallback: () => {
  104. this.config.pfvChangeCallback({context:{id:this.config.id}});
  105. },
  106. externalUiComponents: this.additionalConfig?.externalUiComponents?.replace ? {
  107. replace: this.additionalConfig?.externalUiComponents?.replace
  108. } : {
  109. add: [{
  110. component: MsaUiSortComponent,
  111. props: {
  112. rcsbFvContainer: this.rcsbFvContainer,
  113. stateManager: this.stateManager
  114. }
  115. },{
  116. component: MsaUiSequenceAlignmentDownload,
  117. props:{
  118. rcsbFvContainer: this.rcsbFvContainer,
  119. stateManager: this.stateManager
  120. }
  121. },{
  122. component: MsaUiStructureDownload,
  123. props: {
  124. stateManager: this.stateManager
  125. }
  126. }]}
  127. }];
  128. this.module = await this.config.buildMsaAlignmentFv(...args);
  129. this.rcsbFvContainer.set(this.module);
  130. await this.readyStateLoad();
  131. return this.module;
  132. }
  133. private async readyStateLoad(): Promise<void> {
  134. const alignments: AlignmentResponse = await this.rcsbFvContainer.get()!.getAlignmentResponse();
  135. if(alignments.target_alignment && alignments.target_alignment.length > 0 && typeof alignments.target_alignment[0]?.target_id === "string"){
  136. this.loadAlignment({queryId:this.config.id}, alignments.target_alignment[0], "auto");
  137. }
  138. }
  139. private loadAlignment(alignmentContext: AlignmentRequestContextType, targetAlignment: TargetAlignment, who: "user"|"auto" = "user"):void {
  140. if(typeof targetAlignment.target_id === "string") {
  141. this.stateManager.next<"model-change",AlignmentDataType>({
  142. type:"model-change",
  143. view:"1d-view",
  144. data:{
  145. pdb:TagDelimiter.parseEntityOrInstance(targetAlignment.target_id),
  146. targetAlignment,
  147. who
  148. }
  149. });
  150. }
  151. }
  152. }