//-
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

include /app/helpers/jade/mixins
include /app/configuration/mixins

-var form = 'cacheKeyCfg'
-var model = '$ctrl.clonedCluster.cacheKeyConfiguration'

panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
    panel-title Cache key configuration
    panel-description
        | Cache key configuration allows to collocate objects in a partitioned cache based on field in cache key without explicit usage of annotations on user classes.
    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
        .pca-form-column-6
            .ignite-form-field
                +form-field__label({ label: 'Cache key configuration:', name: '"cacheKeyConfiguration"' })

                list-editable.pc-list-editable-with-form-grid(ng-model=model name='cacheKeyConfiguration')
                    list-editable-item-edit.pc-form-grid-row
                        - form = '$parent.form'
                        .pc-form-grid-col-60
                            +form-field__java-class({
                                label: 'Type name:',
                                model: '$item.typeName',
                                name: '"cacheKeyTypeName"',
                                required: 'true',
                                tip: 'Type name'
                            })(
                                ignite-form-field-input-autofocus='true'
                                ignite-unique=model
                                ignite-unique-property='typeName'
                            )
                                +form-field__error({ error: 'igniteUnique', message: 'Type name should be unique.' })
                        .pc-form-grid-col-60
                            +form-field__text({
                                label: 'Affinity key field name:',
                                model: '$item.affinityKeyFieldName',
                                name: '"affinityKeyFieldName"',
                                placeholder: 'Enter field name',
                                tip: 'Affinity key field name',
                                required: true
                            })

                    list-editable-no-items
                        list-editable-add-item-button(
                            add-item=`(${model} = ${model} || []).push({})`
                            label-single='configuration'
                            label-multiple='configurations'
                        )

        .pca-form-column-6
            +preview-xml-java(model, 'clusterCacheKeyConfiguration')
