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

panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
    panel-title Time configuration
    panel-description Time settings for CLOCK write ordering mode.
    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
        .pca-form-column-6.pc-form-grid-row
            //- Removed in ignite 2.0
            .pc-form-grid-col-30(ng-if-start='$ctrl.available(["1.0.0", "2.0.0"])')
                +form-field__number({
                    label: 'Samples size:',
                    model: `${model}.clockSyncSamples`,
                    name: '"clockSyncSamples"',
                    placeholder: '8',
                    min: '0',
                    tip: 'Number of samples used to synchronize clocks between different nodes<br/>\
                          Clock synchronization is used for cache version assignment in CLOCK order mode'
                })
            .pc-form-grid-col-30(ng-if-end)
                +form-field__number({
                    label: 'Frequency:',
                    model: `${model}.clockSyncFrequency`,
                    name: '"clockSyncFrequency"',
                    placeholder: '120000',
                    min: '0',
                    tip: 'Frequency at which clock is synchronized between nodes, in milliseconds<br/>\
                          Clock synchronization is used for cache version assignment in CLOCK order mode'
                })

            .pc-form-grid-col-30
                +form-field__number({
                    label: 'Port base:',
                    model: `${model}.timeServerPortBase`,
                    name: '"timeServerPortBase"',
                    placeholder: '31100',
                    min: '0',
                    max: '65535',
                    tip: 'Time server provides clock synchronization between nodes<br/>\
                         Base UPD port number for grid time server. Time server will be started on one of free ports in range'
                })

            .pc-form-grid-col-30
                +form-field__number({
                    label: 'Port range:',
                    model: `${model}.timeServerPortRange`,
                    name: '"timeServerPortRange"',
                    placeholder: '100',
                    min: '1',
                    tip: 'Time server port range'
                })
        .pca-form-column-6
            +preview-xml-java(model, 'clusterTime')
