понедельник, 23 мая 2011 г.

ExtJS 3 суммирование строк таблицы Grid


Рассматриваемая сегодня задача встречается очень часто: необходимо добавить в таблицу Grid дополнительную строку, которая будет выводить сумму значений из расположенных выше строк. В статье рассматривается ExtJS 3, в новой четвертой версии описанный функционал уже включен в ядро и хорошо документирован.


Создано несколько версий плагина GridSummary с различными доработками, они описаны здесь. Примеры использования плагина можно посмотреть в исходном варианте плагина здесь, но в проекте лучше использовать финальную на момент написания статьи версию. Да, для загрузки файлов необходимо зарегистрироваться на официальном форуме разработчкиков ExtJS (http://www.sencha.com/forum/), если вы до сих пор этого не сделали.

Ниже описан процесс подключения и конфигурирования плагина.

Первым шагом является подключение css и js файлов:

<link rel="stylesheet" href="gridsummary.css"/>
<script src='./js/gridsummary.js'></script>

Обратите внимание, что оба файла необходимо подключать после всех файлов самого ExtJS.

Вторым шагом является подключение плагина в теле функции onReady():

var summary = new Ext.ux.grid.GridSummary();
formDataGrid = new Ext.grid.EditorGridPanel({
  plugins: [ summary ],  store: myStore,
  cm: [
    {
      header: 'Компания',
     dataIndex: 'comp',
      summaryRenderer: function(){ return 'Всего: ';}
    }
    {
      header: 'Цена',
      dataIndex: 'price' ,
      summaryType: 'sum'
    },
    {
      header: 'Цифра какая-то',
      dataIndex: 'someInt',
      summaryType: 'avg'
    }
    //...
  ]

Как вы видите, все довольно просто. Вы указываете плагин summary и в описание ColumnModel добавляете описание параметров работы плагина. Основных параметра два - это summaryType, определяющий тип обработки данных (суммирование sum, вычисление среднего avg, подсчет количества строк count и др.) и summaryRenderer - функция-рендер для ячейки строки суммы, в случае указания  она определяет итоговый состав и стиль выводимых данных.

Например, для вывода положительной суммы зеленым цветом, а отрицательной красным, необходимо написать такой простенький рендер:

...
summaryRender: function pctChange(val) {
  if (val > 0) {
    return '<span style="color: green;">' + val + '%</span>';
  } else if(val < 0) {
    return '<span style="color: red;">' + val + '%</span>';
  }
  return val;
}
...

Успехов!

ExtJS найти элемент и изменить его содержимое

Задача: необходимо на лету по ID элемента изменить его содержимое. Например, моей задачей было изменение текста ссылки, позволяющей сворачивать и разворачивать элемент на странице. Когда элемент свернут, текст ссылки должен быть "развернуть", когда развернут - соответственно, "свернуть".

Подобные задачи легко решаются любым современным Javascript фреймворком. В случае ExtJS изменение содержимого элемента с id area будет выглядеть так:

Ext.fly('toggleLink').update('Свернуть описание');

Найти элемент по его классу также несложно, можно воспользоваться полноценным CSS селектором:

var parent = Ext.get("IdOfParent");
var aHrefs = parent.select("div.myCoolDivClass a").elements;

четверг, 19 мая 2011 г.

JavaScript is_int

Простейшая функция, проверяющая, является ли переменная целым числом. Своего рода аналог php is_int().

function is_int(x) { 
   var y = parseInt(x); 
   if (isNaN(y)) return false; 
   return x == y && x.toString() == y.toString(); 
}

В ExtJS есть отличная функция Ext.num(i, 0), проверяющая, является ли i целым числом и возвращающая его в случае успеха или 0 (второй параметр) в случае неудачи. Например:

i = Ext.num(i, 0)

среда, 18 мая 2011 г.

Vim переместить вкладку



Проблема: в GVim необходимо переместить вкладку (таб) вправо или влево.

Решение:

tabmove 3

Здесь 3 - номер, куда необходимо переместить вкладку. Вместо tabmove можно использовать сокращение tabm.

Перемещаться между вкладками можно сочетанием gt и gT (вправо и влево соответственно) или Ctrl+Page_Down и Ctrl+Page_Up.

PS. Я люблю vim, да.

понедельник, 2 мая 2011 г.

Восстановить загрузчик GRUB

Проблема: вы установили Linux с GRUB загрузчиком и потом установили Windows - именно в таком порядке. И если GRUB не трогает загрузчик Windows, то последний не обладает той же дружелюбностью и перезаписывает GRUB на раз, после чего загрузка Linux становится невозможной и при перезапуске компьютера автоматически начинает загружаться Windows, даже не вспоминая о второй установленной ОС.

Решение: необходимо загрузиться с Live CD Linux и выполнить ряд операций в консоли.

sudo grub
find /boot/grub/stage2

Результатом выполнения последней команды будет, например, (hd0,2). Используем это в следующей команде:

root (hd0,2)
setup (hd0)

На этом все - при последующей перезагрузке вас снова встретит меню загрузчика GRUB. Отредактировать это меню можно в /boot/grub/menu.lst - там можно поменять имена загружаемых ОС и изменить их порядок, например, выбрать ОС для загрузки по умолчанию, поставив ее первой в списке.