-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatastore_data_preview.module
More file actions
192 lines (173 loc) · 5.75 KB
/
datastore_data_preview.module
File metadata and controls
192 lines (173 loc) · 5.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
<?php
/**
* @file
* Hook implementations for the Datastore Data Preview module.
*/
use Drupal\common\DataResource;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Link;
use Drupal\Core\Url;
use Drupal\node\NodeInterface;
/**
* Implements hook_theme().
*/
function datastore_data_preview_theme() {
return [
'datastore_data_preview' => [
'variables' => [
'table' => NULL,
'pager' => NULL,
'page_size_form' => NULL,
'result_summary' => NULL,
],
'template' => 'datastore-data-preview',
],
];
}
/**
* Implements hook_form_node_data_edit_form_alter().
*
* Adds inline data preview links to tabular distributions in the edit form.
*/
function datastore_data_preview_form_node_data_edit_form_alter(&$form, FormStateInterface $form_state) {
$node = $form_state->getFormObject()->getEntity();
if (($node->get('field_data_type')->value ?? '') !== 'dataset') {
return;
}
/** @var \Drupal\common\DatasetInfo $datasetInfo */
$datasetInfo = \Drupal::service('dkan.common.dataset_info');
$info = $datasetInfo->gather($node->uuid());
$revision = $info['published_revision'] ?? $info['latest_revision'] ?? NULL;
if (!$revision || empty($revision['distributions'])) {
return;
}
$distItems = &$form['field_json_metadata']['widget'][0]['value']['distribution']['distribution'] ?? NULL;
if (!is_array($distItems)) {
return;
}
foreach ($revision['distributions'] as $i => $dist) {
if (!is_array($dist) || empty($dist['resource_id']) || empty($dist['resource_version'])) {
continue;
}
// Only show preview for tabular/importable file types.
if (!in_array($dist['mime_type'] ?? '', DataResource::IMPORTABLE_FILE_TYPES)) {
continue;
}
if (!isset($distItems[$i]['distribution'])) {
continue;
}
$resourceId = $dist['resource_id'] . '__' . $dist['resource_version'];
$url = Url::fromRoute('datastore_data_preview.preview', ['resource_id' => $resourceId]);
$previewLink = [
'#type' => 'container',
'#attributes' => ['class' => ['data-preview-link']],
'#attached' => ['library' => ['datastore_data_preview/data_preview']],
'link' => Link::fromTextAndUrl(t('Preview data'), $url)->toRenderable(),
];
// Insert preview link right after downloadURL in the distribution fieldset.
$distElement = &$distItems[$i]['distribution'];
$inserted = [];
foreach ($distElement as $key => $value) {
$inserted[$key] = $value;
if ($key === 'downloadURL') {
$inserted['data_preview_link'] = $previewLink;
}
}
$distElement = $inserted;
}
}
/**
* Implements hook_theme_registry_alter().
*
* Overrides DKAN's node--data template to include data preview output.
*/
function datastore_data_preview_theme_registry_alter(&$theme_registry) {
if (isset($theme_registry['node__data'])) {
$module_path = \Drupal::service('extension.list.module')->getPath('datastore_data_preview');
$theme_registry['node__data']['path'] = $module_path . '/templates';
}
}
/**
* Implements hook_entity_extra_field_info().
*/
function datastore_data_preview_entity_extra_field_info() {
$extra = [];
if (\Drupal::entityTypeManager()->getStorage('node_type')->load('data')) {
$extra['node']['data']['display']['data_preview'] = [
'label' => t('Data Preview'),
'description' => t('Paginated preview tables for tabular distributions.'),
'weight' => 100,
'visible' => TRUE,
];
}
return $extra;
}
/**
* Implements hook_ENTITY_TYPE_view() for node entities.
*
* Adds data preview tables for each tabular distribution on dataset nodes.
*/
function datastore_data_preview_node_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) {
if (!$entity instanceof NodeInterface) {
return;
}
if ($entity->bundle() !== 'data') {
return;
}
if (($entity->get('field_data_type')->value ?? '') !== 'dataset') {
return;
}
if (!$display->getComponent('data_preview')) {
return;
}
// During node preview of a new (unsaved) node, datastore tables don't exist.
if (!empty($entity->in_preview) && $entity->isNew()) {
$build['data_preview'] = [
'#markup' => '<p>' . t('Data preview is available after the dataset is saved and data is imported.') . '</p>',
];
return;
}
/** @var \Drupal\common\DatasetInfo $datasetInfo */
$datasetInfo = \Drupal::service('dkan.common.dataset_info');
$info = $datasetInfo->gather($entity->uuid());
$revision = $info['published_revision'] ?? $info['latest_revision'] ?? NULL;
if (!$revision || empty($revision['distributions'])) {
return;
}
$previews = [];
foreach ($revision['distributions'] as $dist) {
if (!is_array($dist) || empty($dist['resource_id']) || empty($dist['resource_version'])) {
continue;
}
if (!in_array($dist['mime_type'] ?? '', DataResource::IMPORTABLE_FILE_TYPES)) {
continue;
}
$resourceId = $dist['resource_id'] . '__' . $dist['resource_version'];
// Derive a label from the source path filename.
$label = '';
if (!empty($dist['source_path'])) {
$label = basename(parse_url($dist['source_path'], PHP_URL_PATH) ?: $dist['source_path']);
}
$preview = [
'#type' => 'container',
'#attributes' => ['class' => ['data-preview-distribution']],
];
if ($label) {
$preview['heading'] = [
'#type' => 'html_tag',
'#tag' => 'h3',
'#value' => t('Preview: @label', ['@label' => $label]),
];
}
$preview['table'] = [
'#type' => 'data_preview',
'#resource_id' => $resourceId,
];
$previews[] = $preview;
}
if ($previews) {
$build['data_preview'] = $previews;
}
}