Fase 3 feedback round: style preview, icon upload, font choice, optional bitcoin amount, WPA3
- Default the Owner select to the creator's own account instead of "All", so
superadmin-created codes no longer silently become visible to every admin
(the underlying NULL-fallback sharing behavior for an explicit "All" choice
is unchanged).
- Add a live color/precision/size preview swatch next to the preset picker.
- Let the frame text use a chosen DejaVu font + font size instead of a fixed
GD bitmap font.
- Add an optional self-uploaded icon rendered above the qr code (not embedded
in it, so scanability is unaffected).
- Make the Bitcoin qr amount optional; a standing wallet address is useful
without forcing a one-off amount per code.
- Add a WPA3 option to the WiFi qr encryption select.
- Fix a real bug surfaced while testing the preview/style JS: qrcode_options.php
was included once per static qr type (16 times on one page) and each
inclusion re-executed <script src="qrcode-style-tools.js">, so every button
click fired once per type - e.g. saving one preset wrote 16 duplicate rows,
and every tab except the first ("Text") had dead random-style/preset
buttons since only the first DOM match ever got a listener. Moved the
script include to load once per page and rewrote the JS to scope every
lookup to the triggering element's own tab-pane/form instead of relying on
getElementById's first-match behavior.
This commit is contained in:
@@ -117,6 +117,45 @@ function paginationLinks($current_page, $total_pages, $base_url) {
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the optional "icon above the qr code" upload. Validates the actual image
|
||||
* type (not just the extension/mime the browser claims) and stores the file outside
|
||||
* the document root, next to the generated qr codes.
|
||||
*/
|
||||
function qr_handle_icon_upload($fileKey = 'icon') {
|
||||
if (!isset($_FILES[$fileKey]) || $_FILES[$fileKey]['error'] === UPLOAD_ERR_NO_FILE) {
|
||||
return ['ok' => true, 'path' => null];
|
||||
}
|
||||
|
||||
if ($_FILES[$fileKey]['error'] !== UPLOAD_ERR_OK) {
|
||||
return ['ok' => false, 'error' => 'Icon upload failed.'];
|
||||
}
|
||||
|
||||
if ($_FILES[$fileKey]['size'] > 1024 * 1024) {
|
||||
return ['ok' => false, 'error' => 'Icon must be smaller than 1MB.'];
|
||||
}
|
||||
|
||||
$info = @getimagesize($_FILES[$fileKey]['tmp_name']);
|
||||
$allowed = [IMAGETYPE_PNG => 'png', IMAGETYPE_JPEG => 'jpg', IMAGETYPE_GIF => 'gif'];
|
||||
|
||||
if ($info === false || !isset($allowed[$info[2]])) {
|
||||
return ['ok' => false, 'error' => 'Icon must be a PNG, JPEG or GIF image.'];
|
||||
}
|
||||
|
||||
$dir = SAVED_QRCODE_DIRECTORY . 'icons/';
|
||||
if (!is_dir($dir)) {
|
||||
mkdir($dir, 0750, true);
|
||||
}
|
||||
|
||||
$destination = $dir . bin2hex(random_bytes(16)) . '.' . $allowed[$info[2]];
|
||||
|
||||
if (!move_uploaded_file($_FILES[$fileKey]['tmp_name'], $destination)) {
|
||||
return ['ok' => false, 'error' => 'Could not store the uploaded icon.'];
|
||||
}
|
||||
|
||||
return ['ok' => true, 'path' => $destination];
|
||||
}
|
||||
|
||||
function base_url() {
|
||||
require_once(__DIR__ . '/../config/environment.php');
|
||||
if (defined('BASE_URL') && BASE_URL !== null) {
|
||||
|
||||
Reference in New Issue
Block a user