Skip to content

Commit 1a1487a

Browse files
authored
Merge pull request #5 from sinanatra/item-search
Added the possibility to link to internal Omeka-S resources
2 parents c1e611b + ee27979 commit 1a1487a

9 files changed

Lines changed: 268 additions & 47 deletions

File tree

asset/css/nesteddatatype.css

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
.ml {
2+
margin-left: 10px;;
3+
}
4+
15
.nested-data-type_entity_label {
26
padding-left: 5px;
37
font-weight: 500;
@@ -9,11 +13,11 @@
913
cursor: pointer;
1014
}
1115

12-
.nested-data-type_add_property[class*="o-icon-"]::before{
16+
.nested-data-type_add_property[class*="o-icon-"]::before {
1317
padding-right: 5px;
1418
}
1519

16-
.inputs .nested-data-type_button{
20+
.inputs .nested-data-type_button {
1721
margin: unset;
1822
padding: unset;
1923
background: none;
@@ -39,7 +43,7 @@
3943
background: #FFF8E5;
4044
}
4145

42-
.inputs .nested-data-type_repeat_property datalist{
46+
.inputs .nested-data-type_repeat_property datalist {
4347
margin: 0;
4448
border-radius: 0;
4549
}
@@ -69,7 +73,7 @@
6973
opacity: 100;
7074
}
7175

72-
.nested-data-type_properties .input{
76+
.nested-data-type_properties .input {
7377
border-bottom: 1px solid rgba(0,0,0,0.35);
7478
}
7579

@@ -90,4 +94,9 @@
9094
font-weight: normal;
9195
background: transparent;
9296
min-height: 36px !important;
97+
}
98+
99+
.nested-data-type_properties .items a:after {
100+
font-family: "Font Awesome 5 Free";
101+
content: " \f1b2";
93102
}

asset/js/nesteddatatype.js

Lines changed: 122 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
2+
13
$(document).on('o:prepare-value', function (e, type, value, valueObj) {
24
const thisValue = $(value);
35
const container = thisValue.find('.nested-data-type_properties');
46
const addBtn = thisValue.find('.nested-data-type_add_property');
5-
const addClass = $('.nested-data-type_add_class');
6-
const rmvBtn = $('.nested-data-type_remove_property');
7+
const selectResource = $('.nested-data-type__resource_link');
78

89
// Add a default Value to trigger the hydrate() function
910
const defaultValue = thisValue.find('.nested-data-type_value').val('value');
@@ -17,14 +18,17 @@ $(document).on('o:prepare-value', function (e, type, value, valueObj) {
1718
innerClass = container.find('.nested-data-type_repeat_property').last().find('.inner-class');
1819
innerProperty = container.find('.nested-data-type_repeat_property').last().find('.inner-property');
1920
}
20-
const cloneItem = () => container.append(container.find('.nested-data-type_repeat_property').last().clone());
21+
22+
const cloneItem = () =>
23+
container.append(container.find('.nested-data-type_repeat_property').last().clone());
2124

2225
// Add item on click
2326
addBtn.on('click', function (e) {
2427
e.preventDefault();
2528
const num = container.find('.nested-data-type_repeat_property').length;
2629
cloneItem();
2730
findItems();
31+
2832
select.attr({ 'data-value-key': `property-label-${num + 1}` })
2933
.val('');
3034
textareaValue.attr({ 'data-value-key': `property-value-${num + 1}` })
@@ -35,20 +39,16 @@ $(document).on('o:prepare-value', function (e, type, value, valueObj) {
3539
.val('');
3640
innerProperty.attr({ 'data-value-key': `inner-property-${num + 1}` })
3741
.val('');
38-
container.find('.nested-data-type_repeat_property')
39-
.last()
40-
.find('.nested-data-type_repeat_class')
41-
.css('display', 'block');
4242
});
4343

4444
// Remove Button on click
45-
rmvBtn.on('click', function (e) {
45+
container.on('click', '.nested-data-type_remove_property', function (e) {
4646
e.preventDefault();
4747
$(this).parent().remove();
4848
});
4949

5050
// Add Class on click
51-
addClass.on('click', function (e) {
51+
container.on('click', '.nested-data-type_add_class', function (e) {
5252
e.preventDefault();
5353
$(this).next().children().val('')
5454
$(this).next().toggle();
@@ -65,14 +65,27 @@ $(document).on('o:prepare-value', function (e, type, value, valueObj) {
6565
keys.forEach((element, idx) => {
6666
let item = properties[0][element];
6767
let val = item[0]
68-
6968
if (typeof val === "object") {
7069
if (idx == 1) {
7170
findItems();
7271
select.val(element);
7372
if (val['@value']) textareaValue.val(val['@value']);
7473
if (val['label']) textareaValue.val(val['label']);
7574
if (val['@id']) textareaUri.val(val['@id']);
75+
if (val['@id'] && val['@id'].includes('/api/items/')) {
76+
77+
container.find('.nested-data-type_repeat_property')
78+
.last()
79+
.find('.o-title.items')
80+
.remove();
81+
82+
container.find('.nested-data-type_repeat_property')
83+
.last()
84+
.find('.input')
85+
.css('display', 'none');
86+
let link = `<span class="o-title items ml"><a href="${url}"> ${label}</a></span>`
87+
container.append(container.find('.nested-data-type_repeat_property').last().append(link));
88+
}
7689
}
7790

7891
else if (idx > 1) {
@@ -88,6 +101,22 @@ $(document).on('o:prepare-value', function (e, type, value, valueObj) {
88101
if (val['@value']) { textareaValue.attr({ 'data-value-key': `property-value-${idx}` }).val(val['@value']) };
89102
if (val['label']) textareaValue.attr({ 'data-value-key': `property-value-${idx}` }).val(val['label']);
90103
if (val['@id']) textareaUri.attr({ 'data-value-key': `property-uri-${idx}` }).val(val['@id']);
104+
105+
if (val['@id'] && val['@id'].includes('/api/items/')) {
106+
container.find('.nested-data-type_repeat_property')
107+
.last()
108+
.find('.o-title.items')
109+
.remove();
110+
111+
container.find('.nested-data-type_repeat_property')
112+
.last()
113+
.find('.input')
114+
.css('display', 'none');
115+
116+
let changeLinkView = val['@id'].replace('/api/items/', '/admin/item/');
117+
let link = `<span class="o-title items ml"><a href="${changeLinkView}"> ${val['label']}</a></span>`
118+
container.append(container.find('.nested-data-type_repeat_property').last().append(link));
119+
}
91120
}
92121

93122
for (const [key, value] of Object.entries(val)) {
@@ -106,6 +135,22 @@ $(document).on('o:prepare-value', function (e, type, value, valueObj) {
106135
textareaValue.val(val[key]['@id']);
107136
}
108137
if (val[key]['label']) textareaValue.val(val[key]['label']);
138+
139+
if (val[key]['@id'] && val[key]['@id'].includes('/api/items/')) {
140+
container.find('.nested-data-type_repeat_property')
141+
.last()
142+
.find('.o-title.items')
143+
.remove();
144+
145+
container.find('.nested-data-type_repeat_property')
146+
.last()
147+
.find('.input')
148+
.css('display', 'none');
149+
150+
let changeLinkView = val[key]['@id'].replace('/api/items/', '/admin/item/');
151+
let link = `<span class="o-title items ml"><a href="${changeLinkView}"> ${val[key]['label']}</a></span>`
152+
container.append(container.find('.nested-data-type_repeat_property').last().append(link));
153+
}
109154
}
110155
else if (idx > 1) {
111156
innerClass.attr({ 'data-value-key': `inner-class-${idx}` });
@@ -114,15 +159,79 @@ $(document).on('o:prepare-value', function (e, type, value, valueObj) {
114159
if (val[key]['@value']) {
115160
textareaValue.attr({ 'data-value-key': `property-value-${idx}` }).val(val[key]['@value']);
116161
}
117-
if (val[key]['@id']) {
118-
textareaValue.attr({ 'data-value-key': `property-value-${idx}` }).val(val[key]['@id']);
162+
if (val[key]['label']) {
163+
textareaValue.attr({ 'data-value-key': `property-value-${idx}` }).val(val[key]['label']);
164+
}
165+
if (val[key]['@id']) textareaUri.attr({ 'data-value-key': `property-uri-${idx}` }).val(val[key]['@id']);
166+
167+
if (val[key]['@id'] && val[key]['@id'].includes('/api/items/')) {
168+
container.find('.nested-data-type_repeat_property')
169+
.last()
170+
.find('.o-title.items')
171+
.remove();
172+
173+
container.find('.nested-data-type_repeat_property')
174+
.last()
175+
.find('.input')
176+
.css('display', 'none');
177+
178+
let changeLinkView = val[key]['@id'].replace('/api/items/', '/admin/item/');
179+
let link = `<span class="o-title items ml"><a href="${changeLinkView}"> ${val[key]['label']}</a></span>`
180+
container.append(container.find('.nested-data-type_repeat_property').last().append(link));
119181
}
120-
if (val[key]['label']) textareaUri.attr({ 'data-value-key': `property-uri-${idx}` }).val(val[key]['label']);
121182
}
122183
}
123184
}
124185
});
125186
}
126187
catch (error) { console.error(error); }
127188
}
189+
190+
$(document).on('click', '.nested-data-type__resource_link', function (e) {
191+
e.preventDefault();
192+
193+
const resource = JSON.parse($(this.parentElement).attr('data-resource-values'));
194+
const id = resource['@id'];
195+
const label = resource['display_title'];
196+
const url = resource['url'];
197+
198+
if (thisValue.is('.selecting-resource')) {
199+
const num = container.find('.nested-data-type_repeat_property').length;
200+
201+
cloneItem();
202+
findItems();
203+
204+
select.attr({ 'data-value-key': `property-label-${num + 1}` })
205+
.val('');
206+
textareaValue.attr({ 'data-value-key': `property-value-${num + 1}` })
207+
.val(label)
208+
textareaUri.attr({ 'data-value-key': `property-uri-${num + 1}` })
209+
.val(id)
210+
innerClass.attr({ 'data-value-key': `inner-class-${num + 1}` })
211+
.val('');
212+
innerProperty.attr({ 'data-value-key': `inner-property-${num + 1}` })
213+
.val('');
214+
215+
container.find('.nested-data-type_repeat_property')
216+
.last()
217+
.find('.input')
218+
.css('display', 'none');
219+
220+
container.find('.nested-data-type_repeat_property')
221+
.last()
222+
.find('.o-title.items')
223+
.remove();
224+
225+
226+
let link = `<span class="o-title items ml"><a href="${url}"> ${label}</a></span>`
227+
228+
console.log(link)
229+
230+
container.append(container.find('.nested-data-type_repeat_property').last().append(link));
231+
232+
};
233+
});
234+
128235
});
236+
237+

config/module.config.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,34 @@
33
'data_types' => [
44
'abstract_factories' => ['NestedDataType\Service\NestedDataTypeFactory'],
55
],
6+
'controllers' => [
7+
'invokables' => [
8+
'NestedDataType\Controller\Index' => 'NestedDataType\Controller\IndexController',
9+
],
10+
],
611
'view_manager' => [
712
'template_path_stack' => [
813
OMEKA_PATH . '/modules/NestedDataType/view',
914
],
1015
],
16+
'router' => [
17+
'routes' => [
18+
'admin' => [
19+
'child_routes' => [
20+
'nested-data-type' => [
21+
'type' => 'Literal',
22+
'options' => [
23+
'route' => '/nested-data-type/sidebar-select',
24+
'defaults' => [
25+
'__NAMESPACE__' => 'NestedDataType\Controller',
26+
'controller' => 'Index',
27+
'action' => 'sidebar-select',
28+
],
29+
],
30+
'may_terminate' => true,
31+
],
32+
],
33+
],
34+
],
35+
],
1136
];

config/module.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ name = "Nested Data Types"
33
description= "Allow users to choose a specific resource class as datatype, and inner properties."
44
author = "Giacomo Nanni"
55
author_link = "https://github.com/sinanatra"
6-
version = "2.0.0"
6+
version = "2.2.0"
77
omeka_version_constraint = "^3.0.0"

src/Controller/IndexController.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace NestedDataType\Controller;
4+
5+
use Laminas\Mvc\Controller\AbstractActionController;
6+
use Laminas\View\Model\ViewModel;
7+
8+
class IndexController extends AbstractActionController
9+
{
10+
public function sidebarSelectAction()
11+
{
12+
$this->setBrowseDefaults('created');
13+
14+
$response = $this->api()->search('items', $this->params()->fromQuery());
15+
$this->paginator($response->getTotalResults());
16+
17+
$view = new ViewModel;
18+
$view->setVariable('items', $response->getContent());
19+
$view->setVariable('search', $this->params()->fromQuery('search'));
20+
$view->setVariable('resourceClassId', $this->params()->fromQuery('resource_class_id'));
21+
$view->setVariable('itemSetId', $this->params()->fromQuery('item_set_id'));
22+
$view->setVariable('showDetails', false);
23+
$view->setTerminal(true);
24+
$view->setTemplate('/nested-data-type/item/sidebar-select');
25+
return $view;
26+
}
27+
}

src/DataType/NestedDataType.php

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public function getOptgroupLabel()
4848

4949
public function form(PhpRenderer $view)
5050
{
51-
return $view->partial('common/data-type/nested', [
51+
return $view->partial('nested-data-type/data-type/nested-data-type', [
5252
'dataType' => $this->getName(),
5353
'label' => $this->getLabel(),
5454
'properties' => $this->properties,
@@ -95,25 +95,25 @@ public function getJsonLd(ValueRepresentation $value)
9595
/**
9696
* @param array $valueObject
9797
*/
98-
public function isValid(array $valueObject){
99-
100-
$labels = array_map(
101-
function ($prop){
102-
return $prop->term();
103-
},
104-
$this->properties
105-
);
106-
107-
foreach($valueObject as $key => $label) {
108-
if (strpos($key, 'property-label') !== false) {
109-
if(!in_array($label, $labels)){
110-
return false;
111-
}
112-
}
113-
}
114-
115-
return true;
116-
}
98+
// public function isValid(array $valueObject){
99+
100+
// $labels = array_map(
101+
// function ($prop){
102+
// return $prop->term();
103+
// },
104+
// $this->properties
105+
// );
106+
107+
// foreach($valueObject as $key => $label) {
108+
// if (strpos($key, 'property-label') !== false) {
109+
// if(!in_array($label, $labels)){
110+
// return false;
111+
// }
112+
// }
113+
// }
114+
115+
// return true;
116+
// }
117117

118118
public function hydrate(array $valueObject, Value $value, AbstractEntityAdapter $adapter){
119119

@@ -154,7 +154,6 @@ public function hydrate(array $valueObject, Value $value, AbstractEntityAdapter
154154

155155
}
156156

157-
// ksort($properties, SORT_NUMERIC);
158157
$value->setValue(json_encode([$properties]));
159158
}
160159
}

0 commit comments

Comments
 (0)