Compare commits

..

22 Commits

Author SHA1 Message Date
ba07f7b55f Merge branch 'main' of https://git.odit.services/lfk/scanclient into main
# Conflicts:
#	.gitignore
#	README.md
#	main.js
#	package.json
2021-03-15 13:36:54 +01:00
a2ec9d0cb3 👷‍♂️ CI - move to main tags event + disable rpm build for now 2021-03-15 13:33:22 +01:00
3e533f5c6d CI - fixed rpm build
Some checks reported errors
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build was killed
2021-03-14 22:03:04 +01:00
8f907ba597 CI - rpm release building
Some checks reported errors
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build is failing
2021-03-14 21:59:41 +01:00
e85a639e96 CI - only build @lfk-scanclient-linux-x64
Some checks reported errors
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build was killed
2021-03-14 21:52:41 +01:00
b1c9cc7652 CI - testing full artifact zipping
Some checks reported errors
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build is passing
2021-03-14 21:47:50 +01:00
ab7ba528ee removed "@" from dist package
Some checks reported errors
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build is failing
2021-03-14 21:35:41 +01:00
bfff17c465 🚚 move to apk zip
Some checks reported errors
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 reported errors
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 325 additions and 122 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

45
.drone.yml Normal file
View File

@ -0,0 +1,45 @@
---
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
- mkdir dist
- zip -r dist/@lfk-scanclient-linux-x64.zip out/@lfk-scanclient-linux-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: dist/*
checksum:
- md5
- sha1
- sha256
- sha512
- adler32
- crc32
when:
event: tag
trigger:
branch:
- main
event:
- tag

29
.gitignore vendored
View File

@ -1,22 +1,9 @@
# Logs /node_modules/
logs /dist/
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Dependency directories
node_modules/
jspm_packages/
# Svelte Distribution
public/build/
# Electron Distribution
dist
# Project Build Automation Directory
private
# Desktop Services Store on macOS
.DS_Store .DS_Store
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

@ -1,18 +1,25 @@
# @lfk/scanclient # @lfk/scanclient
## ✒️ Overview ## ✒️ Overview
This is an API client built with `svelte`, served to clients via by `electron`. 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 ## 🚀 Getting Started
``` ```
yarn yarn && cd app && yarn && cd ..
``` ```
# Run your app ## WebApp Development
``` ```
yarn electron-dev yarn dev
/
yarn dev --open
``` ```
## Run in electron
# Package Your App
``` ```
yarn electron-pack 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()
]
};
});

82
main.js
View File

@ -1,79 +1,39 @@
// Modules to control application life and create native browser window const { app, BrowserWindow } = require('electron');
const { app, BrowserWindow, dialog } = require('electron');
const path = require('path'); const path = require('path');
const serve = require('electron-serve');
const loadURL = serve({ directory: 'public' });
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow;
function isDev() {
return !app.isPackaged;
}
function createWindow() { function createWindow() {
// Create the browser window. const mainWindow = new BrowserWindow({
mainWindow = new BrowserWindow({
width: 800, width: 800,
height: 600, height: 600,
webPreferences: { fullscreen: true
nodeIntegration: true // webPreferences: {
}, // preload: path.join(__dirname, 'preload.js')
// Use this in development mode. // }
icon: isDev() ? path.join(process.cwd(), 'public/favicon.png') : path.join(__dirname, 'public/favicon.png'),
// Use this in production mode.
// icon: path.join(__dirname, 'public/favicon.png'),
show: false
});
mainWindow.removeMenu();
// This block of code is intended for development purpose only.
// Delete this entire block of code when you are ready to package the application.
if (isDev()) {
mainWindow.loadURL('http://localhost:5000/');
} else {
loadURL(mainWindow);
}
// Uncomment the following line of code when app is ready to be packaged.
// loadURL(mainWindow);
// Open the DevTools and also disable Electron Security Warning.
// process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = true;
// mainWindow.webContents.openDevTools();
// Emitted when the window is closed.
mainWindow.on('closed', function() {
// Dereference the window object, usually you would store windows
// in an array if your app supports multi windows, this is the time
// when you should delete the corresponding element.
mainWindow = null;
});
// Emitted when the window is ready to be shown
// This helps in showing the window gracefully.
mainWindow.once('ready-to-show', () => {
mainWindow.show();
}); });
mainWindow.loadFile('app/dist/index.html');
// mainWindow.removeMenu();
// mainWindow.webContents.openDevTools()
} }
// This method will be called when Electron has finished // This method will be called when Electron has finished
// initialization and is ready to create browser windows. // initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs. // Some APIs can only be used after this event occurs.
app.on('ready', createWindow); app.whenReady().then(() => {
createWindow();
// Quit when all windows are closed.
app.on('window-all-closed', function() {
// On macOS it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== 'darwin') app.quit();
});
app.on('activate', function() { app.on('activate', function() {
// On macOS it's common to re-create a window in the app when the // 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. // dock icon is clicked and there are no other windows open.
if (mainWindow === null) createWindow(); 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 // 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. // code. You can also put them in separate files and require them here.

View File

@ -1,40 +1,44 @@
{ {
"name": "@lfk/scanclient", "name": "@lfk/scanclient",
"version": "0.0.1", "version": "0.0.0",
"description": "LfK! Scanclient", "description": "minimal electron application",
"main": "main.js", "main": "main.js",
"build": {
"icon": "public/favicon.png",
"productName": "LfK!Scan",
"files": [ "public/**/*", "main.js" ],
"win": {},
"linux": {},
"mac": {}
},
"scripts": { "scripts": {
"build": "rollup -c", "dev": "cd app && yarn dev",
"dev": "rollup -c -w", "electron:start": "cd app && yarn build && cd .. && electron-forge start",
"start": "sirv public", "electron:package": "cd app && yarn build && cd .. && electron-forge package"
"electron": "wait-on http://localhost:5000 && electron .",
"electron-dev": "concurrently \"yarn run dev\" \"yarn run electron\"",
"preelectron-pack": "yarn run build",
"electron-pack": "electron-builder"
},
"dependencies": {
"electron-serve": "^1.0.0"
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-commonjs": "^14.0.0", "@electron-forge/cli": "^6.0.0-beta.54",
"@rollup/plugin-node-resolve": "^8.0.0", "@electron-forge/maker-deb": "^6.0.0-beta.54",
"concurrently": "^5.3.0", "@electron-forge/maker-rpm": "^6.0.0-beta.54",
"electron": "^9.2.1", "@electron-forge/maker-squirrel": "^6.0.0-beta.54",
"electron-builder": "^22.8.0", "@electron-forge/maker-zip": "^6.0.0-beta.54",
"rollup": "^2.3.4", "electron-nightly": "14.0.0-nightly.20210311"
"rollup-plugin-livereload": "^1.0.0", },
"rollup-plugin-svelte": "^5.0.3", "dependencies": {
"rollup-plugin-terser": "^6.0.0", "electron-squirrel-startup": "^1.0.0"
"sirv-cli": "^1.0.0", },
"svelte": "^3.0.0", "config": {
"wait-on": "^5.2.0" "forge": {
"packagerConfig": {},
"makers": [
{
"name": "@electron-forge/maker-zip",
"platforms": [ "darwin" ],
"config": {
"name": "lfk__scanclient"
}
},
{
"name": "@electron-forge/maker-deb",
"config": {}
},
{
"name": "@electron-forge/maker-rpm",
"config": {}
}
]
}
} }
} }