/**
* System info module
*/
define([
'jquery',
'app/init',
'app/util',
'app/map/util'
], ($, Init, Util, MapUtil) => {
'use strict';
let config = {
// module info
modulePosition: 2,
moduleName: 'systemInfo',
// system info module
moduleTypeClass: 'pf-system-info-module', // class for this module
// headline toolbar
moduleHeadlineIconClass: 'pf-module-icon-button', // class for toolbar icons in the head
// breadcrumb
constellationLinkClass: 'pf-system-info-constellation', // class for "constellation" name
regionLinkClass: 'pf-system-info-region', // class for "region" name
typeLinkClass: 'pf-system-info-type', // class for "type" name
urlLinkClass: 'pf-system-info-url', // class for "url" copy link
// info col/table
systemInfoSectionClass: 'pf-system-info-section', // class for system info section
systemInfoTableClass: 'pf-module-table', // class for system info table
systemInfoNameClass: 'pf-system-info-name', // class for "name" information element
systemInfoEffectClass: 'pf-system-info-effect', // class for "effect" information element
systemInfoPlanetsClass: 'pf-system-info-planets', // class for "planets" information element
systemInfoStatusLabelClass: 'pf-system-info-status-label', // class for "status" information element
systemInfoStatusAttributeName: 'data-status', // attribute name for status label
systemInfoWormholeClass: 'pf-system-info-wormhole-', // class prefix for static wormhole element
// description field
descriptionSectionClass: 'pf-system-description-section', // class for system description section
descriptionAreaClass: 'pf-system-info-description-area', // class for description area
addDescriptionButtonClass: 'pf-system-info-description-button', // class for "add description" button
descriptionTextareaElementClass: 'pf-system-info-description', // class for description textarea element (Summernote)
// sovereignty col/table
systemSovSectionClass: 'pf-system-sov-section', // class for system sov. section
systemSovTableClass: 'pf-module-table', // class for system sov. table
systemSovFwContestedRowClass: 'pf-system-sov-fw-contested-row', // class for "contested" sov. table row
systemSovFwOccupationRowClass: 'pf-system-sov-fw-occupation-row', // class for "-occupation" sov. table row
systemSovFwContestedClass: 'pf-system-sov-fw-contested',
systemSovFwPercentageClass: 'pf-system-sov-fw-percentage',
systemSovFwOccupationClass: 'pf-system-sov-fw-occupation',
systemSovFwOccupationImageClass: 'pf-system-sov-fw-occupation-image',
systemSovFwStatusIconClass: 'pf-system-sov-fw-status-icon',
// fonts
fontTriglivianClass: 'pf-triglivian', // class for "Triglivian" names (e.g. Abyssal systems)
// Summernote
defaultBgColor: '#e2ce48'
};
// max character length for system description
let maxDescriptionLength = 9000;
/**
* update trigger function for this module
* compare data and update module
* @param moduleElement
* @param systemData
*/
let updateModule = (moduleElement, systemData) => {
let systemId = moduleElement.data('id');
let updated = moduleElement.data('updated');
if(
systemId === systemData.id &&
updated !== systemData.updated.updated
){
let setUpdated = true;
// created/updated tooltip --------------------------------------------------------------------------------
let nameRowElement = moduleElement.find('.' + config.systemInfoNameClass);
let tooltipData = {
created: systemData.created,
updated: systemData.updated
};
nameRowElement.addCharacterInfoTooltip( tooltipData );
// update system status -----------------------------------------------------------------------------------
let systemStatusLabelElement = moduleElement.find('.' + config.systemInfoStatusLabelClass);
let systemStatusId = parseInt( systemStatusLabelElement.attr( config.systemInfoStatusAttributeName ) );
if(systemStatusId !== systemData.status.id){
// status changed
let currentStatusClass = Util.getStatusInfoForSystem(systemStatusId, 'class');
let newStatusClass = Util.getStatusInfoForSystem(systemData.status.id, 'class');
let newStatusLabel = Util.getStatusInfoForSystem(systemData.status.id, 'label');
systemStatusLabelElement.removeClass(currentStatusClass).addClass(newStatusClass).text(newStatusLabel);
// set new status attribute
systemStatusLabelElement.attr( config.systemInfoStatusAttributeName, systemData.status.id);
}
// update description textarea ----------------------------------------------------------------------------
let descriptionTextareaElement = moduleElement.find('.' + config.descriptionTextareaElementClass);
if(descriptionTextareaElement.length){
let description = descriptionTextareaElement.html();
if(description !== systemData.description){
// description has changed
if(typeof descriptionTextareaElement.data().summernote === 'object'){
// "Summernote" editor is currently open
setUpdated = false;
}else{
// not open
let newDescription = systemData.description;
if( !Util.isValidHtml(newDescription) ){
// try to convert raw text into valid html
newDescription = newDescription.replace(/(\r\n|\n|\r)/g, '
');
newDescription = '
' + newDescription + '
'; } descriptionTextareaElement.html(newDescription); } } } // update faction warfare rows ---------------------------------------------------------------------------- let fwContestedRow = moduleElement.find('.' + config.systemSovFwContestedRowClass); let fwOccupationRow = moduleElement.find('.' + config.systemSovFwOccupationRowClass); if(systemData.factionWar){ let contested = String(Util.getObjVal(systemData.factionWar, 'contested') || ''); let percentage = parseInt(Util.getObjVal(systemData.factionWar, 'victoryPercentage')) || 0; let occupierFaction = Util.getObjVal(systemData.factionWar, 'occupierFaction'); let statusColor = 'red'; if(occupierFaction){ // system is "occupied" by hostile "occupierFaction" (stable) // -> hide percent statusColor = '#d9534f'; percentage += '%'; }else if('uncontested' === contested){ // system is "uncontested" and owned by default ownerFaction (stable) // -> hide percent statusColor = '#4f9e4f'; percentage = 'stable'; }else if('contested' === contested){ // system is "contested", 0%-99% percentage statusColor = '#e28a0d'; percentage += '%'; }else if( 'vulnerable' === contested || 'captured' === contested ){ // system is "vulnerable", 100% percentage // -> "captured" state is might be the same?! statusColor = '#d747d6'; percentage = '100%'; } fwContestedRow.find('.' + config.systemSovFwStatusIconClass)[0].style.setProperty('--color', statusColor); fwContestedRow.find('.' + config.systemSovFwContestedClass).text(contested); fwContestedRow.find('.' + config.systemSovFwPercentageClass).text(percentage); fwContestedRow.show(); let occupierFactionImage = Util.eveImageUrl('alliance', (occupierFaction ? occupierFaction.id : 0), 64); let occupierFactionName = occupierFaction ? occupierFaction.name : ''; fwOccupationRow.find('.' + config.systemSovFwOccupationImageClass)[0].style.setProperty('--bg-image', 'url(\'' + occupierFactionImage + '\')'); fwOccupationRow.find('.' + config.systemSovFwOccupationClass).text(occupierFactionName); if(occupierFaction){ fwOccupationRow.show(); } }else{ fwContestedRow.hide(); fwOccupationRow.hide(); } if(setUpdated){ moduleElement.data('updated', systemData.updated.updated); } } moduleElement.find('.' + config.descriptionAreaClass).hideLoadingAnimation(); moduleElement.find('.' + config.systemSovSectionClass + ' .' + Util.config.dynamicAreaClass).hideLoadingAnimation(); }; /** * @param pages * @param systemData */ let getThirdPartySystemLinks = (pages, systemData) => { let urls = {}; let isWormhole = MapUtil.getSystemTypeInfo(Util.getObjVal(systemData, 'type.id'), 'name') === 'w-space'; let systemName = Util.getObjVal(systemData, 'name') || ''; let regionName = Util.getObjVal(systemData, 'region.name') || ''; let validUrls = 0; for(let i = 0; i < pages.length; i++){ let url = false; let domain = Util.getObjVal(Init, 'url.' + pages[i]); if(domain || pages[i] === 'eve'){ switch(pages[i]){ case 'eve': url = 'https://client'; // fake url break; case 'dotlan': let systemNameTemp = systemName.replace(/ /g, '_'); let regionNameTemp = regionName.replace(/ /g, '_'); if(isWormhole){ url = domain + '/system/' + systemNameTemp; }else{ url = domain + '/map/' + regionNameTemp + '/' + systemNameTemp; } break; case 'eveeye': if(!isWormhole){ url = domain + '/?m=' + encodeURIComponent(regionName) + '&s=' + encodeURIComponent(systemName); url += '&t=eswkc&o=thera,con_svc,node_sov,sub_sec,sector_fac,tag_mk'; } break; case 'anoik': if(isWormhole){ url = domain + '/systems/' + systemName; } break; } if(url){ let urlObj = new URL(url); urls[++validUrls + '_url'] = { page: pages[i], domain: urlObj.hostname, url: url }; } } } return urls; }; /** * get module element * @param parentElement * @param mapId * @param systemData */ let getModule = (parentElement, mapId, systemData) => { let moduleElement = $('