diff --git a/.github/workflows/nightly_unit_tests.yml b/.github/workflows/nightly_unit_tests.yml deleted file mode 100644 index 01dd2112..00000000 --- a/.github/workflows/nightly_unit_tests.yml +++ /dev/null @@ -1,73 +0,0 @@ -# This is a basic workflow to help you get started with Actions - -name: Nigthly Unit Tests Run - -on: - schedule: - - cron: '0 0 * * *' # At the end of every day - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "unit-tests" - unit-tests: - # The type of runner that the job will run on - runs-on: ubuntu-latest - env: - APP_ENV: testing - APP_DEBUG: true - APP_KEY: base64:4vh0op/S1dAsXKQ2bbdCfWRyCI9r8NNIdPXyZWt9PX4= - DEV_EMAIL_TO: smarcet@gmail.com - APP_URL: http://localhost - DB_CONNECTION: mysql - DB_HOST: 127.0.0.1 - DB_PORT: 3306 - DB_DATABASE: idp_test - DB_USERNAME: root - DB_PASSWORD: 1qaz2wsx - REDIS_HOST: 127.0.0.1 - REDIS_PORT: 6379 - REDIS_DB: 0 - REDIS_PASSWORD: 1qaz2wsx - REDIS_DATABASES: 16 - SSL_ENABLED: false - SESSION_DRIVER: redis - PHP_VERSION: 8.3 - services: - mysql: - image: mysql:8.0 - env: - MYSQL_ROOT_PASSWORD: ${{env.DB_PASSWORD}} - MYSQL_DATABASE: ${{env.DB_DATABASE}} - ports: - - 3306:3306 - options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 - steps: - - name: Create Redis - uses: supercharge/redis-github-action@1.8.1 - with: - redis-port: ${{env.REDIS_PORT}} - redis-password: ${{env.REDIS_PASSWORD}} - # Downloads a copy of the code in your repository before running CI tests - - name: Check out repository code - uses: actions/checkout@v4 - - name: Install PHP - uses: "shivammathur/setup-php@v2" - with: - php-version: ${{env.PHP_VERSION}} - extensions: pdo_mysql, mbstring, exif, pcntl, bcmath, sockets, gettext, apcu - - name: Install dependencies - uses: "ramsey/composer-install@v3" - env: - COMPOSER_AUTH: '{"github-oauth": {"github.com": "${{ secrets.PAT }}"} }' - - name: 'Run Tests' - run: | - ./update_doctrine.sh - php artisan doctrine:migrations:migrate --no-interaction - php artisan db:seed --force - vendor/bin/phpunit --log-junit results.xml - - name: 'Upload Unit Test Output' - uses: actions/upload-artifact@v4 - with: - name: output - path: /output.log - retention-days: 5 diff --git a/.github/workflows/pull_request_unit_tests.yml b/.github/workflows/pull_request_unit_tests.yml deleted file mode 100644 index 319b1d1d..00000000 --- a/.github/workflows/pull_request_unit_tests.yml +++ /dev/null @@ -1,76 +0,0 @@ -# This is a basic workflow to help you get started with Actions - -name: Unit Tests On Pull Request - -# Controls when the workflow will run -on: - # Triggers the workflow on pull request events but only for the "main" branch - pull_request: - types: [opened, reopened, edited,synchronize] - branches: [ "main" ] - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "unit-tests" - unit-tests: - # The type of runner that the job will run on - runs-on: ubuntu-latest - env: - APP_ENV: testing - APP_DEBUG: true - APP_KEY: base64:4vh0op/S1dAsXKQ2bbdCfWRyCI9r8NNIdPXyZWt9PX4= - DEV_EMAIL_TO: smarcet@gmail.com - APP_URL: http://localhost - DB_CONNECTION: mysql - DB_HOST: 127.0.0.1 - DB_PORT: 3306 - DB_DATABASE: idp_test - DB_USERNAME: root - DB_PASSWORD: 1qaz2wsx - REDIS_HOST: 127.0.0.1 - REDIS_PORT: 6379 - REDIS_DB: 0 - REDIS_PASSWORD: 1qaz2wsx - REDIS_DATABASES: 16 - SSL_ENABLED: false - SESSION_DRIVER: redis - PHP_VERSION: 8.3 - services: - mysql: - image: mysql:8.0 - env: - MYSQL_ROOT_PASSWORD: ${{env.DB_PASSWORD}} - MYSQL_DATABASE: ${{env.DB_DATABASE}} - ports: - - 3306:3306 - options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 - steps: - - name: Create Redis - uses: supercharge/redis-github-action@1.8.1 - with: - redis-port: ${{env.REDIS_PORT}} - redis-password: ${{env.REDIS_PASSWORD}} - # Downloads a copy of the code in your repository before running CI tests - - name: Check out repository code - uses: actions/checkout@v4 - - name: Install PHP - uses: "shivammathur/setup-php@v2" - with: - php-version: ${{env.PHP_VERSION}} - extensions: pdo_mysql, mbstring, exif, pcntl, bcmath, sockets, gettext, apcu - - name: Install dependencies - uses: "ramsey/composer-install@v3" - env: - COMPOSER_AUTH: '{"github-oauth": {"github.com": "${{ secrets.PAT }}"} }' - - name: 'Run Tests' - run: | - ./update_doctrine.sh - php artisan doctrine:migrations:migrate --no-interaction - php artisan db:seed --force - vendor/bin/phpunit --log-junit results.xml - - name: 'Upload Unit Test Output' - uses: actions/upload-artifact@v4 - with: - name: output - path: /output.log - retention-days: 5 \ No newline at end of file diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml deleted file mode 100644 index af88d4f7..00000000 --- a/.github/workflows/push.yml +++ /dev/null @@ -1,74 +0,0 @@ -# This is a basic workflow to help you get started with Actions - -name: Unit Tests On Push - -# Controls when the workflow will run -on: push - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "unit-tests" - unit-tests: - # The type of runner that the job will run on - runs-on: ubuntu-latest - env: - APP_ENV: testing - APP_DEBUG: true - APP_KEY: base64:4vh0op/S1dAsXKQ2bbdCfWRyCI9r8NNIdPXyZWt9PX4= - DEV_EMAIL_TO: smarcet@gmail.com - APP_URL: http://localhost - DB_CONNECTION: mysql - DB_HOST: 127.0.0.1 - DB_PORT: 3306 - DB_DATABASE: idp_test - DB_USERNAME: root - DB_PASSWORD: 1qaz2wsx - REDIS_HOST: 127.0.0.1 - REDIS_PORT: 6379 - REDIS_DB: 0 - REDIS_PASSWORD: 1qaz2wsx - REDIS_DATABASES: 16 - SSL_ENABLED: false - SESSION_DRIVER: redis - PHP_VERSION: 8.3 - OTEL_SDK_DISABLED: true - OTEL_SERVICE_ENABLED: false - services: - mysql: - image: mysql:8.0 - env: - MYSQL_ROOT_PASSWORD: ${{env.DB_PASSWORD}} - MYSQL_DATABASE: ${{env.DB_DATABASE}} - ports: - - 3306:3306 - options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 - steps: - - name: Create Redis - uses: supercharge/redis-github-action@1.8.1 - with: - redis-port: ${{env.REDIS_PORT}} - redis-password: ${{env.REDIS_PASSWORD}} - # Downloads a copy of the code in your repository before running CI tests - - name: Check out repository code - uses: actions/checkout@v4 - - name: Install PHP - uses: "shivammathur/setup-php@v2" - with: - php-version: ${{env.PHP_VERSION}} - extensions: pdo_mysql, mbstring, exif, pcntl, bcmath, sockets, gettext, apcu - - name: Install dependencies - uses: "ramsey/composer-install@v3" - env: - COMPOSER_AUTH: '{"github-oauth": {"github.com": "${{ secrets.PAT }}"} }' - - name: 'Run Tests' - run: | - ./update_doctrine.sh - php artisan doctrine:migrations:migrate --no-interaction - php artisan db:seed --force - vendor/bin/phpunit --log-junit results.xml - - name: 'Upload Unit Test Output' - uses: actions/upload-artifact@v4 - with: - name: output - path: results.xml - retention-days: 5 diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..903f6392 --- /dev/null +++ b/.htaccess @@ -0,0 +1,20 @@ + + + Options -MultiViews + + + RewriteEngine On + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^(.*)/$ /$1 [L,R=301] + + # Handle Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/assets/css/auth/consent.css b/assets/css/auth/consent.css new file mode 100644 index 00000000..4d53558a --- /dev/null +++ b/assets/css/auth/consent.css @@ -0,0 +1,12 @@ +.consents-container{ + max-height: 250px; + overflow-y: auto; +} + +.consents-footer{ + padding-top: 5px; +} + +.consents-footer button{ + padding: 10px; +} \ No newline at end of file diff --git a/assets/css/auth/email.css b/assets/css/auth/email.css new file mode 100644 index 00000000..ef1c6786 --- /dev/null +++ b/assets/css/auth/email.css @@ -0,0 +1,90 @@ +body{ + color: #63738a; + background: white; + font-family: 'Roboto', sans-serif; +} +.form-control{ + height: 40px; + box-shadow: none; + color: #969fa4; +} +.form-control:focus{ + border-color: #63738a; +} +.form-control, .btn{ + border-radius: 3px; +} +.signup-form{ + max-width: 400px; + min-width: 290px; + margin: 0 auto; + padding: 30px 0; +} +.signup-form h2{ + color: #636363; + margin: 0 0 15px; + position: relative; + text-align: center; +} + +.signup-form h2:before, .signup-form h2:after{ + content: ""; + height: 2px; + width: 10%; + background: #d4d4d4; + position: absolute; + top: 50%; + z-index: 2; +} + +.signup-form h2:before{ + left: 0; +} +.signup-form h2:after{ + right: 0; +} +.signup-form .hint-text{ + color: #999; + margin-bottom: 30px; + text-align: center; +} +.signup-form form{ + color: #999; + border-radius: 3px; + margin-bottom: 15px; + background: #f2f3f7; + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); + padding: 30px; +} +.signup-form .form-group{ + margin-bottom: 20px; +} +.signup-form input[type="checkbox"]{ + margin-top: 3px; +} +.signup-form .btn{ + font-size: 16px; + font-weight: bold; + min-width: 140px; + outline: none !important; +} +.signup-form .row div:first-child{ + padding-right: 10px; +} +.signup-form .row div:last-child{ + padding-left: 10px; +} +.signup-form a{ + color: #63738a; + text-decoration: underline; +} +.signup-form a:hover{ + text-decoration: none; +} +.signup-form form a{ + color: #5cb85c; + text-decoration: none; +} +.signup-form form a:hover{ + text-decoration: underline; +} \ No newline at end of file diff --git a/assets/css/auth/login.css b/assets/css/auth/login.css new file mode 100644 index 00000000..ac7e6e7b --- /dev/null +++ b/assets/css/auth/login.css @@ -0,0 +1,9 @@ +.field-icon { + float: right; + margin-left: -25px; + margin-top: -25px; + margin-right: 10px; + position: relative; + z-index: 2; + cursor: pointer; +} diff --git a/assets/css/auth/register.css b/assets/css/auth/register.css new file mode 100644 index 00000000..5e654d60 --- /dev/null +++ b/assets/css/auth/register.css @@ -0,0 +1,99 @@ +body{ + color: #63738a; + background: white; + font-family: 'Roboto', sans-serif; +} + +.form-control{ + height: 40px; + box-shadow: none; + color: #969fa4; +} + +.form-control:focus{ + border-color: #63738a; +} + +.form-control, .btn{ + border-radius: 3px; +} + +.signup-form{ + +} + +.signup-form h2{ + color: #636363; + margin: 0 0 15px; + position: relative; + text-align: center; +} + +.signup-form h2:before, .signup-form h2:after{ + content: ""; + height: 2px; + width: 30%; + background: #d4d4d4; + position: absolute; + top: 50%; + z-index: 2; +} + +.signup-form h2:before{ + left: 0; +} +.signup-form h2:after{ + right: 0; +} +.signup-form .hint-text{ + color: #999; + margin-bottom: 30px; + text-align: center; +} + +.signup-form form{ + color: #999; + border-radius: 3px; + margin-bottom: 15px; + background: #f2f3f7; + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); + padding: 30px; +} + +.signup-form .form-group{ + margin-bottom: 20px; +} +.signup-form input[type="checkbox"]{ + margin-top: 3px; +} +.signup-form .btn{ + font-size: 16px; + font-weight: bold; + min-width: 140px; + outline: none !important; +} +.signup-form .row div:first-child{ + padding-right: 10px; +} +.signup-form .row div:last-child{ + padding-left: 10px; +} +.signup-form a{ + color: #63738a; + text-decoration: underline; +} +.signup-form a:hover{ + text-decoration: none; +} +.signup-form form a{ + color: #5cb85c; + text-decoration: none; +} +.signup-form form a:hover{ + text-decoration: underline; +} + +.agree_code_of_conduct a { + color: #337ab7 !important; + text-decoration: none !important; +} \ No newline at end of file diff --git a/assets/css/edit-client-public-keys.css b/assets/css/edit-client-public-keys.css new file mode 100644 index 00000000..a28c9611 --- /dev/null +++ b/assets/css/edit-client-public-keys.css @@ -0,0 +1,28 @@ +.public-key-fingerprint { + color: #767676; + display: block; + font-weight: normal; +} + +.public-key-validity-range { + +} + +.public-key-title { + display: block; + max-width: 360px; +} + +.public-key-active { + background-color: #6cc644 !important; + box-shadow: 0 0 10px rgba(108, 198, 68, 0.5); + padding: 0 !important; + cursor: pointer; +} + +.public-key-deactivated { + background-image: linear-gradient(#aaa, #ccc); + box-shadow: 0 1px 0 #fff; + padding: 0 !important; + cursor: pointer; +} \ No newline at end of file diff --git a/assets/css/edit-client.css b/assets/css/edit-client.css new file mode 100644 index 00000000..f01ee61b --- /dev/null +++ b/assets/css/edit-client.css @@ -0,0 +1,4 @@ +.copy-scopes-button{ + color: black; + cursor: pointer; +} \ No newline at end of file diff --git a/assets/css/main.css b/assets/css/main.css new file mode 100644 index 00000000..18278198 --- /dev/null +++ b/assets/css/main.css @@ -0,0 +1,372 @@ +body { + +} + +.header +{ + padding-top: 1em; +} + +#logo img { + display: block; + max-width: 100px; + max-height: 54px; + margin: 0 auto; +} + +.panel-heading { + background-color: #F5F5F5; + border-bottom: 1px solid #DDDDDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + margin: -15px -15px 15px; + padding: 10px 15px; +} + +.panel { + background-color: #FFFFFF; + border: 1px solid #DDDDDD !important; + border-radius: 4px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + margin-bottom: 20px; + padding: 15px; +} + + +* { + -moz-box-sizing: border-box; +} + +.margin-top-20 { + margin-top: 20px; +} + +#redirect_uri, #origin{ + margin-bottom: 0px!important; + height: 30px !important; + width: 90% !important; +} + +#dialog-form-register-new-app textarea { + height: auto; +} + +.label-client-secret{ + font-size: 12px; + color: darkgray; + text-transform: uppercase; + font-weight: bold; +} + +#client_id, #client_secret{ + font-weight: normal; +} + +.alert-error{ + margin-top: 5px; + margin-bottom: 5px; + padding-top: 1px; + padding-bottom: 1px; +} + +.popover-content{ + font-size: 12px; +} + +.popover { + width: auto; + max-width: 800px; +} + +.info{ + cursor: pointer; +} + +.email-row{ + margin-top: 5px; +} + +.error-modal{ + background-color: #F2DEDE !important; + border-color: #EED3D7 !important; + color: #B94A48 !important; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) +} + +.error-modal .modal-footer{ + border-top: 1px solid #EED3D7 !important; + background-color: #F2DEDE !important; + border-color: #EED3D7 !important; + color: #B94A48 !important; + box-shadow: 0 1px 0 #EED3D7 inset !important; +} + +.error-modal .modal-header{ + border-bottom: 1px solid #EED3D7 !important; +} + +.error-modal .alert-heading{ + color: #B94A48; + margin: 0; +} + + +*::after, *::before { + box-sizing: border-box; +} +*::after, *::before { + box-sizing: border-box; +} +.bs-glyphicons li { + font-size: 12px; + width: 12.5%; +} +.bs-glyphicons li { + background-color: #f9f9f9; + border: 1px solid #fff; + float: left; + font-size: 10px; + height: 115px; + line-height: 1.4; + padding: 10px; + text-align: center; + width: 25%; +} +* { + box-sizing: border-box; +} +.bs-glyphicons-list { + list-style: outside none none; +} +body { + color: #333; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 14px; + line-height: 1.42857; +} + +.accordion-toggle { + cursor: pointer; +} + +.pointable { + cursor: pointer; + color: #000; +} + +.del-client, .regenerate-client-secret, .del-allowed-uri, .revoke-access, .delete-public-key, .btn-delete { + color: #900 !important; + font-weight: bold !important; +} + +.del-client:hover, .regenerate-client-secret:hover, .del-allowed-uri:hover, .revoke-access:hover, .delete-public-key:hover, .btn-delete:hover { + color: #fff !important; + background-color: #900 !important; + border-color: #d43f3a !important; +} + +.panel-default > .panel-heading { + background-color: white !important; + border-color: #ddd !important; + color: #0078a3 !important; +} + +.bootstrap-tagsinput{ + width: 100% !important; +} + +textarea { + resize: none; +} + +.col-md-offset-neg-1 { + margin-left: -15%; +} + +.clear-padding +{ + padding:0; +} + +.formatted-credential +{ + text-align: left; +} + +.auto-width +{ + width: auto !important; +} + +.error-message +{ + color:#c40022; +} + +.privacy-policy{ + padding-top: 5px; +} + +.alert{ + margin-top: 5px; +} + +.center{ + text-align: center; +} + +.bootstrap-tagsinput { + width: 100%; +} + +.password-container > .progress { + margin-top: 5px; + font-weight: bold; + background-color: #B0BEC5 !important; +} + +.password-container> .error-list +{ + list-style: none; + margin: 0; + padding: 0; + font-size: 12px; +} + +.password-container > .error-list li span::before +{ + font: normal normal normal 14px/1 FontAwesome; + content: "\f06a"; + margin-right: 5px; +} + +span.help-block +{ + font-size: 12px; + color: #d52929 !important; +} + +span.help-block::before { + font: normal normal normal 14px/1 FontAwesome; + content: "\f06a"; + margin-right: 5px; +} + +.recaptcha-container{ + text-align:center; +} + +.recaptcha-container > .g-recaptcha { + display: inline-block; +} + +/*Iphone 5*/ +@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : portrait) { + .recaptcha-container > .g-recaptcha { + display: inline-block; + transform: scale(0.66); + transform-origin: 0 0; + } +} + +/*iPhone 6, 7, 8 in portrait*/ +@media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait) { + .recaptcha-container > .g-recaptcha { + display: inline-block; + transform: scale(0.85); + transform-origin: 0 0; + } +} + +/* Pixel 2 */ +@media only screen and (min-device-width : 411px) and (max-device-width : 667px) and (orientation : portrait) { + .recaptcha-container > .g-recaptcha { + display: inline-block; + transform: scale(0.95); + transform-origin: 0 0; + } +} + +.datepicker-dropdown{ + z-index: 999999999999999999999 !important; +} + +.add-item-button{ + margin-bottom: 10px; +} + +#search-term +{ + width: 40% !important; + height: 26px !important; + padding: 3px; + +} + +.delete-item{ + color: #900 !important; + font-weight: bold !important; +} + +#gender_specify{ + margin-top: 10px; +} + +.img-circle{ + -webkit-tap-highlight-color: rgba(0,0,0,0); + line-height: 1.42857143; + color: #333; + font-size: 14px; + font-family: "Roboto",Helvetica,Arial,sans-serif; + -webkit-font-smoothing: antialiased; + font-weight: normal; + box-sizing: border-box; + border: 0; + vertical-align: middle; + border-radius: 50%; + height: 100px; + width: 100px; +} + +.help-block{ + -webkit-tap-highlight-color: rgba(0,0,0,0); + line-height: 1.42857143; + font-weight: 400; + font-family: "Roboto",Helvetica,Arial,sans-serif; + -webkit-font-smoothing: antialiased; + box-sizing: border-box; + margin: 0 0 10px; + display: block; + margin-top: 5px; + margin-bottom: 10px; + font-size: 12px; + color: #737373; +} + +.input-group-button { + width: 1%; + vertical-align: middle; + display:table-cell; +} + +.sort-header{ + cursor: pointer; +} + +.sort-header.current.desc:after{ + content: '\f0dd'; + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + margin:0px 0px 0px 10px; + text-decoration:none; +} + +.sort-header.current.asc:after{ + content: '\f0de'; + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + margin:0px 0px 0px 10px; + text-decoration:none; +} diff --git a/assets/css/newClientDialog.css b/assets/css/newClientDialog.css new file mode 100644 index 00000000..ba438b70 --- /dev/null +++ b/assets/css/newClientDialog.css @@ -0,0 +1,26 @@ +.vS4viHpYzLYWj40ztp9Q { + margin-top: 5%; + margin-bottom: 10%; + max-width: 1024px !important; } + +.si5JRn4stCvYE9qx9Zom { + position: absolute; + right: 1px; + top: 1px; + color: deeppink; } + +.ug9xrtzzz3UCDP3FTjIu { + position: absolute; + right: 1px; + top: 1px; + color: red; } + +.NxVGD5qVU1A06yWX5Gxz { + position: absolute; + right: 1px; + top: 1px; + color: blue; } + +.ExrndYG7uxWUCO5J14j3 { + color: #0a1f31; } + diff --git a/assets/css/passwordReset.css b/assets/css/passwordReset.css new file mode 100644 index 00000000..6fba5fa8 --- /dev/null +++ b/assets/css/passwordReset.css @@ -0,0 +1,36 @@ +.banner___jJTXB { + border: 2px solid #28A4DB; + margin-bottom: 40px; + color: #0a1f31; } + .banner___jJTXB .prepend_grid_item___sFCsI { + color: #EFF5F8; + background-color: #28A4DB; } + .banner___jJTXB .prepend_grid_item___sFCsI svg { + margin-left: auto; + margin-right: auto; } + .banner___jJTXB .append_grid_item___1zQAZ { + background-color: #EFF5F8; + padding: 10px 5px 10px 15px; } + .banner___jJTXB .append_grid_item___1zQAZ a { + color: #28A4DB; } + +.main_container___2ZFu- { + margin-top: 5%; + margin-bottom: 10%; + max-width: 544px !important; } + .main_container___2ZFu- .title_container___2OcN7 .app_logo___8kOOV { + display: flex; + max-width: 40%; + margin: auto; } + .main_container___2ZFu- .password_reset_container___3fObP { + border: solid 1px #e3e3e3; + color: #3fa2f7; + background-color: white; } + .main_container___2ZFu- .password_reset_container___3fObP .button___3h9z5 { + width: 380px; + color: white; + background-color: #3379b7; + margin-top: 10px; } + + +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tcG9uZW50cy9iYW5uZXIvYmFubmVyLm1vZHVsZS5zY3NzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9wYXNzd29yZF9yZXNldC9wYXNzd29yZF9yZXNldC5tb2R1bGUuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSxxQkFBcUI7O0FDZHJCO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCIiwiZmlsZSI6Ii4vY3NzL3Bhc3N3b3JkUmVzZXQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmJhbm5lcl9fX2pKVFhCIHtcbiAgYm9yZGVyOiAycHggc29saWQgIzI4QTREQjtcbiAgbWFyZ2luLWJvdHRvbTogNDBweDtcbiAgY29sb3I6ICMwYTFmMzE7IH1cbiAgLmJhbm5lcl9fX2pKVFhCIC5wcmVwZW5kX2dyaWRfaXRlbV9fX3NGQ3NJIHtcbiAgICBjb2xvcjogI0VGRjVGODtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjhBNERCOyB9XG4gICAgLmJhbm5lcl9fX2pKVFhCIC5wcmVwZW5kX2dyaWRfaXRlbV9fX3NGQ3NJIHN2ZyB7XG4gICAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICAgIG1hcmdpbi1yaWdodDogYXV0bzsgfVxuICAuYmFubmVyX19fakpUWEIgLmFwcGVuZF9ncmlkX2l0ZW1fX18xelFBWiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0VGRjVGODtcbiAgICBwYWRkaW5nOiAxMHB4IDVweCAxMHB4IDE1cHg7IH1cbiAgICAuYmFubmVyX19fakpUWEIgLmFwcGVuZF9ncmlkX2l0ZW1fX18xelFBWiBhIHtcbiAgICAgIGNvbG9yOiAjMjhBNERCOyB9XG4iLCIubWFpbl9jb250YWluZXJfX18yWkZ1LSB7XG4gIG1hcmdpbi10b3A6IDUlO1xuICBtYXJnaW4tYm90dG9tOiAxMCU7XG4gIG1heC13aWR0aDogNTQ0cHggIWltcG9ydGFudDsgfVxuICAubWFpbl9jb250YWluZXJfX18yWkZ1LSAudGl0bGVfY29udGFpbmVyX19fMk9jTjcgLmFwcF9sb2dvX19fOGtPT1Yge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWF4LXdpZHRoOiA0MCU7XG4gICAgbWFyZ2luOiBhdXRvOyB9XG4gIC5tYWluX2NvbnRhaW5lcl9fXzJaRnUtIC5wYXNzd29yZF9yZXNldF9jb250YWluZXJfX18zZk9iUCB7XG4gICAgYm9yZGVyOiBzb2xpZCAxcHggI2UzZTNlMztcbiAgICBjb2xvcjogIzNmYTJmNztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgfVxuICAgIC5tYWluX2NvbnRhaW5lcl9fXzJaRnUtIC5wYXNzd29yZF9yZXNldF9jb250YWluZXJfX18zZk9iUCAuYnV0dG9uX19fM2g5ejUge1xuICAgICAgd2lkdGg6IDM4MHB4O1xuICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzMzNzliNztcbiAgICAgIG1hcmdpbi10b3A6IDEwcHg7IH1cbiJdLCJzb3VyY2VSb290IjoiIn0=*/ \ No newline at end of file diff --git a/assets/css/private-keys.css b/assets/css/private-keys.css new file mode 100644 index 00000000..9d70596f --- /dev/null +++ b/assets/css/private-keys.css @@ -0,0 +1,30 @@ +.private-key-fingerprint { + color: #767676; + display: block; + font-weight: normal; +} + +.private-key-validity-range { + +} + +.private-key-title { + display: block; + max-width: 360px; +} + +.private-key-active { + background-color: #6cc644 !important; + box-shadow: 0 0 10px rgba(108, 198, 68, 0.5); + padding: 0 !important; + cursor: pointer; +} + +.private-key-deactivated { + background-image: linear-gradient(#aaa, #ccc); + box-shadow: 0 1px 0 #fff; + padding: 0 !important; + cursor: pointer; +} + +#ui-datepicker-div {z-index:9999 !important;} diff --git a/assets/css/smoothness/images/animated-overlay.gif b/assets/css/smoothness/images/animated-overlay.gif new file mode 100755 index 00000000..d441f75e Binary files /dev/null and b/assets/css/smoothness/images/animated-overlay.gif differ diff --git a/assets/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/assets/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100755 index 00000000..c09235f6 Binary files /dev/null and b/assets/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png differ diff --git a/assets/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/assets/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100755 index 00000000..d29011d2 Binary files /dev/null and b/assets/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png differ diff --git a/assets/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/assets/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100755 index 00000000..1558bea5 Binary files /dev/null and b/assets/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png differ diff --git a/assets/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/assets/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100755 index 00000000..0359b121 Binary files /dev/null and b/assets/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png differ diff --git a/assets/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/assets/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png new file mode 100755 index 00000000..4fce6c46 Binary files /dev/null and b/assets/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png differ diff --git a/assets/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/assets/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100755 index 00000000..5299b5a0 Binary files /dev/null and b/assets/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png differ diff --git a/assets/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/assets/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100755 index 00000000..398c56a9 Binary files /dev/null and b/assets/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png differ diff --git a/assets/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/assets/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100755 index 00000000..d819aa58 Binary files /dev/null and b/assets/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ diff --git a/assets/css/smoothness/images/ui-icons_222222_256x240.png b/assets/css/smoothness/images/ui-icons_222222_256x240.png new file mode 100755 index 00000000..c1cb1170 Binary files /dev/null and b/assets/css/smoothness/images/ui-icons_222222_256x240.png differ diff --git a/assets/css/smoothness/images/ui-icons_2e83ff_256x240.png b/assets/css/smoothness/images/ui-icons_2e83ff_256x240.png new file mode 100755 index 00000000..84b601bf Binary files /dev/null and b/assets/css/smoothness/images/ui-icons_2e83ff_256x240.png differ diff --git a/assets/css/smoothness/images/ui-icons_454545_256x240.png b/assets/css/smoothness/images/ui-icons_454545_256x240.png new file mode 100755 index 00000000..b6db1acd Binary files /dev/null and b/assets/css/smoothness/images/ui-icons_454545_256x240.png differ diff --git a/assets/css/smoothness/images/ui-icons_888888_256x240.png b/assets/css/smoothness/images/ui-icons_888888_256x240.png new file mode 100755 index 00000000..feea0e20 Binary files /dev/null and b/assets/css/smoothness/images/ui-icons_888888_256x240.png differ diff --git a/assets/css/smoothness/images/ui-icons_cd0a0a_256x240.png b/assets/css/smoothness/images/ui-icons_cd0a0a_256x240.png new file mode 100755 index 00000000..ed5b6b09 Binary files /dev/null and b/assets/css/smoothness/images/ui-icons_cd0a0a_256x240.png differ diff --git a/assets/css/smoothness/jquery-ui-1.10.3.custom.css b/assets/css/smoothness/jquery-ui-1.10.3.custom.css new file mode 100755 index 00000000..893090f6 --- /dev/null +++ b/assets/css/smoothness/jquery-ui-1.10.3.custom.css @@ -0,0 +1,1177 @@ +/*! jQuery UI - v1.10.3 - 2013-12-11 +* http://jqueryui.com +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-clearfix { + min-height: 0; /* support: IE7 */ +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; +} + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black; +} +.ui-accordion .ui-accordion-header { + display: block; + cursor: pointer; + position: relative; + margin-top: 2px; + padding: .5em .5em .5em .7em; + min-height: 0; /* support: IE7 */ +} +.ui-accordion .ui-accordion-icons { + padding-left: 2.2em; +} +.ui-accordion .ui-accordion-noicons { + padding-left: .7em; +} +.ui-accordion .ui-accordion-icons .ui-accordion-icons { + padding-left: 2.2em; +} +.ui-accordion .ui-accordion-header .ui-accordion-header-icon { + position: absolute; + left: .5em; + top: 50%; + margin-top: -8px; +} +.ui-accordion .ui-accordion-content { + padding: 1em 2.2em; + border-top: 0; + overflow: auto; +} +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} +.ui-button { + display: inline-block; + position: relative; + padding: 0; + line-height: normal; + margin-right: .1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + overflow: visible; /* removes extra width in IE */ +} +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} +/* to make room for the icon, a width needs to be set here */ +.ui-button-icon-only { + width: 2.2em; +} +/* button elements seem to need a little more width */ +button.ui-button-icon-only { + width: 2.4em; +} +.ui-button-icons-only { + width: 3.4em; +} +button.ui-button-icons-only { + width: 3.7em; +} + +/* button text element */ +.ui-button .ui-button-text { + display: block; + line-height: normal; +} +.ui-button-text-only .ui-button-text { + padding: .4em 1em; +} +.ui-button-icon-only .ui-button-text, +.ui-button-icons-only .ui-button-text { + padding: .4em; + text-indent: -9999999px; +} +.ui-button-text-icon-primary .ui-button-text, +.ui-button-text-icons .ui-button-text { + padding: .4em 1em .4em 2.1em; +} +.ui-button-text-icon-secondary .ui-button-text, +.ui-button-text-icons .ui-button-text { + padding: .4em 2.1em .4em 1em; +} +.ui-button-text-icons .ui-button-text { + padding-left: 2.1em; + padding-right: 2.1em; +} +/* no icon support for input elements, provide padding by default */ +input.ui-button { + padding: .4em 1em; +} + +/* button icon element(s) */ +.ui-button-icon-only .ui-icon, +.ui-button-text-icon-primary .ui-icon, +.ui-button-text-icon-secondary .ui-icon, +.ui-button-text-icons .ui-icon, +.ui-button-icons-only .ui-icon { + position: absolute; + top: 50%; + margin-top: -8px; +} +.ui-button-icon-only .ui-icon { + left: 50%; + margin-left: -8px; +} +.ui-button-text-icon-primary .ui-button-icon-primary, +.ui-button-text-icons .ui-button-icon-primary, +.ui-button-icons-only .ui-button-icon-primary { + left: .5em; +} +.ui-button-text-icon-secondary .ui-button-icon-secondary, +.ui-button-text-icons .ui-button-icon-secondary, +.ui-button-icons-only .ui-button-icon-secondary { + right: .5em; +} + +/* button sets */ +.ui-buttonset { + margin-right: 7px; +} +.ui-buttonset .ui-button { + margin-left: 0; + margin-right: -.3em; +} + +/* workarounds */ +/* reset extra padding in Firefox, see h5bp.com/l */ +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-datepicker { + width: 17em; + padding: .2em .2em 0; + display: none; +} +.ui-datepicker .ui-datepicker-header { + position: relative; + padding: .2em 0; +} +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-next { + position: absolute; + top: 2px; + width: 1.8em; + height: 1.8em; +} +.ui-datepicker .ui-datepicker-prev-hover, +.ui-datepicker .ui-datepicker-next-hover { + top: 1px; +} +.ui-datepicker .ui-datepicker-prev { + left: 2px; +} +.ui-datepicker .ui-datepicker-next { + right: 2px; +} +.ui-datepicker .ui-datepicker-prev-hover { + left: 1px; +} +.ui-datepicker .ui-datepicker-next-hover { + right: 1px; +} +.ui-datepicker .ui-datepicker-prev span, +.ui-datepicker .ui-datepicker-next span { + display: block; + position: absolute; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.ui-datepicker .ui-datepicker-title { + margin: 0 2.3em; + line-height: 1.8em; + text-align: center; +} +.ui-datepicker .ui-datepicker-title select { + font-size: 1em; + margin: 1px 0; +} +.ui-datepicker select.ui-datepicker-month-year { + width: 100%; +} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { + width: 49%; +} +.ui-datepicker table { + width: 100%; + font-size: .9em; + border-collapse: collapse; + margin: 0 0 .4em; +} +.ui-datepicker th { + padding: .7em .3em; + text-align: center; + font-weight: bold; + border: 0; +} +.ui-datepicker td { + border: 0; + padding: 1px; +} +.ui-datepicker td span, +.ui-datepicker td a { + display: block; + padding: .2em; + text-align: right; + text-decoration: none; +} +.ui-datepicker .ui-datepicker-buttonpane { + background-image: none; + margin: .7em 0 0 0; + padding: 0 .2em; + border-left: 0; + border-right: 0; + border-bottom: 0; +} +.ui-datepicker .ui-datepicker-buttonpane button { + float: right; + margin: .5em .2em .4em; + cursor: pointer; + padding: .2em .6em .3em .6em; + width: auto; + overflow: visible; +} +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { + float: left; +} + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { + width: auto; +} +.ui-datepicker-multi .ui-datepicker-group { + float: left; +} +.ui-datepicker-multi .ui-datepicker-group table { + width: 95%; + margin: 0 auto .4em; +} +.ui-datepicker-multi-2 .ui-datepicker-group { + width: 50%; +} +.ui-datepicker-multi-3 .ui-datepicker-group { + width: 33.3%; +} +.ui-datepicker-multi-4 .ui-datepicker-group { + width: 25%; +} +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { + border-left-width: 0; +} +.ui-datepicker-multi .ui-datepicker-buttonpane { + clear: left; +} +.ui-datepicker-row-break { + clear: both; + width: 100%; + font-size: 0; +} + +/* RTL support */ +.ui-datepicker-rtl { + direction: rtl; +} +.ui-datepicker-rtl .ui-datepicker-prev { + right: 2px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next { + left: 2px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-prev:hover { + right: 1px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next:hover { + left: 1px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane { + clear: right; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button { + float: left; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, +.ui-datepicker-rtl .ui-datepicker-group { + float: right; +} +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { + border-right-width: 0; + border-left-width: 1px; +} +.ui-dialog { + position: absolute; + top: 0; + left: 0; + padding: .2em; + outline: 0; +} +.ui-dialog .ui-dialog-titlebar { + padding: .4em 1em; + position: relative; +} +.ui-dialog .ui-dialog-title { + float: left; + margin: .1em 0; + white-space: nowrap; + width: 90%; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-dialog .ui-dialog-titlebar-close { + position: absolute; + right: .3em; + top: 50%; + width: 21px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: .5em 1em; + background: none; + overflow: auto; +} +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border-width: 1px 0 0 0; + background-image: none; + margin-top: .5em; + padding: .3em 1em .5em .4em; +} +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} +.ui-dialog .ui-dialog-buttonpane button { + margin: .5em .4em .5em 0; + cursor: pointer; +} +.ui-dialog .ui-resizable-se { + width: 12px; + height: 12px; + right: -5px; + bottom: -5px; + background-position: 16px 16px; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-menu { + list-style: none; + padding: 2px; + margin: 0; + display: block; + outline: none; +} +.ui-menu .ui-menu { + margin-top: -3px; + position: absolute; +} +.ui-menu .ui-menu-item { + margin: 0; + padding: 0; + width: 100%; + /* support: IE10, see #8844 */ + list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); +} +.ui-menu .ui-menu-divider { + margin: 5px -2px 5px -2px; + height: 0; + font-size: 0; + line-height: 0; + border-width: 1px 0 0 0; +} +.ui-menu .ui-menu-item a { + text-decoration: none; + display: block; + padding: 2px .4em; + line-height: 1.5; + min-height: 0; /* support: IE7 */ + font-weight: normal; +} +.ui-menu .ui-menu-item a.ui-state-focus, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} + +.ui-menu .ui-state-disabled { + font-weight: normal; + margin: .4em 0 .2em; + line-height: 1.5; +} +.ui-menu .ui-state-disabled a { + cursor: default; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} +.ui-menu-icons .ui-menu-item a { + position: relative; + padding-left: 2em; +} + +/* left-aligned */ +.ui-menu .ui-icon { + position: absolute; + top: .2em; + left: .2em; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + position: static; + float: right; +} +.ui-progressbar { + height: 2em; + text-align: left; + overflow: hidden; +} +.ui-progressbar .ui-progressbar-value { + margin: -1px; + height: 100%; +} +.ui-progressbar .ui-progressbar-overlay { + background: url("images/animated-overlay.gif"); + height: 100%; + filter: alpha(opacity=25); + opacity: 0.25; +} +.ui-progressbar-indeterminate .ui-progressbar-value { + background-image: none; +} +.ui-slider { + position: relative; + text-align: left; +} +.ui-slider .ui-slider-handle { + position: absolute; + z-index: 2; + width: 1.2em; + height: 1.2em; + cursor: default; +} +.ui-slider .ui-slider-range { + position: absolute; + z-index: 1; + font-size: .7em; + display: block; + border: 0; + background-position: 0 0; +} + +/* For IE8 - See #6727 */ +.ui-slider.ui-state-disabled .ui-slider-handle, +.ui-slider.ui-state-disabled .ui-slider-range { + filter: inherit; +} + +.ui-slider-horizontal { + height: .8em; +} +.ui-slider-horizontal .ui-slider-handle { + top: -.3em; + margin-left: -.6em; +} +.ui-slider-horizontal .ui-slider-range { + top: 0; + height: 100%; +} +.ui-slider-horizontal .ui-slider-range-min { + left: 0; +} +.ui-slider-horizontal .ui-slider-range-max { + right: 0; +} + +.ui-slider-vertical { + width: .8em; + height: 100px; +} +.ui-slider-vertical .ui-slider-handle { + left: -.3em; + margin-left: 0; + margin-bottom: -.6em; +} +.ui-slider-vertical .ui-slider-range { + left: 0; + width: 100%; +} +.ui-slider-vertical .ui-slider-range-min { + bottom: 0; +} +.ui-slider-vertical .ui-slider-range-max { + top: 0; +} +.ui-spinner { + position: relative; + display: inline-block; + overflow: hidden; + padding: 0; + vertical-align: middle; +} +.ui-spinner-input { + border: none; + background: none; + color: inherit; + padding: 0; + margin: .2em 0; + vertical-align: middle; + margin-left: .4em; + margin-right: 22px; +} +.ui-spinner-button { + width: 16px; + height: 50%; + font-size: .5em; + padding: 0; + margin: 0; + text-align: center; + position: absolute; + cursor: default; + display: block; + overflow: hidden; + right: 0; +} +/* more specificity required here to overide default borders */ +.ui-spinner a.ui-spinner-button { + border-top: none; + border-bottom: none; + border-right: none; +} +/* vertical centre icon */ +.ui-spinner .ui-icon { + position: absolute; + margin-top: -8px; + top: 50%; + left: 0; +} +.ui-spinner-up { + top: 0; +} +.ui-spinner-down { + bottom: 0; +} + +/* TR overrides */ +.ui-spinner .ui-icon-triangle-1-s { + /* need to fix icons sprite */ + background-position: -65px -16px; +} +.ui-tabs { + position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ + padding: .2em; +} +.ui-tabs .ui-tabs-nav { + margin: 0; + padding: .2em .2em 0; +} +.ui-tabs .ui-tabs-nav li { + list-style: none; + float: left; + position: relative; + top: 0; + margin: 1px .2em 0 0; + border-bottom-width: 0; + padding: 0; + white-space: nowrap; +} +.ui-tabs .ui-tabs-nav li a { + float: left; + padding: .5em 1em; + text-decoration: none; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active { + margin-bottom: -1px; + padding-bottom: 1px; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active a, +.ui-tabs .ui-tabs-nav li.ui-state-disabled a, +.ui-tabs .ui-tabs-nav li.ui-tabs-loading a { + cursor: text; +} +.ui-tabs .ui-tabs-nav li a, /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { + cursor: pointer; +} +.ui-tabs .ui-tabs-panel { + display: block; + border-width: 0; + padding: 1em 1.4em; + background: none; +} +.ui-tooltip { + padding: 8px; + position: absolute; + z-index: 9999; + max-width: 300px; + -webkit-box-shadow: 0 0 5px #aaa; + box-shadow: 0 0 5px #aaa; +} +body .ui-tooltip { + border-width: 2px; +} + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Verdana,Arial,sans-serif; + font-size: 1em; +} +.ui-widget-content { + border: 1px solid #aaaaaa; + background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; + color: #222222; +} +.ui-widget-content a { + color: #222222; +} +.ui-widget-header { + border: 1px solid #aaaaaa; + background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; + color: #222222; + font-weight: bold; +} +.ui-widget-header a { + color: #222222; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default { + border: 1px solid #d3d3d3; + background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; + font-weight: normal; + color: #555555; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited { + color: #555555; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus { + border: 1px solid #999999; + background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; + font-weight: normal; + color: #212121; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited { + color: #212121; + text-decoration: none; +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active { + border: 1px solid #aaaaaa; + background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; + font-weight: normal; + color: #212121; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #212121; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #fcefa1; + background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; + color: #363636; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #363636; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #cd0a0a; + background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; + color: #cd0a0a; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #cd0a0a; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #cd0a0a; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + filter:Alpha(Opacity=70); + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + filter:Alpha(Opacity=35); + background-image: none; +} +.ui-state-disabled .ui-icon { + filter:Alpha(Opacity=35); /* For IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url(images/ui-icons_222222_256x240.png); +} +.ui-widget-header .ui-icon { + background-image: url(images/ui-icons_222222_256x240.png); +} +.ui-state-default .ui-icon { + background-image: url(images/ui-icons_888888_256x240.png); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon { + background-image: url(images/ui-icons_454545_256x240.png); +} +.ui-state-active .ui-icon { + background-image: url(images/ui-icons_454545_256x240.png); +} +.ui-state-highlight .ui-icon { + background-image: url(images/ui-icons_2e83ff_256x240.png); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url(images/ui-icons_cd0a0a_256x240.png); +} + +/* positioning */ +.ui-icon-blank { background-position: 16px 16px; } +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 4px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; + opacity: .3; + filter: Alpha(Opacity=30); +} +.ui-widget-shadow { + margin: -8px 0 0 -8px; + padding: 8px; + background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; + opacity: .3; + filter: Alpha(Opacity=30); + border-radius: 8px; +} diff --git a/assets/css/smoothness/jquery-ui-1.10.3.custom.min.css b/assets/css/smoothness/jquery-ui-1.10.3.custom.min.css new file mode 100755 index 00000000..daebf8db --- /dev/null +++ b/assets/css/smoothness/jquery-ui-1.10.3.custom.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.10.3 - 2013-12-11 +* http://jqueryui.com +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file diff --git a/assets/img/apis/server.png b/assets/img/apis/server.png new file mode 100644 index 00000000..22df96b2 Binary files /dev/null and b/assets/img/apis/server.png differ diff --git a/assets/img/generic-profile-photo-small.png b/assets/img/generic-profile-photo-small.png new file mode 100755 index 00000000..029d3e1a Binary files /dev/null and b/assets/img/generic-profile-photo-small.png differ diff --git a/assets/img/generic-profile-photo.png b/assets/img/generic-profile-photo.png new file mode 100755 index 00000000..2fcfed82 Binary files /dev/null and b/assets/img/generic-profile-photo.png differ diff --git a/assets/img/glyphicons-halflings-white.png b/assets/img/glyphicons-halflings-white.png new file mode 100644 index 00000000..3bf6484a Binary files /dev/null and b/assets/img/glyphicons-halflings-white.png differ diff --git a/assets/img/glyphicons-halflings.png b/assets/img/glyphicons-halflings.png new file mode 100644 index 00000000..a9969993 Binary files /dev/null and b/assets/img/glyphicons-halflings.png differ diff --git a/assets/img/oauth2.default.logo.png b/assets/img/oauth2.default.logo.png new file mode 100644 index 00000000..ee2aab22 Binary files /dev/null and b/assets/img/oauth2.default.logo.png differ diff --git a/assets/img/openstack-logo-full.svg b/assets/img/openstack-logo-full.svg new file mode 100644 index 00000000..a2f42a10 --- /dev/null +++ b/assets/img/openstack-logo-full.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/third_party_identity_providers/icon_apple.svg b/assets/img/third_party_identity_providers/icon_apple.svg new file mode 100644 index 00000000..b3ab05b7 --- /dev/null +++ b/assets/img/third_party_identity_providers/icon_apple.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/assets/img/third_party_identity_providers/icon_facebook.svg b/assets/img/third_party_identity_providers/icon_facebook.svg new file mode 100644 index 00000000..4619e911 --- /dev/null +++ b/assets/img/third_party_identity_providers/icon_facebook.svg @@ -0,0 +1,13 @@ + + + + Fill 1 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/assets/img/third_party_identity_providers/icon_google.png b/assets/img/third_party_identity_providers/icon_google.png new file mode 100644 index 00000000..ae7f0451 Binary files /dev/null and b/assets/img/third_party_identity_providers/icon_google.png differ diff --git a/assets/img/third_party_identity_providers/icon_linkedin.svg b/assets/img/third_party_identity_providers/icon_linkedin.svg new file mode 100644 index 00000000..d420aecf --- /dev/null +++ b/assets/img/third_party_identity_providers/icon_linkedin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/img/third_party_identity_providers/icon_okta.png b/assets/img/third_party_identity_providers/icon_okta.png new file mode 100644 index 00000000..550b8d95 Binary files /dev/null and b/assets/img/third_party_identity_providers/icon_okta.png differ diff --git a/assets/js/admin/banned-ips.js b/assets/js/admin/banned-ips.js new file mode 100644 index 00000000..1ac91307 --- /dev/null +++ b/assets/js/admin/banned-ips.js @@ -0,0 +1,42 @@ +jQuery(document).ready(function($){ + + $('#server-admin','#main-menu').addClass('active'); + + if($('#ips-table tr').length===1){ + $('#ips-info').show(); + $('#ips-table').hide(); + } + else{ + $('#ips-info').hide(); + $('#ips-table').show(); + } + + $("body").on('click',".revoke-ip",function(event){ + if(confirm("Are you sure that you want to revoke this banned ip?")){ + var url = $(this).attr('href'); + var ip_id = $(this).attr('data-ip-id'); + $.ajax( + { + type: "DELETE", + url: url, + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + //load data... + $('#'+ip_id,'#body-ips').remove(); + + if($('#ips-table tr').length===1){ + $('#ips-info').show(); + $('#ips-table').hide(); + } + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); +}); \ No newline at end of file diff --git a/assets/js/admin/edit-group.js b/assets/js/admin/edit-group.js new file mode 100644 index 00000000..cdbd321e --- /dev/null +++ b/assets/js/admin/edit-group.js @@ -0,0 +1,194 @@ +// constructor +function GroupMembersCrud(urls, perPage) { + var actions = 'Remove'; + this.urls = urls; + var _this = this; + var templatePage = $('' + + '' + + '' + + '' + + ' ' + actions + '' + + ''); + + var directivesPage = { + 'tr': { + 'user<-context': { + 'td.user-id': 'user.id', + 'td.user-fullname': function(arg){ + return arg.item.first_name+' '+arg.item.last_name; + }, + 'td.user-email': 'user.email', + 'a.delete-item@href': function (arg) { + var id = arg.item.id; + var href = _this.urls.delete; + return href.replace('@id', id); + }, + } + } + }; + + // Chain constructor with call + BasicCrud.call(this, urls, perPage, templatePage, directivesPage, { + 'delete_item.title': 'Are you sure to Remove this User from Group?', + 'delete_item.text': 'This is an non reversible process!', + }); +} + +GroupMembersCrud.prototype = Object.create(BasicCrud.prototype); +GroupMembersCrud.prototype.constructor = GroupMembersCrud; + +GroupMembersCrud.prototype._buildFilters = function () { + var term = encodeURIComponent(this.searchTerm); + return 'filter=first_name=@'+term+',last_name=@'+term+',email=@'+term+',full_name=@'+term; +}; + +GroupMembersCrud.prototype.init = function () { + BasicCrud.prototype.init.call(this); + var _this = this; + jQuery(document).ready(function ($) { + + var users = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + remote: { + url: urls.fetchUsers, + wildcard: '%QUERY%', + prepare: function (query, settings) { + var term = encodeURIComponent(query); + settings.url = urls.fetchUsers+'?filter=first_name=@'+term+',last_name=@'+term+',email=@'+term+',full_name=@'+term; + return settings; + }, + transform: function(input){ + var page = input.data; + return page; + } + } + }); + + $("body").on('click', "#btn-add-user", function (event) { + var newUserId = $('#add-user').val(); + if(newUserId != '') { + $('#add-user').val(''); + $('#add-user').tagsinput('removeAll'); + handlePlaceHolder(); + var url = _this.urls.add.replace('@id', newUserId); + $.ajax( + { + type: "PUT", + url: url, + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout: 60000, + success: function (data, textStatus, jqXHR) { + _this.loadPage(); + + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + + + $('#add-user').tagsinput({ + maxTags: 1, + itemValue: function(item) { + return item.id; + }, + itemText: function(item) { + return item.first_name + ' ' + item.last_name+' ('+item.email+')' ; + }, + freeInput: false, + allowDuplicates: false, + typeaheadjs: [ + { + highlight: true, + minLength: 1 + }, + { + name: 'users', + display: function(item) { + return item.first_name + ' ' + item.last_name+' ('+item.email+')' ; + }, + templates: { + suggestion: function (item) { + return '

' + item.first_name + ' ' + item.last_name +' ('+item.email+')

'; + } + }, + source: users, + limit: 10 + } + ] + }); + + function handlePlaceHolder() + { + if($('#add-user').val()) + { + $('.bootstrap-tagsinput input').attr('placeholder', ''); + } + else + { + $('.bootstrap-tagsinput input').attr('placeholder',$('#add-user').attr('data-placeholder')); + } + } + + $('#add-user').on('itemRemoved', function(event) { + // event.item: contains the item + handlePlaceHolder(); + }); + + $('#add-user').on('itemAdded', function(event) { + // event.item: contains the item + handlePlaceHolder(); + }); + + var form = $('#group-form'); + var validator = form.validate({ + rules: { + "name": {required: true, free_text: true, rangelength: [1, 512]}, + "slug": {required: true, free_text: true, rangelength: [1, 255]}, + } + }); + + form.submit(function( event ) { + var is_valid = validator.valid(); + if (is_valid){ + $('body').ajax_loader(); + validator.resetForm(); + var group = form.serializeForm(); + var href = $(this).attr('action'); + + $.ajax( + { + type: "PUT", + url: href, + data: JSON.stringify(group), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + $('body').ajax_loader('stop'); + swal({ + title: "Success!", + type: "success", + text: "Group info updated successfully!", + }); + + }, + error: function (jqXHR, textStatus, errorThrown) { + $('body').ajax_loader('stop'); + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + }); +}; \ No newline at end of file diff --git a/assets/js/admin/edit-user.js b/assets/js/admin/edit-user.js new file mode 100644 index 00000000..82c360a9 --- /dev/null +++ b/assets/js/admin/edit-user.js @@ -0,0 +1,223 @@ +$(document).ready(function() { + // groups + $('body').ajax_loader(); + + var options = {}; + + options.ui = + { + showPopover: false, + showErrors: true, + showProgressBar: true, + showVerdictsInsideProgressBar: true, + }; + + options.rules = + { + activated: { + wordTwoCharacterClasses: true, + wordRepetitions: true + } + }; + + $(':password').pwstrength(options); + + var groups = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + remote: { + url: urls.fetchGroups, + wildcard: '%QUERY%', + prepare: function (query, settings) { + settings.url = urls.fetchGroups+'?page=1&per_page=10&filter[]=name=@'+query+',slug=@'+query+'&filter[]=active==1&order=name,slug'; + return settings; + }, + transform: function(input){ + var page = input.data; + return page; + } + } + }); + + $('#groups').tagsinput({ + itemValue: function(item) { + return item.id; + }, + itemText: function(item) { + return item.name + }, + freeInput: false, + allowDuplicates: false, + typeaheadjs: [ + { + highlight: true, + minLength: 1 + }, + { + name: 'groups', + display: function(item) { + return item.name; + }, + templates: { + suggestion: function (item) { + return '

' + item.name + '

'; + } + }, + source: groups, + limit: 20 + } + ] + }); + + for(var group of current_groups) + { + $('#groups').tagsinput('add', group); + } + + var form = $('#user-form'); + var validator = form.validate({ + rules: { + "first_name" : { required: true }, + "last_name" : { required: true }, + "email" : { required: true, custom_email: true }, + "second_email": { custom_email: true }, + "third_email": { custom_email: true } + } + }); + + var simplemdeBio = new SimpleMDE({ element: $("#bio")[0] }); + var simplemdeStatement = new SimpleMDE({ element: $("#statement_of_interest")[0] }); + + $('#birthday').datepicker(); + + $('#country_iso_code').chosen({width: '100%', height: '34px'}); + $("#country_iso_code").val(current_country); + $("#country_iso_code").trigger("chosen:updated"); + + $('#country_iso_code',form).change(function () { + validator.resetForm(); + }); + + $('#language').chosen({width: '100%', height: '34px'}); + $('#language',form).change(function () { + validator.resetForm(); + }); + + $("#language").val(current_language); + $("#language").trigger("chosen:updated"); + + if(current_gender != '') { + $("#gender").val(current_gender); + if(current_gender == 'Specify'){ + $('#gender_specify').removeClass('hide').fadeIn(); + } else { + $('#gender_specify').fadeOut(); + $('#gender_specify').val(''); + } + } + + $('#gender', form).change(function () { + var value = $(this).val(); + if(value == 'Specify'){ + $('#gender_specify').removeClass('hide').fadeIn(); + } else { + $('#gender_specify').fadeOut(); + $('#gender_specify').val(''); + } + }); + + form.submit(function( event ) { + var is_valid = validator.valid(); + if (is_valid){ + $('body').ajax_loader(); + validator.resetForm(); + var user = form.serializeForm(); + + var birthday = user.birthday; + delete user.birthday; + if(typeof birthday != "undefined" && birthday != '') { + user.birthday = moment(birthday).unix(); + } + else + { + user.birthday = ''; + } + + // get values + user.bio = simplemdeBio.value(); + user.statement_of_interest = simplemdeStatement.value(); + + var groups = user.groups; + delete user.groups; + user.groups = []; + if(typeof groups != "undefined" && groups != '') { + user.groups = groups.split(","); + for (var i = 0; i < user.groups.length; i++) { + user.groups[i] = parseInt(user.groups[i], 10); + } + } + + var href = $(this).attr('action'); + + var data = new FormData(); + + data.append('user', JSON.stringify(user)); + + if($('#pic', form)[0].files.length > 0) + data.append('pic', $('#pic', form)[0].files[0]); + + $.ajax( + { + type: "PUT", + url: href, + data: data, + cache: false, + contentType: false, + processData: false, + timeout:60000, + success: function (data, textStatus, jqXHR) { + $('body').ajax_loader('stop'); + swal({ + title: "Success!", + type: "success", + text: "User info updated successfully!", + }); + location.reload(true); + }, + error: function (jqXHR, textStatus, errorThrown) { + $('body').ajax_loader('stop'); + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + + function readURL(input) { + if (input.files && input.files[0]) { + var reader = new FileReader(); + + reader.onload = function(e) { + $('#img-pic').attr('src', e.target.result); + } + reader.readAsDataURL(input.files[0]); + } + } + + $("#pic", form).change(function() { + readURL(this); + }); + + $("#password_container").hide(); + + $("body").on("click", ".change-password-link", function(event){ + $(this).hide(); + $("#password_container").show(); + event.preventDefault(); + return false; + }); + + $('body').ajax_loader('stop'); +}); \ No newline at end of file diff --git a/assets/js/admin/groups.js b/assets/js/admin/groups.js new file mode 100644 index 00000000..85a60857 --- /dev/null +++ b/assets/js/admin/groups.js @@ -0,0 +1,119 @@ +// constructor +function GroupsCrud(urls, perPage) { + var actions = 'Edit' + + ' Delete'; + this.urls = urls; + var _this = this; + var templatePage = $('' + + '' + + '' + + '' + + '' + + ' ' + actions + '' + + ''); + + var directivesPage = { + 'tr': { + 'group<-context': { + 'td.group-identifier': 'group.id', + 'td.group-name': 'group.name', + 'td.group-slug': 'group.slug', + '.group-active-checkbox@value': 'group.id', + '.group-active-checkbox@checked': function (arg) { + return arg.item.active ? 'true' : ''; + }, + '.group-active-checkbox@id': function (arg) { + return 'group-active_' + arg.item.id; + }, + 'a.edit-item@href': function (arg) { + var id = arg.item.id; + var href = _this.urls.edit; + return href.replace('@id', id); + }, + 'a.delete-item@href': function (arg) { + var id = arg.item.id; + var href = _this.urls.delete; + return href.replace('@id', id); + }, + } + } + }; + + // Chain constructor with call + BasicCrud.call(this, urls, perPage, templatePage, directivesPage, { + 'delete_item.title': 'Are you sure to delete this User Group?', + 'delete_item.text': 'This is an non reversible process!', + }); +} + +GroupsCrud.prototype = Object.create(BasicCrud.prototype); +GroupsCrud.prototype.constructor = GroupsCrud; + +GroupsCrud.prototype._buildFilters = function () { + var term = encodeURIComponent(this.searchTerm); + return 'filter=name=@'+term+',slug=@'+term; +}; + +GroupsCrud.prototype.init = function () { + BasicCrud.prototype.init.call(this); + var _this = this; + // default sort + this.orderBy= encodeURI('+name'); + + var add_item_form = $('#form-add-item'); + var add_item_dialog = $("#dialog-form-add-item"); + + var validator_add_item = add_item_form.validate({ + rules: { + "name": {required: true, free_text: true, rangelength: [1, 512]}, + "slug": {required: true, free_text: true, rangelength: [1, 255]}, + } + }); + + add_item_dialog.modal({ + show: false, + backdrop: "static" + }); + + add_item_dialog.on('hidden.bs.modal', function () { + add_item_form.cleanForm(); + validator_add_item.resetForm(); + $('.add-item-button').removeAttr('disabled'); + }) + + $("body").on('click', ".add-item-button", function (event) { + add_item_dialog.modal('show'); + $('.add-item-button').attr('disabled', 'disabled'); + event.preventDefault(); + return false; + }); + + $("body").on('click',"#save-item", function(event){ + var is_valid = add_item_form.valid(); + if (is_valid){ + var url = $(this).attr('href'); + $('#save-item').attr('disabled','disabled'); + var group = add_item_form.serializeForm(); + + $.ajax({ + type: "POST", + url: _this.urls.add, + data: JSON.stringify(group), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + _this.loadPage(); + add_item_dialog.modal('hide'); + $('#save-item').removeAttr('disabled'); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + $('#save-item').removeAttr('disabled'); + } + }); + } + event.preventDefault(); + return false; + }); +}; \ No newline at end of file diff --git a/assets/js/admin/server-config.js b/assets/js/admin/server-config.js new file mode 100644 index 00000000..d4d584f8 --- /dev/null +++ b/assets/js/admin/server-config.js @@ -0,0 +1,39 @@ +jQuery(document).ready(function($){ + + $('#server-admin','#main-menu').addClass('active'); + + var form_server_config = $("#form-server-configuration"); + + var server_config_validation = form_server_config.validate({ + rules: { + "general-max-failed-login-attempts" : {required: true, number: true }, + "general-max-failed-login-attempts-captcha" : {required: true, number: true }, + "openid-private-association-lifetime" : {required: true, number: true }, + "openid-session-association-lifetime" : {required: true, number: true }, + "openid-nonce-lifetime" : {required: true, number: true }, + "oauth2-auth-code-lifetime" : {required: true, number: true }, + "oauth2-refresh-token-lifetime" : {required: true, number: true }, + "oauth2-access-token-lifetime" : {required: true, number: true }, + "oauth2-id-token-lifetime" : {required: true, number: true }, + "oauth2-id-access-token-revoked-lifetime" : {required: true, number: true }, + "oauth2-id-access-token-void-lifetime" : {required: true, number: true }, + "oauth2-id-refresh-token-revoked-lifetime" : {required: true, number: true }, + "oauth2-id-security-policy-minutes-without-exceptions" : {required: true, number: true }, + "oauth2-id-security-policy-max-bearer-token-disclosure-attempts" : {required: true, number: true }, + "oauth2-id-security-policy-max-invalid-client-exception-attempts" : {required: true, number: true }, + "oauth2-id-security-policy-max-invalid-redeem-auth-code-attempts" : {required: true, number: true }, + "oauth2-id-security-policy-max-invalid-client-credentials-attempts" : {required: true, number: true }, + } + }); + + form_server_config.submit(function( event ) { + var is_valid = form_server_config.valid(); + if (is_valid) + { + server_config_validation.resetForm(); + return true; + } + event.preventDefault(); + return false; + }); +}); diff --git a/assets/js/admin/users.js b/assets/js/admin/users.js new file mode 100644 index 00000000..ae8005b2 --- /dev/null +++ b/assets/js/admin/users.js @@ -0,0 +1,240 @@ +// constructor +function UsersCrud(urls, perPage) { + var actions = 'Edit' + + ' Delete'; + this.urls = urls; + var _this = this; + var templatePage = $('' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ' ' + actions + '' + + ''); + + var directivesPage = { + 'tr': { + 'user<-context': { + 'td.user-identifier': 'user.identifier', + 'td.user-fname': 'user.first_name', + 'td.user-lname': 'user.last_name', + 'td.user-email': function(arg){ + return arg.item.email ? arg.item.email.replace("<","").replace(">", "") : 'TBD'; + }, + 'td.user-spam-type': 'user.spam_type', + 'td.user-last-login': function (arg) { + if (arg.item.last_login_date == null) return 'N/A'; + return moment.unix(arg.item.last_login_date).format(); + }, + '.user-active-checkbox@value': 'user.id', + '.user-active-checkbox@checked': function (arg) { + return arg.item.active ? 'true' : ''; + }, + '.user-active-checkbox@id': function (arg) { + var user_id = arg.item.id; + return 'user-active_' + user_id; + }, + 'a.edit-item@href': function (arg) { + var id = arg.item.id; + var href = _this.urls.edit; + return href.replace('@id', id); + }, + 'a.delete-item@href': function (arg) { + var id = arg.item.id; + var href = _this.urls.delete; + return href.replace('@id', id); + }, + } + } + }; + + // Chain constructor with call + BasicCrud.call(this, urls, perPage, templatePage, directivesPage, { + 'delete_item.title': 'Are you sure to delete this registered User?', + 'delete_item.text': 'This is an non reversible process!', + }); +} + +UsersCrud.prototype = Object.create(BasicCrud.prototype); +UsersCrud.prototype.constructor = UsersCrud; + +UsersCrud.prototype._buildFilters = function () { + var term = encodeURIComponent(this.searchTerm.trim()); + return 'filter=first_name=@'+term+',last_name=@'+term+',email=@'+term+',full_name=@'+term; +}; + +UsersCrud.prototype.init = function () { + // Chain parent method + BasicCrud.prototype.init.call(this); + var _this = this; + // default sort + this.orderBy= encodeURI('+email'); + + $("body").on('click', ".user-active-checkbox", function (event) { + var active = $(this).is(':checked'); + var userId = $(this).attr('value'); + var url = active ? _this.urls.unlock : _this.urls.lock; + url = url.replace('@id', userId); + var verb = active ? 'PUT' : 'DELETE'; + + $.ajax( + { + type: verb, + url: url, + contentType: "application/json; charset=utf-8", + success: function (data, textStatus, jqXHR) { + _this.loadPage(); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + }); + + var options = {}; + + options.ui = + { + showPopover: false, + showErrors: true, + showProgressBar: true, + showVerdictsInsideProgressBar: true, + }; + + options.rules = + { + activated: { + wordTwoCharacterClasses: true, + wordRepetitions: true + } + }; + + $(':password').pwstrength(options); + + var groups = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + remote: { + url: _this.urls.fetchGroups, + wildcard: '%QUERY%', + prepare: function (query, settings) { + settings.url = _this.urls.fetchGroups+'?filter[]=name=@'+query+'&filter[]=active==1'; + return settings; + }, + transform: function(input){ + var page = input.data; + return page; + } + } + }); + + $('#groups').tagsinput({ + itemValue: function(item) { + return item.id; + }, + itemText: function(item) { + return item.name + }, + freeInput: false, + allowDuplicates: false, + typeaheadjs: [ + { + highlight: true, + minLength: 1 + }, + { + name: 'groups', + display: function(item) { + return item.name; + }, + templates: { + suggestion: function (item) { + return '

' + item.name + '

'; + } + }, + source: groups, + limit: 10 + } + ] + }); + + var add_item_form = $('#form-add-item'); + var add_item_dialog = $("#dialog-form-add-item"); + + var validator_add_item = add_item_form.validate({ + rules: { + "first_name": {required: true, free_text: true, rangelength: [1, 255]}, + "last_name": {required: true, free_text: true, rangelength: [1, 512]}, + "email": {required: true, custom_email: true}, + password: { + required: true, + minlength: 8 + }, + "password_confirmation": { + minlength: 8, + equalTo: "#password" + }, + } + }); + + add_item_dialog.modal({ + show: false, + backdrop: "static" + }); + + add_item_dialog.on('hidden.bs.modal', function () { + add_item_form.cleanForm(); + validator_add_item.resetForm(); + $('.add-item-button').removeAttr('disabled'); + }) + + $("body").on('click', ".add-item-button", function (event) { + add_item_dialog.modal('show'); + $('.add-item-button').attr('disabled', 'disabled'); + event.preventDefault(); + return false; + }); + + $("body").on('click',"#save-item", function(event){ + var is_valid = add_item_form.valid(); + if (is_valid){ + var url = $(this).attr('href'); + $('#save-item').attr('disabled','disabled'); + var user = add_item_form.serializeForm(); + var groups = user.groups; + delete user.groups; + + if(typeof groups != "undefined" && groups != '') { + user.groups = groups.split(","); + for (var i = 0; i < user.groups.length; i++) { + user.groups[i] = parseInt(user.groups[i], 10); + } + } + + $.ajax({ + type: "POST", + url: _this.urls.add, + data: JSON.stringify(user), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + _this.loadPage(); + add_item_dialog.modal('hide'); + $('#save-item').removeAttr('disabled'); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + $('#save-item').removeAttr('disabled'); + } + }); + } + event.preventDefault(); + return false; + }); + +}; diff --git a/assets/js/ajax.utils.js b/assets/js/ajax.utils.js new file mode 100644 index 00000000..70bc53f3 --- /dev/null +++ b/assets/js/ajax.utils.js @@ -0,0 +1,76 @@ +function ajaxError(jqXHR, textStatus, errorThrown){ + var HTTP_status = jqXHR.status; + if(HTTP_status != 200){ + response = $.parseJSON(jqXHR.responseText); + if(HTTP_status == 412 ){ + var msg = ''; + + for (const [key, value] of Object.entries(response.errors)) { + msg += isNaN(key) ? `* ${key}: ` : ""; + msg += `${value}\n`; + } + + displayErrorMessage('Validation error', msg); + return; + } + if(HTTP_status == 404 ){ + var msg = ''; + for(var property in response.messages) { + msg +='* '+response.messages[property]+'\n'; + } + displayErrorMessage('Entity Not Found', msg); + return; + } + displayErrorMessage('You got an error!',response.error); + return; + } + displayErrorMessage('You got an error!','server error'); +} + +function displayErrorMessage(title, message){ + $('#modal_error').remove(); + var modal = $(''); + $('body').append(modal); + modal.modal({show:true}); + + modal.on('hidden.bs.modal', function (e) { + $('.modal-backdrop').remove(); + }) +} + +function displaySuccessMessage(message, $element){ + var element_id = $element.attr('id'); + var $alert = $('.alert-success').filter(function() { + return $(this).attr("for") === element_id; + }); + if($alert.length){ + $('.msg',$alert).html(message || ""); + } + else{ + var $alert = $('').attr('for',element_id); + $('.msg',$alert).html(message || ""); + $alert.insertBefore($element); + } +} + +function displayAlert(msg,after){ + $('.alert-danger').remove(); + var alert = $(''); + alert.insertAfter(after); +} \ No newline at end of file diff --git a/assets/js/auth/email-verification.js b/assets/js/auth/email-verification.js new file mode 100644 index 00000000..1875057c --- /dev/null +++ b/assets/js/auth/email-verification.js @@ -0,0 +1,38 @@ +(function( $ ){ + + $('body').ajax_loader(); + + $(document).ready(function($){ + + var form = $('#form-verification'); + + var validator = form.validate({ + rules: { + + email: { + required: true + }, + 'g_recaptcha_hidden': {required: true} + }, + messages: { + 'g_recaptcha_hidden': { required: 'Please confirm that you are not a robot.'} + } + }); + + form.submit(function(e){ + var is_valid = $(this).valid(); + if (!is_valid) { + e.preventDefault(); + return false; + } + $('.btn-primary').attr('disabled', 'disabled'); + return true; + }); + + $('body').ajax_loader('stop'); + }); + + + +// End of closure. +}( jQuery )); \ No newline at end of file diff --git a/assets/js/auth/registration.js b/assets/js/auth/registration.js new file mode 100644 index 00000000..2c499b6a --- /dev/null +++ b/assets/js/auth/registration.js @@ -0,0 +1,76 @@ +(function( $ ){ + $('body').ajax_loader(); + + $(document).ready(function($){ + + var options = {}; + + options.ui = + { + showPopover: false, + showErrors: true, + showProgressBar: true, + showVerdictsInsideProgressBar: true, + }; + + options.rules = + { + activated: { + wordTwoCharacterClasses: true, + wordRepetitions: true + } + }; + + $(':password').pwstrength(options); + + $('#country_iso_code').chosen({width: '100%', height: '34px'}); + + var form = $('#form-registration'); + + var validator = form.validate({ + rules: { + first_name: { + required: true, + }, + last_name: { + required: true, + }, + "country_iso_code": { + required: true, + }, + password: { + required: true, + minlength: 8 + }, + email: { + required: true + }, + "password_confirmation" : { + minlength: 8, + equalTo : "#password" + }, + 'agree_code_of_conduct': {required: true}, + 'g_recaptcha_hidden': {required: true} + }, + messages: { + 'g_recaptcha_hidden': { required: 'Please confirm that you are not a robot.'} + } + }); + + form.submit(function(e){ + var is_valid = $(this).valid(); + if (!is_valid) { + e.preventDefault(); + return false; + } + $('.btn-primary').attr('disabled', 'disabled'); + return true; + }); + + $('body').ajax_loader('stop'); + }); + + + +// End of closure. +}( jQuery )); \ No newline at end of file diff --git a/assets/js/auth/registration_success.js b/assets/js/auth/registration_success.js new file mode 100644 index 00000000..61dc0a40 --- /dev/null +++ b/assets/js/auth/registration_success.js @@ -0,0 +1,16 @@ +(function( $ ){ + $('body').ajax_loader(); + + $(document).ready(function($){ + + var redirect = $('#redirect_url'); + if(redirect.length > 0){ + var href = $(redirect).attr('href'); + setTimeout(function(){ window.location = href; }, 10000); + } + + $('body').ajax_loader('stop'); + }); + +// End of closure. +}( jQuery )); \ No newline at end of file diff --git a/assets/js/auth/reset_password.js b/assets/js/auth/reset_password.js new file mode 100644 index 00000000..59e19f9b --- /dev/null +++ b/assets/js/auth/reset_password.js @@ -0,0 +1,62 @@ +(function( $ ){ + $('body').ajax_loader(); + + $(document).ready(function($){ + + + var options = {}; + + options.ui = + { + showPopover: false, + showErrors: true, + showProgressBar: true, + showVerdictsInsideProgressBar: true, + }; + + options.rules = + { + activated: { + wordTwoCharacterClasses: true, + wordRepetitions: true + } + }; + + $(':password').pwstrength(options); + + var form = $('#form-password-reset'); + + var validator = form.validate({ + rules: { + password: { + required: true, + minlength: 8 + }, + "password_confirmation" : { + minlength: 8, + equalTo : "#password" + }, + 'g_recaptcha_hidden': {required: true} + }, + messages: { + 'g_recaptcha_hidden': { required: 'Please confirm that you are not a robot.'} + } + }); + + form.submit(function(e){ + var is_valid = $(this).valid(); + if (!is_valid) { + e.preventDefault(); + return false; + } + $('.btn-primary').attr('disabled', 'disabled'); + return true; + }); + + $('body').ajax_loader('stop'); + }); + + + +// End of closure. +}( jQuery )); \ No newline at end of file diff --git a/assets/js/auth/send_password_link.js b/assets/js/auth/send_password_link.js new file mode 100644 index 00000000..8190f9c3 --- /dev/null +++ b/assets/js/auth/send_password_link.js @@ -0,0 +1,46 @@ +(function( $ ){ + + $('body').ajax_loader(); + + $(document).ready(function($){ + + var form = $('#form-send-password-reset-link'); + + var validator = form.validate({ + rules: { + email: { + required: true + }, + 'g_recaptcha_hidden': {required: true} + }, + messages: { + 'g_recaptcha_hidden': { required: 'Please confirm that you are not a robot.'} + } + }); + + form.submit(function(e){ + var is_valid = $(this).valid(); + if (!is_valid) { + e.preventDefault(); + return false; + } + $('.btn-primary').attr('disabled', 'disabled'); + return true; + }); + + $(document).ready(function($){ + + var redirect = $('#redirect_url'); + if(redirect.length > 0){ + var href = $(redirect).attr('href'); + setTimeout(function(){ window.location = href; }, 3000); + } + + }); + + $('body').ajax_loader('stop'); + + }); + +// End of closure. +}( jQuery )); \ No newline at end of file diff --git a/assets/js/auth/set_password.js b/assets/js/auth/set_password.js new file mode 100644 index 00000000..e9012a61 --- /dev/null +++ b/assets/js/auth/set_password.js @@ -0,0 +1,74 @@ +(function( $ ){ + + $('body').ajax_loader(); + + $(document).ready(function($){ + + var options = {}; + + options.ui = + { + showPopover: false, + showErrors: true, + showProgressBar: true, + showVerdictsInsideProgressBar: true, + }; + + options.rules = + { + activated: { + wordTwoCharacterClasses: true, + wordRepetitions: true + } + }; + + $(':password').pwstrength(options); + $('#country_iso_code').chosen({width: '100%', height: '34px'}); + + var form = $('#form-password-set'); + + var validator = form.validate({ + rules: { + first_name: { + required: true, + }, + last_name: { + required: true, + }, + company: { + required: true, + }, + "country_iso_code": { + required: true, + }, + password: { + required: true, + minlength: 8 + }, + "password_confirmation" : { + minlength: 8, + equalTo : "#password" + }, + 'g_recaptcha_hidden': {required: true} + }, + messages: { + 'g_recaptcha_hidden': { required: 'Please confirm that you are not a robot.'} + } + }); + + form.submit(function(e){ + var is_valid = $(this).valid(); + if (!is_valid) { + e.preventDefault(); + return false; + } + $('.btn-primary').attr('disabled', 'disabled'); + return true; + }); + + $('body').ajax_loader('stop'); + + }); + +// End of closure. +}( jQuery )); \ No newline at end of file diff --git a/assets/js/auth/set_password_success.js b/assets/js/auth/set_password_success.js new file mode 100644 index 00000000..b14556d9 --- /dev/null +++ b/assets/js/auth/set_password_success.js @@ -0,0 +1,24 @@ +(function( $ ){ + + $('body').ajax_loader(); + + $(document).ready(function($){ + + var redirect = $('#redirect_url'); + + if(redirect.length > 0){ + var href = $(redirect).attr('href'); + if(email != '') + href = href +'#login=1&email=' + email; + + setTimeout(function(){ window.location = href; }, 3000); + return; + } + + setTimeout(function(){ window.location = '/accounts/user/profile'; }, 3000); + + $('body').ajax_loader('stop'); + }); + +// End of closure. +}( jQuery )); \ No newline at end of file diff --git a/assets/js/basic-crud.js b/assets/js/basic-crud.js new file mode 100644 index 00000000..b73a3965 --- /dev/null +++ b/assets/js/basic-crud.js @@ -0,0 +1,249 @@ +jQuery(document).ready(function ($) { +}); + +// constructor +function BasicCrud(urls, perPage, templatePage, directivesPage, messages) { + // settings + this.urls = urls; + this.perPage = perPage; + this.templatePage = templatePage; + this.directivesPage = directivesPage; + this.maxItemsPerPage = 10; + this.messages = messages; + // state + this.currentPage = null; + this.searchTerm = null; + this.orderBy = null; + this.orderByDir = null; +} + +// methods +BasicCrud.prototype = { + init: function () { + var _this = this; + jQuery(document).ready(function ($) { + + // set current menu item active + $('#server-admin', '#main-menu').addClass('active'); + + $('#btn-do-search-clear').hide(); + + $("body").on('click',".sort-header",function (event) { + $(".sort-header").removeClass("current"); + $(this).addClass('current'); + var dir = '+'; + if($(this).hasClass('asc')){ + $(this).removeClass('asc'); + $(this).addClass('desc'); + dir = '-'; + } + else { + dir = '+'; + $(this).removeClass('desc'); + $(this).addClass('asc'); + } + + var field = $(this).data('field'); + _this.orderBy = encodeURI(dir+field); + _this.loadPage(); + }); + + var currentTermFromDeepLink = $(window).url_fragment('getParam', 'term'); + if (currentTermFromDeepLink != null) { + $('#search-term').val(currentTermFromDeepLink); + $('#btn-do-search-clear').show(); + } + + _this.loadPage(); + + $("body").on('click', ".page-link", function (event) { + _this.currentPage = $(this).attr('data-page'); + _this.loadPage(); + event.preventDefault(); + return false; + }); + + $("body").on('keydown', "#search-term", function (event) { + if (event.keyCode === 13) { + $('#btn-do-search').trigger('click'); + event.preventDefault(); + return false; + } + return true; + }); + + $("body").on('click', "#btn-do-search", function (event) { + _this.currentPage = 1; + _this.searchTerm = $('#search-term').val() + $('#btn-do-search-clear').show(); + _this.loadPage(); + event.preventDefault(); + return false; + }); + + $("body").on('click', "#btn-do-search-clear", function (event) { + $('#search-term').val(''); + _this.searchTerm = ''; + $(this).hide(); + _this.loadPage(); + event.preventDefault(); + return false; + }); + + $("body").on('click', 'a.delete-item', function (event) { + + var url = $(this).attr('href'); + + swal({ + title: _this.messages['delete_item.title'], + text: _this.messages['delete_item.text'], + type: "warning", + showCancelButton: true, + confirmButtonColor: "#DD6B55", + confirmButtonText: "Yes, Delete it!", + }).then( + function (result) { + if (result.value) { + $.ajax( + { + type: "DELETE", + url: url, + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout: 60000, + success: function (data, textStatus, jqXHR) { + _this.loadPage(); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + }); + event.preventDefault(); + return false; + }); + }); + }, + _buildFilters: function () { + + }, + loadPage: function () { + var _this = this; + $('body').ajax_loader(); + var currentPageFromDeepLink = $(window).url_fragment('getParam', 'page'); + var currentTermFromDeepLink = $(window).url_fragment('getParam', 'term'); + + if (this.currentPage == null && currentPageFromDeepLink != null) { + this.currentPage = currentPageFromDeepLink; + } + + if (this.searchTerm == null && currentTermFromDeepLink != null) { + this.searchTerm = currentTermFromDeepLink; + } + + if (this.currentPage == null) + this.currentPage = 1; + + if (this.searchTerm != null) + $(window).url_fragment('setParam', 'term', this.searchTerm); + + $(window).url_fragment('setParam', 'page', this.currentPage); + + window.location.hash = $(window).url_fragment('serialize'); + + var url = this.urls.load + '?page=' + parseInt(this.currentPage) + '&per_page=' + this.perPage; + + if (this.searchTerm != null && this.searchTerm != '') { + url += '&' + this._buildFilters(); + } + + if (this.orderBy != null && this.orderBy != '') { + url += '&order=' + this.orderBy; + } + + $.ajax({ + type: "GET", + url: url, + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout: 60000, + success: function (page, textStatus, jqXHR) { + //load data... + var items = page.data; + if (items.length == 0) { + $('.label-info').show(); + $('#table').hide(); + $('#search-container').hide(); + $('#pager-container').hide(); + $('body').ajax_loader('stop'); + return; + } + + $('.label-info').hide(); + $('#table').show(); + $('#search-container').show(); + $('#pager-container').show(); + + var body = _this.templatePage.render(items, _this.directivesPage); + $('#body-table', '#table').remove(); + $('#table').append('' + body.html() + ''); + + var templatePager = $(''); + + var maxPages2Show = 20; + var totalPages = parseInt(Math.ceil(page.total / _this.perPage)); + if (maxPages2Show > totalPages) maxPages2Show = totalPages; + var currentPage = page.current_page; + var currentRelativePage = currentPage % maxPages2Show; + if (currentRelativePage == 0) currentRelativePage = maxPages2Show; + var pages = []; + + for (var i = 1; i <= maxPages2Show; i++) { + pages.push({ + nbr: i + (currentPage - currentRelativePage) + }); + } + + var directivesPager = { + 'li': { + 'i<-context': { + '@class': function (arg) { + return arg.item.nbr == page.current_page ? "active" : ""; + }, + 'a': function (arg) { + return arg.item.nbr; + }, + 'a@class': function (arg) { + return "page-link" + }, + 'a@data-page': function (arg) { + return arg.item.nbr; + }, + } + } + }; + var pager = templatePager.render(pages, directivesPager); + + $('#pager', '#pager-container').remove(); + var prev_item = ''; + var next_item = ''; + if (pages.length > 0) { + prev_item = (pages[0].nbr > 1) ? '
  • ' : ''; + next_item = (pages[pages.length - 1].nbr < totalPages) ? '
  • ' : ''; + } + $('#pager-container').append(''); + + $('body').ajax_loader('stop'); + + }, + error: function (jqXHR, textStatus, errorThrown) { + $('body').ajax_loader('stop'); + ajaxError(jqXHR, textStatus, errorThrown); + } + }); + } +}; diff --git a/assets/js/jquery-ajax-loader.js b/assets/js/jquery-ajax-loader.js new file mode 100644 index 00000000..8cb899ed --- /dev/null +++ b/assets/js/jquery-ajax-loader.js @@ -0,0 +1,85 @@ +/** + * Copyright 2014 Openstack Foundation + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ +(function( $ ){ + + var element = null; + var text = 'loading ...'; + var methods = { + init : function(options) { + element = $(this); + + if(element.find('#resultLoading').attr('id') != 'resultLoading'){ + element.append(''); + } + + jQuery('#resultLoading').css({ + 'width':'100%', + 'height':'100%', + 'position':'fixed', + 'z-index':'10000000', + 'top':'0', + 'left':'0', + 'margin':'auto' + }); + + jQuery('#resultLoading .bg').css({ + 'background':'#000000', + 'opacity':'0.7', + 'width':'100%', + 'height':'100%', + 'position':'absolute', + 'top':'0' + }); + + jQuery('#resultLoading>div:first').css({ + 'width': '250px', + 'height':'75px', + 'text-align': 'center', + 'position': 'fixed', + 'top':'0', + 'left':'0', + 'right':'0', + 'bottom':'0', + 'margin':'auto', + 'font-size':'16px', + 'z-index':'10', + 'color':'#ffffff' + + }); + + jQuery('#resultLoading .bg').height('100%'); + jQuery('#resultLoading').fadeIn(500); + element.css('cursor', 'wait'); + }, + stop: function(){ + $('#resultLoading .bg').height('100%'); + $('#resultLoading').fadeOut(1000); + element.css('cursor', 'default'); + } + }; + + $.fn.ajax_loader = function(methodOrOptions) { + if ( methods[methodOrOptions] ) { + return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 )); + } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) { + // Default to "init" + return methods.init.apply( this, arguments ); + } else { + $.error( 'Method ' + method + ' does not exist on jQuery.ajax_loader' ); + } + }; + + //helper functions + +// End of closure. +}( jQuery)); \ No newline at end of file diff --git a/assets/js/jquery.cleanform.js b/assets/js/jquery.cleanform.js new file mode 100644 index 00000000..af97e796 --- /dev/null +++ b/assets/js/jquery.cleanform.js @@ -0,0 +1,10 @@ +(function( $ ){ + $.fn.cleanForm = function() { + //after serialize clear all! + $('input',this).val(''); + $('select',this).val(''); + $('textarea',this).val(''); + this.find(':checkbox').removeAttr('checked'); + return this; + }; +}( jQuery )); \ No newline at end of file diff --git a/assets/js/jquery.serialize.js b/assets/js/jquery.serialize.js new file mode 100644 index 00000000..a6b91cec --- /dev/null +++ b/assets/js/jquery.serialize.js @@ -0,0 +1,32 @@ +(function( $ ){ + $.fn.serializeForm = function() { + var o = {}; + var a = this.serializeArray(); + var $form = $(this); + + $.each(a, function() { + //special case for checkboxes + var $element = $('#'+this.name,$form); + if($element.is(':checkbox')){ + this.value = $element.is(':checked'); + } + if (o[this.name]) { + if (!o[this.name].push) { + o[this.name] = [o[this.name]]; + } + o[this.name].push(this.value || ''); + } else { + o[this.name] = this.value; + } + }); + + //add missing checkboxes (non checked ones) + $('input:checkbox', $form).each(function() { + var id = $(this).attr('id'); + var value = $(this).is(':checked'); + if (!o.hasOwnProperty(id)) + o[id] = value; + }); + return o; + }; +}( jQuery )); \ No newline at end of file diff --git a/assets/js/jquery.validate.additional.custom.methods.js b/assets/js/jquery.validate.additional.custom.methods.js new file mode 100644 index 00000000..0acd3876 --- /dev/null +++ b/assets/js/jquery.validate.additional.custom.methods.js @@ -0,0 +1,115 @@ + +var regex_ipv4 = /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i; + +var regex_ipv6 = /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i; + +jQuery.validator.addMethod("ipV4", function(value, element) { + return this.optional(element) || regex_ipv4.test(value); +}, "Please enter a valid IPV4 address"); + +jQuery.validator.addMethod("ipv4V6Set", function(value, element) { + var ips = value.split(','); + for(var ip of ips) + { + var valid = regex_ipv4.test(ip); + if(!valid) + valid = regex_ipv6.test(ip); + if(!valid) return false; + } + return true +}, "Please enter a valid IP (V4/V6) address"); + +jQuery.validator.addMethod("ssl_uri", function(value, element) { + var regex = /^https:\/\/([\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*$/ig; + return this.optional(element) || regex.test(value); +}, "Uri must under https schema."); + + +jQuery.validator.addMethod("scopename", function(value, element) { + var regex = /^[a-zA-Z0-9\-\.\,\:\_\/]+$/ig; + return this.optional(element) || regex.test(value); +}, "Please enter a valid scope name."); + +jQuery.validator.addMethod("free_text", function(value, element) { + return this.optional(element) || /^[a-zA-Z0-9\-_.,()'"\s\:\/]+$/i.test(value); +}, "Letters or punctuation only please"); + +jQuery.validator.addMethod("endpointroute", function(value, element) { + return this.optional(element) || /^\/([\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,{}]*$/ig.test(value); +}, "Please enter a valid endpoint route"); + +jQuery.validator.addMethod("pem_public_key", function(value, element, options) { + if(!options) return true; + var res1 = value.indexOf('-----BEGIN PUBLIC KEY-----'); + var res2 = value.indexOf('-----BEGIN RSA PUBLIC KEY-----'); + var res3 = value.indexOf('-----END PUBLIC KEY-----'); + var res4 = value.indexOf('-----END RSA PUBLIC KEY-----'); + var pck1 = (res1 != -1 && res3 != -1); + var pck8 = (res2 != -1 && res4 != -1); + return pck1 || pck8; +}, "Please enter a valid PEM Public Key format(PCK#8/PCK#1)"); + +jQuery.validator.addMethod("pem_private_key", function(value, element, options) { + if(!options) return true; + var res1 = value.indexOf('-----BEGIN PRIVATE KEY-----'); + var res2 = value.indexOf('-----BEGIN RSA PRIVATE KEY-----'); + var res3 = value.indexOf('-----END PRIVATE KEY-----'); + var res4 = value.indexOf('-----END RSA PRIVATE KEY-----'); + var pck1 = (res1 != -1 && res3 != -1); + var pck8 = (res2 != -1 && res4 != -1); + return pck1 || pck8; +}, "Please enter a valid PEM Private Key format(PCK#8/PCK#1)"); + +jQuery.validator.addMethod("private_key_password_required", function(value, element, options) { + var private_key_pem = $(options.pem_content_id).val(); + return !(private_key_pem.indexOf('ENCRYPTED') != -1 && value == ''); +}, "Please enter a password for Private Key (PCK#8/PCK#1)"); + +$.validator.addMethod("dateUS", function (value, element,options) { + //mm/dd/yyyy + var check = false, + regex = /^\d{1,2}\/\d{1,2}\/\d{4}$/, + adata, gg, mm, aaaa, xdata; + if ( regex.test(value)) { + adata = value.split("/"); + mm = parseInt(adata[0], 10); + gg = parseInt(adata[1], 10); + aaaa = parseInt(adata[2], 10); + xdata = new Date(Date.UTC(aaaa, mm - 1, gg, 12, 0, 0, 0)); + if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth () === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) { + check = true; + } else { + check = false; + } + } else { + check = false; + } + return this.optional(element) || check; +}, "Please enter a valid date."); + +$.validator.addMethod("custom_email", function(value, element) { + if(!value) return true; + value = value.trim(); + if(value == '') return true; + return /^\S+@\S+(\.\S+)*$/.test( value ) +}, "field should be a valid email."); + +// override jquery validate plugin defaults +$.validator.setDefaults({ + ignore: [], + highlight: function(element) { + $(element).closest('.form-group').addClass('has-error'); + }, + unhighlight: function(element) { + $(element).closest('.form-group').removeClass('has-error'); + }, + errorElement: 'span', + errorClass: 'help-block', + errorPlacement: function(error, element) { + if(element.parent('.input-group').length) { + error.insertAfter(element.parent()); + } else { + error.insertAfter(element); + } + } +}); \ No newline at end of file diff --git a/assets/js/login.js b/assets/js/login.js new file mode 100644 index 00000000..0e005a91 --- /dev/null +++ b/assets/js/login.js @@ -0,0 +1,41 @@ +jQuery(document).ready(function($){ + + $('#login_form').submit(function(event){ + if(!navigator.cookieEnabled){ + event.preventDefault(); + checkCookiesEnabled(); + return false; + } + $('.btn-primary').attr('disabled', 'disabled'); + return true; + }); + + $(".toggle-password").click(function() { + + $(this).toggleClass("fa-eye-slash"); + var currentTitle = $(this).attr("title"); + if(currentTitle == "Show Password") + currentTitle = "Hide Password"; + else + currentTitle = "Show Password"; + $(this).attr("title", currentTitle); + var input = $($(this).attr("toggle")); + if (input.attr("type") == "password") { + input.attr("type", "text"); + } else { + input.attr("type", "password"); + } + }); + + checkCookiesEnabled(); +}); + +function checkCookiesEnabled(){ + var cookieEnabled = navigator.cookieEnabled; + + return cookieEnabled || showCookieFail(); +} + +function showCookieFail(){ + $('#cookies-disabled-dialog').show(); +} \ No newline at end of file diff --git a/assets/js/oauth2/profile/admin/api-scope-groups.js b/assets/js/oauth2/profile/admin/api-scope-groups.js new file mode 100644 index 00000000..d310e076 --- /dev/null +++ b/assets/js/oauth2/profile/admin/api-scope-groups.js @@ -0,0 +1,265 @@ +function loadGroups(){ + var link = ApiScopeGroupUrls.get; + $.ajax( + { + type: "GET", + url: link, + dataType: "json", + timeout:60000, + success: function (page,textStatus,jqXHR) { + //load data... + var groups = page.data; + + if(groups.length > 0) { + var template = $(' Edit Delete'); + var directives = { + 'tr': { + 'group<-context': { + 'td.name': 'group.name', + '.api-scope-group-active-checkbox@value': 'group.id', + '.api-scope-group-active-checkbox@checked': function (arg) { + return arg.item.active ? 'true' : ''; + }, + '.api-scope-group-active-checkbox@data-group-id': 'group.id', + '.api-scope-group-active-checkbox@id': function (arg) { + var id = arg.item.id; + return 'api-scope-group-active_' + id; + }, + 'a.edit-api-scope-group@href': function (arg) { + var id = arg.item.id; + var href = ApiScopeGroupUrls.edit; + return href.replace('-1', id); + }, + 'a.delete-api-scope-group@href': function (arg) { + var id = arg.item.id; + var href = ApiScopeGroupUrls.delete; + return href.replace('-1', id); + } + } + } + }; + var html = template.render(groups, directives); + $('#body-api-scope-groups').html(html.html()); + $('#info-api-scope-groups').hide() + } + else + { + $('#info-api-scope-groups').show(); + $('#body-api-scope-groups').hide(); + } + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); +} + +$(document).ready(function() { + + $('#server-admin', '#main-menu').addClass('active'); + + //validation rules on new server form + var scope_group_form = $('#form-api-scope-group'); + var dialog_scope_group = $('#dialog-form-api-scope-group'); + + var scope_group_validator = scope_group_form.validate({ + rules: { + "name" : { required: true, free_text:true,rangelength: [1, 255]}, + "users" : { required: true }, + "scopes" : { required: true }, + } + }); + + dialog_scope_group.modal({ + show:false, + backdrop:"static" + }); + + dialog_scope_group.on('hidden.bs.modal', function (e) { + scope_group_form.cleanForm(); + scope_group_validator.resetForm(); + $('#users').tagsinput('removeAll'); + $('#scopes').tagsinput('removeAll'); + }) + + $("body").on('click',".add-api-scope-group",function(event){ + dialog_scope_group.modal('show'); + event.preventDefault(); + return false; + }); + + $("body").on('click',".refresh-groups",function(event){ + loadGroups() + event.preventDefault(); + return false; + }); + + $("body").on('click',".api-scope-group-active-checkbox",function(event){ + var active = $(this).is(':checked'); + var group_id = $(this).attr('data-group-id'); + var url = active? ApiScopeGroupUrls.activate : ApiScopeGroupUrls.deactivate; + url = url.replace('@id',group_id); + var verb = active ? 'PUT':'DELETE'; + $.ajax( + { + type: verb, + url: url, + contentType: "application/json; charset=utf-8", + success: function (data,textStatus,jqXHR) { + //load data... + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + }); + + $("body").on('click',".save-api-scope-group",function(event){ + var is_valid = scope_group_form.valid(); + if (is_valid){ + var api_scope_group = scope_group_form.serializeForm(); + $.ajax({ + type: "POST", + url: ApiScopeGroupUrls.add, + data: JSON.stringify(api_scope_group), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + loadGroups(); + dialog_scope_group.modal('hide'); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + }); + } + event.preventDefault(); + return false; + }); + + $("body").on('click',".delete-api-scope-group",function(event){ + if(confirm("Are you sure?")){ + var href = $(this).attr('href'); + $.ajax( + { + type: "DELETE", + url: href, + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + loadGroups(); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + + // modal controls + + // scopes + + var scopes = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + remote: { + url: ApiScopeGroupUrls.fetchScopes, + wildcard: '%QUERY%', + prepare: function (query, settings) { + settings.url = ApiScopeGroupUrls.fetchScopes+'?filter[]=name=@'+query+'&filter[]=is_assigned_by_groups==1'; + return settings; + }, + transform: function(input){ + var page = input.data; + return page; + } + } + }); + + $('#scopes').tagsinput({ + itemValue: function(item) { + return item.id; + }, + itemText: function(item) { + return item.name + }, + freeInput: false, + allowDuplicates: false, + typeaheadjs: [ + { + highlight: true, + minLength: 1 + }, + { + name: 'scopes', + display: function(item) { + return item.name; + }, + templates: { + suggestion: function (item) { + return '

    ' + item.name + '

    '; + } + }, + source: scopes, + limit: 10 + } + ] + }); + + // users + + var users = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + remote: { + url: ApiScopeGroupUrls.fetchUsers, + wildcard: '%QUERY%', + prepare: function (query, settings) { + settings.url = ApiScopeGroupUrls.fetchUsers+'?filter=first_name=@'+query+',last_name=@'+query+',email=@'+query; + return settings; + }, + transform: function(input){ + var page = input.data; + return page; + } + } + }); + + $('#users').tagsinput({ + itemValue: function(item) { + return item.id; + }, + itemText: function(item) { + return item.first_name + ' ' + item.last_name; + }, + freeInput: false, + allowDuplicates: false, + typeaheadjs: [ + { + highlight: true, + minLength: 1 + }, + { + name: 'users', + display: function(item) { + return item.first_name + ' ' + item.last_name; + }, + templates: { + suggestion: function (item) { + return '

    ' + item.first_name + ' ' + item.last_name + '

    '; + } + }, + source: users, + limit: 10 + } + ] + }); + +}); \ No newline at end of file diff --git a/assets/js/oauth2/profile/admin/clients.js b/assets/js/oauth2/profile/admin/clients.js new file mode 100644 index 00000000..9279b71e --- /dev/null +++ b/assets/js/oauth2/profile/admin/clients.js @@ -0,0 +1,42 @@ +jQuery(document).ready(function($){ + + $('#server-admin','#main-menu').addClass('active'); + + if($('#clients-table tr').length===1){ + $('#clients-info').show(); + $('#clients-table').hide(); + } + else{ + $('#clients-info').hide(); + $('#clients-table').show(); + } + + $("body").on('click',".unlock-client",function(event){ + if(confirm("Are you sure that you want to unlock this OAUTH2 Client?")){ + var url = $(this).attr('href'); + var client_id = $(this).attr('data-client-id'); + $.ajax( + { + type: "DELETE", + url: url, + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + //load data... + $('#'+client_id,'#body-locked-clients').remove(); + + if($('#clients-table tr').length===1){ + $('#clients-info').show(); + $('#clients-table').hide(); + } + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); +}); \ No newline at end of file diff --git a/assets/js/oauth2/profile/admin/edit-api-scope-group.js b/assets/js/oauth2/profile/admin/edit-api-scope-group.js new file mode 100644 index 00000000..8602ea64 --- /dev/null +++ b/assets/js/oauth2/profile/admin/edit-api-scope-group.js @@ -0,0 +1,150 @@ +$(document).ready(function() { + + // scopes + + var scopes = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + remote: { + url: ApiScopeGroupUrls.fetchScopes, + wildcard: '%QUERY%', + prepare: function (query, settings) { + settings.url = ApiScopeGroupUrls.fetchScopes+'?filter[]=name=@'+query+'&filter[]=is_assigned_by_groups==1'; + return settings; + }, + transform: function(input){ + var page = input.data; + return page; + } + } + }); + + $('#scopes').tagsinput({ + itemValue: function(item) { + return item.id; + }, + itemText: function(item) { + return item.name + }, + freeInput: false, + allowDuplicates: false, + typeaheadjs: [ + { + highlight: true, + minLength: 1 + }, + { + name: 'scopes', + display: function(item) { + return item.name; + }, + templates: { + suggestion: function (item) { + return '

    ' + item.name + '

    '; + } + }, + source: scopes, + limit: 10 + } + ] + }); + + for(var scope of current_scopes) + { + $('#scopes').tagsinput('add', scope); + } + + // users + + var users = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + remote: { + url: ApiScopeGroupUrls.fetchUsers, + wildcard: '%QUERY%', + prepare: function (query, settings) { + settings.url = ApiScopeGroupUrls.fetchUsers+'?filter=first_name=@'+query+',last_name=@'+query+',email=@'+query; + return settings; + }, + transform: function(input){ + var page = input.data; + return page; + } + } + }); + + $('#users').tagsinput({ + itemValue: function(item) { + return item.id; + }, + itemText: function(item) { + return item.first_name + ' ' + item.last_name; + }, + freeInput: false, + allowDuplicates: false, + typeaheadjs: [ + { + highlight: true, + minLength: 1 + }, + { + name: 'users', + display: function(item) { + return item.first_name + ' ' + item.last_name; + }, + templates: { + suggestion: function (item) { + return '

    ' + item.first_name + ' ' + item.last_name + '

    '; + } + }, + source: users, + limit: 10 + } + ] + }); + + + for(var user of current_users) + { + $('#users').tagsinput('add',user); + } + + var group_form = $('#api-scope-group-form'); + var group_validator = group_form.validate({ + rules: { + "name" : { required: true, free_text:true,rangelength: [1, 255]}, + "users" : { required: true }, + "scopes" : { required: true }, + } + }); + + group_form.submit(function( event ) { + + var is_valid = group_form.valid(); + + if (is_valid){ + group_validator.resetForm(); + var group = group_form.serializeForm(); + var href = $(this).attr('action'); + $.ajax( + { + type: "PUT", + url: href, + data: JSON.stringify(group), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + displaySuccessMessage('Group Saved!.' , group_form); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + +}); \ No newline at end of file diff --git a/assets/js/oauth2/profile/admin/edit-api.js b/assets/js/oauth2/profile/admin/edit-api.js new file mode 100644 index 00000000..4e540d9e --- /dev/null +++ b/assets/js/oauth2/profile/admin/edit-api.js @@ -0,0 +1,462 @@ +function loadScopes(){ + $.ajax({ + type: "GET", + url: scopesUrls.get, + contentType: "application/json; charset=utf-8", + timeout:60000, + success: function (page,textStatus,jqXHR) { + var items = page.data; + if(items.length > 0){ + $('#info-scopes').hide(); + $('#table-scopes').show(); + var template = $('' + + '' + + '' + + '' + + '' + + ' ' + + 'Edit ' + + 'Delete' + + ''); + var directives = { + 'tr':{ + 'scope<-context':{ + 'td.name':'scope.name', + //active + '.scope-active-checkbox@value':'scope.id', + '.scope-active-checkbox@checked':function(arg){ + return arg.item.active?'true':''; + }, + '.scope-active-checkbox@id':function(arg){ + var id = arg.item.id; + return 'scope-active_'+id; + }, + '.scope-active-checkbox@data-scope-id':'scope.id', + //default + '.scope-default-checkbox@value':'scope.id', + '.scope-default-checkbox@checked':function(arg){ + return arg.item.default?'true':''; + }, + '.scope-default-checkbox@id':function(arg){ + var id = arg.item.id; + return 'scope-default_'+id; + }, + '.scope-default-checkbox@data-scope-id':'scope.id', + //system + '.scope-system-checkbox@value':'scope.id', + '.scope-system-checkbox@checked':function(arg){ + return arg.item.system?'true':''; + }, + '.scope-system-checkbox@id':function(arg){ + var id = arg.item.id; + return 'scope-system_'+id; + }, + '.scope-system-checkbox@data-scope-id':'scope.id', + //buttons + 'a.edit-scope@href':function(arg){ + var id = arg.item.id; + var href = scopesUrls.edit; + return href.replace('@id',id); + }, + 'a.delete-scope@href':function(arg){ + var id = arg.item.id; + var href = scopesUrls.delete; + return href.replace('@id',id); + } + } + } + }; + var html = template.render(items, directives); + $('#body-scopes').html(html.html()); + } + else{ + $('#info-scopes').show(); + $('#table-scopes').hide(); + } + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + }); +} + +function loadEndpoints(){ + $.ajax({ + type: "GET", + url: endpointUrls.get, + contentType: "application/json; charset=utf-8", + timeout:60000, + success: function (page,textStatus,jqXHR) { + var items = page.data; + if(items.length>0){ + $('#info-endpoints').hide(); + $('#table-endpoints').show(); + var template = $('' + + '' + + '' + + '' + + '' + + ' ' + + 'Edit ' + + 'Delete' + + ''); + var directives = { + 'tr':{ + 'endpoint<-context':{ + 'td.name':'endpoint.name', + 'td.route':'endpoint.route', + 'td.method':'endpoint.http_method', + //active + '.endpoint-active-checkbox@value':'scope.id', + '.endpoint-active-checkbox@checked':function(arg){ + return arg.item.active?'true':''; + }, + '.endpoint-active-checkbox@id':function(arg){ + var id = arg.item.id; + return 'endpoint-active_'+id; + }, + '.endpoint-active-checkbox@data-endpoint-id':'endpoint.id', + //buttons + 'a.edit-endpoint@href':function(arg){ + var id = arg.item.id; + var href = endpointUrls.edit; + return href.replace('@id',id); + }, + 'a.delete-endpoint@href':function(arg){ + var id = arg.item.id; + var href = endpointUrls.delete; + return href.replace('@id',id); + } + } + } + }; + var html = template.render(items, directives); + $('#body-endpoints').html(html.html()); + } + else{ + $('#info-endpoints').show(); + $('#table-endpoints').hide(); + } + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + }); +} + +$(document).ready(function() { + + $('#server-admin','#main-menu').addClass('active'); + + var api_form = $('#api-form'); + var api_validator = api_form.validate({ + rules: { + "name" : {required: true, nowhitespace:true,rangelength: [1, 255]}, + "description": {required: true, free_text:true,rangelength: [1, 512]} + } + }); + + api_form.submit(function( event ) { + var is_valid = api_form.valid(); + if (is_valid){ + api_validator.resetForm(); + var api = api_form.serializeForm(); + var href = $(this).attr('action'); + $.ajax( + { + type: "PUT", + url: href, + data: JSON.stringify(api), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + displaySuccessMessage(editApiMessages.success,api_form); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + + //scopes + + if($('#table-scopes tr').length===1){ + $('#info-scopes').show(); + $('#table-scopes').hide(); + } + + $("body").on('click','.scope-active-checkbox',function(event){ + var id = $(this).attr('data-scope-id'); + var active = $(this).is(':checked'); + + var url = active? scopesUrls.activate : scopesUrls.deactivate; + url = url.replace('@id', id); + var verb = active?'PUT':'DELETE' + + $.ajax( + { + type: verb, + url: url, + contentType: "application/json; charset=utf-8", + success: function (data,textStatus,jqXHR) { + //load data... + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + }); + + $("body").on('click','.scope-default-checkbox',function(event){ + var id = $(this).attr('data-scope-id'); + var is_default = $(this).is(':checked'); + var url = scopesUrls.update; + url = url.replace('@id', id); + var scope = { id : id, default:is_default}; + + $.ajax( + { + type: "PUT", + url: url, + data: JSON.stringify(scope), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + //load data... + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + }); + + $("body").on('click','.scope-system-checkbox',function(event){ + var id = $(this).attr('data-scope-id'); + var is_system = $(this).is(':checked'); + var url = scopesUrls.update; + url = url.replace('@id', id); + var scope = { id : id, system:is_system}; + + $.ajax( + { + type: "PUT", + url: url, + data: JSON.stringify(scope), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + //load data... + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + + }); + + $("body").on('click','.refresh-scopes',function(event){ + loadScopes(); + event.preventDefault(); + return false; + }); + + + var scope_dialog = $('#dialog-form-scope'); + var scope_form = $('#form-scope'); + + var scope_validator = scope_form.validate({ + rules: { + "name" : {required: true, scopename:true,rangelength: [1, 512]}, + "short_description": {required: true, free_text:true,rangelength: [1, 512]}, + "description": {required: true, free_text:true,rangelength: [1, 1024]} + } + }); + + scope_dialog.modal({ + show:false, + backdrop:"static" + }); + + scope_dialog.on('hidden.bs.modal', function () { + scope_form.cleanForm(); + scope_validator.resetForm(); + }) + + $("body").on('click',".add-scope",function(event){ + scope_dialog.modal('show'); + event.preventDefault(); + return false; + }); + + $("body").on('click',".save-scope",function(event){ + var is_valid = scope_form.valid(); + if (is_valid){ + var scope = scope_form.serializeForm(); + scope.api_id = api_id; + $.ajax( + { + type: "POST", + url: scopesUrls.add, + data: JSON.stringify(scope), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + loadScopes(); + scope_dialog.modal('hide'); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + + $("body").on('click',".delete-scope",function(event){ + if(confirm("Are you sure? this will delete all application assigned scopes and all endpoints assigned scopes too.")){ + var url = $(this).attr('href'); + $.ajax( + { + type: "DELETE", + url: url, + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + loadScopes(); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + + //endpoints + + var endpoint_dialog = $('#dialog-form-endpoint'); + var endpoint_form = $('#form-endpoint'); + + if($('#table-endpoints tr').length===1){ + $('#info-endpoints').show(); + $('#table-endpoints').hide(); + } + + $("body").on('click','.endpoint-active-checkbox',function(event){ + var id = $(this).attr('data-endpoint-id'); + var active = $(this).is(':checked'); + var url = active? endpointUrls.activate : endpointUrls.deactivate; + url = url.replace('@id',id); + var verb = active?'PUT':'DELETE'; + $.ajax( + { + type: verb, + url: url, + contentType: "application/json; charset=utf-8", + success: function (data,textStatus,jqXHR) { + //load data... + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + }); + + $("body").on('click','.refresh-endpoints',function(event){ + loadEndpoints(); + event.preventDefault(); + return false; + }); + + var endpoint_validator = endpoint_form.validate({ + rules: { + "name" : {required: true, nowhitespace:true,rangelength: [1, 255]}, + "description":{required: true, free_text:true,rangelength: [1, 1024]}, + "route": {required: true,endpointroute:true,rangelength: [1, 1024]}, + "rate_limit": {required: true, number:true} + } + }); + + endpoint_dialog.modal({ + show:false, + backdrop:"static" + }); + + endpoint_dialog.on('hidden.bs.modal', function () { + endpoint_form.cleanForm(); + endpoint_validator.resetForm(); + }) + + $("body").on('click',".add-endpoint",function(event){ + endpoint_dialog.modal('show'); + event.preventDefault(); + return false; + }); + + $("body").on('click',".save-endpoint",function(event){ + var is_valid = endpoint_form.valid(); + if (is_valid){ + var endpoint = endpoint_form.serializeForm(); + endpoint.api_id = api_id; + $.ajax( + { + type: "POST", + url: endpointUrls.add, + data: JSON.stringify(endpoint), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + loadEndpoints(); + endpoint_dialog.modal('hide'); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + + $("body").on('click',".delete-endpoint",function(event){ + if(confirm("Are you sure? this will delete the selected endpoint.")){ + var url = $(this).attr('href'); + $.ajax( + { + type: "DELETE", + url: url, + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + loadEndpoints(); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); +}); \ No newline at end of file diff --git a/assets/js/oauth2/profile/admin/edit-endpoint.js b/assets/js/oauth2/profile/admin/edit-endpoint.js new file mode 100644 index 00000000..cf45ab2f --- /dev/null +++ b/assets/js/oauth2/profile/admin/edit-endpoint.js @@ -0,0 +1,65 @@ +jQuery(document).ready(function($){ + + $('#server-admin','#main-menu').addClass('active'); + + var endpoint_form = $('#endpoint-form'); + + var endpoint_validator = endpoint_form.validate({ + rules: { + "name" : {required: true, nowhitespace:true,rangelength: [1, 255]}, + "description":{required: true, free_text:true,rangelength: [1, 1024]}, + "route": {required: true, endpointroute:true,rangelength: [1, 1024]}, + "rate_limit": {required: true, number:true}, + "http_method": {required: true} + } + }); + + endpoint_form.submit(function( event ) { + var is_valid = endpoint_form.valid(); + if (is_valid){ + endpoint_validator.resetForm(); + var endpoint = endpoint_form.serializeForm(); + var href = $(this).attr('action'); + $.ajax( + { + type: "PUT", + url: href, + data: JSON.stringify(endpoint), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + displaySuccessMessage(editEndpointMessages.success , endpoint_form); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + //scopes associations + $("body").on('click',".scope-checkbox",function(event){ + var add_link = $(this).attr('data-add-link'); + var del_link = $(this).attr('data-remove-link'); + var checked = $(this).is(':checked'); + var url = checked?add_link:del_link; + var verb = checked?'PUT':'DELETE'; + $.ajax( + { + type: verb, + url: url, + contentType: "application/json; charset=utf-8", + timeout:60000, + success: function (data,textStatus,jqXHR) { + //load data... + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + }); +}); \ No newline at end of file diff --git a/assets/js/oauth2/profile/admin/edit-resource-server.js b/assets/js/oauth2/profile/admin/edit-resource-server.js new file mode 100644 index 00000000..33d1a086 --- /dev/null +++ b/assets/js/oauth2/profile/admin/edit-resource-server.js @@ -0,0 +1,260 @@ + +function loadApis(){ + $.ajax({ + type: "GET", + url: ApiUrls.get, + contentType: "application/json; charset=utf-8", + timeout:60000, + success: function (page,textStatus,jqXHR) { + var items = page.data; + if(items.length > 0){ + $('#info-apis').hide(); + $('#table-apis').show(); + var template = $(' Edit Delete'); + var directives = { + 'tr':{ + 'api<-context':{ + 'img@src':function(arg){ + var logo = arg.item.logo; + if(logo == null || logo=='') logo = "/assets/img/apis/server.png"; + return logo; + }, + 'img@alt':'api.name', + 'td.name':'api.name', + '.api-active-checkbox@value':'api.id', + '.api-active-checkbox@checked':function(arg){ + return arg.item.active?'true':''; + }, + '.api-active-checkbox@id':function(arg){ + var id = arg.item.id; + return 'resource-server-api-active_'+id; + }, + '.api-active-checkbox@data-api-id':'api.id', + 'a.edit-api@href':function(arg){ + var id = arg.item.id; + var href = ApiUrls.edit; + return href.replace('-1',id); + }, + 'a.delete-api@href':function(arg){ + var id = arg.item.id; + var href = ApiUrls.delete; + return href.replace('-1',id); + } + } + } + }; + var html = template.render(items, directives); + $('#body-apis').html(html.html()); + } + else{ + $('#info-apis').show(); + $('#table-apis').hide(); + } + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + }); +} + +jQuery(document).ready(function($){ + + $('#server-admin','#main-menu').addClass('active'); + + if($('#table-apis tr').length === 1) + { + $('#info-apis').show(); + $('#table-apis').hide(); + } + + $("body").on('click','.refresh-apis',function(event){ + loadApis(); + event.preventDefault(); + return false; + }); + + var resource_server_form = $('#resource-server-form'); + + var api_form = $('#form-api'); + var api_dialog = $('#dialog-form-api'); + + api_dialog.modal({ + show:false, + backdrop:"static" + }); + + var resource_server_validator = resource_server_form.validate({ + rules: { + "host" : {required: true}, + "friendly_name": {required: true, free_text:true,rangelength: [1, 255]}, + "ips": {required: true, ipv4V6Set: true } + } + }); + + var api_validator = api_form.validate({ + rules: { + "name" : {required: true, nowhitespace:true,rangelength: [1, 255]}, + "description": {required: true, free_text:true,rangelength: [1, 512]} + } + }); + + $('#host').tagsinput({ + trimValue: true, + onTagExists: function(item, $tag) { + $tag.hide().fadeIn(); + }, + allowDuplicates: false + }); + + $('#ips').tagsinput({ + trimValue: true, + onTagExists: function(item, $tag) { + $tag.hide().fadeIn(); + }, + allowDuplicates: false + }); + + $('#ips').on('beforeItemAdd', function(event) { + var ip = event.item; + var valid = regex_ipv4.test(ip); + if(!valid) + valid = regex_ipv6.test(ip); + if(!valid) + event.cancel = true; + }); + + api_dialog.on('hidden.bs.modal', function () { + api_form.cleanForm(); + api_validator.resetForm(); + }) + + $("body").on('click','.save-api',function(event){ + var is_valid = api_form.valid(); + if (is_valid){ + var api = api_form.serializeForm(); + api.resource_server_id = resource_server_id; + $.ajax({ + type: "POST", + url: ApiUrls.add, + data: JSON.stringify(api), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + loadApis(); + api_dialog.modal('hide'); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + }); + } + event.preventDefault(); + return false; + }); + + resource_server_form.submit(function( event ) { + + var is_valid = resource_server_form.valid(); + + if (is_valid){ + resource_server_validator.resetForm(); + var resource_server = resource_server_form.serializeForm(); + var href = $(this).attr('action'); + $.ajax( + { + type: "PUT", + url: href, + data: JSON.stringify(resource_server), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + displaySuccessMessage(resourceServerMessages.success , resource_server_form); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + + $("body").on('click',".add-api",function(event){ + api_dialog.modal('show'); + event.preventDefault(); + return false; + }); + + $("body").on('click',".api-active-checkbox",function(event){ + var active = $(this).is(':checked'); + var api_id = $(this).attr('data-api-id'); + var url = active? ApiUrls.activate : ApiUrls.deactivate; + url = url.replace('@id',api_id); + var verb = active?'PUT':'DELETE'; + $.ajax( + { + type: verb, + url: url, + contentType: "application/json; charset=utf-8", + timeout:60000, + success: function (data,textStatus,jqXHR) { + //load data... + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + }); + + $("body").on('click',".delete-api",function(event){ + if(confirm("Are you sure? this would delete all related registered endpoints and associated scopes.")){ + var href = $(this).attr('href'); + $.ajax( + { + type: "DELETE", + url: href, + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + loadApis(); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + + $("body").on('click',".regenerate-client-secret",function(event){ + if(confirm("Are you sure? Regenerating client secret would invalidate all current tokens")){ + var link = $(this).attr('href'); + $.ajax( + { + type: "PUT", + url: link, + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + //load data... + $('#client_secret').text(data.client_secret); + //clean token UI + $('#table-access-tokens').remove(); + $('#table-refresh-tokens').remove(); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); +}); \ No newline at end of file diff --git a/assets/js/oauth2/profile/admin/edit-scope.js b/assets/js/oauth2/profile/admin/edit-scope.js new file mode 100644 index 00000000..397cfb4f --- /dev/null +++ b/assets/js/oauth2/profile/admin/edit-scope.js @@ -0,0 +1,41 @@ +$(document).ready(function() { + + $('#server-admin','#main-menu').addClass('active'); + + var scope_form = $('#scope-form'); + + var scope_validator = scope_form.validate({ + rules: { + "name" : {required: true, scopename:true,rangelength: [1, 512]}, + "short_description": {required: true, free_text:true,rangelength: [1, 512]}, + "description": {required: true, free_text:true,rangelength: [1, 1024]} + } + }); + + scope_form.submit(function( event ) { + var is_valid = scope_form.valid(); + if (is_valid){ + scope_validator.resetForm(); + var scope = scope_form.serializeForm(); + var href = $(this).attr('action'); + $.ajax( + { + type: "PUT", + url: href, + data: JSON.stringify(scope), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + displaySuccessMessage(editScopeMessages.success,scope_form); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); +}); diff --git a/assets/js/oauth2/profile/admin/resource-servers.js b/assets/js/oauth2/profile/admin/resource-servers.js new file mode 100644 index 00000000..0409e62c --- /dev/null +++ b/assets/js/oauth2/profile/admin/resource-servers.js @@ -0,0 +1,181 @@ +function loadResourceServers(){ + var link = resourceServerUrls.get; + $.ajax( + { + type: "GET", + url: link, + dataType: "json", + timeout:60000, + success: function (page,textStatus,jqXHR) { + //load data... + var items = page.data; + var template = $(' Edit Delete'); + var directives = { + 'tr':{ + 'resource_server<-context':{ + 'td.fname':'resource_server.friendly_name', + 'td.hname':'resource_server.host', + 'td.ips':'resource_server.ips', + '.resource-server-active-checkbox@value':'resource_server.id', + '.resource-server-active-checkbox@checked':function(arg){ + return arg.item.active?'true':''; + }, + '.resource-server-active-checkbox@data-resource-server-id':'resource_server.id', + '.resource-server-active-checkbox@id':function(arg){ + var id = arg.item.id; + return 'resource-server-active_'+id; + }, + 'a.edit-resource-server@href':function(arg){ + var id = arg.item.id; + var href = resourceServerUrls.edit; + return href.replace('-1',id); + }, + 'a.delete-resource-server@href':function(arg){ + var id = arg.item.id; + var href = resourceServerUrls.delete; + return href.replace('-1',id); + } + } + } + }; + var html = template.render(items, directives); + $('#body-resource-servers').html(html.html()); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); +} + +$(document).ready(function() { + + $('#server-admin','#main-menu').addClass('active'); + + //validation rules on new server form + var resource_server_form = $('#form-resource-server'); + var dialog_resource_server = $('#dialog-form-resource-server'); + + var resource_server_validator = resource_server_form.validate({ + rules: { + "host" : {required: true}, + "friendly_name": {required: true, free_text:true, rangelength: [1, 255]}, + "ips": {required: true}, + } + }); + + dialog_resource_server.modal({ + show:false, + backdrop:"static" + }); + + $('#host').tagsinput({ + trimValue: true, + onTagExists: function(item, $tag) { + $tag.hide().fadeIn(); + }, + allowDuplicates: false + }); + + $('#ips').tagsinput({ + trimValue: true, + onTagExists: function(item, $tag) { + $tag.hide().fadeIn(); + }, + allowDuplicates: false + }); + + $('#ips').on('beforeItemAdd', function(event) { + var ip = event.item; + var valid = regex_ipv4.test(ip); + if(!valid) + valid = regex_ipv6.test(ip); + if(!valid) + event.cancel = true; + }); + + dialog_resource_server.on('hidden', function () { + resource_server_form.cleanForm(); + resource_server_validator.resetForm(); + }) + + $("body").on('click',".add-resource-server",function(event){ + dialog_resource_server.modal('show'); + event.preventDefault(); + return false; + }); + + $("body").on('click',".refresh-servers",function(event){ + loadResourceServers() + event.preventDefault(); + return false; + }); + + $("body").on('click',".resource-server-active-checkbox",function(event){ + var active = $(this).is(':checked'); + var resource_server_id = $(this).attr('data-resource-server-id'); + var url = active? resourceServerUrls.activate : resourceServerUrls.deactivate; + url = url.replace('@id',resource_server_id); + var verb = active?'PUT':'DELETE'; + $.ajax( + { + type: verb, + url: url, + contentType: "application/json; charset=utf-8", + success: function (data,textStatus,jqXHR) { + //load data... + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + }); + + $("body").on('click',".save-resource-server",function(event){ + var is_valid = resource_server_form.valid(); + if (is_valid){ + var resource_server = resource_server_form.serializeForm(); + $.ajax({ + type: "POST", + url: resourceServerUrls.add, + data: JSON.stringify(resource_server), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + loadResourceServers(); + dialog_resource_server.modal('hide'); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + }); + } + event.preventDefault(); + return false; + }); + + $("body").on('click',".delete-resource-server",function(event){ + if(confirm("Are you sure? this would delete all related registered apis, endpoints and associated scopes.")){ + var href = $(this).attr('href'); + $.ajax( + { + type: "DELETE", + url: href, + dataType: "json", + timeout:60000, + success: function (data,textStatus,jqXHR) { + loadResourceServers(); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + +}); \ No newline at end of file diff --git a/assets/js/oauth2/profile/admin/server-private-keys.js b/assets/js/oauth2/profile/admin/server-private-keys.js new file mode 100644 index 00000000..9cd5ccf7 --- /dev/null +++ b/assets/js/oauth2/profile/admin/server-private-keys.js @@ -0,0 +1,320 @@ +(function( $ ){ + + $(document).ready(function($){ + + var options = {}; + + options.ui = + { + showPopover: false, + showErrors: true, + showProgressBar: true, + showVerdictsInsideProgressBar: true, + }; + + options.rules = + { + activated: { + wordTwoCharacterClasses: true, + wordRepetitions: true + } + }; + + $(':password').pwstrength(options); + + var modal = $('#ModalAddPrivateKey'); + modal.modal({show:false}); + + // private key form + var form = $('#form-add-private-key'); + + var validator = form.validate({ + rules: { + "kid" : { + required: true, + free_text : true, + maxlength:255, + minlength: 5 + }, + "valid_from": { + required: true, + dateUS:true + }, + "valid_to": { + required: true , + dateUS:true + }, + "pem_content" : { pem_private_key : function(element){ + var autogenerate = $("#autogenerate").is(':checked'); + return autogenerate? false: true; + }}, + password: { + private_key_password_required: {pem_content_id: '#pem_content'}, + minlength: 5 + }, + "password-confirmation" : { + minlength: 5, + equalTo : "#password" + }, + "alg" : {required: true} + } + }); + + modal.on('shown.bs.modal', function (e) { + $("#form-add-private-key .date-picker").datepicker({ + startDate: "today", + todayBtn: "linked", + clearBtn: true, + todayHighlight: true, + //orientation: "bottom right", + autoclose: true + }); + }) + + modal.on('hidden.bs.modal', function () { + form.cleanForm(); + validator.resetForm(); + }) + + $("body").on('click',".add-private-key",function(event){ + modal.modal('show'); + validator.resetForm(); + $(":password").pwstrength("forceUpdate"); + $('#autogenerate').prop('checked', true); + $('#active').prop('checked', true); + $("#pem_container").hide(); + event.preventDefault(); + return false; + }); + + $("body").on('click',"#autogenerate",function(event){ + var autogenerate = $(this).is(':checked'); + if(autogenerate){ + $("#pem_container").hide(); + } + else{ + $("#pem_container").show(); + } + }); + + $("body").on('click',".delete-private-key",function(event){ + if(window.confirm('are you sure?')){ + //delete key + var private_key_id = $(this).attr('data-private-key-id'); + + $.ajax( + { + type: "DELETE", + url: privateKeyUrls.delete.replace('@id', private_key_id), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout: 60000, + success: function (data, textStatus, jqXHR) { + $('#tr_'+private_key_id).fadeOut(300, function() { + $(this).remove(); + if($('#body-private-keys').children('tr').length) + $('.private-keys-empty-message').hide(); + else + $('.private-keys-empty-message').show(); + }); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + } + event.preventDefault(); + return false; + }); + + $("body").on('click',".save-private-key",function(event){ + + if(form.valid()) { + var private_key_data = form.serializeForm(); + private_key_data.type = 'RSA'; + + if(private_key_data.autogenerate) + delete private_key_data.pem_content; + + $.ajax( + { + type: "POST", + url: privateKeyUrls.add, + data: JSON.stringify(private_key_data), + contentType: "application/json; charset=utf-8", + dataType: "json", + timeout: 60000, + success: function (data, textStatus, jqXHR) { + modal.modal('hide'); + form.cleanForm(); + + $('.private-keys-empty-message').hide(); + loadPrivateKeys(); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + + } + event.preventDefault(); + return false; + }); + + $("body").on('click',".private-key-status",function(event){ + + var status_badge = $(this); + var private_key_id = status_badge.attr('data-private-key-id'); + var private_key_data = { id : private_key_id }; + private_key_data.active = status_badge.hasClass('private-key-active') ? false : true; + + $.ajax( + { + type: "PUT", + url: privateKeyUrls.update.replace('@id', private_key_id), + contentType: "application/json; charset=utf-8", + data: JSON.stringify(private_key_data), + dataType: "json", + timeout: 60000, + success: function (data, textStatus, jqXHR) { + loadPrivateKeys(); + }, + error: function (jqXHR, textStatus, errorThrown) { + ajaxError(jqXHR, textStatus, errorThrown); + } + } + ); + + event.preventDefault(); + return false; + }); + + $('#usage').change(function(){ + + var usage = $(this).val(); + + var alg_select = $('#alg'); + + alg_select.empty(); + + var result = []; + + if(usage === 'sig') + { + result = oauth2_supported_algorithms.sig_algorihtms.rsa; + } + else + { + result = oauth2_supported_algorithms.key_management_algorihtms; + } + + $.each(result, function(index, item) { + var key = item === 'none' ? '' : item; + alg_select.append($("