25 Commits

Author SHA1 Message Date
Gitea Actions
603cbb9cb7 Update manifest version to 2.1.1 [▶️] 2026-01-23 02:38:28 +00:00
27d1e5de9b Update README.md
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 10m24s
2026-01-23 02:38:18 +00:00
Gitea Actions
f9e814d9a6 Sync README from template [▶️] 2026-01-10 04:02:36 +00:00
Gitea Actions
23b1099f4a Sync README from template [▶️] 2026-01-01 04:02:39 +00:00
Gitea Actions
506ebd45f2 Sync README from template [▶️] 2025-12-28 04:01:48 +00:00
Gitea Actions
dc99be1f5f Update manifest version to 2.1.0 [▶️] 2025-12-22 05:54:54 +00:00
103f094937 fix release build, add readme update for some repo
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 10m11s
2025-12-22 01:44:37 -03:00
Gitea Actions
de81df199e Sync README from template [▶️] 2025-12-22 04:00:59 +00:00
Gitea Actions
a830d14c32 Update manifest version to 2.0.7 [▶️] 2025-12-22 03:48:04 +00:00
1c8a678ec9 update actions
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 10m6s
2025-12-21 23:35:39 -03:00
Gitea Actions
c59d7b62bb Update manifest version to 2.0.6 [▶️] 2025-12-21 05:13:26 +00:00
75387e40ad Update README.md
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 10m9s
2025-12-21 05:13:08 +00:00
Gitea Actions
e829f08aca Update manifest version to 2.0.5 [▶️] 2025-12-13 07:04:54 +00:00
a20a4a698b Delete public/jquery-qrcode/examples/basic.html
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 10m3s
2025-12-13 07:04:39 +00:00
c85df7cd44 Delete public/jquery-qrcode/examples/demo.html
Some checks failed
Build, Push, Publish / Build & Release (push) Has been cancelled
2025-12-13 07:04:34 +00:00
Gitea Actions
6469f92c12 Update manifest version to 2.0.4 [▶️] 2025-12-13 06:48:39 +00:00
303e1ad89e revert
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 10m0s
2025-12-13 03:48:22 -03:00
Gitea Actions
73da0e732c Update manifest version to 2.0.3 [▶️] 2025-12-13 06:33:07 +00:00
3afbc4d640 Merge branch 'main' of https://git.icc.gg/ivancarlos/wificode
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 9m58s
2025-12-13 03:32:51 -03:00
e8bca48304 remote js 2025-12-13 03:32:33 -03:00
Gitea Actions
d1191e27fc Update manifest version to 2.0.2 [▶️] 2025-12-13 06:03:20 +00:00
e5f83a12e3 Update public/style.css
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 9m59s
2025-12-13 06:03:09 +00:00
Gitea Actions
6cca124291 Update manifest version to 2.0.1 [▶️] 2025-12-13 05:46:29 +00:00
400a50c7f3 Merge branch 'main' of https://git.icc.gg/ivancarlos/wificode
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 9m58s
2025-12-13 02:46:05 -03:00
e2efbba5b8 update 2025-12-13 02:45:51 -03:00
8 changed files with 187 additions and 124 deletions

View File

@@ -5,9 +5,6 @@ on:
branches: branches:
- main - main
workflow_dispatch: workflow_dispatch:
schedule:
- cron: '28 5 * * *'
# workflow_run support in Gitea can be tricky, keeping it but might need adjustment
workflow_run: workflow_run:
workflows: ["Sync Repo"] workflows: ["Sync Repo"]
types: types:
@@ -19,7 +16,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: container:
image: catthehacker/ubuntu:act-latest image: catthehacker/ubuntu:act-latest
permissions: permissions:
contents: write contents: write
packages: write packages: write
@@ -139,7 +136,7 @@ jobs:
LATEST_RELEASE_TAG=$(curl -sL -H "Accept: application/json" \ LATEST_RELEASE_TAG=$(curl -sL -H "Accept: application/json" \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
"${{ gitea.api_url }}/repos/${{ gitea.repository }}/releases/latest" | jq -r .tag_name) "${{ gitea.api_url }}/repos/${{ gitea.repository }}/releases/latest" | jq -r .tag_name)
if [ -z "$LATEST_RELEASE_TAG" ] || [ "$LATEST_RELEASE_TAG" = "null" ]; then if [ -z "$LATEST_RELEASE_TAG" ] || [ "$LATEST_RELEASE_TAG" = "null" ]; then
LATEST_RELEASE_TAG="v1.0.0" LATEST_RELEASE_TAG="v1.0.0"
fi fi
@@ -245,7 +242,7 @@ jobs:
AUTHOR="Ivan Carlos" AUTHOR="Ivan Carlos"
VERSION_FILE="manifest.json" VERSION_FILE="manifest.json"
UPSTREAM_SHA="${{ steps.check_upstream.outputs.upstream_sha }}" UPSTREAM_SHA="${{ steps.check_upstream.outputs.upstream_sha }}"
if [ -f "$VERSION_FILE" ]; then if [ -f "$VERSION_FILE" ]; then
jq --arg v "$VERSION" \ jq --arg v "$VERSION" \
--arg a "$AUTHOR" \ --arg a "$AUTHOR" \
@@ -265,6 +262,11 @@ jobs:
git commit -m "Update manifest version to ${{ steps.version.outputs.VERSION }} [▶️]" || echo "Nothing to commit" git commit -m "Update manifest version to ${{ steps.version.outputs.VERSION }} [▶️]" || echo "Nothing to commit"
git push origin main git push origin main
- name: 🛠 Install zip
if: steps.check_commits.outputs.commit_count != '0'
run: |
apt-get update && apt-get install -y zip
- name: 📦 Create ZIP package (excluding certain files) - name: 📦 Create ZIP package (excluding certain files)
if: steps.check_commits.outputs.commit_count != '0' if: steps.check_commits.outputs.commit_count != '0'
run: | run: |
@@ -279,11 +281,11 @@ jobs:
run: | run: |
TAG_NAME="v${{ steps.version.outputs.VERSION }}" TAG_NAME="v${{ steps.version.outputs.VERSION }}"
RELEASE_NAME="${{ steps.version.outputs.REPO_NAME }} v${{ steps.version.outputs.VERSION }}" RELEASE_NAME="${{ steps.version.outputs.REPO_NAME }} v${{ steps.version.outputs.VERSION }}"
# Construct Markdown body safely using env var # Construct Markdown body safely using env var
# We use printf to avoid interpreting backslashes in the file list # We use printf to avoid interpreting backslashes in the file list
BODY=$(printf "### Changelog\nFiles changed in this release:\n%s" "$CHANGELOG_LIST") BODY=$(printf "### Changelog\nFiles changed in this release:\n%s" "$CHANGELOG_LIST")
# Create JSON payload using jq # Create JSON payload using jq
jq -n \ jq -n \
--arg tag_name "$TAG_NAME" \ --arg tag_name "$TAG_NAME" \
@@ -299,13 +301,13 @@ jobs:
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d @release_payload.json > api_response.json -d @release_payload.json > api_response.json
echo "DEBUG: API Response:" echo "DEBUG: API Response:"
cat api_response.json || true cat api_response.json || true
RELEASE_ID=$(jq -r .id api_response.json) RELEASE_ID=$(jq -r .id api_response.json)
echo "RELEASE_ID=$RELEASE_ID" >> "$GITHUB_OUTPUT" echo "RELEASE_ID=$RELEASE_ID" >> "$GITHUB_OUTPUT"
if [ "$RELEASE_ID" == "null" ] || [ -z "$RELEASE_ID" ]; then if [ "$RELEASE_ID" == "null" ] || [ -z "$RELEASE_ID" ]; then
echo "Failed to create release. Response content:" echo "Failed to create release. Response content:"
cat api_response.json cat api_response.json
@@ -318,19 +320,18 @@ jobs:
RELEASE_ID="${{ steps.create_release.outputs.RELEASE_ID }}" RELEASE_ID="${{ steps.create_release.outputs.RELEASE_ID }}"
ZIP_NAME="${{ steps.version.outputs.ZIP_NAME }}" ZIP_NAME="${{ steps.version.outputs.ZIP_NAME }}"
FILE_PATH="./$ZIP_NAME" FILE_PATH="./$ZIP_NAME"
curl -s -X POST "${{ gitea.api_url }}/repos/${{ gitea.repository }}/releases/$RELEASE_ID/assets" \ curl --fail -s -X POST "${{ gitea.api_url }}/repos/${{ gitea.repository }}/releases/$RELEASE_ID/assets?name=$ZIP_NAME" \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Content-Type: application/zip" \ -H "Content-Type: application/zip" \
--data-binary @"$FILE_PATH" \ --data-binary @"$FILE_PATH"
-o /dev/null
# ----- Docker steps ----- # ----- Docker steps -----
- name: Clone Upstream Code (if needed) - name: Clone Upstream Code (if needed)
if: steps.check_commits.outputs.commit_count != '0' && (steps.check_upstream.outputs.upstream_needs_update == 'true' || steps.check_upstream.outputs.repo_url != '') if: steps.check_commits.outputs.commit_count != '0' && (steps.check_upstream.outputs.upstream_needs_update == 'true' || steps.check_upstream.outputs.repo_url != '')
run: | run: |
rm -rf upstream_src rm -rf upstream_src
git clone --depth 1 --branch ${{ steps.check_upstream.outputs.repo_branch }} ${{ steps.check_upstream.outputs.repo_url }} upstream_src git clone --depth 1 --branch ${{ steps.check_upstream.outputs.repo_branch }} ${{ steps.check_upstream.outputs.repo_url }} upstream_src
- name: 🔍 Check if Dockerfile exists - name: 🔍 Check if Dockerfile exists
if: steps.check_commits.outputs.commit_count != '0' || steps.check_upstream.outputs.upstream_needs_update == 'true' if: steps.check_commits.outputs.commit_count != '0' || steps.check_upstream.outputs.upstream_needs_update == 'true'

View File

@@ -0,0 +1,59 @@
name: Update README
permissions:
contents: write
on:
workflow_dispatch:
schedule:
- cron: "0 4 * * *" # Every day at 4 AM UTC
jobs:
update-readme:
runs-on: ubuntu-latest
container:
image: catthehacker/ubuntu:act-latest
env:
SOURCE_REPO: ivancarlos/.gitea
SOURCE_BRANCH: main
steps:
- name: Checkout current repository
uses: actions/checkout@v4
- name: Checkout source README template
uses: actions/checkout@v4
with:
repository: ${{ env.SOURCE_REPO }}
ref: ${{ env.SOURCE_BRANCH }}
token: ${{ secrets.CR_PAT }}
path: source_readme
- name: Update README.md (footer only)
run: |
set -e
# --- Extract footer block from source (everything from <!-- footer --> onward) ---
FOOTER=$(awk '/<!-- footer -->/{flag=1}flag' source_readme/README.md)
# --- Replace everything after <!-- footer --> with FOOTER ---
awk -v footer="$FOOTER" '
/<!-- footer -->/ {
print footer
found=1
exit
}
{ print }
' README.md > README.tmp && mv README.tmp README.md
- name: Remove source_readme from git index
run: rm -rf source_readme
- name: Commit and push changes
run: |
git config user.name "Gitea Actions"
git config user.email "actions@git.icc.gg"
git add README.md
git commit -m "Sync README from template [▶️]" || echo "Nothing to commit"
git push origin ${{ github.ref_name }}

View File

@@ -1,8 +1,3 @@
FROM nginx:alpine FROM nginx:alpine
COPY public/ /usr/share/nginx/html COPY public/ /usr/share/nginx/html
# Install wget and download jQuery
RUN apk add --no-cache wget && \
mkdir -p /usr/share/nginx/html/jquery && \
wget https://code.jquery.com/jquery-3.5.1.slim.min.js -O /usr/share/nginx/html/jquery/jquery-3.5.1.slim.min.js

View File

@@ -1,2 +1,30 @@
# wificode # WiFi Code
WiFi Code is a fully browser-based site for generating QR codes
## Inspiration
1. Project inspired by [qifi](https://github.com/evgeni/qifi/), license preserved.
## Installation
1. Fork this repository;
2. Make changes.
## Configuration
1. Check `Pages` configuration on your repository settings for custom domain.
## Usage
1. Open your `Pages` repository URL in a browser.
<!-- footer -->
---
## 🧑‍💻 Consulting and technical support
* For personal support and queries, please submit a new issue to have it addressed.
* For commercial related questions, please [**contact me**][ivancarlos] for consulting costs.
| 🩷 Project support |
| :---: |
If you found this project helpful, consider [**buying me a coffee**][buymeacoffee]
|Thanks for your support, it is much appreciated!|
[ivancarlos]: https://ivancarlos.me
[buymeacoffee]: https://www.buymeacoffee.com/ivancarlos

View File

@@ -1,4 +1,4 @@
{ {
"version": "2.0.0", "version": "2.1.1",
"author": "Ivan Carlos" "author": "Ivan Carlos"
} }

View File

@@ -1,5 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
@@ -17,13 +18,15 @@
<link rel="canonical" href="https://wifi.git.icc.gg/"> <link rel="canonical" href="https://wifi.git.icc.gg/">
<!-- Bootstrap removed --> <!-- Bootstrap removed -->
</head> </head>
<body> <body>
<div class="container"> <div class="container">
<section id="generator" class="card"> <section id="generator" class="card">
<header class="page-header"> <header class="page-header">
<h1 id="title">Wifi no QR</h1> <h1 id="title">Wifi no QR</h1>
<p class="subtitle"> <p class="subtitle">
Enter your WiFi details below and click <strong>Generate</strong>. The QR Code is created locally in your browser—no data is sent to any server. Enter your WiFi details below and click <strong>Generate</strong>. The QR Code is created locally in
your browser—no data is sent to any server.
</p> </p>
</header> </header>
@@ -38,7 +41,13 @@
<label for="ssid">SSID (Network Name)</label> <label for="ssid">SSID (Network Name)</label>
<div class="input-wrapper"> <div class="input-wrapper">
<!-- Signal Icon --> <!-- Signal Icon -->
<svg class="input-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12.55a11 11 0 0 1 14.08 0"></path><path d="M1.42 9a16 16 0 0 1 21.16 0"></path><path d="M8.53 16.11a6 6 0 0 1 6.95 0"></path><line x1="12" y1="20" x2="12.01" y2="20"></line></svg> <svg class="input-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M5 12.55a11 11 0 0 1 14.08 0"></path>
<path d="M1.42 9a16 16 0 0 1 21.16 0"></path>
<path d="M8.53 16.11a6 6 0 0 1 6.95 0"></path>
<line x1="12" y1="20" x2="12.01" y2="20"></line>
</svg>
<input type="text" id="ssid" name="ssid" placeholder="MyWiFiNetwork" required> <input type="text" id="ssid" name="ssid" placeholder="MyWiFiNetwork" required>
</div> </div>
</div> </div>
@@ -51,7 +60,11 @@
<option value="WEP">WEP</option> <option value="WEP">WEP</option>
<option value="nopass">None</option> <option value="nopass">None</option>
</select> </select>
<svg class="select-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg> <svg class="select-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16"
viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</div> </div>
</div> </div>
@@ -59,11 +72,20 @@
<label for="key">Password</label> <label for="key">Password</label>
<div class="input-wrapper"> <div class="input-wrapper">
<!-- Lock Icon --> <!-- Lock Icon -->
<svg class="input-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg> <svg class="input-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect>
<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>
</svg>
<input type="password" id="key" name="key" placeholder="Wireless Key" required> <input type="password" id="key" name="key" placeholder="Wireless Key" required>
<button type="button" id="display-key" class="icon-btn"> <button type="button" id="display-key" class="icon-btn">
<!-- Eye Icon --> <!-- Eye Icon -->
<svg id="display-key-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path><circle cx="12" cy="12" r="3"></circle></svg> <svg id="display-key-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20"
viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round">
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
<circle cx="12" cy="12" r="3"></circle>
</svg>
</button> </button>
</div> </div>
</div> </div>
@@ -75,8 +97,10 @@
<div class="button-group"> <div class="button-group">
<button id="generate" class="btn btn-primary">Generate QR Code</button> <button id="generate" class="btn btn-primary">Generate QR Code</button>
<button id="save" type="button" class="btn btn-secondary" title="Save credentials locally">Save</button> <button id="save" type="button" class="btn btn-secondary"
<a href="#" id="export" class="btn btn-outline" target="_blank" title="Download PNG">Download PNG</a> title="Save credentials locally">Save</button>
<a href="#" id="export" class="btn btn-outline" target="_blank" title="Download PNG">Download
PNG</a>
<a href="javascript:window.print()" id="print" class="btn btn-outline" title="Print">Print</a> <a href="javascript:window.print()" id="print" class="btn btn-outline" title="Print">Print</a>
</div> </div>
</form> </form>
@@ -88,25 +112,33 @@
</div> </div>
<footer> <footer>
<p><a href="https://icc.gg/privacidade" target="_blank">Privacy Policy</a><a href="https://icc.gg/termos" target="_blank">Terms and Conditions</a></p> <p><a href="https://icc.gg/privacidade" target="_blank">Privacy Policy</a><a
href="https://icc.gg/termos" target="_blank">Terms and Conditions</a></p>
</footer> </footer>
</section> </section>
</div> </div>
<!-- Scripts preserved and paths adjusted if necessary --> <!-- Scripts -->
<script src="jquery/jquery-3.5.1.slim.min.js"></script> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"
integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
crossorigin="anonymous"></script>
<script src="jquery-qrcode/jquery.qrcode.min.js"></script> <script src="jquery-qrcode/jquery.qrcode.min.js"></script>
<script src="jquery.storage.js/jquery.storage.js"></script> <script src="jquery.storage.js/jquery.storage.js"></script>
<!-- Original Logic Preserved --> <!-- Original Logic Preserved -->
<script type="text/javascript"> <script type="text/javascript">
function escape_string (string) { // Prevent default form submission globally
document.getElementById('form').addEventListener('submit', function (e) {
e.preventDefault();
});
function escape_string(string) {
var to_escape = ['\\', ';', ',', ':', '"']; var to_escape = ['\\', ';', ',', ':', '"'];
var hex_only = /^[0-9a-f]+$/i; var hex_only = /^[0-9a-f]+$/i;
var output = ""; var output = "";
for (var i=0; i<string.length; i++) { for (var i = 0; i < string.length; i++) {
if($.inArray(string[i], to_escape) != -1) { if ($.inArray(string[i], to_escape) != -1) {
output += '\\'+string[i]; output += '\\' + string[i];
} }
else { else {
output += string[i]; output += string[i];
@@ -115,26 +147,26 @@
return output; return output;
}; };
function generate () { function generate() {
var ssid = $('#ssid').val(); var ssid = $('#ssid').val();
var hidden = $('#hidden').is(':checked'); var hidden = $('#hidden').is(':checked');
var enc = $('#enc').val(); var enc = $('#enc').val();
if (enc != 'nopass') { if (enc != 'nopass') {
var key = $('#key').val(); var key = $('#key').val();
$('#showkey').text(enc+' Passphrase: '+key); $('#showkey').text(enc + ' Passphrase: ' + key);
} else { } else {
var key = ''; var key = '';
$('#showkey').text(''); $('#showkey').text('');
} }
// https://github.com/zxing/zxing/wiki/Barcode-Contents#wi-fi-network-config-android-ios-11 // https://github.com/zxing/zxing/wiki/Barcode-Contents#wi-fi-network-config-android-ios-11
var qrstring = 'WIFI:S:'+escape_string(ssid)+';T:'+enc+';P:'+escape_string(key)+';'; var qrstring = 'WIFI:S:' + escape_string(ssid) + ';T:' + enc + ';P:' + escape_string(key) + ';';
if (hidden) { if (hidden) {
qrstring += 'H:true'; qrstring += 'H:true';
} }
qrstring += ';'; qrstring += ';';
$('#qrcode').empty(); $('#qrcode').empty();
$('#qrcode').qrcode(qrstring); $('#qrcode').qrcode(qrstring);
$('#showssid').text('SSID: '+ssid); $('#showssid').text('SSID: ' + ssid);
$('#save').show(); $('#save').show();
$('#print').css('display', 'inline-block'); $('#print').css('display', 'inline-block');
$('#showssid, #showkey').show(); // Show result text $('#showssid, #showkey').show(); // Show result text
@@ -144,12 +176,12 @@
var data = canvas[0].toDataURL('image/png'); var data = canvas[0].toDataURL('image/png');
var e = $('#export'); var e = $('#export');
e.attr('href', data); e.attr('href', data);
e.attr('download', ssid+'-qrcode.png'); e.attr('download', ssid + '-qrcode.png');
e.css('display', 'inline-block'); e.css('display', 'inline-block');
} }
}; };
function save () { function save() {
var ssid = $('#ssid').val(); var ssid = $('#ssid').val();
if (!ssid) return; if (!ssid) return;
var hidden = $('#hidden').is(':checked'); var hidden = $('#hidden').is(':checked');
@@ -157,7 +189,7 @@
var key = $('#key').val(); var key = $('#key').val();
var storage = $.localStorage('qificodes'); var storage = $.localStorage('qificodes');
if (!storage) storage = {}; if (!storage) storage = {};
storage[ssid] = {'hidden': hidden, 'enc': enc, 'key': key}; storage[ssid] = { 'hidden': hidden, 'enc': enc, 'key': key };
$.localStorage('qificodes', storage); $.localStorage('qificodes', storage);
loadhistory(); loadhistory();
}; };
@@ -173,23 +205,23 @@
} }
}; };
function loadhistory () { function loadhistory() {
var storage = $.localStorage('qificodes'); var storage = $.localStorage('qificodes');
if (storage) { if (storage) {
var history = $('#history-drop ul.dropdown-menu'); var history = $('#history-drop ul.dropdown-menu');
var ssids = Object.keys(storage); var ssids = Object.keys(storage);
history.empty(); history.empty();
for (var i=0; i<ssids.length; i++) { for (var i = 0; i < ssids.length; i++) {
history.append('<li><a href="#" class="history-item">'+ssids[i]+'</a></li>'); history.append('<li><a href="#" class="history-item">' + ssids[i] + '</a></li>');
} }
history.append('<li class="divider"></li>'); history.append('<li class="divider"></li>');
history.append('<li><a href="#" class="history-clear">clear history</a></li>'); history.append('<li><a href="#" class="history-clear">clear history</a></li>');
history.on('click', 'a.history-item', function(e) { history.on('click', 'a.history-item', function (e) {
e.preventDefault(); e.preventDefault();
load($(this).text()); load($(this).text());
}); });
history.on('click', 'a.history-clear', function(e) { history.on('click', 'a.history-clear', function (e) {
e.preventDefault(); e.preventDefault();
clearhistory(); clearhistory();
}); });
@@ -197,13 +229,13 @@
} }
}; };
function clearhistory () { function clearhistory() {
$.localStorage('qificodes', null); $.localStorage('qificodes', null);
$('#history-drop').hide(); $('#history-drop').hide();
}; };
$(document).ready(function(){ $(document).ready(function () {
$('#form').submit(function() { $('#form').submit(function () {
generate(); generate();
// Scroll to result on mobile // Scroll to result on mobile
$('html, body').animate({ $('html, body').animate({
@@ -211,37 +243,37 @@
}, 500); }, 500);
return false; return false;
}); });
$('#save').click(function() { $('#save').click(function () {
save(); save();
}); });
// Eye toggle logic adapted for SVG changes // Eye toggle logic adapted for SVG changes
$('#display-key').click(function() { $('#display-key').click(function () {
var $key = $("#key"); var $key = $("#key");
var $icon = $("#display-key-icon"); var $icon = $("#display-key-icon");
if ($key.attr('type') === 'password') { if ($key.attr('type') === 'password') {
$key.attr('type', 'text'); $key.attr('type', 'text');
// Simple logic to visual indicate change - in real app would swap SVG path // Simple logic to visual indicate change - in real app would swap SVG path
$icon.css('opacity', '0.5'); $icon.css('opacity', '0.5');
} else { } else {
$key.attr('type', 'password'); $key.attr('type', 'password');
$icon.css('opacity', '1'); $icon.css('opacity', '1');
} }
}); });
$('#enc').change(function() { $('#enc').change(function () {
if($(this).val() != 'nopass') { if ($(this).val() != 'nopass') {
$('#key-p').slideDown(); $('#key-p').slideDown();
$('#key').attr('required','required'); $('#key').attr('required', 'required');
} }
else { else {
$('#key-p').slideUp(); $('#key-p').slideUp();
$('#key').removeAttr('required'); $('#key').removeAttr('required');
} }
}); });
// Toggle history logic // Toggle history logic
$('.history-btn').click(function() { $('.history-btn').click(function () {
$('.dropdown-menu').toggle(); $('.dropdown-menu').toggle();
}); });
@@ -250,14 +282,15 @@
// Service Worker installation // Service Worker installation
if ('serviceWorker' in navigator) { if ('serviceWorker' in navigator) {
window.addEventListener('load', function() { window.addEventListener('load', function () {
navigator.serviceWorker.register('/sw.js', {scope: './'}).then(function(registration) { navigator.serviceWorker.register('/sw.js', { scope: './' }).then(function (registration) {
console.log('[Service Worker] Successfully installed'); console.log('[Service Worker] Successfully installed');
}).catch(function(error) { }).catch(function (error) {
console.log('[Service Worker] Installation failed:', error); console.log('[Service Worker] Installation failed:', error);
}) })
}); });
} }
</script> </script>
</body> </body>
</html>
</html>

View File

@@ -1,29 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>basic example</title>
</head>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<!--<script type="text/javascript" src="../jquery.qrcode.min.js"></script>
--><script type="text/javascript" src="../src/jquery.qrcode.js"></script>
<script type="text/javascript" src="../src/qrcode.js"></script>
<p>Render in table</p>
<div id="qrcodeTable"></div>
<p>Render in canvas</p>
<div id="qrcodeCanvas"></div>
<script>
//jQuery('#qrcode').qrcode("this plugin is great");
jQuery('#qrcodeTable').qrcode({
render : "table",
text : "http://jetienne.com"
});
jQuery('#qrcodeCanvas').qrcode({
text : "http://jetienne.com"
});
</script>
</body>
</html>

View File

@@ -1,24 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Demo page</title>
</head>
<body>
<p>
TODO make a nice looking pure client qrcode generator
even allow download of the image
</p>
<div id="output"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script type="text/javascript" src="../jquery.qrcode.min.js"></script>
<script>
jQuery(function(){
jQuery('#output').qrcode("http://jetienne.com");
})
</script>
</body>
</html>