Pārlūkot izejas kodu

einstellungen neu plus pdf wip

hmt 4 gadi atpakaļ
vecāks
revīzija
e6834088bc

+ 1 - 1
rollup.config.js

@@ -23,7 +23,7 @@ export default [
           css.write("build/bundle.css");
         },
         onwarn: (warning, handler) => {
-          if (warning.code === 'a11y-label-has-associated-control') return;
+          // if (warning.code === 'a11y-label-has-associated-control') return;
           handler(warning);
         }
       }),

+ 46 - 16
src/components/Einstellungen.svelte

@@ -88,29 +88,29 @@
 <div class="box">
   <h3 class="title">Scan-Prefix</h3>
   <div class="field">
+    <div class="control">
     <label class="label">
       Scan-Prefix muss im Scanner einprogrammiert werden
-    </label>
-    <div class="control">
       <input class="input" type="text" bind:value={$configData.scan_prefix} />
+    </label>
     </div>
   </div>
 </div>
 <div class="box">
   <h3 class="title">Schüler, Kurse und Zugehörigkeiten importieren</h3>
   <div class="field">
+    <div class="control">
     <label class="label">
       Achtung, die Nutzerdatenbank wird komplett geleert und mit den neuen Daten
       ersetzt. Ausgenommen sind säumige Nutzer und sonstige Nutzer.
-    </label>
-    <div class="control">
       <textarea
-        class="textarea"
-        bind:value={datensatz_schueler}
-        placeholder="Füge Daten mit Kopfzeile ein:
-        id|name|vorname|jahr|klasse|kurs|kurs_lehrer"
-        rows="10"
-        cols="20" />
+      class="textarea"
+      bind:value={datensatz_schueler}
+      placeholder="Füge Daten mit Kopfzeile ein:
+      id|name|vorname|jahr|klasse|kurs|kurs_lehrer"
+      rows="10"
+      cols="20" />
+    </label>
     </div>
   </div>
   <div class="field is-grouped">
@@ -163,14 +163,16 @@
 <div class="box">
   <h3 class="title">Medien importieren</h3>
   <div class="field">
-    <label class="label">Medientitel importieren</label>
     <div class="control">
+    <label class="label">
+      Medientitel importieren
       <textarea
-        class="textarea"
-        bind:value={datensatz_medien}
-        placeholder="Je ein Titel pro Zeile"
-        rows="10"
-        cols="20" />
+      class="textarea"
+      bind:value={datensatz_medien}
+      placeholder="Je ein Titel pro Zeile"
+      rows="10"
+      cols="20" />
+    </label>
     </div>
   </div>
   <div class="field is-grouped">
@@ -181,3 +183,31 @@
     </div>
   </div>
 </div>
+
+<div class="box">
+  <h3 class="title">Druckeinstellungen</h3>
+  <p class="mb-4">Ein Drucker muss als Standarddrucker eingestellt sein, damit der Druck aus Bangbib heraus funktioniert.
+  <br>Darüber hinaus lässt sich festlegen, wie nach einer Gruppenausleihe verfahren wird.</p>
+  <div class="field">
+    <label class="checkbox">
+      <input type="checkbox" bind:checked={$configData.gruppe_print_dialog}>
+      Druckdialog sofort zeigen
+    </label>
+  </div>
+  <div class="field">
+    <label class="checkbox">
+      <input type="checkbox" bind:checked={$configData.gruppe_auto_pdf}>
+      Automatisch als PDF ablegen
+    </label>
+    <p class="help">Diese Einstellung erstellt ein PDF in der Form <code>Jahrgang_Kurs_Datum_Zeit.pdf</code> im lokalen Dokumentenordner</p>
+  </div>
+  <div class="field">
+    <p class="control">
+      <label class="label">PDF-Verzeichnis
+        <input class="input"
+                type="text"
+                bind:value={$configData.pdf_verzeichnis}>
+      </label>
+    </p>
+  </div>
+</div>

+ 8 - 6
src/components/Medien.svelte

@@ -110,14 +110,16 @@
     </button>
     {#if add}
       <div class="field">
-        <label class="label">Medien-Titel</label>
         <div class="control">
+        <label class="label">
+          Medien-Titel
           <input
-            class="input"
-            type="text"
-            bind:value={neuer_titel}
-            use:focus
-            on:keydown={e => e.key === 'Enter' && add_medienbezeichnung()} />
+          class="input"
+          type="text"
+          bind:value={neuer_titel}
+          use:focus
+          on:keydown={e => e.key === 'Enter' && add_medienbezeichnung()} />
+        </label>
         </div>
       </div>
     {/if}

+ 4 - 2
src/components/Medium.svelte

@@ -43,13 +43,15 @@ console.log('Medium')
   <div class="modal-content">
     <div class="box">
       <div class="field">
-        <label class="label">Medien-Titel</label>
         <div class="control">
-          <input
+        <label class="label">
+          Medien-Titel
+            <input
             class="input"
             type="text"
             bind:value={medium[0].medien_name}
             on:keydown={e => e.key === 'Enter' && edit()} />
+          </label>
         </div>
       </div>
       {#if yes}

+ 11 - 2
src/components/Print.svelte

@@ -1,5 +1,5 @@
 <script>
-  import { schueler, medien, titel, print } from "./../stores.js";
+  import { schueler, medien, titel, print, configData } from "./../stores.js";
   import { ipcRenderer } from 'electron'
   import PrintKurs from './Print/Kurs.svelte'
   import PrintSchueler from './Print/Schueler.svelte'
@@ -7,13 +7,22 @@
 
   let c
 
-  ipcRenderer.on('asynchronous-reply', (event, arg) => {
+  ipcRenderer.on('pdf-reply', (event, arg) => {
+    console.log('PDF: ', arg)
+  })
+  ipcRenderer.on('print-reply', (event, arg) => {
     console.log('Print: ', arg)
   })
 
   function handle_keydown(event) {
     if (event.key === "Escape") $print = false;
     if (event.key === 'p') ipcRenderer.send('print', 'print')
+    if (event.key === 's') ipcRenderer.send('pdf', "test_case.pdf")
+  }
+
+  async function loader (file) {
+    const component = import(`./Print/${file}.svelte`)
+    return component
   }
 
   $: if ($print.name === 'Schueler') c = PrintSchueler

+ 16 - 13
src/components/Scanner.svelte

@@ -21,15 +21,15 @@
     medium_selected;
 
   function handle_keydown(event) {
+    if (registrieren) {
+      (event.key === 'Escape') && (registrieren = false)
+      return
+    }
     if (event.key === 'Escape') {
       barcode = ''
       barcode_manuell = !barcode_manuell
     }
     if (barcode_manuell) return
-    if (registrieren) {
-      (event.key === 'Escape') && (registrieren = false)
-      return
-    }
     const currentTime = Date.now();
     if (currentTime - lastKeyTime > 1000) buffer = [];
     if (event.key === 'Enter' && !buffer.length) return
@@ -126,14 +126,16 @@
     <div class="modal-content">
       <div class="box">
         <div class="field">
-          <label class="label">Barcode eingeben</label>
           <div class="control">
+          <label class="label">
+            Barcode eingeben
             <input
-              class="input"
-              type="text"
-              bind:value={barcode}
-              use:focus
-              on:keydown={e => {if (e.key === 'Enter') { barcode_manuell=false; scan()}}} />
+            class="input"
+            type="text"
+            bind:value={barcode}
+            use:focus
+            on:keydown={e => {if (e.key === 'Enter') { barcode_manuell=false; scan()}}} />
+          </label>
           </div>
         </div>
       </div>
@@ -150,11 +152,11 @@
         <pre>{barcode}</pre>
         <hr />
         {#if medium.length}
-          <label class="label">Das gehört zu</label>
+          <label class="label" for="auswahl">Das gehört zu</label>
           <div class="field has-addons">
             <div class="control is-expanded">
               <div class="select is-fullwidth">
-                <select bind:value={medium_selected}>
+                <select bind:value={medium_selected} id="auswahl">
                   <option>– nichts ausgewählt –</option>
                   {#each medium as m}
                     <option value={m.id}>{m.name}</option>
@@ -171,10 +173,11 @@
             </div>
           </div>
         {/if}
-        <label class="label">Neu anlegen unter</label>
+        <label class="label" for="neuwahl">Neu anlegen unter</label>
         <div class="field has-addons">
           <div class="control is-expanded">
             <input
+              id="neuwahl"
               class="input is-fullwidth"
               type="text"
               bind:value={neuer_titel}

+ 4 - 2
src/components/Schueler.svelte

@@ -88,13 +88,15 @@
   <button class="button" class:is-warning={s.gesperrt} class:is-success={!s.gesperrt} on:click={()=>suspend_schueler()}>Nutzer {s.gesperrt ? 'ent':''}sperren</button>
 </div>
 <div class="field">
-  <label class="label">Memo</label>
   <div class="control">
-    <input
+  <label class="label">
+    Memo
+      <input
       class="input"
       type="text"
       bind:value={s.memo}
       on:keydown={e => e.key === 'Enter' && edit_memo()} />
+    </label>
   </div>
 </div>
 

+ 52 - 18
src/main.js

@@ -1,24 +1,19 @@
-import { join } from 'path'
 import url from 'url'
 import { app, BrowserWindow, ipcMain } from 'electron'
 import { is } from 'electron-util'
-import Store from 'electron-store'
-
-const configFile = new Store({
-  defaults: {
-    windowBounds: {
-      main: { width: 1800, height: 800 }
-    },
-    scan_prefix: ''
-  }
-});
-const configData = configFile.store
+import { join, dirname } from "path";
+import { writeFile, existsSync, mkdirSync } from "fs";
+import configData from './configstore'
 
 let mainWindow
 
+if (!configData.get('pdf_verzeichnis')) {
+  configData.set('pdf_verzeichnis', join(app.getPath('documents'), app.getName(), 'Kurslisten'))
+}
+
 function createWindow() {
   mainWindow = new BrowserWindow({
-    ...configData.windowBounds.main,
+    ...configData.get('windowBounds.main'),
     show: false,
     useContentSize: true,
     defaultEncoding: 'utf-8',
@@ -38,12 +33,12 @@ function createWindow() {
   if (is.development || process.argv.some(a => a === '--devtools')) mainWindow.openDevTools()
 
   mainWindow.on('close', e => {
-    if (!configData.close) {
+    if (!configData.get('close')) {
       e.preventDefault()
-      configFile.set('windowBounds.main', mainWindow.getBounds())
+      configData.set('windowBounds.main', mainWindow.getBounds())
       mainWindow.webContents.send('close_db')
       console.log('Konfigurationsdaten gespeichert, Datenbank geschlossen')
-      configData.close = true
+      configData.set('close', true)
       mainWindow.close()
     }
   })
@@ -65,6 +60,45 @@ ipcMain.on('print', (event, arg) => {
     margins: 'none'
   }
   mainWindow.webContents.print(options, (success, errorType) => {
-    event.reply('asynchronous-reply', success)
+    event.reply('print-reply', success)
   })
-})
+})
+
+function ensureDirectoryExistence(filePath) {
+  const dir = dirname(filePath);
+  if (existsSync(dir)) {
+    return true;
+  }
+  ensureDirectoryExistence(dir);
+  try {
+    mkdirSync(dir);
+  } catch (e) {
+    console.log(
+      `Verzeichnis ${dir} konnte nicht erstellt werden: `,
+      e.message
+    );
+  }
+}
+
+ipcMain.on('pdf', async (event, pdf_name) => {
+  const pdf_path = join(configData.get('pdf_verzeichnis'), pdf_name);
+  const options = {
+    marginsType: 1,
+  };
+  try {
+    const data = await mainWindow.webContents.printToPDF(options);
+    ensureDirectoryExistence(pdf_path);
+    writeFile(pdf_path, data, error => {
+      if (error) throw error;
+      console.log(pdf_path, 'erfolgreich gesichert')
+      event.reply('pdf-reply', true)
+    });
+    return true
+  } catch (e) {
+    console.log(
+      `PDF konnte nicht geschrieben werden: `,
+      e.message
+    );
+    event.reply('pdf-reply', false)
+  }
+});