summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorAleksander Machniak <alec@alec.pl>2013-08-09 12:29:51 +0200
committerAleksander Machniak <alec@alec.pl>2013-08-09 12:29:51 +0200
commitfbb7f37f8506e5e9c991ad9e9d05bafb71f800b1 (patch)
tree4e8e61b5d55aaef6b3d357f6b34928503a0c1fd1 /lib
parenta985f6095fbb8625cb82bebaf07734a4d6116c68 (diff)
downloadwebadmin-fbb7f37f8506e5e9c991ad9e9d05bafb71f800b1.tar.gz
Generalized list/search handling. Fixed searching users by email/name (Bug #2057)
Diffstat (limited to 'lib')
-rw-r--r--lib/client/kolab_client_task_domain.php166
-rw-r--r--lib/client/kolab_client_task_group.php161
-rw-r--r--lib/client/kolab_client_task_resource.php163
-rw-r--r--lib/client/kolab_client_task_role.php160
-rw-r--r--lib/client/kolab_client_task_sharedfolder.php163
-rw-r--r--lib/client/kolab_client_task_user.php159
-rw-r--r--lib/kolab_client_task.php242
7 files changed, 263 insertions, 951 deletions
diff --git a/lib/client/kolab_client_task_domain.php b/lib/client/kolab_client_task_domain.php
index e50ba3c..dce73f9 100644
--- a/lib/client/kolab_client_task_domain.php
+++ b/lib/client/kolab_client_task_domain.php
@@ -30,6 +30,12 @@ class kolab_client_task_domain extends kolab_client_task
'add' => 'domain.add',
);
+ protected $search_attribs = array(
+ 'name' => array('associateddomain'),
+ );
+
+ protected $list_attribs = array('associateddomain');
+
/**
* Default action.
*/
@@ -63,130 +69,7 @@ class kolab_client_task_domain extends kolab_client_task
}
}
- $page_size = 20;
- $page = (int) self::get_input('page', 'POST');
- if (!$page || $page < 1) {
- $page = 1;
- }
-
- // request parameters
- $post = array(
- 'attributes' => array('associateddomain'),
-// 'sort_order' => 'ASC',
- 'sort_by' => 'associateddomain',
- 'page_size' => $page_size,
- 'page' => $page,
- );
-
- // search parameters
- if (!empty($_POST['search'])) {
- $search = self::get_input('search', 'POST', true);
- $field = self::get_input('field', 'POST');
- $method = self::get_input('method', 'POST');
-
- $search_request = array(
- $field => array(
- 'value' => $search,
- 'type' => $method,
- ),
- );
- }
- else if (!empty($_POST['search_request'])) {
- $search_request = self::get_input('search_request', 'POST');
- $search_request = @unserialize(base64_decode($search_request));
- }
-
- if (!empty($search_request)) {
- $post['search'] = $search_request;
- $post['search_operator'] = 'OR';
- }
-
- // get domains list
- $result = $this->api_post('domains.list', null, $post);
- $count = (int) $result->get('count');
- $result = (array) $result->get('list');
-
- // calculate records
- if ($count) {
- $start = 1 + max(0, $page - 1) * $page_size;
- $end = min($start + $page_size - 1, $count);
- }
-
- $rows = $head = $foot = array();
- $cols = array('name');
- $i = 0;
-
- // table header
- $head[0]['cells'][] = array('class' => 'name', 'body' => $this->translate('domain.list'));
-
- // table footer (navigation)
- if ($count) {
- $pages = ceil($count / $page_size);
- $prev = max(0, $page - 1);
- $next = $page < $pages ? $page + 1 : 0;
-
- $count_str = kolab_html::span(array(
- 'content' => $this->translate('list.records', $start, $end, $count)), true);
- $prev = kolab_html::a(array(
- 'class' => 'prev' . ($prev ? '' : ' disabled'),
- 'href' => '#',
- 'onclick' => $prev ? "kadm.command('domain.list', {page: $prev})" : "return false",
- ));
- $next = kolab_html::a(array(
- 'class' => 'next' . ($next ? '' : ' disabled'),
- 'href' => '#',
- 'onclick' => $next ? "kadm.command('domain.list', {page: $next})" : "return false",
- ));
-
- $foot_body = kolab_html::span(array('content' => $prev . $count_str . $next));
- }
- $foot[0]['cells'][] = array('class' => 'listnav', 'body' => $foot_body);
-
- // table body
- if (!empty($result)) {
- foreach ($result as $idx => $item) {
- //console($idx);
- if (!is_array($item) || empty($item['associateddomain'])) {
- continue;
- }
-
- $i++;
- $cells = array();
-
- if (is_array($item['associateddomain'])) {
- $domain_name = $item['associateddomain'][0];
- } else {
- $domain_name = $item['associateddomain'];
- }
-
- $cells[] = array('class' => 'name', 'body' => kolab_html::escape($domain_name),
- 'onclick' => "kadm.command('domain.info', '$idx')");
- $rows[] = array('id' => $i, 'class' => 'selectable', 'cells' => $cells);
- }
- }
- else {
- $rows[] = array('cells' => array(
- 0 => array('class' => 'empty-body', 'body' => $this->translate('domain.norecords')
- )));
- }
-
- $table = kolab_html::table(array(
- 'id' => 'domainlist',
- 'class' => 'list',
- 'head' => $head,
- 'body' => $rows,
- 'foot' => $foot,
- ));
-
- if ($this->action == 'list') {
- $this->output->command('set_watermark', 'taskcontent');
- }
-
- $this->output->set_env('search_request', $search_request ? base64_encode(serialize($search_request)) : null);
- $this->output->set_env('list_page', $page);
- $this->output->set_env('list_count', $count);
- $this->output->set_env('list_size', $i);
- $this->output->set_object('domainlist', $table);
+ parent::action_list();
}
/**
@@ -305,37 +188,14 @@ class kolab_client_task_domain extends kolab_client_task
}
/**
- * Users search form.
- *
- * @return string HTML output of the form
+ * List item handler
*/
- public function search_form()
+ protected function list_item_handler($item)
{
- $form = new kolab_form(array('id' => 'search-form'));
-
- $form->add_section('criteria', kolab_html::escape($this->translate('search.criteria')));
- $form->add_element(array(
- 'section' => 'criteria',
- 'label' => $this->translate('search.field'),
- 'name' => 'field',
- 'type' => kolab_form::INPUT_SELECT,
- 'options' => array(
- 'associateddomain' => kolab_html::escape($this->translate('search.name')),
- ),
- ));
- $form->add_element(array(
- 'section' => 'criteria',
- 'label' => $this->translate('search.method'),
- 'name' => 'method',
- 'type' => kolab_form::INPUT_SELECT,
- 'options' => array(
- 'both' => kolab_html::escape($this->translate('search.contains')),
- 'exact' => kolab_html::escape($this->translate('search.is')),
- 'prefix' => kolab_html::escape($this->translate('search.prefix')),
- ),
- ));
+ if (is_array($item['associateddomain'])) {
+ return $item['associateddomain'][0];
+ }
- return $form->output();
+ return $item['associateddomain'];
}
-
}
diff --git a/lib/client/kolab_client_task_group.php b/lib/client/kolab_client_task_group.php
index 2367efa..b442a4c 100644
--- a/lib/client/kolab_client_task_group.php
+++ b/lib/client/kolab_client_task_group.php
@@ -30,6 +30,8 @@ class kolab_client_task_group extends kolab_client_task
'add' => 'group.add',
);
+ protected $list_attribs = array('cn');
+
/**
* Default action.
*/
@@ -51,129 +53,6 @@ class kolab_client_task_group extends kolab_client_task
}
/**
- * Groups list action.
- */
- public function action_list()
- {
- $page_size = 20;
- $page = (int) self::get_input('page', 'POST');
- if (!$page || $page < 1) {
- $page = 1;
- }
-
- // request parameters
- $post = array(
- 'attributes' => array('cn'),
-// 'sort_order' => 'ASC',
- 'sort_by' => 'cn',
- 'page_size' => $page_size,
- 'page' => $page,
- );
-
- // search parameters
- if (!empty($_POST['search'])) {
- $search = self::get_input('search', 'POST', true);
- $field = self::get_input('field', 'POST');
- $method = self::get_input('method', 'POST');
-
- $search_request = array(
- $field => array(
- 'value' => $search,
- 'type' => $method,
- ),
- );
- }
- else if (!empty($_POST['search_request'])) {
- $search_request = self::get_input('search_request', 'POST');
- $search_request = @unserialize(base64_decode($search_request));
- }
-
- if (!empty($search_request)) {
- $post['search'] = $search_request;
- $post['search_operator'] = 'OR';
- }
-
- // get groups list
- $result = $this->api_post('groups.list', null, $post);
- $count = (int) $result->get('count');
- $result = (array) $result->get('list');
-
- // calculate records
- if ($count) {
- $start = 1 + max(0, $page - 1) * $page_size;
- $end = min($start + $page_size - 1, $count);
- }
-
- $rows = $head = $foot = array();
- $cols = array('name');
- $i = 0;
-
- // table header
- $head[0]['cells'][] = array('class' => 'name', 'body' => $this->translate('group.list'));
-
- // table footer (navigation)
- if ($count) {
- $pages = ceil($count / $page_size);
- $prev = max(0, $page - 1);
- $next = $page < $pages ? $page + 1 : 0;
-
- $count_str = kolab_html::span(array(
- 'content' => $this->translate('list.records', $start, $end, $count)), true);
- $prev = kolab_html::a(array(
- 'class' => 'prev' . ($prev ? '' : ' disabled'),
- 'href' => '#',
- 'onclick' => $prev ? "kadm.command('group.list', {page: $prev})" : "return false",
- ));
- $next = kolab_html::a(array(
- 'class' => 'next' . ($next ? '' : ' disabled'),
- 'href' => '#',
- 'onclick' => $next ? "kadm.command('group.list', {page: $next})" : "return false",
- ));
-
- $foot_body = kolab_html::span(array('content' => $prev . $count_str . $next));
- }
- $foot[0]['cells'][] = array('class' => 'listnav', 'body' => $foot_body);
-
- // table body
- if (!empty($result)) {
- foreach ($result as $idx => $item) {
- if (!is_array($item) || empty($item['cn'])) {
- continue;
- }
-
- $i++;
- $cells = array();
- $cells[] = array('class' => 'name', 'body' => kolab_html::escape($item['cn']),
- 'onclick' => "kadm.command('group.info', '$idx')");
- $rows[] = array('id' => $i, 'class' => 'selectable', 'cells' => $cells);
- }
- }
- else {
- $rows[] = array('cells' => array(
- 0 => array('class' => 'empty-body', 'body' => $this->translate('group.norecords')
- )));
- }
-
- $table = kolab_html::table(array(
- 'id' => 'grouplist',
- 'class' => 'list',
- 'head' => $head,
- 'body' => $rows,
- 'foot' => $foot,
- ));
-
- if ($this->action == 'list') {
- $this->output->command('set_watermark', 'taskcontent');
- }
-
- $this->output->set_env('search_request', $search_request ? base64_encode(serialize($search_request)) : null);
- $this->output->set_env('list_page', $page);
- $this->output->set_env('list_count', $count);
- $this->output->set_env('list_size', count($result));
- $this->output->set_object('grouplist', $table);
- }
-
- /**
* Group information (form) action.
*/
public function action_info()
@@ -291,40 +170,4 @@ class kolab_client_task_group extends kolab_client_task
return $list;
}
-
- /**
- * Users search form.
- *
- * @return string HTML output of the form
- */
- public function search_form()
- {
- $form = new kolab_form(array('id' => 'search-form'));
-
- $form->add_section('criteria', kolab_html::escape($this->translate('search.criteria')));
- $form->add_element(array(
- 'section' => 'criteria',
- 'label' => $this->translate('search.field'),
- 'name' => 'field',
- 'type' => kolab_form::INPUT_SELECT,
- 'options' => array(
- 'cn' => kolab_html::escape($this->translate('search.name')),
- 'mail' => kolab_html::escape($this->translate('search.email')),
- ),
- ));
- $form->add_element(array(
- 'section' => 'criteria',
- 'label' => $this->translate('search.method'),
- 'name' => 'method',
- 'type' => kolab_form::INPUT_SELECT,
- 'options' => array(
- 'both' => kolab_html::escape($this->translate('search.contains')),
- 'exact' => kolab_html::escape($this->translate('search.is')),
- 'prefix' => kolab_html::escape($this->translate('search.prefix')),
- ),
- ));
-
- return $form->output();
- }
-
}
diff --git a/lib/client/kolab_client_task_resource.php b/lib/client/kolab_client_task_resource.php
index 94be4c1..cfea9bd 100644
--- a/lib/client/kolab_client_task_resource.php
+++ b/lib/client/kolab_client_task_resource.php
@@ -30,6 +30,8 @@ class kolab_client_task_resource extends kolab_client_task
'add' => 'resource.add',
);
+ protected $list_attribs = array('cn');
+
/**
* Default action.
*/
@@ -51,131 +53,6 @@ class kolab_client_task_resource extends kolab_client_task
}
/**
- * Users list action.
- */
- public function action_list()
- {
- $page_size = 20;
- $page = (int) self::get_input('page', 'POST');
- if (!$page || $page < 1) {
- $page = 1;
- }
-
- // request parameters
- $post = array(
- 'attributes' => array('cn'),
-// 'sort_order' => 'ASC',
- 'sort_by' => array('cn'),
- 'page_size' => $page_size,
- 'page' => $page,
- );
-
- // search parameters
- if (!empty($_POST['search'])) {
- $search = self::get_input('search', 'POST', true);
- $field = self::get_input('field', 'POST');
- $method = self::get_input('method', 'POST');
-
- $search_request = array(
- $field => array(
- 'value' => $search,
- 'type' => $method,
- ),
- );
- }
- else if (!empty($_POST['search_request'])) {
- $search_request = self::get_input('search_request', 'POST');
- $search_request = @unserialize(base64_decode($search_request));
- }
-
- if (!empty($search_request)) {
- $post['search'] = $search_request;
- $post['search_operator'] = 'OR';
- }
-
- // get resources list
- $result = $this->api_post('resources.list', null, $post);
- $count = $result->get('count');
- $result = (array) $result->get('list');
-
- //console($result);
-
- // calculate records
- if ($count) {
- $start = 1 + max(0, $page - 1) * $page_size;
- $end = min($start + $page_size - 1, $count);
- }
-
- $rows = $head = $foot = array();
- $cols = array('name');
- $i = 0;
-
- // table header
- $head[0]['cells'][] = array('class' => 'name', 'body' => $this->translate('resource.list'));
-
- // table footer (navigation)
- if ($count) {
- $pages = ceil($count / $page_size);
- $prev = max(0, $page - 1);
- $next = $page < $pages ? $page + 1 : 0;
-
- $count_str = kolab_html::span(array(
- 'content' => $this->translate('list.records', $start, $end, $count)), true);
- $prev = kolab_html::a(array(
- 'class' => 'prev' . ($prev ? '' : ' disabled'),
- 'href' => '#',
- 'onclick' => $prev ? "kadm.command('resource.list', {page: $prev})" : "return false",
- ));
- $next = kolab_html::a(array(
- 'class' => 'next' . ($next ? '' : ' disabled'),
- 'href' => '#',
- 'onclick' => $next ? "kadm.command('resource.list', {page: $next})" : "return false",
- ));
-
- $foot_body = kolab_html::span(array('content' => $prev . $count_str . $next));
- }
- $foot[0]['cells'][] = array('class' => 'listnav', 'body' => $foot_body);
-
- // table body
- if (!empty($result)) {
- foreach ($result as $idx => $item) {
- if (!is_array($item) || empty($item['cn'])) {
- continue;
- }
-
- $i++;
- $cells = array();
- $cells[] = array('class' => 'name', 'body' => kolab_html::escape($item['cn']),
- 'onclick' => "kadm.command('resource.info', '$idx')");
- $rows[] = array('id' => $i, 'class' => 'selectable', 'cells' => $cells);
- }
- }
- else {
- $rows[] = array('cells' => array(
- 0 => array('class' => 'empty-body', 'body' => $this->translate('resource.norecords')
- )));
- }
-
- $table = kolab_html::table(array(
- 'id' => 'resourcelist',
- 'class' => 'list',
- 'head' => $head,
- 'body' => $rows,
- 'foot' => $foot,
- ));
-
- if ($this->action == 'list') {
- $this->output->command('set_watermark', 'taskcontent');
- }
-
- $this->output->set_env('search_request', $search_request ? base64_encode(serialize($search_request)) : null);
- $this->output->set_env('list_page', $page);
- $this->output->set_env('list_count', $count);
- $this->output->set_env('list_size', count($result));
- $this->output->set_object('resourcelist', $table);
- }
-
- /**
* Resource adding (form) action.
*/
public function action_add()
@@ -299,40 +176,4 @@ class kolab_client_task_resource extends kolab_client_task
return $form->output();
}
-
- /**
- * Users search form.
- *
- * @return string HTML output of the form
- */
- public function search_form()
- {
- $form = new kolab_form(array('id' => 'search-form'));
-
- $form->add_section('criteria', kolab_html::escape($this->translate('search.criteria')));
- $form->add_element(array(
- 'section' => 'criteria',
- 'label' => $this->translate('search.field'),
- 'name' => 'field',
- 'type' => kolab_form::INPUT_SELECT,
- 'options' => array(
- 'cn' => kolab_html::escape($this->translate('search.name')),
- 'email' => kolab_html::escape($this->translate('search.email')),
- 'uid' => kolab_html::escape($this->translate('search.uid')),
- ),
- ));
- $form->add_element(array(
- 'section' => 'criteria',
- 'label' => $this->translate('search.method'),
- 'name' => 'method',
- 'type' => kolab_form::INPUT_SELECT,
- 'options' => array(
- 'both' => kolab_html::escape($this->translate('search.contains')),
- 'exact' => kolab_html::escape($this->translate('search.is')),
- 'prefix' => kolab_html::escape($this->translate('search.prefix')),
- ),
- ));
-
- return $form->output();
- }
}
diff --git a/lib/client/kolab_client_task_role.php b/lib/client/kolab_client_task_role.php
index 46772a8..7ff4256 100644
--- a/lib/client/kolab_client_task_role.php
+++ b/lib/client/kolab_client_task_role.php
@@ -30,6 +30,8 @@ class kolab_client_task_role extends kolab_client_task
'add' => 'role.add',
);
+ protected $list_attribs = array('cn');
+
/**
* Default action.
*/
@@ -51,129 +53,6 @@ class kolab_client_task_role extends kolab_client_task
}
/**
- * Roles list action.
- */
- public function action_list()
- {
- $page_size = 20;
- $page = (int) self::get_input('page', 'POST');
- if (!$page || $page < 1) {
- $page = 1;
- }
-
- // request parameters
- $post = array(
- 'attributes' => array('cn'),
-// 'sort_order' => 'ASC',
- 'sort_by' => 'cn',
- 'page_size' => $page_size,
- 'page' => $page,
- );
-
- // search parameters
- if (!empty($_POST['search'])) {
- $search = self::get_input('search', 'POST', true);
- $field = self::get_input('field', 'POST');
- $method = self::get_input('method', 'POST');
-
- $search_request = array(
- $field => array(
- 'value' => $search,
- 'type' => $method,
- ),
- );
- }
- else if (!empty($_POST['search_request'])) {
- $search_request = self::get_input('search_request', 'POST');
- $search_request = @unserialize(base64_decode($search_request));
- }
-
- if (!empty($search_request)) {
- $post['search'] = $search_request;
- $post['search_operator'] = 'OR';
- }
-
- // get roles list
- $result = $this->api_post('roles.list', null, $post);
- $count = (int) $result->get('count');
- $result = (array) $result->get('list');
-
- // calculate records
- if ($count) {
- $start = 1 + max(0, $page - 1) * $page_size;
- $end = min($start + $page_size - 1, $count);
- }
-
- $rows = $head = $foot = array();
- $cols = array('name');
- $i = 0;
-
- // table header
- $head[0]['cells'][] = array('class' => 'name', 'body' => $this->translate('role.list'));
-
- // table footer (navigation)
- if ($count) {
- $pages = ceil($count / $page_size);
- $prev = max(0, $page - 1);
- $next = $page < $pages ? $page + 1 : 0;
-
- $count_str = kolab_html::span(array(
- 'content' => $this->translate('list.records', $start, $end, $count)), true);
- $prev = kolab_html::a(array(
- 'class' => 'prev' . ($prev ? '' : ' disabled'),
- 'href' => '#',
- 'onclick' => $prev ? "kadm.command('role.list', {page: $prev})" : "return false",
- ));
- $next = kolab_html::a(array(
- 'class' => 'next' . ($next ? '' : ' disabled'),
- 'href' => '#',
- 'onclick' => $next ? "kadm.command('role.list', {page: $next})" : "return false",
- ));
-
- $foot_body = kolab_html::span(array('content' => $prev . $count_str . $next));
- }
- $foot[0]['cells'][] = array('class' => 'listnav', 'body' => $foot_body);
-
- // table body
- if (!empty($result)) {
- foreach ($result as $idx => $item) {
- if (!is_array($item) || empty($item['cn'])) {
- continue;
- }
-
- $i++;
- $cells = array();
- $cells[] = array('class' => 'name', 'body' => kolab_html::escape($item['cn']),
- 'onclick' => "kadm.command('role.info', '$idx')");
- $rows[] = array('id' => $i, 'class' => 'selectable', 'cells' => $cells);
- }
- }
- else {
- $rows[] = array('cells' => array(
- 0 => array('class' => 'empty-body', 'body' => $this->translate('role.norecords')
- )));
- }
-
- $table = kolab_html::table(array(
- 'id' => 'rolelist',
- 'class' => 'list',
- 'head' => $head,
- 'body' => $rows,
- 'foot' => $foot,
- ));
-
- if ($this->action == 'list') {
- $this->output->command('set_watermark', 'taskcontent');
- }
-
- $this->output->set_env('search_request', $search_request ? base64_encode(serialize($search_request)) : null);
- $this->output->set_env('list_page', $page);
- $this->output->set_env('list_count', $count);
- $this->output->set_env('list_size', count($result));
- $this->output->set_object('rolelist', $table);
- }
-
- /**
* Role information (form) action.
*/
public function action_info()
@@ -292,39 +171,4 @@ class kolab_client_task_role extends kolab_client_task
return $list;
}
- /**
- * Users search form.
- *
- * @return string HTML output of the form
- */
- public function search_form()
- {
- $form = new kolab_form(array('id' => 'search-form'));
-
- $form->add_section('criteria', kolab_html::escape($this->translate('search.criteria')));
- $form->add_element(array(
- 'section' => 'criteria',
- 'label' => $this->translate('search.field'),
- 'name' => 'field',
- 'type' => kolab_form::INPUT_SELECT,
- 'options' => array(
- 'cn' => kolab_html::escape($this->translate('search.name')),
- 'mail' => kolab_html::escape($this->translate('search.email')),
- ),
- ));
- $form->add_element(array(
- 'section' => 'criteria',
- 'label' => $this->translate('search.method'),
- 'name' => 'method',
- 'type' => kolab_form::INPUT_SELECT,
- 'options' => array(
- 'both' => kolab_html::escape($this->translate('search.contains')),
- 'exact' => kolab_html::escape($this->translate('search.is')),
- 'prefix' => kolab_html::escape($this->translate('search.prefix')),
- ),
- ));
-
- return $form->output();
- }
-
}
diff --git a/lib/client/kolab_client_task_sharedfolder.php b/lib/client/kolab_client_task_sharedfolder.php
index b277410..441e11a 100644
--- a/lib/client/kolab_client_task_sharedfolder.php
+++ b/lib/client/kolab_client_task_sharedfolder.php
@@ -30,6 +30,8 @@ class kolab_client_task_sharedfolder extends kolab_client_task
'add' => 'sharedfolder.add',
);
+ protected $list_attribs = array('cn');
+
/**
* Default action.
*/
@@ -51,131 +53,6 @@ class kolab_client_task_sharedfolder extends kolab_client_task
}
/**
- * Users list action.
- */
- public function action_list()
- {
- $page_size = 20;
- $page = (int) self::get_input('page', 'POST');
- if (!$page || $page < 1) {
- $page = 1;
- }
-
- // request parameters
- $post = array(
- 'attributes' => array('cn'),
-// 'sort_order' => 'ASC',
- 'sort_by' => array('cn'),
- 'page_size' => $page_size,
- 'page' => $page,
- );
-
- // search parameters
- if (!empty($_POST['search'])) {
- $search = self::get_input('search', 'POST', true);
- $field = self::get_input('field', 'POST');
- $method = self::get_input('method', 'POST');
-
- $search_request = array(
- $field => array(
- 'value' => $search,
- 'type' => $method,
- ),
- );
- }
- else if (!empty($_POST['search_request'])) {
- $search_request = self::get_input('search_request', 'POST');
- $search_request = @unserialize(base64_decode($search_request));
- }
-
- if (!empty($search_request)) {
- $post['search'] = $search_request;
- $post['search_operator'] = 'OR';
- }
-
- // get shared folders list
- $result = $this->api_post('sharedfolders.list', null, $post);
- $count = $result->get('count');
- $result = (array) $result->get('list');
-
- //console($result);
-
- // calculate records
- if ($count) {
- $start = 1 + max(0, $page - 1) * $page_size;
- $end = min($start + $page_size - 1, $count);
- }
-
- $rows = $head = $foot = array();
- $cols = array('name');
- $i = 0;
-
- // table header
- $head[0]['cells'][] = array('class' => 'name', 'body' => $this->translate('sharedfolder.list'));
-
- // table footer (navigation)
- if ($count) {
- $pages = ceil($count / $page_size);
- $prev = max(0, $page - 1);
- $next = $page < $pages ? $page + 1 : 0;
-
- $count_str = kolab_html::span(array(
- 'content' => $this->translate('list.records', $start, $end, $count)), true);
- $prev = kolab_html::a(array(
- 'class' => 'prev' . ($prev ? '' : ' disabled'),
- 'href' => '#',
- 'onclick' => $prev ? "kadm.command('sharedfolder.list', {page: $prev})" : "return false",
- ));
- $next = kolab_html::a(array(
- 'class' => 'next' . ($next ? '' : ' disabled'),
- 'href' => '#',
- 'onclick' => $next ? "kadm.command('sharedfolder.list', {page: $next})" : "return false",
- ));
-
- $foot_body = kolab_html::span(array('content' => $prev . $count_str . $next));
- }
- $foot[0]['cells'][] = array('class' => 'listnav', 'body' => $foot_body);
-
- // table body
- if (!empty($result)) {
- foreach ($result as $idx => $item) {
- if (!is_array($item) || empty($item['cn'])) {
- continue;
- }
-
- $i++;
- $cells = array();
- $cells[] = array('class' => 'name', 'body' => kolab_html::escape($item['cn']),
- 'onclick' => "kadm.command('sharedfolder.info', '$idx')");
- $rows[] = array('id' => $i, 'class' => 'selectable', 'cells' => $cells);
- }
- }
- else {
- $rows[] = array('cells' => array(
- 0 => array('class' => 'empty-body', 'body' => $this->translate('sharedfolder.norecords')
- )));
- }
-
- $table = kolab_html::table(array(
- 'id' => 'sharedfolderlist',
- 'class' => 'list',
- 'head' => $head,
- 'body' => $rows,
- 'foot' => $foot,
- ));
-
- if ($this->action == 'list') {
- $this->output->command('set_watermark', 'taskcontent');
- }
-
- $this->output->set_env('search_request', $search_request ? base64_encode(serialize($search_request)) : null);
- $this->output->set_env('list_page', $page);
- $this->output->set_env('list_count', $count);
- $this->output->set_env('list_size', count($result));
- $this->output->set_object('sharedfolderlist', $table);
- }
-
- /**
* Resource adding (form) action.
*/
public function action_add()
@@ -299,40 +176,4 @@ class kolab_client_task_sharedfolder extends kolab_client_task
return $form->output();
}
-
- /**
- * Users search form.
- *
- * @return string HTML output of the form
- */
- public function search_form()
- {
- $form = new kolab_form(array('id' => 'search-form'));
-
- $form->add_section('criteria', kolab_html::escape($this->translate('search.criteria')));
- $form->add_element(array(
- 'section' => 'criteria',
- 'label' => $this->translate('search.field'),
- 'name' => 'field',
- 'type' => kolab_form::INPUT_SELECT,
- 'options' => array(
- 'cn' => kolab_html::escape($this->translate('search.name')),
- 'email' => kolab_html::escape($this->translate('search.email')),
- 'uid' => kolab_html::escape($this->translate('search.uid')),
- ),
- ));
- $form->add_element(array(
- 'section' => 'criteria',
- 'label' => $this->translate('search.method'),
- 'name' => 'method',
- 'type' => kolab_form::INPUT_SELECT,
- 'options' => array(
- 'both' => kolab_html::escape($this->translate('search.contains')),
- 'exact' => kolab_html::escape($this->translate('search.is')),
- 'prefix' => kolab_html::escape($this->translate('search.prefix')),
- ),
- ));
-
- return $form->output();
- }
}
diff --git a/lib/client/kolab_client_task_user.php b/lib/client/kolab_client_task_user.php
index d9a2227..40c2fcc 100644
--- a/lib/client/kolab_client_task_user.php
+++ b/lib/client/kolab_client_task_user.php
@@ -30,6 +30,8 @@ class kolab_client_task_user extends kolab_client_task
'add' => 'user.add',
);
+ protected $list_attribs = array('displayname', 'cn');
+
/**
* Default action.
*/
@@ -51,129 +53,6 @@ class kolab_client_task_user extends kolab_client_task
}
/**
- * Users list action.
- */
- public function action_list()
- {
- $page_size = 20;
- $page = (int) self::get_input('page', 'POST');
- if (!$page || $page < 1) {
- $page = 1;
- }
-
- // request parameters
- $post = array(
- 'attributes' => array('displayname', 'cn'),
-// 'sort_order' => 'ASC',
- 'sort_by' => array('displayname', 'cn'),
- 'page_size' => $page_size,
- 'page' => $page,
- );
-
- // search parameters
- if (!empty($_POST['search'])) {
- $search = self::get_input('search', 'POST', true);
- $field = self::get_input('field', 'POST');
- $method = self::get_input('method', 'POST');
-
- $search_request = array(
- $field => array(
- 'value' => $search,
- 'type' => $method,
- ),
- );
- }
- else if (!empty($_POST['search_request'])) {
- $search_request = self::get_input('search_request', 'POST');
- $search_request = @unserialize(base64_decode($search_request));
- }
-
- if (!empty($search_request)) {
- $post['search'] = $search_request;
- $post['search_operator'] = 'OR';
- }
-
- // get users list
- $result = $this->api_post('users.list', null, $post);
- $count = $result->get('count');
- $result = (array) $result->get('list');
-
- // calculate records
- if ($count) {
- $start = 1 + max(0, $page - 1) * $page_size;
- $end = min($start + $page_size - 1, $count);
- }
-
- $rows = $head = $foot = array();
- $cols = array('name');
- $i = 0;
-
- // table header
- $head[0]['cells'][] = array('class' => 'name', 'body' => $this->translate('user.list'));
-
- // table footer (navigation)
- if ($count) {
- $pages = ceil($count / $page_size);
- $prev = max(0, $page - 1);
- $next = $page < $pages ? $page + 1 : 0;
-
- $count_str = kolab_html::span(array(
- 'content' => $this->translate('list.records', $start, $end, $count)), true);
- $prev = kolab_html::a(array(
- 'class' => 'prev' . ($prev ? '' : ' disabled'),
- 'href' => '#',
- 'onclick' => $prev ? "kadm.command('user.list', {page: $prev})" : "return false",
- ));
- $next = kolab_html::a(array(
- 'class' => 'next' . ($next ? '' : ' disabled'),
- 'href' => '#',
- 'onclick' => $next ? "kadm.command('user.list', {page: $next})" : "return false",
- ));
-
- $foot_body = kolab_html::span(array('content' => $prev . $count_str . $next));
- }
- $foot[0]['cells'][] = array('class' => 'listnav', 'body' => $foot_body);
-
- // table body
- if (!empty($result)) {
- foreach ($result as $idx => $item) {
- if (!is_array($item) || (empty($item['displayname']) && empty($item['cn']))) {
- continue;
- }
-
- $i++;
- $cells = array();
- $cells[] = array('class' => 'name', 'body' => kolab_html::escape(empty($item['displayname']) ? $item['cn'] : $item['displayname']),
- 'onclick' => "kadm.command('user.info', '$idx')");
- $rows[] = array('id' => $i, 'class' => 'selectable', 'cells' => $cells);
- }
- }
- else {
- $rows[] = array('cells' => array(
- 0 => array('class' => 'empty-body', 'body' => $this->translate('user.norecords')
- )));
- }
-
- $table = kolab_html::table(array(
- 'id' => 'userlist',
- 'class' => 'list',
- 'head' => $head,
- 'body' => $rows,
- 'foot' => $foot,
- ));
-
- if ($this->action == 'list') {
- $this->output->command('set_watermark', 'taskcontent');
- }
-
- $this->output->set_env('search_request', $search_request ? base64_encode(serialize($search_request)) : null);
- $this->output->set_env('list_page', $page);
- $this->output->set_env('list_count', $count);
- $this->output->set_env('list_size', count($result));
- $this->output->set_object('userlist', $table);
- }
-
- /**
* User information (form) action.
*/
public function action_info()
@@ -369,39 +248,11 @@ class kolab_client_task_user extends kolab_client_task
}
/**
- * Users search form.
- *
- * @return string HTML output of the form
+ * List item handler
*/
- public function search_form()
+ protected function list_item_handler($item)
{
- $form = new kolab_form(array('id' => 'search-form'));
-
- $form->add_section('criteria', kolab_html::escape($this->translate('search.criteria')));
- $form->add_element(array(
- 'section' => 'criteria',
- 'label' => $this->translate('search.field'),
- 'name' => 'field',
- 'type' => kolab_form::INPUT_SELECT,
- 'options' => array(
- 'displayname' => kolab_html::escape($this->translate('search.name')),
- 'email' => kolab_html::escape($this->translate('search.email')),
- 'uid' => kolab_html::escape($this->translate('search.uid')),
- ),
- ));
- $form->add_element(array(
- 'section' => 'criteria',
- 'label' => $this->translate('search.method'),
- 'name' => 'method',
- 'type' => kolab_form::INPUT_SELECT,
- 'options' => array(
- 'both' => kolab_html::escape($this->translate('search.contains')),
- 'exact' => kolab_html::escape($this->translate('search.is')),
- 'prefix' => kolab_html::escape($this->translate('search.prefix')),
- ),
- ));
-
- return $form->output();
+ return empty($item['displayname']) ? $item['cn'] : $item['displayname'];
}
}
diff --git a/lib/kolab_client_task.php b/lib/kolab_client_task.php
index 3f50b9d..3936dac 100644
--- a/lib/kolab_client_task.php
+++ b/lib/kolab_client_task.php
@@ -41,12 +41,21 @@ class kolab_client_task
*/
protected $config;
- protected $ajax_only = false;
- protected $page_title = 'Kolab Web Admin Panel';
- protected $menu = array();
- protected $cache = array();
- protected $devel_mode = false;
+ protected $ajax_only = false;
+ protected $page_title = 'Kolab Web Admin Panel';
+ protected $menu = array();
+ protected $cache = array();
+ protected $devel_mode = false;
protected $object_types = array('user', 'group', 'role', 'resource', 'sharedfolder', 'domain');
+ protected $page_size = 20;
+ protected $list_attribs = array();
+ protected $list_module;
+
+ protected $search_attribs = array(
+ 'name' => array('cn', 'displayname'),
+ 'email' => array('mail', 'alias', 'mailalternateaddress'),
+ 'uid' => array('uid'),
+ );
protected static $translation = array();
@@ -1345,4 +1354,227 @@ class kolab_client_task
return $form;
}
+ /**
+ * Search form.
+ *
+ * @return string HTML output of the form
+ */
+ public function search_form()
+ {
+ $attribs = $this->get_search_attribs();
+
+ if (empty($attribs)) {
+ return '';
+ }
+
+ $options = array();
+ foreach (array_keys($attribs) as $key) {
+ $options[$key] = kolab_html::escape($this->translate('search.' . $key));
+ }
+
+ $form = new kolab_form(array('id' => 'search-form'));
+
+ $form->add_section('criteria', kolab_html::escape($this->translate('search.criteria')));
+ $form->add_element(array(
+ 'section' => 'criteria',
+ 'label' => $this->translate('search.field'),
+ 'name' => 'field',
+ 'type' => kolab_form::INPUT_SELECT,
+ 'options' => $options,
+ ));
+ $form->add_element(array(
+ 'section' => 'criteria',
+ 'label' => $this->translate('search.method'),
+ 'name' => 'method',
+ 'type' => kolab_form::INPUT_SELECT,
+ 'options' => array(
+ 'both' => kolab_html::escape($this->translate('search.contains')),
+ 'exact' => kolab_html::escape($this->translate('search.is')),
+ 'prefix' => kolab_html::escape($this->translate('search.prefix')),
+ ),
+ ));
+
+ return $form->output();
+ }
+
+ /**
+ * Returns list of attributes assigned to search field(s)
+ *
+ * @param string $name Optional search field name
+ *
+ * @return array List of attributes
+ */
+ protected function get_search_attribs($name = null)
+ {
+ $task = $this->get_task();
+ $types = $this->object_types($task);
+ $attribs = array();
+
+ foreach ($this->search_attribs as $key => $value) {
+ foreach ((array)$value as $idx => $attr) {
+ $found = false;
+ foreach ($types as $type) {
+ if (array_key_exists($attr, (array)$type['attributes']['auto_form_fields'])
+ || array_key_exists($attr, (array)$type['attributes']['form_fields'])
+ || array_key_exists($attr, (array)$type['attributes']['fields'])
+ ) {
+ $found = true;
+ break;
+ }
+ }
+
+ if (!$found) {
+ unset($value[$idx]);
+ }
+ }
+
+ if (!empty($value)) {
+ $attribs[$key] = $value;
+ }
+ }
+
+ return $name ? $attribs[$name] : $attribs;
+ }
+
+ /**
+ * Object list (and search handler)
+ */
+ public function action_list()
+ {
+ if (empty($this->list_attribs)) {
+ return;
+ }
+
+ $task = $this->get_task();
+ $page = (int) self::get_input('page', 'POST');
+
+ if (!$page || $page < 1) {
+ $page = 1;
+ }
+
+ // request parameters
+ $post = array(
+ 'attributes' => $this->list_attribs,
+ 'sort_by' => $this->list_attribs,
+// 'sort_order' => 'ASC',
+ 'page_size' => $this->page_size,
+ 'page' => $page,
+ );
+
+ // search parameters
+ if (!empty($_POST['search'])) {
+ $search = self::get_input('search', 'POST', true);
+ $field = self::get_input('field', 'POST');
+ $method = self::get_input('method', 'POST');
+ $attrs = $this->get_search_attribs($field);
+ $search_request = array();
+
+ foreach ($attrs as $attr) {
+ $search_request[$attr] = array(
+ 'value' => $search,
+ 'type' => $method,
+ );
+ }
+ }
+ else if (!empty($_POST['search_request'])) {
+ $search_request = self::get_input('search_request', 'POST');
+ $search_request = @unserialize(base64_decode($search_request));
+ }
+
+ if (!empty($search_request)) {
+ $post['search'] = $search_request;
+ $post['search_operator'] = 'OR';
+ }
+
+ // get users list
+ $module = $this->list_module ? $this->list_module : $task . 's';
+ $result = $this->api_post($module . '.list', null, $post);
+ $count = $result->get('count');
+ $result = (array) $result->get('list');
+
+ // calculate records
+ if ($count) {
+ $start = 1 + max(0, $page - 1) * $page_size;
+ $end = min($start + $page_size - 1, $count);
+ }
+
+ $rows = $head = $foot = array();
+ $cols = array('name');
+ $i = 0;
+
+ // table header
+ $head[0]['cells'][] = array('class' => 'name', 'body' => $this->translate($task . '.list'));
+
+ // table footer (navigation)
+ if ($count) {
+ $pages = ceil($count / $this->page_size);
+ $prev = max(0, $page - 1);
+ $next = $page < $pages ? $page + 1 : 0;
+
+ $count_str = kolab_html::span(array(
+ 'content' => $this->translate('list.records', $start, $end, $count)), true);
+ $prev = kolab_html::a(array(
+ 'class' => 'prev' . ($prev ? '' : ' disabled'),
+ 'href' => '#',
+ 'onclick' => $prev ? "kadm.command('$task.list', {page: $prev})" : "return false",
+ ));
+ $next = kolab_html::a(array(
+ 'class' => 'next' . ($next ? '' : ' disabled'),
+ 'href' => '#',
+ 'onclick' => $next ? "kadm.command('$task.list', {page: $next})" : "return false",
+ ));
+
+ $foot_body = kolab_html::span(array('content' => $prev . $count_str . $next));
+ }
+ $foot[0]['cells'][] = array('class' => 'listnav', 'body' => $foot_body);
+
+ // table body
+ if (!empty($result)) {
+ foreach ($result as $idx => $item) {
+ if (!is_array($item)) {
+ continue;
+ }
+
+ if (method_exists($this, 'list_item_handler')) {
+ $item = $this->list_item_handler($item);
+ }
+ else {
+ $item = array_shift($item);
+ }
+
+ if (empty($item)) {
+ continue;
+ }
+
+ $i++;
+ $cells = array();
+ $cells[] = array('class' => 'name', 'body' => kolab_html::escape($item),
+ 'onclick' => "kadm.command('$task.info', '$idx')");
+ $rows[] = array('id' => $i, 'class' => 'selectable', 'cells' => $cells);
+ }
+ }
+ else {
+ $rows[] = array('cells' => array(
+ 0 => array('class' => 'empty-body', 'body' => $this->translate($task . '.norecords')
+ )));
+ }
+
+ $table = kolab_html::table(array(
+ 'id' => $task . 'list',
+ 'class' => 'list',
+ 'head' => $head,
+ 'body' => $rows,
+ 'foot' => $foot,
+ ));
+
+ if ($this->action == 'list') {
+ $this->output->command('set_watermark', 'taskcontent');
+ }
+
+ $this->output->set_env('search_request', $search_request ? base64_encode(serialize($search_request)) : null);
+ $this->output->set_env('list_page', $page);
+ $this->output->set_env('list_count', $count);
+ $this->output->set_env('list_size', count($result));
+ $this->output->set_object($task . 'list', $table);
+ }
}