[installation] Update all nightly packages
This commit is contained in:
@ -1,3 +1,4 @@
|
||||
/* Existing fdsnws.css rules - KEEP THESE UNCHANGED */
|
||||
#query-form fieldset {
|
||||
width: 400px;
|
||||
display: table-cell;
|
||||
@ -12,3 +13,62 @@ input {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
/* Event-based time selection status and control styles */
|
||||
#event-status {
|
||||
margin-top: 5px;
|
||||
padding: 5px;
|
||||
border-radius: 3px;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
#event-status.loading {
|
||||
background-color: #fff3cd;
|
||||
color: #856404;
|
||||
border: 1px solid #ffeaa7;
|
||||
}
|
||||
|
||||
#event-status.success {
|
||||
background-color: #d4edda;
|
||||
color: #155724;
|
||||
border: 1px solid #c3e6cb;
|
||||
}
|
||||
|
||||
#event-status.error {
|
||||
background-color: #f8d7da;
|
||||
color: #721c24;
|
||||
border: 1px solid #f5c6cb;
|
||||
}
|
||||
|
||||
.time-controls {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
align-items: center;
|
||||
margin-top: 10px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.time-controls input {
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
.clear-button {
|
||||
background-color: #6c757d;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 4px 8px;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
font-size: 0.8em;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
.clear-button:hover {
|
||||
background-color: #545b62;
|
||||
}
|
||||
|
||||
/* Improve time input visibility - all datetime fields */
|
||||
input.tcal {
|
||||
font-size: 0.9em;
|
||||
padding: 3px 5px;
|
||||
min-width: 190px;
|
||||
}
|
||||
@ -8,31 +8,55 @@
|
||||
<link rel="stylesheet" type="text/css" href="../../js/tcal/tcal.css">
|
||||
<script type="text/javascript" src="../../js/tcal/tcal.js"></script>
|
||||
<script type="text/javascript" src="../../js/fdsnws-query.js"></script>
|
||||
<script type="text/javascript" src="../../js/event-time-selection.js"></script>
|
||||
<script type="text/javascript">
|
||||
A_TCALCONF['format'] = 'Y-m-dT00:00:00';
|
||||
|
||||
window.onload = fdsnwsInitQueryForm;
|
||||
|
||||
window.onload = function() {
|
||||
fdsnwsInitQueryForm();
|
||||
initializeEventTimeSelection();
|
||||
};
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<p><a href="./">Parent Directory</a></p>
|
||||
<h1>SeisComP FDSNWS DataSelect - URL Builder</h1>
|
||||
|
||||
<form id="query-form" action="query" method="GET">
|
||||
|
||||
<!-- Event-based Time Selection -->
|
||||
<fieldset class="event-section">
|
||||
<legend>Event-based Time Selection</legend>
|
||||
<div>
|
||||
<label>Event ID: </label>
|
||||
<input type="text" id="event-id" placeholder="Enter event ID" style="width: 150px;"/>
|
||||
<button type="button" id="clear-event" class="clear-btn">Clear</button>
|
||||
</div>
|
||||
|
||||
<div id="event-status"></div>
|
||||
|
||||
<div class="time-controls">
|
||||
<label>Before: <input type="number" id="before-time" min="0" step="1.0" placeholder="0"/> min</label>
|
||||
<label>After: <input type="number" id="after-time" min="0" step="1.0" placeholder="0"/> min</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>Time constraints</legend>
|
||||
<table class="builder">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Start Time</td>
|
||||
<td><input type="text" size="10" maxlength="26" name="starttime" value="" class="tcal"/></td>
|
||||
<td><input type="text" size="20" maxlength="26" name="starttime" value="" class="tcal" placeholder="YYYY-MM-DDTHH:MM:SS"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>End Time</td>
|
||||
<td><input type="text" size="10" maxlength="26" name="endtime" value="" class="tcal"/></td>
|
||||
<td><input type="text" size="20" maxlength="26" name="endtime" value="" class="tcal" placeholder="YYYY-MM-DDTHH:MM:SS"/></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>Channel constraints</legend>
|
||||
<table class="builder">
|
||||
@ -56,6 +80,7 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>Service specific constraints</legend>
|
||||
<table class="builder">
|
||||
@ -79,6 +104,7 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>Output control</legend>
|
||||
<table class="builder">
|
||||
@ -95,9 +121,10 @@
|
||||
</table>
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<fieldset>
|
||||
<legend>URL</legend>
|
||||
<p><a id="query-url" href=""></a></p>
|
||||
</fieldset>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
@ -24,11 +24,11 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Start Time</td>
|
||||
<td><input type="text" size="10" maxlength="26" name="starttime" value="" class="tcal"/></td>
|
||||
<td><input type="text" size="20" maxlength="26" name="starttime" value="" class="tcal" placeholder="YYYY-MM-DDTHH:MM:SS"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>End Time</td>
|
||||
<td><input type="text" size="10" maxlength="26" name="endtime" value="" class="tcal"/></td>
|
||||
<td><input type="text" size="20" maxlength="26" name="endtime" value="" class="tcal" placeholder="YYYY-MM-DDTHH:MM:SS"/></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@ -172,7 +172,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Update After</td>
|
||||
<td><input type="text" size="10" maxlength="26" name="updateafter" value="" class="tcal" disabled="disabled"/></td>
|
||||
<td><input type="text" size="10" maxlength="26" name="updateafter" value="" class="tcal" placeholder="YYYY-MM-DDTHH:MM:SS" disabled="disabled"/></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@ -210,4 +210,4 @@
|
||||
<p><a id="query-url" href=""></a></p>
|
||||
</fieldset>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
172
share/fdsnws/js/event-time-selection.js
Normal file
172
share/fdsnws/js/event-time-selection.js
Normal file
@ -0,0 +1,172 @@
|
||||
/**
|
||||
* Event-based time selection functionality for FDSNWS DataSelect builder
|
||||
*/
|
||||
|
||||
// Simple debounce utility
|
||||
function debounce(fn, delay) {
|
||||
let timeout;
|
||||
return function(...args) {
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(() => fn.apply(this, args), delay);
|
||||
};
|
||||
}
|
||||
|
||||
async function checkEventService() {
|
||||
try {
|
||||
const response = await fetch('../../event/1/version');
|
||||
return response.ok;
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Event functionality
|
||||
let currentOriginTime = null;
|
||||
let currentController = null; // Track current request for cancellation
|
||||
|
||||
async function fetchEventOriginTime(eventId, signal = null) {
|
||||
const params = new URLSearchParams({
|
||||
eventid: eventId,
|
||||
format: 'text',
|
||||
nodata: '404'
|
||||
});
|
||||
|
||||
const response = await fetch(`../../event/1/query?${params}`, { signal });
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(response.status === 404 ? 'Event not found' : 'Failed to fetch event');
|
||||
}
|
||||
|
||||
const text = await response.text();
|
||||
const lines = text.trim().split('\n');
|
||||
if (lines.length < 2) throw new Error('Invalid response format');
|
||||
|
||||
const originTimeStr = lines[1].split('|')[1]?.trim();
|
||||
if (!originTimeStr) throw new Error('No origin time found');
|
||||
|
||||
const originTime = originTimeStr.endsWith('Z')
|
||||
? new Date(originTimeStr)
|
||||
: new Date(originTimeStr + 'Z');
|
||||
|
||||
if (isNaN(originTime.getTime())) throw new Error('Invalid origin time');
|
||||
|
||||
return originTime;
|
||||
}
|
||||
|
||||
function updateTimeFields() {
|
||||
if (!currentOriginTime) return;
|
||||
|
||||
const before = parseFloat(document.getElementById('before-time').value) || 0;
|
||||
const after = parseFloat(document.getElementById('after-time').value) || 0;
|
||||
|
||||
const startTime = new Date(currentOriginTime.getTime() - before * 60000);
|
||||
const endTime = new Date(currentOriginTime.getTime() + after * 60000);
|
||||
|
||||
const startField = document.querySelector('input[name="starttime"]');
|
||||
const endField = document.querySelector('input[name="endtime"]');
|
||||
|
||||
startField.value = startTime.toISOString().replace(/\.\d{3}Z$/, '');
|
||||
endField.value = endTime.toISOString().replace(/\.\d{3}Z$/, '');
|
||||
|
||||
// Trigger URL update by dispatching change events on the time fields
|
||||
startField.dispatchEvent(new Event('change', { bubbles: true }));
|
||||
endField.dispatchEvent(new Event('change', { bubbles: true }));
|
||||
}
|
||||
|
||||
const debouncedEventLookup = debounce(async function(eventId) {
|
||||
const statusDiv = document.getElementById('event-status');
|
||||
|
||||
// Cancel previous request if still running
|
||||
if (currentController) {
|
||||
currentController.abort();
|
||||
}
|
||||
|
||||
if (!eventId.trim()) {
|
||||
currentController = null;
|
||||
currentOriginTime = null;
|
||||
statusDiv.textContent = '';
|
||||
statusDiv.className = '';
|
||||
return;
|
||||
}
|
||||
|
||||
if (eventId.length < 3) {
|
||||
statusDiv.textContent = 'Enter complete Event ID...';
|
||||
statusDiv.className = 'loading';
|
||||
return;
|
||||
}
|
||||
|
||||
// Create new controller - this becomes the "current" request
|
||||
currentController = new AbortController();
|
||||
const signal = currentController.signal;
|
||||
|
||||
statusDiv.textContent = 'Fetching event...';
|
||||
statusDiv.className = 'loading';
|
||||
|
||||
try {
|
||||
currentOriginTime = await fetchEventOriginTime(eventId, signal);
|
||||
|
||||
// Only update UI if this request wasn't cancelled
|
||||
if (!signal.aborted) {
|
||||
statusDiv.textContent = `Origin Time: ${currentOriginTime.toISOString().replace(/\.\d{3}Z$/, '')}`;
|
||||
statusDiv.className = 'success';
|
||||
updateTimeFields();
|
||||
}
|
||||
} catch (error) {
|
||||
// Don't show error if request was just cancelled
|
||||
if (!signal.aborted && error.name !== 'AbortError') {
|
||||
statusDiv.textContent = error.message;
|
||||
statusDiv.className = 'error';
|
||||
currentOriginTime = null;
|
||||
}
|
||||
}
|
||||
}, 800);
|
||||
|
||||
function clearEventData() {
|
||||
// Cancel any pending request
|
||||
if (currentController) {
|
||||
currentController.abort();
|
||||
currentController = null;
|
||||
}
|
||||
|
||||
document.getElementById('event-id').value = '';
|
||||
document.getElementById('before-time').value = '';
|
||||
document.getElementById('after-time').value = '';
|
||||
|
||||
const startField = document.querySelector('input[name="starttime"]');
|
||||
const endField = document.querySelector('input[name="endtime"]');
|
||||
startField.value = '';
|
||||
endField.value = '';
|
||||
|
||||
document.getElementById('event-status').textContent = '';
|
||||
document.getElementById('event-status').className = '';
|
||||
currentOriginTime = null;
|
||||
|
||||
// Trigger URL update
|
||||
startField.dispatchEvent(new Event('change', { bubbles: true }));
|
||||
endField.dispatchEvent(new Event('change', { bubbles: true }));
|
||||
}
|
||||
|
||||
async function initializeEventTimeSelection() {
|
||||
// Check event service on load and configure UI
|
||||
const serviceAvailable = await checkEventService();
|
||||
const eventSection = document.querySelector('.event-section');
|
||||
const eventLegend = eventSection.querySelector('legend');
|
||||
|
||||
if (serviceAvailable) {
|
||||
eventLegend.textContent = 'Event-based Time Selection ✓';
|
||||
eventLegend.style.color = '#28a745';
|
||||
|
||||
// Set up event listeners
|
||||
document.getElementById('event-id').addEventListener('input', (e) => {
|
||||
debouncedEventLookup(e.target.value);
|
||||
});
|
||||
|
||||
document.getElementById('before-time').addEventListener('input', updateTimeFields);
|
||||
document.getElementById('after-time').addEventListener('input', updateTimeFields);
|
||||
document.getElementById('clear-event').addEventListener('click', clearEventData);
|
||||
} else {
|
||||
eventLegend.textContent = 'Event-based Time Selection (service unavailable)';
|
||||
eventLegend.style.color = '#dc3545';
|
||||
eventSection.disabled = true;
|
||||
}
|
||||
}
|
||||
@ -24,27 +24,27 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Start Time</td>
|
||||
<td><input type="text" size="10" maxlength="26" name="starttime" value="" class="tcal"/></td>
|
||||
<td><input type="text" size="10" maxlength="26" name="starttime" value="" class="tcal" placeholder="YYYY-MM-DDTHH:MM:SS"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>End Time</td>
|
||||
<td><input type="text" size="10" maxlength="26" name="endtime" value="" class="tcal"/></td>
|
||||
<td><input type="text" size="10" maxlength="26" name="endtime" value="" class="tcal" placeholder="YYYY-MM-DDTHH:MM:SS"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Start Before</td>
|
||||
<td><input type="text" size="10" maxlength="26" name="startbefore" value="" class="tcal"/></td>
|
||||
<td><input type="text" size="10" maxlength="26" name="startbefore" value="" class="tcal" placeholder="YYYY-MM-DDTHH:MM:SS"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Start After</td>
|
||||
<td><input type="text" size="10" maxlength="26" name="startafter" value="" class="tcal"/></td>
|
||||
<td><input type="text" size="10" maxlength="26" name="startafter" value="" class="tcal" placeholder="YYYY-MM-DDTHH:MM:SS"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>End Before</td>
|
||||
<td><input type="text" size="10" maxlength="26" name="endbefore" value="" class="tcal"/></td>
|
||||
<td><input type="text" size="10" maxlength="26" name="endbefore" value="" class="tcal" placeholder="YYYY-MM-DDTHH:MM:SS"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>End After</td>
|
||||
<td><input type="text" size="10" maxlength="26" name="endafter" value="" class="tcal"/></td>
|
||||
<td><input type="text" size="10" maxlength="26" name="endafter" value="" class="tcal" placeholder="YYYY-MM-DDTHH:MM:SS"/></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@ -143,7 +143,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Update After</td>
|
||||
<td><input type="text" size="10" maxlength="26" name="updateafter" value="" class="tcal" disabled="disabled" /></td>
|
||||
<td><input type="text" size="10" maxlength="26" name="updateafter" value="" class="tcal" placeholder="YYYY-MM-DDTHH:MM:SS" disabled="disabled" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Match Time Series</td>
|
||||
@ -184,4 +184,4 @@
|
||||
<p><a id="query-url" href=""></a></p>
|
||||
</fieldset>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
Reference in New Issue
Block a user