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
logs
*.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
/node_modules/
/dist/
.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

@ -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,18 +1,25 @@
# @lfk/scanclient
## ✒️ 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
```
yarn
yarn && cd app && yarn && cd ..
```
# Run your app
## WebApp Development
```
yarn electron-dev
yarn dev
/
yarn dev --open
```
# Package Your App
## Run in electron
```
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, dialog } = require('electron');
const { app, BrowserWindow } = require('electron');
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() {
// Create the browser window.
mainWindow = new BrowserWindow({
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
},
// 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();
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.on('ready', createWindow);
app.whenReady().then(() => {
createWindow();
// Quit when all windows are closed.
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() {
// 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() {
// 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 (mainWindow === null) createWindow();
});
// 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.

View File

@ -1,40 +1,44 @@
{
"name": "@lfk/scanclient",
"version": "0.0.1",
"description": "LfK! Scanclient",
"version": "0.0.0",
"description": "minimal electron application",
"main": "main.js",
"build": {
"icon": "public/favicon.png",
"productName": "LfK!Scan",
"files": [ "public/**/*", "main.js" ],
"win": {},
"linux": {},
"mac": {}
},
"scripts": {
"build": "rollup -c",
"dev": "rollup -c -w",
"start": "sirv public",
"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"
"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": {
"@rollup/plugin-commonjs": "^14.0.0",
"@rollup/plugin-node-resolve": "^8.0.0",
"concurrently": "^5.3.0",
"electron": "^9.2.1",
"electron-builder": "^22.8.0",
"rollup": "^2.3.4",
"rollup-plugin-livereload": "^1.0.0",
"rollup-plugin-svelte": "^5.0.3",
"rollup-plugin-terser": "^6.0.0",
"sirv-cli": "^1.0.0",
"svelte": "^3.0.0",
"wait-on": "^5.2.0"
"@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-zip",
"platforms": [ "darwin" ],
"config": {
"name": "lfk__scanclient"
}
},
{
"name": "@electron-forge/maker-deb",
"config": {}
},
{
"name": "@electron-forge/maker-rpm",
"config": {}
}
]
}
}
}