15 Commits

Author SHA1 Message Date
bfff17c465 🚚 move to apk zip
Some checks failed
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build is failing
2021-03-14 21:28:40 +01:00
de92402a3c CI - 📁 create zip for release
Some checks failed
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build is failing
2021-03-14 21:17:05 +01:00
f4037c78ca CI - also trigger on tag events
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is failing
2021-03-14 20:57:13 +01:00
b42ff9ec3c CI Test
Some checks failed
continuous-integration/drone/push Build is failing
2021-03-14 20:54:07 +01:00
08922d3363 CI - added secret from path 2021-03-14 20:51:04 +01:00
49e9317f4a CI file 2021-03-14 20:49:34 +01:00
0189a16df0 🐳 added git as a electron dependency 2021-03-14 20:29:36 +01:00
f9c050b9f7 simple Dockerfile 2021-03-14 20:26:51 +01:00
d728ae37e6 added basic dev script + more readme 2021-03-14 20:07:11 +01:00
18ca318b18 proper scripts for electron building/webapp building 2021-03-14 20:05:00 +01:00
7377b4c9d0 demo for electron packaging 2021-03-14 19:55:21 +01:00
f14885854e 🧹 cleanups 2021-03-14 19:39:46 +01:00
bb25203104 drop yarn.lock 2021-03-14 19:27:38 +01:00
e94ce9731d basic svelte+vite+windicss app 2021-03-14 19:26:21 +01:00
560b0f4c74 tmp 2021-03-14 19:06:51 +01:00
15 changed files with 366 additions and 184 deletions

24
.dockerignore Normal file
View File

@@ -0,0 +1,24 @@
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/charts
**/docker-compose*
**/compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
README.md

47
.drone.yml Normal file
View File

@@ -0,0 +1,47 @@
---
kind: secret
name: gitea_token
get:
path: odit-git-bot
name: apikey
---
kind: pipeline
type: kubernetes
name: build
steps:
- name: run electron packager
depends_on: ["clone"]
image: node:15.11.0-alpine3.13
commands:
- apk add git zip -f
- yarn && cd app && yarn && cd ..
- yarn electron:package
- zip -r out/lfk-scanclient-win32-x64.zip out/@lfk-scanclient-win32-x64
- name: gitea_release
depends_on: ["run electron packager"]
image: plugins/gitea-release
settings:
api_key:
from_secret: gitea_token
base_url: https://git.odit.services
# files: out/*
files:
- out/lfk-scanclient-win32-x64.zip
checksum:
- md5
- sha1
- sha256
- sha512
- adler32
- crc32
when:
event: tag
trigger:
# branch:
# - dev
event:
- push
- tag

190
.gitignore vendored
View File

@@ -1,183 +1,9 @@
# ---> Node
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
# ---> Windows
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
# ---> macOS
# General
/node_modules/
/dist/
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# ---> Vue
# gitignore template for Vue.js projects
#
# Recommended template: Node.gitignore
# TODO: where does this rule come from?
docs/_book
# TODO: where does this rule come from?
test/
package-lock.json
yarn.lock
/out
/yarn.lock
/app/node_modules
/app/dist

6
Dockerfile Normal file
View File

@@ -0,0 +1,6 @@
FROM node:15.11.0-alpine3.13
RUN apk add git -f
WORKDIR /app
COPY . .
RUN yarn && cd app && yarn && cd ..
RUN yarn electron:package

View File

@@ -359,4 +359,4 @@ modifications to any of its public licenses or any other arrangements, understan
or agreements concerning use of licensed material. For the avoidance of doubt,
this paragraph does not form part of the public licenses.
Creative Commons may be contacted at creativecommons.org.
Creative Commons may be contacted at creativecommons.org.

View File

@@ -1,2 +1,25 @@
# scanclient
# @lfk/scanclient
## ✒️ Overview
This is an API client for @lfk/backend
- WebApp built with [Svelte](https://svelte.dev), [WindiCSS](https://windicss.org/) (to compile [TailwindCSS](https://tailwindcss.com/)) and [Vite](https://vitejs.dev).
- Served to clients via by `electron`.
## 🚀 Getting Started
```
yarn && cd app && yarn && cd ..
```
## WebApp Development
```
yarn dev
/
yarn dev --open
```
## Run in electron
```
yarn electron:start
```
# Package electron
```
yarn electron:package
```

16
app/index.html Normal file
View File

@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>LfK!Scan</title>
<base href="./">
<link rel="icon" type="image/png" href="./favicon.png" />
</head>
<body class="bg-white font-family-karla h-screen">
<script type="module" src="./src/main.js"></script>
</body>
</html>

20
app/package.json Normal file
View File

@@ -0,0 +1,20 @@
{
"name": "@lfk/scanclient",
"version": "0.0.0",
"scripts": {
"dev": "vite",
"build": "vite build"
},
"devDependencies": {
"@svitejs/vite-plugin-svelte": "^0.11.0",
"@tsconfig/svelte": "^1.0.10",
"@types/html-minifier": "^4.0.0",
"axios": "^0.21.1",
"glob": "^7.1.6",
"html-minifier": "^4.0.0",
"svelte": "^3.35.0",
"svelte-preprocess": "^4.6.9",
"vite": "^2.0.5",
"vite-plugin-windicss": "^0.8.2"
}
}

BIN
app/public/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

63
app/src/App.svelte Normal file
View File

@@ -0,0 +1,63 @@
<div class="w-full flex flex-wrap">
<!-- Login Section -->
<div class="w-full md:w-1/2 flex flex-col">
<div class="flex justify-center md:justify-start pt-12 md:pl-12 md:-mb-24">
<div class="bg-black text-white font-bold text-xl p-4"><img src="./favicon.png" alt=""
style="height: 3rem;display: inline;"> LfK!Scan</div>
</div>
<div class="flex flex-col justify-center md:justify-start my-auto pt-8 md:pt-0 px-8 md:px-24 lg:px-32">
<p class="text-center text-3xl">Configuration</p>
<p class="text-center">Please provide the scan client token.<br><a target="_blank" class="underline"
href="https://docs.lauf-fuer-kaya.de/">See our configuration guide.</a></p>
<form class="flex flex-col pt-3 md:pt-8" onsubmit="event.preventDefault();">
<div class="flex flex-col pt-4">
<label for="token" class="text-lg">Client Token</label>
<input type="text" id="token" onchange="tokenchanged()" placeholder="Client Token"
class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 mt-1 leading-tight focus:outline-none focus:shadow-outline">
</div>
<input id="configure" type="submit" value="Configure"
class="bg-black text-white font-bold text-lg hover:bg-gray-700 p-2 mt-8 cursor-pointer">
</form>
<div class="text-center pt-12 pb-12">
<p><svg style="height: 1rem;display: inline;" xmlns="http://www.w3.org/2000/svg" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-zap" viewBox="0 0 24 24">
<path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" />
</svg><span>powered by <a href="https://odit.services" target="_blank"
class="underline">ODIT.Services</a>.</span></p>
</div>
</div>
<div class="w-full p-3">
<div class="inline-block mr-2 mt-2">
<button type="button"
class="bg-black focus:outline-none text-white text-sm py-2.5 px-5 rounded-md hover:bg-blue-700">Deutsch
<svg class="h-4 inline" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M15.923 345.043C52.094 442.527 145.929 512 256 512s203.906-69.473 240.077-166.957L256 322.783l-240.077 22.26z" fill="#ffda44"/><path d="M256 0C145.929 0 52.094 69.472 15.923 166.957L256 189.217l240.077-22.261C459.906 69.472 366.071 0 256 0z"/><path d="M15.923 166.957C5.633 194.69 0 224.686 0 256s5.633 61.31 15.923 89.043h480.155C506.368 317.31 512 287.314 512 256s-5.632-61.31-15.923-89.043H15.923z" fill="#d80027"/></svg></button>
</div>
<div class="inline-block mr-2 mt-2">
<button type="button"
class="bg-black focus:outline-none text-white text-sm py-2.5 px-5 rounded-md hover:bg-blue-700 bg-blue-700">English
<svg class="h-4 inline" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<circle cx="256" cy="256" r="256" fill="#f0f0f0"></circle>
<g fill="#d80027">
<path
d="M244.87 256H512c0-23.106-3.08-45.49-8.819-66.783H244.87V256zM244.87 122.435h229.556a257.35 257.35 0 00-59.07-66.783H244.87v66.783zM256 512c60.249 0 115.626-20.824 159.356-55.652H96.644C140.374 491.176 195.751 512 256 512zM37.574 389.565h436.852a254.474 254.474 0 0028.755-66.783H8.819a254.474 254.474 0 0028.755 66.783z">
</path>
</g>
<path
d="M118.584 39.978h23.329l-21.7 15.765 8.289 25.509-21.699-15.765-21.699 15.765 7.16-22.037a257.407 257.407 0 00-49.652 55.337h7.475l-13.813 10.035a255.58 255.58 0 00-6.194 10.938l6.596 20.301-12.306-8.941a253.567 253.567 0 00-8.372 19.873l7.267 22.368h26.822l-21.7 15.765 8.289 25.509-21.699-15.765-12.998 9.444A258.468 258.468 0 000 256h256V0c-50.572 0-97.715 14.67-137.416 39.978zm9.918 190.422l-21.699-15.765L85.104 230.4l8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765 8.289 25.509zm-8.289-100.083l8.289 25.509-21.699-15.765-21.699 15.765 8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765zM220.328 230.4l-21.699-15.765L176.93 230.4l8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765 8.289 25.509zm-8.289-100.083l8.289 25.509-21.699-15.765-21.699 15.765 8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765zm0-74.574l8.289 25.509-21.699-15.765-21.699 15.765 8.289-25.509-21.7-15.765h26.822l8.288-25.509 8.288 25.509h26.822l-21.7 15.765z"
fill="#0052b4"></path>
</svg></button>
</div>
</div>
</div>
<!-- Image Section -->
<div class="w-1/2 shadow-2xl">
<img alt="" class="object-cover w-full h-screen hidden md:block" src="https://source.unsplash.com/IXUM4cJynP0">
</div>
</div>

8
app/src/main.js Normal file
View File

@@ -0,0 +1,8 @@
import App from './App.svelte';
import 'windi.css';
const app = new App({
target: document.body
});
export default app;

13
app/tailwind.config.js Normal file
View File

@@ -0,0 +1,13 @@
module.exports = {
theme: {
extend: {
colors: {
reepolee: {
500: "#b40000",
600: "#9c0000",
700: "#750000",
},
},
},
},
};

50
app/vite.config.ts Normal file
View File

@@ -0,0 +1,50 @@
import svelte from '@svitejs/vite-plugin-svelte';
import windiCSS from 'vite-plugin-windicss';
import { minify } from 'html-minifier';
import { defineConfig } from 'vite';
//
const indexReplace = () => {
return {
name: 'html-transform',
transformIndexHtml(html) {
return minify(html, {
collapseWhitespace: true
});
}
};
};
export default defineConfig(({ command, mode }) => {
const isProduction = mode === 'production';
return {
base: './',
build: {
polyfillDynamicImport: false,
cssCodeSplit: false,
minify: isProduction
},
plugins: [
windiCSS({
//@ts-ignore
verbose: true,
silent: false,
debug: true,
config: 'tailwind.config.js', // tailwind config file path (optional)
compile: false, // false: interpretation mode; true: compilation mode
prefix: 'windi-', // set compilation mode style prefix
globalPreflight: true, // set preflight style is global or scoped
globalUtility: true // set utility style is global or scoped
}),
svelte({
//@ts-ignore
hot: !isProduction,
emitCss: true,
extensions: [ '.md', '.svx', '.svelte' ],
preprocess: [
//
]
}),
indexReplace()
]
};
});

39
main.js Normal file
View File

@@ -0,0 +1,39 @@
const { app, BrowserWindow } = require('electron');
const path = require('path');
function createWindow() {
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
fullscreen: true
// webPreferences: {
// preload: path.join(__dirname, 'preload.js')
// }
});
mainWindow.loadFile('app/dist/index.html');
// mainWindow.removeMenu();
// mainWindow.webContents.openDevTools()
}
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(() => {
createWindow();
app.on('activate', function() {
// On macOS it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', function() {
if (process.platform !== 'darwin') app.quit();
});
// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.

47
package.json Normal file
View File

@@ -0,0 +1,47 @@
{
"name": "@lfk/scanclient",
"version": "0.0.0",
"description": "minimal electron application",
"main": "main.js",
"scripts": {
"dev": "cd app && yarn dev",
"electron:start": "cd app && yarn build && cd .. && electron-forge start",
"electron:package": "cd app && yarn build && cd .. && electron-forge package"
},
"devDependencies": {
"@electron-forge/cli": "^6.0.0-beta.54",
"@electron-forge/maker-deb": "^6.0.0-beta.54",
"@electron-forge/maker-rpm": "^6.0.0-beta.54",
"@electron-forge/maker-squirrel": "^6.0.0-beta.54",
"@electron-forge/maker-zip": "^6.0.0-beta.54",
"electron-nightly": "14.0.0-nightly.20210311"
},
"dependencies": {
"electron-squirrel-startup": "^1.0.0"
},
"config": {
"forge": {
"packagerConfig": {},
"makers": [
{
"name": "@electron-forge/maker-squirrel",
"config": {
"name": "@lfk/scanclient"
}
},
{
"name": "@electron-forge/maker-zip",
"platforms": [ "darwin" ]
},
{
"name": "@electron-forge/maker-deb",
"config": {}
},
{
"name": "@electron-forge/maker-rpm",
"config": {}
}
]
}
}
}