public function widgetsAction()
 {
     $contact_id = $this->getUserId();
     $widget_model = new waWidgetModel();
     $rows = $widget_model->getByContact($contact_id);
     $data = array();
     foreach ($rows as $row) {
         $data[$row['block']][] = $row;
     }
     $w = $b = 0;
     $real_block = 0;
     foreach ($data as $block => $block_data) {
         if ($real_block != $block) {
             $b++;
             $widget_model->updateByField(array('contact_id' => $contact_id, 'dashboard_id' => null, 'block' => $block), array('block' => $real_block));
         }
         foreach ($block_data as $sort => $row) {
             if ($row['sort'] != $sort) {
                 $widget_model->updateById($row['id'], array('sort' => $sort));
                 $w++;
             }
         }
         $real_block++;
     }
     echo 'OK';
     if ($b) {
         echo "\t" . $b . ' block(s) has been fixed.' . PHP_EOL;
     }
     if ($w) {
         echo "\t" . $w . ' widgets(s) has been fixed.' . PHP_EOL;
     }
 }
 public function dashboardAction()
 {
     $widget_model = new waWidgetModel();
     $locale = wa()->getUser()->getLocale();
     // Create dashboard widgets on first login
     if (!wa()->getUser()->getSettings('webasyst', 'dashboard')) {
         $apps = wa()->getApps(true);
         $widgets = array();
         foreach ($apps as $app_id => $app) {
             if ($app_id == 'webasyst' || $this->getUser()->getRights($app_id, 'backend')) {
                 foreach (wa($app_id)->getConfig()->getWidgets() as $w_id => $w) {
                     if (!empty($w['locale']) && $w['locale'] != $locale) {
                         continue;
                     }
                     $widgets[] = $w;
                 }
             }
         }
         $block = 0;
         $contact_id = wa()->getUser()->getId();
         foreach ($widgets as $w) {
             $max_size = $w['sizes'][0];
             foreach ($w['sizes'] as $s) {
                 if ($s[0] + $s[1] > $max_size[0] + $max_size[1]) {
                     $max_size = $s;
                 }
             }
             $row = array('app_id' => $w['app_id'], 'widget' => $w['widget'], 'name' => $w['name'], 'block' => $block++, 'sort' => 0, 'size' => $max_size[0] . 'x' . $max_size[1], 'contact_id' => $contact_id, 'create_datetime' => date('Y-m-d H:i:s'));
             $widget_model->insert($row);
         }
         wa()->getUser()->setSettings('webasyst', 'dashboard', 1);
     }
     // fetch widgets
     $rows = $widget_model->getByContact($this->getUserId());
     $widgets = array();
     foreach ($rows as $row) {
         if ($row['app_id'] == 'webasyst' || $this->getUser()->getRights($row['app_id'], 'backend')) {
             $app_widgets = wa($row['app_id'])->getConfig()->getWidgets();
             if (isset($app_widgets[$row['widget']])) {
                 $row['size'] = explode('x', $row['size']);
                 $row = $row + $app_widgets[$row['widget']];
                 foreach ($row['sizes'] as $s) {
                     if ($s == array(1, 1)) {
                         $row['has_sizes']['small'] = true;
                     } elseif ($s == array(2, 1)) {
                         $row['has_sizes']['medium'] = true;
                     } elseif ($s == array(2, 2)) {
                         $row['has_sizes']['big'] = true;
                     }
                 }
                 $widgets[$row['block']][] = $row;
             }
         }
     }
     $this->view->assign('widgets', $widgets);
     // announcement
     $user = wa()->getUser();
     $announcement_model = new waAnnouncementModel();
     $apps = $user->getApps();
     $data = $announcement_model->getByApps($user->getId(), array_keys($apps), $user['create_datetime']);
     $announcements = array();
     $announcements_apps = array();
     foreach ($data as $row) {
         // show no more than 1 message per application
         if (!empty($announcements_apps[$row['app_id']])) {
             continue;
         }
         $announcements_apps[$row['app_id']] = true;
         $announcements[] = $row;
     }
     $this->view->assign('notifications', $announcements);
     // activity stream
     $activity_action = new webasystDashboardActivityAction();
     $this->view->assign('apps', wa()->getUser()->getApps());
     $user_filters = wa()->getUser()->getSettings('webasyst', 'dashboard_activity');
     if ($user_filters) {
         $user_filters = explode(',', $user_filters);
     } else {
         $user_filters = array();
     }
     $this->view->assign('user_filters', $user_filters);
     $this->view->assign('activity', $activity_action->getLogs(array(), $count));
     if ($count == 50) {
         $this->view->assign('activity_load_more', true);
     }
     // Whether to show tutorial
     $this->view->assign('show_tutorial', !wa()->getUser()->getSettings('webasyst', 'widget_tutorial_closed'));
 }