11.02.2016, 21:35
|
Интересующийся
|
|
Регистрация: 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.
|
|
12.02.2016, 11:24
|
|
Профессор
|
|
Регистрация: 06.06.2014
Сообщений: 292
|
|
А в фидле можете воспроизвести? Я попытался, не вышло. Заодно вопрос: зачем вы вкладываете форму в форму?
|
|
12.02.2016, 13:09
|
Интересующийся
|
|
Регистрация: 11.02.2016
Сообщений: 18
|
|
Сообщение от Infarch
|
А в фидле можете воспроизвести?
|
Воспроизвести изменение ДОМ-структуры? Затрудняюсь. Если подскажете, как
Сообщение от Infarch
|
Я попытался, не вышло.
|
Насколько я понял, воспроизводится, когда панель с контролом внутри ещё какой-нибудь структуры (у меня в JQUI-диалоге). И опять же - в ИЕ тоже не воспроизводится.
Сообщение от Infarch
|
Заодно вопрос: зачем вы вкладываете форму в форму?
|
Дело в том, что приложение вызывается из другого нагруженного версткой веб-приложения, в котором не поддерживается глубокая кастомизация и прикручивание внешних интерфейсов. Если конкретно, то из интерфейса MS Dynamics CRM. Подсунуть в него Ext напрямую, думаю нереально. Даже банальная подгрузка JQUI вызывает множество
подводных камней, а что уж говорить про ExtJS.
|
|
12.02.2016, 22:18
|
|
Профессор
|
|
Регистрация: 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? Точнее, зачем вообще нужен внешний контейнер? Это классический пример излишней структуры.
|
|
13.02.2016, 15:49
|
Интересующийся
|
|
Регистрация: 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.
|
|
13.02.2016, 18:26
|
Интересующийся
|
|
Регистрация: 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.
|
|
14.02.2016, 01:53
|
Интересующийся
|
|
Регистрация: 11.02.2016
Сообщений: 18
|
|
А вот вам кстати и наглядная демонстрация бага на сайте производителя! Кликаем в разных точках, сразу под надписью "Photo:" на третьей сверху панельке "File Upload Form". В Хроме .
Последний раз редактировалось dismantled, 14.02.2016 в 02:12.
|
|
17.02.2016, 03:03
|
|
Профессор
|
|
Регистрация: 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 небольшая, особенно если вы не используете встроенные механизмы загрузки и отправки формы. С другой стороны, какой смысл их не использовать?
|
|
|
|