feat: add videodb media index with Docker stack
- Add videodb PHP/MySQL media collection manager (Blu-ray, DVD, CD) - Dockerfile: PHP 8.1 + Apache with GD/mysqli/exif extensions - docker-compose.yml: app on port 6761 + MySQL 8.0 with health checks - docker-entrypoint.sh: auto-generates config.inc.php from env vars, waits for MySQL, initializes DB schema idempotently - init-db.php: CLI schema installer using app's own prefix_query() logic - Persistent volumes for DB, cache, and cover images Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
160
videodb/templates/elegant/js/index.js
Normal file
160
videodb/templates/elegant/js/index.js
Normal file
@@ -0,0 +1,160 @@
|
||||
/**
|
||||
* Prototype javascript effects for filtering
|
||||
*
|
||||
* @package Templates
|
||||
* @author Andreas Goetz <cpuidle@gmx.de>
|
||||
* $Id: index.js,v 1.10 2009/03/26 11:17:21 andig2 Exp $
|
||||
*/
|
||||
|
||||
/**
|
||||
* Using global responder to manage indicator handling for multiple requests
|
||||
*/
|
||||
Ajax.Responders.register({
|
||||
onCreate: function() {
|
||||
if (Ajax.activeRequestCount > 0 && $('indicator1')) {
|
||||
$('indicator1').setStyle({display: 'inline'});
|
||||
}
|
||||
},
|
||||
|
||||
onComplete: function() {
|
||||
if(Ajax.activeRequestCount == 0 && $('indicator1')) {
|
||||
$('indicator1').setStyle({display: 'none'});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Clean pre-populated text from input controls
|
||||
*/
|
||||
function clearInput(id, term_to_clear)
|
||||
{
|
||||
el = $(id);
|
||||
if (el) {
|
||||
// Clear input if it matches default value
|
||||
if (el.value == term_to_clear) el.value = '';
|
||||
// If the value is blank, then put back term
|
||||
else if (el.value == '') el.value = term_to_clear;
|
||||
}
|
||||
}
|
||||
|
||||
Event.observe(document, 'dom:loaded', function()
|
||||
{
|
||||
/**
|
||||
* More/less columns
|
||||
*/
|
||||
function send_request(event, val) {
|
||||
$('columns_less').setAttribute('listcolumns', val);
|
||||
|
||||
new Ajax.Request('index.php', {
|
||||
parameters: {ajax_render: 1, listcolumns: val},
|
||||
|
||||
onSuccess: function(transport) {
|
||||
$('content').update(transport.responseText);
|
||||
}
|
||||
});
|
||||
|
||||
Event.stop(event);
|
||||
}
|
||||
|
||||
$('columns_less').observe('click', function(event) {
|
||||
var val = $('columns_less').getAttribute('listcolumns');
|
||||
val = (val > 1) ? val-1 : 1;
|
||||
|
||||
send_request(event, val);
|
||||
});
|
||||
|
||||
$('columns_more').observe('click', function(event) {
|
||||
var val = $('columns_less').getAttribute('listcolumns');
|
||||
val++;
|
||||
|
||||
send_request(event, val);
|
||||
});
|
||||
|
||||
/**
|
||||
* Render list contents and update item count
|
||||
*/
|
||||
function render_list(transport, json) {
|
||||
$('content').update(transport.responseText);
|
||||
$('count').update(json.totalresults);
|
||||
|
||||
// paged display
|
||||
if (json.maxpageno) {
|
||||
$('pageno').update(json.pageno);
|
||||
$('maxpageno').update(json.maxpageno);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters
|
||||
*/
|
||||
$('showtv').observe('click', function(event) {
|
||||
new Ajax.Request('index.php', {
|
||||
parameters: {ajax_render: 1, showtv: ($('showtv').checked) ? 1 : 0},
|
||||
onSuccess: render_list
|
||||
});
|
||||
});
|
||||
|
||||
// radio buttons
|
||||
$$('#filtersalphabet input[type="radio"]').invoke('observe', 'click', function(event) {
|
||||
new Ajax.Request('index.php', {
|
||||
parameters: {ajax_render: 1, filter: event.element().value},
|
||||
onSuccess: render_list
|
||||
});
|
||||
});
|
||||
/*
|
||||
// seen links
|
||||
$$('div.list_seen a').invoke('observe', 'click', function(event) {
|
||||
Event.stop(event);
|
||||
|
||||
$('filter'+event.element().readAttribute('filter')).click();
|
||||
});
|
||||
*/
|
||||
|
||||
/**
|
||||
* Owner selection
|
||||
*/
|
||||
$$('#owner').invoke('observe', 'change', function(event) {
|
||||
new Ajax.Request('index.php', {
|
||||
parameters: {ajax_render: 1, owner: $F('owner')},
|
||||
onSuccess: render_list
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Media selection
|
||||
*/
|
||||
$$('#mediafilter').invoke('observe', 'change', function(event) {
|
||||
new Ajax.Request('index.php', {
|
||||
parameters: {ajax_render: 1, mediafilter: $F('mediafilter')},
|
||||
onSuccess: render_list
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Order selection
|
||||
*/
|
||||
$$('#order').invoke('observe', 'change', function(event) {
|
||||
new Ajax.Request('index.php', {
|
||||
parameters: {ajax_render: 1, order: $F('order')},
|
||||
onSuccess: render_list
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Quicksearch
|
||||
*/
|
||||
$('quicksearch').focus();
|
||||
|
||||
new Ajax.Autocompleter("quicksearch", "item_choices", "index.php", {paramName: "ajax_quicksearch",
|
||||
minChars: 1, frequency: 0.2,
|
||||
afterUpdateElement: function(text, li) {
|
||||
document.location = 'show.php?id='+li.id;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Enable disabled controls
|
||||
*/
|
||||
// $$('.autoenable').invoke('writeAttribute', {disabled: false});
|
||||
// $('quicksearch').writeAttribute({disabled: false});
|
||||
});
|
||||
Reference in New Issue
Block a user