AlexanderP Posted April 9 Posted April 9 Добрый вечер! Хочется в таблицу в верхний левый угол добавить свою кнопку с привязкой в PopupMenu сделать что то типа такого я долго искал как это сделать и нашел один пост, но там как я понял происходит преобразование кнопки очистки фильтра а этого не хочется, т.к. эта кнопка тоже нужна можно как то новую копку добавить, к примеру выше кнопки очистить ? Quote
AlexanderP Posted April 11 Author Posted April 11 Добрый день! Sherzod, а по этой теме посмотрите ? Quote
Sherzod Posted April 11 Posted April 11 On 4/9/2025 at 9:09 PM, AlexanderP said: можно как то новую копку добавить, к примеру выше кнопки очистить ? Quote
AlexanderP Posted April 11 Author Posted April 11 18 minutes ago, Sherzod said: Sherzod код не вложили Quote
Sherzod Posted April 11 Posted April 11 42 minutes ago, AlexanderP said: код не вложили Я знаю, мне нужно подготовить код. Quote
Sherzod Posted April 12 Posted April 12 15 hours ago, AlexanderP said: код не вложили Доброе утро! Одно из возможных решений, попробуйте так: 1. Кидаете на форму компонент UniMenuButton, помещая его в UniHiddenPanel. 2. UniDBGrid.ClientEvents.UniEvents -> function beforeInit(sender, config) { sender.attachMenuToRowNumberer = function(component) { var grid = this; var rowNumbererCol = grid.columnManager.getColumns().find(function(col) { return col.xtype === 'rownumberer'; }); if (rowNumbererCol) { component.setWidth('100%'); rowNumbererCol.insert(0, component); component.setStyle({ marginBottom: '2px' }); if (rowNumbererCol.titleEl) { rowNumbererCol.titleEl.setHeight(0); } } }; } 3. В MainForm.OnReady вызываете метод: procedure TMainForm.UniFormReady(Sender: TObject); begin if dgRowNumbers in UniDBGrid1.Options then begin JSInterface.JSCall('attachMenuToRowNumberer', [UniMenuButton1.JSControl], UniDBGrid1.JSControl); end; end; 4. Далее работаете с меню как обычно — обработка команд идёт на серверной стороне. Quote
Sherzod Posted April 12 Posted April 12 * Хотя Вы также можете размещать кнопку меню ниже иконки очистки фильтров. Для этого потребуется немного изменить код: анализировать не индекс 0, а 1, и, соответственно, устанавливать отступ сверху, а не снизу (marginTop вместо marginBottom). Quote
AlexanderP Posted April 12 Author Posted April 12 3 hours ago, Sherzod said: * Хотя Вы также можете размещать кнопку меню ниже иконки очистки фильтров. Для этого потребуется немного изменить код: анализировать не индекс 0, а 1, и, соответственно, устанавливать отступ сверху, а не снизу (marginTop вместо marginBottom). Sherzod Спасибо!! я гляну чуть позже и отпишусь Quote
AlexanderP Posted April 12 Author Posted April 12 6 hours ago, Sherzod said: Доброе утро! Одно из возможных решений, попробуйте так: 1. Кидаете на форму компонент UniMenuButton, помещая его в UniHiddenPanel. 2. UniDBGrid.ClientEvents.UniEvents -> function beforeInit(sender, config) { sender.attachMenuToRowNumberer = function(component) { var grid = this; var rowNumbererCol = grid.columnManager.getColumns().find(function(col) { return col.xtype === 'rownumberer'; }); if (rowNumbererCol) { component.setWidth('100%'); rowNumbererCol.insert(0, component); component.setStyle({ marginBottom: '2px' }); if (rowNumbererCol.titleEl) { rowNumbererCol.titleEl.setHeight(0); } } }; } 3. В MainForm.OnReady вызываете метод: procedure TMainForm.UniFormReady(Sender: TObject); begin if dgRowNumbers in UniDBGrid1.Options then begin JSInterface.JSCall('attachMenuToRowNumberer', [UniMenuButton1.JSControl], UniDBGrid1.JSControl); end; end; 4. Далее работаете с меню как обычно — обработка команд идёт на серверной стороне. Sherzod, проверил все работает, но заметил такой момент, кнопка при загрузке чуть ниже верхнего края, мешает стиль padding у titleEl при нажатии на кнопку очистить фильтр, все ставится на место, как и должно быть я посмотрел и пытался сам по умолчанию скинуть стиль rowNumbererCol.titleEl.setStyle({padding: 'unset'}) , но не хочет применяться можешь глянуть ? Видео-12-04-2025 130108.mp4 Quote
AlexanderP Posted April 14 Author Posted April 14 Добрый день! Sherzod, посмотрите по ему последнему вопросу ? Еще столкнулся с тем, что если в Options отключить dgFilterClearButton (в некоторых таблицах кнопка "Очистить" не нужна), то кнопка не создается увидел в что не создается контейнер x-autocontainer-outerCt, при отсутствии кнопки очистить. можно что то сделать, чтобы кнопка UniMenuButton создавалась при отключенном в Options dgFilterClearButton ? Quote
AlexanderP Posted April 15 Author Posted April 15 On 4/12/2025 at 1:13 PM, AlexanderP said: Sherzod, проверил все работает, но заметил такой момент, кнопка при загрузке чуть ниже верхнего края, мешает стиль padding у titleEl при нажатии на кнопку очистить фильтр, все ставится на место, как и должно быть я посмотрел и пытался сам по умолчанию скинуть стиль rowNumbererCol.titleEl.setStyle({padding: 'unset'}) , но не хочет применяться можешь глянуть ? Видео-12-04-2025 130108.mp4 186.93 kB · 0 downloads Sherzod с этим моментом вроде как сам разобрался, унес изменение стиля сюда, не знаю насколько это правильно, где то на форуме подсмотрел что можно стиль менять в afterlayout function afterlayout(sender, layout, eOpts) { sender.columnManager.getColumns().forEach(function(col) { if (col.xtype && col.xtype == 'rownumberer') { if (col.titleEl) { col.titleEl.setStyle({padding: 'unset'}); col.titleEl.setHeight(0); } } }); } но возникла еще проблемка, когда пытаюсь перенести поле кнопка исчезает, глянул по логам в этот момент возникает событие reconfigure тоже само возникает если поле выключить или включить таким образом UniDBGrid1->Columns->Items[3]->Visible = false/true Видео-15-04-2025 151253.mp4 Quote
AlexanderP Posted April 17 Author Posted April 17 Добрый день! Sherzod, посмотрите мои последние вопросы ? Quote
Sherzod Posted April 17 Posted April 17 14 minutes ago, AlexanderP said: посмотрите мои последние вопросы ? Добрый день! Я попробую проанализировать. Quote
AlexanderP Posted April 28 Author Posted April 28 On 4/17/2025 at 2:20 PM, Sherzod said: Добрый день! Я попробую проанализировать. Добрый день! Sherzod, смотрели, получилось что то ? Quote
Sherzod Posted April 29 Posted April 29 Добрый день! 21 hours ago, AlexanderP said: смотрели, получилось что то ? Отменяем все предыдущие решения, обсуждавшиеся выше. Мы больше не будем использовать UniMenuButton. Вместо этого мы будем отправлять запросы на UniDBGrid, которые нужно будет обрабатывать в событии OnAjaxEvent. Решение: OnFormCreate -> UniDBGrid1.JSInterface.JSAddListener( 'columnschanged', 'function(ct, eOpts) {' + 'var rowCol = ct.down("rownumberer");' + 'if (rowCol) {' + 'if (rowCol.titleEl && rowCol.titleEl.setHeight) rowCol.titleEl.setHeight(0);' + 'if (!rowCol.items) {' + 'rowCol.items = new Ext.util.MixedCollection();' + 'rowCol.add(Ext.create("Ext.Component", { html: " " }));' + '}' + 'var existingBtn = rowCol.items.findBy(function(cmp) { return cmp.itemId === "RowNumbererMenuButton"; });' + 'if (!existingBtn) {' + 'var newBtn = Ext.create("Ext.button.Button", {' + 'text: "",' + 'iconCls: "x-fa fa-bars",' + // иконка для кнопки 'tooltip: "Действия",' + 'itemId: "RowNumbererMenuButton",' + 'menu: Ext.create("Ext.menu.Menu", {' + 'items: [' + '{ text: "Обновить", iconCls: "x-fa fa-sync", handler: function() { ajaxRequest('#1', "RefreshClicked", []); } },' + '{ text: "Удалить", iconCls: "x-fa fa-trash", handler: function() { ajaxRequest('#1', "DeleteClicked", []); } }' + ']' + '})' + '});' + 'rowCol.insert(0, newBtn);' + 'newBtn.setWidth("100%");' + 'newBtn.setStyle({ marginBottom: "2px" });' + '}' + '}' + '}' ); Quote
AlexanderP Posted April 29 Author Posted April 29 11 minutes ago, Sherzod said: Добрый день! Отменяем все предыдущие решения, обсуждавшиеся выше. Мы больше не будем использовать UniMenuButton. Вместо этого мы будем отправлять запросы на UniDBGrid, которые нужно будет обрабатывать в событии OnAjaxEvent. Решение: OnFormCreate -> UniDBGrid1.JSInterface.JSAddListener( 'columnschanged', 'function(ct, eOpts) {' + 'var rowCol = ct.down("rownumberer");' + 'if (rowCol) {' + 'if (rowCol.titleEl && rowCol.titleEl.setHeight) rowCol.titleEl.setHeight(0);' + 'if (!rowCol.items) {' + 'rowCol.items = new Ext.util.MixedCollection();' + 'rowCol.add(Ext.create("Ext.Component", { html: " " }));' + '}' + 'var existingBtn = rowCol.items.findBy(function(cmp) { return cmp.itemId === "RowNumbererMenuButton"; });' + 'if (!existingBtn) {' + 'var newBtn = Ext.create("Ext.button.Button", {' + 'text: "",' + 'iconCls: "x-fa fa-bars",' + // иконка для кнопки 'tooltip: "Действия",' + 'itemId: "RowNumbererMenuButton",' + 'menu: Ext.create("Ext.menu.Menu", {' + 'items: [' + '{ text: "Обновить", iconCls: "x-fa fa-sync", handler: function() { ajaxRequest('#1', "RefreshClicked", []); } },' + '{ text: "Удалить", iconCls: "x-fa fa-trash", handler: function() { ajaxRequest('#1', "DeleteClicked", []); } }' + ']' + '})' + '});' + 'rowCol.insert(0, newBtn);' + 'newBtn.setWidth("100%");' + 'newBtn.setStyle({ marginBottom: "2px" });' + '}' + '}' + '}' ); Добрый день! Круто получилось !! Sherzod, Спасибо! 1 Quote
AlexanderP Posted April 30 Author Posted April 30 23 hours ago, Sherzod said: Добрый день! Отменяем все предыдущие решения, обсуждавшиеся выше. Мы больше не будем использовать UniMenuButton. Вместо этого мы будем отправлять запросы на UniDBGrid, которые нужно будет обрабатывать в событии OnAjaxEvent. Решение: OnFormCreate -> UniDBGrid1.JSInterface.JSAddListener( 'columnschanged', 'function(ct, eOpts) {' + 'var rowCol = ct.down("rownumberer");' + 'if (rowCol) {' + 'if (rowCol.titleEl && rowCol.titleEl.setHeight) rowCol.titleEl.setHeight(0);' + 'if (!rowCol.items) {' + 'rowCol.items = new Ext.util.MixedCollection();' + 'rowCol.add(Ext.create("Ext.Component", { html: " " }));' + '}' + 'var existingBtn = rowCol.items.findBy(function(cmp) { return cmp.itemId === "RowNumbererMenuButton"; });' + 'if (!existingBtn) {' + 'var newBtn = Ext.create("Ext.button.Button", {' + 'text: "",' + 'iconCls: "x-fa fa-bars",' + // иконка для кнопки 'tooltip: "Действия",' + 'itemId: "RowNumbererMenuButton",' + 'menu: Ext.create("Ext.menu.Menu", {' + 'items: [' + '{ text: "Обновить", iconCls: "x-fa fa-sync", handler: function() { ajaxRequest('#1', "RefreshClicked", []); } },' + '{ text: "Удалить", iconCls: "x-fa fa-trash", handler: function() { ajaxRequest('#1', "DeleteClicked", []); } }' + ']' + '})' + '});' + 'rowCol.insert(0, newBtn);' + 'newBtn.setWidth("100%");' + 'newBtn.setStyle({ marginBottom: "2px" });' + '}' + '}' + '}' ); Добрый день! Sherzod, поработал с кодом и пришел к выводу что следующая часть кода не нужна, без него работает корректно, как считаешь ? if (rowCol.titleEl && rowCol.titleEl.setHeight) rowCol.titleEl.setHeight(0); 'if (!rowCol.items) {' + 'rowCol.items = new Ext.util.MixedCollection();' + 'rowCol.add(Ext.create("Ext.Component", { html: " " }));' + '}' Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.