Browse Source

- Whitelist
- Statistik in Fehlerbericht-Modal

Robert Bedner 9 years ago
parent
commit
5fb4197247
9 changed files with 505 additions and 313 deletions
  1. 184 132
      .idea/workspace.xml
  2. 33 1
      app/db.php
  3. 28 6
      app/import.php
  4. 1 0
      app/index.html
  5. 3 57
      app/scripts/controllers/calendar.js
  6. 23 4
      app/scripts/controllers/overview.js
  7. 1 1
      app/views/config.html
  8. 206 87
      app/views/overview.html
  9. 26 25
      bower.json

+ 184 - 132
.idea/workspace.xml

@@ -23,16 +23,11 @@
   </component>
   <component name="FileEditorManager">
     <leaf>
-      <file leaf-file-name="import.php" pinned="false" current="true" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/app/import.php">
+      <file leaf-file-name="overview.js" pinned="false" current="true" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/app/scripts/controllers/overview.js">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="46" column="37" selection-start="1889" selection-end="1889" vertical-scroll-proportion="0.19894598" vertical-offset="631" max-vertical-offset="2499">
-              <folding>
-                <marker date="1432016255088" expanded="true" signature="1678:1702" placeholder="SELECT kunde..kunden..." />
-                <marker date="1432016255088" expanded="true" signature="4350:4487" placeholder="INSERT INTO ..." />
-                <marker date="1432016255088" expanded="true" signature="4564:4645" placeholder="SELECT * FRO..kunden_config..." />
-                <marker date="1432016255088" expanded="true" signature="4796:4887" placeholder="INSERT INTO ..." />
-              </folding>
+            <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="7718">
+              <folding />
             </state>
           </provider>
         </entry>
@@ -40,61 +35,76 @@
       <file leaf-file-name="db.php" pinned="false" current="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/app/db.php">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="27" column="0" selection-start="1144" selection-end="1144" vertical-scroll-proportion="-11.769231" vertical-offset="153" max-vertical-offset="2720">
+            <state line="72" column="18" selection-start="2757" selection-end="2757" vertical-scroll-proportion="9.807693" vertical-offset="1479" max-vertical-offset="3264">
               <folding>
-                <marker date="1432015321798" expanded="true" signature="653:889" placeholder="SELECT sm.*,..status_meldung..." />
-                <marker date="1432015321798" expanded="true" signature="1191:1326" placeholder="UPDATE kunde..." />
-                <marker date="1432015321798" expanded="true" signature="1590:1957" placeholder="UPDATE kunde..." />
-                <marker date="1432015321798" expanded="true" signature="1997:2017" placeholder="SELECT * FRO..kunden..." />
-                <marker date="1432015321798" expanded="true" signature="2111:2149" placeholder="SELECT kunde..kunden_config..." />
-                <marker date="1432015321798" expanded="true" signature="2460:2559" placeholder="SELECT * FRO..kunden_config..." />
-                <marker date="1432015321798" expanded="true" signature="2597:2689" placeholder="SELECT * FRO..kunden_config..." />
-                <marker date="1432015321798" expanded="true" signature="2882:2904" placeholder="SELECT * FRO..benutzer..." />
-                <marker date="1432015321798" expanded="true" signature="3137:3400" placeholder="INSERT INTO ..." />
-                <marker date="1432015321798" expanded="true" signature="3521:3753" placeholder="INSERT INTO ..." />
-                <marker date="1432015321798" expanded="true" signature="3818:3987" placeholder="UPDATE statu..." />
-                <marker date="1432015321798" expanded="true" signature="4026:4246" placeholder="UPDATE statu..." />
-                <marker date="1432015321798" expanded="true" signature="4280:4406" placeholder="SELECT * FRO..status_kommentar..." />
-                <marker date="1432015321798" expanded="true" signature="4812:5813" placeholder="SELECT a.dat..arbeitstage..." />
+                <marker date="1434708333291" expanded="true" signature="653:946" placeholder="SELECT sm.*,..status_meldung..." />
+                <marker date="1434708333291" expanded="true" signature="1329:1464" placeholder="UPDATE kunde..." />
+                <marker date="1434708333291" expanded="true" signature="1638:1695" placeholder="SELECT * FRO..kunden..." />
+                <marker date="1434708333291" expanded="true" signature="1651:1695" placeholder="UPDATE kunde..." />
+                <marker date="1434708333291" expanded="true" signature="2472:2584" placeholder="UPDATE kunde..." />
+                <marker date="1434708333291" expanded="true" signature="2472:2503" placeholder="UPDATE kunde..." />
+                <marker date="1434708333291" expanded="true" signature="2871:3238" placeholder="UPDATE kunde..." />
+                <marker date="1434708333291" expanded="true" signature="3278:3298" placeholder="SELECT * FRO..kunden..." />
+                <marker date="1434708333291" expanded="true" signature="3392:3430" placeholder="SELECT kunde..kunden_config..." />
+                <marker date="1434708333291" expanded="true" signature="3741:3840" placeholder="SELECT * FRO..kunden_config..." />
+                <marker date="1434708333291" expanded="true" signature="3878:3970" placeholder="SELECT * FRO..kunden_config..." />
+                <marker date="1434708333291" expanded="true" signature="4163:4185" placeholder="SELECT * FRO..benutzer..." />
+                <marker date="1434708333291" expanded="true" signature="4418:4681" placeholder="INSERT INTO ..." />
+                <marker date="1434708333291" expanded="true" signature="4802:5034" placeholder="INSERT INTO ..." />
+                <marker date="1434708333291" expanded="true" signature="5099:5268" placeholder="UPDATE statu..." />
+                <marker date="1434708333291" expanded="true" signature="5307:5527" placeholder="UPDATE statu..." />
+                <marker date="1434708333291" expanded="true" signature="5561:5687" placeholder="SELECT * FRO..status_kommentar..." />
+                <marker date="1434708333291" expanded="true" signature="6093:7094" placeholder="SELECT a.dat..arbeitstage..." />
               </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="main.html" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/app/views/main.html">
+      <file leaf-file-name="overview.html" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/app/views/overview.html">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="12" column="20" selection-start="649" selection-end="657" vertical-scroll-proportion="-0.65384614" vertical-offset="187" max-vertical-offset="1173">
-              <folding />
+            <state line="314" column="72" selection-start="18000" selection-end="18000" vertical-scroll-proportion="1.0" vertical-offset="5364" max-vertical-offset="9401">
+              <folding>
+                <element signature="n#style#0;n#th#0;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+                <element signature="n#style#0;n#th#1;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+                <element signature="n#style#0;n#th#2;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+                <element signature="n#style#0;n#th#3;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+                <element signature="n#style#0;n#th#4;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+                <element signature="n#style#0;n#div#0;n#div#3;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+                <element signature="n#style#0;n#div#0;n#div#1;n#div#3;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="overview.html" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/app/views/overview.html">
+      <file leaf-file-name="import.php" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/app/import.php">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="-0.0" vertical-offset="0" max-vertical-offset="7378">
-              <folding />
+            <state line="52" column="5" selection-start="2490" selection-end="2490" vertical-scroll-proportion="-11.333333" vertical-offset="306" max-vertical-offset="2873">
+              <folding>
+                <marker date="1434708601228" expanded="true" signature="2565:2600" placeholder="SELECT kunde..kunden..." />
+                <marker date="1434708601228" expanded="true" signature="5382:5519" placeholder="INSERT INTO ..." />
+                <marker date="1434708601228" expanded="true" signature="5594:5675" placeholder="SELECT * FRO..kunden_config..." />
+                <marker date="1434708601228" expanded="true" signature="5826:5917" placeholder="INSERT INTO ..." />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="main.css" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/app/styles/main.css">
+      <file leaf-file-name="calendar.js" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/app/scripts/controllers/calendar.js">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="79" column="0" selection-start="1411" selection-end="1411" vertical-scroll-proportion="0.0" vertical-offset="660" max-vertical-offset="1445">
+            <state line="16" column="58" selection-start="530" selection-end="530" vertical-scroll-proportion="0.0" vertical-offset="272" max-vertical-offset="442">
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="index.html" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/app/index.html">
+      <file leaf-file-name="config.html" pinned="false" current="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/app/views/config.html">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="77" column="38" selection-start="2050" selection-end="2050" vertical-scroll-proportion="-22.0" vertical-offset="737" max-vertical-offset="2890">
-              <folding>
-                <marker date="1431936960583" expanded="true" signature="2155:2308" placeholder="..." />
-              </folding>
+            <state line="32" column="45" selection-start="1401" selection-end="1401" vertical-scroll-proportion="0.0" vertical-offset="544" max-vertical-offset="850">
+              <folding />
             </state>
           </provider>
         </entry>
@@ -120,20 +130,20 @@
         <option value="$USER_HOME$/Desktop/Tasks_Test/config/info/info.json" />
         <option value="D:/Downloads/fehlerbericht.json" />
         <option value="D:/Downloads/info.json" />
-        <option value="$PROJECT_DIR$/app/scripts/controllers/calendar.js" />
         <option value="$USER_HOME$/Desktop/Tasks_Test/config/GAPS_Vers.xml" />
-        <option value="$PROJECT_DIR$/app/views/config.html" />
         <option value="$PROJECT_DIR$/app/views/customers.html" />
         <option value="$PROJECT_DIR$/app/scripts/controllers/config.js" />
         <option value="$PROJECT_DIR$/app/scripts/controllers/customers.js" />
         <option value="$PROJECT_DIR$/app/scripts/controllers/stats.js" />
         <option value="$PROJECT_DIR$/app/views/stats.html" />
         <option value="$PROJECT_DIR$/app/scripts/app.js" />
-        <option value="$PROJECT_DIR$/app/scripts/controllers/overview.js" />
-        <option value="$PROJECT_DIR$/app/views/overview.html" />
         <option value="$PROJECT_DIR$/app/index.html" />
+        <option value="$PROJECT_DIR$/app/views/config.html" />
+        <option value="$PROJECT_DIR$/app/scripts/controllers/calendar.js" />
+        <option value="$PROJECT_DIR$/app/scripts/controllers/overview.js" />
         <option value="$PROJECT_DIR$/app/db.php" />
         <option value="$PROJECT_DIR$/app/import.php" />
+        <option value="$PROJECT_DIR$/app/views/overview.html" />
       </list>
     </option>
   </component>
@@ -152,7 +162,7 @@
   </component>
   <component name="ProjectFrameBounds">
     <option name="x" value="1912" />
-    <option name="y" value="316" />
+    <option name="y" value="-8" />
     <option name="width" value="1936" />
     <option name="height" value="1216" />
   </component>
@@ -198,7 +208,6 @@
       <sortByType />
     </navigator>
     <panes>
-      <pane id="Scope" />
       <pane id="ProjectPane">
         <subPane>
           <PATH>
@@ -307,8 +316,27 @@
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
           </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="Fehlerbericht" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="Fehlerbericht" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="app" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="bower_components" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
         </subPane>
       </pane>
+      <pane id="Scope" />
     </panes>
   </component>
   <component name="PropertiesComponent">
@@ -405,18 +433,18 @@
     <servers />
   </component>
   <component name="ToolWindowManager">
-    <frame x="1912" y="316" width="1936" height="1216" extended-state="0" />
+    <frame x="1912" y="-8" width="1936" height="1216" extended-state="6" />
     <editor active="true" />
     <layout>
       <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
-      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.26805055" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.16696751" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
       <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.13697916" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.15208334" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
       <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
-      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.26805055" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.16696751" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
       <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32911393" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
       <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
@@ -448,17 +476,21 @@
   <component name="editorHistoryManager">
     <entry file="file://$PROJECT_DIR$/app/index.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="64" column="41" selection-start="2338" selection-end="2338" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="2040">
-          <folding>
-            <marker date="1431936960583" expanded="true" signature="2155:2308" placeholder="..." />
-          </folding>
-        </state>
+        <state line="64" column="41" selection-start="2338" selection-end="2338" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="2040" />
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/app/views/overview.html">
       <provider selected="true" editor-type-id="text-editor">
         <state line="6" column="0" selection-start="483" selection-end="483" vertical-scroll-proportion="0.0" vertical-offset="102" max-vertical-offset="255">
-          <folding />
+          <folding>
+            <element signature="n#style#0;n#th#0;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#1;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#2;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#3;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#4;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#div#0;n#div#3;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#div#0;n#div#1;n#div#3;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
@@ -484,17 +516,21 @@
     </entry>
     <entry file="file://$PROJECT_DIR$/app/index.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="64" column="41" selection-start="2336" selection-end="2336" vertical-scroll-proportion="0.0" vertical-offset="923" max-vertical-offset="2023">
-          <folding>
-            <marker date="1431936960583" expanded="true" signature="2155:2308" placeholder="..." />
-          </folding>
-        </state>
+        <state line="64" column="41" selection-start="2336" selection-end="2336" vertical-scroll-proportion="0.0" vertical-offset="923" max-vertical-offset="2023" />
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/app/views/overview.html">
       <provider selected="true" editor-type-id="text-editor">
         <state line="9" column="0" selection-start="492" selection-end="492" vertical-scroll-proportion="0.0" vertical-offset="153" max-vertical-offset="255">
-          <folding />
+          <folding>
+            <element signature="n#style#0;n#th#0;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#1;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#2;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#3;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#4;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#div#0;n#div#3;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#div#0;n#div#1;n#div#3;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
@@ -520,17 +556,21 @@
     </entry>
     <entry file="file://$PROJECT_DIR$/app/index.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="64" column="41" selection-start="2336" selection-end="2336" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="2023">
-          <folding>
-            <marker date="1431936960583" expanded="true" signature="2155:2308" placeholder="..." />
-          </folding>
-        </state>
+        <state line="64" column="41" selection-start="2336" selection-end="2336" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="2023" />
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/app/views/overview.html">
       <provider selected="true" editor-type-id="text-editor">
         <state line="9" column="0" selection-start="492" selection-end="492" vertical-scroll-proportion="0.0" vertical-offset="153" max-vertical-offset="255">
-          <folding />
+          <folding>
+            <element signature="n#style#0;n#th#0;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#1;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#2;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#3;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#4;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#div#0;n#div#3;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#div#0;n#div#1;n#div#3;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
@@ -589,11 +629,6 @@
         <state line="22" column="50" selection-start="642" selection-end="642" vertical-scroll-proportion="0.0" vertical-offset="164" max-vertical-offset="748" />
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/app/views/calendar.html">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="0" column="20" selection-start="20" selection-end="20" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="584" />
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/app/bower_components/fullcalendar/bower.json">
       <provider selected="true" editor-type-id="text-editor">
         <state line="2" column="19" selection-start="42" selection-end="47" vertical-scroll-proportion="-1.3076923" vertical-offset="0" max-vertical-offset="731" />
@@ -614,11 +649,6 @@
         <state line="28050" column="6" selection-start="819398" selection-end="819398" vertical-scroll-proportion="-6.1153846" vertical-offset="476691" max-vertical-offset="477275" />
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/app/scripts/controllers/calendar.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="18" column="49" selection-start="611" selection-end="611" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1360" />
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/app/scripts/controllers/main.js">
       <provider selected="true" editor-type-id="text-editor">
         <state line="11" column="0" selection-start="244" selection-end="244" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="357" />
@@ -629,16 +659,6 @@
         <state line="108" column="21" selection-start="4458" selection-end="4458" vertical-scroll-proportion="2.9470305" vertical-offset="0" max-vertical-offset="2023" />
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/app/scripts/controllers/config.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="12" column="17" selection-start="350" selection-end="350" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1037" />
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/app/views/config.html">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="9" column="142" selection-start="460" selection-end="460" vertical-scroll-proportion="0.0" vertical-offset="153" max-vertical-offset="850" />
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/app/scripts/controllers/stats.js">
       <provider selected="true" editor-type-id="text-editor">
         <state line="15" column="83" selection-start="562" selection-end="562" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1139" />
@@ -664,16 +684,6 @@
         <state line="29" column="41" selection-start="948" selection-end="948" vertical-scroll-proportion="0.6192358" vertical-offset="23" max-vertical-offset="782" />
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/app/scripts/app.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="19" column="35" selection-start="552" selection-end="552" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1309" />
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/app/scripts/controllers/overview.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="254" column="26" selection-start="8217" selection-end="8217" vertical-scroll-proportion="0.0" vertical-offset="3967" max-vertical-offset="7395" />
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/app/views/stats.html">
       <provider selected="true" editor-type-id="text-editor">
         <state line="19" column="6" selection-start="668" selection-end="668" vertical-scroll-proportion="0.0" vertical-offset="323" max-vertical-offset="425" />
@@ -689,70 +699,112 @@
         <state line="17" column="27" selection-start="541" selection-end="541" vertical-scroll-proportion="0.38076416" vertical-offset="0" max-vertical-offset="759" />
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/app/views/main.html">
+    <entry file="file://$PROJECT_DIR$/app/styles/main.css">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="12" column="20" selection-start="649" selection-end="657" vertical-scroll-proportion="-0.65384614" vertical-offset="187" max-vertical-offset="1173">
-          <folding />
-        </state>
+        <state line="79" column="0" selection-start="1411" selection-end="1411" vertical-scroll-proportion="0.0" vertical-offset="660" max-vertical-offset="1445" />
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/app/styles/main.css">
+    <entry file="file://$PROJECT_DIR$/app/scripts/controllers/config.js">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="79" column="0" selection-start="1411" selection-end="1411" vertical-scroll-proportion="0.0" vertical-offset="660" max-vertical-offset="1445">
+        <state line="3" column="60" selection-start="110" selection-end="110" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1037">
           <folding />
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/app/views/main.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="12" column="20" selection-start="649" selection-end="657" vertical-scroll-proportion="-0.65384614" vertical-offset="187" max-vertical-offset="1173" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/app/views/calendar.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="0" column="20" selection-start="20" selection-end="20" vertical-scroll-proportion="-0.0" vertical-offset="0" max-vertical-offset="136" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/app/scripts/app.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="19" column="60" selection-start="577" selection-end="577" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1309" />
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/app/index.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="77" column="38" selection-start="2050" selection-end="2050" vertical-scroll-proportion="-22.0" vertical-offset="737" max-vertical-offset="2890">
-          <folding>
-            <marker date="1431936960583" expanded="true" signature="2155:2308" placeholder="..." />
-          </folding>
+        <state line="30" column="9" selection-start="1022" selection-end="1022" vertical-scroll-proportion="0.58553386" vertical-offset="0" max-vertical-offset="2890" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/app/scripts/controllers/calendar.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="16" column="58" selection-start="530" selection-end="530" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="442">
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/app/views/overview.html">
+    <entry file="file://$PROJECT_DIR$/app/views/config.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="-0.0" vertical-offset="0" max-vertical-offset="7378">
+        <state line="32" column="45" selection-start="1401" selection-end="1401" vertical-scroll-proportion="0.0" vertical-offset="544" max-vertical-offset="850">
           <folding />
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/app/import.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="52" column="5" selection-start="2490" selection-end="2490" vertical-scroll-proportion="-11.333333" vertical-offset="306" max-vertical-offset="2873">
+          <folding>
+            <marker date="1434708601228" expanded="true" signature="2565:2600" placeholder="SELECT kunde..kunden..." />
+            <marker date="1434708601228" expanded="true" signature="5382:5519" placeholder="INSERT INTO ..." />
+            <marker date="1434708601228" expanded="true" signature="5594:5675" placeholder="SELECT * FRO..kunden_config..." />
+            <marker date="1434708601228" expanded="true" signature="5826:5917" placeholder="INSERT INTO ..." />
+          </folding>
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/app/db.php">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="27" column="0" selection-start="1144" selection-end="1144" vertical-scroll-proportion="-11.769231" vertical-offset="153" max-vertical-offset="2720">
+        <state line="72" column="18" selection-start="2757" selection-end="2757" vertical-scroll-proportion="9.807693" vertical-offset="1479" max-vertical-offset="3264">
           <folding>
-            <marker date="1432015321798" expanded="true" signature="653:889" placeholder="SELECT sm.*,..status_meldung..." />
-            <marker date="1432015321798" expanded="true" signature="1191:1326" placeholder="UPDATE kunde..." />
-            <marker date="1432015321798" expanded="true" signature="1590:1957" placeholder="UPDATE kunde..." />
-            <marker date="1432015321798" expanded="true" signature="1997:2017" placeholder="SELECT * FRO..kunden..." />
-            <marker date="1432015321798" expanded="true" signature="2111:2149" placeholder="SELECT kunde..kunden_config..." />
-            <marker date="1432015321798" expanded="true" signature="2460:2559" placeholder="SELECT * FRO..kunden_config..." />
-            <marker date="1432015321798" expanded="true" signature="2597:2689" placeholder="SELECT * FRO..kunden_config..." />
-            <marker date="1432015321798" expanded="true" signature="2882:2904" placeholder="SELECT * FRO..benutzer..." />
-            <marker date="1432015321798" expanded="true" signature="3137:3400" placeholder="INSERT INTO ..." />
-            <marker date="1432015321798" expanded="true" signature="3521:3753" placeholder="INSERT INTO ..." />
-            <marker date="1432015321798" expanded="true" signature="3818:3987" placeholder="UPDATE statu..." />
-            <marker date="1432015321798" expanded="true" signature="4026:4246" placeholder="UPDATE statu..." />
-            <marker date="1432015321798" expanded="true" signature="4280:4406" placeholder="SELECT * FRO..status_kommentar..." />
-            <marker date="1432015321798" expanded="true" signature="4812:5813" placeholder="SELECT a.dat..arbeitstage..." />
+            <marker date="1434708333291" expanded="true" signature="653:946" placeholder="SELECT sm.*,..status_meldung..." />
+            <marker date="1434708333291" expanded="true" signature="1329:1464" placeholder="UPDATE kunde..." />
+            <marker date="1434708333291" expanded="true" signature="1638:1695" placeholder="SELECT * FRO..kunden..." />
+            <marker date="1434708333291" expanded="true" signature="1651:1695" placeholder="UPDATE kunde..." />
+            <marker date="1434708333291" expanded="true" signature="2472:2584" placeholder="UPDATE kunde..." />
+            <marker date="1434708333291" expanded="true" signature="2472:2503" placeholder="UPDATE kunde..." />
+            <marker date="1434708333291" expanded="true" signature="2871:3238" placeholder="UPDATE kunde..." />
+            <marker date="1434708333291" expanded="true" signature="3278:3298" placeholder="SELECT * FRO..kunden..." />
+            <marker date="1434708333291" expanded="true" signature="3392:3430" placeholder="SELECT kunde..kunden_config..." />
+            <marker date="1434708333291" expanded="true" signature="3741:3840" placeholder="SELECT * FRO..kunden_config..." />
+            <marker date="1434708333291" expanded="true" signature="3878:3970" placeholder="SELECT * FRO..kunden_config..." />
+            <marker date="1434708333291" expanded="true" signature="4163:4185" placeholder="SELECT * FRO..benutzer..." />
+            <marker date="1434708333291" expanded="true" signature="4418:4681" placeholder="INSERT INTO ..." />
+            <marker date="1434708333291" expanded="true" signature="4802:5034" placeholder="INSERT INTO ..." />
+            <marker date="1434708333291" expanded="true" signature="5099:5268" placeholder="UPDATE statu..." />
+            <marker date="1434708333291" expanded="true" signature="5307:5527" placeholder="UPDATE statu..." />
+            <marker date="1434708333291" expanded="true" signature="5561:5687" placeholder="SELECT * FRO..status_kommentar..." />
+            <marker date="1434708333291" expanded="true" signature="6093:7094" placeholder="SELECT a.dat..arbeitstage..." />
           </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/app/import.php">
+    <entry file="file://$PROJECT_DIR$/app/views/overview.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="46" column="37" selection-start="1889" selection-end="1889" vertical-scroll-proportion="0.19894598" vertical-offset="631" max-vertical-offset="2499">
+        <state line="314" column="72" selection-start="18000" selection-end="18000" vertical-scroll-proportion="1.0" vertical-offset="5364" max-vertical-offset="9401">
           <folding>
-            <marker date="1432016255088" expanded="true" signature="1678:1702" placeholder="SELECT kunde..kunden..." />
-            <marker date="1432016255088" expanded="true" signature="4350:4487" placeholder="INSERT INTO ..." />
-            <marker date="1432016255088" expanded="true" signature="4564:4645" placeholder="SELECT * FRO..kunden_config..." />
-            <marker date="1432016255088" expanded="true" signature="4796:4887" placeholder="INSERT INTO ..." />
+            <element signature="n#style#0;n#th#0;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#1;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#2;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#3;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#th#4;n#tr#0;n#table#2;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#div#0;n#div#3;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#div#0;n#div#1;n#div#3;n#div#1;n#div#0;n#div#0;n#div#2;n#!!top" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/app/scripts/controllers/overview.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="7718">
+          <folding />
+        </state>
+      </provider>
+    </entry>
   </component>
 </project>
 

+ 33 - 1
app/db.php

@@ -19,12 +19,14 @@ switch ($_REQUEST['a']) {
 		if (count($data) > 0) {
 
 		} else {
-			$q = $dbh->query("SELECT sm.*, ifnull(sk.benutzer, '') as benutzer FROM status_meldung sm
+			$q = $dbh->query("SELECT sm.*, ifnull(sk.benutzer, '') as benutzer, k.whitelist FROM status_meldung sm
+			 				  INNER JOIN kunden k USING (kunde)
 			 				  LEFT JOIN status_kommentar sk USING (datum, kunde, start)
 							  WHERE sm.datum = '{$datum}' AND sm.kunde = '{$kunde}' AND sm.start = '{$start}' LIMIT 1");
 			$result = $q->fetch(PDO::FETCH_ASSOC);
 			$result['fehlerbericht'] = str_replace("\r\`", "`", str_replace("\r\"", "\"", str_replace("\r\n", "", $result['fehlerbericht'])));
 			$result['fehlerbericht'] = json_decode($result['fehlerbericht'], true);
+			$result['whitelist'] = json_decode(stripslashes($result['whitelist']), true);
 		}
 		break;
 
@@ -38,6 +40,36 @@ switch ($_REQUEST['a']) {
 		}
 		break;
 
+	case 'whitelist':
+		$q = $dbh->query("SELECT * FROM kunden WHERE kunde = '{$_REQUEST['kunde']}' ");
+		$result = $q->fetch(PDO::FETCH_ASSOC);
+		$whitelist = json_decode(stripslashes($result['whitelist']), true);
+		if (!is_array($whitelist)) {
+			$whitelist = array();
+		}
+		if ($_REQUEST['aktiv'] == "J") {
+			if (!isset($whitelist[$_REQUEST['typ']])) {
+				$whitelist[$_REQUEST['typ']] = array($_REQUEST['wert']);
+			} else if (in_array($_REQUEST['wert'], $whitelist[$_REQUEST['typ']])) {
+				$result = array('whitelist' => $whitelist);
+				break;
+			} else {
+				$whitelist[$_REQUEST['typ']][] = $_REQUEST['wert'];
+			}
+		} else {
+			if (!isset($whitelist[$_REQUEST['typ']]) || !in_array($_REQUEST['wert'], $whitelist[$_REQUEST['typ']])) break;
+			$whitelist[$_REQUEST['typ']] = array_diff($whitelist[$_REQUEST['typ']], array($_REQUEST['wert']));
+		}
+
+		$q = $dbh->exec("UPDATE kunden SET whitelist = '" . addslashes(json_encode($whitelist)) . "' WHERE kunde = '{$_REQUEST['kunde']}' ");
+		$error = $dbh->errorInfo();
+		if ($error[0] != '00000') {
+			$result = $error;
+		} else {
+			$result = array('whitelist' => $whitelist);
+		}
+		break;
+
 	case 'kunden':
 		if (count($data) > 0) {
 			foreach ($data as $kunde) {

+ 28 - 6
app/import.php

@@ -10,10 +10,16 @@ $server = "{imap.1und1.de:993/imap/ssl}INBOX";
 $user = "status@global-cube.de";
 $passwd = "gc01smtp";
 
-function fehlerberichtAufbereiten ($fehlerbericht, &$fehlerAnzahl) {
+function fehlerberichtAufbereiten ($fehlerbericht, &$fehlerAnzahl, $whitelist) {
 	$fehlerbericht = str_replace("\r\`", "`", str_replace("\r\"", "\"", str_replace("\r\n", "", $fehlerbericht)));
 	$fehlerbericht = json_decode($fehlerbericht, true);
 
+	if ($whitelist) {
+		if (!isset($whitelist['Layer'])) $whitelist['Layer'] = array();
+		if (!isset($whitelist['Report'])) $whitelist['Report'] = array();
+		if (!isset($whitelist['User'])) $whitelist['User'] = array();
+	}
+
 	foreach ($fehlerbericht as $i => $log) {
 		if (preg_match("/\.bat$/", $log['Name'])) {
 			$fehlerbericht[$i]['Errors'][0] = preg_replace("/!! Bitte E-Mailadresse fuer Statusbericht angeben !!/im", "! Bitte E-Mailadresse fuer Statusbericht angeben !", $fehlerbericht[$i]['Errors'][0]);
@@ -31,6 +37,18 @@ function fehlerberichtAufbereiten ($fehlerbericht, &$fehlerAnzahl) {
 				}
 				$fehlerAnzahl += 1;
 			}
+		} else if ($whitelist && count($fehlerbericht[$i]['Errors']) > 0 && ($fehlerbericht[$i]['Type'] == 'Versand' || $fehlerbericht[$i]['Type'] == 'Portal')) {
+			$fehlerbericht[$i]['Errors2'] = array();
+			foreach($fehlerbericht[$i]['Errors'] as $j => $e) {
+				if (in_array($e['Layer'], $whitelist['Layer']) || in_array($e['Report'], $whitelist['Report']) || in_array($e['User'], $whitelist['User'])) {
+					$fehlerbericht[$i]['Errors2'][] = $fehlerbericht[$i]['Errors'][$j];
+					unset($fehlerbericht[$i]['Errors'][$j]);
+				}
+			}
+			if (count($fehlerbericht[$i]['Errors']) == 0) {
+				$fehlerbericht[$i]['ErrorLevel'] = 3;
+				$fehlerAnzahl -= 1;
+			}
 		}
 	}
 	return addslashes(json_encode($fehlerbericht));
@@ -40,8 +58,12 @@ function fehlerberichtAufbereiten ($fehlerbericht, &$fehlerAnzahl) {
 
 
 
-$q = $dbh->query("SELECT kunde FROM kunden");
-$customers = $q->fetchAll(PDO::FETCH_COLUMN, 0);
+$q = $dbh->query("SELECT kunde, whitelist FROM kunden");
+$cust = $q->fetchAll(PDO::FETCH_ASSOC);
+$customers = array();
+foreach ($cust as $c) {
+	$customers[$c['kunde']] = json_decode(stripslashes($c['whitelist']), true);
+}
 
 $mbox = imap_open($server, $user, $passwd) or die("Could not open Mailbox - try again later!");
 $message_count = imap_num_msg($mbox);
@@ -108,7 +130,7 @@ for ($m = 1; $m <= $message_count; $m++) {
 				$info = addslashes($attachment['attachment']);
 			}
 			if ($attachment['filename'] == "fehlerbericht.json") {
-				$fehlerbericht = fehlerberichtAufbereiten($attachment['attachment'], $fehlerAnzahl);
+				$fehlerbericht = fehlerberichtAufbereiten($attachment['attachment'], $fehlerAnzahl, $customers[$rec[0]]);
 			}
 		}
 	}
@@ -123,9 +145,9 @@ for ($m = 1; $m <= $message_count; $m++) {
 		$result[] = $dbh->errorInfo();
 	}
 
-	if (!in_array($rec[0], $customers)) {
+	if (!isset($customers[$rec[0]])) {
 		$dbh->query("INSERT INTO kunden (kunde, start_soll, ende_soll, erster_status, system) VALUES ('{$rec[0]}', '{$rec[1]}', '{$rec[2]}', '{$rec[3]}', '?')");
-		array_push($customers, $rec[0]);
+		$customers[$rec[0]] = array();
 	}
 
 	if ($info) {

+ 1 - 0
app/index.html

@@ -149,6 +149,7 @@
 <script src="bower_components/fullcalendar/dist/fullcalendar.js"></script>
 <script src="bower_components/fullcalendar/dist/lang/de.js"></script>
 <script src="bower_components/underscore/underscore.js"></script>
+<script src="bower_components/Chart.js/Chart.js"></script>
 <!-- endbower -->
 <!-- endbuild -->
 

+ 3 - 57
app/scripts/controllers/calendar.js

@@ -4,72 +4,18 @@ angular.module('fehlerberichtApp')
     .controller('CalendarCtrl', function ($scope, $http) {
         var webservice = 'http://rbs06/fehlerbericht/db.php?';
 
-        $().ready(function() {
-
-            // page is now ready, initialize the calendar...
+        $().ready(function () {
 
             $('#calendar').fullCalendar({
                 'weekNumbers': true,
                 'header': {
-                    left:   'title',
+                    left: 'title',
                     center: '',
-                    right:  'month basicWeek agendaDay today prev,next'
+                    right: 'month prev,next'
                 },
                 'events': {
                     'url': webservice + 'a=liste&events=1'
                 }
-                /*
-                events: [
-                    {
-                        title: 'Reisacher (1)',
-                        start: '2014-11-01T06:03:00',
-                        color: 'yellow',
-                        textColor: 'black'
-                    },
-                    {
-                        title: 'Arndt (3)',
-                        start: '2014-11-07T09:10:00',
-                        color: 'red'
-                    },
-                    {
-                        title: 'Nauheim (2)',
-                        start: '2014-11-11T07:00:00',
-                        color: 'orange'
-                    },
-                    {
-                        title: 'Ulmen (2)',
-                        start: '2014-11-12T10:30:00',
-                        color: 'orange'
-                    },
-                    {
-                        title: 'Auto Nova (5)',
-                        start: '2014-11-12T12:00:00',
-                        color: 'darkred'
-                    },
-                    {
-                        title: 'Bunk (1)',
-                        start: '2014-11-12T14:30:00',
-                        color: 'yellow',
-                        textColor: 'black'
-                    },
-                    {
-                        title: 'Lehr (3)',
-                        start: '2014-11-12T17:30:00',
-                        color: 'red'
-                    },
-                    {
-                        title: 'Boettche (1)',
-                        start: '2014-11-12T20:00:00',
-                        color: 'yellow',
-                        textColor: 'black'
-                    },
-                    {
-                        title: 'Voss und Voss (2)',
-                        start: '2014-11-13T07:00:00',
-                        color: 'orange'
-                    }
-                ] */
             });
-
         });
     });

+ 23 - 4
app/scripts/controllers/overview.js

@@ -280,6 +280,7 @@ angular.module('fehlerberichtApp')
             $scope.current.fehler = {};
             $scope.current.details = null;
             $scope.current.fehlerdetails = null;
+            $scope.current.limit = 7;
 
             $scope.current.status = 2;
             $scope.current.kommentar = {};
@@ -295,6 +296,9 @@ angular.module('fehlerberichtApp')
                 'benutzer2': ''
             };
 
+            $http.get(webservice + 'a=liste&kunde=' + $scope.current.zeile.kunde + '&datum=').success(function (data) {
+                $scope.current.overview = data;
+            });
 
             $http.get(webservice + 'a=fehlerbericht&kunde=' + $scope.current.zeile.kunde + '&datum=' + $scope.current.zeile.datum + '&start=' + $scope.current.zeile.start).success(function (data) {
                 $scope.current.fehler = data;
@@ -326,16 +330,18 @@ angular.module('fehlerberichtApp')
 
         $scope.getComments = function (zeile) {
             if ($scope.comments[zeile.kunde]) {
+                var comments = _.filter($scope.comments[zeile.kunde], function (row) { return row.datum <= zeile.datum; });
+
                 if (zeile.fehlend === '1') {
-                    return $scope.comments[zeile.kunde];
+                    return comments;
                 }
                 if (zeile.bearbeitet === '0') {
-                    var lastErrorComments = _.filter($scope.comments[zeile.kunde], function (row) { return row.status > 0; });
+                    var lastErrorComments = _.filter(comments, function (row) { return row.status > 0; });
                     if (lastErrorComments.length > 0) {
                         return lastErrorComments;
                     }
                 }
-                var newComments = _.filter($scope.comments[zeile.kunde], function (row) { return row.datum === zeile.datum; });
+                var newComments = _.filter(comments, function (row) { return row.datum === zeile.datum; });
                 if (newComments.length > 0) {
                     return newComments;
                 }
@@ -424,7 +430,20 @@ angular.module('fehlerberichtApp')
         };
 
         $scope.editComment = function (c) {
-            c.fehler=parseInt(c.fehler, 10);
+            c.fehler = parseInt(c.fehler, 10);
             $scope.current.kommentar = c;
         };
+
+        $scope.whitelistToggle = function (key, value) {
+            var flag = (!$scope.inWhitelist(key, value)) ? "J" : "N";
+            $http.put(webservice + 'a=whitelist&kunde=' + $scope.current.zeile.kunde + '&typ=' + key + '&wert=' + value + "&aktiv=" + flag).success(function (data) {
+                if (data.whitelist !== undefined) {
+                    $scope.current.fehler.whitelist = data.whitelist;
+                }
+            });
+        };
+
+        $scope.inWhitelist = function (key, value) {
+            return $scope.current.fehler.whitelist[key] !== undefined && _.contains($scope.current.fehler.whitelist[key], value);
+        };
     });

+ 1 - 1
app/views/config.html

@@ -36,7 +36,7 @@
             </div>
         </td>
     </tr>
-    <tr ng-repeat="row in data[current.tabelle] | filter: filter[current.tabelle]">
+    <tr ng-repeat="row in data[current.tabelle] | filter: filter[current.tabelle] | limitTo: 200">
         <th>{{$index+1}}</th>
         <td ng-repeat="col in row">
             {{col}}

+ 206 - 87
app/views/overview.html

@@ -98,9 +98,6 @@
             {{timeDiffStart(zeile)}}<br/>
             {{timeDiff(zeile)}}</td>
         <td>
-            <button type="button" class="btn btn-default btn-sm" data-toggle="modal" data-target="#stats-modal" ng-click="setCurrent(zeile)" ng-show="zeile.anzahl != null">
-                <span class="glyphicon glyphicon-stats"></span>
-            </button>
             <!--<a ng-href="#/overview/{{zeile.kunde}}/all/all"><button type="button" class="btn btn-default" title="Fehlermeldungen"><span class="glyphicon glyphicon-exclamation-sign"></span></button></a>-->
             <!--<a ng-href="#/stats/{{zeile.kunde}}"><button type="button" class="btn btn-default" title="Statistik"><span class="glyphicon glyphicon-stats"></span></button></a>-->
 
@@ -140,44 +137,7 @@
 
 
             <div class="modal-body">
-
-                <table class="table table-hover table-bordered">
-                    <tr>
-                        <td>
-                            <button class="btn btn-default" ng-click="current.kommentar=current.template"><span class="glyphicon glyphicon-plus"></span></button>
-                        </td>
-                        <th style="width: 140px;">Datum</th>
-                        <th style="width: 100px;">Benutzer</th>
-                        <th style="width: 170px;">Status</th>
-                        <th style="width: 70px;">Anzahl</th>
-                        <th style="width: 340px;">Kommentar</th>
-                    </tr>
-                    <tr>
-                        <td></td>
-                        <td></td>
-                        <td></td>
-                        <td>
-                            <div class="dropdown">
-                                <a class="btn dropdown-toggle" role="button" data-toggle="dropdown">{{domain.statusfilter[current.status]||'alle'}}&nbsp;<b class="caret"></b></a>
-                                <ul class="dropdown-menu" role="menu">
-                                    <li><a ng-click="current.status=''">alle</a></li>
-                                    <li class="divider"></li>
-                                    <li ng-repeat="(key,val) in domain.statusfilter"><a ng-click="current.status=key">{{val}}</a></li>
-                                </ul>
-                            </div>
-                        </td>
-                        <td></td>
-                        <td></td>
-                    </tr>
-                    <tr ng-repeat="c in comments[current.zeile.kunde] | filter:statusFilter | orderBy: 'datum' ">
-                        <td><button class="btn btn-default" ng-click="editComment(c)"><span class="glyphicon glyphicon-pencil"></span></button></td>
-                        <td>{{dateTimeFormat(c.mdate)}}</td>
-                        <td>{{c.benutzer}}</td>
-                        <td><span class="glyphicon {{getCommentIcon(c)}}"></span> {{domain.bearbeitet[c.status]}}</td>
-                        <td><span class="label label-danger label-{{c.fehler}}"> {{c.fehler}}</span></td>
-                        <td>{{c.kommentar}}</td>
-                    </tr>
-                </table>
+                <h3>Kommentar</h3>
 
                 <table class="table table-hover table-bordered">
                     <tr>
@@ -242,6 +202,8 @@
                 </table>
 
 
+                <h3>Fehler</h3>
+
                 <div class="logdatei" ng-repeat="e in current.fehler.fehlerbericht | filter: errorLevel | orderBy: 'ErrorLevel'">
                     <a href="" onclick="$(this).next().toggle()">
                         <p class="modell" ng-class="{'rot':e.ErrorLevel < 3}">{{e.Type}}: {{e.Name}} ({{errorCount(e)}})</p>
@@ -257,32 +219,79 @@
                         <table class="ft" ng-show="e.Type=='Portal'||e.Type=='Versand'">
                             <tbody ng-repeat="error in e.Errors">
                                 <tr>
-                                    <td rowspan="5" class="number">{{$index+1}}
+                                    <td rowspan="6" class="number">{{$index+1}}
                                     <td>Datei:</td>
+                                    <td></td>
                                     <td>{{error.Filename}}</td>
                                 </tr>
                                 <tr>
                                     <td>Stand:</td>
+                                    <td></td>
                                     <td>{{error.Modified}}</td>
                                 </tr>
                                 <tr>
                                     <td>Benutzer:</td>
+                                    <td><button class="btn btn-default btn-sm" ng-show="!inWhitelist('User', error.User)" ng-click="whitelistToggle('User', error.User)"><span class="glyphicon glyphicon-ban-circle"></span></button></td>
                                     <td>{{error.User}}</td>
                                 </tr>
                                 <tr>
                                     <td>Bericht:</td>
-                                    <td>{{error.Report}} (Schicht {{error.Layer}})</td>
+                                    <td><button class="btn btn-default btn-sm" ng-show="!inWhitelist('Report', error.Report)" ng-click="whitelistToggle('Report', error.Report)"><span class="glyphicon glyphicon-ban-circle"></span></button></td>
+                                    <td>{{error.Report}}</td>
+                                </tr>
+                                <tr>
+                                    <td>Schicht:</td>
+                                    <td><button class="btn btn-default btn-sm" ng-show="!inWhitelist('Layer', error.Layer)" ng-click="whitelistToggle('Layer', error.Layer)"><span class="glyphicon glyphicon-ban-circle"></span></button></td>
+                                    <td>{{error.Layer}}</td>
                                 </tr>
                                 <tr class="strich">
-                                    <td>Empfänger:</td>
+                                    <td><div  ng-show="e.Type=='Versand'">Empfänger:</div></td>
+                                    <td></td>
                                     <td><div ng-bind-html="mailFormat(error.MailTo)"></div></td>
                                 </tr>
                             </tbody>
+                            <tr ng-show="e.Errors2">
+                                <td colspan="4"><a ng-click="e.Show=!e.Show;">Ausgeblendete Berichte</a></td>
+                            </tr>
+                            <tbody ng-repeat="error in e.Errors2" ng-show="e.Show">
+                            <tr>
+                                <td rowspan="6" class="number">{{$index+1}}
+                                <td>Datei:</td>
+                                <td></td>
+                                <td>{{error.Filename}}</td>
+                            </tr>
+                            <tr>
+                                <td>Stand:</td>
+                                <td></td>
+                                <td>{{error.Modified}}</td>
+                            </tr>
+                            <tr>
+                                <td>Benutzer:</td>
+                                <td><button class="btn btn-default btn-sm" ng-show="!inWhitelist('User', error.User)" ng-click="whitelistToggle('User', error.User)"><span class="glyphicon glyphicon-ban-circle"></span></button></td>
+                                <td>{{error.User}}</td>
+                            </tr>
+                            <tr>
+                                <td>Bericht:</td>
+                                <td><button class="btn btn-default btn-sm" ng-show="!inWhitelist('Report', error.Report)" ng-click="whitelistToggle('Report', error.Report)"><span class="glyphicon glyphicon-ban-circle"></span></button></td>
+                                <td>{{error.Report}}</td>
+                            </tr>
+                            <tr>
+                                <td>Schicht:</td>
+                                <td><button class="btn btn-default btn-sm" ng-show="!inWhitelist('Layer', error.Layer)" ng-click="whitelistToggle('Layer', error.Layer)"><span class="glyphicon glyphicon-ban-circle"></span></button></td>
+                                <td>{{error.Layer}}</td>
+                            </tr>
+                            <tr class="strich">
+                                <td><div  ng-show="e.Type=='Versand'">Empfänger:</div></td>
+                                <td></td>
+                                <td><div ng-bind-html="mailFormat(error.MailTo)"></div></td>
+                            </tr>
+                            </tbody>
                         </table>
 
                     </div>
                 </div>
 
+                <h3>Weitere Logdateien</h3>
 
                 <table class="table table-hover table-bordered">
                     <tr ng-repeat="(header, g) in current.fehler.weitere">
@@ -291,8 +300,8 @@
                         <td>
                             <ul>
                                 <li ng-repeat="e in g" >
-                                    <a ng-click="current.fehlerdetails = e" ng-show="header == 'Workflow'">{{e.Name}}</a>
-                                    <span ng-show="header != 'Workflow'">{{e.Name}}</span>
+                                    <a ng-click="current.fehlerdetails = e" ng-show="header != 'Modell'">{{e.Name}}</a>
+                                    <span ng-show="header == 'Modell'">{{e.Name}}</span>
                                 </li>
                             </ul>
                         </td>
@@ -301,67 +310,177 @@
 
                 <div class="logdatei" ng-show="current.fehlerdetails != null">
                     <p class="modell">{{current.fehlerdetails.Type}}: {{current.fehlerdetails.Name}} ({{errorCount(current.fehlerdetails)}})</p>
-                    <pre class="fehler" ng-repeat="error in current.fehlerdetail.Errors">{{error}}</pre>
+                    <pre class="fehler" ng-repeat="error in current.fehlerdetails.Errors">{{error}}</pre>
+                    <table class="ft" ng-show="current.fehlerdetails.Errors2">
+                        <tbody ng-repeat="error in current.fehlerdetails.Errors2">
+                        <tr>
+                            <td rowspan="6" class="number">{{$index+1}}
+                            <td>Datei:</td>
+                            <td></td>
+                            <td>{{error.Filename}}</td>
+                        </tr>
+                        <tr>
+                            <td>Stand:</td>
+                            <td></td>
+                            <td>{{error.Modified}}</td>
+                        </tr>
+                        <tr>
+                            <td>Benutzer:</td>
+                            <td><button class="btn btn-default btn-sm" ng-show="!inWhitelist('User', error.User)" ng-click="whitelistToggle('User', error.User)"><span class="glyphicon glyphicon-ban-circle"></span></button></td>
+                            <td>{{error.User}}</td>
+                        </tr>
+                        <tr>
+                            <td>Bericht:</td>
+                            <td><button class="btn btn-default btn-sm" ng-show="!inWhitelist('Report', error.Report)" ng-click="whitelistToggle('Report', error.Report)"><span class="glyphicon glyphicon-ban-circle"></span></button></td>
+                            <td>{{error.Report}}</td>
+                        </tr>
+                        <tr>
+                            <td>Schicht:</td>
+                            <td><button class="btn btn-default btn-sm" ng-show="!inWhitelist('Layer', error.Layer)" ng-click="whitelistToggle('Layer', error.Layer)"><span class="glyphicon glyphicon-ban-circle"></span></button></td>
+                            <td>{{error.Layer}}</td>
+                        </tr>
+                        <tr class="strich">
+                            <td><div  ng-show="e.Type=='Versand'">Empfänger:</div></td>
+                            <td></td>
+                            <td><div ng-bind-html="mailFormat(error.MailTo)"></div></td>
+                        </tr>
+                        </tbody>
+                    </table>
                 </div>
-            </div>
-        </div>
-    </div>
-</div>
 
-<div class="modal fade" id="stats-modal" tabindex="-1" role="dialog" aria-labelledby="stats-modal-label" aria-hidden="true">
-    <div class="modal-dialog modal-lg">
-        <div class="modal-content">
-            <div class="modal-header">
-                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-                <h4 class="modal-title" id="stats-modal-label"><span class="glyphicon glyphicon-stats"></span>&nbsp; {{current.zeile.kunde}} - {{dateFormat(current.zeile.datum)}}</h4>
-            </div>
-            <div class="modal-body">
-                <div id="duration" style="width: 750px; height: 550px">
+                <div ng-show="current.fehler.whitelist.User || current.fehler.whitelist.Report || current.fehler.whitelist.Layer">
+                    <h3>Ausgeblendete Berichte</h3>
 
+                    <table class="table table-hover table-bordered">
+                        <tr ng-show="current.fehler.whitelist.User">
+                            <th>Benutzer</th>
+                            <td>
+                                <ul>
+                                    <li ng-repeat="val in current.fehler.whitelist.User"><a ng-click="whitelistToggle('User', val)">{{val}}</a></li>
+                                </ul>
+                            </td>
+                        </tr>
+                        <tr ng-show="current.fehler.whitelist.Report">
+                            <th>Bericht</th>
+                            <td>
+                                <ul>
+                                    <li ng-repeat="val in current.fehler.whitelist.Report"><button ng-click="whitelistToggle('Report', val)"><span class="glyphicon glyphicon-trash"></span></button> {{val}}</li>
+                                </ul>
+                            </td>
+                        </tr>
+                        <tr ng-show="current.fehler.whitelist.Layer">
+                            <th>Schicht</th>
+                            <td>
+                                <ul>
+                                    <li ng-repeat="val in current.fehler.whitelist.Layer"><a ng-click="whitelistToggle('Layer', val)">{{val}}</a></li>
+                                </ul>
+                            </td>
+                        </tr>
+                    </table>
                 </div>
-                <br/><br/>
-                <table class="table table-bordered table-striped">
+
+                <h3>Historie</h3>
+
+                <table class="table table-hover table-bordered table-condensed">
                     <tr>
-                        <th>Name</th>
-                        <th>Datum</th>
-                        <th>Zeit</th>
-                        <th>Dauer</th>
-                        <th>Quellen</th>
-                        <th>Kategorien</th>
-                        <th>Datensätze</th>
+                        <th style="width: 140px;">Datum</th>
+                        <th style="width: 100px;">Start<br/>Ende</th>
+                        <th style="width: 110px;">Abweichung</th>
+                        <th style="width: 120px;">Fehler</th>
+                        <th style="width: 340px;">Kommentar</th>
                     </tr>
-                    <tr ng-repeat="e in current.fehler.fehlerbericht" ng-show="e.Summary.Duration != null">
-                        <td>{{e.Type}}: <a href="" ng-click="showDetails(e)">{{e.Name}}</a></td>
-                        <td>{{dateFormat(e.Modified)}}</td>
-                        <td>{{timeFormat(e.Modified)}}</td>
-                        <td>{{e.Summary.Duration}}</td>
-                        <td>{{e.Sources.length}}</td>
-                        <td>{{e.Summary.Categories}}</td>
-                        <td>{{e.Summary.Entities}}</td>
+                    <tr ng-repeat="z in current.overview | orderBy: 'datum':true | limitTo: current.limit " ng-class="{'danger':z.fehlend==1}">
+                        <td>{{dateFormat(z.datum)}}</td>
+                        <td>
+                            <a ng-click="saveStartTime(z)">{{z.start}}</a><br/>
+                            <a ng-click="saveEndTime(z)">{{z.ende}}</a>
+                        </td>
+                        <td>
+                            {{timeDiffStart(z)}}<br/>
+                            {{timeDiff(z)}}
+                        </td>
+                        <td>
+                            <button type="button" class="btn btn-default btn-sm" ng-click="setCurrent(z)" ng-show="z.anzahl != null">
+                                <span class="glyphicon" ng-class="{'glyphicon-check': z.anzahl == 0 && z.bearbeitet == 1, 'glyphicon-eye-close': z.anzahl == 0 && z.bearbeitet == 0,  'glyphicon-exclamation-sign': z.anzahl > 0 && z.bearbeitet == 0,  'glyphicon-ok': z.anzahl > 0 && z.bearbeitet == 1}"></span>
+                                <span class="label label-danger label-{{z.anzahl}}"> {{z.anzahl}}</span>
+                            </button>
+
+                            <button type="button" data-trigger="focus" class="btn btn-default btn-sm" ng-click="setCurrent(zeile)" ng-show="z.anzahl == null">
+                                <span class="glyphicon glyphicon-question-sign"></span>
+                            </button>
+                        </td>
+                        <td>
+                            <button type="button" class="btn btn-default btn-sm" ng-init="c = getComments(z)" ng-show="c" data-toggle="popover" data-placement="bottom"
+                                    title="" data-content="" data-popover="{{z.kunde}}">
+                                <span ng-show="c[0].datum != z.datum">{{dateFormat(c[0].datum)}}: </span>
+                                <span class="glyphicon {{getCommentIcon(c)}}"></span>
+                                <span class="label label-danger label-{{c[0].fehler}}"> {{c[0].fehler}}</span>
+                                {{c[0].benutzer}}
+                            </button>
+
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <button class="btn btn-default" ng-click="current.limit=100"><span class="glyphicon glyphicon-plus"></span></button>
+                        </td>
                     </tr>
                 </table>
 
-                <div ng-show="current.details!=null">
-                    <h3>Details zu {{current.details.Type}}: {{current.details.Name}}</h3>
-                    <div id="duration_details" style="width: 750px; height: 550px">
+                <h3>Statistik</h3>
+
+                <div>
+                    <div id="duration" style="width: 750px; height: 550px">
 
                     </div>
                     <br/><br/>
                     <table class="table table-bordered table-striped">
                         <tr>
                             <th>Name</th>
-                            <th ng-show="current.details.Type!='Modell'">Report</th>
-                            <th ng-show="current.details.Type=='Modell'">Datensätze</th>
+                            <th>Datum</th>
+                            <th>Zeit</th>
                             <th>Dauer</th>
+                            <th>Quellen</th>
+                            <th>Kategorien</th>
+                            <th>Datensätze</th>
                         </tr>
-                        <tr ng-repeat="e in current.details.Sources">
-                            <td>{{e.Filename}}</td>
-                            <td ng-show="current.details.Type!='Modell'">{{e.Report}} ({{e.Layer}})</td>
-                            <td ng-show="current.details.Type=='Modell'">{{e.Entities}}</td>
-                            <td>{{e.Duration}}</td>
+                        <tr ng-repeat="e in current.fehler.fehlerbericht" ng-show="e.Summary.Duration != null">
+                            <td>{{e.Type}}: <a href="" ng-click="showDetails(e)">{{e.Name}}</a></td>
+                            <td>{{dateFormat(e.Modified)}}</td>
+                            <td>{{timeFormat(e.Modified)}}</td>
+                            <td>{{e.Summary.Duration}}</td>
+                            <td>{{e.Sources.length}}</td>
+                            <td>{{e.Summary.Categories}}</td>
+                            <td>{{e.Summary.Entities}}</td>
                         </tr>
                     </table>
+
+                    <div ng-show="current.details!=null">
+                        <h3>Details zu {{current.details.Type}}: {{current.details.Name}}</h3>
+                        <div id="duration_details" style="width: 750px; height: 550px">
+
+                        </div>
+                        <br/><br/>
+                        <table class="table table-bordered table-striped">
+                            <tr>
+                                <th>Name</th>
+                                <th ng-show="current.details.Type!='Modell'">Report</th>
+                                <th ng-show="current.details.Type=='Modell'">Datensätze</th>
+                                <th>Dauer</th>
+                            </tr>
+                            <tr ng-repeat="e in current.details.Sources">
+                                <td>{{e.Filename}}</td>
+                                <td ng-show="current.details.Type!='Modell'">{{e.Report}} ({{e.Layer}})</td>
+                                <td ng-show="current.details.Type=='Modell'">{{e.Entities}}</td>
+                                <td>{{e.Duration}}</td>
+                            </tr>
+                        </table>
+                    </div>
                 </div>
+
+
+
+
             </div>
         </div>
     </div>

+ 26 - 25
bower.json

@@ -1,26 +1,27 @@
 {
-    "name": "fehlerbericht",
-    "version": "0.0.0",
-    "dependencies": {
-        "angular": "1.2.16",
-        "json3": "~3.3.1",
-        "es5-shim": "~3.1.0",
-        "bootstrap": "~3.2.0",
-        "angular-resource": "1.2.16",
-        "angular-cookies": "1.2.16",
-        "angular-sanitize": "1.2.16",
-        "angular-animate": "1.2.16",
-        "angular-touch": "1.2.16",
-        "angular-route": "1.2.16",
-        "angular-bootstrap": "~0.11.0",
-        "flot": "~0.8.3",
-        "fullcalendar": "~2.1.1",
-        "moment": "~2.8.3",
-        "underscore": "~1.6.0"
-    },
-    "devDependencies": {
-        "angular-mocks": "1.2.16",
-        "angular-scenario": "1.2.16"
-    },
-    "appPath": "app"
-}
+  "name": "fehlerbericht",
+  "version": "0.0.0",
+  "dependencies": {
+    "angular": "1.2.16",
+    "json3": "~3.3.1",
+    "es5-shim": "~3.1.0",
+    "bootstrap": "~3.2.0",
+    "angular-resource": "1.2.16",
+    "angular-cookies": "1.2.16",
+    "angular-sanitize": "1.2.16",
+    "angular-animate": "1.2.16",
+    "angular-touch": "1.2.16",
+    "angular-route": "1.2.16",
+    "angular-bootstrap": "~0.11.0",
+    "flot": "~0.8.3",
+    "fullcalendar": "~2.1.1",
+    "moment": "~2.8.3",
+    "underscore": "~1.6.0",
+    "Chart.js": "~1.0.2"
+  },
+  "devDependencies": {
+    "angular-mocks": "1.2.16",
+    "angular-scenario": "1.2.16"
+  },
+  "appPath": "app"
+}