Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 114 additions & 0 deletions controllers/LookupController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
<?php
/**
* Item Relations
* LookupController
* @copyright 2015 Michael Slone
* @license http://www.gnu.org/licenses/gpl-3.0.txt GNU GPLv3
*/

/**
* Lookup controller.
*/
class ItemRelations_LookupController extends Omeka_Controller_AbstractActionController
{
public function indexAction() {
if (!$this->_hasParam('partial')) {
$this->_setParam('partial', '');
}
if (!$this->_hasParam('item_type')) {
$this->_setParam('item_type', -1);
}
if (!$this->_hasParam('sort')) {
$this->_setParam('sort', 'mod_desc');
}
if (!$this->_hasParam('page')) {
$this->_setParam('page', 0);
}
if (!$this->_hasParam('per_page')) {
$this->_setParam('per_page', 15);
}

$partial = preg_replace('/[^ \.,\!\?\p{L}\p{N}\p{Mc}]/ui', '', $this->_getParam('partial'));
$where_text = '';
if (strlen($partial) > 0) {
$where_text = "AND text RLIKE '$partial'";
}

$item_type = intval($this->_getParam('item_type'));
$where_item_type = '';
if ($item_type > 0) {
$where_item_type = "AND items.item_type_id = $item_type";
}

$per_page = intval($this->_getParam('per_page'));
$page = intval($this->_getParam('page'));
$offset = $page * $per_page;

$order_clause = 'ORDER BY items.item_type_id ASC, text ASC';
switch ($this->_getParam('sort')) {
case 'mod_desc':
$order_clause = 'ORDER BY UNIX_TIMESTAMP(modified) DESC, items.item_type_id ASC, text ASC';
break;
case 'mod_asc':
$order_clause = 'ORDER BY UNIX_TIMESTAMP(modified) ASC, items.item_type_id ASC, text ASC';
break;
case 'alpha_desc':
$order_clause = 'ORDER BY items.item_type_id ASC, text DESC';
break;
case 'alpha_asc':
$order_clause = 'ORDER BY items.item_type_id ASC, text ASC';
break;
default:
/* do nothing */
break;
}

$title = 50;
$db = get_db();
$query = <<<QCOUNT
SELECT count(*) AS count
FROM {$db->Item} items
LEFT JOIN {$db->Element_Texts} elementtexts
ON (items.id = elementtexts.record_id)
WHERE elementtexts.element_id = $title
$where_item_type
$where_text
GROUP BY elementtexts.record_id
QCOUNT;
$m_count = count($db->fetchAll($query));

$max_page = floor($m_count / $per_page);
if ($page > $max_page) {
$page = $max_page;
$offset = $page * $per_page;
}

$query = <<<QUERY
SELECT items.id AS id, text
FROM {$db->Item} items
LEFT JOIN {$db->Element_Texts} elementtexts
ON (items.id = elementtexts.record_id)
WHERE elementtexts.element_id = $title
$where_item_type
$where_text
GROUP BY elementtexts.record_id
$order_clause
LIMIT $per_page
OFFSET $offset
QUERY;
$items = $db->fetchAll($query);
$m_items = array();

foreach ($items as $item) {
$m_items[] = array(
'value' => $item['id'],
'label' => $item['text'],
);
}

$this->view->metadata = array(
'count' => $m_count,
'items' => $m_items,
);
}
}
82 changes: 65 additions & 17 deletions item_relations_form.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,38 +20,86 @@
</thead>
<tbody>
<?php foreach ($subjectRelations as $subjectRelation): ?>
<tr>
<tr class="item-relations-entry">
<td><?php echo __('This Item'); ?></td>
<td><?php echo $subjectRelation['relation_text']; ?></td>
<td><a href="<?php echo url('items/show/' . $subjectRelation['object_item_id']); ?>" target="_blank"><?php echo $subjectRelation['object_item_title']; ?></a></td>
<td><input type="checkbox" name="item_relations_item_relation_delete[]" value="<?php echo $subjectRelation['item_relation_id']; ?>" /></td>
</tr>
<?php endforeach; ?>
<?php foreach ($objectRelations as $objectRelation): ?>
<tr>
<tr class="item-relations-entry">
<td><a href="<?php echo url('items/show/' . $objectRelation['subject_item_id']); ?>" target="_blank"><?php echo $objectRelation['subject_item_title']; ?></a></td>
<td><?php echo $objectRelation['relation_text']; ?></td>
<td><?php echo __('This Item'); ?></td>
<td><input type="checkbox" name="item_relations_item_relation_delete[]" value="<?php echo $objectRelation['item_relation_id']; ?>" /></td>
</tr>
<?php endforeach; ?>
<tr class="item-relations-entry">
<td><?php echo __('This Item'); ?></td>
<td><?php echo get_view()->formSelect('item_relations_property_id[]', null, array('multiple' => false), $formSelectProperties); ?></td>
<td><?php echo __('Item ID'); ?> <?php echo get_view()->formText('item_relations_item_relation_object_item_id[]', null, array('size' => 8)); ?></td>
<td><span style="color:#ccc;">n/a</span></td>
<tr class="hidden item-relations-entry">
<td><?php echo __('This Item'); ?><span class="item-relations-hidden"></span></td>
<td class="item-relations-property"></td>
<td class="item-relations-object"><a href="<?php echo url('items/show/'); ?>" target="_blank">.</a></td>
<td><span style="color:#ccc;"><?php echo __("[n/a]") ?></span></td>
</tr>
</tbody>
</table>
<button type="button" class="item-relations-add-relation"><?php echo __('Add a Relation'); ?></button>

<a href="#item-relation-selector" class="green button" data-lity><?php echo __('Add a Relation'); ?></a>

<?php
$db = get_db();
$sql = "SELECT id, name from {$db->Item_Types} ORDER BY id";
$itemtypes = $db->fetchAll($sql);
$m = array(
'-1' => __('All'),
);
foreach ($itemtypes as $type) {
$m[$type['id']] = $type['name'];
}
?>
<div id="item-relation-selector" style="overflow: auto; padding: 20px; border-radius: 6px; background: #fff" class="lity-hide">
<h2><?php echo metadata('item', array('Dublin Core', 'Title')); ?></h2>

<label for="new_relation_property_id"><?php echo __('This Item'); ?>: </label>
<?php echo get_view()->formSelect('new_relation_property_id', null, array('multiple' => false), $formSelectProperties); ?><br>

<p><label for="new_relation_object_item_type_id"><?php echo __('Item Types'); ?>: </label>
<?php echo get_view()->formSelect('new_relation_object_item_type_id', null, array('multiple' => false), $m); ?></p>

<p>
<?php echo __('Item Sort'); ?>:
<fieldset>
<input type="radio" name="itemsListSort" id="new_selectObjectSortTimestamp" value="timestamp" checked>
<label for="selectObjectSortTimeStamp"><?php echo __('Most recently updated'); ?></label>

<input type="radio" name="itemsListSort" id="new_selectObjectSortName" value="name">
<label for="selectObjectSortName"><?php echo __('Alphabetically'); ?></label>
</fieldset>
</p>

<p><?php echo __('Object Title'); ?>: <span id="object_title"></span></p>
<input id="new_relation_object_item_id" type="hidden">

<label for="partial_object_title"><?php echo __('Partial Object Title'); ?>: </label>
<input id="partial_object_title">

<br>
<ul class="pagination">
<li id="selector-previous-page" class="pg_disabled pagination_previous"><a href="#">&lt;</a></li>
<li id="selector-next-page" class="pg_disabled pagination_next"><a href="#">&gt;</a></li>
</ul>
<br>

<ul id="lookup-results">
</ul>

<a href="#" id="add-relation" class="green button" data-lity-close><?php echo __('Add Relation'); ?></a>
</div>

<link href="<?php echo PUBLIC_BASE_URL; ?>/plugins/ItemRelations/lity/lity.min.css" rel="stylesheet">
<script type="text/javascript" src="<?php echo PUBLIC_BASE_URL; ?>/plugins/ItemRelations/lity/lity.min.js"></script>
<link href="<?php echo PUBLIC_BASE_URL; ?>/plugins/ItemRelations/item_relations_styles.css" rel="stylesheet">
<script type="text/javascript">
jQuery(document).ready(function () {
jQuery('.item-relations-add-relation').click(function () {
var oldRow = jQuery('.item-relations-entry').last();
var newRow = oldRow.clone();
oldRow.after(newRow);
var inputs = newRow.find('input, select');
inputs.val('');
});
});
var url = '<?php echo url('item-relations/lookup/'); ?>';
</script>
<script type="text/javascript" src="<?php echo PUBLIC_BASE_URL; ?>/plugins/ItemRelations/item_relations_script.js"></script>
127 changes: 127 additions & 0 deletions item_relations_script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
jQuery(document).ready(function () {
var $ = jQuery;
var options = {};

function resetOptions() {
options['partial'] = '';
options['item_type'] = -1;
options['sort'] = 'mod_desc';
options['page'] = 0;
options['per_page'] = 15;
options = {
partial: '',
item_type: -1,
sort: 'mod_desc',
page: 0,
per_page: 15,
max_page: 0
};
}

resetOptions();
updateChoices();

function updateChoices() {
options['partial'] = $('#partial_object_title').val();
options['item_type'] = $('#new_relation_object_item_type_id').val();
if ($('input[name=itemsListSort]:checked').val() === 'timestamp') {
options['sort'] = 'mod_desc';
}
else {
options['sort'] = 'alpha_asc';
}
if (options['page'] < 0) {
options['page'] = 0;
}
if (options['page'] > options['max_page']) {
options['page'] = options['max_page'];
}
$.ajax({
url: url,
dataType: 'json',
data: options,
success: function (data) {
var i;
var items = [];

/* options */
$('#lookup-results').find('li').remove();
for (i = 0; i < data['items'].length; ++i) {
items.push('<li data-value="' + data['items'][i]['value'] + '">' + data['items'][i]['label'] + '</li>');
}
$('#lookup-results').append(items.join(''));

/* pagination */
options['max_page'] = Math.floor(data['count'] / options['per_page']);

if (0 < options['page']) {
$('#selector-previous-page').removeClass('pg_disabled');
}
else {
$('#selector-previous-page').addClass('pg_disabled');
}

if (options['page'] < options['max_page']) {
$('#selector-next-page').removeClass('pg_disabled');
}
else {
$('#selector-next-page').addClass('pg_disabled');
}
}
});
}

$('#add-relation').click(function () {
var oldRow = $('.item-relations-entry').last();
var newRow = oldRow.clone();
newRow.toggleClass('hidden');
newRow.find('.item-relations-property').html($('#new_relation_property_id').find(':selected').html());
var new_url = newRow.find('.item-relations-object a').attr('href');
newRow.find('.item-relations-object a').attr('href', new_url + $('#new_relation_object_item_id').val());
newRow.find('.item-relations-object a').text($('#object_title').text());
var hidden = [];
hidden.push('<input type="hidden" name="item_relations_property_id[]" value="');
hidden.push($('#new_relation_property_id').val());
hidden.push('">');
hidden.push('<input type="hidden" name="item_relations_item_relation_object_item_id[]" value="');
hidden.push($('#new_relation_object_item_id').val());
hidden.push('">');
newRow.find('.item-relations-hidden').html(hidden.join(''));
oldRow.before(newRow);
});

$('#lookup-results').on('click', 'li', function () {
$('#new_relation_object_item_id').val($(this).attr('data-value'));
$('#object_title').html($(this).html());
});

$('#selector-previous-page').click(function () {
if (0 < options['page']) {
options['page']--;
updateChoices();
}
});

$('#selector-next-page').click(function () {
if (options['page'] < options['max_page']) {
options['page']++;
updateChoices();
}
});

$('#new_relation_object_item_type_id').change(function () {
updateChoices();
});

$('#new_selectObjectSortTimestamp').click(function () {
updateChoices();
});

$('#new_selectObjectSortName').click(function () {
updateChoices();
});

$('#partial_object_title').on('input', function () {
updateChoices();
});
} );
7 changes: 7 additions & 0 deletions item_relations_styles.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.pg_disabled {
visibility: hidden;
}

.hidden {
display: none;
}
Loading