From 46eca22a0805230845902a24a2a4164c096f7c73 Mon Sep 17 00:00:00 2001 From: smarcet Date: Sat, 14 Mar 2026 01:59:51 +0000 Subject: [PATCH 01/52] deploy: 118ffc370c76889c35fd2d2153832c4023a37e84 --- .github/workflows/nightly_unit_tests.yml | 73 - .github/workflows/pull_request_unit_tests.yml | 76 -- .github/workflows/push.yml | 74 -- .htaccess | 20 + .nojekyll | 0 assets/css/auth/consent.css | 12 + assets/css/auth/email.css | 90 ++ assets/css/auth/login.css | 9 + assets/css/auth/register.css | 99 ++ assets/css/edit-client-public-keys.css | 28 + assets/css/edit-client.css | 4 + assets/css/main.css | 372 ++++++ assets/css/newClientDialog.css | 26 + assets/css/passwordReset.css | 36 + assets/css/private-keys.css | 30 + .../smoothness/images/animated-overlay.gif | Bin 0 -> 1738 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 212 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 208 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 335 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 207 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 332 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 280 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 6992 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 6999 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4549 bytes .../smoothness/jquery-ui-1.10.3.custom.css | 1177 +++++++++++++++++ .../jquery-ui-1.10.3.custom.min.css | 7 + assets/img/apis/server.png | Bin 0 -> 1442 bytes assets/img/generic-profile-photo-small.png | Bin 0 -> 3861 bytes assets/img/generic-profile-photo.png | Bin 0 -> 2176 bytes assets/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes assets/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes assets/img/oauth2.default.logo.png | Bin 0 -> 14587 bytes assets/img/openstack-logo-full.svg | 57 + .../icon_apple.svg | 56 + .../icon_facebook.svg | 13 + .../icon_google.png | Bin 0 -> 1428 bytes .../icon_linkedin.svg | 3 + .../icon_okta.png | Bin 0 -> 1200 bytes assets/js/admin/banned-ips.js | 42 + assets/js/admin/edit-group.js | 194 +++ assets/js/admin/edit-user.js | 223 ++++ assets/js/admin/groups.js | 119 ++ assets/js/admin/server-config.js | 39 + assets/js/admin/users.js | 240 ++++ assets/js/ajax.utils.js | 76 ++ assets/js/auth/email-verification.js | 38 + assets/js/auth/registration.js | 76 ++ assets/js/auth/registration_success.js | 16 + assets/js/auth/reset_password.js | 62 + assets/js/auth/send_password_link.js | 46 + assets/js/auth/set_password.js | 74 ++ assets/js/auth/set_password_success.js | 24 + assets/js/basic-crud.js | 249 ++++ assets/js/jquery-ajax-loader.js | 85 ++ assets/js/jquery.cleanform.js | 10 + assets/js/jquery.serialize.js | 32 + ...uery.validate.additional.custom.methods.js | 115 ++ assets/js/login.js | 41 + .../oauth2/profile/admin/api-scope-groups.js | 265 ++++ assets/js/oauth2/profile/admin/clients.js | 42 + .../profile/admin/edit-api-scope-group.js | 150 +++ assets/js/oauth2/profile/admin/edit-api.js | 462 +++++++ .../js/oauth2/profile/admin/edit-endpoint.js | 65 + .../profile/admin/edit-resource-server.js | 260 ++++ assets/js/oauth2/profile/admin/edit-scope.js | 41 + .../oauth2/profile/admin/resource-servers.js | 181 +++ .../profile/admin/server-private-keys.js | 320 +++++ assets/js/oauth2/profile/clients.js | 254 ++++ assets/js/oauth2/profile/edit-client-data.js | 232 ++++ .../oauth2/profile/edit-client-public-keys.js | 277 ++++ .../js/oauth2/profile/edit-client-scopes.js | 28 + .../profile/edit-client-security-logout.js | 55 + .../edit-client-security-main-settings.js | 113 ++ .../js/oauth2/profile/edit-client-tokens.js | 226 ++++ assets/js/oauth2/profile/edit-user-grants.js | 216 +++ assets/js/oauth2/session/check.session.js | 108 ++ assets/js/openid/consent.js | 15 + assets/js/profile.js | 206 +++ assets/js/urlfragment.jquery.js | 95 ++ favicon.ico | 0 favicon/android-chrome-192x192.png | Bin 0 -> 1561 bytes favicon/android-chrome-256x256.png | Bin 0 -> 2153 bytes favicon/apple-touch-icon.png | Bin 0 -> 1198 bytes favicon/browserconfig.xml | 9 + favicon/favicon-16x16.png | Bin 0 -> 648 bytes favicon/favicon-32x32.png | Bin 0 -> 678 bytes favicon/favicon.ico | Bin 0 -> 15086 bytes favicon/manifest.json | 17 + favicon/mstile-150x150.png | Bin 0 -> 1272 bytes favicon/safari-pinned-tab.svg | 27 + index.php | 58 + openapi/pr-119/api-docs.json | 407 ++++++ openapi/pr-119/index.html | 20 + robots.txt | 2 + 99 files changed, 7991 insertions(+), 223 deletions(-) delete mode 100644 .github/workflows/nightly_unit_tests.yml delete mode 100644 .github/workflows/pull_request_unit_tests.yml delete mode 100644 .github/workflows/push.yml create mode 100644 .htaccess create mode 100644 .nojekyll create mode 100644 assets/css/auth/consent.css create mode 100644 assets/css/auth/email.css create mode 100644 assets/css/auth/login.css create mode 100644 assets/css/auth/register.css create mode 100644 assets/css/edit-client-public-keys.css create mode 100644 assets/css/edit-client.css create mode 100644 assets/css/main.css create mode 100644 assets/css/newClientDialog.css create mode 100644 assets/css/passwordReset.css create mode 100644 assets/css/private-keys.css create mode 100755 assets/css/smoothness/images/animated-overlay.gif create mode 100755 assets/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100755 assets/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png create mode 100755 assets/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100755 assets/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png create mode 100755 assets/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png create mode 100755 assets/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100755 assets/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100755 assets/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100755 assets/css/smoothness/images/ui-icons_222222_256x240.png create mode 100755 assets/css/smoothness/images/ui-icons_2e83ff_256x240.png create mode 100755 assets/css/smoothness/images/ui-icons_454545_256x240.png create mode 100755 assets/css/smoothness/images/ui-icons_888888_256x240.png create mode 100755 assets/css/smoothness/images/ui-icons_cd0a0a_256x240.png create mode 100755 assets/css/smoothness/jquery-ui-1.10.3.custom.css create mode 100755 assets/css/smoothness/jquery-ui-1.10.3.custom.min.css create mode 100644 assets/img/apis/server.png create mode 100755 assets/img/generic-profile-photo-small.png create mode 100755 assets/img/generic-profile-photo.png create mode 100644 assets/img/glyphicons-halflings-white.png create mode 100644 assets/img/glyphicons-halflings.png create mode 100644 assets/img/oauth2.default.logo.png create mode 100644 assets/img/openstack-logo-full.svg create mode 100644 assets/img/third_party_identity_providers/icon_apple.svg create mode 100644 assets/img/third_party_identity_providers/icon_facebook.svg create mode 100644 assets/img/third_party_identity_providers/icon_google.png create mode 100644 assets/img/third_party_identity_providers/icon_linkedin.svg create mode 100644 assets/img/third_party_identity_providers/icon_okta.png create mode 100644 assets/js/admin/banned-ips.js create mode 100644 assets/js/admin/edit-group.js create mode 100644 assets/js/admin/edit-user.js create mode 100644 assets/js/admin/groups.js create mode 100644 assets/js/admin/server-config.js create mode 100644 assets/js/admin/users.js create mode 100644 assets/js/ajax.utils.js create mode 100644 assets/js/auth/email-verification.js create mode 100644 assets/js/auth/registration.js create mode 100644 assets/js/auth/registration_success.js create mode 100644 assets/js/auth/reset_password.js create mode 100644 assets/js/auth/send_password_link.js create mode 100644 assets/js/auth/set_password.js create mode 100644 assets/js/auth/set_password_success.js create mode 100644 assets/js/basic-crud.js create mode 100644 assets/js/jquery-ajax-loader.js create mode 100644 assets/js/jquery.cleanform.js create mode 100644 assets/js/jquery.serialize.js create mode 100644 assets/js/jquery.validate.additional.custom.methods.js create mode 100644 assets/js/login.js create mode 100644 assets/js/oauth2/profile/admin/api-scope-groups.js create mode 100644 assets/js/oauth2/profile/admin/clients.js create mode 100644 assets/js/oauth2/profile/admin/edit-api-scope-group.js create mode 100644 assets/js/oauth2/profile/admin/edit-api.js create mode 100644 assets/js/oauth2/profile/admin/edit-endpoint.js create mode 100644 assets/js/oauth2/profile/admin/edit-resource-server.js create mode 100644 assets/js/oauth2/profile/admin/edit-scope.js create mode 100644 assets/js/oauth2/profile/admin/resource-servers.js create mode 100644 assets/js/oauth2/profile/admin/server-private-keys.js create mode 100644 assets/js/oauth2/profile/clients.js create mode 100644 assets/js/oauth2/profile/edit-client-data.js create mode 100644 assets/js/oauth2/profile/edit-client-public-keys.js create mode 100644 assets/js/oauth2/profile/edit-client-scopes.js create mode 100644 assets/js/oauth2/profile/edit-client-security-logout.js create mode 100644 assets/js/oauth2/profile/edit-client-security-main-settings.js create mode 100644 assets/js/oauth2/profile/edit-client-tokens.js create mode 100644 assets/js/oauth2/profile/edit-user-grants.js create mode 100644 assets/js/oauth2/session/check.session.js create mode 100644 assets/js/openid/consent.js create mode 100644 assets/js/profile.js create mode 100644 assets/js/urlfragment.jquery.js create mode 100644 favicon.ico create mode 100644 favicon/android-chrome-192x192.png create mode 100644 favicon/android-chrome-256x256.png create mode 100644 favicon/apple-touch-icon.png create mode 100644 favicon/browserconfig.xml create mode 100644 favicon/favicon-16x16.png create mode 100644 favicon/favicon-32x32.png create mode 100644 favicon/favicon.ico create mode 100644 favicon/manifest.json create mode 100644 favicon/mstile-150x150.png create mode 100644 favicon/safari-pinned-tab.svg create mode 100644 index.php create mode 100644 openapi/pr-119/api-docs.json create mode 100644 openapi/pr-119/index.html create mode 100644 robots.txt 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 0000000000000000000000000000000000000000..d441f75ebfbdf26a265dfccd670120d25c0a341c GIT binary patch literal 1738 zcmZ|OX;ji_6b5ixNYt8>l?gOuO)6lU%W(mxn(`>1S(XO;u`D+P%xqBvMr|w-Vyr1s z7R|Cn0b8|Hu<=Zmv1mFqh9Fj!NuZfKB2MP$e75`XJ@>=!y!Ux9xR3x;EW!q1^V>X| znVFuRUN`NqJ2)ybXh%e__h!!pv(M|S3+?9F%(K}zyE40MGyhWF5-IDgL&=%2-9`Nk z!1@8uk4t%_{(K~>N;sK&dzJbwJ=$kYTlL=$%#0Pfh>U{%i@~wWbvYsD_K-D`&+u1( z#Ma`>%q<^UhzGvi(hyE`zCD{-=2|zL5>wnB=DE!U?(CZG%q4@lDnCq_%&3DCla#(X zmBhDD+RN$aMWWHm?ig*>1Onn6~r?Ma~N2JKAxN>H%UtRyRqS)6Um!-Tz%-r=& zQmTb^JFIe3W^-kAm`}`2P|niMh>RYyd)S^f(dbrx965?rzbhP|XeP}o&&DSZ4|oYQ z)I{f!SfycYw?3=9W;o-B%U5xs(pP267X~9-7L|4WzaYexC0GtG8wWygm63rF{llCEraxzkc=IxvFQ-y37=_;e5 zJLq^gsSO0Ayz?a>E_?{dmUc+t#qv$)XN8$<<}rQ#)lsiw+pmL&J>~+hgpo>i$m+;l zZIa_ZRIfSeT$~v5d`EBV&*k`apPgjv&B|+d`Q!nyu{L4rs%ZfoF0*Kq8I%ByOcFpL zK=>wzofZo<+0GZLCnWM3oQ^pb(gRSf02;~cEn@LJ>~XB9IkEX{$N#Z`m%>S!U{uPx zloI%bLdo$Adxlh(Uv^yX7s5G&C zLwNRG>~T?G{kzupp8EcyLGPoPf)@&9Wqfw_l&uU-6cexk%5;uQg%wb=0k_733{i#& z1a2p)gV3S2+QG1-K9tZ}E~I<(P0r2aFFY-c{o?TUOz3Xjod#TLE2A_c?*T7t z=1>~%YW450{Qqno4t`}gvLnuMrcu8+#xEBoY%2_+Mb#Z6S38+r*M4O`-+!zl(@m`D zQsi|GA2l3gEy}LFe<#Hv8?$_L#u8E|3-bP$*La*E>B{X!Sy4i6?TKam!49aXCAW4S*P_O^H4^*DpiA40o}Uqw~Eo&veh1`|8i zD2$x+>_b^bXE4N;AW=5>iYak2%!JAh0j1*k1{p#iRCjbB7!cSws~U{1IA@acLII$t z$>X#A+^s6iJ5~DFG!xa?>z{=lxtdi1rzbM-(nqAu3D8h-&64xo6|E!p?pK0xT;qoK z`6%+SpBk+~M?nO}>2mTw!A{yZ6O>Z@kwSd4;8aWU5z!P~tQl?u==^+R`{OmOS}oZh zOXQ3{6kuz?Is^n^L7;9ieB9C+8B{>t+pDrlq4xGDDn#T#3T5$l1g`FTQkU;b-981j zNm{zC`$wn7etklM#qHI4=3m5gwa6DNS{?Z!vSObi_od{4eUo=_S2BKNpkSdiqe(k9WtkeM79;2-%CFbb)aB=&H1?i1}uwFzoZQ(38Kn1zBP ORn*B%u*Wk|4g3!*Rv{Mv literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c09235f60edcd94315b23a534c61ba2c49df7f9a GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F1SA+{?>A)!QcOwS?k)_>#w|r1Kptm-M`SUO z_5fqIli7AahM1>|V~EA+ zRdP`(kYX@0Ff`URG|)9N2r;y@GBvd_GSM|Kw=ytjiqefi(U6;;l9^VCTf=AesSkh} O7(8A5T-G@yGywo@=rd#h literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d29011d2afd4cd7d9ba1021abfd1dce95a6565f1 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F2qYNp$opRhQcOwS?k)_Bce{j_0C}7R9+AaB z+5?Q;PG;Ky8A6^ejv*T7lYj6t@hpC#;TbB#aBAWwna#KLs)4eqC9V-ADTyViR>?)F zK#IZ0z|dIN&_LJ7AjHtp%GA`#$XM6F+{(bf{jcyP6b-rgDVb@NxHXt9Se*ydz~JfX K=d#Wzp$P!!$ux=p literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1558bea510bcd2fa70712e8388c734ca5fb4e913 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12TF&T^vI^j=w#x$i?I+((tf;UXnmgbH|3oY>pC!)f}(GR!16S-u+#{ ze6YEqRkW=8vGl=5qArKM<9}TC-}iEvB{zdaTcX5$wyRTK&ALK>z>% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0359b121fe6752db9e8904ea3df6328e2a38494c GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI2NH8$CE1Q=ADW)WEcNYf6yIsOdfIQ9ukH}&m z?E%JaC$sH<3_(v9#}JM4$r%X}t&0mp9yKsb%{ak$*<@oTP*SzTHKHUXu_V7+PAHnpznc=^B_@85k^HFE5RvAvZrIGp!Q0hD)E8F9&L1@O1Ta JS?83{1OV{FGsXY_ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4fce6c462eee88b588110ce61c2a68fb8cf9ee4e GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!T=8puqDZgOs>RXUCGx5b?-VBQkUm|IuXOmYJrBRJgj{Vx zMbNnqUkncy+qa2-mWYc>swkcIuvGK#>(0d)B7)5f`@$Ei28nH~0h*~=;u=wsl30>z zm0Xkxq!^4042^XS4RnnRLJTdfOiitfOmq#*tqcsBqI6?WH00)|WTsW(*6^8q>I0w# N22WQ%mvv4FO#n8SPD=m) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5299b5a0b0cae417d8824f8f7d29416ed5ae334a GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!TrvH)L6@80)r*_cdCvDr%)6ghVL16=s@mbz7H!uRdGeDa z?kzLg)16i!f8fKx84s0>4nC}Q!>*kaceMJusRQ@ Ofx*+&&t;ucLK6V03{IN> literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..398c56a9cb130485289d061475258e0a0b9e43ad GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12VciT^vI^j=w#>k(V)1qW$CZ|6)SVV-&*#dav<$DMuV&n0Dbpw@a7+PAHnpzne=^B_@85rcV g%D19u$jwj5OsmALK`vssB~Sx{r>mdKI;Vst0B*f;)Bpeg literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d819aa58a13773931da0aa8877fcb4ddda94c76e GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?s03;ZUuHXC*q?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z$cXZEaSV~ToLo`U+vu0Ue0cG9p8hWqa?gxxGLm=1A1u)Cewe3oSeCaf zI$k30UHXoTXA5lSJe(zTcE%W-S*bfB&J`pw9sa4-R?IGW?p~6`>jMSP&M+u3 zY@9al)zrvpHlQu4C9V-ADTyViR>?)FK#IZ0z|dIN&_LJ7AjHtp%GA`#$XM6F+{(bf i{jcyP6b-rgDVb@NxHXt9Se*ydz~JfX=d#Wzp$Pyqds=h= literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c1cb1170c8b3795835b8831ab81fa9ae63b606b1 GIT binary patch literal 6922 zcmZ`;WmH_vmTkHN1c$~6PLSXdG!Wd~-644J0KpoEKyY{W4-dg<+(RQB2-YOHH692$ zJef7`y_xw@_uN|doK?4Wtva>Ot{4q9c^pg%OaK6Yqo^RG1puHty#h|2KYM!0=6gsy z8K9N2ybORo_{i$}QxC&U!O-)`D*V04jXAvq04SIhWh8ZcmyYuM?QKT_N5t*AU(|QC z`lq$EU`=GRI-njZ~u1-;J zSpxW8s+8ZMNsT7C(ScC@%+dXT2`5OBK{NYzHIl}|fVm<#cVSZaTx4gZ#=ndYA?trE z*6TOz8pLN8)cZ%(jWU6016qi+&ST(E3poFxz)GO7?ns4Wd{sg6kxQTmL$*&wk(S=K$M@P?Munwuq zWpM@@uUSqtb(TBVY*0%vp-ci{#N|Bp1#gR2R88&G%GMTNt4dmpUv5q&(y??C+EdGx z^JMZn!W*sC`$Pq%Yy~Hv?6x_%KeSn<0q?>=uGu^SY6-q%nd(JuwichK;boIJ_-fyGyo^c4iY)A4BFhl?YQfV)08Q5_obCJr8fY>U@@(?vtN5m8P`}$qD`_kA>55yU-@P^ZRLJ_laU~!}(Rt(~B z*Pf<2{k90cRH&ln57cc5VTw3tSO#TgPA~;0XZw3MpoF>RcKil}aXxZB{o!lMAco5S zcLq5TI|R6H8NCl?4tr-bwWQr#pSefD;oreJ`lvswaSON4i10%-7mk0?(AG-4immor z9H;RPv``uPMyYGv35PQ3#I&K80$TUcafx9gc$5^QWtc^hKQ^>_pb{zK6I)3dha47l zMOh(I%FYcqR#kVuh}Mk)^S;D)Cxuc!zlK%Dv`iIyE8&+nf*5rtP1BTlyDn^><9K;4 z86HgzNU+-iY)M0k26h`GJbr$2v|jnk6BISCO0}8%9!|oIBbm{1ob>!^6i=MlT|7=*X+;ne9tR&Tj43aU9ArmELhOGSph*ju7e0 zYHszpZ43?at3oE&I`=O4aO;k3@bXQ_KNgrzV&Erv;lH7G_7gT}xW8_3g}$cV)&hx@ zYcUdC{$amhqC{s6*|bQF?YwftfxXdDp3w97O2XZqJ=NlFU1lx+aeT9&2iH2yn07J^ ztU-gzPxI4j#y;Uy{$)I>mqUAdBrF5*7pj+E+*bTTeA=fxIFu=5pGuXB5|)+_+1{r8 zm8$PM6~1?KX=8>&M*M0-XZPlN+&wr&nAHNBaL18_-*@5a^O&O4CPT|wZ3FZnZd-C_ zH%chjeO1Zgy;R2Ck=^a(pJl6MGUyuGHf{?aBrD`Kwg!@e)(OJO8Y`h7o%fL?F#D`N zw01>z0l$1@#M+TJtVZm4=9#)x^#Y(Zl@Ebaem?a_E4>Asn;+5z;n78y2x$|mIz;O> z=LA-DK)*rCDV(<`6`a%5`f$pTt4j6V?re;<6#zlcYS=z~zbMxCn4|Aq`ybn;`Yu(M zRQ7aw=ZAaHH2QDR@p;~L^Ee>-Xs`)p+LnQLdTty4iF-cE$Ip`0&1|%;cot!b=382q zjoCNIppu|H;KaMDM0mG7o<*plHL^)L)BbRn3O93K^U5vlkFT$V*n{J-g=v8HK1iyS zkcDIddGxjI2MhJ*+7Gv159IhVUw>#_3=zn^)~PspO+}59SBd0bC9Yfmh?IbudsuTQ zs>wKH7)IU;lwDck|EfN~QWDkOsu@QFHTkh5@jz->*n>j?y!t-Q25xPj+jMj}qE|L^ zdz)(LOe}E7P|?r?N(=*viyJWUmfwRL*o+Up#fQ*J&V!{MbRu@ASoF4Nl@p4R2!9bJ zR!QjqMZqUY?HLrta{d5Pm)=#eaPlk;$Wm$l%EgbDrB|HE;n+%AL-@KljyJ$BA_iaM zP)Kd7-V-ch+1BL1t>6*m6ZBwdjNj|Fyld1F!?5V>)ldXR>P!Rj3LED89~o@qgh#^3 zKtM4kL=@Dv*QCmt1Bup$INwW$t zL+1r$`czGIu8vi{pV4iS$b6q#J&lwt4t|X@10PiH(e5m&>|mPY|Y-yP{%yD$l=)8rL4gJOpu`d(OFrMe~mjf(@;A$NnP)fU0ZrvGrh5_ zR+kH}c)V1D6I!>%^(53m>chfOlFRwCR6=|mLMblmWoE|kgs%d~H)HWXF|MSZ;o2_} zXoxip6j`P0QN=B~cDr@!Ny#S|(6ZMufMpw&*m_O!&Dzsk0pne$HmbGFW6h>xHpL0$ z^PKoZn-a8}b=lFAzh#=Z&GFFT%|`1$BYV{nbjK7gUq#u^DBp_(fwj`7A>Q4e3i$5gx_ar5~?}| z$Ub&(Fa@w&P3KB4DbMsJCZe}JYcT)=?domj_Rh)E`4#PU_DO`Cgba05#QNE}FioF( z=4Md%aF7NiUxK~b!>ebhc5L^qFwByIXttRI$WT7mp9ikZw?ahlNbP2Ca>QLStmNsM z(!auaRz=i>{(u2B*`{rbsA09d5x7{{z_?Px2h0}Pe2D~p`VlaJ0ES_Thk>=0Rmd3S zYJ5h-tSsZ?2*M(q0V*^3yu+ivH1wBIwn)Zw4qcOPwpKsj#c73oBpt~g@JZl@xaF3p zjp^nk{3z_k9p5BBP@tTLBoD(FE5thlRi{Ke`0dw4x+q_U`=IV7Z27i)h!b{M*PH~O zvP84UTa8k!_`Ve6qw0fXK<<>SsWK2@SAj3bDK!WviJbS^KywBI^3@G#Z6bGw>A)l` zAA-a6kj(}iFX9+o&KZz^9z|pFU@9#Vtqcp^be)t4j2eVO$DsA#jGtLC8C)q?tUev<+IIJeJw3T9Jq6P!x9#p1GC%eb8^%g7!6 z?OZ}**`n3EA`CDV)#}py(4D`5*ptAEAD}=RshDW-m-R z`F&t(TUAhng?~RKl(X|XU0jvrKIhxaj;9yAJf)IDd<|U$T420XAzk6oX*$Au{cOQd zYKnKl`Aj+h$9cvUY@ofkUGFB}1-j%`rnFWpY77eX{szQS;pUo|@Pny%-FjRr_Ph}P ztkuc*^^$OJfH0S1&<8&9HN<|S;_Bk13Sd&{H!grmkE{$UZg#4-ey$jc{p8tsF6!2w z7`t{H-*|Ju7Nm1m*6R`0`WS3{@8D8ZwkC;DU!-W@kL7`q^KhCi_qXF4qELoxv}}t! zhjdI4vD4iOR`iU6<=!d(_Q6*VG3ImELiV0niI9|tyq-8*vfX;O2x&_F*_7=95Q%cD zg_NlR{D?lVr!d@H16ixqJV-g=MHu!%lPcG_qK?OKOf%M=t?)bL+BlQ=I>I-PlwYI| z<9nv1Va@DcVZA$ICZ$ud@3&~a6cu-0v?g&L8;-XXHxMf&#`VZDdh0my=WRtSE&Y;< zVg_7+N=`2pt=<@ea??J{Eo8pV^xkcl5-{y>cEat<*1+zqU+dD*-Jg1CAKeS$qcHW@o|oG89!xPQPd zU=J4_*A#&=u=9@msmvJUmw0|kA;Abe(w2}A7>H21@&B*2Xv#@1)UZ_1d$xdR=0Du(XO=y~j*0KU{3=idQ*cV;P@94qdtTkab}qSRStk zo+LnSpdmLX9#Z+hF1a+r2!UVIgkoiOtHEa4+i+h@1;_N`br*+EPYDDIvIAL;9`fgW zv`3n!m25FWgg%{relJHjtU51_W2G0p+ww`G-U@Nn^$)AGn5R;YH}- zkx2bCjV%Q>D-`$(=xy7mye}|whf8=0p*U|y;s@c3{nM893||#oww%UZ zKGQqQ0mNF-f;|?j+jiJYOcP>u+`YlenadQp5O%s6&_VJyM7x9xowxNLpArM|3nz$W zqvav(0Vew1Cu7%_BPEDk2{Vvh=OCW-FRIfDQR;xNSZ=Uqww6=-hw$Jeo>+WT0KnmlNYsak$hb_KIdXVRrq|4 zc?l!EgE{dGxxYZ+E8~BK2SBtVuHRh|`#D8+iAg8D$Ko*^l`dx{Rx}5xH}$awqp;5^ z!Sjb?OiUDikL(Ag%PyI0zkKmYHH~FQ7P)QGg{VW|i4WHh`CulLA`rhuK6S%n^Q~e8 zGB&(6yFYe{h|U~)r+u3!T?^r}}eT&_*XZsk)gDqoI#goBdqU$eB&8 zADcQBiq`C0s8z}2f24R-qf;lpq5g&SMm1;>_sw1A*VKy&12j49ya&fUirm5+vlz`( zPz+V7TI72^(gP#-&3A4!TVRXUwP_sRH=)Ng(b1O@qu3L<)|}g3&0?{f{sgw05M(5f zfEl$_N3qf~^pkf|C)P#RTMlulrarg046JtX@ezPQ8Au7^WxnrUKcf;<}H4s$6v(9)V1%S6QX+2kM5j_wN&$+H&Ll?PU?h`gC3q=8_Gr}pfn6( zD^qHZLJ|)R9Ni^U0gpI$sh~Sbt`oNlgH*tB%dc|dBJI9SEbHfjVa(dN0vIQ<5489B zUt?1`&EX-;?dI2)ugv&1>#Q2=;~t(t*o-g=&*_OgR6bIl8A$@8&lqNp(u_eX*mukT z@kt{=LVp({=X0XDT9{_0j4hklmuc72Dpr}qTf6dVkHzRWT(_L`dk+e7E5prT{=J7+ zau}%_SG)z*oDcekL5mhi=#Z!wJqlUp=BdY1fjX`H^@0|m#kO=Ozci8%WR%*YFaDk{WIi==sHQdKM-E@nZ~$zoYV{Z$zAr@SXm=Ieg4AiPmFfNJjWYzvFdG zA&;;NZ(4#%_Mm0Y6z5<**tK(1@Fz^J9=6KaPtb7id=(!4(3LBi=!pTkIsw-=m${TB z(u#26e%y8`PZas8ha=O(#@(E-<;+P8}A(sQ|tN^1Y-XY_6{ z4i@bvxR}9%cAo0U4bL#nF8RP{@Vb}iO@(kCmbcx~{SVw#yEH9}&#-l-Q@BB>SM63) z)M8*Q#?r;=@5^PuXzT_+9Iw);!3epn349KNTgXw2BDl^#39d=z40T?)ZeH?j#TWR< zV#2R^_)Br>O6;>UrqGn&SbXGapKO)o>qac~!#5!uLw%~`V?2s}8z1z}lKspGrb(>Q zW!28Hzj|t>gyu;57~@?)?sZ--dTUOT zgPs0iapE~VL7vqWW~T1ynETw ze|$G{1Wj+g$^n`e7_2wkNYt{pviHdQwo*m1pLa=ghj3e}7EV^h=0K($(9ZvciWCNbHa4$!5H} z@Uag+U45D?uq;cWYMb%vf!|+SckQdvN`Hz*nZG)Wu|iV6Eht%=ASH4asU_QSO%V&> zK)P9&^FpxR+ldG$hmRQOv6p6t4D&)pdcqgb1pb9FMGpL3kf2S7AIf>8_5@gljRK0a zuo8%h_4TE&G3_|i8s5kmN5sREEvF^ZpV&;TN}=4aD2EFsm7bNVbW|D;YwS?4zHnOk zRh2=*`eU(1sNXiurRQ-FX-&CUNLT&(^BU3Gm1MX-A#Ry3-5;_0%2QzBK$!bRmR9DD za|pF*NMS730`zczmK)~$ig`Y;iJ{UA_P=mTvIEThFi!YeO={FwGykGpbHhn|wppyS=;NW{OKezi zj!2ZSoc@n7mvY}Y^gR(1mL&a*$(=g3OoVMm6xx^^OnCd6{fh7mACHiAl}_HiQD$Uc zrFFMj=+XE?>Z0qD4*{rUx2f;dx@5j(nsN*OS8cAdS7z1`@!P;TmfUguONB$VdwhK% zos$YG4>4D_?sYd))nMrZb@Ae(!C=;edumLXZ^h~WQh*iL8L7QzF?Z-vu2qt7JdbpS zFf~Wo-1403{&H{q=g0Ys=>hLk#IokWMm?&W^-bk*fc_?<#IrBY6r}2ShlICVkcn{c zdPW(7i&(}tc#oPw25ga|D>6A8Rc`0dT-}~TZxP8Df0p_)yc-j%EA_U!r^X8pCt23Q zi)I*&v@KR({{@KG3Gzy#Qg&#jSDk(PxA>sb2K6WNXBmF>EL?FXyPz(yCvnUh<==#| zQ8MTU8VS>zBhlVdeTVXCxM#c!iv++wbZS7eNcIu#53%vURlwJ;_@D zBDxn|woIw|J7?|q1}EDLG((i=_duGUnx`2+m{fttG2`%ejStF5eEX@wrz&{?7KV8` z&9YImZ&%Z6@NjmzP!{IUan00WfazVIDzm0ryF}hHmFB!n`==y5?-{3R zb-DvwqBJ)Q9&0F+DLhI89+Z}Y#^$uUB-C-MVz6ls7GhBwW>WkFa}wYM}(!*H8ZZ;s71H_{Q&d>X1aCe{>Lo>BgRnjU+x#Iub%bWrCk?Eo8)94 zGN3I@nIw1gGVfjzabx9H+z@G)4<1bDs}yBF7c4twl5_?uWjy}f1szOl^lS+Uaw|cA z*qg|L3HN?s8CLqSeKTRPHf>}sncYz2z-S9R@^7mEAOTC?iE=`egZF42l9-R z2qCk%SD^mlA^bv9^gf%_4@ayP|1p%er#h(hCU%SKh4^t-H9J*ecyEWk(ywYw zi2gO++su-c3H`Za?>+JL;5G*N-UO~Aif+W^i`U&~^k@*}+NLT0jf#X*W_HD&`?Cc* zon5kT9xfLGw084X3;(gEk%G@1gt`R&Z*ja5+oM-BP-u^unAQm-KkNEt9Ok`8EgkiX zNTdGXL+z`l-6wfOB>Hlb9Qr-v%^}%dj6WKcGgamJRvv9_<-rwdBPI&i-=o`j##)=IO5~R!mtE2BOMpe$Ck|v1uyKkgw0yCudF6`J zk$H>43vwO~4vTQ{x8vLxM?C%%nFGj+fEobk8aA1U^E@sd%qN-bCDeC`f6QE%u1n8X%chuzE|55OZ1tEqgxVtWCFJ-41*!|2 zkGcm&d8~?;W9(>R)`2YqEs{B_kylO->cRzZp}AgX3~W01<9zrP9?b2~)D$AGe)9NP z#X#Drknh{m-4Uagtbvz}rI)RUwTJDK0q}D3@NsbSa&YtLaPy1s@rm$ob8riZaC5)1 zfF}Q2fQze*!#ltKKfplDm-8ur{BI*@yT0@CvGlM7NZPns+0rVySlZcY*;?B8xsTb3 QJ~;stWz}Trq%1=J3#jBGg8%>k literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..84b601bf0f726bf95801da487deaf2344a32e4b8 GIT binary patch literal 4549 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 F{{S81aohj^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b6db1acdd433be80a472b045018f25c7f2cf7e08 GIT binary patch literal 6992 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ed5b6b0930f672fa08e9b9bdbe5e55370fd1dc30 GIT binary patch literal 4549 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 DTfr$v literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..22df96b2d6d79b49f7a773d71744da778d33537f GIT binary patch literal 1442 zcmV;T1zq}yP)BFb>he~dmd`XNA6+)7<&&MJ|cl{zy7*5vZry1VZcbck4o2tq%Gm|)8`V9-lax~5+<8-7XaN1E&ucrmAPray0OAB(^jx5@Uie@TIQIEQ zQyQ>>TN-P%T~V~<0zfhG7*Kk0p#iWw095LV?9@^LkOz*EnAZ~4tf~n;2z^g>{|^I> zmlZ9mSNS9tlpq{GHI}kl8UTtZdP2pev+IP;@q!w_Nr^48Q^n~oHv^9AQAzRVj28sJ zeCo+g!IDFO@gxnPpjOvahu47gG~h6?bOu~UYDI5d*QgN{S_`NO^_?6;-~wzjvh*w< zZz%RJb`4=)psXM|O4=K)t%1b+EL2?_ho|bR>o-?lzS1;=HS$;dtG#D_a*N9XiYW^; zzzPD;tEgo`yrUiN`ehtsRpls!lA$J=E6cycubT5MPMH93EC)kCf@-R*49B4m7<&fE zb3eeEjy(W16W;URYvG%>-&l`VrP!v52!Y4zJ-0T6%4=pA(EIHLkO)F47ydrjr=Krx ze*{cBL6?!@(oi~B2LN9BXc$j(V4U7bAMS}XQ$J%xKdZ;P+69m4S znTo>eCq`TGZAq|X=PX2&35{1>mZ3iq8^_NDF9pF&4MZ=12r|i{=$%R01z}hz1_DtZ z7>H{IcHL|SVU6Yl06qgA6DrGloSqxdIa-I_Ab&|J!=7-H=+7b6psOM`4IhB(*AN92 z5oA-TwEDT=TUHh@)PSo|r~U_3@Hsu_@Z^RGcy3??yt=akcofr)E0|U*!G3E%|IzS( z0lDzATOQ@efOnlOYo1F36oPv=4+Fqk(jPHUh0%HbD3BA=vKsty|VXcmJ67 z!e-OJ&{>9>OX79FtH2OYV?KETFUl+q<=8}ytjfUvdV%I`TQ@>)|0q1LZBwf6>Hivb zv^40!ZSDiW=I|L$C8PnL0R~bpZj?y@15{nJON)`cxR9z%%Y?qcQxGkQz^6l*{juS3 z9EbqKK}CEK@_4XK!O6`ut>FYXUa2Lt284jxLi=Jal zY5HkQNBrZ}0yHyCBV(;V$024J$PO}qWm{!|NCzQ`@-2Tw?gOcMj9`?P9LYX_%t|8|_*ui`|6y^?wrE w&r}H)3xGH-!)8J82TeAQZH~au-2VzN07)pwncX#nQ2+n{07*qoM6N<$f&)>YU;qFB literal 0 HcmV?d00001 diff --git a/assets/img/generic-profile-photo-small.png b/assets/img/generic-profile-photo-small.png new file mode 100755 index 0000000000000000000000000000000000000000..029d3e1a5b1fa51c8f683ba8acdf938ffbcae279 GIT binary patch literal 3861 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 XmL53-_<|K`00000NkvXXu0mjfIh~SC literal 0 HcmV?d00001 diff --git a/assets/img/generic-profile-photo.png b/assets/img/generic-profile-photo.png new file mode 100755 index 0000000000000000000000000000000000000000..2fcfed826194c80cb8a707accf87629cfc4baee4 GIT binary patch literal 2176 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 B7G?kd literal 0 HcmV?d00001 diff --git a/assets/img/glyphicons-halflings.png b/assets/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/assets/img/oauth2.default.logo.png b/assets/img/oauth2.default.logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ee2aab2244a7b686038c1553ed010c7bf57cd226 GIT binary patch literal 14587 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ae7f0451938ec6c3eb02b91c6c693234af8f77fc GIT binary patch literal 1428 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m@6_vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc$WX!DQqR!T z)ZE-iN5ROz&_v(BP~Xs4*U-|+#Kg+LKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvlai9m%q`4QOkw6=({E|wVr<~z=4xhU=xAu@ zYGP?=;pXb>;$q|q3`i446PRAlyyB9?yyR4v-I+kUp?Y2L>a}t%N=+=uFAB-e&w-_a zfQATTyjN0CM2jDK!t6hl+rih4)!$ECU1MCQlc~kcwMVrub^G28tYif2R89jUN#a0V$3m z+HqW(U&E4GTXo*3XmeYu%nqM)G&;g#n%60}&L9N`Y3vfoLDcEUq^7u>AjVl~HJc z+?glZ$JT$X=j=}2DDtl_FkCD8(I>xT^ve*TA4-mLoHue9l}{RX2GC!-{oS{Fz? zQ`6nvWW1(a^YUtGyEtQyX73L=waLy>mt>bd5$FaWouiQ>)bQnr`tIqW}N^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..550b8d953d28aa25b83e28f6fa4544b2ba982803 GIT binary patch literal 1200 zcmV;h1W)^kP)ZgXgFbngSdJ^%m&LPPS`_xyOu z7$Zt407Qi7bG0a?cCFW1i;AwR*+Uuy5*0gm2n-u-i0bN{uv(|1%D|xB#_H$2f(QYk z(FZ_Lz(&zlJFgB@8Dk{6DKH8_{jb1Cg|-b368f-X&LY1?JZJf$%fiYQg<=H-G^HH| z_NPhO8UZZ5gH-FJcJ-nNlwHI1zp{KevB<7wnC+B#tygf%86cvdYaI> zHeE4_lu{TG)^a62y*$siSC`R7u(cwRJAgtX6kMTspTnzTeY|v{k5tkk3KP;D6q*rX zBVXqH7c*R$StDs_z@sW*>5zO8p<)E(FO-e&{G&abdG;QfQ#MqA*Z{^q&Ie!Jbbrh{q1te_E_^|^R@zUGm%Pg*L$M$G|Y`z>W*p{ZRJsEQv#vZAe0Ia_&McxaV zLdB3TR(1pI_)uPGL6m#+dK6fe#smQvFRgb0wCr5%=$J>eosz0 znsm~N*=qz2^`t2p@A`^m!}Yn%7!B2@5fMbZV1B*1j@DjqcFN*F+YY?|S}Ex5NYUF7 zD1^(`R#?rIFvip!L?XhSy9F-%yo5$!1V;LsX-(TP8;_#2%^Oelhg>eL7I^>jX;yRP zDoz7xV1A{*`HRyGBs`64X=&F$GbUuYKT@eoj&}0q$$M#SO86NbubbFB2(WU63YR7`T=;Q;f7VNMJ6^scLfOErlHsYL7S4GlE)Z2kr7A4ReuFT|Sw O0000' + + '' + + '' + + '' + + ' ' + 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('
      ' + prev_item + pager.html() + next_item + '
    '); + + $('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($("