diff --git a/.codeclimate.yml b/.codeclimate.yml
deleted file mode 100644
index 3081257..0000000
--- a/.codeclimate.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-languages:
- PHP: true
- JavaScript: true
-exclude_paths:
-- "test/*"
-- "bin/*"
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index bccc38f..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.idea/
-composer.phar
-composer.lock
-vendor/
-test.php
-build/
-
-*phpdoc-cache*
-doc/api/structure.xml
diff --git a/.htaccess b/.htaccess
deleted file mode 100644
index 3418e55..0000000
--- a/.htaccess
+++ /dev/null
@@ -1 +0,0 @@
-deny from all
\ No newline at end of file
diff --git a/.jshintrc b/.jshintrc
deleted file mode 100644
index 248c395..0000000
--- a/.jshintrc
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "globals" : {
- "athens": false,
- "$": false,
- "CSRFToken": false
- }
-}
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 3fa0ebe..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-language: php
-php:
- - 5.6
- - 7.0
-addons:
- code_climate:
- repo_token: e9193b107e8df98973444d74d5b16b2f7e6605b03542c4a4844153281d81c660
-before_script:
- - sed -i '/phpdoc/d' composer.json
- - composer install
-script:
- - ./vendor/bin/phpunit --configuration test/phpunit.xml test
- - ./vendor/bin/phpcs --ignore=*/vendor/*,*/bin/*,*/*.min.js --standard=PSR2 .
- - ./vendor/bin/phpcs --standard=./vendor/athens/standard/ruleset.xml src
-after_script:
- - vendor/bin/test-reporter
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index ff01dd4..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 University of Washington, Seattle, WA
-
-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.The MIT License (MIT)
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index 477512e..0000000
--- a/README.md
+++ /dev/null
@@ -1,149 +0,0 @@
-[](https://travis-ci.org/AthensFramework/Core)
-[](https://codeclimate.com/github/AthensFramework/core)
-[](https://codeclimate.com/github/AthensFramework/core/coverage)
-[](https://packagist.org/packages/athens/core)
-
-Athens/Core
-=============
-
-*Athens* is a modern PHP web framework built within the University of Washington's Department of Enrollment Management.
-
-
-
-*Easily create forms and manage submission results in* Athens *created web applications*
-
-Applications built within *Athens* are:
-
- 1. Secure
-
- *Athens* automatically provides strong protection against a number of web attacks, including CSRF, XSS, and database injection.
-
- *Athens* also provides easy, seamless encryption for sensitive student information. Encrypting a database column requires a simple declaration in your model schema for each data-field you want to protect. Calls to and from the database on that encrypted data are transparent; *Athens* knows which fields are encrypted and handles the encryption/decryption behind the scenes.
-
- 2. Attractive
-
- *Athens* includes beautiful page templates and user-interface elements. These default templates can be easily overridden with custom themes to implement your own organization's brand.
-
- 3. Legible
-
- *Athens* separates declaring *what elements shall be on a page* from *what those elements should look like* and the logic of *how those elements should behave*. Under this model, creating a page is not much more complicated than simply listing the presentational elements that should be present.
-
- 4. Extensible
-
- This separation of concerns also promotes reusability of components: a web-displayed table can be turned into Excel by changing a single line of code; a web-displayed form can be presented as a PDF by changing a single line of code. Adding a column to a table takes only one line, and in most cases *Athens* will be able to populate that column from the database without any further instruction.
-
-
-Starting an Application
-=======================
-
-For help installing *Athens* and beginning a new application, see the [application creation tutorial](doc/application-creation.md).
-
-
-Installation
-===============
-
-This library is published on packagist. To install using Composer, add the `"athens/core": "0.*"` line to your `"require"` dependencies:
-
-```
-{
- "require": {
- ...
- "athens/core": "0.*",
- ...
- }
-}
-```
-
-Because Athens depends on multiple other libraries, it is *highly* recommended that you use [Composer](https://getcomposer.org/) to install this library and manage dependencies.
-
-Example
-=======
-
-Athens uses classes generated by [PropelORM](http://propelorm.org/) to store and retrieve database rows. First, we define a student class in schema.xml:
-```
-
-
-
-
-
-
-
-
-
-```
-
-Now we can use Propel to generate a `Student` instance and create a form which will store the student in the database:
-```
-setId("student-form")
- ->addObject(new Student())
- ->build();
-
-$page = PageBuilder::begin()
- ->setId('student-submission-page')
- ->setType(Page::PAGE_TYPE_FULL_HEADER)
- ->setTitle("My Project: Enter a Student")
- ->setHeader("My Project")
- ->setSubHeader("Enter a Student")
- ->setBaseHref("..")
- ->setWritable($form)
- ->build();
-
-$page->render();
-```
-
-Add Ons
-=======
-
-Additional functionality is provided by the following libraries:
-
-1. [Encryption](https://github.com/AthensFramework/Encryption/)
-
- Seamlessly encrypt your sensitive data fields. The `Encryption` package is included with your Athens project to keep any table column encrypted while at rest in the database.
-
- *Athens* projects include the `Encryption` package by default; you only have to include a few extra lines in your `schema.xml` to add encryption to your models. See the [`Encryption` project documentation(/AthensFramework/Encryption/) or the [application creation tutorial](doc/application-creation.md) for an example.
-
-2. [SendGrid](https://github.com/AthensFramework/SendGrid/)
-
- Send your emails via your SendGrid account. With just a couple of extra lines in your settings, your *Athens* application will send all of its emails via SendGrid.
-
- The `SendGrid` package is not automatically included in your *Athens* project; you must follow the project instructions to use this package.
-
-3. [CSRF](https://github.com/AthensFramework/CSRF/)
-
- The standard *Athens* template project includes protection from CSRF attacks using the `CSRF` package. You can find out more by visiting the project documentation.
-
-Compatibility
-=============
-
-* PHP 5.6, 7.0
-
-Todo
-====
-
-See GitHub [issue tracker](https://github.com/AthensFramework/core/issues/).
-
-Getting Involved
-================
-
-Feel free to open pull requests or issues. [GitHub](https://github.com/AthensFramework/core/) is the canonical location of this project.
-
-Here's the general sequence of events for code contribution:
-
-1. Open an issue in the [issue tracker](https://github.com/AthensFramework/core/issues/).
-2. In any order:
- * Submit a pull request with a **failing** test that demonstrates the issue/feature.
- * Get acknowledgement/concurrence.
-3. Revise your pull request to pass the test in (2). Include documentation, if appropriate.
-
-[PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) compliance is enforced by [CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) in Travis.
diff --git a/assets/.htaccess b/assets/.htaccess
deleted file mode 100644
index 605d2f4..0000000
--- a/assets/.htaccess
+++ /dev/null
@@ -1 +0,0 @@
-Allow from all
diff --git a/assets/css/multi-panel.css b/assets/css/multi-panel.css
deleted file mode 100644
index f9f9e4b..0000000
--- a/assets/css/multi-panel.css
+++ /dev/null
@@ -1,277 +0,0 @@
-/* http://meyerweb.com/eric/tools/css/reset/
- v2.0 | 20110126
- License: none (public domain)
-*/
-
-html, body, div, span, applet, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-fieldset, form, label, legend,
-article, aside, canvas, details, embed,
-figure, figcaption, footer, header, hgroup,
-menu, nav, output, ruby, section, summary,
-time, mark, audio, video {
- margin: 0;
- padding: 0;
- border: 0;
- vertical-align: baseline;
-}
-/* HTML5 display-role reset for older browsers */
-article, aside, details, figcaption, figure,
-footer, header, hgroup, menu, nav, section, main {
- display: block;
-}
-body {
- line-height: 1;
-}
-ol, ul {
- list-style: none;
-}
-blockquote, q {
- quotes: none;
-}
-
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-
-/* --------------------------------
-
-Primary style
-
--------------------------------- */
-*, *::after, *::before {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-/* --------------------------------
-
-Main components
-
--------------------------------- */
-
-.cd-main-content {
- text-align: center;
-}
-.cd-main-content h1 {
- padding: 4em 0;
-}
-.cd-main-content .cd-btn {
- position: relative;
- display: inline-block;
- padding: 1em 2em;
- background-color: #89ba2c;
- border-radius: 50em;
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 0 5px rgba(0, 0, 0, 0.1);
- -webkit-transition: all 0.2s;
- -moz-transition: all 0.2s;
- transition: all 0.2s;
-}
-.no-touch .cd-main-content .cd-btn:hover {
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 0 20px rgba(0, 0, 0, 0.3);
-}
-
-.cd-panel {
- position: fixed;
- top: 0;
- left: 0;
- height: 100%;
- width: 100%;
- visibility: hidden;
- -webkit-transition: visibility 0s 0.6s;
- -moz-transition: visibility 0s 0.6s;
- transition: visibility 0s 0.6s;
-}
-.cd-panel::after {
- /* overlay layer */
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: transparent;
- cursor: pointer;
- -webkit-transition: background 0.3s 0.3s;
- -moz-transition: background 0.3s 0.3s;
- transition: background 0.3s 0.3s;
-}
-.cd-panel.is-visible {
- background: rgba(0, 0, 0, 0.4);
- visibility: visible;
- -webkit-transition: visibility 0s 0s;
- -moz-transition: visibility 0s 0s;
- transition: visibility 0s 0s;
-}
-.cd-panel.is-visible::after {
- background: rgba(0, 0, 0, 0.4);
- -webkit-transition: background 0.3s 0s;
- -moz-transition: background 0.3s 0s;
- transition: background 0.3s 0s;
-}
-
-@-webkit-keyframes cd-close-1 {
- 0%, 50% {
- -webkit-transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(45deg);
- }
-}
-@-moz-keyframes cd-close-1 {
- 0%, 50% {
- -moz-transform: rotate(0deg);
- }
- 100% {
- -moz-transform: rotate(45deg);
- }
-}
-@keyframes cd-close-1 {
- 0%, 50% {
- -webkit-transform: rotate(0deg);
- -moz-transform: rotate(0deg);
- -ms-transform: rotate(0deg);
- -o-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(45deg);
- -moz-transform: rotate(45deg);
- -ms-transform: rotate(45deg);
- -o-transform: rotate(45deg);
- transform: rotate(45deg);
- }
-}
-@-webkit-keyframes cd-close-2 {
- 0%, 50% {
- -webkit-transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(-45deg);
- }
-}
-@-moz-keyframes cd-close-2 {
- 0%, 50% {
- -moz-transform: rotate(0deg);
- }
- 100% {
- -moz-transform: rotate(-45deg);
- }
-}
-@keyframes cd-close-2 {
- 0%, 50% {
- -webkit-transform: rotate(0deg);
- -moz-transform: rotate(0deg);
- -ms-transform: rotate(0deg);
- -o-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(-45deg);
- -moz-transform: rotate(-45deg);
- -ms-transform: rotate(-45deg);
- -o-transform: rotate(-45deg);
- transform: rotate(-45deg);
- }
-}
-
-
-.cd-panel-container {
- position: fixed;
- width: 90%;
- height: 100%;
- top: 0;
- background: #ddd;
- z-index: 1;
- -webkit-transition-property: -webkit-transform;
- -moz-transition-property: -moz-transform;
- transition-property: transform;
- -webkit-transition-duration: 0.3s;
- -moz-transition-duration: 0.3s;
- transition-duration: 0.3s;
- -webkit-transition-delay: 0.1s;
- -moz-transition-delay: 0.1s;
- transition-delay: 0.1s;
-}
-.from-right .cd-panel-container {
- right: 0;
- -webkit-transform: translate3d(100%, 0, 0);
- -moz-transform: translate3d(100%, 0, 0);
- -ms-transform: translate3d(100%, 0, 0);
- -o-transform: translate3d(100%, 0, 0);
- transform: translate3d(100%, 0, 0);
-}
-.from-left .cd-panel-container {
- left: 0;
- -webkit-transform: translate3d(-100%, 0, 0);
- -moz-transform: translate3d(-100%, 0, 0);
- -ms-transform: translate3d(-100%, 0, 0);
- -o-transform: translate3d(-100%, 0, 0);
- transform: translate3d(-100%, 0, 0);
-}
-.is-visible .cd-panel-container {
- -webkit-transform: translate3d(0, 0, 0);
- -moz-transform: translate3d(0, 0, 0);
- -ms-transform: translate3d(0, 0, 0);
- -o-transform: translate3d(0, 0, 0);
- transform: translate3d(0, 0, 0);
- -webkit-transition-delay: 0s;
- -moz-transition-delay: 0s;
- transition-delay: 0s;
-}
-
-.cd-panel-content {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- padding: 70px 5%;
- overflow: auto;
- /* smooth scrolling on touch devices */
- -webkit-overflow-scrolling: touch;
-}
-.cd-panel-content p {
- line-height: 1.4;
- margin: 2em 0;
-}
-.cd-panel-content p:first-of-type {
- margin-top: 0;
-}
-
-.panel-button-container {
- -ms-transform: rotate(90deg);
- -webkit-transform: rotate(90deg);
- transform: rotate(90deg);
-
- width:600px;
-
- position: fixed;
- right:-265px;
- bottom:450px;
-
- display:none;
- opacity:0;
-}
-
-.panel-button-container a {
- padding:20px;
-}
-
-.panel-button-container button {
- min-width:200px;
- margin:auto;
- padding: 0 20px;
-}
-
-.panel-button-container span.message:after {
- content: '\0000a0\21D1';
-}
-
-.panel-button-container span.message:before {
- content: '\21D1\0000a0';
-}
-
-
diff --git a/assets/css/print.css b/assets/css/print.css
deleted file mode 100644
index 9be698d..0000000
--- a/assets/css/print.css
+++ /dev/null
@@ -1,97 +0,0 @@
-@media print {
- *{
- font-size:12px !important;
- min-height:0 !important;
- }
-
- table {
- width:110% !important;
- border-color:black !important;
- margin-bottom:10px !important;
- }
-
- .loading-gif {
- display:none;
- }
-
- h1, h2 {
- margin-top:0 !important;
- margin-bottom:2px;
- float:none !important;
- }
-
- h1 {
- font-size:17px !important;
- }
-
- h2 {
- font-size:15px !important;
- }
-
- br {
- line-height:2px !important;
- }
-
- p {
- margin-bottom:2px !important;
- }
-
- p.print-link {
- display:none;
- }
-
- div.section-label {
- background-color: #bbb !important;
- margin-left:-30px !important;
-
- font-weight: 600 !important;
- }
-
- .table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td {
- padding:0 !important;
- }
-
- label {
- margin-bottom:0 !important;
- }
-
- div.text-area-response-reader {
- margin-bottom:5px !important;
- }
-
- .div1, .div2, .div3, .div4, .div5, .div6, .div7, .div8 {
- display:block !important;
- }
-
- #pageNav {
- display:none !important;
- }
-
- #pageContent {
- width:95%;
- }
-}
-
-
-body.pdf div.section-label {
- background-color:#ddd;
- color:black;
-}
-
-body.pdf div.section-label:first-of-type {
- display:none;
-}
-
-body.pdf button {
- display:none;
-}
-
-body.pdf select {
- display:none;
-}
-
-
-
-
-
-
diff --git a/assets/css/web.css b/assets/css/web.css
deleted file mode 100644
index 0848e83..0000000
--- a/assets/css/web.css
+++ /dev/null
@@ -1,590 +0,0 @@
-h1.header {
- float:left;
- margin:0;
-}
-
-h2.subheader {
- margin-top:-15px;
- float:left;
- clear:left
-}
-
-.section-label {
- background-color: #646464;
- color: white;
- margin-left:-30px;
- margin-bottom:8px;
- margin-top:20px;
- padding-left:30px;
- padding-bottom:5px;
-
- font-family: "Encode Sans Compressed",sans-serif;
- font-weight: 600;
-}
-
-div.form-group[data-field-type-for="section-label"] label {
- display:none;
-}
-
-.cd-panel-container td {
- padding:5px !important;
-}
-
-input {
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
-
-}
-
-div.search-icon {
- background: url("http://github.com/images/search-icon.svg") no-repeat;
- margin:6px 12px;
- width:19px;
- height:20px;
- float:right;
- cursor: pointer;
-}
-
-div.loading-gif {
- background: url("http://github.com/images/ajax-loader.gif") no-repeat;
- margin:20% auto 0 auto;
- width:55px;
- height:55px;
- opacity:.6;
-}
-
-div.loading-gif.hidden {
- position:fixed;
- z-index:-1
-}
-
-div.loading-gif.class-loader {
- position:absolute;
- z-index:100000;
- top:0;
- left:50%
-}
-
-div.search-icon:hover, div.search-icon:focus {
- background-image:url("http://github.com/images/search-icon-gold.svg");
-}
-
-#mask-screen {
- position:fixed;
- width:100%;
- height:0;
- z-index:500;
-
- background-color:rgba(255, 255, 255, 0.4);
-
- opacity:0;
-
- transition: opacity .25s ease-in-out;
-}
-
-.search-div {
- z-index:600;
- position:fixed;
-
- min-height:20%;
- width:620px;
-
- margin-top:20%;
- margin-left:auto;
- margin-right:auto;
- background-color:white;
- border-radius:3px;
- border:1px solid lightgrey;
-
- left:0;
- right:0;
- display:none;
-
- transition: opacity .25s ease-in-out;
-}
-
-.search-div table {
- margin:5px;
- width:100%
-}
-
-.search-div input[type="submit"] {
- float:right;
- margin-right:25px;
-}
-
-.search-div td.fieldname select {
- max-width:320px;
-}
-
-.search-div .section-label {
- margin-top:0;
- margin-left:0;
- padding:5px 0 7px 15px;
- border-top-left-radius:3px;
- border-top-right-radius:3px;
-}
-
-div.notification {
- border-radius:5px;
- color:black;
- padding-left:5px;
- opacity:0;
- margin:3px;
-
- transition: opacity .4s ease-in-out;
-}
-
-div.notification.success {
- background-color:#347C17;
-}
-
-div.notification.failure {
- background-color:#DC381F;
-}
-
-.chosen-single {
- height:35px !important;
- border-radius:3px !important;
- line-height:35px !important;
- font-size:16px !important;
-}
-
-span.field-errors {
- color:red;
-}
-
-.form-errors, .pickaform-errors {
- color:red;
-}
-
-form>tbody>tr:last-child {
- margin-bottom:40px !important;
-}
-
-br + span.field-errors {
- display:block;
- margin-top:-40px !important;
- margin-bottom:40px;
-}
-
-.section-label a {
- color:white;
-}
-
-.section-label a:hover, a:focus {
- color:#B6A379;
-}
-
-div.ajax-loaded-section {
- transition: opacity .2s ease-in-out;
-}
-
-table {
- border-collapse: separate;
- border-spacing: 0 5px;
- margin-bottom:10px;
- width:95%
-}
-td.label {
- min-width:25%;
-}
-td:first-child {
- padding-left:3px;
- border-top-left-radius: 5px;
- border-bottom-left-radius: 5px;
-}
-td:last-child {
- border-bottom-right-radius: 5px;
- border-top-right-radius: 5px;
-}
-
-.clickable, th.clickable {
- cursor: pointer;
- transition: background-color .3s ease-in-out;
-}
-
-tr.highlighted {
- background-color: #dcdcdc;
- border-radius:3px;
-}
-
-.clickable:hover {
- background-color: #dcdcdc;
- border-radius:3px;
-}
-
-.clickable:active {
- background-color: white;
-}
-
-th.clickable:hover {
- background-color: #DDD;
- border-radius:3px;
-}
-
-th.sorted.ascending::after {
- content: "\0000a0\21e3";
-}
-
-th.sorted.descending::after {
- content: "\0000a0\21e1";
-}
-
-p.filter-feedback {
- text-align:center;
- font-size:.8em;
- font-weight:800;
-}
-
-div.filter-controls {
- display:none;
-}
-
-th {
- padding-left:3px;
- padding-right:20px;
-}
-
-td {
- padding-left:3px;
-}
-
-input[type=checkbox] {
- margin-left:35%;
-}
-
-span.multiple-choice-field input[type=checkbox] {
- margin-left: 2px;
-}
-
-textarea {
- margin-bottom:5px;
-}
-
-textarea.disabled, input.disabled {
- background-color:#ccc;
- color:#999;
-}
-
-span.disabled {
- opacity:.5;
-}
-
-table.statement {
- width:90%;
- border:none;
- margin-bottom:0 !important;
-}
-
-select.oversized {
- float:right;
- margin-right:-100px;
- margin-bottom:30px;
-}
-
-#top-filters select {
- margin-right:3px;
-}
-
-div.pagination-container {
- float:right;
- margin-right:30px;
- margin-top:-5px;
- font-size:20px
-}
-
-a.pagination-arrow {
- cursor:pointer;
-}
-
-a.pagination-arrow.hidden {
- opacity:0;
- pointer-events: none;
- cursor:default
-}
-
-select.pagination-filter {
- font-size:13px;
- border-radius:3px;
- background-color: #646464
-}
-
-span.pagination-arrow-container {
- min-width:40px;
-}
-
-button:disabled {
- color:#aaa;
-}
-
-div.link-section {
- width:100%;
- text-align:right;
- margin-bottom:-20px;
-}
-
-div.select-a-section-container {
- width:110%;
- overflow:hidden;
- border-color:#E7E7E7;
- border-style:solid;
- border-width:1px 0 0 0;
- margin-left:-20%;
-}
-
-div.select-a-section-container div.left {
- float:right;
- width:20%;
- text-align:center;
-}
-
-div.select-a-section-container div.right {
- float:right;
- border-right:1px;
- border-top:0;
- border-bottom:1px;
- border-left:0;
- border-color:#E7E7E7;
- border-style:solid;
- width:80%;
- min-height:500px;
-}
-
-div.select-a-section-container div.option {
- border:1px solid #E7E7E7;
- border-width:0 1px 1px 1px;
- height:40px;
- line-height:40px;
- background-color: #DDD;
- color:#AAA;
- cursor:pointer;
- transition: all .3s ease-in-out;
- white-space: nowrap;
-}
-
-div.select-a-section-container div.option.selected {
- background-color: white;
- color: black;
- border-right-color:white;
-}
-
-div.select-a-section-container div.option:not(.selected):not(.header):hover {
- background-color: #EAEAEA;
- color: #555;
- border-right-color:#EEE;
-}
-
-div.select-a-section-container div.option.header {
- background-color: #dcdcdc;
- color: black;
- cursor:auto;
-}
-
-div.select-a-section-container div.filler {
- border:1px solid #E7E7E7;
- border-width:0 1px 0 0;
- padding-bottom:50000px;
- margin-bottom:-50000px;
-}
-
-div.select-a-section-container div.control-container {
- float: left;
- line-height: 40px;
- height: 40px;
- padding-left: 10px;
- min-width:20px;
-}
-
-div.select-a-section-container div.label-container {
- margin-left:-30px;
- width:100%;
-}
-
-div.select-a-section-container div.section-label {
- color: #646464;
- background-color:white;
- margin-left:5px;
- font-family: 'Open Sans', sans-serif;
- padding-left:0;
- margin-bottom:0;
-}
-
-div.select-a-section-container table {
- border: none;
-}
-
-div.select-a-section-container div.selection {
- display: none;
-}
-
-div.select-a-section-container div.selection.default {
- display: block;
- margin:7px;
- margin-left:12px;
- color:#656565;
-}
-
-div.select-a-section-container p.form-errors {
- display:none;
-}
-
-div.select-a-section-container table {
- margin-left:5px;
-}
-
-table.multi-adder tr.prototypical {
- display: none;
-}
-
-tr.form-row td[class*="remove"] {
- cursor:pointer;
- text-align:center;
- font-weight:bold;
- font-size:2em;
- color: #950000;
-}
-
-div.code {
- width:95%;
- border-radius:5px;
- border: 1px solid black;
- white-space:pre-wrap;
- padding:5px;
- margin-left:auto;
- margin-right:auto;
- font-family:monospace;
- font-size:.9em;
-}
-
-span.code {
- font-family:monospace;
- background-color: #ffdfc9;
- border: 1px solid #ff8f7b;
- border-radius:3px;
- padding: 0 3px;
-}
-
-p.field-label {
- font-weight:700;
- font-size:17px;
-}
-
-div.uw-container-inner {
- min-height:73%;
-}
-
-.page-width {
- width:100%;
-}
-
-#page-content {
- min-width:500px;
- margin:auto
-}
-
-#loadItHere #page-content {
- width:100%;
-}
-
-br.footer-break {
- line-height:90px
-}
-
-#top-filters {
- float:right;
- margin-top:8px
-}
-
-#notification-area {
- position:fixed;
- width:600px;
- top:30px;
- right:20px;
- z-index:100000
-}
-
-br.page-content-head {
- line-height:70px;
- clear:both
-}
-
-p.important-task {
- background-color: #b3ffa0;
- padding:10px;
- border-radius: 5px;
- border:1px solid darkgreen;
-}
-
-li > p {
- margin-top:10px;
-}
-
-tr button {
- line-height:19px;
-}
-
-tr a button {
- color: rgb(89, 89, 89);
-}
-
-button.form-action, input.form-action {
- margin-right:60px;
-}
-
-div.breadcrumbs-container {
- min-width:500px;
- position:relative;
- margin:10px auto 0px;
-}
-
-tr.highlightable:hover {
- background-color: #f0f0f0;
-}
-
-tr.highlightable.highlighted:hover {
- background-color: #dcdcdc;
-}
-
-tr.highlightable {
- cursor: pointer;
-}
-
-label.field-label:not(.empty)::after {
- content: ":";
-}
-
-label.field-label.required::after {
- content: ":*";
-}
-
-form.inline label.field-label {
- display:inline;
-}
-
-#object-manager-table td {
- max-width: 400px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-#page-content-body {
- clear:left;
- padding-top:10px;
-}
-
-div.select-container {
- display: inline-block;
-}
-
-.chosen-container .chosen-results li.active-result {
- font-size:17px;
-}
-
-label.radio-label, .inline-fields label.radio-label {
- width:initial;
- font-weight:normal;
-}
-
diff --git a/assets/images/ajax-loader.gif b/assets/images/ajax-loader.gif
deleted file mode 100644
index ddb7ff1..0000000
Binary files a/assets/images/ajax-loader.gif and /dev/null differ
diff --git a/assets/images/search-icon-gold.svg b/assets/images/search-icon-gold.svg
deleted file mode 100644
index d6c4a72..0000000
--- a/assets/images/search-icon-gold.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/search-icon.svg b/assets/images/search-icon.svg
deleted file mode 100644
index 6de5fbd..0000000
--- a/assets/images/search-icon.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/js/admin.js b/assets/js/admin.js
deleted file mode 100644
index 7dd6543..0000000
--- a/assets/js/admin.js
+++ /dev/null
@@ -1,16 +0,0 @@
-athens.admin = (function () {
-
- $(function () {
- var adminTablesContainer = $('#admin-tables-container');
-
- if (adminTablesContainer.length > 0) {
- adminTablesContainer.data('request-uri', adminTablesContainer.data('request-uri') + '?mode=table');
- athens.ajax_section.loadSection('admin-tables-container');
- }
-
- })
-
-}(athens.ajax_section));
-
-
-
diff --git a/assets/js/ajax-section.js b/assets/js/ajax-section.js
deleted file mode 100644
index 6fee296..0000000
--- a/assets/js/ajax-section.js
+++ /dev/null
@@ -1,254 +0,0 @@
-athens.ajax_section = (function () {
-
- /**
- * The set of get variables which shall be included when requesting a section
- *
- * @type {{}}
- */
- var getVarRegistry = {};
-
- /**
- * A dictionary of sections, by name or handle
- *
- * @type []
- */
- var sectionRegistry = [];
-
- /**
- * An array of functions to call following every section load
- *
- * @type {Array}
- */
- var postSectionActions = [];
-
- /**
- * Represents a "get variable" to be encoded into a url string
- *
- * @param sectionName
- * @param filterName
- * @param argName
- * @param value
- * @returns {{sectionName: *, filterName: *, argName: *, value: *}}
- */
- var getVar = function (sectionName, filterName, argName, value) {
- return {
- sectionName: sectionName,
- filterName: filterName,
- argName: argName,
- value: value
- };
- };
-
- /**
- * Register a get var for inclusion in section requests
- *
- * @param getVar
- */
- var registerGetVar = function (getVar) {
- if (!(getVar.sectionName in getVarRegistry)) {
- getVarRegistry[getVar.sectionName] = {};
- }
-
- if (!(getVar.filterName in getVarRegistry[getVar.sectionName])) {
- getVarRegistry[getVar.sectionName][getVar.filterName] = {};
- }
-
- getVarRegistry[getVar.sectionName][getVar.filterName][getVar.argName] = getVar.value;
- };
-
- /**
- * De-register a getVar
- *
- * @param getVar
- */
- var unsetGetVar = function (getVar) {
- if (getVar.sectionName in getVarRegistry &&
- getVar.filterName in getVarRegistry[getVar.sectionName] &&
- getVar.argName in getVarRegistry[getVar.sectionName][getVar.filterName]
- ) {
- delete getVarRegistry[getVar.sectionName][getVar.filterName][getVar.argName];
- }
- };
-
- /**
- *
- * @param sectionName
- * @param filterName
- * @param argName
- * @returns {*}
- */
- var getGetVarValue = function (sectionName, filterName, argName) {
-
- if (sectionName in getVarRegistry &&
- filterName in getVarRegistry[sectionName] &&
- argName in getVarRegistry[sectionName][filterName]
- ) {
- return getVarRegistry[sectionName][filterName][argName];
- }
- return null;
- };
-
- /**
- * Render the registered get variables for a given AJAXSection into a URL-encoded string
- *
- * @param {string} name The name or handle of the AJAXSection for which we are encoding the get variables
- * @returns {string} The URL-encoded string of get variables
- */
- var renderGetVars = function (name) {
- if (!(name in getVarRegistry)) {
- return "";
- }
-
- var ret = "";
- for (var filterName in getVarRegistry[name]) {
- if (getVarRegistry[name].hasOwnProperty(filterName)) {
- for (var argName in getVarRegistry[name][filterName]) {
- if (getVarRegistry[name][filterName].hasOwnProperty(argName)) {
- ret += filterName + "-" + argName + "=" + getVarRegistry[name][filterName][argName] + "&";
- }
- }
- }
- }
-
- return ret;
- };
-
- function getQueryParams(qs)
- {
- qs = qs.split('+').join(' ');
-
- var params = {},
- tokens,
- re = /[?&]?([^=]+)=([^&]*)/g;
-
- while (tokens = re.exec(qs)) {
- params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
- }
-
- return params;
- }
-
- function cleanQueryParams(url)
- {
- var qs = url.substr(url.indexOf("?") + 1);
- params = getQueryParams(qs);
-
- qs = '';
- for (var param in params) {
- if (params.hasOwnProperty(param)) {
- qs += encodeURIComponent(param) + '=' + encodeURIComponent(params[param]) + '&';
- }
- }
-
- return url.split('?')[0] + '?' + qs;
- }
-
- /**
- * Load a registered section by name, ignoring the query variables in its indicated path.
- *
- * @param {string} id The name or handle of the section, as registered in sectionRegistry by registerAJAXSection
- * @returns {*}
- */
- var bareLoadSection = function (id) {
- var targetDiv, targetUrl;
-
- targetDiv = $("#" + id);
- if (sectionRegistry.hasOwnProperty(id) && !targetDiv.data("request-uri")) {
- targetUrl = sectionRegistry[id];
- } else {
- targetUrl = targetDiv.data("request-uri");
- sectionRegistry[id] = targetUrl;
- }
-
- return doLoadSection(id, targetDiv[0], targetUrl.split("?")[0]);
- };
-
- /**
- * Load a registered section by name
- *
- * @param {string} id The name or handle of the section, as registered in sectionRegistry by registerAJAXSection
- * @returns {*}
- */
- var loadSection = function (id) {
- var targetDiv, targetUrl, result;
-
- targetDiv = $("#" + id);
-
- // There should be only one div with the given id...but in case there's not, reload all of them
- for (var i = 0; i < targetDiv.length; i++) {
- if (sectionRegistry.hasOwnProperty(id) && !targetDiv.data("request-uri")) {
- targetUrl = sectionRegistry[id];
- } else {
- targetUrl = targetDiv.data("request-uri");
- sectionRegistry[id] = targetUrl;
- }
- result = doLoadSection(id, targetDiv[0], targetUrl);
- }
-
- return result;
-
- };
-
- /**
- * Load a registered section by name
- *
- * @param {string} id The name or handle of the section, as registered in sectionRegistry by registerAJAXSection
- * @param {element} targetDiv
- * @param {string} targetUrl
- * @returns {*}
- */
- var doLoadSection = function (id, targetDiv, targetUrl) {
- targetDiv = $(targetDiv);
- targetDiv.css("opacity", 0.7).append("");
-
- if (targetUrl.indexOf("?") === -1) {
- targetUrl += "?";
- }
-
- targetUrl = targetUrl + renderGetVars(id);
-
- targetUrl = cleanQueryParams(targetUrl);
-
- return $.get(
- targetUrl,
- function (data) {
- var targetResponse = $(data).find("#" + id);
- targetDiv.replaceWith(targetResponse);
- doPostSectionActions(targetDiv);
- }
- );
- };
-
- /**
- * Add a function to the array of callables to perform after every section load.
- *
- * @param f
- */
- var registerPostSectionAction = function (f) {
- postSectionActions.push(f);
- };
-
- /**
- * Execute those callables which should be called after every section load
- * @param target
- */
- var doPostSectionActions = function (target) {
- for (var i = 0; i < postSectionActions.length; i++) {
- postSectionActions[i](target);
- }
- };
-
- return {
- doPostSectionActions: doPostSectionActions,
- registerPostSectionAction: registerPostSectionAction,
- bareLoadSection: bareLoadSection,
- loadSection: loadSection,
- registerGetVar: registerGetVar,
- unsetGetVar: unsetGetVar,
- getVar: getVar,
- getGetVarValue: getGetVarValue
- };
-
-}());
-
-
diff --git a/assets/js/ajax.js b/assets/js/ajax.js
deleted file mode 100644
index 3a0b9d0..0000000
--- a/assets/js/ajax.js
+++ /dev/null
@@ -1,205 +0,0 @@
-athens.ajax = (function () {
-
- /**
- * Private method which encapsulates retrieving the CSRFTOKEN global.
- *
- * @returns {string}
- */
- var getCSRFToken = function () {
- return CSRFTOKEN;
- };
-
- /**
- * Turn a response of the form `{"status":"success", "message":"Operation succeeded!"}` into
- * an Athens alert.
- *
- * @param {string} data
- */
- var alertResponseData = function (data) {
- data = JSON.parse(data);
- athens.alert.makeAlert(data.message, data.status);
- };
-
- /**
- * Make an Ajax call.
- *
- * @param {string} url
- * @param {string} type
- * @param {object} [settings={}]
- * @param {object} [data={}]
- * @param {function} [done]
- * @param {function} [fail]
- * @returns {jqXHR}
- */
- var call = function (url, type, settings, data, done, fail) {
- if (typeof(settings) === 'undefined') {
- settings = {};
- }
-
- if (typeof(data) === 'undefined') {
- data = {};
- }
-
- if (typeof(done) === 'undefined') {
- done = function () {};
- }
-
- if (typeof(fail) === 'undefined') {
- fail = function (jqXHR, textStatus, errorThrown) {
- console.log(jqXHR);
- athens.alert.makeAlert('Unexpected error. More detail may be available in the console or network response.', "error");
- }
- }
-
- settings.url = url;
- settings.type = type;
- settings.data = data;
-
- return $.ajax(settings).done(done).fail(fail);
- };
-
- /**
- * GET via Ajax.
- *
- * @param {string} url
- * @param {object} [data={}]
- * @param {function} [done]
- * @param {function} [fail]
- * @returns {jqXHR}
- */
- var get = function (url, data, done, fail) {
- if (typeof(data) === 'undefined') {
- data = {};
- }
-
- if (typeof(fail) === 'undefined') {
- fail = function (jqXHR, textStatus, errorThrown) {};
- }
-
- if (typeof(done) === 'undefined') {
- done = function (data, textStatus, jqXHR) {};
- }
-
- return call(url, 'GET', {}, data, done, fail)
- };
-
- /**
- * POST data via Ajax.
- *
- * @param {string} url
- * @param {object} [data={}]
- * @param {function} [done]
- * @param {function} [fail]
- * @returns {jqXHR}
- */
- var post = function (url, data, done, fail) {
- if (typeof(data) === 'undefined') {
- data = {};
- }
-
- if (typeof(fail) === 'undefined') {
- fail = function (jqXHR, textStatus, errorThrown) {};
- }
-
- if (typeof(done) === 'undefined') {
- done = function (data, textStatus, jqXHR) {
- try {
- alertResponseData(data);
- data = JSON.parse(data);
- if (data.status === "success") {
- success(data);
- }
- } catch (err) {
- console.log(err.message);
- athens.alert.makeAlert("Unexpected error. More detail may be available in the console or network response.", "error");
- }
- };
- }
-
- return call(url, 'POST', {'csrf_token': getCSRFToken}, data, done, fail)
- };
-
- /**
- * Submit a form, via Ajax. Replace the submitted form on the page with the result.
- *
- * If a form has errors, then the form (with error messages) will be displayed to
- * the user.
- *
- * If a form does not have errors, then `submitForm` will issue an additional GET
- * request for the form and display the result of *that* request in place of the
- * submitted form.
- *
- * @param {element} form
- * @param {function} [success]
- * @returns {jqXHR}
- */
- function submitForm(form, success)
- {
- athens.alert.makeAlert("Submitting form.", "info");
-
- if (typeof(success) === 'undefined') {
- success = function () {};
- }
-
- var data = new FormData(form);
-
- form = $(form);
-
- var url = form.data("request-uri");
-
-
- var formId = form.attr('id');
-
- var done = function (data, textStatus, jqXHR) {
- try {
- var formPOSTResult = $("
Framework is a modern PHP web framework built within the University of Washington's Office of Student Financial Aid.
+
+
+
+Easily create forms and manage submission results in Framework created web-applications
+
+
Applications built within Framework are:
+
+
+
+
Legible
+
+
Framework separates declaring what elements shall be on a page from what those elements should look like and the logic of how those elements should behave. Under this model, creating a page is not much more complicated than simply listing the presentational elements that should be present.
+
+
+
Extensible
+
+
This separation of concerns also promotes reusability of components: a web-displayed table can be turned into Excel by changing a single line of code; a web-displayed form can be presented as a PDF by changing a single line of code. Adding a column to a table takes only one line, and in most cases Framework will be able to populate that column from the database without any further instruction.
+
+
+
Secure
+
+
Framework automatically provides strong protection against a number of web attacks, including CSRF, XSS, and database injection.
+
+
Framework also provides easy, seamless encryption for sensitive student information. Encrypting a database column requires a simple declaration in your model schema for each data-field you want to protect. Calls to and from the database on that encrypted data are transparent; Framework knows which fields are encrypted and handles the encryption/decryption behind the scenes.
+
+
+
Pretty
+
+
Framework includes page templates derived from the University of Washington's Boundless theme and styling. Additional user-interface elements extend that brand's base functionality. And these default templates can be easily overridden with custom themes to implement your own department or organization's brand.
+
+
+
+
+Installation
+
+
This library is published on packagist. To install using Composer, add the "uwdoem/encryption": ">=0.2" line to your "require" dependencies:
Employees of the University of Washington may use this code in any capacity, without reservation. This code is provided in the hope that it may be useful. However, providing does not imply that any organization involved in its creation or provision will provide support or assume liability for its use.
+
+
+Getting Involved
+
+
Feel free to open pull requests or issues. GitHub is the canonical location of this project.