diff --git a/config.json b/qcms-manifest.json similarity index 66% rename from config.json rename to qcms-manifest.json index a7c541d..ce3a0ce 100644 --- a/config.json +++ b/qcms-manifest.json @@ -1,28 +1,28 @@ { "system": { "logo": "www/parser/_images/cog-red.png", - "context": "", - "theme": "oss.css", + "context": "parser", + "theme": "oss", "app": { "debug": true, - "port": 8000 + "port": 8001 }, "version": 0.6, "mode": "portal", "source": { - "id": "cloud", - "auth": "nextcloud-auth.json", + "id": "_cloud", + "auth": "/home/steve/dev/data/qcms/dev-nextcloud-auth.json", "store": "/home/steve/git/sites/parser/store-auth.json", "key": "/home/steve/dev/data/qcms/parser.json" }, "routes": { "data-transport": { "menu": "tools", - "path": "/home/steve/git/sites/data-transport/config.json" + "path": "/home/steve/git/sites/data-transport/qcms-manifest.json" }, "privacykit": { "menu": "tools", - "path": "/home/steve/git/sites/privacykit/config.json" + "path": "/home/steve/git/sites/privacykit/qcms-manifest.json" } } }, @@ -43,7 +43,7 @@ "root": "www/parser", "index": "index.html", "order": { - "menu": ["tools","tutorials", "about" + "menu": ["tools","docs", "studio","about" ] }, "overwrite": { @@ -61,22 +61,12 @@ "type": "redirect", "url": "https://hiplab.mc.vanderbilt.edu/git/hiplab/parser.git" }, - "change-database":{ - "title":"Change Database", - "text":"change database", - "type":"dialog", - "uri":"www/parser/tutorials/change-database.md" - }, - "docker":{"type":"dialog"}, - "import-library":{ - "title":"Import Library","text":"Import Library","type":"dialog","uri":"www/parser/tutorials/import-library.md" - }, - "export-data":{"title":"Export Data","text":"Export Data","type":"dialog","uri":"www/parser/tutorials/export-data.md"}, "credit": { "title": "{x12} Parser Credit", "type": "dialog", "uri": "www/parser/about/credit.html" - } + }, + "wizard":{"text":"ETL Configurator"} }, "footer": [ { diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e64a1d4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +git+https://github.com/lnyemba/data-transport +git+https://dev.the-phi.com/git/cloud/store@lib +git+https://hiplab.mc.vanderbilt.edu/git/hiplab/parser +stripe diff --git a/www/parser/_assets/themes/default/borders.css b/www/parser/_assets/themes/default/borders.css new file mode 100644 index 0000000..6f9a192 --- /dev/null +++ b/www/parser/_assets/themes/default/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:1px solid #CAD5E0; + +} + +.border-left{ + border-left:1px solid #CAD5E0; +} + + +.border-bottom { border-bottom:1px solid #CAD5E0} +.border-top { border-top:1px solid #CAD5E0} + diff --git a/www/parser/_assets/themes/default/footer.css b/www/parser/_assets/themes/default/footer.css new file mode 100644 index 0000000..8086c04 --- /dev/null +++ b/www/parser/_assets/themes/default/footer.css @@ -0,0 +1,19 @@ +/** +* This file styles the footer of the page +*/ + +.footer { + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); */ + + grid-column: 1 /span 2; +} diff --git a/www/parser/_assets/themes/default/header.css b/www/parser/_assets/themes/default/header.css new file mode 100644 index 0000000..a64ce8b --- /dev/null +++ b/www/parser/_assets/themes/default/header.css @@ -0,0 +1,3 @@ +.main .header { display:grid; grid-template-columns:64px auto; gap:4px} +.main .header .title {font-size:28px; font-weight:bold} +.main .header img {width:55px; height:55px;} diff --git a/www/parser/_assets/themes/default/layout.css b/www/parser/_assets/themes/default/layout.css new file mode 100644 index 0000000..0e48ca3 --- /dev/null +++ b/www/parser/_assets/themes/default/layout.css @@ -0,0 +1,22 @@ + + +.main { + height:98vh; display:grid; grid-template-columns:70% auto; gap:4px; + grid-template-rows:70px 40px auto 32px; + padding-left:2%; padding-right:2%; + line-height: 1.5; font-size:16px; font-family: sans-serif; font-weight:lighter; +} +.main .content{ + align-self:center; +} +.main .pane {border-left:1px solid #CAD5E0; height:100%; padding:8px;} +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/parser/_assets/themes/default/menu.css b/www/parser/_assets/themes/default/menu.css new file mode 100644 index 0000000..7a14d15 --- /dev/null +++ b/www/parser/_assets/themes/default/menu.css @@ -0,0 +1,78 @@ +.menu { + padding:8px; + border:1px solid #CAD5E0 ; + + display:grid; + grid-column: 1 / span 2; + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + align-items: center; + +} +.menu .icon {padding:4px;} +.menu .icon img {width:30px; height:30px;} +.menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; + + + + + +} + +.menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} + +.menu .item:hover .sub-menu{ + + display:block; + height:auto; +} +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/parser/_assets/themes/default/pane.css b/www/parser/_assets/themes/default/pane.css new file mode 100644 index 0000000..e321d4a --- /dev/null +++ b/www/parser/_assets/themes/default/pane.css @@ -0,0 +1,2 @@ +.main .pane { height:auto;} +.main .pane iframe{ width:100%; border:0px; height:80%;} diff --git a/www/parser/_assets/themes/hiplab/borders.css b/www/parser/_assets/themes/hiplab/borders.css new file mode 100644 index 0000000..6f9a192 --- /dev/null +++ b/www/parser/_assets/themes/hiplab/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:1px solid #CAD5E0; + +} + +.border-left{ + border-left:1px solid #CAD5E0; +} + + +.border-bottom { border-bottom:1px solid #CAD5E0} +.border-top { border-top:1px solid #CAD5E0} + diff --git a/www/parser/_assets/themes/hiplab/footer.css b/www/parser/_assets/themes/hiplab/footer.css new file mode 100644 index 0000000..8086c04 --- /dev/null +++ b/www/parser/_assets/themes/hiplab/footer.css @@ -0,0 +1,19 @@ +/** +* This file styles the footer of the page +*/ + +.footer { + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); */ + + grid-column: 1 /span 2; +} diff --git a/www/parser/_assets/themes/hiplab/header.css b/www/parser/_assets/themes/hiplab/header.css new file mode 100644 index 0000000..a64ce8b --- /dev/null +++ b/www/parser/_assets/themes/hiplab/header.css @@ -0,0 +1,3 @@ +.main .header { display:grid; grid-template-columns:64px auto; gap:4px} +.main .header .title {font-size:28px; font-weight:bold} +.main .header img {width:55px; height:55px;} diff --git a/www/parser/_assets/themes/hiplab/layout.css b/www/parser/_assets/themes/hiplab/layout.css new file mode 100644 index 0000000..4c0bf03 --- /dev/null +++ b/www/parser/_assets/themes/hiplab/layout.css @@ -0,0 +1,37 @@ +/** +* This is the default window and we will have to hide the pane (side) +*/ + +.main {height:98vh; display:grid; grid-template-columns:75% auto; gap:4px; + grid-template-rows:70px 40px auto 32px; + padding-left:2%; padding-right:2%; + } + .main .header { display:grid; grid-template-columns:64px auto; gap:4px; align-items: center;} + .main .header .title {font-size:28px; font-weight:bold} + .main .header img {width:80px; height:80px;} + .main .index{ + align-self:center; + padding:8px; + } + .main .menu {border:1px solid transparent; background-color:#f3f3f3;} + .main .pane {border-left:1px solid #CAD5E0; height:100%; padding:8px; line-height:1.5; font-size: 14px;} + .main .pane div:first-child {margin-top:4px; background-color:#f3f3f3; border-radius: 8px; padding:8px; min-height:150px} + + .search-box {display:block; grid-template-columns: none;} + + + + +.main .content{ + align-self:center; +} +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/parser/_assets/themes/hiplab/menu.css b/www/parser/_assets/themes/hiplab/menu.css new file mode 100644 index 0000000..bb368d0 --- /dev/null +++ b/www/parser/_assets/themes/hiplab/menu.css @@ -0,0 +1,110 @@ +.menu { + padding:8px; + border:1px solid #CAD5E0 ; + + display:grid; + grid-column: 1 / span 2; + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + align-items: center; + +} +.menu .icon {padding:4px;} +.menu .icon img {width:30px; height:30px;} +.menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; + + + + + +} + +.menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} + +.menu .item:hover .sub-menu{ + + display:block; + height:auto; +} + +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/parser/_assets/themes/hiplab/pane.css b/www/parser/_assets/themes/hiplab/pane.css new file mode 100644 index 0000000..e69de29 diff --git a/www/parser/_assets/themes/magazine/borders.css b/www/parser/_assets/themes/magazine/borders.css new file mode 100644 index 0000000..e6c7e66 --- /dev/null +++ b/www/parser/_assets/themes/magazine/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:3px dotted #CAD5E0; + +} + +.border-left{ + border-left:3px dotted gray; +} + + +.border-bottom { border-bottom:1px dotted gray;} +.border-top { border-top:3px dotted gray;} + diff --git a/www/parser/_assets/themes/magazine/footer.css b/www/parser/_assets/themes/magazine/footer.css new file mode 100644 index 0000000..84ce356 --- /dev/null +++ b/www/parser/_assets/themes/magazine/footer.css @@ -0,0 +1,22 @@ +/** +* This file styles the footer of the page +*/ + + + +/* .main .footer { grid-column: 1 / span 2; font-size:13px; font-weight: lighter; padding:8px;} */ +.footer { + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); */ + + grid-column: 1 /span 2; +} diff --git a/www/parser/_assets/themes/magazine/header.css b/www/parser/_assets/themes/magazine/header.css new file mode 100644 index 0000000..991b9af --- /dev/null +++ b/www/parser/_assets/themes/magazine/header.css @@ -0,0 +1,13 @@ +.main .header { + + grid-row:1; + grid-column: 1 / span 2; + display:grid; + grid-template-columns: 50px auto; gap:4px; + line-height: 1; + + +} +.main .header .title {font-size:28px; text-transform: capitalize; font-weight:bold} +.main .header .subtitle {font-size:14px} +.main .header img { width:44px; height:44px;} diff --git a/www/parser/_assets/themes/magazine/layout.css b/www/parser/_assets/themes/magazine/layout.css new file mode 100644 index 0000000..ad5c277 --- /dev/null +++ b/www/parser/_assets/themes/magazine/layout.css @@ -0,0 +1,55 @@ +.main { + margin:10px; + padding:4px; + display:grid; + grid-template-columns: 50% 50% ; gap:4px; + grid-template-rows: 48px 64px auto 32px; + font-family: sans-serif; + font-weight: lighter; + font-size:18px; + line-height: 1.5; + justify-items: normal; + ; + height:96vh; +} +.main .content { + grid-row:3; + grid-column: 1 ; + text-wrap: wrap; + height:100%; + display:grid; + align-content: start; + + + +} + +.main .content #index { + text-align: left; + text-wrap: wrap; +} + +p { + margin-top:22px; +} +table { + width:99%; + border: 1px solid #CAD5E0; +} +table td {padding:4px; margin:4px;} +table thead { + + font-weight:bold; + background-color:#f3f3f3; +} + +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/parser/_assets/themes/magazine/menu.css b/www/parser/_assets/themes/magazine/menu.css new file mode 100644 index 0000000..21cfd84 --- /dev/null +++ b/www/parser/_assets/themes/magazine/menu.css @@ -0,0 +1,110 @@ +.menu { + padding:8px; + border-bottom:3px dotted gray ; + + display:grid; + grid-column: 1 / span 2; + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + align-items: center; + +} +.menu .icon {padding:4px;} +.menu .icon img {width:30px; height:30px;} +.menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; + + + + + +} + +.menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} + +.menu .item:hover .sub-menu{ + + display:block; + height:auto; +} + +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/parser/_assets/themes/magazine/pane.css b/www/parser/_assets/themes/magazine/pane.css new file mode 100644 index 0000000..4fb956f --- /dev/null +++ b/www/parser/_assets/themes/magazine/pane.css @@ -0,0 +1,14 @@ +.main .pane { + border-left:3px dotted gray; + grid-column: 2; + font-family: sans-serif; + padding-left: 10px; + + +} +.pane iframe { + border:1px solid transparent; + width:99%; + height:100%; + +} \ No newline at end of file diff --git a/www/parser/_assets/themes/oss/borders.css b/www/parser/_assets/themes/oss/borders.css new file mode 100644 index 0000000..6f9a192 --- /dev/null +++ b/www/parser/_assets/themes/oss/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:1px solid #CAD5E0; + +} + +.border-left{ + border-left:1px solid #CAD5E0; +} + + +.border-bottom { border-bottom:1px solid #CAD5E0} +.border-top { border-top:1px solid #CAD5E0} + diff --git a/www/parser/_assets/themes/oss/footer.css b/www/parser/_assets/themes/oss/footer.css new file mode 100644 index 0000000..e1acfb5 --- /dev/null +++ b/www/parser/_assets/themes/oss/footer.css @@ -0,0 +1,21 @@ +/** +* This file styles the footer of the page +*/ + +.footer { + grid-row:5; + margin-top:10px; + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); + + +} diff --git a/www/parser/_assets/themes/oss/header.css b/www/parser/_assets/themes/oss/header.css new file mode 100644 index 0000000..c7ee323 --- /dev/null +++ b/www/parser/_assets/themes/oss/header.css @@ -0,0 +1,7 @@ +.main .header {display:grid; grid-template-columns:64px auto; gap:4px; width:100%; align-items:center;} +.main .header .icon {width:64px; height:64px;} +.main .header .icon img {width:64px; height:64px;} + +.main .header .title { font-size:32px; text-transform: uppercase; font-weight:bold} +.main .header .subtitle {font-style:italic;font-size:14px; color:gray; text-transform: capitalize;} + diff --git a/www/parser/_assets/themes/oss/layout.css b/www/parser/_assets/themes/oss/layout.css new file mode 100644 index 0000000..0c685af --- /dev/null +++ b/www/parser/_assets/themes/oss/layout.css @@ -0,0 +1,47 @@ +/** +* This file implements theme Open Source Software, the expectation is just a pager that presents a tool/software +*/ + +.main { + display:grid; + grid-template-columns: 100%;; + font-size: 18px; + font-weight:lighter; + font-family:sans-serif; + margin:1%; + margin-left:10%; + margin-right:10%; + gap:4px; + height:90%; + width:80%; +} +.main .content{ + + grid-row:4; + align-self:center; + height:100%; + width:100%; +} + +.main .content .banner { + background-repeat: no-repeat; + background-size: cover; + background-position: center; + height:200px; + align-items: center; + align-content: center; + display: grid; + +} + +/* .main .pane {border-left:1px solid #CAD5E0; height:100%; padding:8px;} */ +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/parser/_assets/themes/oss/menu.css b/www/parser/_assets/themes/oss/menu.css new file mode 100644 index 0000000..a34f727 --- /dev/null +++ b/www/parser/_assets/themes/oss/menu.css @@ -0,0 +1,82 @@ + +.menu .icon {padding:4px; align-items:center; display:grid;} +.menu .icon img {width:30px; height:30px;} + +.main .menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} +.main .menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; +} + +.main .menu .item:hover .sub-menu{ + + display:block; + height:auto; +} + +.main .menu { + padding:8px; + grid-row:2; + width:100%; + display:none; + + /* grid-row:2; grid-column:1 ; */ + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + border:0; height:48px; padding:0px; + display:grid; grid-template:64px repeat(6,1fr); gap:4px; + /* background-color: #f3f3f3; */ + align-items: center; +} +.main .menu .icon .button { + border:1px solid #CAD5E0; border-radius:8px; padding:2px; + ; +} +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/parser/_assets/themes/oss/pane.css b/www/parser/_assets/themes/oss/pane.css new file mode 100644 index 0000000..e61f21d --- /dev/null +++ b/www/parser/_assets/themes/oss/pane.css @@ -0,0 +1 @@ +.main .pane {display:block;} \ No newline at end of file diff --git a/www/parser/_assets/themes/oss/responsive.css b/www/parser/_assets/themes/oss/responsive.css new file mode 100644 index 0000000..cc43868 --- /dev/null +++ b/www/parser/_assets/themes/oss/responsive.css @@ -0,0 +1,3 @@ +@media (max-width: 480px) { + +} \ No newline at end of file diff --git a/www/parser/_assets/themes/resume/borders.css b/www/parser/_assets/themes/resume/borders.css new file mode 100644 index 0000000..6f9a192 --- /dev/null +++ b/www/parser/_assets/themes/resume/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:1px solid #CAD5E0; + +} + +.border-left{ + border-left:1px solid #CAD5E0; +} + + +.border-bottom { border-bottom:1px solid #CAD5E0} +.border-top { border-top:1px solid #CAD5E0} + diff --git a/www/parser/_assets/themes/resume/footer.css b/www/parser/_assets/themes/resume/footer.css new file mode 100644 index 0000000..8086c04 --- /dev/null +++ b/www/parser/_assets/themes/resume/footer.css @@ -0,0 +1,19 @@ +/** +* This file styles the footer of the page +*/ + +.footer { + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); */ + + grid-column: 1 /span 2; +} diff --git a/www/parser/_assets/themes/resume/header.css b/www/parser/_assets/themes/resume/header.css new file mode 100644 index 0000000..a64ce8b --- /dev/null +++ b/www/parser/_assets/themes/resume/header.css @@ -0,0 +1,3 @@ +.main .header { display:grid; grid-template-columns:64px auto; gap:4px} +.main .header .title {font-size:28px; font-weight:bold} +.main .header img {width:55px; height:55px;} diff --git a/www/parser/_assets/themes/resume/layout.css b/www/parser/_assets/themes/resume/layout.css new file mode 100644 index 0000000..0e48ca3 --- /dev/null +++ b/www/parser/_assets/themes/resume/layout.css @@ -0,0 +1,22 @@ + + +.main { + height:98vh; display:grid; grid-template-columns:70% auto; gap:4px; + grid-template-rows:70px 40px auto 32px; + padding-left:2%; padding-right:2%; + line-height: 1.5; font-size:16px; font-family: sans-serif; font-weight:lighter; +} +.main .content{ + align-self:center; +} +.main .pane {border-left:1px solid #CAD5E0; height:100%; padding:8px;} +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/parser/_assets/themes/resume/menu.css b/www/parser/_assets/themes/resume/menu.css new file mode 100644 index 0000000..3080a4e --- /dev/null +++ b/www/parser/_assets/themes/resume/menu.css @@ -0,0 +1,79 @@ +.menu { + padding:8px; + border:1px solid #CAD5E0 ; + + display:grid; + grid-column: 1 / span 2; + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + align-items: center; + +} +.menu .icon {padding:4px;} +.menu .icon img {width:30px; height:30px;} +.menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; + + + + + +} + +.menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} + +.menu .item:hover .sub-menu{ + + display:block; + height:auto; +} + +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/parser/_assets/themes/resume/pane.css b/www/parser/_assets/themes/resume/pane.css new file mode 100644 index 0000000..e69de29 diff --git a/www/parser/_data/meta.json b/www/parser/_data/meta.json new file mode 100644 index 0000000..dc64171 --- /dev/null +++ b/www/parser/_data/meta.json @@ -0,0 +1,3 @@ +{"postgresql":{"host":0,"port":0,"database":1,"table":1,"username":0,"password":0},"redshift":{"host":0,"port":0,"database":1,"table":1,"username":0,"password":0}, "mysql":{"host":0,"port":0,"database":1,"table":1,"username":0,"password":0},"mariadb":{"host":0,"port":0,"database":1,"table":1,"username":0,"password":0}, "bigquery":{"private_key":1,"dataset":1,"table":1},"mongodb":{"db":1,"collection":1,"host":0,"port":0,"username":0,"password":0}, "netezza":{"host":1,"port":1,"username":1,"password":1, "database":1,"table":1}, "sqlite":{"path":1,"table":1}, "sqlserver":{"host":0,"port":0,"username":1,"password":1,"database":1, "table":1} +,"databricks":{"host":1,"token":1,"schema":1,"cluster_path":1,"table":1},"couchdb":{"url":0,"dbname":1,"doc":1,"username":0,"password":0},"cloudant":{"url":0,"dbname":1,"doc":1,"username":0,"password":0} +} diff --git a/www/parser/_images/activity.png b/www/parser/_images/activity.png new file mode 100644 index 0000000..c5bb20d Binary files /dev/null and b/www/parser/_images/activity.png differ diff --git a/www/parser/_images/banner1.jpg b/www/parser/_images/banner1.jpg new file mode 100644 index 0000000..95291cc Binary files /dev/null and b/www/parser/_images/banner1.jpg differ diff --git a/www/parser/_images/cog-red.png b/www/parser/_images/cog-red.png new file mode 100644 index 0000000..b376d78 Binary files /dev/null and b/www/parser/_images/cog-red.png differ diff --git a/www/parser/_plugins/utils.py b/www/parser/_plugins/utils.py index a2bcf4f..63f1294 100644 --- a/www/parser/_plugins/utils.py +++ b/www/parser/_plugins/utils.py @@ -2,6 +2,9 @@ """ import transport +import transport +import info + _QUERY = { "missing_elements":{ transport.providers.SQLITE3:"select count(*) counts, date, json_extract(data,'$.element') element, json_extract(data,'$.anchor') qualifier from logs where action = 'missing-plugin' group by element, qualifier ", @@ -10,4 +13,7 @@ _QUERY = { } def query(**_args): _request = _args['request'] + +def supported (**_args): + return {'license':info.__license__,'author':transport.__author__, 'version':transport.__version__, 'supported':transport.supported().to_html(index=False,columns=['sql','nosql','cloud','other'],col_space=0,justify='left').replace("\n","").replace('border="1"','')} \ No newline at end of file diff --git a/www/parser/about/credit.html b/www/parser/about/credit.html new file mode 100644 index 0000000..7905d5b --- /dev/null +++ b/www/parser/about/credit.html @@ -0,0 +1,72 @@ + +
+ + +
+
+

+ Healthcare/IO::Parser was developed by Khanhly Nguyen during her summer internship 2019 with Health Information Privacy Laborary(HIPLAB) at Vanderbilt University Medical Center. + +

+ + + + + + + + + + + + + + + +
Khanly NguyenHeather DunnNina Thousand
Byun KangGaylon StanleyCheng Gao
Thomas BrownBrad. MalinSteve Nyemba
+ +
+
+

Also our users have helped refine the parser and have been instrumental in improving the usability of {x12} parser.

+
+
Preverity Inc
+
Centric Consulting
+
Nuvance Health
+
Magenta Care Continuum
+ +
+ +
+ +
+

+

Thank you,
+

\ No newline at end of file diff --git a/www/parser/about/license.md b/www/parser/about/license.md new file mode 100644 index 0000000..422c8cb --- /dev/null +++ b/www/parser/about/license.md @@ -0,0 +1,13 @@ +Copyright 2010 - 2024, Steve L. Nyemba, Vanderbilt University Medical Center + +# + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +# + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +# + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/www/parser/contact.html b/www/parser/contact.html new file mode 100644 index 0000000..bd0fb2e --- /dev/null +++ b/www/parser/contact.html @@ -0,0 +1,8 @@ +
Thank you,
+
For considering {{layout.header.title}}, +Please feel free to direct bugs/inquiries to :
+ \ No newline at end of file diff --git a/www/parser/docs/command-line.html b/www/parser/docs/command-line.html new file mode 100644 index 0000000..b1cd15c --- /dev/null +++ b/www/parser/docs/command-line.html @@ -0,0 +1,79 @@ + +
+
+
Command line interface (CLI)
+

+ 0. Check that you have the installer, the command below will display all the supported actions. +

+ healthcare-io --help +
+

+

+ 1. initialize the environment (one-time run), with database parameters. By default this will be using sqlite database + +

+ healthcare-io init < your-email > + +
+
Note : +
To use another database please visit data-transport page to learn about how to create an auth-file, it's a file with database access parameters. +
The configuration file will live on $HOME/.healthcareio/config.json +

+

+ 2. Parse {x12} files stored in a folder. The output will be stored in a database specified upon initialization. +

+ healthcare-io parse < x12_folder > +
+
Note : +
The data is stored in JSON format in the database specified in $HOME/.healthcareio/config.json +
Once stored, it is possible to export them to a relational database supported by data-transport. +

+ +

+

+ +
+

+ +
+ +
+
Prerequisites
+
    +
  • Installed {x12} parser via pip (python 3+)
  • +
  • Familiarity with terminal commands
  • +
  • Have {x12} files in a folder
    Samples {x12} files can be found at https://x12.org/examples
  • +
+

+

Things to know
+
    +
  • Plugins +
    The plugins determine what elements need to be parsed for a given {x12} file, and thus determine relational structure
    +
    If no plugins are specified, the default built-in are used
    +
    It is possible to develop plugins (in python) for custom parsing or to extend the elements parsed by default.
    +
  • +
  • Parser versions +
    Add data on existing database if using the same custom plugins across {x12} parser versions. As long as the custom plugins have not changed +
    +
    Do NOT add data on existing database if using default plugins & a newer version of {x12} parser. +
    +
  • +
+

+

+

+
System Components
+

+

+ +
+

+
+

+
+
\ No newline at end of file diff --git a/www/parser/docs/container.html b/www/parser/docs/container.html new file mode 100644 index 0000000..dfafdd2 --- /dev/null +++ b/www/parser/docs/container.html @@ -0,0 +1,97 @@ + + + +
+
+
+ Containers: Podman or Docker +
+

+ 0. clone respository +

+ git clone https://healthcareio.the-phi.com/git/code/podman-parser.git +
+ +

+

+ 1. Edit env.sh file, use a text editor and the content of the file should look like the following +
provide values of choice +

+
# +
# Edit the env.sh file following variables, the others remain unchanged +
PG_USER= +
PG_PASSWORD= +
USER_EMAIL= +
+ +
Note : The file updates with basic information to be used to configure the {x12} parser environment +
PG_USER, PG_PASSWORD set PostgreSQL username/password +
USER_EMAIL configures {x12} parser with user's email + +

+ +

+ 2. Build the image with the files found in podman-parser folder +

+ docker build -t healthcareio:0.1 . +
+

+

+ 3. Build the container +

+ docker container create -v x12-folder-path:/data -p:port:5000 -h parser-ui --env-file ./env.sh --name parser healthcareio:0.1 +
+

+

+ 4. Execute the parser (CLI), to parse the files +

+ healthcare-io parse /data +
+ +

+
+
+
Prerequisites
+

+

    +
  • + Make sure to have either docker or podman installed +
  • +
  • You should be familiar with containers +
    Bind port 5000 to an available port
    +
    Mount a volume to /data that holds {x12} files
    + +
  • +
+

+
Things to know
+

+

    +
  • This is the best way to try the parser in a sandboxed environment
  • +
  • The image is not yet available on a public registry, thus will require building
  • +
  • Tools installed in the container: + +
    PostgreSQL database
    +
    PGWeb interface on port 5000
    + +
  • +
  • The container has the latest copy of {x12} parser code-base
  • +
  • There is not need to initialize the {x12} parser, this will happen automatically
  • + +
+

+
 
+

+

    +
    +
+

+ +
+ +
\ No newline at end of file diff --git a/www/parser/docs/export.html b/www/parser/docs/export.html new file mode 100644 index 0000000..4ac2676 --- /dev/null +++ b/www/parser/docs/export.html @@ -0,0 +1,89 @@ + + + + +
+
+
{x12} Export to Database
+

+ 0. The content of an auth-file for an sqlite3+ export, use the ETL Configurator to generate an ETL file +

+ {"provider":"sqlite","database":"exported_x12", "context":"write"} +
+
Note : +
You can use the wizard in the studio menu to generate this file. +

+

+ 1. Execute the export help function to display how the function is used +

+ healthcare-io export --help +
+

+

+ 2. Execute the export function with the file created above +

+ healthcare-io export claims|remits ./auth-file.json +
+ + +

+ +

+

+

+
+
+
Prerequisites
+
    +
  • Have a data-transport auth-file available +
    supported databases and vendors and listed below +
    +
  • + +
+
Things to know
+
    +
  • Export claims or remits should be specified individually +
    A function that will do both on a single call is not yet supported + +
  • +
  • The relational data is normalized +
    Database specific referrential integrity is not set. This might need to be set manually when large volumes of data are involved +
    We recommend using the exported data as staging data, and might need better typing and null/empty value handling +
  • +
+
+
\ No newline at end of file diff --git a/www/parser/index.html b/www/parser/index.html new file mode 100644 index 0000000..3fe4565 --- /dev/null +++ b/www/parser/index.html @@ -0,0 +1,182 @@ + + +
+ +
+
+
+
+
Streamline parsing
+

+ Whether you prefer using it as a library within your Python projects, via a command-line interface (CLI) for quick tasks, or in a containerized environment (Podman/Docker) for scalability and portability, our parser fits seamlessly into your workflow. +

+
+
+
+ Database export +
+

Seamlessly export parsed data into relational databases, ensuring a normalized data representation that's ready for analysis and integration with your existing systems. +

+
+
+
Extensible architecture
+

+ Our parser is designed with extensibility in mind. You can create custom plugins for enhanced formatting, parsing, and processing tailored to your specific needs +

+
+
+
Open source
+

+ Embrace flexibility and transparency with our parser's source code, available under the permissive MIT license. Modify, customize, and contribute to the project with confidence +

+
+
+
+
+ +
Quick Start: Installation
+
+
+
+
1. Pip (Python)
+
# pip & virtualenv
pip install git+https://hiplab.mc.vanderbilt.edu/git/hiplab/parser.git
+
# CLI runner/executable
+ healthcare-io [init|parse|export] --help +
+
+
+
2. Docker/Podman
+
# clone repository (Dockerfile)
git clone https://healthcareio.the-phi.com/git/code/podman-parser.git
+
# build docker/podman image
docker build -t healthcareio:0.1 .
+
# build container
docker container create -v:/data -p::5000 -h parser-ui --env-file ./env.sh --name parser healthcareio:0.1
+
+
+ + + +
+
+ +
+
+ +
+
\ No newline at end of file diff --git a/www/parser/news.zip b/www/parser/news.zip new file mode 100644 index 0000000..cc0c7fd Binary files /dev/null and b/www/parser/news.zip differ diff --git a/www/parser/studio/wizard.html b/www/parser/studio/wizard.html new file mode 100644 index 0000000..d2d1d22 --- /dev/null +++ b/www/parser/studio/wizard.html @@ -0,0 +1,184 @@ + + +
+
+
Wizard: export file generator
+
This wizard generates a template file to be used to export data, to a supported database +
search for the database provider +
+

+

+
+ +
+
+
+
+
+
+
+ 0 found +
+
+ + +
+

+

+

+ +
+
+
 
+
Note : +
Copy the code above to the auth-file and fill with appropriate values +
Attributes with zero i.e 0 are optional +
+
+

+

+

+

+ +
+
+
Prerequisites
+
    +
  • Familiarity with JSON format
  • +
  • Understand your current database security access policy +
    The {x12} parser needs networking access to the database server +
    The {x12} parser needs CREATE tables and WRITE data to the database +
  • +
+
Thing to know
+
    +
  • Values assigned to attributes +
    value of one i.e 1 suggests a value must be provided +
    value of zero i.e 0 suggests the attribute is optional and can be removed +
  • +
  • + Supported databases (or database providers) to use in search +
    +
  • +
+
+