Skip to content

Commit 58be288

Browse files
author
Jose Linares
committed
Added more metadata types (number, lookup from db, user list). Refactoring helper class to make easier to add new types. Adding the attributes required and column number. Added spanish location
1 parent 3af2f0b commit 58be288

19 files changed

+345
-127
lines changed

Assets/js/meta-drag-and-drop.js

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
KB.on('dom.ready', function() {
2+
3+
function savePosition(metadataId, position) {
4+
var url = $(".metadata-table").data("save-position-url");
5+
6+
$.ajax({
7+
cache: false,
8+
url: url,
9+
contentType: "application/json",
10+
type: "POST",
11+
processData: false,
12+
data: JSON.stringify({
13+
"id": metadataId,
14+
"position": position
15+
})
16+
});
17+
}
18+
19+
$(".draggable-row-handle").mouseenter(function() {
20+
$(this).parent().parent().addClass("draggable-item-hover");
21+
}).mouseleave(function() {
22+
$(this).parent().parent().removeClass("draggable-item-hover");
23+
});
24+
25+
$(".metadata-table tbody").sortable({
26+
forcePlaceholderSize: true,
27+
handle: "td:first i",
28+
helper: function(e, ui) {
29+
ui.children().each(function() {
30+
$(this).width($(this).width());
31+
});
32+
33+
return ui;
34+
},
35+
stop: function(event, ui) {
36+
var metadata = ui.item;
37+
metadata.removeClass("draggable-item-selected");
38+
savePosition(metadata.data("metadata-id"), metadata.index() + 1);
39+
},
40+
start: function(event, ui) {
41+
ui.item.addClass("draggable-item-selected");
42+
}
43+
}).disableSelection();
44+
});

Controller/MetadataController.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function project()
1616
$project = $this->getProject();
1717

1818
$metadata = $this->projectMetadataModel->getAll($project['id']);
19-
19+
2020
$this->response->html($this->helper->layout->project('metaMagik:project/metadata', ['title' => t('Metadata'),
2121
'project' => $project,
2222
'metadata' => $metadata, ]));

Controller/MetadataTypesController.php

+12
Original file line numberDiff line numberDiff line change
@@ -116,5 +116,17 @@ public function removeTask()
116116
return $this->response->redirect($this->helper->url->to('MetadataTypesController', 'config', ['plugin' => 'metaMagik']));
117117

118118
}
119+
120+
public function movePosition()
121+
{
122+
$values = $this->request->getJson();
123+
if (! empty($values) && $_SESSION['user']['role'] == 'app-admin') {
124+
$result = $this->metadataTypeModel->changePosition($values['id'], $values['position']);
125+
$this->response->json(array('result' => $result));
126+
} else {
127+
throw new AccessForbiddenException();
128+
}
129+
}
130+
119131

120132
}

Filter/MetaFieldFilter.php

+3-4
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,13 @@ public function apply()
5858
{
5959
$metafield = $this->db
6060
->table(self::TABLE)
61-
->eq('name', '%' . $this->value . '%')
61+
->ilike('name', '%'.$this->value.'%')
6262
->asc('task_id')
63-
->findAll();
63+
->findAllByColumn('task_id');
6464

6565
$task_ids = $metafield;
6666

67-
$this->query->in(TaskModel::TABLE.'.id', $task_ids);
67+
return $this->query->in(TaskModel::TABLE.'.id', $task_ids);
6868

69-
return $this;
7069
}
7170
}

Filter/MetaValueFilter.php

+3-4
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,13 @@ public function apply()
5858
{
5959
$metafield = $this->db
6060
->table(self::TABLE)
61-
->eq('value', '%' . $this->value . '%')
61+
->ilike('value', '%'.$this->value.'%')
6262
->asc('task_id')
63-
->findAll();
63+
->findAllByColumn('task_id');
6464

6565
$task_ids = $metafield;
6666

67-
$this->query->in(TaskModel::TABLE.'.id', $task_ids);
67+
return $this->query->in(TaskModel::TABLE.'.id', $task_ids);
6868

69-
return $this;
7069
}
7170
}

Helper/MetaHelper.php

+80-98
Original file line numberDiff line numberDiff line change
@@ -2,128 +2,110 @@
22

33
namespace Kanboard\Plugin\MetaMagik\Helper;
44

5-
use Kanboard\Plugin\MetaMagik\Model\MetadataTypeModel;
65
use Kanboard\Core\Base;
6+
use Kanboard\Model\UserModel;
77

88
/**
99
* Meta helper
1010
*
1111
*/
1212
class MetaHelper extends Base
1313
{
14-
1514

16-
public function renderMetaFields(array $values, array $errors = array(), array $attributes = array())
15+
public function renderMetaTextField($key, $value, array $errors = array(), array $attributes = array())
1716
{
18-
$metasettings = $this->metadataTypeModel->getAll();
17+
$html = "";
18+
$html .= $this->helper->form->label($key, 'metamagikkey_' . $key);
19+
$html .= $this->helper->form->text('metamagikkey_' . $key, ['metamagikkey_' . $key => $value], $errors, $attributes, 'form-input-small');
20+
return $html;
21+
}
22+
23+
public function renderMetaNumberField($key, $value, array $errors = array(), array $attributes = array())
24+
{
25+
$html = "";
26+
$html .= $this->helper->form->label($key, 'metamagikkey_' . $key);
27+
$html .= $this->helper->form->number('metamagikkey_' . $key, ['metamagikkey_' . $key => $value], $errors, $attributes, 'form-input-small');
28+
return $html;
29+
}
30+
31+
public function renderMetaListField($key, $value, array $list, $type, array $errors = array(), array $attributes = array())
32+
{
33+
$map_list = [];
34+
foreach ($list as $name => $value) {
35+
$map_list[$value] = $value;
36+
}
37+
38+
$html = "";
39+
$html .= $this->helper->form->label($key, 'metamagikkey_' . $key);
40+
41+
switch ($type){
42+
case "radio": $html .= $this->helper->form->radios('metamagikkey_' . $key, $map_list, ['metamagikkey_' . $key => $value]); break;
43+
case "list": $html .= $this->helper->form->select('metamagikkey_' . $key, $map_list, ['metamagikkey_' . $key => $value], $errors, $attributes, 'form-input-small'); break;
44+
case "check": $html .= $this->helper->form->checkboxes('metamagikkey_' . $key, $map_list, ['metamagikkey_' . $key => $value]); break;
45+
}
46+
47+
return $html;
48+
}
49+
50+
public function renderMetaUsersField($key, $value, array $errors = array(), array $attributes = array()){
51+
$aux_user = new UserModel($this->container);
52+
$users_table = $aux_user->getActiveUsersList(false);
53+
$users = [];
54+
foreach ($users_table as $name => $valuex) {
55+
$users[] = $valuex;
56+
}
57+
return $this->renderMetaListField($key, $value, $users, 'list', $errors, $attributes);
58+
}
59+
60+
public function renderMetaTableField($key, $value, $table_name, $keycolumn, $valuecolumn, array $errors = array(), array $attributes = array()){
61+
$meta_opt[''] = '';
62+
$aux_table = $this->db->table($table_name)->columns($keycolumn, $valuecolumn)->findAll();
63+
foreach ($aux_table as $valuex) {
64+
$meta_opt[$valuex[$keycolumn]] = $valuex[$valuecolumn];
65+
}
66+
return $this->renderMetaListField($key, $value, $meta_opt, 'list', $errors, $attributes);
67+
}
68+
69+
public function renderMetaFields(array $values, $column_number, array $errors = array(), array $attributes = array())
70+
{
71+
$metasettings = $this->metadataTypeModel->getAllInColumn($column_number);
72+
$metadata = $this->taskMetadataModel->getAll($values['id']);
1973
$html = '';
20-
$meta_opt = array();
21-
74+
2275
if (isset($values['id'])) {
2376
foreach ($metasettings as $setting) {
2477
if ($setting['attached_to'] == 'task') {
2578
$metaisset = $this->taskMetadataModel->exists($values['id'], $setting['human_name']);
26-
if (!$metaisset) {
27-
$this->taskMetadataModel->save($values['id'], [$setting['human_name'] => '']);
28-
}
29-
}
30-
}
31-
} else {
32-
foreach ($metasettings as $setting) {
33-
if ($setting['attached_to'] == 'task') {
34-
35-
if ($setting['data_type'] == 'text') {
36-
$html .= $this->helper->form->label($setting['human_name'], 'metamagikkey_' . $setting['human_name']);
37-
$html .= $this->helper->form->text('metamagikkey_' . $setting['human_name'], $values, $errors, $attributes, 'form-input-small');
38-
$meta_opt = array();
39-
} else if ($setting['data_type'] == 'list') {
40-
$opt_explode = explode(',', $setting['options']);
41-
foreach ($opt_explode as $key => $value) {
42-
$meta_opt[$value] = $value;
43-
}
44-
$html .= $this->helper->form->label($setting['human_name'], 'metamagikkey_' . $setting['human_name']);
45-
$html .= $this->helper->form->select('metamagikkey_' . $setting['human_name'], $meta_opt, $values, $errors, $attributes, 'form-input-small');
46-
$meta_opt = array();
47-
} else if ($setting['data_type'] == 'radio') {
48-
$opt_explode = explode(',', $setting['options']);
49-
foreach ($opt_explode as $key => $value) {
50-
$meta_opt[$value] = $value;
51-
}
52-
$html .= $this->helper->form->label($setting['human_name'], 'metamagikkey_' . $setting['human_name']);
53-
$html .= $this->helper->form->radios('metamagikkey_' . $setting['human_name'], $meta_opt, $values);
54-
$meta_opt = array();
55-
} else if ($setting['data_type'] == 'check') {
56-
$opt_explode = explode(',', $setting['options']);
57-
foreach ($opt_explode as $key => $value) {
58-
$meta_opt[$value] = $value;
59-
}
60-
$html .= $this->helper->form->label($setting['human_name'], 'metamagikkey_' . $setting['human_name'] . '[]');
61-
$html .= $this->helper->form->checkboxes('metamagikkey_' . $setting['human_name'] . '[]', $meta_opt, $values);
62-
$meta_opt = array();
79+
if (!$metaisset) {
80+
$this->taskMetadataModel->save($values['id'], [$setting['human_name'] => '']);
6381
}
64-
6582
}
6683
}
6784
}
68-
69-
$meta_opt = array();
70-
$meta_type = array();
71-
$meta_deopt = array();
72-
$metadata = $this->taskMetadataModel->getAll($values['id']);
73-
85+
7486
foreach ($metasettings as $setting) {
75-
$metaisset = $this->taskMetadataModel->exists($values['id'], $setting['human_name']);
7687
$key = $setting['human_name'];
77-
if ($metaisset) {
78-
$meta_deopt[$key] = $setting['options'];
79-
$meta_type[$key] = $setting['data_type'];
88+
$values['metamagikkey_' . $key] = $metadata[$key];
89+
$new_attributes = $attributes;
90+
if($setting['is_required']) {
91+
$new_attributes['required'] = "required";
92+
}
93+
if ($setting['data_type'] == 'text') {
94+
$html .= $this->renderMetaTextField($key, $metadata[$key] ? $metadata[$key] : "", $errors, $new_attributes);
95+
} elseif ($setting['data_type'] == 'number') {
96+
$html .= $this->renderMetaNumberField($key, $metadata[$key] ? $metadata[$key] : "", $errors, $new_attributes);
97+
} else if ($setting['data_type'] == 'table') {
98+
$opt_explode = explode(',', $setting['options']);
99+
$html .= $this->renderMetaTableField($key, $metadata[$key] ? $metadata[$key] : "", $opt_explode[0], $opt_explode[1], $opt_explode[2], $errors, $new_attributes);
100+
} elseif ($setting['data_type'] == 'users') {
101+
$html .= $this->renderMetaUsersField($key, $metadata[$key] ? $metadata[$key] : "", $errors, $new_attributes);
102+
} elseif ($setting['data_type'] == 'list' || $setting['data_type'] == 'radio' || $setting['data_type'] == 'check') {
103+
$opt_explode = explode(',', $setting['options']);
104+
$html .= $this->renderMetaListField($key, $metadata[$key] ? $metadata[$key] : "", $opt_explode, $setting['data_type'], $errors, $new_attributes);
80105
}
81-
}
82-
83-
84-
foreach ($metadata as $key => $value) {
85-
if ($meta_type[$key] == 'text') {
86-
$values['metamagikkey_' . $key] = $metadata[$key];
87-
$html .= $this->helper->form->label($key, 'metamagikkey_' . $key);
88-
$html .= $this->helper->form->text('metamagikkey_' . $key, $values, $errors, $attributes, 'form-input-small');
89-
$meta_opt = array();
90-
} else if ($meta_type[$key] == 'list') {
91-
$values['metamagikkey_' . $key] = $metadata[$key];
92-
$opt_explode = explode(',', $meta_deopt[$key]);
93-
foreach ($opt_explode as $name => $value) {
94-
$meta_opt[$value] = $value;
95-
}
96-
$html .= $this->helper->form->label($key, 'metamagikkey_' . $key);
97-
$html .= $this->helper->form->select('metamagikkey_' . $key, $meta_opt, $values, $errors, $attributes, 'form-input-small');
98-
$meta_opt = array();
99-
} else if ($meta_type[$key] == 'radio') {
100-
$values['metamagikkey_' . $key] = $metadata[$key];
101-
$opt_explode = explode(',', $meta_deopt[$key]);
102-
foreach ($opt_explode as $name => $value) {
103-
$meta_opt[$value] = $value;
104-
}
105-
$html .= $this->helper->form->label($key, 'metamagikkey_' . $key);
106-
$html .= $this->helper->form->radios('metamagikkey_' . $key, $meta_opt, $values);
107-
$meta_opt = array();
108-
} else if ($meta_type[$key] == 'check') {
109-
$wtf = explode(',', $metadata[$key]);
110-
111-
foreach ($wtf as $key_fix) {
112-
$values['metamagikkey_' . $key . '[]'][$key_fix] = $key_fix;
113-
}
114-
115-
$opt_explode = explode(',', $meta_deopt[$key]);
116-
foreach ($opt_explode as $name => $value) {
117-
$meta_opt[$value] = $value;
118-
}
119-
120-
$html .= $this->helper->form->label($key, 'metamagikkey_' . $key . '[]');
121-
$html .= $this->helper->form->checkboxes('metamagikkey_' . $key . '[]', $meta_opt, $values);
122-
$meta_opt = array();
123-
}
124106
}
125107

126108
return $html;
127109
}
128-
110+
129111
}

Locale/es_ES/translations.php

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
return [
4+
'Metadata' => 'Metadatos',
5+
'Key' => 'Clave',
6+
'Value' => 'Valor',
7+
'No metadata' => 'No hay metadatos',
8+
'Remove Metadata' => 'Eliminar metadatos',
9+
'Do you really want to remove this metadata?' => 'Seguro que quieres eliminar estos metadatos?',
10+
'Add Metadata' => 'Añadir metadatos',
11+
];

Model/MetadataTypeModel.php

+53-2
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,66 @@ class MetadataTypeModel extends Base
2525
*/
2626
public function getAll()
2727
{
28-
$metadataTypes = $this->db->table(self::TABLE)->findAll();
28+
$metadataTypes = $this->db->table(self::TABLE)
29+
->asc('position')
30+
->findAll();
2931

3032
return $metadataTypes;
3133
}
32-
34+
35+
public function getAllInColumn($column_number)
36+
{
37+
$metadataTypes = $this->db->table(self::TABLE)
38+
->eq("column_number",$column_number)
39+
->asc('position')
40+
->findAll();
41+
42+
return $metadataTypes;
43+
}
44+
3345
public function remove($id)
3446
{
3547
return $this->db->table(self::TABLE)
3648
->eq('id', $id)
3749
->remove();
3850
}
51+
52+
public function existsInTask($task_id)
53+
{
54+
$cf = $this->getAll();
55+
$set = false;
56+
foreach ($cf as $f) {
57+
if ($this->taskMetadataModel->exists($task_id, $f['human_name'])) {
58+
$set = true;
59+
break;
60+
}
61+
}
62+
63+
return $set;
64+
}
65+
66+
public function changePosition($id, $position)
67+
{
68+
if ($position < 1 || $position > $this->db->table(self::TABLE)->count()) {
69+
return false;
70+
}
71+
72+
$ids = $this->db->table(self::TABLE)->neq('id', $id)->asc('position')->findAllByColumn('id');
73+
$offset = 1;
74+
$results = array();
75+
76+
foreach ($ids as $current_id) {
77+
if ($offset == $position) {
78+
$offset++;
79+
}
80+
81+
$results[] = $this->db->table(self::TABLE)->eq('id', $current_id)->update(array('position' => $offset));
82+
$offset++;
83+
}
84+
85+
$results[] = $this->db->table(self::TABLE)->eq('id', $id)->update(array('position' => $position));
86+
87+
return !in_array(false, $results, true);
88+
}
89+
3990
}

0 commit comments

Comments
 (0)