//-
    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 = 'transactions'
-var model = '$ctrl.clonedCluster.transactionConfiguration'

panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
    panel-title Transactions
    panel-description
        | Settings for transactions.
        | #[a.link-success(href="https://apacheignite.readme.io/docs/transactions" target="_blank") More info]
    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
        .pca-form-column-6.pc-form-grid-row
            .pc-form-grid-col-30
                +form-field__dropdown({
                    label: 'Concurrency:',
                    model: `${model}.defaultTxConcurrency`,
                    name: '"defaultTxConcurrency"',
                    placeholder: 'PESSIMISTIC',
                    options: '[\
                        {value: "OPTIMISTIC", label: "OPTIMISTIC"},\
                        {value: "PESSIMISTIC", label: "PESSIMISTIC"}\
                    ]',
                    tip: 'Cache transaction concurrency to use when one is not explicitly specified\
                        <ul>\
                            <li>OPTIMISTIC - All cache operations are not distributed to other nodes until commit is called</li>\
                            <li>PESSIMISTIC - A lock is acquired on all cache operations with exception of read operations in READ_COMMITTED mode</li>\
                        </ul>'
                })
            .pc-form-grid-col-30
                +form-field__dropdown({
                    label: 'Isolation:',
                    model: `${model}.defaultTxIsolation`,
                    name: '"defaultTxIsolation"',
                    placeholder: 'REPEATABLE_READ',
                    options: '[\
                        {value: "READ_COMMITTED", label: "READ_COMMITTED"},\
                        {value: "REPEATABLE_READ", label: "REPEATABLE_READ"},\
                        {value: "SERIALIZABLE", label: "SERIALIZABLE"}\
                    ]',
                    tip: 'Default transaction isolation\
                        <ul>\
                            <li>READ_COMMITTED - Always a committed value will be provided for read operations</li>\
                            <li>REPEATABLE_READ - If a value was read once within transaction, then all consecutive reads will provide the same in-transaction value</li>\
                            <li>SERIALIZABLE - All transactions occur in a completely isolated fashion, as if all transactions in the system had executed serially, one after the other.</li>\
                        </ul>'
                })
            .pc-form-grid-col-60
                +form-field__number({
                    label: 'Default timeout:',
                    model: `${model}.defaultTxTimeout`,
                    name: '"defaultTxTimeout"',
                    placeholder: '0',
                    min: '0',
                    tip: 'Default transaction timeout'
                })
            .pc-form-grid-col-30
                +form-field__number({
                    label: 'Pessimistic log cleanup delay:',
                    model: `${model}.pessimisticTxLogLinger`,
                    name: '"pessimisticTxLogLinger"',
                    placeholder: '10000',
                    min: '0',
                    tip: 'Delay, in milliseconds, after which pessimistic recovery entries will be cleaned up for failed node'
                })
            .pc-form-grid-col-30
                +form-field__number({
                    label: 'Pessimistic log size:',
                    model: `${model}.pessimisticTxLogSize`,
                    name: '"pessimisticTxLogSize"',
                    placeholder: '0',
                    min: '0',
                    tip: 'Size of pessimistic transactions log stored on node in order to recover transaction commit if originating node has left grid before it has sent all messages to transaction nodes'
                })
            .pc-form-grid-col-60
                +form-field__java-class({
                    label: 'Manager factory:',
                    model: `${model}.txManagerFactory`,
                    name: '"txManagerFactory"',
                    tip: 'Class name of transaction manager factory for integration with JEE app servers'
                })
            .pc-form-grid-col-60(ng-if='$ctrl.available("2.5.0")')
                +form-field__number({
                    label: 'Partition map exchange timeout:',
                    model: `${model}.txTimeoutOnPartitionMapExchange`,
                    name: '"txTimeoutOnPartitionMapExchange"',
                    placeholder: '0',
                    min: '0',
                    tip: 'Transaction timeout for partition map synchronization in milliseconds'
                })
            .pc-form-grid-col-60(ng-if='$ctrl.available("2.8.0")')
                +form-field__number({
                    label: 'Deadlock timeout:',
                    model: `${model}.deadlockTimeout`,
                    name: '"deadlockTimeout"',
                    placeholder: '10000',
                    min: '0',
                    tip: 'Timeout before starting deadlock detection for caches configured with TRANSACTIONAL_SNAPSHOT atomicity mode in milliseconds'
                })
            .pc-form-grid-col-60
                +form-field__checkbox({
                    label: 'Use JTA synchronization',
                    model: `${model}.useJtaSynchronization`,
                    name: '"useJtaSynchronization"',
                    tip: 'Use lightweight JTA synchronization callback to enlist into JTA transaction instead of creating a separate XA resource'
                })
        .pca-form-column-6
            +preview-xml-java(model, 'clusterTransactions')
