Porównaj commity

...

30 Commity

Autor SHA1 Wiadomość Data
Patrick Burns c71847c423
Merge 96ed12cd89 into 583c2ad191 2024-04-07 16:34:42 +02:00
Peter Goodhall 583c2ad191 Merge branch 'dev' of https://github.com/magicbug/Cloudlog into dev 2024-04-07 14:42:19 +01:00
Peter Goodhall c1c39c9021 [Custom Map] Increase map size 2024-04-07 14:42:13 +01:00
Peter Goodhall a09f1f13e2
Merge pull request #3061 from phl0/germanSstvLang
Add missing German translations for SSTV stuff
2024-04-07 14:26:08 +01:00
phl0 02aa35f06d
Add missing German translations for SSTV stuff 2024-04-07 08:46:35 +02:00
Peter Goodhall bb64d68be1 2.6.8 tag 2024-04-05 22:12:00 +01:00
Peter Goodhall 80276a071c
Merge pull request #3057 from phl0/fixWwffAwardInfoBox
Fix WWFF award info
2024-04-05 11:21:23 +01:00
phl0 aff522334a
Fix WWFF award info 2024-04-05 10:56:03 +02:00
Peter Goodhall 36f05bdef3
Merge pull request #3045 from patrickrb/1720-public-view-pagination-with-config-option
Visitor page pagination
2024-04-04 14:21:52 +01:00
Patrick Burns 83ad320e02 fix comment 2024-04-04 07:40:27 -05:00
Patrick Burns b0a7eef25e remove search_enabled config requirement 2024-04-04 07:39:00 -05:00
Peter Goodhall c3a2046d9f
Bug fix and refactor - QSL/SSTV carousels and management tabs 2024-04-04 13:17:18 +01:00
Peter Goodhall 121911c306
Merge pull request #3047 from patrickrb/SSTV-image-page
Feature - SSTV Image Page
2024-04-04 13:16:34 +01:00
Patrick Burns b5a7bc2847 refactored sstv and qsl carousels and javascript to be a little easier to read and reason about 2024-04-03 21:50:47 -05:00
Patrick Burns 96ed12cd89 Merge branch 'dev' into dockerize-for-development 2024-04-03 16:25:24 -05:00
Patrick Burns 9b6127c9ab remove storage functions from eqsl and use new helper instead 2024-04-02 17:01:17 -05:00
Patrick Burns e345364bfa added SSTV image page to the nav menu in the header 2024-04-02 16:55:00 -05:00
Patrick Burns eab8af8068 remove errant empty line addition 2024-04-02 10:15:25 -05:00
Patrick Burns c2c2b0f395 self reivew, simplify logic on checking if results is empty 2024-04-02 10:14:01 -05:00
Patrick Burns 6330d5df77 added pagination to visitor page only if the public search option is enabled 2024-04-02 09:51:10 -05:00
Patrick Burns 58d8705774 Merge branch 'dev' into dockerize-for-development 2024-04-01 20:49:33 -05:00
Patrick Burns 236e86f7a8 Merge branch 'dockerize-for-development' of github.com:patrickrb/Cloudlog into dockerize-for-development 2024-03-29 09:20:50 -05:00
Patrick Burns ab119a1f5d add a bit more details about the importance of docker-compose service names 2024-03-29 09:20:14 -05:00
Patrick Burns b9483d910e add a special note about the db service name in docker-compose 2024-03-29 09:18:25 -05:00
Patrick Burns b926cb68d4 updated sample to the correct defaults for docker-compose 2024-03-28 19:57:02 -05:00
Patrick Burns 5b2c04f6d5 pre-populate the install config inputs with the .env values if they exist 2024-03-28 17:49:59 -05:00
Patrick Burns 0d9924a49c bump php version to 7.4 to meet minimums 2024-03-28 17:43:43 -05:00
Patrick Burns 8e63c3a694 undo some errant changes to the readme 2024-03-28 17:31:55 -05:00
Patrick Burns 7345289b86 fix formatting issue in readme markdown 2024-03-28 17:26:42 -05:00
Patrick Burns 671e34157f dockerize the app so i can develop easier on my work machine 2024-03-28 17:22:55 -05:00
48 zmienionych plików z 596 dodań i 309 usunięć

6
.env.sample 100644
Wyświetl plik

@ -0,0 +1,6 @@
MYSQL_ROOT_PASSWORD=rootpassword
MYSQL_DATABASE=cloudlog
MYSQL_USER=cloudlog
MYSQL_PASSWORD=cloudlogpassword
MYSQL_HOST=db
MYSQL_PORT=3306

1
.gitignore vendored
Wyświetl plik

@ -18,3 +18,4 @@
sync.sh
*.p12
*.swp
.env

13
.vscode/settings.json vendored 100644
Wyświetl plik

@ -0,0 +1,13 @@
{
"cSpell.words": [
"callsign",
"cloudlog",
"hamradio",
"qslcard",
"sstv",
"sstvimages",
"sstvtable",
"SUBMODE",
"userdata"
]
}

29
Dockerfile 100644
Wyświetl plik

@ -0,0 +1,29 @@
# Use the official image for PHP and Apache
FROM php:7.4-apache
# Set the working directory to /var/www/html
WORKDIR /var/www/html
# Install system dependencies, including git and libxml2
RUN apt-get update && apt-get install -y \
libcurl4-openssl-dev \
libxml2-dev \
libzip-dev \
zlib1g-dev \
libpng-dev \
libonig-dev \
default-mysql-client \
curl \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install mysqli \
&& docker-php-ext-install gd \
&& docker-php-ext-install mbstring \
&& docker-php-ext-install zip \
&& docker-php-ext-install xml \
&& a2enmod rewrite
# Expose port 80
EXPOSE 80

Wyświetl plik

@ -11,24 +11,58 @@ Core Contributors: 2M0SQL ([@magicbug](https://github.com/magicbug)), LA8AJA ([@
Website: [http://www.cloudlog.co.uk](http://www.cloudlog.co.uk)
## Requirements
* Linux based Operating System
* Apache (Nginx should work)
* PHP Version 7.4 (PHP 8.2 works)
* MySQL (MySQL 5.7 or higher)
- Linux based Operating System
- Apache (Nginx should work)
- PHP Version 7.4 (PHP 8.2 works)
- MySQL (MySQL 5.7 or higher)
Notes
* If you want to log microwave QSOs you will need to use a 64bit operating system.
* We do not provide Docker support, however you are free to use it if you wish but we will not handle support.
- If you want to log microwave QSOs you will need to use a 64bit operating system.
- We do not provide Docker support, however you are free to use it if you wish but we will not handle support.
## Setup
Installation information can be found on the [wiki](https://github.com/magicbug/Cloudlog/wiki).
# Docker Development Environment
This guide provides instructions for setting up a local development environment using Docker and Docker Compose. Please note that this setup is not recommended for production use.
## Prerequisites
Before you begin, you need to install Docker and Docker Compose. You can download them using the following links:
- [Docker](https://docs.docker.com/get-docker/)
- [Docker Compose](https://docs.docker.com/compose/install/)
## Configuration
1. Copy the `.env.sample` file to `.env`:
```bash
cp .env.sample .env
```
2. Open the `.env` file and update the values to match your setup. The values from the `.env` file will be used to populate the database connection details on the install page. You should not need to change these unless your setup requires different values.
**Note:** Docker Compose creates a network for your application, and each service (container) in the Docker Compose file can reach each other via the service name. This is why the `DB_HOST` value in the `.env` file and on the install page should match the service name of the database in the `docker-compose.yml` file. For example, if the database service in `docker-compose.yml` is defined as `db`, then `DB_HOST` should be set as 'db'. This allows the application to communicate with the database service on its internal docker network.
## Starting the Development Environment
To start the development environment, run the following command in your terminal:
```bash
docker-compose up
```
## Support
Cloudlog has two support systems for code issues use Github issues, however if you have general issues with setting up your server please use our general discussion forum [https://github.com/magicbug/Cloudlog/discussions](https://github.com/magicbug/Cloudlog/discussions).
## Security Vulnerabilities
If you discover a security vulnerability within Cloudlog, please send an e-mail to Peter Goodhall, 2M0SQL via [peter@magicbug.co.uk](mailto:peter@magicbug.co.uk). All security vulnerabilities will be promptly addressed.
## Want Cloudlog Hosting?
@ -53,4 +87,4 @@ Cloudlog is supported by Patreon and donations via PayPal, thanks to the followi
Paul (M0TZO), Tim (G4VXE), Paul (N8HM), Michelle (W5NYV), Mitchell (AD0HJ), Dan (M0TCB), Martin (DK3ML), Juan Carlos (EA5WA), Iain (M0PCB), Charlie (GM1TGY), Ondrej (OK1CDJ), Trystan (G0KAY), Oliver (DL6KBG), Volkmar Schirmer, Jordan (M0PIR), Thomas Ziegler, Mathis (DB9MAT), Ken (VE3HLS), Tyler (WL7T), Jeremy Taylor, Ben Kuhn, Eric Thresher, Michael Cullen, Juuso (OH1JW), Anthony Castiglia, Fernando Ramirez-Ferrer, Robert Dixon, Mark Percival, Julia (KV1V), Timo Tomasini, Ant (NU1U), Christopher Williams, Danny Barnes, Vic, Tom (M0LTE), smurphboy, Lars (SM0TGU), Theo (PD9DP), Stefan (SM0RGM). Peter (G0ABI), Lou (KI5FTY), Michael (DG3NAB), Dragan (4O4A), minorsecond, Emily (W7AYQ), Steve (M0SKM), Rob (M0VFC), Doug (WA6L), Petr (OK1PKR), Fabian (HB9HIL), Daniel (OK2VLK), John (M5JFS).
If you'd like to donate to Cloudlog to help allow @magicbug spend less time doing commercial work and more time coding Cloudlog then you can donate via [PayPal](https://paypal.me/PGoodhall), [Github Sponsor](https://github.com/sponsors/magicbug) or become a [Patreon](https://www.patreon.com/2m0sql)
If you'd like to donate to Cloudlog to help allow @magicbug spend less time doing commercial work and more time coding Cloudlog then you can donate via [PayPal](https://paypal.me/PGoodhall), [Github Sponsor](https://github.com/sponsors/magicbug) or become a [Patreon](https://www.patreon.com/2m0sql)

Wyświetl plik

@ -22,7 +22,7 @@ $config['migration_enabled'] = TRUE;
|
*/
$config['migration_version'] = 175;
$config['migration_version'] = 176;
/*
|--------------------------------------------------------------------------

Wyświetl plik

@ -12,8 +12,9 @@ class eqsl extends CI_Controller {
public function index() {
$this->lang->load('qslcard');
$this->load->helper('storage');
$folder_name = "images/eqsl_card_images";
$data['storage_used'] = $this->sizeFormat($this->folderSize($folder_name));
$data['storage_used'] = sizeFormat(folderSize($folder_name));
// Render Page
@ -749,49 +750,4 @@ class eqsl extends CI_Controller {
$status = $this->uploadQso($adif, $qsl);
}
}
// Functions for storage, these need shifted to a libary to use across Cloudlog
function folderSize($dir){
$count_size = 0;
$count = 0;
$dir_array = scandir($dir);
foreach($dir_array as $key=>$filename){
if($filename!=".." && $filename!="."){
if(is_dir($dir."/".$filename)){
$new_foldersize = $this->foldersize($dir."/".$filename);
$count_size = $count_size+ $new_foldersize;
}else if(is_file($dir."/".$filename)){
$count_size = $count_size + filesize($dir."/".$filename);
$count++;
}
}
}
return $count_size;
}
function sizeFormat($bytes){
$kb = 1024;
$mb = $kb * 1024;
$gb = $mb * 1024;
$tb = $gb * 1024;
if (($bytes >= 0) && ($bytes < $kb)) {
return $bytes . ' B';
} elseif (($bytes >= $kb) && ($bytes < $mb)) {
return ceil($bytes / $kb) . ' KB';
} elseif (($bytes >= $mb) && ($bytes < $gb)) {
return ceil($bytes / $mb) . ' MB';
} elseif (($bytes >= $gb) && ($bytes < $tb)) {
return ceil($bytes / $gb) . ' GB';
} elseif ($bytes >= $tb) {
return ceil($bytes / $tb) . ' TB';
} else {
return $bytes . ' B';
}
}
} // end class

Wyświetl plik

@ -15,7 +15,7 @@ class Qsl extends CI_Controller {
// Default view when loading controller.
public function index() {
$this->load->helper('storage'); // Load the storage helper
$folder_name = "assets/qslcard";
$data['storage_used'] = sizeFormat(folderSize($folder_name));
@ -181,48 +181,4 @@ class Qsl extends CI_Controller {
$this->load->view('qslcard/qslcarousel', $data);
}
}
// Functions for storage, these need shifted to a libary to use across Cloudlog
function folderSize($dir){
$count_size = 0;
$count = 0;
$dir_array = scandir($dir);
foreach($dir_array as $key=>$filename){
if($filename!=".." && $filename!="."){
if(is_dir($dir."/".$filename)){
$new_foldersize = foldersize($dir."/".$filename);
$count_size = $count_size+ $new_foldersize;
}else if(is_file($dir."/".$filename)){
$count_size = $count_size + filesize($dir."/".$filename);
$count++;
}
}
}
return $count_size;
}
function sizeFormat($bytes){
$kb = 1024;
$mb = $kb * 1024;
$gb = $mb * 1024;
$tb = $gb * 1024;
if (($bytes >= 0) && ($bytes < $kb)) {
return $bytes . ' B';
} elseif (($bytes >= $kb) && ($bytes < $mb)) {
return ceil($bytes / $kb) . ' KB';
} elseif (($bytes >= $mb) && ($bytes < $gb)) {
return ceil($bytes / $mb) . ' MB';
} elseif (($bytes >= $gb) && ($bytes < $tb)) {
return ceil($bytes / $gb) . ' GB';
} elseif ($bytes >= $tb) {
return ceil($bytes / $tb) . ' TB';
} else {
return $bytes . ' B';
}
}
}

Wyświetl plik

@ -8,11 +8,27 @@ class Sstv extends CI_Controller {
function __construct() {
parent::__construct();
$this->lang->load('qslcard');
$this->lang->load('sstv');
$this->load->model('user_model');
if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); }
}
public function index() {
$this->load->helper('storage');
$folder_name = "assets/sstvimages";
$data['storage_used'] = sizeFormat(folderSize($folder_name));
// Render Page
$data['page_title'] = "SSTV Images";
$this->load->model('sstv_model');
$data['sstvArray'] = $this->sstv_model->getQsoWithSstvImageList();
$this->load->view('interface_assets/header', $data);
$this->load->view('sstv/index');
$this->load->view('interface_assets/footer');
}
public function uploadSSTV() {
$this->load->model('user_model');
if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); }

Wyświetl plik

@ -75,6 +75,37 @@ class Visitor extends CI_Controller {
$this->load->model('logbook_model');
// load config and init pagination
$this->load->library('pagination');
//Pagination config
$config['base_url'] = base_url().'index.php/visitor/'. $public_slug . '/index';
$config['total_rows'] = $this->logbook_model->total_qsos($logbooks_locations_array);
$config['per_page'] = '25';
$config['num_links'] = $this->logbook_model->total_qsos($logbooks_locations_array) / 25;
$config['full_tag_open'] = '<ul class="pagination">';
$config['full_tag_close'] = '</ul>';
$config['attributes'] = ['class' => 'page-link'];
$config['first_link'] = false;
$config['last_link'] = false;
$config['first_tag_open'] = '<li class="page-item">';
$config['first_tag_close'] = '</li>';
$config['prev_link'] = '&laquo';
$config['prev_tag_open'] = '<li class="page-item">';
$config['prev_tag_close'] = '</li>';
$config['next_link'] = '&raquo';
$config['next_tag_open'] = '<li class="page-item">';
$config['next_tag_close'] = '</li>';
$config['last_tag_open'] = '<li class="page-item">';
$config['last_tag_close'] = '</li>';
$config['cur_tag_open'] = '<li class="page-item active"><a href="#" class="page-link">';
$config['cur_tag_close'] = '<span class="visually-hidden">(current)</span></a></li>';
$config['num_tag_open'] = '<li class="page-item">';
$config['num_tag_close'] = '</li>';
$this->pagination->initialize($config);
// Public visitor so no QRA to setup
$data['qra'] = "none";
@ -107,8 +138,9 @@ class Visitor extends CI_Controller {
$data['total_lotw_sent'] = $QSLStatsBreakdownArray['LoTW_Sent'];
$data['total_lotw_rcvd'] = $QSLStatsBreakdownArray['LoTW_Received'];
$data['last_five_qsos'] = $this->logbook_model->get_last_qsos('18', $logbooks_locations_array);
// Show paginated results
$data['results'] = $this->logbook_model->get_qsos($config['per_page'], $this->uri->segment(4), $logbooks_locations_array);
$data['page_title'] = "Dashboard";
$data['slug'] = $public_slug;

Wyświetl plik

@ -0,0 +1,44 @@
<?php
if (!function_exists('folderSize')) {
function folderSize($dir){
$count_size = 0;
$count = 0;
$dir_array = scandir($dir);
foreach($dir_array as $key=>$filename){
if($filename!=".." && $filename!="."){
if(is_dir($dir."/".$filename)){
$new_foldersize = folderSize($dir."/".$filename);
$count_size = $count_size+ $new_foldersize;
}else if(is_file($dir."/".$filename)){
$count_size = $count_size + filesize($dir."/".$filename);
$count++;
}
}
}
return $count_size;
}
}
if (!function_exists('sizeFormat')) {
function sizeFormat($bytes){
$kb = 1024;
$mb = $kb * 1024;
$gb = $mb * 1024;
$tb = $gb * 1024;
if (($bytes >= 0) && ($bytes < $kb)) {
return $bytes . ' B';
} elseif (($bytes >= $kb) && ($bytes < $mb)) {
return ceil($bytes / $kb) . ' KB';
} elseif (($bytes >= $mb) && ($bytes < $gb)) {
return ceil($bytes / $mb) . ' MB';
} elseif (($bytes >= $gb) && ($bytes < $tb)) {
return ceil($bytes / $gb) . ' GB';
} elseif ($bytes >= $tb) {
return ceil($bytes / $tb) . ' TB';
} else {
return $bytes . ' B';
}
}
}

Wyświetl plik

@ -17,6 +17,7 @@ $lang['menu_post_contest_logging'] = 'Post Contest Logging';
$lang['menu_bandmap'] = 'Bandmap';
$lang['menu_view_qsl'] = 'View QSL Cards';
$lang['menu_view_eqsl'] = 'View eQSL Cards';
$lang['menu_view_sstv'] = 'View SSTV Images';
$lang['menu_notes'] = 'Notes';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -17,6 +17,7 @@ $lang['menu_post_contest_logging'] = 'Post Contest Logging';
$lang['menu_bandmap'] = 'Bandmap';
$lang['menu_view_qsl'] = 'View QSL Cards';
$lang['menu_view_eqsl'] = 'View eQSL Cards';
$lang['menu_view_sstv'] = 'View SSTV Images';
$lang['menu_notes'] = 'Notes';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -17,6 +17,7 @@ $lang['menu_post_contest_logging'] = 'Post Contest Logging';
$lang['menu_bandmap'] = 'Bandmap';
$lang['menu_view_qsl'] = 'View QSL Cards';
$lang['menu_view_eqsl'] = 'View eQSL Cards';
$lang['menu_view_sstv'] = 'View SSTV Images';
$lang['menu_notes'] = 'Notes';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -17,6 +17,7 @@ $lang['menu_post_contest_logging'] = 'Post Contest Logging';
$lang['menu_bandmap'] = 'Bandmap';
$lang['menu_view_qsl'] = 'View QSL Cards';
$lang['menu_view_eqsl'] = 'View eQSL Cards';
$lang['menu_view_sstv'] = 'View SSTV Images';
$lang['menu_notes'] = 'Notes';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -74,6 +74,10 @@ $lang['general_word_invalid_ignore'] = 'Ungültig (Ignorieren)';
$lang['general_word_qslcard'] = 'QSL Karte';
$lang['general_word_qslcard_management'] = 'QSL Verwaltung';
$lang['general_word_qslcards'] = 'QSL Karten';
$lang['general_word_sstv_management'] = 'SSTV Management';
$lang['general_word_sstvimages'] = 'SSTV Bilder';
$lang['general_sstv_upload'] = 'Hochgeladene SSTV Bilder';
$lang['general_sstv_upload_button'] = 'Lade SSTV Bild(er) hoch';
$lang['general_word_qslcard_direct'] = 'Direkt';
$lang['general_word_qslcard_bureau'] = 'Büro';
$lang['general_word_qslcard_electronic'] = 'Elektronisch';

Wyświetl plik

@ -17,6 +17,7 @@ $lang['menu_post_contest_logging'] = 'Zeitversetztes Contest Logging';
$lang['menu_bandmap'] = 'Bandmap';
$lang['menu_view_qsl'] = 'QSL Ansicht';
$lang['menu_view_eqsl'] = 'eQSL Ansicht';
$lang['menu_view_sstv'] = 'SSTV Bilder';
$lang['menu_notes'] = 'Notizen';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'an Speicherplatz, um SSTV-Bilder zu speichern';

Wyświetl plik

@ -17,6 +17,7 @@ $lang['menu_post_contest_logging'] = 'Post Contest Logging';
$lang['menu_bandmap'] = 'Bandmap';
$lang['menu_view_qsl'] = 'View QSL Cards';
$lang['menu_view_eqsl'] = 'View eQSL Cards';
$lang['menu_view_sstv'] = 'View SSTV Images';
$lang['menu_notes'] = 'Notes';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -17,6 +17,7 @@ $lang['menu_post_contest_logging'] = 'Post Contest Logging';
$lang['menu_bandmap'] = 'Bandmap';
$lang['menu_view_qsl'] = 'View QSL Cards';
$lang['menu_view_eqsl'] = 'View eQSL Cards';
$lang['menu_view_sstv'] = 'View SSTV Images';
$lang['menu_notes'] = 'Notes';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -17,6 +17,7 @@ $lang['menu_post_contest_logging'] = 'Post Contest Logging';
$lang['menu_bandmap'] = 'Bandmap';
$lang['menu_view_qsl'] = 'View QSL Cards';
$lang['menu_view_eqsl'] = 'View eQSL Cards';
$lang['menu_view_sstv'] = 'View SSTV Images';
$lang['menu_notes'] = 'Notes';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -17,6 +17,7 @@ $lang['menu_post_contest_logging'] = 'Post Contest Logging';
$lang['menu_bandmap'] = 'Bandmap';
$lang['menu_view_qsl'] = 'View QSL Cards';
$lang['menu_view_eqsl'] = 'View eQSL Cards';
$lang['menu_view_sstv'] = 'View SSTV Images';
$lang['menu_notes'] = 'Notes';

Wyświetl plik

@ -0,0 +1,5 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$lang['sstv_string_disk_space'] = 'of disk space to store SSTV image assets';

Wyświetl plik

@ -0,0 +1,30 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
* Tag Cloudlog as 2.6.8
*/
class Migration_tag_2_6_8 extends CI_Migration {
public function up()
{
// Tag Cloudlog 2.6.3
$this->db->where('option_name', 'version');
$this->db->update('options', array('option_value' => '2.6.8'));
// Trigger Version Info Dialog
$this->db->where('option_type', 'version_dialog');
$this->db->where('option_name', 'confirmed');
$this->db->update('user_options', array('option_value' => 'false'));
}
public function down()
{
$this->db->where('option_name', 'version');
$this->db->update('options', array('option_value' => '2.6.7'));
}
}

Wyświetl plik

@ -88,4 +88,23 @@ class Sstv_model extends CI_Model
return $this->db->get()->result();
}
function getQsoWithSstvImageList()
{
$CI = &get_instance();
$CI->load->model('logbooks_model');
$logbooks_locations_array = $CI->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook'));
if (is_array($logbooks_locations_array) && !empty($logbooks_locations_array)) {
$this->db->select('*');
$this->db->from($this->config->item('table_name'));
$this->db->join('sstv_images', 'sstv_images.qsoid = ' . $this->config->item('table_name') . '.col_primary_key');
$this->db->where_in('station_id', $logbooks_locations_array);
$this->db->order_by("id", "desc");
return $this->db->get();
} else {
return false;
}
}
}

Wyświetl plik

@ -4,10 +4,10 @@
<div id="awardInfoButton">
<script>
var lang_awards_info_button = "<?php echo lang('awards_info_button'); ?>";
var lang_award_info_ln1 = "<?php echo lang('awards_dok_description_ln1'); ?>";
var lang_award_info_ln2 = "<?php echo lang('awards_dok_description_ln2'); ?>";
var lang_award_info_ln3 = "<?php echo lang('awards_dok_description_ln3'); ?>";
var lang_award_info_ln4 = "<?php echo lang('awards_dok_description_ln4'); ?>";
var lang_award_info_ln1 = "<?php echo lang('awards_wwff_description_ln1'); ?>";
var lang_award_info_ln2 = "<?php echo lang('awards_wwff_description_ln2'); ?>";
var lang_award_info_ln3 = "<?php echo lang('awards_wwff_description_ln3'); ?>";
var lang_award_info_ln4 = "<?php echo lang('awards_wwff_description_ln4'); ?>";
</script>
<h2><?php echo $page_title; ?></h2>
<button type="button" class="btn btn-sm btn-primary me-1" id="displayAwardInfo"><?php echo lang('awards_info_button'); ?></button>

Wyświetl plik

@ -2474,10 +2474,10 @@ if ($this->session->userdata('user_id') != null) {
<script>
function viewQsl(picture, callsign) {
var baseURL = "<?php echo base_url(); ?>";
var $textAndPic = $('<div></div>');
$textAndPic.append('<center><img class="img-fluid w-qsl" style="height:auto;width:auto;"src="' + baseURL + '/assets/qslcard/' + picture + '" /><center>');
var title = '';
let title = '';
const baseURL = "<?php echo base_url(); ?>";
const textAndPic = $('<div></div>').append('<center><img class="img-fluid w-qsl" style="height:auto;width:auto;"src="' + baseURL + '/assets/qslcard/' + picture + '" /><center>');
if (callsign == null) {
title = 'QSL Card';
} else {
@ -2487,7 +2487,7 @@ if ($this->session->userdata('user_id') != null) {
BootstrapDialog.show({
title: title,
size: BootstrapDialog.SIZE_WIDE,
message: $textAndPic,
message: textAndPic,
buttons: [{
label: lang_admin_close,
action: function(dialogRef) {
@ -2499,6 +2499,7 @@ if ($this->session->userdata('user_id') != null) {
</script>
<script>
function deleteQsl(id) {
const baseURL = "<?php echo base_url(); ?>";
BootstrapDialog.confirm({
title: 'DANGER',
message: 'Warning! Are you sure you want to delete this QSL card?',
@ -2508,7 +2509,6 @@ if ($this->session->userdata('user_id') != null) {
btnOKClass: 'btn-danger',
callback: function(result) {
if (result) {
var baseURL = "<?php echo base_url(); ?>";
$.ajax({
url: baseURL + 'index.php/qsl/delete',
type: 'post',
@ -2535,18 +2535,16 @@ if ($this->session->userdata('user_id') != null) {
});
}
</script>
<script>
function viewSstv(picture) {
var baseURL = "<?php echo base_url(); ?>";
var $textAndPic = $('<div></div>');
$textAndPic.append('<center><img class="img-fluid w-qsl" style="height:auto;width:auto;"src="' + baseURL + '/assets/sstvimages/' + picture + '" /><center>');
title = 'SSTV Image';
const title = 'SSTV Image';
const baseURL = "<?php echo base_url(); ?>";
const textAndPic = $('<div></div>').append(`<center><img class="img-fluid w-qsl" style="height:auto;width:auto;"src="${baseURL}/assets/sstvimages/${picture}" /><center>`);
BootstrapDialog.show({
title: title,
size: BootstrapDialog.SIZE_WIDE,
message: $textAndPic,
message: textAndPic,
buttons: [{
label: lang_admin_close,
action: function(dialogRef) {
@ -2555,9 +2553,9 @@ if ($this->session->userdata('user_id') != null) {
}]
});
}
</script>
<script>
function deleteSstv(id) {
const baseURL = "<?php echo base_url(); ?>";
BootstrapDialog.confirm({
title: 'DANGER',
message: 'Warning! Are you sure you want to delete this SSTV Image?',
@ -2567,7 +2565,6 @@ if ($this->session->userdata('user_id') != null) {
btnOKClass: 'btn-danger',
callback: function(result) {
if (result) {
var baseURL = "<?php echo base_url(); ?>";
$.ajax({
url: baseURL + 'index.php/sstv/delete',
type: 'post',
@ -2747,9 +2744,53 @@ if ($this->session->userdata('user_id') != null) {
}
});
}
function createTable(title, type) {
const tableClass = type === 'sstv' ? 'sstvtable' : 'qsltable';
return `<table style="width:100%" class="${tableClass} table table-sm table-bordered table-hover table-striped table-condensed">` +
'<thead>' +
'<tr>' +
'<th style="text-align: center">' + title + '</th>' +
'<th style="text-align: center"></th>' +
'<th style="text-align: center"></th>' +
'</tr>' +
'</thead>' +
'<tbody></tbody>' +
'</table>'
}
function createTableRow(image, type){
const viewFunction = type === 'sstv' ? 'viewSstv' : 'viewQsl';
const deleteFunction = type === 'sstv' ? 'deleteSstv' : 'deleteQsl';
return '<tr><td style="text-align: center">' + image.filename + '</td>' +
`<td id="${image.insertid}" style="text-align: center"><button onclick="${deleteFunction}(${image.insertid});" class="btn btn-sm btn-danger">Delete</button></td>` +
`<td style="text-align: center"><button onclick="${viewFunction}('${image.filename}')" class="btn btn-sm btn-success">View</button></td>` +
'</tr>'
}
function handleSSTVImageUpload(sstvImage){
const baseURL = "<?php echo base_url(); ?>";
const numCarouselItems = $('#sstv-carousel-indicators li').length;
// Next, append card to the table
$('.sstvtable').length === 0 ? $("#sstvupload").prepend(createTable("SSTV image file", "sstv")) : null;
$('.sstvtable tbody:last').append(createTableRow(sstvImage, "sstv"));
// Append card to the carousel
const newCarouselItem = '<div class="' + (numCarouselItems === 0 ? 'active ' : '') + 'carousel-item carouselimageid_' + sstvImage.insertid +'"><img class="img-fluid w-qsl" src="' + baseURL + '/assets/sstvimages/' + sstvImage.filename + '" alt="QSL picture"></div>';
$("#sstv-carousel-inner").append(newCarouselItem);
// Append new carousel indicator
const newCarouselIndicator = '<li class="' + (numCarouselItems === 0 ? 'active ' : '') + '" data-bs-target="#sstvCarouselIndicators" data-bs-slide-to="' + numCarouselItems + '"></li>';
$("#sstv-carousel-indicators").append(newCarouselIndicator);
// Initialize the bootstrap carousel
$("#sstvCarouselIndicators").carousel();
}
function uploadSSTV() {
var baseURL = "<?php echo base_url(); ?>";
var formdata = new FormData(document.getElementById("sstvinfo"));
const baseURL = "<?php echo base_url(); ?>";
const formdata = new FormData(document.getElementById("sstvinfo"));
$.ajax({
url: baseURL + 'index.php/sstv/uploadsstv',
@ -2759,67 +2800,49 @@ if ($this->session->userdata('user_id') != null) {
processData: false,
contentType: false,
success: function(data) {
// Iterate over each SSTV image and handle it
data.forEach((sstvImage) => {
if (sstvImage.status == 'Success') {
// Check if the table exists, if it does we'll update it, if not, we'll create it
if ($('.sstvtable').length > 0) {
// Update table on Manage SSTV Image tab
$('.sstvtable tr:last').after('<tr><td style="text-align: center">' + sstvImage.filename + '</td>' +
'<td id="' + sstvImage.insertid + '"style="text-align: center"><button onclick="deleteSstv(' + sstvImage.insertid + ');" class="btn btn-sm btn-danger">Delete</button></td>' +
'<td style="text-align: center"><button onclick="viewSstv(\'' + sstvImage.filename + '\')" class="btn btn-sm btn-success">View</button></td>' +
'</tr>');
// Update SSTV Image carousel
var quantity = $("#sstv-carousel-indicators").length;
$("#sstvCarouselIndicators .sstv-carousel-indicators").append('<li data-bs-target="#sstvCarouselIndicators" data-bs-slide-to="' + quantity + '"></li>');
$("#sstvCarouselIndicators .carousel-inner").append('<center><div class="carousel-item carouselimageid_' + sstvImage.insertid + '"><img class="img-fluid w-qsl" src="' + baseURL + '/assets/sstvimages/' + sstvImage.filename + '" alt="SSTV picture #' + (quantity + 1) + '"></div></center>');
// Initialize the bootstrap image carousel
$("#sstvCarouselIndicators").carousel();
// Reset the image input
$("#sstvimages").val(null);
} else {
// Create table on Manage SSTV Image tab
$("#sstvupload").prepend('<table style="width:100%" class="sstvtable table table-sm table-bordered table-hover table-striped table-condensed">' +
'<thead>' +
'<tr>' +
'<th style="text-align: center">SSTV image file</th>' +
'<th style="text-align: center"></th>' +
'<th style="text-align: center"></th>' +
'</tr>' +
'</thead><tbody>' +
'<tr><td style="text-align: center">' + sstvImage.filename + '</td>' +
'<td id="' + sstvImage.insertid + '"style="text-align: center"><button onclick="deleteSstv(' + sstvImage.insertid + ');" class="btn btn-sm btn-danger">Delete</button></td>' +
'<td style="text-align: center"><button onclick="viewSstv(\'' + sstvImage.filename + '\')" class="btn btn-sm btn-success">View</button></td>' +
'</tr>' +
'</tbody></table>');
// Make the SSTV image tab visible by remvoving the hidden attribute
if (sstvImage.status == 'Success') {
// Show the SSTV image tab
$('.sstvimagetab').removeAttr('hidden');
// Create SSTV Image carousel
var quantity = $("#sstv-carousel-indicators").length;
$("#sstv-carousel-indicators").append('<li class="active" data-bs-target="#sstvCarouselIndicators" data-bs-slide-to="' + quantity + '" />');
$("#sstv-carousel-inner").append('<center><div class="active carousel-item carouselimageid_' + sstvImage.insertid + '"><img class="img-fluid w-qsl" src="' + baseURL + '/assets/sstvimages/' + sstvImage.filename + '" alt="SSTV picture #' + (quantity + 1) + '"></div></center>');
// Initialize the bootstrap carousel
$("#sstvCarouselIndicators").carousel();
// Handle the SSTV image upload
handleSSTVImageUpload(sstvImage);
} else if (sstvImage.status != '') {
$("#sstvupload").append('<div class="alert alert-danger">SSTV image:' +
sstvImage.error +
'</div>');
}
} else if (sstvImage.status != '') {
$("#sstvupload").append('<div class="alert alert-danger">SSTV Image:' +
sstvImage.error +
'</div>');
}
// Reset the image inputs
$("#sstvimages").val(null);
})
}
});
}
function handleQslCardUpload(qslCard) {
const baseURL = "<?php echo base_url(); ?>";
const numCarouselItems = $('#qsl-carousel-indicators li').length;
// append card to the qsl management table
$('.qsltable').length === 0 ? $("#qslupload").prepend(createTable("QSL image file", "qsl")) : null;
$('.qsltable tbody:last').append(createTableRow(qslCard, "qsl"));
// Append card image to the carousel
const newCarouselItem = '<div class="' + (numCarouselItems === 0 ? 'active ' : '') + 'carousel-item carouselimageid_' + qslCard.insertid +'"><img class="img-fluid w-qsl" src="' + baseURL + '/assets/qslcard/' + qslCard.filename + '" alt="QSL picture"></div>';
$("#qsl-carousel-inner").append(newCarouselItem);
// Append carousel indicator for the new card
const newCarouselIndicator = '<li class="' + (numCarouselItems === 0 ? 'active ' : '') + '" data-bs-target="#qslCarouselIndicators" data-bs-slide-to="' + numCarouselItems + '"></li>';
$("#qsl-carousel-indicators").append(newCarouselIndicator);
// Initialize the bootstrap carousel
$("#qslCarouselIndicators").carousel();
}
function uploadQsl() {
var baseURL = "<?php echo base_url(); ?>";
var formdata = new FormData(document.getElementById("fileinfo"));
const baseURL = "<?php echo base_url(); ?>";
const formdata = new FormData(document.getElementById("fileinfo"));
$.ajax({
url: baseURL + 'index.php/qsl/uploadqsl',
@ -2829,80 +2852,29 @@ if ($this->session->userdata('user_id') != null) {
processData: false,
contentType: false,
success: function(data) {
const qslCard = data.status || {}
if (data.status.front.status == 'Success') {
if ($('.qsltable').length > 0) {
$('.qsltable tr:last').after('<tr><td style="text-align: center">' + data.status.front.filename + '</td>' +
'<td id="' + data.status.front.insertid + '"style="text-align: center"><button onclick="deleteQsl(' + data.status.front.insertid + ');" class="btn btn-sm btn-danger">Delete</button></td>' +
'<td style="text-align: center"><button onclick="viewQsl(\'' + data.status.front.filename + '\')" class="btn btn-sm btn-success">View</button></td>' +
'</tr>');
var quantity = $(".carousel-indicators li").length;
$(".carousel-indicators").append('<li data-bs-target="#carouselExampleIndicators" data-bs-slide-to="' + quantity + '"></li>');
$(".carousel-inner").append('<center><div class="carousel-item carouselimageid_' + data.status.front.insertid + '"><img class="img-fluid w-qsl" src="' + baseURL + '/assets/qslcard/' + data.status.front.filename + '" alt="QSL picture #' + (quantity + 1) + '"></div></center>');
$("#qslcardfront").val(null);
} else {
$("#qslupload").prepend('<table style="width:100%" class="qsltable table table-sm table-bordered table-hover table-striped table-condensed">' +
'<thead>' +
'<tr>' +
'<th style="text-align: center">QSL image file</th>' +
'<th style="text-align: center"></th>' +
'<th style="text-align: center"></th>' +
'</tr>' +
'</thead><tbody>' +
'<tr><td style="text-align: center">' + data.status.front.filename + '</td>' +
'<td id="' + data.status.front.insertid + '"style="text-align: center"><button onclick="deleteQsl(' + data.status.front.insertid + ');" class="btn btn-sm btn-danger">Delete</button></td>' +
'<td style="text-align: center"><button onclick="viewQsl(\'' + data.status.front.filename + '\')" class="btn btn-sm btn-success">View</button></td>' +
'</tr>' +
'</tbody></table>');
$('.qslcardtab').removeAttr('hidden');
var quantity = $(".carousel-indicators li").length;
$(".carousel-indicators").append('<li class="active" data-bs-target="#carouselExampleIndicators" data-bs-slide-to="' + quantity + '"></li>');
$(".carousel-inner").append('<center><div class="active carousel-item carouselimageid_' + data.status.front.insertid + '"><img class="img-fluid w-qsl" src="' + baseURL + '/assets/qslcard/' + data.status.front.filename + '" alt="QSL picture #' + (quantity + 1) + '"></div></center>');
$(".carouselExampleIndicators").carousel();
$("#qslcardfront").val(null);
}
} else if (data.status.front.status != '') {
handleQslCardUpload(qslCard.front);
} else if (qslCard.front.status != '') {
$("#qslupload").append('<div class="alert alert-danger">Front QSL Card:' +
data.status.front.error +
qslCard.front.error +
'</div>');
}
if (data.status.back.status == 'Success') {
var qsoid = $("#qsoid").text();
if ($('.qsltable').length > 0) {
$('.qsltable tr:last').after('<tr><td style="text-align: center">' + data.status.back.filename + '</td>' +
'<td id="' + data.status.back.insertid + '"style="text-align: center"><button onclick="deleteQsl(' + data.status.back.insertid + ');" class="btn btn-sm btn-danger">Delete</button></td>' +
'<td style="text-align: center"><button onclick="viewQsl(\'' + data.status.back.filename + '\')" class="btn btn-sm btn-success">View</button></td>' +
'</tr>');
var quantity = $(".carousel-indicators li").length;
$(".carousel-indicators").append('<li data-bs-target="#carouselExampleIndicators" data-bs-slide-to="' + quantity + '"></li>');
$(".carousel-inner").append('<center><div class="carousel-item carouselimageid_' + data.status.back.insertid + '"><img class="img-fluid w-qsl" src="' + baseURL + '/assets/qslcard/' + data.status.back.filename + '" alt="QSL picture #' + (quantity + 1) + '"></div></center>');
$("#qslcardback").val(null);
} else {
$("#qslupload").prepend('<table style="width:100%" class="qsltable table table-sm table-bordered table-hover table-striped table-condensed">' +
'<thead>' +
'<tr>' +
'<th style="text-align: center">QSL image file</th>' +
'<th style="text-align: center"></th>' +
'<th style="text-align: center"></th>' +
'</tr>' +
'</thead><tbody>' +
'<tr><td style="text-align: center">' + data.status.back.filename + '</td>' +
'<td id="' + data.status.back.insertid + '"style="text-align: center"><button onclick="deleteQsl(' + data.status.back.insertid + ');" class="btn btn-sm btn-danger">Delete</button></td>' +
'<td><button onclick="viewQsl(\'' + data.status.back.filename + '\')" class="btn btn-sm btn-success">View</button></td>' +
'</tr>' +
'</tbody></table>');
$('.qslcardtab').removeAttr('hidden');
var quantity = $(".carousel-indicators li").length;
$(".carousel-indicators").append('<li class="active" data-bs-target="#carouselExampleIndicators" data-bs-slide-to="' + quantity + '"></li>');
$(".carousel-inner").append('<center><div class="active carousel-item carouselimageid_' + data.status.back.insertid + '"><img class="img-fluid w-qsl" src="' + baseURL + '/assets/qslcard/' + data.status.back.filename + '" alt="QSL picture #' + (quantity + 1) + '"></div></center>');
$(".carouselExampleIndicators").carousel();
$("#qslcardback").val(null);
}
} else if (data.status.back.status != '') {
if (qslCard.back.status == 'Success') {
handleQslCardUpload(qslCard.back);
} else if (qslCard.back.status != '') {
$("#qslupload").append('<div class="alert alert-danger">\nBack QSL Card: ' +
data.status.back.error +
qslCard.back.error +
'</div>');
}
// Show the QSL card tab
$('.qslcardtab').removeAttr('hidden');
// Reset the image inputs
$("#qslcardfront").val(null);
$("#qslcardback").val(null);
}
});
}

Wyświetl plik

@ -83,6 +83,8 @@
<a class="dropdown-item" href="<?php echo site_url('qsl'); ?>" title="QSL"><i class="fa fa-id-card"></i> <?php echo lang('menu_view_qsl'); ?></a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="<?php echo site_url('eqsl'); ?>" title="eQSL"><i class="fa fa-id-card"></i> <?php echo lang('menu_view_eqsl'); ?></a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="<?php echo site_url('sstv'); ?>" title="SSTV"><i class="fa fa-image"></i> <?php echo lang('menu_view_sstv'); ?></a>
</div>
</li>

Wyświetl plik

@ -94,6 +94,6 @@
</div>
<!-- Map -->
<div id="custommap" class="map-leaflet mt-2" style="width: 100%; height: calc(100vh - 390px); max-height: 900px;"></div>
<div id="custommap" class="map-leaflet mt-2" style="width: 100%; height: 1000px;"></div>
<div class="alert alert-success" role="alert">Showing QSOs for Custom Date for Active Logbook <?php echo $logbook_name ?></div>

Wyświetl plik

@ -1,42 +1,37 @@
<div id="carouselExampleIndicators" class="carousel slide" data-bs-ride="carousel">
<?php if (count($qslimages) > 1) { ?>
<ol class="carousel-indicators">
<?php
$i = 0;
foreach ($qslimages as $image) {
echo '<li data-bs-target="#carouselExampleIndicators" data-bs-slide-to="' . $i . '"';
if ($i == 0) {
echo 'class="active"';
<div id="qslCarouselIndicators" class="carousel slide" data-bs-ride="carousel">
<ol class="carousel-indicators" id="qsl-carousel-indicators">
<?php
$i = 0;
foreach ($qslimages as $image) {
echo '<li data-bs-target="#qslCarouselIndicators" data-bs-slide-to="' . $i . '"';
if ($i == 0) {
echo 'class="active"';
}
$i++;
echo '></li>';
}
$i++;
echo '></li>';
}
?>
</ol>
<?php } ?>
<div class="carousel-inner">
<?php
$i = 1;
foreach ($qslimages as $image) {
echo '<div class="text-center carousel-item carouselimageid_' . $image->id;
if ($i == 1) {
echo ' active';
}
echo '">';
echo '<img class="img-fluid w-qsl" src="' . base_url() . '/assets/qslcard/' . $image->filename .'" alt="QSL picture #'. $i++.'">';
echo '</div>';
}
?>
</div>
<?php if (count($qslimages) > 1) { ?>
<a class="carousel-control-prev" href="#carouselExampleIndicators" role="button" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselExampleIndicators" role="button" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</a>
<?php } ?>
?>
</ol>
<div id="qsl-carousel-inner" class="carousel-inner">
<?php
$i = 1;
foreach ($qslimages as $image) {
echo '<div class="text-center carousel-item carouselimageid_' . $image->id;
if ($i == 1) {
echo ' active';
}
echo '">';
echo '<img class="img-fluid w-qsl" src="' . base_url() . '/assets/qslcard/' . $image->filename .'" alt="QSL picture #'. $i++.'">';
echo '</div>';
}
?>
</div>
<a class="carousel-control-prev" href="#qslCarouselIndicators" role="button" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</a>
<a class="carousel-control-next" href="#qslCarouselIndicators" role="button" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</a>
</div>

Wyświetl plik

@ -0,0 +1,71 @@
<div class="container">
<br>
<h2>
<?php echo lang('general_word_sstvimages'); ?>
</h2>
<div class="alert alert-info" role="alert">
<?php echo lang('qslcard_string_your_are_using'); ?>
<?php echo $storage_used; ?>
<?php echo lang('sstv_string_disk_space'); ?>
</div>
<?php
if ($this->session->userdata('user_date_format')) {
// If Logged in and session exists
$custom_date_format = $this->session->userdata('user_date_format');
} else {
// Get Default date format from /config/cloudlog.php
$custom_date_format = $this->config->item('qso_date_format');
}
if ($sstvArray !== FALSE && is_array($sstvArray->result())) {
echo '<table style="width:100%" class="sstvtable table table-sm table-bordered table-hover table-striped table-condensed">
<thead>
<tr>
<th style=\'text-align: center\'>' . lang('gen_hamradio_callsign') . '</th>
<th style=\'text-align: center\'>' . lang('gen_hamradio_mode') . '</th>
<th style=\'text-align: center\'>' . lang('general_word_date') . '</th>
<th style=\'text-align: center\'>' . lang('general_word_time') . '</th>
<th style=\'text-align: center\'>' . lang('gen_hamradio_band') . '</th>
<th style=\'text-align: center\'></th>
<th style=\'text-align: center\'></th>
<th style=\'text-align: center\'></th>
</tr>
</thead><tbody>';
foreach ($sstvArray->result() as $sstvImage) {
echo '<tr>';
echo '<td style=\'text-align: center\'>' . str_replace("0", "&Oslash;", $sstvImage->COL_CALL) . '</td>';
echo '<td style=\'text-align: center\'>';
echo $sstvImage->COL_SUBMODE == null ? $sstvImage->COL_MODE : $sstvImage->COL_SUBMODE;
echo '</td>';
echo '<td style=\'text-align: center\'>';
$timestamp = strtotime($sstvImage->COL_TIME_ON);
echo date($custom_date_format, $timestamp);
echo '</td>';
echo '<td style=\'text-align: center\'>';
$timestamp = strtotime($sstvImage->COL_TIME_ON);
echo date('H:i', $timestamp);
echo '</td>';
echo '<td style=\'text-align: center\'>';
if ($sstvImage->COL_SAT_NAME != null) {
echo $sstvImage->COL_SAT_NAME;
} else {
echo strtolower($sstvImage->COL_BAND);
}
;
echo '</td>';
echo '<td style=\'text-align: center\'>' . $sstvImage->filename . '</td>';
echo '<td id="' . $sstvImage->id . '" style=\'text-align: center\'><button onclick="deleteSstv(\'' . $sstvImage->id . '\')" class="btn btn-sm btn-danger">Delete</button></td>';
echo '<td style=\'text-align: center\'><button onclick="viewSstv(\'' . $sstvImage->filename . '\', \'' . $sstvImage->COL_CALL . '\')" class="btn btn-sm btn-success">View</button></td>';
echo '</tr>';
}
echo '</tbody></table>';
} else {
echo '<div class="alert alert-warning" role="alert">No SSTV images Found.</div>';
}
?>
</div>

Wyświetl plik

@ -13,26 +13,25 @@
?>
</ol>
<div id="sstv-carousel-inner" class="carousel-inner">
<?php
$i = 1;
foreach ($sstvimages as $image) {
echo '<div class="text-center carousel-item carouselimageid_' . $image->id;
if ($i == 1) {
echo ' active';
$i = 1;
foreach ($sstvimages as $image) {
echo '<div class="text-center carousel-item carouselimageid_' . $image->id;
if ($i == 1) {
echo ' active';
}
echo '">';
echo '<img class="img-fluid w-qsl" src="' . base_url() . '/assets/sstvimages/' . $image->filename .'" alt="SSTV picture #'. $i++.'">';
echo '</div>';
}
echo '">';
echo '<img class="img-fluid w-qsl" src="' . base_url() . '/assets/sstvimages/' . $image->filename .'" alt="SSTV picture #'. $i++.'">';
echo '</div>';
}
?>
</div>
<a class="carousel-control-prev" href="#sstvCarouselIndicators" role="button" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</a>
<a class="carousel-control-next" href="#sstvCarouselIndicators" role="button" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</a>
<a class="carousel-control-prev" href="#sstvCarouselIndicators" role="button" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</a>
<a class="carousel-control-next" href="#sstvCarouselIndicators" role="button" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</a>
</div>

Wyświetl plik

@ -80,12 +80,11 @@ function echoQrbCalcLink($mygrid, $grid, $vucc) {
<?php
$i = 0;
if(!empty($last_five_qsos) > 0) {
foreach ($last_five_qsos->result() as $row) { ?>
if(!empty($results)) {
foreach ($results->result() as $row) { ?>
<?php echo '<tr class="tr'.($i & 1).'">'; ?>
<?php
// Get Date format
if($this->session->userdata('user_date_format')) {
// If Logged in and session exists
@ -114,6 +113,9 @@ function echoQrbCalcLink($mygrid, $grid, $vucc) {
</tr>
<?php $i++; } } ?>
</table>
<div class="pagination-links">
<?php echo $this->pagination->create_links(); ?>
</div>
</div>
</div>

22
docker-compose.yml 100644
Wyświetl plik

@ -0,0 +1,22 @@
version: "3.8"
services:
web:
build: .
env_file:
- .env
ports:
- "80:80"
volumes:
- ./:/var/www/html:rw
depends_on:
- db
db:
image: mariadb:latest
env_file:
- .env
volumes:
- db_data:/var/lib/mysql
volumes:
db_data: {}

Wyświetl plik

@ -148,10 +148,10 @@ if($_POST) {
<fieldset>
<legend>Database settings</legend>
<label for="hostname">Hostname</label><input type="text" id="hostname" value="localhost" class="input_text" name="hostname" />
<label for="username">Username</label><input type="text" id="username" class="input_text" name="username" />
<label for="password">Password</label><input type="password" id="password" class="input_text" name="password" />
<label for="database">Database Name</label><input type="text" id="database" class="input_text" name="database" />
<label for="hostname">Hostname</label><input type="text" id="hostname" value="<?php echo getenv('MYSQL_HOST') ?: 'localhost'; ?>" class="input_text" name="hostname" />
<label for="username">Username</label><input type="text" id="username" value="<?php echo getenv('MYSQL_USER'); ?>" class="input_text" name="username" />
<label for="password">Password</label><input type="password" id="password" value="<?php echo getenv('MYSQL_PASSWORD'); ?>" class="input_text" name="password" />
<label for="database">Database Name</label><input type="text" id="database" value="<?php echo getenv('MYSQL_DATABASE'); ?>" class="input_text" name="database" />
<input type="submit" value="Install" id="submit" />
</fieldset>
</form>