{"version":3,"file":"../../lizmap/www/assets/js/attributeTable.js","mappings":"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","sources":["webpack://assets/./src/legacy/attributeTable.js"],"sourcesContent":["/**\n * @module legacy/attributeTable.js\n * @name AttributeTable\n * @copyright 2023 3Liz\n * @license MPL-2.0\n */\n\nvar lizAttributeTable = function() {\n\n lizMap.events.on({\n 'uicreated':function(){\n\n // Attributes\n var config = lizMap.config;\n var layers = lizMap.layers;\n var hasAttributeTableLayers = false;\n var attributeLayersActive = false;\n var attributeLayersDic = {};\n var wfsTypenameMap = {};\n var mediaLinkPrefix = lizUrls.media + '?' + new URLSearchParams(lizUrls.params);\n var startupFilter = false;\n if( !( typeof lizLayerFilter === 'undefined' ) ){\n startupFilter = true;\n lizMap.lizmapLayerFilterActive = true;\n }\n\n var limitDataToBbox = false;\n if ( 'limitDataToBbox' in config.options && config.options.limitDataToBbox == 'True'){\n limitDataToBbox = true;\n }\n\n if (!('attributeLayers' in config))\n return -1;\n\n // Verifying WFS layers\n var featureTypes = lizMap.getVectorLayerFeatureTypes();\n if (featureTypes.length == 0 )\n return -1;\n\n $('body').css('cursor', 'wait');\n\n // Sort attribute layers as given by creation order in Lizmap plugin\n var attributeLayersSorted = [];\n\n for (var lname in config.attributeLayers) {\n var al = config.attributeLayers[lname];\n al.name = lname;\n attributeLayersSorted.push(al);\n }\n attributeLayersSorted.sort(function(a, b) {\n return a.order - b.order;\n });\n\n for (var i = 0; i < attributeLayersSorted.length; i++) {\n var al = attributeLayersSorted[i];\n attributeLayersDic[lizMap.cleanName(al.name)] = al.name;\n }\n\n for(const featureType of featureTypes) {\n // typename\n var typeName = featureType.getElementsByTagName('Name')[0].textContent;\n // layername\n var layername = lizMap.getNameByTypeName( typeName );\n if ( !layername || layername == undefined ) {\n continue;\n }\n // Check layername\n // if layer is in a restricted group, the layer wil not be available\n if (!lizMap.mainLizmap.state.layersAndGroupsCollection.layerNames.includes(layername)) {\n continue;\n }\n // lizmap internal js cleaned name\n var cleanName = lizMap.cleanName(layername);\n // lizmap config file layer name\n var configLayerName = attributeLayersDic[cleanName];\n // Add matching between wfs type name and clean name\n wfsTypenameMap[cleanName] = typeName;\n\n if (configLayerName in config.attributeLayers) {\n hasAttributeTableLayers = true;\n\n // Get layers config information\n var atConfig = config.attributeLayers[configLayerName];\n\n // Add some properties to the lizMap.config\n config.layers[configLayerName]['features'] = {};\n config.layers[configLayerName]['featureCrs'] = null;\n config.layers[configLayerName]['featuresFullSet'] = false;\n config.layers[configLayerName]['selectedFeatures'] = [];\n config.layers[configLayerName]['highlightedFeature'] = null;\n config.layers[configLayerName]['filteredFeatures'] = [];\n config.layers[configLayerName]['request_params'] = {\n 'filter' : null,\n 'exp_filter': null,\n 'selection': null\n };\n\n // Get existing filter if exists (via permalink)\n const layer = lizMap.mainLizmap.state.layersAndGroupsCollection.getLayerByName(layername);\n\n if (layer.isFiltered) {\n config.layers[configLayerName]['request_params']['filter'] = layer.expressionFilter;\n\n // Send signal so that getFeatureInfo takes it into account\n lizMap.events.triggerEvent(\"layerFilterParamChanged\",\n {\n 'featureType': attributeLayersDic[cleanName],\n 'filter': config.layers[configLayerName]['request_params']['filter'],\n 'updateDrawing': false\n }\n );\n }\n\n // Add geometryType if not already present (backward compatibility)\n if( typeof config.layers[configLayerName]['geometryType'] === 'undefined' ) {\n config.layers[configLayerName]['geometryType'] = 'unknown';\n }\n\n config.layers[configLayerName]['crs'] = featureType.getElementsByTagName('SRS')[0].textContent;\n\n if (config.layers[configLayerName]['crs'] !== \"\"){\n lizMap.loadProjDefinition(config.layers[configLayerName].crs, function (aProj) {\n new OpenLayers.Projection(config.layers[configLayerName].crs);\n });\n }\n\n var bbox = featureType.getElementsByTagName('LatLongBoundingBox')[0];\n atConfig['bbox'] = [\n parseFloat(bbox.getAttribute('minx'))\n , parseFloat(bbox.getAttribute('miny'))\n , parseFloat(bbox.getAttribute('maxx'))\n , parseFloat(bbox.getAttribute('maxy'))\n ];\n }\n }\n\n if (hasAttributeTableLayers) {\n // Attribute table could be activated to get selection tool\n var hasDiplayedAttributeTable = false;\n\n // Add the list of layers in the summary table\n var tHtml = '';\n for( var idx in attributeLayersDic) {\n var cleanName = idx;\n\n // Do not add a button for the pivot tables\n if( 'pivot' in config.attributeLayers[ attributeLayersDic[ cleanName ] ]\n && config.attributeLayers[ attributeLayersDic[ cleanName ] ]['pivot'] == 'True'\n ){\n continue;\n }\n\n // Do not add a button if not asked by editor\n if( 'hideLayer' in config.attributeLayers[ attributeLayersDic[ cleanName ] ]\n && config.attributeLayers[ attributeLayersDic[ cleanName ] ]['hideLayer'] == 'True'\n ){\n continue;\n }\n\n var title = config.layers[ attributeLayersDic[ cleanName ] ][ 'title' ];\n tHtml+= '';\n tHtml+= ' ';\n tHtml+= '';\n\n hasDiplayedAttributeTable = true;\n }\n\n tHtml+= '
' + title + '
';\n if ( hasDiplayedAttributeTable ) {\n $('#attribute-layer-list').html(tHtml);\n\n // Bind click on detail buttons\n $('button.btn-open-attribute-layer')\n .click(function(){\n var cleanName = $(this).val();\n\n // Disable attribute table if limitDataToBbox and layer not visible in map\n if(limitDataToBbox){\n let layer = lizMap.mainLizmap.baseLayersMap.getLayerByName(lizMap.getLayerNameByCleanName(cleanName));\n if( layer ) {\n if(warnResolution(layer)){\n return false;\n }\n }\n }\n\n // Add Div if not already there\n const layerName = attributeLayersDic[cleanName];\n if( !$('#nav-tab-attribute-layer-' + cleanName ).length ){\n addLayerDiv(layerName);\n }\n\n const layerFilter = ( 'request_params' in config.layers[layerName] && config.layers[layerName]['request_params']['exp_filter'] ) ?\n config.layers[layerName]['request_params']['exp_filter'] : null;\n\n const tableSelector = '#attribute-layer-table-' + cleanName;\n\n // Get data and fill attribute table\n getDataAndFillAttributeTable(layerName, layerFilter, tableSelector);\n\n $('#nav-tab-attribute-layer-' + cleanName + ' a' ).tab('show');\n\n return false;\n })\n .hover(\n function(){ $(this).addClass('btn-primary'); },\n function(){ $(this).removeClass('btn-primary'); }\n );\n\n // Bind change on options checkboxes\n $('#jforms_view_attribute_layers_option_cascade_label input[name=\"cascade\"]').change(function(){\n var doCascade = $('#jforms_view_attribute_layers_option_cascade_label input[name=\"cascade\"]').prop('checked');\n // refresh filtered layers if any active\n if( lizMap.lizmapLayerFilterActive ){\n var featureType = lizMap.lizmapLayerFilterActive;\n var layerConfig = config.layers[featureType];\n if( layerConfig['filteredFeatures'] ){\n\n // Update attribute table tools\n updateAttributeTableTools( featureType );\n\n // Update layer\n var cascadeToChildren = true;\n if( !doCascade )\n cascadeToChildren = 'removeChildrenFilter';\n updateMapLayerDrawing( featureType, cascadeToChildren );\n\n }\n }\n });\n } else {\n // Hide navbar menu\n $('#mapmenu li.attributeLayers').hide();\n }\n\n // Send signal\n lizMap.events.triggerEvent(\"attributeLayersReady\",\n {'layers': attributeLayersDic}\n );\n\n // Map events\n /**\n *\n */\n function warnExtent() {\n var btitle = lizDict['attributeLayers.toolbar.btn.refresh.table.tooltip.changed'];\n btitle += ' ' + lizDict['attributeLayers.toolbar.btn.refresh.table.tooltip'];\n $('button.btn-refresh-table')\n .attr('data-original-title', btitle)\n .addClass('btn-warning')\n .tooltip()\n ;\n }\n if (limitDataToBbox) {\n lizMap.map.events.on({\n moveend: function () {\n warnExtent();\n }\n });\n }\n\n // Bind click on tabs to resize datatable tables\n $('#attributeLayers-tabs li').click(function(){\n var mycontainerId = $('#bottom-dock div.bottom-content.active div.attribute-layer-main').attr('id');\n refreshDatatableSize('#'+mycontainerId);\n });\n\n } else {\n // Hide navbar menu\n $('#mapmenu li.attributeLayers').hide();\n return -1;\n }\n $('body').css('cursor', 'auto');\n\n /**\n *\n * @param layer\n */\n function warnResolution(layer) {\n const mapResolution = lizMap.mainLizmap.baseLayersMap.getView().getResolution();\n const visibility = layer.getMaxResolution() > mapResolution && mapResolution > layer.getMinResolution();\n if( !visibility ){\n const msg = lizDict['attributeLayers.msg.layer.not.visible'];\n lizMap.addMessage( msg, 'info', true).attr('id','lizmap-attribute-message');\n return true;\n }\n return false;\n }\n\n /**\n *\n * @param layerName\n * @param filter\n * @param tableSelector\n * @param callBack\n */\n function getDataAndFillAttributeTable(layerName, filter, tableSelector, callBack){\n\n let layerConfig = lizMap.config.layers[layerName];\n const typeName = layerConfig?.shortname || layerConfig?.typename || layerConfig?.name;\n\n const wfsParams = {\n TYPENAME: typeName,\n GEOMETRYNAME: 'extent'\n };\n\n if(filter){\n wfsParams['EXP_FILTER'] = filter;\n }\n\n // Calculate bbox from map extent if needed\n if (config.options?.limitDataToBbox == 'True') {\n wfsParams['BBOX'] = lizMap.mainLizmap.map.getView().calculateExtent();\n wfsParams['SRSNAME'] = lizMap.mainLizmap.map.getView().getProjection().getCode();\n }\n\n const getFeatureRequest = lizMap.mainLizmap.wfs.getFeature(wfsParams);\n\n let fetchRequests = [getFeatureRequest];\n let namedRequests = {'getFeature': fetchRequests.length-1};\n\n\n if (!(layerConfig?.['alias'] && layerConfig?.['types'])) {\n const describeFeatureTypeRequest = lizMap.mainLizmap.wfs.describeFeatureType({\n TYPENAME: typeName\n });\n fetchRequests.push(describeFeatureTypeRequest);\n namedRequests['describeFeatureType'] = fetchRequests.length-1;\n }\n\n const allColumnsKeyValues = {};\n\n // Indexes 0 and 1 are use for getFeature and describeFeature requests\n namedRequests['keyValues'] = fetchRequests.length+0;\n let responseOrder = fetchRequests.length+0;\n for (const fieldName in lizMap.keyValueConfig?.[layerName]) {\n const fieldConf = lizMap.keyValueConfig[layerName][fieldName];\n if (fieldConf.type == 'ValueMap') {\n allColumnsKeyValues[fieldName] = fieldConf.data;\n } else {\n // Get the layer typename based on its id\n let getSourceLayer = lizMap.getLayerConfigById(fieldConf.source_layer_id);\n if( !getSourceLayer || getSourceLayer.length != 2) continue;\n const source_typename = getSourceLayer[1].typename;\n if (source_typename == undefined) {\n // The source layer is not published in WFS\n continue;\n }\n // Use an integer as a placeholder for coming fetched key/values\n allColumnsKeyValues[fieldName] = responseOrder;\n responseOrder++;\n fetchRequests.push(lizMap.mainLizmap.wfs.getFeature({\n TYPENAME: source_typename,\n PROPERTYNAME: fieldConf.code_field + ',' + fieldConf.label_field,\n // we must not use null for exp_filter but '' if no filter is active\n EXP_FILTER: fieldConf.exp_filter ? fieldConf.exp_filter : ''\n }));\n }\n }\n\n document.body.style.cursor = 'progress';\n Promise.all(fetchRequests).then(responses => {\n\n // Get every key/value from relation layers\n for (let index = namedRequests['keyValues']; index < responses.length; index++) {\n // Get column name using order placeholder defined before\n const columnName = Object.keys(allColumnsKeyValues).find(key => allColumnsKeyValues[key] === index);\n const keyField = lizMap.keyValueConfig[layerName][columnName].code_field;\n const valueField = lizMap.keyValueConfig[layerName][columnName].label_field;\n\n const keyValue = {};\n\n responses[index].features.forEach(feature => keyValue[feature.properties[keyField]] = feature.properties[valueField]);\n\n allColumnsKeyValues[columnName] = keyValue;\n\n }\n layerConfig['featureCrs'] = 'EPSG:4326';\n if (namedRequests?.['describeFeatureType']) {\n const describeFeatureTypeResponse = responses[namedRequests['describeFeatureType']];\n layerConfig['aliases'] = describeFeatureTypeResponse.aliases;\n layerConfig['types'] = describeFeatureTypeResponse.types;\n layerConfig['columns'] = describeFeatureTypeResponse.columns;\n }\n buildLayerAttributeDatatable(layerName, tableSelector, responses[0].features, layerConfig.aliases, layerConfig.types, allColumnsKeyValues, callBack);\n\n document.body.style.cursor = 'default';\n }).catch(() => {\n document.body.style.cursor = 'default';\n });\n }\n\n /**\n *\n * @param layerName\n * @param filter\n * @param tableSelector\n * @param callBack\n */\n function getDataAndRefreshAttributeTable(layerName, filter, tableSelector, callBack){\n\n const layerConfig = lizMap.config.layers[layerName];\n const typeName = layerConfig?.shortname || layerConfig?.typename || layerConfig?.name;\n\n const wfsParams = {\n TYPENAME: typeName,\n GEOMETRYNAME: 'extent'\n };\n\n if(filter){\n wfsParams['EXP_FILTER'] = filter;\n }\n\n // Calculate bbox from map extent if needed\n if (config.options?.limitDataToBbox == 'True') {\n wfsParams['BBOX'] = lizMap.mainLizmap.map.getView().calculateExtent();\n wfsParams['SRSNAME'] = lizMap.mainLizmap.map.getView().getProjection().getCode();\n }\n\n const getFeatureRequest = lizMap.mainLizmap.wfs.getFeature(wfsParams);\n Promise.all([getFeatureRequest]).then(responses => {\n refreshLayerAttributeDatatable(layerName, tableSelector, responses[0].features);\n document.body.style.cursor = 'default';\n }).catch(() => {\n document.body.style.cursor = 'default';\n });\n }\n\n /**\n *\n */\n function activateAttributeLayers() {\n attributeLayersActive = true;\n\n // Deactivate locate-menu\n if ( $('#locate-menu').is(':visible') && lizMap.checkMobile()){\n $('#toggleLocate').parent().removeClass('active');\n $('#locate-menu').toggle();\n }\n return false;\n }\n\n /**\n *\n */\n function deactivateAttributeLayers() {\n // Some actions done when deactivating attribute table\n return false;\n }\n\n /**\n *\n * @param parentLayerId\n * @param childLayerId\n */\n function getRelationInfo(parentLayerId,childLayerId){\n if( 'relations' in config && parentLayerId in config.relations) {\n var layerRelations = config.relations[parentLayerId];\n for( var lridx in layerRelations ) {\n var relation = layerRelations[lridx];\n if (relation.referencingLayer == childLayerId) {\n return relation;\n }\n }\n }\n return null;\n }\n\n /**\n *\n * @param lname\n */\n function addLayerDiv(lname) {\n // Get layer config\n var atConfig = config.attributeLayers[lname];\n var cleanName = lizMap.cleanName(lname);\n\n // Add li to the tabs\n var liHtml = '
  • ';\n liHtml+= '' + config.layers[lname]['title'] ;\n liHtml+= ' ';\n liHtml+= ''\n liHtml+= '
  • ';\n\n $('#attributeLayers-tabs').append( liHtml );\n\n // Add content div\n var html = '
    ';\n html+= '
    ';\n\n if( !config.layers[lname]['selectedFeatures'] )\n config.layers[lname]['selectedFeatures'] = [];\n if( !config.layers[lname]['filteredFeatures'] )\n config.layers[lname]['filteredFeatures'] = [];\n\n var selClass= '';\n if( config.layers[lname]['selectedFeatures'].length == 0 )\n selClass= ' hidden';\n var filClass= '';\n if( config.layers[lname]['filteredFeatures'].length > 0 )\n filClass= ' active btn-primary';\n else\n filClass = selClass\n\n // Action bar specific to the tab\n html+= '
    ';\n\n // Search input\n html+= '
    ';\n html+= ' ';\n html+= ' ';\n html+= '
    ';\n\n // Selected searched lines button\n html+= '';\n\n // Unselect button\n html+= ' ';\n\n // 'Move selected to top' button\n html+= ' ';\n\n // Filter button : only if no filter applied at startup\n if( !startupFilter\n && ( !lizMap.lizmapLayerFilterActive || lizMap.lizmapLayerFilterActive == lname )\n ){\n html+= ' ';\n }\n\n // Invert selection\n html += ''\n\n // Detail button\n var canPopup = false\n if( config.layers[lname]\n && config.layers[lname]['popup'] == 'True'\n // We should NOT deactivate popup for non-spatial layers, as it can be very useful\n // && config.layers[lname]['geometryType'] != 'none'\n && config.layers[lname]['geometryType'] != 'unknown'\n ){\n canPopup = true;\n }\n if( canPopup ){\n html+= '';\n }\n\n // Create button\n var canCreate = false;\n if( 'editionLayers' in config && cleanName in config.editionLayers ) {\n var al = config.editionLayers[attributeLayersDic[cleanName]];\n if( al.capabilities.createFeature == \"True\" )\n canCreate = true;\n }\n if( canCreate ){\n html+= ' ';\n }\n\n // Refresh button (if limitDataToBbox is true)\n if( limitDataToBbox\n && config.layers[lname]['geometryType'] != 'none'\n && config.layers[lname]['geometryType'] != 'unknown'\n ){\n // Add button to refresh table\n html+= ' ';\n\n }\n\n // Get children content\n var childHtml = getChildrenHtmlContent( lname );\n var alc='';\n\n // Toggle children content\n if( childHtml ){\n // Add button to show/hide children tables\n html+= ' ';\n\n // Add buttons to create new children\n if( childHtml['childCreateButton'] )\n html+= childHtml['childCreateButton'];\n\n // Add buttons to link parent and children\n if( childHtml['layerLinkButton'] )\n html+= childHtml['layerLinkButton'];\n }\n\n // Export tools\n if ( 'exportLayers' in config.options && config.options.exportLayers == 'True' ) {\n html+= ' 
    ';\n html+= ' ';\n html+= '
      ';\n html+= '
    • GeoJSON
    • ';\n html+= '
    • GML
    • ';\n var exportFormats = lizMap.getVectorLayerResultFormat();\n for ( var i=0, len=exportFormats.length; i';\n }\n }\n html+= '
    ';\n html+= '
    ';\n }\n\n html+= '
    '; // attribute-layer-action-bar\n\n if( childHtml )\n alc= ' showChildren';\n html+= '
    ';\n html+= ' ';\n html+= '
    ';\n\n html+= '
    '; // attribute-layer-content\n\n // Add children content\n if( childHtml ){\n // Add children content : one tab per childlayer\n html+= '
    ';\n // Ul content\n html+= '
      ';\n for( var i in childHtml['tab-li'] ){\n var cLi = childHtml['tab-li'][i];\n html+= cLi;\n }\n html+= '
    ';\n html+= '
    ';\n // Tab content\n for( var i in childHtml['tab-content'] ){\n var cDiv = childHtml['tab-content'][i];\n html+= cDiv;\n }\n html+= '
    '; // tab-content\n html+= '
    '; // tabbable\n }\n\n html+= '
    '; // attribute-layer-main\n\n // Right panel to show info\n html+= '
    ';\n\n html+= '
    '; // 'attribute-layer-' + cleanName\n\n $('#attribute-table-container').append(html);\n\n $('#attribute-layer-' + cleanName + ' button').tooltip( {\n placement: 'bottom'\n } );\n\n $('.btn-close-attribute-tab').click(function(){\n //there are multiple elements which has .closeTab icon so close the tab whose close icon is clicked\n var tabContentId = $(this).parent().attr(\"href\");\n $(this).parent().parent().remove(); //remove li of tab\n $('#attributeLayers-tabs a:last').tab('show'); // Select first tab\n $(tabContentId).remove(); //remove respective tab content\n });\n\n if( childHtml ){\n\n // Bind adjust child columns when children tab visibility change\n $('#attribute-layer-' + cleanName + ' div.attribute-layer-child-content ul li a[data-toggle=\"tab\"]').on('shown.bs.tab', function (e) {\n var target = $(e.target).attr(\"href\") // activated tab\n var dtable = $(target).find('table.dataTable');\n dtable.DataTable().tables().columns.adjust();\n });\n }\n\n if(limitDataToBbox){\n $('#attribute-layer-'+ cleanName + ' button.btn-refresh-table')\n .click(function(){\n // Reset button tooltip & style\n $(this)\n .attr('data-original-title', lizDict['attributeLayers.toolbar.btn.refresh.table.tooltip'])\n .removeClass('btn-warning');\n\n // Disable if the layer is not visible\n let layer = lizMap.mainLizmap.baseLayersMap.getLayerByName(lizMap.getLayerNameByCleanName(cleanName));\n if( layer ) {\n if(warnResolution(layer)){\n return false;\n }\n }else{\n // do nothing if no layer found\n return false;\n }\n\n // Refresh table\n const tableSelector = '#attribute-layer-table-'+cleanName;\n $('#attribute-layer-main-'+cleanName+' > div.attribute-layer-content').hide();\n\n getDataAndFillAttributeTable(lname, null, tableSelector, () => {\n $('#attribute-layer-main-' + cleanName + ' > div.attribute-layer-content').show();\n refreshDatatableSize('#attribute-layer-main-' + cleanName);\n });\n\n return false;\n })\n .hover(\n function(){ $(this).addClass('btn-primary'); },\n function(){ $(this).removeClass('btn-primary'); }\n );\n }\n\n if( childHtml ){\n $('#attribute-layer-'+ cleanName + ' button.btn-toggle-children')\n .click(function(){\n var parentDir = $(this).parents('div.attribute-layer-main');\n parentDir.find('div.attribute-layer-content').toggleClass('showChildren');\n parentDir.find('div.tabbable.attribute-layer-child-content').toggle();\n // Refresh parent table size\n refreshDatatableSize('#attribute-layer-main-'+ cleanName);\n return false;\n });\n }\n\n // Bind click on detail button\n // It just toggles the right panel visibility\n if( canPopup ){\n $('#attribute-layer-'+ cleanName + ' button.btn-detail-attributeTable')\n .click(function(){\n // Toggle\n $('#attribute-layer-main-' + cleanName).toggleClass('reduced', !$(this).hasClass('btn-primary'));\n $('#attribute-table-panel-' + cleanName).toggleClass('visible', !$(this).hasClass('btn-primary'));\n $(this).toggleClass('btn-primary');\n\n refreshDatatableSize('#attribute-layer-main-'+ cleanName);\n return false;\n });\n }\n\n // Bind click on \"unselect all\" button\n $('#attribute-layer-'+ cleanName + ' button.btn-unselect-attributeTable')\n .click(function(){\n var aName = attributeLayersDic[ $(this).val() ];\n // Send signal\n lizMap.events.triggerEvent(\"layerfeatureunselectall\",\n { 'featureType': aName, 'updateDrawing': true}\n );\n return false;\n })\n .hover(\n function(){ $(this).addClass('btn-primary'); },\n function(){ $(this).removeClass('btn-primary'); }\n );\n\n // Bind click on \"move selected to top\" button\n $('#attribute-layer-'+ cleanName + ' button.btn-moveselectedtotop-attributeTable')\n .click(function(){\n var aTable = '#attribute-layer-table-' + $(this).val();\n var dTable = $( aTable ).DataTable();\n var previousOrder = dTable.order();\n previousOrder = $.grep(previousOrder, function(o){\n return o[0] != 0;\n });\n var selectedOrder = [ [0, 'asc'] ];\n var newOrder = selectedOrder.concat(previousOrder);\n dTable.order( newOrder ).draw();\n\n // Scroll to top\n $(aTable).parents('div.attribute-layer-content').scrollTop(0);\n\n return false;\n })\n .hover(\n function(){ $(this).addClass('btn-primary'); },\n function(){ $(this).removeClass('btn-primary'); }\n );\n\n\n // Bind click on filter button\n if( !startupFilter ){\n $('#attribute-layer-'+ cleanName + ' button.btn-filter-attributeTable')\n .click(function(){\n var aName = attributeLayersDic[ $(this).val() ];\n if( $(this).hasClass('btn-primary') ) {\n lizMap.events.triggerEvent( \"layerfeatureremovefilter\",\n { 'featureType': aName}\n );\n lizMap.lizmapLayerFilterActive = null;\n } else {\n lizMap.events.triggerEvent(\"layerfeaturefilterselected\",\n { 'featureType': aName}\n );\n lizMap.lizmapLayerFilterActive = aName;\n }\n return false;\n });\n }\n\n // Bind click on export buttons\n $('#attribute-layer-'+ cleanName + ' a.btn-export-attributeTable')\n .click(function(){\n var eFormat = $(this).text();\n if( eFormat == 'GML' )\n eFormat = 'GML3';\n var cleanName = $(this).parents('div.attribute-layer-main:first').attr('id').replace('attribute-layer-main-', '');\n var eName = attributeLayersDic[ cleanName ];\n lizMap.exportVectorLayer( eName, eFormat, limitDataToBbox );\n $(this).blur();\n return false;\n });\n\n // Bind click on createFeature button\n $('#attribute-layer-'+ cleanName + ' button.btn-createFeature-attributeTable')\n .click(function(){\n if ( $('#attribute-layer-'+ cleanName + ' tr.active').length != 1) {\n $('#lizmap-edition-message').remove();\n lizMap.addMessage( lizDict['attributeLayers.toolbar.btn.data.createChildFeature.no.actived'], 'info', true).attr('id','lizmap-edition-message');\n return false;\n }\n var parentFeatId = document.querySelector('#attribute-layer-'+ cleanName + ' tr.active lizmap-feature-toolbar').fid;\n var parentLayerName = attributeLayersDic[ cleanName ];\n var parentLayerId = config.layers[parentLayerName]['id'];\n var aName = attributeLayersDic[ $(this).val() ];\n lizMap.getLayerFeature(parentLayerName, parentFeatId, function(parentFeat) {\n var lid = config.layers[aName]['id'];\n lizMap.launchEdition( lid, null, {layerId:parentLayerId,feature:parentFeat});\n });\n return false;\n })\n .hover(\n function(){ $(this).addClass('btn-primary'); },\n function(){ $(this).removeClass('btn-primary'); }\n );\n\n // Bind click on createFeature button via dropDown\n $('#attribute-layer-'+ cleanName + ' a.btn-createFeature-attributeTable')\n .click(function(){\n if ( $('#attribute-layer-'+ cleanName + ' tr.active').length != 1) {\n $('#lizmap-edition-message').remove();\n lizMap.addMessage( lizDict['attributeLayers.toolbar.btn.data.createChildFeature.no.actived'], 'info', true).attr('id','lizmap-edition-message');\n return false;\n }\n var parentFeatId = document.querySelector('#attribute-layer-'+ cleanName + ' tr.active lizmap-feature-toolbar').fid;\n var parentLayerName = attributeLayersDic[ cleanName ];\n var parentLayerId = config.layers[parentLayerName]['id'];\n var selectedValue = $(this).attr('href').replace('#', '');\n var aName = attributeLayersDic[ selectedValue ];\n lizMap.getLayerFeature(parentLayerName, parentFeatId, function(parentFeat) {\n var lid = config.layers[aName]['id'];\n lizMap.launchEdition( lid, null, {layerId:parentLayerId,feature:parentFeat});\n $(this).blur();\n });\n return false;\n })\n .hover(\n function(){ $(this).addClass('btn-primary'); },\n function(){ $(this).removeClass('btn-primary'); }\n );\n\n // Bind click on linkFeatures button\n $('#attribute-layer-'+ cleanName + ' a.btn-linkFeatures-attributeTable')\n .click(function(){\n var selectedValue = $(this).attr('href').replace('#', '');\n $(this).blur();\n var cName = attributeLayersDic[ selectedValue ];\n var cId = config.layers[cName]['id'];\n var attrConfig = config.attributeLayers[cName];\n var p = [];\n var pName = attributeLayersDic[cleanName];\n var pId = config.layers[pName]['id'];\n var doQuery = false;\n\n if( 'pivot' in attrConfig\n && attrConfig['pivot'] == 'True'\n && cId in config.relations.pivot\n ){\n // Get parents info : layer id, fkey column in the pivot table for the parent, values of primary key for selected ids\n for( var parId in config.relations.pivot[cId] ){\n var par = buildLinkParameters( parId );\n if (!par)\n return false;\n par['id'] = parId;\n var parKey = config.relations.pivot[cId][parId];\n par['fkey'] = parKey;\n\n // Add parent info to the table\n p.push(par);\n\n }\n\n if( !( p.length == 2 ) )\n return false;\n\n doQuery = 'pivot';\n\n }else{\n\n var par = buildLinkParameters( pId );\n var chi = buildLinkParameters( cId );\n\n if (!par || !chi )\n return false;\n par['id'] = pId;\n // We take the primary key of the child layer (because 1:n relation )\n par['fkey'] = config.attributeLayers[cName]['primaryKey'];\n\n chi['id'] = cId;\n if( !( pId in config.relations ) )\n return false;\n for( var rp in config.relations[pId] ){\n var rpItem = config.relations[pId][rp];\n if( rpItem.referencingLayer == cId ){\n chi['fkey'] = rpItem.referencingField\n }else{\n continue;\n }\n }\n if( !('fkey' in chi ) )\n return false;\n\n p.push(par);\n p.push(chi);\n\n doQuery = '1n';\n\n }\n\n if( doQuery ){\n var service = lizUrls.edition + '?' + new URLSearchParams(lizUrls.params);\n $.post(service.replace('getFeature','linkFeatures'),{\n features1: p[0]['id'] + ':' + p[0]['fkey'] + ':' + p[0]['selected'].join(),\n features2: p[1]['id'] + ':' + p[1]['fkey'] + ':' + p[1]['selected'].join(),\n pivot: cId\n\n }, function(data){\n // Show response message\n $('#lizmap-edition-message').remove();\n lizMap.addMessage( data, 'info', true).attr('id','lizmap-edition-message');\n\n // Unselect features of parent (or child)\n // And trigger table refresh\n if( doQuery == 'pivot' ){\n lizMap.events.triggerEvent(\"layerfeatureunselectall\",\n { 'featureType': attributeLayersDic[cleanName], 'updateDrawing': true}\n );\n // Send signal saying edition has been done on pivot\n lizMap.events.triggerEvent(\"lizmapeditionfeaturecreated\",\n { 'layerId': cId}\n );\n }else{\n lizMap.events.triggerEvent(\"layerfeatureunselectall\",\n { 'featureType': cName, 'updateDrawing': true}\n );\n // Send signal saying edition has been done on pivot\n lizMap.events.triggerEvent(\"lizmapeditionfeaturemodified\",\n { 'layerId': cId}\n );\n }\n });\n }\n\n return false;\n })\n .hover(\n function(){ $(this).addClass('btn-primary'); },\n function(){ $(this).removeClass('btn-primary'); }\n );\n\n // Bind click on btn-select-searched button\n $('#attribute-layer-'+ cleanName + ' button.btn-select-searched').click(function(){\n var aName = attributeLayersDic[ $(this).val() ];\n\n // Send signal\n lizMap.events.triggerEvent(\"layerfeatureselectsearched\",\n { 'featureType': aName, 'updateDrawing': true}\n );\n return false;\n })\n .hover(\n function(){ $(this).addClass('btn-primary'); },\n function(){ $(this).removeClass('btn-primary'); }\n );\n }\n\n /**\n *\n * @param layerId\n */\n function buildLinkParameters( layerId ){\n var lp = {};\n\n // Get ids of selected feature\n var getP = lizMap.getLayerConfigById( layerId, config.attributeLayers, 'layerId' );\n if( !getP )\n return false;\n\n lp['name'] = getP[0];\n\n var idSelected = config.layers[ getP[0] ]['selectedFeatures'];\n if( !( idSelected.length > 0 ) )\n return false;\n\n // Get corresponding values of parent primary key column for these ids\n var fi = [];\n var features = config.layers[ getP[0] ]['features'];\n if ( !features || Object.keys(features).length <= 0 )\n return false;\n\n var primaryKey = getP[1]['primaryKey'];\n var intRegex = /^[0-9]+$/;\n for( var x in idSelected ) {\n var idFeat = idSelected[x];\n var afeat = features[idFeat];\n if( typeof afeat === \"undefined\" )\n continue;\n var pk = afeat.properties[primaryKey];\n if( !( intRegex.test(pk) ) )\n pk = \" '\" + pk + \"' \";\n fi.push( pk );\n }\n lp['selected'] = fi;\n\n return lp;\n }\n\n /**\n *\n * @param parentLayerName\n */\n function getChildrenHtmlContent( parentLayerName ) {\n\n var childHtml = null;\n var childDiv = [];\n var childLi = [];\n var childCreateButton = ''; var childCreateButtonItems = [];\n var layerLinkButton = ''; var layerLinkButtonItems = [];\n var lConfig = config.layers[parentLayerName];\n if ( !lConfig )\n return childHtml;\n var parentLayerId = lConfig['id'];\n if( 'relations' in config && parentLayerId in config.relations) {\n var layerRelations = config.relations[parentLayerId];\n var childCount = 0;\n var childActive = 'active';\n for( var lid in layerRelations ) {\n var relation = layerRelations[lid];\n var childLayerConfigA = lizMap.getLayerConfigById(\n relation.referencingLayer,\n config.layers,\n 'id'\n );\n if( childLayerConfigA\n && childLayerConfigA[0] in config.attributeLayers\n ){\n childCount+=1;\n if( childCount > 1)\n childActive = '';\n var childLayerConfig = childLayerConfigA[1];\n var childLayerName = childLayerConfigA[0];\n var childAttributeLayerConfig = config.attributeLayers[childLayerName];\n\n // Discard if the editor does not want this layer to be displayed in child table\n if( 'hideAsChild' in childAttributeLayerConfig && childAttributeLayerConfig['hideAsChild'] == 'True' )\n continue;\n\n // Build child table id by concatenating parent and child layer names\n var tabId = 'attribute-child-tab-' + lizMap.cleanName(parentLayerName) + '-' + lizMap.cleanName(childLayerName);\n\n // Build Div content for tab\n var cDiv = '
    ';\n var tId = 'attribute-layer-table-' + lizMap.cleanName(parentLayerName) + '-' + lizMap.cleanName(childLayerName);\n var tClass = 'attribute-table-table table table-hover table-condensed table-striped cell-border child-of-' + lizMap.cleanName(parentLayerName);\n cDiv+= ' ';\n cDiv+= ' ';\n cDiv+= '
    ';\n cDiv+= '
    ';\n childDiv.push(cDiv);\n\n // Build li content for tab\n var cLi = '
  • '+ childLayerConfig.title +'
  • ';\n childLi.push(cLi);\n\n // Add create child feature button\n var canCreateChild = false;\n if( 'editionLayers' in config ){\n var editionConfig = lizMap.getLayerConfigById(\n relation.referencingLayer,\n config.editionLayers,\n 'layerId'\n );\n if( childLayerName in config.editionLayers ) {\n var al = config.editionLayers[childLayerName];\n if( al.capabilities.createFeature == \"True\" )\n canCreateChild = true;\n }\n }\n\n if( canCreateChild ){\n // Add a button to create a new feature for this child layer\n let childButtonItem = `\n \n `;\n childCreateButtonItems.push(childButtonItem);\n\n // Link parent with the selected features of the child\n layerLinkButtonItems.push('
  • ' + childLayerConfig.title +'
  • ' );\n }\n }\n }\n\n }\n if( childLi.length ){\n if( childCreateButtonItems.length > 0 ){\n childCreateButton+= ' ';\n for( var i in childCreateButtonItems){\n const childButton = childCreateButtonItems[i];\n childCreateButton+= childButton;\n }\n childCreateButton+= '';\n }\n if( layerLinkButtonItems.length > 0 ){\n layerLinkButton+= ' 
    ';\n layerLinkButton+= ' ';\n layerLinkButton+= ' ';\n layerLinkButton+= '
    ';\n }\n childHtml = {\n 'tab-content': childDiv,\n 'tab-li': childLi,\n 'childCreateButton': childCreateButton,\n 'layerLinkButton': layerLinkButton\n } ;\n }\n return childHtml;\n }\n\n // Refresh attribute table content for all children of a given layer\n /**\n *\n * @param sourceTable\n * @param featureType\n * @param featId\n */\n function refreshChildrenLayersContent( sourceTable, featureType, featId ) {\n var feat = config.layers[featureType]['features'][featId];\n\n if(!feat)\n return false;\n var fp = feat.properties;\n\n var lConfig = config.layers[featureType];\n if ( !lConfig )\n return false;\n var parentLayerId = lConfig['id'];\n\n // Refresh recursively for direct children and other parent\n if( 'relations' in config && parentLayerId in config.relations) {\n var layerRelations = config.relations[parentLayerId];\n for (const relation of layerRelations ) {\n const childLayerConfigA = lizMap.getLayerConfigById(\n relation.referencingLayer,\n config.layers,\n 'id'\n );\n\n // Fill in attribute table for child\n // Discard if the editor does not want this layer to be displayed in child table\n if( childLayerConfigA\n && config.attributeLayers?.[childLayerConfigA[0]]?.['hideAsChild'] == 'False'\n ){\n const [childLayerName, childLayerConfig] = childLayerConfigA;\n // Generate filter\n let filter = '';\n if( relation.referencingLayer == childLayerConfig.id ){\n filter = '\"' + relation.referencingField + '\" = ' + \"'\" + fp[relation.referencedField] + \"'\";\n }\n\n // Get child table id\n const childTableSelector = sourceTable.replace(' table:first', '') + '-' + lizMap.cleanName(childLayerName);\n\n getDataAndFillAttributeTable(childLayerName, filter, childTableSelector);\n }\n }\n }\n }\n\n var lizdelay = (function(){\n var timer = 0;\n return function(callback, ms){\n clearTimeout (timer);\n timer = setTimeout(callback, ms);\n };\n })();\n\n /**\n *\n * @param aName\n * @param aTable\n * @param cFeatures\n * @param aCallback\n */\n function refreshLayerAttributeDatatable(aName, aTable, cFeatures, aCallback) {\n // Get config\n var lConfig = config.layers[aName];\n // get cleaned name\n var cleanName = lizMap.cleanName( aName );\n\n // Detect if table is parent or child\n var isChild = true;\n let parentLayerID = '';\n if (['#attribute-layer-table-', '#edition-table-'].includes(aTable.replace(cleanName, ''))){\n isChild = false;\n }else{\n let parentLayerName = '';\n if (aTable.startsWith('#attribute-layer-table-')){\n parentLayerName = aTable.replace('#attribute-layer-table-', '').split('-')[0];\n } else if (aTable.startsWith('#edition-table-')) {\n parentLayerName = aTable.replace('#edition-table-', '').split('-')[0];\n }\n\n if(parentLayerName){\n parentLayerID = config.layers[parentLayerName]['id'];\n }\n }\n\n // Hidden fields\n var hiddenFields = [];\n if( aName in config.attributeLayers\n && 'hiddenFields' in config.attributeLayers[aName]\n && config.attributeLayers[aName]['hiddenFields']\n ){\n var hf = config.attributeLayers[aName]['hiddenFields'].trim();\n hiddenFields = hf.split(/[\\s,]+/);\n }\n\n cFeatures = typeof cFeatures !== 'undefined' ? cFeatures : null;\n if( !cFeatures ){\n // features is an object, let's transform it to an array\n // XXX IE compat: Object.values is not available on IE...\n var features = config.layers[aName]['features'];\n cFeatures = Object.keys(features).map(function (key) {\n return features[key];\n });\n }\n\n if( cFeatures && cFeatures.length > 0 ){\n // Format features for datatable\n var ff = formatDatatableFeatures(\n cFeatures,\n isChild,\n hiddenFields,\n lConfig['selectedFeatures'],\n lConfig['id'],\n parentLayerID);\n var foundFeatures = ff.foundFeatures;\n var dataSet = ff.dataSet;\n\n // Datatable configuration\n if ( $.fn.dataTable.isDataTable( aTable ) ) {\n var oTable = $( aTable ).dataTable();\n oTable.fnClearTable();\n oTable.fnAddData( dataSet );\n }\n lConfig['features'] = foundFeatures;\n }\n\n if ( !cFeatures || cFeatures.length == 0 ){\n if ( $.fn.dataTable.isDataTable( aTable ) ) {\n var oTable = $( aTable ).dataTable();\n oTable.fnClearTable();\n }\n $(aTable).hide();\n\n $('#attribute-layer-'+ cleanName +' span.attribute-layer-msg').html(\n lizDict['attributeLayers.toolbar.msg.data.nodata'] + ' ' + lizDict['attributeLayers.toolbar.msg.data.extent']\n ).addClass('failure');\n } else {\n $(aTable).show();\n }\n\n if (aCallback)\n aCallback(aName,aTable);\n\n return false;\n }\n\n /**\n *\n * @param aName\n * @param aTable\n * @param cFeatures\n * @param cAliases\n * @param cTypes\n * @param allColumnsKeyValues\n * @param aCallback\n */\n function buildLayerAttributeDatatable(aName, aTable, cFeatures, cAliases, cTypes, allColumnsKeyValues, aCallback ) {\n // Get config\n var lConfig = config.layers[aName];\n\n // get cleaned name\n var cleanName = lizMap.cleanName( aName );\n\n cAliases = typeof cAliases !== 'undefined' ? cAliases : null;\n if( !cAliases ){\n cAliases = lConfig['alias'];\n }\n for( const key in cAliases){\n if(cAliases[key]==\"\"){\n cAliases[key]=key;\n }\n }\n\n // Detect if table is parent or child\n var isChild = true;\n let parentLayerID = '';\n if (['#attribute-layer-table-', '#edition-table-'].includes(aTable.replace(cleanName, ''))){\n isChild = false;\n }else{\n let parentLayerCleanName = '';\n if (aTable.startsWith('#attribute-layer-table-')){\n parentLayerCleanName = aTable.replace('#attribute-layer-table-', '').split('-')[0];\n } else if (aTable.startsWith('#edition-table-')) {\n parentLayerCleanName = aTable.replace('#edition-table-', '').split('-')[0];\n }\n\n if(parentLayerCleanName){\n const parentLayerName = lizMap.getLayerNameByCleanName(parentLayerCleanName);\n if (parentLayerName) {\n parentLayerID = config.layers[parentLayerName]['id'];\n }\n }\n }\n\n // Pivot table ?\n var isPivot = false;\n if( isChild\n && 'pivot' in config.attributeLayers[aName]\n && config.attributeLayers[aName]['pivot'] == 'True'\n ){\n isPivot = true;\n }\n\n // Hidden fields\n var hiddenFields = [];\n if( aName in config.attributeLayers\n && 'hiddenFields' in config.attributeLayers[aName]\n && config.attributeLayers[aName]['hiddenFields']\n ){\n var hf = config.attributeLayers[aName]['hiddenFields'].trim();\n hiddenFields = hf.split(/[\\s,]+/);\n }\n\n // Check edition capabilities\n var canEdit = false;\n var canDelete = false;\n if( 'editionLayers' in config && aName in config.editionLayers ) {\n var al = config.editionLayers[aName];\n if( al.capabilities.modifyAttribute == \"True\" || al.capabilities.modifyGeometry == \"True\" )\n canEdit = true;\n if( al.capabilities.deleteFeature == \"True\" )\n canDelete = true;\n }\n\n cFeatures = typeof cFeatures !== 'undefined' ? cFeatures : null;\n if( !cFeatures ){\n // features is an object, let's transform it to an array\n // XXX IE compat: Object.values is not available on IE...\n var features = config.layers[aName]['features'];\n cFeatures = Object.keys(features).map(function (key) {\n return features[key];\n });\n }\n\n var atFeatures = cFeatures;\n var dataLength = atFeatures.length;\n\n if( cFeatures && cFeatures.length > 0 ){\n // Create columns for datatable\n var cdc = createDatatableColumns(aName, atFeatures, hiddenFields, cAliases, cTypes, allColumnsKeyValues);\n var columns = cdc.columns;\n var firstDisplayedColIndex = cdc.firstDisplayedColIndex;\n\n // Format features for datatable\n var ff = formatDatatableFeatures(\n atFeatures,\n isChild,\n hiddenFields,\n lConfig['selectedFeatures'],\n lConfig['id'],\n parentLayerID\n );\n var foundFeatures = ff.foundFeatures;\n var dataSet = ff.dataSet;\n\n // Fill in the features object\n // only when necessary : object is empty or is not child or (is child and no full features list in the object)\n var refillFeatures = false;\n var dLen = lConfig['features'] ? Object.keys(lConfig['features']).length : 0;\n if( dLen == 0 ){\n refillFeatures = true;\n if( !isChild ){\n lConfig['featuresFullSet'] = true;\n }\n }\n else{\n if( isChild ){\n if( !lConfig['featuresFullSet'] ){\n refillFeatures = true;\n }\n }else{\n lConfig['featuresFullSet'] = true;\n refillFeatures = true;\n }\n }\n if( refillFeatures )\n lConfig['features'] = foundFeatures;\n\n lConfig['alias'] = cAliases;\n // Datatable configuration\n if ( $.fn.dataTable.isDataTable( aTable ) ) {\n var oTable = $( aTable ).dataTable();\n oTable.fnClearTable();\n oTable.fnAddData( dataSet );\n }\n else {\n // Search while typing in text input\n // Deactivate if too many items\n var searchWhileTyping = true;\n if( dataLength > 500000 ){\n searchWhileTyping = false;\n }\n\n var myDom = '<ipl>';\n if( searchWhileTyping ) {\n $('#attribute-layer-search-' + cleanName).on( 'keyup', function (e){\n var searchVal = this.value;\n lizdelay(function(){\n oTable.fnFilter( searchVal );\n }, 500 );\n });\n }else{\n myDom = '<ipl>';\n }\n\n $( aTable ).dataTable( {\n data: dataSet\n ,columns: columns\n ,initComplete: function(settings, json) {\n const api = new $.fn.dataTable.Api(settings);\n const tableId = api.table().node().id;\n const featureType = tableId.split('attribute-layer-table-')[1];\n\n // Trigger event telling attribute table is ready\n lizMap.events.triggerEvent(\"attributeLayerContentReady\",\n {\n 'featureType': featureType\n }\n );\n }\n ,order: [[ firstDisplayedColIndex, \"asc\" ]]\n ,language: { url:lizUrls[\"dataTableLanguage\"] }\n ,deferRender: true\n ,createdRow: function ( row, data, dataIndex ) {\n if ( $.inArray( data.DT_RowId.toString(), lConfig['selectedFeatures'] ) != -1\n ) {\n $(row).addClass('selected');\n data.lizSelected = 'a';\n }\n }\n ,dom: myDom\n ,pageLength: 50\n ,scrollY: '95%'\n ,scrollX: '100%'\n\n } );\n\n var oTable = $( aTable ).dataTable();\n\n if( !searchWhileTyping )\n $('#attribute-layer-search-' + cleanName).hide();\n\n // Bind button which clears top-left search input content\n $('#attribute-layer-search-' + cleanName).next('.clear-layer-search').click(function(){\n $('#attribute-layer-search-' + cleanName).val('').focus().keyup();\n });\n\n // Unbind previous events on page\n $( aTable ).on( 'page.dt', function() {\n // unbind previous events\n $(aTable +' tr').unbind('click');\n $(aTable +' tr td button').unbind('click');\n });\n\n // Bind events when drawing table\n $( aTable ).on( 'draw.dt', function() {\n\n $(aTable +' tr').unbind('click');\n $(aTable +' tr td button').unbind('click');\n\n // Bind event when users click anywhere on the table line to highlight\n bindTableLineClick(aName, aTable);\n\n // Refresh size\n var mycontainerId = $('#bottom-dock div.bottom-content.active div.attribute-layer-main').attr('id');\n\n refreshDatatableSize('#' + mycontainerId);\n\n return false;\n\n });\n }\n\n // Check editable features\n if (canEdit || canDelete) {\n lizMap.mainLizmap.edition.fetchEditableFeatures([lConfig.id]);\n }\n }\n\n if ( !cFeatures || cFeatures.length == 0 ){\n if ( $.fn.dataTable.isDataTable( aTable ) ) {\n var oTable = $( aTable ).dataTable();\n oTable.fnClearTable();\n }\n $(aTable).hide();\n\n $('#attribute-layer-'+ cleanName +' span.attribute-layer-msg').html(\n lizDict['attributeLayers.toolbar.msg.data.nodata'] + ' ' + lizDict['attributeLayers.toolbar.msg.data.extent']\n ).addClass('failure');\n\n } else {\n $(aTable).show();\n\n }\n\n if (aCallback)\n aCallback(aName,aTable);\n\n return false;\n }\n\n /**\n *\n * @param aName\n * @param atFeatures\n * @param hiddenFields\n * @param cAliases\n * @param cTypes\n * @param allColumnsKeyValues\n */\n function createDatatableColumns(aName, atFeatures, hiddenFields, cAliases, cTypes, allColumnsKeyValues){\n const columns = [];\n let firstDisplayedColIndex = 0;\n // Column with selected status\n columns.push( {\"data\": \"lizSelected\", \"width\": \"25px\", \"searchable\": false, \"sortable\": true, \"visible\": false} );\n firstDisplayedColIndex+=1;\n\n columns.push({ \"data\": \"featureToolbar\", \"width\": \"25px\", \"searchable\": false, \"sortable\": false});\n firstDisplayedColIndex += 1;\n\n // Add column for each field\n for (var columnName in atFeatures[0].properties){\n // Do not add hidden fields\n if (hiddenFields.includes(columnName)){\n continue;\n }\n\n const colConf = {\n \"data\": columnName,\n \"title\": cAliases[columnName]\n };\n\n // Replace keys by values if defined\n if (allColumnsKeyValues?.hasOwnProperty(columnName)){\n const columnKeyValues = allColumnsKeyValues[columnName];\n colConf['render'] = function (data, type, row, meta) {\n // Return value related to key if any. Else return original data\n // Handle multiple values defined as an array\n if (Array.isArray(data)){\n return data.map(key => columnKeyValues[key] ? columnKeyValues[key] : key).join(', ');\n }\n // For multiple values displayed as {\"value a\", \"value b\"} we must first split the value\n else if (data && data.toString().substring(0, 1) == '{' && data.toString().slice(-1) == '}') {\n var displayLabels = [];\n var stringData = data.toString();\n stringData = stringData.substring(1, stringData.length - 1);\n let splitValues = stringData.split(',');\n for (var s in splitValues) {\n let splitValue = splitValues[s].replace(/\"/g, '');\n displayLabels.push(columnKeyValues[splitValue] ? columnKeyValues[splitValue] : splitValue);\n }\n let displayText = displayLabels.length > 0 ? displayLabels.join(', ') : null;\n return displayText;\n } else {\n return columnKeyValues[data] ? columnKeyValues[data] : data ;\n }\n }\n } else if (['decimal', 'double'].includes(cTypes?.[columnName])) {\n // Handle decimal\n colConf['render'] = function (data, type, row, meta) {\n return parseFloat(data);\n }\n } else {\n // Check if we need to replace url or media by link\n let davConf = lizUrls.webDavUrl && lizUrls?.resourceUrlReplacement?.webdav && config.layers[aName]?.webDavFields && Array.isArray(config.layers[aName].webDavFields) && config.layers[aName].webDavFields.includes(columnName);\n colConf['render'] = function (data, type, row, meta) {\n // Replace media and URL with links\n if (!data || !(typeof data === 'string'))\n return data;\n if (davConf) {\n // replace the root of the url\n if(data.startsWith(lizUrls.webDavUrl)){\n data = data.replace(lizUrls.webDavUrl, lizUrls.resourceUrlReplacement.webdav)\n }\n }\n\n if (data.substring(0, 6) == 'media/' || data.substring(0, 7) == '/media/' || data.substring(0, 9) == '../media/') {\n var rdata = data;\n var colMeta = meta.settings.aoColumns[meta.col];\n if (data.substring(0, 7) == '/media/')\n rdata = data.slice(1);\n return '' + colMeta.title + '';\n }\n else if (davConf && data.substring(0, 4) == lizUrls.resourceUrlReplacement.webdav) {\n var rdata = data;\n var colMeta = meta.settings.aoColumns[meta.col];\n return '' + colMeta.title + '';\n\n }\n else if (data.substring(0, 4) == 'http' || data.substring(0, 3) == 'www') {\n var rdata = data;\n if (data.substring(0, 3) == 'www')\n rdata = 'http://' + data;\n return '' + data + '';\n }\n else\n return data;\n }\n }\n\n // Handle text alignment\n // Note: when keys are replaced by values, alignment is\n // made based on keys type and not values type as in QGIS\n switch (cTypes?.[columnName]) {\n case 'integer':\n case 'int':\n case 'unsignedInt':\n case 'long':\n case 'unsignedLong':\n case 'decimal':\n case 'double':\n colConf['className'] = 'text-right';\n break;\n case 'date':\n colConf['className'] = 'text-center';\n break;\n default:\n break;\n }\n\n columns.push( colConf );\n }\n\n var colToReturn = {\n 'columns': columns,\n 'firstDisplayedColIndex': firstDisplayedColIndex\n };\n\n // Reorder and hide columns from QGIS attributetableconfig property\n if(\n 'attributetableconfig' in config.attributeLayers[aName]\n && config.attributeLayers[aName]['attributetableconfig']\n && !$.isEmptyObject(config.attributeLayers[aName]['attributetableconfig']['columns'])\n ){\n var atc = config.attributeLayers[aName]['attributetableconfig']['columns']['column'];\n if(atc.length == 0){\n return colToReturn;\n }\n var lizcols = columns.slice(0, firstDisplayedColIndex);\n var newcolumns = columns.slice(firstDisplayedColIndex);\n\n var newpos = 0;\n for(var x in atc){\n var colx = atc[x];\n // Do nothing if the item does not reference a field\n if(colx.attributes.type != 'field')\n continue;\n var fieldname = colx.attributes.name;\n var colhidden = colx.attributes.hidden;\n\n // Rearrange columns\n for (var i=0; i < newcolumns.length; i++) {\n // move item\n if ('data' in newcolumns[i] && newcolumns[i].data === fieldname) {\n // adds it back to the good position if not declared hidden\n if( colhidden == \"1\" ){\n // Remove the item\n var a = newcolumns.splice(i,1);\n }else{\n // Move the item\n var cfrom = i;\n newcolumns.splice(newpos, 0, newcolumns.splice(cfrom,1)[0]);\n newpos+= 1;\n }\n break;\n }\n }\n }\n\n var newcolumnsfinal = lizcols.concat(newcolumns)\n colToReturn['columns'] = newcolumnsfinal;\n } else if (\n 'columns' in config.layers[aName]\n && config.layers[aName]['columns']\n && Object.keys(config.layers[aName]['columns']).length > 0\n ) {\n var lizcols = columns.slice(0, firstDisplayedColIndex);\n var newcolumns = columns.slice(firstDisplayedColIndex);\n\n var newpos = 0;\n // columns is an object with key as integer\n for (const key in config.layers[aName]['columns']) {\n const fieldname = config.layers[aName]['columns'][key];\n // Rearrange columns\n for (var i=0; i < newcolumns.length; i++) {\n // move item\n if ('data' in newcolumns[i] && newcolumns[i].data === fieldname) {\n // Move the item\n var cfrom = i;\n newcolumns.splice(newpos, 0, newcolumns.splice(cfrom,1)[0]);\n newpos+= 1;\n }\n }\n }\n\n var newcolumnsfinal = lizcols.concat(newcolumns)\n colToReturn['columns'] = newcolumnsfinal;\n }\n\n return colToReturn;\n }\n\n\n /**\n *\n * @param atFeatures\n * @param isChild\n * @param hiddenFields\n * @param selectedFeatures\n * @param layerId\n * @param parentLayerID\n */\n function formatDatatableFeatures(atFeatures, isChild, hiddenFields, selectedFeatures, layerId, parentLayerID){\n var dataSet = [];\n var foundFeatures = {};\n atFeatures.forEach(function(feat) {\n var line = {};\n\n // add feature to layer global data\n var fid = feat.id.split('.')[1];\n foundFeatures[fid] = feat;\n\n // Add row ID\n line['DT_RowId'] = fid;\n line['lizSelected'] = 'z';\n\n if( selectedFeatures && $.inArray( fid, selectedFeatures ) != -1 )\n line.lizSelected = 'a';\n\n line['featureToolbar'] = ``;\n\n // Build table lines\n for (var idx in feat.properties){\n if( ($.inArray(idx, hiddenFields) > -1) )\n continue;\n var prop = feat.properties[idx];\n line[idx] = prop;\n }\n\n\n dataSet.push( line );\n });\n return {\n 'dataSet': dataSet,\n 'foundFeatures': foundFeatures\n };\n }\n\n /**\n *\n * @param {string} aName The layer name\n * @param {string} aTable The HTML table selector\n */\n function bindTableLineClick(aName, aTable){\n $(aTable +' tr').click(function() {\n\n $(aTable +' tr').removeClass('active');\n $(this).addClass('active');\n\n // Get corresponding feature\n var featId = this.querySelector('lizmap-feature-toolbar').fid;\n\n // Send signal\n lizMap.events.triggerEvent(\"layerfeaturehighlighted\",\n { 'sourceTable': aTable, 'featureType': aName, 'fid': featId}\n );\n\n // Display popup for the feature\n var lConfig = config.layers[aName];\n if( lConfig && lConfig['popup'] == 'True' ){\n var feat = lConfig['features'][featId];\n\n var parentLayerCleanName = aTable.replace('#attribute-layer-table-', '').split('-');\n parentLayerCleanName = parentLayerCleanName[0];\n\n $('#attribute-table-panel-' + parentLayerCleanName ).html('');\n\n lizMap.getFeaturePopupContent( aName, feat, function(data){\n $('#attribute-table-panel-' + parentLayerCleanName ).html(data);\n // Add the missing Bootstrap classes\n $('#attribute-table-panel-' + parentLayerCleanName + ' table').addClass('table table-condensed table-striped table-bordered');\n\n // Trigger event\n lizMap.events.triggerEvent('lizmappopupdisplayed_inattributetable'\n );\n\n var closeButton = ''\n $('#attribute-table-panel-' + parentLayerCleanName + ' h4').append(closeButton);\n\n $('#attribute-table-panel-' + parentLayerCleanName + ' h4 a.close-attribute-feature-panel').click(function(){\n // Hide panel\n $('#attribute-layer-main-' + parentLayerCleanName ).removeClass('reduced');\n $('#attribute-table-panel-' + parentLayerCleanName ).removeClass('visible').html('');\n // Deactivate Detail button\n $('#attribute-layer-'+ parentLayerCleanName + ' button.btn-detail-attributeTable').removeClass('btn-primary');\n\n });\n });\n }\n });\n }\n\n /**\n *\n * @param childLayerName\n * @param filter\n * @param childTable\n */\n function getEditionChildData( childLayerName, filter, childTable ){\n getDataAndFillAttributeTable(childLayerName, filter, childTable, () => {\n // Check edition capabilities\n var canCreate = false;\n var canEdit = false;\n if ('editionLayers' in config && childLayerName in config.editionLayers ) {\n var al = config.editionLayers[childLayerName];\n if( al.capabilities.createFeature == \"True\" )\n canCreate = true;\n if( al.capabilities.modifyAttribute == \"True\" || al.capabilities.modifyGeometry == \"True\" )\n canEdit = true;\n }\n\n // Bind events when drawing table\n $( childTable ).one( 'draw.dt', function() {\n\n if( canEdit ) {\n // Add property on lizmap-feature-toolbar to edit children feature linked to a parent feature\n const parentFeatId = $(childTable).parents('div.tab-pane.attribute-layer-child-content')\n .find('input.attribute-table-hidden-parent-feature-id').val();\n $(childTable).DataTable().cells().nodes()\n .to$().children('lizmap-feature-toolbar').attr('parent-feature-id', parentFeatId);\n }\n\n if ( canCreate ) {\n // Button to create feature linked to parent\n const createHeader = $($(childTable).DataTable().column(1).header());\n if ( createHeader.find('button.attribute-layer-feature-create').length == 0 ) {\n createHeader\n .append(``)\n .on('click', 'button.attribute-layer-feature-create',function () {\n var tabPane = $(this).parents('div.tab-pane.attribute-layer-child-content');\n var parentFeatId = tabPane.find('input.attribute-table-hidden-parent-feature-id').val();\n var parentLayerName = tabPane.find('input.attribute-table-hidden-parent-layer').val();\n var layerName = tabPane.find('input.attribute-table-hidden-layer').val();\n lizMap.getLayerFeature(parentLayerName, parentFeatId, function (parentFeat) {\n var parentLayerId = config.layers[lizMap.getLayerNameByCleanName(parentLayerName)]['id'];\n var lid = config.layers[lizMap.getLayerNameByCleanName(layerName)]['id'];\n lizMap.launchEdition(lid, null, { layerId: parentLayerId, feature: parentFeat });\n });\n return false;\n });\n }\n }\n\n // Display the first child table displayed\n if ( $(childTable).parents('.edition-children-content').children('ul.nav-tabs').children('li.active').length == 0 ) {\n var tabId = $(childTable).parents('.tab-pane.attribute-layer-child-content').attr('id');\n $(childTable).parents('.edition-children-content').find('ul.nav-tabs > li > a[href=\"#'+tabId+'\"]').click();\n }\n return false;\n\n });\n });\n }\n\n\n // Deprecated, use getDataAndFillAttributeTable() instead\n /**\n *\n * @param aName\n * @param aFilter\n * @param aFeatureID\n * @param aGeometryName\n * @param aCallBack\n */\n function getAttributeFeatureData(aName, aFilter, aFeatureID, aGeometryName, aCallBack){\n\n aFilter = typeof aFilter !== 'undefined' ? aFilter : null;\n aFeatureID = typeof aFeatureID !== 'undefined' ? aFeatureID : null;\n aGeometryName = typeof aGeometryName !== 'undefined' ? aGeometryName : 'extent';\n aCallBack = typeof aCallBack !== 'undefined' ? aCallBack : null;\n\n // get layer configs\n if ( !(aName in config.layers) ) {\n var qgisName = lizMap.getNameByCleanName(aName);\n if ( qgisName && (qgisName in config.layers)) {\n aName = qgisName;\n } else {\n console.log('getAttributeFeatureData: \"'+aName+'\" and \"'+qgisName+'\" not found in config');\n return false;\n }\n }\n var aConfig = config.layers[aName];\n var atConfig = null;\n if( aName in config.attributeLayers )\n atConfig = config.attributeLayers[aName];\n\n var limitDataToBbox = false;\n if ( 'limitDataToBbox' in config.options && config.options.limitDataToBbox == 'True'){\n limitDataToBbox = true;\n }\n lizMap.getFeatureData(aName, aFilter, aFeatureID, aGeometryName, limitDataToBbox, null, null, aCallBack);\n return true;\n }\n\n /**\n *\n * @param featureType\n * @param featId\n * @param rupdateDrawing\n */\n function refreshLayerSelection( featureType, featId, rupdateDrawing ) {\n // Set function parameters if not given\n rupdateDrawing = typeof rupdateDrawing !== 'undefined' ? rupdateDrawing : null;\n\n // Assure selectedFeatures property exists for the layer\n if( !config.layers[featureType]['selectedFeatures'] )\n config.layers[featureType]['selectedFeatures'] = [];\n\n // Add or remove feature id from the selectedFeatures\n if( $.inArray( featId, config.layers[featureType]['selectedFeatures'] ) == -1 ) {\n config.layers[featureType]['selectedFeatures'].push( featId );\n }else{\n var idx = $.inArray( featId, config.layers[featureType]['selectedFeatures'] );\n config.layers[featureType]['selectedFeatures'].splice( idx, 1 );\n }\n\n lizMap.events.triggerEvent(\"layerSelectionChanged\",\n {\n 'featureType': featureType,\n 'featureIds': config.layers[featureType]['selectedFeatures'],\n 'updateDrawing': rupdateDrawing\n }\n );\n\n }\n\n /**\n *\n * @param featureType\n * @param supdateDrawing\n */\n function setSelectedFeaturesFromSearchedFilter( featureType, supdateDrawing ) {\n // Set function parameters if not given\n supdateDrawing = typeof supdateDrawing !== 'undefined' ? supdateDrawing : true;\n\n // Assure selectedFeatures property exists for the layer\n if( !config.layers[featureType]['selectedFeatures'] )\n config.layers[featureType]['selectedFeatures'] = [];\n\n var hasChanged = false;\n // Add filtered featured\n $('.attribute-table-table[id]').each(function(){\n var tableId = $(this).attr('id');\n var tableLayerName = $(this).parents('div.dataTables_wrapper:first').prev('input.attribute-table-hidden-layer').val()\n // Get parent table for the feature type\n if ( tableLayerName\n && $.fn.dataTable.isDataTable( $(this) )\n && lizMap.cleanName( featureType ) == tableLayerName\n ){\n\n var sIds = [];\n var rTable = $(this).DataTable();\n var filteredrowids = rTable.rows( {\"filter\":\"applied\"} ).ids();\n for ( var i = 0; i < filteredrowids.length; i++ ) {\n sIds.push( filteredrowids[i] );\n }\n config.layers[featureType]['selectedFeatures'] = sIds;\n hasChanged = true;\n }\n })\n\n if( hasChanged ){\n lizMap.events.triggerEvent(\"layerSelectionChanged\",\n {\n 'featureType': featureType,\n 'featureIds': config.layers[featureType]['selectedFeatures'],\n 'updateDrawing': supdateDrawing\n }\n );\n }\n }\n\n /**\n *\n * @param featureType\n * @param arefresh\n */\n function emptyLayerSelection( featureType, arefresh ) {\n // Set function parameters if not given\n arefresh = typeof arefresh !== 'undefined' ? arefresh : true;\n\n // Empty array\n config.layers[featureType]['selectedFeatures'] = [];\n\n lizMap.events.triggerEvent(\"layerSelectionChanged\",\n {\n 'featureType': featureType,\n 'featureIds': config.layers[featureType]['selectedFeatures'],\n 'updateDrawing': arefresh\n }\n );\n }\n\n /**\n *\n * @param featureType\n * @param featId\n */\n function refreshLayerFilter( featureType, featId ) {\n // Assure filteredFeatures property exists for the layer\n if( !config.layers[featureType]['filteredFeatures'] )\n config.layers[featureType]['filteredFeatures'] = [];\n\n // Add or remove feature id from the filteredFeatures\n if( $.inArray( featId, config.layers[featureType]['filteredFeatures'] ) == -1 ) {\n config.layers[featureType]['filteredFeatures'].push( featId );\n }else{\n var idx = $.inArray( featId, config.layers[featureType]['filteredFeatures'] );\n config.layers[featureType]['filteredFeatures'].splice( idx, 1 );\n }\n\n lizMap.events.triggerEvent(\"layerFilteredFeaturesChanged\",\n {\n 'featureType': featureType,\n 'featureIds': config.layers[featureType]['filteredFeatures'],\n 'updateDrawing': true\n }\n );\n }\n\n /**\n *\n * @param featureType\n */\n function emptyLayerFilter( featureType ) {\n // Empty array\n config.layers[featureType]['filteredFeatures'] = [];\n\n lizMap.lizmapLayerFilterActive = null;\n\n // Empty layer filter\n config.layers[featureType]['request_params']['filter'] = null;\n config.layers[featureType]['request_params']['exp_filter'] = null;\n config.layers[featureType]['request_params']['filtertoken'] = null;\n\n // Update layer state\n lizMap.mainLizmap.state.layersAndGroupsCollection.getLayerByName(featureType).expressionFilter = null;\n\n lizMap.events.triggerEvent(\"layerFilteredFeaturesChanged\",\n {\n 'featureType': featureType,\n 'featureIds': config.layers[featureType]['filteredFeatures'],\n 'updateDrawing': true\n }\n );\n }\n\n /**\n *\n * @param featureType\n */\n function filterLayerFromSelectedFeatures( featureType ) {\n\n if( !config.attributeLayers[featureType] )\n return false;\n // Assure selectedFeatures property exists for the layer\n if( !config.layers[featureType]['selectedFeatures'] )\n config.layers[featureType]['selectedFeatures'] = [];\n\n // Copy selected features as filtered features\n config.layers[featureType]['filteredFeatures'] = config.layers[featureType]['selectedFeatures'].slice();\n\n // Remove selection\n emptyLayerSelection( featureType, false );\n\n lizMap.lizmapLayerFilterActive = featureType;\n\n lizMap.events.triggerEvent(\"layerFilteredFeaturesChanged\",\n {\n 'featureType': featureType,\n 'featureIds': config.layers[featureType]['filteredFeatures'],\n 'updateDrawing': true\n }\n );\n }\n\n /**\n *\n * @param typeNamePile\n * @param typeNameFilter\n * @param typeNameDone\n * @param cascade\n */\n function updateLayer( typeNamePile, typeNameFilter, typeNameDone, cascade ){\n if (typeNamePile.length == 0) {\n return;\n }\n cascade = typeof cascade !== 'undefined' ? cascade : true;\n\n // Get first elements of the pile and withdraw it from the pile\n var typeName = typeNamePile.shift();\n\n // Get corresponding filter\n var aFilter = typeNameFilter[typeName];\n\n // Apply filter and get children\n if (aFilter) {\n applyLayerFilter( typeName, aFilter, typeNamePile, typeNameFilter, typeNameDone, cascade );\n } else {\n applyEmptyLayerFilter( typeName, typeNamePile, typeNameFilter, typeNameDone, cascade );\n }\n\n $('#layerActionUnfilter').toggle((lizMap.lizmapLayerFilterActive !== null));\n }\n\n /**\n *\n * @param relation\n * @param typeNameDone\n */\n function buildChildParam( relation, typeNameDone ) {\n var childLayerConfigA = lizMap.getLayerConfigById(\n relation.referencingLayer,\n config.attributeLayers,\n 'layerId'\n );\n\n // if no config\n if( !childLayerConfigA ) {\n return null;\n }\n\n var childLayerKeyName = childLayerConfigA[0];\n var childLayerConfig = childLayerConfigA[1];\n\n // Avoid typeName already done ( infinite loop )\n if( $.inArray( childLayerKeyName, typeNameDone ) != -1 )\n return null;\n\n // Check if it is a pivot table\n var relationIsPivot = false;\n if( 'pivot' in childLayerConfig\n && childLayerConfig.pivot == 'True'\n && childLayerConfig.layerId in config.relations.pivot\n ){\n relationIsPivot = true;\n }\n // Build parameter for this child\n var fParam = {\n 'filter': null,\n 'fieldToFilter': relation.referencingField,\n 'parentField': relation.referencedField,\n 'parentValues': [],\n 'pivot': relationIsPivot,\n 'otherParentTypeName': null,\n 'otherParentRelation': null,\n 'otherParentValues': []\n };\n\n return [childLayerKeyName, fParam];\n }\n\n /**\n *\n * @param typeNameId\n * @param attributeLayerConfig\n * @param typeNameDone\n */\n function getPivotParam( typeNameId, attributeLayerConfig, typeNameDone ) {\n var isPivot = false;\n var pivotParam = null;\n if( 'pivot' in attributeLayerConfig\n && attributeLayerConfig.pivot == 'True'\n && attributeLayerConfig.layerId in config.relations.pivot\n ){\n isPivot = true;\n }\n\n if (!isPivot) {\n return pivotParam;\n }\n\n var otherParentId = null;\n var otherParentRelation = null;\n var otherParentTypeName = null;\n\n for( var rx in config.relations ){\n // Do not take pivot object into account\n if( rx == 'pivot' )\n continue;\n // Do not get relation for parent layer (we are looking for other parents only)\n if( rx == typeNameId)\n continue;\n // Do not get relation for parent to avoid ( infinite loop otherwise )\n var otherParentConfig = lizMap.getLayerConfigById(\n rx,\n config.attributeLayers,\n 'layerId'\n );\n if( otherParentConfig\n && $.inArray( otherParentConfig[0], typeNameDone ) != -1\n )\n continue;\n\n var aLayerRelations = config.relations[rx];\n\n for( var xx in aLayerRelations){\n // Only look at relations concerning typeName\n if( aLayerRelations[xx].referencingLayer != attributeLayerConfig.layerId)\n continue;\n\n otherParentId = rx;\n otherParentRelation = aLayerRelations[xx];\n\n var otherParentConfig = lizMap.getLayerConfigById(\n rx,\n config.attributeLayers,\n 'layerId'\n );\n otherParentTypeName = otherParentConfig[0];\n }\n }\n\n if( otherParentId && otherParentRelation){\n pivotParam = {};\n pivotParam['otherParentTypeName'] = otherParentTypeName;\n pivotParam['otherParentRelation'] = otherParentRelation;\n pivotParam['otherParentValues'] = [];\n }\n\n return pivotParam;\n }\n\n /**\n *\n * @param typeName\n * @param typeNamePile\n * @param typeNameFilter\n * @param typeNameDone\n * @param cascade\n */\n function applyEmptyLayerFilter( typeName, typeNamePile, typeNameFilter, typeNameDone, cascade ){\n\n // Add done typeName to the list\n typeNameDone.push( typeName );\n\n // **0** Prepare some variable. e.g. reset features stored in the layer config\n var layerConfig = config.layers[typeName];\n layerConfig['features'] = {};\n\n // **1** Get children info\n var typeNameId = layerConfig['id'];\n var typeNameChildren = {};\n\n var getAttributeLayerConfig = lizMap.getLayerConfigById(\n typeNameId,\n config.attributeLayers,\n 'layerId'\n );\n var attributeLayerConfig = null;\n if( getAttributeLayerConfig ) {\n attributeLayerConfig = getAttributeLayerConfig[1];\n }\n\n if( 'relations' in config\n && typeNameId in config.relations\n && cascade\n ) {\n // Loop through relations to get children data\n var layerRelations = config.relations[typeNameId];\n for( var lid in layerRelations ) {\n var relation = layerRelations[lid];\n var childParam = buildChildParam(relation, typeNameDone);\n\n // if no child param\n if( !childParam )\n continue;\n\n typeNameChildren[ childParam[0] ] = childParam[1];\n }\n }\n\n // ** ** If typeName is a pivot, add some info about the otherParent\n // If pivot, re-loop relations to find configuration for other parents (go up)\n var pivotParam = getPivotParam( typeNameId, attributeLayerConfig, typeNameDone );\n\n // **3** Apply filter to the typeName and redraw if necessary\n layerConfig['request_params']['filter'] = null;\n layerConfig['request_params']['exp_filter'] = null;\n layerConfig['request_params']['filtertoken'] = null;\n\n // Update layer state\n lizMap.mainLizmap.state.layersAndGroupsCollection.getLayerByName(layerConfig.name).expressionFilter = null;\n\n // Refresh attributeTable\n var opTable = '#attribute-layer-table-'+lizMap.cleanName( typeName );\n if( $( opTable ).length ){\n getDataAndRefreshAttributeTable(typeName, null, opTable);\n }\n\n // And send event so that getFeatureInfo and getPrint use the updated layer filters\n lizMap.events.triggerEvent(\"layerFilterParamChanged\",\n {\n 'featureType': typeName,\n 'filter': null,\n 'updateDrawing': true\n }\n );\n\n // **4** build children filters\n if( cascade ) {\n for( var x in typeNameChildren ){\n typeNameFilter[x] = null;\n typeNamePile.push( x );\n }\n }\n\n // **5** Add other parent to pile when typeName is a pivot\n if( pivotParam ){\n console.log(pivotParam);\n // Add a Filter to the \"other parent\" layers\n config.layers[ pivotParam['otherParentTypeName'] ]['request_params']['filter'] = null;\n config.layers[ pivotParam['otherParentTypeName'] ]['request_params']['exp_filter'] = null;\n config.layers[ pivotParam['otherParentTypeName'] ]['request_params']['filtertoken'] = null;\n\n // Update layer state\n lizMap.mainLizmap.state.layersAndGroupsCollection.getLayerByName(pivotParam['otherParentTypeName']).expressionFilter = null;\n\n typeNameFilter[ pivotParam['otherParentTypeName'] ] = null;\n typeNamePile.push( pivotParam['otherParentTypeName'] );\n }\n\n // **6** Launch the method again if typeName is not empty\n if( typeNamePile.length > 0 ) {\n updateLayer( typeNamePile, typeNameFilter, typeNameDone, cascade );\n }\n\n }\n\n /**\n *\n * @param typeName\n * @param aFilter\n * @param typeNamePile\n * @param typeNameFilter\n * @param typeNameDone\n * @param cascade\n */\n function applyLayerFilter( typeName, aFilter, typeNamePile, typeNameFilter, typeNameDone, cascade ){\n if (!aFilter) {\n applyEmptyLayerFilter( typeName, typeNamePile, typeNameFilter, typeNameDone, cascade );\n return;\n }\n\n // Add done typeName to the list\n typeNameDone.push( typeName );\n\n // Get features to refresh attribute table AND build children filters\n var geometryName = 'extent';\n lizMap.getFeatureData(typeName, aFilter, null, geometryName, false, null, null,\n function (aName, aNameFilter, aNameFeatures, aNameAliases, aNameTypes ){\n\n // **0** Prepare some variable. e.g. reset features stored in the layer config\n var layerConfig = config.layers[typeName];\n layerConfig['features'] = {};\n var foundFeatures = {};\n const wmsName = layerConfig?.shortname || layerConfig.name;\n\n // **1** Get children info\n var cFeatures = aNameFeatures;\n var typeNameId = layerConfig['id'];\n var typeNamePkey = config.attributeLayers[typeName]['primaryKey'];\n var typeNamePkeyValues = [];\n var typeNameChildren = {};\n\n var getAttributeLayerConfig = lizMap.getLayerConfigById(\n typeNameId,\n config.attributeLayers,\n 'layerId'\n );\n var attributeLayerConfig = null;\n if( getAttributeLayerConfig )\n attributeLayerConfig = getAttributeLayerConfig[1];\n\n if( 'relations' in config\n && typeNameId in config.relations\n && cascade\n ) {\n // Loop through relations to get children data\n var layerRelations = config.relations[typeNameId];\n for( var lid in layerRelations ) {\n\n var relation = layerRelations[lid];\n var childParam = buildChildParam(relation, typeNameDone);\n\n // if no child param\n if( !childParam )\n continue;\n\n typeNameChildren[ childParam[0] ] = childParam[1];\n\n }\n }\n\n // ** ** If typeName is a pivot, add some info about the otherParent\n // If pivot, re-loop relations to find configuration for other parents (go up)\n var pivotParam = getPivotParam( typeNameId, attributeLayerConfig, typeNameDone );\n\n // **2** Loop through features && get children filter values\n var filteredFeatures = [];\n\n cFeatures.forEach(function(feat) {\n\n // Add feature to layer config data\n var fid = feat.id.split('.')[1];\n foundFeatures[fid] = feat;\n\n // Add primary keys values to build the WMS filter ( to be able to redraw layer)\n var pk = feat.properties[typeNamePkey];\n if( ('types' in layerConfig)\n && (typeNamePkey in layerConfig.types)\n && layerConfig.types[typeNamePkey] == 'string') {\n pk = \" '\" + pk + \"' \";\n } else {\n var intRegex = /^[0-9]+$/;\n if( !( intRegex.test(pk) ) )\n pk = \" '\" + pk + \"' \";\n }\n typeNamePkeyValues.push( pk );\n\n // Reset filteredFeatures with found features\n filteredFeatures.push( fid );\n\n // Loop through found children to build filter\n // Only if aFilter (original typeName filter) is not null\n if( cascade && aFilter ){\n for( var x in typeNameChildren ){\n // Get the parent values to be able to build the filter\n var cData = typeNameChildren[x];\n typeNameChildren[x]['parentValues'].push( \"'\" + feat.properties[ cData['parentField'] ] + \"'\" );\n }\n }\n\n // If pivot, we need also to get the values to filter the other parent\n if( pivotParam && aFilter ){\n var referencingField = pivotParam['otherParentRelation'].referencingField;\n pivotParam['otherParentValues'].push( \"'\" + feat.properties[ referencingField ] + \"'\" );\n }\n });\n\n // **3** Apply filter to the typeName and redraw if necessary\n layerConfig['features'] = foundFeatures;\n layerConfig['alias'] = aNameAliases;\n\n var lFilter = null;\n\n // Add false value to hide all features if we need to hide layer\n if( typeNamePkeyValues.length == 0 )\n typeNamePkeyValues.push('-99999');\n\n if( aFilter ){\n // The values must be separated by comma AND spaces\n // since QGIS controls the syntax for the FILTER parameter\n lFilter = wmsName + ':\"' + typeNamePkey + '\" IN ( ' + typeNamePkeyValues.join( ' , ' ) + ' ) ';\n\n // Try to use the simple filter ( for example myforeignkey = 4 )\n // instead of the full list of pkeys we got from wfs\n // This can prevent too long GET URL\n // NB : we should improve this by using server side filters\n if( !aFilter.startsWith('$id') ){\n var simpleFilter = aFilter;\n if( !aFilter.startsWith(wmsName) ){\n simpleFilter = wmsName + ':' + aFilter ;\n }\n lFilter = simpleFilter;\n }\n }\n\n layerConfig['request_params']['filter'] = lFilter;\n layerConfig['request_params']['exp_filter'] = aFilter;\n\n // Add filter to openlayers layer\n if( aFilter ){\n // Get filter token\n fetch(lizUrls.service, {\n method: \"POST\",\n body: new URLSearchParams({\n service: 'WMS',\n request: 'GETFILTERTOKEN',\n typename: wmsName,\n filter: lFilter\n })\n }).then(response => {\n return response.json();\n }).then(result => {\n layerConfig['request_params']['filtertoken'] = result.token;\n\n // Update layer state\n lizMap.mainLizmap.state.layersAndGroupsCollection.getLayerByName(layerConfig.name).filterToken = {\n expressionFilter: layerConfig['request_params']['exp_filter'],\n token: result.token\n };\n });\n } else {\n layerConfig['request_params']['filtertoken'] = null;\n\n // Update layer state\n lizMap.mainLizmap.state.layersAndGroupsCollection.getLayerByName(layerConfig.name).expressionFilter = null;\n }\n\n // Refresh attributeTable\n var opTable = '#attribute-layer-table-'+lizMap.cleanName( typeName );\n if( $( opTable ).length ){\n refreshLayerAttributeDatatable(typeName, opTable, cFeatures);\n }\n\n // And send event so that getFeatureInfo and getPrint use the updated layer filters\n lizMap.events.triggerEvent(\"layerFilterParamChanged\",\n {\n 'featureType': typeName,\n 'filter': lFilter,\n 'updateDrawing': true\n }\n );\n\n // **4** build children filters\n if( cascade ) {\n for( var x in typeNameChildren ){\n var cName = x;\n var cData = typeNameChildren[x];\n var cFilter = null;\n var cExpFilter = null;\n\n // Build filter for children\n // and add child to the typeNameFilter and typeNamePile objects\n // only if typeName filter aFilter was originally set\n if( aFilter && cData['parentValues'].length > 0 && cascade != 'removeChildrenFilter' ) {\n // The values must be separated by comma AND spaces\n // since QGIS controls the syntax for the FILTER parameter\n cExpFilter = '\"' + cData['fieldToFilter'] + '\" IN ( ' + cData['parentValues'].join( ' , ' ) + ' )';\n }\n else if( aFilter && cascade != 'removeChildrenFilter' ) {\n cExpFilter = '\"' + cData['fieldToFilter'] + '\" IN ( -99999 )';\n }\n const cLayerConfig = config.layers[cName];\n const cWmsName = cLayerConfig?.shortname || cLayerConfig.name;\n cFilter = cWmsName + ':' + cExpFilter;\n\n cLayerConfig['request_params']['filter'] = cFilter;\n cLayerConfig['request_params']['exp_filter'] = cExpFilter;\n\n // Update layer state\n lizMap.mainLizmap.state.layersAndGroupsCollection.getLayerByName(cName).expressionFilter = cExpFilter;\n\n typeNameFilter[x] = cExpFilter;\n typeNamePile.push( x );\n\n }\n }\n\n // **5** Add other parent to pile when typeName is a pivot\n if( pivotParam ){\n // Add a Filter to the \"other parent\" layers\n var cFilter = null;\n // The stored filter in this variable cExpFilter must not be prefixed by the layername\n // since it is used to build the EXP_FILTER parameter\n // the cFilter will be based on this value but with the layer name as prefix\n var cExpFilter = null;\n var orObj = null;\n\n if( aFilter ){\n if( pivotParam['otherParentValues'].length > 0 ){\n cExpFilter = '\"' + pivotParam['otherParentRelation'].referencedField + '\"';\n // The values must be separated by comma AND spaces\n // since QGIS controls the syntax for the FILTER parameter\n cExpFilter+= ' IN ( ' + pivotParam['otherParentValues'].join( ' , ' ) + ' )';\n cFilter = wmsName + ':' + cExpFilter;\n orObj = {\n field: pivotParam['otherParentRelation'].referencedField,\n values: pivotParam['otherParentValues']\n }\n }\n else {\n cExpFilter = '\"' + pivotParam['otherParentRelation'].referencedField + '\" IN ( ' + \"'-999999'\" + ' )';\n cFilter = wmsName + ':' + cExpFilter;\n orObj = {\n field: pivotParam['otherParentRelation'].referencedField,\n values: ['-999999']\n }\n }\n }\n config.layers[ pivotParam['otherParentTypeName'] ]['request_params']['filter'] = cFilter;\n config.layers[ pivotParam['otherParentTypeName'] ]['request_params']['exp_filter'] = cExpFilter;\n\n // Update layer state\n lizMap.mainLizmap.state.layersAndGroupsCollection.getLayerByName(pivotParam['otherParentTypeName']).expressionFilter = cExpFilter;\n\n // The stored filter in this variable must not be prefixed by the layername\n // since it is used to build the EXP_FILTER parameter\n // the FILTER will be based on this value but with the layer name as prefix\n typeNameFilter[ pivotParam['otherParentTypeName'] ] = cExpFilter;\n typeNamePile.push( pivotParam['otherParentTypeName'] );\n }\n\n // **6** Launch the method again if typeName is not empty\n if( typeNamePile.length > 0 ) {\n updateLayer( typeNamePile, typeNameFilter, typeNameDone, cascade );\n }\n });\n }\n\n /**\n *\n * @param layerId\n * @param featureId\n */\n function deleteEditionFeature( layerId, featureId ){\n var eConfig = lizMap.getLayerConfigById(\n layerId,\n config.editionLayers,\n 'layerId'\n );\n var deleteConfirm = '';\n if( eConfig )\n deleteConfirm += config.layers[eConfig[0]].title;\n if( config.layers[eConfig[0]]\n && config.layers[eConfig[0]]['features']\n && config.layers[eConfig[0]]['features'][featureId]\n ){\n var eProp = config.layers[eConfig[0]]['features'][featureId].properties;\n for( var y in eProp ){\n deleteConfirm+= ' \\n\"' + y + '\": ' + eProp[y] ;\n }\n\n }\n lizMap.deleteEditionFeature( layerId, featureId, deleteConfirm, function( aLID, aFID ){\n // Check if the map and tables must be refreshed after this deletion\n var featureType = eConfig[0];\n var cascadeToChildren = $('#jforms_view_attribute_layers_option_cascade_label input[name=\"cascade\"]').prop('checked');\n // Get filter status for the layer concerned by the edition\n var hasFilter = false;\n if(\n ('filteredFeatures' in config.layers[featureType] && config.layers[featureType]['filteredFeatures'].length > 0 )\n || ( 'request_params' in config.layers[featureType] && config.layers[featureType]['request_params']['filter'] )\n || ( 'request_params' in config.layers[featureType] && config.layers[featureType]['request_params']['exp_filter'] )\n ){\n hasFilter = true;\n }\n if( hasFilter && lizMap.lizmapLayerFilterActive && cascadeToChildren ){\n var parentFeatureType = lizMap.lizmapLayerFilterActive;\n updateMapLayerDrawing( parentFeatureType, cascadeToChildren );\n }\n });\n }\n\n /**\n *\n * @param featureType\n * @param cascade\n */\n function updateMapLayerDrawing( featureType, cascade ){\n cascade = typeof cascade !== 'undefined' ? cascade : true;\n // Get layer config\n var lConfig = config.layers[featureType];\n if( !lConfig ){\n return;\n }\n\n // Build filter from filteredFeatures\n var cFilter = null;\n if (lConfig?.['filteredFeatures']?.length) {\n // The values must be separated by comma AND spaces\n // since QGIS controls the syntax for the FILTER parameter\n cFilter = '$id IN ( ' + lConfig['filteredFeatures'].join( ' , ' ) + ' ) ';\n }\n\n const wmsName = lConfig?.['shortname'] || featureType;\n\n // Build selection parameter from selectedFeatures\n if( lConfig?.['selectedFeatures']?.length) {\n lConfig['request_params']['selection'] = wmsName + ':' + lConfig['selectedFeatures'].join();\n\n // Get selection token\n fetch(lizUrls.service, {\n method: \"POST\",\n body: new URLSearchParams({\n service: 'WMS',\n request: 'GETSELECTIONTOKEN',\n typename: wmsName,\n ids: lConfig.selectedFeatures.join()\n })\n }).then(response => {\n return response.json();\n }).then(result => {\n lConfig.request_params['selectiontoken'] = result.token;\n // Update layer state\n lizMap.mainLizmap.state.layersAndGroupsCollection.getLayerByName(lConfig.name).selectionToken = {\n selectedFeatures: lConfig.selectedFeatures,\n token: result.token\n };\n });\n }\n else {\n lConfig['request_params']['selection'] = null;\n lConfig['request_params']['selectiontoken'] = null;\n\n lizMap.mainLizmap.state.layersAndGroupsCollection.getLayerByName(lConfig.name).selectedFeatures = null;\n }\n\n // Build data to update layer drawing and other components\n var typeNamePile = [ featureType ];\n var typeNameFilter = {};\n typeNameFilter[featureType] = cFilter;\n var typeNameDone = [];\n updateLayer(typeNamePile, typeNameFilter, typeNameDone, cascade );\n }\n\n /**\n *\n * @param featureType\n */\n function updateMapLayerSelection(featureType) {\n // Get layer config\n var lConfig = config.layers[featureType];\n if (!lConfig){\n return;\n }\n\n const wmsName = lConfig?.['shortname'] || featureType;\n\n // Build selection parameter from selectedFeatures\n if (lConfig?.selectedFeatures?.length) {\n if (!('request_params' in lConfig)) {\n lConfig['request_params'] = {};\n }\n lConfig.request_params['selection'] = wmsName + ':' + lConfig.selectedFeatures.join();\n\n // Get selection token\n fetch(lizUrls.service, {\n method: \"POST\",\n body: new URLSearchParams({\n service: 'WMS',\n request: 'GETSELECTIONTOKEN',\n typename: wmsName,\n ids: lConfig.selectedFeatures.join()\n })\n }).then(response => {\n return response.json();\n }).then(result => {\n lConfig.request_params['selectiontoken'] = result.token;\n // Update layer state\n lizMap.mainLizmap.state.layersAndGroupsCollection.getLayerByName(lConfig.name).selectionToken = {\n selectedFeatures: lConfig.selectedFeatures,\n token: result.token\n };\n });\n } else {\n\n if (!('request_params' in lConfig)) {\n lConfig['request_params'] = {};\n }\n lConfig.request_params['selection'] = null;\n lConfig.request_params['selectiontoken'] = null;\n\n // Update layer state\n lizMap.mainLizmap.state.layersAndGroupsCollection.getLayerByName(lConfig.name).selectedFeatures = null;\n }\n }\n\n /**\n *\n * @param featureType\n */\n function updateAttributeTableTools( featureType ){\n\n // Show unselect and filter buttons if some features are selected\n var selIds = config.layers[featureType]['selectedFeatures'];\n var filIds = config.layers[featureType]['filteredFeatures'];\n var cleanName = lizMap.cleanName(featureType);\n // UnSelection button and move selection to top\n if( selIds && selIds.length > 0 ){\n $('button.btn-unselect-attributeTable[value=\"'+cleanName+'\"]').removeClass('hidden');\n $('button.btn-moveselectedtotop-attributeTable[value=\"'+cleanName+'\"]').removeClass('hidden');\n }\n else{\n $('button.btn-unselect-attributeTable[value=\"'+cleanName+'\"]').addClass('hidden');\n $('button.btn-moveselectedtotop-attributeTable[value=\"'+cleanName+'\"]').addClass('hidden');\n }\n\n // Filter button\n\n // Hide it first and remove active classes\n $('button.btn-filter-attributeTable[value=\"'+cleanName+'\"]').addClass('hidden').removeClass('btn-primary');\n\n // Then display it only if:\n // * no other features is active and selected items exists for this layer\n // * or this is the layer for which it is active\n if( ( !lizMap.lizmapLayerFilterActive && selIds && selIds.length > 0)\n || lizMap.lizmapLayerFilterActive == featureType\n ){\n $('button.btn-filter-attributeTable[value=\"'+cleanName+'\"]').removeClass('hidden');\n\n // Show button as activated if some filter exists\n if( filIds && filIds.length > 0 )\n $('button.btn-filter-attributeTable[value=\"'+cleanName+'\"]').addClass('btn-primary');\n }\n\n }\n\n /**\n *\n * @param featureType\n * @param featureIds\n */\n function redrawAttributeTableContent( featureType, featureIds ){\n // Loop through all datatables to get the one concerning this featureType\n $('.attribute-table-table[id]').each(function(){\n var tableId = $(this).attr('id');\n var tableLayerName = $(this).parents('div.dataTables_wrapper:first').prev('input.attribute-table-hidden-layer').val()\n\n if ( tableLayerName\n && $.fn.dataTable.isDataTable( $(this) )\n && lizMap.cleanName( featureType ) == tableLayerName\n ){\n // Get selected feature ids if not given\n if( !featureIds ){\n // Assure selectedFeatures property exists for the layer\n if( !config.layers[featureType]['selectedFeatures'] )\n config.layers[featureType]['selectedFeatures'] = [];\n var featureIds = config.layers[featureType]['selectedFeatures'];\n }\n\n // Get Datatable api\n var rTable = $(this).DataTable();\n var dTable = $(this).dataTable();\n\n // Remove class selected for all the lines\n rTable\n .rows( $(this).find('tr.selected') )\n .every(function(){\n dTable.fnUpdate( 'z', this, 0, false, false );\n })\n //~ .draw()\n .nodes()\n .to$()\n .removeClass( 'selected' )\n ;\n\n // Add class selected from featureIds\n // And change lizSelected column value to a\n if( featureIds.length > 0 ){\n\n var rTable = $(this).DataTable();\n rTable.data().each( function(d){\n if( $.inArray( d.DT_RowId.toString(), featureIds ) != -1 )\n d.lizSelected = 'a';\n });\n rTable\n .rows( function ( idx, data, node ) {\n return data.lizSelected == 'a' ? true : false;\n })\n .nodes()\n .to$()\n .addClass( 'selected' )\n ;\n }\n }\n\n });\n }\n\n /**\n *\n * @param featureType\n */\n function refreshTablesAfterEdition( featureType ){\n // Loop through each datatable, and refresh if it corresponds to the layer edited\n $('.attribute-table-table[id]').each(function(){\n // get table id\n var tableId = $(this).attr('id');\n // verifying the id\n if ( !tableId )\n return true;\n\n var tableLayerName = $(this).parents('div.dataTables_wrapper:first').prev('input.attribute-table-hidden-layer').val()\n\n if ( tableLayerName\n && $.fn.dataTable.isDataTable( $(this) )\n && lizMap.cleanName( featureType ) == tableLayerName\n ){\n var zTable = '#' + tableId;\n var parentTable = zTable;\n var parentLayerCleanName = tableLayerName;\n var parentLayerName = featureType;\n var zClassNames = $(zTable).attr('class').split(' ');\n for(var zKey=0; zKey 0)\n || ('request_params' in config.layers[featureType] && config.layers[featureType]['request_params']['filter'])\n || ('request_params' in config.layers[featureType] && config.layers[featureType]['request_params']['exp_filter'])\n ){\n hasFilter = true;\n }\n if (hasFilter && lizMap.lizmapLayerFilterActive && cascadeToChildren) {\n const parentFeatureType = lizMap.lizmapLayerFilterActive;\n updateMapLayerDrawing(parentFeatureType, cascadeToChildren);\n }\n } // todo : only remove line corresponding to deleted feature ?\n },\n\n // Filter layer when using \"Locate by layer\" tool\n lizmaplocatefeaturechanged: function(e){\n if( !( e.featureType in config.attributeLayers) || startupFilter )\n return false;\n\n var aConfig = config.locateByLayer[e.featureType];\n var triggerFilterOnLocate = false;\n\n if( 'filterOnLocate' in aConfig && aConfig.filterOnLocate == 'True' )\n triggerFilterOnLocate = true;\n\n if( !triggerFilterOnLocate )\n return false;\n\n // Select feature\n lizMap.events.triggerEvent('layerfeatureselected',\n {'featureType': e.featureType, 'fid': e.featureId, 'updateDrawing': false}\n );\n // Filter selected feature\n lizMap.events.triggerEvent('layerfeaturefilterselected',\n {'featureType': e.featureType}\n );\n },\n\n lizmaplocatefeaturecanceled: function(e){\n\n lizMap.events.triggerEvent('layerfeatureremovefilter',\n {'featureType': e.featureType}\n );\n },\n\n // If there are some relations for the edited layer\n // We add the children tables below or inside the form\n lizmapeditionformdisplayed: function(e) {\n $('#edition-children-container').hide().html('');\n\n var fid = e.featureId;\n\n // Do not display children tables (from QGIS relations)\n // if the form concerns a feature creation\n if ( !fid || fid == '' )\n return;\n\n // Get the edited layer ID\n var layerId = e.layerId;\n var getLayerConfig = lizMap.getLayerConfigById( layerId );\n\n // Check for relations\n if( getLayerConfig && 'relations' in lizMap.config && layerId in lizMap.config.relations ) {\n var relations = lizMap.config.relations[layerId];\n var featureType = getLayerConfig[0];\n var featureId = featureType + '.' + fid;\n if ( relations.length > 0 ) {\n\n // Build the HTML container for the children tables\n // which will be displayed under the form\n var childHtml = getChildrenHtmlContent( featureType );\n var html = '';\n\n // Add children content container\n if( childHtml ){\n // Add buttons to create new children\n if( childHtml['childCreateButton'] ) {\n // Action bar\n html+= '
    ';\n html+= childHtml['childCreateButton'];\n html+= '
    ';\n }\n\n // Add children content : one tab per childlayer\n html+= '
    ';\n // UL content: the tabs title\n html+= '
      ';\n for( var i in childHtml['tab-li'] ){\n var cLi = childHtml['tab-li'][i];\n html+= cLi;\n }\n html+= '
    ';\n\n // Tab content\n html+= '
    ';\n for( var i in childHtml['tab-content'] ){\n var cDiv = childHtml['tab-content'][i];\n html+= cDiv;\n }\n html+= '
    '; // tab-content\n html+= '
    '; // tabbable\n }\n\n // Add the child container content HTML and show it\n $('#edition-children-container').show().append(html);\n\n // Add a hidden input containing the parent feature id\n $('#edition-children-container div.tabbable div.tab-pane input.attribute-table-hidden-parent-layer').after(\n ''\n );\n\n // Replace the id & href attributes of the children tabs\n // to distinguish them from the main attribute table menu (\"Data\")\n $('#edition-children-container div.tabbable ul.nav-tabs li').each(function() {\n $(this).attr('id', $(this).attr('id').replace(/nav-tab-attribute-child-tab-/g, 'nav-tab-edition-child-tab-'));\n });\n $('#edition-children-container div.tabbable ul.nav-tabs li a').each(function() {\n $(this).attr('href', $(this).attr('href').replace(/attribute-child-tab-/g, 'edition-child-tab-'));\n });\n $('#edition-children-container div.tabbable div.tab-content div.tab-pane').each(function() {\n $(this).attr('id', $(this).attr('id').replace(/attribute-child-tab-/g, 'edition-child-tab-'));\n });\n $('#edition-children-container div.tabbable div.tab-content table').each(function() {\n $(this).attr('id', $(this).attr('id').replace(/attribute-layer-/g, 'edition-'));\n });\n\n // Bind click on createFeature button\n // When clicked, we launch the edition of the child feature\n // and pass the parent ID\n $('#edition-children-container button.btn-createFeature-attributeTable')\n .click(function(){\n // Ask if we should really create a child\n // This is important, as the modified data in the parent form\n // will be losed if the user has not saved it\n let confirm_msg = lizDict['edition.confirm.launch.child.creation'];\n let confirmChildCreation = confirm(confirm_msg);\n if (!confirmChildCreation) {\n return false;\n }\n var parentLayerId = layerId;\n var aName = attributeLayersDic[ $(this).val() ];\n lizMap.getLayerFeature(featureType, fid, function(parentFeat) {\n var lid = config.layers[aName]['id'];\n lizMap.launchEdition( lid, null, {layerId:parentLayerId, feature:parentFeat});\n });\n return false;\n })\n .hover(\n function(){ $(this).addClass('btn-primary'); },\n function(){ $(this).removeClass('btn-primary'); }\n );\n\n // Bind click on createFeature button via dropDown\n $('#edition-children-container a.btn-createFeature-attributeTable')\n .click(function(){\n var parentLayerId = layerId;\n var selectedValue = $(this).attr('href').replace('#', '');\n var aName = attributeLayersDic[ selectedValue ];\n lizMap.getLayerFeature(featureType, fid, function(parentFeat) {\n var lid = config.layers[aName]['id'];\n lizMap.launchEdition( lid, null, {layerId:parentLayerId,feature:parentFeat});\n $(this).blur();\n });\n return false;\n })\n .hover(\n function(){ $(this).addClass('btn-primary'); },\n function(){ $(this).removeClass('btn-primary'); }\n );\n\n // Fill the child attribute table with data from the layer with WFS\n lizMap.getLayerFeature(featureType, fid, function(feat) {\n var fp = feat.properties;\n for ( var i=0, len=relations.length; i