Преглед изворни кода

einstellungen neu plus pdf wip

hmt пре 4 година
родитељ
комит
e6834088bc

+ 1 - 1
rollup.config.js

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

+ 46 - 16
src/components/Einstellungen.svelte

@@ -88,29 +88,29 @@
 <div class="box">
 <div class="box">
   <h3 class="title">Scan-Prefix</h3>
   <h3 class="title">Scan-Prefix</h3>
   <div class="field">
   <div class="field">
+    <div class="control">
     <label class="label">
     <label class="label">
       Scan-Prefix muss im Scanner einprogrammiert werden
       Scan-Prefix muss im Scanner einprogrammiert werden
-    </label>
-    <div class="control">
       <input class="input" type="text" bind:value={$configData.scan_prefix} />
       <input class="input" type="text" bind:value={$configData.scan_prefix} />
+    </label>
     </div>
     </div>
   </div>
   </div>
 </div>
 </div>
 <div class="box">
 <div class="box">
   <h3 class="title">Schüler, Kurse und Zugehörigkeiten importieren</h3>
   <h3 class="title">Schüler, Kurse und Zugehörigkeiten importieren</h3>
   <div class="field">
   <div class="field">
+    <div class="control">
     <label class="label">
     <label class="label">
       Achtung, die Nutzerdatenbank wird komplett geleert und mit den neuen Daten
       Achtung, die Nutzerdatenbank wird komplett geleert und mit den neuen Daten
       ersetzt. Ausgenommen sind säumige Nutzer und sonstige Nutzer.
       ersetzt. Ausgenommen sind säumige Nutzer und sonstige Nutzer.
-    </label>
-    <div class="control">
       <textarea
       <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>
   </div>
   <div class="field is-grouped">
   <div class="field is-grouped">
@@ -163,14 +163,16 @@
 <div class="box">
 <div class="box">
   <h3 class="title">Medien importieren</h3>
   <h3 class="title">Medien importieren</h3>
   <div class="field">
   <div class="field">
-    <label class="label">Medientitel importieren</label>
     <div class="control">
     <div class="control">
+    <label class="label">
+      Medientitel importieren
       <textarea
       <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>
   </div>
   <div class="field is-grouped">
   <div class="field is-grouped">
@@ -181,3 +183,31 @@
     </div>
     </div>
   </div>
   </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>
     </button>
     {#if add}
     {#if add}
       <div class="field">
       <div class="field">
-        <label class="label">Medien-Titel</label>
         <div class="control">
         <div class="control">
+        <label class="label">
+          Medien-Titel
           <input
           <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>
       </div>
       </div>
     {/if}
     {/if}

+ 4 - 2
src/components/Medium.svelte

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

+ 11 - 2
src/components/Print.svelte

@@ -1,5 +1,5 @@
 <script>
 <script>
-  import { schueler, medien, titel, print } from "./../stores.js";
+  import { schueler, medien, titel, print, configData } from "./../stores.js";
   import { ipcRenderer } from 'electron'
   import { ipcRenderer } from 'electron'
   import PrintKurs from './Print/Kurs.svelte'
   import PrintKurs from './Print/Kurs.svelte'
   import PrintSchueler from './Print/Schueler.svelte'
   import PrintSchueler from './Print/Schueler.svelte'
@@ -7,13 +7,22 @@
 
 
   let c
   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)
     console.log('Print: ', arg)
   })
   })
 
 
   function handle_keydown(event) {
   function handle_keydown(event) {
     if (event.key === "Escape") $print = false;
     if (event.key === "Escape") $print = false;
     if (event.key === 'p') ipcRenderer.send('print', 'print')
     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
   $: if ($print.name === 'Schueler') c = PrintSchueler

+ 16 - 13
src/components/Scanner.svelte

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

+ 52 - 18
src/main.js

@@ -1,24 +1,19 @@
-import { join } from 'path'
 import url from 'url'
 import url from 'url'
 import { app, BrowserWindow, ipcMain } from 'electron'
 import { app, BrowserWindow, ipcMain } from 'electron'
 import { is } from 'electron-util'
 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
 let mainWindow
 
 
+if (!configData.get('pdf_verzeichnis')) {
+  configData.set('pdf_verzeichnis', join(app.getPath('documents'), app.getName(), 'Kurslisten'))
+}
+
 function createWindow() {
 function createWindow() {
   mainWindow = new BrowserWindow({
   mainWindow = new BrowserWindow({
-    ...configData.windowBounds.main,
+    ...configData.get('windowBounds.main'),
     show: false,
     show: false,
     useContentSize: true,
     useContentSize: true,
     defaultEncoding: 'utf-8',
     defaultEncoding: 'utf-8',
@@ -38,12 +33,12 @@ function createWindow() {
   if (is.development || process.argv.some(a => a === '--devtools')) mainWindow.openDevTools()
   if (is.development || process.argv.some(a => a === '--devtools')) mainWindow.openDevTools()
 
 
   mainWindow.on('close', e => {
   mainWindow.on('close', e => {
-    if (!configData.close) {
+    if (!configData.get('close')) {
       e.preventDefault()
       e.preventDefault()
-      configFile.set('windowBounds.main', mainWindow.getBounds())
+      configData.set('windowBounds.main', mainWindow.getBounds())
       mainWindow.webContents.send('close_db')
       mainWindow.webContents.send('close_db')
       console.log('Konfigurationsdaten gespeichert, Datenbank geschlossen')
       console.log('Konfigurationsdaten gespeichert, Datenbank geschlossen')
-      configData.close = true
+      configData.set('close', true)
       mainWindow.close()
       mainWindow.close()
     }
     }
   })
   })
@@ -65,6 +60,45 @@ ipcMain.on('print', (event, arg) => {
     margins: 'none'
     margins: 'none'
   }
   }
   mainWindow.webContents.print(options, (success, errorType) => {
   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)
+  }
+});