{"version":3,"file":"app-65612662.981ca8458d389c9a476a.bundle.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEA;AACA;;AAOA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAAA;;AAIA;AACA;AAQA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AAUA;AApBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;AAAA;AACA;AACA;AACA;AACA;AACA;AAQA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AAAA;AAAA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAGA;AAEA;AAEA;AAEA;;AAGA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAnRA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;AChDA;AACA;AACA;AACA","sources":["webpack://latinera/./sources/components/private/card.js","webpack://latinera/./sources/components/private/card.html"],"sourcesContent":["// Define the view-model for the \"card\" component\n\n// Import library modules\nimport {\n bindable,\n bindingMode,\n computedFrom,\n inject\n} from \"aurelia-framework\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { runMode as defaultRunMode } from \"parameters/environment\";\n\n// Import service modules\nimport CardService from \"services/card\";\nimport EventService from \"services/event\";\nimport UserService from \"services/user\";\n\n// Define internal parameters\nconst subMenuAutocloseTimeoutMs = 10000;\nconst eventsData = [\n { name: \"analysisActivityDataChanged\", filterBy: \"analysisKey\" },\n { name: \"sessionClosing\" }\n];\n\n\n// Export the \"Card\" class\n@inject(\n CardService,\n EventService,\n UserService\n)\nexport class Card {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) cardData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) cardMetaData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) cardsData = [];\n @bindable({ defaultBindingMode: bindingMode.toView }) cardsMetaData = [];\n @bindable({ defaultBindingMode: bindingMode.toView }) activityKey = \"\";\n @bindable({ defaultBindingMode: bindingMode.toView }) analysisKey = \"\";\n @bindable({ defaultBindingMode: bindingMode.toView }) cardIndex = -1;\n @bindable({ defaultBindingMode: bindingMode.toView }) displayMode = \"full\";\n @bindable({ defaultBindingMode: bindingMode.toView }) runMode = defaultRunMode;\n @bindable({ defaultBindingMode: bindingMode.toView }) isEnabled = true;\n\n // Local attributes\n previousCardData = null;\n previousCardMetaData = null;\n nextCardData = null;\n nextCardMetaData = null;\n isSubMenuVisible = false;\n i18nParams = i18nParams;\n\n constructor(\n cardService,\n eventService,\n userService\n ) {\n this.cardService = cardService;\n this.eventService = eventService;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n async bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"card\",\n entityKey: this.cardKey,\n eventService: this.eventService,\n eventsData\n });\n\n // Load previous/next cards' data\n this.computePreviousAndNextCardsData();\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n\n if (this.subMenuAutocloseTimeoutId) {\n clearTimeout(this.subMenuAutocloseTimeoutId);\n }\n }\n\n\n // Getter and setter methods\n @computedFrom(\"cardData.key\")\n get cardKey() {\n const { key: cardKey = \"\" } = this.cardData || {};\n return cardKey;\n }\n @computedFrom(\"cardMetaData.isModified\")\n get cardDataModified() {\n const { isModified: cardDataModified = false } = this.cardMetaData || {};\n return cardDataModified;\n }\n @computedFrom(\"cardMetaData.isValid\")\n get cardDataValid() {\n const { isValid: cardDataValid = true } = this.cardMetaData || {};\n return cardDataValid;\n }\n\n @computedFrom(\"cardData.inElement\")\n get inElementData() {\n const { inElement: inElementData = null } = this.cardData || {};\n return inElementData;\n }\n\n @computedFrom(\"cardData.outElement\")\n get outElementData() {\n const { outElement: outElementData = null } = this.cardData || {};\n return outElementData;\n }\n @computedFrom(\"cardMetaData.outElement\")\n get outElementMetaData() {\n const { outElement: outElementMetaData = null } = this.cardMetaData || {};\n return outElementMetaData;\n }\n\n @computedFrom(\"cardData.lemmas\")\n get lemmasData() {\n const { lemmas: lemmasData = [] } = this.cardData || {};\n return lemmasData;\n }\n @computedFrom(\"lemmasData\")\n get lemmasKeys() {\n return this.lemmasData\n .map(lemmaData => lemmaData || {})\n .map(({ key: lemmaKey = \"\" }) => lemmaKey);\n }\n @computedFrom(\"cardMetaData.lemmas\")\n get lemmasMetaData() {\n const { lemmas: lemmasMetaData = [] } = this.cardMetaData || {};\n return lemmasMetaData;\n }\n @computedFrom(\"lemmasMetaData\")\n get savedLemmasKeys() {\n return this.lemmasMetaData\n .map(lemmaMetaData => lemmaMetaData || {})\n .map(({ savedKey: savedLemmaKey = \"\" }) => savedLemmaKey);\n }\n\n @computedFrom(\"cardData.inInflectors\")\n get inInflectorsData() {\n const { inInflectors: inInflectorsData = [] } = this.cardData || {};\n return inInflectorsData;\n }\n @computedFrom(\"inInflectorsData\")\n get inInflectorsKeys() {\n return this.inInflectorsData\n .map(inInflectorData => inInflectorData || {})\n .map(({ key: inInflectorKey = \"\" }) => inInflectorKey);\n }\n @computedFrom(\"cardMetaData.inInflectors\")\n get inInflectorsMetaData() {\n const { inInflectors: inInflectorsMetaData = [] } = this.cardMetaData || {};\n return inInflectorsMetaData;\n }\n @computedFrom(\"inInflectorsMetaData\")\n get savedInInflectorsKeys() {\n return this.inInflectorsMetaData\n .map(inInflectorMetaData => inInflectorMetaData || {})\n .map(({ savedKey: savedInInflectorKey = \"\" }) => savedInInflectorKey);\n }\n\n @computedFrom(\"cardData.definitions\")\n get definitionsData() {\n const { definitions: definitionsData = [] } = this.cardData || {};\n return definitionsData;\n }\n @computedFrom(\"definitionsData\")\n get definitionsKeys() {\n return this.definitionsData\n .map(definitionData => definitionData || {})\n .map(({ key: definitionKey = \"\" }) => definitionKey);\n }\n @computedFrom(\"cardMetaData.definitions\")\n get definitionsMetaData() {\n const { definitions: definitionsMetaData = [] } = this.cardMetaData || {};\n return definitionsMetaData;\n }\n @computedFrom(\"definitionsMetaData\")\n get savedDefinitionsKeys() {\n return this.definitionsMetaData\n .map(definitionMetaData => definitionMetaData || {})\n .map(({ savedKey: savedDefinitionKey = \"\" }) => savedDefinitionKey);\n }\n\n @computedFrom(\"cardMetaData.canMergePreviousCard\")\n get canMergePreviousCard() {\n const { canMergePreviousCard = false } = this.cardMetaData || {};\n return canMergePreviousCard;\n }\n @computedFrom(\"cardMetaData.canMergeNextCard\")\n get canMergeNextCard() {\n const { canMergeNextCard = false } = this.cardMetaData || {};\n return canMergeNextCard;\n }\n @computedFrom(\"cardMetaData.canSplitCard\")\n get canSplitCard() {\n const { canSplitCard = false } = this.cardMetaData || {};\n return canSplitCard;\n }\n\n @computedFrom(\"canMergePreviousCard\", \"canMergeNextCard\", \"canSplitCard\")\n get showTopMenu() {\n return this.canMergePreviousCard || \n this.canMergeNextCard ||\n this.canSplitCard;\n }\n\n @computedFrom(\"isEnabled\")\n get dragAndDropHandleClasses() {\n return this.isEnabled ? \n 'uk-link-heading ps-draggable-handle' : 'uk-link-disabled';\n }\n\n\n // Core methods\n async computePreviousAndNextCardsData() {\n const cardsCount = this.cardsData.length;\n this.previousCardData = this.cardIndex === 0 ? null : \n this.cardsData.at(this.cardIndex-1) || null;\n this.previousCardMetaData = this.cardIndex === 0 ? null : \n this.cardsMetaData.at(this.cardIndex-1) || null;\n this.nextCardData = this.cardIndex === cardsCount ? null : \n this.cardsData.at(this.cardIndex+1) || null;\n this.nextCardMetaData = this.cardIndex === cardsCount ? null : \n this.cardsMetaData.at(this.cardIndex+1) || null;\n }\n\n async mergeCards(cardIndex1, cardIndex2) {\n this.isSubMenuVisible = false;\n if (this.subMenuAutocloseTimeoutId) {\n clearTimeout(this.subMenuAutocloseTimeoutId);\n }\n this.publishMergeCardsEvent({ \n cardIndex1,\n cardIndex2\n });\n }\n\n async splitCard(cardIndex) {\n this.isSubMenuVisible = false;\n if (this.subMenuAutocloseTimeoutId) {\n clearTimeout(this.subMenuAutocloseTimeoutId);\n }\n this.publishSplitCardEvent({ cardIndex });\n }\n\n toggleSubMenuVisibility() {\n this.isSubMenuVisible = !this.isSubMenuVisible;\n this.userService.conditionallyExtendSession(); // do not await\n if (this.isSubMenuVisible) {\n this.subMenuAutocloseTimeoutId = setTimeout(() => {\n console.info(`Auto-closing sub-menu for card \"${this.cardKey}\" ` +\n `after time-out expired`);\n this.isSubMenuVisible = false;\n }, subMenuAutocloseTimeoutMs);\n } else {\n if (this.subMenuAutocloseTimeoutId) {\n clearTimeout(this.subMenuAutocloseTimeoutId);\n }\n }\n }\n\n\n // Event filters\n filterEventByAnalysisKey({ analysisKey = \"\" }) {\n return analysisKey === this.analysisKey;\n }\n\n // Event handlers\n handleAnalysisActivityDataChangedEvent() {\n this.computePreviousAndNextCardsData();\n }\n\n handleSessionClosingEvent() {\n this.isSubMenuVisible = false;\n }\n\n\n\n // Event publishers\n publishMergeCardsEvent(eventData) {\n this.eventService.publish({\n eventName: \"mergeCards\",\n eventData: {\n activityKey: this.activityKey,\n analysisKey: this.analysisKey,\n ...(eventData || {})\n }\n });\n }\n\n publishSplitCardEvent(eventData) {\n this.eventService.publish({\n eventName: \"splitCard\",\n eventData: {\n activityKey: this.activityKey,\n analysisKey: this.analysisKey,\n ...(eventData || {})\n }\n });\n }\n\n}\n","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;"],"names":[],"sourceRoot":""}