Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.02.2016, 21:35
Интересующийся
Отправить личное сообщение для dismantled Посмотреть профиль Найти все сообщения от dismantled
 
Регистрация: 11.02.2016
Сообщений: 18

Баг контрола filefield
Коллеги, столкнулся с багом контрола выбора файла filefield.
Баг заявлен тут. Судя по всему его исправили в 6.0.1, но получить эту версию по GPL нельзя. Баг воспроизводится в Хроме 48.0.2564.109. В ИЕ11 не воспроизводится.
Собственно проблема - при клике по полю или его лейблу (focus на контейнер контрола) вся форма (panel) съезжает вверх. Если сразу нажать на выбор файла, то всё ок. Визуально получается вот так:
http://img.prntscr.com/img?url=http:...om/L0VeA48.png

Кто-нибудь решал подобную проблему? Или есть предложение какого-нибудь воркэраунда?

Спасибо.

Вот код формы:
Ext.define("ImportTemplates.view.main.Main", {
    extend: "Ext.form.Panel",
    xtype: "form-fileuploads",
    controller: "form-fileuploads",

    border: 0,
    bodyStyle: "background:transparent;",

    defaults: {
        layout: "anchor"
    },

    items: [
        {
            xtype: "form",
            frame: true,
            bodyPadding: "10 10 0",
            reference: "firstForm",

            defaults: {
                anchor: "100%",
                allowBlank: false,
                msgTarget: "side",
                labelWidth: 80
            },

            items: [
                {
                    xtype: "datefield",
                    fieldLabel: "Дата старта",
                    format: "d.m.Y",
                    name: "dob",
                    allowBlank: false,
                    maxValue: new Date()
                }, {
                    xtype: "filefield",
                    fieldLabel: "Файл",
                    name: "photo-path",
                    buttonText: "",
                    buttonConfig: {
                        icon: "resources/excel.gif"
                    }
                }, {
                    xtype: "combobox",
                    reference: "operators",
                    fieldLabel: "Оператор",
                    displayField: "operator",
                    store: {
                        type: "operators"
                    },
                    queryMode: "local",
                    minChars: 0,
                    typeAhead: true
                }
            ],

            buttons: [
                {
                    text: "Загрузить",
                    handler: "firstFormSave"
                }, {
                    text: "Очистить",
                    handler: "firstFormReset"
                }
            ]
        }
    ]
});

Последний раз редактировалось dismantled, 11.02.2016 в 21:40.
Ответить с цитированием
  #2 (permalink)  
Старый 12.02.2016, 11:24
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

А в фидле можете воспроизвести? Я попытался, не вышло. Заодно вопрос: зачем вы вкладываете форму в форму?
Ответить с цитированием
  #3 (permalink)  
Старый 12.02.2016, 13:09
Интересующийся
Отправить личное сообщение для dismantled Посмотреть профиль Найти все сообщения от dismantled
 
Регистрация: 11.02.2016
Сообщений: 18

Сообщение от Infarch Посмотреть сообщение
А в фидле можете воспроизвести?
Воспроизвести изменение ДОМ-структуры? Затрудняюсь. Если подскажете, как

Сообщение от Infarch Посмотреть сообщение
Я попытался, не вышло.
Насколько я понял, воспроизводится, когда панель с контролом внутри ещё какой-нибудь структуры (у меня в JQUI-диалоге). И опять же - в ИЕ тоже не воспроизводится.

Сообщение от Infarch Посмотреть сообщение
Заодно вопрос: зачем вы вкладываете форму в форму?
Дело в том, что приложение вызывается из другого нагруженного версткой веб-приложения, в котором не поддерживается глубокая кастомизация и прикручивание внешних интерфейсов. Если конкретно, то из интерфейса MS Dynamics CRM. Подсунуть в него Ext напрямую, думаю нереально. Даже банальная подгрузка JQUI вызывает множество
подводных камней, а что уж говорить про ExtJS.
Ответить с цитированием
  #4 (permalink)  
Старый 12.02.2016, 22:18
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Я помню, что менял стили файлового поля, но конкретно этот баг не помню. Пыщ. Надо пофиксить.

Если у вас нет доступа к 6.0.1, то изменения SASS вам наверное и ни к чему. Используйте вот такой CSS хак в Chrome:

input.x-form-file-input {
    top: 0;
    right: 0;
    width: 100%;
    height: 100%;
    overflow: hidden;
}


И тоже повторю вопрос Infarch: зачем у вас внешний контейнер наследуется от Ext.form.Panel, если вы вкладываете в него ещё один контейнер с xtype: form? Точнее, зачем вообще нужен внешний контейнер? Это классический пример излишней структуры.
Ответить с цитированием
  #5 (permalink)  
Старый 13.02.2016, 15:49
Интересующийся
Отправить личное сообщение для dismantled Посмотреть профиль Найти все сообщения от dismantled
 
Регистрация: 11.02.2016
Сообщений: 18

nohuhu,
Спасибо за рекомендации и разъяснения.
К сожалению предложенный хак не решил проблему . Пробовал и с !important и собственным именем класса. Результат по клику на filefield тот же самый: сползает вверх.

Также проникся по поводу контейнеров. Честно говоря, это мой первый проект на ExtJS, поэтому что-то частично копипастилось с открытых примеров . Несколько переделал. Так корректнее?

Ext.define("ImportTemplates.view.main.Main", {
    extend: "Ext.container.Container",
    xtype: "container",

    defaults: {
        xtype: "panel",
        controller: "panel",
        frame: true,
        bodyPadding: 10,
        layout: "anchor"
    },

    items: [
        {
            defaults: {
                anchor: "100%",
                allowBlank: false
            },

            items: [
                {
                    xtype: "datefield",
                    name: "startdate",
                    reference: "startdate",
                    fieldLabel: "Дата старта",
                    format: "d.m.Y",
                    maxValue: new Date()
                }, {
                    xtype: "combobox",
                    name: "operators",
                    reference: "operators",
                    fieldLabel: "Оператор",
                    displayField: "operator",
                    store: {
                        type: "operators"
                    },
                    queryMode: "local",
                    minChars: 0,
                    typeAhead: true
                }, {
                    xtype: "filefield",
                    name: "myfile",
                    reference: "myfile",
                    fieldLabel: "Файл",
                    buttonText: "",
                    buttonConfig: {
                        icon: "resources/excel.gif"
                    }
                }
            ],

            buttons: [
                {
                    text: "Загрузить",
                    handler: "firstFormSave"
                }, {
                    text: "Очистить",
                    handler: "firstFormReset"
                }
            ]
        }, {
            title: "Результат обработки",
            height: 200,
            collapsed: true,
            collapsible: true,
            scrollable: true,
            html: "Текст",
            tools: [
                { type: "save" }
            ]
        }
    ]
});

Последний раз редактировалось dismantled, 13.02.2016 в 15:55.
Ответить с цитированием
  #6 (permalink)  
Старый 13.02.2016, 18:26
Интересующийся
Отправить личное сообщение для dismantled Посмотреть профиль Найти все сообщения от dismantled
 
Регистрация: 11.02.2016
Сообщений: 18

Рабочий "хак" найден!
Спасибо всем за помощь и идеи.

.z-filefield { pointer-events: none; }
.z-filefield-but { pointer-events: all; }

xtype: "filefield",
name: "myfile",
reference: "myfile",
fieldLabel: "Файл",
buttonText: "",
cls: "z-filefield",
buttonConfig: {
    icon: "resources/excel.gif",
    cls: "z-filefield-but"
}


ЗЫ: и кажется я понял, о каком фидле шла речь. Сначала про "фидлер" подумал

Последний раз редактировалось dismantled, 13.02.2016 в 18:39.
Ответить с цитированием
  #7 (permalink)  
Старый 14.02.2016, 01:53
Интересующийся
Отправить личное сообщение для dismantled Посмотреть профиль Найти все сообщения от dismantled
 
Регистрация: 11.02.2016
Сообщений: 18

А вот вам кстати и наглядная демонстрация бага на сайте производителя! Кликаем в разных точках, сразу под надписью "Photo:" на третьей сверху панельке "File Upload Form". В Хроме .

Последний раз редактировалось dismantled, 14.02.2016 в 02:12.
Ответить с цитированием
  #8 (permalink)  
Старый 17.02.2016, 03:03
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Сообщение от dismantled Посмотреть сообщение
К сожалению предложенный хак не решил проблему :(. Пробовал и с !important и собственным именем класса. Результат по клику на filefield тот же самый: сползает вверх.
Проверьте, что нужные стили применились к полю. Попробуйте руками их применить в отладчике и протестируйте. У меня баг воспроизводился при фокусировании file field после фокусирования последнего поля, с исправленным CSS эффект пропадал. Если стили применяются, но поле всё равно прыгает, опишите подробнее сценарий.

В 6.0.1+ этот баг не проявляется, потому что я менял CSS для других целей и случайно пофиксил эту проблему тоже. Бывает. :)

С pointer-events: none аккуратнее, проверьте что работает как нужно во всех браузерах. С Firefox периодически бывают проблемы на эту тему. Лучше всего такие хаки применять к конкретному браузеру и через правила с высокой специфичностью, чтобы не создавать себе лишних проблем.

Цитата:
Также проникся по поводу контейнеров. Честно говоря, это мой первый проект на ExtJS, поэтому что-то частично копипастилось с открытых примеров . Несколько переделал. Так корректнее?
Не совсем. Я в прошлый раз просмотрел, что у вас во внешнем контейнере есть не только форма, а ещё и панель с результатами обработки, и решил, что внешний контейнер лишний. Поправляюсь: в данном случае внешний контейнер нужен, но делать его формой смысла нет. Я бы оставил внешний контейнер обычной панелью, а форму с полями формой.

В принципе разница между Ext.panel.Panel и Ext.form.Panel небольшая, особенно если вы не используете встроенные механизмы загрузки и отправки формы. С другой стороны, какой смысл их не использовать?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Баг (если водить курсором по картинках то они отступают в разные стороны) злобная_пипа jQuery 4 06.11.2015 16:50
Нужна помощь с доработкой JS, исправить 1 баг, можно даже за $ Kanzaki Элементы интерфейса 18 14.09.2011 21:21
Очередной баг jQuery? monolithed jQuery 8 27.01.2011 10:16
Забавный баг (фича?) в Chrome / Safari Cr@ZyBoY Opera, Safari и др. 11 22.02.2010 17:26
Баг с jpeg в ie6 JsLoveR Элементы интерфейса 20 28.01.2010 20:57