Публикация
//в схему детали
define("UsrSchema1Detail", ["ConfigurationGrid", "ConfigurationGridGenerator",
   "ConfigurationGridUtilities"], function() {
   return {
      entitySchemaName: "UsrContactAnswers",
      attributes: {
         "IsEditable": {
            dataValueType: Terrasoft.DataValueType.BOOLEAN,
            type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
            value: true
         }
      },
      details: {},
      diff: [
         {
            "operation": "merge",
            "name": "DataGrid",
            "values": {
               "className": "Terrasoft.ConfigurationGrid",
               "generator": "ConfigurationGridGenerator.generatePartial",
               "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
               "changeRow": {"bindTo": "changeRow"},
               "unSelectRow": {"bindTo": "unSelectRow"},
               "onGridClick": {"bindTo": "onGridClick"},
               "activeRowActions": [
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "save",
                     "markerValue": "save",
                     "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "cancel",
                     "markerValue": "cancel",
                     "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "remove",
                     "markerValue": "remove",
                     "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                  }
               ],
               "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
               "activeRowAction": {"bindTo": "onActiveRowAction"},
               "multiSelect": false
            }
         }
      ],
      mixins: {
         ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
      },
      methods: {}
   };
});

 

Нравится

Поделиться

0 комментариев
Показать все комментарии

Соединяем редактируемый реестр и множественный выбор и "лечим" результат

1.Редактируемый реестр из https://community.terrasoft.ru/articles/redaktiruemyi-reestr

2.Множественный выбор из академии (https://academy.terrasoft.ru/documents/technic-sdk/7-12/mnozhestvennoe-dobavlenie-zapisey-na-detal)

3.Для корректной работы добавляем в methods{} следующие пару строк:

loadAddedRecords: function(collection) {
    this.reloadGridData();
}

 

Нравится

Поделиться

0 комментариев
Показать все комментарии

Нужно создать Замещающий клиентский модуль "Страница единого окна оператора" (OperatorSingleWindowPage) и вставить код:

define("OperatorSingleWindowPage", [],
    function() {
        return {
            methods: {
                loadContent: function() {
                    //this.loadModule("ESNFeedModule", "centerContainer");
                    this.loadModule("SectionDashboardsModule", "rightContainer");
                    this.loadModule("OperatorQueuesModule", "leftContainer");
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                "operation": "remove",
                "name": "centerContainer"
                }
            ]/**SCHEMA_DIFF*/
        };
    }
);

 

Нравится

Поделиться

0 комментариев
Показать все комментарии

Отредактировать схему детали:

define("UsrSchema1Detail", [], function() {
    return {
        entitySchemaName: "UsrStageInProject",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
            {
                    "operation": "remove",//Удалить кнопку "+"
                    "name": "AddRecordButton"
            },
            {
                    "operation": "remove",//Удалить кнопку " ⋮ "
                    "name": "ToolsButton"
            }]/**SCHEMA_DIFF*/,
        methods: {
                    getCopyRecordMenuItem: function() {
                    return false;},//скрыть кнопку "Копировать"
                    getDeleteRecordMenuItem: function() {
                    return false;}//скрыть кнопку "Удалить"
            }
    };
});

другие элементы настраиваются аналогично

get*NAME OF ELEMENT*: function() {return false;}

Список элементов:

  • getCopyRecordMenuItem
  • getEditRecordMenuItem
  • getDeleteRecordMenuItem
  • getGridSortMenuItem - сортировка
  • getShowQuickFilterButton - показать фильтр
  • getHideQuickFilterButton - скрыть фильтр
  • getGridSettingsMenuItem - настройка колонок

Нравится

Поделиться

0 комментариев
Показать все комментарии

Отредактировать нужно первые 2 строчки, и блок Methods{}. Необходимо добавить определение ["ProcessModuleUtilities"], function(ProcessModuleUtilities),

Если  в function() уже есть что-то, то в скобки через запятую добавляем ProcessModuleUtilities, получится: function(smth, smth, smth, ProcessModuleUtilities).

Аналогично с параметрами: define("FinApplicationSection", ["smth", "smth", "ProcessModuleUtilities"], function(smth, smth, ProcessModuleUtilities)

define("FinApplicationPage", ["FinApplicationPageResources", "GeneralDetails", "ProcessModuleUtilities"],
function(resources, GeneralDetails, ProcessModuleUtilities) {
    return {
        entitySchemaName: 'FinApplication',
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
        attributes: {},
        methods: {
            getActions: function() {//расширяем метод для коллекции кнопок действий
                var actionMenuItems = this.callParent(arguments);
                actionMenuItems.addItem(this.getActionsMenuItem({ //добавляем разделитель
                    Type: "Terrasoft.MenuSeparator",
                    Caption: ""
                }));
                actionMenuItems.addItem(this.getActionsMenuItem({//добавляем кнопку
                    "Caption": "Назначить экспертизы",//текст кнопки
                    "Tag": "runProcess",//имя метода, который запустит процесс, см. ниже
                    "Enabled": {"bindTo": "canEntityBeOperated"}//делать кнопку неактивной, если запись еще не создана
                }));
                return actionMenuItems;
            },
            runProcess: function() {// метод запуска процесса
                var activeRow = this.get("Id");// получаем id текцщей записи
                var config = {
                        sysProcessName: "UsrMyProcess",//имя процесса (то что латиницей с Usr...)
                        parameters: {
                                RecordId: activeRow//левое выражение = имя параметра процесса (по которому будем работать в процессе), правое = переменная, куда на 4 строчки выше мы зашили Id текущей записи
                        }
                };
                ProcessModuleUtilities.executeProcess(config);
            }
        },
        rules: {},
        userCode: {}
    };
});

 

Нравится

Поделиться

0 комментариев
Показать все комментарии

Код добавляется на ту страницу редактирования, где выведены детали. Например, AccountPageV2

ВАЖНО! Если мы пишем свои фильтры, то первым делом необходимо прописать основной фильтр для связи детали. Аналог того, что мы выбираем в мастере при выводе детали на страницу.

ПОСЛЕДОВАТЕЛЬНОСТЬ ДЕЙСТВИЙ:

1. Объявить метод фильтрации в месте вывода детали на странице. Пример ниже

"ContractDetailV20ddfbca0": {
    "schemaName": "ContractDetailV2",
     "entitySchemaName": "Contract",
     "filter": {
        "detailColumn": "Account",
         "masterColumn": "Id"
    },   //не забываем здесь поставить запятую
    "filterMethod": "ContractFilter" // добавляем такую строчку. Название (справа) может быть любым.
},

Описать сам метод в блоке methods{}. Примеры ниже.

ПРИМЕРЫ:

2.1 Стандартный фильтр для связи детали. В данном примере на странице Контрагента наполняет деталь Договоры записями, в которых в поле "Account" указан текущий Контрагент.

ContractFilter: function() {
    var filterGroup = new this.Terrasoft.createFilterGroup(); //создаем группу фильтров
    filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND; //определяем тип фильтра AND или OR
    filterGroup.add("ByAccountFilter"this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.EQUAL"Account"this.get("Id"))
    ); //Собственно, само условие
    return filterGroup;
},

"ByAccountFilter" - название элемента группы фильтров. Может быть любым

Возможные ComparisonType можно посмотреть в консоле, введя Terrasoft.ComparisonType и нажав Enter

Общий вид примерно такой: this.Terrasoft.ComparisonType.EQUAL, Памаметр1, Параметр2

2.2 Фильтр по типу. Выводит записи, у которых Тип НЕ равняется заданным (используем ID нужных нам типов)

ContractFilter: function() {
    var filterGroup = new this.Terrasoft.createFilterGroup();
    filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
    filterGroup.add("ByAccountFilter"this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.EQUAL"Account"this.get("Id"))
    );
    filterGroup.add("ByTypeFilter1"this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.NOT_EQUAL"Type""009c6fa7-2e35-4a94-afd5-03ad8c3eff38")
    );
    filterGroup.add("ByTypeFilter2"this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.NOT_EQUAL"Type""42b49a15-1d6c-4fa3-b24a-45711ba90cb3")
    );
    return filterGroup;
},

Также, если нужно фильтровать запись по значению колонки внутри справочника нашего обьекта(например фильтровать договора, по колонке категории продукта в договоре), можно использовать такой синтаксис в кавычках: вместо "Type" пишем "Product.Category".

2.3 Фильтр по незаполненному полю. Выводит записи, у которых не заполнено заданное поле

ContractFilter: function() {
    var filterGroup = new this.Terrasoft.createFilterGroup();
    filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
    filterGroup.add("ByAccountFilter"this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.EQUAL"UsrAccount"this.get("Id"))
    );
    filterGroup.add(this.Terrasoft.createIsNullFilter(
        this.Ext.create("Terrasoft.ColumnExpression", {columnPath: "UsrEndDate"}) // UsrEndDate - колонка детали, которая пустая
    ));
    return filterGroup;
},

2.4 Фильтр по дате. Выводит записи, у которых дата лежит в пределах от "сегодня" до "сегодня + 60 дней" (значения в миллисекундах)

GraphicFilter: function() {
    var now = new Date();
    var filterGroup = new this.Terrasoft.createFilterGroup();
    filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
    filterGroup.add("ByAccountFilter"this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.EQUAL"UsrAccount"this.get("Id"))
    );
    filterGroup.add("ByDateFilter1"this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.GREATER_OR_EQUAL"UsrDATE"this.Terrasoft.startOfDay(now))
    );
    filterGroup.add("ByDateFilter2"this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.LESS_OR_EQUAL"UsrDATE"this.Terrasoft.endOfDay(new Date(new Date().getTime() + 5184000000)))
    );
    return filterGroup;
},

2.5 Пример вложенности групп фильтров. Выводит связанные записи, у которых Стадия или 1я, или 2я.

Создаем две группы фильтров с операторами AND и OR. Перечисляем все элементы групп в произвольном порядке. В конце вкладываем группу OR в группу AND

OppFilter: function() {
    var filterGroupAnd = new this.Terrasoft.createFilterGroup();
    filterGroupAnd.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
    var filterGroupOr = new this.Terrasoft.createFilterGroup();
    filterGroupOr.logicalOperation = this.Terrasoft.LogicalOperatorType.OR;
    filterGroupAnd.add("ByAccountFilter"this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.EQUAL"Account"this.get("Id"))
    );
    filterGroupOr.add("ByStageFilter1"this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.EQUAL"Stage""c2067b11-0ee0-df11-971b-001d60e938c6")
    );
    filterGroupOr.add("ByStageFilter2"this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.EQUAL"Stage""325f0619-0ee0-df11-971b-001d60e938c6")
    );
    filterGroupAnd.addItem(filterGroupOr);
    return filterGroupAnd;
},

 

Нравится

Поделиться

2 комментария

Можете добавить пример, если колонкой детали и объекта является контрагент, а так же необходима дополнительная фильтрация по логическому полю "Оплата поступила". 

Evgenyi пишет:

Получилось самостоятельно найти решение:. Необходимо обозначить, что контрагент является справочным полем (value).

ContractFilter: function() {

    var filterGroup = new this.Terrasoft.createFilterGroup();

    filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;

    filterGroup.add("ByAccountFilter", this.Terrasoft.createColumnFilterWithParameter(

        this.Terrasoft.ComparisonType.EQUAL, "Account", this.get("Account").value)

Показать все комментарии

1. В разделе дизайнера системы "Права доступа на операции" создать системную операцию. Например, с кодом CanChangeContractFields

2. В код страницы, на которой мы будем использовать нашу операцию добавляем зависимость страницы от модуля RightUtilities. Пример:

define("ContractPageV2", ["RightUtilities","ProcessModuleUtilities"], function(RightUtilities,ProcessModuleUtilities)

3. В блоке methods{} найти и дополнить функцию init:, а если ее нет - вызвать.

При инициализации странички система будет проверять, имеет ли текущий пользователь доступ к указанной системной операции/операциям.

Ответ "да" или "нет" система передаст в указанный нами атрибут.

init: function() {
    const operationNames = [
        "CanChangeContactFields" //Здесь через запятую нужно перечислить все системные операции, которые нужно проверить
    ];
    RightUtilities.checkCanExecuteOperations(operationNames, function(result) {
        this.set("FieldsRights", result.CanChangeContactFields); // "FieldsRights" - название атрибута, в который мы передаем результат проверки
    }this);  // CanChangeContactFields - проверку по какой операции мы передаем в атрибут
    this.callParent(arguments);
}

4. Использовать ответ. Например, на поле или кнопке

4.1 ДОСТУП К РЕДАКТИРОВАНИЮ ПОЛЯ

Для этого находим наше поле в блоке diff[] и изменяем значение параметра "enabled"

{
    "operation": "insert",
    "name": "STRING2b088f15-40f9-4bbb-a4bc-dd846be945b2",
    "values": {
        "layout": {
            "colSpan": 12,
            "rowSpan": 1,
            "column": 0,
            "row": 3,
            "layoutName": "Header"
        },
        "bindTo": "UsrField1"//Название нашего поля
        "enabled": {
            "bindTo": "FieldsRights" //возможность редактирования поля зависит от результата проверки, который хранит указанный ранее атрибут
        }
    },
    "parentName": "Header",
    "propertyName": "items",
    "index": 6
}

4.2 ДОСТУП К НАЖАТИЮ КНОПКИ

По аналогии используем параметр "enabled". Например, кнопка в меню "Действия":

 actionMenuItems.addItem(this.getActionsMenuItem({
    "Caption": "Тестовая кнопка",
    "Tag": "runProcess",
    "Enabled": {"bindTo": "FieldsRights"}//активность кнопки зависит от результата проверки, который хранит указанный ранее атрибут
}));

 

Нравится

Поделиться

0 комментариев
Показать все комментарии

Добавляем в карточку контакта

diff: /**SCHEMA_DIFF*/[
    {
        "operation": "remove",
        "name": "AccountProfile"
    }
}]/**SCHEMA_DIFF*/,

 

Нравится

Поделиться

0 комментариев
Показать все комментарии

1. В код страницы, на которой мы будем добавлять нашу кнопку, добавляем зависимость страницы от модуля ProcessModuleUtilities. Пример:

define("ContractPageV2", ["RightUtilities","ProcessModuleUtilities"], function(RightUtilities,ProcessModuleUtilities)

2. Добавляем в блок diff[] страницы редактирования раздела следующий код:

{
    "operation": "insert",
    "name": "YourButtonName", // название нашей кнопки (используется в коде, пользователь не видит)
    "values": {
        "itemType": 5,
        "style": "green", //цвет кнопки. Выбор из наших стандартных
        "classes": {
            "textClass": ["actions-button-margin-right"], //чтобы при добавлении еще одной кнопки был отступ справа
            "wrapperClass": ["actions-button-margin-right"]
        },
        "caption": { // заголовок вашей кнопки (который отображается пользователю)
            "bindTo": "Resources.Strings.YourButtoncaptionLocalizableString"    // можно задать явно. Например, "caption": "Красивая кнопка"
        },
        "click": {
            "bindTo": "onYourButtonClick" // Название метода, который будет отрабатывать при клике на кнопку
        },
        "visible": true, //Отвечает за видимость кнопки
        "enabled": true    //для ознакомления, можно удалить. Отвечает за активность кнопки
    },
    "parentName": "LeftContainer",
    "propertyName": "items",
    "index": 10 //следующая кнопка будет иметь индекс 11 и т.д.
}

3. Добавляем в блок methods{} страницы редактирования раздела следующий код:

onYourButtonClick: function() { //название метода, указанное при добавлении кнопки
    ProcessModuleUtilities.executeProcess({
        sysProcessName: "YourProcessName", //имя вашего процесса
        parameters: {
            ParamName: this.get("Id"), //слева название параметра процесса, в который мы передаем то, что справа
        },
        callback: function(item) { //этот блок не обязательнен
            this.onReloadCard(); //перезагружает страницу после окончания БП
            this.hideBodyMask(); //не выводит заглушку загрузки на карточке
        }.bind(this)
    });
}

4. Дублируем код для кнопки из пункта 2 в блок diff[] секции раздела. Все тоже самое, кроме атрибута "click": и нового "tag" (в блоке "values"):

"click": { "bindTo": "onCardAction" },
"tag": "onYourButtonClick",             //название метода, указанное при добавлении кнопки

 

Нравится

Поделиться

0 комментариев
Показать все комментарии
Публикация
//Добавляем в методы
 
methods: {
            setValidationConfig: function() {
                this.callParent(arguments);
                this.addColumnValidator("UsrLastName", this.lastNameValidator); // Только кириллица и тире. Количество символов не может превышать 100 UsrLastName, UsrFirstName и т.д  - названия колонок
                this.addColumnValidator("UsrFirstName", this.firstNameValidator);// Только кириллица и тире. Количество символов не может превышать 100
                this.addColumnValidator("UsrMiddleName", this.middleNameValidator);// Только кириллица и тире. Количество символов не может превышать 100
                this.addColumnValidator("UsrPhone", this.usrPhoneValidator);// Номер телефона не соответствует маске +Ц(ЦЦЦ)ЦЦЦ-ЦЦ-ЦЦ
                this.addColumnValidator("UsrOGRN", this.usrOGRNValidator);//ОГРН должен состоять из 13 цифр
                this.addColumnValidator("UsrINN", this.usrINNValidator);// ИНН ЮЛ должен состоять из 10 цифр
                this.addColumnValidator("UsrAULFullName", this.usrAULFullNameValidator);// Полное наименование ЮЛ не может превышать 512 символов
                this.addColumnValidator("UsrAULShortName", this.usrAULShortNameValidator);// Сокращенное наименование ЮЛ не может превышать 255 символов
                this.addColumnValidator("UsrEmail", this.usrEmailValidator);// Некорректное значение адреса электронной почты
                this.addColumnValidator("UsrLicPer", this.usrLicPerValidator);// Значение должно быть в диапазоне от 1 до 5
            },
            usrLicPerValidator: function() {
                var invalidMessage = "";
                var value = this.get("UsrLicPer");
                invalidMessage = this.usrLicPerFunctionNG(value);
                return {
                    fullInvalidMessage: invalidMessage,
                    invalidMessage: invalidMessage
                };
            },
            usrLicPerFunctionNG: function(value) {
                return value < 1 || value > 5 ? "Значение должно быть в диапазоне от 1 до 5" : "";
            },
            usrEmailValidator: function() {
                var invalidMessage = "";
                var value = this.get("UsrEmail");
                invalidMessage = this.usrEmailFunctionNG(value);
                return {
                    fullInvalidMessage: invalidMessage,
                    invalidMessage: invalidMessage
                };
            },
            usrEmailFunctionNG: function(value) {
                if (!Ext.isEmpty(value)) {
                    if (!((/^[-._a-z0-9]+@(?:[a-z0-9][-a-z0-9]+\.)+[a-z]{2,6}$/.test(value)))) {
                        return "Некорректное значение адреса электронной почты";
                    }
                }
                return "";
            },
            usrAULFullNameValidator: function() {
                var invalidMessage = "";
                var value = this.get("UsrAULFullName");
                invalidMessage = this.usrAULFullNameFunctionNG(value);
                return {
                    fullInvalidMessage: invalidMessage,
                    invalidMessage: invalidMessage
                };
            },
            usrAULFullNameFunctionNG: function(value) {
                return value && value.length > 512 ? "Полное наименование ЮЛ не может превышать 512 символов" : "";
            },
            usrAULShortNameValidator: function() {
                var invalidMessage = "";
                var value = this.get("UsrAULShortName");
                invalidMessage = this.usrAULShortNameFunctionNG(value);
                return {
                    fullInvalidMessage: invalidMessage,
                    invalidMessage: invalidMessage
                };
            },
            usrAULShortNameFunctionNG: function(value) {
                return value && value.length > 254 ? "Сокращенное наименование ЮЛ не может превышать 255 символов" : "";
            },
            usrINNValidator: function() {
                var invalidMessage = "";
                var value = this.get("UsrINN");
                invalidMessage = this.usrINNFunctionNG(value);
                return {
                    fullInvalidMessage: invalidMessage,
                    invalidMessage: invalidMessage
                };
            },
            usrINNFunctionNG: function(value) {
                if (!Ext.isEmpty(value)) {
                    if (!((/^\d{10}$/.test(value)))) {
                        return "ИНН ЮЛ должен состоять из 10 цифр";
                    }
                }
                return "";
            },
            usrOGRNValidator: function() {
                var invalidMessage = "";
                var value = this.get("UsrOGRN");
                invalidMessage = this.usrOGRFunctionNG(value);
                return {
                    fullInvalidMessage: invalidMessage,
                    invalidMessage: invalidMessage
                };
            },
            usrOGRFunctionNG: function(value) {
                if (!Ext.isEmpty(value)) {
                    if (!((/^\d{13}$/.test(value)))) {
                        return "ОГРН должен состоять из 13 цифр";
                    }
                }
                return "";
            },
            usrPhoneValidator: function() {
                var invalidMessage = "";
                var value = this.get("UsrPhone");
                invalidMessage = this.mobileFunctionNG(value);
                return {
                    fullInvalidMessage: invalidMessage,
                    invalidMessage: invalidMessage
                };
            },
            mobileFunctionNG: function(value) {
                if (!Ext.isEmpty(value)) {
                    if (!((/^\+\d\(\d{3}\)\d{3}\-\d{2}\-\d{2}$/.test(value)))) {
                        return "Номер телефона не соответствует маске +Ц(ЦЦЦ)ЦЦЦ-ЦЦ-ЦЦ";
                    }
                }
                return "";
            },
            lastNameValidator: function() {
                var invalidMessage = "";
                var value = this.get("UsrLastName");
                invalidMessage = this.fioFunctionNG(value);
                return {
                    fullInvalidMessage: invalidMessage,
                    invalidMessage: invalidMessage
                };
            },
            firstNameValidator: function() {
                var value = this.get("UsrFirstName");
                var invalidMessage = "";
                invalidMessage = this.fioFunctionNG(value);
                return {
                    fullInvalidMessage: invalidMessage,
                    invalidMessage: invalidMessage
                };
            },
            middleNameValidator: function() {
                var value = this.get("UsrMiddleName");
                var invalidMessage = "";
                invalidMessage = this.fioFunctionNG(value);
                return {
                    fullInvalidMessage: invalidMessage,
                    invalidMessage: invalidMessage
                };
            },
            fioFunctionNG: function(value) {
                if (!Ext.isEmpty(value)) {
                    if (!((/^[а-яА-ЯёЁ][а-яА-ЯёЁ\-]{1,99}$/.test(value)))) {
                        return "Только кириллица и тире. Количество символов не может превышать 100.";
                    }
                }
                return "";
            }
        },

 

Нравится

Поделиться

0 комментариев
Показать все комментарии